diff --git a/.github/PULL_REQUEST_TEMPLATE/redhat-backport.md b/.github/PULL_REQUEST_TEMPLATE/redhat-backport.md new file mode 100644 index 000000000..a033610e8 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/redhat-backport.md @@ -0,0 +1,14 @@ +**You must EDIT ME! The contents below is an example only.** + +Bug 000000 gets hit when the system is out for its birthday party. After +providing the system with sufficient cake, it returns to normal business the +next day. + +I hereby confirm that: + +- [ ] this change is in the upstream project (*reference?*) +- [ ] this change is in the devel branch of this project +- [ ] branches for higher versions of the project have this change merged +- [ ] this PR is not *downstream-only*, if that was the case, I would have + explained its need very clearly + diff --git a/.github/PULL_REQUEST_TEMPLATE/redhat-downstream-only.md b/.github/PULL_REQUEST_TEMPLATE/redhat-downstream-only.md new file mode 100644 index 000000000..22970285d --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/redhat-downstream-only.md @@ -0,0 +1,5 @@ +**You must EDIT ME! The contents below is an example only.** + +The downstream CI testing depends on additional settings in the Search +Optimization so that the project contributors can get a piece of chocolate for +every merged PR. diff --git a/.github/PULL_REQUEST_TEMPLATE/redhat-sync.md b/.github/PULL_REQUEST_TEMPLATE/redhat-sync.md new file mode 100644 index 000000000..30b932211 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/redhat-sync.md @@ -0,0 +1,9 @@ +**You must EDIT ME! The contents below is an example only.** + +Sync the upstream changes from `csi-addons/kubernetes-csi-addons:main` into the +`main` branch. The most important recent changes that we want included are: + +- the new foz bar baz works flawlessly +- this addresses a bug where users are facing issues with XYZ +- ... + diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ae0a6cc3a..e9f8a42ef 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -2,6 +2,8 @@ version: 2 updates: - package-ecosystem: "gomod" + # ODF only: disable PR creation, synced from upstream + open-pull-requests-limit: 0 directory: "/" schedule: interval: "weekly" @@ -10,3 +12,12 @@ updates: prefix: "vendor" labels: - vendor + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + rebase-strategy: "disabled" + commit-message: + prefix: "ci" + labels: + - testing diff --git a/.github/workflows/build-push.yaml b/.github/workflows/build-push.yaml index 47d13dcf9..adfe6033f 100644 --- a/.github/workflows/build-push.yaml +++ b/.github/workflows/build-push.yaml @@ -13,25 +13,25 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - name: Install Go 1.17 - uses: actions/setup-go@v2 + - name: Install Go 1.19 + uses: actions/setup-go@v3 with: - go-version: '1.17' + go-version: 1.19 - name: Generate the bundle contents run: make bundle - name: Login to quay.io - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} - name: Build and push bundle container image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: bundle.Dockerfile @@ -44,23 +44,23 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Login to quay.io - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} - name: Build and push controller container image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: Dockerfile @@ -74,23 +74,23 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Login to quay.io - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} - name: Build and push sidecar container image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: build/Containerfile.sidecar diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml index 54c871a08..59324f0e0 100644 --- a/.github/workflows/codespell.yml +++ b/.github/workflows/codespell.yml @@ -12,7 +12,7 @@ jobs: name: codespell runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: codespell uses: codespell-project/actions-codespell@master with: diff --git a/.github/workflows/kind-deploy.yaml b/.github/workflows/kind-deploy.yaml index 19b8c0611..ec4911cb9 100644 --- a/.github/workflows/kind-deploy.yaml +++ b/.github/workflows/kind-deploy.yaml @@ -12,15 +12,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Create k8s Kind Cluster - uses: helm/kind-action@v1.2.0 + uses: helm/kind-action@v1.3.0 - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - name: Install Go 1.17 - uses: actions/setup-go@v2 + - name: Install Go 1.19 + uses: actions/setup-go@v3 with: - go-version: '1.17' + go-version: 1.19 - name: Deploy the controller and CRDs run: make deploy diff --git a/.github/workflows/tag-release.yaml b/.github/workflows/tag-release.yaml index 18ae468ae..eaabc9399 100644 --- a/.github/workflows/tag-release.yaml +++ b/.github/workflows/tag-release.yaml @@ -11,12 +11,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - name: Install Go 1.17 - uses: actions/setup-go@v2 + - name: Install Go 1.19 + uses: actions/setup-go@v3 with: - go-version: '1.17' + go-version: 1.19 - name: Generate the bundle contents run: make bundle TAG=${{ github.ref_name }} @@ -25,14 +25,14 @@ jobs: run: make bundle-validate - name: Login to quay.io - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} - name: Build bundle container image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: bundle.Dockerfile @@ -45,23 +45,23 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Login to quay.io - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} - name: Build and push controller container image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: Dockerfile @@ -75,23 +75,23 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Login to quay.io - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_PASSWORD }} - name: Build and push sidecar container image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: build/Containerfile.sidecar @@ -107,12 +107,12 @@ jobs: contents: write steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - name: Install Go 1.17 - uses: actions/setup-go@v2 + - name: Install Go 1.19 + uses: actions/setup-go@v3 with: - go-version: '1.17' + go-version: 1.19 - name: Generate manifests for installation by kubectl run: make manifests TAG=${{ github.ref_name }} diff --git a/.github/workflows/test-build.yaml b/.github/workflows/test-build.yaml index f54f17369..b8636d9f9 100644 --- a/.github/workflows/test-build.yaml +++ b/.github/workflows/test-build.yaml @@ -12,12 +12,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - name: Install Go 1.17 - uses: actions/setup-go@v2 + - name: Install Go 1.19 + uses: actions/setup-go@v3 with: - go-version: '1.17' + go-version: 1.19 - name: Generate the bundle contents run: make bundle @@ -26,7 +26,7 @@ jobs: run: make bundle-validate - name: Build bundle container image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: bundle.Dockerfile @@ -38,16 +38,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Build container container image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: Dockerfile @@ -60,16 +60,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Build sidecar container image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: build/Containerfile.sidecar diff --git a/.github/workflows/test-golang.yaml b/.github/workflows/test-golang.yaml index 08d9f9b7d..3cdcd6904 100644 --- a/.github/workflows/test-golang.yaml +++ b/.github/workflows/test-golang.yaml @@ -12,12 +12,17 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up Golang - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.17 + go-version: 1.19 + + - name: Install Protoc + uses: arduino/setup-protoc@v1 + with: + version: '3.19.4' - name: Run "make test" run: make test @@ -25,17 +30,21 @@ jobs: - name: Check for uncommitted changes run: make check-all-committed + - name: Show the uncommitted "git diff" + if: ${{ failure() }} + run: git diff ; false + go_mod_verify: name: go_mod_verify runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up Golang - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.17 + go-version: 1.19 - name: Verify Go modules run: go mod verify @@ -45,12 +54,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up Golang - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.17 + go-version: 1.19 - name: Vendor all dependencies run: go mod vendor diff --git a/Dockerfile b/Dockerfile index a10e01b58..4cfceba30 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.17 as builder +FROM golang:1.19 as builder # Copy the contents of the repository ADD . /workspace/go/src/github.com/csi-addons/kubernetes-csi-addons diff --git a/Makefile b/Makefile index 48161b1e3..c1283318e 100644 --- a/Makefile +++ b/Makefile @@ -91,7 +91,7 @@ help: ## Display this help. .PHONY: manifests manifests: controller-gen kustomize ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. - $(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="{./api/...,./cmd/...,./controllers/...,./sidecar/...}" output:crd:artifacts:config=config/crd/bases + $(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="{./apis/...,./cmd/...,./controllers/...,./sidecar/...}" output:crd:artifacts:config=config/crd/bases cd config/manager && $(KUSTOMIZE) edit set image controller=${CONTROLLER_IMG} rbac-proxy=${RBAC_PROXY_IMG} $(KUSTOMIZE) build config/crd > deploy/controller/crds.yaml $(KUSTOMIZE) build config/rbac > deploy/controller/rbac.yaml @@ -108,7 +108,11 @@ bundle: gen-csv-base manifests operator-sdk .PHONY: generate generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. - $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./api/..." + $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./apis/..." + +.PHONY: generate-protobuf +generate-protobuf: protoc-gen-go protoc-gen-go-grpc + PATH=$(PATH):$(shell pwd)/bin go generate ./internal/proto .PHONY: fmt fmt: ## Run go fmt against code. @@ -119,7 +123,7 @@ vet: ## Run go vet against code. go vet ./... .PHONY: test -test: manifests generate fmt vet envtest ## Run tests. +test: manifests generate generate-protobuf fmt vet envtest ## Run tests. KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out .PHONY: check-all-committed @@ -213,6 +217,18 @@ OPERATOR_SDK = $(shell pwd)/bin/operator-sdk operator-sdk: go build -o $(OPERATOR_SDK) ./vendor/$(shell grep operator-sdk tools.go | sed 's/.*_ "//;s/"//') +# protoc-gen-go gets installed from the vendor/ directory. +PROTOC_GEN_GO = $(shell pwd)/bin/protoc-gen-go +.PHONY: protoc-gen-go +protoc-gen-go: + go build -o $(PROTOC_GEN_GO) ./vendor/$(shell grep '/protoc-gen-go"' tools.go | sed 's/.*_ "//;s/"//') + +# protoc-gen-go-grpc gets installed from the vendor/ directory. +PROTOC_GEN_GO_GRPC = $(shell pwd)/bin/protoc-gen-go-grpc +.PHONY: protoc-gen-go-grpc +protoc-gen-go-grpc: + go build -o $(PROTOC_GEN_GO_GRPC) ./vendor/$(shell grep protoc-gen-go-grpc tools.go | sed 's/.*_ "//;s/"//') + # go-get-tool will 'go get' any package $2 and install it to $1. PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) define go-get-tool diff --git a/OWNERS b/OWNERS new file mode 100644 index 000000000..4513e2d04 --- /dev/null +++ b/OWNERS @@ -0,0 +1,5 @@ +approvers: + - ceph-csi-team + +reviewers: + - ceph-csi-team diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES new file mode 100644 index 000000000..8697326bc --- /dev/null +++ b/OWNERS_ALIASES @@ -0,0 +1,8 @@ +aliases: + ceph-csi-team: + - agarwal-mudit + - humblec + - madhu-1 + - nixpanic + - rakshith-r + - yati1998 diff --git a/PROJECT b/PROJECT index 6284df684..2a30a2cc0 100644 --- a/PROJECT +++ b/PROJECT @@ -1,6 +1,7 @@ domain: openshift.io layout: - go.kubebuilder.io/v3 +multigroup: true projectName: kubernetes-csi-addons repo: github.com/csi-addons/kubernetes-csi-addons resources: @@ -40,4 +41,20 @@ resources: kind: PersistentVolumeClaim path: k8s.io/api/core/v1 version: v1 +- api: + crdVersion: v1 + namespaced: true + domain: openshift.io + group: replication.storage + kind: VolumeReplication + path: github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1 + version: v1alpha1 +- api: + crdVersion: v1 + namespaced: true + domain: openshift.io + group: replication.storage + kind: VolumeReplicationClass + path: github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1 + version: v1alpha1 version: "3" diff --git a/api/v1alpha1/csiaddonsnode_types.go b/apis/csiaddons/v1alpha1/csiaddonsnode_types.go similarity index 98% rename from api/v1alpha1/csiaddonsnode_types.go rename to apis/csiaddons/v1alpha1/csiaddonsnode_types.go index d46c0bb50..fcb52b06d 100644 --- a/api/v1alpha1/csiaddonsnode_types.go +++ b/apis/csiaddons/v1alpha1/csiaddonsnode_types.go @@ -61,7 +61,7 @@ type CSIAddonsNodeStatus struct { // to the CSI Driver. State CSIAddonsNodeState `json:"state,omitempty"` - // Messgae is a human-readable message indicating details about why the CSIAddonsNode + // Message is a human-readable message indicating details about why the CSIAddonsNode // is in this state. // +optional Message string `json:"message,omitempty"` diff --git a/api/v1alpha1/groupversion_info.go b/apis/csiaddons/v1alpha1/groupversion_info.go similarity index 94% rename from api/v1alpha1/groupversion_info.go rename to apis/csiaddons/v1alpha1/groupversion_info.go index 9a9d1e33e..9bb88b2e8 100644 --- a/api/v1alpha1/groupversion_info.go +++ b/apis/csiaddons/v1alpha1/groupversion_info.go @@ -15,8 +15,8 @@ limitations under the License. */ // Package v1alpha1 contains API Schema definitions for the csiaddons v1alpha1 API group -//+kubebuilder:object:generate=true -//+groupName=csiaddons.openshift.io +// +kubebuilder:object:generate=true +// +groupName=csiaddons.openshift.io package v1alpha1 import ( diff --git a/api/v1alpha1/networkfence_types.go b/apis/csiaddons/v1alpha1/networkfence_types.go similarity index 100% rename from api/v1alpha1/networkfence_types.go rename to apis/csiaddons/v1alpha1/networkfence_types.go diff --git a/api/v1alpha1/reclaimspacecronjob_types.go b/apis/csiaddons/v1alpha1/reclaimspacecronjob_types.go similarity index 100% rename from api/v1alpha1/reclaimspacecronjob_types.go rename to apis/csiaddons/v1alpha1/reclaimspacecronjob_types.go diff --git a/api/v1alpha1/reclaimspacejob_types.go b/apis/csiaddons/v1alpha1/reclaimspacejob_types.go similarity index 100% rename from api/v1alpha1/reclaimspacejob_types.go rename to apis/csiaddons/v1alpha1/reclaimspacejob_types.go diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/apis/csiaddons/v1alpha1/zz_generated.deepcopy.go similarity index 100% rename from api/v1alpha1/zz_generated.deepcopy.go rename to apis/csiaddons/v1alpha1/zz_generated.deepcopy.go diff --git a/apis/replication.storage/v1alpha1/groupversion_info.go b/apis/replication.storage/v1alpha1/groupversion_info.go new file mode 100644 index 000000000..37182b68d --- /dev/null +++ b/apis/replication.storage/v1alpha1/groupversion_info.go @@ -0,0 +1,36 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 v1alpha1 contains API Schema definitions for the replication.storage v1alpha1 API group +// +kubebuilder:object:generate=true +// +groupName=replication.storage.openshift.io +package v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/scheme" +) + +var ( + // GroupVersion is group version used to register these objects + GroupVersion = schema.GroupVersion{Group: "replication.storage.openshift.io", Version: "v1alpha1"} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + + // AddToScheme adds the types in this group-version to the given scheme. + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/apis/replication.storage/v1alpha1/volumereplication_types.go b/apis/replication.storage/v1alpha1/volumereplication_types.go new file mode 100644 index 000000000..254f78b3c --- /dev/null +++ b/apis/replication.storage/v1alpha1/volumereplication_types.go @@ -0,0 +1,124 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 v1alpha1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const ( + VolumeReplicationNameAnnotation = "replication.storage.openshift.io/volume-replication-name" +) + +// ReplicationState represents the replication operations to be performed on the volume. +// +kubebuilder:validation:Enum=primary;secondary;resync +type ReplicationState string + +const ( + // Primary ReplicationState enables mirroring and promotes the volume to primary. + Primary ReplicationState = "primary" + + // Secondary ReplicationState demotes the volume to secondary and resyncs the volume if out of sync. + Secondary ReplicationState = "secondary" + + // Resync option resyncs the volume. + Resync ReplicationState = "resync" +) + +// State captures the latest state of the replication operation. +type State string + +const ( + // PrimaryState represents the Primary replication state. + PrimaryState State = "Primary" + + // SecondaryState represents the Secondary replication state. + SecondaryState State = "Secondary" + + // UnknownState represents the Unknown replication state. + UnknownState State = "Unknown" +) + +// VolumeReplicationSpec defines the desired state of VolumeReplication. +type VolumeReplicationSpec struct { + // VolumeReplicationClass is the VolumeReplicationClass name for this VolumeReplication resource + // +kubebuilder:validation:Required + VolumeReplicationClass string `json:"volumeReplicationClass"` + + // ReplicationState represents the replication operation to be performed on the volume. + // Supported operations are "primary", "secondary" and "resync" + // +kubebuilder:validation:Required + ReplicationState ReplicationState `json:"replicationState"` + + // DataSource represents the object associated with the volume + // +kubebuilder:validation:Required + DataSource corev1.TypedLocalObjectReference `json:"dataSource"` + + // AutoResync represents the volume to be auto resynced when + // ReplicationState is "secondary" + AutoResync bool `json:"autoResync"` + + // replicationHandle represents an existing (but new) replication id + // +kubebuilder:validation:Optional + ReplicationHandle string `json:"replicationHandle"` +} + +// VolumeReplicationStatus defines the observed state of VolumeReplication. +type VolumeReplicationStatus struct { + State State `json:"state,omitempty"` + Message string `json:"message,omitempty"` + // Conditions are the list of conditions and their status. + Conditions []metav1.Condition `json:"conditions,omitempty"` + // observedGeneration is the last generation change the operator has dealt with + // +optional + ObservedGeneration int64 `json:"observedGeneration,omitempty"` + LastStartTime *metav1.Time `json:"lastStartTime,omitempty"` + LastCompletionTime *metav1.Time `json:"lastCompletionTime,omitempty"` + LastSyncTime *metav1.Time `json:"lastSyncTime,omitempty"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:JSONPath=".metadata.creationTimestamp",name=Age,type=date +// +kubebuilder:printcolumn:JSONPath=".spec.volumeReplicationClass",name=volumeReplicationClass,type=string +// +kubebuilder:printcolumn:JSONPath=".spec.dataSource.name",name=pvcName,type=string +// +kubebuilder:printcolumn:JSONPath=".spec.replicationState",name=desiredState,type=string +// +kubebuilder:printcolumn:JSONPath=".status.state",name=currentState,type=string +// +kubebuilder:resource:shortName=vr + +// VolumeReplication is the Schema for the volumereplications API. +type VolumeReplication struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec VolumeReplicationSpec `json:"spec,omitempty"` + Status VolumeReplicationStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// VolumeReplicationList contains a list of VolumeReplication. +type VolumeReplicationList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []VolumeReplication `json:"items"` +} + +func init() { + SchemeBuilder.Register(&VolumeReplication{}, &VolumeReplicationList{}) +} diff --git a/apis/replication.storage/v1alpha1/volumereplicationclass_types.go b/apis/replication.storage/v1alpha1/volumereplicationclass_types.go new file mode 100644 index 000000000..f1b13cc95 --- /dev/null +++ b/apis/replication.storage/v1alpha1/volumereplicationclass_types.go @@ -0,0 +1,64 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// VolumeReplicationClassSpec specifies parameters that an underlying storage system uses +// when creating a volume replica. A specific VolumeReplicationClass is used by specifying +// its name in a VolumeReplication object. +type VolumeReplicationClassSpec struct { + // Provisioner is the name of storage provisioner + // +kubebuilder:validation:Required + Provisioner string `json:"provisioner"` + // Parameters is a key-value map with storage provisioner specific configurations for + // creating volume replicas + // +kubebuilder:validation:Optional + Parameters map[string]string `json:"parameters,omitempty"` +} + +// VolumeReplicationClassStatus defines the observed state of VolumeReplicationClass. +type VolumeReplicationClassStatus struct{} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:resource:scope=Cluster,shortName=vrc +// +kubebuilder:printcolumn:JSONPath=".spec.provisioner",name=provisioner,type=string + +// VolumeReplicationClass is the Schema for the volumereplicationclasses API. +type VolumeReplicationClass struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec VolumeReplicationClassSpec `json:"spec,omitempty"` + Status VolumeReplicationClassStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// VolumeReplicationClassList contains a list of VolumeReplicationClass. +type VolumeReplicationClassList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []VolumeReplicationClass `json:"items"` +} + +func init() { + SchemeBuilder.Register(&VolumeReplicationClass{}, &VolumeReplicationClassList{}) +} diff --git a/apis/replication.storage/v1alpha1/zz_generated.deepcopy.go b/apis/replication.storage/v1alpha1/zz_generated.deepcopy.go new file mode 100644 index 000000000..da618bf45 --- /dev/null +++ b/apis/replication.storage/v1alpha1/zz_generated.deepcopy.go @@ -0,0 +1,232 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright 2022 The Kubernetes-CSI-Addons 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. +*/ + +// Code generated by controller-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeReplication) DeepCopyInto(out *VolumeReplication) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeReplication. +func (in *VolumeReplication) DeepCopy() *VolumeReplication { + if in == nil { + return nil + } + out := new(VolumeReplication) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VolumeReplication) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeReplicationClass) DeepCopyInto(out *VolumeReplicationClass) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeReplicationClass. +func (in *VolumeReplicationClass) DeepCopy() *VolumeReplicationClass { + if in == nil { + return nil + } + out := new(VolumeReplicationClass) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VolumeReplicationClass) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeReplicationClassList) DeepCopyInto(out *VolumeReplicationClassList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]VolumeReplicationClass, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeReplicationClassList. +func (in *VolumeReplicationClassList) DeepCopy() *VolumeReplicationClassList { + if in == nil { + return nil + } + out := new(VolumeReplicationClassList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VolumeReplicationClassList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeReplicationClassSpec) DeepCopyInto(out *VolumeReplicationClassSpec) { + *out = *in + if in.Parameters != nil { + in, out := &in.Parameters, &out.Parameters + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeReplicationClassSpec. +func (in *VolumeReplicationClassSpec) DeepCopy() *VolumeReplicationClassSpec { + if in == nil { + return nil + } + out := new(VolumeReplicationClassSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeReplicationClassStatus) DeepCopyInto(out *VolumeReplicationClassStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeReplicationClassStatus. +func (in *VolumeReplicationClassStatus) DeepCopy() *VolumeReplicationClassStatus { + if in == nil { + return nil + } + out := new(VolumeReplicationClassStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeReplicationList) DeepCopyInto(out *VolumeReplicationList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]VolumeReplication, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeReplicationList. +func (in *VolumeReplicationList) DeepCopy() *VolumeReplicationList { + if in == nil { + return nil + } + out := new(VolumeReplicationList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VolumeReplicationList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeReplicationSpec) DeepCopyInto(out *VolumeReplicationSpec) { + *out = *in + in.DataSource.DeepCopyInto(&out.DataSource) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeReplicationSpec. +func (in *VolumeReplicationSpec) DeepCopy() *VolumeReplicationSpec { + if in == nil { + return nil + } + out := new(VolumeReplicationSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeReplicationStatus) DeepCopyInto(out *VolumeReplicationStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.LastStartTime != nil { + in, out := &in.LastStartTime, &out.LastStartTime + *out = (*in).DeepCopy() + } + if in.LastCompletionTime != nil { + in, out := &in.LastCompletionTime, &out.LastCompletionTime + *out = (*in).DeepCopy() + } + if in.LastSyncTime != nil { + in, out := &in.LastSyncTime, &out.LastSyncTime + *out = (*in).DeepCopy() + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeReplicationStatus. +func (in *VolumeReplicationStatus) DeepCopy() *VolumeReplicationStatus { + if in == nil { + return nil + } + out := new(VolumeReplicationStatus) + in.DeepCopyInto(out) + return out +} diff --git a/build/Containerfile.sidecar b/build/Containerfile.sidecar index 2c6ed0921..a9b8c584e 100644 --- a/build/Containerfile.sidecar +++ b/build/Containerfile.sidecar @@ -1,5 +1,5 @@ # Build the sidecar binary -FROM golang:1.17 as builder +FROM golang:1.19 as builder # Copy the contents of the repository ADD . /workspace/go/src/github.com/csi-addons/kubernetes-csi-addons diff --git a/cmd/manager/main.go b/cmd/manager/main.go index 915a1049d..0a8eec4f9 100644 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -25,15 +25,19 @@ import ( // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" + "go.uber.org/zap/zapcore" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" - "github.com/csi-addons/kubernetes-csi-addons/controllers" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" + replicationstoragev1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1" + controllers "github.com/csi-addons/kubernetes-csi-addons/controllers/csiaddons" + replicationController "github.com/csi-addons/kubernetes-csi-addons/controllers/replication.storage" "github.com/csi-addons/kubernetes-csi-addons/internal/connection" //+kubebuilder:scaffold:imports ) @@ -51,6 +55,7 @@ func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(csiaddonsv1alpha1.AddToScheme(scheme)) + utilruntime.Must(replicationstoragev1alpha1.AddToScheme(scheme)) //+kubebuilder:scaffold:scheme } @@ -59,14 +64,17 @@ func main() { var enableLeaderElection bool var probeAddr string var reclaimSpaceTimeout time.Duration + var maxConcurrentReconciles int flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") flag.BoolVar(&enableLeaderElection, "leader-elect", false, "Enable leader election for controller manager. "+ "Enabling this will ensure there is only one active controller manager.") flag.DurationVar(&reclaimSpaceTimeout, "reclaim-space-timeout", defaultTimeout, "Timeout for reclaimspace operation") + flag.IntVar(&maxConcurrentReconciles, "max-concurrent-reconciles", 100, "Maximum number of concurrent reconciles") opts := zap.Options{ Development: true, + TimeEncoder: zapcore.ISO8601TimeEncoder, } opts.BindFlags(flag.CommandLine) flag.Parse() @@ -88,11 +96,14 @@ func main() { connPool := connection.NewConnectionPool() + ctrlOptions := controller.Options{ + MaxConcurrentReconciles: maxConcurrentReconciles, + } if err = (&controllers.CSIAddonsNodeReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), ConnPool: connPool, - }).SetupWithManager(mgr); err != nil { + }).SetupWithManager(mgr, ctrlOptions); err != nil { setupLog.Error(err, "unable to create controller", "controller", "CSIAddonsNode") os.Exit(1) } @@ -102,7 +113,7 @@ func main() { Scheme: mgr.GetScheme(), ConnPool: connPool, Timeout: reclaimSpaceTimeout, - }).SetupWithManager(mgr); err != nil { + }).SetupWithManager(mgr, ctrlOptions); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ReclaimSpaceJob") os.Exit(1) } @@ -111,24 +122,33 @@ func main() { Scheme: mgr.GetScheme(), Connpool: connPool, Timeout: time.Minute * 3, - }).SetupWithManager(mgr); err != nil { + }).SetupWithManager(mgr, ctrlOptions); err != nil { setupLog.Error(err, "unable to create controller", "controller", "NetworkFence") os.Exit(1) } if err = (&controllers.ReclaimSpaceCronJobReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - }).SetupWithManager(mgr); err != nil { + }).SetupWithManager(mgr, ctrlOptions); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ReclaimSpaceCronJob") os.Exit(1) } if err = (&controllers.PersistentVolumeClaimReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - }).SetupWithManager(mgr); err != nil { + }).SetupWithManager(mgr, ctrlOptions); err != nil { setupLog.Error(err, "unable to create controller", "controller", "PersistentVolumeClaim") os.Exit(1) } + if err = (&replicationController.VolumeReplicationReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Connpool: connPool, + Timeout: defaultTimeout, + }).SetupWithManager(mgr, ctrlOptions); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "VolumeReplication") + os.Exit(1) + } //+kubebuilder:scaffold:builder if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { diff --git a/config/crd/bases/csiaddons.openshift.io_csiaddonsnodes.yaml b/config/crd/bases/csiaddons.openshift.io_csiaddonsnodes.yaml index 99e423ee4..fbb07ab57 100644 --- a/config/crd/bases/csiaddons.openshift.io_csiaddonsnodes.yaml +++ b/config/crd/bases/csiaddons.openshift.io_csiaddonsnodes.yaml @@ -81,7 +81,7 @@ spec: description: CSIAddonsNodeStatus defines the observed state of CSIAddonsNode properties: message: - description: Messgae is a human-readable message indicating details + description: Message is a human-readable message indicating details about why the CSIAddonsNode is in this state. type: string reason: diff --git a/config/crd/bases/csiaddons.openshift.io_networkfences.yaml b/config/crd/bases/csiaddons.openshift.io_networkfences.yaml index 36b7c7a2b..67e809ae2 100644 --- a/config/crd/bases/csiaddons.openshift.io_networkfences.yaml +++ b/config/crd/bases/csiaddons.openshift.io_networkfences.yaml @@ -100,8 +100,8 @@ spec: description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a foo's - current state. // Known .status.conditions.type are: \"Available\", + \n type FooStatus struct{ // Represents the observations of a + foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" diff --git a/config/crd/bases/csiaddons.openshift.io_reclaimspacejobs.yaml b/config/crd/bases/csiaddons.openshift.io_reclaimspacejobs.yaml index 47fd73f0c..b0191d3cd 100644 --- a/config/crd/bases/csiaddons.openshift.io_reclaimspacejobs.yaml +++ b/config/crd/bases/csiaddons.openshift.io_reclaimspacejobs.yaml @@ -96,8 +96,8 @@ spec: description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a foo's - current state. // Known .status.conditions.type are: \"Available\", + \n type FooStatus struct{ // Represents the observations of a + foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" diff --git a/config/crd/bases/replication.storage.openshift.io_volumereplicationclasses.yaml b/config/crd/bases/replication.storage.openshift.io_volumereplicationclasses.yaml new file mode 100644 index 000000000..3009c9abd --- /dev/null +++ b/config/crd/bases/replication.storage.openshift.io_volumereplicationclasses.yaml @@ -0,0 +1,67 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null + name: volumereplicationclasses.replication.storage.openshift.io +spec: + group: replication.storage.openshift.io + names: + kind: VolumeReplicationClass + listKind: VolumeReplicationClassList + plural: volumereplicationclasses + shortNames: + - vrc + singular: volumereplicationclass + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .spec.provisioner + name: provisioner + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: VolumeReplicationClass is the Schema for the volumereplicationclasses + API. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: VolumeReplicationClassSpec specifies parameters that an underlying + storage system uses when creating a volume replica. A specific VolumeReplicationClass + is used by specifying its name in a VolumeReplication object. + properties: + parameters: + additionalProperties: + type: string + description: Parameters is a key-value map with storage provisioner + specific configurations for creating volume replicas + type: object + provisioner: + description: Provisioner is the name of storage provisioner + type: string + required: + - provisioner + type: object + status: + description: VolumeReplicationClassStatus defines the observed state of + VolumeReplicationClass. + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/crd/bases/replication.storage.openshift.io_volumereplications.yaml b/config/crd/bases/replication.storage.openshift.io_volumereplications.yaml new file mode 100644 index 000000000..bb24b40dc --- /dev/null +++ b/config/crd/bases/replication.storage.openshift.io_volumereplications.yaml @@ -0,0 +1,200 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null + name: volumereplications.replication.storage.openshift.io +spec: + group: replication.storage.openshift.io + names: + kind: VolumeReplication + listKind: VolumeReplicationList + plural: volumereplications + shortNames: + - vr + singular: volumereplication + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - jsonPath: .spec.volumeReplicationClass + name: volumeReplicationClass + type: string + - jsonPath: .spec.dataSource.name + name: pvcName + type: string + - jsonPath: .spec.replicationState + name: desiredState + type: string + - jsonPath: .status.state + name: currentState + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: VolumeReplication is the Schema for the volumereplications API. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: VolumeReplicationSpec defines the desired state of VolumeReplication. + properties: + autoResync: + description: AutoResync represents the volume to be auto resynced + when ReplicationState is "secondary" + type: boolean + dataSource: + description: DataSource represents the object associated with the + volume + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in + the core API group. For any other third-party types, APIGroup + is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + replicationHandle: + description: replicationHandle represents an existing (but new) replication + id + type: string + replicationState: + description: ReplicationState represents the replication operation + to be performed on the volume. Supported operations are "primary", + "secondary" and "resync" + enum: + - primary + - secondary + - resync + type: string + volumeReplicationClass: + description: VolumeReplicationClass is the VolumeReplicationClass + name for this VolumeReplication resource + type: string + required: + - autoResync + - dataSource + - replicationState + - volumeReplicationClass + type: object + status: + description: VolumeReplicationStatus defines the observed state of VolumeReplication. + properties: + conditions: + description: Conditions are the list of conditions and their status. + items: + description: "Condition contains details for one aspect of the current + state of this API Resource. --- This struct is intended for direct + use as an array at the field path .status.conditions. For example, + \n type FooStatus struct{ // Represents the observations of a + foo's current state. // Known .status.conditions.type are: \"Available\", + \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge + // +listType=map // +listMapKey=type Conditions []metav1.Condition + `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" + protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition + transitioned from one status to another. This should be when + the underlying condition changed. If that is not known, then + using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: message is a human readable message indicating + details about the transition. This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: observedGeneration represents the .metadata.generation + that the condition was set based upon. For instance, if .metadata.generation + is currently 12, but the .status.conditions[x].observedGeneration + is 9, the condition is out of date with respect to the current + state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: reason contains a programmatic identifier indicating + the reason for the condition's last transition. Producers + of specific condition types may define expected values and + meanings for this field, and whether the values are considered + a guaranteed API. The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + --- Many .condition.type values are consistent across resources + like Available, but because arbitrary conditions can be useful + (see .node.status.conditions), the ability to deconflict is + important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + lastCompletionTime: + format: date-time + type: string + lastStartTime: + format: date-time + type: string + lastSyncTime: + format: date-time + type: string + message: + type: string + observedGeneration: + description: observedGeneration is the last generation change the + operator has dealt with + format: int64 + type: integer + state: + description: State captures the latest state of the replication operation. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml index 2130ea869..ebc0b321e 100644 --- a/config/crd/kustomization.yaml +++ b/config/crd/kustomization.yaml @@ -6,6 +6,8 @@ resources: - bases/csiaddons.openshift.io_reclaimspacecronjobs.yaml - bases/csiaddons.openshift.io_reclaimspacejobs.yaml - bases/csiaddons.openshift.io_networkfences.yaml +- bases/replication.storage.openshift.io_volumereplications.yaml +- bases/replication.storage.openshift.io_volumereplicationclasses.yaml #+kubebuilder:scaffold:crdkustomizeresource patchesStrategicMerge: @@ -13,12 +15,16 @@ patchesStrategicMerge: # patches here are for enabling the conversion webhook for each CRD #- patches/webhook_in_csiaddonsnodes.yaml #- patches/webhook_in_reclaimspacejobs.yaml +#- patches/webhook_in_volumereplications.yaml +#- patches/webhook_in_volumereplicationclasses.yaml #+kubebuilder:scaffold:crdkustomizewebhookpatch # [CERTMANAGER] To enable cert-manager, uncomment all the sections with [CERTMANAGER] prefix. # patches here are for enabling the CA injection for each CRD #- patches/cainjection_in_csiaddonsnodes.yaml #- patches/cainjection_in_reclaimspacejobs.yaml +#- patches/cainjection_in_volumereplications.yaml +#- patches/cainjection_in_volumereplicationclasses.yaml #+kubebuilder:scaffold:crdkustomizecainjectionpatch # the following config is for teaching kustomize how to do kustomization for CRDs. diff --git a/config/crd/patches/cainjection_in_volumereplicationclasses.yaml b/config/crd/patches/cainjection_in_volumereplicationclasses.yaml new file mode 100644 index 000000000..0ce8b85e8 --- /dev/null +++ b/config/crd/patches/cainjection_in_volumereplicationclasses.yaml @@ -0,0 +1,7 @@ +# The following patch adds a directive for certmanager to inject CA into the CRD +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) + name: volumereplicationclasses.replication.storage.openshift.io diff --git a/config/crd/patches/cainjection_in_volumereplications.yaml b/config/crd/patches/cainjection_in_volumereplications.yaml new file mode 100644 index 000000000..8c43a523f --- /dev/null +++ b/config/crd/patches/cainjection_in_volumereplications.yaml @@ -0,0 +1,7 @@ +# The following patch adds a directive for certmanager to inject CA into the CRD +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) + name: volumereplications.replication.storage.openshift.io diff --git a/config/crd/patches/webhook_in_volumereplicationclasses.yaml b/config/crd/patches/webhook_in_volumereplicationclasses.yaml new file mode 100644 index 000000000..4dba64ee9 --- /dev/null +++ b/config/crd/patches/webhook_in_volumereplicationclasses.yaml @@ -0,0 +1,16 @@ +# The following patch enables a conversion webhook for the CRD +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: volumereplicationclasses.replication.storage.openshift.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + namespace: system + name: webhook-service + path: /convert + conversionReviewVersions: + - v1 diff --git a/config/crd/patches/webhook_in_volumereplications.yaml b/config/crd/patches/webhook_in_volumereplications.yaml new file mode 100644 index 000000000..5ec9ad145 --- /dev/null +++ b/config/crd/patches/webhook_in_volumereplications.yaml @@ -0,0 +1,16 @@ +# The following patch enables a conversion webhook for the CRD +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: volumereplications.replication.storage.openshift.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + namespace: system + name: webhook-service + path: /convert + conversionReviewVersions: + - v1 diff --git a/config/manifests/bases/clusterserviceversion.yaml.in b/config/manifests/bases/clusterserviceversion.yaml.in index 4ad5afe06..284db58d0 100644 --- a/config/manifests/bases/clusterserviceversion.yaml.in +++ b/config/manifests/bases/clusterserviceversion.yaml.in @@ -5,6 +5,7 @@ metadata: alm-examples: '[]' capabilities: Basic Install olm.skipRange: @SKIP_RANGE@ + operators.operatorframework.io/operator-type: non-standalone name: @PACKAGE_NAME@.v0.1.1 namespace: placeholder spec: @@ -31,12 +32,22 @@ spec: kind: ReclaimSpaceJob name: reclaimspacejobs.csiaddons.openshift.io version: v1alpha1 + - description: VolumeReplicationClass is the Schema for the volumereplicationclasses API + displayName: Volume Replication Class + kind: VolumeReplicationClass + name: volumereplicationclasses.replication.storage.openshift.io + version: v1alpha1 + - description: VolumeReplication is the Schema for the volumereplications API + displayName: Volume Replication + kind: VolumeReplication + name: volumereplications.replication.storage.openshift.io + version: v1alpha1 description: CSI Addons provides the CSI Addons Controller that enables advanced storage operations for CSI-drivers. displayName: CSI Addons icon: - - base64data: "" - mediatype: "" + - base64data: PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxOTIgMTQ1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6I2UwMDt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPlJlZEhhdC1Mb2dvLUhhdC1Db2xvcjwvdGl0bGU+PHBhdGggZD0iTTE1Ny43Nyw2Mi42MWExNCwxNCwwLDAsMSwuMzEsMy40MmMwLDE0Ljg4LTE4LjEsMTcuNDYtMzAuNjEsMTcuNDZDNzguODMsODMuNDksNDIuNTMsNTMuMjYsNDIuNTMsNDRhNi40Myw2LjQzLDAsMCwxLC4yMi0xLjk0bC0zLjY2LDkuMDZhMTguNDUsMTguNDUsMCwwLDAtMS41MSw3LjMzYzAsMTguMTEsNDEsNDUuNDgsODcuNzQsNDUuNDgsMjAuNjksMCwzNi40My03Ljc2LDM2LjQzLTIxLjc3LDAtMS4wOCwwLTEuOTQtMS43My0xMC4xM1oiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMjcuNDcsODMuNDljMTIuNTEsMCwzMC42MS0yLjU4LDMwLjYxLTE3LjQ2YTE0LDE0LDAsMCwwLS4zMS0zLjQybC03LjQ1LTMyLjM2Yy0xLjcyLTcuMTItMy4yMy0xMC4zNS0xNS43My0xNi42QzEyNC44OSw4LjY5LDEwMy43Ni41LDk3LjUxLjUsOTEuNjkuNSw5MCw4LDgzLjA2LDhjLTYuNjgsMC0xMS42NC01LjYtMTcuODktNS42LTYsMC05LjkxLDQuMDktMTIuOTMsMTIuNSwwLDAtOC40MSwyMy43Mi05LjQ5LDI3LjE2QTYuNDMsNi40MywwLDAsMCw0Mi41Myw0NGMwLDkuMjIsMzYuMywzOS40NSw4NC45NCwzOS40NU0xNjAsNzIuMDdjMS43Myw4LjE5LDEuNzMsOS4wNSwxLjczLDEwLjEzLDAsMTQtMTUuNzQsMjEuNzctMzYuNDMsMjEuNzdDNzguNTQsMTA0LDM3LjU4LDc2LjYsMzcuNTgsNTguNDlhMTguNDUsMTguNDUsMCwwLDEsMS41MS03LjMzQzIyLjI3LDUyLC41LDU1LC41LDc0LjIyYzAsMzEuNDgsNzQuNTksNzAuMjgsMTMzLjY1LDcwLjI4LDQ1LjI4LDAsNTYuNy0yMC40OCw1Ni43LTM2LjY1LDAtMTIuNzItMTEtMjcuMTYtMzAuODMtMzUuNzgiLz48L3N2Zz4= + mediatype: image/svg+xml install: spec: deployments: null diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index ed4b4ec0c..da05601eb 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -12,6 +12,7 @@ rules: verbs: - get - list + - update - watch - apiGroups: - "" @@ -36,6 +37,14 @@ rules: - persistentvolumeclaims/finalizers verbs: - update +- apiGroups: + - "" + resources: + - pods + verbs: + - get + - list + - watch - apiGroups: - csiaddons.openshift.io resources: @@ -140,6 +149,35 @@ rules: - get - patch - update +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplicationclasses + verbs: + - get + - list + - watch +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications + verbs: + - get + - list + - update + - watch +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications/finalizers + verbs: + - update +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications/status + verbs: + - update - apiGroups: - storage.k8s.io resources: diff --git a/config/rbac/volumereplication_editor_role.yaml b/config/rbac/volumereplication_editor_role.yaml new file mode 100644 index 000000000..fe2e89633 --- /dev/null +++ b/config/rbac/volumereplication_editor_role.yaml @@ -0,0 +1,24 @@ +# permissions for end users to edit volumereplications. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: volumereplication-editor-role +rules: +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications/status + verbs: + - get diff --git a/config/rbac/volumereplication_viewer_role.yaml b/config/rbac/volumereplication_viewer_role.yaml new file mode 100644 index 000000000..9f15adde6 --- /dev/null +++ b/config/rbac/volumereplication_viewer_role.yaml @@ -0,0 +1,20 @@ +# permissions for end users to view volumereplications. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: volumereplication-viewer-role +rules: +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications + verbs: + - get + - list + - watch +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications/status + verbs: + - get diff --git a/config/rbac/volumereplicationclass_editor_role.yaml b/config/rbac/volumereplicationclass_editor_role.yaml new file mode 100644 index 000000000..98415046a --- /dev/null +++ b/config/rbac/volumereplicationclass_editor_role.yaml @@ -0,0 +1,24 @@ +# permissions for end users to edit volumereplicationclasses. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: volumereplicationclass-editor-role +rules: +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplicationclasses + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplicationclasses/status + verbs: + - get diff --git a/config/rbac/volumereplicationclass_viewer_role.yaml b/config/rbac/volumereplicationclass_viewer_role.yaml new file mode 100644 index 000000000..4a9f4ddb7 --- /dev/null +++ b/config/rbac/volumereplicationclass_viewer_role.yaml @@ -0,0 +1,20 @@ +# permissions for end users to view volumereplicationclasses. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: volumereplicationclass-viewer-role +rules: +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplicationclasses + verbs: + - get + - list + - watch +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplicationclasses/status + verbs: + - get diff --git a/config/samples/replication.storage_v1alpha1_volumereplication.yaml b/config/samples/replication.storage_v1alpha1_volumereplication.yaml new file mode 100644 index 000000000..67a7f044b --- /dev/null +++ b/config/samples/replication.storage_v1alpha1_volumereplication.yaml @@ -0,0 +1,6 @@ +apiVersion: replication.storage.openshift.io/v1alpha1 +kind: VolumeReplication +metadata: + name: volumereplication-sample +spec: + # TODO(user): Add fields here diff --git a/config/samples/replication.storage_v1alpha1_volumereplicationclass.yaml b/config/samples/replication.storage_v1alpha1_volumereplicationclass.yaml new file mode 100644 index 000000000..f7658c603 --- /dev/null +++ b/config/samples/replication.storage_v1alpha1_volumereplicationclass.yaml @@ -0,0 +1,6 @@ +apiVersion: replication.storage.openshift.io/v1alpha1 +kind: VolumeReplicationClass +metadata: + name: volumereplicationclass-sample +spec: + # TODO(user): Add fields here diff --git a/controllers/csiaddonsnode_controller.go b/controllers/csiaddons/csiaddonsnode_controller.go similarity index 69% rename from controllers/csiaddonsnode_controller.go rename to controllers/csiaddons/csiaddonsnode_controller.go index a137fedf4..4a59356b6 100644 --- a/controllers/csiaddonsnode_controller.go +++ b/controllers/csiaddons/csiaddonsnode_controller.go @@ -20,22 +20,28 @@ import ( "context" "errors" "fmt" + "net/url" + "strings" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" "github.com/csi-addons/kubernetes-csi-addons/internal/connection" "github.com/csi-addons/kubernetes-csi-addons/internal/util" "github.com/go-logr/logr" + corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" ) var ( csiAddonsNodeFinalizer = csiaddonsv1alpha1.GroupVersion.Group + "/csiaddonsnode" + + errLegacyEndpoint = errors.New("legacy formatted endpoint") ) // CSIAddonsNodeReconciler reconciles a CSIAddonsNode object @@ -45,6 +51,7 @@ type CSIAddonsNodeReconciler struct { ConnPool *connection.ConnectionPool } +//+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch //+kubebuilder:rbac:groups=csiaddons.openshift.io,resources=csiaddonsnodes,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=csiaddons.openshift.io,resources=csiaddonsnodes/status,verbs=get;update;patch //+kubebuilder:rbac:groups=csiaddons.openshift.io,resources=csiaddonsnodes/finalizers,verbs=update @@ -85,12 +92,12 @@ func (r *CSIAddonsNodeReconciler) Reconcile(ctx context.Context, req ctrl.Reques nodeID := csiAddonsNode.Spec.Driver.NodeID driverName := csiAddonsNode.Spec.Driver.Name - endPoint := csiAddonsNode.Spec.Driver.EndPoint + key := csiAddonsNode.Namespace + "/" + csiAddonsNode.Name - logger = logger.WithValues("NodeID", nodeID, "EndPoint", endPoint, "DriverName", driverName) + logger = logger.WithValues("NodeID", nodeID, "DriverName", driverName) if !csiAddonsNode.DeletionTimestamp.IsZero() { - // if deletion timestap is set, the CSIAddonsNode is getting deleted, + // if deletion timestamp is set, the CSIAddonsNode is getting deleted, // delete connections and remove finalizer. logger.Info("Deleting connection") r.ConnPool.Delete(key) @@ -98,6 +105,14 @@ func (r *CSIAddonsNodeReconciler) Reconcile(ctx context.Context, req ctrl.Reques return ctrl.Result{}, err } + endPoint, err := r.resolveEndpoint(ctx, csiAddonsNode.Spec.Driver.EndPoint) + if err != nil { + logger.Error(err, "Failed to resolve endpoint") + return ctrl.Result{}, fmt.Errorf("failed to resolve endpoint %q: %w", csiAddonsNode.Spec.Driver.EndPoint, err) + } + + logger = logger.WithValues("EndPoint", endPoint) + if err := r.addFinalizer(ctx, &logger, csiAddonsNode); err != nil { return ctrl.Result{}, err } @@ -137,10 +152,11 @@ func (r *CSIAddonsNodeReconciler) Reconcile(ctx context.Context, req ctrl.Reques } // SetupWithManager sets up the controller with the Manager. -func (r *CSIAddonsNodeReconciler) SetupWithManager(mgr ctrl.Manager) error { +func (r *CSIAddonsNodeReconciler) SetupWithManager(mgr ctrl.Manager, ctrlOptions controller.Options) error { return ctrl.NewControllerManagedBy(mgr). For(&csiaddonsv1alpha1.CSIAddonsNode{}). WithEventFilter(predicate.GenerationChangedPredicate{}). + WithOptions(ctrlOptions). Complete(r) } @@ -184,6 +200,65 @@ func (r *CSIAddonsNodeReconciler) removeFinalizer( return nil } +// resolveEndpoint parses the endpoint and returned a string that can be used +// by GRPC to connect to the sidecar. +func (r *CSIAddonsNodeReconciler) resolveEndpoint(ctx context.Context, rawURL string) (string, error) { + namespace, podname, port, err := parseEndpoint(rawURL) + if err != nil && errors.Is(err, errLegacyEndpoint) { + return rawURL, nil + } else if err != nil { + return "", err + } else if namespace == "" { + return "", fmt.Errorf("failed to get namespace from endpoint %q", rawURL) + } else if podname == "" { + return "", fmt.Errorf("failed to get pod from endpoint %q", rawURL) + } + + pod := &corev1.Pod{} + err = r.Client.Get(ctx, client.ObjectKey{ + Namespace: namespace, + Name: podname, + }, pod) + if err != nil { + return "", fmt.Errorf("failed to get pod %s/%s: %w", namespace, podname, err) + } else if pod.Status.PodIP == "" { + return "", fmt.Errorf("pod %s/%s does not have an IP-address", namespace, podname) + } + + return fmt.Sprintf("%s:%s", pod.Status.PodIP, port), nil +} + +// parseEndpoint returns the rawURL if it is in the legacy : +// format. When the recommended format is used, it returns the Namespace, +// PodName, Port and error instead. +func parseEndpoint(rawURL string) (string, string, string, error) { + // assume old formatted endpoint, don't parse it + if !strings.Contains(rawURL, "://") { + return "", "", "", errLegacyEndpoint + } + + endpoint, err := url.Parse(rawURL) + if err != nil { + return "", "", "", fmt.Errorf("failed to parse endpoint %q: %w", rawURL, err) + } + + if endpoint.Scheme != "pod" { + return "", "", "", fmt.Errorf("endpoint scheme %q not supported", endpoint.Scheme) + } + + // split hostname -> pod.namespace + parts := strings.Split(endpoint.Hostname(), ".") + podname := parts[0] + namespace := "" + if len(parts) == 2 { + namespace = parts[1] + } else if len(parts) > 2 { + return "", "", "", fmt.Errorf("hostname %q is not in . format", endpoint.Hostname()) + } + + return namespace, podname, endpoint.Port(), nil +} + // validateCSIAddonsNodeSpec validates if Name and Endpoint are not empty. func validateCSIAddonsNodeSpec(csiaddonsnode *csiaddonsv1alpha1.CSIAddonsNode) error { if csiaddonsnode.Spec.Driver.Name == "" { diff --git a/controllers/csiaddons/csiaddonsnode_controller_test.go b/controllers/csiaddons/csiaddonsnode_controller_test.go new file mode 100644 index 000000000..12c727945 --- /dev/null +++ b/controllers/csiaddons/csiaddonsnode_controller_test.go @@ -0,0 +1,44 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestParseEndpoint(t *testing.T) { + _, _, _, err := parseEndpoint("1.2.3.4:5678") + assert.True(t, errors.Is(err, errLegacyEndpoint)) + + namespace, podname, port, err := parseEndpoint("pod://pod-name:5678") + assert.NoError(t, err) + assert.Equal(t, namespace, "") + assert.Equal(t, podname, "pod-name") + assert.Equal(t, port, "5678") + + namespace, podname, port, err = parseEndpoint("pod://pod-name.csi-addons:5678") + assert.NoError(t, err) + assert.Equal(t, namespace, "csi-addons") + assert.Equal(t, podname, "pod-name") + assert.Equal(t, port, "5678") + + _, _, _, err = parseEndpoint("pod://pod.ns.cluster.local:5678") + assert.Error(t, err) +} diff --git a/controllers/networkfence_controller.go b/controllers/csiaddons/networkfence_controller.go similarity index 98% rename from controllers/networkfence_controller.go rename to controllers/csiaddons/networkfence_controller.go index 20ae1ceaa..c52b53aed 100644 --- a/controllers/networkfence_controller.go +++ b/controllers/csiaddons/networkfence_controller.go @@ -27,10 +27,11 @@ import ( "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" conn "github.com/csi-addons/kubernetes-csi-addons/internal/connection" "github.com/csi-addons/kubernetes-csi-addons/internal/proto" "github.com/csi-addons/kubernetes-csi-addons/internal/util" @@ -186,10 +187,11 @@ func (nf *NetworkFenceInstance) updateStatus(ctx context.Context, } // SetupWithManager sets up the controller with the Manager. -func (r *NetworkFenceReconciler) SetupWithManager(mgr ctrl.Manager) error { +func (r *NetworkFenceReconciler) SetupWithManager(mgr ctrl.Manager, ctrlOptions controller.Options) error { return ctrl.NewControllerManagedBy(mgr). For(&csiaddonsv1alpha1.NetworkFence{}). WithEventFilter(predicate.GenerationChangedPredicate{}). + WithOptions(ctrlOptions). Complete(r) } diff --git a/controllers/persistentvolumeclaim_controller.go b/controllers/csiaddons/persistentvolumeclaim_controller.go similarity index 98% rename from controllers/persistentvolumeclaim_controller.go rename to controllers/csiaddons/persistentvolumeclaim_controller.go index eaf5bd2b6..24d71eebb 100644 --- a/controllers/persistentvolumeclaim_controller.go +++ b/controllers/csiaddons/persistentvolumeclaim_controller.go @@ -22,7 +22,7 @@ import ( "reflect" "time" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" "github.com/go-logr/logr" "github.com/robfig/cron/v3" @@ -33,6 +33,7 @@ import ( "k8s.io/apimachinery/pkg/types" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" @@ -168,7 +169,7 @@ func (r *PersistentVolumeClaimReconciler) Reconcile(ctx context.Context, req ctr } // SetupWithManager sets up the controller with the Manager. -func (r *PersistentVolumeClaimReconciler) SetupWithManager(mgr ctrl.Manager) error { +func (r *PersistentVolumeClaimReconciler) SetupWithManager(mgr ctrl.Manager, ctrlOptions controller.Options) error { err := mgr.GetFieldIndexer().IndexField( context.Background(), &csiaddonsv1alpha1.ReclaimSpaceCronJob{}, @@ -204,6 +205,7 @@ func (r *PersistentVolumeClaimReconciler) SetupWithManager(mgr ctrl.Manager) err For(&corev1.PersistentVolumeClaim{}). Owns(&csiaddonsv1alpha1.ReclaimSpaceCronJob{}). WithEventFilter(pred). + WithOptions(ctrlOptions). Complete(r) } diff --git a/controllers/persistentvolumeclaim_controller_test.go b/controllers/csiaddons/persistentvolumeclaim_controller_test.go similarity index 99% rename from controllers/persistentvolumeclaim_controller_test.go rename to controllers/csiaddons/persistentvolumeclaim_controller_test.go index 7fafec078..15602dd4f 100644 --- a/controllers/persistentvolumeclaim_controller_test.go +++ b/controllers/csiaddons/persistentvolumeclaim_controller_test.go @@ -21,7 +21,7 @@ import ( "strings" "testing" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" "github.com/go-logr/logr" "github.com/stretchr/testify/assert" diff --git a/controllers/reclaimspacecronjob_controller.go b/controllers/csiaddons/reclaimspacecronjob_controller.go similarity index 98% rename from controllers/reclaimspacecronjob_controller.go rename to controllers/csiaddons/reclaimspacecronjob_controller.go index 323ff5ed7..0f5763bc5 100644 --- a/controllers/reclaimspacecronjob_controller.go +++ b/controllers/csiaddons/reclaimspacecronjob_controller.go @@ -22,7 +22,7 @@ import ( "sort" "time" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" "github.com/go-logr/logr" "github.com/robfig/cron/v3" @@ -32,6 +32,7 @@ import ( ref "k8s.io/client-go/tools/reference" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/log" ) @@ -190,7 +191,7 @@ func (r *ReclaimSpaceCronJobReconciler) Reconcile(ctx context.Context, req ctrl. } // SetupWithManager sets up the controller with the Manager. -func (r *ReclaimSpaceCronJobReconciler) SetupWithManager(mgr ctrl.Manager) error { +func (r *ReclaimSpaceCronJobReconciler) SetupWithManager(mgr ctrl.Manager, ctrlOptions controller.Options) error { if err := mgr.GetFieldIndexer().IndexField(context.Background(), &csiaddonsv1alpha1.ReclaimSpaceJob{}, jobOwnerKey, func(rawObj client.Object) []string { // extract the owner from job object. job, ok := rawObj.(*csiaddonsv1alpha1.ReclaimSpaceJob) @@ -213,6 +214,7 @@ func (r *ReclaimSpaceCronJobReconciler) SetupWithManager(mgr ctrl.Manager) error return ctrl.NewControllerManagedBy(mgr). For(&csiaddonsv1alpha1.ReclaimSpaceCronJob{}). Owns(&csiaddonsv1alpha1.ReclaimSpaceJob{}). + WithOptions(ctrlOptions). Complete(r) } diff --git a/controllers/reclaimspacecronjob_controller_test.go b/controllers/csiaddons/reclaimspacecronjob_controller_test.go similarity index 99% rename from controllers/reclaimspacecronjob_controller_test.go rename to controllers/csiaddons/reclaimspacecronjob_controller_test.go index 34eeee0e1..62a9a9110 100644 --- a/controllers/reclaimspacecronjob_controller_test.go +++ b/controllers/csiaddons/reclaimspacecronjob_controller_test.go @@ -21,7 +21,7 @@ import ( "testing" "time" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/controllers/reclaimspacejob_controller.go b/controllers/csiaddons/reclaimspacejob_controller.go similarity index 98% rename from controllers/reclaimspacejob_controller.go rename to controllers/csiaddons/reclaimspacejob_controller.go index f96737aba..d85d968bc 100644 --- a/controllers/reclaimspacejob_controller.go +++ b/controllers/csiaddons/reclaimspacejob_controller.go @@ -23,7 +23,7 @@ import ( "math" "time" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" "github.com/csi-addons/kubernetes-csi-addons/internal/connection" "github.com/csi-addons/kubernetes-csi-addons/internal/proto" "github.com/csi-addons/kubernetes-csi-addons/internal/util" @@ -42,6 +42,7 @@ import ( "k8s.io/apimachinery/pkg/types" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" ) @@ -72,7 +73,7 @@ type ReclaimSpaceJobReconciler struct { //+kubebuilder:rbac:groups=csiaddons.openshift.io,resources=reclaimspacejobs,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=csiaddons.openshift.io,resources=reclaimspacejobs/status,verbs=get;update;patch //+kubebuilder:rbac:groups=csiaddons.openshift.io,resources=reclaimspacejobs/finalizers,verbs=update -//+kubebuilder:rbac:groups="",resources=persistentvolumeclaims,verbs=get;list;watch +//+kubebuilder:rbac:groups="",resources=persistentvolumeclaims,verbs=get;list;watch;update //+kubebuilder:rbac:groups="",resources=persistentvolumes,verbs=get;list;watch //+kubebuilder:rbac:groups=storage.k8s.io,resources=volumeattachments,verbs=get;list;watch @@ -160,10 +161,11 @@ func (r *ReclaimSpaceJobReconciler) Reconcile(ctx context.Context, req ctrl.Requ } // SetupWithManager sets up the controller with the Manager. -func (r *ReclaimSpaceJobReconciler) SetupWithManager(mgr ctrl.Manager) error { +func (r *ReclaimSpaceJobReconciler) SetupWithManager(mgr ctrl.Manager, ctrlOptions controller.Options) error { return ctrl.NewControllerManagedBy(mgr). For(&csiaddonsv1alpha1.ReclaimSpaceJob{}). WithEventFilter(predicate.GenerationChangedPredicate{}). + WithOptions(ctrlOptions). Complete(r) } diff --git a/controllers/reclaimspacejob_controller_test.go b/controllers/csiaddons/reclaimspacejob_controller_test.go similarity index 99% rename from controllers/reclaimspacejob_controller_test.go rename to controllers/csiaddons/reclaimspacejob_controller_test.go index 00e12e954..8122396a6 100644 --- a/controllers/reclaimspacejob_controller_test.go +++ b/controllers/csiaddons/reclaimspacejob_controller_test.go @@ -20,7 +20,7 @@ import ( "testing" "time" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" "github.com/csi-addons/kubernetes-csi-addons/internal/proto" "github.com/stretchr/testify/assert" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/controllers/suite_test.go b/controllers/csiaddons/suite_test.go similarity index 95% rename from controllers/suite_test.go rename to controllers/csiaddons/suite_test.go index 8f206de96..22c40bfee 100644 --- a/controllers/suite_test.go +++ b/controllers/csiaddons/suite_test.go @@ -32,7 +32,7 @@ import ( corev1 "k8s.io/api/core/v1" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" //+kubebuilder:scaffold:imports ) @@ -56,7 +56,7 @@ var _ = BeforeSuite(func() { By("bootstrapping test environment") testEnv = &envtest.Environment{ - CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")}, + CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")}, ErrorIfCRDPathMissing: true, } diff --git a/controllers/replication.storage/finalizers.go b/controllers/replication.storage/finalizers.go new file mode 100644 index 000000000..ec4dd32c7 --- /dev/null +++ b/controllers/replication.storage/finalizers.go @@ -0,0 +1,95 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "context" + "fmt" + + replicationv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1" + "github.com/csi-addons/kubernetes-csi-addons/internal/util" + + "github.com/go-logr/logr" + corev1 "k8s.io/api/core/v1" +) + +const ( + volumeReplicationFinalizer = "replication.storage.openshift.io" + pvcReplicationFinalizer = "replication.storage.openshift.io/pvc-protection" +) + +// addFinalizerToVR adds the VR finalizer on the VolumeReplication instance. +func (r *VolumeReplicationReconciler) addFinalizerToVR(logger logr.Logger, vr *replicationv1alpha1.VolumeReplication, +) error { + if !util.ContainsInSlice(vr.ObjectMeta.Finalizers, volumeReplicationFinalizer) { + logger.Info("adding finalizer to volumeReplication object", "Finalizer", volumeReplicationFinalizer) + vr.ObjectMeta.Finalizers = append(vr.ObjectMeta.Finalizers, volumeReplicationFinalizer) + if err := r.Client.Update(context.TODO(), vr); err != nil { + return fmt.Errorf("failed to add finalizer (%s) to VolumeReplication resource"+ + " (%s/%s) %w", + volumeReplicationFinalizer, vr.Namespace, vr.Name, err) + } + } + + return nil +} + +// removeFinalizerFromVR removes the VR finalizer from the VolumeReplication instance. +func (r *VolumeReplicationReconciler) removeFinalizerFromVR(logger logr.Logger, vr *replicationv1alpha1.VolumeReplication) error { + if util.ContainsInSlice(vr.ObjectMeta.Finalizers, volumeReplicationFinalizer) { + logger.Info("removing finalizer from volumeReplication object", "Finalizer", volumeReplicationFinalizer) + vr.ObjectMeta.Finalizers = util.RemoveFromSlice(vr.ObjectMeta.Finalizers, volumeReplicationFinalizer) + if err := r.Client.Update(context.TODO(), vr); err != nil { + return fmt.Errorf("failed to remove finalizer (%s) from VolumeReplication resource"+ + " (%s/%s), %w", + volumeReplicationFinalizer, vr.Namespace, vr.Name, err) + } + } + + return nil +} + +// addFinalizerToPVC adds the VR finalizer on the PersistentVolumeClaim. +func (r *VolumeReplicationReconciler) addFinalizerToPVC(logger logr.Logger, pvc *corev1.PersistentVolumeClaim) error { + if !util.ContainsInSlice(pvc.ObjectMeta.Finalizers, pvcReplicationFinalizer) { + logger.Info("adding finalizer to PersistentVolumeClaim object", "Finalizer", pvcReplicationFinalizer) + pvc.ObjectMeta.Finalizers = append(pvc.ObjectMeta.Finalizers, pvcReplicationFinalizer) + if err := r.Client.Update(context.TODO(), pvc); err != nil { + return fmt.Errorf("failed to add finalizer (%s) to PersistentVolumeClaim resource"+ + " (%s/%s) %w", + pvcReplicationFinalizer, pvc.Namespace, pvc.Name, err) + } + } + + return nil +} + +// removeFinalizerFromPVC removes the VR finalizer on PersistentVolumeClaim. +func (r *VolumeReplicationReconciler) removeFinalizerFromPVC(logger logr.Logger, pvc *corev1.PersistentVolumeClaim, +) error { + if util.ContainsInSlice(pvc.ObjectMeta.Finalizers, pvcReplicationFinalizer) { + logger.Info("removing finalizer from PersistentVolumeClaim object", "Finalizer", pvcReplicationFinalizer) + pvc.ObjectMeta.Finalizers = util.RemoveFromSlice(pvc.ObjectMeta.Finalizers, pvcReplicationFinalizer) + if err := r.Client.Update(context.TODO(), pvc); err != nil { + return fmt.Errorf("failed to remove finalizer (%s) from PersistentVolumeClaim resource"+ + " (%s/%s), %w", + pvcReplicationFinalizer, pvc.Namespace, pvc.Name, err) + } + } + + return nil +} diff --git a/controllers/replication.storage/parameters.go b/controllers/replication.storage/parameters.go new file mode 100644 index 000000000..dc15ffc56 --- /dev/null +++ b/controllers/replication.storage/parameters.go @@ -0,0 +1,72 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "errors" + "fmt" + "strings" +) + +const ( + // Replication Parameters prefixed with replicationParameterPrefix are not passed through + // to the driver on RPC calls. Instead these are the parameters used by the + // operator to get the required object from kubernetes and pass it to the + // Driver. + replicationParameterPrefix = "replication.storage.openshift.io/" + + prefixedReplicationSecretNameKey = replicationParameterPrefix + "replication-secret-name" // name key for secret + prefixedReplicationSecretNamespaceKey = replicationParameterPrefix + "replication-secret-namespace" // namespace key secret +) + +// filterPrefixedParameters removes all the reserved keys from the +// replicationclass which are matching the prefix. +func filterPrefixedParameters(prefix string, param map[string]string) map[string]string { + newParam := map[string]string{} + for k, v := range param { + if !strings.HasPrefix(k, prefix) { + newParam[k] = v + } + } + + return newParam +} + +// validatePrefixParameters checks for unknown reserved keys in parameters and +// empty values for reserved keys. +func validatePrefixedParameters(param map[string]string) error { + for k, v := range param { + if strings.HasPrefix(k, replicationParameterPrefix) { + switch k { + case prefixedReplicationSecretNameKey: + if v == "" { + return errors.New("secret name cannot be empty") + } + case prefixedReplicationSecretNamespaceKey: + if v == "" { + return errors.New("secret namespace cannot be empty") + } + // keep adding known prefixes to this list. + default: + + return fmt.Errorf("found unknown parameter key %q with reserved prefix %s", k, replicationParameterPrefix) + } + } + } + + return nil +} diff --git a/controllers/replication.storage/pvc.go b/controllers/replication.storage/pvc.go new file mode 100644 index 000000000..12145430b --- /dev/null +++ b/controllers/replication.storage/pvc.go @@ -0,0 +1,109 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "context" + "fmt" + + "github.com/go-logr/logr" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + + replicationv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1" +) + +// getPVCDataSource get pvc, pv object from the request. +func (r VolumeReplicationReconciler) getPVCDataSource(logger logr.Logger, req types.NamespacedName) (*corev1.PersistentVolumeClaim, *corev1.PersistentVolume, error) { + pvc := &corev1.PersistentVolumeClaim{} + err := r.Client.Get(context.TODO(), req, pvc) + if err != nil { + if errors.IsNotFound(err) { + logger.Error(err, "PVC not found", "PVC Name", req.Name) + } + + return nil, nil, err + } + // Validate PVC in bound state + if pvc.Status.Phase != corev1.ClaimBound { + return pvc, nil, fmt.Errorf("PVC %q is not bound to any PV", req.Name) + } + + // Get PV object for the PVC + pvName := pvc.Spec.VolumeName + pv := &corev1.PersistentVolume{} + err = r.Client.Get(context.TODO(), types.NamespacedName{Name: pvName}, pv) + if err != nil { + if errors.IsNotFound(err) { + logger.Error(err, "PV not found", "PV Name", pvName) + } + + return pvc, nil, err + } + + return pvc, pv, nil +} + +// annotatePVCWithOwner will add the VolumeReplication details to the PVC annotations. +func (r *VolumeReplicationReconciler) annotatePVCWithOwner(ctx context.Context, logger logr.Logger, reqOwnerName string, pvc *corev1.PersistentVolumeClaim) error { + if pvc.ObjectMeta.Annotations == nil { + pvc.ObjectMeta.Annotations = map[string]string{} + } + + currentOwnerName := pvc.ObjectMeta.Annotations[replicationv1alpha1.VolumeReplicationNameAnnotation] + if currentOwnerName == "" { + logger.Info("setting owner on PVC annotation", "Name", pvc.Name, "owner", reqOwnerName) + pvc.ObjectMeta.Annotations[replicationv1alpha1.VolumeReplicationNameAnnotation] = reqOwnerName + err := r.Update(ctx, pvc) + if err != nil { + logger.Error(err, "Failed to update PVC annotation", "Name", pvc.Name) + + return fmt.Errorf("failed to update PVC %q annotation for VolumeReplication: %w", + pvc.Name, err) + } + + return nil + } + + if currentOwnerName != reqOwnerName { + logger.Info("cannot change the owner of PVC", + "PVC name", pvc.Name, + "current owner", currentOwnerName, + "requested owner", reqOwnerName) + + return fmt.Errorf("PVC %q not owned by VolumeReplication %q", + pvc.Name, reqOwnerName) + } + + return nil +} + +// removeOwnerFromPVCAnnotation removes the VolumeReplication owner from the PVC annotations. +func (r *VolumeReplicationReconciler) removeOwnerFromPVCAnnotation(ctx context.Context, logger logr.Logger, pvc *corev1.PersistentVolumeClaim) error { + if _, ok := pvc.ObjectMeta.Annotations[replicationv1alpha1.VolumeReplicationNameAnnotation]; ok { + logger.Info("removing owner annotation from PersistentVolumeClaim object", "Annotation", replicationv1alpha1.VolumeReplicationNameAnnotation) + delete(pvc.ObjectMeta.Annotations, replicationv1alpha1.VolumeReplicationNameAnnotation) + if err := r.Client.Update(ctx, pvc); err != nil { + return fmt.Errorf("failed to remove annotation %q from PersistentVolumeClaim "+ + "%q %w", + replicationv1alpha1.VolumeReplicationNameAnnotation, pvc.Name, err) + } + } + + return nil +} diff --git a/controllers/replication.storage/pvc_test.go b/controllers/replication.storage/pvc_test.go new file mode 100644 index 000000000..749a6312b --- /dev/null +++ b/controllers/replication.storage/pvc_test.go @@ -0,0 +1,267 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "context" + "testing" + + replicationv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1" + "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/log" +) + +const ( + mockPVName = "test-pv" + mockPVCName = "test-pvc" + mockNamespace = "test-ns" + mockVolumeHandle = "test-volume-handle" +) + +var mockVolumeReplicationObj = &replicationv1alpha1.VolumeReplication{ + ObjectMeta: metav1.ObjectMeta{ + Name: "volume-replication", + Namespace: mockNamespace, + }, + Spec: replicationv1alpha1.VolumeReplicationSpec{ + VolumeReplicationClass: "volume-replication-class", + DataSource: corev1.TypedLocalObjectReference{ + Name: mockPVCName, + }, + }, +} + +var mockPersistentVolume = &corev1.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: mockPVName, + }, + Spec: corev1.PersistentVolumeSpec{ + PersistentVolumeSource: corev1.PersistentVolumeSource{ + CSI: &corev1.CSIPersistentVolumeSource{ + VolumeHandle: mockVolumeHandle, + }, + }, + }, +} + +var mockPersistentVolumeClaim = &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: mockPVCName, + Namespace: mockNamespace, + }, + Spec: corev1.PersistentVolumeClaimSpec{ + VolumeName: mockPVName, + }, + Status: corev1.PersistentVolumeClaimStatus{ + Phase: corev1.ClaimBound, + }, +} + +func createFakeScheme(t *testing.T) *runtime.Scheme { + t.Helper() + scheme, err := replicationv1alpha1.SchemeBuilder.Build() + if err != nil { + assert.Fail(t, "unable to build scheme") + } + err = corev1.AddToScheme(scheme) + if err != nil { + assert.Fail(t, "failed to add corev1 scheme") + } + err = replicationv1alpha1.AddToScheme(scheme) + if err != nil { + assert.Fail(t, "failed to add replicationv1alpha1 scheme") + } + + return scheme +} + +func createFakeVolumeReplicationReconciler(t *testing.T, obj ...runtime.Object) VolumeReplicationReconciler { + t.Helper() + scheme := createFakeScheme(t) + client := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(obj...).Build() + + return VolumeReplicationReconciler{ + Client: client, + Scheme: scheme, + } +} + +func TestGetVolumeHandle(t *testing.T) { + t.Parallel() + testcases := []struct { + name string + pv *corev1.PersistentVolume + pvc *corev1.PersistentVolumeClaim + expectedVolumeHandle string + errorExpected bool + }{ + { + name: "case 1: volume handle available", + pv: mockPersistentVolume, + pvc: mockPersistentVolumeClaim, + expectedVolumeHandle: mockVolumeHandle, + errorExpected: false, + }, + { + name: "case 2: pvc name in VolumeReplication CR not found", + pv: mockPersistentVolume, + pvc: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pvc-name", + Namespace: mockNamespace, + }, + }, + expectedVolumeHandle: mockVolumeHandle, + errorExpected: true, + }, + { + name: "case 3: pvc not bound", + pv: mockPersistentVolume, + pvc: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: mockPVCName, + Namespace: mockNamespace, + }, + }, + expectedVolumeHandle: mockVolumeHandle, + errorExpected: true, + }, + } + + for _, tc := range testcases { + volumeReplication := &replicationv1alpha1.VolumeReplication{} + mockVolumeReplicationObj.DeepCopyInto(volumeReplication) + + testPV := &corev1.PersistentVolume{} + tc.pv.DeepCopyInto(testPV) + + testPVC := &corev1.PersistentVolumeClaim{} + tc.pvc.DeepCopyInto(testPVC) + + namespacedName := types.NamespacedName{ + Name: mockPVCName, + Namespace: volumeReplication.Namespace, + } + + reconciler := createFakeVolumeReplicationReconciler(t, testPV, testPVC, volumeReplication) + resultPVC, resultPV, err := reconciler.getPVCDataSource(log.FromContext(context.TODO()), namespacedName) + if tc.errorExpected { + assert.Error(t, err) + } else { + assert.NoError(t, err) + assert.NotEqual(t, nil, resultPVC) + assert.NotEqual(t, nil, resultPV) + assert.Equal(t, tc.expectedVolumeHandle, resultPV.Spec.CSI.VolumeHandle) + } + } +} + +func TestVolumeReplicationReconciler_annotatePVCWithOwner(t *testing.T) { + t.Parallel() + vrName := "test-vr" + + testcases := []struct { + name string + pvc *corev1.PersistentVolumeClaim + errorExpected bool + }{ + { + name: "case 1: no VR is owning the PVC", + pvc: mockPersistentVolumeClaim, + errorExpected: false, + }, + { + name: "case 2: pvc is already owned by same VR", + pvc: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pvc-name", + Namespace: mockNamespace, + Annotations: map[string]string{ + replicationv1alpha1.VolumeReplicationNameAnnotation: vrName, + }, + }, + }, + errorExpected: false, + }, + { + name: "case 2: pvc is owned by different VR", + pvc: &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pvc-name", + Namespace: mockNamespace, + Annotations: map[string]string{ + replicationv1alpha1.VolumeReplicationNameAnnotation: "test-vr-1", + }, + }, + }, + errorExpected: true, + }, + } + + for _, tc := range testcases { + volumeReplication := &replicationv1alpha1.VolumeReplication{} + mockVolumeReplicationObj.DeepCopyInto(volumeReplication) + + testPVC := &corev1.PersistentVolumeClaim{} + tc.pvc.DeepCopyInto(testPVC) + + ctx := context.TODO() + reconciler := createFakeVolumeReplicationReconciler(t, testPVC, volumeReplication) + err := reconciler.annotatePVCWithOwner(ctx, log.FromContext(context.TODO()), vrName, testPVC) + if tc.errorExpected { + assert.Error(t, err) + } else { + assert.NoError(t, err) + + pvcNamespacedName := types.NamespacedName{ + Name: testPVC.Name, + Namespace: testPVC.Namespace, + } + + // check annotation is added + err = reconciler.Get(ctx, pvcNamespacedName, testPVC) + assert.NoError(t, err) + + assert.Equal(t, testPVC.ObjectMeta.Annotations[replicationv1alpha1.VolumeReplicationNameAnnotation], vrName) + } + + err = reconciler.removeOwnerFromPVCAnnotation(context.TODO(), log.FromContext(context.TODO()), testPVC) + assert.NoError(t, err) + + // try calling delete again, it should not fail + err = reconciler.removeOwnerFromPVCAnnotation(context.TODO(), log.FromContext(context.TODO()), testPVC) + assert.NoError(t, err) + + } + + // try removeOwnerFromPVCAnnotation for empty map + pvc := &corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pvc-name", + Namespace: mockNamespace, + }, + } + volumeReplication := &replicationv1alpha1.VolumeReplication{} + reconciler := createFakeVolumeReplicationReconciler(t, pvc, volumeReplication) + err := reconciler.removeOwnerFromPVCAnnotation(context.TODO(), log.FromContext(context.TODO()), pvc) + assert.NoError(t, err) +} diff --git a/controllers/replication.storage/replication/replication.go b/controllers/replication.storage/replication/replication.go new file mode 100644 index 000000000..772257e2b --- /dev/null +++ b/controllers/replication.storage/replication/replication.go @@ -0,0 +1,152 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 replication + +import ( + "github.com/csi-addons/kubernetes-csi-addons/internal/client" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// Replication represents the instance of a single replication operation. +type Replication struct { + Params CommonRequestParameters + Force bool +} + +// Response is the response of a replication operation. +type Response struct { + Response interface{} + Error error +} + +// CommonRequestParameters holds the common parameters across replication operations. +type CommonRequestParameters struct { + VolumeID string + ReplicationID string + Parameters map[string]string + SecretName string + SecretNamespace string + Replication client.VolumeReplication +} + +func (r *Replication) Enable() *Response { + resp, err := r.Params.Replication.EnableVolumeReplication( + r.Params.VolumeID, + r.Params.ReplicationID, + r.Params.SecretName, + r.Params.SecretNamespace, + r.Params.Parameters, + ) + + return &Response{Response: resp, Error: err} +} + +func (r *Replication) Disable() *Response { + resp, err := r.Params.Replication.DisableVolumeReplication( + r.Params.VolumeID, + r.Params.ReplicationID, + r.Params.SecretName, + r.Params.SecretNamespace, + r.Params.Parameters, + ) + + return &Response{Response: resp, Error: err} +} + +func (r *Replication) Promote() *Response { + resp, err := r.Params.Replication.PromoteVolume( + r.Params.VolumeID, + r.Params.ReplicationID, + r.Force, + r.Params.SecretName, + r.Params.SecretNamespace, + r.Params.Parameters, + ) + + return &Response{Response: resp, Error: err} +} + +func (r *Replication) Demote() *Response { + resp, err := r.Params.Replication.DemoteVolume( + r.Params.VolumeID, + r.Params.ReplicationID, + r.Params.SecretName, + r.Params.SecretNamespace, + r.Params.Parameters, + ) + + return &Response{Response: resp, Error: err} +} + +func (r *Replication) Resync() *Response { + resp, err := r.Params.Replication.ResyncVolume( + r.Params.VolumeID, + r.Params.ReplicationID, + r.Force, + r.Params.SecretName, + r.Params.SecretNamespace, + r.Params.Parameters, + ) + + return &Response{Response: resp, Error: err} +} + +func (r *Replication) GetInfo() *Response { + resp, err := r.Params.Replication.GetVolumeReplicationInfo( + r.Params.VolumeID, + r.Params.ReplicationID, + r.Params.SecretName, + r.Params.SecretNamespace, + ) + + return &Response{Response: resp, Error: err} +} + +func (r *Response) HasKnownGRPCError(knownErrors []codes.Code) bool { + if r.Error == nil { + return false + } + + s, ok := status.FromError(r.Error) + if !ok { + // This is not gRPC error. The operation must have failed before gRPC + // method was called, otherwise we would get gRPC error. + return false + } + + for _, e := range knownErrors { + if s.Code() == e { + return true + } + } + + return false +} + +// GetMessageFromError returns the message from the error. +func GetMessageFromError(err error) string { + s, ok := status.FromError(err) + if !ok { + // This is not gRPC error. The operation must have failed before gRPC + // method was called, otherwise we would get gRPC error. + return err.Error() + } + + return s.Message() +} diff --git a/controllers/replication.storage/replication/replication_test.go b/controllers/replication.storage/replication/replication_test.go new file mode 100644 index 000000000..3375a2e1c --- /dev/null +++ b/controllers/replication.storage/replication/replication_test.go @@ -0,0 +1,59 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 replication + +import ( + "errors" + "testing" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func TestGetMessageFromError(t *testing.T) { + t.Parallel() + tests := []struct { + name string + err error + want string + }{ + { + name: "test GRPC error message", + err: status.Error(codes.Internal, "failure"), + want: "failure", + }, + { + name: "test non grpc error message", + err: errors.New("non grpc failure"), + want: "non grpc failure", + }, + { + name: "test nil error", + err: nil, + want: "", + }, + } + for _, tt := range tests { + newtt := tt + t.Run(newtt.name, func(t *testing.T) { + t.Parallel() + if got := GetMessageFromError(newtt.err); got != newtt.want { + t.Errorf("GetMessageFromError() = %v, want %v", got, newtt.want) + } + }) + } +} diff --git a/controllers/replication.storage/status.go b/controllers/replication.storage/status.go new file mode 100644 index 000000000..f97a38278 --- /dev/null +++ b/controllers/replication.storage/status.go @@ -0,0 +1,223 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const ( + ConditionCompleted = "Completed" + ConditionDegraded = "Degraded" + ConditionResyncing = "Resyncing" +) + +const ( + Success = "Success" + Promoted = "Promoted" + Demoted = "Demoted" + FailedToPromote = "FailedToPromote" + FailedToDemote = "FailedToDemote" + Error = "Error" + VolumeDegraded = "VolumeDegraded" + Healthy = "Healthy" + ResyncTriggered = "ResyncTriggered" + FailedToResync = "FailedToResync" + NotResyncing = "NotResyncing" +) + +// sets conditions when volume was promoted successfully. +func setPromotedCondition(conditions *[]metav1.Condition, observedGeneration int64) { + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionCompleted, + Reason: Promoted, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionTrue, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionDegraded, + Reason: Healthy, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionResyncing, + Reason: NotResyncing, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) +} + +// sets conditions when volume promotion was failed. +func setFailedPromotionCondition(conditions *[]metav1.Condition, observedGeneration int64) { + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionCompleted, + Reason: FailedToPromote, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionDegraded, + Reason: Error, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionTrue, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionResyncing, + Reason: NotResyncing, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) +} + +// sets conditions when volume is demoted and ready to use (resync completed). +func setNotDegradedCondition(conditions *[]metav1.Condition, observedGeneration int64) { + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionDegraded, + Reason: Healthy, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionResyncing, + Reason: NotResyncing, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) +} + +// sets conditions when volume was demoted successfully. +func setDemotedCondition(conditions *[]metav1.Condition, observedGeneration int64) { + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionCompleted, + Reason: Demoted, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionTrue, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionDegraded, + Reason: VolumeDegraded, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionTrue, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionResyncing, + Reason: NotResyncing, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) +} + +// sets conditions when volume demotion was failed. +func setFailedDemotionCondition(conditions *[]metav1.Condition, observedGeneration int64) { + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionCompleted, + Reason: FailedToDemote, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionDegraded, + Reason: Error, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionTrue, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionResyncing, + Reason: NotResyncing, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) +} + +// sets conditions when volume resync was triggered successfully. +func setResyncCondition(conditions *[]metav1.Condition, observedGeneration int64) { + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionCompleted, + Reason: Demoted, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionTrue, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionDegraded, + Reason: VolumeDegraded, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionTrue, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionResyncing, + Reason: ResyncTriggered, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionTrue, + }) +} + +// sets conditions when volume resync failed. +func setFailedResyncCondition(conditions *[]metav1.Condition, observedGeneration int64) { + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionCompleted, + Reason: FailedToResync, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionDegraded, + Reason: Error, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionTrue, + }) + setStatusCondition(conditions, &metav1.Condition{ + Type: ConditionResyncing, + Reason: FailedToResync, + ObservedGeneration: observedGeneration, + Status: metav1.ConditionFalse, + }) +} + +func setStatusCondition(existingConditions *[]metav1.Condition, newCondition *metav1.Condition) { + if existingConditions == nil { + existingConditions = &[]metav1.Condition{} + } + + existingCondition := findCondition(*existingConditions, newCondition.Type) + if existingCondition == nil { + newCondition.LastTransitionTime = metav1.NewTime(time.Now()) + *existingConditions = append(*existingConditions, *newCondition) + + return + } + + if existingCondition.Status != newCondition.Status { + existingCondition.Status = newCondition.Status + existingCondition.LastTransitionTime = metav1.NewTime(time.Now()) + } + + existingCondition.Reason = newCondition.Reason + existingCondition.ObservedGeneration = newCondition.ObservedGeneration +} + +func findCondition(existingConditions []metav1.Condition, conditionType string) *metav1.Condition { + for i := range existingConditions { + if existingConditions[i].Type == conditionType { + return &existingConditions[i] + } + } + + return nil +} diff --git a/controllers/replication.storage/suite_test.go b/controllers/replication.storage/suite_test.go new file mode 100644 index 000000000..0be61ace2 --- /dev/null +++ b/controllers/replication.storage/suite_test.go @@ -0,0 +1,81 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "path/filepath" + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "k8s.io/client-go/kubernetes/scheme" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/envtest" + "sigs.k8s.io/controller-runtime/pkg/envtest/printer" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + + replicationv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1" // +kubebuilder:scaffold:imports +) + +// These tests use Ginkgo (BDD-style Go testing framework). Refer to +// http://onsi.github.io/ginkgo/ to learn more about Ginkgo. + +var ( + k8sClient client.Client + testEnv *envtest.Environment +) + +func TestAPIs(t *testing.T) { + t.Parallel() + RegisterFailHandler(Fail) + + RunSpecsWithDefaultAndCustomReporters(t, + "Controller Suite", + []Reporter{printer.NewlineReporter{}}) +} + +var _ = BeforeSuite(func() { + logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) + + By("bootstrapping test environment") + testEnv = &envtest.Environment{ + CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")}, + } + + cfg, err := testEnv.Start() + Expect(err).NotTo(HaveOccurred()) + Expect(cfg).NotTo(BeNil()) + + err = replicationv1alpha1.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + + err = replicationv1alpha1.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + + // +kubebuilder:scaffold:scheme + + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + Expect(err).NotTo(HaveOccurred()) + Expect(k8sClient).NotTo(BeNil()) +}, 60) + +var _ = AfterSuite(func() { + By("tearing down the test environment") + err := testEnv.Stop() + Expect(err).NotTo(HaveOccurred()) +}) diff --git a/controllers/replication.storage/volumereplication_controller.go b/controllers/replication.storage/volumereplication_controller.go new file mode 100644 index 000000000..e0a9c303d --- /dev/null +++ b/controllers/replication.storage/volumereplication_controller.go @@ -0,0 +1,749 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "context" + "fmt" + "time" + + replicationv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1" + "github.com/csi-addons/kubernetes-csi-addons/controllers/replication.storage/replication" + grpcClient "github.com/csi-addons/kubernetes-csi-addons/internal/client" + conn "github.com/csi-addons/kubernetes-csi-addons/internal/connection" + "github.com/csi-addons/kubernetes-csi-addons/internal/proto" + "github.com/csi-addons/kubernetes-csi-addons/internal/util" + + "github.com/csi-addons/spec/lib/go/identity" + "github.com/go-logr/logr" + "google.golang.org/grpc/codes" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +const ( + pvcDataSource = "PersistentVolumeClaim" + volumeReplicationClass = "VolumeReplicationClass" + volumeReplication = "VolumeReplication" + defaultScheduleTime = time.Hour +) + +var ( + volumePromotionKnownErrors = []codes.Code{codes.FailedPrecondition} + disableReplicationKnownErrors = []codes.Code{codes.NotFound} + getReplicationInfoKnownErrors = []codes.Code{codes.NotFound} +) + +// VolumeReplicationReconciler reconciles a VolumeReplication object. +type VolumeReplicationReconciler struct { + client.Client + Scheme *runtime.Scheme + // ConnectionPool consists of map of Connection objects + Connpool *conn.ConnectionPool + // Timeout for the Reconcile operation. + Timeout time.Duration + Replication grpcClient.VolumeReplication +} + +// +kubebuilder:rbac:groups=replication.storage.openshift.io,resources=volumereplications,verbs=get;list;watch;update +// +kubebuilder:rbac:groups=replication.storage.openshift.io,resources=volumereplications/status,verbs=update +// +kubebuilder:rbac:groups=replication.storage.openshift.io,resources=volumereplications/finalizers,verbs=update +// +kubebuilder:rbac:groups=replication.storage.openshift.io,resources=volumereplicationclasses,verbs=get;list;watch +//+kubebuilder:rbac:groups=core,resources=persistentvolumeclaims/finalizers,verbs=update +//+kubebuilder:rbac:groups=core,resources=persistentvolumeclaims,verbs=get;list;watch + +// Reconcile is part of the main kubernetes reconciliation loop which aims to +// move the current state of the cluster closer to the desired state. +// +// For more details, check Reconcile and its Result here: +// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.7.0/pkg/reconcile +func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { + logger := log.FromContext(ctx, "Request.Name", req.Name, "Request.Namespace", req.Namespace) + + // Fetch VolumeReplication instance + instance := &replicationv1alpha1.VolumeReplication{} + err := r.Client.Get(context.TODO(), req.NamespacedName, instance) + if err != nil { + if errors.IsNotFound(err) { + // Request object not found, could have been deleted after reconcile request. + // Owned objects are automatically garbage collected. For additional cleanup logic use finalizers. + // Return and don't requeue + logger.Info("volumeReplication resource not found") + + return reconcile.Result{}, nil + } + // Error reading the object - requeue the request. + return reconcile.Result{}, err + } + + // Get VolumeReplicationClass + vrcObj, err := r.getVolumeReplicationClass(logger, instance.Spec.VolumeReplicationClass) + if err != nil { + setFailureCondition(instance) + uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), err.Error()) + if uErr != nil { + logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name) + } + + return ctrl.Result{}, err + } + + err = validatePrefixedParameters(vrcObj.Spec.Parameters) + if err != nil { + logger.Error(err, "failed to validate parameters of volumeReplicationClass", "VRCName", instance.Spec.VolumeReplicationClass) + setFailureCondition(instance) + uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), err.Error()) + if uErr != nil { + logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name) + } + + return ctrl.Result{}, err + } + // remove the prefix keys in volume replication class parameters + parameters := filterPrefixedParameters(replicationParameterPrefix, vrcObj.Spec.Parameters) + + // get secret + secretName := vrcObj.Spec.Parameters[prefixedReplicationSecretNameKey] + secretNamespace := vrcObj.Spec.Parameters[prefixedReplicationSecretNamespaceKey] + + var ( + volumeHandle string + pvc *corev1.PersistentVolumeClaim + pv *corev1.PersistentVolume + pvErr error + ) + + replicationHandle := instance.Spec.ReplicationHandle + + nameSpacedName := types.NamespacedName{Name: instance.Spec.DataSource.Name, Namespace: req.Namespace} + switch instance.Spec.DataSource.Kind { + case pvcDataSource: + pvc, pv, pvErr = r.getPVCDataSource(logger, nameSpacedName) + if pvErr != nil { + logger.Error(pvErr, "failed to get PVC", "PVCName", instance.Spec.DataSource.Name) + setFailureCondition(instance) + uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), pvErr.Error()) + if uErr != nil { + logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name) + } + + return ctrl.Result{}, pvErr + } + + volumeHandle = pv.Spec.CSI.VolumeHandle + default: + err = fmt.Errorf("unsupported datasource kind") + logger.Error(err, "given kind not supported", "Kind", instance.Spec.DataSource.Kind) + setFailureCondition(instance) + uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), err.Error()) + if uErr != nil { + logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name) + } + + return ctrl.Result{}, nil + } + + logger.Info("volume handle", "VolumeHandleName", volumeHandle) + if replicationHandle != "" { + logger.Info("Replication handle", "ReplicationHandleName", replicationHandle) + } + + replicationClient, err := r.getReplicationClient(vrcObj.Spec.Provisioner) + if err != nil { + logger.Error(err, "Failed to get ReplicationClient") + + return ctrl.Result{}, err + } + + vr := &volumeReplicationInstance{ + logger: logger, + instance: instance, + commonRequestParameters: replication.CommonRequestParameters{ + VolumeID: volumeHandle, + ReplicationID: replicationHandle, + Parameters: parameters, + SecretName: secretName, + SecretNamespace: secretNamespace, + Replication: replicationClient, + }, + force: false, + } + + // check if the object is being deleted + if instance.GetDeletionTimestamp().IsZero() { + if err = r.addFinalizerToVR(logger, instance); err != nil { + logger.Error(err, "Failed to add VolumeReplication finalizer") + + return reconcile.Result{}, err + } + + err = r.annotatePVCWithOwner(ctx, logger, req.Name, pvc) + if err != nil { + logger.Error(err, "Failed to annotate PVC owner") + return ctrl.Result{}, err + } + + if err = r.addFinalizerToPVC(logger, pvc); err != nil { + logger.Error(err, "Failed to add PersistentVolumeClaim finalizer") + + return reconcile.Result{}, err + } + } else { + if util.ContainsInSlice(instance.GetFinalizers(), volumeReplicationFinalizer) { + err = r.disableVolumeReplication(vr) + if err != nil { + logger.Error(err, "failed to disable replication") + + return ctrl.Result{}, err + } + + if err = r.removeOwnerFromPVCAnnotation(ctx, logger, pvc); err != nil { + logger.Error(err, "Failed to remove VolumeReplication annotation from PersistentVolumeClaim") + + return reconcile.Result{}, err + } + + if err = r.removeFinalizerFromPVC(logger, pvc); err != nil { + logger.Error(err, "Failed to remove PersistentVolumeClaim finalizer") + + return reconcile.Result{}, err + } + + // once all finalizers have been removed, the object will be + // deleted + if err = r.removeFinalizerFromVR(logger, instance); err != nil { + logger.Error(err, "Failed to remove VolumeReplication finalizer") + + return reconcile.Result{}, err + } + } + logger.Info("volumeReplication object is terminated, skipping reconciliation") + + return ctrl.Result{}, nil + } + + instance.Status.LastStartTime = getCurrentTime() + if err = r.Client.Update(context.TODO(), instance); err != nil { + logger.Error(err, "failed to update status") + + return reconcile.Result{}, err + } + + var replicationErr error + var requeueForResync bool + + switch instance.Spec.ReplicationState { + case replicationv1alpha1.Primary: + // Avoid extra RPC calls as request will be requested again for + // updating the LastSyncTime in the status. The volume needs to be + // replication enabled and promoted only once, not always during + // each reconciliation. + if instance.Status.State != replicationv1alpha1.PrimaryState { + // enable replication only if its not primary + if err = r.enableReplication(vr); err != nil { + logger.Error(err, "failed to enable replication") + setFailureCondition(instance) + msg := replication.GetMessageFromError(err) + uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), msg) + if uErr != nil { + logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name) + } + + return reconcile.Result{}, err + } + replicationErr = r.markVolumeAsPrimary(vr) + } + + case replicationv1alpha1.Secondary: + // For the first time, mark the volume as secondary and requeue the + // request. For some storage providers it takes some time to determine + // whether the volume need correction example:- correcting split brain. + if instance.Status.State != replicationv1alpha1.SecondaryState { + replicationErr = r.markVolumeAsSecondary(vr) + if replicationErr == nil { + logger.Info("volume is not ready to use") + // set the status.State to secondary as the + // instance.Status.State is primary for the first time. + err = r.updateReplicationStatus(instance, logger, getReplicationState(instance), "volume is marked secondary and is degraded") + if err != nil { + return ctrl.Result{}, err + } + + return ctrl.Result{ + Requeue: true, + // Setting Requeue time for 15 seconds + RequeueAfter: time.Second * 15, + }, nil + } + } else { + replicationErr = r.markVolumeAsSecondary(vr) + // resync volume if successfully marked Secondary + if replicationErr == nil { + vr.force = vr.instance.Spec.AutoResync + requeueForResync, replicationErr = r.resyncVolume(vr) + } + } + + case replicationv1alpha1.Resync: + vr.force = true + requeueForResync, replicationErr = r.resyncVolume(vr) + + default: + replicationErr = fmt.Errorf("unsupported volume state") + logger.Error(replicationErr, "given volume state is not supported", "ReplicationState", instance.Spec.ReplicationState) + setFailureCondition(instance) + err = r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), replicationErr.Error()) + if err != nil { + logger.Error(err, "failed to update volumeReplication status", "VRName", instance.Name) + } + + return ctrl.Result{}, nil + } + + if replicationErr != nil { + msg := replication.GetMessageFromError(replicationErr) + logger.Error(replicationErr, "failed to Replicate", "ReplicationState", instance.Spec.ReplicationState) + err = r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), msg) + if err != nil { + logger.Error(err, "failed to update volumeReplication status", "VRName", instance.Name) + } + + if instance.Status.State == replicationv1alpha1.SecondaryState { + return ctrl.Result{ + Requeue: true, + // in case of any error during secondary state, requeue for every 15 seconds. + RequeueAfter: time.Second * 15, + }, nil + } + + return ctrl.Result{}, replicationErr + } + + if requeueForResync { + logger.Info("volume is not ready to use, requeuing for resync") + + err = r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), "volume is degraded") + if err != nil { + logger.Error(err, "failed to update volumeReplication status", "VRName", instance.Name) + } + + return ctrl.Result{ + Requeue: true, + // Setting Requeue time for 30 seconds as the resync can take time + // and having default Requeue exponential backoff time can affect + // the RTO time. + RequeueAfter: time.Second * 30, + }, nil + } + + var msg string + if instance.Spec.ReplicationState == replicationv1alpha1.Resync { + msg = "volume is marked for resyncing" + } else { + msg = fmt.Sprintf("volume is marked %s", string(instance.Spec.ReplicationState)) + } + + instance.Status.LastCompletionTime = getCurrentTime() + + var requeueForInfo bool + + if instance.Spec.ReplicationState == replicationv1alpha1.Primary { + info, err := r.getVolumeReplicationInfo(vr) + if err != nil { + logger.Error(err, "Failed to get volume replication info") + return ctrl.Result{}, err + } + ts := info.GetLastSyncTime() + if ts != nil { + lastSyncTime := metav1.NewTime(ts.AsTime()) + instance.Status.LastSyncTime = &lastSyncTime + } + requeueForInfo = true + } + if instance.Spec.ReplicationState == replicationv1alpha1.Secondary { + instance.Status.LastSyncTime = nil + } + err = r.updateReplicationStatus(instance, logger, getReplicationState(instance), msg) + if err != nil { + return ctrl.Result{}, err + } + + logger.Info(msg) + + if requeueForInfo { + reconcileInternal := getInfoReconcileInterval(parameters, logger) + return ctrl.Result{ + Requeue: true, + RequeueAfter: reconcileInternal, + }, nil + } + + return ctrl.Result{}, nil +} + +// getInfoReconcileInterval takes parameters and returns the half of the scheduling +// interval after converting it to time.Duration. The interval is converted +// into half to keep the LastSyncTime and Storage LastSyncTime to be in sync. +// If the schedulingInterval is empty or there is error parsing, it is set to +// the default value. +func getInfoReconcileInterval(parameters map[string]string, logger logr.Logger) time.Duration { + // the schedulingInterval looks like below, which is the part of volumereplicationclass + // and is an optional parameter. + // ```parameters: + // replication.storage.openshift.io/replication-secret-name: rook-csi-rbd-provisioner + // replication.storage.openshift.io/replication-secret-namespace: rook-ceph + // schedulingInterval: 1m``` + rawScheduleTime := parameters["schedulingInterval"] + if rawScheduleTime == "" { + return defaultScheduleTime + } + scheduleTime, err := time.ParseDuration(rawScheduleTime) + if err != nil { + logger.Error(err, "failed to parse time: %v", rawScheduleTime) + return defaultScheduleTime + } + // Return schedule internal to avoid frequent reconcile if the + // schedulingInterval is less than 2 minutes. + if scheduleTime < 2*time.Minute { + logger.Info("scheduling interval is less than 2 minutes, not decreasing it to half") + return scheduleTime + } + + // Reduce the schedule time by half to get the latest update and also to + // avoid the inconsistency between the last sync time in the VR and the + // Storage system. + return scheduleTime / 2 +} + +func (r *VolumeReplicationReconciler) getReplicationClient(driverName string) (grpcClient.VolumeReplication, error) { + conns := r.Connpool.GetByNodeID(driverName, "") + + // Iterate through the connections and find the one that matches the driver name + // provided in the VolumeReplication spec; so that corresponding + // operations can be performed. + for _, v := range conns { + for _, cap := range v.Capabilities { + // validate if VOLUME_REPLICATION capability is supported by the driver. + if cap.GetVolumeReplication() == nil { + continue + } + + // validate of VOLUME_REPLICATION capability is enabled by the storage driver. + if cap.GetVolumeReplication().GetType() == identity.Capability_VolumeReplication_VOLUME_REPLICATION { + return grpcClient.NewReplicationClient(v.Client, r.Timeout), nil + } + } + } + + return nil, fmt.Errorf("no connections for driver: %s", driverName) + +} + +func (r *VolumeReplicationReconciler) updateReplicationStatus( + instance *replicationv1alpha1.VolumeReplication, + logger logr.Logger, + state replicationv1alpha1.State, + message string) error { + instance.Status.State = state + instance.Status.Message = message + instance.Status.ObservedGeneration = instance.Generation + if err := r.Client.Status().Update(context.TODO(), instance); err != nil { + logger.Error(err, "failed to update status") + + return err + } + + return nil +} + +// SetupWithManager sets up the controller with the Manager. +func (r *VolumeReplicationReconciler) SetupWithManager(mgr ctrl.Manager, ctrlOptions controller.Options) error { + err := r.waitForCrds() + if err != nil { + + return err + } + + pred := predicate.GenerationChangedPredicate{} + + return ctrl.NewControllerManagedBy(mgr). + For(&replicationv1alpha1.VolumeReplication{}). + WithEventFilter(pred). + WithOptions(ctrlOptions). + Complete(r) +} + +func (r *VolumeReplicationReconciler) waitForCrds() error { + logger := log.FromContext(context.TODO(), "Name", "checkingDependencies") + + err := r.waitForVolumeReplicationResource(logger, volumeReplicationClass) + if err != nil { + logger.Error(err, "failed to wait for VolumeReplicationClass CRD") + + return err + } + + err = r.waitForVolumeReplicationResource(logger, volumeReplication) + if err != nil { + logger.Error(err, "failed to wait for VolumeReplication CRD") + + return err + } + + return nil +} + +func (r *VolumeReplicationReconciler) waitForVolumeReplicationResource(logger logr.Logger, resourceName string) error { + unstructuredResource := &unstructured.UnstructuredList{} + unstructuredResource.SetGroupVersionKind(schema.GroupVersionKind{ + Group: replicationv1alpha1.GroupVersion.Group, + Kind: resourceName, + Version: replicationv1alpha1.GroupVersion.Version, + }) + for { + err := r.Client.List(context.TODO(), unstructuredResource) + if err == nil { + return nil + } + // return errors other than NoMatch + if !meta.IsNoMatchError(err) { + logger.Error(err, "got an unexpected error while waiting for resource", "Resource", resourceName) + + return err + } + logger.Info("resource does not exist", "Resource", resourceName) + time.Sleep(5 * time.Second) + } +} + +// volumeReplicationInstance contains the attributes +// that can be useful in reconciling a particular +// instance of the VolumeReplication resource. +type volumeReplicationInstance struct { + logger logr.Logger + instance *replicationv1alpha1.VolumeReplication + commonRequestParameters replication.CommonRequestParameters + force bool +} + +// markVolumeAsPrimary defines and runs a set of tasks required to mark a volume as primary. +func (r *VolumeReplicationReconciler) markVolumeAsPrimary(vr *volumeReplicationInstance) error { + volumeReplication := replication.Replication{ + Params: vr.commonRequestParameters, + } + + resp := volumeReplication.Promote() + if resp.Error != nil { + isKnownError := resp.HasKnownGRPCError(volumePromotionKnownErrors) + if !isKnownError { + if resp.Error != nil { + vr.logger.Error(resp.Error, "failed to promote volume") + setFailedPromotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation) + + return resp.Error + } + } else { + // force promotion + vr.logger.Info("force promoting volume due to known grpc error", "error", resp.Error) + volumeReplication.Force = true + resp := volumeReplication.Promote() + if resp.Error != nil { + vr.logger.Error(resp.Error, "failed to force promote volume") + setFailedPromotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation) + + return resp.Error + } + } + } + + setPromotedCondition(&vr.instance.Status.Conditions, vr.instance.Generation) + + return nil +} + +// markVolumeAsSecondary defines and runs a set of tasks required to mark a volume as secondary. +func (r *VolumeReplicationReconciler) markVolumeAsSecondary(vr *volumeReplicationInstance) error { + volumeReplication := replication.Replication{ + Params: vr.commonRequestParameters, + } + + resp := volumeReplication.Demote() + + if resp.Error != nil { + vr.logger.Error(resp.Error, "failed to demote volume") + setFailedDemotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation) + + return resp.Error + } + + setDemotedCondition(&vr.instance.Status.Conditions, vr.instance.Generation) + + return nil +} + +// resyncVolume defines and runs a set of tasks required to resync the volume. +func (r *VolumeReplicationReconciler) resyncVolume(vr *volumeReplicationInstance) (bool, error) { + volumeReplication := replication.Replication{ + Params: vr.commonRequestParameters, + Force: vr.force, + } + + resp := volumeReplication.Resync() + + if resp.Error != nil { + vr.logger.Error(resp.Error, "failed to resync volume") + setFailedResyncCondition(&vr.instance.Status.Conditions, vr.instance.Generation) + + return false, resp.Error + } + resyncResponse, ok := resp.Response.(*proto.ResyncVolumeResponse) + if !ok { + err := fmt.Errorf("received response of unexpected type") + vr.logger.Error(err, "unable to parse response") + setFailedResyncCondition(&vr.instance.Status.Conditions, vr.instance.Generation) + + return false, err + } + + setResyncCondition(&vr.instance.Status.Conditions, vr.instance.Generation) + + if !resyncResponse.GetReady() { + return true, nil + } + + // No longer degraded, as volume is fully synced + setNotDegradedCondition(&vr.instance.Status.Conditions, vr.instance.Generation) + + return false, nil +} + +// disableVolumeReplication defines and runs a set of tasks required to disable volume replication. +func (r *VolumeReplicationReconciler) disableVolumeReplication(vr *volumeReplicationInstance) error { + volumeReplication := replication.Replication{ + Params: vr.commonRequestParameters, + } + + resp := volumeReplication.Disable() + + if resp.Error != nil { + if isKnownError := resp.HasKnownGRPCError(disableReplicationKnownErrors); isKnownError { + vr.logger.Info("volume not found", "volumeID", vr.commonRequestParameters.VolumeID) + + return nil + } + vr.logger.Error(resp.Error, "failed to disable volume replication") + + return resp.Error + } + + return nil +} + +// enableReplication enable volume replication on the first reconcile. +func (r *VolumeReplicationReconciler) enableReplication(vr *volumeReplicationInstance) error { + volumeReplication := replication.Replication{ + Params: vr.commonRequestParameters, + } + + resp := volumeReplication.Enable() + + if resp.Error != nil { + vr.logger.Error(resp.Error, "failed to enable volume replication") + + return resp.Error + } + + return nil +} + +// getVolumeReplicationInfo gets volume replication info. +func (r *VolumeReplicationReconciler) getVolumeReplicationInfo(vr *volumeReplicationInstance) (*proto.GetVolumeReplicationInfoResponse, error) { + volumeReplication := replication.Replication{ + Params: vr.commonRequestParameters, + } + + resp := volumeReplication.GetInfo() + if resp.Error != nil { + vr.logger.Error(resp.Error, "failed to get volume replication info") + if isKnownError := resp.HasKnownGRPCError(getReplicationInfoKnownErrors); isKnownError { + vr.logger.Info("volume/replication info not found", "volumeID", vr.commonRequestParameters.VolumeID) + + return nil, nil + } + return nil, resp.Error + } + + infoResponse, ok := resp.Response.(*proto.GetVolumeReplicationInfoResponse) + if !ok { + err := fmt.Errorf("received response of unexpected type") + vr.logger.Error(err, "unable to parse response") + + return nil, err + } + + return infoResponse, nil +} + +func getReplicationState(instance *replicationv1alpha1.VolumeReplication) replicationv1alpha1.State { + switch instance.Spec.ReplicationState { + case replicationv1alpha1.Primary: + return replicationv1alpha1.PrimaryState + case replicationv1alpha1.Secondary: + return replicationv1alpha1.SecondaryState + case replicationv1alpha1.Resync: + return replicationv1alpha1.SecondaryState + } + + return replicationv1alpha1.UnknownState +} + +func getCurrentReplicationState(instance *replicationv1alpha1.VolumeReplication) replicationv1alpha1.State { + if instance.Status.State == "" { + return replicationv1alpha1.UnknownState + } + + return instance.Status.State +} + +func setFailureCondition(instance *replicationv1alpha1.VolumeReplication) { + switch instance.Spec.ReplicationState { + case replicationv1alpha1.Primary: + setFailedPromotionCondition(&instance.Status.Conditions, instance.Generation) + case replicationv1alpha1.Secondary: + setFailedDemotionCondition(&instance.Status.Conditions, instance.Generation) + case replicationv1alpha1.Resync: + setFailedResyncCondition(&instance.Status.Conditions, instance.Generation) + } +} + +func getCurrentTime() *metav1.Time { + metav1NowTime := metav1.NewTime(time.Now()) + + return &metav1NowTime +} diff --git a/controllers/replication.storage/volumereplication_test.go b/controllers/replication.storage/volumereplication_test.go new file mode 100644 index 000000000..9f58a0d1a --- /dev/null +++ b/controllers/replication.storage/volumereplication_test.go @@ -0,0 +1,91 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "testing" + "time" + + "github.com/go-logr/logr/testr" +) + +func TestGetScheduledTime(t *testing.T) { + t.Parallel() + const defaultScheduleTime = time.Hour + logger := testr.New(t) + testcases := []struct { + parameters map[string]string + time time.Duration + }{ + { + parameters: map[string]string{ + "replication.storage.openshift.io/replication-secret-name": "rook-csi-rbd-provisioner", + "schedulingInterval": "1m", + }, + time: time.Minute, + }, + { + parameters: map[string]string{ + "replication.storage.openshift.io/replication-secret-name": "rook-csi-rbd-provisioner", + }, + time: defaultScheduleTime, + }, + { + parameters: map[string]string{}, + time: defaultScheduleTime, + }, + { + parameters: map[string]string{ + "schedulingInterval": "", + }, + time: defaultScheduleTime, + }, + { + parameters: map[string]string{ + "schedulingInterval": "2mm", + }, + time: defaultScheduleTime, + }, + { + parameters: map[string]string{ + "schedulingInterval": "10s", + }, + time: 10 * time.Second, + }, + { + parameters: map[string]string{ + "schedulingInterval": "4m", + }, + time: 2 * time.Minute, + }, + { + parameters: map[string]string{ + "schedulingInterval": "1h", + }, + time: 30 * time.Minute, + }, + } + for _, tt := range testcases { + newtt := tt + t.Run("", func(t *testing.T) { + t.Parallel() + if got := getInfoReconcileInterval(newtt.parameters, logger); got != newtt.time { + t.Errorf("GetSchedluedTime() = %v, want %v", got, newtt.time) + } + }) + } +} diff --git a/controllers/replication.storage/volumereplicationclass.go b/controllers/replication.storage/volumereplicationclass.go new file mode 100644 index 000000000..c8e8933e3 --- /dev/null +++ b/controllers/replication.storage/volumereplicationclass.go @@ -0,0 +1,44 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "context" + + replicationv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1" + + "github.com/go-logr/logr" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" +) + +// getVolumeReplicationClass get volume replication class object from the subjected namespace and return the same. +func (r VolumeReplicationReconciler) getVolumeReplicationClass(logger logr.Logger, vrcName string) (*replicationv1alpha1.VolumeReplicationClass, error) { + vrcObj := &replicationv1alpha1.VolumeReplicationClass{} + err := r.Client.Get(context.TODO(), types.NamespacedName{Name: vrcName}, vrcObj) + if err != nil { + if errors.IsNotFound(err) { + logger.Error(err, "VolumeReplicationClass not found", "VolumeReplicationClass", vrcName) + } else { + logger.Error(err, "Got an unexpected error while fetching VolumeReplicationClass", "VolumeReplicationClass", vrcName) + } + + return nil, err + } + + return vrcObj, nil +} diff --git a/controllers/replication.storage/volumereplicationclass_test.go b/controllers/replication.storage/volumereplicationclass_test.go new file mode 100644 index 000000000..4547d63b7 --- /dev/null +++ b/controllers/replication.storage/volumereplicationclass_test.go @@ -0,0 +1,78 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 controllers + +import ( + "context" + "testing" + + replicationv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/replication.storage/v1alpha1" + + "github.com/stretchr/testify/assert" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/controller-runtime/pkg/log" +) + +var mockVolumeReplicationClassObj = &replicationv1alpha1.VolumeReplicationClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "volume-replication-class", + }, + Spec: replicationv1alpha1.VolumeReplicationClassSpec{ + Provisioner: "test-driver", + }, +} + +func TestGetVolumeReplicaClass(t *testing.T) { + t.Parallel() + testcases := []struct { + createVrc bool + errorExpected bool + isErrorNotFound bool + }{ + {createVrc: true, errorExpected: false, isErrorNotFound: false}, + {createVrc: false, errorExpected: true, isErrorNotFound: true}, + } + + for _, tc := range testcases { + var objects []runtime.Object + + volumeReplication := &replicationv1alpha1.VolumeReplication{} + mockVolumeReplicationObj.DeepCopyInto(volumeReplication) + objects = append(objects, volumeReplication) + + if tc.createVrc { + volumeReplicationClass := &replicationv1alpha1.VolumeReplicationClass{} + mockVolumeReplicationClassObj.DeepCopyInto(volumeReplicationClass) + objects = append(objects, volumeReplicationClass) + } + + reconciler := createFakeVolumeReplicationReconciler(t, objects...) + vrcObj, err := reconciler.getVolumeReplicationClass(log.FromContext(context.TODO()), mockVolumeReplicationClassObj.Name) + + if tc.errorExpected { + assert.Error(t, err) + if tc.isErrorNotFound { + assert.True(t, errors.IsNotFound(err)) + } + } else { + assert.NoError(t, err) + assert.NotEqual(t, nil, vrcObj) + } + } +} diff --git a/deploy/controller/crds.yaml b/deploy/controller/crds.yaml index 1e4cdb2c7..c21360927 100644 --- a/deploy/controller/crds.yaml +++ b/deploy/controller/crds.yaml @@ -80,7 +80,7 @@ spec: description: CSIAddonsNodeStatus defines the observed state of CSIAddonsNode properties: message: - description: Messgae is a human-readable message indicating details + description: Message is a human-readable message indicating details about why the CSIAddonsNode is in this state. type: string reason: @@ -201,8 +201,8 @@ spec: description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a foo's - current state. // Known .status.conditions.type are: \"Available\", + \n type FooStatus struct{ // Represents the observations of a + foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" @@ -579,8 +579,8 @@ spec: description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a foo's - current state. // Known .status.conditions.type are: \"Available\", + \n type FooStatus struct{ // Represents the observations of a + foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" @@ -669,3 +669,270 @@ spec: storage: true subresources: status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null + name: volumereplicationclasses.replication.storage.openshift.io +spec: + group: replication.storage.openshift.io + names: + kind: VolumeReplicationClass + listKind: VolumeReplicationClassList + plural: volumereplicationclasses + shortNames: + - vrc + singular: volumereplicationclass + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .spec.provisioner + name: provisioner + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: VolumeReplicationClass is the Schema for the volumereplicationclasses + API. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: VolumeReplicationClassSpec specifies parameters that an underlying + storage system uses when creating a volume replica. A specific VolumeReplicationClass + is used by specifying its name in a VolumeReplication object. + properties: + parameters: + additionalProperties: + type: string + description: Parameters is a key-value map with storage provisioner + specific configurations for creating volume replicas + type: object + provisioner: + description: Provisioner is the name of storage provisioner + type: string + required: + - provisioner + type: object + status: + description: VolumeReplicationClassStatus defines the observed state of + VolumeReplicationClass. + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null + name: volumereplications.replication.storage.openshift.io +spec: + group: replication.storage.openshift.io + names: + kind: VolumeReplication + listKind: VolumeReplicationList + plural: volumereplications + shortNames: + - vr + singular: volumereplication + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - jsonPath: .spec.volumeReplicationClass + name: volumeReplicationClass + type: string + - jsonPath: .spec.dataSource.name + name: pvcName + type: string + - jsonPath: .spec.replicationState + name: desiredState + type: string + - jsonPath: .status.state + name: currentState + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: VolumeReplication is the Schema for the volumereplications API. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: VolumeReplicationSpec defines the desired state of VolumeReplication. + properties: + autoResync: + description: AutoResync represents the volume to be auto resynced + when ReplicationState is "secondary" + type: boolean + dataSource: + description: DataSource represents the object associated with the + volume + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in + the core API group. For any other third-party types, APIGroup + is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + replicationHandle: + description: replicationHandle represents an existing (but new) replication + id + type: string + replicationState: + description: ReplicationState represents the replication operation + to be performed on the volume. Supported operations are "primary", + "secondary" and "resync" + enum: + - primary + - secondary + - resync + type: string + volumeReplicationClass: + description: VolumeReplicationClass is the VolumeReplicationClass + name for this VolumeReplication resource + type: string + required: + - autoResync + - dataSource + - replicationState + - volumeReplicationClass + type: object + status: + description: VolumeReplicationStatus defines the observed state of VolumeReplication. + properties: + conditions: + description: Conditions are the list of conditions and their status. + items: + description: "Condition contains details for one aspect of the current + state of this API Resource. --- This struct is intended for direct + use as an array at the field path .status.conditions. For example, + \n type FooStatus struct{ // Represents the observations of a + foo's current state. // Known .status.conditions.type are: \"Available\", + \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge + // +listType=map // +listMapKey=type Conditions []metav1.Condition + `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" + protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition + transitioned from one status to another. This should be when + the underlying condition changed. If that is not known, then + using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: message is a human readable message indicating + details about the transition. This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: observedGeneration represents the .metadata.generation + that the condition was set based upon. For instance, if .metadata.generation + is currently 12, but the .status.conditions[x].observedGeneration + is 9, the condition is out of date with respect to the current + state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: reason contains a programmatic identifier indicating + the reason for the condition's last transition. Producers + of specific condition types may define expected values and + meanings for this field, and whether the values are considered + a guaranteed API. The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + --- Many .condition.type values are consistent across resources + like Available, but because arbitrary conditions can be useful + (see .node.status.conditions), the ability to deconflict is + important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + lastCompletionTime: + format: date-time + type: string + lastStartTime: + format: date-time + type: string + lastSyncTime: + format: date-time + type: string + message: + type: string + observedGeneration: + description: observedGeneration is the last generation change the + operator has dealt with + format: int64 + type: integer + state: + description: State captures the latest state of the replication operation. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/deploy/controller/rbac.yaml b/deploy/controller/rbac.yaml index 483d4c734..fce1506d6 100644 --- a/deploy/controller/rbac.yaml +++ b/deploy/controller/rbac.yaml @@ -62,6 +62,7 @@ rules: verbs: - get - list + - update - watch - apiGroups: - "" @@ -86,6 +87,14 @@ rules: - persistentvolumeclaims/finalizers verbs: - update +- apiGroups: + - "" + resources: + - pods + verbs: + - get + - list + - watch - apiGroups: - csiaddons.openshift.io resources: @@ -190,6 +199,35 @@ rules: - get - patch - update +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplicationclasses + verbs: + - get + - list + - watch +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications + verbs: + - get + - list + - update + - watch +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications/finalizers + verbs: + - update +- apiGroups: + - replication.storage.openshift.io + resources: + - volumereplications/status + verbs: + - update - apiGroups: - storage.k8s.io resources: diff --git a/docs/csiaddonsnode.md b/docs/csiaddonsnode.md index e5ad0cc88..11af3cad9 100644 --- a/docs/csiaddonsnode.md +++ b/docs/csiaddonsnode.md @@ -9,11 +9,11 @@ metadata: name: csiaddonsnode-sample spec: driver: - name: example.csi.ceph.com - endpoint: + name: driver.csi.example.io + endpoint: pod://csiaddonsnode-sample.csi-addons-system:9070 nodeID: node-1 ``` + `driver` contains the required information about the CSI driver. - + `name` contains the name of the driver. The name of the driver is in the format: `rbd/cephfs.csi.ceph.com` - + `endpoint` contains the url that contains the ip-address to which the CSI-Addons side-car listens to. + + `name` contains the name of the driver. The name of the driver is in the format: `driver.csi.example.io` + + `endpoint` contains the URL that contains the name of the Pod and its Namespace that can be used by the controller to connect to. + `nodeID` contains the ID of node to identify on which node the side-car is running. diff --git a/docs/deploy-controller.md b/docs/deploy-controller.md index 93cd7b93e..7dddfd38d 100644 --- a/docs/deploy-controller.md +++ b/docs/deploy-controller.md @@ -2,6 +2,18 @@ The CSI-Addons Controller can be deployed by different ways: +## Configuration + +**Available command line arguments:** + +| Option | Default value | Description | +| ----------------------------- | --------------- | --------------------------------------------- | +| `--metrics-bind-address` | `:8080` | The address the metric endpoint binds to. | +| `--health-probe-bind-address` | `:8081` | The address the probe endpoint binds to. | +| `--leader-elect` | `false` | Enable leader election for controller manager.| +| `--reclaim-space-timeout` | `3m` | Timeout for reclaimspace operation | +| `--max-concurrent-reconciles` | 100 | Maximum number of concurrent reconciles | + ## Installation for versioned deployments The CSI-Addons Controller can also be installed using the yaml files in `deploy/controller`. @@ -21,7 +33,7 @@ customresourcedefinition.apiextensions.k8s.io/reclaimspacecronjobs.csiaddons.ope customresourcedefinition.apiextensions.k8s.io/reclaimspacejobs.csiaddons.openshift.io created $ kubectl create -f rbac.yaml -... +... serviceaccount/csi-addons-controller-manager created role.rbac.authorization.k8s.io/csi-addons-leader-election-role created clusterrole.rbac.authorization.k8s.io/csi-addons-manager-role created diff --git a/docs/volumereplication.md b/docs/volumereplication.md new file mode 100644 index 000000000..f47a7dd04 --- /dev/null +++ b/docs/volumereplication.md @@ -0,0 +1,35 @@ +# VolumeReplication + +VolumeReplication is a namespaced resource that contains references to storage object to be replicated and VolumeReplicationClass corresponding to the driver providing replication. + +`volumeReplicationClass` is the class providing replication. + +`replicationState` is the state of the volume being referenced. Possible values are `primary`, `secondary` and `resync`. + ++ `primary` denotes that the volume is primary ++ `secondary` denotes that the volume is secondary ++ `resync` denotes that the volume needs to be resynced + +`dataSource` contains typed reference to the source being replicated. + ++ `apiGroup` is the group for the resource being referenced. If apiGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, apiGroup is required. ++ `kind` is the kind of resource being replicated. For eg. PersistentVolumeClaim ++ `name` is the name of the resource + +`replicationHandle` (optional) is an existing (but new) replication id. + + +``` yaml +apiVersion: replication.storage.openshift.io/v1alpha1 +kind: VolumeReplication +metadata: + name: volumereplication-sample + namespace: default +spec: + volumeReplicationClass: volumereplicationclass-sample + replicationState: primary + replicationHandle: replicationHandle # optional + dataSource: + kind: PersistentVolumeClaim + name: myPersistentVolumeClaim # should be in same namespace as VolumeReplication +``` diff --git a/docs/volumereplicationclass.md b/docs/volumereplicationclass.md new file mode 100644 index 000000000..670439652 --- /dev/null +++ b/docs/volumereplicationclass.md @@ -0,0 +1,28 @@ +# VolumeReplicationClass + +`VolumeReplicationClass` is a cluster scoped resource that contains driver related configuration parameters. + +`provisioner` is name of the storage provisioner. + +`parameters` contains key-value pairs that are passed down to the driver. Users can add their own key-value pairs. Keys with `replication.storage.openshift.io/` prefix are reserved by operator and not passed down to the driver. + +## Reserved parameter keys + ++ `replication.storage.openshift.io/replication-secret-name` ++ `replication.storage.openshift.io/replication-secret-namespace` + +``` yaml +apiVersion: replication.storage.openshift.io/v1alpha1 +kind: VolumeReplicationClass +metadata: + name: volumereplicationclass-sample +spec: + provisioner: example.provisioner.io + parameters: + replication.storage.openshift.io/replication-secret-name: secret-name + replication.storage.openshift.io/replication-secret-namespace: secret-namespace + # schedulingInterval is a vendor specific parameter. It is used to set the + # replication scheduling interval for storage volumes that are replication + # enabled using related VolumeReplication resource + schedulingInterval: 1m +``` diff --git a/go.mod b/go.mod index 0106bb092..6cc504adc 100644 --- a/go.mod +++ b/go.mod @@ -1,28 +1,29 @@ module github.com/csi-addons/kubernetes-csi-addons -go 1.17 +go 1.18 require ( github.com/container-storage-interface/spec v1.6.0 - github.com/csi-addons/spec v0.1.2-0.20211220115741-32fa508dadbe + github.com/csi-addons/spec v0.1.2-0.20221101132540-98eff76b0ff8 github.com/go-logr/logr v1.2.3 - github.com/golang/protobuf v1.5.2 github.com/kubernetes-csi/csi-lib-utils v0.11.0 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.20.0 - github.com/operator-framework/operator-sdk v1.22.2 + github.com/onsi/gomega v1.20.2 + github.com/operator-framework/operator-sdk v1.23.0 github.com/robfig/cron/v3 v3.0.1 github.com/stretchr/testify v1.8.0 - google.golang.org/grpc v1.48.0 - google.golang.org/protobuf v1.28.0 - k8s.io/api v0.24.3 - k8s.io/apimachinery v0.24.3 - k8s.io/client-go v0.24.3 - k8s.io/klog/v2 v2.70.1 - sigs.k8s.io/controller-runtime v0.12.3 + go.uber.org/zap v1.23.0 + google.golang.org/grpc v1.49.0 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 + google.golang.org/protobuf v1.28.1 + k8s.io/api v0.25.0 + k8s.io/apimachinery v0.25.0 + k8s.io/client-go v0.25.0 + k8s.io/klog/v2 v2.80.1 + sigs.k8s.io/controller-runtime v0.13.0 sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20220104140252-e52a8b1fba62 sigs.k8s.io/controller-tools v0.9.2 - sigs.k8s.io/kustomize/kustomize/v4 v4.5.5 + sigs.k8s.io/kustomize/kustomize/v4 v4.5.7 ) // module was renamed? @@ -34,11 +35,11 @@ exclude github.com/mikefarah/yaml/v2 v2.4.0 replace github.com/containerd/containerd => github.com/containerd/containerd v1.4.11 require ( - cloud.google.com/go v0.99.0 // indirect + cloud.google.com/go/compute v1.9.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.20 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.15 // indirect + github.com/Azure/go-autorest/autorest v0.11.28 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.21 // indirect github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect @@ -50,10 +51,8 @@ require ( github.com/Masterminds/squirrel v1.5.2 // indirect github.com/Microsoft/go-winio v0.5.1 // indirect github.com/Microsoft/hcsshim v0.9.1 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/adrg/xdg v0.4.0 // indirect - github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e // indirect + github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed // indirect github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect @@ -75,39 +74,41 @@ require ( github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.4.0 // indirect - github.com/emicklei/go-restful v2.9.5+incompatible // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect + github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect github.com/fatih/color v1.13.0 // indirect github.com/fatih/structtag v1.1.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-errors/errors v1.0.1 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.1.0 // indirect github.com/go-git/go-git/v5 v5.3.0 // indirect github.com/go-gorp/gorp/v3 v3.0.2 // indirect - github.com/go-logr/zapr v1.2.0 // indirect + github.com/go-logr/zapr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/gobuffalo/envy v1.7.1 // indirect github.com/gobuffalo/flect v0.2.5 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.0.0 // indirect + github.com/golang-jwt/jwt/v4 v4.4.2 // indirect github.com/golang-migrate/migrate/v4 v4.6.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/google/btree v1.0.1 // indirect - github.com/google/cel-go v0.10.1 // indirect + github.com/google/cel-go v0.12.4 // indirect github.com/google/certificate-transparency-go v1.0.21 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/google/gnostic v0.6.9 // indirect github.com/google/go-cmp v0.5.8 // indirect github.com/google/go-containerregistry v0.8.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.2.0 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect @@ -117,7 +118,7 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/iancoleman/strcase v0.2.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect + github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jmoiron/sqlx v1.3.4 // indirect @@ -132,7 +133,7 @@ require ( github.com/lib/pq v1.10.4 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/magiconair/properties v1.8.5 // indirect - github.com/mailru/easyjson v0.7.6 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/markbates/inflect v1.0.4 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect @@ -156,7 +157,7 @@ require ( github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect - github.com/operator-framework/api v0.15.0 // indirect + github.com/operator-framework/api v0.15.1-0.20220624132056-decf74800a17 // indirect github.com/operator-framework/helm-operator-plugins v0.0.12-0.20220616200420-1a695cb9f6a1 // indirect github.com/operator-framework/java-operator-plugins v0.5.1 // indirect github.com/operator-framework/operator-manifest-tools v0.2.1 // indirect @@ -166,10 +167,10 @@ require ( github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_golang v1.13.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect github.com/rogpeppe/go-internal v1.8.0 // indirect github.com/rubenv/sql-migrate v1.1.1 // indirect github.com/russross/blackfriday v1.5.2 // indirect @@ -189,7 +190,7 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect + github.com/xlab/treeprint v1.1.0 // indirect github.com/zmap/zcrypto v0.0.0-20200911161511-43ff0ea04f21 // indirect github.com/zmap/zlint/v2 v2.2.1 // indirect go.etcd.io/bbolt v1.3.6 // indirect @@ -205,22 +206,21 @@ require ( go.opentelemetry.io/otel/trace v0.20.0 // indirect go.opentelemetry.io/proto/otlp v0.7.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.19.1 // indirect - golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.8.0 // indirect + golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b // indirect + golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 // indirect + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect + golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect + golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect golang.org/x/text v0.3.7 // indirect - golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect - golang.org/x/tools v0.1.11 // indirect + golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 // indirect + golang.org/x/tools v0.1.12 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac // indirect + google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect @@ -228,21 +228,21 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect helm.sh/helm/v3 v3.9.0 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/apiserver v0.24.2 // indirect - k8s.io/cli-runtime v0.24.0 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect + k8s.io/apiextensions-apiserver v0.25.0 // indirect + k8s.io/apiserver v0.25.0 // indirect + k8s.io/cli-runtime v0.24.1 // indirect + k8s.io/component-base v0.25.0 // indirect + k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea // indirect + k8s.io/kubectl v0.24.1 // indirect + k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73 // indirect oras.land/oras-go v1.1.0 // indirect rsc.io/letsencrypt v0.0.3 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/kubebuilder/v3 v3.3.0 // indirect - sigs.k8s.io/kustomize/api v0.11.5 // indirect - sigs.k8s.io/kustomize/cmd/config v0.10.7 // indirect - sigs.k8s.io/kustomize/kyaml v0.13.7 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.32 // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + sigs.k8s.io/kubebuilder/v3 v3.6.0 // indirect + sigs.k8s.io/kustomize/api v0.12.1 // indirect + sigs.k8s.io/kustomize/cmd/config v0.10.9 // indirect + sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index 5489b3c86..7faff49d8 100644 --- a/go.sum +++ b/go.sum @@ -29,7 +29,6 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= @@ -37,6 +36,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v1.9.0 h1:ED/FP4xv8GJw63v556/ASNc1CeeLUO2Bs8nzaHchkHg= +cloud.google.com/go/compute v1.9.0/go.mod h1:lWv1h/zUWTm/LozzfTJhBSkd6ShQq8la8VeeuOEGxfY= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= @@ -51,7 +52,6 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v56.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= @@ -59,16 +59,17 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg6 github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.20 h1:s8H1PbCZSqg/DH7JMlOz6YMig6htWLNPsjDdlLqCx3M= -github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= +github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= +github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.15 h1:X+p2GF0GWyOiSmqohIaEeuNFNDY4I4EOlVuUQvFdWMk= -github.com/Azure/go-autorest/autorest/adal v0.9.15/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= +github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/adal v0.9.21 h1:jjQnVFXPfekaqb8vIsv2G1lxshoW+oGv4MDlhRtnYZk= +github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= +github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= @@ -78,7 +79,6 @@ github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= @@ -87,39 +87,30 @@ github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YH github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Masterminds/squirrel v1.5.2 h1:UiOEi2ZX4RCSkpiNDQN5kro/XIBpSRk9iTqdIRPzUXE= github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Masterminds/vcs v1.13.3/go.mod h1:TiE7xuEjl1N4j016moRd6vezp6e6Lz23gypeXfzXeW8= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= github.com/Microsoft/hcsshim v0.9.1 h1:VfDCj+QnY19ktX5TsH22JHcjaZ05RWQiwDbOyEg5ziM= github.com/Microsoft/hcsshim v0.9.1/go.mod h1:Y/0uV2jUab5kBI7SQgl62at0AVX7uaruzADAVmxm3eM= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= @@ -131,11 +122,10 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e h1:GCzyKMDDjSGnlpl3clrdAK7I1AaVoaiKDOYkUzChZzg= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed h1:ue9pVfIcP+QMEjfgo/Ez4ZjNZfonGgR6NgjMaJMu1Cg= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -149,18 +139,15 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benjamintf1/unmarshalledmatchers v1.0.0/go.mod h1:IVZdtAzpNyBTuhobduAjo5CjTLczWWbiXnWDVxIgSko= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= @@ -169,23 +156,14 @@ github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= -github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bugsnag/bugsnag-go v1.5.3 h1:yeRUT3mUE13jL1tGwvoQsKdVbAsQx9AJ+fqahKveP04= -github.com/bugsnag/bugsnag-go v1.5.3/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/bugsnag/panicwrap v1.2.0 h1:OzrKrRvXis8qEvOkfcxNcYbOd2O7xXS2nnKMEMABFQA= -github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20180118203423-deb3ae2ef261/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -218,60 +196,43 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/container-storage-interface/spec v1.5.0/go.mod h1:8K96oQNkJ7pFcC2R9Z1ynGGBB1I93kcS6PGg3SsOk8s= github.com/container-storage-interface/spec v1.6.0 h1:vwN9uCciKygX/a0toYryoYD5+qI9ZFeAMuhEEKO+JBA= github.com/container-storage-interface/spec v1.6.0/go.mod h1:8K96oQNkJ7pFcC2R9Z1ynGGBB1I93kcS6PGg3SsOk8s= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= github.com/containerd/cgroups v1.0.2 h1:mZBclaSgNDfPWtfhj2xJY28LZ9nYIgzB0pwSURPl6JM= github.com/containerd/cgroups v1.0.2/go.mod h1:qpbpJ1jmlqsR9f2IyaLPsdkCdnt0rbDVqIDlhuu5tRY= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= github.com/containerd/containerd v1.4.11 h1:QCGOUN+i70jEEL/A6JVIbhy4f4fanzAzSR4kNG7SlcE= github.com/containerd/containerd v1.4.11/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= github.com/containerd/stargz-snapshotter/estargz v0.10.1 h1:hd1EoVjI2Ax8Cr64tdYqnJ4i4pZU49FkEf5kU8KxQng= github.com/containerd/stargz-snapshotter/estargz v0.10.1/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/csi-addons/spec v0.1.2-0.20211220115741-32fa508dadbe h1:Q2sxgtdRV4Je1R2eLCUPrR/KQZxkSbesGrpCjl0/mU4= -github.com/csi-addons/spec v0.1.2-0.20211220115741-32fa508dadbe/go.mod h1:Mwq4iLiUV4s+K1bszcWU6aMsR5KPsbIYzzszJ6+56vI= +github.com/csi-addons/spec v0.1.2-0.20221101132540-98eff76b0ff8 h1:fYkq+S2FCMM/yl2BjjSNpAZjKuyPCwtkV6F155u1jiE= +github.com/csi-addons/spec v0.1.2-0.20221101132540-98eff76b0ff8/go.mod h1:Mwq4iLiUV4s+K1bszcWU6aMsR5KPsbIYzzszJ6+56vI= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= @@ -293,15 +254,11 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc= github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684 h1:DBZ2sN7CK6dgvHVpQsQj4sRMCbWTmd17l+5SUCjnQSY= -github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684/go.mod h1:UfCu3YXJJCI+IdnqGgYP82dk2+Joxmv+mUTVBES6wac= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v20.10.12+incompatible h1:lZlz0uzG+GH+c0plStMUdF/qk3ppmgnswpR5EbqzVGA= github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -311,8 +268,6 @@ github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4Kfc github.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.11+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.14+incompatible h1:+T9/PRYWNDo5SZl5qS1r9Mo/0Q8AwxKKPtu9S1yxM0w= github.com/docker/docker v20.10.14+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= @@ -322,18 +277,13 @@ github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= -github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= @@ -342,8 +292,9 @@ github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -354,48 +305,45 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.2.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.1.0 h1:6j4mUV/ES2duvnAzKMFkN6/A5mCaNYPD3xfbAkLLOF8= github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc= -github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getsentry/raven-go v0.0.0-20180121060056-563b81fc02b7/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= @@ -414,9 +362,11 @@ github.com/go-gorp/gorp/v3 v3.0.2/go.mod h1:BJ3q1ejpV8cVALtcXvXaXyTOlMmJhWDxTmnc github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -424,8 +374,9 @@ github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -434,15 +385,17 @@ github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34 github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= @@ -452,7 +405,6 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= github.com/gobuffalo/envy v1.7.1 h1:OQl5ys5MBea7OGCdvPbBJWRgnhC/fGona6QKfvFeau8= github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= @@ -464,27 +416,24 @@ github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXs github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-migrate/migrate/v4 v4.6.2 h1:LDDOHo/q1W5UDj6PbkxdCv7lv9yunyZHXvxuwDkGo3k= github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -525,19 +474,17 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= -github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.9.0/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-go v0.10.1 h1:MQBGSZGnDwh7T/un+mzGKOMz3x+4E/GDPprWjDL+1Jg= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= +github.com/google/cel-go v0.12.4 h1:YINKfuHZ8n72tPOqSPZBwGiDpew2CJS48mdM5W8LZQU= +github.com/google/cel-go v0.12.4/go.mod h1:Av7CU6r6X3YmcHR9GXqVDaEJYfEtSxl6wvIjUQTriCw= github.com/google/certificate-transparency-go v1.0.21 h1:Yf1aXowfZ2nuboBsg7iYGLmwsOARdV86pfH3g95wXmE= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= +github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -576,7 +523,6 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -585,8 +531,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -596,9 +542,7 @@ github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2c github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -611,12 +555,10 @@ github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-health-probe v0.4.11/go.mod h1:Ew6du240dK067iM38yVbni1pLpWUFnuyc0PefrB81Uc= github.com/h2non/filetype v1.1.1 h1:xvOwnXKAckvtLWsN398qS9QhlxlnVXBjXBydK2/UFB4= github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c h1:fEE5/5VNnYUoBOj2I9TP8Jc+a7lge3QWn9DKE7NCwfc= @@ -670,8 +612,9 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= @@ -681,13 +624,11 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548/go.mod h1:hGT6jSUVzF6no3QaDSMLGLEHtHSBSefs+MgcDWnmhmo= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w= github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joelanford/go-apidiff v0.1.0/go.mod h1:wgVWgVCwYYkjcYpJtBnWYkyUYZfVovO3Y5pX49mJsqs= github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d h1:A2/B900ip/Z20TzkLeGRNy1s6J2HmH9AmGt+dHyqb4I= github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d/go.mod h1:7HQupe4vyNxMKXmM5DFuwXHsqwMyglcYmZBtlDPIcZ8= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= @@ -713,7 +654,6 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uia github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -736,7 +676,6 @@ github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -767,8 +706,9 @@ github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= github.com/markbates/inflect v1.0.4 h1:5fh1gzTFhfae06u3hzHYO9xe3l3v3nW5Pwt3naLTP5g= @@ -780,7 +720,6 @@ github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kN github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -796,7 +735,6 @@ github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -831,16 +769,12 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= @@ -866,7 +800,6 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -880,67 +813,48 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= -github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= -github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY= +github.com/onsi/gomega v1.20.2/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/operator-framework/api v0.15.0 h1:4f9i0drtqHj7ykLoHxv92GR43S7MmQHhmFQkfm5YaGI= -github.com/operator-framework/api v0.15.0/go.mod h1:scnY9xqSeCsOdtJtNoHIXd7OtHZ14gj1hkDA4+DlgLY= +github.com/operator-framework/api v0.15.1-0.20220624132056-decf74800a17 h1:05SuHwvLPituTsGnzoapFtJT+HVD+9noxCQBkmfWScw= +github.com/operator-framework/api v0.15.1-0.20220624132056-decf74800a17/go.mod h1:scnY9xqSeCsOdtJtNoHIXd7OtHZ14gj1hkDA4+DlgLY= github.com/operator-framework/helm-operator-plugins v0.0.12-0.20220616200420-1a695cb9f6a1 h1:ulX/0zkiQIg2JkVuAtC329ygfXHg9Sb578vQ7kdNVkY= github.com/operator-framework/helm-operator-plugins v0.0.12-0.20220616200420-1a695cb9f6a1/go.mod h1:D7zPPwmIFBqHtWigU2iJiLuZ0v7hOJOb1/VC+/UuBAQ= github.com/operator-framework/java-operator-plugins v0.5.1 h1:HmiTocc61d/uqVPY/7EUR6ZTHDVeZ5/fgy7uo1QIBFc= github.com/operator-framework/java-operator-plugins v0.5.1/go.mod h1:UnUHAWY203Xw1j6Xpiirp/psJJaSRYcjenc0NH2+aVw= -github.com/operator-framework/operator-lib v0.11.0/go.mod h1:RpyKhFAoG6DmKTDIwMuO6pI3LRc8IE9rxEYWy476o6g= github.com/operator-framework/operator-manifest-tools v0.2.1 h1:hD3iyOm2mBItzYhpFFWqU1StkolS4XGvXxRvFO4v3Oo= github.com/operator-framework/operator-manifest-tools v0.2.1/go.mod h1:C4AmRDIJiM8WVyGyqoUuK3KlloZr7XqaabKMMKKhHtA= github.com/operator-framework/operator-registry v1.23.0 h1:9bOJbxjjupEUBDhAdjC+n7ogGW0Ah3CGywtLq2EPo/U= github.com/operator-framework/operator-registry v1.23.0/go.mod h1:7XM/SlL9ExTWYJiNxkJfJxdqJrOovuuP35MvVctNtDE= -github.com/operator-framework/operator-sdk v1.22.2 h1:XeMqchmObXU0uQo6G3h8dEWXU6GM0vDSCZMZFbP18e8= -github.com/operator-framework/operator-sdk v1.22.2/go.mod h1:3M4Xh4L8xEMGBgtdsqPo80SWJMEMpKRcdcS8ue4xD/o= +github.com/operator-framework/operator-sdk v1.23.0 h1:pn8cBzkqdjT6RaPtn/umBcJiYgdSSastuzLRgBNwl0E= +github.com/operator-framework/operator-sdk v1.23.0/go.mod h1:4cHbH4YwFNXKEa/LzwhC3VjoCKJ381xctIpSdq61ZZM= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= @@ -950,20 +864,16 @@ github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= -github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -974,7 +884,6 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1 h1:oL4IBbcqwhhNWh31bjOX8C/OCy0zs9906d/VUru+bqg= github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -983,8 +892,9 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= +github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -999,21 +909,20 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= @@ -1036,15 +945,12 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -1056,7 +962,6 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -1067,11 +972,7 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= @@ -1081,18 +982,14 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.10.0 h1:mXH0UwHS4D2HwWZa75im4xIQynLfblmWV7qcWpfv0yk= github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/spiffe/go-spiffe/v2 v2.0.0/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk= -github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1116,11 +1013,8 @@ github.com/thoas/go-funk v0.8.0 h1:JP9tKSvnpFVclYgDM0Is7FD9M4fhPvqA0s0BsXmzSRQ= github.com/thoas/go-funk v0.8.0/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1136,7 +1030,6 @@ github.com/weppos/publicsuffix-go v0.4.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln github.com/weppos/publicsuffix-go v0.13.0 h1:0Tu1uzLBd1jPn4k6OnMmOPZH/l/9bj9kUOMMkoRs6Gg= github.com/weppos/publicsuffix-go v0.13.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= -github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= @@ -1147,8 +1040,9 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= +github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1157,17 +1051,9 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U= -github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/gorelic v0.0.7 h1:4DTF1WOM2ZZS/xMOkTFBOcb6XiHu/PKn3rVo6dbewQE= -github.com/yvasiyarov/gorelic v0.0.7/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 h1:AsFN8kXcCVkUFHyuzp1FtYbzp1nCO/H6+1uPSGEyPzM= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= -github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= @@ -1187,11 +1073,6 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3 go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1204,7 +1085,6 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 h1:Q3C9yzW6I9jqEc8sawxzxZmY48fs9u220KXq6d5s3XU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g= @@ -1228,24 +1108,24 @@ go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqe go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= +go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1256,7 +1136,6 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200124225646-8b5121be2f68/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1268,16 +1147,14 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 h1:iU7T1X1J6yxDr0rda54sWGkHgOp5XJrqm79gcNlC2VM= -golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1338,8 +1215,6 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1359,7 +1234,6 @@ golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -1378,12 +1252,10 @@ golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1403,8 +1275,10 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1415,8 +1289,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1425,10 +1300,8 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190102155601-82a175fd1598/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1436,7 +1309,6 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1450,7 +1322,6 @@ golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191003212358-c178f38b412c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1461,7 +1332,6 @@ golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1486,7 +1356,6 @@ golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1514,29 +1383,25 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211029165221-6e7872819dc8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 h1:PgOr27OhUx2IRqGJ2RxAWI4dJQ7bi9cSrB82uzFzfUA= -golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1553,8 +1418,9 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ= +golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1576,12 +1442,9 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191004183538-27eeabb02079/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1627,24 +1490,17 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -gomodules.xyz/jsonpatch/v3 v3.0.1/go.mod h1:CBhndykehEwTOlEfnsfJwvkFQbSN8YZFr9M+cIHAJto= -gomodules.xyz/orderedmap v0.1.0/go.mod h1:g9/TPUCm1t2gwD3j3zfV8uylyYhVdCNSi+xCEIu7yTU= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1689,7 +1545,6 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1704,7 +1559,6 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1713,7 +1567,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1723,11 +1576,9 @@ google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1761,16 +1612,14 @@ google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac h1:qSNTkEN+L2mvWcLgJOR+8bdHX9rN/IdU3A1Ghpfb1Rg= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf h1:Q5xNKbTSFwkuaaGaR7CMcXEM5sy19KYdUU8iF8/iRC0= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1795,12 +1644,10 @@ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200709232328-d8193ee9cc3e/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/grpc/examples v0.0.0-20201130180447-c456688b1860/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1814,12 +1661,10 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1827,21 +1672,13 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -1859,6 +1696,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= @@ -1877,81 +1715,55 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.22.0/go.mod h1:0AoXXqst47OI/L0oGKq9DG61dvGRPXs7X4/B7KyjBCU= -k8s.io/api v0.22.2/go.mod h1:y3ydYpLJAaDI+BbSe2xmGcqxiWHmWjkEeIbiwHvnPR8= -k8s.io/api v0.23.0/go.mod h1:8wmDdLBHBNxtOIytwLstXt5E9PddnZb0GaMcqsvDBpg= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/api v0.24.3 h1:tt55QEmKd6L2k5DP6G/ZzdMQKvG5ro4H4teClqm0sTY= -k8s.io/api v0.24.3/go.mod h1:elGR/XSZrS7z7cSZPzVWaycpJuGIw57j9b95/1PdJNI= -k8s.io/apiextensions-apiserver v0.22.2/go.mod h1:2E0Ve/isxNl7tWLSUDgi6+cmwHi5fQRdwGVCxbC+KFA= -k8s.io/apiextensions-apiserver v0.23.0/go.mod h1:xIFAEEDlAZgpVBl/1VSjGDmLoXAWRG40+GsWhKhAxY4= -k8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKVjkq+MIdg84cM= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/api v0.24.1/go.mod h1:JhoOvNiLXKTPQ60zh2g0ewpA+bnEYf5q44Flhquh4vQ= +k8s.io/api v0.25.0 h1:H+Q4ma2U/ww0iGB78ijZx6DRByPz6/733jIuFpX70e0= +k8s.io/api v0.25.0/go.mod h1:ttceV1GyV1i1rnmvzT3BST08N6nGt+dudGrquzVQWPk= +k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= +k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= k8s.io/apimachinery v0.22.0/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.2/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.3 h1:hrFiNSA2cBZqllakVYyH/VyEh4B581bQRmqATJSeQTg= -k8s.io/apimachinery v0.24.3/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.22.2/go.mod h1:vrpMmbyjWrgdyOvZTSpsusQq5iigKNWv9o9KlDAbBHI= -k8s.io/apiserver v0.23.0/go.mod h1:Cec35u/9zAepDPPFyT+UMrgqOCjgJ5qtfVJDxjZYmt4= -k8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA= -k8s.io/apiserver v0.24.2 h1:orxipm5elPJSkkFNlwH9ClqaKEDJJA3yR2cAAlCnyj4= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.24.0 h1:ot3Qf49T852uEyNApABO1UHHpFIckKK/NqpheZYN2gM= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= +k8s.io/apimachinery v0.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.25.0 h1:MlP0r6+3XbkUG2itd6vp3oxbtdQLQI94fD5gCS+gnoU= +k8s.io/apimachinery v0.25.0/go.mod h1:qMx9eAk0sZQGsXGu86fab8tZdffHbwUfsvzqKn4mfB0= +k8s.io/apiserver v0.25.0 h1:8kl2ifbNffD440MyvHtPaIz1mw4mGKVgWqM0nL+oyu4= +k8s.io/apiserver v0.25.0/go.mod h1:BKwsE+PTC+aZK+6OJQDPr0v6uS91/HWxX7evElAH6xo= +k8s.io/cli-runtime v0.24.1 h1:IW6L8dRBq+pPTzvXcB+m/hOabzbqXy57Bqo4XxmW7DY= +k8s.io/cli-runtime v0.24.1/go.mod h1:14aVvCTqkA7dNXY51N/6hRY3GUjchyWDOwW84qmR3bs= k8s.io/client-go v0.22.0/go.mod h1:GUjIuXR5PiEv/RVK5OODUsm6eZk7wtSWZSaSJbpFdGg= -k8s.io/client-go v0.22.2/go.mod h1:sAlhrkVDf50ZHx6z4K0S40wISNTarf1r800F+RlCF6U= -k8s.io/client-go v0.23.0/go.mod h1:hrDnpnK1mSr65lHHcUuIZIXDgEbzc7/683c6hyG4jTA= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/client-go v0.24.3 h1:Nl1840+6p4JqkFWEW2LnMKU667BUxw03REfLAVhuKQY= -k8s.io/client-go v0.24.3/go.mod h1:AAovolf5Z9bY1wIg2FZ8LPQlEdKHjLI7ZD4rw920BJw= +k8s.io/client-go v0.24.1/go.mod h1:f1kIDqcEYmwXS/vTbbhopMUbhKp2JhOeVTfxgaCIlF8= +k8s.io/client-go v0.25.0 h1:CVWIaCETLMBNiTUta3d5nzRbXvY5Hy9Dpl+VvREpu5E= +k8s.io/client-go v0.25.0/go.mod h1:lxykvypVfKilxhTklov0wz1FoaUZ8X4EwbhS6rpRfN8= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.22.2/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= -k8s.io/code-generator v0.23.0/go.mod h1:vQvOhDXhuzqiVfM/YHp+dmg10WDZCchJVObc9MvowsE= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= +k8s.io/code-generator v0.24.1/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= k8s.io/component-base v0.22.0/go.mod h1:SXj6Z+V6P6GsBhHZVbWCw9hFjUdUYnJerlhhPnYCBCg= -k8s.io/component-base v0.22.2/go.mod h1:5Br2QhI9OTe79p+TzPe9JKNQYvEKbq9rTJDWllunGug= -k8s.io/component-base v0.23.0/go.mod h1:DHH5uiFvLC1edCpvcTDV++NKULdYYU6pR9Tt3HIKMKI= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= +k8s.io/component-base v0.24.1/go.mod h1:DW5vQGYVCog8WYpNob3PMmmsY8A3L9QZNg4j/dV3s38= +k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= +k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk= +k8s.io/component-helpers v0.24.1/go.mod h1:q5Z1pWV/QfX9ThuNeywxasiwkLw9KsR4Q9TAOdb/Y3s= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661 h1:nqYOUleKLC/0P1zbU29F5q6aoezM6MOAVz+iyfQbZ5M= -k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661/go.mod h1:daOouuuwd9JXpv1L7Y34iV3yf6nxzipkKMWWlqlvK9M= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= +k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea h1:3QOH5+2fGsY8e1qf+GIFpg+zw/JGNrgyZRQR7/m6uWg= +k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= +k8s.io/kubectl v0.24.1 h1:gxcjHrnwntV1c+G/BHWVv4Mtk8CQJ0WTraElLBG+ddk= +k8s.io/kubectl v0.24.1/go.mod h1:NzFqQ50B004fHYWOfhHTrAm4TY6oGF5FAAL13LEaeUI= +k8s.io/metrics v0.24.1/go.mod h1:vMs5xpcOyY9D+/XVwlaw8oUHYCo6JTGBCZfyXOOkAhE= k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73 h1:H9TCJUUx+2VA0ZiD9lvtaX8fthFsMoD+Izn93E/hm8U= +k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= oras.land/oras-go v1.1.0 h1:tfWM1RT7PzUwWphqHU6ptPU3ZhwVnSw/9nEGf519rYg= oras.land/oras-go v1.1.0/go.mod h1:1A7vR/0KknT2UkJVWh+xMi95I/AhK8ZrxrnUSmXN0bQ= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= @@ -1959,48 +1771,37 @@ rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.25/go.mod h1:Mlj9PNLmG9bZ6BHFwFKDo5afkpWyUISkb9Me0GnK66I= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 h1:dUk62HQ3ZFhD48Qr8MIXCiKA8wInBQCtuE4QGfFW7yA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/controller-runtime v0.11.0/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA= -sigs.k8s.io/controller-runtime v0.12.1/go.mod h1:BKhxlA4l7FPK4AQcsuL4X6vZeWnKDXez/vp1Y8dxTU0= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.32 h1:2WjukG7txtEsbXsSKWtTibCdsyYAhcu6KFnttyDdZOQ= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.32/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= +sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= +sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20220104140252-e52a8b1fba62 h1:SCXDKdiCkko9CjGIrqwiS/795bJRaMy6EuibgBuo8dM= sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20220104140252-e52a8b1fba62/go.mod h1:+sJcI1F0QI0Cv+8fp5rH5B2fK1LxzrAQqYnaPx9nY8I= -sigs.k8s.io/controller-tools v0.7.0/go.mod h1:bpBAo0VcSDDLuWt47evLhMLPxRPxMDInTEH/YbdeMK0= -sigs.k8s.io/controller-tools v0.9.0/go.mod h1:NUkn8FTV3Sad3wWpSK7dt/145qfuQ8CKJV6j4jHC5rM= sigs.k8s.io/controller-tools v0.9.2 h1:AkTE3QAdz9LS4iD3EJvHyYxBkg/g9fTbgiYsrcsFCcM= sigs.k8s.io/controller-tools v0.9.2/go.mod h1:NUkn8FTV3Sad3wWpSK7dt/145qfuQ8CKJV6j4jHC5rM= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kind v0.11.1/go.mod h1:fRpgVhtqAWrtLB9ED7zQahUimpUXuG/iHT88xYqEGIA= -sigs.k8s.io/kubebuilder/v3 v3.0.0-alpha.0.0.20220608134342-eea565cb3f50/go.mod h1:2o0wAP/Qi4vLA5tlmKOCTZdWUlkdewvkNi3o5Ko6eSw= -sigs.k8s.io/kubebuilder/v3 v3.0.0-alpha.0.0.20220613172611-57aed3f94a44/go.mod h1:2o0wAP/Qi4vLA5tlmKOCTZdWUlkdewvkNi3o5Ko6eSw= -sigs.k8s.io/kubebuilder/v3 v3.0.0-alpha.0.0.20220613215411-7a05e3d4fe6d/go.mod h1:2o0wAP/Qi4vLA5tlmKOCTZdWUlkdewvkNi3o5Ko6eSw= -sigs.k8s.io/kubebuilder/v3 v3.3.0 h1:rl1d7qHajPDS83bM9IhR85jtEBTRZzQziWwAGYTsadE= -sigs.k8s.io/kubebuilder/v3 v3.3.0/go.mod h1:573SPrO9ttCNPvXVuGQRCpjsEsFza/S+8Jo/b+a+wR0= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kubebuilder/v3 v3.6.0 h1:S0J4ST871SVG5oObPRfyJVjdoKbIUoQgTIUHDq/YtcQ= +sigs.k8s.io/kubebuilder/v3 v3.6.0/go.mod h1:+s6WdvJjIpYRKO+idaeIK5JhbjrZybxh9+K6jK9/Yyc= sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/api v0.11.5 h1:vLDp++YAX7iy2y2CVPJNy9pk9CY8XaUKgHkjbVtnWag= -sigs.k8s.io/kustomize/api v0.11.5/go.mod h1:2UDpxS6AonWXow2ZbySd4AjUxmdXLeTlvGBC46uSiq8= +sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM= +sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/cmd/config v0.10.7 h1:cgX4SFJqhb6sQHUq3kEdu5I3AyV5QMmqYDwLjFABYbA= -sigs.k8s.io/kustomize/cmd/config v0.10.7/go.mod h1:ZTbW6xLlf2ohaOzyWbaRj+fxLbSRjsExCfXGijY4Xt4= +sigs.k8s.io/kustomize/cmd/config v0.10.9 h1:LV8AUwZPuvqhGfia50uNwsPwNg1xOy9koEf5hyBnYs4= +sigs.k8s.io/kustomize/cmd/config v0.10.9/go.mod h1:T0s850zPV3wKfBALA0dyeP/K74jlJcoP8Pr9ZWwE3MQ= sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.5 h1:resCuWDz2eBNLNVkjAlVkHD/1H6SUJqJn/ixrjd9GqI= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.5/go.mod h1:OTNV9eq0S+bLtBgymy9OPYv/6fVaTH0lWw0qncsgfXA= -sigs.k8s.io/kustomize/kyaml v0.10.21/go.mod h1:TYWhGwW9vjoRh3rWqBwB/ZOXyEGRVWe7Ggc3+KZIO+c= +sigs.k8s.io/kustomize/kustomize/v4 v4.5.7 h1:cDW6AVMl6t/SLuQaezMET8hgnadZGIAr8tUrxFVOrpg= +sigs.k8s.io/kustomize/kustomize/v4 v4.5.7/go.mod h1:VSNKEH9D9d9bLiWEGbS6Xbg/Ih0tgQalmPvntzRxZ/Q= sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/kustomize/kyaml v0.13.7 h1:/EZ/nPaLUzeJKF/BuJ4QCuMVJWiEVoI8iftOHY3g3tk= -sigs.k8s.io/kustomize/kyaml v0.13.7/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU= +sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= +sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.0/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/internal/client/fake/replication-client.go b/internal/client/fake/replication-client.go new file mode 100644 index 000000000..d642854dd --- /dev/null +++ b/internal/client/fake/replication-client.go @@ -0,0 +1,101 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 fake + +import "github.com/csi-addons/kubernetes-csi-addons/internal/proto" + +// ReplicationClient to fake replication operations. +type ReplicationClient struct { + // EnableVolumeReplicationMock mocks EnableVolumeReplication RPC call. + EnableVolumeReplicationMock func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.EnableVolumeReplicationResponse, error) + // DisableVolumeReplicationMock mocks DisableVolumeReplication RPC call. + DisableVolumeReplicationMock func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.DisableVolumeReplicationResponse, error) + // PromoteVolumeMock mocks PromoteVolume RPC call. + PromoteVolumeMock func(volumeID, replicationID string, force bool, secretName, secretNamespace string, parameters map[string]string) (*proto.PromoteVolumeResponse, error) + // DemoteVolumeMock mocks DemoteVolume RPC call. + DemoteVolumeMock func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.DemoteVolumeResponse, error) + // ResyncVolumeMock mocks ResyncVolume RPC call. + ResyncVolumeMock func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.ResyncVolumeResponse, error) + // GetVolumeReplicationInfo mocks GetVolumeReplicationInfo RPC call. + GetVolumeReplicationInfoMock func(volumeID, replicationID string, secretName, secretNamespace string) (*proto.GetVolumeReplicationInfoResponse, error) +} + +// EnableVolumeReplication calls EnableVolumeReplicationMock mock function. +func (rc *ReplicationClient) EnableVolumeReplication( + volumeID, + replicationID string, + secretName, secretNamespace string, + parameters map[string]string) ( + *proto.EnableVolumeReplicationResponse, + error) { + return rc.EnableVolumeReplicationMock(volumeID, replicationID, secretName, secretNamespace, parameters) +} + +// DisableVolumeReplication calls DisableVolumeReplicationMock mock function. +func (rc *ReplicationClient) DisableVolumeReplication( + volumeID, + replicationID string, + secretName, secretNamespace string, + parameters map[string]string) ( + *proto.DisableVolumeReplicationResponse, + error) { + return rc.DisableVolumeReplicationMock(volumeID, replicationID, secretName, secretNamespace, parameters) +} + +// PromoteVolume calls PromoteVolumeMock mock function. +func (rc *ReplicationClient) PromoteVolume( + volumeID, + replicationID string, + force bool, + secretName, secretNamespace string, + parameters map[string]string) ( + *proto.PromoteVolumeResponse, + error) { + return rc.PromoteVolumeMock(volumeID, replicationID, force, secretName, secretNamespace, parameters) +} + +// DemoteVolume calls DemoteVolumeMock mock function. +func (rc *ReplicationClient) DemoteVolume( + volumeID, + replicationID string, + secretName, secretNamespace string, + parameters map[string]string) ( + *proto.DemoteVolumeResponse, + error) { + return rc.DemoteVolumeMock(volumeID, replicationID, secretName, secretNamespace, parameters) +} + +// ResyncVolume calls ResyncVolumeMock function. +func (rc *ReplicationClient) ResyncVolume( + volumeID, + replicationID string, + secretName, secretNamespace string, + parameters map[string]string) ( + *proto.ResyncVolumeResponse, + error) { + return rc.ResyncVolumeMock(volumeID, replicationID, secretName, secretNamespace, parameters) +} + +// GetVolumeReplicationInfo calls GetVolumeReplicationInfoMock function. +func (rc *ReplicationClient) GetVolumeReplicationInfo( + volumeID, + replicationID string, + secretName, secretNamespace string) ( + *proto.GetVolumeReplicationInfoResponse, + error) { + return rc.GetVolumeReplicationInfoMock(volumeID, replicationID, secretName, secretNamespace) +} diff --git a/internal/client/replication-client.go b/internal/client/replication-client.go new file mode 100644 index 000000000..98de25914 --- /dev/null +++ b/internal/client/replication-client.go @@ -0,0 +1,164 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 client + +import ( + "context" + "time" + + "github.com/csi-addons/kubernetes-csi-addons/internal/proto" + + "google.golang.org/grpc" +) + +type replicationClient struct { + client proto.ReplicationClient + timeout time.Duration +} + +// VolumeReplication holds the methods required for volume replication. +type VolumeReplication interface { + // EnableVolumeReplication RPC call to enable the volume replication. + EnableVolumeReplication(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.EnableVolumeReplicationResponse, error) + // DisableVolumeReplication RPC call to disable the volume replication. + DisableVolumeReplication(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.DisableVolumeReplicationResponse, error) + // PromoteVolume RPC call to promote the volume. + PromoteVolume(volumeID, replicationID string, force bool, secretName, secretNamespace string, parameters map[string]string) (*proto. + PromoteVolumeResponse, error) + // DemoteVolume RPC call to demote the volume. + DemoteVolume(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto. + DemoteVolumeResponse, error) + // ResyncVolume RPC call to resync the volume. + ResyncVolume(volumeID, replicationID string, force bool, secretName, secretNamespace string, parameters map[string]string) (*proto. + ResyncVolumeResponse, error) + // GetVolumeReplicationInfo RPC call to get volume replication info. + GetVolumeReplicationInfo(volumeID, replicationID, secretName, secretNamespace string) (*proto.GetVolumeReplicationInfoResponse, error) +} + +// NewReplicationClient returns VolumeReplication interface which has the RPC +// calls for replication. +func NewReplicationClient(cc *grpc.ClientConn, timeout time.Duration) VolumeReplication { + return &replicationClient{client: proto.NewReplicationClient(cc), timeout: timeout} +} + +// EnableVolumeReplication RPC call to enable the volume replication. +func (rc *replicationClient) EnableVolumeReplication(volumeID, replicationID string, + secretName, secretNamespace string, parameters map[string]string) (*proto.EnableVolumeReplicationResponse, error) { + req := &proto.EnableVolumeReplicationRequest{ + VolumeId: volumeID, + ReplicationId: replicationID, + Parameters: parameters, + SecretName: secretName, + SecretNamespace: secretNamespace, + } + + createCtx, cancel := context.WithTimeout(context.Background(), rc.timeout) + defer cancel() + resp, err := rc.client.EnableVolumeReplication(createCtx, req) + + return resp, err +} + +// DisableVolumeReplication RPC call to disable the volume replication. +func (rc *replicationClient) DisableVolumeReplication(volumeID, replicationID string, + secretName, secretNamespace string, parameters map[string]string) (*proto.DisableVolumeReplicationResponse, error) { + req := &proto.DisableVolumeReplicationRequest{ + VolumeId: volumeID, + ReplicationId: replicationID, + Parameters: parameters, + SecretName: secretName, + SecretNamespace: secretNamespace, + } + + createCtx, cancel := context.WithTimeout(context.Background(), rc.timeout) + defer cancel() + resp, err := rc.client.DisableVolumeReplication(createCtx, req) + + return resp, err +} + +// PromoteVolume RPC call to promote the volume. +func (rc *replicationClient) PromoteVolume(volumeID, replicationID string, + force bool, secretName, secretNamespace string, parameters map[string]string) (*proto.PromoteVolumeResponse, error) { + req := &proto.PromoteVolumeRequest{ + VolumeId: volumeID, + ReplicationId: replicationID, + Force: force, + Parameters: parameters, + SecretName: secretName, + SecretNamespace: secretNamespace, + } + + createCtx, cancel := context.WithTimeout(context.Background(), rc.timeout) + defer cancel() + resp, err := rc.client.PromoteVolume(createCtx, req) + + return resp, err +} + +// DemoteVolume RPC call to demote the volume. +func (rc *replicationClient) DemoteVolume(volumeID, replicationID string, + secretName, secretNamespace string, parameters map[string]string) (*proto.DemoteVolumeResponse, error) { + req := &proto.DemoteVolumeRequest{ + VolumeId: volumeID, + ReplicationId: replicationID, + Parameters: parameters, + SecretName: secretName, + SecretNamespace: secretNamespace, + } + createCtx, cancel := context.WithTimeout(context.Background(), rc.timeout) + defer cancel() + resp, err := rc.client.DemoteVolume(createCtx, req) + + return resp, err +} + +// ResyncVolume RPC call to resync the volume. +func (rc *replicationClient) ResyncVolume(volumeID, replicationID string, force bool, + secretName, secretNamespace string, parameters map[string]string) (*proto.ResyncVolumeResponse, error) { + req := &proto.ResyncVolumeRequest{ + VolumeId: volumeID, + ReplicationId: replicationID, + Parameters: parameters, + Force: force, + SecretName: secretName, + SecretNamespace: secretNamespace, + } + + createCtx, cancel := context.WithTimeout(context.Background(), rc.timeout) + defer cancel() + resp, err := rc.client.ResyncVolume(createCtx, req) + + return resp, err +} + +// GetVolumeReplicationInfo RPC call to get volume replication info. +func (rc *replicationClient) GetVolumeReplicationInfo(volumeID, replicationID, + secretName, secretNamespace string) (*proto.GetVolumeReplicationInfoResponse, error) { + req := &proto.GetVolumeReplicationInfoRequest{ + VolumeId: volumeID, + ReplicationId: replicationID, + SecretName: secretName, + SecretNamespace: secretNamespace, + } + + createCtx, cancel := context.WithTimeout(context.Background(), rc.timeout) + defer cancel() + resp, err := rc.client.GetVolumeReplicationInfo(createCtx, req) + + return resp, err +} diff --git a/internal/client/replication-client_test.go b/internal/client/replication-client_test.go new file mode 100644 index 000000000..407fad86a --- /dev/null +++ b/internal/client/replication-client_test.go @@ -0,0 +1,151 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 client + +import ( + "errors" + "testing" + + "github.com/csi-addons/kubernetes-csi-addons/internal/client/fake" + "github.com/csi-addons/kubernetes-csi-addons/internal/proto" + + "github.com/stretchr/testify/assert" +) + +func TestEnableVolumeReplication(t *testing.T) { + t.Parallel() + mockedEnableReplication := &fake.ReplicationClient{ + EnableVolumeReplicationMock: func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.EnableVolumeReplicationResponse, error) { + return &proto.EnableVolumeReplicationResponse{}, nil + }, + } + client := mockedEnableReplication + resp, err := client.EnableVolumeReplication("", "", "", "", nil) + assert.Equal(t, &proto.EnableVolumeReplicationResponse{}, resp) + assert.Nil(t, err) + + // return error + mockedEnableReplication = &fake.ReplicationClient{ + EnableVolumeReplicationMock: func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.EnableVolumeReplicationResponse, error) { + return nil, errors.New("failed to enable mirroring") + }, + } + client = mockedEnableReplication + resp, err = client.EnableVolumeReplication("", "", "", "", nil) + assert.Nil(t, resp) + assert.NotNil(t, err) +} + +func TestDisableVolumeReplication(t *testing.T) { + t.Parallel() + mockedDisableReplication := &fake.ReplicationClient{ + DisableVolumeReplicationMock: func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.DisableVolumeReplicationResponse, error) { + return &proto.DisableVolumeReplicationResponse{}, nil + }, + } + client := mockedDisableReplication + resp, err := client.DisableVolumeReplication("", "", "", "", nil) + assert.Equal(t, &proto.DisableVolumeReplicationResponse{}, resp) + assert.Nil(t, err) + + // return error + mockedDisableReplication = &fake.ReplicationClient{ + DisableVolumeReplicationMock: func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.DisableVolumeReplicationResponse, error) { + return nil, errors.New("failed to disable mirroring") + }, + } + client = mockedDisableReplication + resp, err = client.DisableVolumeReplication("", "", "", "", nil) + assert.Nil(t, resp) + assert.NotNil(t, err) +} + +func TestPromoteVolume(t *testing.T) { + t.Parallel() + // return success response + mockedPromoteVolume := &fake.ReplicationClient{ + PromoteVolumeMock: func(volumeID, replicationID string, force bool, secretName, secretNamespace string, parameters map[string]string) (*proto.PromoteVolumeResponse, error) { + return &proto.PromoteVolumeResponse{}, nil + }, + } + force := false + client := mockedPromoteVolume + resp, err := client.PromoteVolume("", "", force, "", "", nil) + assert.Equal(t, &proto.PromoteVolumeResponse{}, resp) + assert.Nil(t, err) + + // return error + mockedPromoteVolume = &fake.ReplicationClient{ + PromoteVolumeMock: func(volumeID, replicationID string, force bool, secretName, secretNamespace string, parameters map[string]string) (*proto.PromoteVolumeResponse, error) { + return nil, errors.New("failed to promote volume") + }, + } + client = mockedPromoteVolume + resp, err = client.PromoteVolume("", "", force, "", "", nil) + assert.Nil(t, resp) + assert.NotNil(t, err) +} + +func TestDemoteVolume(t *testing.T) { + t.Parallel() + // return success response + mockedDemoteVolume := &fake.ReplicationClient{ + DemoteVolumeMock: func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.DemoteVolumeResponse, error) { + return &proto.DemoteVolumeResponse{}, nil + }, + } + client := mockedDemoteVolume + resp, err := client.DemoteVolume("", "", "", "", nil) + assert.Equal(t, &proto.DemoteVolumeResponse{}, resp) + assert.Nil(t, err) + + // return error + mockedDemoteVolume = &fake.ReplicationClient{ + DemoteVolumeMock: func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.DemoteVolumeResponse, error) { + return nil, errors.New("failed to demote volume") + }, + } + client = mockedDemoteVolume + resp, err = client.DemoteVolume("", "", "", "", nil) + assert.Nil(t, resp) + assert.NotNil(t, err) +} + +func TestResyncVolume(t *testing.T) { + t.Parallel() + // return success response + mockedResyncVolume := &fake.ReplicationClient{ + ResyncVolumeMock: func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.ResyncVolumeResponse, error) { + return &proto.ResyncVolumeResponse{}, nil + }, + } + client := mockedResyncVolume + resp, err := client.ResyncVolume("", "", "", "", nil) + assert.Equal(t, &proto.ResyncVolumeResponse{}, resp) + assert.Nil(t, err) + + // return error + mockedResyncVolume = &fake.ReplicationClient{ + ResyncVolumeMock: func(volumeID, replicationID string, secretName, secretNamespace string, parameters map[string]string) (*proto.ResyncVolumeResponse, error) { + return nil, errors.New("failed to resync volume") + }, + } + client = mockedResyncVolume + resp, err = client.ResyncVolume("", "", "", "", nil) + assert.Nil(t, resp) + assert.NotNil(t, err) +} diff --git a/internal/proto/README.md b/internal/proto/README.md new file mode 100644 index 000000000..1f1f2b45d --- /dev/null +++ b/internal/proto/README.md @@ -0,0 +1,12 @@ +# internal/proto package documentation for developers + +The `*.pb.go` files in this directory are automatically generated with the +`make generate-protobuf` command. + +New `*.proto` files will need to be added to the `generate.go` file, with a +`+generate` and `go:generate` build-tag. + +It is expected that the protobuf compiler (`protoc`) is available on the +system. Plugins for the compiler to generate Go code (`protoc-gen-go`) and +Go-GRPC interfaces (`protoc-gen-go-grpc`) will be automatically installed +through the `tools.go` in the root the project. diff --git a/internal/proto/generate.go b/internal/proto/generate.go new file mode 100644 index 000000000..3155ac069 --- /dev/null +++ b/internal/proto/generate.go @@ -0,0 +1,24 @@ +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative networkfence.proto +// +generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative networkfence.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative reclaimspace.proto +// +generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative reclaimspace.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative replication.proto +// +generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative replication.proto + +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 proto diff --git a/internal/proto/google/protobuf/timestamp.proto b/internal/proto/google/protobuf/timestamp.proto new file mode 100644 index 000000000..3b2df6d91 --- /dev/null +++ b/internal/proto/google/protobuf/timestamp.proto @@ -0,0 +1,147 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/timestamppb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "TimestampProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// A Timestamp represents a point in time independent of any time zone or local +// calendar, encoded as a count of seconds and fractions of seconds at +// nanosecond resolution. The count is relative to an epoch at UTC midnight on +// January 1, 1970, in the proleptic Gregorian calendar which extends the +// Gregorian calendar backwards to year one. +// +// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap +// second table is needed for interpretation, using a [24-hour linear +// smear](https://developers.google.com/time/smear). +// +// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By +// restricting to that range, we ensure that we can convert to and from [RFC +// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from Java `Instant.now()`. +// +// Instant now = Instant.now(); +// +// Timestamp timestamp = +// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) +// .setNanos(now.getNano()).build(); +// +// +// Example 6: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required. A proto3 JSON serializer should always use UTC (as indicated by +// "Z") when printing the Timestamp type and a proto3 JSON parser should be +// able to accept both UTC and other timezones (as indicated by an offset). +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard +// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using +// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with +// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use +// the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D +// ) to obtain a formatter capable of generating timestamps in this format. +// +// +message Timestamp { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + int64 seconds = 1; + + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + int32 nanos = 2; +} diff --git a/internal/proto/networkfence.pb.go b/internal/proto/networkfence.pb.go index ae6ff57f5..1fed7fe8d 100644 --- a/internal/proto/networkfence.pb.go +++ b/internal/proto/networkfence.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc-gen-go v1.28.1 +// protoc v3.19.4 // source: networkfence.proto package proto import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -21,10 +20,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - // NetworkFenceRequest holds the required information to fence/unfence // the cluster network. type NetworkFenceRequest struct { diff --git a/internal/proto/networkfence_grpc.pb.go b/internal/proto/networkfence_grpc.pb.go index 3c6c06848..b2e12abaf 100644 --- a/internal/proto/networkfence_grpc.pb.go +++ b/internal/proto/networkfence_grpc.pb.go @@ -137,5 +137,5 @@ var NetworkFence_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "internal/proto/networkfence.proto", + Metadata: "networkfence.proto", } diff --git a/internal/proto/reclaimspace.pb.go b/internal/proto/reclaimspace.pb.go index b3ec31494..201a6fa32 100644 --- a/internal/proto/reclaimspace.pb.go +++ b/internal/proto/reclaimspace.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.6.1 +// protoc-gen-go v1.28.1 +// protoc v3.19.4 // source: reclaimspace.proto package proto @@ -212,11 +212,11 @@ var file_reclaimspace_proto_rawDesc = []byte{ 0x52, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x22, 0x00, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x73, 0x69, 0x2d, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x2d, 0x63, 0x73, 0x69, 0x2d, 0x61, 0x64, 0x64, 0x6f, 0x6e, - 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/internal/proto/reclaimspace_grpc.pb.go b/internal/proto/reclaimspace_grpc.pb.go index fc130bc35..d3e4be808 100644 --- a/internal/proto/reclaimspace_grpc.pb.go +++ b/internal/proto/reclaimspace_grpc.pb.go @@ -141,5 +141,5 @@ var ReclaimSpace_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "internal/proto/reclaimspace.proto", + Metadata: "reclaimspace.proto", } diff --git a/internal/proto/replication.pb.go b/internal/proto/replication.pb.go new file mode 100644 index 000000000..e84666d94 --- /dev/null +++ b/internal/proto/replication.pb.go @@ -0,0 +1,1284 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.19.4 +// source: replication.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// EnableVolumeReplicationRequest holds the required information to enable +// replication on a volume. +type EnableVolumeReplicationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,2,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the driver to complete the request. + SecretName string `protobuf:"bytes,4,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` + SecretNamespace string `protobuf:"bytes,5,opt,name=secret_namespace,json=secretNamespace,proto3" json:"secret_namespace,omitempty"` +} + +func (x *EnableVolumeReplicationRequest) Reset() { + *x = EnableVolumeReplicationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableVolumeReplicationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableVolumeReplicationRequest) ProtoMessage() {} + +func (x *EnableVolumeReplicationRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableVolumeReplicationRequest.ProtoReflect.Descriptor instead. +func (*EnableVolumeReplicationRequest) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{0} +} + +func (x *EnableVolumeReplicationRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *EnableVolumeReplicationRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *EnableVolumeReplicationRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *EnableVolumeReplicationRequest) GetSecretName() string { + if x != nil { + return x.SecretName + } + return "" +} + +func (x *EnableVolumeReplicationRequest) GetSecretNamespace() string { + if x != nil { + return x.SecretNamespace + } + return "" +} + +// EnableVolumeReplicationResponse holds the information to send when +// replication is successfully enabled on a volume. +type EnableVolumeReplicationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *EnableVolumeReplicationResponse) Reset() { + *x = EnableVolumeReplicationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableVolumeReplicationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableVolumeReplicationResponse) ProtoMessage() {} + +func (x *EnableVolumeReplicationResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableVolumeReplicationResponse.ProtoReflect.Descriptor instead. +func (*EnableVolumeReplicationResponse) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{1} +} + +// DisableVolumeReplicationRequest holds the required information to disable +// replication on a volume. +type DisableVolumeReplicationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,2,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the driver to complete the request. + SecretName string `protobuf:"bytes,4,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` + SecretNamespace string `protobuf:"bytes,5,opt,name=secret_namespace,json=secretNamespace,proto3" json:"secret_namespace,omitempty"` +} + +func (x *DisableVolumeReplicationRequest) Reset() { + *x = DisableVolumeReplicationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DisableVolumeReplicationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableVolumeReplicationRequest) ProtoMessage() {} + +func (x *DisableVolumeReplicationRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableVolumeReplicationRequest.ProtoReflect.Descriptor instead. +func (*DisableVolumeReplicationRequest) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{2} +} + +func (x *DisableVolumeReplicationRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *DisableVolumeReplicationRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *DisableVolumeReplicationRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *DisableVolumeReplicationRequest) GetSecretName() string { + if x != nil { + return x.SecretName + } + return "" +} + +func (x *DisableVolumeReplicationRequest) GetSecretNamespace() string { + if x != nil { + return x.SecretNamespace + } + return "" +} + +// DisableVolumeReplicationResponse holds the information to send when +// replication is successfully disabled on a volume. +type DisableVolumeReplicationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DisableVolumeReplicationResponse) Reset() { + *x = DisableVolumeReplicationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DisableVolumeReplicationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableVolumeReplicationResponse) ProtoMessage() {} + +func (x *DisableVolumeReplicationResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableVolumeReplicationResponse.ProtoReflect.Descriptor instead. +func (*DisableVolumeReplicationResponse) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{3} +} + +// PromoteVolumeRequest holds the required information to promote volume as a +// primary on local cluster. +type PromoteVolumeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,2,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // This field is optional. + // Default value is false, force option to Promote the volume. + Force bool `protobuf:"varint,3,opt,name=force,proto3" json:"force,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the driver to complete the request. + SecretName string `protobuf:"bytes,5,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` + SecretNamespace string `protobuf:"bytes,6,opt,name=secret_namespace,json=secretNamespace,proto3" json:"secret_namespace,omitempty"` +} + +func (x *PromoteVolumeRequest) Reset() { + *x = PromoteVolumeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PromoteVolumeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromoteVolumeRequest) ProtoMessage() {} + +func (x *PromoteVolumeRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromoteVolumeRequest.ProtoReflect.Descriptor instead. +func (*PromoteVolumeRequest) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{4} +} + +func (x *PromoteVolumeRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *PromoteVolumeRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *PromoteVolumeRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +func (x *PromoteVolumeRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *PromoteVolumeRequest) GetSecretName() string { + if x != nil { + return x.SecretName + } + return "" +} + +func (x *PromoteVolumeRequest) GetSecretNamespace() string { + if x != nil { + return x.SecretNamespace + } + return "" +} + +// PromoteVolumeResponse holds the information to send when +// volume is successfully promoted. +type PromoteVolumeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PromoteVolumeResponse) Reset() { + *x = PromoteVolumeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PromoteVolumeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromoteVolumeResponse) ProtoMessage() {} + +func (x *PromoteVolumeResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromoteVolumeResponse.ProtoReflect.Descriptor instead. +func (*PromoteVolumeResponse) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{5} +} + +// DemoteVolumeRequest holds the required information to demote volume on local +// cluster. +type DemoteVolumeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,2,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // This field is optional. + // Default value is false, force option to Demote the volume. + Force bool `protobuf:"varint,3,opt,name=force,proto3" json:"force,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the driver to complete the request. + SecretName string `protobuf:"bytes,5,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` + SecretNamespace string `protobuf:"bytes,6,opt,name=secret_namespace,json=secretNamespace,proto3" json:"secret_namespace,omitempty"` +} + +func (x *DemoteVolumeRequest) Reset() { + *x = DemoteVolumeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DemoteVolumeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DemoteVolumeRequest) ProtoMessage() {} + +func (x *DemoteVolumeRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DemoteVolumeRequest.ProtoReflect.Descriptor instead. +func (*DemoteVolumeRequest) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{6} +} + +func (x *DemoteVolumeRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *DemoteVolumeRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *DemoteVolumeRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +func (x *DemoteVolumeRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *DemoteVolumeRequest) GetSecretName() string { + if x != nil { + return x.SecretName + } + return "" +} + +func (x *DemoteVolumeRequest) GetSecretNamespace() string { + if x != nil { + return x.SecretNamespace + } + return "" +} + +// DemoteVolumeResponse holds the information to send when +// volume is successfully demoted. +type DemoteVolumeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DemoteVolumeResponse) Reset() { + *x = DemoteVolumeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DemoteVolumeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DemoteVolumeResponse) ProtoMessage() {} + +func (x *DemoteVolumeResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DemoteVolumeResponse.ProtoReflect.Descriptor instead. +func (*DemoteVolumeResponse) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{7} +} + +// ResyncVolumeRequest holds the required information to resync volume. +type ResyncVolumeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,2,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // This field is optional. + // Default value is false, force option to Resync the volume. + Force bool `protobuf:"varint,3,opt,name=force,proto3" json:"force,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the driver to complete the request. + SecretName string `protobuf:"bytes,5,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` + SecretNamespace string `protobuf:"bytes,6,opt,name=secret_namespace,json=secretNamespace,proto3" json:"secret_namespace,omitempty"` +} + +func (x *ResyncVolumeRequest) Reset() { + *x = ResyncVolumeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResyncVolumeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResyncVolumeRequest) ProtoMessage() {} + +func (x *ResyncVolumeRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResyncVolumeRequest.ProtoReflect.Descriptor instead. +func (*ResyncVolumeRequest) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{8} +} + +func (x *ResyncVolumeRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *ResyncVolumeRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *ResyncVolumeRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +func (x *ResyncVolumeRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *ResyncVolumeRequest) GetSecretName() string { + if x != nil { + return x.SecretName + } + return "" +} + +func (x *ResyncVolumeRequest) GetSecretNamespace() string { + if x != nil { + return x.SecretNamespace + } + return "" +} + +// ResyncVolumeResponse holds the information to send when +// volume is successfully resynced. +type ResyncVolumeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Indicates that the volume is ready to use. + // The default value is false. + // This field is REQUIRED. + Ready bool `protobuf:"varint,1,opt,name=ready,proto3" json:"ready,omitempty"` +} + +func (x *ResyncVolumeResponse) Reset() { + *x = ResyncVolumeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResyncVolumeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResyncVolumeResponse) ProtoMessage() {} + +func (x *ResyncVolumeResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResyncVolumeResponse.ProtoReflect.Descriptor instead. +func (*ResyncVolumeResponse) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{9} +} + +func (x *ResyncVolumeResponse) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +// getVolumeReplicationInfoRequest holds the required information to get the Volume replication info. +type GetVolumeReplicationInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,2,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // Secrets required by the plugin to complete the request. + SecretName string `protobuf:"bytes,3,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` + SecretNamespace string `protobuf:"bytes,4,opt,name=secret_namespace,json=secretNamespace,proto3" json:"secret_namespace,omitempty"` +} + +func (x *GetVolumeReplicationInfoRequest) Reset() { + *x = GetVolumeReplicationInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetVolumeReplicationInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVolumeReplicationInfoRequest) ProtoMessage() {} + +func (x *GetVolumeReplicationInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVolumeReplicationInfoRequest.ProtoReflect.Descriptor instead. +func (*GetVolumeReplicationInfoRequest) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{10} +} + +func (x *GetVolumeReplicationInfoRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *GetVolumeReplicationInfoRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *GetVolumeReplicationInfoRequest) GetSecretName() string { + if x != nil { + return x.SecretName + } + return "" +} + +func (x *GetVolumeReplicationInfoRequest) GetSecretNamespace() string { + if x != nil { + return x.SecretNamespace + } + return "" +} + +// GetVolumeReplicationInfoResponse holds the information to send the +// volume replication info. +type GetVolumeReplicationInfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Holds the last sync time. + // This field is REQUIRED. + LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"` +} + +func (x *GetVolumeReplicationInfoResponse) Reset() { + *x = GetVolumeReplicationInfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetVolumeReplicationInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVolumeReplicationInfoResponse) ProtoMessage() {} + +func (x *GetVolumeReplicationInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVolumeReplicationInfoResponse.ProtoReflect.Descriptor instead. +func (*GetVolumeReplicationInfoResponse) Descriptor() ([]byte, []int) { + return file_replication_proto_rawDescGZIP(), []int{11} +} + +func (x *GetVolumeReplicationInfoResponse) GetLastSyncTime() *timestamppb.Timestamp { + if x != nil { + return x.LastSyncTime + } + return nil +} + +var File_replication_proto protoreflect.FileDescriptor + +var file_replication_proto_rawDesc = []byte{ + 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc6, 0x02, 0x0a, 0x1e, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x55, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x21, 0x0a, 0x1f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc8, 0x02, 0x0a, 0x1f, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x56, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x22, 0x0a, 0x20, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc8, 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x17, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc6, 0x02, 0x0a, 0x13, 0x44, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, + 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc6, 0x02, 0x0a, 0x13, + 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, + 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2c, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x22, 0xb1, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x64, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, + 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x32, 0xbb, 0x04, 0x0a, + 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6a, 0x0a, 0x17, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x18, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, + 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0c, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x49, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x73, 0x69, 0x2d, 0x61, 0x64, 0x64, + 0x6f, 0x6e, 0x73, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x2d, 0x63, + 0x73, 0x69, 0x2d, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_replication_proto_rawDescOnce sync.Once + file_replication_proto_rawDescData = file_replication_proto_rawDesc +) + +func file_replication_proto_rawDescGZIP() []byte { + file_replication_proto_rawDescOnce.Do(func() { + file_replication_proto_rawDescData = protoimpl.X.CompressGZIP(file_replication_proto_rawDescData) + }) + return file_replication_proto_rawDescData +} + +var file_replication_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_replication_proto_goTypes = []interface{}{ + (*EnableVolumeReplicationRequest)(nil), // 0: proto.EnableVolumeReplicationRequest + (*EnableVolumeReplicationResponse)(nil), // 1: proto.EnableVolumeReplicationResponse + (*DisableVolumeReplicationRequest)(nil), // 2: proto.DisableVolumeReplicationRequest + (*DisableVolumeReplicationResponse)(nil), // 3: proto.DisableVolumeReplicationResponse + (*PromoteVolumeRequest)(nil), // 4: proto.PromoteVolumeRequest + (*PromoteVolumeResponse)(nil), // 5: proto.PromoteVolumeResponse + (*DemoteVolumeRequest)(nil), // 6: proto.DemoteVolumeRequest + (*DemoteVolumeResponse)(nil), // 7: proto.DemoteVolumeResponse + (*ResyncVolumeRequest)(nil), // 8: proto.ResyncVolumeRequest + (*ResyncVolumeResponse)(nil), // 9: proto.ResyncVolumeResponse + (*GetVolumeReplicationInfoRequest)(nil), // 10: proto.GetVolumeReplicationInfoRequest + (*GetVolumeReplicationInfoResponse)(nil), // 11: proto.GetVolumeReplicationInfoResponse + nil, // 12: proto.EnableVolumeReplicationRequest.ParametersEntry + nil, // 13: proto.DisableVolumeReplicationRequest.ParametersEntry + nil, // 14: proto.PromoteVolumeRequest.ParametersEntry + nil, // 15: proto.DemoteVolumeRequest.ParametersEntry + nil, // 16: proto.ResyncVolumeRequest.ParametersEntry + (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp +} +var file_replication_proto_depIdxs = []int32{ + 12, // 0: proto.EnableVolumeReplicationRequest.parameters:type_name -> proto.EnableVolumeReplicationRequest.ParametersEntry + 13, // 1: proto.DisableVolumeReplicationRequest.parameters:type_name -> proto.DisableVolumeReplicationRequest.ParametersEntry + 14, // 2: proto.PromoteVolumeRequest.parameters:type_name -> proto.PromoteVolumeRequest.ParametersEntry + 15, // 3: proto.DemoteVolumeRequest.parameters:type_name -> proto.DemoteVolumeRequest.ParametersEntry + 16, // 4: proto.ResyncVolumeRequest.parameters:type_name -> proto.ResyncVolumeRequest.ParametersEntry + 17, // 5: proto.GetVolumeReplicationInfoResponse.last_sync_time:type_name -> google.protobuf.Timestamp + 0, // 6: proto.Replication.EnableVolumeReplication:input_type -> proto.EnableVolumeReplicationRequest + 2, // 7: proto.Replication.DisableVolumeReplication:input_type -> proto.DisableVolumeReplicationRequest + 4, // 8: proto.Replication.PromoteVolume:input_type -> proto.PromoteVolumeRequest + 6, // 9: proto.Replication.DemoteVolume:input_type -> proto.DemoteVolumeRequest + 8, // 10: proto.Replication.ResyncVolume:input_type -> proto.ResyncVolumeRequest + 10, // 11: proto.Replication.GetVolumeReplicationInfo:input_type -> proto.GetVolumeReplicationInfoRequest + 1, // 12: proto.Replication.EnableVolumeReplication:output_type -> proto.EnableVolumeReplicationResponse + 3, // 13: proto.Replication.DisableVolumeReplication:output_type -> proto.DisableVolumeReplicationResponse + 5, // 14: proto.Replication.PromoteVolume:output_type -> proto.PromoteVolumeResponse + 7, // 15: proto.Replication.DemoteVolume:output_type -> proto.DemoteVolumeResponse + 9, // 16: proto.Replication.ResyncVolume:output_type -> proto.ResyncVolumeResponse + 11, // 17: proto.Replication.GetVolumeReplicationInfo:output_type -> proto.GetVolumeReplicationInfoResponse + 12, // [12:18] is the sub-list for method output_type + 6, // [6:12] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name +} + +func init() { file_replication_proto_init() } +func file_replication_proto_init() { + if File_replication_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_replication_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnableVolumeReplicationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnableVolumeReplicationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisableVolumeReplicationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisableVolumeReplicationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PromoteVolumeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PromoteVolumeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DemoteVolumeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DemoteVolumeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResyncVolumeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResyncVolumeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetVolumeReplicationInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetVolumeReplicationInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_replication_proto_rawDesc, + NumEnums: 0, + NumMessages: 17, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_replication_proto_goTypes, + DependencyIndexes: file_replication_proto_depIdxs, + MessageInfos: file_replication_proto_msgTypes, + }.Build() + File_replication_proto = out.File + file_replication_proto_rawDesc = nil + file_replication_proto_goTypes = nil + file_replication_proto_depIdxs = nil +} diff --git a/internal/proto/replication.proto b/internal/proto/replication.proto new file mode 100644 index 000000000..8a492ac5a --- /dev/null +++ b/internal/proto/replication.proto @@ -0,0 +1,209 @@ +syntax = "proto3"; +package proto; + +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/csi-addons/kubernetes-csi-addons/internal/proto"; + +// Replication holds the RPC menthod for allowing the communication between +// the CSIAddons controller and the sidecar for replication operation. +service Replication { + // EnableVolumeReplication RPC call to enable the volume replication. + rpc EnableVolumeReplication (EnableVolumeReplicationRequest) + returns (EnableVolumeReplicationResponse) {} + // DisableVolumeReplication RPC call to disable the volume replication. + rpc DisableVolumeReplication (DisableVolumeReplicationRequest) + returns (DisableVolumeReplicationResponse) {} + // PromoteVolume RPC call to promote the volume. + rpc PromoteVolume (PromoteVolumeRequest) + returns (PromoteVolumeResponse) {} + // DemoteVolume RPC call to demote the volume. + rpc DemoteVolume (DemoteVolumeRequest) + returns (DemoteVolumeResponse) {} + // ResyncVolume RPC call to resync the volume. + rpc ResyncVolume (ResyncVolumeRequest) + returns (ResyncVolumeResponse) {} + // GetVolumeReplicationInfo RPC call to get the volume replication info. + rpc GetVolumeReplicationInfo (GetVolumeReplicationInfoRequest) + returns (GetVolumeReplicationInfoResponse) {} +} +// EnableVolumeReplicationRequest holds the required information to enable +// replication on a volume. +message EnableVolumeReplicationRequest { + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + string volume_id = 1; + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + string replication_id = 2; + // Plugin specific parameters passed in as opaque key-value pairs. + map parameters = 3; + // Secrets required by the driver to complete the request. + string secret_name = 4; + string secret_namespace = 5; +} + +// EnableVolumeReplicationResponse holds the information to send when +// replication is successfully enabled on a volume. +message EnableVolumeReplicationResponse { +} +// DisableVolumeReplicationRequest holds the required information to disable +// replication on a volume. +message DisableVolumeReplicationRequest { + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + string volume_id = 1; + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + string replication_id = 2; + // Plugin specific parameters passed in as opaque key-value pairs. + map parameters = 3; + // Secrets required by the driver to complete the request. + string secret_name = 4; + string secret_namespace = 5; +} + +// DisableVolumeReplicationResponse holds the information to send when +// replication is successfully disabled on a volume. +message DisableVolumeReplicationResponse { +} +// PromoteVolumeRequest holds the required information to promote volume as a +// primary on local cluster. +message PromoteVolumeRequest { + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + string volume_id = 1; + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + string replication_id = 2; + // This field is optional. + // Default value is false, force option to Promote the volume. + bool force = 3; + // Plugin specific parameters passed in as opaque key-value pairs. + map parameters = 4; + // Secrets required by the driver to complete the request. + string secret_name = 5; + string secret_namespace = 6; +} + +// PromoteVolumeResponse holds the information to send when +// volume is successfully promoted. +message PromoteVolumeResponse{ +} +// DemoteVolumeRequest holds the required information to demote volume on local +// cluster. +message DemoteVolumeRequest { + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + string volume_id = 1; + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + string replication_id = 2; + // This field is optional. + // Default value is false, force option to Demote the volume. + bool force = 3; + // Plugin specific parameters passed in as opaque key-value pairs. + map parameters = 4; + // Secrets required by the driver to complete the request. + string secret_name = 5; + string secret_namespace = 6; +} + +// DemoteVolumeResponse holds the information to send when +// volume is successfully demoted. +message DemoteVolumeResponse{ +} +// ResyncVolumeRequest holds the required information to resync volume. +message ResyncVolumeRequest { + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + string volume_id = 1; + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + string replication_id = 2; + // This field is optional. + // Default value is false, force option to Resync the volume. + bool force = 3; + // Plugin specific parameters passed in as opaque key-value pairs. + map parameters = 4; + // Secrets required by the driver to complete the request. + string secret_name = 5; + string secret_namespace = 6; +} + +// ResyncVolumeResponse holds the information to send when +// volume is successfully resynced. +message ResyncVolumeResponse{ + // Indicates that the volume is ready to use. + // The default value is false. + // This field is REQUIRED. + bool ready = 1; +} + +// getVolumeReplicationInfoRequest holds the required information to get the Volume replication info. +message GetVolumeReplicationInfoRequest { + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + string volume_id = 1; + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + string replication_id = 2; + // Secrets required by the plugin to complete the request. + string secret_name = 3; + string secret_namespace = 4; +} +// GetVolumeReplicationInfoResponse holds the information to send the +// volume replication info. +message GetVolumeReplicationInfoResponse{ + // Holds the last sync time. + // This field is REQUIRED. + .google.protobuf.Timestamp last_sync_time = 1; +} diff --git a/internal/proto/replication_grpc.pb.go b/internal/proto/replication_grpc.pb.go new file mode 100644 index 000000000..863246c56 --- /dev/null +++ b/internal/proto/replication_grpc.pb.go @@ -0,0 +1,293 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package proto + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// ReplicationClient is the client API for Replication service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ReplicationClient interface { + // EnableVolumeReplication RPC call to enable the volume replication. + EnableVolumeReplication(ctx context.Context, in *EnableVolumeReplicationRequest, opts ...grpc.CallOption) (*EnableVolumeReplicationResponse, error) + // DisableVolumeReplication RPC call to disable the volume replication. + DisableVolumeReplication(ctx context.Context, in *DisableVolumeReplicationRequest, opts ...grpc.CallOption) (*DisableVolumeReplicationResponse, error) + // PromoteVolume RPC call to promote the volume. + PromoteVolume(ctx context.Context, in *PromoteVolumeRequest, opts ...grpc.CallOption) (*PromoteVolumeResponse, error) + // DemoteVolume RPC call to demote the volume. + DemoteVolume(ctx context.Context, in *DemoteVolumeRequest, opts ...grpc.CallOption) (*DemoteVolumeResponse, error) + // ResyncVolume RPC call to resync the volume. + ResyncVolume(ctx context.Context, in *ResyncVolumeRequest, opts ...grpc.CallOption) (*ResyncVolumeResponse, error) + // GetVolumeReplicationInfo RPC call to get the volume replication info. + GetVolumeReplicationInfo(ctx context.Context, in *GetVolumeReplicationInfoRequest, opts ...grpc.CallOption) (*GetVolumeReplicationInfoResponse, error) +} + +type replicationClient struct { + cc grpc.ClientConnInterface +} + +func NewReplicationClient(cc grpc.ClientConnInterface) ReplicationClient { + return &replicationClient{cc} +} + +func (c *replicationClient) EnableVolumeReplication(ctx context.Context, in *EnableVolumeReplicationRequest, opts ...grpc.CallOption) (*EnableVolumeReplicationResponse, error) { + out := new(EnableVolumeReplicationResponse) + err := c.cc.Invoke(ctx, "/proto.Replication/EnableVolumeReplication", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *replicationClient) DisableVolumeReplication(ctx context.Context, in *DisableVolumeReplicationRequest, opts ...grpc.CallOption) (*DisableVolumeReplicationResponse, error) { + out := new(DisableVolumeReplicationResponse) + err := c.cc.Invoke(ctx, "/proto.Replication/DisableVolumeReplication", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *replicationClient) PromoteVolume(ctx context.Context, in *PromoteVolumeRequest, opts ...grpc.CallOption) (*PromoteVolumeResponse, error) { + out := new(PromoteVolumeResponse) + err := c.cc.Invoke(ctx, "/proto.Replication/PromoteVolume", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *replicationClient) DemoteVolume(ctx context.Context, in *DemoteVolumeRequest, opts ...grpc.CallOption) (*DemoteVolumeResponse, error) { + out := new(DemoteVolumeResponse) + err := c.cc.Invoke(ctx, "/proto.Replication/DemoteVolume", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *replicationClient) ResyncVolume(ctx context.Context, in *ResyncVolumeRequest, opts ...grpc.CallOption) (*ResyncVolumeResponse, error) { + out := new(ResyncVolumeResponse) + err := c.cc.Invoke(ctx, "/proto.Replication/ResyncVolume", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *replicationClient) GetVolumeReplicationInfo(ctx context.Context, in *GetVolumeReplicationInfoRequest, opts ...grpc.CallOption) (*GetVolumeReplicationInfoResponse, error) { + out := new(GetVolumeReplicationInfoResponse) + err := c.cc.Invoke(ctx, "/proto.Replication/GetVolumeReplicationInfo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ReplicationServer is the server API for Replication service. +// All implementations must embed UnimplementedReplicationServer +// for forward compatibility +type ReplicationServer interface { + // EnableVolumeReplication RPC call to enable the volume replication. + EnableVolumeReplication(context.Context, *EnableVolumeReplicationRequest) (*EnableVolumeReplicationResponse, error) + // DisableVolumeReplication RPC call to disable the volume replication. + DisableVolumeReplication(context.Context, *DisableVolumeReplicationRequest) (*DisableVolumeReplicationResponse, error) + // PromoteVolume RPC call to promote the volume. + PromoteVolume(context.Context, *PromoteVolumeRequest) (*PromoteVolumeResponse, error) + // DemoteVolume RPC call to demote the volume. + DemoteVolume(context.Context, *DemoteVolumeRequest) (*DemoteVolumeResponse, error) + // ResyncVolume RPC call to resync the volume. + ResyncVolume(context.Context, *ResyncVolumeRequest) (*ResyncVolumeResponse, error) + // GetVolumeReplicationInfo RPC call to get the volume replication info. + GetVolumeReplicationInfo(context.Context, *GetVolumeReplicationInfoRequest) (*GetVolumeReplicationInfoResponse, error) + mustEmbedUnimplementedReplicationServer() +} + +// UnimplementedReplicationServer must be embedded to have forward compatible implementations. +type UnimplementedReplicationServer struct { +} + +func (UnimplementedReplicationServer) EnableVolumeReplication(context.Context, *EnableVolumeReplicationRequest) (*EnableVolumeReplicationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnableVolumeReplication not implemented") +} +func (UnimplementedReplicationServer) DisableVolumeReplication(context.Context, *DisableVolumeReplicationRequest) (*DisableVolumeReplicationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DisableVolumeReplication not implemented") +} +func (UnimplementedReplicationServer) PromoteVolume(context.Context, *PromoteVolumeRequest) (*PromoteVolumeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PromoteVolume not implemented") +} +func (UnimplementedReplicationServer) DemoteVolume(context.Context, *DemoteVolumeRequest) (*DemoteVolumeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DemoteVolume not implemented") +} +func (UnimplementedReplicationServer) ResyncVolume(context.Context, *ResyncVolumeRequest) (*ResyncVolumeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ResyncVolume not implemented") +} +func (UnimplementedReplicationServer) GetVolumeReplicationInfo(context.Context, *GetVolumeReplicationInfoRequest) (*GetVolumeReplicationInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetVolumeReplicationInfo not implemented") +} +func (UnimplementedReplicationServer) mustEmbedUnimplementedReplicationServer() {} + +// UnsafeReplicationServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ReplicationServer will +// result in compilation errors. +type UnsafeReplicationServer interface { + mustEmbedUnimplementedReplicationServer() +} + +func RegisterReplicationServer(s grpc.ServiceRegistrar, srv ReplicationServer) { + s.RegisterService(&Replication_ServiceDesc, srv) +} + +func _Replication_EnableVolumeReplication_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EnableVolumeReplicationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ReplicationServer).EnableVolumeReplication(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.Replication/EnableVolumeReplication", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ReplicationServer).EnableVolumeReplication(ctx, req.(*EnableVolumeReplicationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Replication_DisableVolumeReplication_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DisableVolumeReplicationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ReplicationServer).DisableVolumeReplication(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.Replication/DisableVolumeReplication", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ReplicationServer).DisableVolumeReplication(ctx, req.(*DisableVolumeReplicationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Replication_PromoteVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PromoteVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ReplicationServer).PromoteVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.Replication/PromoteVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ReplicationServer).PromoteVolume(ctx, req.(*PromoteVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Replication_DemoteVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DemoteVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ReplicationServer).DemoteVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.Replication/DemoteVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ReplicationServer).DemoteVolume(ctx, req.(*DemoteVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Replication_ResyncVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResyncVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ReplicationServer).ResyncVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.Replication/ResyncVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ReplicationServer).ResyncVolume(ctx, req.(*ResyncVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Replication_GetVolumeReplicationInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetVolumeReplicationInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ReplicationServer).GetVolumeReplicationInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.Replication/GetVolumeReplicationInfo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ReplicationServer).GetVolumeReplicationInfo(ctx, req.(*GetVolumeReplicationInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// Replication_ServiceDesc is the grpc.ServiceDesc for Replication service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Replication_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "proto.Replication", + HandlerType: (*ReplicationServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "EnableVolumeReplication", + Handler: _Replication_EnableVolumeReplication_Handler, + }, + { + MethodName: "DisableVolumeReplication", + Handler: _Replication_DisableVolumeReplication_Handler, + }, + { + MethodName: "PromoteVolume", + Handler: _Replication_PromoteVolume_Handler, + }, + { + MethodName: "DemoteVolume", + Handler: _Replication_DemoteVolume_Handler, + }, + { + MethodName: "ResyncVolume", + Handler: _Replication_ResyncVolume_Handler, + }, + { + MethodName: "GetVolumeReplicationInfo", + Handler: _Replication_GetVolumeReplicationInfo_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "replication.proto", +} diff --git a/internal/sidecar/service/volumereplication.go b/internal/sidecar/service/volumereplication.go new file mode 100644 index 000000000..0f4f2b363 --- /dev/null +++ b/internal/sidecar/service/volumereplication.go @@ -0,0 +1,226 @@ +/* +Copyright 2022 The Kubernetes-CSI-Addons 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 service + +import ( + "context" + + kube "github.com/csi-addons/kubernetes-csi-addons/internal/kubernetes" + "github.com/csi-addons/kubernetes-csi-addons/internal/proto" + csiReplication "github.com/csi-addons/spec/lib/go/replication" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "k8s.io/client-go/kubernetes" + "k8s.io/klog/v2" +) + +// ReplicationServer struct of sidecar with supported methods of proto +// replication server spec and also containing replication +// controller client to csi driver. +type ReplicationServer struct { + proto.UnimplementedReplicationServer + controllerClient csiReplication.ControllerClient + kubeClient *kubernetes.Clientset +} + +// NewReplicationServer creates a new ReplicationServer which handles the proto.Replication +// Service requests. +func NewReplicationServer(c *grpc.ClientConn, kc *kubernetes.Clientset) *ReplicationServer { + return &ReplicationServer{ + controllerClient: csiReplication.NewControllerClient(c), + kubeClient: kc, + } +} + +// RegisterService registers service with the server. +func (rs *ReplicationServer) RegisterService(server grpc.ServiceRegistrar) { + proto.RegisterReplicationServer(server, rs) +} + +// EnableVolumeReplication fetches required information from kubernetes cluster and calls +// CSI-Addons EnableVolumeReplication service. +func (rs *ReplicationServer) EnableVolumeReplication( + ctx context.Context, + req *proto.EnableVolumeReplicationRequest) (*proto.EnableVolumeReplicationResponse, error) { + // Get the secrets from the k8s cluster + data, err := kube.GetSecret(ctx, rs.kubeClient, req.GetSecretName(), req.GetSecretNamespace()) + if err != nil { + klog.Errorf("Failed to get secret %s in namespace %s: %v", req.GetSecretName(), req.GetSecretNamespace(), err) + return nil, status.Error(codes.Internal, err.Error()) + } + + _, err = rs.controllerClient.EnableVolumeReplication(ctx, + &csiReplication.EnableVolumeReplicationRequest{ + VolumeId: req.VolumeId, + ReplicationId: req.ReplicationId, + Parameters: req.Parameters, + Secrets: data, + }) + if err != nil { + klog.Errorf("Failed to enable volume replication: %v", err) + return nil, err + } + + return &proto.EnableVolumeReplicationResponse{}, nil +} + +// DisableVolumeReplication fetches required information from kubernetes cluster and calls +// CSI-Addons DisableVolumeReplication service. +func (rs *ReplicationServer) DisableVolumeReplication( + ctx context.Context, + req *proto.DisableVolumeReplicationRequest) (*proto.DisableVolumeReplicationResponse, error) { + // Get the secrets from the k8s cluster + data, err := kube.GetSecret(ctx, rs.kubeClient, req.GetSecretName(), req.GetSecretNamespace()) + if err != nil { + klog.Errorf("Failed to get secret %s in namespace %s: %v", req.GetSecretName(), req.GetSecretNamespace(), err) + return nil, status.Error(codes.Internal, err.Error()) + } + + _, err = rs.controllerClient.DisableVolumeReplication(ctx, + &csiReplication.DisableVolumeReplicationRequest{ + VolumeId: req.VolumeId, + ReplicationId: req.ReplicationId, + Parameters: req.Parameters, + Secrets: data, + }) + if err != nil { + klog.Errorf("Failed to enable volume replication: %v", err) + return nil, err + } + + return &proto.DisableVolumeReplicationResponse{}, nil +} + +// PromoteVolume fetches required information from kubernetes cluster and calls +// CSI-Addons PromoteVolume service. +func (rs *ReplicationServer) PromoteVolume( + ctx context.Context, + req *proto.PromoteVolumeRequest) (*proto.PromoteVolumeResponse, error) { + // Get the secrets from the k8s cluster + data, err := kube.GetSecret(ctx, rs.kubeClient, req.GetSecretName(), req.GetSecretNamespace()) + if err != nil { + klog.Errorf("Failed to get secret %s in namespace %s: %v", req.GetSecretName(), req.GetSecretNamespace(), err) + return nil, status.Error(codes.Internal, err.Error()) + } + + _, err = rs.controllerClient.PromoteVolume(ctx, + &csiReplication.PromoteVolumeRequest{ + VolumeId: req.VolumeId, + ReplicationId: req.ReplicationId, + Force: req.Force, + Parameters: req.Parameters, + Secrets: data, + }) + if err != nil { + klog.Errorf("Failed to enable volume replication: %v", err) + return nil, err + } + + return &proto.PromoteVolumeResponse{}, nil +} + +// DemoteVolume fetches required information from kubernetes cluster and calls +// CSI-Addons DemoteVolume service. +func (rs *ReplicationServer) DemoteVolume( + ctx context.Context, + req *proto.DemoteVolumeRequest) (*proto.DemoteVolumeResponse, error) { + // Get the secrets from the k8s cluster + data, err := kube.GetSecret(ctx, rs.kubeClient, req.GetSecretName(), req.GetSecretNamespace()) + if err != nil { + klog.Errorf("Failed to get secret %s in namespace %s: %v", req.GetSecretName(), req.GetSecretNamespace(), err) + return nil, status.Error(codes.Internal, err.Error()) + } + + _, err = rs.controllerClient.DemoteVolume(ctx, + &csiReplication.DemoteVolumeRequest{ + VolumeId: req.VolumeId, + ReplicationId: req.ReplicationId, + Force: req.Force, + Parameters: req.Parameters, + Secrets: data, + }) + if err != nil { + klog.Errorf("Failed to enable volume replication: %v", err) + return nil, err + } + + return &proto.DemoteVolumeResponse{}, nil +} + +// ResyncVolume fetches required information from kubernetes cluster and calls +// CSI-Addons ResyncVolume service. +func (rs *ReplicationServer) ResyncVolume( + ctx context.Context, + req *proto.ResyncVolumeRequest) (*proto.ResyncVolumeResponse, error) { + // Get the secrets from the k8s cluster + data, err := kube.GetSecret(ctx, rs.kubeClient, req.GetSecretName(), req.GetSecretNamespace()) + if err != nil { + klog.Errorf("Failed to get secret %s in namespace %s: %v", req.GetSecretName(), req.GetSecretNamespace(), err) + return nil, status.Error(codes.Internal, err.Error()) + } + + resp, err := rs.controllerClient.ResyncVolume(ctx, + &csiReplication.ResyncVolumeRequest{ + VolumeId: req.VolumeId, + ReplicationId: req.ReplicationId, + Force: req.Force, + Parameters: req.Parameters, + Secrets: data, + }) + if err != nil { + klog.Errorf("Failed to enable volume replication: %v", err) + return nil, err + } + + return &proto.ResyncVolumeResponse{ + Ready: resp.Ready, + }, nil +} + +// GetVolumeReplicationInfo fetches required information from kubernetes cluster and calls +// CSI-Addons GetVolumeReplicationInfo service. +func (rs *ReplicationServer) GetVolumeReplicationInfo( + ctx context.Context, + req *proto.GetVolumeReplicationInfoRequest) (*proto.GetVolumeReplicationInfoResponse, error) { + // Get the secrets from the k8s cluster + data, err := kube.GetSecret(ctx, rs.kubeClient, req.GetSecretName(), req.GetSecretNamespace()) + if err != nil { + klog.Errorf("Failed to get secret %s in namespace %s: %v", req.GetSecretName(), req.GetSecretNamespace(), err) + return nil, status.Error(codes.Internal, err.Error()) + } + + resp, err := rs.controllerClient.GetVolumeReplicationInfo(ctx, + &csiReplication.GetVolumeReplicationInfoRequest{ + VolumeId: req.VolumeId, + Secrets: data, + ReplicationId: req.ReplicationId, + }) + if err != nil { + klog.Errorf("Failed to get volume replication info: %v", err) + return nil, err + } + + lastsynctime := resp.GetLastSyncTime() + if lastsynctime == nil { + klog.Errorf("Failed to get last sync time: %v", lastsynctime) + } + + return &proto.GetVolumeReplicationInfoResponse{ + LastSyncTime: lastsynctime, + }, nil +} diff --git a/redhat/README.md b/redhat/README.md new file mode 100644 index 000000000..73888839e --- /dev/null +++ b/redhat/README.md @@ -0,0 +1,93 @@ +# ODF: kubernetes-csi-addons + +Repository where [csi-addons/kubernetes-csi-addons][upstream-k8s-csi-addons] is +maintained for the OpenShift Data Foundation product. + +## Git Repository + +### Branches + +This GitHub repository contains branches for different product versions. + +## Backports + +All changes in this repository are *backports* from the [upstream +project][https://github.com/ceph/ceph-csi]. There should be no functional +changes (only process/CI/building/..) in this repository compared to the +upstream project. Fixes for any of the release branches should first land in +the devel branch before they may be backported to the release branch. A +backport for the oldest release should also be backported to all the newer +releases in order to prevent re-introducing a bug when a user updates. + +### Sync `main` with upstream `csi-addons/kubernetes-csi-addons:main` + +Syncing branches (including the `main` branch) from upstream should be done +with a Pull-Request. To create a PR that syncs the latest changes from +`csi-addons/kubernetes-csi-addons:main` into the `main` branch, [click +here][sync-pr]. + +If any conflicts arises while syncing the latest changes from +`csi-addons/kubernetes-csi-addons:main` into the `main` branch, instead +rebase the downstream `main` branch on top of `csi-addons/kubernetes-csi-addons:main` +and resolve those conflicts. This will make sure the conflicts are resolved +in one of the `downstream-only` commits and will make further syncing of the +upstream changes seamless. + +### Backporting changes from the `main` to `release-*` branches + +Once a PR has been merged in the `main` branch that fixes an issue, a new PR +with the backport can be created. The easiest way is to use a command like + +``` +/cherry-pick release-4.10 +``` + +The **openshift-cherrypick-robot** will automatically create a new PR for the +selected branch. + +### Pull Requests + +Once the product planning enters feature freeze, only backports with related +Bugzilla references will be allowed to get merged. + +To assist developers, there are several Pull Request templates available. It is +recommended to use these links when creating a new Pull Request: + +- [backport][backport-pr]: `?template=redhat-backport.md` +- [downstream-only][ds-only-pr]: `?template=redhat-downstream-only.md` +- [sync][sync-pr]: or add `?template=redhat-sync.md` + +The `?template=...` appendix can be used when creating the Pull Requests +through other means than the links above. By appending the `?template=...` +keyword to the Pull Request URL, the template gets included automatically. + +### Downstream-Only Changes + +For working with the downstream tools, like OpenShift CI, there are a few +changes required that are not suitable for the upstream Ceph-CSI project. + +1. `OWNERS` file: added with maintainers for reviewing and approving PRs +1. `OWNERS_ALIASES` file: members of the Ceph-CSI team +1. `redhat/` directory: additional files (like this `README.md`) +1. `.github/PULL_REQUEST_TEMPLATE/redhat-*`: guidance for creating PRs + +## Continuous Integration + +OpenShift CI (Prow) is used for testing the changes that land in this GitHub +repository. The configuration of the jobs can be found in the [OpenShift +Release repository][ocp-release]. + +### Bugzilla Plugin + +PRs that need a Bugzilla reference are handled by the Bugzilla Plugin which +runs as part of Prow. The configuration gates the requirement on BZs to be +linked, before the tests will pass and the PR can be merged. Once a branch is +added to the GitHub repository, [the configuration][bz-config] needs adaption +for the new branch as well. + +[upstream-k8s-csi-addons]: https://github.com/csi-addons/kubernetes-csi-addons +[sync-pr]: https://github.com/red-hat-storage/kubernetes-csi-addons/compare/main...csi-addons:main?template=redhat-sync.md +[backport-pr]: https://github.com/red-hat-storage/kubernetes-csi-addons/compare/release-4.10...main?template=redhat-backport.md +[ds-only-pr]: https://github.com/red-hat-storage/kubernetes-csi-addons/compare/main...csi-addons:main?template=redhat-downstream-only.md +[ocp-release]: https://github.com/openshift/release/tree/master/ci-operator/config/red-hat-storage/kubernetes-csi-addons +[bz-config]: https://github.com/openshift/release/blob/master/core-services/prow/02_config/red-hat-storage/kubernetes-csi-addons/_pluginconfig.yaml diff --git a/sidecar/internal/csiaddonsnode/csiaddonsnode.go b/sidecar/internal/csiaddonsnode/csiaddonsnode.go index b4398747c..8e656447b 100644 --- a/sidecar/internal/csiaddonsnode/csiaddonsnode.go +++ b/sidecar/internal/csiaddonsnode/csiaddonsnode.go @@ -22,7 +22,7 @@ import ( "fmt" "time" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" "github.com/csi-addons/kubernetes-csi-addons/sidecar/internal/client" apierrors "k8s.io/apimachinery/pkg/api/errors" diff --git a/sidecar/internal/csiaddonsnode/csiaddonsnode_test.go b/sidecar/internal/csiaddonsnode/csiaddonsnode_test.go index 42ece1bf2..2d6db4ad1 100644 --- a/sidecar/internal/csiaddonsnode/csiaddonsnode_test.go +++ b/sidecar/internal/csiaddonsnode/csiaddonsnode_test.go @@ -20,7 +20,7 @@ import ( "reflect" "testing" - csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1" + csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/apis/csiaddons/v1alpha1" "github.com/csi-addons/kubernetes-csi-addons/sidecar/internal/client" "google.golang.org/grpc" diff --git a/sidecar/internal/server/server.go b/sidecar/internal/server/server.go index becf0873c..112554683 100644 --- a/sidecar/internal/server/server.go +++ b/sidecar/internal/server/server.go @@ -43,9 +43,10 @@ type SidecarServer struct { services []SidecarService } -// NewSidecarServer create a new SidecarServer on the given endpoint. The -// endpoint should be an ip address. Only tcp ports are supported. -func NewSidecarServer(endpoint string) *SidecarServer { +// NewSidecarServer create a new SidecarServer on the given IP-address and +// port. If the IP-address is an empty string, the server will listen on all +// available IP-addresses. Only tcp ports are supported. +func NewSidecarServer(ip, port string) *SidecarServer { ss := &SidecarServer{} if ss.services == nil { @@ -53,7 +54,7 @@ func NewSidecarServer(endpoint string) *SidecarServer { } ss.scheme = "tcp" - ss.endpoint = endpoint + ss.endpoint = ip + ":" + port return ss } @@ -77,7 +78,7 @@ func (ss *SidecarServer) Start() { listener, err := net.Listen(ss.scheme, ss.endpoint) if err != nil { - klog.Fatalf("failed to listen on %q: %w", listener.Addr(), err) + klog.Fatalf("failed to listen on %s (%s): %v", ss.endpoint, ss.scheme, err) } ss.serve(listener) diff --git a/sidecar/internal/util/util.go b/sidecar/internal/util/util.go index 7aaf83402..a3d1bfae8 100644 --- a/sidecar/internal/util/util.go +++ b/sidecar/internal/util/util.go @@ -17,22 +17,25 @@ limitations under the License. package util import ( + "errors" "fmt" "net" "strconv" ) +var ErrInvalidEndpoint = errors.New("invalid endpoint") + // ValidateControllerEndpoint validates given ip address and port, // returning valid endpoint containing both ip address and port. func ValidateControllerEndpoint(rawIP, rawPort string) (string, error) { ip := net.ParseIP(rawIP) if ip == nil { - return "", fmt.Errorf("invalid controller ip address %q", rawIP) + return "", fmt.Errorf("%w: invalid controller ip address %q", ErrInvalidEndpoint, rawIP) } - port, err := strconv.ParseUint(rawPort, 10, 16) + port, err := parsePort(rawPort) if err != nil { - return "", fmt.Errorf("invalid controller port %q: %w", rawPort, err) + return "", err } if ip.To4() != nil { @@ -41,3 +44,44 @@ func ValidateControllerEndpoint(rawIP, rawPort string) (string, error) { return fmt.Sprintf("[%s]:%d", ip.String(), port), nil } + +// BuildEndpointURL returns a URL formatted address of the pod that has this +// sidecar running. +// The format of the URL depends on the arguments passed to this function, it +// will return either +// - a ValidateControllerEndpoint() if rawIP is set +// - pod://: if pod is set, and rawIP and namespace are not set +// - pod://.: if pod, namespace are set, and rawIP not +func BuildEndpointURL(rawIP, rawPort, pod, namespace string) (string, error) { + if rawIP != "" { + return ValidateControllerEndpoint(rawIP, rawPort) + } + + if pod == "" && namespace == "" { + return "", fmt.Errorf("%w: missing IP-address or Pod and Namespace", ErrInvalidEndpoint) + } + + port, err := parsePort(rawPort) + if err != nil { + return "", err + } + + endpoint := "pod://" + pod + + // namespace is optional + if namespace != "" { + endpoint += "." + namespace + } + + return endpoint + fmt.Sprintf(":%d", port), nil +} + +// parsePort takes a network port as string and converts that to an integer. +func parsePort(rawPort string) (uint64, error) { + port, err := strconv.ParseUint(rawPort, 10, 16) + if err != nil { + return 0, fmt.Errorf("%w: invalid controller port %q: %v", ErrInvalidEndpoint, rawPort, err) + } + + return port, nil +} diff --git a/sidecar/main.go b/sidecar/main.go index 4b045273e..f1bd48341 100644 --- a/sidecar/main.go +++ b/sidecar/main.go @@ -53,7 +53,7 @@ func main() { } flag.Parse() - controllerEndpoint, err := util.ValidateControllerEndpoint(*controllerIP, *controllerPort) + controllerEndpoint, err := util.BuildEndpointURL(*controllerIP, *controllerPort, *podName, *podNamespace) if err != nil { klog.Fatalf("Failed to validate controller endpoint: %w", err) } @@ -92,10 +92,11 @@ func main() { klog.Fatalf("Failed to create csiaddonsnode: %v", err) } - sidecarServer := server.NewSidecarServer(controllerEndpoint) + sidecarServer := server.NewSidecarServer(*controllerIP, *controllerPort) sidecarServer.RegisterService(service.NewIdentityServer(csiClient.GetGRPCClient())) sidecarServer.RegisterService(service.NewReclaimSpaceServer(csiClient.GetGRPCClient(), kubeClient, *stagingPath)) sidecarServer.RegisterService(service.NewNetworkFenceServer(csiClient.GetGRPCClient(), kubeClient)) + sidecarServer.RegisterService(service.NewReplicationServer(csiClient.GetGRPCClient(), kubeClient)) sidecarServer.Start() } diff --git a/tools.go b/tools.go index 613f2abef..b6453f92c 100644 --- a/tools.go +++ b/tools.go @@ -26,6 +26,8 @@ package main import ( _ "github.com/operator-framework/operator-sdk/cmd/operator-sdk" + _ "google.golang.org/protobuf/cmd/protoc-gen-go" + _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" _ "sigs.k8s.io/controller-runtime/tools/setup-envtest" _ "sigs.k8s.io/controller-tools/cmd/controller-gen" _ "sigs.k8s.io/kustomize/kustomize/v4" diff --git a/vendor/cloud.google.com/go/LICENSE b/vendor/cloud.google.com/go/compute/LICENSE similarity index 100% rename from vendor/cloud.google.com/go/LICENSE rename to vendor/cloud.google.com/go/compute/LICENSE diff --git a/vendor/cloud.google.com/go/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go index 5dbe77cc7..50538b1d3 100644 --- a/vendor/cloud.google.com/go/compute/metadata/metadata.go +++ b/vendor/cloud.google.com/go/compute/metadata/metadata.go @@ -16,7 +16,7 @@ // metadata and API service accounts. // // This package is a wrapper around the GCE metadata service, -// as documented at https://developers.google.com/compute/docs/metadata. +// as documented at https://cloud.google.com/compute/docs/metadata/overview. package metadata // import "cloud.google.com/go/compute/metadata" import ( @@ -61,14 +61,19 @@ var ( instID = &cachedValue{k: "instance/id", trim: true} ) -var defaultClient = &Client{hc: &http.Client{ - Transport: &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 2 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - }, -}} +var defaultClient = &Client{hc: newDefaultHTTPClient()} + +func newDefaultHTTPClient() *http.Client { + return &http.Client{ + Transport: &http.Transport{ + Dial: (&net.Dialer{ + Timeout: 2 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + }, + Timeout: 5 * time.Second, + } +} // NotDefinedError is returned when requested metadata is not defined. // @@ -130,7 +135,7 @@ func testOnGCE() bool { go func() { req, _ := http.NewRequest("GET", "http://"+metadataIP, nil) req.Header.Set("User-Agent", userAgent) - res, err := defaultClient.hc.Do(req.WithContext(ctx)) + res, err := newDefaultHTTPClient().Do(req.WithContext(ctx)) if err != nil { resc <- false return @@ -140,7 +145,8 @@ func testOnGCE() bool { }() go func() { - addrs, err := net.DefaultResolver.LookupHost(ctx, "metadata.google.internal") + resolver := &net.Resolver{} + addrs, err := resolver.LookupHost(ctx, "metadata.google.internal") if err != nil || len(addrs) == 0 { resc <- false return diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/README.md b/vendor/github.com/Azure/go-autorest/autorest/adal/README.md index fec416a9c..b11eb0788 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/README.md +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/README.md @@ -1,3 +1,5 @@ +# NOTE: This module will go out of support by March 31, 2023. For authenticating with Azure AD, use module [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) instead. For help migrating from `adal` to `azidentiy` please consult the [migration guide](https://aka.ms/azsdk/go/identity/migration). General information about the retirement of this and other legacy modules can be found [here](https://azure.microsoft.com/updates/support-for-azure-sdk-libraries-that-do-not-conform-to-our-current-azure-sdk-guidelines-will-be-retired-as-of-31-march-2023/). + # Azure Active Directory authentication for Go This is a standalone package for authenticating with Azure Active @@ -18,7 +20,7 @@ go get -u github.com/Azure/go-autorest/autorest/adal ## Usage -An Active Directory application is required in order to use this library. An application can be registered in the [Azure Portal](https://portal.azure.com/) by following these [guidelines](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-integrating-applications) or using the [Azure CLI](https://github.com/Azure/azure-cli). +An Active Directory application is required in order to use this library. An application can be registered in the [Azure Portal](https://portal.azure.com/) by following these [guidelines](https://docs.microsoft.com/azure/active-directory/develop/active-directory-integrating-applications) or using the [Azure CLI](https://github.com/Azure/azure-cli). ### Register an Azure AD Application with secret @@ -88,7 +90,7 @@ An Active Directory application is required in order to use this library. An app ### Grant the necessary permissions Azure relies on a Role-Based Access Control (RBAC) model to manage the access to resources at a fine-grained -level. There is a set of [pre-defined roles](https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-built-in-roles) +level. There is a set of [pre-defined roles](https://docs.microsoft.com/azure/active-directory/role-based-access-built-in-roles) which can be assigned to a service principal of an Azure AD application depending of your needs. ``` @@ -104,7 +106,7 @@ It is also possible to define custom role definitions. az role definition create --role-definition role-definition.json ``` -* Check [custom roles](https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-control-custom-roles) for more details regarding the content of `role-definition.json` file. +* Check [custom roles](https://docs.microsoft.com/azure/active-directory/role-based-access-control-custom-roles) for more details regarding the content of `role-definition.json` file. ### Acquire Access Token diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go b/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go index 1826a68dc..eb649bce9 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go @@ -16,9 +16,11 @@ package adal import ( "crypto/tls" + "net" "net/http" "net/http/cookiejar" "sync" + "time" "github.com/Azure/go-autorest/tracing" ) @@ -72,15 +74,18 @@ func sender() Sender { // note that we can't init defaultSender in init() since it will // execute before calling code has had a chance to enable tracing defaultSenderInit.Do(func() { - // Use behaviour compatible with DefaultTransport, but require TLS minimum version. - defaultTransport := http.DefaultTransport.(*http.Transport) + // copied from http.DefaultTransport with a TLS minimum version. transport := &http.Transport{ - Proxy: defaultTransport.Proxy, - DialContext: defaultTransport.DialContext, - MaxIdleConns: defaultTransport.MaxIdleConns, - IdleConnTimeout: defaultTransport.IdleConnTimeout, - TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout, - ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout, + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, TLSClientConfig: &tls.Config{ MinVersion: tls.VersionTLS12, }, diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go index 20767178c..1a9c8ab53 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go @@ -365,6 +365,25 @@ func (secret ServicePrincipalAuthorizationCodeSecret) MarshalJSON() ([]byte, err }) } +// ServicePrincipalFederatedSecret implements ServicePrincipalSecret for Federated JWTs. +type ServicePrincipalFederatedSecret struct { + jwt string +} + +// SetAuthenticationValues is a method of the interface ServicePrincipalSecret. +// It will populate the form submitted during OAuth Token Acquisition using a JWT signed by an OIDC issuer. +func (secret *ServicePrincipalFederatedSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error { + + v.Set("client_assertion", secret.jwt) + v.Set("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer") + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (secret ServicePrincipalFederatedSecret) MarshalJSON() ([]byte, error) { + return nil, errors.New("marshalling ServicePrincipalFederatedSecret is not supported") +} + // ServicePrincipalToken encapsulates a Token created for a Service Principal. type ServicePrincipalToken struct { inner servicePrincipalToken @@ -419,6 +438,8 @@ func (spt *ServicePrincipalToken) UnmarshalJSON(data []byte) error { spt.inner.Secret = &ServicePrincipalUsernamePasswordSecret{} case "ServicePrincipalAuthorizationCodeSecret": spt.inner.Secret = &ServicePrincipalAuthorizationCodeSecret{} + case "ServicePrincipalFederatedSecret": + return errors.New("unmarshalling ServicePrincipalFederatedSecret is not supported") default: return fmt.Errorf("unrecognized token type '%s'", secret["type"]) } @@ -665,6 +686,31 @@ func NewServicePrincipalTokenFromAuthorizationCode(oauthConfig OAuthConfig, clie ) } +// NewServicePrincipalTokenFromFederatedToken creates a ServicePrincipalToken from the supplied federated OIDC JWT. +func NewServicePrincipalTokenFromFederatedToken(oauthConfig OAuthConfig, clientID string, jwt string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + if err := validateOAuthConfig(oauthConfig); err != nil { + return nil, err + } + if err := validateStringParam(clientID, "clientID"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + if jwt == "" { + return nil, fmt.Errorf("parameter 'jwt' cannot be empty") + } + return NewServicePrincipalTokenWithSecret( + oauthConfig, + clientID, + resource, + &ServicePrincipalFederatedSecret{ + jwt: jwt, + }, + callbacks..., + ) +} + type msiType int const ( @@ -676,8 +722,6 @@ const ( func (m msiType) String() string { switch m { - case msiTypeUnavailable: - return "unavailable" case msiTypeAppServiceV20170901: return "AppServiceV20170901" case msiTypeCloudShell: @@ -699,13 +743,9 @@ func getMSIType() (msiType, string, error) { } // if ONLY the env var MSI_ENDPOINT is set the msiType is CloudShell return msiTypeCloudShell, endpointEnvVar, nil - } else if msiAvailableHook(context.Background(), sender()) { - // if MSI_ENDPOINT is NOT set AND the IMDS endpoint is available the msiType is IMDS. This will timeout after 500 milliseconds - return msiTypeIMDS, msiEndpoint, nil - } else { - // if MSI_ENDPOINT is NOT set and IMDS endpoint is not available Managed Identity is not available - return msiTypeUnavailable, "", errors.New("MSI not available") } + // if MSI_ENDPOINT is NOT set assume the msiType is IMDS + return msiTypeIMDS, msiEndpoint, nil } // GetMSIVMEndpoint gets the MSI endpoint on Virtual Machines. @@ -1064,8 +1104,8 @@ func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource // AAD returns expires_in as a string, ADFS returns it as an int ExpiresIn json.Number `json:"expires_in"` - // expires_on can be in two formats, a UTC time stamp or the number of seconds. - ExpiresOn string `json:"expires_on"` + // expires_on can be in three formats, a UTC time stamp, or the number of seconds as a string *or* int. + ExpiresOn interface{} `json:"expires_on"` NotBefore json.Number `json:"not_before"` Resource string `json:"resource"` @@ -1078,7 +1118,7 @@ func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource } expiresOn := json.Number("") // ADFS doesn't include the expires_on field - if token.ExpiresOn != "" { + if token.ExpiresOn != nil { if expiresOn, err = parseExpiresOn(token.ExpiresOn); err != nil { return newTokenRefreshError(fmt.Sprintf("adal: failed to parse expires_on: %v value '%s'", err, token.ExpiresOn), resp) } @@ -1095,18 +1135,27 @@ func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource } // converts expires_on to the number of seconds -func parseExpiresOn(s string) (json.Number, error) { - // convert the expiration date to the number of seconds from now +func parseExpiresOn(s interface{}) (json.Number, error) { + // the JSON unmarshaler treats JSON numbers unmarshaled into an interface{} as float64 + asFloat64, ok := s.(float64) + if ok { + // this is the number of seconds as int case + return json.Number(strconv.FormatInt(int64(asFloat64), 10)), nil + } + asStr, ok := s.(string) + if !ok { + return "", fmt.Errorf("unexpected expires_on type %T", s) + } + // convert the expiration date to the number of seconds from the unix epoch timeToDuration := func(t time.Time) json.Number { - dur := t.Sub(time.Now().UTC()) - return json.Number(strconv.FormatInt(int64(dur.Round(time.Second).Seconds()), 10)) + return json.Number(strconv.FormatInt(t.UTC().Unix(), 10)) } - if _, err := strconv.ParseInt(s, 10, 64); err == nil { + if _, err := json.Number(asStr).Int64(); err == nil { // this is the number of seconds case, no conversion required - return json.Number(s), nil - } else if eo, err := time.Parse(expiresOnDateFormatPM, s); err == nil { + return json.Number(asStr), nil + } else if eo, err := time.Parse(expiresOnDateFormatPM, asStr); err == nil { return timeToDuration(eo), nil - } else if eo, err := time.Parse(expiresOnDateFormat, s); err == nil { + } else if eo, err := time.Parse(expiresOnDateFormat, asStr); err == nil { return timeToDuration(eo), nil } else { // unknown format @@ -1322,15 +1371,26 @@ func NewMultiTenantServicePrincipalTokenFromCertificate(multiTenantCfg MultiTena } // MSIAvailable returns true if the MSI endpoint is available for authentication. -func MSIAvailable(ctx context.Context, sender Sender) bool { - resp, err := getMSIEndpoint(ctx, sender) +func MSIAvailable(ctx context.Context, s Sender) bool { + msiType, _, err := getMSIType() + + if err != nil { + return false + } + + if msiType != msiTypeIMDS { + return true + } + + if s == nil { + s = sender() + } + + resp, err := getMSIEndpoint(ctx, s) + if err == nil { resp.Body.Close() } - return err == nil -} -// used for testing purposes -var msiAvailableHook = func(ctx context.Context, sender Sender) bool { - return MSIAvailable(ctx, sender) + return err == nil } diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go index aa5ea47d9..89190a421 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go @@ -25,7 +25,7 @@ import ( ) func getMSIEndpoint(ctx context.Context, sender Sender) (*http.Response, error) { - tempCtx, cancel := context.WithTimeout(ctx, 500*time.Millisecond) + tempCtx, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() // http.NewRequestWithContext() was added in Go 1.13 req, _ := http.NewRequestWithContext(tempCtx, http.MethodGet, msiEndpoint, nil) diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go index 6a4690a25..27ec4efad 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go @@ -24,7 +24,7 @@ import ( ) func getMSIEndpoint(ctx context.Context, sender Sender) (*http.Response, error) { - tempCtx, cancel := context.WithTimeout(ctx, 500*time.Millisecond) + tempCtx, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() req, _ := http.NewRequest(http.MethodGet, msiEndpoint, nil) req = req.WithContext(tempCtx) diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go index b6c6314f0..1328f1764 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go @@ -68,7 +68,7 @@ func (se ServiceError) Error() string { if err != nil { result += fmt.Sprintf(" Details=%v", se.Details) } - result += fmt.Sprintf(" Details=%v", string(d)) + result += fmt.Sprintf(" Details=%s", d) } if se.InnerError != nil { @@ -76,7 +76,7 @@ func (se ServiceError) Error() string { if err != nil { result += fmt.Sprintf(" InnerError=%v", se.InnerError) } - result += fmt.Sprintf(" InnerError=%v", string(d)) + result += fmt.Sprintf(" InnerError=%s", d) } if se.AdditionalInfo != nil { @@ -84,7 +84,7 @@ func (se ServiceError) Error() string { if err != nil { result += fmt.Sprintf(" AdditionalInfo=%v", se.AdditionalInfo) } - result += fmt.Sprintf(" AdditionalInfo=%v", string(d)) + result += fmt.Sprintf(" AdditionalInfo=%s", d) } return result @@ -335,13 +335,13 @@ func WithErrorUnlessStatusCode(codes ...int) autorest.RespondDecorator { b, decodeErr := autorest.CopyAndDecode(encodedAs, resp.Body, &e) resp.Body = ioutil.NopCloser(&b) if decodeErr != nil { - return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), decodeErr) + return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b, decodeErr) } if e.ServiceError == nil { // Check if error is unwrapped ServiceError decoder := autorest.NewDecoder(encodedAs, bytes.NewReader(b.Bytes())) if err := decoder.Decode(&e.ServiceError); err != nil { - return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), err) + return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b, err) } // for example, should the API return the literal value `null` as the response @@ -364,7 +364,7 @@ func WithErrorUnlessStatusCode(codes ...int) autorest.RespondDecorator { rawBody := map[string]interface{}{} decoder := autorest.NewDecoder(encodedAs, bytes.NewReader(b.Bytes())) if err := decoder.Decode(&rawBody); err != nil { - return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), err) + return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b, err) } e.ServiceError = &ServiceError{ diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go b/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go index 3b61a2b6e..b0a53769f 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go @@ -34,8 +34,10 @@ const ( var environments = map[string]Environment{ "AZURECHINACLOUD": ChinaCloud, "AZUREGERMANCLOUD": GermanCloud, + "AZURECLOUD": PublicCloud, "AZUREPUBLICCLOUD": PublicCloud, - "AZUREUSGOVERNMENTCLOUD": USGovernmentCloud, + "AZUREUSGOVERNMENT": USGovernmentCloud, + "AZUREUSGOVERNMENTCLOUD": USGovernmentCloud, //TODO: deprecate } // ResourceIdentifier contains a set of Azure resource IDs. @@ -49,6 +51,10 @@ type ResourceIdentifier struct { Storage string `json:"storage"` Synapse string `json:"synapse"` ServiceBus string `json:"serviceBus"` + SQLDatabase string `json:"sqlDatabase"` + CosmosDB string `json:"cosmosDB"` + ManagedHSM string `json:"managedHSM"` + MicrosoftGraph string `json:"microsoftGraph"` } // Environment represents a set of endpoints for each of Azure's Clouds. @@ -61,9 +67,11 @@ type Environment struct { ActiveDirectoryEndpoint string `json:"activeDirectoryEndpoint"` GalleryEndpoint string `json:"galleryEndpoint"` KeyVaultEndpoint string `json:"keyVaultEndpoint"` + ManagedHSMEndpoint string `json:"managedHSMEndpoint"` GraphEndpoint string `json:"graphEndpoint"` ServiceBusEndpoint string `json:"serviceBusEndpoint"` BatchManagementEndpoint string `json:"batchManagementEndpoint"` + MicrosoftGraphEndpoint string `json:"microsoftGraphEndpoint"` StorageEndpointSuffix string `json:"storageEndpointSuffix"` CosmosDBDNSSuffix string `json:"cosmosDBDNSSuffix"` MariaDBDNSSuffix string `json:"mariaDBDNSSuffix"` @@ -72,6 +80,7 @@ type Environment struct { SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"` TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"` KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"` + ManagedHSMDNSSuffix string `json:"managedHSMDNSSuffix"` ServiceBusEndpointSuffix string `json:"serviceBusEndpointSuffix"` ServiceManagementVMDNSSuffix string `json:"serviceManagementVMDNSSuffix"` ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"` @@ -79,6 +88,7 @@ type Environment struct { TokenAudience string `json:"tokenAudience"` APIManagementHostNameSuffix string `json:"apiManagementHostNameSuffix"` SynapseEndpointSuffix string `json:"synapseEndpointSuffix"` + DatalakeSuffix string `json:"datalakeSuffix"` ResourceIdentifiers ResourceIdentifier `json:"resourceIdentifiers"` } @@ -93,9 +103,11 @@ var ( ActiveDirectoryEndpoint: "https://login.microsoftonline.com/", GalleryEndpoint: "https://gallery.azure.com/", KeyVaultEndpoint: "https://vault.azure.net/", + ManagedHSMEndpoint: "https://managedhsm.azure.net/", GraphEndpoint: "https://graph.windows.net/", ServiceBusEndpoint: "https://servicebus.windows.net/", BatchManagementEndpoint: "https://batch.core.windows.net/", + MicrosoftGraphEndpoint: "https://graph.microsoft.com/", StorageEndpointSuffix: "core.windows.net", CosmosDBDNSSuffix: "documents.azure.com", MariaDBDNSSuffix: "mariadb.database.azure.com", @@ -104,6 +116,7 @@ var ( SQLDatabaseDNSSuffix: "database.windows.net", TrafficManagerDNSSuffix: "trafficmanager.net", KeyVaultDNSSuffix: "vault.azure.net", + ManagedHSMDNSSuffix: "managedhsm.azure.net", ServiceBusEndpointSuffix: "servicebus.windows.net", ServiceManagementVMDNSSuffix: "cloudapp.net", ResourceManagerVMDNSSuffix: "cloudapp.azure.com", @@ -111,6 +124,7 @@ var ( TokenAudience: "https://management.azure.com/", APIManagementHostNameSuffix: "azure-api.net", SynapseEndpointSuffix: "dev.azuresynapse.net", + DatalakeSuffix: "azuredatalakestore.net", ResourceIdentifiers: ResourceIdentifier{ Graph: "https://graph.windows.net/", KeyVault: "https://vault.azure.net", @@ -121,6 +135,10 @@ var ( Storage: "https://storage.azure.com/", Synapse: "https://dev.azuresynapse.net", ServiceBus: "https://servicebus.azure.net/", + SQLDatabase: "https://database.windows.net/", + CosmosDB: "https://cosmos.azure.com", + ManagedHSM: "https://managedhsm.azure.net", + MicrosoftGraph: "https://graph.microsoft.com/", }, } @@ -134,9 +152,11 @@ var ( ActiveDirectoryEndpoint: "https://login.microsoftonline.us/", GalleryEndpoint: "https://gallery.usgovcloudapi.net/", KeyVaultEndpoint: "https://vault.usgovcloudapi.net/", + ManagedHSMEndpoint: NotAvailable, GraphEndpoint: "https://graph.windows.net/", ServiceBusEndpoint: "https://servicebus.usgovcloudapi.net/", BatchManagementEndpoint: "https://batch.core.usgovcloudapi.net/", + MicrosoftGraphEndpoint: "https://graph.microsoft.us/", StorageEndpointSuffix: "core.usgovcloudapi.net", CosmosDBDNSSuffix: "documents.azure.us", MariaDBDNSSuffix: "mariadb.database.usgovcloudapi.net", @@ -145,13 +165,15 @@ var ( SQLDatabaseDNSSuffix: "database.usgovcloudapi.net", TrafficManagerDNSSuffix: "usgovtrafficmanager.net", KeyVaultDNSSuffix: "vault.usgovcloudapi.net", + ManagedHSMDNSSuffix: NotAvailable, ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net", ServiceManagementVMDNSSuffix: "usgovcloudapp.net", ResourceManagerVMDNSSuffix: "cloudapp.usgovcloudapi.net", ContainerRegistryDNSSuffix: "azurecr.us", TokenAudience: "https://management.usgovcloudapi.net/", APIManagementHostNameSuffix: "azure-api.us", - SynapseEndpointSuffix: NotAvailable, + SynapseEndpointSuffix: "dev.azuresynapse.usgovcloudapi.net", + DatalakeSuffix: NotAvailable, ResourceIdentifiers: ResourceIdentifier{ Graph: "https://graph.windows.net/", KeyVault: "https://vault.usgovcloudapi.net", @@ -160,8 +182,12 @@ var ( OperationalInsights: "https://api.loganalytics.us", OSSRDBMS: "https://ossrdbms-aad.database.usgovcloudapi.net", Storage: "https://storage.azure.com/", - Synapse: NotAvailable, + Synapse: "https://dev.azuresynapse.usgovcloudapi.net", ServiceBus: "https://servicebus.azure.net/", + SQLDatabase: "https://database.usgovcloudapi.net/", + CosmosDB: "https://cosmos.azure.com", + ManagedHSM: NotAvailable, + MicrosoftGraph: "https://graph.microsoft.us/", }, } @@ -175,9 +201,11 @@ var ( ActiveDirectoryEndpoint: "https://login.chinacloudapi.cn/", GalleryEndpoint: "https://gallery.chinacloudapi.cn/", KeyVaultEndpoint: "https://vault.azure.cn/", + ManagedHSMEndpoint: NotAvailable, GraphEndpoint: "https://graph.chinacloudapi.cn/", ServiceBusEndpoint: "https://servicebus.chinacloudapi.cn/", BatchManagementEndpoint: "https://batch.chinacloudapi.cn/", + MicrosoftGraphEndpoint: "https://microsoftgraph.chinacloudapi.cn/", StorageEndpointSuffix: "core.chinacloudapi.cn", CosmosDBDNSSuffix: "documents.azure.cn", MariaDBDNSSuffix: "mariadb.database.chinacloudapi.cn", @@ -186,6 +214,7 @@ var ( SQLDatabaseDNSSuffix: "database.chinacloudapi.cn", TrafficManagerDNSSuffix: "trafficmanager.cn", KeyVaultDNSSuffix: "vault.azure.cn", + ManagedHSMDNSSuffix: NotAvailable, ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn", ServiceManagementVMDNSSuffix: "chinacloudapp.cn", ResourceManagerVMDNSSuffix: "cloudapp.chinacloudapi.cn", @@ -193,6 +222,7 @@ var ( TokenAudience: "https://management.chinacloudapi.cn/", APIManagementHostNameSuffix: "azure-api.cn", SynapseEndpointSuffix: "dev.azuresynapse.azure.cn", + DatalakeSuffix: NotAvailable, ResourceIdentifiers: ResourceIdentifier{ Graph: "https://graph.chinacloudapi.cn/", KeyVault: "https://vault.azure.cn", @@ -203,6 +233,10 @@ var ( Storage: "https://storage.azure.com/", Synapse: "https://dev.azuresynapse.net", ServiceBus: "https://servicebus.azure.net/", + SQLDatabase: "https://database.chinacloudapi.cn/", + CosmosDB: "https://cosmos.azure.com", + ManagedHSM: NotAvailable, + MicrosoftGraph: "https://microsoftgraph.chinacloudapi.cn", }, } @@ -216,9 +250,11 @@ var ( ActiveDirectoryEndpoint: "https://login.microsoftonline.de/", GalleryEndpoint: "https://gallery.cloudapi.de/", KeyVaultEndpoint: "https://vault.microsoftazure.de/", + ManagedHSMEndpoint: NotAvailable, GraphEndpoint: "https://graph.cloudapi.de/", ServiceBusEndpoint: "https://servicebus.cloudapi.de/", BatchManagementEndpoint: "https://batch.cloudapi.de/", + MicrosoftGraphEndpoint: NotAvailable, StorageEndpointSuffix: "core.cloudapi.de", CosmosDBDNSSuffix: "documents.microsoftazure.de", MariaDBDNSSuffix: "mariadb.database.cloudapi.de", @@ -227,6 +263,7 @@ var ( SQLDatabaseDNSSuffix: "database.cloudapi.de", TrafficManagerDNSSuffix: "azuretrafficmanager.de", KeyVaultDNSSuffix: "vault.microsoftazure.de", + ManagedHSMDNSSuffix: NotAvailable, ServiceBusEndpointSuffix: "servicebus.cloudapi.de", ServiceManagementVMDNSSuffix: "azurecloudapp.de", ResourceManagerVMDNSSuffix: "cloudapp.microsoftazure.de", @@ -234,6 +271,7 @@ var ( TokenAudience: "https://management.microsoftazure.de/", APIManagementHostNameSuffix: NotAvailable, SynapseEndpointSuffix: NotAvailable, + DatalakeSuffix: NotAvailable, ResourceIdentifiers: ResourceIdentifier{ Graph: "https://graph.cloudapi.de/", KeyVault: "https://vault.microsoftazure.de", @@ -244,6 +282,10 @@ var ( Storage: "https://storage.azure.com/", Synapse: NotAvailable, ServiceBus: "https://servicebus.azure.net/", + SQLDatabase: "https://database.cloudapi.de/", + CosmosDB: "https://cosmos.azure.com", + ManagedHSM: NotAvailable, + MicrosoftGraph: NotAvailable, }, } ) diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go b/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go index c6d39f686..5b52357f9 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go @@ -64,7 +64,7 @@ func DoRetryWithRegistration(client autorest.Client) autorest.SendDecorator { if re.ServiceError != nil && re.ServiceError.Code == "MissingSubscriptionRegistration" { regErr := register(client, r, re) if regErr != nil { - return resp, fmt.Errorf("failed auto registering Resource Provider: %s. Original error: %s", regErr, err) + return resp, fmt.Errorf("failed auto registering Resource Provider: %s. Original error: %w", regErr, err) } } } diff --git a/vendor/github.com/Azure/go-autorest/autorest/preparer.go b/vendor/github.com/Azure/go-autorest/autorest/preparer.go index 98574a415..121a66fa8 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/preparer.go +++ b/vendor/github.com/Azure/go-autorest/autorest/preparer.go @@ -241,6 +241,8 @@ func WithBaseURL(baseURL string) PrepareDecorator { return r, fmt.Errorf("autorest: No scheme detected in URL %s", baseURL) } if u.RawQuery != "" { + // handle unencoded semicolons (ideally the server would send them already encoded) + u.RawQuery = strings.Replace(u.RawQuery, ";", "%3B", -1) q, err := url.ParseQuery(u.RawQuery) if err != nil { return r, err diff --git a/vendor/github.com/Azure/go-autorest/autorest/sender.go b/vendor/github.com/Azure/go-autorest/autorest/sender.go index 7a495f732..118de8141 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/sender.go +++ b/vendor/github.com/Azure/go-autorest/autorest/sender.go @@ -20,6 +20,7 @@ import ( "fmt" "log" "math" + "net" "net/http" "net/http/cookiejar" "strconv" @@ -129,15 +130,18 @@ func sender(renengotiation tls.RenegotiationSupport) Sender { // note that we can't init defaultSenders in init() since it will // execute before calling code has had a chance to enable tracing defaultSenders[renengotiation].init.Do(func() { - // Use behaviour compatible with DefaultTransport, but require TLS minimum version. - defaultTransport := http.DefaultTransport.(*http.Transport) + // copied from http.DefaultTransport with a TLS minimum version. transport := &http.Transport{ - Proxy: defaultTransport.Proxy, - DialContext: defaultTransport.DialContext, - MaxIdleConns: defaultTransport.MaxIdleConns, - IdleConnTimeout: defaultTransport.IdleConnTimeout, - TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout, - ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout, + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, TLSClientConfig: &tls.Config{ MinVersion: tls.VersionTLS12, Renegotiation: renengotiation, diff --git a/vendor/github.com/PuerkitoBio/purell/.gitignore b/vendor/github.com/PuerkitoBio/purell/.gitignore deleted file mode 100644 index 748e4c807..000000000 --- a/vendor/github.com/PuerkitoBio/purell/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.sublime-* -.DS_Store -*.swp -*.swo -tags diff --git a/vendor/github.com/PuerkitoBio/purell/.travis.yml b/vendor/github.com/PuerkitoBio/purell/.travis.yml deleted file mode 100644 index cf31e6af6..000000000 --- a/vendor/github.com/PuerkitoBio/purell/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go - -go: - - 1.4.x - - 1.5.x - - 1.6.x - - 1.7.x - - 1.8.x - - 1.9.x - - "1.10.x" - - "1.11.x" - - tip diff --git a/vendor/github.com/PuerkitoBio/purell/LICENSE b/vendor/github.com/PuerkitoBio/purell/LICENSE deleted file mode 100644 index 4b9986dea..000000000 --- a/vendor/github.com/PuerkitoBio/purell/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2012, Martin Angers -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/PuerkitoBio/purell/README.md b/vendor/github.com/PuerkitoBio/purell/README.md deleted file mode 100644 index 07de0c498..000000000 --- a/vendor/github.com/PuerkitoBio/purell/README.md +++ /dev/null @@ -1,188 +0,0 @@ -# Purell - -Purell is a tiny Go library to normalize URLs. It returns a pure URL. Pure-ell. Sanitizer and all. Yeah, I know... - -Based on the [wikipedia paper][wiki] and the [RFC 3986 document][rfc]. - -[![build status](https://travis-ci.org/PuerkitoBio/purell.svg?branch=master)](http://travis-ci.org/PuerkitoBio/purell) - -## Install - -`go get github.com/PuerkitoBio/purell` - -## Changelog - -* **v1.1.1** : Fix failing test due to Go1.12 changes (thanks to @ianlancetaylor). -* **2016-11-14 (v1.1.0)** : IDN: Conform to RFC 5895: Fold character width (thanks to @beeker1121). -* **2016-07-27 (v1.0.0)** : Normalize IDN to ASCII (thanks to @zenovich). -* **2015-02-08** : Add fix for relative paths issue ([PR #5][pr5]) and add fix for unnecessary encoding of reserved characters ([see issue #7][iss7]). -* **v0.2.0** : Add benchmarks, Attempt IDN support. -* **v0.1.0** : Initial release. - -## Examples - -From `example_test.go` (note that in your code, you would import "github.com/PuerkitoBio/purell", and would prefix references to its methods and constants with "purell."): - -```go -package purell - -import ( - "fmt" - "net/url" -) - -func ExampleNormalizeURLString() { - if normalized, err := NormalizeURLString("hTTp://someWEBsite.com:80/Amazing%3f/url/", - FlagLowercaseScheme|FlagLowercaseHost|FlagUppercaseEscapes); err != nil { - panic(err) - } else { - fmt.Print(normalized) - } - // Output: http://somewebsite.com:80/Amazing%3F/url/ -} - -func ExampleMustNormalizeURLString() { - normalized := MustNormalizeURLString("hTTpS://someWEBsite.com:443/Amazing%fa/url/", - FlagsUnsafeGreedy) - fmt.Print(normalized) - - // Output: http://somewebsite.com/Amazing%FA/url -} - -func ExampleNormalizeURL() { - if u, err := url.Parse("Http://SomeUrl.com:8080/a/b/.././c///g?c=3&a=1&b=9&c=0#target"); err != nil { - panic(err) - } else { - normalized := NormalizeURL(u, FlagsUsuallySafeGreedy|FlagRemoveDuplicateSlashes|FlagRemoveFragment) - fmt.Print(normalized) - } - - // Output: http://someurl.com:8080/a/c/g?c=3&a=1&b=9&c=0 -} -``` - -## API - -As seen in the examples above, purell offers three methods, `NormalizeURLString(string, NormalizationFlags) (string, error)`, `MustNormalizeURLString(string, NormalizationFlags) (string)` and `NormalizeURL(*url.URL, NormalizationFlags) (string)`. They all normalize the provided URL based on the specified flags. Here are the available flags: - -```go -const ( - // Safe normalizations - FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1 - FlagLowercaseHost // http://HOST -> http://host - FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF - FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA - FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$ - FlagRemoveDefaultPort // http://host:80 -> http://host - FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path - - // Usually safe normalizations - FlagRemoveTrailingSlash // http://host/path/ -> http://host/path - FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags) - FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c - - // Unsafe normalizations - FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/ - FlagRemoveFragment // http://host/path#fragment -> http://host/path - FlagForceHTTP // https://host -> http://host - FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b - FlagRemoveWWW // http://www.host/ -> http://host/ - FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags) - FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3 - - // Normalizations not in the wikipedia article, required to cover tests cases - // submitted by jehiah - FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147 - FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147 - FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147 - FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path - FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path - - // Convenience set of safe normalizations - FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator - - // For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags, - // while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix". - - // Convenience set of usually safe normalizations (includes FlagsSafe) - FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments - FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments - - // Convenience set of unsafe normalizations (includes FlagsUsuallySafe) - FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery - FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery - - // Convenience set of all available flags - FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator - FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator -) -``` - -For convenience, the set of flags `FlagsSafe`, `FlagsUsuallySafe[Greedy|NonGreedy]`, `FlagsUnsafe[Greedy|NonGreedy]` and `FlagsAll[Greedy|NonGreedy]` are provided for the similarly grouped normalizations on [wikipedia's URL normalization page][wiki]. You can add (using the bitwise OR `|` operator) or remove (using the bitwise AND NOT `&^` operator) individual flags from the sets if required, to build your own custom set. - -The [full godoc reference is available on gopkgdoc][godoc]. - -Some things to note: - -* `FlagDecodeUnnecessaryEscapes`, `FlagEncodeNecessaryEscapes`, `FlagUppercaseEscapes` and `FlagRemoveEmptyQuerySeparator` are always implicitly set, because internally, the URL string is parsed as an URL object, which automatically decodes unnecessary escapes, uppercases and encodes necessary ones, and removes empty query separators (an unnecessary `?` at the end of the url). So this operation cannot **not** be done. For this reason, `FlagRemoveEmptyQuerySeparator` (as well as the other three) has been included in the `FlagsSafe` convenience set, instead of `FlagsUnsafe`, where Wikipedia puts it. - -* The `FlagDecodeUnnecessaryEscapes` decodes the following escapes (*from -> to*): - - %24 -> $ - - %26 -> & - - %2B-%3B -> +,-./0123456789:; - - %3D -> = - - %40-%5A -> @ABCDEFGHIJKLMNOPQRSTUVWXYZ - - %5F -> _ - - %61-%7A -> abcdefghijklmnopqrstuvwxyz - - %7E -> ~ - - -* When the `NormalizeURL` function is used (passing an URL object), this source URL object is modified (that is, after the call, the URL object will be modified to reflect the normalization). - -* The *replace IP with domain name* normalization (`http://208.77.188.166/ → http://www.example.com/`) is obviously not possible for a library without making some network requests. This is not implemented in purell. - -* The *remove unused query string parameters* and *remove default query parameters* are also not implemented, since this is a very case-specific normalization, and it is quite trivial to do with an URL object. - -### Safe vs Usually Safe vs Unsafe - -Purell allows you to control the level of risk you take while normalizing an URL. You can aggressively normalize, play it totally safe, or anything in between. - -Consider the following URL: - -`HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid` - -Normalizing with the `FlagsSafe` gives: - -`https://www.root.com/toto/tE%1F///a/./b/../c/?z=3&w=2&a=4&w=1#invalid` - -With the `FlagsUsuallySafeGreedy`: - -`https://www.root.com/toto/tE%1F///a/c?z=3&w=2&a=4&w=1#invalid` - -And with `FlagsUnsafeGreedy`: - -`http://root.com/toto/tE%1F/a/c?a=4&w=1&w=2&z=3` - -## TODOs - -* Add a class/default instance to allow specifying custom directory index names? At the moment, removing directory index removes `(^|/)((?:default|index)\.\w{1,4})$`. - -## Thanks / Contributions - -@rogpeppe -@jehiah -@opennota -@pchristopher1275 -@zenovich -@beeker1121 - -## License - -The [BSD 3-Clause license][bsd]. - -[bsd]: http://opensource.org/licenses/BSD-3-Clause -[wiki]: http://en.wikipedia.org/wiki/URL_normalization -[rfc]: http://tools.ietf.org/html/rfc3986#section-6 -[godoc]: http://go.pkgdoc.org/github.com/PuerkitoBio/purell -[pr5]: https://github.com/PuerkitoBio/purell/pull/5 -[iss7]: https://github.com/PuerkitoBio/purell/issues/7 diff --git a/vendor/github.com/PuerkitoBio/purell/purell.go b/vendor/github.com/PuerkitoBio/purell/purell.go deleted file mode 100644 index 6d0fc190a..000000000 --- a/vendor/github.com/PuerkitoBio/purell/purell.go +++ /dev/null @@ -1,379 +0,0 @@ -/* -Package purell offers URL normalization as described on the wikipedia page: -http://en.wikipedia.org/wiki/URL_normalization -*/ -package purell - -import ( - "bytes" - "fmt" - "net/url" - "regexp" - "sort" - "strconv" - "strings" - - "github.com/PuerkitoBio/urlesc" - "golang.org/x/net/idna" - "golang.org/x/text/unicode/norm" - "golang.org/x/text/width" -) - -// A set of normalization flags determines how a URL will -// be normalized. -type NormalizationFlags uint - -const ( - // Safe normalizations - FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1 - FlagLowercaseHost // http://HOST -> http://host - FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF - FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA - FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$ - FlagRemoveDefaultPort // http://host:80 -> http://host - FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path - - // Usually safe normalizations - FlagRemoveTrailingSlash // http://host/path/ -> http://host/path - FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags) - FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c - - // Unsafe normalizations - FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/ - FlagRemoveFragment // http://host/path#fragment -> http://host/path - FlagForceHTTP // https://host -> http://host - FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b - FlagRemoveWWW // http://www.host/ -> http://host/ - FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags) - FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3 - - // Normalizations not in the wikipedia article, required to cover tests cases - // submitted by jehiah - FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147 - FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147 - FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147 - FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path - FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path - - // Convenience set of safe normalizations - FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator - - // For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags, - // while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix". - - // Convenience set of usually safe normalizations (includes FlagsSafe) - FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments - FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments - - // Convenience set of unsafe normalizations (includes FlagsUsuallySafe) - FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery - FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery - - // Convenience set of all available flags - FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator - FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator -) - -const ( - defaultHttpPort = ":80" - defaultHttpsPort = ":443" -) - -// Regular expressions used by the normalizations -var rxPort = regexp.MustCompile(`(:\d+)/?$`) -var rxDirIndex = regexp.MustCompile(`(^|/)((?:default|index)\.\w{1,4})$`) -var rxDupSlashes = regexp.MustCompile(`/{2,}`) -var rxDWORDHost = regexp.MustCompile(`^(\d+)((?:\.+)?(?:\:\d*)?)$`) -var rxOctalHost = regexp.MustCompile(`^(0\d*)\.(0\d*)\.(0\d*)\.(0\d*)((?:\.+)?(?:\:\d*)?)$`) -var rxHexHost = regexp.MustCompile(`^0x([0-9A-Fa-f]+)((?:\.+)?(?:\:\d*)?)$`) -var rxHostDots = regexp.MustCompile(`^(.+?)(:\d+)?$`) -var rxEmptyPort = regexp.MustCompile(`:+$`) - -// Map of flags to implementation function. -// FlagDecodeUnnecessaryEscapes has no action, since it is done automatically -// by parsing the string as an URL. Same for FlagUppercaseEscapes and FlagRemoveEmptyQuerySeparator. - -// Since maps have undefined traversing order, make a slice of ordered keys -var flagsOrder = []NormalizationFlags{ - FlagLowercaseScheme, - FlagLowercaseHost, - FlagRemoveDefaultPort, - FlagRemoveDirectoryIndex, - FlagRemoveDotSegments, - FlagRemoveFragment, - FlagForceHTTP, // Must be after remove default port (because https=443/http=80) - FlagRemoveDuplicateSlashes, - FlagRemoveWWW, - FlagAddWWW, - FlagSortQuery, - FlagDecodeDWORDHost, - FlagDecodeOctalHost, - FlagDecodeHexHost, - FlagRemoveUnnecessaryHostDots, - FlagRemoveEmptyPortSeparator, - FlagRemoveTrailingSlash, // These two (add/remove trailing slash) must be last - FlagAddTrailingSlash, -} - -// ... and then the map, where order is unimportant -var flags = map[NormalizationFlags]func(*url.URL){ - FlagLowercaseScheme: lowercaseScheme, - FlagLowercaseHost: lowercaseHost, - FlagRemoveDefaultPort: removeDefaultPort, - FlagRemoveDirectoryIndex: removeDirectoryIndex, - FlagRemoveDotSegments: removeDotSegments, - FlagRemoveFragment: removeFragment, - FlagForceHTTP: forceHTTP, - FlagRemoveDuplicateSlashes: removeDuplicateSlashes, - FlagRemoveWWW: removeWWW, - FlagAddWWW: addWWW, - FlagSortQuery: sortQuery, - FlagDecodeDWORDHost: decodeDWORDHost, - FlagDecodeOctalHost: decodeOctalHost, - FlagDecodeHexHost: decodeHexHost, - FlagRemoveUnnecessaryHostDots: removeUnncessaryHostDots, - FlagRemoveEmptyPortSeparator: removeEmptyPortSeparator, - FlagRemoveTrailingSlash: removeTrailingSlash, - FlagAddTrailingSlash: addTrailingSlash, -} - -// MustNormalizeURLString returns the normalized string, and panics if an error occurs. -// It takes an URL string as input, as well as the normalization flags. -func MustNormalizeURLString(u string, f NormalizationFlags) string { - result, e := NormalizeURLString(u, f) - if e != nil { - panic(e) - } - return result -} - -// NormalizeURLString returns the normalized string, or an error if it can't be parsed into an URL object. -// It takes an URL string as input, as well as the normalization flags. -func NormalizeURLString(u string, f NormalizationFlags) (string, error) { - parsed, err := url.Parse(u) - if err != nil { - return "", err - } - - if f&FlagLowercaseHost == FlagLowercaseHost { - parsed.Host = strings.ToLower(parsed.Host) - } - - // The idna package doesn't fully conform to RFC 5895 - // (https://tools.ietf.org/html/rfc5895), so we do it here. - // Taken from Go 1.8 cycle source, courtesy of bradfitz. - // TODO: Remove when (if?) idna package conforms to RFC 5895. - parsed.Host = width.Fold.String(parsed.Host) - parsed.Host = norm.NFC.String(parsed.Host) - if parsed.Host, err = idna.ToASCII(parsed.Host); err != nil { - return "", err - } - - return NormalizeURL(parsed, f), nil -} - -// NormalizeURL returns the normalized string. -// It takes a parsed URL object as input, as well as the normalization flags. -func NormalizeURL(u *url.URL, f NormalizationFlags) string { - for _, k := range flagsOrder { - if f&k == k { - flags[k](u) - } - } - return urlesc.Escape(u) -} - -func lowercaseScheme(u *url.URL) { - if len(u.Scheme) > 0 { - u.Scheme = strings.ToLower(u.Scheme) - } -} - -func lowercaseHost(u *url.URL) { - if len(u.Host) > 0 { - u.Host = strings.ToLower(u.Host) - } -} - -func removeDefaultPort(u *url.URL) { - if len(u.Host) > 0 { - scheme := strings.ToLower(u.Scheme) - u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string { - if (scheme == "http" && val == defaultHttpPort) || (scheme == "https" && val == defaultHttpsPort) { - return "" - } - return val - }) - } -} - -func removeTrailingSlash(u *url.URL) { - if l := len(u.Path); l > 0 { - if strings.HasSuffix(u.Path, "/") { - u.Path = u.Path[:l-1] - } - } else if l = len(u.Host); l > 0 { - if strings.HasSuffix(u.Host, "/") { - u.Host = u.Host[:l-1] - } - } -} - -func addTrailingSlash(u *url.URL) { - if l := len(u.Path); l > 0 { - if !strings.HasSuffix(u.Path, "/") { - u.Path += "/" - } - } else if l = len(u.Host); l > 0 { - if !strings.HasSuffix(u.Host, "/") { - u.Host += "/" - } - } -} - -func removeDotSegments(u *url.URL) { - if len(u.Path) > 0 { - var dotFree []string - var lastIsDot bool - - sections := strings.Split(u.Path, "/") - for _, s := range sections { - if s == ".." { - if len(dotFree) > 0 { - dotFree = dotFree[:len(dotFree)-1] - } - } else if s != "." { - dotFree = append(dotFree, s) - } - lastIsDot = (s == "." || s == "..") - } - // Special case if host does not end with / and new path does not begin with / - u.Path = strings.Join(dotFree, "/") - if u.Host != "" && !strings.HasSuffix(u.Host, "/") && !strings.HasPrefix(u.Path, "/") { - u.Path = "/" + u.Path - } - // Special case if the last segment was a dot, make sure the path ends with a slash - if lastIsDot && !strings.HasSuffix(u.Path, "/") { - u.Path += "/" - } - } -} - -func removeDirectoryIndex(u *url.URL) { - if len(u.Path) > 0 { - u.Path = rxDirIndex.ReplaceAllString(u.Path, "$1") - } -} - -func removeFragment(u *url.URL) { - u.Fragment = "" -} - -func forceHTTP(u *url.URL) { - if strings.ToLower(u.Scheme) == "https" { - u.Scheme = "http" - } -} - -func removeDuplicateSlashes(u *url.URL) { - if len(u.Path) > 0 { - u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/") - } -} - -func removeWWW(u *url.URL) { - if len(u.Host) > 0 && strings.HasPrefix(strings.ToLower(u.Host), "www.") { - u.Host = u.Host[4:] - } -} - -func addWWW(u *url.URL) { - if len(u.Host) > 0 && !strings.HasPrefix(strings.ToLower(u.Host), "www.") { - u.Host = "www." + u.Host - } -} - -func sortQuery(u *url.URL) { - q := u.Query() - - if len(q) > 0 { - arKeys := make([]string, len(q)) - i := 0 - for k := range q { - arKeys[i] = k - i++ - } - sort.Strings(arKeys) - buf := new(bytes.Buffer) - for _, k := range arKeys { - sort.Strings(q[k]) - for _, v := range q[k] { - if buf.Len() > 0 { - buf.WriteRune('&') - } - buf.WriteString(fmt.Sprintf("%s=%s", k, urlesc.QueryEscape(v))) - } - } - - // Rebuild the raw query string - u.RawQuery = buf.String() - } -} - -func decodeDWORDHost(u *url.URL) { - if len(u.Host) > 0 { - if matches := rxDWORDHost.FindStringSubmatch(u.Host); len(matches) > 2 { - var parts [4]int64 - - dword, _ := strconv.ParseInt(matches[1], 10, 0) - for i, shift := range []uint{24, 16, 8, 0} { - parts[i] = dword >> shift & 0xFF - } - u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[2]) - } - } -} - -func decodeOctalHost(u *url.URL) { - if len(u.Host) > 0 { - if matches := rxOctalHost.FindStringSubmatch(u.Host); len(matches) > 5 { - var parts [4]int64 - - for i := 1; i <= 4; i++ { - parts[i-1], _ = strconv.ParseInt(matches[i], 8, 0) - } - u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[5]) - } - } -} - -func decodeHexHost(u *url.URL) { - if len(u.Host) > 0 { - if matches := rxHexHost.FindStringSubmatch(u.Host); len(matches) > 2 { - // Conversion is safe because of regex validation - parsed, _ := strconv.ParseInt(matches[1], 16, 0) - // Set host as DWORD (base 10) encoded host - u.Host = fmt.Sprintf("%d%s", parsed, matches[2]) - // The rest is the same as decoding a DWORD host - decodeDWORDHost(u) - } - } -} - -func removeUnncessaryHostDots(u *url.URL) { - if len(u.Host) > 0 { - if matches := rxHostDots.FindStringSubmatch(u.Host); len(matches) > 1 { - // Trim the leading and trailing dots - u.Host = strings.Trim(matches[1], ".") - if len(matches) > 2 { - u.Host += matches[2] - } - } - } -} - -func removeEmptyPortSeparator(u *url.URL) { - if len(u.Host) > 0 { - u.Host = rxEmptyPort.ReplaceAllString(u.Host, "") - } -} diff --git a/vendor/github.com/PuerkitoBio/urlesc/.travis.yml b/vendor/github.com/PuerkitoBio/urlesc/.travis.yml deleted file mode 100644 index ba6b225f9..000000000 --- a/vendor/github.com/PuerkitoBio/urlesc/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go - -go: - - 1.4.x - - 1.5.x - - 1.6.x - - 1.7.x - - 1.8.x - - tip - -install: - - go build . - -script: - - go test -v diff --git a/vendor/github.com/PuerkitoBio/urlesc/LICENSE b/vendor/github.com/PuerkitoBio/urlesc/LICENSE deleted file mode 100644 index 744875676..000000000 --- a/vendor/github.com/PuerkitoBio/urlesc/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/PuerkitoBio/urlesc/README.md b/vendor/github.com/PuerkitoBio/urlesc/README.md deleted file mode 100644 index 57aff0a53..000000000 --- a/vendor/github.com/PuerkitoBio/urlesc/README.md +++ /dev/null @@ -1,16 +0,0 @@ -urlesc [![Build Status](https://travis-ci.org/PuerkitoBio/urlesc.svg?branch=master)](https://travis-ci.org/PuerkitoBio/urlesc) [![GoDoc](http://godoc.org/github.com/PuerkitoBio/urlesc?status.svg)](http://godoc.org/github.com/PuerkitoBio/urlesc) -====== - -Package urlesc implements query escaping as per RFC 3986. - -It contains some parts of the net/url package, modified so as to allow -some reserved characters incorrectly escaped by net/url (see [issue 5684](https://github.com/golang/go/issues/5684)). - -## Install - - go get github.com/PuerkitoBio/urlesc - -## License - -Go license (BSD-3-Clause) - diff --git a/vendor/github.com/PuerkitoBio/urlesc/urlesc.go b/vendor/github.com/PuerkitoBio/urlesc/urlesc.go deleted file mode 100644 index 1b8462459..000000000 --- a/vendor/github.com/PuerkitoBio/urlesc/urlesc.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package urlesc implements query escaping as per RFC 3986. -// It contains some parts of the net/url package, modified so as to allow -// some reserved characters incorrectly escaped by net/url. -// See https://github.com/golang/go/issues/5684 -package urlesc - -import ( - "bytes" - "net/url" - "strings" -) - -type encoding int - -const ( - encodePath encoding = 1 + iota - encodeUserPassword - encodeQueryComponent - encodeFragment -) - -// Return true if the specified character should be escaped when -// appearing in a URL string, according to RFC 3986. -func shouldEscape(c byte, mode encoding) bool { - // §2.3 Unreserved characters (alphanum) - if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' { - return false - } - - switch c { - case '-', '.', '_', '~': // §2.3 Unreserved characters (mark) - return false - - // §2.2 Reserved characters (reserved) - case ':', '/', '?', '#', '[', ']', '@', // gen-delims - '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // sub-delims - // Different sections of the URL allow a few of - // the reserved characters to appear unescaped. - switch mode { - case encodePath: // §3.3 - // The RFC allows sub-delims and : @. - // '/', '[' and ']' can be used to assign meaning to individual path - // segments. This package only manipulates the path as a whole, - // so we allow those as well. That leaves only ? and # to escape. - return c == '?' || c == '#' - - case encodeUserPassword: // §3.2.1 - // The RFC allows : and sub-delims in - // userinfo. The parsing of userinfo treats ':' as special so we must escape - // all the gen-delims. - return c == ':' || c == '/' || c == '?' || c == '#' || c == '[' || c == ']' || c == '@' - - case encodeQueryComponent: // §3.4 - // The RFC allows / and ?. - return c != '/' && c != '?' - - case encodeFragment: // §4.1 - // The RFC text is silent but the grammar allows - // everything, so escape nothing but # - return c == '#' - } - } - - // Everything else must be escaped. - return true -} - -// QueryEscape escapes the string so it can be safely placed -// inside a URL query. -func QueryEscape(s string) string { - return escape(s, encodeQueryComponent) -} - -func escape(s string, mode encoding) string { - spaceCount, hexCount := 0, 0 - for i := 0; i < len(s); i++ { - c := s[i] - if shouldEscape(c, mode) { - if c == ' ' && mode == encodeQueryComponent { - spaceCount++ - } else { - hexCount++ - } - } - } - - if spaceCount == 0 && hexCount == 0 { - return s - } - - t := make([]byte, len(s)+2*hexCount) - j := 0 - for i := 0; i < len(s); i++ { - switch c := s[i]; { - case c == ' ' && mode == encodeQueryComponent: - t[j] = '+' - j++ - case shouldEscape(c, mode): - t[j] = '%' - t[j+1] = "0123456789ABCDEF"[c>>4] - t[j+2] = "0123456789ABCDEF"[c&15] - j += 3 - default: - t[j] = s[i] - j++ - } - } - return string(t) -} - -var uiReplacer = strings.NewReplacer( - "%21", "!", - "%27", "'", - "%28", "(", - "%29", ")", - "%2A", "*", -) - -// unescapeUserinfo unescapes some characters that need not to be escaped as per RFC3986. -func unescapeUserinfo(s string) string { - return uiReplacer.Replace(s) -} - -// Escape reassembles the URL into a valid URL string. -// The general form of the result is one of: -// -// scheme:opaque -// scheme://userinfo@host/path?query#fragment -// -// If u.Opaque is non-empty, String uses the first form; -// otherwise it uses the second form. -// -// In the second form, the following rules apply: -// - if u.Scheme is empty, scheme: is omitted. -// - if u.User is nil, userinfo@ is omitted. -// - if u.Host is empty, host/ is omitted. -// - if u.Scheme and u.Host are empty and u.User is nil, -// the entire scheme://userinfo@host/ is omitted. -// - if u.Host is non-empty and u.Path begins with a /, -// the form host/path does not add its own /. -// - if u.RawQuery is empty, ?query is omitted. -// - if u.Fragment is empty, #fragment is omitted. -func Escape(u *url.URL) string { - var buf bytes.Buffer - if u.Scheme != "" { - buf.WriteString(u.Scheme) - buf.WriteByte(':') - } - if u.Opaque != "" { - buf.WriteString(u.Opaque) - } else { - if u.Scheme != "" || u.Host != "" || u.User != nil { - buf.WriteString("//") - if ui := u.User; ui != nil { - buf.WriteString(unescapeUserinfo(ui.String())) - buf.WriteByte('@') - } - if h := u.Host; h != "" { - buf.WriteString(h) - } - } - if u.Path != "" && u.Path[0] != '/' && u.Host != "" { - buf.WriteByte('/') - } - buf.WriteString(escape(u.Path, encodePath)) - } - if u.RawQuery != "" { - buf.WriteByte('?') - buf.WriteString(u.RawQuery) - } - if u.Fragment != "" { - buf.WriteByte('#') - buf.WriteString(escape(u.Fragment, encodeFragment)) - } - return buf.String() -} diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go index 1592212e1..a4e2079e6 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go @@ -4,6 +4,8 @@ package antlr +import "sync" + var ATNInvalidAltNumber int type ATN struct { @@ -37,6 +39,10 @@ type ATN struct { ruleToTokenType []int states []ATNState + + mu sync.Mutex + stateMu sync.RWMutex + edgeMu sync.RWMutex } func NewATN(grammarType int, maxTokenType int) *ATN { @@ -59,14 +65,15 @@ func (a *ATN) NextTokensInContext(s ATNState, ctx RuleContext) *IntervalSet { // in s and staying in same rule. Token.EPSILON is in set if we reach end of // rule. func (a *ATN) NextTokensNoContext(s ATNState) *IntervalSet { - if s.GetNextTokenWithinRule() != nil { - return s.GetNextTokenWithinRule() + a.mu.Lock() + defer a.mu.Unlock() + iset := s.GetNextTokenWithinRule() + if iset == nil { + iset = a.NextTokensInContext(s, nil) + iset.readOnly = true + s.SetNextTokenWithinRule(iset) } - - s.SetNextTokenWithinRule(a.NextTokensInContext(s, nil)) - s.GetNextTokenWithinRule().readOnly = true - - return s.GetNextTokenWithinRule() + return iset } func (a *ATN) NextTokens(s ATNState, ctx RuleContext) *IntervalSet { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go index 0535d5246..97ba417f7 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go @@ -251,7 +251,7 @@ func (l *LexerATNConfig) hash() int { f = 0 } h := murmurInit(7) - h = murmurUpdate(h, l.state.hash()) + h = murmurUpdate(h, l.state.GetStateNumber()) h = murmurUpdate(h, l.alt) h = murmurUpdate(h, l.context.hash()) h = murmurUpdate(h, l.semanticContext.hash()) diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go index d9f74755f..49ad4a719 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go @@ -11,7 +11,7 @@ type ATNConfigSet interface { Add(ATNConfig, *DoubleDict) bool AddAll([]ATNConfig) bool - GetStates() *Set + GetStates() Set GetPredicates() []SemanticContext GetItems() []ATNConfig @@ -35,6 +35,8 @@ type ATNConfigSet interface { GetConflictingAlts() *BitSet SetConflictingAlts(*BitSet) + Alts() *BitSet + FullContext() bool GetUniqueAlt() int @@ -55,7 +57,7 @@ type BaseATNConfigSet struct { // effectively doubles the number of objects associated with ATNConfigs. All // keys are hashed by (s, i, _, pi), not including the context. Wiped out when // read-only because a set becomes a DFA state. - configLookup *Set + configLookup Set // configs is the added elements. configs []ATNConfig @@ -91,11 +93,19 @@ type BaseATNConfigSet struct { uniqueAlt int } +func (b *BaseATNConfigSet) Alts() *BitSet { + alts := NewBitSet() + for _, it := range b.configs { + alts.add(it.GetAlt()) + } + return alts +} + func NewBaseATNConfigSet(fullCtx bool) *BaseATNConfigSet { return &BaseATNConfigSet{ - cachedHash: -1, - configLookup: NewSet(nil, equalATNConfigs), - fullCtx: fullCtx, + cachedHash: -1, + configLookup: newArray2DHashSetWithCap(hashATNConfig, equalATNConfigs, 16, 2), + fullCtx: fullCtx, } } @@ -116,12 +126,11 @@ func (b *BaseATNConfigSet) Add(config ATNConfig, mergeCache *DoubleDict) bool { b.dipsIntoOuterContext = true } - existing := b.configLookup.add(config).(ATNConfig) + existing := b.configLookup.Add(config).(ATNConfig) if existing == config { b.cachedHash = -1 b.configs = append(b.configs, config) // Track order here - return true } @@ -145,11 +154,11 @@ func (b *BaseATNConfigSet) Add(config ATNConfig, mergeCache *DoubleDict) bool { return true } -func (b *BaseATNConfigSet) GetStates() *Set { - states := NewSet(nil, nil) +func (b *BaseATNConfigSet) GetStates() Set { + states := newArray2DHashSet(nil, nil) for i := 0; i < len(b.configs); i++ { - states.add(b.configs[i].GetState()) + states.Add(b.configs[i].GetState()) } return states @@ -186,7 +195,7 @@ func (b *BaseATNConfigSet) OptimizeConfigs(interpreter *BaseATNSimulator) { panic("set is read-only") } - if b.configLookup.length() == 0 { + if b.configLookup.Len() == 0 { return } @@ -236,13 +245,11 @@ func (b *BaseATNConfigSet) hash() int { } func (b *BaseATNConfigSet) hashCodeConfigs() int { - h := murmurInit(1) - for _, c := range b.configs { - if c != nil { - h = murmurUpdate(h, c.hash()) - } + h := 1 + for _, config := range b.configs { + h = 31*h + config.hash() } - return murmurFinish(h, len(b.configs)) + return h } func (b *BaseATNConfigSet) Length() int { @@ -258,7 +265,7 @@ func (b *BaseATNConfigSet) Contains(item ATNConfig) bool { panic("not implemented for read-only sets") } - return b.configLookup.contains(item) + return b.configLookup.Contains(item) } func (b *BaseATNConfigSet) ContainsFast(item ATNConfig) bool { @@ -266,7 +273,7 @@ func (b *BaseATNConfigSet) ContainsFast(item ATNConfig) bool { panic("not implemented for read-only sets") } - return b.configLookup.contains(item) // TODO: containsFast is not implemented for Set + return b.configLookup.Contains(item) // TODO: containsFast is not implemented for Set } func (b *BaseATNConfigSet) Clear() { @@ -276,7 +283,7 @@ func (b *BaseATNConfigSet) Clear() { b.configs = make([]ATNConfig, 0) b.cachedHash = -1 - b.configLookup = NewSet(nil, equalATNConfigs) + b.configLookup = newArray2DHashSet(nil, equalATNConfigs) } func (b *BaseATNConfigSet) FullContext() bool { @@ -358,11 +365,20 @@ type OrderedATNConfigSet struct { func NewOrderedATNConfigSet() *OrderedATNConfigSet { b := NewBaseATNConfigSet(false) - b.configLookup = NewSet(nil, nil) + b.configLookup = newArray2DHashSet(nil, nil) return &OrderedATNConfigSet{BaseATNConfigSet: b} } +func hashATNConfig(i interface{}) int { + o := i.(ATNConfig) + hash := 7 + hash = 31*hash + o.GetState().GetStateNumber() + hash = 31*hash + o.GetAlt() + hash = 31*hash + o.GetSemanticContext().hash() + return hash +} + func equalATNConfigs(a, b interface{}) bool { if a == nil || b == nil { return false @@ -379,9 +395,13 @@ func equalATNConfigs(a, b interface{}) bool { return false } - nums := ai.GetState().GetStateNumber() == bi.GetState().GetStateNumber() - alts := ai.GetAlt() == bi.GetAlt() - cons := ai.GetSemanticContext().equals(bi.GetSemanticContext()) + if ai.GetState().GetStateNumber() != bi.GetState().GetStateNumber() { + return false + } + + if ai.GetAlt() != bi.GetAlt() { + return false + } - return nums && alts && cons + return ai.GetSemanticContext().equals(bi.GetSemanticContext()) } diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go index 18b89efaf..cb8eafb0b 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go @@ -4,7 +4,9 @@ package antlr -var ATNDeserializationOptionsdefaultOptions = &ATNDeserializationOptions{true, false, false} +import "errors" + +var defaultATNDeserializationOptions = ATNDeserializationOptions{true, true, false} type ATNDeserializationOptions struct { readOnly bool @@ -12,14 +14,48 @@ type ATNDeserializationOptions struct { generateRuleBypassTransitions bool } -func NewATNDeserializationOptions(CopyFrom *ATNDeserializationOptions) *ATNDeserializationOptions { - o := new(ATNDeserializationOptions) +func (opts *ATNDeserializationOptions) ReadOnly() bool { + return opts.readOnly +} + +func (opts *ATNDeserializationOptions) SetReadOnly(readOnly bool) { + if opts.readOnly { + panic(errors.New("Cannot mutate read only ATNDeserializationOptions")) + } + opts.readOnly = readOnly +} + +func (opts *ATNDeserializationOptions) VerifyATN() bool { + return opts.verifyATN +} + +func (opts *ATNDeserializationOptions) SetVerifyATN(verifyATN bool) { + if opts.readOnly { + panic(errors.New("Cannot mutate read only ATNDeserializationOptions")) + } + opts.verifyATN = verifyATN +} - if CopyFrom != nil { - o.readOnly = CopyFrom.readOnly - o.verifyATN = CopyFrom.verifyATN - o.generateRuleBypassTransitions = CopyFrom.generateRuleBypassTransitions +func (opts *ATNDeserializationOptions) GenerateRuleBypassTransitions() bool { + return opts.generateRuleBypassTransitions +} + +func (opts *ATNDeserializationOptions) SetGenerateRuleBypassTransitions(generateRuleBypassTransitions bool) { + if opts.readOnly { + panic(errors.New("Cannot mutate read only ATNDeserializationOptions")) } + opts.generateRuleBypassTransitions = generateRuleBypassTransitions +} +func DefaultATNDeserializationOptions() *ATNDeserializationOptions { + return NewATNDeserializationOptions(&defaultATNDeserializationOptions) +} + +func NewATNDeserializationOptions(other *ATNDeserializationOptions) *ATNDeserializationOptions { + o := new(ATNDeserializationOptions) + if other != nil { + *o = *other + o.readOnly = false + } return o } diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go index 884d39cf7..aea9bbfa9 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go @@ -5,50 +5,34 @@ package antlr import ( - "encoding/hex" "fmt" "strconv" - "strings" - "unicode/utf16" ) -// This is the earliest supported serialized UUID. -// stick to serialized version for now, we don't need a UUID instance -var BaseSerializedUUID = "AADB8D7E-AEEF-4415-AD2B-8204D6CF042E" -var AddedUnicodeSMP = "59627784-3BE5-417A-B9EB-8131A7286089" +const serializedVersion = 4 -// This list contains all of the currently supported UUIDs, ordered by when -// the feature first appeared in this branch. -var SupportedUUIDs = []string{BaseSerializedUUID, AddedUnicodeSMP} - -var SerializedVersion = 3 - -// This is the current serialized UUID. -var SerializedUUID = AddedUnicodeSMP - -type LoopEndStateIntPair struct { +type loopEndStateIntPair struct { item0 *LoopEndState item1 int } -type BlockStartStateIntPair struct { +type blockStartStateIntPair struct { item0 BlockStartState item1 int } type ATNDeserializer struct { - deserializationOptions *ATNDeserializationOptions - data []rune - pos int - uuid string + options *ATNDeserializationOptions + data []int32 + pos int } func NewATNDeserializer(options *ATNDeserializationOptions) *ATNDeserializer { if options == nil { - options = ATNDeserializationOptionsdefaultOptions + options = &defaultATNDeserializationOptions } - return &ATNDeserializer{deserializationOptions: options} + return &ATNDeserializer{options: options} } func stringInSlice(a string, list []string) int { @@ -61,30 +45,10 @@ func stringInSlice(a string, list []string) int { return -1 } -// isFeatureSupported determines if a particular serialized representation of an -// ATN supports a particular feature, identified by the UUID used for -// serializing the ATN at the time the feature was first introduced. Feature is -// the UUID marking the first time the feature was supported in the serialized -// ATN. ActualUuid is the UUID of the actual serialized ATN which is currently -// being deserialized. It returns true if actualUuid represents a serialized ATN -// at or after the feature identified by feature was introduced, and otherwise -// false. -func (a *ATNDeserializer) isFeatureSupported(feature, actualUUID string) bool { - idx1 := stringInSlice(feature, SupportedUUIDs) - - if idx1 < 0 { - return false - } - - idx2 := stringInSlice(actualUUID, SupportedUUIDs) - - return idx2 >= idx1 -} - -func (a *ATNDeserializer) DeserializeFromUInt16(data []uint16) *ATN { - a.reset(utf16.Decode(data)) +func (a *ATNDeserializer) Deserialize(data []int32) *ATN { + a.data = data + a.pos = 0 a.checkVersion() - a.checkUUID() atn := a.readATN() @@ -92,15 +56,7 @@ func (a *ATNDeserializer) DeserializeFromUInt16(data []uint16) *ATN { a.readRules(atn) a.readModes(atn) - sets := make([]*IntervalSet, 0) - - // First, deserialize sets with 16-bit arguments <= U+FFFF. - sets = a.readSets(atn, sets, a.readInt) - // Next, if the ATN was serialized with the Unicode SMP feature, - // deserialize sets with 32-bit arguments <= U+10FFFF. - if (a.isFeatureSupported(AddedUnicodeSMP, a.uuid)) { - sets = a.readSets(atn, sets, a.readInt32) - } + sets := a.readSets(atn, nil) a.readEdges(atn, sets) a.readDecisions(atn) @@ -108,7 +64,7 @@ func (a *ATNDeserializer) DeserializeFromUInt16(data []uint16) *ATN { a.markPrecedenceDecisions(atn) a.verifyATN(atn) - if a.deserializationOptions.generateRuleBypassTransitions && atn.grammarType == ATNTypeParser { + if a.options.GenerateRuleBypassTransitions() && atn.grammarType == ATNTypeParser { a.generateRuleBypassTransitions(atn) // Re-verify after modification a.verifyATN(atn) @@ -118,42 +74,14 @@ func (a *ATNDeserializer) DeserializeFromUInt16(data []uint16) *ATN { } -func (a *ATNDeserializer) reset(data []rune) { - temp := make([]rune, len(data)) - - for i, c := range data { - // Don't adjust the first value since that's the version number - if i == 0 { - temp[i] = c - } else if c > 1 { - temp[i] = c - 2 - } else { - temp[i] = c + 65533 - } - } - - a.data = temp - a.pos = 0 -} - func (a *ATNDeserializer) checkVersion() { version := a.readInt() - if version != SerializedVersion { - panic("Could not deserialize ATN with version " + strconv.Itoa(version) + " (expected " + strconv.Itoa(SerializedVersion) + ").") + if version != serializedVersion { + panic("Could not deserialize ATN with version " + strconv.Itoa(version) + " (expected " + strconv.Itoa(serializedVersion) + ").") } } -func (a *ATNDeserializer) checkUUID() { - uuid := a.readUUID() - - if stringInSlice(uuid, SupportedUUIDs) < 0 { - panic("Could not deserialize ATN with UUID: " + uuid + " (expected " + SerializedUUID + " or a legacy UUID).") - } - - a.uuid = uuid -} - func (a *ATNDeserializer) readATN() *ATN { grammarType := a.readInt() maxTokenType := a.readInt() @@ -162,37 +90,36 @@ func (a *ATNDeserializer) readATN() *ATN { } func (a *ATNDeserializer) readStates(atn *ATN) { - loopBackStateNumbers := make([]LoopEndStateIntPair, 0) - endStateNumbers := make([]BlockStartStateIntPair, 0) - nstates := a.readInt() + // Allocate worst case size. + loopBackStateNumbers := make([]loopEndStateIntPair, 0, nstates) + endStateNumbers := make([]blockStartStateIntPair, 0, nstates) + + // Preallocate states slice. + atn.states = make([]ATNState, 0, nstates) + for i := 0; i < nstates; i++ { stype := a.readInt() // Ignore bad types of states if stype == ATNStateInvalidType { atn.addState(nil) - continue } ruleIndex := a.readInt() - if ruleIndex == 0xFFFF { - ruleIndex = -1 - } - s := a.stateFactory(stype, ruleIndex) if stype == ATNStateLoopEnd { loopBackStateNumber := a.readInt() - loopBackStateNumbers = append(loopBackStateNumbers, LoopEndStateIntPair{s.(*LoopEndState), loopBackStateNumber}) + loopBackStateNumbers = append(loopBackStateNumbers, loopEndStateIntPair{s.(*LoopEndState), loopBackStateNumber}) } else if s2, ok := s.(BlockStartState); ok { endStateNumber := a.readInt() - endStateNumbers = append(endStateNumbers, BlockStartStateIntPair{s2, endStateNumber}) + endStateNumbers = append(endStateNumbers, blockStartStateIntPair{s2, endStateNumber}) } atn.addState(s) @@ -200,20 +127,15 @@ func (a *ATNDeserializer) readStates(atn *ATN) { // Delay the assignment of loop back and end states until we know all the state // instances have been initialized - for j := 0; j < len(loopBackStateNumbers); j++ { - pair := loopBackStateNumbers[j] - + for _, pair := range loopBackStateNumbers { pair.item0.loopBackState = atn.states[pair.item1] } - for j := 0; j < len(endStateNumbers); j++ { - pair := endStateNumbers[j] - + for _, pair := range endStateNumbers { pair.item0.setEndState(atn.states[pair.item1].(*BlockEndState)) } numNonGreedyStates := a.readInt() - for j := 0; j < numNonGreedyStates; j++ { stateNumber := a.readInt() @@ -221,7 +143,6 @@ func (a *ATNDeserializer) readStates(atn *ATN) { } numPrecedenceStates := a.readInt() - for j := 0; j < numPrecedenceStates; j++ { stateNumber := a.readInt() @@ -233,12 +154,12 @@ func (a *ATNDeserializer) readRules(atn *ATN) { nrules := a.readInt() if atn.grammarType == ATNTypeLexer { - atn.ruleToTokenType = make([]int, nrules) // TODO: initIntArray(nrules, 0) + atn.ruleToTokenType = make([]int, nrules) } - atn.ruleToStartState = make([]*RuleStartState, nrules) // TODO: initIntArray(nrules, 0) + atn.ruleToStartState = make([]*RuleStartState, nrules) - for i := 0; i < nrules; i++ { + for i := range atn.ruleToStartState { s := a.readInt() startState := atn.states[s].(*RuleStartState) @@ -247,19 +168,13 @@ func (a *ATNDeserializer) readRules(atn *ATN) { if atn.grammarType == ATNTypeLexer { tokenType := a.readInt() - if tokenType == 0xFFFF { - tokenType = TokenEOF - } - atn.ruleToTokenType[i] = tokenType } } - atn.ruleToStopState = make([]*RuleStopState, nrules) //initIntArray(nrules, 0) - - for i := 0; i < len(atn.states); i++ { - state := atn.states[i] + atn.ruleToStopState = make([]*RuleStopState, nrules) + for _, state := range atn.states { if s2, ok := state.(*RuleStopState); ok { atn.ruleToStopState[s2.ruleIndex] = s2 atn.ruleToStartState[s2.ruleIndex].stopState = s2 @@ -269,17 +184,25 @@ func (a *ATNDeserializer) readRules(atn *ATN) { func (a *ATNDeserializer) readModes(atn *ATN) { nmodes := a.readInt() + atn.modeToStartState = make([]*TokensStartState, nmodes) - for i := 0; i < nmodes; i++ { + for i := range atn.modeToStartState { s := a.readInt() - atn.modeToStartState = append(atn.modeToStartState, atn.states[s].(*TokensStartState)) + atn.modeToStartState[i] = atn.states[s].(*TokensStartState) } } -func (a *ATNDeserializer) readSets(atn *ATN, sets []*IntervalSet, readUnicode func() int) []*IntervalSet { +func (a *ATNDeserializer) readSets(atn *ATN, sets []*IntervalSet) []*IntervalSet { m := a.readInt() + // Preallocate the needed capacity. + if cap(sets)-len(sets) < m { + isets := make([]*IntervalSet, len(sets), len(sets)+m) + copy(isets, sets) + sets = isets + } + for i := 0; i < m; i++ { iset := NewIntervalSet() @@ -293,8 +216,8 @@ func (a *ATNDeserializer) readSets(atn *ATN, sets []*IntervalSet, readUnicode fu } for j := 0; j < n; j++ { - i1 := readUnicode() - i2 := readUnicode() + i1 := a.readInt() + i2 := a.readInt() iset.addRange(i1, i2) } @@ -322,11 +245,9 @@ func (a *ATNDeserializer) readEdges(atn *ATN, sets []*IntervalSet) { } // Edges for rule stop states can be derived, so they are not serialized - for i := 0; i < len(atn.states); i++ { - state := atn.states[i] - - for j := 0; j < len(state.GetTransitions()); j++ { - var t, ok = state.GetTransitions()[j].(*RuleTransition) + for _, state := range atn.states { + for _, t := range state.GetTransitions() { + var rt, ok = t.(*RuleTransition) if !ok { continue @@ -334,48 +255,42 @@ func (a *ATNDeserializer) readEdges(atn *ATN, sets []*IntervalSet) { outermostPrecedenceReturn := -1 - if atn.ruleToStartState[t.getTarget().GetRuleIndex()].isPrecedenceRule { - if t.precedence == 0 { - outermostPrecedenceReturn = t.getTarget().GetRuleIndex() + if atn.ruleToStartState[rt.getTarget().GetRuleIndex()].isPrecedenceRule { + if rt.precedence == 0 { + outermostPrecedenceReturn = rt.getTarget().GetRuleIndex() } } - trans := NewEpsilonTransition(t.followState, outermostPrecedenceReturn) + trans := NewEpsilonTransition(rt.followState, outermostPrecedenceReturn) - atn.ruleToStopState[t.getTarget().GetRuleIndex()].AddTransition(trans, -1) + atn.ruleToStopState[rt.getTarget().GetRuleIndex()].AddTransition(trans, -1) } } - for i := 0; i < len(atn.states); i++ { - state := atn.states[i] - - if s2, ok := state.(*BaseBlockStartState); ok { + for _, state := range atn.states { + if s2, ok := state.(BlockStartState); ok { // We need to know the end state to set its start state - if s2.endState == nil { + if s2.getEndState() == nil { panic("IllegalState") } // Block end states can only be associated to a single block start state - if s2.endState.startState != nil { + if s2.getEndState().startState != nil { panic("IllegalState") } - s2.endState.startState = state + s2.getEndState().startState = state } if s2, ok := state.(*PlusLoopbackState); ok { - for j := 0; j < len(s2.GetTransitions()); j++ { - target := s2.GetTransitions()[j].getTarget() - - if t2, ok := target.(*PlusBlockStartState); ok { + for _, t := range s2.GetTransitions() { + if t2, ok := t.getTarget().(*PlusBlockStartState); ok { t2.loopBackState = state } } } else if s2, ok := state.(*StarLoopbackState); ok { - for j := 0; j < len(s2.GetTransitions()); j++ { - target := s2.GetTransitions()[j].getTarget() - - if t2, ok := target.(*StarLoopEntryState); ok { + for _, t := range s2.GetTransitions() { + if t2, ok := t.getTarget().(*StarLoopEntryState); ok { t2.loopBackState = state } } @@ -399,25 +314,13 @@ func (a *ATNDeserializer) readLexerActions(atn *ATN) { if atn.grammarType == ATNTypeLexer { count := a.readInt() - atn.lexerActions = make([]LexerAction, count) // initIntArray(count, nil) + atn.lexerActions = make([]LexerAction, count) - for i := 0; i < count; i++ { + for i := range atn.lexerActions { actionType := a.readInt() data1 := a.readInt() - - if data1 == 0xFFFF { - data1 = -1 - } - data2 := a.readInt() - - if data2 == 0xFFFF { - data2 = -1 - } - - lexerAction := a.lexerActionFactory(actionType, data1, data2) - - atn.lexerActions[i] = lexerAction + atn.lexerActions[i] = a.lexerActionFactory(actionType, data1, data2) } } } @@ -565,14 +468,12 @@ func (a *ATNDeserializer) markPrecedenceDecisions(atn *ATN) { } func (a *ATNDeserializer) verifyATN(atn *ATN) { - if !a.deserializationOptions.verifyATN { + if !a.options.VerifyATN() { return } // Verify assumptions - for i := 0; i < len(atn.states); i++ { - state := atn.states[i] - + for _, state := range atn.states { if state == nil { continue } @@ -587,18 +488,18 @@ func (a *ATNDeserializer) verifyATN(atn *ATN) { a.checkCondition(s2.loopBackState != nil, "") a.checkCondition(len(s2.GetTransitions()) == 2, "") - switch s2 := state.(type) { + switch s2.transitions[0].getTarget().(type) { case *StarBlockStartState: - var _, ok2 = s2.GetTransitions()[1].getTarget().(*LoopEndState) + _, ok := s2.transitions[1].getTarget().(*LoopEndState) - a.checkCondition(ok2, "") + a.checkCondition(ok, "") a.checkCondition(!s2.nonGreedy, "") case *LoopEndState: - var s3, ok2 = s2.GetTransitions()[1].getTarget().(*StarBlockStartState) + var _, ok = s2.transitions[1].getTarget().(*StarBlockStartState) - a.checkCondition(ok2, "") - a.checkCondition(s3.nonGreedy, "") + a.checkCondition(ok, "") + a.checkCondition(s2.nonGreedy, "") default: panic("IllegalState") @@ -607,9 +508,9 @@ func (a *ATNDeserializer) verifyATN(atn *ATN) { case *StarLoopbackState: a.checkCondition(len(state.GetTransitions()) == 1, "") - var _, ok2 = state.GetTransitions()[0].getTarget().(*StarLoopEntryState) + var _, ok = state.GetTransitions()[0].getTarget().(*StarLoopEntryState) - a.checkCondition(ok2, "") + a.checkCondition(ok, "") case *LoopEndState: a.checkCondition(s2.loopBackState != nil, "") @@ -617,8 +518,8 @@ func (a *ATNDeserializer) verifyATN(atn *ATN) { case *RuleStartState: a.checkCondition(s2.stopState != nil, "") - case *BaseBlockStartState: - a.checkCondition(s2.endState != nil, "") + case BlockStartState: + a.checkCondition(s2.getEndState() != nil, "") case *BlockEndState: a.checkCondition(s2.startState != nil, "") @@ -649,53 +550,7 @@ func (a *ATNDeserializer) readInt() int { a.pos++ - return int(v) -} - -func (a *ATNDeserializer) readInt32() int { - var low = a.readInt() - var high = a.readInt() - return low | (high << 16) -} - -//TODO -//func (a *ATNDeserializer) readLong() int64 { -// panic("Not implemented") -// var low = a.readInt32() -// var high = a.readInt32() -// return (low & 0x00000000FFFFFFFF) | (high << int32) -//} - -func createByteToHex() []string { - bth := make([]string, 256) - - for i := 0; i < 256; i++ { - bth[i] = strings.ToUpper(hex.EncodeToString([]byte{byte(i)})) - } - - return bth -} - -var byteToHex = createByteToHex() - -func (a *ATNDeserializer) readUUID() string { - bb := make([]int, 16) - - for i := 7; i >= 0; i-- { - integer := a.readInt() - - bb[(2*i)+1] = integer & 0xFF - bb[2*i] = (integer >> 8) & 0xFF - } - - return byteToHex[bb[0]] + byteToHex[bb[1]] + - byteToHex[bb[2]] + byteToHex[bb[3]] + "-" + - byteToHex[bb[4]] + byteToHex[bb[5]] + "-" + - byteToHex[bb[6]] + byteToHex[bb[7]] + "-" + - byteToHex[bb[8]] + byteToHex[bb[9]] + "-" + - byteToHex[bb[10]] + byteToHex[bb[11]] + - byteToHex[bb[12]] + byteToHex[bb[13]] + - byteToHex[bb[14]] + byteToHex[bb[15]] + return int(v) // data is 32 bits but int is at least that big } func (a *ATNDeserializer) edgeFactory(atn *ATN, typeIndex, src, trg, arg1, arg2, arg3 int, sets []*IntervalSet) Transition { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go index 563d5db38..3835bb2e9 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go @@ -243,6 +243,8 @@ func NewBasicBlockStartState() *BasicBlockStartState { return &BasicBlockStartState{BaseBlockStartState: b} } +var _ BlockStartState = &BasicBlockStartState{} + // BlockEndState is a terminal node of a simple (a|b|c) block. type BlockEndState struct { *BaseATNState @@ -318,6 +320,8 @@ func NewPlusBlockStartState() *PlusBlockStartState { return &PlusBlockStartState{BaseBlockStartState: b} } +var _ BlockStartState = &PlusBlockStartState{} + // StarBlockStartState is the block that begins a closure loop. type StarBlockStartState struct { *BaseBlockStartState @@ -331,6 +335,8 @@ func NewStarBlockStartState() *StarBlockStartState { return &StarBlockStartState{BaseBlockStartState: b} } +var _ BlockStartState = &StarBlockStartState{} + type StarLoopbackState struct { *BaseATNState } diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go index 770c32a6b..d55a2a87d 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go @@ -6,7 +6,6 @@ package antlr import ( "sort" - "sync" ) type DFA struct { @@ -18,23 +17,27 @@ type DFA struct { // states is all the DFA states. Use Map to get the old state back; Set can only // indicate whether it is there. states map[int]*DFAState - statesMu sync.RWMutex s0 *DFAState - s0Mu sync.RWMutex // precedenceDfa is the backing field for isPrecedenceDfa and setPrecedenceDfa. // True if the DFA is for a precedence decision and false otherwise. precedenceDfa bool - precedenceDfaMu sync.RWMutex } func NewDFA(atnStartState DecisionState, decision int) *DFA { - return &DFA{ + dfa := &DFA{ atnStartState: atnStartState, decision: decision, states: make(map[int]*DFAState), } + if s, ok := atnStartState.(*StarLoopEntryState); ok && s.precedenceRuleDecision { + dfa.precedenceDfa = true + dfa.s0 = NewDFAState(-1, NewBaseATNConfigSet(false)) + dfa.s0.isAcceptState = false + dfa.s0.requiresFullContext = false + } + return dfa } // getPrecedenceStartState gets the start state for the current precedence and @@ -79,8 +82,6 @@ func (d *DFA) setPrecedenceStartState(precedence int, startState *DFAState) { } func (d *DFA) getPrecedenceDfa() bool { - d.precedenceDfaMu.RLock() - defer d.precedenceDfaMu.RUnlock() return d.precedenceDfa } @@ -104,46 +105,32 @@ func (d *DFA) setPrecedenceDfa(precedenceDfa bool) { d.setS0(nil) } - d.precedenceDfaMu.Lock() - defer d.precedenceDfaMu.Unlock() d.precedenceDfa = precedenceDfa } } func (d *DFA) getS0() *DFAState { - d.s0Mu.RLock() - defer d.s0Mu.RUnlock() return d.s0 } func (d *DFA) setS0(s *DFAState) { - d.s0Mu.Lock() - defer d.s0Mu.Unlock() d.s0 = s } func (d *DFA) getState(hash int) (*DFAState, bool) { - d.statesMu.RLock() - defer d.statesMu.RUnlock() s, ok := d.states[hash] return s, ok } func (d *DFA) setStates(states map[int]*DFAState) { - d.statesMu.Lock() - defer d.statesMu.Unlock() d.states = states } func (d *DFA) setState(hash int, state *DFAState) { - d.statesMu.Lock() - defer d.statesMu.Unlock() d.states[hash] = state } func (d *DFA) numStates() int { - d.statesMu.RLock() - defer d.statesMu.RUnlock() return len(d.states) } diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go index fcfef975c..bf2ccc06c 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go @@ -7,6 +7,7 @@ package antlr import ( "fmt" "strconv" + "strings" ) // DFASerializer is a DFA walker that knows how to dump them to serialized @@ -112,7 +113,12 @@ func NewLexerDFASerializer(dfa *DFA) *LexerDFASerializer { } func (l *LexerDFASerializer) getEdgeLabel(i int) string { - return "'" + string(i) + "'" + var sb strings.Builder + sb.Grow(6) + sb.WriteByte('\'') + sb.WriteRune(rune(i)) + sb.WriteByte('\'') + return sb.String() } func (l *LexerDFASerializer) String() string { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go index 680ce9ace..970ed1986 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go @@ -6,7 +6,6 @@ package antlr import ( "fmt" - "sync" ) // PredPrediction maps a predicate to a predicted alternative. @@ -51,7 +50,6 @@ type DFAState struct { // edges elements point to the target of the symbol. Shift up by 1 so (-1) // Token.EOF maps to the first element. edges []*DFAState - edgesMu sync.RWMutex isAcceptState bool @@ -92,16 +90,16 @@ func NewDFAState(stateNumber int, configs ATNConfigSet) *DFAState { } // GetAltSet gets the set of all alts mentioned by all ATN configurations in d. -func (d *DFAState) GetAltSet() *Set { - alts := NewSet(nil, nil) +func (d *DFAState) GetAltSet() Set { + alts := newArray2DHashSet(nil, nil) if d.configs != nil { for _, c := range d.configs.GetItems() { - alts.add(c.GetAlt()) + alts.Add(c.GetAlt()) } } - if alts.length() == 0 { + if alts.Len() == 0 { return nil } @@ -109,32 +107,22 @@ func (d *DFAState) GetAltSet() *Set { } func (d *DFAState) getEdges() []*DFAState { - d.edgesMu.RLock() - defer d.edgesMu.RUnlock() return d.edges } func (d *DFAState) numEdges() int { - d.edgesMu.RLock() - defer d.edgesMu.RUnlock() return len(d.edges) } func (d *DFAState) getIthEdge(i int) *DFAState { - d.edgesMu.RLock() - defer d.edgesMu.RUnlock() return d.edges[i] } func (d *DFAState) setEdges(newEdges []*DFAState) { - d.edgesMu.Lock() - defer d.edgesMu.Unlock() d.edges = newEdges } func (d *DFAState) setIthEdge(i int, edge *DFAState) { - d.edgesMu.Lock() - defer d.edgesMu.Unlock() d.edges[i] = edge } @@ -173,26 +161,11 @@ func (d *DFAState) String() string { } } - return fmt.Sprintf("%d:%s%s", fmt.Sprint(d.configs), s) + return fmt.Sprintf("%d:%s%s", d.stateNumber, fmt.Sprint(d.configs), s) } func (d *DFAState) hash() int { - h := murmurInit(11) - - c := 1 - if d.isAcceptState { - if d.predicates != nil { - for _, p := range d.predicates { - h = murmurUpdate(h, p.alt) - h = murmurUpdate(h, p.pred.hash()) - c += 2 - } - } else { - h = murmurUpdate(h, d.prediction) - c += 1 - } - } - + h := murmurInit(7) h = murmurUpdate(h, d.configs.hash()) - return murmurFinish(h, c) -} \ No newline at end of file + return murmurFinish(h, 1) +} diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go index 977a6e454..c4080dbfd 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go @@ -16,7 +16,7 @@ type ErrorStrategy interface { RecoverInline(Parser) Token Recover(Parser, RecognitionException) Sync(Parser) - inErrorRecoveryMode(Parser) bool + InErrorRecoveryMode(Parser) bool ReportError(Parser, RecognitionException) ReportMatch(Parser) } @@ -40,7 +40,7 @@ func NewDefaultErrorStrategy() *DefaultErrorStrategy { // error". This is used to suppress Reporting multiple error messages while // attempting to recover from a detected syntax error. // - // @see //inErrorRecoveryMode + // @see //InErrorRecoveryMode // d.errorRecoveryMode = false @@ -71,7 +71,7 @@ func (d *DefaultErrorStrategy) beginErrorCondition(recognizer Parser) { d.errorRecoveryMode = true } -func (d *DefaultErrorStrategy) inErrorRecoveryMode(recognizer Parser) bool { +func (d *DefaultErrorStrategy) InErrorRecoveryMode(recognizer Parser) bool { return d.errorRecoveryMode } @@ -118,7 +118,7 @@ func (d *DefaultErrorStrategy) ReportMatch(recognizer Parser) { func (d *DefaultErrorStrategy) ReportError(recognizer Parser, e RecognitionException) { // if we've already Reported an error and have not Matched a token // yet successfully, don't Report any errors. - if d.inErrorRecoveryMode(recognizer) { + if d.InErrorRecoveryMode(recognizer) { return // don't Report spurious errors } d.beginErrorCondition(recognizer) @@ -209,7 +209,7 @@ func (d *DefaultErrorStrategy) Recover(recognizer Parser, e RecognitionException // func (d *DefaultErrorStrategy) Sync(recognizer Parser) { // If already recovering, don't try to Sync - if d.inErrorRecoveryMode(recognizer) { + if d.InErrorRecoveryMode(recognizer) { return } @@ -312,7 +312,7 @@ func (d *DefaultErrorStrategy) ReportFailedPredicate(recognizer Parser, e *Faile // @param recognizer the parser instance // func (d *DefaultErrorStrategy) ReportUnwantedToken(recognizer Parser) { - if d.inErrorRecoveryMode(recognizer) { + if d.InErrorRecoveryMode(recognizer) { return } d.beginErrorCondition(recognizer) @@ -341,7 +341,7 @@ func (d *DefaultErrorStrategy) ReportUnwantedToken(recognizer Parser) { // @param recognizer the parser instance // func (d *DefaultErrorStrategy) ReportMissingToken(recognizer Parser) { - if d.inErrorRecoveryMode(recognizer) { + if d.InErrorRecoveryMode(recognizer) { return } d.beginErrorCondition(recognizer) @@ -738,7 +738,11 @@ func (b *BailErrorStrategy) Recover(recognizer Parser, e RecognitionException) { context := recognizer.GetParserRuleContext() for context != nil { context.SetException(e) - context = context.GetParent().(ParserRuleContext) + if parent, ok := context.GetParent().(ParserRuleContext); ok { + context = parent + } else { + context = nil + } } panic(NewParseCancellationException()) // TODO we don't emit e properly } diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go index 510d90911..1e9393adb 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go @@ -226,16 +226,28 @@ func (i *IntervalSet) StringVerbose(literalNames []string, symbolicNames []strin func (i *IntervalSet) toCharString() string { names := make([]string, len(i.intervals)) + var sb strings.Builder + for j := 0; j < len(i.intervals); j++ { v := i.intervals[j] if v.Stop == v.Start+1 { if v.Start == TokenEOF { names = append(names, "") } else { - names = append(names, ("'" + string(v.Start) + "'")) + sb.WriteByte('\'') + sb.WriteRune(rune(v.Start)) + sb.WriteByte('\'') + names = append(names, sb.String()) + sb.Reset() } } else { - names = append(names, "'"+string(v.Start)+"'..'"+string(v.Stop-1)+"'") + sb.WriteByte('\'') + sb.WriteRune(rune(v.Start)) + sb.WriteString("'..'") + sb.WriteRune(rune(v.Stop - 1)) + sb.WriteByte('\'') + names = append(names, sb.String()) + sb.Reset() } } if len(names) > 1 { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go index 20df84f94..5a325be13 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go @@ -414,10 +414,9 @@ func (l *LexerIndexedCustomAction) execute(lexer Lexer) { func (l *LexerIndexedCustomAction) hash() int { h := murmurInit(0) - h = murmurUpdate(h, l.actionType) h = murmurUpdate(h, l.offset) h = murmurUpdate(h, l.lexerAction.hash()) - return murmurFinish(h, 3) + return murmurFinish(h, 2) } func (l *LexerIndexedCustomAction) equals(other LexerAction) bool { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go index 80b949a1a..056941dd6 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go @@ -161,10 +161,13 @@ func (l *LexerActionExecutor) hash() int { func (l *LexerActionExecutor) equals(other interface{}) bool { if l == other { return true - } else if _, ok := other.(*LexerActionExecutor); !ok { + } + othert, ok := other.(*LexerActionExecutor) + if !ok { + return false + } + if othert == nil { return false - } else { - return l.cachedHash == other.(*LexerActionExecutor).cachedHash && - &l.lexerActions == &other.(*LexerActionExecutor).lexerActions } + return l.cachedHash == othert.cachedHash && &l.lexerActions == &othert.lexerActions } diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go index 32d69e1b8..dc05153ea 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go @@ -7,6 +7,7 @@ package antlr import ( "fmt" "strconv" + "strings" ) var ( @@ -90,11 +91,16 @@ func (l *LexerATNSimulator) Match(input CharStream, mode int) int { dfa := l.decisionToDFA[mode] - if dfa.getS0() == nil { + var s0 *DFAState + l.atn.stateMu.RLock() + s0 = dfa.getS0() + l.atn.stateMu.RUnlock() + + if s0 == nil { return l.MatchATN(input) } - return l.execATN(input, dfa.getS0()) + return l.execATN(input, s0) } func (l *LexerATNSimulator) reset() { @@ -116,11 +122,7 @@ func (l *LexerATNSimulator) MatchATN(input CharStream) int { suppressEdge := s0Closure.hasSemanticContext s0Closure.hasSemanticContext = false - next := l.addDFAState(s0Closure) - - if !suppressEdge { - l.decisionToDFA[l.mode].setS0(next) - } + next := l.addDFAState(s0Closure, suppressEdge) predict := l.execATN(input, next) @@ -202,11 +204,16 @@ func (l *LexerATNSimulator) execATN(input CharStream, ds0 *DFAState) int { // {@code t}, or {@code nil} if the target state for l edge is not // already cached func (l *LexerATNSimulator) getExistingTargetState(s *DFAState, t int) *DFAState { - if s.getEdges() == nil || t < LexerATNSimulatorMinDFAEdge || t > LexerATNSimulatorMaxDFAEdge { + if t < LexerATNSimulatorMinDFAEdge || t > LexerATNSimulatorMaxDFAEdge { return nil } - target := s.getIthEdge(t-LexerATNSimulatorMinDFAEdge) + l.atn.edgeMu.RLock() + defer l.atn.edgeMu.RUnlock() + if s.getEdges() == nil { + return nil + } + target := s.getIthEdge(t - LexerATNSimulatorMinDFAEdge) if LexerATNSimulatorDebug && target != nil { fmt.Println("reuse state " + strconv.Itoa(s.stateNumber) + " edge to " + strconv.Itoa(target.stateNumber)) } @@ -299,7 +306,7 @@ func (l *LexerATNSimulator) getReachableConfigSet(input CharStream, closure ATNC func (l *LexerATNSimulator) accept(input CharStream, lexerActionExecutor *LexerActionExecutor, startIndex, index, line, charPos int) { if LexerATNSimulatorDebug { - fmt.Printf("ACTION %s\n", lexerActionExecutor) + fmt.Printf("ACTION %v\n", lexerActionExecutor) } // seek to after last char in token input.Seek(index) @@ -536,7 +543,7 @@ func (l *LexerATNSimulator) addDFAEdge(from *DFAState, tk int, to *DFAState, cfg suppressEdge := cfgs.HasSemanticContext() cfgs.SetHasSemanticContext(false) - to = l.addDFAState(cfgs) + to = l.addDFAState(cfgs, true) if suppressEdge { return to @@ -550,6 +557,8 @@ func (l *LexerATNSimulator) addDFAEdge(from *DFAState, tk int, to *DFAState, cfg if LexerATNSimulatorDebug { fmt.Println("EDGE " + from.String() + " -> " + to.String() + " upon " + strconv.Itoa(tk)) } + l.atn.edgeMu.Lock() + defer l.atn.edgeMu.Unlock() if from.getEdges() == nil { // make room for tokens 1..n and -1 masquerading as index 0 from.setEdges(make([]*DFAState, LexerATNSimulatorMaxDFAEdge-LexerATNSimulatorMinDFAEdge+1)) @@ -563,7 +572,7 @@ func (l *LexerATNSimulator) addDFAEdge(from *DFAState, tk int, to *DFAState, cfg // configurations already. This method also detects the first // configuration containing an ATN rule stop state. Later, when // traversing the DFA, we will know which rule to accept. -func (l *LexerATNSimulator) addDFAState(configs ATNConfigSet) *DFAState { +func (l *LexerATNSimulator) addDFAState(configs ATNConfigSet, suppressEdge bool) *DFAState { proposed := NewDFAState(-1, configs) var firstConfigWithRuleStopState ATNConfig @@ -584,16 +593,22 @@ func (l *LexerATNSimulator) addDFAState(configs ATNConfigSet) *DFAState { } hash := proposed.hash() dfa := l.decisionToDFA[l.mode] + + l.atn.stateMu.Lock() + defer l.atn.stateMu.Unlock() existing, ok := dfa.getState(hash) if ok { - return existing - } - newState := proposed - newState.stateNumber = dfa.numStates() - configs.SetReadOnly(true) - newState.configs = configs - dfa.setState(hash, newState) - return newState + proposed = existing + } else { + proposed.stateNumber = dfa.numStates() + configs.SetReadOnly(true) + proposed.configs = configs + dfa.setState(hash, proposed) + } + if !suppressEdge { + dfa.setS0(proposed) + } + return proposed } func (l *LexerATNSimulator) getDFA(mode int) *DFA { @@ -630,7 +645,13 @@ func (l *LexerATNSimulator) GetTokenName(tt int) string { return "EOF" } - return "'" + string(tt) + "'" + var sb strings.Builder + sb.Grow(6) + sb.WriteByte('\'') + sb.WriteRune(rune(tt)) + sb.WriteByte('\'') + + return sb.String() } func resetSimState(sim *SimState) { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go index 3ebc40a76..6ffb37de6 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go @@ -38,7 +38,7 @@ func (la *LL1Analyzer) getDecisionLookahead(s ATNState) []*IntervalSet { look := make([]*IntervalSet, count) for alt := 0; alt < count; alt++ { look[alt] = NewIntervalSet() - lookBusy := NewSet(nil, nil) + lookBusy := newArray2DHashSet(nil, nil) seeThruPreds := false // fail to get lookahead upon pred la.look1(s.GetTransitions()[alt].getTarget(), nil, BasePredictionContextEMPTY, look[alt], lookBusy, NewBitSet(), seeThruPreds, false) // Wipe out lookahead for la alternative if we found nothing @@ -75,7 +75,7 @@ func (la *LL1Analyzer) Look(s, stopState ATNState, ctx RuleContext) *IntervalSet if ctx != nil { lookContext = predictionContextFromRuleContext(s.GetATN(), ctx) } - la.look1(s, stopState, lookContext, r, NewSet(nil, nil), NewBitSet(), seeThruPreds, true) + la.look1(s, stopState, lookContext, r, newArray2DHashSet(nil, nil), NewBitSet(), seeThruPreds, true) return r } @@ -109,22 +109,22 @@ func (la *LL1Analyzer) Look(s, stopState ATNState, ctx RuleContext) *IntervalSet // outermost context is reached. This parameter has no effect if {@code ctx} // is {@code nil}. -func (la *LL1Analyzer) look2(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy *Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool, i int) { +func (la *LL1Analyzer) look2(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool, i int) { returnState := la.atn.states[ctx.getReturnState(i)] la.look1(returnState, stopState, ctx.GetParent(i), look, lookBusy, calledRuleStack, seeThruPreds, addEOF) } -func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy *Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool) { +func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool) { c := NewBaseATNConfig6(s, 0, ctx) - if lookBusy.contains(c) { + if lookBusy.Contains(c) { return } - lookBusy.add(c) + lookBusy.Add(c) if s == stopState { if ctx == nil { @@ -148,13 +148,13 @@ func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look } if ctx != BasePredictionContextEMPTY { - removed := calledRuleStack.contains(s.GetRuleIndex()) - defer func() { - if removed { - calledRuleStack.add(s.GetRuleIndex()) - } - }() - calledRuleStack.remove(s.GetRuleIndex()) + removed := calledRuleStack.contains(s.GetRuleIndex()) + defer func() { + if removed { + calledRuleStack.add(s.GetRuleIndex()) + } + }() + calledRuleStack.remove(s.GetRuleIndex()) // run thru all possible stack tops in ctx for i := 0; i < ctx.length(); i++ { returnState := la.atn.states[ctx.getReturnState(i)] @@ -198,7 +198,7 @@ func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look } } -func (la *LL1Analyzer) look3(stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy *Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool, t1 *RuleTransition) { +func (la *LL1Analyzer) look3(stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool, t1 *RuleTransition) { newContext := SingletonBasePredictionContextCreate(ctx, t1.followState.GetStateNumber()) diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go index fb60258e3..2ab2f5605 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go @@ -425,7 +425,7 @@ func (p *BaseParser) Consume() Token { } hasListener := p.parseListeners != nil && len(p.parseListeners) > 0 if p.BuildParseTrees || hasListener { - if p.errHandler.inErrorRecoveryMode(p) { + if p.errHandler.InErrorRecoveryMode(p) { node := p.ctx.AddErrorNode(o) if p.parseListeners != nil { for _, l := range p.parseListeners { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go index c83e8137b..888d51297 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go @@ -15,6 +15,7 @@ var ( ParserATNSimulatorListATNDecisions = false ParserATNSimulatorDFADebug = false ParserATNSimulatorRetryDebug = false + TurnOffLRLoopEntryBranchOpt = false ) type ParserATNSimulator struct { @@ -95,14 +96,18 @@ func (p *ParserATNSimulator) AdaptivePredict(input TokenStream, decision int, ou // Now we are certain to have a specific decision's DFA // But, do we still need an initial state? var s0 *DFAState + p.atn.stateMu.RLock() if dfa.getPrecedenceDfa() { + p.atn.edgeMu.RLock() // the start state for a precedence DFA depends on the current // parser precedence, and is provided by a DFA method. s0 = dfa.getPrecedenceStartState(p.parser.GetPrecedence()) + p.atn.edgeMu.RUnlock() } else { // the start state for a "regular" DFA is just s0 s0 = dfa.getS0() } + p.atn.stateMu.RUnlock() if s0 == nil { if outerContext == nil { @@ -113,21 +118,10 @@ func (p *ParserATNSimulator) AdaptivePredict(input TokenStream, decision int, ou " exec LA(1)==" + p.getLookaheadName(input) + ", outerContext=" + outerContext.String(p.parser.GetRuleNames(), nil)) } - // If p is not a precedence DFA, we check the ATN start state - // to determine if p ATN start state is the decision for the - // closure block that determines whether a precedence rule - // should continue or complete. - - t2 := dfa.atnStartState - t, ok := t2.(*StarLoopEntryState) - if !dfa.getPrecedenceDfa() && ok { - if t.precedenceRuleDecision { - dfa.setPrecedenceDfa(true) - } - } fullCtx := false s0Closure := p.computeStartState(dfa.atnStartState, RuleContextEmpty, fullCtx) + p.atn.stateMu.Lock() if dfa.getPrecedenceDfa() { // If p is a precedence DFA, we use applyPrecedenceFilter // to convert the computed start state to a precedence start @@ -135,14 +129,19 @@ func (p *ParserATNSimulator) AdaptivePredict(input TokenStream, decision int, ou // appropriate start state for the precedence level rather // than simply setting DFA.s0. // + dfa.s0.configs = s0Closure s0Closure = p.applyPrecedenceFilter(s0Closure) s0 = p.addDFAState(dfa, NewDFAState(-1, s0Closure)) + p.atn.edgeMu.Lock() dfa.setPrecedenceStartState(p.parser.GetPrecedence(), s0) + p.atn.edgeMu.Unlock() } else { s0 = p.addDFAState(dfa, NewDFAState(-1, s0Closure)) dfa.setS0(s0) } + p.atn.stateMu.Unlock() } + alt := p.execATN(dfa, s0, input, index, outerContext) if ParserATNSimulatorDebug { fmt.Println("DFA after predictATN: " + dfa.String(p.parser.GetLiteralNames(), nil)) @@ -259,11 +258,13 @@ func (p *ParserATNSimulator) execATN(dfa *DFA, s0 *DFAState, input TokenStream, stopIndex := input.Index() input.Seek(startIndex) alts := p.evalSemanticContext(D.predicates, outerContext, true) - if alts.length() == 0 { + + switch alts.length() { + case 0: panic(p.noViableAlt(input, outerContext, D.configs, startIndex)) - } else if alts.length() == 1 { + case 1: return alts.minValue() - } else { + default: // Report ambiguity after predicate evaluation to make sure the correct set of ambig alts is Reported. p.ReportAmbiguity(dfa, D, startIndex, stopIndex, false, alts, D.configs) return alts.minValue() @@ -291,12 +292,17 @@ func (p *ParserATNSimulator) execATN(dfa *DFA, s0 *DFAState, input TokenStream, // already cached func (p *ParserATNSimulator) getExistingTargetState(previousD *DFAState, t int) *DFAState { - edges := previousD.getEdges() - if edges == nil { + if t+1 < 0 { return nil } - return previousD.getIthEdge(t+1) + p.atn.edgeMu.RLock() + defer p.atn.edgeMu.RUnlock() + edges := previousD.getEdges() + if edges == nil || t+1 >= len(edges) { + return nil + } + return previousD.getIthEdge(t + 1) } // Compute a target state for an edge in the DFA, and attempt to add the @@ -422,7 +428,8 @@ func (p *ParserATNSimulator) execATNWithFullContext(dfa *DFA, D *DFAState, s0 AT if reach.GetUniqueAlt() != ATNInvalidAltNumber { predictedAlt = reach.GetUniqueAlt() break - } else if p.predictionMode != PredictionModeLLExactAmbigDetection { + } + if p.predictionMode != PredictionModeLLExactAmbigDetection { predictedAlt = PredictionModeresolvesToJustOneViableAlt(altSubSets) if predictedAlt != ATNInvalidAltNumber { break @@ -479,7 +486,7 @@ func (p *ParserATNSimulator) execATNWithFullContext(dfa *DFA, D *DFAState, s0 AT // the fact that we should predict alternative 1. We just can't say for // sure that there is an ambiguity without looking further. - p.ReportAmbiguity(dfa, D, startIndex, input.Index(), foundExactAmbig, nil, reach) + p.ReportAmbiguity(dfa, D, startIndex, input.Index(), foundExactAmbig, reach.Alts(), reach) return predictedAlt } @@ -503,7 +510,7 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt // ensure that the alternative Matching the longest overall sequence is // chosen when multiple such configurations can Match the input. - var SkippedStopStates []*BaseATNConfig + var skippedStopStates []*BaseATNConfig // First figure out where we can reach on input t for _, c := range closure.GetItems() { @@ -511,14 +518,9 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt fmt.Println("testing " + p.GetTokenName(t) + " at " + c.String()) } - _, ok := c.GetState().(*RuleStopState) - - if ok { + if _, ok := c.GetState().(*RuleStopState); ok { if fullCtx || t == TokenEOF { - if SkippedStopStates == nil { - SkippedStopStates = make([]*BaseATNConfig, 0) - } - SkippedStopStates = append(SkippedStopStates, c.(*BaseATNConfig)) + skippedStopStates = append(skippedStopStates, c.(*BaseATNConfig)) if ParserATNSimulatorDebug { fmt.Println("added " + c.String() + " to SkippedStopStates") } @@ -526,8 +528,7 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt continue } - for j := 0; j < len(c.GetState().GetTransitions()); j++ { - trans := c.GetState().GetTransitions()[j] + for _, trans := range c.GetState().GetTransitions() { target := p.getReachableTarget(trans, t) if target != nil { cfg := NewBaseATNConfig4(c, target) @@ -538,6 +539,7 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt } } } + // Now figure out where the reach operation can take us... var reach ATNConfigSet @@ -550,7 +552,7 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt // condition is not true when one or more configurations have been // withheld in SkippedStopStates, or when the current symbol is EOF. // - if SkippedStopStates == nil && t != TokenEOF { + if skippedStopStates == nil && t != TokenEOF { if len(intermediate.configs) == 1 { // Don't pursue the closure if there is just one state. // It can only have one alternative just add to result @@ -568,9 +570,10 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt // if reach == nil { reach = NewBaseATNConfigSet(fullCtx) - closureBusy := NewSet(nil, nil) + closureBusy := newArray2DHashSet(nil, nil) treatEOFAsEpsilon := t == TokenEOF - for k := 0; k < len(intermediate.configs); k++ { + amount := len(intermediate.configs) + for k := 0; k < amount; k++ { p.closure(intermediate.configs[k], reach, closureBusy, false, fullCtx, treatEOFAsEpsilon) } } @@ -602,9 +605,9 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt // chooses an alternative Matching the longest overall sequence when // multiple alternatives are viable. // - if SkippedStopStates != nil && ((!fullCtx) || (!PredictionModehasConfigInRuleStopState(reach))) { - for l := 0; l < len(SkippedStopStates); l++ { - reach.Add(SkippedStopStates[l], p.mergeCache) + if skippedStopStates != nil && ((!fullCtx) || (!PredictionModehasConfigInRuleStopState(reach))) { + for l := 0; l < len(skippedStopStates); l++ { + reach.Add(skippedStopStates[l], p.mergeCache) } } if len(reach.GetItems()) == 0 { @@ -640,10 +643,7 @@ func (p *ParserATNSimulator) removeAllConfigsNotInRuleStopState(configs ATNConfi } result := NewBaseATNConfigSet(configs.FullContext()) for _, config := range configs.GetItems() { - - _, ok := config.GetState().(*RuleStopState) - - if ok { + if _, ok := config.GetState().(*RuleStopState); ok { result.Add(config, p.mergeCache) continue } @@ -665,7 +665,7 @@ func (p *ParserATNSimulator) computeStartState(a ATNState, ctx RuleContext, full for i := 0; i < len(a.GetTransitions()); i++ { target := a.GetTransitions()[i].getTarget() c := NewBaseATNConfig6(target, i+1, initialContext) - closureBusy := NewSet(nil, nil) + closureBusy := newArray2DHashSet(nil, nil) p.closure(c, configs, closureBusy, true, fullCtx, false) } return configs @@ -787,7 +787,7 @@ func (p *ParserATNSimulator) getPredsForAmbigAlts(ambigAlts *BitSet, configs ATN } } nPredAlts := 0 - for i := 1; i < nalts+1; i++ { + for i := 1; i <= nalts; i++ { pred := altToPred[i] if pred == nil { altToPred[i] = SemanticContextNone @@ -972,14 +972,13 @@ func (p *ParserATNSimulator) evalSemanticContext(predPredictions []*PredPredicti return predictions } -func (p *ParserATNSimulator) closure(config ATNConfig, configs ATNConfigSet, closureBusy *Set, collectPredicates, fullCtx, treatEOFAsEpsilon bool) { +func (p *ParserATNSimulator) closure(config ATNConfig, configs ATNConfigSet, closureBusy Set, collectPredicates, fullCtx, treatEOFAsEpsilon bool) { initialDepth := 0 p.closureCheckingStopState(config, configs, closureBusy, collectPredicates, fullCtx, initialDepth, treatEOFAsEpsilon) } -func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs ATNConfigSet, closureBusy *Set, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) { - +func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs ATNConfigSet, closureBusy Set, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) { if ParserATNSimulatorDebug { fmt.Println("closure(" + config.String() + ")") fmt.Println("configs(" + configs.String() + ")") @@ -988,8 +987,7 @@ func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs } } - _, ok := config.GetState().(*RuleStopState) - if ok { + if _, ok := config.GetState().(*RuleStopState); ok { // We hit rule end. If we have context info, use it // run thru all possible stack tops in ctx if !config.GetContext().isEmpty() { @@ -1033,7 +1031,7 @@ func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs } // Do the actual work of walking epsilon edges// -func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, closureBusy *Set, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) { +func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, closureBusy Set, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) { state := config.GetState() // optimization if !state.GetEpsilonOnlyTransitions() { @@ -1042,30 +1040,24 @@ func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, // both epsilon transitions and non-epsilon transitions. } for i := 0; i < len(state.GetTransitions()); i++ { + if i == 0 && p.canDropLoopEntryEdgeInLeftRecursiveRule(config) { + continue + } + t := state.GetTransitions()[i] _, ok := t.(*ActionTransition) continueCollecting := collectPredicates && !ok c := p.getEpsilonTarget(config, t, continueCollecting, depth == 0, fullCtx, treatEOFAsEpsilon) if ci, ok := c.(*BaseATNConfig); ok && ci != nil { - if !t.getIsEpsilon() && closureBusy.add(c) != c { - // avoid infinite recursion for EOF* and EOF+ - continue - } newDepth := depth if _, ok := config.GetState().(*RuleStopState); ok { - // target fell off end of rule mark resulting c as having dipped into outer context // We can't get here if incoming config was rule stop and we had context // track how far we dip into outer context. Might // come in handy and we avoid evaluating context dependent // preds if p is > 0. - if closureBusy.add(c) != c { - // avoid infinite recursion for right-recursive rules - continue - } - if p.dfa != nil && p.dfa.getPrecedenceDfa() { if t.(*EpsilonTransition).outermostPrecedenceReturn == p.dfa.atnStartState.GetRuleIndex() { c.setPrecedenceFilterSuppressed(true) @@ -1073,15 +1065,27 @@ func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, } c.SetReachesIntoOuterContext(c.GetReachesIntoOuterContext() + 1) + + if closureBusy.Add(c) != c { + // avoid infinite recursion for right-recursive rules + continue + } + configs.SetDipsIntoOuterContext(true) // TODO: can remove? only care when we add to set per middle of p method newDepth-- if ParserATNSimulatorDebug { fmt.Println("dips into outer ctx: " + c.String()) } - } else if _, ok := t.(*RuleTransition); ok { - // latch when newDepth goes negative - once we step out of the entry context we can't return - if newDepth >= 0 { - newDepth++ + } else { + if !t.getIsEpsilon() && closureBusy.Add(c) != c { + // avoid infinite recursion for EOF* and EOF+ + continue + } + if _, ok := t.(*RuleTransition); ok { + // latch when newDepth goes negative - once we step out of the entry context we can't return + if newDepth >= 0 { + newDepth++ + } } } p.closureCheckingStopState(c, configs, closureBusy, continueCollecting, fullCtx, newDepth, treatEOFAsEpsilon) @@ -1089,12 +1093,93 @@ func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, } } +func (p *ParserATNSimulator) canDropLoopEntryEdgeInLeftRecursiveRule(config ATNConfig) bool { + if TurnOffLRLoopEntryBranchOpt { + return false + } + + _p := config.GetState() + + // First check to see if we are in StarLoopEntryState generated during + // left-recursion elimination. For efficiency, also check if + // the context has an empty stack case. If so, it would mean + // global FOLLOW so we can't perform optimization + if startLoop, ok := _p.(StarLoopEntryState); !ok || !startLoop.precedenceRuleDecision || config.GetContext().isEmpty() || config.GetContext().hasEmptyPath() { + return false + } + + // Require all return states to return back to the same rule + // that p is in. + numCtxs := config.GetContext().length() + for i := 0; i < numCtxs; i++ { + returnState := p.atn.states[config.GetContext().getReturnState(i)] + if returnState.GetRuleIndex() != _p.GetRuleIndex() { + return false + } + } + + decisionStartState := _p.(BlockStartState).GetTransitions()[0].getTarget().(BlockStartState) + blockEndStateNum := decisionStartState.getEndState().stateNumber + blockEndState := p.atn.states[blockEndStateNum].(*BlockEndState) + + // Verify that the top of each stack context leads to loop entry/exit + // state through epsilon edges and w/o leaving rule. + + for i := 0; i < numCtxs; i++ { // for each stack context + returnStateNumber := config.GetContext().getReturnState(i) + returnState := p.atn.states[returnStateNumber] + + // all states must have single outgoing epsilon edge + if len(returnState.GetTransitions()) != 1 || !returnState.GetTransitions()[0].getIsEpsilon() { + return false + } + + // Look for prefix op case like 'not expr', (' type ')' expr + returnStateTarget := returnState.GetTransitions()[0].getTarget() + if returnState.GetStateType() == ATNStateBlockEnd && returnStateTarget == _p { + continue + } + + // Look for 'expr op expr' or case where expr's return state is block end + // of (...)* internal block; the block end points to loop back + // which points to p but we don't need to check that + if returnState == blockEndState { + continue + } + + // Look for ternary expr ? expr : expr. The return state points at block end, + // which points at loop entry state + if returnStateTarget == blockEndState { + continue + } + + // Look for complex prefix 'between expr and expr' case where 2nd expr's + // return state points at block end state of (...)* internal block + if returnStateTarget.GetStateType() == ATNStateBlockEnd && + len(returnStateTarget.GetTransitions()) == 1 && + returnStateTarget.GetTransitions()[0].getIsEpsilon() && + returnStateTarget.GetTransitions()[0].getTarget() == _p { + continue + } + + // anything else ain't conforming + return false + } + + return true +} + func (p *ParserATNSimulator) getRuleName(index int) string { if p.parser != nil && index >= 0 { return p.parser.GetRuleNames()[index] } + var sb strings.Builder + sb.Grow(32) - return "" + sb.WriteString("') + return sb.String() } func (p *ParserATNSimulator) getEpsilonTarget(config ATNConfig, t Transition, collectPredicates, inContext, fullCtx, treatEOFAsEpsilon bool) ATNConfig { @@ -1110,25 +1195,7 @@ func (p *ParserATNSimulator) getEpsilonTarget(config ATNConfig, t Transition, co return p.actionTransition(config, t.(*ActionTransition)) case TransitionEPSILON: return NewBaseATNConfig4(config, t.getTarget()) - case TransitionATOM: - // EOF transitions act like epsilon transitions after the first EOF - // transition is traversed - if treatEOFAsEpsilon { - if t.Matches(TokenEOF, 0, 1) { - return NewBaseATNConfig4(config, t.getTarget()) - } - } - return nil - case TransitionRANGE: - // EOF transitions act like epsilon transitions after the first EOF - // transition is traversed - if treatEOFAsEpsilon { - if t.Matches(TokenEOF, 0, 1) { - return NewBaseATNConfig4(config, t.getTarget()) - } - } - return nil - case TransitionSET: + case TransitionATOM, TransitionRANGE, TransitionSET: // EOF transitions act like epsilon transitions after the first EOF // transition is traversed if treatEOFAsEpsilon { @@ -1196,7 +1263,7 @@ func (p *ParserATNSimulator) predTransition(config ATNConfig, pt *PredicateTrans } } var c *BaseATNConfig - if collectPredicates && ((pt.isCtxDependent && inContext) || !pt.isCtxDependent) { + if collectPredicates && (!pt.isCtxDependent || inContext) { if fullCtx { // In full context mode, we can evaluate predicates on-the-fly // during closure, which dramatically reduces the size of @@ -1381,14 +1448,18 @@ func (p *ParserATNSimulator) addDFAEdge(dfa *DFA, from *DFAState, t int, to *DFA if to == nil { return nil } + p.atn.stateMu.Lock() to = p.addDFAState(dfa, to) // used existing if possible not incoming + p.atn.stateMu.Unlock() if from == nil || t < -1 || t > p.atn.maxTokenType { return to } + p.atn.edgeMu.Lock() if from.getEdges() == nil { from.setEdges(make([]*DFAState, p.atn.maxTokenType+1+1)) } from.setIthEdge(t+1, to) // connect + p.atn.edgeMu.Unlock() if ParserATNSimulatorDebug { var names []string diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go index 99acb333f..9fdfd52b2 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go @@ -58,9 +58,15 @@ func calculateHash(parent PredictionContext, returnState int) int { return murmurFinish(h, 2) } +var _emptyPredictionContextHash int + +func init() { + _emptyPredictionContextHash = murmurInit(1) + _emptyPredictionContextHash = murmurFinish(_emptyPredictionContextHash, 0) +} + func calculateEmptyHash() int { - h := murmurInit(1) - return murmurFinish(h, 0) + return _emptyPredictionContextHash } // Used to cache {@link BasePredictionContext} objects. Its used for the shared @@ -113,16 +119,16 @@ type BaseSingletonPredictionContext struct { } func NewBaseSingletonPredictionContext(parent PredictionContext, returnState int) *BaseSingletonPredictionContext { - - s := new(BaseSingletonPredictionContext) - s.BasePredictionContext = NewBasePredictionContext(37) - + var cachedHash int if parent != nil { - s.cachedHash = calculateHash(parent, returnState) + cachedHash = calculateHash(parent, returnState) } else { - s.cachedHash = calculateEmptyHash() + cachedHash = calculateEmptyHash() } + s := new(BaseSingletonPredictionContext) + s.BasePredictionContext = NewBasePredictionContext(cachedHash) + s.parentCtx = parent s.returnState = returnState @@ -175,15 +181,7 @@ func (b *BaseSingletonPredictionContext) equals(other PredictionContext) bool { } func (b *BaseSingletonPredictionContext) hash() int { - h := murmurInit(1) - - if b.parentCtx == nil { - return murmurFinish(h, 0) - } - - h = murmurUpdate(h, b.parentCtx.hash()) - h = murmurUpdate(h, b.returnState) - return murmurFinish(h, 2) + return b.cachedHash } func (b *BaseSingletonPredictionContext) String() string { @@ -253,14 +251,21 @@ func NewArrayPredictionContext(parents []PredictionContext, returnStates []int) // from {@link //EMPTY} and non-empty. We merge {@link //EMPTY} by using // nil parent and // returnState == {@link //EmptyReturnState}. + hash := murmurInit(1) - c := new(ArrayPredictionContext) - c.BasePredictionContext = NewBasePredictionContext(37) + for _, parent := range parents { + hash = murmurUpdate(hash, parent.hash()) + } - for i := range parents { - c.cachedHash += calculateHash(parents[i], returnStates[i]) + for _, returnState := range returnStates { + hash = murmurUpdate(hash, returnState) } + hash = murmurFinish(hash, len(parents)<<1) + + c := new(ArrayPredictionContext) + c.BasePredictionContext = NewBasePredictionContext(hash) + c.parents = parents c.returnStates = returnStates @@ -305,17 +310,7 @@ func (a *ArrayPredictionContext) equals(other PredictionContext) bool { } func (a *ArrayPredictionContext) hash() int { - h := murmurInit(1) - - for _, p := range a.parents { - h = murmurUpdate(h, p.hash()) - } - - for _, r := range a.returnStates { - h = murmurUpdate(h, r) - } - - return murmurFinish(h, 2 * len(a.parents)) + return a.BasePredictionContext.cachedHash } func (a *ArrayPredictionContext) String() string { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go index 89d35244a..93efcf355 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go @@ -49,7 +49,7 @@ var tokenTypeMapCache = make(map[string]int) var ruleIndexMapCache = make(map[string]int) func (b *BaseRecognizer) checkVersion(toolVersion string) { - runtimeVersion := "4.9.2" + runtimeVersion := "4.10.1" if runtimeVersion != toolVersion { fmt.Println("ANTLR runtime and generated code versions disagree: " + runtimeVersion + "!=" + toolVersion) } diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go index 49205a162..9ada43077 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go @@ -108,7 +108,15 @@ func (p *Predicate) equals(other interface{}) bool { } func (p *Predicate) hash() int { - return p.ruleIndex*43 + p.predIndex*47 + h := murmurInit(0) + h = murmurUpdate(h, p.ruleIndex) + h = murmurUpdate(h, p.predIndex) + if p.isCtxDependent { + h = murmurUpdate(h, 1) + } else { + h = murmurUpdate(h, 0) + } + return murmurFinish(h, 3) } func (p *Predicate) String() string { @@ -154,21 +162,24 @@ func (p *PrecedencePredicate) equals(other interface{}) bool { } func (p *PrecedencePredicate) hash() int { - return p.precedence * 51 + h := uint32(1) + h = 31*h + uint32(p.precedence) + return int(h) } func (p *PrecedencePredicate) String() string { return "{" + strconv.Itoa(p.precedence) + ">=prec}?" } -func PrecedencePredicatefilterPrecedencePredicates(set *Set) []*PrecedencePredicate { +func PrecedencePredicatefilterPrecedencePredicates(set Set) []*PrecedencePredicate { result := make([]*PrecedencePredicate, 0) - for _, v := range set.values() { + set.Each(func(v interface{}) bool { if c2, ok := v.(*PrecedencePredicate); ok { result = append(result, c2) } - } + return true + }) return result } @@ -182,21 +193,21 @@ type AND struct { func NewAND(a, b SemanticContext) *AND { - operands := NewSet(nil, nil) + operands := newArray2DHashSet(nil, nil) if aa, ok := a.(*AND); ok { for _, o := range aa.opnds { - operands.add(o) + operands.Add(o) } } else { - operands.add(a) + operands.Add(a) } if ba, ok := b.(*AND); ok { for _, o := range ba.opnds { - operands.add(o) + operands.Add(o) } } else { - operands.add(b) + operands.Add(b) } precedencePredicates := PrecedencePredicatefilterPrecedencePredicates(operands) if len(precedencePredicates) > 0 { @@ -209,10 +220,10 @@ func NewAND(a, b SemanticContext) *AND { } } - operands.add(reduced) + operands.Add(reduced) } - vs := operands.values() + vs := operands.Values() opnds := make([]SemanticContext, len(vs)) for i, v := range vs { opnds[i] = v.(SemanticContext) @@ -334,21 +345,21 @@ type OR struct { func NewOR(a, b SemanticContext) *OR { - operands := NewSet(nil, nil) + operands := newArray2DHashSet(nil, nil) if aa, ok := a.(*OR); ok { for _, o := range aa.opnds { - operands.add(o) + operands.Add(o) } } else { - operands.add(a) + operands.Add(a) } if ba, ok := b.(*OR); ok { for _, o := range ba.opnds { - operands.add(o) + operands.Add(o) } } else { - operands.add(b) + operands.Add(b) } precedencePredicates := PrecedencePredicatefilterPrecedencePredicates(operands) if len(precedencePredicates) > 0 { @@ -361,10 +372,10 @@ func NewOR(a, b SemanticContext) *OR { } } - operands.add(reduced) + operands.Add(reduced) } - vs := operands.values() + vs := operands.Values() opnds := make([]SemanticContext, len(vs)) for i, v := range vs { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/transition.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/transition.go index eb7e57e9a..53056bd74 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/transition.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/transition.go @@ -7,6 +7,7 @@ package antlr import ( "fmt" "strconv" + "strings" ) // atom, set, epsilon, action, predicate, rule transitions. @@ -236,7 +237,13 @@ func (t *RangeTransition) Matches(symbol, minVocabSymbol, maxVocabSymbol int) bo } func (t *RangeTransition) String() string { - return "'" + string(t.start) + "'..'" + string(t.stop) + "'" + var sb strings.Builder + sb.WriteByte('\'') + sb.WriteRune(rune(t.start)) + sb.WriteString("'..'") + sb.WriteRune(rune(t.stop)) + sb.WriteByte('\'') + return sb.String() } type AbstractPredicateTransition interface { diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tree.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tree.go index bdeb6d788..08ce22bba 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tree.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tree.go @@ -64,7 +64,7 @@ type BaseParseTreeVisitor struct{} var _ ParseTreeVisitor = &BaseParseTreeVisitor{} -func (v *BaseParseTreeVisitor) Visit(tree ParseTree) interface{} { return nil } +func (v *BaseParseTreeVisitor) Visit(tree ParseTree) interface{} { return tree.Accept(v) } func (v *BaseParseTreeVisitor) VisitChildren(node RuleNode) interface{} { return nil } func (v *BaseParseTreeVisitor) VisitTerminal(node TerminalNode) interface{} { return nil } func (v *BaseParseTreeVisitor) VisitErrorNode(node ErrorNode) interface{} { return nil } diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils.go index bba2ffae7..ec219df98 100644 --- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils.go +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils.go @@ -8,7 +8,7 @@ import ( "bytes" "errors" "fmt" - "sort" + "math/bits" "strconv" "strings" ) @@ -47,35 +47,6 @@ func (s *IntStack) Push(e int) { *s = append(*s, e) } -type Set struct { - data map[int][]interface{} - hashcodeFunction func(interface{}) int - equalsFunction func(interface{}, interface{}) bool -} - -func NewSet( - hashcodeFunction func(interface{}) int, - equalsFunction func(interface{}, interface{}) bool) *Set { - - s := new(Set) - - s.data = make(map[int][]interface{}) - - if hashcodeFunction != nil { - s.hashcodeFunction = hashcodeFunction - } else { - s.hashcodeFunction = standardHashFunction - } - - if equalsFunction == nil { - s.equalsFunction = standardEqualsFunction - } else { - s.equalsFunction = equalsFunction - } - - return s -} - func standardEqualsFunction(a interface{}, b interface{}) bool { ac, oka := a.(comparable) @@ -100,125 +71,92 @@ type hasher interface { hash() int } -func (s *Set) length() int { - return len(s.data) -} - -func (s *Set) add(value interface{}) interface{} { - - key := s.hashcodeFunction(value) +const bitsPerWord = 64 - values := s.data[key] - - if s.data[key] != nil { - for i := 0; i < len(values); i++ { - if s.equalsFunction(value, values[i]) { - return values[i] - } - } - - s.data[key] = append(s.data[key], value) - return value - } - - v := make([]interface{}, 1, 10) - v[0] = value - s.data[key] = v - - return value +func indexForBit(bit int) int { + return bit / bitsPerWord } -func (s *Set) contains(value interface{}) bool { - - key := s.hashcodeFunction(value) - - values := s.data[key] - - if s.data[key] != nil { - for i := 0; i < len(values); i++ { - if s.equalsFunction(value, values[i]) { - return true - } - } +func wordForBit(data []uint64, bit int) uint64 { + idx := indexForBit(bit) + if idx >= len(data) { + return 0 } - return false + return data[idx] } -func (s *Set) values() []interface{} { - var l []interface{} - - for _, v := range s.data { - l = append(l, v...) - } - - return l +func maskForBit(bit int) uint64 { + return uint64(1) << (bit % bitsPerWord) } -func (s *Set) String() string { - r := "" - - for _, av := range s.data { - for _, v := range av { - r += fmt.Sprint(v) - } - } - - return r +func wordsNeeded(bit int) int { + return indexForBit(bit) + 1 } type BitSet struct { - data map[int]bool + data []uint64 } func NewBitSet() *BitSet { - b := new(BitSet) - b.data = make(map[int]bool) - return b + return &BitSet{} } func (b *BitSet) add(value int) { - b.data[value] = true + idx := indexForBit(value) + if idx >= len(b.data) { + size := wordsNeeded(value) + data := make([]uint64, size) + copy(data, b.data) + b.data = data + } + b.data[idx] |= maskForBit(value) } func (b *BitSet) clear(index int) { - delete(b.data, index) + idx := indexForBit(index) + if idx >= len(b.data) { + return + } + b.data[idx] &= ^maskForBit(index) } func (b *BitSet) or(set *BitSet) { - for k := range set.data { - b.add(k) + // Get min size necessary to represent the bits in both sets. + bLen := b.minLen() + setLen := set.minLen() + maxLen := intMax(bLen, setLen) + if maxLen > len(b.data) { + // Increase the size of len(b.data) to repesent the bits in both sets. + data := make([]uint64, maxLen) + copy(data, b.data) + b.data = data + } + // len(b.data) is at least setLen. + for i := 0; i < setLen; i++ { + b.data[i] |= set.data[i] } } func (b *BitSet) remove(value int) { - delete(b.data, value) + b.clear(value) } func (b *BitSet) contains(value int) bool { - return b.data[value] -} - -func (b *BitSet) values() []int { - ks := make([]int, len(b.data)) - i := 0 - for k := range b.data { - ks[i] = k - i++ + idx := indexForBit(value) + if idx >= len(b.data) { + return false } - sort.Ints(ks) - return ks + return (b.data[idx] & maskForBit(value)) != 0 } func (b *BitSet) minValue() int { - min := 2147483647 - - for k := range b.data { - if k < min { - min = k + for i, v := range b.data { + if v == 0 { + continue } + return i*bitsPerWord + bits.TrailingZeros64(v) } - - return min + return 2147483647 } func (b *BitSet) equals(other interface{}) bool { @@ -227,12 +165,22 @@ func (b *BitSet) equals(other interface{}) bool { return false } - if len(b.data) != len(otherBitSet.data) { + if b == otherBitSet { + return true + } + + // We only compare set bits, so we cannot rely on the two slices having the same size. Its + // possible for two BitSets to have different slice lengths but the same set bits. So we only + // compare the relavent words and ignore the trailing zeros. + bLen := b.minLen() + otherLen := otherBitSet.minLen() + + if bLen != otherLen { return false } - for k, v := range b.data { - if otherBitSet.data[k] != v { + for i := 0; i < bLen; i++ { + if b.data[i] != otherBitSet.data[i] { return false } } @@ -240,18 +188,35 @@ func (b *BitSet) equals(other interface{}) bool { return true } +func (b *BitSet) minLen() int { + for i := len(b.data); i > 0; i-- { + if b.data[i-1] != 0 { + return i + } + } + return 0 +} + func (b *BitSet) length() int { - return len(b.data) + cnt := 0 + for _, val := range b.data { + cnt += bits.OnesCount64(val) + } + return cnt } func (b *BitSet) String() string { - vals := b.values() - valsS := make([]string, len(vals)) + vals := make([]string, 0, b.length()) - for i, val := range vals { - valsS[i] = strconv.Itoa(val) + for i, v := range b.data { + for v != 0 { + n := bits.TrailingZeros64(v) + vals = append(vals, strconv.Itoa(i*bitsPerWord+n)) + v &= ^(uint64(1) << n) + } } - return "{" + strings.Join(valsS, ", ") + "}" + + return "{" + strings.Join(vals, ", ") + "}" } type AltDict struct { @@ -353,65 +318,38 @@ func PrintArrayJavaStyle(sa []string) string { return buffer.String() } -// The following routines were lifted from bits.rotate* available in Go 1.9. - -const uintSize = 32 << (^uint(0) >> 32 & 1) // 32 or 64 - -// rotateLeft returns the value of x rotated left by (k mod UintSize) bits. -// To rotate x right by k bits, call RotateLeft(x, -k). -func rotateLeft(x uint, k int) uint { - if uintSize == 32 { - return uint(rotateLeft32(uint32(x), k)) - } - return uint(rotateLeft64(uint64(x), k)) -} - -// rotateLeft32 returns the value of x rotated left by (k mod 32) bits. -func rotateLeft32(x uint32, k int) uint32 { - const n = 32 - s := uint(k) & (n - 1) - return x<>(n-s) -} - -// rotateLeft64 returns the value of x rotated left by (k mod 64) bits. -func rotateLeft64(x uint64, k int) uint64 { - const n = 64 - s := uint(k) & (n - 1) - return x<>(n-s) -} - - // murmur hash -const ( - c1_32 uint = 0xCC9E2D51 - c2_32 uint = 0x1B873593 - n1_32 uint = 0xE6546B64 -) - func murmurInit(seed int) int { return seed } -func murmurUpdate(h1 int, k1 int) int { - var k1u uint - k1u = uint(k1) * c1_32 - k1u = rotateLeft(k1u, 15) - k1u *= c2_32 +func murmurUpdate(h int, value int) int { + const c1 uint32 = 0xCC9E2D51 + const c2 uint32 = 0x1B873593 + const r1 uint32 = 15 + const r2 uint32 = 13 + const m uint32 = 5 + const n uint32 = 0xE6546B64 + + k := uint32(value) + k *= c1 + k = (k << r1) | (k >> (32 - r1)) + k *= c2 - var h1u = uint(h1) ^ k1u - k1u = rotateLeft(k1u, 13) - h1u = h1u*5 + 0xe6546b64 - return int(h1u) + hash := uint32(h) ^ k + hash = (hash << r2) | (hash >> (32 - r2)) + hash = hash*m + n + return int(hash) } -func murmurFinish(h1 int, numberOfWords int) int { - var h1u uint = uint(h1) - h1u ^= uint(numberOfWords * 4) - h1u ^= h1u >> 16 - h1u *= uint(0x85ebca6b) - h1u ^= h1u >> 13 - h1u *= 0xc2b2ae35 - h1u ^= h1u >> 16 +func murmurFinish(h int, numberOfWords int) int { + var hash = uint32(h) + hash ^= uint32(numberOfWords) << 2 + hash ^= hash >> 16 + hash *= 0x85ebca6b + hash ^= hash >> 13 + hash *= 0xc2b2ae35 + hash ^= hash >> 16 - return int(h1u) + return int(hash) } diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils_set.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils_set.go new file mode 100644 index 000000000..0d4eac698 --- /dev/null +++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils_set.go @@ -0,0 +1,237 @@ +package antlr + +import "math" + +const ( + _initalCapacity = 16 + _initalBucketCapacity = 8 + _loadFactor = 0.75 +) + +var _ Set = (*array2DHashSet)(nil) + +type Set interface { + Add(value interface{}) (added interface{}) + Len() int + Get(value interface{}) (found interface{}) + Contains(value interface{}) bool + Values() []interface{} + Each(f func(interface{}) bool) +} + +type array2DHashSet struct { + buckets [][]interface{} + hashcodeFunction func(interface{}) int + equalsFunction func(interface{}, interface{}) bool + + n int // How many elements in set + threshold int // when to expand + + currentPrime int // jump by 4 primes each expand or whatever + initialBucketCapacity int +} + +func (as *array2DHashSet) Each(f func(interface{}) bool) { + if as.Len() < 1 { + return + } + + for _, bucket := range as.buckets { + for _, o := range bucket { + if o == nil { + break + } + if !f(o) { + return + } + } + } +} + +func (as *array2DHashSet) Values() []interface{} { + if as.Len() < 1 { + return nil + } + + values := make([]interface{}, 0, as.Len()) + as.Each(func(i interface{}) bool { + values = append(values, i) + return true + }) + return values +} + +func (as *array2DHashSet) Contains(value interface{}) bool { + return as.Get(value) != nil +} + +func (as *array2DHashSet) Add(value interface{}) interface{} { + if as.n > as.threshold { + as.expand() + } + return as.innerAdd(value) +} + +func (as *array2DHashSet) expand() { + old := as.buckets + + as.currentPrime += 4 + + var ( + newCapacity = len(as.buckets) << 1 + newTable = as.createBuckets(newCapacity) + newBucketLengths = make([]int, len(newTable)) + ) + + as.buckets = newTable + as.threshold = int(float64(newCapacity) * _loadFactor) + + for _, bucket := range old { + if bucket == nil { + continue + } + + for _, o := range bucket { + if o == nil { + break + } + + b := as.getBuckets(o) + bucketLength := newBucketLengths[b] + var newBucket []interface{} + if bucketLength == 0 { + // new bucket + newBucket = as.createBucket(as.initialBucketCapacity) + newTable[b] = newBucket + } else { + newBucket = newTable[b] + if bucketLength == len(newBucket) { + // expand + newBucketCopy := make([]interface{}, len(newBucket)<<1) + copy(newBucketCopy[:bucketLength], newBucket) + newBucket = newBucketCopy + newTable[b] = newBucket + } + } + + newBucket[bucketLength] = o + newBucketLengths[b]++ + } + } +} + +func (as *array2DHashSet) Len() int { + return as.n +} + +func (as *array2DHashSet) Get(o interface{}) interface{} { + if o == nil { + return nil + } + + b := as.getBuckets(o) + bucket := as.buckets[b] + if bucket == nil { // no bucket + return nil + } + + for _, e := range bucket { + if e == nil { + return nil // empty slot; not there + } + if as.equalsFunction(e, o) { + return e + } + } + + return nil +} + +func (as *array2DHashSet) innerAdd(o interface{}) interface{} { + b := as.getBuckets(o) + + bucket := as.buckets[b] + + // new bucket + if bucket == nil { + bucket = as.createBucket(as.initialBucketCapacity) + bucket[0] = o + + as.buckets[b] = bucket + as.n++ + return o + } + + // look for it in bucket + for i := 0; i < len(bucket); i++ { + existing := bucket[i] + if existing == nil { // empty slot; not there, add. + bucket[i] = o + as.n++ + return o + } + + if as.equalsFunction(existing, o) { // found existing, quit + return existing + } + } + + // full bucket, expand and add to end + oldLength := len(bucket) + bucketCopy := make([]interface{}, oldLength<<1) + copy(bucketCopy[:oldLength], bucket) + bucket = bucketCopy + as.buckets[b] = bucket + bucket[oldLength] = o + as.n++ + return o +} + +func (as *array2DHashSet) getBuckets(value interface{}) int { + hash := as.hashcodeFunction(value) + return hash & (len(as.buckets) - 1) +} + +func (as *array2DHashSet) createBuckets(cap int) [][]interface{} { + return make([][]interface{}, cap) +} + +func (as *array2DHashSet) createBucket(cap int) []interface{} { + return make([]interface{}, cap) +} + +func newArray2DHashSetWithCap( + hashcodeFunction func(interface{}) int, + equalsFunction func(interface{}, interface{}) bool, + initCap int, + initBucketCap int, +) *array2DHashSet { + if hashcodeFunction == nil { + hashcodeFunction = standardHashFunction + } + + if equalsFunction == nil { + equalsFunction = standardEqualsFunction + } + + ret := &array2DHashSet{ + hashcodeFunction: hashcodeFunction, + equalsFunction: equalsFunction, + + n: 0, + threshold: int(math.Floor(_initalCapacity * _loadFactor)), + + currentPrime: 1, + initialBucketCapacity: initBucketCap, + } + + ret.buckets = ret.createBuckets(initCap) + return ret +} + +func newArray2DHashSet( + hashcodeFunction func(interface{}) int, + equalsFunction func(interface{}, interface{}) bool, +) *array2DHashSet { + return newArray2DHashSetWithCap(hashcodeFunction, equalsFunction, _initalCapacity, _initalBucketCapacity) +} diff --git a/vendor/github.com/csi-addons/spec/lib/go/identity/identity.pb.go b/vendor/github.com/csi-addons/spec/lib/go/identity/identity.pb.go index 607c8bc13..b55988842 100644 --- a/vendor/github.com/csi-addons/spec/lib/go/identity/identity.pb.go +++ b/vendor/github.com/csi-addons/spec/lib/go/identity/identity.pb.go @@ -211,6 +211,62 @@ func (Capability_NetworkFence_Type) EnumDescriptor() ([]byte, []int) { return file_identity_identity_proto_rawDescGZIP(), []int{4, 2, 0} } +// Type describes a CSI Service that CSI-drivers can support. +type Capability_VolumeReplication_Type int32 + +const ( + // UNKNOWN indicates that the CSI-driver does not support the + // VolumeReplication operation in the current mode. The CSI-Addons CO + // plugin will most likely ignore this node for the + // VolumeReplication operation. + Capability_VolumeReplication_UNKNOWN Capability_VolumeReplication_Type = 0 + // VOLUME_REPLICATION indicates that the CSI-driver provides RPCs for a + // VolumeReplication operation. + // The presence of this capability determines whether the CSI-Addons CO + // plugin can invoke RPCs that require access to the storage system, + // similar to the CSI Controller (provisioner). + Capability_VolumeReplication_VOLUME_REPLICATION Capability_VolumeReplication_Type = 1 +) + +// Enum value maps for Capability_VolumeReplication_Type. +var ( + Capability_VolumeReplication_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "VOLUME_REPLICATION", + } + Capability_VolumeReplication_Type_value = map[string]int32{ + "UNKNOWN": 0, + "VOLUME_REPLICATION": 1, + } +) + +func (x Capability_VolumeReplication_Type) Enum() *Capability_VolumeReplication_Type { + p := new(Capability_VolumeReplication_Type) + *p = x + return p +} + +func (x Capability_VolumeReplication_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Capability_VolumeReplication_Type) Descriptor() protoreflect.EnumDescriptor { + return file_identity_identity_proto_enumTypes[3].Descriptor() +} + +func (Capability_VolumeReplication_Type) Type() protoreflect.EnumType { + return &file_identity_identity_proto_enumTypes[3] +} + +func (x Capability_VolumeReplication_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Capability_VolumeReplication_Type.Descriptor instead. +func (Capability_VolumeReplication_Type) EnumDescriptor() ([]byte, []int) { + return file_identity_identity_proto_rawDescGZIP(), []int{4, 3, 0} +} + // GetIdentityRequest is sent by the CSI-Addons CO plugin to obtain the // drivername, version and optional details from the CSI-driver. type GetIdentityRequest struct { @@ -425,6 +481,7 @@ type Capability struct { // *Capability_Service_ // *Capability_ReclaimSpace_ // *Capability_NetworkFence_ + // *Capability_VolumeReplication_ Type isCapability_Type `protobuf_oneof:"type"` } @@ -488,6 +545,13 @@ func (x *Capability) GetNetworkFence() *Capability_NetworkFence { return nil } +func (x *Capability) GetVolumeReplication() *Capability_VolumeReplication { + if x, ok := x.GetType().(*Capability_VolumeReplication_); ok { + return x.VolumeReplication + } + return nil +} + type isCapability_Type interface { isCapability_Type() } @@ -507,12 +571,19 @@ type Capability_NetworkFence_ struct { NetworkFence *Capability_NetworkFence `protobuf:"bytes,3,opt,name=network_fence,json=networkFence,proto3,oneof"` } +type Capability_VolumeReplication_ struct { + // VolumeReplication operation capabilities. + VolumeReplication *Capability_VolumeReplication `protobuf:"bytes,4,opt,name=volume_replication,json=volumeReplication,proto3,oneof"` +} + func (*Capability_Service_) isCapability_Type() {} func (*Capability_ReclaimSpace_) isCapability_Type() {} func (*Capability_NetworkFence_) isCapability_Type() {} +func (*Capability_VolumeReplication_) isCapability_Type() {} + // ProbeRequest is sent to the CSI-driver to confirm that it can respond to // requests from the CSI-Addons CO plugin. type ProbeRequest struct { @@ -770,6 +841,56 @@ func (x *Capability_NetworkFence) GetType() Capability_NetworkFence_Type { return Capability_NetworkFence_UNKNOWN } +// VolumeReplication contains the features of the volumereplication operation +// that the CSI-driver supports. +type Capability_VolumeReplication struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // type contains the Type of CSI Service that the CSI-driver supports. + Type Capability_VolumeReplication_Type `protobuf:"varint,1,opt,name=type,proto3,enum=identity.Capability_VolumeReplication_Type" json:"type,omitempty"` +} + +func (x *Capability_VolumeReplication) Reset() { + *x = Capability_VolumeReplication{} + if protoimpl.UnsafeEnabled { + mi := &file_identity_identity_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Capability_VolumeReplication) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Capability_VolumeReplication) ProtoMessage() {} + +func (x *Capability_VolumeReplication) ProtoReflect() protoreflect.Message { + mi := &file_identity_identity_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Capability_VolumeReplication.ProtoReflect.Descriptor instead. +func (*Capability_VolumeReplication) Descriptor() ([]byte, []int) { + return file_identity_identity_proto_rawDescGZIP(), []int{4, 3} +} + +func (x *Capability_VolumeReplication) GetType() Capability_VolumeReplication_Type { + if x != nil { + return x.Type + } + return Capability_VolumeReplication_UNKNOWN +} + var File_identity_identity_proto protoreflect.FileDescriptor var file_identity_identity_proto_rawDesc = []byte{ @@ -799,7 +920,7 @@ var file_identity_identity_proto_rawDesc = []byte{ 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x22, 0xd1, 0x04, 0x0a, 0x0a, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x73, 0x22, 0xae, 0x06, 0x0a, 0x0a, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, @@ -812,52 +933,66 @@ var file_identity_identity_proto_rawDesc = []byte{ 0x66, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, - 0x52, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x65, 0x6e, 0x63, 0x65, 0x1a, 0x7f, - 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3d, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, - 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, 0x1a, - 0x78, 0x0a, 0x0c, 0x52, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x2e, 0x52, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x70, 0x61, 0x63, 0x65, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x46, 0x46, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, - 0x06, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x02, 0x1a, 0x72, 0x0a, 0x0c, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x26, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x45, - 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x42, 0x06, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x0e, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x32, 0xee, 0x01, 0x0a, 0x08, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, 0x65, - 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, - 0x05, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x3b, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x57, + 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x7f, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x21, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3d, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, + 0x0a, 0x12, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x52, + 0x56, 0x49, 0x43, 0x45, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, 0x1a, 0x78, 0x0a, 0x0c, 0x52, 0x65, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x65, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x46, 0x46, + 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, + 0x10, 0x02, 0x1a, 0x72, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x26, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x46, + 0x45, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x1a, 0x81, 0x01, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2b, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x52, 0x45, 0x50, + 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x0e, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x41, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x32, 0xee, 0x01, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x12, 0x1c, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, 0x65, 0x74, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x58, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x50, 0x72, + 0x6f, 0x62, 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x50, + 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x3b, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -872,46 +1007,50 @@ func file_identity_identity_proto_rawDescGZIP() []byte { return file_identity_identity_proto_rawDescData } -var file_identity_identity_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_identity_identity_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_identity_identity_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_identity_identity_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_identity_identity_proto_goTypes = []interface{}{ - (Capability_Service_Type)(0), // 0: identity.Capability.Service.Type - (Capability_ReclaimSpace_Type)(0), // 1: identity.Capability.ReclaimSpace.Type - (Capability_NetworkFence_Type)(0), // 2: identity.Capability.NetworkFence.Type - (*GetIdentityRequest)(nil), // 3: identity.GetIdentityRequest - (*GetIdentityResponse)(nil), // 4: identity.GetIdentityResponse - (*GetCapabilitiesRequest)(nil), // 5: identity.GetCapabilitiesRequest - (*GetCapabilitiesResponse)(nil), // 6: identity.GetCapabilitiesResponse - (*Capability)(nil), // 7: identity.Capability - (*ProbeRequest)(nil), // 8: identity.ProbeRequest - (*ProbeResponse)(nil), // 9: identity.ProbeResponse - nil, // 10: identity.GetIdentityResponse.ManifestEntry - (*Capability_Service)(nil), // 11: identity.Capability.Service - (*Capability_ReclaimSpace)(nil), // 12: identity.Capability.ReclaimSpace - (*Capability_NetworkFence)(nil), // 13: identity.Capability.NetworkFence - (*wrapperspb.BoolValue)(nil), // 14: google.protobuf.BoolValue + (Capability_Service_Type)(0), // 0: identity.Capability.Service.Type + (Capability_ReclaimSpace_Type)(0), // 1: identity.Capability.ReclaimSpace.Type + (Capability_NetworkFence_Type)(0), // 2: identity.Capability.NetworkFence.Type + (Capability_VolumeReplication_Type)(0), // 3: identity.Capability.VolumeReplication.Type + (*GetIdentityRequest)(nil), // 4: identity.GetIdentityRequest + (*GetIdentityResponse)(nil), // 5: identity.GetIdentityResponse + (*GetCapabilitiesRequest)(nil), // 6: identity.GetCapabilitiesRequest + (*GetCapabilitiesResponse)(nil), // 7: identity.GetCapabilitiesResponse + (*Capability)(nil), // 8: identity.Capability + (*ProbeRequest)(nil), // 9: identity.ProbeRequest + (*ProbeResponse)(nil), // 10: identity.ProbeResponse + nil, // 11: identity.GetIdentityResponse.ManifestEntry + (*Capability_Service)(nil), // 12: identity.Capability.Service + (*Capability_ReclaimSpace)(nil), // 13: identity.Capability.ReclaimSpace + (*Capability_NetworkFence)(nil), // 14: identity.Capability.NetworkFence + (*Capability_VolumeReplication)(nil), // 15: identity.Capability.VolumeReplication + (*wrapperspb.BoolValue)(nil), // 16: google.protobuf.BoolValue } var file_identity_identity_proto_depIdxs = []int32{ - 10, // 0: identity.GetIdentityResponse.manifest:type_name -> identity.GetIdentityResponse.ManifestEntry - 7, // 1: identity.GetCapabilitiesResponse.capabilities:type_name -> identity.Capability - 11, // 2: identity.Capability.service:type_name -> identity.Capability.Service - 12, // 3: identity.Capability.reclaim_space:type_name -> identity.Capability.ReclaimSpace - 13, // 4: identity.Capability.network_fence:type_name -> identity.Capability.NetworkFence - 14, // 5: identity.ProbeResponse.ready:type_name -> google.protobuf.BoolValue - 0, // 6: identity.Capability.Service.type:type_name -> identity.Capability.Service.Type - 1, // 7: identity.Capability.ReclaimSpace.type:type_name -> identity.Capability.ReclaimSpace.Type - 2, // 8: identity.Capability.NetworkFence.type:type_name -> identity.Capability.NetworkFence.Type - 3, // 9: identity.Identity.GetIdentity:input_type -> identity.GetIdentityRequest - 5, // 10: identity.Identity.GetCapabilities:input_type -> identity.GetCapabilitiesRequest - 8, // 11: identity.Identity.Probe:input_type -> identity.ProbeRequest - 4, // 12: identity.Identity.GetIdentity:output_type -> identity.GetIdentityResponse - 6, // 13: identity.Identity.GetCapabilities:output_type -> identity.GetCapabilitiesResponse - 9, // 14: identity.Identity.Probe:output_type -> identity.ProbeResponse - 12, // [12:15] is the sub-list for method output_type - 9, // [9:12] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 11, // 0: identity.GetIdentityResponse.manifest:type_name -> identity.GetIdentityResponse.ManifestEntry + 8, // 1: identity.GetCapabilitiesResponse.capabilities:type_name -> identity.Capability + 12, // 2: identity.Capability.service:type_name -> identity.Capability.Service + 13, // 3: identity.Capability.reclaim_space:type_name -> identity.Capability.ReclaimSpace + 14, // 4: identity.Capability.network_fence:type_name -> identity.Capability.NetworkFence + 15, // 5: identity.Capability.volume_replication:type_name -> identity.Capability.VolumeReplication + 16, // 6: identity.ProbeResponse.ready:type_name -> google.protobuf.BoolValue + 0, // 7: identity.Capability.Service.type:type_name -> identity.Capability.Service.Type + 1, // 8: identity.Capability.ReclaimSpace.type:type_name -> identity.Capability.ReclaimSpace.Type + 2, // 9: identity.Capability.NetworkFence.type:type_name -> identity.Capability.NetworkFence.Type + 3, // 10: identity.Capability.VolumeReplication.type:type_name -> identity.Capability.VolumeReplication.Type + 4, // 11: identity.Identity.GetIdentity:input_type -> identity.GetIdentityRequest + 6, // 12: identity.Identity.GetCapabilities:input_type -> identity.GetCapabilitiesRequest + 9, // 13: identity.Identity.Probe:input_type -> identity.ProbeRequest + 5, // 14: identity.Identity.GetIdentity:output_type -> identity.GetIdentityResponse + 7, // 15: identity.Identity.GetCapabilities:output_type -> identity.GetCapabilitiesResponse + 10, // 16: identity.Identity.Probe:output_type -> identity.ProbeResponse + 14, // [14:17] is the sub-list for method output_type + 11, // [11:14] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_identity_identity_proto_init() } @@ -1040,19 +1179,32 @@ func file_identity_identity_proto_init() { return nil } } + file_identity_identity_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Capability_VolumeReplication); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_identity_identity_proto_msgTypes[4].OneofWrappers = []interface{}{ (*Capability_Service_)(nil), (*Capability_ReclaimSpace_)(nil), (*Capability_NetworkFence_)(nil), + (*Capability_VolumeReplication_)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_identity_identity_proto_rawDesc, - NumEnums: 3, - NumMessages: 11, + NumEnums: 4, + NumMessages: 12, NumExtensions: 0, NumServices: 1, }, diff --git a/vendor/github.com/csi-addons/spec/lib/go/replication/replication.pb.go b/vendor/github.com/csi-addons/spec/lib/go/replication/replication.pb.go new file mode 100644 index 000000000..6d798eae8 --- /dev/null +++ b/vendor/github.com/csi-addons/spec/lib/go/replication/replication.pb.go @@ -0,0 +1,1325 @@ +// Code generated by make; DO NOT EDIT. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.14.0 +// source: replication/replication.proto + +package replication + +import ( + _ "github.com/container-storage-interface/spec/lib/go/csi" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// EnableVolumeReplicationRequest holds the required information to enable +// replication on a volume. +type EnableVolumeReplicationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,4,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the plugin to complete the request. + Secrets map[string]string `protobuf:"bytes,3,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *EnableVolumeReplicationRequest) Reset() { + *x = EnableVolumeReplicationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableVolumeReplicationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableVolumeReplicationRequest) ProtoMessage() {} + +func (x *EnableVolumeReplicationRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableVolumeReplicationRequest.ProtoReflect.Descriptor instead. +func (*EnableVolumeReplicationRequest) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{0} +} + +func (x *EnableVolumeReplicationRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *EnableVolumeReplicationRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *EnableVolumeReplicationRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *EnableVolumeReplicationRequest) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + +// EnableVolumeReplicationResponse holds the information to send when +// replication is successfully enabled on a volume. +type EnableVolumeReplicationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *EnableVolumeReplicationResponse) Reset() { + *x = EnableVolumeReplicationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableVolumeReplicationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableVolumeReplicationResponse) ProtoMessage() {} + +func (x *EnableVolumeReplicationResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnableVolumeReplicationResponse.ProtoReflect.Descriptor instead. +func (*EnableVolumeReplicationResponse) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{1} +} + +// DisableVolumeReplicationRequest holds the required information to disable +// replication on a volume. +type DisableVolumeReplicationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,4,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the plugin to complete the request. + Secrets map[string]string `protobuf:"bytes,3,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *DisableVolumeReplicationRequest) Reset() { + *x = DisableVolumeReplicationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DisableVolumeReplicationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableVolumeReplicationRequest) ProtoMessage() {} + +func (x *DisableVolumeReplicationRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableVolumeReplicationRequest.ProtoReflect.Descriptor instead. +func (*DisableVolumeReplicationRequest) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{2} +} + +func (x *DisableVolumeReplicationRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *DisableVolumeReplicationRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *DisableVolumeReplicationRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *DisableVolumeReplicationRequest) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + +// DisableVolumeReplicationResponse holds the information to send when +// replication is successfully disabled on a volume. +type DisableVolumeReplicationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DisableVolumeReplicationResponse) Reset() { + *x = DisableVolumeReplicationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DisableVolumeReplicationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisableVolumeReplicationResponse) ProtoMessage() {} + +func (x *DisableVolumeReplicationResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisableVolumeReplicationResponse.ProtoReflect.Descriptor instead. +func (*DisableVolumeReplicationResponse) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{3} +} + +// PromoteVolumeRequest holds the required information to promote volume as a +// primary on local cluster. +type PromoteVolumeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,5,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // This field is optional. + // Default value is false, force option to Promote the volume. + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the plugin to complete the request. + Secrets map[string]string `protobuf:"bytes,4,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *PromoteVolumeRequest) Reset() { + *x = PromoteVolumeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PromoteVolumeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromoteVolumeRequest) ProtoMessage() {} + +func (x *PromoteVolumeRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromoteVolumeRequest.ProtoReflect.Descriptor instead. +func (*PromoteVolumeRequest) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{4} +} + +func (x *PromoteVolumeRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *PromoteVolumeRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *PromoteVolumeRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +func (x *PromoteVolumeRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *PromoteVolumeRequest) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + +// PromoteVolumeResponse holds the information to send when +// volume is successfully promoted. +type PromoteVolumeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PromoteVolumeResponse) Reset() { + *x = PromoteVolumeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PromoteVolumeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromoteVolumeResponse) ProtoMessage() {} + +func (x *PromoteVolumeResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromoteVolumeResponse.ProtoReflect.Descriptor instead. +func (*PromoteVolumeResponse) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{5} +} + +// DemoteVolumeRequest holds the required information to demote volume on local +// cluster. +type DemoteVolumeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,5,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // This field is optional. + // Default value is false, force option to Demote the volume. + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the plugin to complete the request. + Secrets map[string]string `protobuf:"bytes,4,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *DemoteVolumeRequest) Reset() { + *x = DemoteVolumeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DemoteVolumeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DemoteVolumeRequest) ProtoMessage() {} + +func (x *DemoteVolumeRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DemoteVolumeRequest.ProtoReflect.Descriptor instead. +func (*DemoteVolumeRequest) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{6} +} + +func (x *DemoteVolumeRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *DemoteVolumeRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *DemoteVolumeRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +func (x *DemoteVolumeRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *DemoteVolumeRequest) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + +// DemoteVolumeResponse holds the information to send when +// volume is successfully demoted. +type DemoteVolumeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DemoteVolumeResponse) Reset() { + *x = DemoteVolumeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DemoteVolumeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DemoteVolumeResponse) ProtoMessage() {} + +func (x *DemoteVolumeResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DemoteVolumeResponse.ProtoReflect.Descriptor instead. +func (*DemoteVolumeResponse) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{7} +} + +// ResyncVolumeRequest holds the required information to resync volume. +type ResyncVolumeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,5,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` + // This field is optional. + // Default value is false, force option to Resync the volume. + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Secrets required by the plugin to complete the request. + Secrets map[string]string `protobuf:"bytes,4,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ResyncVolumeRequest) Reset() { + *x = ResyncVolumeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResyncVolumeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResyncVolumeRequest) ProtoMessage() {} + +func (x *ResyncVolumeRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResyncVolumeRequest.ProtoReflect.Descriptor instead. +func (*ResyncVolumeRequest) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{8} +} + +func (x *ResyncVolumeRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *ResyncVolumeRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +func (x *ResyncVolumeRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +func (x *ResyncVolumeRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *ResyncVolumeRequest) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + +// ResyncVolumeResponse holds the information to send when +// volume is successfully resynced. +type ResyncVolumeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Indicates that the volume is ready to use. + // The default value is false. + // This field is REQUIRED. + Ready bool `protobuf:"varint,1,opt,name=ready,proto3" json:"ready,omitempty"` +} + +func (x *ResyncVolumeResponse) Reset() { + *x = ResyncVolumeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResyncVolumeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResyncVolumeResponse) ProtoMessage() {} + +func (x *ResyncVolumeResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResyncVolumeResponse.ProtoReflect.Descriptor instead. +func (*ResyncVolumeResponse) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{9} +} + +func (x *ResyncVolumeResponse) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +// GetVolumeReplicationInfoRequest holds the required information to get +// the Volume replication information. +type GetVolumeReplicationInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifier for this volume, generated by the plugin during + // CreateVolume CSI RPC call. + // This field is REQUIRED. + // This field MUST contain enough information to uniquely identify + // this specific volume vs all other volumes supported by this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this volume. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // Secrets required by the plugin to complete the request. + Secrets map[string]string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // The identifier for the replication. + // This field is OPTIONAL. + // This field MUST contain enough information, together with volume_id, + // to uniquely identify this specific replication + // vs all other replications supported by this plugin. + ReplicationId string `protobuf:"bytes,3,opt,name=replication_id,json=replicationId,proto3" json:"replication_id,omitempty"` +} + +func (x *GetVolumeReplicationInfoRequest) Reset() { + *x = GetVolumeReplicationInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetVolumeReplicationInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVolumeReplicationInfoRequest) ProtoMessage() {} + +func (x *GetVolumeReplicationInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVolumeReplicationInfoRequest.ProtoReflect.Descriptor instead. +func (*GetVolumeReplicationInfoRequest) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{10} +} + +func (x *GetVolumeReplicationInfoRequest) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +func (x *GetVolumeReplicationInfoRequest) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + +func (x *GetVolumeReplicationInfoRequest) GetReplicationId() string { + if x != nil { + return x.ReplicationId + } + return "" +} + +// GetVolumeReplicationInfoResponse holds the information to send the +// volume replication information. +type GetVolumeReplicationInfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Holds the last sync time. + // This field is REQUIRED. + LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"` +} + +func (x *GetVolumeReplicationInfoResponse) Reset() { + *x = GetVolumeReplicationInfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetVolumeReplicationInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVolumeReplicationInfoResponse) ProtoMessage() {} + +func (x *GetVolumeReplicationInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVolumeReplicationInfoResponse.ProtoReflect.Descriptor instead. +func (*GetVolumeReplicationInfoResponse) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{11} +} + +func (x *GetVolumeReplicationInfoResponse) GetLastSyncTime() *timestamppb.Timestamp { + if x != nil { + return x.LastSyncTime + } + return nil +} + +var file_replication_replication_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1100, + Name: "replication.alpha_field", + Tag: "varint,1100,opt,name=alpha_field", + Filename: "replication/replication.proto", + }, +} + +// Extension fields to descriptorpb.FieldOptions. +var ( + // Indicates that this field is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + // + // optional bool alpha_field = 1100; + E_AlphaField = &file_replication_replication_proto_extTypes[0] +) + +var File_replication_replication_proto protoreflect.FileDescriptor + +var file_replication_replication_proto_rawDesc = []byte{ + 0x0a, 0x1d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x40, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x67, 0x6f, + 0x2f, 0x63, 0x73, 0x69, 0x2f, 0x63, 0x73, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x9a, 0x03, 0x0a, 0x1e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, + 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x44, 0x01, 0x52, 0x0d, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x5b, 0x0a, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x57, 0x0a, 0x07, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x21, + 0x0a, 0x1f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x9d, 0x03, 0x0a, 0x1f, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x44, 0x01, 0x52, + 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x5c, + 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x07, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x22, 0x0a, 0x20, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x92, 0x03, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, + 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x44, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x51, 0x0a, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x4d, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, + 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x17, 0x0a, 0x15, 0x50, 0x72, + 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x8f, 0x03, 0x0a, 0x13, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x44, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4c, 0x0a, 0x07, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, + 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8f, 0x03, + 0x0a, 0x13, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x44, 0x01, 0x52, + 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x2c, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x80, 0x02, + 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x58, + 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x39, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, + 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, + 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x44, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x64, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, + 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, + 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x32, 0x82, 0x05, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x76, 0x0a, 0x17, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, + 0x18, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6d, + 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x21, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x52, 0x65, 0x73, + 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x79, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x2e, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xcc, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x0f, 0x5a, 0x0d, + 0x2e, 0x3b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_replication_replication_proto_rawDescOnce sync.Once + file_replication_replication_proto_rawDescData = file_replication_replication_proto_rawDesc +) + +func file_replication_replication_proto_rawDescGZIP() []byte { + file_replication_replication_proto_rawDescOnce.Do(func() { + file_replication_replication_proto_rawDescData = protoimpl.X.CompressGZIP(file_replication_replication_proto_rawDescData) + }) + return file_replication_replication_proto_rawDescData +} + +var file_replication_replication_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_replication_replication_proto_goTypes = []interface{}{ + (*EnableVolumeReplicationRequest)(nil), // 0: replication.EnableVolumeReplicationRequest + (*EnableVolumeReplicationResponse)(nil), // 1: replication.EnableVolumeReplicationResponse + (*DisableVolumeReplicationRequest)(nil), // 2: replication.DisableVolumeReplicationRequest + (*DisableVolumeReplicationResponse)(nil), // 3: replication.DisableVolumeReplicationResponse + (*PromoteVolumeRequest)(nil), // 4: replication.PromoteVolumeRequest + (*PromoteVolumeResponse)(nil), // 5: replication.PromoteVolumeResponse + (*DemoteVolumeRequest)(nil), // 6: replication.DemoteVolumeRequest + (*DemoteVolumeResponse)(nil), // 7: replication.DemoteVolumeResponse + (*ResyncVolumeRequest)(nil), // 8: replication.ResyncVolumeRequest + (*ResyncVolumeResponse)(nil), // 9: replication.ResyncVolumeResponse + (*GetVolumeReplicationInfoRequest)(nil), // 10: replication.GetVolumeReplicationInfoRequest + (*GetVolumeReplicationInfoResponse)(nil), // 11: replication.GetVolumeReplicationInfoResponse + nil, // 12: replication.EnableVolumeReplicationRequest.ParametersEntry + nil, // 13: replication.EnableVolumeReplicationRequest.SecretsEntry + nil, // 14: replication.DisableVolumeReplicationRequest.ParametersEntry + nil, // 15: replication.DisableVolumeReplicationRequest.SecretsEntry + nil, // 16: replication.PromoteVolumeRequest.ParametersEntry + nil, // 17: replication.PromoteVolumeRequest.SecretsEntry + nil, // 18: replication.DemoteVolumeRequest.ParametersEntry + nil, // 19: replication.DemoteVolumeRequest.SecretsEntry + nil, // 20: replication.ResyncVolumeRequest.ParametersEntry + nil, // 21: replication.ResyncVolumeRequest.SecretsEntry + nil, // 22: replication.GetVolumeReplicationInfoRequest.SecretsEntry + (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp + (*descriptorpb.FieldOptions)(nil), // 24: google.protobuf.FieldOptions +} +var file_replication_replication_proto_depIdxs = []int32{ + 12, // 0: replication.EnableVolumeReplicationRequest.parameters:type_name -> replication.EnableVolumeReplicationRequest.ParametersEntry + 13, // 1: replication.EnableVolumeReplicationRequest.secrets:type_name -> replication.EnableVolumeReplicationRequest.SecretsEntry + 14, // 2: replication.DisableVolumeReplicationRequest.parameters:type_name -> replication.DisableVolumeReplicationRequest.ParametersEntry + 15, // 3: replication.DisableVolumeReplicationRequest.secrets:type_name -> replication.DisableVolumeReplicationRequest.SecretsEntry + 16, // 4: replication.PromoteVolumeRequest.parameters:type_name -> replication.PromoteVolumeRequest.ParametersEntry + 17, // 5: replication.PromoteVolumeRequest.secrets:type_name -> replication.PromoteVolumeRequest.SecretsEntry + 18, // 6: replication.DemoteVolumeRequest.parameters:type_name -> replication.DemoteVolumeRequest.ParametersEntry + 19, // 7: replication.DemoteVolumeRequest.secrets:type_name -> replication.DemoteVolumeRequest.SecretsEntry + 20, // 8: replication.ResyncVolumeRequest.parameters:type_name -> replication.ResyncVolumeRequest.ParametersEntry + 21, // 9: replication.ResyncVolumeRequest.secrets:type_name -> replication.ResyncVolumeRequest.SecretsEntry + 22, // 10: replication.GetVolumeReplicationInfoRequest.secrets:type_name -> replication.GetVolumeReplicationInfoRequest.SecretsEntry + 23, // 11: replication.GetVolumeReplicationInfoResponse.last_sync_time:type_name -> google.protobuf.Timestamp + 24, // 12: replication.alpha_field:extendee -> google.protobuf.FieldOptions + 0, // 13: replication.Controller.EnableVolumeReplication:input_type -> replication.EnableVolumeReplicationRequest + 2, // 14: replication.Controller.DisableVolumeReplication:input_type -> replication.DisableVolumeReplicationRequest + 4, // 15: replication.Controller.PromoteVolume:input_type -> replication.PromoteVolumeRequest + 6, // 16: replication.Controller.DemoteVolume:input_type -> replication.DemoteVolumeRequest + 8, // 17: replication.Controller.ResyncVolume:input_type -> replication.ResyncVolumeRequest + 10, // 18: replication.Controller.GetVolumeReplicationInfo:input_type -> replication.GetVolumeReplicationInfoRequest + 1, // 19: replication.Controller.EnableVolumeReplication:output_type -> replication.EnableVolumeReplicationResponse + 3, // 20: replication.Controller.DisableVolumeReplication:output_type -> replication.DisableVolumeReplicationResponse + 5, // 21: replication.Controller.PromoteVolume:output_type -> replication.PromoteVolumeResponse + 7, // 22: replication.Controller.DemoteVolume:output_type -> replication.DemoteVolumeResponse + 9, // 23: replication.Controller.ResyncVolume:output_type -> replication.ResyncVolumeResponse + 11, // 24: replication.Controller.GetVolumeReplicationInfo:output_type -> replication.GetVolumeReplicationInfoResponse + 19, // [19:25] is the sub-list for method output_type + 13, // [13:19] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 12, // [12:13] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name +} + +func init() { file_replication_replication_proto_init() } +func file_replication_replication_proto_init() { + if File_replication_replication_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_replication_replication_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnableVolumeReplicationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnableVolumeReplicationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisableVolumeReplicationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisableVolumeReplicationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PromoteVolumeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PromoteVolumeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DemoteVolumeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DemoteVolumeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResyncVolumeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResyncVolumeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetVolumeReplicationInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetVolumeReplicationInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_replication_replication_proto_rawDesc, + NumEnums: 0, + NumMessages: 23, + NumExtensions: 1, + NumServices: 1, + }, + GoTypes: file_replication_replication_proto_goTypes, + DependencyIndexes: file_replication_replication_proto_depIdxs, + MessageInfos: file_replication_replication_proto_msgTypes, + ExtensionInfos: file_replication_replication_proto_extTypes, + }.Build() + File_replication_replication_proto = out.File + file_replication_replication_proto_rawDesc = nil + file_replication_replication_proto_goTypes = nil + file_replication_replication_proto_depIdxs = nil +} diff --git a/vendor/github.com/csi-addons/spec/lib/go/replication/replication_grpc.pb.go b/vendor/github.com/csi-addons/spec/lib/go/replication/replication_grpc.pb.go new file mode 100644 index 000000000..aa9c826bd --- /dev/null +++ b/vendor/github.com/csi-addons/spec/lib/go/replication/replication_grpc.pb.go @@ -0,0 +1,295 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package replication + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// ControllerClient is the client API for Controller service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ControllerClient interface { + // EnableVolumeReplication RPC call to enable the volume replication. + EnableVolumeReplication(ctx context.Context, in *EnableVolumeReplicationRequest, opts ...grpc.CallOption) (*EnableVolumeReplicationResponse, error) + // DisableVolumeReplication RPC call to disable the volume replication. + DisableVolumeReplication(ctx context.Context, in *DisableVolumeReplicationRequest, opts ...grpc.CallOption) (*DisableVolumeReplicationResponse, error) + // PromoteVolume RPC call to promote the volume. + PromoteVolume(ctx context.Context, in *PromoteVolumeRequest, opts ...grpc.CallOption) (*PromoteVolumeResponse, error) + // DemoteVolume RPC call to demote the volume. + DemoteVolume(ctx context.Context, in *DemoteVolumeRequest, opts ...grpc.CallOption) (*DemoteVolumeResponse, error) + // ResyncVolume RPC call to resync the volume. + ResyncVolume(ctx context.Context, in *ResyncVolumeRequest, opts ...grpc.CallOption) (*ResyncVolumeResponse, error) + // GetVolumeReplicationInfo RPC call to get the volume replication + // information. + GetVolumeReplicationInfo(ctx context.Context, in *GetVolumeReplicationInfoRequest, opts ...grpc.CallOption) (*GetVolumeReplicationInfoResponse, error) +} + +type controllerClient struct { + cc grpc.ClientConnInterface +} + +func NewControllerClient(cc grpc.ClientConnInterface) ControllerClient { + return &controllerClient{cc} +} + +func (c *controllerClient) EnableVolumeReplication(ctx context.Context, in *EnableVolumeReplicationRequest, opts ...grpc.CallOption) (*EnableVolumeReplicationResponse, error) { + out := new(EnableVolumeReplicationResponse) + err := c.cc.Invoke(ctx, "/replication.Controller/EnableVolumeReplication", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) DisableVolumeReplication(ctx context.Context, in *DisableVolumeReplicationRequest, opts ...grpc.CallOption) (*DisableVolumeReplicationResponse, error) { + out := new(DisableVolumeReplicationResponse) + err := c.cc.Invoke(ctx, "/replication.Controller/DisableVolumeReplication", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) PromoteVolume(ctx context.Context, in *PromoteVolumeRequest, opts ...grpc.CallOption) (*PromoteVolumeResponse, error) { + out := new(PromoteVolumeResponse) + err := c.cc.Invoke(ctx, "/replication.Controller/PromoteVolume", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) DemoteVolume(ctx context.Context, in *DemoteVolumeRequest, opts ...grpc.CallOption) (*DemoteVolumeResponse, error) { + out := new(DemoteVolumeResponse) + err := c.cc.Invoke(ctx, "/replication.Controller/DemoteVolume", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) ResyncVolume(ctx context.Context, in *ResyncVolumeRequest, opts ...grpc.CallOption) (*ResyncVolumeResponse, error) { + out := new(ResyncVolumeResponse) + err := c.cc.Invoke(ctx, "/replication.Controller/ResyncVolume", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controllerClient) GetVolumeReplicationInfo(ctx context.Context, in *GetVolumeReplicationInfoRequest, opts ...grpc.CallOption) (*GetVolumeReplicationInfoResponse, error) { + out := new(GetVolumeReplicationInfoResponse) + err := c.cc.Invoke(ctx, "/replication.Controller/GetVolumeReplicationInfo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ControllerServer is the server API for Controller service. +// All implementations must embed UnimplementedControllerServer +// for forward compatibility +type ControllerServer interface { + // EnableVolumeReplication RPC call to enable the volume replication. + EnableVolumeReplication(context.Context, *EnableVolumeReplicationRequest) (*EnableVolumeReplicationResponse, error) + // DisableVolumeReplication RPC call to disable the volume replication. + DisableVolumeReplication(context.Context, *DisableVolumeReplicationRequest) (*DisableVolumeReplicationResponse, error) + // PromoteVolume RPC call to promote the volume. + PromoteVolume(context.Context, *PromoteVolumeRequest) (*PromoteVolumeResponse, error) + // DemoteVolume RPC call to demote the volume. + DemoteVolume(context.Context, *DemoteVolumeRequest) (*DemoteVolumeResponse, error) + // ResyncVolume RPC call to resync the volume. + ResyncVolume(context.Context, *ResyncVolumeRequest) (*ResyncVolumeResponse, error) + // GetVolumeReplicationInfo RPC call to get the volume replication + // information. + GetVolumeReplicationInfo(context.Context, *GetVolumeReplicationInfoRequest) (*GetVolumeReplicationInfoResponse, error) + mustEmbedUnimplementedControllerServer() +} + +// UnimplementedControllerServer must be embedded to have forward compatible implementations. +type UnimplementedControllerServer struct { +} + +func (UnimplementedControllerServer) EnableVolumeReplication(context.Context, *EnableVolumeReplicationRequest) (*EnableVolumeReplicationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EnableVolumeReplication not implemented") +} +func (UnimplementedControllerServer) DisableVolumeReplication(context.Context, *DisableVolumeReplicationRequest) (*DisableVolumeReplicationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DisableVolumeReplication not implemented") +} +func (UnimplementedControllerServer) PromoteVolume(context.Context, *PromoteVolumeRequest) (*PromoteVolumeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PromoteVolume not implemented") +} +func (UnimplementedControllerServer) DemoteVolume(context.Context, *DemoteVolumeRequest) (*DemoteVolumeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DemoteVolume not implemented") +} +func (UnimplementedControllerServer) ResyncVolume(context.Context, *ResyncVolumeRequest) (*ResyncVolumeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ResyncVolume not implemented") +} +func (UnimplementedControllerServer) GetVolumeReplicationInfo(context.Context, *GetVolumeReplicationInfoRequest) (*GetVolumeReplicationInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetVolumeReplicationInfo not implemented") +} +func (UnimplementedControllerServer) mustEmbedUnimplementedControllerServer() {} + +// UnsafeControllerServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ControllerServer will +// result in compilation errors. +type UnsafeControllerServer interface { + mustEmbedUnimplementedControllerServer() +} + +func RegisterControllerServer(s grpc.ServiceRegistrar, srv ControllerServer) { + s.RegisterService(&Controller_ServiceDesc, srv) +} + +func _Controller_EnableVolumeReplication_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EnableVolumeReplicationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).EnableVolumeReplication(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/replication.Controller/EnableVolumeReplication", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).EnableVolumeReplication(ctx, req.(*EnableVolumeReplicationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_DisableVolumeReplication_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DisableVolumeReplicationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).DisableVolumeReplication(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/replication.Controller/DisableVolumeReplication", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).DisableVolumeReplication(ctx, req.(*DisableVolumeReplicationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_PromoteVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PromoteVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).PromoteVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/replication.Controller/PromoteVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).PromoteVolume(ctx, req.(*PromoteVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_DemoteVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DemoteVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).DemoteVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/replication.Controller/DemoteVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).DemoteVolume(ctx, req.(*DemoteVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_ResyncVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResyncVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).ResyncVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/replication.Controller/ResyncVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).ResyncVolume(ctx, req.(*ResyncVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Controller_GetVolumeReplicationInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetVolumeReplicationInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).GetVolumeReplicationInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/replication.Controller/GetVolumeReplicationInfo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).GetVolumeReplicationInfo(ctx, req.(*GetVolumeReplicationInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// Controller_ServiceDesc is the grpc.ServiceDesc for Controller service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Controller_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "replication.Controller", + HandlerType: (*ControllerServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "EnableVolumeReplication", + Handler: _Controller_EnableVolumeReplication_Handler, + }, + { + MethodName: "DisableVolumeReplication", + Handler: _Controller_DisableVolumeReplication_Handler, + }, + { + MethodName: "PromoteVolume", + Handler: _Controller_PromoteVolume_Handler, + }, + { + MethodName: "DemoteVolume", + Handler: _Controller_DemoteVolume_Handler, + }, + { + MethodName: "ResyncVolume", + Handler: _Controller_ResyncVolume_Handler, + }, + { + MethodName: "GetVolumeReplicationInfo", + Handler: _Controller_GetVolumeReplicationInfo_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "replication/replication.proto", +} diff --git a/vendor/github.com/emicklei/go-restful/.travis.yml b/vendor/github.com/emicklei/go-restful/.travis.yml deleted file mode 100644 index b22f8f547..000000000 --- a/vendor/github.com/emicklei/go-restful/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: go - -go: - - 1.x - -script: go test -v \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/Makefile b/vendor/github.com/emicklei/go-restful/Makefile deleted file mode 100644 index b40081cc0..000000000 --- a/vendor/github.com/emicklei/go-restful/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: test - -test: - go test -v . - -ex: - cd examples && ls *.go | xargs go build -o /tmp/ignore \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/.gitignore b/vendor/github.com/emicklei/go-restful/v3/.gitignore similarity index 99% rename from vendor/github.com/emicklei/go-restful/.gitignore rename to vendor/github.com/emicklei/go-restful/v3/.gitignore index cece7be66..446be09b4 100644 --- a/vendor/github.com/emicklei/go-restful/.gitignore +++ b/vendor/github.com/emicklei/go-restful/v3/.gitignore @@ -68,3 +68,4 @@ examples/restful-html-template s.html restful-path-tail +.idea diff --git a/vendor/github.com/emicklei/go-restful/v3/.goconvey b/vendor/github.com/emicklei/go-restful/v3/.goconvey new file mode 100644 index 000000000..8485e986e --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/.goconvey @@ -0,0 +1 @@ +ignore \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/v3/.travis.yml b/vendor/github.com/emicklei/go-restful/v3/.travis.yml new file mode 100644 index 000000000..3a0bf5ff1 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/.travis.yml @@ -0,0 +1,13 @@ +language: go + +go: + - 1.x + +before_install: + - go test -v + +script: + - go test -race -coverprofile=coverage.txt -covermode=atomic + +after_success: + - bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/CHANGES.md b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md similarity index 73% rename from vendor/github.com/emicklei/go-restful/CHANGES.md rename to vendor/github.com/emicklei/go-restful/v3/CHANGES.md index e52529631..74a378157 100644 --- a/vendor/github.com/emicklei/go-restful/CHANGES.md +++ b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md @@ -1,7 +1,110 @@ -## Change history of go-restful +# Change history of go-restful +## [v3.9.0] - 20221-07-21 + +- add support for http.Handler implementations to work as FilterFunction, issue #504 (thanks to https://github.com/ggicci) + +## [v3.8.0] - 20221-06-06 + +- use exact matching of allowed domain entries, issue #489 (#493) + - this changes fixes [security] Authorization Bypass Through User-Controlled Key + by changing the behaviour of the AllowedDomains setting in the CORS filter. + To support the previous behaviour, the CORS filter type now has a AllowedDomainFunc + callback mechanism which is called when a simple domain match fails. +- add test and fix for POST without body and Content-type, issue #492 (#496) +- [Minor] Bad practice to have a mix of Receiver types. (#491) + +## [v3.7.2] - 2021-11-24 + +- restored FilterChain (#482 by SVilgelm) + + +## [v3.7.1] - 2021-10-04 + +- fix problem with contentEncodingEnabled setting (#479) + +## [v3.7.0] - 2021-09-24 + +- feat(parameter): adds additional openapi mappings (#478) + +## [v3.6.0] - 2021-09-18 + +- add support for vendor extensions (#477 thx erraggy) + +## [v3.5.2] - 2021-07-14 + +- fix removing absent route from webservice (#472) + +## [v3.5.1] - 2021-04-12 + +- fix handling no match access selected path +- remove obsolete field + +## [v3.5.0] - 2021-04-10 + +- add check for wildcard (#463) in CORS +- add access to Route from Request, issue #459 (#462) + +## [v3.4.0] - 2020-11-10 + +- Added OPTIONS to WebService + +## [v3.3.2] - 2020-01-23 + +- Fixed duplicate compression in dispatch. #449 + + +## [v3.3.1] - 2020-08-31 + +- Added check on writer to prevent compression of response twice. #447 + +## [v3.3.0] - 2020-08-19 + +- Enable content encoding on Handle and ServeHTTP (#446) +- List available representations in 406 body (#437) +- Convert to string using rune() (#443) + +## [v3.2.0] - 2020-06-21 + +- 405 Method Not Allowed must have Allow header (#436) (thx Bracken ) +- add field allowedMethodsWithoutContentType (#424) + +## [v3.1.0] + +- support describing response headers (#426) +- fix openapi examples (#425) + +v3.0.0 + +- fix: use request/response resulting from filter chain +- add Go module + Module consumer should use github.com/emicklei/go-restful/v3 as import path + +v2.10.0 + +- support for Custom Verbs (thanks Vinci Xu <277040271@qq.com>) +- fixed static example (thanks Arthur ) +- simplify code (thanks Christian Muehlhaeuser ) +- added JWT HMAC with SHA-512 authentication code example (thanks Amim Knabben ) + +v2.9.6 + +- small optimization in filter code + +v2.11.1 + +- fix WriteError return value (#415) + +v2.11.0 + +- allow prefix and suffix in path variable expression (#414) + +v2.9.6 + +- support google custome verb (#413) v2.9.5 + - fix panic in Response.WriteError if err == nil v2.9.4 diff --git a/vendor/github.com/emicklei/go-restful/LICENSE b/vendor/github.com/emicklei/go-restful/v3/LICENSE similarity index 100% rename from vendor/github.com/emicklei/go-restful/LICENSE rename to vendor/github.com/emicklei/go-restful/v3/LICENSE diff --git a/vendor/github.com/emicklei/go-restful/v3/Makefile b/vendor/github.com/emicklei/go-restful/v3/Makefile new file mode 100644 index 000000000..16d0b80bb --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/Makefile @@ -0,0 +1,8 @@ +all: test + +test: + go vet . + go test -cover -v . + +ex: + find ./examples -type f -name "*.go" | xargs -I {} go build -o /tmp/ignore {} \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/README.md b/vendor/github.com/emicklei/go-restful/v3/README.md similarity index 73% rename from vendor/github.com/emicklei/go-restful/README.md rename to vendor/github.com/emicklei/go-restful/v3/README.md index f52c25acf..0625359dc 100644 --- a/vendor/github.com/emicklei/go-restful/README.md +++ b/vendor/github.com/emicklei/go-restful/v3/README.md @@ -4,9 +4,10 @@ package for building REST-style Web Services using Google Go [![Build Status](https://travis-ci.org/emicklei/go-restful.png)](https://travis-ci.org/emicklei/go-restful) [![Go Report Card](https://goreportcard.com/badge/github.com/emicklei/go-restful)](https://goreportcard.com/report/github.com/emicklei/go-restful) -[![GoDoc](https://godoc.org/github.com/emicklei/go-restful?status.svg)](https://godoc.org/github.com/emicklei/go-restful) +[![GoDoc](https://godoc.org/github.com/emicklei/go-restful?status.svg)](https://pkg.go.dev/github.com/emicklei/go-restful) +[![codecov](https://codecov.io/gh/emicklei/go-restful/branch/master/graph/badge.svg)](https://codecov.io/gh/emicklei/go-restful) -- [Code examples](https://github.com/emicklei/go-restful/tree/master/examples) +- [Code examples use v3](https://github.com/emicklei/go-restful/tree/v3/examples) REST asks developers to use HTTP methods explicitly and in a way that's consistent with the protocol definition. This basic REST design principle establishes a one-to-one mapping between create, read, update, and delete (CRUD) operations and HTTP methods. According to this mapping: @@ -18,6 +19,28 @@ REST asks developers to use HTTP methods explicitly and in a way that's consiste - PATCH = Update partial content of a resource - OPTIONS = Get information about the communication options for the request URI +### Usage + +#### Without Go Modules + +All versions up to `v2.*.*` (on the master) are not supporting Go modules. + +``` +import ( + restful "github.com/emicklei/go-restful" +) +``` + +#### Using Go Modules + +As of version `v3.0.0` (on the v3 branch), this package supports Go modules. + +``` +import ( + restful "github.com/emicklei/go-restful/v3" +) +``` + ### Example ```Go @@ -39,15 +62,15 @@ func (u UserResource) findUser(request *restful.Request, response *restful.Respo } ``` -[Full API of a UserResource](https://github.com/emicklei/go-restful/tree/master/examples/restful-user-resource.go) +[Full API of a UserResource](https://github.com/emicklei/go-restful/blob/v3/examples/user-resource/restful-user-resource.go) ### Features -- Routes for request → function mapping with path parameter (e.g. {id}) support +- Routes for request → function mapping with path parameter (e.g. {id} but also prefix_{var} and {var}_suffix) support - Configurable router: - - (default) Fast routing algorithm that allows static elements, regular expressions and dynamic parameters in the URL path (e.g. /meetings/{id} or /static/{subpath:*} + - (default) Fast routing algorithm that allows static elements, [google custom method](https://cloud.google.com/apis/design/custom_methods), regular expressions and dynamic parameters in the URL path (e.g. /resource/name:customVerb, /meetings/{id} or /static/{subpath:*}) - Routing algorithm after [JSR311](http://jsr311.java.net/nonav/releases/1.1/spec/spec.html) that is implemented using (but does **not** accept) regular expressions -- Request API for reading structs from JSON/XML and accesing parameters (path,query,header) +- Request API for reading structs from JSON/XML and accessing parameters (path,query,header) - Response API for writing structs to JSON/XML and setting headers - Customizable encoding using EntityReaderWriter registration - Filters for intercepting the request → response flow on Service or Route level @@ -61,6 +84,7 @@ func (u UserResource) findUser(request *restful.Request, response *restful.Respo - Route errors produce HTTP 404/405/406/415 errors, customizable using ServiceErrorHandler(...) - Configurable (trace) logging - Customizable gzip/deflate readers and writers using CompressorProvider registration +- Inject your own http.Handler using the `HttpMiddlewareHandlerToFilter` function ## How to customize There are several hooks to customize the behavior of the go-restful package. @@ -71,12 +95,11 @@ There are several hooks to customize the behavior of the go-restful package. - Trace logging - Compression - Encoders for other serializers -- Use [jsoniter](https://github.com/json-iterator/go) by build this package using a tag, e.g. `go build -tags=jsoniter .` - -TODO: write examples of these. +- Use [jsoniter](https://github.com/json-iterator/go) by building this package using a build tag, e.g. `go build -tags=jsoniter .` ## Resources +- [Example programs](./examples) - [Example posted on blog](http://ernestmicklei.com/2012/11/go-restful-first-working-example/) - [Design explained on blog](http://ernestmicklei.com/2012/11/go-restful-api-design/) - [sourcegraph](https://sourcegraph.com/github.com/emicklei/go-restful) @@ -85,4 +108,4 @@ TODO: write examples of these. Type ```git shortlog -s``` for a full list of contributors. -© 2012 - 2018, http://ernestmicklei.com. MIT License. Contributions are welcome. +© 2012 - 2022, http://ernestmicklei.com. MIT License. Contributions are welcome. diff --git a/vendor/github.com/emicklei/go-restful/v3/SECURITY.md b/vendor/github.com/emicklei/go-restful/v3/SECURITY.md new file mode 100644 index 000000000..810d3b510 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| v3.7.x | :white_check_mark: | +| < v3.0.1 | :x: | + +## Reporting a Vulnerability + +Create an Issue and put the label `[security]` in the title of the issue. +Valid reported security issues are expected to be solved within a week. diff --git a/vendor/github.com/emicklei/go-restful/Srcfile b/vendor/github.com/emicklei/go-restful/v3/Srcfile similarity index 100% rename from vendor/github.com/emicklei/go-restful/Srcfile rename to vendor/github.com/emicklei/go-restful/v3/Srcfile diff --git a/vendor/github.com/emicklei/go-restful/bench_test.sh b/vendor/github.com/emicklei/go-restful/v3/bench_test.sh similarity index 100% rename from vendor/github.com/emicklei/go-restful/bench_test.sh rename to vendor/github.com/emicklei/go-restful/v3/bench_test.sh diff --git a/vendor/github.com/emicklei/go-restful/compress.go b/vendor/github.com/emicklei/go-restful/v3/compress.go similarity index 92% rename from vendor/github.com/emicklei/go-restful/compress.go rename to vendor/github.com/emicklei/go-restful/v3/compress.go index 220b37712..1ff239f99 100644 --- a/vendor/github.com/emicklei/go-restful/compress.go +++ b/vendor/github.com/emicklei/go-restful/v3/compress.go @@ -83,7 +83,11 @@ func (c *CompressingResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error } // WantsCompressedResponse reads the Accept-Encoding header to see if and which encoding is requested. -func wantsCompressedResponse(httpRequest *http.Request) (bool, string) { +// It also inspects the httpWriter whether its content-encoding is already set (non-empty). +func wantsCompressedResponse(httpRequest *http.Request, httpWriter http.ResponseWriter) (bool, string) { + if contentEncoding := httpWriter.Header().Get(HEADER_ContentEncoding); contentEncoding != "" { + return false, "" + } header := httpRequest.Header.Get(HEADER_AcceptEncoding) gi := strings.Index(header, ENCODING_GZIP) zi := strings.Index(header, ENCODING_DEFLATE) diff --git a/vendor/github.com/emicklei/go-restful/compressor_cache.go b/vendor/github.com/emicklei/go-restful/v3/compressor_cache.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/compressor_cache.go rename to vendor/github.com/emicklei/go-restful/v3/compressor_cache.go diff --git a/vendor/github.com/emicklei/go-restful/compressor_pools.go b/vendor/github.com/emicklei/go-restful/v3/compressor_pools.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/compressor_pools.go rename to vendor/github.com/emicklei/go-restful/v3/compressor_pools.go diff --git a/vendor/github.com/emicklei/go-restful/compressors.go b/vendor/github.com/emicklei/go-restful/v3/compressors.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/compressors.go rename to vendor/github.com/emicklei/go-restful/v3/compressors.go diff --git a/vendor/github.com/emicklei/go-restful/constants.go b/vendor/github.com/emicklei/go-restful/v3/constants.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/constants.go rename to vendor/github.com/emicklei/go-restful/v3/constants.go diff --git a/vendor/github.com/emicklei/go-restful/container.go b/vendor/github.com/emicklei/go-restful/v3/container.go similarity index 78% rename from vendor/github.com/emicklei/go-restful/container.go rename to vendor/github.com/emicklei/go-restful/v3/container.go index 061a8d718..dd56246dd 100644 --- a/vendor/github.com/emicklei/go-restful/container.go +++ b/vendor/github.com/emicklei/go-restful/v3/container.go @@ -14,7 +14,7 @@ import ( "strings" "sync" - "github.com/emicklei/go-restful/log" + "github.com/emicklei/go-restful/v3/log" ) // Container holds a collection of WebServices and a http.ServeMux to dispatch http requests. @@ -185,6 +185,11 @@ func logStackOnRecover(panicReason interface{}, httpWriter http.ResponseWriter) // when a ServiceError is returned during route selection. Default implementation // calls resp.WriteErrorString(err.Code, err.Message) func writeServiceError(err ServiceError, req *Request, resp *Response) { + for header, values := range err.Header { + for _, value := range values { + resp.Header().Add(header, value) + } + } resp.WriteErrorString(err.Code, err.Message) } @@ -201,6 +206,7 @@ func (c *Container) Dispatch(httpWriter http.ResponseWriter, httpRequest *http.R // Dispatch the incoming Http Request to a matching WebService. func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) { + // so we can assign a compressing one later writer := httpWriter // CompressingResponseWriter should be closed after all operations are done @@ -231,28 +237,8 @@ func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.R c.webServices, httpRequest) }() - - // Detect if compression is needed - // assume without compression, test for override - contentEncodingEnabled := c.contentEncodingEnabled - if route != nil && route.contentEncodingEnabled != nil { - contentEncodingEnabled = *route.contentEncodingEnabled - } - if contentEncodingEnabled { - doCompress, encoding := wantsCompressedResponse(httpRequest) - if doCompress { - var err error - writer, err = NewCompressingResponseWriter(httpWriter, encoding) - if err != nil { - log.Print("unable to install compressor: ", err) - httpWriter.WriteHeader(http.StatusInternalServerError) - return - } - } - } - if err != nil { - // a non-200 response has already been written + // a non-200 response (may be compressed) has already been written // run container filters anyway ; they should not touch the response... chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) { switch err.(type) { @@ -265,6 +251,29 @@ func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.R chain.ProcessFilter(NewRequest(httpRequest), NewResponse(writer)) return } + + // Unless httpWriter is already an CompressingResponseWriter see if we need to install one + if _, isCompressing := httpWriter.(*CompressingResponseWriter); !isCompressing { + // Detect if compression is needed + // assume without compression, test for override + contentEncodingEnabled := c.contentEncodingEnabled + if route != nil && route.contentEncodingEnabled != nil { + contentEncodingEnabled = *route.contentEncodingEnabled + } + if contentEncodingEnabled { + doCompress, encoding := wantsCompressedResponse(httpRequest, httpWriter) + if doCompress { + var err error + writer, err = NewCompressingResponseWriter(httpWriter, encoding) + if err != nil { + log.Print("unable to install compressor: ", err) + httpWriter.WriteHeader(http.StatusInternalServerError) + return + } + } + } + } + pathProcessor, routerProcessesPath := c.router.(PathProcessor) if !routerProcessesPath { pathProcessor = defaultPathProcessor{} @@ -272,16 +281,18 @@ func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.R pathParams := pathProcessor.ExtractParameters(route, webService, httpRequest.URL.Path) wrappedRequest, wrappedResponse := route.wrapRequestResponse(writer, httpRequest, pathParams) // pass through filters (if any) - if len(c.containerFilters)+len(webService.filters)+len(route.Filters) > 0 { + if size := len(c.containerFilters) + len(webService.filters) + len(route.Filters); size > 0 { // compose filter chain - allFilters := []FilterFunction{} + allFilters := make([]FilterFunction, 0, size) allFilters = append(allFilters, c.containerFilters...) allFilters = append(allFilters, webService.filters...) allFilters = append(allFilters, route.Filters...) - chain := FilterChain{Filters: allFilters, Target: func(req *Request, resp *Response) { - // handle request by route after passing all filters - route.Function(wrappedRequest, wrappedResponse) - }} + chain := FilterChain{ + Filters: allFilters, + Target: route.Function, + ParameterDocs: route.ParameterDocs, + Operation: route.Operation, + } chain.ProcessFilter(wrappedRequest, wrappedResponse) } else { // no filters, handle request by route @@ -299,13 +310,75 @@ func fixedPrefixPath(pathspec string) string { } // ServeHTTP implements net/http.Handler therefore a Container can be a Handler in a http.Server -func (c *Container) ServeHTTP(httpwriter http.ResponseWriter, httpRequest *http.Request) { - c.ServeMux.ServeHTTP(httpwriter, httpRequest) +func (c *Container) ServeHTTP(httpWriter http.ResponseWriter, httpRequest *http.Request) { + // Skip, if content encoding is disabled + if !c.contentEncodingEnabled { + c.ServeMux.ServeHTTP(httpWriter, httpRequest) + return + } + // content encoding is enabled + + // Skip, if httpWriter is already an CompressingResponseWriter + if _, ok := httpWriter.(*CompressingResponseWriter); ok { + c.ServeMux.ServeHTTP(httpWriter, httpRequest) + return + } + + writer := httpWriter + // CompressingResponseWriter should be closed after all operations are done + defer func() { + if compressWriter, ok := writer.(*CompressingResponseWriter); ok { + compressWriter.Close() + } + }() + + doCompress, encoding := wantsCompressedResponse(httpRequest, httpWriter) + if doCompress { + var err error + writer, err = NewCompressingResponseWriter(httpWriter, encoding) + if err != nil { + log.Print("unable to install compressor: ", err) + httpWriter.WriteHeader(http.StatusInternalServerError) + return + } + } + + c.ServeMux.ServeHTTP(writer, httpRequest) } // Handle registers the handler for the given pattern. If a handler already exists for pattern, Handle panics. func (c *Container) Handle(pattern string, handler http.Handler) { - c.ServeMux.Handle(pattern, handler) + c.ServeMux.Handle(pattern, http.HandlerFunc(func(httpWriter http.ResponseWriter, httpRequest *http.Request) { + // Skip, if httpWriter is already an CompressingResponseWriter + if _, ok := httpWriter.(*CompressingResponseWriter); ok { + handler.ServeHTTP(httpWriter, httpRequest) + return + } + + writer := httpWriter + + // CompressingResponseWriter should be closed after all operations are done + defer func() { + if compressWriter, ok := writer.(*CompressingResponseWriter); ok { + compressWriter.Close() + } + }() + + if c.contentEncodingEnabled { + doCompress, encoding := wantsCompressedResponse(httpRequest, httpWriter) + if doCompress { + var err error + writer, err = NewCompressingResponseWriter(httpWriter, encoding) + if err != nil { + log.Print("unable to install compressor: ", err) + httpWriter.WriteHeader(http.StatusInternalServerError) + return + } + } + } + + handler.ServeHTTP(writer, httpRequest) + })) } // HandleWithFilter registers the handler for the given pattern. @@ -319,7 +392,7 @@ func (c *Container) HandleWithFilter(pattern string, handler http.Handler) { } chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) { - handler.ServeHTTP(httpResponse, httpRequest) + handler.ServeHTTP(resp, req.Request) }} chain.ProcessFilter(NewRequest(httpRequest), NewResponse(httpResponse)) } diff --git a/vendor/github.com/emicklei/go-restful/cors_filter.go b/vendor/github.com/emicklei/go-restful/v3/cors_filter.go similarity index 81% rename from vendor/github.com/emicklei/go-restful/cors_filter.go rename to vendor/github.com/emicklei/go-restful/v3/cors_filter.go index 1efeef072..9d18dfb7b 100644 --- a/vendor/github.com/emicklei/go-restful/cors_filter.go +++ b/vendor/github.com/emicklei/go-restful/v3/cors_filter.go @@ -18,9 +18,22 @@ import ( // http://enable-cors.org/server.html // http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request type CrossOriginResourceSharing struct { - ExposeHeaders []string // list of Header names - AllowedHeaders []string // list of Header names - AllowedDomains []string // list of allowed values for Http Origin. An allowed value can be a regular expression to support subdomain matching. If empty all are allowed. + ExposeHeaders []string // list of Header names + + // AllowedHeaders is alist of Header names. Checking is case-insensitive. + // The list may contain the special wildcard string ".*" ; all is allowed + AllowedHeaders []string + + // AllowedDomains is a list of allowed values for Http Origin. + // The list may contain the special wildcard string ".*" ; all is allowed + // If empty all are allowed. + AllowedDomains []string + + // AllowedDomainFunc is optional and is a function that will do the check + // when the origin is not part of the AllowedDomains and it does not contain the wildcard ".*". + AllowedDomainFunc func(origin string) bool + + // AllowedMethods is either empty or has a list of http methods names. Checking is case-insensitive. AllowedMethods []string MaxAge int // number of seconds before requiring new Options request CookiesAllowed bool @@ -119,36 +132,24 @@ func (c CrossOriginResourceSharing) isOriginAllowed(origin string) bool { if len(origin) == 0 { return false } + lowerOrigin := strings.ToLower(origin) if len(c.AllowedDomains) == 0 { + if c.AllowedDomainFunc != nil { + return c.AllowedDomainFunc(lowerOrigin) + } return true } - allowed := false + // exact match on each allowed domain for _, domain := range c.AllowedDomains { - if domain == origin { - allowed = true - break + if domain == ".*" || strings.ToLower(domain) == lowerOrigin { + return true } } - - if !allowed { - if len(c.allowedOriginPatterns) == 0 { - // compile allowed domains to allowed origin patterns - allowedOriginRegexps, err := compileRegexps(c.AllowedDomains) - if err != nil { - return false - } - c.allowedOriginPatterns = allowedOriginRegexps - } - - for _, pattern := range c.allowedOriginPatterns { - if allowed = pattern.MatchString(origin); allowed { - break - } - } + if c.AllowedDomainFunc != nil { + return c.AllowedDomainFunc(origin) } - - return allowed + return false } func (c CrossOriginResourceSharing) setAllowOriginHeader(req *Request, resp *Response) { @@ -184,19 +185,9 @@ func (c CrossOriginResourceSharing) isValidAccessControlRequestHeader(header str if strings.ToLower(each) == strings.ToLower(header) { return true } - } - return false -} - -// Take a list of strings and compile them into a list of regular expressions. -func compileRegexps(regexpStrings []string) ([]*regexp.Regexp, error) { - regexps := []*regexp.Regexp{} - for _, regexpStr := range regexpStrings { - r, err := regexp.Compile(regexpStr) - if err != nil { - return regexps, err + if each == "*" { + return true } - regexps = append(regexps, r) } - return regexps, nil + return false } diff --git a/vendor/github.com/emicklei/go-restful/coverage.sh b/vendor/github.com/emicklei/go-restful/v3/coverage.sh similarity index 100% rename from vendor/github.com/emicklei/go-restful/coverage.sh rename to vendor/github.com/emicklei/go-restful/v3/coverage.sh diff --git a/vendor/github.com/emicklei/go-restful/curly.go b/vendor/github.com/emicklei/go-restful/v3/curly.go similarity index 93% rename from vendor/github.com/emicklei/go-restful/curly.go rename to vendor/github.com/emicklei/go-restful/v3/curly.go index 14d5b76bf..ba1fc5d5f 100644 --- a/vendor/github.com/emicklei/go-restful/curly.go +++ b/vendor/github.com/emicklei/go-restful/v3/curly.go @@ -47,7 +47,7 @@ func (c CurlyRouter) SelectRoute( func (c CurlyRouter) selectRoutes(ws *WebService, requestTokens []string) sortableCurlyRoutes { candidates := make(sortableCurlyRoutes, 0, 8) for _, each := range ws.routes { - matches, paramCount, staticCount := c.matchesRouteByPathTokens(each.pathParts, requestTokens) + matches, paramCount, staticCount := c.matchesRouteByPathTokens(each.pathParts, requestTokens, each.hasCustomVerb) if matches { candidates.add(curlyRoute{each, paramCount, staticCount}) // TODO make sure Routes() return pointers? } @@ -57,7 +57,7 @@ func (c CurlyRouter) selectRoutes(ws *WebService, requestTokens []string) sortab } // matchesRouteByPathTokens computes whether it matches, howmany parameters do match and what the number of static path elements are. -func (c CurlyRouter) matchesRouteByPathTokens(routeTokens, requestTokens []string) (matches bool, paramCount int, staticCount int) { +func (c CurlyRouter) matchesRouteByPathTokens(routeTokens, requestTokens []string, routeHasCustomVerb bool) (matches bool, paramCount int, staticCount int) { if len(routeTokens) < len(requestTokens) { // proceed in matching only if last routeToken is wildcard count := len(routeTokens) @@ -72,6 +72,15 @@ func (c CurlyRouter) matchesRouteByPathTokens(routeTokens, requestTokens []strin return false, 0, 0 } requestToken := requestTokens[i] + if routeHasCustomVerb && hasCustomVerb(routeToken){ + if !isMatchCustomVerb(routeToken, requestToken) { + return false, 0, 0 + } + staticCount++ + requestToken = removeCustomVerb(requestToken) + routeToken = removeCustomVerb(routeToken) + } + if strings.HasPrefix(routeToken, "{") { paramCount++ if colon := strings.Index(routeToken, ":"); colon != -1 { diff --git a/vendor/github.com/emicklei/go-restful/curly_route.go b/vendor/github.com/emicklei/go-restful/v3/curly_route.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/curly_route.go rename to vendor/github.com/emicklei/go-restful/v3/curly_route.go diff --git a/vendor/github.com/emicklei/go-restful/v3/custom_verb.go b/vendor/github.com/emicklei/go-restful/v3/custom_verb.go new file mode 100644 index 000000000..bfc17efde --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/custom_verb.go @@ -0,0 +1,29 @@ +package restful + +import ( + "fmt" + "regexp" +) + +var ( + customVerbReg = regexp.MustCompile(":([A-Za-z]+)$") +) + +func hasCustomVerb(routeToken string) bool { + return customVerbReg.MatchString(routeToken) +} + +func isMatchCustomVerb(routeToken string, pathToken string) bool { + rs := customVerbReg.FindStringSubmatch(routeToken) + if len(rs) < 2 { + return false + } + + customVerb := rs[1] + specificVerbReg := regexp.MustCompile(fmt.Sprintf(":%s$", customVerb)) + return specificVerbReg.MatchString(pathToken) +} + +func removeCustomVerb(str string) string { + return customVerbReg.ReplaceAllString(str, "") +} diff --git a/vendor/github.com/emicklei/go-restful/doc.go b/vendor/github.com/emicklei/go-restful/v3/doc.go similarity index 95% rename from vendor/github.com/emicklei/go-restful/doc.go rename to vendor/github.com/emicklei/go-restful/v3/doc.go index f7c16b01f..69b13057d 100644 --- a/vendor/github.com/emicklei/go-restful/doc.go +++ b/vendor/github.com/emicklei/go-restful/v3/doc.go @@ -28,7 +28,7 @@ This package has the logic to find the best matching Route and if found, call it The (*Request, *Response) arguments provide functions for reading information from the request and writing information back to the response. -See the example https://github.com/emicklei/go-restful/blob/master/examples/restful-user-resource.go with a full implementation. +See the example https://github.com/emicklei/go-restful/blob/v3/examples/user-resource/restful-user-resource.go with a full implementation. Regular expression matching Routes @@ -82,7 +82,7 @@ These are processed before calling the function associated with the Route. // install 2 chained route filters (processed before calling findUser) ws.Route(ws.GET("/{user-id}").Filter(routeLogging).Filter(NewCountFilter().routeCounter).To(findUser)) -See the example https://github.com/emicklei/go-restful/blob/master/examples/restful-filters.go with full implementations. +See the example https://github.com/emicklei/go-restful/blob/v3/examples/filters/restful-filters.go with full implementations. Response Encoding @@ -93,7 +93,7 @@ Two encodings are supported: gzip and deflate. To enable this for all responses: If a Http request includes the Accept-Encoding header then the response content will be compressed using the specified encoding. Alternatively, you can create a Filter that performs the encoding and install it per WebService or Route. -See the example https://github.com/emicklei/go-restful/blob/master/examples/restful-encoding-filter.go +See the example https://github.com/emicklei/go-restful/blob/v3/examples/encoding/restful-encoding-filter.go OPTIONS support diff --git a/vendor/github.com/emicklei/go-restful/entity_accessors.go b/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/entity_accessors.go rename to vendor/github.com/emicklei/go-restful/v3/entity_accessors.go diff --git a/vendor/github.com/emicklei/go-restful/v3/extensions.go b/vendor/github.com/emicklei/go-restful/v3/extensions.go new file mode 100644 index 000000000..5023fa049 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/extensions.go @@ -0,0 +1,21 @@ +package restful + +// Copyright 2021 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +// ExtensionProperties provides storage of vendor extensions for entities +type ExtensionProperties struct { + // Extensions vendor extensions used to describe extra functionality + // (https://swagger.io/docs/specification/2-0/swagger-extensions/) + Extensions map[string]interface{} +} + +// AddExtension adds or updates a key=value pair to the extension map. +func (ep *ExtensionProperties) AddExtension(key string, value interface{}) { + if ep.Extensions == nil { + ep.Extensions = map[string]interface{}{key: value} + } else { + ep.Extensions[key] = value + } +} diff --git a/vendor/github.com/emicklei/go-restful/filter.go b/vendor/github.com/emicklei/go-restful/v3/filter.go similarity index 79% rename from vendor/github.com/emicklei/go-restful/filter.go rename to vendor/github.com/emicklei/go-restful/v3/filter.go index c23bfb591..fd88c536c 100644 --- a/vendor/github.com/emicklei/go-restful/filter.go +++ b/vendor/github.com/emicklei/go-restful/v3/filter.go @@ -6,9 +6,11 @@ package restful // FilterChain is a request scoped object to process one or more filters before calling the target RouteFunction. type FilterChain struct { - Filters []FilterFunction // ordered list of FilterFunction - Index int // index into filters that is currently in progress - Target RouteFunction // function to call after passing all filters + Filters []FilterFunction // ordered list of FilterFunction + Index int // index into filters that is currently in progress + Target RouteFunction // function to call after passing all filters + ParameterDocs []*Parameter // the parameter docs for the route + Operation string // the name of the operation } // ProcessFilter passes the request,response pair through the next of Filters. diff --git a/vendor/github.com/emicklei/go-restful/v3/filter_adapter.go b/vendor/github.com/emicklei/go-restful/v3/filter_adapter.go new file mode 100644 index 000000000..c246512fc --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/filter_adapter.go @@ -0,0 +1,21 @@ +package restful + +import ( + "net/http" +) + +// HttpMiddlewareHandler is a function that takes a http.Handler and returns a http.Handler +type HttpMiddlewareHandler func(http.Handler) http.Handler + +// HttpMiddlewareHandlerToFilter converts a HttpMiddlewareHandler to a FilterFunction. +func HttpMiddlewareHandlerToFilter(middleware HttpMiddlewareHandler) FilterFunction { + return func(req *Request, resp *Response, chain *FilterChain) { + next := http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + req.Request = r + resp.ResponseWriter = rw + chain.ProcessFilter(req, resp) + }) + + middleware(next).ServeHTTP(resp.ResponseWriter, req.Request) + } +} diff --git a/vendor/github.com/emicklei/go-restful/json.go b/vendor/github.com/emicklei/go-restful/v3/json.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/json.go rename to vendor/github.com/emicklei/go-restful/v3/json.go diff --git a/vendor/github.com/emicklei/go-restful/jsoniter.go b/vendor/github.com/emicklei/go-restful/v3/jsoniter.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/jsoniter.go rename to vendor/github.com/emicklei/go-restful/v3/jsoniter.go diff --git a/vendor/github.com/emicklei/go-restful/jsr311.go b/vendor/github.com/emicklei/go-restful/v3/jsr311.go similarity index 89% rename from vendor/github.com/emicklei/go-restful/jsr311.go rename to vendor/github.com/emicklei/go-restful/v3/jsr311.go index 3ede1891e..07a0c91e9 100644 --- a/vendor/github.com/emicklei/go-restful/jsr311.go +++ b/vendor/github.com/emicklei/go-restful/v3/jsr311.go @@ -9,6 +9,7 @@ import ( "fmt" "net/http" "sort" + "strings" ) // RouterJSR311 implements the flow for matching Requests to Routes (and consequently Resource Functions) @@ -98,7 +99,18 @@ func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*R if trace { traceLogger.Printf("no Route found (in %d routes) that matches HTTP method %s\n", len(previous), httpRequest.Method) } - return nil, NewError(http.StatusMethodNotAllowed, "405: Method Not Allowed") + allowed := []string{} + allowedLoop: + for _, candidate := range previous { + for _, method := range allowed { + if method == candidate.Method { + continue allowedLoop + } + } + allowed = append(allowed, candidate.Method) + } + header := http.Header{"Allow": []string{strings.Join(allowed, ", ")}} + return nil, NewErrorWithHeader(http.StatusMethodNotAllowed, "405: Method Not Allowed", header) } // content-type @@ -135,7 +147,24 @@ func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*R if trace { traceLogger.Printf("no Route found (from %d) that matches HTTP Accept: %s\n", len(previous), accept) } - return nil, NewError(http.StatusNotAcceptable, "406: Not Acceptable") + available := []string{} + for _, candidate := range previous { + available = append(available, candidate.Produces...) + } + // if POST,PUT,PATCH without body + method, length := httpRequest.Method, httpRequest.Header.Get("Content-Length") + if (method == http.MethodPost || + method == http.MethodPut || + method == http.MethodPatch) && length == "" { + return nil, NewError( + http.StatusUnsupportedMediaType, + fmt.Sprintf("415: Unsupported Media Type\n\nAvailable representations: %s", strings.Join(available, ", ")), + ) + } + return nil, NewError( + http.StatusNotAcceptable, + fmt.Sprintf("406: Not Acceptable\n\nAvailable representations: %s", strings.Join(available, ", ")), + ) } // return r.bestMatchByMedia(outputMediaOk, contentType, accept), nil return candidates[0], nil diff --git a/vendor/github.com/emicklei/go-restful/log/log.go b/vendor/github.com/emicklei/go-restful/v3/log/log.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/log/log.go rename to vendor/github.com/emicklei/go-restful/v3/log/log.go diff --git a/vendor/github.com/emicklei/go-restful/logger.go b/vendor/github.com/emicklei/go-restful/v3/logger.go similarity index 95% rename from vendor/github.com/emicklei/go-restful/logger.go rename to vendor/github.com/emicklei/go-restful/v3/logger.go index 6595df002..29202726f 100644 --- a/vendor/github.com/emicklei/go-restful/logger.go +++ b/vendor/github.com/emicklei/go-restful/v3/logger.go @@ -4,7 +4,7 @@ package restful // Use of this source code is governed by a license // that can be found in the LICENSE file. import ( - "github.com/emicklei/go-restful/log" + "github.com/emicklei/go-restful/v3/log" ) var trace bool = false diff --git a/vendor/github.com/emicklei/go-restful/mime.go b/vendor/github.com/emicklei/go-restful/v3/mime.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/mime.go rename to vendor/github.com/emicklei/go-restful/v3/mime.go diff --git a/vendor/github.com/emicklei/go-restful/options_filter.go b/vendor/github.com/emicklei/go-restful/v3/options_filter.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/options_filter.go rename to vendor/github.com/emicklei/go-restful/v3/options_filter.go diff --git a/vendor/github.com/emicklei/go-restful/parameter.go b/vendor/github.com/emicklei/go-restful/v3/parameter.go similarity index 56% rename from vendor/github.com/emicklei/go-restful/parameter.go rename to vendor/github.com/emicklei/go-restful/v3/parameter.go index e8793304b..0b851bb43 100644 --- a/vendor/github.com/emicklei/go-restful/parameter.go +++ b/vendor/github.com/emicklei/go-restful/v3/parameter.go @@ -1,5 +1,7 @@ package restful +import "sort" + // Copyright 2013 Ernest Micklei. All rights reserved. // Use of this source code is governed by a license // that can be found in the LICENSE file. @@ -20,6 +22,9 @@ const ( // FormParameterKind = indicator of Request parameter type "form" FormParameterKind + // MultiPartFormParameterKind = indicator of Request parameter type "multipart/form-data" + MultiPartFormParameterKind + // CollectionFormatCSV comma separated values `foo,bar` CollectionFormatCSV = CollectionFormat("csv") @@ -52,13 +57,25 @@ type Parameter struct { // ParameterData represents the state of a Parameter. // It is made public to make it accessible to e.g. the Swagger package. type ParameterData struct { + ExtensionProperties Name, Description, DataType, DataFormat string Kind int Required bool - AllowableValues map[string]string - AllowMultiple bool - DefaultValue string - CollectionFormat string + // AllowableValues is deprecated. Use PossibleValues instead + AllowableValues map[string]string + PossibleValues []string + AllowMultiple bool + AllowEmptyValue bool + DefaultValue string + CollectionFormat string + Pattern string + Minimum *float64 + Maximum *float64 + MinLength *int64 + MaxLength *int64 + MinItems *int64 + MaxItems *int64 + UniqueItems bool } // Data returns the state of the Parameter @@ -94,6 +111,11 @@ func (p *Parameter) beForm() *Parameter { return p } +func (p *Parameter) beMultiPartForm() *Parameter { + p.data.Kind = MultiPartFormParameterKind + return p +} + // Required sets the required field and returns the receiver func (p *Parameter) Required(required bool) *Parameter { p.data.Required = required @@ -106,9 +128,38 @@ func (p *Parameter) AllowMultiple(multiple bool) *Parameter { return p } -// AllowableValues sets the allowableValues field and returns the receiver +// AddExtension adds or updates a key=value pair to the extension map +func (p *Parameter) AddExtension(key string, value interface{}) *Parameter { + p.data.AddExtension(key, value) + return p +} + +// AllowEmptyValue sets the AllowEmptyValue field and returns the receiver +func (p *Parameter) AllowEmptyValue(multiple bool) *Parameter { + p.data.AllowEmptyValue = multiple + return p +} + +// AllowableValues is deprecated. Use PossibleValues instead. Both will be set. func (p *Parameter) AllowableValues(values map[string]string) *Parameter { p.data.AllowableValues = values + + allowableSortedKeys := make([]string, 0, len(values)) + for k := range values { + allowableSortedKeys = append(allowableSortedKeys, k) + } + sort.Strings(allowableSortedKeys) + + p.data.PossibleValues = make([]string, 0, len(values)) + for _, k := range allowableSortedKeys { + p.data.PossibleValues = append(p.data.PossibleValues, values[k]) + } + return p +} + +// PossibleValues sets the possible values field and returns the receiver +func (p *Parameter) PossibleValues(values []string) *Parameter { + p.data.PossibleValues = values return p } @@ -141,3 +192,51 @@ func (p *Parameter) CollectionFormat(format CollectionFormat) *Parameter { p.data.CollectionFormat = format.String() return p } + +// Pattern sets the pattern field and returns the receiver +func (p *Parameter) Pattern(pattern string) *Parameter { + p.data.Pattern = pattern + return p +} + +// Minimum sets the minimum field and returns the receiver +func (p *Parameter) Minimum(minimum float64) *Parameter { + p.data.Minimum = &minimum + return p +} + +// Maximum sets the maximum field and returns the receiver +func (p *Parameter) Maximum(maximum float64) *Parameter { + p.data.Maximum = &maximum + return p +} + +// MinLength sets the minLength field and returns the receiver +func (p *Parameter) MinLength(minLength int64) *Parameter { + p.data.MinLength = &minLength + return p +} + +// MaxLength sets the maxLength field and returns the receiver +func (p *Parameter) MaxLength(maxLength int64) *Parameter { + p.data.MaxLength = &maxLength + return p +} + +// MinItems sets the minItems field and returns the receiver +func (p *Parameter) MinItems(minItems int64) *Parameter { + p.data.MinItems = &minItems + return p +} + +// MaxItems sets the maxItems field and returns the receiver +func (p *Parameter) MaxItems(maxItems int64) *Parameter { + p.data.MaxItems = &maxItems + return p +} + +// UniqueItems sets the uniqueItems field and returns the receiver +func (p *Parameter) UniqueItems(uniqueItems bool) *Parameter { + p.data.UniqueItems = uniqueItems + return p +} diff --git a/vendor/github.com/emicklei/go-restful/path_expression.go b/vendor/github.com/emicklei/go-restful/v3/path_expression.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/path_expression.go rename to vendor/github.com/emicklei/go-restful/v3/path_expression.go diff --git a/vendor/github.com/emicklei/go-restful/path_processor.go b/vendor/github.com/emicklei/go-restful/v3/path_processor.go similarity index 79% rename from vendor/github.com/emicklei/go-restful/path_processor.go rename to vendor/github.com/emicklei/go-restful/v3/path_processor.go index 357c723a7..141573245 100644 --- a/vendor/github.com/emicklei/go-restful/path_processor.go +++ b/vendor/github.com/emicklei/go-restful/v3/path_processor.go @@ -29,7 +29,12 @@ func (d defaultPathProcessor) ExtractParameters(r *Route, _ *WebService, urlPath } else { value = urlParts[i] } - if strings.HasPrefix(key, "{") { // path-parameter + if r.hasCustomVerb && hasCustomVerb(key) { + key = removeCustomVerb(key) + value = removeCustomVerb(value) + } + + if strings.Index(key, "{") > -1 { // path-parameter if colon := strings.Index(key, ":"); colon != -1 { // extract by regex regPart := key[colon+1 : len(key)-1] @@ -42,7 +47,13 @@ func (d defaultPathProcessor) ExtractParameters(r *Route, _ *WebService, urlPath } } else { // without enclosing {} - pathParameters[key[1:len(key)-1]] = value + startIndex := strings.Index(key, "{") + endKeyIndex := strings.Index(key, "}") + + suffixLength := len(key) - endKeyIndex - 1 + endValueIndex := len(value) - suffixLength + + pathParameters[key[startIndex+1:endKeyIndex]] = value[startIndex:endValueIndex] } } } diff --git a/vendor/github.com/emicklei/go-restful/request.go b/vendor/github.com/emicklei/go-restful/v3/request.go similarity index 85% rename from vendor/github.com/emicklei/go-restful/request.go rename to vendor/github.com/emicklei/go-restful/v3/request.go index a20730feb..5725a0759 100644 --- a/vendor/github.com/emicklei/go-restful/request.go +++ b/vendor/github.com/emicklei/go-restful/v3/request.go @@ -13,10 +13,10 @@ var defaultRequestContentType string // Request is a wrapper for a http Request that provides convenience methods type Request struct { - Request *http.Request - pathParameters map[string]string - attributes map[string]interface{} // for storing request-scoped values - selectedRoutePath string // root path + route path that matched the request, e.g. /meetings/{id}/attendees + Request *http.Request + pathParameters map[string]string + attributes map[string]interface{} // for storing request-scoped values + selectedRoute *Route // is nil when no route was matched } func NewRequest(httpRequest *http.Request) *Request { @@ -113,6 +113,20 @@ func (r Request) Attribute(name string) interface{} { } // SelectedRoutePath root path + route path that matched the request, e.g. /meetings/{id}/attendees +// If no route was matched then return an empty string. func (r Request) SelectedRoutePath() string { - return r.selectedRoutePath + if r.selectedRoute == nil { + return "" + } + // skip creating an accessor + return r.selectedRoute.Path +} + +// SelectedRoute returns a reader to access the selected Route by the container +// Returns nil if no route was matched. +func (r Request) SelectedRoute() RouteReader { + if r.selectedRoute == nil { + return nil + } + return routeAccessor{route: r.selectedRoute} } diff --git a/vendor/github.com/emicklei/go-restful/response.go b/vendor/github.com/emicklei/go-restful/v3/response.go similarity index 96% rename from vendor/github.com/emicklei/go-restful/response.go rename to vendor/github.com/emicklei/go-restful/v3/response.go index fbb48f2da..8f0b56aa2 100644 --- a/vendor/github.com/emicklei/go-restful/response.go +++ b/vendor/github.com/emicklei/go-restful/v3/response.go @@ -174,15 +174,16 @@ func (r *Response) WriteHeaderAndJson(status int, value interface{}, contentType return writeJSON(r, status, contentType, value) } -// WriteError write the http status and the error string on the response. err can be nil. -func (r *Response) WriteError(httpStatus int, err error) error { +// WriteError writes the http status and the error string on the response. err can be nil. +// Return an error if writing was not successful. +func (r *Response) WriteError(httpStatus int, err error) (writeErr error) { r.err = err if err == nil { - r.WriteErrorString(httpStatus, "") + writeErr = r.WriteErrorString(httpStatus, "") } else { - r.WriteErrorString(httpStatus, err.Error()) + writeErr = r.WriteErrorString(httpStatus, err.Error()) } - return err + return writeErr } // WriteServiceError is a convenience method for a responding with a status and a ServiceError diff --git a/vendor/github.com/emicklei/go-restful/route.go b/vendor/github.com/emicklei/go-restful/v3/route.go similarity index 84% rename from vendor/github.com/emicklei/go-restful/route.go rename to vendor/github.com/emicklei/go-restful/v3/route.go index 6d15dbf66..193f4a6b0 100644 --- a/vendor/github.com/emicklei/go-restful/route.go +++ b/vendor/github.com/emicklei/go-restful/v3/route.go @@ -19,6 +19,7 @@ type RouteSelectionConditionFunction func(httpRequest *http.Request) bool // Route binds a HTTP Method,Path,Consumes combination to a RouteFunction. type Route struct { + ExtensionProperties Method string Produces []string Consumes []string @@ -49,35 +50,33 @@ type Route struct { //Overrides the container.contentEncodingEnabled contentEncodingEnabled *bool + + // indicate route path has custom verb + hasCustomVerb bool + + // if a request does not include a content-type header then + // depending on the method, it may return a 415 Unsupported Media + // Must have uppercase HTTP Method names such as GET,HEAD,OPTIONS,... + allowedMethodsWithoutContentType []string } // Initialize for Route func (r *Route) postBuild() { r.pathParts = tokenizePath(r.Path) + r.hasCustomVerb = hasCustomVerb(r.Path) } // Create Request and Response from their http versions func (r *Route) wrapRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request, pathParams map[string]string) (*Request, *Response) { wrappedRequest := NewRequest(httpRequest) wrappedRequest.pathParameters = pathParams - wrappedRequest.selectedRoutePath = r.Path + wrappedRequest.selectedRoute = r wrappedResponse := NewResponse(httpWriter) wrappedResponse.requestAccept = httpRequest.Header.Get(HEADER_Accept) wrappedResponse.routeProduces = r.Produces return wrappedRequest, wrappedResponse } -// dispatchWithFilters call the function after passing through its own filters -func (r *Route) dispatchWithFilters(wrappedRequest *Request, wrappedResponse *Response) { - if len(r.Filters) > 0 { - chain := FilterChain{Filters: r.Filters, Target: r.Function} - chain.ProcessFilter(wrappedRequest, wrappedResponse) - } else { - // unfiltered - r.Function(wrappedRequest, wrappedResponse) - } -} - func stringTrimSpaceCutset(r rune) bool { return r == ' ' } @@ -121,8 +120,17 @@ func (r Route) matchesContentType(mimeTypes string) bool { if len(mimeTypes) == 0 { // idempotent methods with (most-likely or guaranteed) empty content match missing Content-Type m := r.Method - if m == "GET" || m == "HEAD" || m == "OPTIONS" || m == "DELETE" || m == "TRACE" { - return true + // if route specifies less or non-idempotent methods then use that + if len(r.allowedMethodsWithoutContentType) > 0 { + for _, each := range r.allowedMethodsWithoutContentType { + if m == each { + return true + } + } + } else { + if m == "GET" || m == "HEAD" || m == "OPTIONS" || m == "DELETE" || m == "TRACE" { + return true + } } // proceed with default mimeTypes = MIME_OCTET @@ -160,11 +168,11 @@ func tokenizePath(path string) []string { } // for debugging -func (r Route) String() string { +func (r *Route) String() string { return r.Method + " " + r.Path } // EnableContentEncoding (default=false) allows for GZIP or DEFLATE encoding of responses. Overrides the container.contentEncodingEnabled value. -func (r Route) EnableContentEncoding(enabled bool) { +func (r *Route) EnableContentEncoding(enabled bool) { r.contentEncodingEnabled = &enabled } diff --git a/vendor/github.com/emicklei/go-restful/route_builder.go b/vendor/github.com/emicklei/go-restful/v3/route_builder.go similarity index 75% rename from vendor/github.com/emicklei/go-restful/route_builder.go rename to vendor/github.com/emicklei/go-restful/v3/route_builder.go index 0fccf61e9..23641b6dd 100644 --- a/vendor/github.com/emicklei/go-restful/route_builder.go +++ b/vendor/github.com/emicklei/go-restful/v3/route_builder.go @@ -12,19 +12,20 @@ import ( "strings" "sync/atomic" - "github.com/emicklei/go-restful/log" + "github.com/emicklei/go-restful/v3/log" ) // RouteBuilder is a helper to construct Routes. type RouteBuilder struct { - rootPath string - currentPath string - produces []string - consumes []string - httpMethod string // required - function RouteFunction // required - filters []FilterFunction - conditions []RouteSelectionConditionFunction + rootPath string + currentPath string + produces []string + consumes []string + httpMethod string // required + function RouteFunction // required + filters []FilterFunction + conditions []RouteSelectionConditionFunction + allowedMethodsWithoutContentType []string // see Route typeNameHandleFunc TypeNameHandleFunction // required @@ -37,6 +38,7 @@ type RouteBuilder struct { errorMap map[int]ResponseError defaultResponse *ResponseError metadata map[string]interface{} + extensions map[string]interface{} deprecated bool contentEncodingEnabled *bool } @@ -176,6 +178,15 @@ func (b *RouteBuilder) Returns(code int, message string, model interface{}) *Rou return b } +// ReturnsWithHeaders is similar to Returns, but can specify response headers +func (b *RouteBuilder) ReturnsWithHeaders(code int, message string, model interface{}, headers map[string]Header) *RouteBuilder { + b.Returns(code, message, model) + err := b.errorMap[code] + err.Headers = headers + b.errorMap[code] = err + return b +} + // DefaultReturns is a special Returns call that sets the default of the response. func (b *RouteBuilder) DefaultReturns(message string, model interface{}) *RouteBuilder { b.defaultResponse = &ResponseError{ @@ -194,20 +205,57 @@ func (b *RouteBuilder) Metadata(key string, value interface{}) *RouteBuilder { return b } +// AddExtension adds or updates a key=value pair to the extensions map. +func (b *RouteBuilder) AddExtension(key string, value interface{}) *RouteBuilder { + if b.extensions == nil { + b.extensions = map[string]interface{}{} + } + b.extensions[key] = value + return b +} + // Deprecate sets the value of deprecated to true. Deprecated routes have a special UI treatment to warn against use func (b *RouteBuilder) Deprecate() *RouteBuilder { b.deprecated = true return b } +// AllowedMethodsWithoutContentType overrides the default list GET,HEAD,OPTIONS,DELETE,TRACE +// If a request does not include a content-type header then +// depending on the method, it may return a 415 Unsupported Media. +// Must have uppercase HTTP Method names such as GET,HEAD,OPTIONS,... +func (b *RouteBuilder) AllowedMethodsWithoutContentType(methods []string) *RouteBuilder { + b.allowedMethodsWithoutContentType = methods + return b +} + // ResponseError represents a response; not necessarily an error. type ResponseError struct { + ExtensionProperties Code int Message string Model interface{} + Headers map[string]Header IsDefault bool } +// Header describes a header for a response of the API +// +// For more information: http://goo.gl/8us55a#headerObject +type Header struct { + *Items + Description string +} + +// Items describe swagger simple schemas for headers +type Items struct { + Type string + Format string + Items *Items + CollectionFormat string + Default interface{} +} + func (b *RouteBuilder) servicePath(path string) *RouteBuilder { b.rootPath = path return b @@ -276,27 +324,29 @@ func (b *RouteBuilder) Build() Route { operationName = nameOfFunction(b.function) } route := Route{ - Method: b.httpMethod, - Path: concatPath(b.rootPath, b.currentPath), - Produces: b.produces, - Consumes: b.consumes, - Function: b.function, - Filters: b.filters, - If: b.conditions, - relativePath: b.currentPath, - pathExpr: pathExpr, - Doc: b.doc, - Notes: b.notes, - Operation: operationName, - ParameterDocs: b.parameters, - ResponseErrors: b.errorMap, - DefaultResponse: b.defaultResponse, - ReadSample: b.readSample, - WriteSample: b.writeSample, - Metadata: b.metadata, - Deprecated: b.deprecated, - contentEncodingEnabled: b.contentEncodingEnabled, + Method: b.httpMethod, + Path: concatPath(b.rootPath, b.currentPath), + Produces: b.produces, + Consumes: b.consumes, + Function: b.function, + Filters: b.filters, + If: b.conditions, + relativePath: b.currentPath, + pathExpr: pathExpr, + Doc: b.doc, + Notes: b.notes, + Operation: operationName, + ParameterDocs: b.parameters, + ResponseErrors: b.errorMap, + DefaultResponse: b.defaultResponse, + ReadSample: b.readSample, + WriteSample: b.writeSample, + Metadata: b.metadata, + Deprecated: b.deprecated, + contentEncodingEnabled: b.contentEncodingEnabled, + allowedMethodsWithoutContentType: b.allowedMethodsWithoutContentType, } + route.Extensions = b.extensions route.postBuild() return route } diff --git a/vendor/github.com/emicklei/go-restful/v3/route_reader.go b/vendor/github.com/emicklei/go-restful/v3/route_reader.go new file mode 100644 index 000000000..c9f4ee75f --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/route_reader.go @@ -0,0 +1,66 @@ +package restful + +// Copyright 2021 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +type RouteReader interface { + Method() string + Consumes() []string + Path() string + Doc() string + Notes() string + Operation() string + ParameterDocs() []*Parameter + // Returns a copy + Metadata() map[string]interface{} + Deprecated() bool +} + +type routeAccessor struct { + route *Route +} + +func (r routeAccessor) Method() string { + return r.route.Method +} +func (r routeAccessor) Consumes() []string { + return r.route.Consumes[:] +} +func (r routeAccessor) Path() string { + return r.route.Path +} +func (r routeAccessor) Doc() string { + return r.route.Doc +} +func (r routeAccessor) Notes() string { + return r.route.Notes +} +func (r routeAccessor) Operation() string { + return r.route.Operation +} +func (r routeAccessor) ParameterDocs() []*Parameter { + return r.route.ParameterDocs[:] +} + +// Returns a copy +func (r routeAccessor) Metadata() map[string]interface{} { + return copyMap(r.route.Metadata) +} +func (r routeAccessor) Deprecated() bool { + return r.route.Deprecated +} + +// https://stackoverflow.com/questions/23057785/how-to-copy-a-map +func copyMap(m map[string]interface{}) map[string]interface{} { + cp := make(map[string]interface{}) + for k, v := range m { + vm, ok := v.(map[string]interface{}) + if ok { + cp[k] = copyMap(vm) + } else { + cp[k] = v + } + } + return cp +} diff --git a/vendor/github.com/emicklei/go-restful/router.go b/vendor/github.com/emicklei/go-restful/v3/router.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/router.go rename to vendor/github.com/emicklei/go-restful/v3/router.go diff --git a/vendor/github.com/emicklei/go-restful/service_error.go b/vendor/github.com/emicklei/go-restful/v3/service_error.go similarity index 70% rename from vendor/github.com/emicklei/go-restful/service_error.go rename to vendor/github.com/emicklei/go-restful/v3/service_error.go index 62d1108bb..a41575469 100644 --- a/vendor/github.com/emicklei/go-restful/service_error.go +++ b/vendor/github.com/emicklei/go-restful/v3/service_error.go @@ -4,12 +4,16 @@ package restful // Use of this source code is governed by a license // that can be found in the LICENSE file. -import "fmt" +import ( + "fmt" + "net/http" +) // ServiceError is a transport object to pass information about a non-Http error occurred in a WebService while processing a request. type ServiceError struct { Code int Message string + Header http.Header } // NewError returns a ServiceError using the code and reason @@ -17,6 +21,11 @@ func NewError(code int, message string) ServiceError { return ServiceError{Code: code, Message: message} } +// NewErrorWithHeader returns a ServiceError using the code, reason and header +func NewErrorWithHeader(code int, message string, header http.Header) ServiceError { + return ServiceError{Code: code, Message: message, Header: header} +} + // Error returns a text representation of the service error func (s ServiceError) Error() string { return fmt.Sprintf("[ServiceError:%v] %v", s.Code, s.Message) diff --git a/vendor/github.com/emicklei/go-restful/web_service.go b/vendor/github.com/emicklei/go-restful/v3/web_service.go similarity index 88% rename from vendor/github.com/emicklei/go-restful/web_service.go rename to vendor/github.com/emicklei/go-restful/v3/web_service.go index 77ba9a8cf..789c4df25 100644 --- a/vendor/github.com/emicklei/go-restful/web_service.go +++ b/vendor/github.com/emicklei/go-restful/v3/web_service.go @@ -6,7 +6,7 @@ import ( "reflect" "sync" - "github.com/emicklei/go-restful/log" + "github.com/emicklei/go-restful/v3/log" ) // Copyright 2013 Ernest Micklei. All rights reserved. @@ -165,6 +165,18 @@ func FormParameter(name, description string) *Parameter { return p } +// MultiPartFormParameter creates a new Parameter of kind Form (using multipart/form-data) for documentation purposes. +// It is initialized as required with string as its DataType. +func (w *WebService) MultiPartFormParameter(name, description string) *Parameter { + return MultiPartFormParameter(name, description) +} + +func MultiPartFormParameter(name, description string) *Parameter { + p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}} + p.beMultiPartForm() + return p +} + // Route creates a new Route using the RouteBuilder and add to the ordered list of Routes. func (w *WebService) Route(builder *RouteBuilder) *WebService { w.routesLock.Lock() @@ -176,22 +188,20 @@ func (w *WebService) Route(builder *RouteBuilder) *WebService { // RemoveRoute removes the specified route, looks for something that matches 'path' and 'method' func (w *WebService) RemoveRoute(path, method string) error { - if !w.dynamicRoutes { - return errors.New("dynamic routes are not enabled.") - } - w.routesLock.Lock() - defer w.routesLock.Unlock() - newRoutes := make([]Route, (len(w.routes) - 1)) - current := 0 - for ix := range w.routes { - if w.routes[ix].Method == method && w.routes[ix].Path == path { - continue - } - newRoutes[current] = w.routes[ix] - current = current + 1 - } - w.routes = newRoutes - return nil + if !w.dynamicRoutes { + return errors.New("dynamic routes are not enabled.") + } + w.routesLock.Lock() + defer w.routesLock.Unlock() + newRoutes := []Route{} + for _, route := range w.routes { + if route.Method == method && route.Path == path { + continue + } + newRoutes = append(newRoutes, route) + } + w.routes = newRoutes + return nil } // Method creates a new RouteBuilder and initialize its http method @@ -288,3 +298,8 @@ func (w *WebService) PATCH(subPath string) *RouteBuilder { func (w *WebService) DELETE(subPath string) *RouteBuilder { return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("DELETE").Path(subPath) } + +// OPTIONS is a shortcut for .Method("OPTIONS").Path(subPath) +func (w *WebService) OPTIONS(subPath string) *RouteBuilder { + return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("OPTIONS").Path(subPath) +} diff --git a/vendor/github.com/emicklei/go-restful/web_service_container.go b/vendor/github.com/emicklei/go-restful/v3/web_service_container.go similarity index 100% rename from vendor/github.com/emicklei/go-restful/web_service_container.go rename to vendor/github.com/emicklei/go-restful/v3/web_service_container.go diff --git a/vendor/github.com/evanphx/json-patch/patch.go b/vendor/github.com/evanphx/json-patch/patch.go index dc2b7e51e..4bce5936d 100644 --- a/vendor/github.com/evanphx/json-patch/patch.go +++ b/vendor/github.com/evanphx/json-patch/patch.go @@ -568,29 +568,6 @@ func (p Patch) replace(doc *container, op Operation) error { return errors.Wrapf(err, "replace operation failed to decode path") } - if path == "" { - val := op.value() - - if val.which == eRaw { - if !val.tryDoc() { - if !val.tryAry() { - return errors.Wrapf(err, "replace operation value must be object or array") - } - } - } - - switch val.which { - case eAry: - *doc = &val.ary - case eDoc: - *doc = &val.doc - case eRaw: - return errors.Wrapf(err, "replace operation hit impossible case") - } - - return nil - } - con, key := findObject(doc, path) if con == nil { @@ -657,25 +634,6 @@ func (p Patch) test(doc *container, op Operation) error { return errors.Wrapf(err, "test operation failed to decode path") } - if path == "" { - var self lazyNode - - switch sv := (*doc).(type) { - case *partialDoc: - self.doc = *sv - self.which = eDoc - case *partialArray: - self.ary = *sv - self.which = eAry - } - - if self.equal(op.value()) { - return nil - } - - return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) - } - con, key := findObject(doc, path) if con == nil { diff --git a/vendor/github.com/evanphx/json-patch/v5/LICENSE b/vendor/github.com/evanphx/json-patch/v5/LICENSE new file mode 100644 index 000000000..df76d7d77 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2014, Evan Phoenix +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the Evan Phoenix nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/evanphx/json-patch/v5/errors.go b/vendor/github.com/evanphx/json-patch/v5/errors.go new file mode 100644 index 000000000..75304b443 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/errors.go @@ -0,0 +1,38 @@ +package jsonpatch + +import "fmt" + +// AccumulatedCopySizeError is an error type returned when the accumulated size +// increase caused by copy operations in a patch operation has exceeded the +// limit. +type AccumulatedCopySizeError struct { + limit int64 + accumulated int64 +} + +// NewAccumulatedCopySizeError returns an AccumulatedCopySizeError. +func NewAccumulatedCopySizeError(l, a int64) *AccumulatedCopySizeError { + return &AccumulatedCopySizeError{limit: l, accumulated: a} +} + +// Error implements the error interface. +func (a *AccumulatedCopySizeError) Error() string { + return fmt.Sprintf("Unable to complete the copy, the accumulated size increase of copy is %d, exceeding the limit %d", a.accumulated, a.limit) +} + +// ArraySizeError is an error type returned when the array size has exceeded +// the limit. +type ArraySizeError struct { + limit int + size int +} + +// NewArraySizeError returns an ArraySizeError. +func NewArraySizeError(l, s int) *ArraySizeError { + return &ArraySizeError{limit: l, size: s} +} + +// Error implements the error interface. +func (a *ArraySizeError) Error() string { + return fmt.Sprintf("Unable to create array of size %d, limit is %d", a.size, a.limit) +} diff --git a/vendor/github.com/evanphx/json-patch/v5/merge.go b/vendor/github.com/evanphx/json-patch/v5/merge.go new file mode 100644 index 000000000..a7c457342 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/merge.go @@ -0,0 +1,408 @@ +package jsonpatch + +import ( + "bytes" + "encoding/json" + "fmt" + "reflect" +) + +func merge(cur, patch *lazyNode, mergeMerge bool) *lazyNode { + curDoc, err := cur.intoDoc() + + if err != nil { + pruneNulls(patch) + return patch + } + + patchDoc, err := patch.intoDoc() + + if err != nil { + return patch + } + + mergeDocs(curDoc, patchDoc, mergeMerge) + + return cur +} + +func mergeDocs(doc, patch *partialDoc, mergeMerge bool) { + for k, v := range patch.obj { + if v == nil { + if mergeMerge { + idx := -1 + for i, key := range doc.keys { + if key == k { + idx = i + break + } + } + if idx == -1 { + doc.keys = append(doc.keys, k) + } + doc.obj[k] = nil + } else { + _ = doc.remove(k, &ApplyOptions{}) + } + } else { + cur, ok := doc.obj[k] + + if !ok || cur == nil { + if !mergeMerge { + pruneNulls(v) + } + _ = doc.set(k, v, &ApplyOptions{}) + } else { + _ = doc.set(k, merge(cur, v, mergeMerge), &ApplyOptions{}) + } + } + } +} + +func pruneNulls(n *lazyNode) { + sub, err := n.intoDoc() + + if err == nil { + pruneDocNulls(sub) + } else { + ary, err := n.intoAry() + + if err == nil { + pruneAryNulls(ary) + } + } +} + +func pruneDocNulls(doc *partialDoc) *partialDoc { + for k, v := range doc.obj { + if v == nil { + _ = doc.remove(k, &ApplyOptions{}) + } else { + pruneNulls(v) + } + } + + return doc +} + +func pruneAryNulls(ary *partialArray) *partialArray { + newAry := []*lazyNode{} + + for _, v := range *ary { + if v != nil { + pruneNulls(v) + } + newAry = append(newAry, v) + } + + *ary = newAry + + return ary +} + +var errBadJSONDoc = fmt.Errorf("Invalid JSON Document") +var errBadJSONPatch = fmt.Errorf("Invalid JSON Patch") +var errBadMergeTypes = fmt.Errorf("Mismatched JSON Documents") + +// MergeMergePatches merges two merge patches together, such that +// applying this resulting merged merge patch to a document yields the same +// as merging each merge patch to the document in succession. +func MergeMergePatches(patch1Data, patch2Data []byte) ([]byte, error) { + return doMergePatch(patch1Data, patch2Data, true) +} + +// MergePatch merges the patchData into the docData. +func MergePatch(docData, patchData []byte) ([]byte, error) { + return doMergePatch(docData, patchData, false) +} + +func doMergePatch(docData, patchData []byte, mergeMerge bool) ([]byte, error) { + doc := &partialDoc{} + + docErr := json.Unmarshal(docData, doc) + + patch := &partialDoc{} + + patchErr := json.Unmarshal(patchData, patch) + + if isSyntaxError(docErr) { + return nil, errBadJSONDoc + } + + if isSyntaxError(patchErr) { + return nil, errBadJSONPatch + } + + if docErr == nil && doc.obj == nil { + return nil, errBadJSONDoc + } + + if patchErr == nil && patch.obj == nil { + return nil, errBadJSONPatch + } + + if docErr != nil || patchErr != nil { + // Not an error, just not a doc, so we turn straight into the patch + if patchErr == nil { + if mergeMerge { + doc = patch + } else { + doc = pruneDocNulls(patch) + } + } else { + patchAry := &partialArray{} + patchErr = json.Unmarshal(patchData, patchAry) + + if patchErr != nil { + return nil, errBadJSONPatch + } + + pruneAryNulls(patchAry) + + out, patchErr := json.Marshal(patchAry) + + if patchErr != nil { + return nil, errBadJSONPatch + } + + return out, nil + } + } else { + mergeDocs(doc, patch, mergeMerge) + } + + return json.Marshal(doc) +} + +func isSyntaxError(err error) bool { + if _, ok := err.(*json.SyntaxError); ok { + return true + } + if _, ok := err.(*syntaxError); ok { + return true + } + return false +} + +// resemblesJSONArray indicates whether the byte-slice "appears" to be +// a JSON array or not. +// False-positives are possible, as this function does not check the internal +// structure of the array. It only checks that the outer syntax is present and +// correct. +func resemblesJSONArray(input []byte) bool { + input = bytes.TrimSpace(input) + + hasPrefix := bytes.HasPrefix(input, []byte("[")) + hasSuffix := bytes.HasSuffix(input, []byte("]")) + + return hasPrefix && hasSuffix +} + +// CreateMergePatch will return a merge patch document capable of converting +// the original document(s) to the modified document(s). +// The parameters can be bytes of either two JSON Documents, or two arrays of +// JSON documents. +// The merge patch returned follows the specification defined at http://tools.ietf.org/html/draft-ietf-appsawg-json-merge-patch-07 +func CreateMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalResemblesArray := resemblesJSONArray(originalJSON) + modifiedResemblesArray := resemblesJSONArray(modifiedJSON) + + // Do both byte-slices seem like JSON arrays? + if originalResemblesArray && modifiedResemblesArray { + return createArrayMergePatch(originalJSON, modifiedJSON) + } + + // Are both byte-slices are not arrays? Then they are likely JSON objects... + if !originalResemblesArray && !modifiedResemblesArray { + return createObjectMergePatch(originalJSON, modifiedJSON) + } + + // None of the above? Then return an error because of mismatched types. + return nil, errBadMergeTypes +} + +// createObjectMergePatch will return a merge-patch document capable of +// converting the original document to the modified document. +func createObjectMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalDoc := map[string]interface{}{} + modifiedDoc := map[string]interface{}{} + + err := json.Unmarshal(originalJSON, &originalDoc) + if err != nil { + return nil, errBadJSONDoc + } + + err = json.Unmarshal(modifiedJSON, &modifiedDoc) + if err != nil { + return nil, errBadJSONDoc + } + + dest, err := getDiff(originalDoc, modifiedDoc) + if err != nil { + return nil, err + } + + return json.Marshal(dest) +} + +// createArrayMergePatch will return an array of merge-patch documents capable +// of converting the original document to the modified document for each +// pair of JSON documents provided in the arrays. +// Arrays of mismatched sizes will result in an error. +func createArrayMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalDocs := []json.RawMessage{} + modifiedDocs := []json.RawMessage{} + + err := json.Unmarshal(originalJSON, &originalDocs) + if err != nil { + return nil, errBadJSONDoc + } + + err = json.Unmarshal(modifiedJSON, &modifiedDocs) + if err != nil { + return nil, errBadJSONDoc + } + + total := len(originalDocs) + if len(modifiedDocs) != total { + return nil, errBadJSONDoc + } + + result := []json.RawMessage{} + for i := 0; i < len(originalDocs); i++ { + original := originalDocs[i] + modified := modifiedDocs[i] + + patch, err := createObjectMergePatch(original, modified) + if err != nil { + return nil, err + } + + result = append(result, json.RawMessage(patch)) + } + + return json.Marshal(result) +} + +// Returns true if the array matches (must be json types). +// As is idiomatic for go, an empty array is not the same as a nil array. +func matchesArray(a, b []interface{}) bool { + if len(a) != len(b) { + return false + } + if (a == nil && b != nil) || (a != nil && b == nil) { + return false + } + for i := range a { + if !matchesValue(a[i], b[i]) { + return false + } + } + return true +} + +// Returns true if the values matches (must be json types) +// The types of the values must match, otherwise it will always return false +// If two map[string]interface{} are given, all elements must match. +func matchesValue(av, bv interface{}) bool { + if reflect.TypeOf(av) != reflect.TypeOf(bv) { + return false + } + switch at := av.(type) { + case string: + bt := bv.(string) + if bt == at { + return true + } + case float64: + bt := bv.(float64) + if bt == at { + return true + } + case bool: + bt := bv.(bool) + if bt == at { + return true + } + case nil: + // Both nil, fine. + return true + case map[string]interface{}: + bt := bv.(map[string]interface{}) + if len(bt) != len(at) { + return false + } + for key := range bt { + av, aOK := at[key] + bv, bOK := bt[key] + if aOK != bOK { + return false + } + if !matchesValue(av, bv) { + return false + } + } + return true + case []interface{}: + bt := bv.([]interface{}) + return matchesArray(at, bt) + } + return false +} + +// getDiff returns the (recursive) difference between a and b as a map[string]interface{}. +func getDiff(a, b map[string]interface{}) (map[string]interface{}, error) { + into := map[string]interface{}{} + for key, bv := range b { + av, ok := a[key] + // value was added + if !ok { + into[key] = bv + continue + } + // If types have changed, replace completely + if reflect.TypeOf(av) != reflect.TypeOf(bv) { + into[key] = bv + continue + } + // Types are the same, compare values + switch at := av.(type) { + case map[string]interface{}: + bt := bv.(map[string]interface{}) + dst := make(map[string]interface{}, len(bt)) + dst, err := getDiff(at, bt) + if err != nil { + return nil, err + } + if len(dst) > 0 { + into[key] = dst + } + case string, float64, bool: + if !matchesValue(av, bv) { + into[key] = bv + } + case []interface{}: + bt := bv.([]interface{}) + if !matchesArray(at, bt) { + into[key] = bv + } + case nil: + switch bv.(type) { + case nil: + // Both nil, fine. + default: + into[key] = bv + } + default: + panic(fmt.Sprintf("Unknown type:%T in key %s", av, key)) + } + } + // Now add all deleted values as nil + for key := range a { + _, found := b[key] + if !found { + into[key] = nil + } + } + return into, nil +} diff --git a/vendor/github.com/evanphx/json-patch/v5/patch.go b/vendor/github.com/evanphx/json-patch/v5/patch.go new file mode 100644 index 000000000..117f2c00d --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/patch.go @@ -0,0 +1,1135 @@ +package jsonpatch + +import ( + "bytes" + "encoding/json" + "fmt" + "strconv" + "strings" + + "github.com/pkg/errors" +) + +const ( + eRaw = iota + eDoc + eAry +) + +var ( + // SupportNegativeIndices decides whether to support non-standard practice of + // allowing negative indices to mean indices starting at the end of an array. + // Default to true. + SupportNegativeIndices bool = true + // AccumulatedCopySizeLimit limits the total size increase in bytes caused by + // "copy" operations in a patch. + AccumulatedCopySizeLimit int64 = 0 + startObject = json.Delim('{') + endObject = json.Delim('}') + startArray = json.Delim('[') + endArray = json.Delim(']') +) + +var ( + ErrTestFailed = errors.New("test failed") + ErrMissing = errors.New("missing value") + ErrUnknownType = errors.New("unknown object type") + ErrInvalid = errors.New("invalid state detected") + ErrInvalidIndex = errors.New("invalid index referenced") + + rawJSONArray = []byte("[]") + rawJSONObject = []byte("{}") + rawJSONNull = []byte("null") +) + +type lazyNode struct { + raw *json.RawMessage + doc *partialDoc + ary partialArray + which int +} + +// Operation is a single JSON-Patch step, such as a single 'add' operation. +type Operation map[string]*json.RawMessage + +// Patch is an ordered collection of Operations. +type Patch []Operation + +type partialDoc struct { + keys []string + obj map[string]*lazyNode +} + +type partialArray []*lazyNode + +type container interface { + get(key string, options *ApplyOptions) (*lazyNode, error) + set(key string, val *lazyNode, options *ApplyOptions) error + add(key string, val *lazyNode, options *ApplyOptions) error + remove(key string, options *ApplyOptions) error +} + +// ApplyOptions specifies options for calls to ApplyWithOptions. +// Use NewApplyOptions to obtain default values for ApplyOptions. +type ApplyOptions struct { + // SupportNegativeIndices decides whether to support non-standard practice of + // allowing negative indices to mean indices starting at the end of an array. + // Default to true. + SupportNegativeIndices bool + // AccumulatedCopySizeLimit limits the total size increase in bytes caused by + // "copy" operations in a patch. + AccumulatedCopySizeLimit int64 + // AllowMissingPathOnRemove indicates whether to fail "remove" operations when the target path is missing. + // Default to false. + AllowMissingPathOnRemove bool + // EnsurePathExistsOnAdd instructs json-patch to recursively create the missing parts of path on "add" operation. + // Default to false. + EnsurePathExistsOnAdd bool +} + +// NewApplyOptions creates a default set of options for calls to ApplyWithOptions. +func NewApplyOptions() *ApplyOptions { + return &ApplyOptions{ + SupportNegativeIndices: SupportNegativeIndices, + AccumulatedCopySizeLimit: AccumulatedCopySizeLimit, + AllowMissingPathOnRemove: false, + EnsurePathExistsOnAdd: false, + } +} + +func newLazyNode(raw *json.RawMessage) *lazyNode { + return &lazyNode{raw: raw, doc: nil, ary: nil, which: eRaw} +} + +func newRawMessage(buf []byte) *json.RawMessage { + ra := make(json.RawMessage, len(buf)) + copy(ra, buf) + return &ra +} + +func (n *lazyNode) MarshalJSON() ([]byte, error) { + switch n.which { + case eRaw: + return json.Marshal(n.raw) + case eDoc: + return json.Marshal(n.doc) + case eAry: + return json.Marshal(n.ary) + default: + return nil, ErrUnknownType + } +} + +func (n *lazyNode) UnmarshalJSON(data []byte) error { + dest := make(json.RawMessage, len(data)) + copy(dest, data) + n.raw = &dest + n.which = eRaw + return nil +} + +func (n *partialDoc) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + if _, err := buf.WriteString("{"); err != nil { + return nil, err + } + for i, k := range n.keys { + if i > 0 { + if _, err := buf.WriteString(", "); err != nil { + return nil, err + } + } + key, err := json.Marshal(k) + if err != nil { + return nil, err + } + if _, err := buf.Write(key); err != nil { + return nil, err + } + if _, err := buf.WriteString(": "); err != nil { + return nil, err + } + value, err := json.Marshal(n.obj[k]) + if err != nil { + return nil, err + } + if _, err := buf.Write(value); err != nil { + return nil, err + } + } + if _, err := buf.WriteString("}"); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +type syntaxError struct { + msg string +} + +func (err *syntaxError) Error() string { + return err.msg +} + +func (n *partialDoc) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &n.obj); err != nil { + return err + } + buffer := bytes.NewBuffer(data) + d := json.NewDecoder(buffer) + if t, err := d.Token(); err != nil { + return err + } else if t != startObject { + return &syntaxError{fmt.Sprintf("unexpected JSON token in document node: %s", t)} + } + for d.More() { + k, err := d.Token() + if err != nil { + return err + } + key, ok := k.(string) + if !ok { + return &syntaxError{fmt.Sprintf("unexpected JSON token as document node key: %s", k)} + } + if err := skipValue(d); err != nil { + return err + } + n.keys = append(n.keys, key) + } + return nil +} + +func skipValue(d *json.Decoder) error { + t, err := d.Token() + if err != nil { + return err + } + if t != startObject && t != startArray { + return nil + } + for d.More() { + if t == startObject { + // consume key token + if _, err := d.Token(); err != nil { + return err + } + } + if err := skipValue(d); err != nil { + return err + } + } + end, err := d.Token() + if err != nil { + return err + } + if t == startObject && end != endObject { + return &syntaxError{msg: "expected close object token"} + } + if t == startArray && end != endArray { + return &syntaxError{msg: "expected close object token"} + } + return nil +} + +func deepCopy(src *lazyNode) (*lazyNode, int, error) { + if src == nil { + return nil, 0, nil + } + a, err := src.MarshalJSON() + if err != nil { + return nil, 0, err + } + sz := len(a) + return newLazyNode(newRawMessage(a)), sz, nil +} + +func (n *lazyNode) intoDoc() (*partialDoc, error) { + if n.which == eDoc { + return n.doc, nil + } + + if n.raw == nil { + return nil, ErrInvalid + } + + err := json.Unmarshal(*n.raw, &n.doc) + + if err != nil { + return nil, err + } + + n.which = eDoc + return n.doc, nil +} + +func (n *lazyNode) intoAry() (*partialArray, error) { + if n.which == eAry { + return &n.ary, nil + } + + if n.raw == nil { + return nil, ErrInvalid + } + + err := json.Unmarshal(*n.raw, &n.ary) + + if err != nil { + return nil, err + } + + n.which = eAry + return &n.ary, nil +} + +func (n *lazyNode) compact() []byte { + buf := &bytes.Buffer{} + + if n.raw == nil { + return nil + } + + err := json.Compact(buf, *n.raw) + + if err != nil { + return *n.raw + } + + return buf.Bytes() +} + +func (n *lazyNode) tryDoc() bool { + if n.raw == nil { + return false + } + + err := json.Unmarshal(*n.raw, &n.doc) + + if err != nil { + return false + } + + n.which = eDoc + return true +} + +func (n *lazyNode) tryAry() bool { + if n.raw == nil { + return false + } + + err := json.Unmarshal(*n.raw, &n.ary) + + if err != nil { + return false + } + + n.which = eAry + return true +} + +func (n *lazyNode) equal(o *lazyNode) bool { + if n.which == eRaw { + if !n.tryDoc() && !n.tryAry() { + if o.which != eRaw { + return false + } + + return bytes.Equal(n.compact(), o.compact()) + } + } + + if n.which == eDoc { + if o.which == eRaw { + if !o.tryDoc() { + return false + } + } + + if o.which != eDoc { + return false + } + + if len(n.doc.obj) != len(o.doc.obj) { + return false + } + + for k, v := range n.doc.obj { + ov, ok := o.doc.obj[k] + + if !ok { + return false + } + + if (v == nil) != (ov == nil) { + return false + } + + if v == nil && ov == nil { + continue + } + + if !v.equal(ov) { + return false + } + } + + return true + } + + if o.which != eAry && !o.tryAry() { + return false + } + + if len(n.ary) != len(o.ary) { + return false + } + + for idx, val := range n.ary { + if !val.equal(o.ary[idx]) { + return false + } + } + + return true +} + +// Kind reads the "op" field of the Operation. +func (o Operation) Kind() string { + if obj, ok := o["op"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown" + } + + return op + } + + return "unknown" +} + +// Path reads the "path" field of the Operation. +func (o Operation) Path() (string, error) { + if obj, ok := o["path"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown", err + } + + return op, nil + } + + return "unknown", errors.Wrapf(ErrMissing, "operation missing path field") +} + +// From reads the "from" field of the Operation. +func (o Operation) From() (string, error) { + if obj, ok := o["from"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown", err + } + + return op, nil + } + + return "unknown", errors.Wrapf(ErrMissing, "operation, missing from field") +} + +func (o Operation) value() *lazyNode { + if obj, ok := o["value"]; ok { + return newLazyNode(obj) + } + + return nil +} + +// ValueInterface decodes the operation value into an interface. +func (o Operation) ValueInterface() (interface{}, error) { + if obj, ok := o["value"]; ok && obj != nil { + var v interface{} + + err := json.Unmarshal(*obj, &v) + + if err != nil { + return nil, err + } + + return v, nil + } + + return nil, errors.Wrapf(ErrMissing, "operation, missing value field") +} + +func isArray(buf []byte) bool { +Loop: + for _, c := range buf { + switch c { + case ' ': + case '\n': + case '\t': + continue + case '[': + return true + default: + break Loop + } + } + + return false +} + +func findObject(pd *container, path string, options *ApplyOptions) (container, string) { + doc := *pd + + split := strings.Split(path, "/") + + if len(split) < 2 { + return nil, "" + } + + parts := split[1 : len(split)-1] + + key := split[len(split)-1] + + var err error + + for _, part := range parts { + + next, ok := doc.get(decodePatchKey(part), options) + + if next == nil || ok != nil { + return nil, "" + } + + if isArray(*next.raw) { + doc, err = next.intoAry() + + if err != nil { + return nil, "" + } + } else { + doc, err = next.intoDoc() + + if err != nil { + return nil, "" + } + } + } + + return doc, decodePatchKey(key) +} + +func (d *partialDoc) set(key string, val *lazyNode, options *ApplyOptions) error { + found := false + for _, k := range d.keys { + if k == key { + found = true + break + } + } + if !found { + d.keys = append(d.keys, key) + } + d.obj[key] = val + return nil +} + +func (d *partialDoc) add(key string, val *lazyNode, options *ApplyOptions) error { + return d.set(key, val, options) +} + +func (d *partialDoc) get(key string, options *ApplyOptions) (*lazyNode, error) { + v, ok := d.obj[key] + if !ok { + return v, errors.Wrapf(ErrMissing, "unable to get nonexistent key: %s", key) + } + return v, nil +} + +func (d *partialDoc) remove(key string, options *ApplyOptions) error { + _, ok := d.obj[key] + if !ok { + if options.AllowMissingPathOnRemove { + return nil + } + return errors.Wrapf(ErrMissing, "unable to remove nonexistent key: %s", key) + } + idx := -1 + for i, k := range d.keys { + if k == key { + idx = i + break + } + } + d.keys = append(d.keys[0:idx], d.keys[idx+1:]...) + delete(d.obj, key) + return nil +} + +// set should only be used to implement the "replace" operation, so "key" must +// be an already existing index in "d". +func (d *partialArray) set(key string, val *lazyNode, options *ApplyOptions) error { + idx, err := strconv.Atoi(key) + if err != nil { + return err + } + + if idx < 0 { + if !options.SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(*d) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(*d) + } + + (*d)[idx] = val + return nil +} + +func (d *partialArray) add(key string, val *lazyNode, options *ApplyOptions) error { + if key == "-" { + *d = append(*d, val) + return nil + } + + idx, err := strconv.Atoi(key) + if err != nil { + return errors.Wrapf(err, "value was not a proper array index: '%s'", key) + } + + sz := len(*d) + 1 + + ary := make([]*lazyNode, sz) + + cur := *d + + if idx >= len(ary) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + + if idx < 0 { + if !options.SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(ary) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(ary) + } + + copy(ary[0:idx], cur[0:idx]) + ary[idx] = val + copy(ary[idx+1:], cur[idx:]) + + *d = ary + return nil +} + +func (d *partialArray) get(key string, options *ApplyOptions) (*lazyNode, error) { + idx, err := strconv.Atoi(key) + + if err != nil { + return nil, err + } + + if idx < 0 { + if !options.SupportNegativeIndices { + return nil, errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(*d) { + return nil, errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(*d) + } + + if idx >= len(*d) { + return nil, errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + + return (*d)[idx], nil +} + +func (d *partialArray) remove(key string, options *ApplyOptions) error { + idx, err := strconv.Atoi(key) + if err != nil { + return err + } + + cur := *d + + if idx >= len(cur) { + if options.AllowMissingPathOnRemove { + return nil + } + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + + if idx < 0 { + if !options.SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(cur) { + if options.AllowMissingPathOnRemove { + return nil + } + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(cur) + } + + ary := make([]*lazyNode, len(cur)-1) + + copy(ary[0:idx], cur[0:idx]) + copy(ary[idx:], cur[idx+1:]) + + *d = ary + return nil +} + +func (p Patch) add(doc *container, op Operation, options *ApplyOptions) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(ErrMissing, "add operation failed to decode path") + } + + if options.EnsurePathExistsOnAdd { + err = ensurePathExists(doc, path, options) + + if err != nil { + return err + } + } + + con, key := findObject(doc, path, options) + + if con == nil { + return errors.Wrapf(ErrMissing, "add operation does not apply: doc is missing path: \"%s\"", path) + } + + err = con.add(key, op.value(), options) + if err != nil { + return errors.Wrapf(err, "error in add for path: '%s'", path) + } + + return nil +} + +// Given a document and a path to a key, walk the path and create all missing elements +// creating objects and arrays as needed. +func ensurePathExists(pd *container, path string, options *ApplyOptions) error { + doc := *pd + + var err error + var arrIndex int + + split := strings.Split(path, "/") + + if len(split) < 2 { + return nil + } + + parts := split[1:] + + for pi, part := range parts { + + // Have we reached the key part of the path? + // If yes, we're done. + if pi == len(parts)-1 { + return nil + } + + target, ok := doc.get(decodePatchKey(part), options) + + if target == nil || ok != nil { + + // If the current container is an array which has fewer elements than our target index, + // pad the current container with nulls. + if arrIndex, err = strconv.Atoi(part); err == nil { + pa, ok := doc.(*partialArray) + + if ok && arrIndex >= len(*pa)+1 { + // Pad the array with null values up to the required index. + for i := len(*pa); i <= arrIndex-1; i++ { + doc.add(strconv.Itoa(i), newLazyNode(newRawMessage(rawJSONNull)), options) + } + } + } + + // Check if the next part is a numeric index or "-". + // If yes, then create an array, otherwise, create an object. + if arrIndex, err = strconv.Atoi(parts[pi+1]); err == nil || parts[pi+1] == "-" { + if arrIndex < 0 { + + if !options.SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to ensure path for invalid index: %d", arrIndex) + } + + if arrIndex < -1 { + return errors.Wrapf(ErrInvalidIndex, "Unable to ensure path for negative index other than -1: %d", arrIndex) + } + + arrIndex = 0 + } + + newNode := newLazyNode(newRawMessage(rawJSONArray)) + doc.add(part, newNode, options) + doc, _ = newNode.intoAry() + + // Pad the new array with null values up to the required index. + for i := 0; i < arrIndex; i++ { + doc.add(strconv.Itoa(i), newLazyNode(newRawMessage(rawJSONNull)), options) + } + } else { + newNode := newLazyNode(newRawMessage(rawJSONObject)) + + doc.add(part, newNode, options) + doc, _ = newNode.intoDoc() + } + } else { + if isArray(*target.raw) { + doc, err = target.intoAry() + + if err != nil { + return err + } + } else { + doc, err = target.intoDoc() + + if err != nil { + return err + } + } + } + } + + return nil +} + +func (p Patch) remove(doc *container, op Operation, options *ApplyOptions) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(ErrMissing, "remove operation failed to decode path") + } + + con, key := findObject(doc, path, options) + + if con == nil { + if options.AllowMissingPathOnRemove { + return nil + } + return errors.Wrapf(ErrMissing, "remove operation does not apply: doc is missing path: \"%s\"", path) + } + + err = con.remove(key, options) + if err != nil { + return errors.Wrapf(err, "error in remove for path: '%s'", path) + } + + return nil +} + +func (p Patch) replace(doc *container, op Operation, options *ApplyOptions) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(err, "replace operation failed to decode path") + } + + if path == "" { + val := op.value() + + if val.which == eRaw { + if !val.tryDoc() { + if !val.tryAry() { + return errors.Wrapf(err, "replace operation value must be object or array") + } + } + } + + switch val.which { + case eAry: + *doc = &val.ary + case eDoc: + *doc = val.doc + case eRaw: + return errors.Wrapf(err, "replace operation hit impossible case") + } + + return nil + } + + con, key := findObject(doc, path, options) + + if con == nil { + return errors.Wrapf(ErrMissing, "replace operation does not apply: doc is missing path: %s", path) + } + + _, ok := con.get(key, options) + if ok != nil { + return errors.Wrapf(ErrMissing, "replace operation does not apply: doc is missing key: %s", path) + } + + err = con.set(key, op.value(), options) + if err != nil { + return errors.Wrapf(err, "error in remove for path: '%s'", path) + } + + return nil +} + +func (p Patch) move(doc *container, op Operation, options *ApplyOptions) error { + from, err := op.From() + if err != nil { + return errors.Wrapf(err, "move operation failed to decode from") + } + + con, key := findObject(doc, from, options) + + if con == nil { + return errors.Wrapf(ErrMissing, "move operation does not apply: doc is missing from path: %s", from) + } + + val, err := con.get(key, options) + if err != nil { + return errors.Wrapf(err, "error in move for path: '%s'", key) + } + + err = con.remove(key, options) + if err != nil { + return errors.Wrapf(err, "error in move for path: '%s'", key) + } + + path, err := op.Path() + if err != nil { + return errors.Wrapf(err, "move operation failed to decode path") + } + + con, key = findObject(doc, path, options) + + if con == nil { + return errors.Wrapf(ErrMissing, "move operation does not apply: doc is missing destination path: %s", path) + } + + err = con.add(key, val, options) + if err != nil { + return errors.Wrapf(err, "error in move for path: '%s'", path) + } + + return nil +} + +func (p Patch) test(doc *container, op Operation, options *ApplyOptions) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(err, "test operation failed to decode path") + } + + if path == "" { + var self lazyNode + + switch sv := (*doc).(type) { + case *partialDoc: + self.doc = sv + self.which = eDoc + case *partialArray: + self.ary = *sv + self.which = eAry + } + + if self.equal(op.value()) { + return nil + } + + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } + + con, key := findObject(doc, path, options) + + if con == nil { + return errors.Wrapf(ErrMissing, "test operation does not apply: is missing path: %s", path) + } + + val, err := con.get(key, options) + if err != nil && errors.Cause(err) != ErrMissing { + return errors.Wrapf(err, "error in test for path: '%s'", path) + } + + if val == nil { + if op.value().raw == nil { + return nil + } + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } else if op.value() == nil { + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } + + if val.equal(op.value()) { + return nil + } + + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) +} + +func (p Patch) copy(doc *container, op Operation, accumulatedCopySize *int64, options *ApplyOptions) error { + from, err := op.From() + if err != nil { + return errors.Wrapf(err, "copy operation failed to decode from") + } + + con, key := findObject(doc, from, options) + + if con == nil { + return errors.Wrapf(ErrMissing, "copy operation does not apply: doc is missing from path: %s", from) + } + + val, err := con.get(key, options) + if err != nil { + return errors.Wrapf(err, "error in copy for from: '%s'", from) + } + + path, err := op.Path() + if err != nil { + return errors.Wrapf(ErrMissing, "copy operation failed to decode path") + } + + con, key = findObject(doc, path, options) + + if con == nil { + return errors.Wrapf(ErrMissing, "copy operation does not apply: doc is missing destination path: %s", path) + } + + valCopy, sz, err := deepCopy(val) + if err != nil { + return errors.Wrapf(err, "error while performing deep copy") + } + + (*accumulatedCopySize) += int64(sz) + if options.AccumulatedCopySizeLimit > 0 && *accumulatedCopySize > options.AccumulatedCopySizeLimit { + return NewAccumulatedCopySizeError(options.AccumulatedCopySizeLimit, *accumulatedCopySize) + } + + err = con.add(key, valCopy, options) + if err != nil { + return errors.Wrapf(err, "error while adding value during copy") + } + + return nil +} + +// Equal indicates if 2 JSON documents have the same structural equality. +func Equal(a, b []byte) bool { + la := newLazyNode(newRawMessage(a)) + lb := newLazyNode(newRawMessage(b)) + + return la.equal(lb) +} + +// DecodePatch decodes the passed JSON document as an RFC 6902 patch. +func DecodePatch(buf []byte) (Patch, error) { + var p Patch + + err := json.Unmarshal(buf, &p) + + if err != nil { + return nil, err + } + + return p, nil +} + +// Apply mutates a JSON document according to the patch, and returns the new +// document. +func (p Patch) Apply(doc []byte) ([]byte, error) { + return p.ApplyWithOptions(doc, NewApplyOptions()) +} + +// ApplyWithOptions mutates a JSON document according to the patch and the passed in ApplyOptions. +// It returns the new document. +func (p Patch) ApplyWithOptions(doc []byte, options *ApplyOptions) ([]byte, error) { + return p.ApplyIndentWithOptions(doc, "", options) +} + +// ApplyIndent mutates a JSON document according to the patch, and returns the new +// document indented. +func (p Patch) ApplyIndent(doc []byte, indent string) ([]byte, error) { + return p.ApplyIndentWithOptions(doc, indent, NewApplyOptions()) +} + +// ApplyIndentWithOptions mutates a JSON document according to the patch and the passed in ApplyOptions. +// It returns the new document indented. +func (p Patch) ApplyIndentWithOptions(doc []byte, indent string, options *ApplyOptions) ([]byte, error) { + if len(doc) == 0 { + return doc, nil + } + + var pd container + if doc[0] == '[' { + pd = &partialArray{} + } else { + pd = &partialDoc{} + } + + err := json.Unmarshal(doc, pd) + + if err != nil { + return nil, err + } + + err = nil + + var accumulatedCopySize int64 + + for _, op := range p { + switch op.Kind() { + case "add": + err = p.add(&pd, op, options) + case "remove": + err = p.remove(&pd, op, options) + case "replace": + err = p.replace(&pd, op, options) + case "move": + err = p.move(&pd, op, options) + case "test": + err = p.test(&pd, op, options) + case "copy": + err = p.copy(&pd, op, &accumulatedCopySize, options) + default: + err = fmt.Errorf("Unexpected kind: %s", op.Kind()) + } + + if err != nil { + return nil, err + } + } + + if indent != "" { + return json.MarshalIndent(pd, "", indent) + } + + return json.Marshal(pd) +} + +// From http://tools.ietf.org/html/rfc6901#section-4 : +// +// Evaluation of each reference token begins by decoding any escaped +// character sequence. This is performed by first transforming any +// occurrence of the sequence '~1' to '/', and then transforming any +// occurrence of the sequence '~0' to '~'. + +var ( + rfc6901Decoder = strings.NewReplacer("~1", "/", "~0", "~") +) + +func decodePatchKey(k string) string { + return rfc6901Decoder.Replace(k) +} diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md index a438fe4b4..cc01c08f5 100644 --- a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md +++ b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md @@ -7,9 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.5.4] - 2022-04-25 + +* Windows: add missing defer to `Watcher.WatchList` [#447](https://github.com/fsnotify/fsnotify/pull/447) +* go.mod: use latest x/sys [#444](https://github.com/fsnotify/fsnotify/pull/444) +* Fix compilation for OpenBSD [#443](https://github.com/fsnotify/fsnotify/pull/443) + +## [1.5.3] - 2022-04-22 + +* This version is retracted. An incorrect branch is published accidentally [#445](https://github.com/fsnotify/fsnotify/issues/445) + +## [1.5.2] - 2022-04-21 + +* Add a feature to return the directories and files that are being monitored [#374](https://github.com/fsnotify/fsnotify/pull/374) +* Fix potential crash on windows if `raw.FileNameLength` exceeds `syscall.MAX_PATH` [#361](https://github.com/fsnotify/fsnotify/pull/361) +* Allow build on unsupported GOOS [#424](https://github.com/fsnotify/fsnotify/pull/424) +* Don't set `poller.fd` twice in `newFdPoller` [#406](https://github.com/fsnotify/fsnotify/pull/406) +* fix go vet warnings: call to `(*T).Fatalf` from a non-test goroutine [#416](https://github.com/fsnotify/fsnotify/pull/416) + ## [1.5.1] - 2021-08-24 -* Revert Add AddRaw to not follow symlinks +* Revert Add AddRaw to not follow symlinks [#394](https://github.com/fsnotify/fsnotify/pull/394) ## [1.5.0] - 2021-08-20 diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md index 828a60b24..8a642563d 100644 --- a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md +++ b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md @@ -48,18 +48,6 @@ fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Win Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on. -To aid in cross-platform testing there is a Vagrantfile for Linux and BSD. - -* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) -* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder. -* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password) -* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`. -* When you're done, you will want to halt or destroy the Vagrant boxes. - -Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory. - -Right now there is no equivalent solution for Windows and macOS, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads). - ### Maintainers Help maintaining fsnotify is welcome. To be a maintainer: @@ -67,11 +55,6 @@ Help maintaining fsnotify is welcome. To be a maintainer: * Submit a pull request and sign the CLA as above. * You must be able to run the test suite on Mac, Windows, Linux and BSD. -To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][]. - All code changes should be internal pull requests. Releases are tagged using [Semantic Versioning](http://semver.org/). - -[hub]: https://github.com/github/hub -[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md index df57b1b28..0731c5ef8 100644 --- a/vendor/github.com/fsnotify/fsnotify/README.md +++ b/vendor/github.com/fsnotify/fsnotify/README.md @@ -1,12 +1,8 @@ # File system notifications for Go -[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) +[![Go Reference](https://pkg.go.dev/badge/github.com/fsnotify/fsnotify.svg)](https://pkg.go.dev/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) [![Maintainers Wanted](https://img.shields.io/badge/maintainers-wanted-red.svg)](https://github.com/fsnotify/fsnotify/issues/413) -fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running: - -```console -go get -u golang.org/x/sys/... -``` +fsnotify utilizes [`golang.org/x/sys`](https://pkg.go.dev/golang.org/x/sys) rather than [`syscall`](https://pkg.go.dev/syscall) from the standard library. Cross platform: Windows, Linux, BSD and macOS. @@ -16,22 +12,20 @@ Cross platform: Windows, Linux, BSD and macOS. | kqueue | BSD, macOS, iOS\* | Supported | | ReadDirectoryChangesW | Windows | Supported | | FSEvents | macOS | [Planned](https://github.com/fsnotify/fsnotify/issues/11) | -| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/issues/12) | -| fanotify | Linux 2.6.37+ | [Planned](https://github.com/fsnotify/fsnotify/issues/114) | +| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/pull/371) | +| fanotify | Linux 2.6.37+ | [Maybe](https://github.com/fsnotify/fsnotify/issues/114) | | USN Journals | Windows | [Maybe](https://github.com/fsnotify/fsnotify/issues/53) | | Polling | *All* | [Maybe](https://github.com/fsnotify/fsnotify/issues/9) | \* Android and iOS are untested. -Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information. +Please see [the documentation](https://pkg.go.dev/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information. ## API stability -fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). - -All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number. +fsnotify is a fork of [howeyc/fsnotify](https://github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). -Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`. +All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). ## Usage @@ -84,10 +78,6 @@ func main() { Please refer to [CONTRIBUTING][] before opening an issue or pull request. -## Example - -See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go). - ## FAQ **When a file is moved to another directory is it still being watched?** diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go b/vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go new file mode 100644 index 000000000..596885598 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go @@ -0,0 +1,36 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !darwin && !dragonfly && !freebsd && !openbsd && !linux && !netbsd && !solaris && !windows +// +build !darwin,!dragonfly,!freebsd,!openbsd,!linux,!netbsd,!solaris,!windows + +package fsnotify + +import ( + "fmt" + "runtime" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct{} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + return nil, fmt.Errorf("fsnotify not supported on %s", runtime.GOOS) +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/vendor/github.com/fsnotify/fsnotify/inotify.go b/vendor/github.com/fsnotify/fsnotify/inotify.go index eb87699b5..a6d0e0ec8 100644 --- a/vendor/github.com/fsnotify/fsnotify/inotify.go +++ b/vendor/github.com/fsnotify/fsnotify/inotify.go @@ -163,6 +163,19 @@ func (w *Watcher) Remove(name string) error { return nil } +// WatchList returns the directories and files that are being monitered. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for pathname := range w.watches { + entries = append(entries, pathname) + } + + return entries +} + type watch struct { wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) diff --git a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go index e9ff9439f..b572a37c3 100644 --- a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go +++ b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go @@ -38,7 +38,6 @@ func newFdPoller(fd int) (*fdPoller, error) { poller.close() } }() - poller.fd = fd // Create epoll fd poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC) diff --git a/vendor/github.com/fsnotify/fsnotify/kqueue.go b/vendor/github.com/fsnotify/fsnotify/kqueue.go index 368f5b790..6fb8d8532 100644 --- a/vendor/github.com/fsnotify/fsnotify/kqueue.go +++ b/vendor/github.com/fsnotify/fsnotify/kqueue.go @@ -148,6 +148,19 @@ func (w *Watcher) Remove(name string) error { return nil } +// WatchList returns the directories and files that are being monitered. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for pathname := range w.watches { + entries = append(entries, pathname) + } + + return entries +} + // Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME diff --git a/vendor/github.com/fsnotify/fsnotify/windows.go b/vendor/github.com/fsnotify/fsnotify/windows.go index c02b75f7c..02ce7deb0 100644 --- a/vendor/github.com/fsnotify/fsnotify/windows.go +++ b/vendor/github.com/fsnotify/fsnotify/windows.go @@ -12,6 +12,7 @@ import ( "fmt" "os" "path/filepath" + "reflect" "runtime" "sync" "syscall" @@ -96,6 +97,21 @@ func (w *Watcher) Remove(name string) error { return <-in.reply } +// WatchList returns the directories and files that are being monitered. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for _, entry := range w.watches { + for _, watchEntry := range entry { + entries = append(entries, watchEntry.path) + } + } + + return entries +} + const ( // Options for AddWatch sysFSONESHOT = 0x80000000 @@ -452,8 +468,16 @@ func (w *Watcher) readEvents() { // Point "raw" to the event in the buffer raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) - buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName)) - name := syscall.UTF16ToString(buf[:raw.FileNameLength/2]) + // TODO: Consider using unsafe.Slice that is available from go1.17 + // https://stackoverflow.com/questions/51187973/how-to-create-an-array-or-a-slice-from-an-array-unsafe-pointer-in-golang + // instead of using a fixed syscall.MAX_PATH buf, we create a buf that is the size of the path name + size := int(raw.FileNameLength / 2) + var buf []uint16 + sh := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) + sh.Data = uintptr(unsafe.Pointer(&raw.FileName)) + sh.Len = size + sh.Cap = size + name := syscall.UTF16ToString(buf) fullname := filepath.Join(watch.path, name) var mask uint64 diff --git a/vendor/github.com/go-logr/logr/funcr/funcr.go b/vendor/github.com/go-logr/logr/funcr/funcr.go new file mode 100644 index 000000000..7accdb0c4 --- /dev/null +++ b/vendor/github.com/go-logr/logr/funcr/funcr.go @@ -0,0 +1,787 @@ +/* +Copyright 2021 The logr 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 funcr implements formatting of structured log messages and +// optionally captures the call site and timestamp. +// +// The simplest way to use it is via its implementation of a +// github.com/go-logr/logr.LogSink with output through an arbitrary +// "write" function. See New and NewJSON for details. +// +// Custom LogSinks +// +// For users who need more control, a funcr.Formatter can be embedded inside +// your own custom LogSink implementation. This is useful when the LogSink +// needs to implement additional methods, for example. +// +// Formatting +// +// This will respect logr.Marshaler, fmt.Stringer, and error interfaces for +// values which are being logged. When rendering a struct, funcr will use Go's +// standard JSON tags (all except "string"). +package funcr + +import ( + "bytes" + "encoding" + "fmt" + "path/filepath" + "reflect" + "runtime" + "strconv" + "strings" + "time" + + "github.com/go-logr/logr" +) + +// New returns a logr.Logger which is implemented by an arbitrary function. +func New(fn func(prefix, args string), opts Options) logr.Logger { + return logr.New(newSink(fn, NewFormatter(opts))) +} + +// NewJSON returns a logr.Logger which is implemented by an arbitrary function +// and produces JSON output. +func NewJSON(fn func(obj string), opts Options) logr.Logger { + fnWrapper := func(_, obj string) { + fn(obj) + } + return logr.New(newSink(fnWrapper, NewFormatterJSON(opts))) +} + +// Underlier exposes access to the underlying logging function. Since +// callers only have a logr.Logger, they have to know which +// implementation is in use, so this interface is less of an +// abstraction and more of a way to test type conversion. +type Underlier interface { + GetUnderlying() func(prefix, args string) +} + +func newSink(fn func(prefix, args string), formatter Formatter) logr.LogSink { + l := &fnlogger{ + Formatter: formatter, + write: fn, + } + // For skipping fnlogger.Info and fnlogger.Error. + l.Formatter.AddCallDepth(1) + return l +} + +// Options carries parameters which influence the way logs are generated. +type Options struct { + // LogCaller tells funcr to add a "caller" key to some or all log lines. + // This has some overhead, so some users might not want it. + LogCaller MessageClass + + // LogCallerFunc tells funcr to also log the calling function name. This + // has no effect if caller logging is not enabled (see Options.LogCaller). + LogCallerFunc bool + + // LogTimestamp tells funcr to add a "ts" key to log lines. This has some + // overhead, so some users might not want it. + LogTimestamp bool + + // TimestampFormat tells funcr how to render timestamps when LogTimestamp + // is enabled. If not specified, a default format will be used. For more + // details, see docs for Go's time.Layout. + TimestampFormat string + + // Verbosity tells funcr which V logs to produce. Higher values enable + // more logs. Info logs at or below this level will be written, while logs + // above this level will be discarded. + Verbosity int + + // RenderBuiltinsHook allows users to mutate the list of key-value pairs + // while a log line is being rendered. The kvList argument follows logr + // conventions - each pair of slice elements is comprised of a string key + // and an arbitrary value (verified and sanitized before calling this + // hook). The value returned must follow the same conventions. This hook + // can be used to audit or modify logged data. For example, you might want + // to prefix all of funcr's built-in keys with some string. This hook is + // only called for built-in (provided by funcr itself) key-value pairs. + // Equivalent hooks are offered for key-value pairs saved via + // logr.Logger.WithValues or Formatter.AddValues (see RenderValuesHook) and + // for user-provided pairs (see RenderArgsHook). + RenderBuiltinsHook func(kvList []interface{}) []interface{} + + // RenderValuesHook is the same as RenderBuiltinsHook, except that it is + // only called for key-value pairs saved via logr.Logger.WithValues. See + // RenderBuiltinsHook for more details. + RenderValuesHook func(kvList []interface{}) []interface{} + + // RenderArgsHook is the same as RenderBuiltinsHook, except that it is only + // called for key-value pairs passed directly to Info and Error. See + // RenderBuiltinsHook for more details. + RenderArgsHook func(kvList []interface{}) []interface{} + + // MaxLogDepth tells funcr how many levels of nested fields (e.g. a struct + // that contains a struct, etc.) it may log. Every time it finds a struct, + // slice, array, or map the depth is increased by one. When the maximum is + // reached, the value will be converted to a string indicating that the max + // depth has been exceeded. If this field is not specified, a default + // value will be used. + MaxLogDepth int +} + +// MessageClass indicates which category or categories of messages to consider. +type MessageClass int + +const ( + // None ignores all message classes. + None MessageClass = iota + // All considers all message classes. + All + // Info only considers info messages. + Info + // Error only considers error messages. + Error +) + +// fnlogger inherits some of its LogSink implementation from Formatter +// and just needs to add some glue code. +type fnlogger struct { + Formatter + write func(prefix, args string) +} + +func (l fnlogger) WithName(name string) logr.LogSink { + l.Formatter.AddName(name) + return &l +} + +func (l fnlogger) WithValues(kvList ...interface{}) logr.LogSink { + l.Formatter.AddValues(kvList) + return &l +} + +func (l fnlogger) WithCallDepth(depth int) logr.LogSink { + l.Formatter.AddCallDepth(depth) + return &l +} + +func (l fnlogger) Info(level int, msg string, kvList ...interface{}) { + prefix, args := l.FormatInfo(level, msg, kvList) + l.write(prefix, args) +} + +func (l fnlogger) Error(err error, msg string, kvList ...interface{}) { + prefix, args := l.FormatError(err, msg, kvList) + l.write(prefix, args) +} + +func (l fnlogger) GetUnderlying() func(prefix, args string) { + return l.write +} + +// Assert conformance to the interfaces. +var _ logr.LogSink = &fnlogger{} +var _ logr.CallDepthLogSink = &fnlogger{} +var _ Underlier = &fnlogger{} + +// NewFormatter constructs a Formatter which emits a JSON-like key=value format. +func NewFormatter(opts Options) Formatter { + return newFormatter(opts, outputKeyValue) +} + +// NewFormatterJSON constructs a Formatter which emits strict JSON. +func NewFormatterJSON(opts Options) Formatter { + return newFormatter(opts, outputJSON) +} + +// Defaults for Options. +const defaultTimestampFormat = "2006-01-02 15:04:05.000000" +const defaultMaxLogDepth = 16 + +func newFormatter(opts Options, outfmt outputFormat) Formatter { + if opts.TimestampFormat == "" { + opts.TimestampFormat = defaultTimestampFormat + } + if opts.MaxLogDepth == 0 { + opts.MaxLogDepth = defaultMaxLogDepth + } + f := Formatter{ + outputFormat: outfmt, + prefix: "", + values: nil, + depth: 0, + opts: opts, + } + return f +} + +// Formatter is an opaque struct which can be embedded in a LogSink +// implementation. It should be constructed with NewFormatter. Some of +// its methods directly implement logr.LogSink. +type Formatter struct { + outputFormat outputFormat + prefix string + values []interface{} + valuesStr string + depth int + opts Options +} + +// outputFormat indicates which outputFormat to use. +type outputFormat int + +const ( + // outputKeyValue emits a JSON-like key=value format, but not strict JSON. + outputKeyValue outputFormat = iota + // outputJSON emits strict JSON. + outputJSON +) + +// PseudoStruct is a list of key-value pairs that gets logged as a struct. +type PseudoStruct []interface{} + +// render produces a log line, ready to use. +func (f Formatter) render(builtins, args []interface{}) string { + // Empirically bytes.Buffer is faster than strings.Builder for this. + buf := bytes.NewBuffer(make([]byte, 0, 1024)) + if f.outputFormat == outputJSON { + buf.WriteByte('{') + } + vals := builtins + if hook := f.opts.RenderBuiltinsHook; hook != nil { + vals = hook(f.sanitize(vals)) + } + f.flatten(buf, vals, false, false) // keys are ours, no need to escape + continuing := len(builtins) > 0 + if len(f.valuesStr) > 0 { + if continuing { + if f.outputFormat == outputJSON { + buf.WriteByte(',') + } else { + buf.WriteByte(' ') + } + } + continuing = true + buf.WriteString(f.valuesStr) + } + vals = args + if hook := f.opts.RenderArgsHook; hook != nil { + vals = hook(f.sanitize(vals)) + } + f.flatten(buf, vals, continuing, true) // escape user-provided keys + if f.outputFormat == outputJSON { + buf.WriteByte('}') + } + return buf.String() +} + +// flatten renders a list of key-value pairs into a buffer. If continuing is +// true, it assumes that the buffer has previous values and will emit a +// separator (which depends on the output format) before the first pair it +// writes. If escapeKeys is true, the keys are assumed to have +// non-JSON-compatible characters in them and must be evaluated for escapes. +// +// This function returns a potentially modified version of kvList, which +// ensures that there is a value for every key (adding a value if needed) and +// that each key is a string (substituting a key if needed). +func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing bool, escapeKeys bool) []interface{} { + // This logic overlaps with sanitize() but saves one type-cast per key, + // which can be measurable. + if len(kvList)%2 != 0 { + kvList = append(kvList, noValue) + } + for i := 0; i < len(kvList); i += 2 { + k, ok := kvList[i].(string) + if !ok { + k = f.nonStringKey(kvList[i]) + kvList[i] = k + } + v := kvList[i+1] + + if i > 0 || continuing { + if f.outputFormat == outputJSON { + buf.WriteByte(',') + } else { + // In theory the format could be something we don't understand. In + // practice, we control it, so it won't be. + buf.WriteByte(' ') + } + } + + if escapeKeys { + buf.WriteString(prettyString(k)) + } else { + // this is faster + buf.WriteByte('"') + buf.WriteString(k) + buf.WriteByte('"') + } + if f.outputFormat == outputJSON { + buf.WriteByte(':') + } else { + buf.WriteByte('=') + } + buf.WriteString(f.pretty(v)) + } + return kvList +} + +func (f Formatter) pretty(value interface{}) string { + return f.prettyWithFlags(value, 0, 0) +} + +const ( + flagRawStruct = 0x1 // do not print braces on structs +) + +// TODO: This is not fast. Most of the overhead goes here. +func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) string { + if depth > f.opts.MaxLogDepth { + return `""` + } + + // Handle types that take full control of logging. + if v, ok := value.(logr.Marshaler); ok { + // Replace the value with what the type wants to get logged. + // That then gets handled below via reflection. + value = invokeMarshaler(v) + } + + // Handle types that want to format themselves. + switch v := value.(type) { + case fmt.Stringer: + value = invokeStringer(v) + case error: + value = invokeError(v) + } + + // Handling the most common types without reflect is a small perf win. + switch v := value.(type) { + case bool: + return strconv.FormatBool(v) + case string: + return prettyString(v) + case int: + return strconv.FormatInt(int64(v), 10) + case int8: + return strconv.FormatInt(int64(v), 10) + case int16: + return strconv.FormatInt(int64(v), 10) + case int32: + return strconv.FormatInt(int64(v), 10) + case int64: + return strconv.FormatInt(int64(v), 10) + case uint: + return strconv.FormatUint(uint64(v), 10) + case uint8: + return strconv.FormatUint(uint64(v), 10) + case uint16: + return strconv.FormatUint(uint64(v), 10) + case uint32: + return strconv.FormatUint(uint64(v), 10) + case uint64: + return strconv.FormatUint(v, 10) + case uintptr: + return strconv.FormatUint(uint64(v), 10) + case float32: + return strconv.FormatFloat(float64(v), 'f', -1, 32) + case float64: + return strconv.FormatFloat(v, 'f', -1, 64) + case complex64: + return `"` + strconv.FormatComplex(complex128(v), 'f', -1, 64) + `"` + case complex128: + return `"` + strconv.FormatComplex(v, 'f', -1, 128) + `"` + case PseudoStruct: + buf := bytes.NewBuffer(make([]byte, 0, 1024)) + v = f.sanitize(v) + if flags&flagRawStruct == 0 { + buf.WriteByte('{') + } + for i := 0; i < len(v); i += 2 { + if i > 0 { + buf.WriteByte(',') + } + k, _ := v[i].(string) // sanitize() above means no need to check success + // arbitrary keys might need escaping + buf.WriteString(prettyString(k)) + buf.WriteByte(':') + buf.WriteString(f.prettyWithFlags(v[i+1], 0, depth+1)) + } + if flags&flagRawStruct == 0 { + buf.WriteByte('}') + } + return buf.String() + } + + buf := bytes.NewBuffer(make([]byte, 0, 256)) + t := reflect.TypeOf(value) + if t == nil { + return "null" + } + v := reflect.ValueOf(value) + switch t.Kind() { + case reflect.Bool: + return strconv.FormatBool(v.Bool()) + case reflect.String: + return prettyString(v.String()) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return strconv.FormatInt(int64(v.Int()), 10) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return strconv.FormatUint(uint64(v.Uint()), 10) + case reflect.Float32: + return strconv.FormatFloat(float64(v.Float()), 'f', -1, 32) + case reflect.Float64: + return strconv.FormatFloat(v.Float(), 'f', -1, 64) + case reflect.Complex64: + return `"` + strconv.FormatComplex(complex128(v.Complex()), 'f', -1, 64) + `"` + case reflect.Complex128: + return `"` + strconv.FormatComplex(v.Complex(), 'f', -1, 128) + `"` + case reflect.Struct: + if flags&flagRawStruct == 0 { + buf.WriteByte('{') + } + for i := 0; i < t.NumField(); i++ { + fld := t.Field(i) + if fld.PkgPath != "" { + // reflect says this field is only defined for non-exported fields. + continue + } + if !v.Field(i).CanInterface() { + // reflect isn't clear exactly what this means, but we can't use it. + continue + } + name := "" + omitempty := false + if tag, found := fld.Tag.Lookup("json"); found { + if tag == "-" { + continue + } + if comma := strings.Index(tag, ","); comma != -1 { + if n := tag[:comma]; n != "" { + name = n + } + rest := tag[comma:] + if strings.Contains(rest, ",omitempty,") || strings.HasSuffix(rest, ",omitempty") { + omitempty = true + } + } else { + name = tag + } + } + if omitempty && isEmpty(v.Field(i)) { + continue + } + if i > 0 { + buf.WriteByte(',') + } + if fld.Anonymous && fld.Type.Kind() == reflect.Struct && name == "" { + buf.WriteString(f.prettyWithFlags(v.Field(i).Interface(), flags|flagRawStruct, depth+1)) + continue + } + if name == "" { + name = fld.Name + } + // field names can't contain characters which need escaping + buf.WriteByte('"') + buf.WriteString(name) + buf.WriteByte('"') + buf.WriteByte(':') + buf.WriteString(f.prettyWithFlags(v.Field(i).Interface(), 0, depth+1)) + } + if flags&flagRawStruct == 0 { + buf.WriteByte('}') + } + return buf.String() + case reflect.Slice, reflect.Array: + buf.WriteByte('[') + for i := 0; i < v.Len(); i++ { + if i > 0 { + buf.WriteByte(',') + } + e := v.Index(i) + buf.WriteString(f.prettyWithFlags(e.Interface(), 0, depth+1)) + } + buf.WriteByte(']') + return buf.String() + case reflect.Map: + buf.WriteByte('{') + // This does not sort the map keys, for best perf. + it := v.MapRange() + i := 0 + for it.Next() { + if i > 0 { + buf.WriteByte(',') + } + // If a map key supports TextMarshaler, use it. + keystr := "" + if m, ok := it.Key().Interface().(encoding.TextMarshaler); ok { + txt, err := m.MarshalText() + if err != nil { + keystr = fmt.Sprintf("", err.Error()) + } else { + keystr = string(txt) + } + keystr = prettyString(keystr) + } else { + // prettyWithFlags will produce already-escaped values + keystr = f.prettyWithFlags(it.Key().Interface(), 0, depth+1) + if t.Key().Kind() != reflect.String { + // JSON only does string keys. Unlike Go's standard JSON, we'll + // convert just about anything to a string. + keystr = prettyString(keystr) + } + } + buf.WriteString(keystr) + buf.WriteByte(':') + buf.WriteString(f.prettyWithFlags(it.Value().Interface(), 0, depth+1)) + i++ + } + buf.WriteByte('}') + return buf.String() + case reflect.Ptr, reflect.Interface: + if v.IsNil() { + return "null" + } + return f.prettyWithFlags(v.Elem().Interface(), 0, depth) + } + return fmt.Sprintf(`""`, t.Kind().String()) +} + +func prettyString(s string) string { + // Avoid escaping (which does allocations) if we can. + if needsEscape(s) { + return strconv.Quote(s) + } + b := bytes.NewBuffer(make([]byte, 0, 1024)) + b.WriteByte('"') + b.WriteString(s) + b.WriteByte('"') + return b.String() +} + +// needsEscape determines whether the input string needs to be escaped or not, +// without doing any allocations. +func needsEscape(s string) bool { + for _, r := range s { + if !strconv.IsPrint(r) || r == '\\' || r == '"' { + return true + } + } + return false +} + +func isEmpty(v reflect.Value) bool { + switch v.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Complex64, reflect.Complex128: + return v.Complex() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} + +func invokeMarshaler(m logr.Marshaler) (ret interface{}) { + defer func() { + if r := recover(); r != nil { + ret = fmt.Sprintf("", r) + } + }() + return m.MarshalLog() +} + +func invokeStringer(s fmt.Stringer) (ret string) { + defer func() { + if r := recover(); r != nil { + ret = fmt.Sprintf("", r) + } + }() + return s.String() +} + +func invokeError(e error) (ret string) { + defer func() { + if r := recover(); r != nil { + ret = fmt.Sprintf("", r) + } + }() + return e.Error() +} + +// Caller represents the original call site for a log line, after considering +// logr.Logger.WithCallDepth and logr.Logger.WithCallStackHelper. The File and +// Line fields will always be provided, while the Func field is optional. +// Users can set the render hook fields in Options to examine logged key-value +// pairs, one of which will be {"caller", Caller} if the Options.LogCaller +// field is enabled for the given MessageClass. +type Caller struct { + // File is the basename of the file for this call site. + File string `json:"file"` + // Line is the line number in the file for this call site. + Line int `json:"line"` + // Func is the function name for this call site, or empty if + // Options.LogCallerFunc is not enabled. + Func string `json:"function,omitempty"` +} + +func (f Formatter) caller() Caller { + // +1 for this frame, +1 for Info/Error. + pc, file, line, ok := runtime.Caller(f.depth + 2) + if !ok { + return Caller{"", 0, ""} + } + fn := "" + if f.opts.LogCallerFunc { + if fp := runtime.FuncForPC(pc); fp != nil { + fn = fp.Name() + } + } + + return Caller{filepath.Base(file), line, fn} +} + +const noValue = "" + +func (f Formatter) nonStringKey(v interface{}) string { + return fmt.Sprintf("", f.snippet(v)) +} + +// snippet produces a short snippet string of an arbitrary value. +func (f Formatter) snippet(v interface{}) string { + const snipLen = 16 + + snip := f.pretty(v) + if len(snip) > snipLen { + snip = snip[:snipLen] + } + return snip +} + +// sanitize ensures that a list of key-value pairs has a value for every key +// (adding a value if needed) and that each key is a string (substituting a key +// if needed). +func (f Formatter) sanitize(kvList []interface{}) []interface{} { + if len(kvList)%2 != 0 { + kvList = append(kvList, noValue) + } + for i := 0; i < len(kvList); i += 2 { + _, ok := kvList[i].(string) + if !ok { + kvList[i] = f.nonStringKey(kvList[i]) + } + } + return kvList +} + +// Init configures this Formatter from runtime info, such as the call depth +// imposed by logr itself. +// Note that this receiver is a pointer, so depth can be saved. +func (f *Formatter) Init(info logr.RuntimeInfo) { + f.depth += info.CallDepth +} + +// Enabled checks whether an info message at the given level should be logged. +func (f Formatter) Enabled(level int) bool { + return level <= f.opts.Verbosity +} + +// GetDepth returns the current depth of this Formatter. This is useful for +// implementations which do their own caller attribution. +func (f Formatter) GetDepth() int { + return f.depth +} + +// FormatInfo renders an Info log message into strings. The prefix will be +// empty when no names were set (via AddNames), or when the output is +// configured for JSON. +func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (prefix, argsStr string) { + args := make([]interface{}, 0, 64) // using a constant here impacts perf + prefix = f.prefix + if f.outputFormat == outputJSON { + args = append(args, "logger", prefix) + prefix = "" + } + if f.opts.LogTimestamp { + args = append(args, "ts", time.Now().Format(f.opts.TimestampFormat)) + } + if policy := f.opts.LogCaller; policy == All || policy == Info { + args = append(args, "caller", f.caller()) + } + args = append(args, "level", level, "msg", msg) + return prefix, f.render(args, kvList) +} + +// FormatError renders an Error log message into strings. The prefix will be +// empty when no names were set (via AddNames), or when the output is +// configured for JSON. +func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (prefix, argsStr string) { + args := make([]interface{}, 0, 64) // using a constant here impacts perf + prefix = f.prefix + if f.outputFormat == outputJSON { + args = append(args, "logger", prefix) + prefix = "" + } + if f.opts.LogTimestamp { + args = append(args, "ts", time.Now().Format(f.opts.TimestampFormat)) + } + if policy := f.opts.LogCaller; policy == All || policy == Error { + args = append(args, "caller", f.caller()) + } + args = append(args, "msg", msg) + var loggableErr interface{} + if err != nil { + loggableErr = err.Error() + } + args = append(args, "error", loggableErr) + return f.prefix, f.render(args, kvList) +} + +// AddName appends the specified name. funcr uses '/' characters to separate +// name elements. Callers should not pass '/' in the provided name string, but +// this library does not actually enforce that. +func (f *Formatter) AddName(name string) { + if len(f.prefix) > 0 { + f.prefix += "/" + } + f.prefix += name +} + +// AddValues adds key-value pairs to the set of saved values to be logged with +// each log line. +func (f *Formatter) AddValues(kvList []interface{}) { + // Three slice args forces a copy. + n := len(f.values) + f.values = append(f.values[:n:n], kvList...) + + vals := f.values + if hook := f.opts.RenderValuesHook; hook != nil { + vals = hook(f.sanitize(vals)) + } + + // Pre-render values, so we don't have to do it on each Info/Error call. + buf := bytes.NewBuffer(make([]byte, 0, 1024)) + f.flatten(buf, vals, false, true) // escape user-provided keys + f.valuesStr = buf.String() +} + +// AddCallDepth increases the number of stack-frames to skip when attributing +// the log line to a file and line. +func (f *Formatter) AddCallDepth(depth int) { + f.depth += depth +} diff --git a/vendor/github.com/go-logr/logr/testr/testr.go b/vendor/github.com/go-logr/logr/testr/testr.go new file mode 100644 index 000000000..6fa2783ca --- /dev/null +++ b/vendor/github.com/go-logr/logr/testr/testr.go @@ -0,0 +1,116 @@ +/* +Copyright 2019 The logr 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 testr provides support for using logr in tests. +package testr + +import ( + "testing" + + "github.com/go-logr/logr" + "github.com/go-logr/logr/funcr" +) + +// New returns a logr.Logger that prints through a testing.T object. +// Info logs are only enabled at V(0). +func New(t *testing.T) logr.Logger { + l := &testlogger{ + Formatter: funcr.NewFormatter(funcr.Options{}), + t: t, + } + return logr.New(l) +} + +// Options carries parameters which influence the way logs are generated. +type Options struct { + // LogTimestamp tells the logger to add a "ts" key to log + // lines. This has some overhead, so some users might not want + // it. + LogTimestamp bool + + // Verbosity tells the logger which V logs to be write. + // Higher values enable more logs. + Verbosity int +} + +// NewWithOptions returns a logr.Logger that prints through a testing.T object. +// In contrast to the simpler New, output formatting can be configured. +func NewWithOptions(t *testing.T, opts Options) logr.Logger { + l := &testlogger{ + Formatter: funcr.NewFormatter(funcr.Options{ + LogTimestamp: opts.LogTimestamp, + Verbosity: opts.Verbosity, + }), + t: t, + } + return logr.New(l) +} + +// Underlier exposes access to the underlying testing.T instance. Since +// callers only have a logr.Logger, they have to know which +// implementation is in use, so this interface is less of an +// abstraction and more of a way to test type conversion. +type Underlier interface { + GetUnderlying() *testing.T +} + +type testlogger struct { + funcr.Formatter + t *testing.T +} + +func (l testlogger) WithName(name string) logr.LogSink { + l.Formatter.AddName(name) + return &l +} + +func (l testlogger) WithValues(kvList ...interface{}) logr.LogSink { + l.Formatter.AddValues(kvList) + return &l +} + +func (l testlogger) GetCallStackHelper() func() { + return l.t.Helper +} + +func (l testlogger) Info(level int, msg string, kvList ...interface{}) { + prefix, args := l.FormatInfo(level, msg, kvList) + l.t.Helper() + if prefix != "" { + l.t.Logf("%s: %s", prefix, args) + } else { + l.t.Log(args) + } +} + +func (l testlogger) Error(err error, msg string, kvList ...interface{}) { + prefix, args := l.FormatError(err, msg, kvList) + l.t.Helper() + if prefix != "" { + l.t.Logf("%s: %s", prefix, args) + } else { + l.t.Log(args) + } +} + +func (l testlogger) GetUnderlying() *testing.T { + return l.t +} + +// Assert conformance to the interfaces. +var _ logr.LogSink = &testlogger{} +var _ logr.CallStackHelperLogSink = &testlogger{} +var _ Underlier = &testlogger{} diff --git a/vendor/github.com/go-logr/zapr/zapr.go b/vendor/github.com/go-logr/zapr/zapr.go index 5f99ca117..8bb7fceb3 100644 --- a/vendor/github.com/go-logr/zapr/zapr.go +++ b/vendor/github.com/go-logr/zapr/zapr.go @@ -54,6 +54,8 @@ limitations under the License. package zapr import ( + "fmt" + "github.com/go-logr/logr" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -170,11 +172,21 @@ func zapIt(field string, val interface{}) zap.Field { // Handle types that implement logr.Marshaler: log the replacement // object instead of the original one. if marshaler, ok := val.(logr.Marshaler); ok { - val = marshaler.MarshalLog() + field, val = invokeMarshaler(field, marshaler) } return zap.Any(field, val) } +func invokeMarshaler(field string, m logr.Marshaler) (f string, ret interface{}) { + defer func() { + if r := recover(); r != nil { + ret = fmt.Sprintf("PANIC=%s", r) + f = field + "Error" + } + }() + return field, m.MarshalLog() +} + func (zl *zapLogger) Init(ri logr.RuntimeInfo) { zl.l = zl.l.WithOptions(zap.AddCallerSkip(ri.CallDepth)) } diff --git a/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go new file mode 100644 index 000000000..8956c3088 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go @@ -0,0 +1,63 @@ +package internal + +import ( + "net/url" + "regexp" + "strings" +) + +const ( + defaultHttpPort = ":80" + defaultHttpsPort = ":443" +) + +// Regular expressions used by the normalizations +var rxPort = regexp.MustCompile(`(:\d+)/?$`) +var rxDupSlashes = regexp.MustCompile(`/{2,}`) + +// NormalizeURL will normalize the specified URL +// This was added to replace a previous call to the no longer maintained purell library: +// The call that was used looked like the following: +// url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes)) +// +// To explain all that was included in the call above, purell.FlagsSafe was really just the following: +// - FlagLowercaseScheme +// - FlagLowercaseHost +// - FlagRemoveDefaultPort +// - FlagRemoveDuplicateSlashes (and this was mixed in with the |) +func NormalizeURL(u *url.URL) { + lowercaseScheme(u) + lowercaseHost(u) + removeDefaultPort(u) + removeDuplicateSlashes(u) +} + +func lowercaseScheme(u *url.URL) { + if len(u.Scheme) > 0 { + u.Scheme = strings.ToLower(u.Scheme) + } +} + +func lowercaseHost(u *url.URL) { + if len(u.Host) > 0 { + u.Host = strings.ToLower(u.Host) + } +} + +func removeDefaultPort(u *url.URL) { + if len(u.Host) > 0 { + scheme := strings.ToLower(u.Scheme) + u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string { + if (scheme == "http" && val == defaultHttpPort) || (scheme == "https" && val == defaultHttpsPort) { + return "" + } + return val + }) + } +} + +func removeDuplicateSlashes(u *url.URL) { + if len(u.Path) > 0 { + u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/") + } +} diff --git a/vendor/github.com/go-openapi/jsonreference/reference.go b/vendor/github.com/go-openapi/jsonreference/reference.go index 3bc0a6e26..cfdef03e5 100644 --- a/vendor/github.com/go-openapi/jsonreference/reference.go +++ b/vendor/github.com/go-openapi/jsonreference/reference.go @@ -30,8 +30,8 @@ import ( "net/url" "strings" - "github.com/PuerkitoBio/purell" "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/jsonreference/internal" ) const ( @@ -114,7 +114,9 @@ func (r *Ref) parse(jsonReferenceString string) error { return err } - r.referenceURL, _ = url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes)) + internal.NormalizeURL(parsed) + + r.referenceURL = parsed refURL := r.referenceURL if refURL.Scheme != "" && refURL.Host != "" { diff --git a/vendor/github.com/go-openapi/swag/.gitattributes b/vendor/github.com/go-openapi/swag/.gitattributes new file mode 100644 index 000000000..49ad52766 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.gitattributes @@ -0,0 +1,2 @@ +# gofmt always uses LF, whereas Git uses CRLF on Windows. +*.go text eol=lf diff --git a/vendor/github.com/go-openapi/swag/.golangci.yml b/vendor/github.com/go-openapi/swag/.golangci.yml index 813c47aa6..bf503e400 100644 --- a/vendor/github.com/go-openapi/swag/.golangci.yml +++ b/vendor/github.com/go-openapi/swag/.golangci.yml @@ -37,3 +37,18 @@ linters: - gci - gocognit - paralleltest + - thelper + - ifshort + - gomoddirectives + - cyclop + - forcetypeassert + - ireturn + - tagliatelle + - varnamelen + - goimports + - tenv + - golint + - exhaustruct + - nilnil + - nonamedreturns + - nosnakecase diff --git a/vendor/github.com/go-openapi/swag/.travis.yml b/vendor/github.com/go-openapi/swag/.travis.yml deleted file mode 100644 index fc25a8872..000000000 --- a/vendor/github.com/go-openapi/swag/.travis.yml +++ /dev/null @@ -1,37 +0,0 @@ -after_success: -- bash <(curl -s https://codecov.io/bash) -go: -- 1.14.x -- 1.x -arch: -- amd64 -jobs: - include: - # include arch ppc, but only for latest go version - skip testing for race - - go: 1.x - arch: ppc64le - install: ~ - script: - - go test -v - - #- go: 1.x - # arch: arm - # install: ~ - # script: - # - go test -v - - # include linting job, but only for latest go version and amd64 arch - - go: 1.x - arch: amd64 - install: - go get github.com/golangci/golangci-lint/cmd/golangci-lint - script: - - golangci-lint run --new-from-rev master -install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -language: go -notifications: - slack: - secure: QUWvCkBBK09GF7YtEvHHVt70JOkdlNBG0nIKu/5qc4/nW5HP8I2w0SEf/XR2je0eED1Qe3L/AfMCWwrEj+IUZc3l4v+ju8X8R3Lomhme0Eb0jd1MTMCuPcBT47YCj0M7RON7vXtbFfm1hFJ/jLe5+9FXz0hpXsR24PJc5ZIi/ogNwkaPqG4BmndzecpSh0vc2FJPZUD9LT0I09REY/vXR0oQAalLkW0asGD5taHZTUZq/kBpsNxaAFrLM23i4mUcf33M5fjLpvx5LRICrX/57XpBrDh2TooBU6Qj3CgoY0uPRYUmSNxbVx1czNzl2JtEpb5yjoxfVPQeg0BvQM00G8LJINISR+ohrjhkZmAqchDupAX+yFrxTtORa78CtnIL6z/aTNlgwwVD8kvL/1pFA/JWYmKDmz93mV/+6wubGzNSQCstzjkFA4/iZEKewKUoRIAi/fxyscP6L/rCpmY/4llZZvrnyTqVbt6URWpopUpH4rwYqreXAtJxJsfBJIeSmUIiDIOMGkCTvyTEW3fWGmGoqWtSHLoaWDyAIGb7azb+KvfpWtEcoPFWfSWU+LGee0A/YsUhBl7ADB9A0CJEuR8q4BPpKpfLwPKSiKSAXL7zDkyjExyhtgqbSl2jS+rKIHOZNL8JkCcTP2MKMVd563C5rC5FMKqu3S9m2b6380E= -script: -- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/swag/doc.go b/vendor/github.com/go-openapi/swag/doc.go index 8d2c8c501..55094cb74 100644 --- a/vendor/github.com/go-openapi/swag/doc.go +++ b/vendor/github.com/go-openapi/swag/doc.go @@ -17,16 +17,15 @@ Package swag contains a bunch of helper functions for go-openapi and go-swagger You may also use it standalone for your projects. - * convert between value and pointers for builtin types - * convert from string to builtin types (wraps strconv) - * fast json concatenation - * search in path - * load from file or http - * name mangling - + - convert between value and pointers for builtin types + - convert from string to builtin types (wraps strconv) + - fast json concatenation + - search in path + - load from file or http + - name mangling This repo has only few dependencies outside of the standard library: - * YAML utilities depend on gopkg.in/yaml.v2 + - YAML utilities depend on gopkg.in/yaml.v2 */ package swag diff --git a/vendor/github.com/go-openapi/swag/file.go b/vendor/github.com/go-openapi/swag/file.go new file mode 100644 index 000000000..16accc55f --- /dev/null +++ b/vendor/github.com/go-openapi/swag/file.go @@ -0,0 +1,33 @@ +// Copyright 2015 go-swagger maintainers +// +// 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 swag + +import "mime/multipart" + +// File represents an uploaded file. +type File struct { + Data multipart.File + Header *multipart.FileHeader +} + +// Read bytes from the file +func (f *File) Read(p []byte) (n int, err error) { + return f.Data.Read(p) +} + +// Close the file +func (f *File) Close() error { + return f.Data.Close() +} diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go index 9a6040972..00038c377 100644 --- a/vendor/github.com/go-openapi/swag/loading.go +++ b/vendor/github.com/go-openapi/swag/loading.go @@ -16,10 +16,11 @@ package swag import ( "fmt" - "io/ioutil" + "io" "log" "net/http" "net/url" + "os" "path/filepath" "runtime" "strings" @@ -40,13 +41,13 @@ var LoadHTTPCustomHeaders = map[string]string{} // LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in func LoadFromFileOrHTTP(path string) ([]byte, error) { - return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) + return LoadStrategy(path, os.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) } // LoadFromFileOrHTTPWithTimeout loads the bytes from a file or a remote http server based on the path passed in // timeout arg allows for per request overriding of the request timeout func LoadFromFileOrHTTPWithTimeout(path string, timeout time.Duration) ([]byte, error) { - return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(timeout))(path) + return LoadStrategy(path, os.ReadFile, loadHTTPBytes(timeout))(path) } // LoadStrategy returns a loader function for a given path or uri @@ -86,7 +87,7 @@ func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func( func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) { return func(path string) ([]byte, error) { client := &http.Client{Timeout: timeout} - req, err := http.NewRequest("GET", path, nil) // nolint: noctx + req, err := http.NewRequest(http.MethodGet, path, nil) //nolint:noctx if err != nil { return nil, err } @@ -115,6 +116,6 @@ func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) { return nil, fmt.Errorf("could not access document at %q [%s] ", path, resp.Status) } - return ioutil.ReadAll(resp.Body) + return io.ReadAll(resp.Body) } } diff --git a/vendor/github.com/go-openapi/swag/post_go18.go b/vendor/github.com/go-openapi/swag/post_go18.go index c2e686d31..f5228b82c 100644 --- a/vendor/github.com/go-openapi/swag/post_go18.go +++ b/vendor/github.com/go-openapi/swag/post_go18.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build go1.8 // +build go1.8 package swag diff --git a/vendor/github.com/go-openapi/swag/post_go19.go b/vendor/github.com/go-openapi/swag/post_go19.go index eb2f2d8bc..7c7da9c08 100644 --- a/vendor/github.com/go-openapi/swag/post_go19.go +++ b/vendor/github.com/go-openapi/swag/post_go19.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build go1.9 // +build go1.9 package swag diff --git a/vendor/github.com/go-openapi/swag/pre_go18.go b/vendor/github.com/go-openapi/swag/pre_go18.go index 6607f3393..2757d9b95 100644 --- a/vendor/github.com/go-openapi/swag/pre_go18.go +++ b/vendor/github.com/go-openapi/swag/pre_go18.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !go1.8 // +build !go1.8 package swag diff --git a/vendor/github.com/go-openapi/swag/pre_go19.go b/vendor/github.com/go-openapi/swag/pre_go19.go index 4bae187d1..0565db377 100644 --- a/vendor/github.com/go-openapi/swag/pre_go19.go +++ b/vendor/github.com/go-openapi/swag/pre_go19.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !go1.9 // +build !go1.9 package swag diff --git a/vendor/github.com/go-openapi/swag/util.go b/vendor/github.com/go-openapi/swag/util.go index 193702f2c..f78ab684a 100644 --- a/vendor/github.com/go-openapi/swag/util.go +++ b/vendor/github.com/go-openapi/swag/util.go @@ -99,10 +99,11 @@ const ( ) // JoinByFormat joins a string array by a known format (e.g. swagger's collectionFormat attribute): -// ssv: space separated value -// tsv: tab separated value -// pipes: pipe (|) separated value -// csv: comma separated value (default) +// +// ssv: space separated value +// tsv: tab separated value +// pipes: pipe (|) separated value +// csv: comma separated value (default) func JoinByFormat(data []string, format string) []string { if len(data) == 0 { return data @@ -124,11 +125,11 @@ func JoinByFormat(data []string, format string) []string { } // SplitByFormat splits a string by a known format: -// ssv: space separated value -// tsv: tab separated value -// pipes: pipe (|) separated value -// csv: comma separated value (default) // +// ssv: space separated value +// tsv: tab separated value +// pipes: pipe (|) separated value +// csv: comma separated value (default) func SplitByFormat(data, format string) []string { if data == "" { return nil diff --git a/vendor/github.com/go-openapi/swag/yaml.go b/vendor/github.com/go-openapi/swag/yaml.go index ec9691440..f09ee609f 100644 --- a/vendor/github.com/go-openapi/swag/yaml.go +++ b/vendor/github.com/go-openapi/swag/yaml.go @@ -22,7 +22,7 @@ import ( "github.com/mailru/easyjson/jlexer" "github.com/mailru/easyjson/jwriter" - yaml "gopkg.in/yaml.v2" + yaml "gopkg.in/yaml.v3" ) // YAMLMatcher matches yaml @@ -43,16 +43,126 @@ func YAMLToJSON(data interface{}) (json.RawMessage, error) { // BytesToYAMLDoc converts a byte slice into a YAML document func BytesToYAMLDoc(data []byte) (interface{}, error) { - var canary map[interface{}]interface{} // validate this is an object and not a different type - if err := yaml.Unmarshal(data, &canary); err != nil { + var document yaml.Node // preserve order that is present in the document + if err := yaml.Unmarshal(data, &document); err != nil { return nil, err } + if document.Kind != yaml.DocumentNode || len(document.Content) != 1 || document.Content[0].Kind != yaml.MappingNode { + return nil, fmt.Errorf("only YAML documents that are objects are supported") + } + return &document, nil +} - var document yaml.MapSlice // preserve order that is present in the document - if err := yaml.Unmarshal(data, &document); err != nil { - return nil, err +func yamlNode(root *yaml.Node) (interface{}, error) { + switch root.Kind { + case yaml.DocumentNode: + return yamlDocument(root) + case yaml.SequenceNode: + return yamlSequence(root) + case yaml.MappingNode: + return yamlMapping(root) + case yaml.ScalarNode: + return yamlScalar(root) + case yaml.AliasNode: + return yamlNode(root.Alias) + default: + return nil, fmt.Errorf("unsupported YAML node type: %v", root.Kind) + } +} + +func yamlDocument(node *yaml.Node) (interface{}, error) { + if len(node.Content) != 1 { + return nil, fmt.Errorf("unexpected YAML Document node content length: %d", len(node.Content)) + } + return yamlNode(node.Content[0]) +} + +func yamlMapping(node *yaml.Node) (interface{}, error) { + m := make(JSONMapSlice, len(node.Content)/2) + + var j int + for i := 0; i < len(node.Content); i += 2 { + var nmi JSONMapItem + k, err := yamlStringScalarC(node.Content[i]) + if err != nil { + return nil, fmt.Errorf("unable to decode YAML map key: %w", err) + } + nmi.Key = k + v, err := yamlNode(node.Content[i+1]) + if err != nil { + return nil, fmt.Errorf("unable to process YAML map value for key %q: %w", k, err) + } + nmi.Value = v + m[j] = nmi + j++ + } + return m, nil +} + +func yamlSequence(node *yaml.Node) (interface{}, error) { + s := make([]interface{}, 0) + + for i := 0; i < len(node.Content); i++ { + + v, err := yamlNode(node.Content[i]) + if err != nil { + return nil, fmt.Errorf("unable to decode YAML sequence value: %w", err) + } + s = append(s, v) + } + return s, nil +} + +const ( // See https://yaml.org/type/ + yamlStringScalar = "tag:yaml.org,2002:str" + yamlIntScalar = "tag:yaml.org,2002:int" + yamlBoolScalar = "tag:yaml.org,2002:bool" + yamlFloatScalar = "tag:yaml.org,2002:float" + yamlTimestamp = "tag:yaml.org,2002:timestamp" + yamlNull = "tag:yaml.org,2002:null" +) + +func yamlScalar(node *yaml.Node) (interface{}, error) { + switch node.LongTag() { + case yamlStringScalar: + return node.Value, nil + case yamlBoolScalar: + b, err := strconv.ParseBool(node.Value) + if err != nil { + return nil, fmt.Errorf("unable to process scalar node. Got %q. Expecting bool content: %w", node.Value, err) + } + return b, nil + case yamlIntScalar: + i, err := strconv.ParseInt(node.Value, 10, 64) + if err != nil { + return nil, fmt.Errorf("unable to process scalar node. Got %q. Expecting integer content: %w", node.Value, err) + } + return i, nil + case yamlFloatScalar: + f, err := strconv.ParseFloat(node.Value, 64) + if err != nil { + return nil, fmt.Errorf("unable to process scalar node. Got %q. Expecting float content: %w", node.Value, err) + } + return f, nil + case yamlTimestamp: + return node.Value, nil + case yamlNull: + return nil, nil + default: + return nil, fmt.Errorf("YAML tag %q is not supported", node.LongTag()) + } +} + +func yamlStringScalarC(node *yaml.Node) (string, error) { + if node.Kind != yaml.ScalarNode { + return "", fmt.Errorf("expecting a string scalar but got %q", node.Kind) + } + switch node.LongTag() { + case yamlStringScalar, yamlIntScalar, yamlFloatScalar: + return node.Value, nil + default: + return "", fmt.Errorf("YAML tag %q is not supported as map key", node.LongTag()) } - return document, nil } // JSONMapSlice represent a JSON object, with the order of keys maintained @@ -105,6 +215,113 @@ func (s *JSONMapSlice) UnmarshalEasyJSON(in *jlexer.Lexer) { *s = result } +func (s JSONMapSlice) MarshalYAML() (interface{}, error) { + var n yaml.Node + n.Kind = yaml.DocumentNode + var nodes []*yaml.Node + for _, item := range s { + nn, err := json2yaml(item.Value) + if err != nil { + return nil, err + } + ns := []*yaml.Node{ + { + Kind: yaml.ScalarNode, + Tag: yamlStringScalar, + Value: item.Key, + }, + nn, + } + nodes = append(nodes, ns...) + } + + n.Content = []*yaml.Node{ + { + Kind: yaml.MappingNode, + Content: nodes, + }, + } + + return yaml.Marshal(&n) +} + +func json2yaml(item interface{}) (*yaml.Node, error) { + switch val := item.(type) { + case JSONMapSlice: + var n yaml.Node + n.Kind = yaml.MappingNode + for i := range val { + childNode, err := json2yaml(&val[i].Value) + if err != nil { + return nil, err + } + n.Content = append(n.Content, &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlStringScalar, + Value: val[i].Key, + }, childNode) + } + return &n, nil + case map[string]interface{}: + var n yaml.Node + n.Kind = yaml.MappingNode + for k, v := range val { + childNode, err := json2yaml(v) + if err != nil { + return nil, err + } + n.Content = append(n.Content, &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlStringScalar, + Value: k, + }, childNode) + } + return &n, nil + case []interface{}: + var n yaml.Node + n.Kind = yaml.SequenceNode + for i := range val { + childNode, err := json2yaml(val[i]) + if err != nil { + return nil, err + } + n.Content = append(n.Content, childNode) + } + return &n, nil + case string: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlStringScalar, + Value: val, + }, nil + case float64: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlFloatScalar, + Value: strconv.FormatFloat(val, 'f', -1, 64), + }, nil + case int64: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlIntScalar, + Value: strconv.FormatInt(val, 10), + }, nil + case uint64: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlIntScalar, + Value: strconv.FormatUint(val, 10), + }, nil + case bool: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlBoolScalar, + Value: strconv.FormatBool(val), + }, nil + } + return nil, nil +} + // JSONMapItem represents the value of a key in a JSON object held by JSONMapSlice type JSONMapItem struct { Key string @@ -173,23 +390,10 @@ func transformData(input interface{}) (out interface{}, err error) { } switch in := input.(type) { - case yaml.MapSlice: - - o := make(JSONMapSlice, len(in)) - for i, mi := range in { - var nmi JSONMapItem - if nmi.Key, err = format(mi.Key); err != nil { - return nil, err - } - - v, ert := transformData(mi.Value) - if ert != nil { - return nil, ert - } - nmi.Value = v - o[i] = nmi - } - return o, nil + case yaml.Node: + return yamlNode(&in) + case *yaml.Node: + return yamlNode(in) case map[interface{}]interface{}: o := make(JSONMapSlice, 0, len(in)) for ke, va := range in { diff --git a/vendor/github.com/golang-jwt/jwt/v4/MIGRATION_GUIDE.md b/vendor/github.com/golang-jwt/jwt/v4/MIGRATION_GUIDE.md index 0b6214930..32966f598 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/MIGRATION_GUIDE.md +++ b/vendor/github.com/golang-jwt/jwt/v4/MIGRATION_GUIDE.md @@ -1,6 +1,6 @@ ## Migration Guide (v4.0.0) -Starting from [v4.0.0](https://github.com/golang-jwt/jwt/releases/tag/v4.0.0]), the import path will be: +Starting from [v4.0.0](https://github.com/golang-jwt/jwt/releases/tag/v4.0.0), the import path will be: "github.com/golang-jwt/jwt/v4" @@ -19,4 +19,4 @@ go mod tidy ## Older releases (before v3.2.0) -The original migration guide for older releases can be found at https://github.com/dgrijalva/jwt-go/blob/master/MIGRATION_GUIDE.md. \ No newline at end of file +The original migration guide for older releases can be found at https://github.com/dgrijalva/jwt-go/blob/master/MIGRATION_GUIDE.md. diff --git a/vendor/github.com/golang-jwt/jwt/v4/README.md b/vendor/github.com/golang-jwt/jwt/v4/README.md index 96fe3b978..f5d551ca8 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/README.md +++ b/vendor/github.com/golang-jwt/jwt/v4/README.md @@ -1,12 +1,12 @@ # jwt-go [![build](https://github.com/golang-jwt/jwt/actions/workflows/build.yml/badge.svg)](https://github.com/golang-jwt/jwt/actions/workflows/build.yml) -[![Go Reference](https://pkg.go.dev/badge/github.com/golang-jwt/jwt.svg)](https://pkg.go.dev/github.com/golang-jwt/jwt) +[![Go Reference](https://pkg.go.dev/badge/github.com/golang-jwt/jwt/v4.svg)](https://pkg.go.dev/github.com/golang-jwt/jwt/v4) A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](https://datatracker.ietf.org/doc/html/rfc7519). -Starting with [v4.0.0](https://github.com/golang-jwt/jwt/releases/tag/v4.0.0) this project adds Go module support, but maintains backwards compataibility with older `v3.x.y` tags and upstream `github.com/dgrijalva/jwt-go`. -See the `MIGRATION_GUIDE.md` for more information. +Starting with [v4.0.0](https://github.com/golang-jwt/jwt/releases/tag/v4.0.0) this project adds Go module support, but maintains backwards compatibility with older `v3.x.y` tags and upstream `github.com/dgrijalva/jwt-go`. +See the [`MIGRATION_GUIDE.md`](./MIGRATION_GUIDE.md) for more information. > After the original author of the library suggested migrating the maintenance of `jwt-go`, a dedicated team of open source maintainers decided to clone the existing library into this repository. See [dgrijalva/jwt-go#462](https://github.com/dgrijalva/jwt-go/issues/462) for a detailed discussion on this topic. @@ -36,9 +36,23 @@ The part in the middle is the interesting bit. It's called the Claims and conta This library supports the parsing and verification as well as the generation and signing of JWTs. Current supported signing algorithms are HMAC SHA, RSA, RSA-PSS, and ECDSA, though hooks are present for adding your own. +## Installation Guidelines + +1. To install the jwt package, you first need to have [Go](https://go.dev/doc/install) installed, then you can use the command below to add `jwt-go` as a dependency in your Go program. + +```sh +go get -u github.com/golang-jwt/jwt/v4 +``` + +2. Import it in your code: + +```go +import "github.com/golang-jwt/jwt/v4" +``` + ## Examples -See [the project documentation](https://pkg.go.dev/github.com/golang-jwt/jwt) for examples of usage: +See [the project documentation](https://pkg.go.dev/github.com/golang-jwt/jwt/v4) for examples of usage: * [Simple example of parsing and validating a token](https://pkg.go.dev/github.com/golang-jwt/jwt#example-Parse-Hmac) * [Simple example of building and signing a token](https://pkg.go.dev/github.com/golang-jwt/jwt#example-New-Hmac) @@ -46,13 +60,21 @@ See [the project documentation](https://pkg.go.dev/github.com/golang-jwt/jwt) fo ## Extensions -This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. +This library publishes all the necessary components for adding your own signing methods or key functions. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod` or provide a `jwt.Keyfunc`. + +A common use case would be integrating with different 3rd party signature providers, like key management services from various cloud providers or Hardware Security Modules (HSMs) or to implement additional standards. -Here's an example of an extension that integrates with multiple Google Cloud Platform signing tools (AppEngine, IAM API, Cloud KMS): https://github.com/someone1/gcp-jwt-go +| Extension | Purpose | Repo | +| --------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------ | +| GCP | Integrates with multiple Google Cloud Platform signing tools (AppEngine, IAM API, Cloud KMS) | https://github.com/someone1/gcp-jwt-go | +| AWS | Integrates with AWS Key Management Service, KMS | https://github.com/matelang/jwt-go-aws-kms | +| JWKS | Provides support for JWKS ([RFC 7517](https://datatracker.ietf.org/doc/html/rfc7517)) as a `jwt.Keyfunc` | https://github.com/MicahParks/keyfunc | + +*Disclaimer*: Unless otherwise specified, these integrations are maintained by third parties and should not be considered as a primary offer by any of the mentioned cloud providers ## Compliance -This library was last reviewed to comply with [RTF 7519](https://datatracker.ietf.org/doc/html/rfc7519) dated May 2015 with a few notable differences: +This library was last reviewed to comply with [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519) dated May 2015 with a few notable differences: * In order to protect against accidental use of [Unsecured JWTs](https://datatracker.ietf.org/doc/html/rfc7519#section-6), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key. @@ -91,6 +113,7 @@ Each signing method expects a different object type for its signing keys. See th * The [HMAC signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodHMAC) (`HS256`,`HS384`,`HS512`) expect `[]byte` values for signing and validation * The [RSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodRSA) (`RS256`,`RS384`,`RS512`) expect `*rsa.PrivateKey` for signing and `*rsa.PublicKey` for validation * The [ECDSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodECDSA) (`ES256`,`ES384`,`ES512`) expect `*ecdsa.PrivateKey` for signing and `*ecdsa.PublicKey` for validation +* The [EdDSA signing method](https://pkg.go.dev/github.com/golang-jwt/jwt#SigningMethodEd25519) (`Ed25519`) expect `ed25519.PrivateKey` for signing and `ed25519.PublicKey` for validation ### JWT and OAuth @@ -111,3 +134,5 @@ This library uses descriptive error messages whenever possible. If you are not g Documentation can be found [on pkg.go.dev](https://pkg.go.dev/github.com/golang-jwt/jwt). The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in the documentation. + +[golang-jwt](https://github.com/orgs/golang-jwt) incorporates a modified version of the JWT logo, which is distributed under the terms of the [MIT License](https://github.com/jsonwebtoken/jsonwebtoken.github.io/blob/master/LICENSE.txt). diff --git a/vendor/github.com/golang-jwt/jwt/v4/SECURITY.md b/vendor/github.com/golang-jwt/jwt/v4/SECURITY.md new file mode 100644 index 000000000..b08402c34 --- /dev/null +++ b/vendor/github.com/golang-jwt/jwt/v4/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +## Supported Versions + +As of February 2022 (and until this document is updated), the latest version `v4` is supported. + +## Reporting a Vulnerability + +If you think you found a vulnerability, and even if you are not sure, please report it to jwt-go-security@googlegroups.com or one of the other [golang-jwt maintainers](https://github.com/orgs/golang-jwt/people). Please try be explicit, describe steps to reproduce the security issue with code example(s). + +You will receive a response within a timely manner. If the issue is confirmed, we will do our best to release a patch as soon as possible given the complexity of the problem. + +## Public Discussions + +Please avoid publicly discussing a potential security vulnerability. + +Let's take this offline and find a solution first, this limits the potential impact as much as possible. + +We appreciate your help! diff --git a/vendor/github.com/golang-jwt/jwt/v4/claims.go b/vendor/github.com/golang-jwt/jwt/v4/claims.go index 7c2f33bcb..9d95cad2b 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/claims.go +++ b/vendor/github.com/golang-jwt/jwt/v4/claims.go @@ -12,9 +12,122 @@ type Claims interface { Valid() error } -// StandardClaims are a structured version of the Claims Section, as referenced at -// https://tools.ietf.org/html/rfc7519#section-4.1 -// See examples for how to use this with your own claim types +// RegisteredClaims are a structured version of the JWT Claims Set, +// restricted to Registered Claim Names, as referenced at +// https://datatracker.ietf.org/doc/html/rfc7519#section-4.1 +// +// This type can be used on its own, but then additional private and +// public claims embedded in the JWT will not be parsed. The typical usecase +// therefore is to embedded this in a user-defined claim type. +// +// See examples for how to use this with your own claim types. +type RegisteredClaims struct { + // the `iss` (Issuer) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.1 + Issuer string `json:"iss,omitempty"` + + // the `sub` (Subject) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.2 + Subject string `json:"sub,omitempty"` + + // the `aud` (Audience) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.3 + Audience ClaimStrings `json:"aud,omitempty"` + + // the `exp` (Expiration Time) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.4 + ExpiresAt *NumericDate `json:"exp,omitempty"` + + // the `nbf` (Not Before) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.5 + NotBefore *NumericDate `json:"nbf,omitempty"` + + // the `iat` (Issued At) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.6 + IssuedAt *NumericDate `json:"iat,omitempty"` + + // the `jti` (JWT ID) claim. See https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.7 + ID string `json:"jti,omitempty"` +} + +// Valid validates time based claims "exp, iat, nbf". +// There is no accounting for clock skew. +// As well, if any of the above claims are not in the token, it will still +// be considered a valid claim. +func (c RegisteredClaims) Valid() error { + vErr := new(ValidationError) + now := TimeFunc() + + // The claims below are optional, by default, so if they are set to the + // default value in Go, let's not fail the verification for them. + if !c.VerifyExpiresAt(now, false) { + delta := now.Sub(c.ExpiresAt.Time) + vErr.Inner = fmt.Errorf("%s by %s", ErrTokenExpired, delta) + vErr.Errors |= ValidationErrorExpired + } + + if !c.VerifyIssuedAt(now, false) { + vErr.Inner = ErrTokenUsedBeforeIssued + vErr.Errors |= ValidationErrorIssuedAt + } + + if !c.VerifyNotBefore(now, false) { + vErr.Inner = ErrTokenNotValidYet + vErr.Errors |= ValidationErrorNotValidYet + } + + if vErr.valid() { + return nil + } + + return vErr +} + +// VerifyAudience compares the aud claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (c *RegisteredClaims) VerifyAudience(cmp string, req bool) bool { + return verifyAud(c.Audience, cmp, req) +} + +// VerifyExpiresAt compares the exp claim against cmp (cmp < exp). +// If req is false, it will return true, if exp is unset. +func (c *RegisteredClaims) VerifyExpiresAt(cmp time.Time, req bool) bool { + if c.ExpiresAt == nil { + return verifyExp(nil, cmp, req) + } + + return verifyExp(&c.ExpiresAt.Time, cmp, req) +} + +// VerifyIssuedAt compares the iat claim against cmp (cmp >= iat). +// If req is false, it will return true, if iat is unset. +func (c *RegisteredClaims) VerifyIssuedAt(cmp time.Time, req bool) bool { + if c.IssuedAt == nil { + return verifyIat(nil, cmp, req) + } + + return verifyIat(&c.IssuedAt.Time, cmp, req) +} + +// VerifyNotBefore compares the nbf claim against cmp (cmp >= nbf). +// If req is false, it will return true, if nbf is unset. +func (c *RegisteredClaims) VerifyNotBefore(cmp time.Time, req bool) bool { + if c.NotBefore == nil { + return verifyNbf(nil, cmp, req) + } + + return verifyNbf(&c.NotBefore.Time, cmp, req) +} + +// VerifyIssuer compares the iss claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (c *RegisteredClaims) VerifyIssuer(cmp string, req bool) bool { + return verifyIss(c.Issuer, cmp, req) +} + +// StandardClaims are a structured version of the JWT Claims Set, as referenced at +// https://datatracker.ietf.org/doc/html/rfc7519#section-4. They do not follow the +// specification exactly, since they were based on an earlier draft of the +// specification and not updated. The main difference is that they only +// support integer-based date fields and singular audiences. This might lead to +// incompatibilities with other JWT implementations. The use of this is discouraged, instead +// the newer RegisteredClaims struct should be used. +// +// Deprecated: Use RegisteredClaims instead for a forward-compatible way to access registered claims in a struct. type StandardClaims struct { Audience string `json:"aud,omitempty"` ExpiresAt int64 `json:"exp,omitempty"` @@ -36,17 +149,17 @@ func (c StandardClaims) Valid() error { // default value in Go, let's not fail the verification for them. if !c.VerifyExpiresAt(now, false) { delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0)) - vErr.Inner = fmt.Errorf("token is expired by %v", delta) + vErr.Inner = fmt.Errorf("%s by %s", ErrTokenExpired, delta) vErr.Errors |= ValidationErrorExpired } if !c.VerifyIssuedAt(now, false) { - vErr.Inner = fmt.Errorf("Token used before issued") + vErr.Inner = ErrTokenUsedBeforeIssued vErr.Errors |= ValidationErrorIssuedAt } if !c.VerifyNotBefore(now, false) { - vErr.Inner = fmt.Errorf("token is not valid yet") + vErr.Inner = ErrTokenNotValidYet vErr.Errors |= ValidationErrorNotValidYet } @@ -63,16 +176,37 @@ func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool { return verifyAud([]string{c.Audience}, cmp, req) } -// VerifyExpiresAt compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset +// VerifyExpiresAt compares the exp claim against cmp (cmp < exp). +// If req is false, it will return true, if exp is unset. func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool { - return verifyExp(c.ExpiresAt, cmp, req) + if c.ExpiresAt == 0 { + return verifyExp(nil, time.Unix(cmp, 0), req) + } + + t := time.Unix(c.ExpiresAt, 0) + return verifyExp(&t, time.Unix(cmp, 0), req) } -// VerifyIssuedAt compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset +// VerifyIssuedAt compares the iat claim against cmp (cmp >= iat). +// If req is false, it will return true, if iat is unset. func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool { - return verifyIat(c.IssuedAt, cmp, req) + if c.IssuedAt == 0 { + return verifyIat(nil, time.Unix(cmp, 0), req) + } + + t := time.Unix(c.IssuedAt, 0) + return verifyIat(&t, time.Unix(cmp, 0), req) +} + +// VerifyNotBefore compares the nbf claim against cmp (cmp >= nbf). +// If req is false, it will return true, if nbf is unset. +func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool { + if c.NotBefore == 0 { + return verifyNbf(nil, time.Unix(cmp, 0), req) + } + + t := time.Unix(c.NotBefore, 0) + return verifyNbf(&t, time.Unix(cmp, 0), req) } // VerifyIssuer compares the iss claim against cmp. @@ -81,12 +215,6 @@ func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool { return verifyIss(c.Issuer, cmp, req) } -// VerifyNotBefore compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool { - return verifyNbf(c.NotBefore, cmp, req) -} - // ----- helpers func verifyAud(aud []string, cmp string, required bool) bool { @@ -112,18 +240,25 @@ func verifyAud(aud []string, cmp string, required bool) bool { return result } -func verifyExp(exp int64, now int64, required bool) bool { - if exp == 0 { +func verifyExp(exp *time.Time, now time.Time, required bool) bool { + if exp == nil { + return !required + } + return now.Before(*exp) +} + +func verifyIat(iat *time.Time, now time.Time, required bool) bool { + if iat == nil { return !required } - return now <= exp + return now.After(*iat) || now.Equal(*iat) } -func verifyIat(iat int64, now int64, required bool) bool { - if iat == 0 { +func verifyNbf(nbf *time.Time, now time.Time, required bool) bool { + if nbf == nil { return !required } - return now >= iat + return now.After(*nbf) || now.Equal(*nbf) } func verifyIss(iss string, cmp string, required bool) bool { @@ -136,10 +271,3 @@ func verifyIss(iss string, cmp string, required bool) bool { return false } } - -func verifyNbf(nbf int64, now int64, required bool) bool { - if nbf == 0 { - return !required - } - return now >= nbf -} diff --git a/vendor/github.com/golang-jwt/jwt/v4/ed25519.go b/vendor/github.com/golang-jwt/jwt/v4/ed25519.go index 9f40dc0c7..07d3aacd6 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/ed25519.go +++ b/vendor/github.com/golang-jwt/jwt/v4/ed25519.go @@ -3,7 +3,9 @@ package jwt import ( "errors" + "crypto" "crypto/ed25519" + "crypto/rand" ) var ( @@ -62,20 +64,22 @@ func (m *SigningMethodEd25519) Verify(signingString, signature string, key inter // Sign implements token signing for the SigningMethod. // For this signing method, key must be an ed25519.PrivateKey func (m *SigningMethodEd25519) Sign(signingString string, key interface{}) (string, error) { - var ed25519Key ed25519.PrivateKey + var ed25519Key crypto.Signer var ok bool - if ed25519Key, ok = key.(ed25519.PrivateKey); !ok { + if ed25519Key, ok = key.(crypto.Signer); !ok { return "", ErrInvalidKeyType } - // ed25519.Sign panics if private key not equal to ed25519.PrivateKeySize - // this allows to avoid recover usage - if len(ed25519Key) != ed25519.PrivateKeySize { + if _, ok := ed25519Key.Public().(ed25519.PublicKey); !ok { return "", ErrInvalidKey } // Sign the string and return the encoded result - sig := ed25519.Sign(ed25519Key, []byte(signingString)) + // ed25519 performs a two-pass hash as part of its algorithm. Therefore, we need to pass a non-prehashed message into the Sign function, as indicated by crypto.Hash(0) + sig, err := ed25519Key.Sign(rand.Reader, []byte(signingString), crypto.Hash(0)) + if err != nil { + return "", err + } return EncodeSegment(sig), nil } diff --git a/vendor/github.com/golang-jwt/jwt/v4/errors.go b/vendor/github.com/golang-jwt/jwt/v4/errors.go index f309878b3..10ac8835c 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/errors.go +++ b/vendor/github.com/golang-jwt/jwt/v4/errors.go @@ -9,6 +9,18 @@ var ( ErrInvalidKey = errors.New("key is invalid") ErrInvalidKeyType = errors.New("key is of invalid type") ErrHashUnavailable = errors.New("the requested hash function is unavailable") + + ErrTokenMalformed = errors.New("token is malformed") + ErrTokenUnverifiable = errors.New("token is unverifiable") + ErrTokenSignatureInvalid = errors.New("token signature is invalid") + + ErrTokenInvalidAudience = errors.New("token has invalid audience") + ErrTokenExpired = errors.New("token is expired") + ErrTokenUsedBeforeIssued = errors.New("token used before issued") + ErrTokenInvalidIssuer = errors.New("token has invalid issuer") + ErrTokenNotValidYet = errors.New("token is not valid yet") + ErrTokenInvalidId = errors.New("token has invalid id") + ErrTokenInvalidClaims = errors.New("token has invalid claims") ) // The errors that might occur when parsing and validating a token @@ -53,7 +65,48 @@ func (e ValidationError) Error() string { } } +// Unwrap gives errors.Is and errors.As access to the inner error. +func (e *ValidationError) Unwrap() error { + return e.Inner +} + // No errors func (e *ValidationError) valid() bool { return e.Errors == 0 } + +// Is checks if this ValidationError is of the supplied error. We are first checking for the exact error message +// by comparing the inner error message. If that fails, we compare using the error flags. This way we can use +// custom error messages (mainly for backwards compatability) and still leverage errors.Is using the global error variables. +func (e *ValidationError) Is(err error) bool { + // Check, if our inner error is a direct match + if errors.Is(errors.Unwrap(e), err) { + return true + } + + // Otherwise, we need to match using our error flags + switch err { + case ErrTokenMalformed: + return e.Errors&ValidationErrorMalformed != 0 + case ErrTokenUnverifiable: + return e.Errors&ValidationErrorUnverifiable != 0 + case ErrTokenSignatureInvalid: + return e.Errors&ValidationErrorSignatureInvalid != 0 + case ErrTokenInvalidAudience: + return e.Errors&ValidationErrorAudience != 0 + case ErrTokenExpired: + return e.Errors&ValidationErrorExpired != 0 + case ErrTokenUsedBeforeIssued: + return e.Errors&ValidationErrorIssuedAt != 0 + case ErrTokenInvalidIssuer: + return e.Errors&ValidationErrorIssuer != 0 + case ErrTokenNotValidYet: + return e.Errors&ValidationErrorNotValidYet != 0 + case ErrTokenInvalidId: + return e.Errors&ValidationErrorId != 0 + case ErrTokenInvalidClaims: + return e.Errors&ValidationErrorClaimsInvalid != 0 + } + + return false +} diff --git a/vendor/github.com/golang-jwt/jwt/v4/map_claims.go b/vendor/github.com/golang-jwt/jwt/v4/map_claims.go index 7e00e753d..2700d64a0 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/map_claims.go +++ b/vendor/github.com/golang-jwt/jwt/v4/map_claims.go @@ -3,6 +3,7 @@ package jwt import ( "encoding/json" "errors" + "time" // "fmt" ) @@ -31,65 +32,92 @@ func (m MapClaims) VerifyAudience(cmp string, req bool) bool { return verifyAud(aud, cmp, req) } -// VerifyExpiresAt compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset +// VerifyExpiresAt compares the exp claim against cmp (cmp <= exp). +// If req is false, it will return true, if exp is unset. func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool { - exp, ok := m["exp"] + cmpTime := time.Unix(cmp, 0) + + v, ok := m["exp"] if !ok { return !req } - switch expType := exp.(type) { + + switch exp := v.(type) { case float64: - return verifyExp(int64(expType), cmp, req) + if exp == 0 { + return verifyExp(nil, cmpTime, req) + } + + return verifyExp(&newNumericDateFromSeconds(exp).Time, cmpTime, req) case json.Number: - v, _ := expType.Int64() - return verifyExp(v, cmp, req) + v, _ := exp.Float64() + + return verifyExp(&newNumericDateFromSeconds(v).Time, cmpTime, req) } + return false } -// VerifyIssuedAt compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset +// VerifyIssuedAt compares the exp claim against cmp (cmp >= iat). +// If req is false, it will return true, if iat is unset. func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool { - iat, ok := m["iat"] + cmpTime := time.Unix(cmp, 0) + + v, ok := m["iat"] if !ok { return !req } - switch iatType := iat.(type) { + + switch iat := v.(type) { case float64: - return verifyIat(int64(iatType), cmp, req) + if iat == 0 { + return verifyIat(nil, cmpTime, req) + } + + return verifyIat(&newNumericDateFromSeconds(iat).Time, cmpTime, req) case json.Number: - v, _ := iatType.Int64() - return verifyIat(v, cmp, req) + v, _ := iat.Float64() + + return verifyIat(&newNumericDateFromSeconds(v).Time, cmpTime, req) } - return false -} -// VerifyIssuer compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuer(cmp string, req bool) bool { - iss, _ := m["iss"].(string) - return verifyIss(iss, cmp, req) + return false } -// VerifyNotBefore compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset +// VerifyNotBefore compares the nbf claim against cmp (cmp >= nbf). +// If req is false, it will return true, if nbf is unset. func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool { - nbf, ok := m["nbf"] + cmpTime := time.Unix(cmp, 0) + + v, ok := m["nbf"] if !ok { return !req } - switch nbfType := nbf.(type) { + + switch nbf := v.(type) { case float64: - return verifyNbf(int64(nbfType), cmp, req) + if nbf == 0 { + return verifyNbf(nil, cmpTime, req) + } + + return verifyNbf(&newNumericDateFromSeconds(nbf).Time, cmpTime, req) case json.Number: - v, _ := nbfType.Int64() - return verifyNbf(v, cmp, req) + v, _ := nbf.Float64() + + return verifyNbf(&newNumericDateFromSeconds(v).Time, cmpTime, req) } + return false } -// Valid calidates time based claims "exp, iat, nbf". +// VerifyIssuer compares the iss claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (m MapClaims) VerifyIssuer(cmp string, req bool) bool { + iss, _ := m["iss"].(string) + return verifyIss(iss, cmp, req) +} + +// Valid validates time based claims "exp, iat, nbf". // There is no accounting for clock skew. // As well, if any of the above claims are not in the token, it will still // be considered a valid claim. @@ -98,16 +126,19 @@ func (m MapClaims) Valid() error { now := TimeFunc().Unix() if !m.VerifyExpiresAt(now, false) { + // TODO(oxisto): this should be replaced with ErrTokenExpired vErr.Inner = errors.New("Token is expired") vErr.Errors |= ValidationErrorExpired } if !m.VerifyIssuedAt(now, false) { + // TODO(oxisto): this should be replaced with ErrTokenUsedBeforeIssued vErr.Inner = errors.New("Token used before issued") vErr.Errors |= ValidationErrorIssuedAt } if !m.VerifyNotBefore(now, false) { + // TODO(oxisto): this should be replaced with ErrTokenNotValidYet vErr.Inner = errors.New("Token is not valid yet") vErr.Errors |= ValidationErrorNotValidYet } diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser.go b/vendor/github.com/golang-jwt/jwt/v4/parser.go index 0c811f311..2f61a69d7 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/parser.go +++ b/vendor/github.com/golang-jwt/jwt/v4/parser.go @@ -8,14 +8,36 @@ import ( ) type Parser struct { - ValidMethods []string // If populated, only these methods will be considered valid - UseJSONNumber bool // Use JSON Number format in JSON decoder - SkipClaimsValidation bool // Skip claims validation during token parsing + // If populated, only these methods will be considered valid. + // + // Deprecated: In future releases, this field will not be exported anymore and should be set with an option to NewParser instead. + ValidMethods []string + + // Use JSON Number format in JSON decoder. + // + // Deprecated: In future releases, this field will not be exported anymore and should be set with an option to NewParser instead. + UseJSONNumber bool + + // Skip claims validation during token parsing. + // + // Deprecated: In future releases, this field will not be exported anymore and should be set with an option to NewParser instead. + SkipClaimsValidation bool } -// Parse parses, validates, and returns a token. +// NewParser creates a new Parser with the specified options +func NewParser(options ...ParserOption) *Parser { + p := &Parser{} + + // loop through our parsing options and apply them + for _, option := range options { + option(p) + } + + return p +} + +// Parse parses, validates, verifies the signature and returns the parsed token. // keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) } diff --git a/vendor/github.com/golang-jwt/jwt/v4/parser_option.go b/vendor/github.com/golang-jwt/jwt/v4/parser_option.go new file mode 100644 index 000000000..6ea6f9527 --- /dev/null +++ b/vendor/github.com/golang-jwt/jwt/v4/parser_option.go @@ -0,0 +1,29 @@ +package jwt + +// ParserOption is used to implement functional-style options that modify the behavior of the parser. To add +// new options, just create a function (ideally beginning with With or Without) that returns an anonymous function that +// takes a *Parser type as input and manipulates its configuration accordingly. +type ParserOption func(*Parser) + +// WithValidMethods is an option to supply algorithm methods that the parser will check. Only those methods will be considered valid. +// It is heavily encouraged to use this option in order to prevent attacks such as https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/. +func WithValidMethods(methods []string) ParserOption { + return func(p *Parser) { + p.ValidMethods = methods + } +} + +// WithJSONNumber is an option to configure the underlying JSON parser with UseNumber +func WithJSONNumber() ParserOption { + return func(p *Parser) { + p.UseJSONNumber = true + } +} + +// WithoutClaimsValidation is an option to disable claims validation. This option should only be used if you exactly know +// what you are doing. +func WithoutClaimsValidation() ParserOption { + return func(p *Parser) { + p.SkipClaimsValidation = true + } +} diff --git a/vendor/github.com/golang-jwt/jwt/v4/rsa_pss.go b/vendor/github.com/golang-jwt/jwt/v4/rsa_pss.go index 5a8502feb..4fd6f9e61 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/rsa_pss.go +++ b/vendor/github.com/golang-jwt/jwt/v4/rsa_pss.go @@ -1,3 +1,4 @@ +//go:build go1.4 // +build go1.4 package jwt diff --git a/vendor/github.com/golang-jwt/jwt/v4/signing_method.go b/vendor/github.com/golang-jwt/jwt/v4/signing_method.go index 3269170f3..241ae9c60 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/signing_method.go +++ b/vendor/github.com/golang-jwt/jwt/v4/signing_method.go @@ -33,3 +33,14 @@ func GetSigningMethod(alg string) (method SigningMethod) { } return } + +// GetAlgorithms returns a list of registered "alg" names +func GetAlgorithms() (algs []string) { + signingMethodLock.RLock() + defer signingMethodLock.RUnlock() + + for alg := range signingMethods { + algs = append(algs, alg) + } + return +} diff --git a/vendor/github.com/golang-jwt/jwt/v4/token.go b/vendor/github.com/golang-jwt/jwt/v4/token.go index b896acb0b..3cb0f3f0e 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/token.go +++ b/vendor/github.com/golang-jwt/jwt/v4/token.go @@ -7,6 +7,13 @@ import ( "time" ) +// DecodePaddingAllowed will switch the codec used for decoding JWTs respectively. Note that the JWS RFC7515 +// states that the tokens will utilize a Base64url encoding with no padding. Unfortunately, some implementations +// of JWT are producing non-standard tokens, and thus require support for decoding. Note that this is a global +// variable, and updating it will change the behavior on a package level, and is also NOT go-routine safe. +// To use the non-recommended decoding, set this boolean to `true` prior to using this package. +var DecodePaddingAllowed bool + // TimeFunc provides the current time when parsing token to validate "exp" claim (expiration time). // You can override it to use another time value. This is useful for testing or if your // server uses a different time zone than your tokens. @@ -29,11 +36,12 @@ type Token struct { Valid bool // Is the token valid? Populated when you Parse/Verify a token } -// New creates a new Token. Takes a signing method +// New creates a new Token with the specified signing method and an empty map of claims. func New(method SigningMethod) *Token { return NewWithClaims(method, MapClaims{}) } +// NewWithClaims creates a new Token with the specified signing method and claims. func NewWithClaims(method SigningMethod, claims Claims) *Token { return &Token{ Header: map[string]interface{}{ @@ -45,7 +53,8 @@ func NewWithClaims(method SigningMethod, claims Claims) *Token { } } -// SignedString retrieves the complete, signed token +// SignedString creates and returns a complete, signed JWT. +// The token is signed using the SigningMethod specified in the token. func (t *Token) SignedString(key interface{}) (string, error) { var sig, sstr string var err error @@ -64,33 +73,34 @@ func (t *Token) SignedString(key interface{}) (string, error) { // the SignedString. func (t *Token) SigningString() (string, error) { var err error - parts := make([]string, 2) - for i := range parts { - var jsonValue []byte - if i == 0 { - if jsonValue, err = json.Marshal(t.Header); err != nil { - return "", err - } - } else { - if jsonValue, err = json.Marshal(t.Claims); err != nil { - return "", err - } - } + var jsonValue []byte + + if jsonValue, err = json.Marshal(t.Header); err != nil { + return "", err + } + header := EncodeSegment(jsonValue) - parts[i] = EncodeSegment(jsonValue) + if jsonValue, err = json.Marshal(t.Claims); err != nil { + return "", err } - return strings.Join(parts, "."), nil + claim := EncodeSegment(jsonValue) + + return strings.Join([]string{header, claim}, "."), nil } -// Parse parses, validates, and returns a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return new(Parser).Parse(tokenString, keyFunc) +// Parse parses, validates, verifies the signature and returns the parsed token. +// keyFunc will receive the parsed token and should return the cryptographic key +// for verifying the signature. +// The caller is strongly encouraged to set the WithValidMethods option to +// validate the 'alg' claim in the token matches the expected algorithm. +// For more details about the importance of validating the 'alg' claim, +// see https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/ +func Parse(tokenString string, keyFunc Keyfunc, options ...ParserOption) (*Token, error) { + return NewParser(options...).Parse(tokenString, keyFunc) } -func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - return new(Parser).ParseWithClaims(tokenString, claims, keyFunc) +func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc, options ...ParserOption) (*Token, error) { + return NewParser(options...).ParseWithClaims(tokenString, claims, keyFunc) } // EncodeSegment encodes a JWT specific base64url encoding with padding stripped @@ -106,5 +116,12 @@ func EncodeSegment(seg []byte) string { // Deprecated: In a future release, we will demote this function to a non-exported function, since it // should only be used internally func DecodeSegment(seg string) ([]byte, error) { + if DecodePaddingAllowed { + if l := len(seg) % 4; l > 0 { + seg += strings.Repeat("=", 4-l) + } + return base64.URLEncoding.DecodeString(seg) + } + return base64.RawURLEncoding.DecodeString(seg) } diff --git a/vendor/github.com/golang-jwt/jwt/v4/types.go b/vendor/github.com/golang-jwt/jwt/v4/types.go new file mode 100644 index 000000000..ac8e140eb --- /dev/null +++ b/vendor/github.com/golang-jwt/jwt/v4/types.go @@ -0,0 +1,145 @@ +package jwt + +import ( + "encoding/json" + "fmt" + "math" + "reflect" + "strconv" + "time" +) + +// TimePrecision sets the precision of times and dates within this library. +// This has an influence on the precision of times when comparing expiry or +// other related time fields. Furthermore, it is also the precision of times +// when serializing. +// +// For backwards compatibility the default precision is set to seconds, so that +// no fractional timestamps are generated. +var TimePrecision = time.Second + +// MarshalSingleStringAsArray modifies the behaviour of the ClaimStrings type, especially +// its MarshalJSON function. +// +// If it is set to true (the default), it will always serialize the type as an +// array of strings, even if it just contains one element, defaulting to the behaviour +// of the underlying []string. If it is set to false, it will serialize to a single +// string, if it contains one element. Otherwise, it will serialize to an array of strings. +var MarshalSingleStringAsArray = true + +// NumericDate represents a JSON numeric date value, as referenced at +// https://datatracker.ietf.org/doc/html/rfc7519#section-2. +type NumericDate struct { + time.Time +} + +// NewNumericDate constructs a new *NumericDate from a standard library time.Time struct. +// It will truncate the timestamp according to the precision specified in TimePrecision. +func NewNumericDate(t time.Time) *NumericDate { + return &NumericDate{t.Truncate(TimePrecision)} +} + +// newNumericDateFromSeconds creates a new *NumericDate out of a float64 representing a +// UNIX epoch with the float fraction representing non-integer seconds. +func newNumericDateFromSeconds(f float64) *NumericDate { + round, frac := math.Modf(f) + return NewNumericDate(time.Unix(int64(round), int64(frac*1e9))) +} + +// MarshalJSON is an implementation of the json.RawMessage interface and serializes the UNIX epoch +// represented in NumericDate to a byte array, using the precision specified in TimePrecision. +func (date NumericDate) MarshalJSON() (b []byte, err error) { + var prec int + if TimePrecision < time.Second { + prec = int(math.Log10(float64(time.Second) / float64(TimePrecision))) + } + truncatedDate := date.Truncate(TimePrecision) + + // For very large timestamps, UnixNano would overflow an int64, but this + // function requires nanosecond level precision, so we have to use the + // following technique to get round the issue: + // 1. Take the normal unix timestamp to form the whole number part of the + // output, + // 2. Take the result of the Nanosecond function, which retuns the offset + // within the second of the particular unix time instance, to form the + // decimal part of the output + // 3. Concatenate them to produce the final result + seconds := strconv.FormatInt(truncatedDate.Unix(), 10) + nanosecondsOffset := strconv.FormatFloat(float64(truncatedDate.Nanosecond())/float64(time.Second), 'f', prec, 64) + + output := append([]byte(seconds), []byte(nanosecondsOffset)[1:]...) + + return output, nil +} + +// UnmarshalJSON is an implementation of the json.RawMessage interface and deserializses a +// NumericDate from a JSON representation, i.e. a json.Number. This number represents an UNIX epoch +// with either integer or non-integer seconds. +func (date *NumericDate) UnmarshalJSON(b []byte) (err error) { + var ( + number json.Number + f float64 + ) + + if err = json.Unmarshal(b, &number); err != nil { + return fmt.Errorf("could not parse NumericData: %w", err) + } + + if f, err = number.Float64(); err != nil { + return fmt.Errorf("could not convert json number value to float: %w", err) + } + + n := newNumericDateFromSeconds(f) + *date = *n + + return nil +} + +// ClaimStrings is basically just a slice of strings, but it can be either serialized from a string array or just a string. +// This type is necessary, since the "aud" claim can either be a single string or an array. +type ClaimStrings []string + +func (s *ClaimStrings) UnmarshalJSON(data []byte) (err error) { + var value interface{} + + if err = json.Unmarshal(data, &value); err != nil { + return err + } + + var aud []string + + switch v := value.(type) { + case string: + aud = append(aud, v) + case []string: + aud = ClaimStrings(v) + case []interface{}: + for _, vv := range v { + vs, ok := vv.(string) + if !ok { + return &json.UnsupportedTypeError{Type: reflect.TypeOf(vv)} + } + aud = append(aud, vs) + } + case nil: + return nil + default: + return &json.UnsupportedTypeError{Type: reflect.TypeOf(v)} + } + + *s = aud + + return +} + +func (s ClaimStrings) MarshalJSON() (b []byte, err error) { + // This handles a special case in the JWT RFC. If the string array, e.g. used by the "aud" field, + // only contains one element, it MAY be serialized as a single string. This may or may not be + // desired based on the ecosystem of other JWT library used, so we make it configurable by the + // variable MarshalSingleStringAsArray. + if len(s) == 1 && !MarshalSingleStringAsArray { + return json.Marshal(s[0]) + } + + return json.Marshal([]string(s)) +} diff --git a/vendor/github.com/google/cel-go/cel/BUILD.bazel b/vendor/github.com/google/cel-go/cel/BUILD.bazel index b43beedc4..e973abfc5 100644 --- a/vendor/github.com/google/cel-go/cel/BUILD.bazel +++ b/vendor/github.com/google/cel-go/cel/BUILD.bazel @@ -8,9 +8,11 @@ go_library( name = "go_default_library", srcs = [ "cel.go", + "decls.go", "env.go", "io.go", "library.go", + "macro.go", "options.go", "program.go", ], @@ -21,6 +23,7 @@ go_library( "//checker/decls:go_default_library", "//common:go_default_library", "//common/containers:go_default_library", + "//common/overloads:go_default_library", "//common/types:go_default_library", "//common/types/pb:go_default_library", "//common/types/ref:go_default_library", @@ -44,7 +47,10 @@ go_library( go_test( name = "go_default_test", srcs = [ + "cel_example_test.go", "cel_test.go", + "decls_test.go", + "env_test.go", "io_test.go", ], data = [ @@ -54,18 +60,17 @@ go_test( ":go_default_library", ], deps = [ - "//checker/decls:go_default_library", "//common/operators:go_default_library", "//common/overloads:go_default_library", "//common/types:go_default_library", "//common/types/ref:go_default_library", "//common/types/traits:go_default_library", - "//interpreter/functions:go_default_library", "//test:go_default_library", "//test/proto2pb:go_default_library", "//test/proto3pb:go_default_library", "@io_bazel_rules_go//proto/wkt:descriptor_go_proto", "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/structpb:go_default_library", ], ) diff --git a/vendor/github.com/google/cel-go/cel/decls.go b/vendor/github.com/google/cel-go/cel/decls.go new file mode 100644 index 000000000..f2df721d0 --- /dev/null +++ b/vendor/github.com/google/cel-go/cel/decls.go @@ -0,0 +1,1179 @@ +// Copyright 2022 Google LLC +// +// 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 cel + +import ( + "fmt" + "strings" + + "github.com/google/cel-go/checker/decls" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" + "github.com/google/cel-go/interpreter/functions" + + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" +) + +// Kind indicates a CEL type's kind which is used to differentiate quickly between simple and complex types. +type Kind uint + +const ( + // DynKind represents a dynamic type. This kind only exists at type-check time. + DynKind Kind = iota + + // AnyKind represents a google.protobuf.Any type. This kind only exists at type-check time. + AnyKind + + // BoolKind represents a boolean type. + BoolKind + + // BytesKind represents a bytes type. + BytesKind + + // DoubleKind represents a double type. + DoubleKind + + // DurationKind represents a CEL duration type. + DurationKind + + // IntKind represents an integer type. + IntKind + + // ListKind represents a list type. + ListKind + + // MapKind represents a map type. + MapKind + + // NullTypeKind represents a null type. + NullTypeKind + + // OpaqueKind represents an abstract type which has no accessible fields. + OpaqueKind + + // StringKind represents a string type. + StringKind + + // StructKind represents a structured object with typed fields. + StructKind + + // TimestampKind represents a a CEL time type. + TimestampKind + + // TypeKind represents the CEL type. + TypeKind + + // TypeParamKind represents a parameterized type whose type name will be resolved at type-check time, if possible. + TypeParamKind + + // UintKind represents a uint type. + UintKind +) + +var ( + // AnyType represents the google.protobuf.Any type. + AnyType = &Type{ + kind: AnyKind, + runtimeType: types.NewTypeValue("google.protobuf.Any"), + } + // BoolType represents the bool type. + BoolType = &Type{ + kind: BoolKind, + runtimeType: types.BoolType, + } + // BytesType represents the bytes type. + BytesType = &Type{ + kind: BytesKind, + runtimeType: types.BytesType, + } + // DoubleType represents the double type. + DoubleType = &Type{ + kind: DoubleKind, + runtimeType: types.DoubleType, + } + // DurationType represents the CEL duration type. + DurationType = &Type{ + kind: DurationKind, + runtimeType: types.DurationType, + } + // DynType represents a dynamic CEL type whose type will be determined at runtime from context. + DynType = &Type{ + kind: DynKind, + runtimeType: types.NewTypeValue("dyn"), + } + // IntType represents the int type. + IntType = &Type{ + kind: IntKind, + runtimeType: types.IntType, + } + // NullType represents the type of a null value. + NullType = &Type{ + kind: NullTypeKind, + runtimeType: types.NullType, + } + // StringType represents the string type. + StringType = &Type{ + kind: StringKind, + runtimeType: types.StringType, + } + // TimestampType represents the time type. + TimestampType = &Type{ + kind: TimestampKind, + runtimeType: types.TimestampType, + } + // TypeType represents a CEL type + TypeType = &Type{ + kind: TypeKind, + runtimeType: types.TypeType, + } + //UintType represents a uint type. + UintType = &Type{ + kind: UintKind, + runtimeType: types.UintType, + } +) + +// Type holds a reference to a runtime type with an optional type-checked set of type parameters. +type Type struct { + // kind indicates general category of the type. + kind Kind + + // runtimeType is the runtime type of the declaration. + runtimeType ref.Type + + // parameters holds the optional type-checked set of type parameters that are used during static analysis. + parameters []*Type + + // isAssignableType function determines whether one type is assignable to this type. + // A nil value for the isAssignableType function falls back to equality of kind, runtimeType, and parameters. + isAssignableType func(other *Type) bool + + // isAssignableRuntimeType function determines whether the runtime type (with erasure) is assignable to this type. + // A nil value for the isAssignableRuntimeType function falls back to the equality of the type or type name. + isAssignableRuntimeType func(other ref.Val) bool +} + +// IsAssignableType determines whether the current type is type-check assignable from the input fromType. +func (t *Type) IsAssignableType(fromType *Type) bool { + if t.isAssignableType != nil { + return t.isAssignableType(fromType) + } + return t.defaultIsAssignableType(fromType) +} + +// IsAssignableRuntimeType determines whether the current type is runtime assignable from the input runtimeType. +// +// At runtime, parameterized types are erased and so a function which type-checks to support a map(string, string) +// will have a runtime assignable type of a map. +func (t *Type) IsAssignableRuntimeType(val ref.Val) bool { + if t.isAssignableRuntimeType != nil { + return t.isAssignableRuntimeType(val) + } + return t.defaultIsAssignableRuntimeType(val) +} + +// String returns a human-readable definition of the type name. +func (t *Type) String() string { + if len(t.parameters) == 0 { + return t.runtimeType.TypeName() + } + params := make([]string, len(t.parameters)) + for i, p := range t.parameters { + params[i] = p.String() + } + return fmt.Sprintf("%s(%s)", t.runtimeType.TypeName(), strings.Join(params, ", ")) +} + +// isDyn indicates whether the type is dynamic in any way. +func (t *Type) isDyn() bool { + return t.kind == DynKind || t.kind == AnyKind || t.kind == TypeParamKind +} + +// equals indicates whether two types have the same kind, type name, and parameters. +func (t *Type) equals(other *Type) bool { + if t.kind != other.kind || + t.runtimeType.TypeName() != other.runtimeType.TypeName() || + len(t.parameters) != len(other.parameters) { + return false + } + for i, p := range t.parameters { + if !p.equals(other.parameters[i]) { + return false + } + } + return true +} + +// defaultIsAssignableType provides the standard definition of what it means for one type to be assignable to another +// where any of the following may return a true result: +// - The from types are the same instance +// - The target type is dynamic +// - The fromType has the same kind and type name as the target type, and all parameters of the target type +// are IsAssignableType() from the parameters of the fromType. +func (t *Type) defaultIsAssignableType(fromType *Type) bool { + if t == fromType || t.isDyn() { + return true + } + if t.kind != fromType.kind || + t.runtimeType.TypeName() != fromType.runtimeType.TypeName() || + len(t.parameters) != len(fromType.parameters) { + return false + } + for i, tp := range t.parameters { + fp := fromType.parameters[i] + if !tp.IsAssignableType(fp) { + return false + } + } + return true +} + +// defaultIsAssignableRuntimeType inspects the type and in the case of list and map elements, the key and element types +// to determine whether a ref.Val is assignable to the declared type for a function signature. +func (t *Type) defaultIsAssignableRuntimeType(val ref.Val) bool { + valType := val.Type() + if !(t.runtimeType == valType || t.isDyn() || t.runtimeType.TypeName() == valType.TypeName()) { + return false + } + switch t.runtimeType { + case types.ListType: + elemType := t.parameters[0] + l := val.(traits.Lister) + if l.Size() == types.IntZero { + return true + } + it := l.Iterator() + for it.HasNext() == types.True { + elemVal := it.Next() + return elemType.IsAssignableRuntimeType(elemVal) + } + case types.MapType: + keyType := t.parameters[0] + elemType := t.parameters[1] + m := val.(traits.Mapper) + if m.Size() == types.IntZero { + return true + } + it := m.Iterator() + for it.HasNext() == types.True { + keyVal := it.Next() + elemVal := m.Get(keyVal) + return keyType.IsAssignableRuntimeType(keyVal) && elemType.IsAssignableRuntimeType(elemVal) + } + } + return true +} + +// ListType creates an instances of a list type value with the provided element type. +func ListType(elemType *Type) *Type { + return &Type{ + kind: ListKind, + runtimeType: types.ListType, + parameters: []*Type{elemType}, + } +} + +// MapType creates an instance of a map type value with the provided key and value types. +func MapType(keyType, valueType *Type) *Type { + return &Type{ + kind: MapKind, + runtimeType: types.MapType, + parameters: []*Type{keyType, valueType}, + } +} + +// NullableType creates an instance of a nullable type with the provided wrapped type. +// +// Note: only primitive types are supported as wrapped types. +func NullableType(wrapped *Type) *Type { + return &Type{ + kind: wrapped.kind, + runtimeType: wrapped.runtimeType, + parameters: wrapped.parameters, + isAssignableType: func(other *Type) bool { + return NullType.IsAssignableType(other) || wrapped.IsAssignableType(other) + }, + isAssignableRuntimeType: func(other ref.Val) bool { + return NullType.IsAssignableRuntimeType(other) || wrapped.IsAssignableRuntimeType(other) + }, + } +} + +// OpaqueType creates an abstract parameterized type with a given name. +func OpaqueType(name string, params ...*Type) *Type { + return &Type{ + kind: OpaqueKind, + runtimeType: types.NewTypeValue(name), + parameters: params, + } +} + +// ObjectType creates a type references to an externally defined type, e.g. a protobuf message type. +func ObjectType(typeName string) *Type { + return &Type{ + kind: StructKind, + runtimeType: types.NewObjectTypeValue(typeName), + } +} + +// TypeParamType creates a parameterized type instance. +func TypeParamType(paramName string) *Type { + return &Type{ + kind: TypeParamKind, + runtimeType: types.NewTypeValue(paramName), + } +} + +// Variable creates an instance of a variable declaration with a variable name and type. +func Variable(name string, t *Type) EnvOption { + return func(e *Env) (*Env, error) { + et, err := TypeToExprType(t) + if err != nil { + return nil, err + } + e.declarations = append(e.declarations, decls.NewVar(name, et)) + return e, nil + } +} + +// Function defines a function and overloads with optional singleton or per-overload bindings. +// +// Using Function is roughly equivalent to calling Declarations() to declare the function signatures +// and Functions() to define the function bindings, if they have been defined. Specifying the +// same function name more than once will result in the aggregation of the function overloads. If any +// signatures conflict between the existing and new function definition an error will be raised. +// However, if the signatures are identical and the overload ids are the same, the redefinition will +// be considered a no-op. +// +// One key difference with using Function() is that each FunctionDecl provided will handle dynamic +// dispatch based on the type-signatures of the overloads provided which means overload resolution at +// runtime is handled out of the box rather than via a custom binding for overload resolution via +// Functions(): +// +// - Overloads are searched in the order they are declared +// - Dynamic dispatch for lists and maps is limited by inspection of the list and map contents +// at runtime. Empty lists and maps will result in a 'default dispatch' +// - In the event that a default dispatch occurs, the first overload provided is the one invoked +// +// If you intend to use overloads which differentiate based on the key or element type of a list or +// map, consider using a generic function instead: e.g. func(list(T)) or func(map(K, V)) as this +// will allow your implementation to determine how best to handle dispatch and the default behavior +// for empty lists and maps whose contents cannot be inspected. +// +// For functions which use parameterized opaque types (abstract types), consider using a singleton +// function which is capable of inspecting the contents of the type and resolving the appropriate +// overload as CEL can only make inferences by type-name regarding such types. +func Function(name string, opts ...FunctionOpt) EnvOption { + return func(e *Env) (*Env, error) { + fn := &functionDecl{ + name: name, + overloads: []*overloadDecl{}, + options: opts, + } + err := fn.init() + if err != nil { + return nil, err + } + _, err = functionDeclToExprDecl(fn) + if err != nil { + return nil, err + } + if existing, found := e.functions[fn.name]; found { + fn, err = existing.merge(fn) + if err != nil { + return nil, err + } + } + e.functions[name] = fn + return e, nil + } +} + +// FunctionOpt defines a functional option for configuring a function declaration. +type FunctionOpt func(*functionDecl) (*functionDecl, error) + +// SingletonUnaryBinding creates a singleton function defintion to be used for all function overloads. +// +// Note, this approach works well if operand is expected to have a specific trait which it implements, +// e.g. traits.ContainerType. Otherwise, prefer per-overload function bindings. +func SingletonUnaryBinding(fn functions.UnaryOp, traits ...int) FunctionOpt { + trait := 0 + for _, t := range traits { + trait = trait | t + } + return func(f *functionDecl) (*functionDecl, error) { + if f.singleton != nil { + return nil, fmt.Errorf("function already has a singleton binding: %s", f.name) + } + f.singleton = &functions.Overload{ + Operator: f.name, + Unary: fn, + OperandTrait: trait, + } + return f, nil + } +} + +// SingletonBinaryImpl creates a singleton function definition to be used with all function overloads. +// +// Note, this approach works well if operand is expected to have a specific trait which it implements, +// e.g. traits.ContainerType. Otherwise, prefer per-overload function bindings. +func SingletonBinaryImpl(fn functions.BinaryOp, traits ...int) FunctionOpt { + trait := 0 + for _, t := range traits { + trait = trait | t + } + return func(f *functionDecl) (*functionDecl, error) { + if f.singleton != nil { + return nil, fmt.Errorf("function already has a singleton binding: %s", f.name) + } + f.singleton = &functions.Overload{ + Operator: f.name, + Binary: fn, + OperandTrait: trait, + } + return f, nil + } +} + +// SingletonFunctionImpl creates a singleton function definition to be used with all function overloads. +// +// Note, this approach works well if operand is expected to have a specific trait which it implements, +// e.g. traits.ContainerType. Otherwise, prefer per-overload function bindings. +func SingletonFunctionImpl(fn functions.FunctionOp, traits ...int) FunctionOpt { + trait := 0 + for _, t := range traits { + trait = trait | t + } + return func(f *functionDecl) (*functionDecl, error) { + if f.singleton != nil { + return nil, fmt.Errorf("function already has a singleton binding: %s", f.name) + } + f.singleton = &functions.Overload{ + Operator: f.name, + Function: fn, + OperandTrait: trait, + } + return f, nil + } +} + +// Overload defines a new global overload with an overload id, argument types, and result type. Through the +// use of OverloadOpt options, the overload may also be configured with a binding, an operand trait, and to +// be non-strict. +// +// Note: function bindings should be commonly configured with Overload instances whereas operand traits and +// strict-ness should be rare occurrences. +func Overload(overloadID string, args []*Type, resultType *Type, opts ...OverloadOpt) FunctionOpt { + return newOverload(overloadID, false, args, resultType, opts...) +} + +// MemberOverload defines a new receiver-style overload (or member function) with an overload id, argument types, +// and result type. Through the use of OverloadOpt options, the overload may also be configured with a binding, +// an operand trait, and to be non-strict. +// +// Note: function bindings should be commonly configured with Overload instances whereas operand traits and +// strict-ness should be rare occurrences. +func MemberOverload(overloadID string, args []*Type, resultType *Type, opts ...OverloadOpt) FunctionOpt { + return newOverload(overloadID, true, args, resultType, opts...) +} + +// OverloadOpt is a functional option for configuring a function overload. +type OverloadOpt func(*overloadDecl) (*overloadDecl, error) + +// UnaryBinding provides the implementation of a unary overload. The provided function is protected by a runtime +// type-guard which ensures runtime type agreement between the overload signature and runtime argument types. +func UnaryBinding(binding functions.UnaryOp) OverloadOpt { + return func(o *overloadDecl) (*overloadDecl, error) { + if o.hasBinding() { + return nil, fmt.Errorf("overload already has a binding: %s", o.id) + } + if len(o.argTypes) != 1 { + return nil, fmt.Errorf("unary function bound to non-unary overload: %s", o.id) + } + o.unaryOp = binding + return o, nil + } +} + +// BinaryBinding provides the implementation of a binary overload. The provided function is protected by a runtime +// type-guard which ensures runtime type agreement between the overload signature and runtime argument types. +func BinaryBinding(binding functions.BinaryOp) OverloadOpt { + return func(o *overloadDecl) (*overloadDecl, error) { + if o.hasBinding() { + return nil, fmt.Errorf("overload already has a binding: %s", o.id) + } + if len(o.argTypes) != 2 { + return nil, fmt.Errorf("binary function bound to non-binary overload: %s", o.id) + } + o.binaryOp = binding + return o, nil + } +} + +// FunctionBinding provides the implementation of a variadic overload. The provided function is protected by a runtime +// type-guard which ensures runtime type agreement between the overload signature and runtime argument types. +func FunctionBinding(binding functions.FunctionOp) OverloadOpt { + return func(o *overloadDecl) (*overloadDecl, error) { + if o.hasBinding() { + return nil, fmt.Errorf("overload already has a binding: %s", o.id) + } + o.functionOp = binding + return o, nil + } +} + +// OverloadIsNonStrict enables the function to be called with error and unknown argument values. +// +// Note: do not use this option unless absoluately necessary as it should be an uncommon feature. +func OverloadIsNonStrict() OverloadOpt { + return func(o *overloadDecl) (*overloadDecl, error) { + o.nonStrict = true + return o, nil + } +} + +// OverloadOperandTrait configures a set of traits which the first argument to the overload must implement in order to be +// successfully invoked. +func OverloadOperandTrait(trait int) OverloadOpt { + return func(o *overloadDecl) (*overloadDecl, error) { + o.operandTrait = trait + return o, nil + } +} + +type functionDecl struct { + name string + overloads []*overloadDecl + options []FunctionOpt + singleton *functions.Overload + initialized bool +} + +// init ensures that a function's options have been applied. +// +// This function is used in both the environment configuration and internally for function merges. +func (f *functionDecl) init() error { + if f.initialized { + return nil + } + f.initialized = true + + var err error + for _, opt := range f.options { + f, err = opt(f) + if err != nil { + return err + } + } + if len(f.overloads) == 0 { + return fmt.Errorf("function %s must have at least one overload", f.name) + } + return nil +} + +// bindings produces a set of function bindings, if any are defined. +func (f *functionDecl) bindings() ([]*functions.Overload, error) { + overloads := []*functions.Overload{} + nonStrict := false + for _, o := range f.overloads { + if o.hasBinding() { + overload := &functions.Overload{ + Operator: o.id, + Unary: o.guardedUnaryOp(f.name), + Binary: o.guardedBinaryOp(f.name), + Function: o.guardedFunctionOp(f.name), + OperandTrait: o.operandTrait, + NonStrict: o.nonStrict, + } + overloads = append(overloads, overload) + nonStrict = nonStrict || o.nonStrict + } + } + if f.singleton != nil { + if len(overloads) != 0 { + return nil, fmt.Errorf("singleton function incompatible with specialized overloads: %s", f.name) + } + return []*functions.Overload{ + { + Operator: f.name, + Unary: f.singleton.Unary, + Binary: f.singleton.Binary, + Function: f.singleton.Function, + OperandTrait: f.singleton.OperandTrait, + }, + }, nil + } + if len(overloads) == 0 { + return overloads, nil + } + // Single overload. Replicate an entry for it using the function name as well. + if len(overloads) == 1 { + if overloads[0].Operator == f.name { + return overloads, nil + } + return append(overloads, &functions.Overload{ + Operator: f.name, + Unary: overloads[0].Unary, + Binary: overloads[0].Binary, + Function: overloads[0].Function, + NonStrict: overloads[0].NonStrict, + OperandTrait: overloads[0].OperandTrait, + }), nil + } + // All of the defined overloads are wrapped into a top-level function which + // performs dynamic dispatch to the proper overload based on the argument types. + bindings := append([]*functions.Overload{}, overloads...) + funcDispatch := func(args ...ref.Val) ref.Val { + for _, o := range f.overloads { + if !o.matchesRuntimeSignature(args...) { + continue + } + switch len(args) { + case 1: + if o.unaryOp != nil { + return o.unaryOp(args[0]) + } + case 2: + if o.binaryOp != nil { + return o.binaryOp(args[0], args[1]) + } + } + if o.functionOp != nil { + return o.functionOp(args...) + } + // eventually this will fall through to the noSuchOverload below. + } + return noSuchOverload(f.name, args...) + } + function := &functions.Overload{ + Operator: f.name, + Function: funcDispatch, + NonStrict: nonStrict, + } + return append(bindings, function), nil +} + +// merge one function declaration with another. +// +// If a function is extended, by say adding new overloads to an existing function, then it is merged with the +// prior definition of the function at which point its overloads must not collide with pre-existing overloads +// and its bindings (singleton, or per-overload) must not conflict with previous definitions either. +func (f *functionDecl) merge(other *functionDecl) (*functionDecl, error) { + if f.name != other.name { + return nil, fmt.Errorf("cannot merge unrelated functions. %s and %s", f.name, other.name) + } + err := f.init() + if err != nil { + return nil, err + } + err = other.init() + if err != nil { + return nil, err + } + merged := &functionDecl{ + name: f.name, + overloads: make([]*overloadDecl, len(f.overloads)), + options: []FunctionOpt{}, + initialized: true, + singleton: f.singleton, + } + copy(merged.overloads, f.overloads) + for _, o := range other.overloads { + err := merged.addOverload(o) + if err != nil { + return nil, fmt.Errorf("function declaration merge failed: %v", err) + } + } + if other.singleton != nil { + if merged.singleton != nil { + return nil, fmt.Errorf("function already has a binding: %s", f.name) + } + merged.singleton = other.singleton + } + return merged, nil +} + +// addOverload ensures that the new overload does not collide with an existing overload signature; +// however, if the function signatures are identical, the implementation may be rewritten as its +// difficult to compare functions by object identity. +func (f *functionDecl) addOverload(overload *overloadDecl) error { + for index, o := range f.overloads { + if o.id != overload.id && o.signatureOverlaps(overload) { + return fmt.Errorf("overload signature collision in function %s: %s collides with %s", f.name, o.id, overload.id) + } + if o.id == overload.id { + if o.signatureEquals(overload) && o.nonStrict == overload.nonStrict { + // Allow redefinition of an overload implementation so long as the signatures match. + f.overloads[index] = overload + return nil + } else { + return fmt.Errorf("overload redefinition in function. %s: %s has multiple definitions", f.name, o.id) + } + } + } + f.overloads = append(f.overloads, overload) + return nil +} + +func noSuchOverload(funcName string, args ...ref.Val) ref.Val { + argTypes := make([]string, len(args)) + for i, arg := range args { + argTypes[i] = arg.Type().TypeName() + } + signature := strings.Join(argTypes, ", ") + return types.NewErr("no such overload: %s(%s)", funcName, signature) +} + +// overloadDecl contains all of the relevant information regarding a specific function overload. +type overloadDecl struct { + id string + argTypes []*Type + resultType *Type + memberFunction bool + + // binding options, optional but encouraged. + unaryOp functions.UnaryOp + binaryOp functions.BinaryOp + functionOp functions.FunctionOp + + // behavioral options, uncommon + nonStrict bool + operandTrait int +} + +func (o *overloadDecl) hasBinding() bool { + return o.unaryOp != nil || o.binaryOp != nil || o.functionOp != nil +} + +// guardedUnaryOp creates an invocation guard around the provided unary operator, if one is defined. +func (o *overloadDecl) guardedUnaryOp(funcName string) functions.UnaryOp { + if o.unaryOp == nil { + return nil + } + return func(arg ref.Val) ref.Val { + if !o.matchesRuntimeUnarySignature(arg) { + return noSuchOverload(funcName, arg) + } + return o.unaryOp(arg) + } +} + +// guardedBinaryOp creates an invocation guard around the provided binary operator, if one is defined. +func (o *overloadDecl) guardedBinaryOp(funcName string) functions.BinaryOp { + if o.binaryOp == nil { + return nil + } + return func(arg1, arg2 ref.Val) ref.Val { + if !o.matchesRuntimeBinarySignature(arg1, arg2) { + return noSuchOverload(funcName, arg1, arg2) + } + return o.binaryOp(arg1, arg2) + } +} + +// guardedFunctionOp creates an invocation guard around the provided variadic function binding, if one is provided. +func (o *overloadDecl) guardedFunctionOp(funcName string) functions.FunctionOp { + if o.functionOp == nil { + return nil + } + return func(args ...ref.Val) ref.Val { + if !o.matchesRuntimeSignature(args...) { + return noSuchOverload(funcName, args...) + } + return o.functionOp(args...) + } +} + +// matchesRuntimeUnarySignature indicates whether the argument type is runtime assiganble to the overload's expected argument. +func (o *overloadDecl) matchesRuntimeUnarySignature(arg ref.Val) bool { + if o.nonStrict && types.IsUnknownOrError(arg) { + return true + } + return o.argTypes[0].IsAssignableRuntimeType(arg) && (o.operandTrait == 0 || arg.Type().HasTrait(o.operandTrait)) +} + +// matchesRuntimeBinarySignature indicates whether the argument types are runtime assiganble to the overload's expected arguments. +func (o *overloadDecl) matchesRuntimeBinarySignature(arg1, arg2 ref.Val) bool { + if o.nonStrict { + if types.IsUnknownOrError(arg1) { + return types.IsUnknownOrError(arg2) || o.argTypes[1].IsAssignableRuntimeType(arg2) + } + } else if !o.argTypes[1].IsAssignableRuntimeType(arg2) { + return false + } + return o.argTypes[0].IsAssignableRuntimeType(arg1) && (o.operandTrait == 0 || arg1.Type().HasTrait(o.operandTrait)) +} + +// matchesRuntimeSignature indicates whether the argument types are runtime assiganble to the overload's expected arguments. +func (o *overloadDecl) matchesRuntimeSignature(args ...ref.Val) bool { + if len(args) != len(o.argTypes) { + return false + } + if len(args) == 0 { + return true + } + allArgsMatch := true + for i, arg := range args { + if o.nonStrict && types.IsUnknownOrError(arg) { + continue + } + allArgsMatch = allArgsMatch && o.argTypes[i].IsAssignableRuntimeType(arg) + } + + arg := args[0] + return allArgsMatch && (o.operandTrait == 0 || (o.nonStrict && types.IsUnknownOrError(arg)) || arg.Type().HasTrait(o.operandTrait)) +} + +// signatureEquals indicates whether one overload has an identical signature to another overload. +// +// Providing a duplicate signature is not an issue, but an overloapping signature is problematic. +func (o *overloadDecl) signatureEquals(other *overloadDecl) bool { + if o.id != other.id || o.memberFunction != other.memberFunction || len(o.argTypes) != len(other.argTypes) { + return false + } + for i, at := range o.argTypes { + oat := other.argTypes[i] + if !at.equals(oat) { + return false + } + } + return o.resultType.equals(other.resultType) +} + +// signatureOverlaps indicates whether one overload has an overlapping signature with another overload. +// +// The 'other' overload must first be checked for equality before determining whether it overlaps in order to be completely accurate. +func (o *overloadDecl) signatureOverlaps(other *overloadDecl) bool { + if o.memberFunction != other.memberFunction || len(o.argTypes) != len(other.argTypes) { + return false + } + argsOverlap := true + for i, argType := range o.argTypes { + otherArgType := other.argTypes[i] + argsOverlap = argsOverlap && + (argType.IsAssignableType(otherArgType) || + otherArgType.IsAssignableType(argType)) + } + return argsOverlap +} + +func newOverload(overloadID string, memberFunction bool, args []*Type, resultType *Type, opts ...OverloadOpt) FunctionOpt { + return func(f *functionDecl) (*functionDecl, error) { + overload := &overloadDecl{ + id: overloadID, + argTypes: args, + resultType: resultType, + memberFunction: memberFunction, + } + var err error + for _, opt := range opts { + overload, err = opt(overload) + if err != nil { + return nil, err + } + } + err = f.addOverload(overload) + if err != nil { + return nil, err + } + return f, nil + } +} + +func maybeWrapper(t *Type, pbType *exprpb.Type) *exprpb.Type { + if t.IsAssignableType(NullType) { + return decls.NewWrapperType(pbType) + } + return pbType +} + +// TypeToExprType converts a CEL-native type representation to a protobuf CEL Type representation. +func TypeToExprType(t *Type) (*exprpb.Type, error) { + switch t.kind { + case AnyKind: + return decls.Any, nil + case BoolKind: + return maybeWrapper(t, decls.Bool), nil + case BytesKind: + return maybeWrapper(t, decls.Bytes), nil + case DoubleKind: + return maybeWrapper(t, decls.Double), nil + case DurationKind: + return decls.Duration, nil + case DynKind: + return decls.Dyn, nil + case IntKind: + return maybeWrapper(t, decls.Int), nil + case ListKind: + et, err := TypeToExprType(t.parameters[0]) + if err != nil { + return nil, err + } + return decls.NewListType(et), nil + case MapKind: + kt, err := TypeToExprType(t.parameters[0]) + if err != nil { + return nil, err + } + vt, err := TypeToExprType(t.parameters[1]) + if err != nil { + return nil, err + } + return decls.NewMapType(kt, vt), nil + case NullTypeKind: + return decls.Null, nil + case OpaqueKind: + params := make([]*exprpb.Type, len(t.parameters)) + for i, p := range t.parameters { + pt, err := TypeToExprType(p) + if err != nil { + return nil, err + } + params[i] = pt + } + return decls.NewAbstractType(t.runtimeType.TypeName(), params...), nil + case StringKind: + return maybeWrapper(t, decls.String), nil + case StructKind: + switch t.runtimeType.TypeName() { + case "google.protobuf.Any": + return decls.Any, nil + case "google.protobuf.Duration": + return decls.Duration, nil + case "google.protobuf.Timestamp": + return decls.Timestamp, nil + case "google.protobuf.Value": + return decls.Dyn, nil + case "google.protobuf.ListValue": + return decls.NewListType(decls.Dyn), nil + case "google.protobuf.Struct": + return decls.NewMapType(decls.String, decls.Dyn), nil + case "google.protobuf.BoolValue": + return decls.NewWrapperType(decls.Bool), nil + case "google.protobuf.BytesValue": + return decls.NewWrapperType(decls.Bytes), nil + case "google.protobuf.DoubleValue", "google.protobuf.FloatValue": + return decls.NewWrapperType(decls.Double), nil + case "google.protobuf.Int32Value", "google.protobuf.Int64Value": + return decls.NewWrapperType(decls.Int), nil + case "google.protobuf.StringValue": + return decls.NewWrapperType(decls.String), nil + case "google.protobuf.UInt32Value", "google.protobuf.UInt64Value": + return decls.NewWrapperType(decls.Uint), nil + default: + return decls.NewObjectType(t.runtimeType.TypeName()), nil + } + case TimestampKind: + return decls.Timestamp, nil + case TypeParamKind: + return decls.NewTypeParamType(t.runtimeType.TypeName()), nil + case TypeKind: + return decls.NewTypeType(decls.Dyn), nil + case UintKind: + return maybeWrapper(t, decls.Uint), nil + } + return nil, fmt.Errorf("missing type conversion to proto: %v", t) +} + +// ExprTypeToType converts a protobuf CEL type representation to a CEL-native type representation. +func ExprTypeToType(t *exprpb.Type) (*Type, error) { + switch t.GetTypeKind().(type) { + case *exprpb.Type_Dyn: + return DynType, nil + case *exprpb.Type_AbstractType_: + paramTypes := make([]*Type, len(t.GetAbstractType().GetParameterTypes())) + for i, p := range t.GetAbstractType().GetParameterTypes() { + pt, err := ExprTypeToType(p) + if err != nil { + return nil, err + } + paramTypes[i] = pt + } + return OpaqueType(t.GetAbstractType().GetName(), paramTypes...), nil + case *exprpb.Type_ListType_: + et, err := ExprTypeToType(t.GetListType().GetElemType()) + if err != nil { + return nil, err + } + return ListType(et), nil + case *exprpb.Type_MapType_: + kt, err := ExprTypeToType(t.GetMapType().GetKeyType()) + if err != nil { + return nil, err + } + vt, err := ExprTypeToType(t.GetMapType().GetValueType()) + if err != nil { + return nil, err + } + return MapType(kt, vt), nil + case *exprpb.Type_MessageType: + switch t.GetMessageType() { + case "google.protobuf.Any": + return AnyType, nil + case "google.protobuf.Duration": + return DurationType, nil + case "google.protobuf.Timestamp": + return TimestampType, nil + case "google.protobuf.Value": + return DynType, nil + case "google.protobuf.ListValue": + return ListType(DynType), nil + case "google.protobuf.Struct": + return MapType(StringType, DynType), nil + case "google.protobuf.BoolValue": + return NullableType(BoolType), nil + case "google.protobuf.BytesValue": + return NullableType(BytesType), nil + case "google.protobuf.DoubleValue", "google.protobuf.FloatValue": + return NullableType(DoubleType), nil + case "google.protobuf.Int32Value", "google.protobuf.Int64Value": + return NullableType(IntType), nil + case "google.protobuf.StringValue": + return NullableType(StringType), nil + case "google.protobuf.UInt32Value", "google.protobuf.UInt64Value": + return NullableType(UintType), nil + default: + return ObjectType(t.GetMessageType()), nil + } + case *exprpb.Type_Null: + return NullType, nil + case *exprpb.Type_Primitive: + switch t.GetPrimitive() { + case exprpb.Type_BOOL: + return BoolType, nil + case exprpb.Type_BYTES: + return BytesType, nil + case exprpb.Type_DOUBLE: + return DoubleType, nil + case exprpb.Type_INT64: + return IntType, nil + case exprpb.Type_STRING: + return StringType, nil + case exprpb.Type_UINT64: + return UintType, nil + default: + return nil, fmt.Errorf("unsupported primitive type: %v", t) + } + case *exprpb.Type_TypeParam: + return TypeParamType(t.GetTypeParam()), nil + case *exprpb.Type_Type: + return TypeType, nil + case *exprpb.Type_WellKnown: + switch t.GetWellKnown() { + case exprpb.Type_ANY: + return AnyType, nil + case exprpb.Type_DURATION: + return DurationType, nil + case exprpb.Type_TIMESTAMP: + return TimestampType, nil + default: + return nil, fmt.Errorf("unsupported well-known type: %v", t) + } + case *exprpb.Type_Wrapper: + t, err := ExprTypeToType(&exprpb.Type{TypeKind: &exprpb.Type_Primitive{Primitive: t.GetWrapper()}}) + if err != nil { + return nil, err + } + return NullableType(t), nil + default: + return nil, fmt.Errorf("unsupported type: %v", t) + } +} + +// ExprDeclToDeclaration converts a protobuf CEL declaration to a CEL-native declaration, either a Variable or Function. +func ExprDeclToDeclaration(d *exprpb.Decl) (EnvOption, error) { + switch d.GetDeclKind().(type) { + case *exprpb.Decl_Function: + overloads := d.GetFunction().GetOverloads() + opts := make([]FunctionOpt, len(overloads)) + for i, o := range overloads { + args := make([]*Type, len(o.GetParams())) + for j, p := range o.GetParams() { + a, err := ExprTypeToType(p) + if err != nil { + return nil, err + } + args[j] = a + } + res, err := ExprTypeToType(o.GetResultType()) + if err != nil { + return nil, err + } + opts[i] = Overload(o.GetOverloadId(), args, res) + } + return Function(d.GetName(), opts...), nil + case *exprpb.Decl_Ident: + t, err := ExprTypeToType(d.GetIdent().GetType()) + if err != nil { + return nil, err + } + return Variable(d.GetName(), t), nil + default: + return nil, fmt.Errorf("unsupported decl: %v", d) + } + +} + +func functionDeclToExprDecl(f *functionDecl) (*exprpb.Decl, error) { + overloads := make([]*exprpb.Decl_FunctionDecl_Overload, len(f.overloads)) + i := 0 + for _, o := range f.overloads { + paramNames := map[string]struct{}{} + argTypes := make([]*exprpb.Type, len(o.argTypes)) + for j, a := range o.argTypes { + collectParamNames(paramNames, a) + at, err := TypeToExprType(a) + if err != nil { + return nil, err + } + argTypes[j] = at + } + collectParamNames(paramNames, o.resultType) + resultType, err := TypeToExprType(o.resultType) + if err != nil { + return nil, err + } + if len(paramNames) == 0 { + if o.memberFunction { + overloads[i] = decls.NewInstanceOverload(o.id, argTypes, resultType) + } else { + overloads[i] = decls.NewOverload(o.id, argTypes, resultType) + } + } else { + params := []string{} + for pn := range paramNames { + params = append(params, pn) + } + if o.memberFunction { + overloads[i] = decls.NewParameterizedInstanceOverload(o.id, argTypes, resultType, params) + } else { + overloads[i] = decls.NewParameterizedOverload(o.id, argTypes, resultType, params) + } + } + i++ + } + return decls.NewFunction(f.name, overloads...), nil +} + +func collectParamNames(paramNames map[string]struct{}, arg *Type) { + if arg.kind == TypeParamKind { + paramNames[arg.runtimeType.TypeName()] = struct{}{} + } + for _, param := range arg.parameters { + collectParamNames(paramNames, param) + } +} diff --git a/vendor/github.com/google/cel-go/cel/env.go b/vendor/github.com/google/cel-go/cel/env.go index 083356188..4e9ecdd64 100644 --- a/vendor/github.com/google/cel-go/cel/env.go +++ b/vendor/github.com/google/cel-go/cel/env.go @@ -32,9 +32,7 @@ import ( ) // Source interface representing a user-provided expression. -type Source interface { - common.Source -} +type Source = common.Source // Ast representing the checked or unchecked expression, its source, and related metadata such as // source position information. @@ -56,18 +54,30 @@ func (ast *Ast) IsChecked() bool { return ast.typeMap != nil && len(ast.typeMap) > 0 } -// SourceInfo returns character offset and newling position information about expression elements. +// SourceInfo returns character offset and newline position information about expression elements. func (ast *Ast) SourceInfo() *exprpb.SourceInfo { return ast.info } // ResultType returns the output type of the expression if the Ast has been type-checked, else // returns decls.Dyn as the parse step cannot infer the type. +// +// Deprecated: use OutputType func (ast *Ast) ResultType() *exprpb.Type { if !ast.IsChecked() { return decls.Dyn } - return ast.typeMap[ast.expr.Id] + return ast.typeMap[ast.expr.GetId()] +} + +// OutputType returns the output type of the expression if the Ast has been type-checked, else +// returns cel.DynType as the parse step cannot infer types. +func (ast *Ast) OutputType() *Type { + t, err := ExprTypeToType(ast.ResultType()) + if err != nil { + return DynType + } + return t } // Source returns a view of the input used to create the Ast. This source may be complete or @@ -84,12 +94,14 @@ func FormatType(t *exprpb.Type) string { // Env encapsulates the context necessary to perform parsing, type checking, or generation of // evaluable programs for different expressions. type Env struct { - Container *containers.Container - declarations []*exprpb.Decl - macros []parser.Macro - adapter ref.TypeAdapter - provider ref.TypeProvider - features map[int]bool + Container *containers.Container + functions map[string]*functionDecl + declarations []*exprpb.Decl + macros []parser.Macro + adapter ref.TypeAdapter + provider ref.TypeProvider + features map[int]bool + appliedFeatures map[int]bool // Internal parser representation prsr *parser.Parser @@ -98,6 +110,7 @@ type Env struct { chk *checker.Env chkErr error chkOnce sync.Once + chkOpts []checker.Option // Program options tied to the environment progOpts []ProgramOption @@ -110,8 +123,16 @@ type Env struct { // See the EnvOption helper functions for the options that can be used to configure the // environment. func NewEnv(opts ...EnvOption) (*Env, error) { - stdOpts := append([]EnvOption{StdLib()}, opts...) - return NewCustomEnv(stdOpts...) + // Extend the statically configured standard environment, disabling eager validation to ensure + // the cost of setup for the environment is still just as cheap as it is in v0.11.x and earlier + // releases. The user provided options can easily re-enable the eager validation as they are + // processed after this default option. + stdOpts := append([]EnvOption{EagerlyValidateDeclarations(false)}, opts...) + env, err := getStdEnv() + if err != nil { + return nil, err + } + return env.Extend(stdOpts...) } // NewCustomEnv creates a custom program environment which is not automatically configured with the @@ -130,13 +151,15 @@ func NewCustomEnv(opts ...EnvOption) (*Env, error) { return nil, err } return (&Env{ - declarations: []*exprpb.Decl{}, - macros: []parser.Macro{}, - Container: containers.DefaultContainer, - adapter: registry, - provider: registry, - features: map[int]bool{}, - progOpts: []ProgramOption{}, + declarations: []*exprpb.Decl{}, + functions: map[string]*functionDecl{}, + macros: []parser.Macro{}, + Container: containers.DefaultContainer, + adapter: registry, + provider: registry, + features: map[int]bool{}, + appliedFeatures: map[int]bool{}, + progOpts: []ProgramOption{}, }).configure(opts) } @@ -152,25 +175,8 @@ func (e *Env) Check(ast *Ast) (*Ast, *Issues) { pe, _ := AstToParsedExpr(ast) // Construct the internal checker env, erroring if there is an issue adding the declarations. - e.chkOnce.Do(func() { - ce, err := checker.NewEnv(e.Container, e.provider, - checker.HomogeneousAggregateLiterals( - e.HasFeature(featureDisableDynamicAggregateLiterals)), - checker.CrossTypeNumericComparisons( - e.HasFeature(featureCrossTypeNumericComparisons))) - if err != nil { - e.chkErr = err - return - } - err = ce.Add(e.declarations...) - if err != nil { - e.chkErr = err - return - } - e.chk = ce - }) - // The once call will ensure that this value is set or nil for all invocations. - if e.chkErr != nil { + err := e.initChecker() + if err != nil { errs := common.NewErrors(ast.Source()) errs.ReportError(common.NoLocation, e.chkErr.Error()) return nil, NewIssues(errs) @@ -210,7 +216,7 @@ func (e *Env) Compile(txt string) (*Ast, *Issues) { // issues discovered during Check. // // Note, for parse-only uses of CEL use Parse. -func (e *Env) CompileSource(src common.Source) (*Ast, *Issues) { +func (e *Env) CompileSource(src Source) (*Ast, *Issues) { ast, iss := e.ParseSource(src) if iss.Err() != nil { return nil, iss @@ -233,11 +239,29 @@ func (e *Env) Extend(opts ...EnvOption) (*Env, error) { if e.chkErr != nil { return nil, e.chkErr } - // Copy slices. - decsCopy := make([]*exprpb.Decl, len(e.declarations)) + + // The type-checker is configured with Declarations. The declarations may either be provided + // as options which have not yet been validated, or may come from a previous checker instance + // whose types have already been validated. + chkOptsCopy := make([]checker.Option, len(e.chkOpts)) + copy(chkOptsCopy, e.chkOpts) + + // Copy the declarations if needed. + decsCopy := []*exprpb.Decl{} + if e.chk != nil { + // If the type-checker has already been instantiated, then the e.declarations have been + // valdiated within the chk instance. + chkOptsCopy = append(chkOptsCopy, checker.ValidatedDeclarations(e.chk)) + } else { + // If the type-checker has not been instantiated, ensure the unvalidated declarations are + // provided to the extended Env instance. + decsCopy = make([]*exprpb.Decl, len(e.declarations)) + copy(decsCopy, e.declarations) + } + + // Copy macros and program options macsCopy := make([]parser.Macro, len(e.macros)) progOptsCopy := make([]ProgramOption, len(e.progOpts)) - copy(decsCopy, e.declarations) copy(macsCopy, e.macros) copy(progOptsCopy, e.progOpts) @@ -272,15 +296,27 @@ func (e *Env) Extend(opts ...EnvOption) (*Env, error) { for k, v := range e.features { featuresCopy[k] = v } + appliedFeaturesCopy := make(map[int]bool, len(e.appliedFeatures)) + for k, v := range e.appliedFeatures { + appliedFeaturesCopy[k] = v + } + funcsCopy := make(map[string]*functionDecl, len(e.functions)) + for k, v := range e.functions { + funcsCopy[k] = v + } + // TODO: functions copy needs to happen here. ext := &Env{ - Container: e.Container, - declarations: decsCopy, - macros: macsCopy, - progOpts: progOptsCopy, - adapter: adapter, - features: featuresCopy, - provider: provider, + Container: e.Container, + declarations: decsCopy, + functions: funcsCopy, + macros: macsCopy, + progOpts: progOptsCopy, + adapter: adapter, + features: featuresCopy, + appliedFeatures: appliedFeaturesCopy, + provider: provider, + chkOpts: chkOptsCopy, } return ext.configure(opts) } @@ -294,7 +330,7 @@ func (e *Env) HasFeature(flag int) bool { // Parse parses the input expression value `txt` to a Ast and/or a set of Issues. // -// This form of Parse creates a common.Source value for the input `txt` and forwards to the +// This form of Parse creates a Source value for the input `txt` and forwards to the // ParseSource method. func (e *Env) Parse(txt string) (*Ast, *Issues) { src := common.NewTextSource(txt) @@ -308,7 +344,7 @@ func (e *Env) Parse(txt string) (*Ast, *Issues) { // // It is possible to have both non-nil Ast and Issues values returned from this call; however, // the mere presence of an Ast does not imply that it is valid for use. -func (e *Env) ParseSource(src common.Source) (*Ast, *Issues) { +func (e *Env) ParseSource(src Source) (*Ast, *Issues) { res, errs := e.prsr.Parse(src) if len(errs.GetErrors()) > 0 { return nil, &Issues{errs: errs} @@ -316,7 +352,7 @@ func (e *Env) ParseSource(src common.Source) (*Ast, *Issues) { // Manually create the Ast to ensure that the text source information is propagated on // subsequent calls to Check. return &Ast{ - source: Source(src), + source: src, expr: res.GetExpr(), info: res.GetSourceInfo()}, nil } @@ -426,6 +462,30 @@ func (e *Env) configure(opts []EnvOption) (*Env, error) { return nil, err } } + + // If the default UTC timezone fix has been enabled, make sure the library is configured + if e.HasFeature(featureDefaultUTCTimeZone) { + if _, found := e.appliedFeatures[featureDefaultUTCTimeZone]; !found { + e, err = Lib(timeUTCLibrary{})(e) + if err != nil { + return nil, err + } + // record that the feature has been applied since it will generate declarations + // and functions which will be propagated on Extend() calls and which should only + // be registered once. + e.appliedFeatures[featureDefaultUTCTimeZone] = true + } + } + + // Initialize all of the functions configured within the environment. + for _, fn := range e.functions { + err = fn.init() + if err != nil { + return nil, err + } + } + + // Configure the parser. prsrOpts := []parser.Option{parser.Macros(e.macros...)} if e.HasFeature(featureEnableMacroCallTracking) { prsrOpts = append(prsrOpts, parser.PopulateMacroCalls(true)) @@ -434,9 +494,58 @@ func (e *Env) configure(opts []EnvOption) (*Env, error) { if err != nil { return nil, err } + + // Ensure that the checker init happens eagerly rather than lazily. + if e.HasFeature(featureEagerlyValidateDeclarations) { + err := e.initChecker() + if err != nil { + return nil, err + } + } + return e, nil } +func (e *Env) initChecker() error { + e.chkOnce.Do(func() { + chkOpts := []checker.Option{} + chkOpts = append(chkOpts, e.chkOpts...) + chkOpts = append(chkOpts, + checker.HomogeneousAggregateLiterals( + e.HasFeature(featureDisableDynamicAggregateLiterals)), + checker.CrossTypeNumericComparisons( + e.HasFeature(featureCrossTypeNumericComparisons))) + + ce, err := checker.NewEnv(e.Container, e.provider, chkOpts...) + if err != nil { + e.chkErr = err + return + } + // Add the statically configured declarations. + err = ce.Add(e.declarations...) + if err != nil { + e.chkErr = err + return + } + // Add the function declarations which are derived from the FunctionDecl instances. + for _, fn := range e.functions { + fnDecl, err := functionDeclToExprDecl(fn) + if err != nil { + e.chkErr = err + return + } + err = ce.Add(fnDecl) + if err != nil { + e.chkErr = err + return + } + } + // Add function declarations here separately. + e.chk = ce + }) + return e.chkErr +} + // Issues defines methods for inspecting the error details of parse and check calls. // // Note: in the future, non-fatal warnings and notices may be inspectable via the Issues struct. @@ -488,3 +597,17 @@ func (i *Issues) String() string { } return i.errs.ToDisplayString() } + +// getStdEnv lazy initializes the CEL standard environment. +func getStdEnv() (*Env, error) { + stdEnvInit.Do(func() { + stdEnv, stdEnvErr = NewCustomEnv(StdLib(), EagerlyValidateDeclarations(true)) + }) + return stdEnv, stdEnvErr +} + +var ( + stdEnvInit sync.Once + stdEnv *Env + stdEnvErr error +) diff --git a/vendor/github.com/google/cel-go/cel/io.go b/vendor/github.com/google/cel-go/cel/io.go index a2c317f3b..e721c97f6 100644 --- a/vendor/github.com/google/cel-go/cel/io.go +++ b/vendor/github.com/google/cel-go/cel/io.go @@ -44,7 +44,7 @@ func CheckedExprToAst(checkedExpr *exprpb.CheckedExpr) *Ast { // through future calls. // // Prefer CheckedExprToAst if loading expressions from storage. -func CheckedExprToAstWithSource(checkedExpr *exprpb.CheckedExpr, src common.Source) *Ast { +func CheckedExprToAstWithSource(checkedExpr *exprpb.CheckedExpr, src Source) *Ast { refMap := checkedExpr.GetReferenceMap() if refMap == nil { refMap = map[int64]*exprpb.Reference{} @@ -96,7 +96,7 @@ func ParsedExprToAst(parsedExpr *exprpb.ParsedExpr) *Ast { // expression, or if you need to separately check a subset of an expression. // // Prefer ParsedExprToAst if loading expressions from storage. -func ParsedExprToAstWithSource(parsedExpr *exprpb.ParsedExpr, src common.Source) *Ast { +func ParsedExprToAstWithSource(parsedExpr *exprpb.ParsedExpr, src Source) *Ast { si := parsedExpr.GetSourceInfo() if si == nil { si = &exprpb.SourceInfo{} @@ -241,7 +241,7 @@ func ValueToRefValue(adapter ref.TypeAdapter, v *exprpb.Value) (ref.Val, error) if err != nil { return nil, err } - return adapter.NativeToValue(msg.(proto.Message)), nil + return adapter.NativeToValue(msg), nil case *exprpb.Value_MapValue: m := v.GetMapValue() entries := make(map[ref.Val]ref.Val) diff --git a/vendor/github.com/google/cel-go/cel/library.go b/vendor/github.com/google/cel-go/cel/library.go index cef161d6a..5ca528459 100644 --- a/vendor/github.com/google/cel-go/cel/library.go +++ b/vendor/github.com/google/cel-go/cel/library.go @@ -15,19 +15,25 @@ package cel import ( + "strconv" + "strings" + "time" + "github.com/google/cel-go/checker" + "github.com/google/cel-go/common/overloads" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/interpreter/functions" - "github.com/google/cel-go/parser" ) -// Library provides a collection of EnvOption and ProgramOption values used to confiugre a CEL +// Library provides a collection of EnvOption and ProgramOption values used to configure a CEL // environment for a particular use case or with a related set of functionality. // // Note, the ProgramOption values provided by a library are expected to be static and not vary // between calls to Env.Program(). If there is a need for such dynamic configuration, prefer to // configure these options outside the Library and within the Env.Program() call directly. type Library interface { - // CompileOptions returns a collection of funcitional options for configuring the Parse / Check + // CompileOptions returns a collection of functional options for configuring the Parse / Check // environment. CompileOptions() []EnvOption @@ -65,7 +71,7 @@ type stdLibrary struct{} func (stdLibrary) CompileOptions() []EnvOption { return []EnvOption{ Declarations(checker.StandardDeclarations()...), - Macros(parser.AllMacros...), + Macros(StandardMacros...), } } @@ -75,3 +81,263 @@ func (stdLibrary) ProgramOptions() []ProgramOption { Functions(functions.StandardOverloads()...), } } + +type timeUTCLibrary struct{} + +func (timeUTCLibrary) CompileOptions() []EnvOption { + return timeOverloadDeclarations +} + +func (timeUTCLibrary) ProgramOptions() []ProgramOption { + return []ProgramOption{} +} + +// Declarations and functions which enable using UTC on time.Time inputs when the timezone is unspecified +// in the CEL expression. +var ( + utcTZ = types.String("UTC") + + timeOverloadDeclarations = []EnvOption{ + Function(overloads.TimeGetHours, + MemberOverload(overloads.DurationToHours, []*Type{DurationType}, IntType, + UnaryBinding(func(dur ref.Val) ref.Val { + d := dur.(types.Duration) + return types.Int(d.Hours()) + }))), + Function(overloads.TimeGetMinutes, + MemberOverload(overloads.DurationToMinutes, []*Type{DurationType}, IntType, + UnaryBinding(func(dur ref.Val) ref.Val { + d := dur.(types.Duration) + return types.Int(d.Minutes()) + }))), + Function(overloads.TimeGetSeconds, + MemberOverload(overloads.DurationToSeconds, []*Type{DurationType}, IntType, + UnaryBinding(func(dur ref.Val) ref.Val { + d := dur.(types.Duration) + return types.Int(d.Seconds()) + }))), + Function(overloads.TimeGetMilliseconds, + MemberOverload(overloads.DurationToMilliseconds, []*Type{DurationType}, IntType, + UnaryBinding(func(dur ref.Val) ref.Val { + d := dur.(types.Duration) + return types.Int(d.Milliseconds()) + }))), + Function(overloads.TimeGetFullYear, + MemberOverload(overloads.TimestampToYear, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetFullYear(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToYearWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(timestampGetFullYear), + ), + ), + Function(overloads.TimeGetMonth, + MemberOverload(overloads.TimestampToMonth, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetMonth(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToMonthWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(timestampGetMonth), + ), + ), + Function(overloads.TimeGetDayOfYear, + MemberOverload(overloads.TimestampToDayOfYear, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetDayOfYear(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToDayOfYearWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(func(ts, tz ref.Val) ref.Val { + return timestampGetDayOfYear(ts, tz) + }), + ), + ), + Function(overloads.TimeGetDayOfMonth, + MemberOverload(overloads.TimestampToDayOfMonthZeroBased, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetDayOfMonthZeroBased(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToDayOfMonthZeroBasedWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(timestampGetDayOfMonthZeroBased), + ), + ), + Function(overloads.TimeGetDate, + MemberOverload(overloads.TimestampToDayOfMonthOneBased, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetDayOfMonthOneBased(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToDayOfMonthOneBasedWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(timestampGetDayOfMonthOneBased), + ), + ), + Function(overloads.TimeGetDayOfWeek, + MemberOverload(overloads.TimestampToDayOfWeek, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetDayOfWeek(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToDayOfWeekWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(timestampGetDayOfWeek), + ), + ), + Function(overloads.TimeGetHours, + MemberOverload(overloads.TimestampToHours, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetHours(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToHoursWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(timestampGetHours), + ), + ), + Function(overloads.TimeGetMinutes, + MemberOverload(overloads.TimestampToMinutes, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetMinutes(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToMinutesWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(timestampGetMinutes), + ), + ), + Function(overloads.TimeGetSeconds, + MemberOverload(overloads.TimestampToSeconds, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetSeconds(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToSecondsWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(timestampGetSeconds), + ), + ), + Function(overloads.TimeGetMilliseconds, + MemberOverload(overloads.TimestampToMilliseconds, []*Type{TimestampType}, IntType, + UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetMilliseconds(ts, utcTZ) + }), + ), + MemberOverload(overloads.TimestampToMillisecondsWithTz, []*Type{TimestampType, StringType}, IntType, + BinaryBinding(timestampGetMilliseconds), + ), + ), + } +) + +func timestampGetFullYear(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + return types.Int(t.Year()) +} + +func timestampGetMonth(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + // CEL spec indicates that the month should be 0-based, but the Time value + // for Month() is 1-based. + return types.Int(t.Month() - 1) +} + +func timestampGetDayOfYear(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + return types.Int(t.YearDay() - 1) +} + +func timestampGetDayOfMonthZeroBased(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + return types.Int(t.Day() - 1) +} + +func timestampGetDayOfMonthOneBased(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + return types.Int(t.Day()) +} + +func timestampGetDayOfWeek(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + return types.Int(t.Weekday()) +} + +func timestampGetHours(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + return types.Int(t.Hour()) +} + +func timestampGetMinutes(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + return types.Int(t.Minute()) +} + +func timestampGetSeconds(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + return types.Int(t.Second()) +} + +func timestampGetMilliseconds(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErr(err.Error()) + } + return types.Int(t.Nanosecond() / 1000000) +} + +func inTimeZone(ts, tz ref.Val) (time.Time, error) { + t := ts.(types.Timestamp) + val := string(tz.(types.String)) + ind := strings.Index(val, ":") + if ind == -1 { + loc, err := time.LoadLocation(val) + if err != nil { + return time.Time{}, err + } + return t.In(loc), nil + } + + // If the input is not the name of a timezone (for example, 'US/Central'), it should be a numerical offset from UTC + // in the format ^(+|-)(0[0-9]|1[0-4]):[0-5][0-9]$. The numerical input is parsed in terms of hours and minutes. + hr, err := strconv.Atoi(string(val[0:ind])) + if err != nil { + return time.Time{}, err + } + min, err := strconv.Atoi(string(val[ind+1:])) + if err != nil { + return time.Time{}, err + } + var offset int + if string(val[0]) == "-" { + offset = hr*60 - min + } else { + offset = hr*60 + min + } + secondsEastOfUTC := int((time.Duration(offset) * time.Minute).Seconds()) + timezone := time.FixedZone("", secondsEastOfUTC) + return t.In(timezone), nil +} diff --git a/vendor/github.com/google/cel-go/cel/macro.go b/vendor/github.com/google/cel-go/cel/macro.go new file mode 100644 index 000000000..e43cb4eee --- /dev/null +++ b/vendor/github.com/google/cel-go/cel/macro.go @@ -0,0 +1,139 @@ +// Copyright 2022 Google LLC +// +// 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 cel + +import ( + "github.com/google/cel-go/common" + "github.com/google/cel-go/parser" + exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" +) + +// Macro describes a function signature to match and the MacroExpander to apply. +// +// Note: when a Macro should apply to multiple overloads (based on arg count) of a given function, +// a Macro should be created per arg-count or as a var arg macro. +type Macro = parser.Macro + +// MacroExpander converts a call and its associated arguments into a new CEL abstract syntax tree, or an error +// if the input arguments are not suitable for the expansion requirements for the macro in question. +// +// The MacroExpander accepts as arguments a MacroExprHelper as well as the arguments used in the function call +// and produces as output an Expr ast node. +// +// Note: when the Macro.IsReceiverStyle() method returns true, the target argument will be nil. +type MacroExpander = parser.MacroExpander + +// MacroExprHelper exposes helper methods for creating new expressions within a CEL abstract syntax tree. +type MacroExprHelper = parser.ExprHelper + +// NewGlobalMacro creates a Macro for a global function with the specified arg count. +func NewGlobalMacro(function string, argCount int, expander MacroExpander) Macro { + return parser.NewGlobalMacro(function, argCount, expander) +} + +// NewReceiverMacro creates a Macro for a receiver function matching the specified arg count. +func NewReceiverMacro(function string, argCount int, expander MacroExpander) Macro { + return parser.NewReceiverMacro(function, argCount, expander) +} + +// NewGlobalVarArgMacro creates a Macro for a global function with a variable arg count. +func NewGlobalVarArgMacro(function string, expander MacroExpander) Macro { + return parser.NewGlobalVarArgMacro(function, expander) +} + +// NewReceiverVarArgMacro creates a Macro for a receiver function matching a variable arg count. +func NewReceiverVarArgMacro(function string, expander MacroExpander) Macro { + return parser.NewReceiverVarArgMacro(function, expander) +} + +// HasMacroExpander expands the input call arguments into a presence test, e.g. has(.field) +func HasMacroExpander(meh MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + return parser.MakeHas(meh, target, args) +} + +// ExistsMacroExpander expands the input call arguments into a comprehension that returns true if any of the +// elements in the range match the predicate expressions: +// .exists(, ) +func ExistsMacroExpander(meh MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + return parser.MakeExists(meh, target, args) +} + +// ExistsOneMacroExpander expands the input call arguments into a comprehension that returns true if exactly +// one of the elements in the range match the predicate expressions: +// .exists_one(, ) +func ExistsOneMacroExpander(meh MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + return parser.MakeExistsOne(meh, target, args) +} + +// MapMacroExpander expands the input call arguments into a comprehension that transforms each element in the +// input to produce an output list. +// +// There are two call patterns supported by map: +// .map(, ) +// .map(, , ) +// In the second form only iterVar values which return true when provided to the predicate expression +// are transformed. +func MapMacroExpander(meh MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + return parser.MakeMap(meh, target, args) +} + +// FilterMacroExpander expands the input call arguments into a comprehension which produces a list which contains +// only elements which match the provided predicate expression: +// .filter(, ) +func FilterMacroExpander(meh MacroExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + return parser.MakeFilter(meh, target, args) +} + +var ( + // Aliases to each macro in the CEL standard environment. + // Note: reassigning these macro variables may result in undefined behavior. + + // HasMacro expands "has(m.f)" which tests the presence of a field, avoiding the need to + // specify the field as a string. + HasMacro = parser.HasMacro + + // AllMacro expands "range.all(var, predicate)" into a comprehension which ensures that all + // elements in the range satisfy the predicate. + AllMacro = parser.AllMacro + + // ExistsMacro expands "range.exists(var, predicate)" into a comprehension which ensures that + // some element in the range satisfies the predicate. + ExistsMacro = parser.ExistsMacro + + // ExistsOneMacro expands "range.exists_one(var, predicate)", which is true if for exactly one + // element in range the predicate holds. + ExistsOneMacro = parser.ExistsOneMacro + + // MapMacro expands "range.map(var, function)" into a comprehension which applies the function + // to each element in the range to produce a new list. + MapMacro = parser.MapMacro + + // MapFilterMacro expands "range.map(var, predicate, function)" into a comprehension which + // first filters the elements in the range by the predicate, then applies the transform function + // to produce a new list. + MapFilterMacro = parser.MapFilterMacro + + // FilterMacro expands "range.filter(var, predicate)" into a comprehension which filters + // elements in the range, producing a new list from the elements that satisfy the predicate. + FilterMacro = parser.FilterMacro + + // StandardMacros provides an alias to all the CEL macros defined in the standard environment. + StandardMacros = []Macro{ + HasMacro, AllMacro, ExistsMacro, ExistsOneMacro, MapMacro, MapFilterMacro, FilterMacro, + } + + // NoMacros provides an alias to an empty list of macros + NoMacros = []Macro{} +) diff --git a/vendor/github.com/google/cel-go/cel/options.go b/vendor/github.com/google/cel-go/cel/options.go index 9a5df568c..21c757010 100644 --- a/vendor/github.com/google/cel-go/cel/options.go +++ b/vendor/github.com/google/cel-go/cel/options.go @@ -29,7 +29,6 @@ import ( "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/interpreter" "github.com/google/cel-go/interpreter/functions" - "github.com/google/cel-go/parser" exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" descpb "google.golang.org/protobuf/types/descriptorpb" @@ -53,6 +52,15 @@ const ( // Enable the use of cross-type numeric comparisons at the type-checker. featureCrossTypeNumericComparisons + + // Enable eager validation of declarations to ensure that Env values created + // with `Extend` inherit a validated list of declarations from the parent Env. + featureEagerlyValidateDeclarations + + // Enable the use of the default UTC timezone when a timezone is not specified + // on a CEL timestamp operation. This fixes the scenario where the input time + // is not already in UTC. + featureDefaultUTCTimeZone ) // EnvOption is a functional interface for configuring the environment. @@ -64,7 +72,7 @@ type EnvOption func(e *Env) (*Env, error) // comprehensions such as `all` and `exists` are enabled only via macros. func ClearMacros() EnvOption { return func(e *Env) (*Env, error) { - e.macros = parser.NoMacros + e.macros = NoMacros return e, nil } } @@ -95,14 +103,24 @@ func CustomTypeProvider(provider ref.TypeProvider) EnvOption { // for the environment. The NewEnv call builds on top of the standard CEL declarations. For a // purely custom set of declarations use NewCustomEnv. func Declarations(decls ...*exprpb.Decl) EnvOption { - // TODO: provide an alternative means of specifying declarations that doesn't refer - // to the underlying proto implementations. return func(e *Env) (*Env, error) { e.declarations = append(e.declarations, decls...) return e, nil } } +// EagerlyValidateDeclarations ensures that any collisions between configured declarations are caught +// at the time of the `NewEnv` call. +// +// Eagerly validating declarations is also useful for bootstrapping a base `cel.Env` value. +// Calls to base `Env.Extend()` will be significantly faster when declarations are eagerly validated +// as declarations will be collision-checked at most once and only incrementally by way of `Extend` +// +// Disabled by default as not all environments are used for type-checking. +func EagerlyValidateDeclarations(enabled bool) EnvOption { + return features(featureEagerlyValidateDeclarations, enabled) +} + // HomogeneousAggregateLiterals option ensures that list and map literal entry types must agree // during type-checking. // @@ -116,7 +134,7 @@ func HomogeneousAggregateLiterals() EnvOption { // Macros option extends the macro set configured in the environment. // // Note: This option must be specified after ClearMacros if used together. -func Macros(macros ...parser.Macro) EnvOption { +func Macros(macros ...Macro) EnvOption { return func(e *Env) (*Env, error) { e.macros = append(e.macros, macros...) return e, nil @@ -316,6 +334,9 @@ func CustomDecorator(dec interpreter.InterpretableDecorator) ProgramOption { } // Functions adds function overloads that extend or override the set of CEL built-ins. +// +// Deprecated: use Function() instead to declare the function, its overload signatures, +// and the overload implementations. func Functions(funcs ...*functions.Overload) ProgramOption { return func(p *prog) (*prog, error) { if err := p.dispatcher.Add(funcs...); err != nil { @@ -326,7 +347,8 @@ func Functions(funcs ...*functions.Overload) ProgramOption { } // Globals sets the global variable values for a given program. These values may be shadowed by -// variables with the same name provided to the Eval() call. +// variables with the same name provided to the Eval() call. If Globals is used in a Library with +// a Lib EnvOption, vars may shadow variables provided by previously added libraries. // // The vars value may either be an `interpreter.Activation` instance or a `map[string]interface{}`. func Globals(vars interface{}) ProgramOption { @@ -335,6 +357,9 @@ func Globals(vars interface{}) ProgramOption { if err != nil { return nil, err } + if p.defaultVars != nil { + defaultVars = interpreter.NewHierarchicalActivation(p.defaultVars, defaultVars) + } p.defaultVars = defaultVars return p, nil } @@ -422,7 +447,7 @@ func CostLimit(costLimit uint64) ProgramOption { } func fieldToCELType(field protoreflect.FieldDescriptor) (*exprpb.Type, error) { - if field.Kind() == protoreflect.MessageKind { + if field.Kind() == protoreflect.MessageKind || field.Kind() == protoreflect.GroupKind { msgName := (string)(field.Message().FullName()) wellKnownType, found := pb.CheckedWellKnowns[msgName] if found { @@ -503,6 +528,12 @@ func CrossTypeNumericComparisons(enabled bool) EnvOption { return features(featureCrossTypeNumericComparisons, enabled) } +// DefaultUTCTimeZone ensures that time-based operations use the UTC timezone rather than the +// input time's local timezone. +func DefaultUTCTimeZone(enabled bool) EnvOption { + return features(featureDefaultUTCTimeZone, enabled) +} + // features sets the given feature flags. See list of Feature constants above. func features(flag int, enabled bool) EnvOption { return func(e *Env) (*Env, error) { diff --git a/vendor/github.com/google/cel-go/cel/program.go b/vendor/github.com/google/cel-go/cel/program.go index f09716072..672c83ef7 100644 --- a/vendor/github.com/google/cel-go/cel/program.go +++ b/vendor/github.com/google/cel-go/cel/program.go @@ -49,7 +49,7 @@ type Program interface { // to support cancellation and timeouts. This method must be used in conjunction with the // InterruptCheckFrequency() option for cancellation interrupts to be impact evaluation. // - // The vars value may eitehr be an `interpreter.Activation` or `map[string]interface{}`. + // The vars value may either be an `interpreter.Activation` or `map[string]interface{}`. // // The output contract for `ContextEval` is otherwise identical to the `Eval` method. ContextEval(context.Context, interface{}) (ref.Val, *EvalDetails, error) @@ -168,6 +168,18 @@ func newProgram(e *Env, ast *Ast, opts []ProgramOption) (Program, error) { } } + // Add the function bindings created via Function() options. + for _, fn := range e.functions { + bindings, err := fn.bindings() + if err != nil { + return nil, err + } + err = disp.Add(bindings...) + if err != nil { + return nil, err + } + } + // Set the attribute factory after the options have been set. var attrFactory interpreter.AttributeFactory if p.evalOpts&OptPartialEval == OptPartialEval { diff --git a/vendor/github.com/google/cel-go/checker/BUILD.bazel b/vendor/github.com/google/cel-go/checker/BUILD.bazel index 2ef326b98..bec40b6e6 100644 --- a/vendor/github.com/google/cel-go/checker/BUILD.bazel +++ b/vendor/github.com/google/cel-go/checker/BUILD.bazel @@ -54,7 +54,7 @@ go_test( "//test:go_default_library", "//test/proto2pb:go_default_library", "//test/proto3pb:go_default_library", - "@com_github_antlr//runtime/Go/antlr:go_default_library", + "@com_github_antlr_antlr4_runtime_go_antlr//:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", ], ) diff --git a/vendor/github.com/google/cel-go/checker/checker.go b/vendor/github.com/google/cel-go/checker/checker.go index 99f7c5bdb..6e45789a2 100644 --- a/vendor/github.com/google/cel-go/checker/checker.go +++ b/vendor/github.com/google/cel-go/checker/checker.go @@ -168,11 +168,9 @@ func (c *checker) checkSelect(e *exprpb.Expr) { if found { ident := c.env.LookupIdent(qname) if ident != nil { - if sel.TestOnly { - c.errors.expressionDoesNotSelectField(c.location(e)) - c.setType(e, decls.Bool) - return - } + // We don't check for a TestOnly expression here since the `found` result is + // always going to be false for TestOnly expressions. + // Rewrite the node to be a variable reference to the resolved fully-qualified // variable name. c.setType(e, ident.GetIdent().Type) @@ -189,7 +187,7 @@ func (c *checker) checkSelect(e *exprpb.Expr) { // Interpret as field selection, first traversing down the operand. c.check(sel.Operand) - targetType := c.getType(sel.Operand) + targetType := substitute(c.mappings, c.getType(sel.Operand), false) // Assume error type by default as most types do not support field selection. resultType := decls.Error switch kindOf(targetType) { @@ -208,7 +206,7 @@ func (c *checker) checkSelect(e *exprpb.Expr) { resultType = fieldType.Type } case kindTypeParam: - // Set the operand type to DYN to prevent assignment to a potentionally incorrect type + // Set the operand type to DYN to prevent assignment to a potentially incorrect type // at a later point in type-checking. The isAssignable call will update the type // substitutions for the type param under the covers. c.isAssignable(decls.Dyn, targetType) @@ -226,7 +224,7 @@ func (c *checker) checkSelect(e *exprpb.Expr) { if sel.TestOnly { resultType = decls.Bool } - c.setType(e, resultType) + c.setType(e, substitute(c.mappings, resultType, false)) } func (c *checker) checkCall(e *exprpb.Expr) { @@ -323,6 +321,12 @@ func (c *checker) resolveOverload( var resultType *exprpb.Type var checkedRef *exprpb.Reference for _, overload := range fn.GetFunction().Overloads { + // Determine whether the overload is currently considered. + if c.env.isOverloadDisabled(overload.GetOverloadId()) { + continue + } + + // Ensure the call style for the overload matches. if (target == nil && overload.IsInstanceFunction) || (target != nil && !overload.IsInstanceFunction) { // not a compatible call style. @@ -330,26 +334,26 @@ func (c *checker) resolveOverload( } overloadType := decls.NewFunctionType(overload.ResultType, overload.Params...) - if len(overload.TypeParams) > 0 { + if len(overload.GetTypeParams()) > 0 { // Instantiate overload's type with fresh type variables. substitutions := newMapping() - for _, typePar := range overload.TypeParams { + for _, typePar := range overload.GetTypeParams() { substitutions.add(decls.NewTypeParamType(typePar), c.newTypeVar()) } overloadType = substitute(substitutions, overloadType, false) } - candidateArgTypes := overloadType.GetFunction().ArgTypes + candidateArgTypes := overloadType.GetFunction().GetArgTypes() if c.isAssignableList(argTypes, candidateArgTypes) { if checkedRef == nil { - checkedRef = newFunctionReference(overload.OverloadId) + checkedRef = newFunctionReference(overload.GetOverloadId()) } else { - checkedRef.OverloadId = append(checkedRef.OverloadId, overload.OverloadId) + checkedRef.OverloadId = append(checkedRef.OverloadId, overload.GetOverloadId()) } // First matching overload, determines result type. fnResultType := substitute(c.mappings, - overloadType.GetFunction().ResultType, + overloadType.GetFunction().GetResultType(), false) if resultType == nil { resultType = fnResultType @@ -465,48 +469,48 @@ func (c *checker) checkCreateMessage(e *exprpb.Expr) { func (c *checker) checkComprehension(e *exprpb.Expr) { comp := e.GetComprehensionExpr() - c.check(comp.IterRange) - c.check(comp.AccuInit) - accuType := c.getType(comp.AccuInit) - rangeType := c.getType(comp.IterRange) + c.check(comp.GetIterRange()) + c.check(comp.GetAccuInit()) + accuType := c.getType(comp.GetAccuInit()) + rangeType := substitute(c.mappings, c.getType(comp.GetIterRange()), false) var varType *exprpb.Type switch kindOf(rangeType) { case kindList: - varType = rangeType.GetListType().ElemType + varType = rangeType.GetListType().GetElemType() case kindMap: // Ranges over the keys. - varType = rangeType.GetMapType().KeyType + varType = rangeType.GetMapType().GetKeyType() case kindDyn, kindError, kindTypeParam: - // Set the range type to DYN to prevent assignment to a potentionally incorrect type + // Set the range type to DYN to prevent assignment to a potentially incorrect type // at a later point in type-checking. The isAssignable call will update the type // substitutions for the type param under the covers. c.isAssignable(decls.Dyn, rangeType) // Set the range iteration variable to type DYN as well. varType = decls.Dyn default: - c.errors.notAComprehensionRange(c.location(comp.IterRange), rangeType) + c.errors.notAComprehensionRange(c.location(comp.GetIterRange()), rangeType) varType = decls.Error } // Create a scope for the comprehension since it has a local accumulation variable. // This scope will contain the accumulation variable used to compute the result. c.env = c.env.enterScope() - c.env.Add(decls.NewVar(comp.AccuVar, accuType)) + c.env.Add(decls.NewVar(comp.GetAccuVar(), accuType)) // Create a block scope for the loop. c.env = c.env.enterScope() - c.env.Add(decls.NewVar(comp.IterVar, varType)) + c.env.Add(decls.NewVar(comp.GetIterVar(), varType)) // Check the variable references in the condition and step. - c.check(comp.LoopCondition) - c.assertType(comp.LoopCondition, decls.Bool) - c.check(comp.LoopStep) - c.assertType(comp.LoopStep, accuType) + c.check(comp.GetLoopCondition()) + c.assertType(comp.GetLoopCondition(), decls.Bool) + c.check(comp.GetLoopStep()) + c.assertType(comp.GetLoopStep(), accuType) // Exit the loop's block scope before checking the result. c.env = c.env.exitScope() - c.check(comp.Result) + c.check(comp.GetResult()) // Exit the comprehension scope. c.env = c.env.exitScope() - c.setType(e, c.getType(comp.Result)) + c.setType(e, substitute(c.mappings, c.getType(comp.GetResult()), false)) } // Checks compatibility of joined types, and returns the most general common type. diff --git a/vendor/github.com/google/cel-go/checker/cost.go b/vendor/github.com/google/cel-go/checker/cost.go index 4e1ea5aad..75142ebc1 100644 --- a/vendor/github.com/google/cel-go/checker/cost.go +++ b/vendor/github.com/google/cel-go/checker/cost.go @@ -121,7 +121,7 @@ type SizeEstimate struct { } // Add adds to another SizeEstimate and returns the sum. -// If add would result in an uint64 overflow, the result is Maxuint64. +// If add would result in an uint64 overflow, the result is math.MaxUint64. func (se SizeEstimate) Add(sizeEstimate SizeEstimate) SizeEstimate { return SizeEstimate{ addUint64NoOverflow(se.Min, sizeEstimate.Min), @@ -130,7 +130,7 @@ func (se SizeEstimate) Add(sizeEstimate SizeEstimate) SizeEstimate { } // Multiply multiplies by another SizeEstimate and returns the product. -// If multiply would result in an uint64 overflow, the result is Maxuint64. +// If multiply would result in an uint64 overflow, the result is math.MaxUint64. func (se SizeEstimate) Multiply(sizeEstimate SizeEstimate) SizeEstimate { return SizeEstimate{ multiplyUint64NoOverflow(se.Min, sizeEstimate.Min), @@ -148,7 +148,7 @@ func (se SizeEstimate) MultiplyByCostFactor(costPerUnit float64) CostEstimate { } // MultiplyByCost multiplies by the cost and returns the product. -// If multiply would result in an uint64 overflow, the result is Maxuint64. +// If multiply would result in an uint64 overflow, the result is math.MaxUint64. func (se SizeEstimate) MultiplyByCost(cost CostEstimate) CostEstimate { return CostEstimate{ multiplyUint64NoOverflow(se.Min, cost.Min), @@ -175,7 +175,7 @@ type CostEstimate struct { } // Add adds the costs and returns the sum. -// If add would result in an uint64 overflow for the min or max, the value is set to Maxuint64. +// If add would result in an uint64 overflow for the min or max, the value is set to math.MaxUint64. func (ce CostEstimate) Add(cost CostEstimate) CostEstimate { return CostEstimate{ addUint64NoOverflow(ce.Min, cost.Min), @@ -184,7 +184,7 @@ func (ce CostEstimate) Add(cost CostEstimate) CostEstimate { } // Multiply multiplies by the cost and returns the product. -// If multiply would result in an uint64 overflow, the result is Maxuint64. +// If multiply would result in an uint64 overflow, the result is math.MaxUint64. func (ce CostEstimate) Multiply(cost CostEstimate) CostEstimate { return CostEstimate{ multiplyUint64NoOverflow(ce.Min, cost.Min), diff --git a/vendor/github.com/google/cel-go/checker/decls/scopes.go b/vendor/github.com/google/cel-go/checker/decls/scopes.go index 1064c73b1..608bca3e5 100644 --- a/vendor/github.com/google/cel-go/checker/decls/scopes.go +++ b/vendor/github.com/google/cel-go/checker/decls/scopes.go @@ -33,6 +33,19 @@ func NewScopes() *Scopes { } } +// Copy creates a copy of the current Scopes values, including a copy of its parent if non-nil. +func (s *Scopes) Copy() *Scopes { + cpy := NewScopes() + if s == nil { + return cpy + } + if s.parent != nil { + cpy.parent = s.parent.Copy() + } + cpy.scopes = s.scopes.copy() + return cpy +} + // Push creates a new Scopes value which references the current Scope as its parent. func (s *Scopes) Push() *Scopes { return &Scopes{ @@ -80,9 +93,9 @@ func (s *Scopes) FindIdentInScope(name string) *exprpb.Decl { return nil } -// AddFunction adds the function Decl to the current scope. +// SetFunction adds the function Decl to the current scope. // Note: Any previous entry for a function in the current scope with the same name is overwritten. -func (s *Scopes) AddFunction(fn *exprpb.Decl) { +func (s *Scopes) SetFunction(fn *exprpb.Decl) { s.scopes.functions[fn.Name] = fn } @@ -100,13 +113,30 @@ func (s *Scopes) FindFunction(name string) *exprpb.Decl { } // Group is a set of Decls that is pushed on or popped off a Scopes as a unit. -// Contains separate namespaces for idenifier and function Decls. +// Contains separate namespaces for identifier and function Decls. // (Should be named "Scope" perhaps?) type Group struct { idents map[string]*exprpb.Decl functions map[string]*exprpb.Decl } +// copy creates a new Group instance with a shallow copy of the variables and functions. +// If callers need to mutate the exprpb.Decl definitions for a Function, they should copy-on-write. +func (g *Group) copy() *Group { + cpy := &Group{ + idents: make(map[string]*exprpb.Decl, len(g.idents)), + functions: make(map[string]*exprpb.Decl, len(g.functions)), + } + for n, id := range g.idents { + cpy.idents[n] = id + } + for n, fn := range g.functions { + cpy.functions[n] = fn + } + return cpy +} + +// newGroup creates a new Group with empty maps for identifiers and functions. func newGroup() *Group { return &Group{ idents: make(map[string]*exprpb.Decl), diff --git a/vendor/github.com/google/cel-go/checker/env.go b/vendor/github.com/google/cel-go/checker/env.go index 659f2ec93..c7eeb04ee 100644 --- a/vendor/github.com/google/cel-go/checker/env.go +++ b/vendor/github.com/google/cel-go/checker/env.go @@ -18,6 +18,8 @@ import ( "fmt" "strings" + "google.golang.org/protobuf/proto" + "github.com/google/cel-go/checker/decls" "github.com/google/cel-go/common/containers" "github.com/google/cel-go/common/overloads" @@ -99,6 +101,9 @@ func NewEnv(container *containers.Container, provider ref.TypeProvider, opts ... if envOptions.crossTypeNumericComparisons { filteredOverloadIDs = make(map[string]struct{}) } + if envOptions.validatedDeclarations != nil { + declarations = envOptions.validatedDeclarations.Copy() + } return &Env{ container: container, provider: provider, @@ -117,7 +122,7 @@ func (e *Env) Add(decls ...*exprpb.Decl) error { case *exprpb.Decl_Ident: errMsgs = append(errMsgs, e.addIdent(sanitizeIdent(decl))) case *exprpb.Decl_Function: - errMsgs = append(errMsgs, e.addFunction(sanitizeFunction(decl))...) + errMsgs = append(errMsgs, e.setFunction(sanitizeFunction(decl))...) } } return formatError(errMsgs) @@ -176,8 +181,7 @@ func (e *Env) addOverload(f *exprpb.Decl, overload *exprpb.Decl_FunctionDecl_Ove overload.GetParams()...) overloadErased := substitute(emptyMappings, overloadFunction, true) for _, existing := range function.GetOverloads() { - existingFunction := decls.NewFunctionType(existing.GetResultType(), - existing.GetParams()...) + existingFunction := decls.NewFunctionType(existing.GetResultType(), existing.GetParams()...) existingErased := substitute(emptyMappings, existingFunction, true) overlap := isAssignable(emptyMappings, overloadErased, existingErased) != nil || isAssignable(emptyMappings, existingErased, overloadErased) != nil @@ -204,22 +208,37 @@ func (e *Env) addOverload(f *exprpb.Decl, overload *exprpb.Decl_FunctionDecl_Ove return errMsgs } -// addFunction adds the function Decl to the Env. +// setFunction adds the function Decl to the Env. // Adds a function decl if one doesn't already exist, then adds all overloads from the Decl. // If overload overlaps with an existing overload, adds to the errors in the Env instead. -func (e *Env) addFunction(decl *exprpb.Decl) []errorMsg { +func (e *Env) setFunction(decl *exprpb.Decl) []errorMsg { + errorMsgs := make([]errorMsg, 0) + overloads := decl.GetFunction().GetOverloads() current := e.declarations.FindFunction(decl.Name) if current == nil { //Add the function declaration without overloads and check the overloads below. current = decls.NewFunction(decl.Name) - e.declarations.AddFunction(current) - } - - errorMsgs := make([]errorMsg, 0) - for _, overload := range decl.GetFunction().GetOverloads() { - if _, found := e.filteredOverloadIDs[overload.GetOverloadId()]; found { - continue + } else { + existingOverloads := map[string]*exprpb.Decl_FunctionDecl_Overload{} + for _, overload := range current.GetFunction().GetOverloads() { + existingOverloads[overload.GetOverloadId()] = overload + } + newOverloads := []*exprpb.Decl_FunctionDecl_Overload{} + for _, overload := range overloads { + existing, found := existingOverloads[overload.GetOverloadId()] + if !found || !proto.Equal(existing, overload) { + newOverloads = append(newOverloads, overload) + } } + overloads = newOverloads + if len(newOverloads) == 0 { + return errorMsgs + } + // Copy on write since we don't know where this original definition came from. + current = proto.Clone(current).(*exprpb.Decl) + } + e.declarations.SetFunction(current) + for _, overload := range overloads { errorMsgs = append(errorMsgs, e.addOverload(current, overload)...) } return errorMsgs @@ -230,12 +249,21 @@ func (e *Env) addFunction(decl *exprpb.Decl) []errorMsg { func (e *Env) addIdent(decl *exprpb.Decl) errorMsg { current := e.declarations.FindIdentInScope(decl.Name) if current != nil { + if proto.Equal(current, decl) { + return "" + } return overlappingIdentifierError(decl.Name) } e.declarations.AddIdent(decl) return "" } +// isOverloadDisabled returns whether the overloadID is disabled in the current environment. +func (e *Env) isOverloadDisabled(overloadID string) bool { + _, found := e.filteredOverloadIDs[overloadID] + return found +} + // sanitizeFunction replaces well-known types referenced by message name with their equivalent // CEL built-in type instances. func sanitizeFunction(decl *exprpb.Decl) *exprpb.Decl { @@ -313,6 +341,12 @@ func getObjectWellKnownType(t *exprpb.Type) *exprpb.Type { return pb.CheckedWellKnowns[t.GetMessageType()] } +// validatedDeclarations returns a reference to the validated variable and function declaration scope stack. +// must be copied before use. +func (e *Env) validatedDeclarations() *decls.Scopes { + return e.declarations +} + // enterScope creates a new Env instance with a new innermost declaration scope. func (e *Env) enterScope() *Env { childDecls := e.declarations.Push() diff --git a/vendor/github.com/google/cel-go/checker/errors.go b/vendor/github.com/google/cel-go/checker/errors.go index 06566aecf..0014f9abe 100644 --- a/vendor/github.com/google/cel-go/checker/errors.go +++ b/vendor/github.com/google/cel-go/checker/errors.go @@ -29,10 +29,6 @@ func (e *typeErrors) undeclaredReference(l common.Location, container string, na e.ReportError(l, "undeclared reference to '%s' (in container '%s')", name, container) } -func (e *typeErrors) expressionDoesNotSelectField(l common.Location) { - e.ReportError(l, "expression does not select a field") -} - func (e *typeErrors) typeDoesNotSupportFieldSelection(l common.Location, t *exprpb.Type) { e.ReportError(l, "type '%s' does not support field selection", t) } diff --git a/vendor/github.com/google/cel-go/checker/options.go b/vendor/github.com/google/cel-go/checker/options.go index cacae10e7..cded00a66 100644 --- a/vendor/github.com/google/cel-go/checker/options.go +++ b/vendor/github.com/google/cel-go/checker/options.go @@ -14,9 +14,12 @@ package checker +import "github.com/google/cel-go/checker/decls" + type options struct { crossTypeNumericComparisons bool homogeneousAggregateLiterals bool + validatedDeclarations *decls.Scopes } // Option is a functional option for configuring the type-checker @@ -39,3 +42,12 @@ func HomogeneousAggregateLiterals(enabled bool) Option { return nil } } + +// ValidatedDeclarations provides a references to validated declarations which will be copied +// into new checker instances. +func ValidatedDeclarations(env *Env) Option { + return func(opts *options) error { + opts.validatedDeclarations = env.validatedDeclarations() + return nil + } +} diff --git a/vendor/github.com/google/cel-go/checker/types.go b/vendor/github.com/google/cel-go/checker/types.go index 38c11d41a..cd3416797 100644 --- a/vendor/github.com/google/cel-go/checker/types.go +++ b/vendor/github.com/google/cel-go/checker/types.go @@ -88,6 +88,8 @@ func FormatCheckedType(t *exprpb.Type) string { FormatCheckedType(decls.NewPrimitiveType(t.GetWrapper()))) case kindError: return "!error!" + case kindTypeParam: + return t.GetTypeParam() } return t.String() } @@ -149,21 +151,6 @@ func isEqualOrLessSpecific(t1 *exprpb.Type, t2 *exprpb.Type) bool { } } return true - case kindFunction: - fn1 := t1.GetFunction() - fn2 := t2.GetFunction() - if len(fn1.ArgTypes) != len(fn2.ArgTypes) { - return false - } - if !isEqualOrLessSpecific(fn1.ResultType, fn2.ResultType) { - return false - } - for i, a1 := range fn1.ArgTypes { - if !isEqualOrLessSpecific(a1, fn2.ArgTypes[i]) { - return false - } - } - return true case kindList: return isEqualOrLessSpecific(t1.GetListType().ElemType, t2.GetListType().ElemType) case kindMap: @@ -180,43 +167,26 @@ func isEqualOrLessSpecific(t1 *exprpb.Type, t2 *exprpb.Type) bool { /// internalIsAssignable returns true if t1 is assignable to t2. func internalIsAssignable(m *mapping, t1 *exprpb.Type, t2 *exprpb.Type) bool { - // A type is always assignable to itself. - // Early terminate the call to avoid cases of infinite recursion. - if proto.Equal(t1, t2) { - return true - } // Process type parameters. kind1, kind2 := kindOf(t1), kindOf(t2) if kind2 == kindTypeParam { - if t2Sub, found := m.find(t2); found { - // If the types are compatible, pick the more general type and return true - if !internalIsAssignable(m, t1, t2Sub) { - return false - } - m.add(t2, mostGeneral(t1, t2Sub)) + // If t2 is a valid type substitution for t1, return true. + valid, t2HasSub := isValidTypeSubstitution(m, t1, t2) + if valid { return true } - if notReferencedIn(m, t2, t1) { - m.add(t2, t1) - return true + // If t2 is not a valid type sub for t1, and already has a known substitution return false + // since it is not possible for t1 to be a substitution for t2. + if !valid && t2HasSub { + return false } + // Otherwise, fall through to check whether t1 is a possible substitution for t2. } if kind1 == kindTypeParam { - // For the lower type bound, we currently do not perform adjustment. The restricted - // way we use type parameters in lower type bounds, it is not necessary, but may - // become if we generalize type unification. - if t1Sub, found := m.find(t1); found { - // If the types are compatible, pick the more general type and return true - if !internalIsAssignable(m, t1Sub, t2) { - return false - } - m.add(t1, mostGeneral(t1Sub, t2)) - return true - } - if notReferencedIn(m, t1, t2) { - m.add(t1, t2) - return true - } + // Return whether t1 is a valid substitution for t2. If not, do no additional checks as the + // possible type substitutions have been searched in both directions. + valid, _ := isValidTypeSubstitution(m, t2, t1) + return valid } // Next check for wildcard types. @@ -262,18 +232,51 @@ func internalIsAssignable(m *mapping, t1 *exprpb.Type, t2 *exprpb.Type) bool { } } +// isValidTypeSubstitution returns whether t2 (or its type substitution) is a valid type +// substitution for t1, and whether t2 has a type substitution in mapping m. +// +// The type t2 is a valid substitution for t1 if any of the following statements is true +// - t2 has a type substitition (t2sub) equal to t1 +// - t2 has a type substitution (t2sub) assignable to t1 +// - t2 does not occur within t1. +func isValidTypeSubstitution(m *mapping, t1, t2 *exprpb.Type) (valid, hasSub bool) { + // Early return if the t1 and t2 are the same instance. + kind1, kind2 := kindOf(t1), kindOf(t2) + if kind1 == kind2 && (t1 == t2 || proto.Equal(t1, t2)) { + return true, true + } + if t2Sub, found := m.find(t2); found { + // Early return if t1 and t2Sub are the same instance as otherwise the mapping + // might mark a type as being a subtitution for itself. + if kind1 == kindOf(t2Sub) && (t1 == t2Sub || proto.Equal(t1, t2Sub)) { + return true, true + } + // If the types are compatible, pick the more general type and return true + if internalIsAssignable(m, t1, t2Sub) { + t2New := mostGeneral(t1, t2Sub) + // only update the type reference map if the target type does not occur within it. + if notReferencedIn(m, t2, t2New) { + m.add(t2, t2New) + } + // acknowledge the type agreement, and that the substitution is already tracked. + return true, true + } + return false, true + } + if notReferencedIn(m, t2, t1) { + m.add(t2, t1) + return true, false + } + return false, false +} + // internalIsAssignableAbstractType returns true if the abstract type names agree and all type // parameters are assignable. func internalIsAssignableAbstractType(m *mapping, a1 *exprpb.Type_AbstractType, a2 *exprpb.Type_AbstractType) bool { - if a1.GetName() != a2.GetName() { - return false - } - if internalIsAssignableList(m, a1.GetParameterTypes(), a2.GetParameterTypes()) { - return true - } - return false + return a1.GetName() == a2.GetName() && + internalIsAssignableList(m, a1.GetParameterTypes(), a2.GetParameterTypes()) } // internalIsAssignableFunction returns true if the function return type and arg types are @@ -421,15 +424,6 @@ func notReferencedIn(m *mapping, t *exprpb.Type, withinType *exprpb.Type) bool { } } return true - case kindFunction: - fn := withinType.GetFunction() - types := flattenFunctionTypes(fn) - for _, a := range types { - if !notReferencedIn(m, t, a) { - return false - } - } - return true case kindList: return notReferencedIn(m, t, withinType.GetListType().ElemType) case kindMap: @@ -454,7 +448,6 @@ func substitute(m *mapping, t *exprpb.Type, typeParamToDyn bool) *exprpb.Type { } switch kind { case kindAbstract: - // TODO: implement! at := t.GetAbstractType() params := make([]*exprpb.Type, len(at.GetParameterTypes())) for i, p := range at.GetParameterTypes() { diff --git a/vendor/github.com/google/cel-go/common/error.go b/vendor/github.com/google/cel-go/common/error.go index bfe93d973..f91f7f8d1 100644 --- a/vendor/github.com/google/cel-go/common/error.go +++ b/vendor/github.com/google/cel-go/common/error.go @@ -31,6 +31,9 @@ type Error struct { const ( dot = "." ind = "^" + + // maxSnippetLength is the largest number of characters which can be rendered in an error message snippet. + maxSnippetLength = 16384 ) var ( @@ -45,7 +48,7 @@ func (e *Error) ToDisplayString(source Source) string { e.Location.Line(), e.Location.Column()+1, // add one to the 0-based column for display e.Message) - if snippet, found := source.Snippet(e.Location.Line()); found { + if snippet, found := source.Snippet(e.Location.Line()); found && len(snippet) <= maxSnippetLength { snippet := strings.Replace(snippet, "\t", " ", -1) srcLine := "\n | " + snippet var bytes = []byte(snippet) diff --git a/vendor/github.com/google/cel-go/common/errors.go b/vendor/github.com/google/cel-go/common/errors.go index 6be0fdef3..daebba860 100644 --- a/vendor/github.com/google/cel-go/common/errors.go +++ b/vendor/github.com/google/cel-go/common/errors.go @@ -17,23 +17,32 @@ package common import ( "fmt" "sort" + "strings" ) // Errors type which contains a list of errors observed during parsing. type Errors struct { - errors []Error - source Source + errors []Error + source Source + numErrors int + maxErrorsToReport int } // NewErrors creates a new instance of the Errors type. func NewErrors(source Source) *Errors { return &Errors{ - errors: []Error{}, - source: source} + errors: []Error{}, + source: source, + maxErrorsToReport: 100, + } } // ReportError records an error at a source location. func (e *Errors) ReportError(l Location, format string, args ...interface{}) { + e.numErrors++ + if e.numErrors > e.maxErrorsToReport { + return + } err := Error{ Location: l, Message: fmt.Sprintf(format, args...), @@ -46,18 +55,28 @@ func (e *Errors) GetErrors() []Error { return e.errors[:] } -// Append takes an Errors object as input creates a new Errors object with the current and input -// errors. +// Append creates a new Errors object with the current and input errors. func (e *Errors) Append(errs []Error) *Errors { return &Errors{ - errors: append(e.errors, errs...), - source: e.source, + errors: append(e.errors, errs...), + source: e.source, + numErrors: e.numErrors + len(errs), + maxErrorsToReport: e.maxErrorsToReport, } } // ToDisplayString returns the error set to a newline delimited string. func (e *Errors) ToDisplayString() string { - var result = "" + errorsInString := e.maxErrorsToReport + if e.numErrors > e.maxErrorsToReport { + // add one more error to indicate the number of errors truncated. + errorsInString++ + } else { + // otherwise the error set will just contain the number of errors. + errorsInString = e.numErrors + } + + result := make([]string, errorsInString) sort.SliceStable(e.errors, func(i, j int) bool { ei := e.errors[i].Location ej := e.errors[j].Location @@ -65,10 +84,14 @@ func (e *Errors) ToDisplayString() string { (ei.Line() == ej.Line() && ei.Column() < ej.Column()) }) for i, err := range e.errors { - if i >= 1 { - result += "\n" + // This can happen during the append of two errors objects + if i >= e.maxErrorsToReport { + break } - result += err.ToDisplayString(e.source) + result[i] = err.ToDisplayString(e.source) + } + if e.numErrors > e.maxErrorsToReport { + result[e.maxErrorsToReport] = fmt.Sprintf("%d more errors were truncated", e.numErrors-e.maxErrorsToReport) } - return result + return strings.Join(result, "\n") } diff --git a/vendor/github.com/google/cel-go/common/location.go b/vendor/github.com/google/cel-go/common/location.go index 31fce6cd3..ec3fa7cb5 100644 --- a/vendor/github.com/google/cel-go/common/location.go +++ b/vendor/github.com/google/cel-go/common/location.go @@ -27,7 +27,7 @@ type SourceLocation struct { } var ( - // Location implements the SourcceLocation interface. + // Location implements the SourceLocation interface. _ Location = &SourceLocation{} // NoLocation is a particular illegal location. NoLocation = &SourceLocation{-1, -1} diff --git a/vendor/github.com/google/cel-go/common/operators/operators.go b/vendor/github.com/google/cel-go/common/operators/operators.go index 9c30b985b..fa25dfb7f 100644 --- a/vendor/github.com/google/cel-go/common/operators/operators.go +++ b/vendor/github.com/google/cel-go/common/operators/operators.go @@ -14,7 +14,7 @@ // Package operators defines the internal function names of operators. // -// ALl operators in the expression language are modelled as function calls. +// All operators in the expression language are modelled as function calls. package operators // String "names" for CEL operators. @@ -141,3 +141,13 @@ func Precedence(symbol string) int { } return op.precedence } + +// Arity returns the number of argument the operator takes +// -1 is returned if an undefined symbol is provided +func Arity(symbol string) int { + op, found := operatorMap[symbol] + if !found { + return -1 + } + return op.arity +} diff --git a/vendor/github.com/google/cel-go/common/types/BUILD.bazel b/vendor/github.com/google/cel-go/common/types/BUILD.bazel index 1f77c86a1..5f1b1cd1f 100644 --- a/vendor/github.com/google/cel-go/common/types/BUILD.bazel +++ b/vendor/github.com/google/cel-go/common/types/BUILD.bazel @@ -73,6 +73,7 @@ go_test( "timestamp_test.go", "type_test.go", "uint_test.go", + "util_test.go", ], embed = [":go_default_library"], deps = [ diff --git a/vendor/github.com/google/cel-go/common/types/bool.go b/vendor/github.com/google/cel-go/common/types/bool.go index 0039ecc9a..1b55ba952 100644 --- a/vendor/github.com/google/cel-go/common/types/bool.go +++ b/vendor/github.com/google/cel-go/common/types/bool.go @@ -130,12 +130,13 @@ func (b Bool) Value() interface{} { } // IsBool returns whether the input ref.Val or ref.Type is equal to BoolType. -func IsBool(elem interface{}) bool { - switch elem := elem.(type) { - case ref.Type: - return elem == BoolType +func IsBool(elem ref.Val) bool { + switch v := elem.(type) { + case Bool: + return true case ref.Val: - return IsBool(elem.Type()) + return v.Type() == BoolType + default: + return false } - return false } diff --git a/vendor/github.com/google/cel-go/common/types/bytes.go b/vendor/github.com/google/cel-go/common/types/bytes.go index 9dd16bce0..3575717ec 100644 --- a/vendor/github.com/google/cel-go/common/types/bytes.go +++ b/vendor/github.com/google/cel-go/common/types/bytes.go @@ -53,7 +53,7 @@ func (b Bytes) Add(other ref.Val) ref.Val { return append(b, otherBytes...) } -// Compare implments traits.Comparer interface method by lexicographic ordering. +// Compare implements traits.Comparer interface method by lexicographic ordering. func (b Bytes) Compare(other ref.Val) ref.Val { otherBytes, ok := other.(Bytes) if !ok { diff --git a/vendor/github.com/google/cel-go/common/types/compare.go b/vendor/github.com/google/cel-go/common/types/compare.go index a6150ee7f..e19682618 100644 --- a/vendor/github.com/google/cel-go/common/types/compare.go +++ b/vendor/github.com/google/cel-go/common/types/compare.go @@ -16,6 +16,8 @@ package types import ( "math" + + "github.com/google/cel-go/common/types/ref" ) func compareDoubleInt(d Double, i Int) Int { @@ -74,7 +76,7 @@ func compareDouble(a, b Double) Int { return IntZero } -func compareInt(a, b Int) Int { +func compareInt(a, b Int) ref.Val { if a < b { return IntNegOne } @@ -84,7 +86,7 @@ func compareInt(a, b Int) Int { return IntZero } -func compareUint(a, b Uint) Int { +func compareUint(a, b Uint) ref.Val { if a < b { return IntNegOne } diff --git a/vendor/github.com/google/cel-go/common/types/err.go b/vendor/github.com/google/cel-go/common/types/err.go index 1ae247f41..93d79cdcb 100644 --- a/vendor/github.com/google/cel-go/common/types/err.go +++ b/vendor/github.com/google/cel-go/common/types/err.go @@ -72,18 +72,13 @@ func MaybeNoSuchOverloadErr(val ref.Val) ref.Val { return ValOrErr(val, "no such overload") } -// ValOrErr either returns the existing error or create a new one. +// ValOrErr either returns the existing error or creates a new one. // TODO: Audit the use of this function and standardize the error messages and codes. func ValOrErr(val ref.Val, format string, args ...interface{}) ref.Val { - if val == nil { - return NewErr(format, args...) - } - switch val.Type() { - case ErrType, UnknownType: - return val - default: + if val == nil || !IsUnknownOrError(val) { return NewErr(format, args...) } + return val } // wrapErr wraps an existing Go error value into a CEL Err value. @@ -126,5 +121,10 @@ func (e *Err) Value() interface{} { // IsError returns whether the input element ref.Type or ref.Val is equal to // the ErrType singleton. func IsError(val ref.Val) bool { - return val.Type() == ErrType + switch val.(type) { + case *Err: + return true + default: + return false + } } diff --git a/vendor/github.com/google/cel-go/common/types/list.go b/vendor/github.com/google/cel-go/common/types/list.go index 7451b9b3c..7230f7ea1 100644 --- a/vendor/github.com/google/cel-go/common/types/list.go +++ b/vendor/github.com/google/cel-go/common/types/list.go @@ -96,14 +96,16 @@ func NewJSONList(adapter ref.TypeAdapter, l *structpb.ListValue) traits.Lister { } // NewMutableList creates a new mutable list whose internal state can be modified. -// -// The mutable list only handles `Add` calls correctly as it is intended only for use within -// comprehension loops which generate an immutable result upon completion. -func NewMutableList(adapter ref.TypeAdapter) traits.Lister { +func NewMutableList(adapter ref.TypeAdapter) traits.MutableLister { + var mutableValues []ref.Val return &mutableList{ - TypeAdapter: adapter, - baseList: nil, - mutableValues: []ref.Val{}, + baseList: &baseList{ + TypeAdapter: adapter, + value: mutableValues, + size: 0, + get: func(i int) interface{} { return mutableValues[i] }, + }, + mutableValues: mutableValues, } } @@ -238,16 +240,14 @@ func (l *baseList) Equal(other ref.Val) ref.Val { // Get implements the traits.Indexer interface method. func (l *baseList) Get(index ref.Val) ref.Val { - i, ok := index.(Int) - if !ok { - return ValOrErr(index, "unsupported index type '%s' in list", index.Type()) + ind, err := indexOrError(index) + if err != nil { + return ValOrErr(index, err.Error()) } - iv := int(i) - if iv < 0 || iv >= l.size { - return NewErr("index '%d' out of range in list size '%d'", i, l.Size()) + if ind < 0 || ind >= l.size { + return NewErr("index '%d' out of range in list size '%d'", ind, l.Size()) } - elem := l.get(iv) - return l.NativeToValue(elem) + return l.NativeToValue(l.get(ind)) } // Iterator implements the traits.Iterable interface method. @@ -272,20 +272,25 @@ func (l *baseList) Value() interface{} { // mutableList aggregates values into its internal storage. For use with internal CEL variables only. type mutableList struct { - ref.TypeAdapter *baseList mutableValues []ref.Val } // Add copies elements from the other list into the internal storage of the mutable list. +// The ref.Val returned by Add is the receiver. func (l *mutableList) Add(other ref.Val) ref.Val { - otherList, ok := other.(traits.Lister) - if !ok { + switch otherList := other.(type) { + case *mutableList: + l.mutableValues = append(l.mutableValues, otherList.mutableValues...) + l.size += len(otherList.mutableValues) + case traits.Lister: + for i := IntZero; i < otherList.Size().(Int); i++ { + l.size++ + l.mutableValues = append(l.mutableValues, otherList.Get(i)) + } + default: return MaybeNoSuchOverloadErr(otherList) } - for i := IntZero; i < otherList.Size().(Int); i++ { - l.mutableValues = append(l.mutableValues, otherList.Get(i)) - } return l } @@ -323,7 +328,7 @@ func (l *concatList) Add(other ref.Val) ref.Val { nextList: otherList} } -// Contains implments the traits.Container interface method. +// Contains implements the traits.Container interface method. func (l *concatList) Contains(elem ref.Val) ref.Val { // The concat list relies on the IsErrorOrUnknown checks against the input element to be // performed by the `prevList` and/or `nextList`. @@ -391,10 +396,11 @@ func (l *concatList) Equal(other ref.Val) ref.Val { // Get implements the traits.Indexer interface method. func (l *concatList) Get(index ref.Val) ref.Val { - i, ok := index.(Int) - if !ok { - return MaybeNoSuchOverloadErr(index) + ind, err := indexOrError(index) + if err != nil { + return ValOrErr(index, err.Error()) } + i := Int(ind) if i < l.prevList.Size().(Int) { return l.prevList.Get(i) } @@ -462,3 +468,22 @@ func (it *listIterator) Next() ref.Val { } return nil } + +func indexOrError(index ref.Val) (int, error) { + switch iv := index.(type) { + case Int: + return int(iv), nil + case Double: + if ik, ok := doubleToInt64Lossless(float64(iv)); ok { + return int(ik), nil + } + return -1, fmt.Errorf("unsupported index value %v in list", index) + case Uint: + if ik, ok := uint64ToInt64Lossless(uint64(iv)); ok { + return int(ik), nil + } + return -1, fmt.Errorf("unsupported index value %v in list", index) + default: + return -1, fmt.Errorf("unsupported index type '%s' in list", index.Type()) + } +} diff --git a/vendor/github.com/google/cel-go/common/types/map.go b/vendor/github.com/google/cel-go/common/types/map.go index 486c208ca..586559402 100644 --- a/vendor/github.com/google/cel-go/common/types/map.go +++ b/vendor/github.com/google/cel-go/common/types/map.go @@ -105,7 +105,7 @@ var ( // This interface implements portions of the API surface area required by the traits.Mapper // interface. type mapAccessor interface { - // Find returns a value, if one exists, for the inpput key. + // Find returns a value, if one exists, for the input key. // // If the key is not found the function returns (nil, false). Find(ref.Val) (ref.Val, bool) @@ -429,7 +429,7 @@ func (a *refValMapAccessor) Find(key ref.Val) (ref.Val, bool) { case Double: if ik, ok := doubleToInt64Lossless(float64(k)); ok { if keyVal, found := a.mapVal[Int(ik)]; found { - return keyVal, true + return keyVal, found } } if uk, ok := doubleToUint64Lossless(float64(k)); ok { diff --git a/vendor/github.com/google/cel-go/common/types/object.go b/vendor/github.com/google/cel-go/common/types/object.go index 5e4212fa3..5faf85511 100644 --- a/vendor/github.com/google/cel-go/common/types/object.go +++ b/vendor/github.com/google/cel-go/common/types/object.go @@ -53,24 +53,24 @@ func NewObject(adapter ref.TypeAdapter, } func (o *protoObj) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { - pb := o.value - if reflect.TypeOf(pb).AssignableTo(typeDesc) { - return pb, nil + srcPB := o.value + if reflect.TypeOf(srcPB).AssignableTo(typeDesc) { + return srcPB, nil } if reflect.TypeOf(o).AssignableTo(typeDesc) { return o, nil } switch typeDesc { case anyValueType: - _, isAny := pb.(*anypb.Any) + _, isAny := srcPB.(*anypb.Any) if isAny { - return pb, nil + return srcPB, nil } - return anypb.New(pb) + return anypb.New(srcPB) case jsonValueType: // Marshal the proto to JSON first, and then rehydrate as protobuf.Value as there is no // support for direct conversion from proto.Message to protobuf.Value. - bytes, err := protojson.Marshal(pb) + bytes, err := protojson.Marshal(srcPB) if err != nil { return nil, err } @@ -88,7 +88,10 @@ func (o *protoObj) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { val := reflect.New(typeDesc.Elem()).Interface() dstPB, ok := val.(proto.Message) if ok { - proto.Merge(dstPB, pb) + err := pb.Merge(dstPB, srcPB) + if err != nil { + return nil, fmt.Errorf("type conversion error: %v", err) + } return dstPB, nil } } diff --git a/vendor/github.com/google/cel-go/common/types/overflow.go b/vendor/github.com/google/cel-go/common/types/overflow.go index 99780c355..c68a92182 100644 --- a/vendor/github.com/google/cel-go/common/types/overflow.go +++ b/vendor/github.com/google/cel-go/common/types/overflow.go @@ -316,7 +316,7 @@ func doubleToUint64Checked(v float64) (uint64, error) { return uint64(v), nil } -// int64toUint64Checked converts an int64 to a uint64 value. +// int64ToUint64Checked converts an int64 to a uint64 value. // // If the conversion fails due to overflow the error return value will be non-nil. func int64ToUint64Checked(v int64) (uint64, error) { @@ -326,7 +326,7 @@ func int64ToUint64Checked(v int64) (uint64, error) { return uint64(v), nil } -// int64toInt32Checked converts an int64 to an int32 value. +// int64ToInt32Checked converts an int64 to an int32 value. // // If the conversion fails due to overflow the error return value will be non-nil. func int64ToInt32Checked(v int64) (int32, error) { @@ -336,7 +336,7 @@ func int64ToInt32Checked(v int64) (int32, error) { return int32(v), nil } -// uint64toUint32Checked converts a uint64 to a uint32 value. +// uint64ToUint32Checked converts a uint64 to a uint32 value. // // If the conversion fails due to overflow the error return value will be non-nil. func uint64ToUint32Checked(v uint64) (uint32, error) { @@ -346,7 +346,7 @@ func uint64ToUint32Checked(v uint64) (uint32, error) { return uint32(v), nil } -// uint64toInt64Checked converts a uint64 to an int64 value. +// uint64ToInt64Checked converts a uint64 to an int64 value. // // If the conversion fails due to overflow the error return value will be non-nil. func uint64ToInt64Checked(v uint64) (int64, error) { diff --git a/vendor/github.com/google/cel-go/common/types/pb/equal.go b/vendor/github.com/google/cel-go/common/types/pb/equal.go index 392a94961..76893d85e 100644 --- a/vendor/github.com/google/cel-go/common/types/pb/equal.go +++ b/vendor/github.com/google/cel-go/common/types/pb/equal.go @@ -21,7 +21,8 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/types/known/anypb" + + anypb "google.golang.org/protobuf/types/known/anypb" ) // Equal returns whether two proto.Message instances are equal using the following criteria: diff --git a/vendor/github.com/google/cel-go/common/types/pb/pb.go b/vendor/github.com/google/cel-go/common/types/pb/pb.go index d02fbe0c2..457b47cee 100644 --- a/vendor/github.com/google/cel-go/common/types/pb/pb.go +++ b/vendor/github.com/google/cel-go/common/types/pb/pb.go @@ -17,6 +17,8 @@ package pb import ( + "fmt" + "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" @@ -48,6 +50,31 @@ var ( } ) +// Merge will copy the source proto message into the destination, or error if the merge cannot be completed. +// +// Unlike the proto.Merge, this method will fallback to proto.Marshal/Unmarshal of the two proto messages do not +// share the same instance of their type descriptor. +func Merge(dstPB, srcPB proto.Message) error { + src, dst := srcPB.ProtoReflect(), dstPB.ProtoReflect() + if src.Descriptor() == dst.Descriptor() { + proto.Merge(dstPB, srcPB) + return nil + } + if src.Descriptor().FullName() != dst.Descriptor().FullName() { + return fmt.Errorf("pb.Merge() arguments must be the same type. got: %v, %v", + dst.Descriptor().FullName(), src.Descriptor().FullName()) + } + bytes, err := proto.Marshal(srcPB) + if err != nil { + return fmt.Errorf("pb.Merge(dstPB, srcPB) failed to marshal source proto: %v", err) + } + err = proto.Unmarshal(bytes, dstPB) + if err != nil { + return fmt.Errorf("pb.Merge(dstPB, srcPB) failed to unmarshal to dest proto: %v", err) + } + return nil +} + // NewDb creates a new `pb.Db` with an empty type name to file description map. func NewDb() *Db { pbdb := &Db{ diff --git a/vendor/github.com/google/cel-go/common/types/pb/type.go b/vendor/github.com/google/cel-go/common/types/pb/type.go index 8594008b1..912076fa4 100644 --- a/vendor/github.com/google/cel-go/common/types/pb/type.go +++ b/vendor/github.com/google/cel-go/common/types/pb/type.go @@ -87,7 +87,7 @@ func (td *TypeDescription) FieldByName(name string) (*FieldDescription, bool) { // MaybeUnwrap accepts a proto message as input and unwraps it to a primitive CEL type if possible. // // This method returns the unwrapped value and 'true', else the original value and 'false'. -func (td *TypeDescription) MaybeUnwrap(msg proto.Message) (interface{}, bool) { +func (td *TypeDescription) MaybeUnwrap(msg proto.Message) (interface{}, bool, error) { return unwrap(td, msg) } @@ -118,7 +118,7 @@ func NewFieldDescription(fieldDesc protoreflect.FieldDescriptor) *FieldDescripti switch fieldDesc.Kind() { case protoreflect.EnumKind: reflectType = reflectTypeOf(protoreflect.EnumNumber(0)) - case protoreflect.MessageKind: + case protoreflect.GroupKind, protoreflect.MessageKind: zeroMsg = dynamicpb.NewMessage(fieldDesc.Message()) reflectType = reflectTypeOf(zeroMsg) default: @@ -248,8 +248,8 @@ func (fd *FieldDescription) GetFrom(target interface{}) (interface{}, error) { return &Map{Map: fv, KeyType: fd.KeyType, ValueType: fd.ValueType}, nil case protoreflect.Message: // Make sure to unwrap well-known protobuf types before returning. - unwrapped, _ := fd.MaybeUnwrapDynamic(fv) - return unwrapped, nil + unwrapped, _, err := fd.MaybeUnwrapDynamic(fv) + return unwrapped, err default: return fv, nil } @@ -267,7 +267,8 @@ func (fd *FieldDescription) IsMap() bool { // IsMessage returns true if the field is of message type. func (fd *FieldDescription) IsMessage() bool { - return fd.desc.Kind() == protoreflect.MessageKind + kind := fd.desc.Kind() + return kind == protoreflect.MessageKind || kind == protoreflect.GroupKind } // IsOneof returns true if the field is declared within a oneof block. @@ -288,7 +289,7 @@ func (fd *FieldDescription) IsList() bool { // // This function returns the unwrapped value and 'true' on success, or the original value // and 'false' otherwise. -func (fd *FieldDescription) MaybeUnwrapDynamic(msg protoreflect.Message) (interface{}, bool) { +func (fd *FieldDescription) MaybeUnwrapDynamic(msg protoreflect.Message) (interface{}, bool, error) { return unwrapDynamic(fd, msg) } @@ -316,7 +317,7 @@ func (fd *FieldDescription) Zero() proto.Message { } func (fd *FieldDescription) typeDefToType() *exprpb.Type { - if fd.desc.Kind() == protoreflect.MessageKind { + if fd.desc.Kind() == protoreflect.MessageKind || fd.desc.Kind() == protoreflect.GroupKind { msgType := string(fd.desc.Message().FullName()) if wk, found := CheckedWellKnowns[msgType]; found { return wk @@ -361,63 +362,63 @@ func checkedWrap(t *exprpb.Type) *exprpb.Type { // input message is a *dynamicpb.Message which obscures the typing information from Go. // // Returns the unwrapped value and 'true' if unwrapped, otherwise the input value and 'false'. -func unwrap(desc description, msg proto.Message) (interface{}, bool) { +func unwrap(desc description, msg proto.Message) (interface{}, bool, error) { switch v := msg.(type) { case *anypb.Any: dynMsg, err := v.UnmarshalNew() if err != nil { - return v, false + return v, false, err } return unwrapDynamic(desc, dynMsg.ProtoReflect()) case *dynamicpb.Message: return unwrapDynamic(desc, v) case *dpb.Duration: - return v.AsDuration(), true + return v.AsDuration(), true, nil case *tpb.Timestamp: - return v.AsTime(), true + return v.AsTime(), true, nil case *structpb.Value: switch v.GetKind().(type) { case *structpb.Value_BoolValue: - return v.GetBoolValue(), true + return v.GetBoolValue(), true, nil case *structpb.Value_ListValue: - return v.GetListValue(), true + return v.GetListValue(), true, nil case *structpb.Value_NullValue: - return structpb.NullValue_NULL_VALUE, true + return structpb.NullValue_NULL_VALUE, true, nil case *structpb.Value_NumberValue: - return v.GetNumberValue(), true + return v.GetNumberValue(), true, nil case *structpb.Value_StringValue: - return v.GetStringValue(), true + return v.GetStringValue(), true, nil case *structpb.Value_StructValue: - return v.GetStructValue(), true + return v.GetStructValue(), true, nil default: - return structpb.NullValue_NULL_VALUE, true + return structpb.NullValue_NULL_VALUE, true, nil } case *wrapperspb.BoolValue: - return v.GetValue(), true + return v.GetValue(), true, nil case *wrapperspb.BytesValue: - return v.GetValue(), true + return v.GetValue(), true, nil case *wrapperspb.DoubleValue: - return v.GetValue(), true + return v.GetValue(), true, nil case *wrapperspb.FloatValue: - return float64(v.GetValue()), true + return float64(v.GetValue()), true, nil case *wrapperspb.Int32Value: - return int64(v.GetValue()), true + return int64(v.GetValue()), true, nil case *wrapperspb.Int64Value: - return v.GetValue(), true + return v.GetValue(), true, nil case *wrapperspb.StringValue: - return v.GetValue(), true + return v.GetValue(), true, nil case *wrapperspb.UInt32Value: - return uint64(v.GetValue()), true + return uint64(v.GetValue()), true, nil case *wrapperspb.UInt64Value: - return v.GetValue(), true + return v.GetValue(), true, nil } - return msg, false + return msg, false, nil } // unwrapDynamic unwraps a reflected protobuf Message value. // // Returns the unwrapped value and 'true' if unwrapped, otherwise the input value and 'false'. -func unwrapDynamic(desc description, refMsg protoreflect.Message) (interface{}, bool) { +func unwrapDynamic(desc description, refMsg protoreflect.Message) (interface{}, bool, error) { msg := refMsg.Interface() if !refMsg.IsValid() { msg = desc.Zero() @@ -432,18 +433,22 @@ func unwrapDynamic(desc description, refMsg protoreflect.Message) (interface{}, // unwrapped before being returned to the caller. Otherwise, the dynamic protobuf object // represented by the Any will be returned. unwrappedAny := &anypb.Any{} - proto.Merge(unwrappedAny, msg) + err := Merge(unwrappedAny, msg) + if err != nil { + return nil, false, err + } dynMsg, err := unwrappedAny.UnmarshalNew() if err != nil { // Allow the error to move further up the stack as it should result in an type // conversion error if the caller does not recover it somehow. - return unwrappedAny, true + return nil, false, err } // Attempt to unwrap the dynamic type, otherwise return the dynamic message. - if unwrapped, nested := unwrapDynamic(desc, dynMsg.ProtoReflect()); nested { - return unwrapped, true + unwrapped, nested, err := unwrapDynamic(desc, dynMsg.ProtoReflect()) + if err == nil && nested { + return unwrapped, true, nil } - return dynMsg, true + return dynMsg, true, err case "google.protobuf.BoolValue", "google.protobuf.BytesValue", "google.protobuf.DoubleValue", @@ -456,34 +461,49 @@ func unwrapDynamic(desc description, refMsg protoreflect.Message) (interface{}, // The msg value is ignored when dealing with wrapper types as they have a null or value // behavior, rather than the standard zero value behavior of other proto message types. if !refMsg.IsValid() { - return structpb.NullValue_NULL_VALUE, true + return structpb.NullValue_NULL_VALUE, true, nil } valueField := refMsg.Descriptor().Fields().ByName("value") - return refMsg.Get(valueField).Interface(), true + return refMsg.Get(valueField).Interface(), true, nil case "google.protobuf.Duration": unwrapped := &dpb.Duration{} - proto.Merge(unwrapped, msg) - return unwrapped.AsDuration(), true + err := Merge(unwrapped, msg) + if err != nil { + return nil, false, err + } + return unwrapped.AsDuration(), true, nil case "google.protobuf.ListValue": unwrapped := &structpb.ListValue{} - proto.Merge(unwrapped, msg) - return unwrapped, true + err := Merge(unwrapped, msg) + if err != nil { + return nil, false, err + } + return unwrapped, true, nil case "google.protobuf.NullValue": - return structpb.NullValue_NULL_VALUE, true + return structpb.NullValue_NULL_VALUE, true, nil case "google.protobuf.Struct": unwrapped := &structpb.Struct{} - proto.Merge(unwrapped, msg) - return unwrapped, true + err := Merge(unwrapped, msg) + if err != nil { + return nil, false, err + } + return unwrapped, true, nil case "google.protobuf.Timestamp": unwrapped := &tpb.Timestamp{} - proto.Merge(unwrapped, msg) - return unwrapped.AsTime(), true + err := Merge(unwrapped, msg) + if err != nil { + return nil, false, err + } + return unwrapped.AsTime(), true, nil case "google.protobuf.Value": unwrapped := &structpb.Value{} - proto.Merge(unwrapped, msg) + err := Merge(unwrapped, msg) + if err != nil { + return nil, false, err + } return unwrap(desc, unwrapped) } - return msg, false + return msg, false, nil } // reflectTypeOf intercepts the reflect.Type call to ensure that dynamicpb.Message types preserve diff --git a/vendor/github.com/google/cel-go/common/types/provider.go b/vendor/github.com/google/cel-go/common/types/provider.go index 3ab30b763..02087d14e 100644 --- a/vendor/github.com/google/cel-go/common/types/provider.go +++ b/vendor/github.com/google/cel-go/common/types/provider.go @@ -206,7 +206,10 @@ func (p *protoTypeRegistry) NativeToValue(value interface{}) ref.Val { if !found { return NewErr("unknown type: '%s'", typeName) } - unwrapped, isUnwrapped := td.MaybeUnwrap(v) + unwrapped, isUnwrapped, err := td.MaybeUnwrap(v) + if err != nil { + return UnsupportedRefValConversionErr(v) + } if isUnwrapped { return p.NativeToValue(unwrapped) } @@ -394,7 +397,10 @@ func nativeToValue(a ref.TypeAdapter, value interface{}) (ref.Val, bool) { if !found { return nil, false } - val, unwrapped := td.MaybeUnwrap(v) + val, unwrapped, err := td.MaybeUnwrap(v) + if err != nil { + return UnsupportedRefValConversionErr(v), true + } if !unwrapped { return nil, false } diff --git a/vendor/github.com/google/cel-go/common/types/ref/reference.go b/vendor/github.com/google/cel-go/common/types/ref/reference.go index e12169988..3098580c9 100644 --- a/vendor/github.com/google/cel-go/common/types/ref/reference.go +++ b/vendor/github.com/google/cel-go/common/types/ref/reference.go @@ -12,8 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package ref contains the reference interfaces used throughout the types -// components. +// Package ref contains the reference interfaces used throughout the types components. package ref import ( @@ -29,31 +28,27 @@ type Type interface { // TypeName returns the qualified type name of the type. // - // The type name is also used as the type's identifier name at type-check - // and interpretation time. + // The type name is also used as the type's identifier name at type-check and interpretation time. TypeName() string } // Val interface defines the functions supported by all expression values. -// Val implementations may specialize the behavior of the value through the -// addition of traits. +// Val implementations may specialize the behavior of the value through the addition of traits. type Val interface { // ConvertToNative converts the Value to a native Go struct according to the // reflected type description, or error if the conversion is not feasible. ConvertToNative(typeDesc reflect.Type) (interface{}, error) - // ConvertToType supports type conversions between value types supported by - // the expression language. + // ConvertToType supports type conversions between value types supported by the expression language. ConvertToType(typeValue Type) Val - // Equal returns true if the `other` value has the same type and content as - // the implementing struct. + // Equal returns true if the `other` value has the same type and content as the implementing struct. Equal(other Val) Val // Type returns the TypeValue of the value. Type() Type - // Value returns the raw value of the instance which may not be directly - // compatible with the expression language types. + // Value returns the raw value of the instance which may not be directly compatible with the expression + // language types. Value() interface{} } diff --git a/vendor/github.com/google/cel-go/common/types/string.go b/vendor/github.com/google/cel-go/common/types/string.go index 60192a468..b6d665683 100644 --- a/vendor/github.com/google/cel-go/common/types/string.go +++ b/vendor/github.com/google/cel-go/common/types/string.go @@ -167,7 +167,7 @@ func (s String) Match(pattern ref.Val) ref.Val { return Bool(matched) } -// Receive implements traits.Reciever.Receive. +// Receive implements traits.Receiver.Receive. func (s String) Receive(function string, overload string, args []ref.Val) ref.Val { switch len(args) { case 1: diff --git a/vendor/github.com/google/cel-go/common/types/timestamp.go b/vendor/github.com/google/cel-go/common/types/timestamp.go index 692acd336..7513a1b21 100644 --- a/vendor/github.com/google/cel-go/common/types/timestamp.go +++ b/vendor/github.com/google/cel-go/common/types/timestamp.go @@ -138,7 +138,7 @@ func (t Timestamp) Equal(other ref.Val) ref.Val { return Bool(ok && t.Time.Equal(otherTime.Time)) } -// Receive implements traits.Reciever.Receive. +// Receive implements traits.Receiver.Receive. func (t Timestamp) Receive(function string, overload string, args []ref.Val) ref.Val { switch len(args) { case 0: @@ -299,7 +299,7 @@ func timeZone(tz ref.Val, visitor timestampVisitor) timestampVisitor { if err != nil { return wrapErr(err) } - min, err := strconv.Atoi(string(val[ind+1])) + min, err := strconv.Atoi(string(val[ind+1:])) if err != nil { return wrapErr(err) } diff --git a/vendor/github.com/google/cel-go/common/types/traits/lister.go b/vendor/github.com/google/cel-go/common/types/traits/lister.go index f40e7ee40..5cf2593f3 100644 --- a/vendor/github.com/google/cel-go/common/types/traits/lister.go +++ b/vendor/github.com/google/cel-go/common/types/traits/lister.go @@ -28,5 +28,6 @@ type Lister interface { // MutableLister interface which emits an immutable result after an intermediate computation. type MutableLister interface { + Lister ToImmutableList() Lister } diff --git a/vendor/github.com/google/cel-go/common/types/unknown.go b/vendor/github.com/google/cel-go/common/types/unknown.go index a950920d6..95b47426f 100644 --- a/vendor/github.com/google/cel-go/common/types/unknown.go +++ b/vendor/github.com/google/cel-go/common/types/unknown.go @@ -34,12 +34,12 @@ func (u Unknown) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { return u.Value(), nil } -// ConvertToType implements ref.Val.ConvertToType. +// ConvertToType is an identity function since unknown values cannot be modified. func (u Unknown) ConvertToType(typeVal ref.Type) ref.Val { return u } -// Equal implements ref.Val.Equal. +// Equal is an identity function since unknown values cannot be modified. func (u Unknown) Equal(other ref.Val) ref.Val { return u } @@ -57,5 +57,10 @@ func (u Unknown) Value() interface{} { // IsUnknown returns whether the element ref.Type or ref.Val is equal to the // UnknownType singleton. func IsUnknown(val ref.Val) bool { - return val.Type() == UnknownType + switch val.(type) { + case Unknown: + return true + default: + return false + } } diff --git a/vendor/github.com/google/cel-go/common/types/util.go b/vendor/github.com/google/cel-go/common/types/util.go index a58e0bded..a8e9afa9e 100644 --- a/vendor/github.com/google/cel-go/common/types/util.go +++ b/vendor/github.com/google/cel-go/common/types/util.go @@ -18,10 +18,10 @@ import ( "github.com/google/cel-go/common/types/ref" ) -// IsUnknownOrError returns whether the input element ref.Val is an ErrType or UnknonwType. +// IsUnknownOrError returns whether the input element ref.Val is an ErrType or UnknownType. func IsUnknownOrError(val ref.Val) bool { - switch val.Type() { - case UnknownType, ErrType: + switch val.(type) { + case Unknown, *Err: return true } return false diff --git a/vendor/github.com/google/cel-go/ext/BUILD.bazel b/vendor/github.com/google/cel-go/ext/BUILD.bazel index 582a79ac3..9c2520b40 100644 --- a/vendor/github.com/google/cel-go/ext/BUILD.bazel +++ b/vendor/github.com/google/cel-go/ext/BUILD.bazel @@ -15,12 +15,8 @@ go_library( visibility = ["//visibility:public"], deps = [ "//cel:go_default_library", - "//checker/decls:go_default_library", "//common/types:go_default_library", "//common/types/ref:go_default_library", - "//common/types/traits:go_default_library", - "//interpreter/functions:go_default_library", - "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", ], ) diff --git a/vendor/github.com/google/cel-go/ext/encoders.go b/vendor/github.com/google/cel-go/ext/encoders.go index 7c7002d53..22e38c39f 100644 --- a/vendor/github.com/google/cel-go/ext/encoders.go +++ b/vendor/github.com/google/cel-go/ext/encoders.go @@ -16,12 +16,11 @@ package ext import ( "encoding/base64" + "reflect" "github.com/google/cel-go/cel" - "github.com/google/cel-go/checker/decls" - "github.com/google/cel-go/interpreter/functions" - - exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" ) // Encoders returns a cel.EnvOption to configure extended functions for string, byte, and object @@ -57,42 +56,23 @@ type encoderLib struct{} func (encoderLib) CompileOptions() []cel.EnvOption { return []cel.EnvOption{ - cel.Declarations( - decls.NewFunction("base64.decode", - decls.NewOverload("base64_decode_string", - []*exprpb.Type{decls.String}, - decls.Bytes)), - decls.NewFunction("base64.encode", - decls.NewOverload("base64_encode_bytes", - []*exprpb.Type{decls.Bytes}, - decls.String)), - ), + cel.Function("base64.decode", + cel.Overload("base64_decode_string", []*cel.Type{cel.StringType}, cel.BytesType, + cel.UnaryBinding(func(str ref.Val) ref.Val { + s := str.(types.String) + return bytesOrError(base64DecodeString(string(s))) + }))), + cel.Function("base64.encode", + cel.Overload("base64_encode_bytes", []*cel.Type{cel.BytesType}, cel.StringType, + cel.UnaryBinding(func(bytes ref.Val) ref.Val { + b := bytes.(types.Bytes) + return stringOrError(base64EncodeBytes([]byte(b))) + }))), } } func (encoderLib) ProgramOptions() []cel.ProgramOption { - wrappedBase64EncodeBytes := callInBytesOutString(base64EncodeBytes) - wrappedBase64DecodeString := callInStrOutBytes(base64DecodeString) - return []cel.ProgramOption{ - cel.Functions( - &functions.Overload{ - Operator: "base64.decode", - Unary: wrappedBase64DecodeString, - }, - &functions.Overload{ - Operator: "base64_decode_string", - Unary: wrappedBase64DecodeString, - }, - &functions.Overload{ - Operator: "base64.encode", - Unary: wrappedBase64EncodeBytes, - }, - &functions.Overload{ - Operator: "base64_encode_bytes", - Unary: wrappedBase64EncodeBytes, - }, - ), - } + return []cel.ProgramOption{} } func base64DecodeString(str string) ([]byte, error) { @@ -102,3 +82,7 @@ func base64DecodeString(str string) ([]byte, error) { func base64EncodeBytes(bytes []byte) (string, error) { return base64.StdEncoding.EncodeToString(bytes), nil } + +var ( + bytesListType = reflect.TypeOf([]byte{}) +) diff --git a/vendor/github.com/google/cel-go/ext/guards.go b/vendor/github.com/google/cel-go/ext/guards.go index 864cc21cd..0794f859b 100644 --- a/vendor/github.com/google/cel-go/ext/guards.go +++ b/vendor/github.com/google/cel-go/ext/guards.go @@ -17,287 +17,34 @@ package ext import ( "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" - "github.com/google/cel-go/common/types/traits" - "github.com/google/cel-go/interpreter/functions" ) // function invocation guards for common call signatures within extension functions. -func callInBytesOutString(fn func([]byte) (string, error)) functions.UnaryOp { - return func(val ref.Val) ref.Val { - vVal, ok := val.(types.Bytes) - if !ok { - return types.MaybeNoSuchOverloadErr(val) - } - str, err := fn([]byte(vVal)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.String(str) +func intOrError(i int64, err error) ref.Val { + if err != nil { + return types.NewErr(err.Error()) } + return types.Int(i) } -func callInStrOutBytes(fn func(string) ([]byte, error)) functions.UnaryOp { - return func(val ref.Val) ref.Val { - vVal, ok := val.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(val) - } - byt, err := fn(string(vVal)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Bytes(byt) +func bytesOrError(bytes []byte, err error) ref.Val { + if err != nil { + return types.NewErr(err.Error()) } + return types.Bytes(bytes) } -func callInStrOutStr(fn func(string) (string, error)) functions.UnaryOp { - return func(val ref.Val) ref.Val { - vVal, ok := val.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(val) - } - str, err := fn(string(vVal)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.String(str) +func stringOrError(str string, err error) ref.Val { + if err != nil { + return types.NewErr(err.Error()) } + return types.String(str) } -func callInStrIntOutStr(fn func(string, int64) (string, error)) functions.BinaryOp { - return func(val, arg ref.Val) ref.Val { - vVal, ok := val.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(val) - } - argVal, ok := arg.(types.Int) - if !ok { - return types.MaybeNoSuchOverloadErr(arg) - } - out, err := fn(string(vVal), int64(argVal)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.String(out) - } -} - -func callInStrStrOutInt(fn func(string, string) (int64, error)) functions.BinaryOp { - return func(val, arg ref.Val) ref.Val { - vVal, ok := val.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(val) - } - argVal, ok := arg.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(arg) - } - out, err := fn(string(vVal), string(argVal)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(out) - } -} - -func callInStrStrOutListStr(fn func(string, string) ([]string, error)) functions.BinaryOp { - return func(val, arg ref.Val) ref.Val { - vVal, ok := val.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(val) - } - argVal, ok := arg.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(arg) - } - out, err := fn(string(vVal), string(argVal)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.DefaultTypeAdapter.NativeToValue(out) - } -} - -func callInStrIntIntOutStr(fn func(string, int64, int64) (string, error)) functions.FunctionOp { - return func(args ...ref.Val) ref.Val { - if len(args) != 3 { - return types.NoSuchOverloadErr() - } - vVal, ok := args[0].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[0]) - } - arg1Val, ok := args[1].(types.Int) - if !ok { - return types.MaybeNoSuchOverloadErr(args[1]) - } - arg2Val, ok := args[2].(types.Int) - if !ok { - return types.MaybeNoSuchOverloadErr(args[2]) - } - out, err := fn(string(vVal), int64(arg1Val), int64(arg2Val)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.String(out) - } -} - -func callInStrStrStrOutStr(fn func(string, string, string) (string, error)) functions.FunctionOp { - return func(args ...ref.Val) ref.Val { - if len(args) != 3 { - return types.NoSuchOverloadErr() - } - vVal, ok := args[0].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[0]) - } - arg1Val, ok := args[1].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[1]) - } - arg2Val, ok := args[2].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[2]) - } - out, err := fn(string(vVal), string(arg1Val), string(arg2Val)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.String(out) - } -} - -func callInStrStrIntOutInt(fn func(string, string, int64) (int64, error)) functions.FunctionOp { - return func(args ...ref.Val) ref.Val { - if len(args) != 3 { - return types.NoSuchOverloadErr() - } - vVal, ok := args[0].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[0]) - } - arg1Val, ok := args[1].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[1]) - } - arg2Val, ok := args[2].(types.Int) - if !ok { - return types.MaybeNoSuchOverloadErr(args[2]) - } - out, err := fn(string(vVal), string(arg1Val), int64(arg2Val)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(out) - } -} - -func callInStrStrIntOutListStr(fn func(string, string, int64) ([]string, error)) functions.FunctionOp { - return func(args ...ref.Val) ref.Val { - if len(args) != 3 { - return types.NoSuchOverloadErr() - } - vVal, ok := args[0].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[0]) - } - arg1Val, ok := args[1].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[1]) - } - arg2Val, ok := args[2].(types.Int) - if !ok { - return types.MaybeNoSuchOverloadErr(args[2]) - } - out, err := fn(string(vVal), string(arg1Val), int64(arg2Val)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.DefaultTypeAdapter.NativeToValue(out) - } -} - -func callInStrStrStrIntOutStr(fn func(string, string, string, int64) (string, error)) functions.FunctionOp { - return func(args ...ref.Val) ref.Val { - if len(args) != 4 { - return types.NoSuchOverloadErr() - } - vVal, ok := args[0].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[0]) - } - arg1Val, ok := args[1].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[1]) - } - arg2Val, ok := args[2].(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args[2]) - } - arg3Val, ok := args[3].(types.Int) - if !ok { - return types.MaybeNoSuchOverloadErr(args[3]) - } - out, err := fn(string(vVal), string(arg1Val), string(arg2Val), int64(arg3Val)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.String(out) - } -} - -func callInListStrOutStr(fn func([]string) (string, error)) functions.UnaryOp { - return func(args1 ref.Val) ref.Val { - vVal, ok := args1.(traits.Lister) - if !ok { - return types.MaybeNoSuchOverloadErr(args1) - } - strings := make([]string, vVal.Size().Value().(int64)) - i := 0 - for it := vVal.Iterator(); it.HasNext() == types.True; { - next := it.Next() - v, ok := next.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(next) - } - strings[i] = string(v) - i++ - } - out, err := fn(strings) - if err != nil { - return types.NewErr(err.Error()) - } - return types.DefaultTypeAdapter.NativeToValue(out) - } -} - -func callInListStrStrOutStr(fn func([]string, string) (string, error)) functions.BinaryOp { - return func(args1, args2 ref.Val) ref.Val { - vVal, ok := args1.(traits.Lister) - if !ok { - return types.MaybeNoSuchOverloadErr(args1) - } - arg1Val, ok := args2.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(args2) - } - strings := make([]string, vVal.Size().Value().(int64)) - i := 0 - for it := vVal.Iterator(); it.HasNext() == types.True; { - next := it.Next() - v, ok := next.(types.String) - if !ok { - return types.MaybeNoSuchOverloadErr(next) - } - strings[i] = string(v) - i++ - } - out, err := fn(strings, string(arg1Val)) - if err != nil { - return types.NewErr(err.Error()) - } - return types.DefaultTypeAdapter.NativeToValue(out) +func listStringOrError(strs []string, err error) ref.Val { + if err != nil { + return types.NewErr(err.Error()) } + return types.DefaultTypeAdapter.NativeToValue(strs) } diff --git a/vendor/github.com/google/cel-go/ext/strings.go b/vendor/github.com/google/cel-go/ext/strings.go index 190321335..6ce239ac2 100644 --- a/vendor/github.com/google/cel-go/ext/strings.go +++ b/vendor/github.com/google/cel-go/ext/strings.go @@ -19,16 +19,13 @@ package ext import ( "fmt" + "reflect" "strings" "unicode" "github.com/google/cel-go/cel" - "github.com/google/cel-go/checker/decls" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" - "github.com/google/cel-go/interpreter/functions" - - exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" ) // Strings returns a cel.EnvOption to configure extended functions for string manipulation. @@ -207,194 +204,128 @@ type stringLib struct{} func (stringLib) CompileOptions() []cel.EnvOption { return []cel.EnvOption{ - cel.Declarations( - decls.NewFunction("charAt", - decls.NewInstanceOverload("string_char_at_int", - []*exprpb.Type{decls.String, decls.Int}, - decls.String)), - decls.NewFunction("indexOf", - decls.NewInstanceOverload("string_index_of_string", - []*exprpb.Type{decls.String, decls.String}, - decls.Int), - decls.NewInstanceOverload("string_index_of_string_int", - []*exprpb.Type{decls.String, decls.String, decls.Int}, - decls.Int)), - decls.NewFunction("lastIndexOf", - decls.NewInstanceOverload("string_last_index_of_string", - []*exprpb.Type{decls.String, decls.String}, - decls.Int), - decls.NewInstanceOverload("string_last_index_of_string_int", - []*exprpb.Type{decls.String, decls.String, decls.Int}, - decls.Int)), - decls.NewFunction("lowerAscii", - decls.NewInstanceOverload("string_lower_ascii", - []*exprpb.Type{decls.String}, - decls.String)), - decls.NewFunction("replace", - decls.NewInstanceOverload("string_replace_string_string", - []*exprpb.Type{decls.String, decls.String, decls.String}, - decls.String), - decls.NewInstanceOverload("string_replace_string_string_int", - []*exprpb.Type{decls.String, decls.String, decls.String, decls.Int}, - decls.String)), - decls.NewFunction("split", - decls.NewInstanceOverload("string_split_string", - []*exprpb.Type{decls.String, decls.String}, - decls.NewListType(decls.String)), - decls.NewInstanceOverload("string_split_string_int", - []*exprpb.Type{decls.String, decls.String, decls.Int}, - decls.NewListType(decls.String))), - decls.NewFunction("substring", - decls.NewInstanceOverload("string_substring_int", - []*exprpb.Type{decls.String, decls.Int}, - decls.String), - decls.NewInstanceOverload("string_substring_int_int", - []*exprpb.Type{decls.String, decls.Int, decls.Int}, - decls.String)), - decls.NewFunction("trim", - decls.NewInstanceOverload("string_trim", - []*exprpb.Type{decls.String}, - decls.String)), - decls.NewFunction("upperAscii", - decls.NewInstanceOverload("string_upper_ascii", - []*exprpb.Type{decls.String}, - decls.String)), - decls.NewFunction("join", - decls.NewInstanceOverload("list_join", - []*exprpb.Type{decls.NewListType(decls.String)}, - decls.String), - decls.NewInstanceOverload("list_join_string", - []*exprpb.Type{decls.NewListType(decls.String), decls.String}, - decls.String), - ), - ), + cel.Function("charAt", + cel.MemberOverload("string_char_at_int", []*cel.Type{cel.StringType, cel.IntType}, cel.StringType, + cel.BinaryBinding(func(str, ind ref.Val) ref.Val { + s := str.(types.String) + i := ind.(types.Int) + return stringOrError(charAt(string(s), int64(i))) + }))), + cel.Function("indexOf", + cel.MemberOverload("string_index_of_string", []*cel.Type{cel.StringType, cel.StringType}, cel.IntType, + cel.BinaryBinding(func(str, substr ref.Val) ref.Val { + s := str.(types.String) + sub := substr.(types.String) + return intOrError(indexOf(string(s), string(sub))) + })), + cel.MemberOverload("string_index_of_string_int", []*cel.Type{cel.StringType, cel.StringType, cel.IntType}, cel.IntType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + s := args[0].(types.String) + sub := args[1].(types.String) + offset := args[2].(types.Int) + return intOrError(indexOfOffset(string(s), string(sub), int64(offset))) + }))), + cel.Function("lastIndexOf", + cel.MemberOverload("string_last_index_of_string", []*cel.Type{cel.StringType, cel.StringType}, cel.IntType, + cel.BinaryBinding(func(str, substr ref.Val) ref.Val { + s := str.(types.String) + sub := substr.(types.String) + return intOrError(lastIndexOf(string(s), string(sub))) + })), + cel.MemberOverload("string_last_index_of_string_int", []*cel.Type{cel.StringType, cel.StringType, cel.IntType}, cel.IntType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + s := args[0].(types.String) + sub := args[1].(types.String) + offset := args[2].(types.Int) + return intOrError(lastIndexOfOffset(string(s), string(sub), int64(offset))) + }))), + cel.Function("lowerAscii", + cel.MemberOverload("string_lower_ascii", []*cel.Type{cel.StringType}, cel.StringType, + cel.UnaryBinding(func(str ref.Val) ref.Val { + s := str.(types.String) + return stringOrError(lowerASCII(string(s))) + }))), + cel.Function("replace", + cel.MemberOverload( + "string_replace_string_string", []*cel.Type{cel.StringType, cel.StringType, cel.StringType}, cel.StringType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + str := args[0].(types.String) + old := args[1].(types.String) + new := args[2].(types.String) + return stringOrError(replace(string(str), string(old), string(new))) + })), + cel.MemberOverload( + "string_replace_string_string_int", []*cel.Type{cel.StringType, cel.StringType, cel.StringType, cel.IntType}, cel.StringType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + str := args[0].(types.String) + old := args[1].(types.String) + new := args[2].(types.String) + n := args[3].(types.Int) + return stringOrError(replaceN(string(str), string(old), string(new), int64(n))) + }))), + cel.Function("split", + cel.MemberOverload("string_split_string", []*cel.Type{cel.StringType, cel.StringType}, cel.ListType(cel.StringType), + cel.BinaryBinding(func(str, separator ref.Val) ref.Val { + s := str.(types.String) + sep := separator.(types.String) + return listStringOrError(split(string(s), string(sep))) + })), + cel.MemberOverload("string_split_string_int", []*cel.Type{cel.StringType, cel.StringType, cel.IntType}, cel.ListType(cel.StringType), + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + s := args[0].(types.String) + sep := args[1].(types.String) + n := args[2].(types.Int) + return listStringOrError(splitN(string(s), string(sep), int64(n))) + }))), + cel.Function("substring", + cel.MemberOverload("string_substring_int", []*cel.Type{cel.StringType, cel.IntType}, cel.StringType, + cel.BinaryBinding(func(str, offset ref.Val) ref.Val { + s := str.(types.String) + off := offset.(types.Int) + return stringOrError(substr(string(s), int64(off))) + })), + cel.MemberOverload("string_substring_int_int", []*cel.Type{cel.StringType, cel.IntType, cel.IntType}, cel.StringType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + s := args[0].(types.String) + start := args[1].(types.Int) + end := args[2].(types.Int) + return stringOrError(substrRange(string(s), int64(start), int64(end))) + }))), + cel.Function("trim", + cel.MemberOverload("string_trim", []*cel.Type{cel.StringType}, cel.StringType, + cel.UnaryBinding(func(str ref.Val) ref.Val { + s := str.(types.String) + return stringOrError(trimSpace(string(s))) + }))), + cel.Function("upperAscii", + cel.MemberOverload("string_upper_ascii", []*cel.Type{cel.StringType}, cel.StringType, + cel.UnaryBinding(func(str ref.Val) ref.Val { + s := str.(types.String) + return stringOrError(upperASCII(string(s))) + }))), + cel.Function("join", + cel.MemberOverload("list_join", []*cel.Type{cel.ListType(cel.StringType)}, cel.StringType, + cel.UnaryBinding(func(list ref.Val) ref.Val { + l, err := list.ConvertToNative(stringListType) + if err != nil { + return types.NewErr(err.Error()) + } + return stringOrError(join(l.([]string))) + })), + cel.MemberOverload("list_join_string", []*cel.Type{cel.ListType(cel.StringType), cel.StringType}, cel.StringType, + cel.BinaryBinding(func(list, delim ref.Val) ref.Val { + l, err := list.ConvertToNative(stringListType) + if err != nil { + return types.NewErr(err.Error()) + } + d := delim.(types.String) + return stringOrError(joinSeparator(l.([]string), string(d))) + }))), } } func (stringLib) ProgramOptions() []cel.ProgramOption { - wrappedReplace := callInStrStrStrOutStr(replace) - wrappedReplaceN := callInStrStrStrIntOutStr(replaceN) - return []cel.ProgramOption{ - cel.Functions( - &functions.Overload{ - Operator: "charAt", - Binary: callInStrIntOutStr(charAt), - }, - &functions.Overload{ - Operator: "string_char_at_int", - Binary: callInStrIntOutStr(charAt), - }, - &functions.Overload{ - Operator: "indexOf", - Binary: callInStrStrOutInt(indexOf), - Function: callInStrStrIntOutInt(indexOfOffset), - }, - &functions.Overload{ - Operator: "string_index_of_string", - Binary: callInStrStrOutInt(indexOf), - }, - &functions.Overload{ - Operator: "string_index_of_string_int", - Function: callInStrStrIntOutInt(indexOfOffset), - }, - &functions.Overload{ - Operator: "lastIndexOf", - Binary: callInStrStrOutInt(lastIndexOf), - Function: callInStrStrIntOutInt(lastIndexOfOffset), - }, - &functions.Overload{ - Operator: "string_last_index_of_string", - Binary: callInStrStrOutInt(lastIndexOf), - }, - &functions.Overload{ - Operator: "string_last_index_of_string_int", - Function: callInStrStrIntOutInt(lastIndexOfOffset), - }, - &functions.Overload{ - Operator: "lowerAscii", - Unary: callInStrOutStr(lowerASCII), - }, - &functions.Overload{ - Operator: "string_lower_ascii", - Unary: callInStrOutStr(lowerASCII), - }, - &functions.Overload{ - Operator: "replace", - Function: func(values ...ref.Val) ref.Val { - if len(values) == 3 { - return wrappedReplace(values...) - } - if len(values) == 4 { - return wrappedReplaceN(values...) - } - return types.NoSuchOverloadErr() - }, - }, - &functions.Overload{ - Operator: "string_replace_string_string", - Function: wrappedReplace, - }, - &functions.Overload{ - Operator: "string_replace_string_string_int", - Function: wrappedReplaceN, - }, - &functions.Overload{ - Operator: "split", - Binary: callInStrStrOutListStr(split), - Function: callInStrStrIntOutListStr(splitN), - }, - &functions.Overload{ - Operator: "string_split_string", - Binary: callInStrStrOutListStr(split), - }, - &functions.Overload{ - Operator: "string_split_string_int", - Function: callInStrStrIntOutListStr(splitN), - }, - &functions.Overload{ - Operator: "substring", - Binary: callInStrIntOutStr(substr), - Function: callInStrIntIntOutStr(substrRange), - }, - &functions.Overload{ - Operator: "string_substring_int", - Binary: callInStrIntOutStr(substr), - }, - &functions.Overload{ - Operator: "string_substring_int_int", - Function: callInStrIntIntOutStr(substrRange), - }, - &functions.Overload{ - Operator: "trim", - Unary: callInStrOutStr(trimSpace), - }, - &functions.Overload{ - Operator: "string_trim", - Unary: callInStrOutStr(trimSpace), - }, - &functions.Overload{ - Operator: "upperAscii", - Unary: callInStrOutStr(upperASCII), - }, - &functions.Overload{ - Operator: "string_upper_ascii", - Unary: callInStrOutStr(upperASCII), - }, - &functions.Overload{ - Operator: "join", - Unary: callInListStrOutStr(join), - Binary: callInListStrStrOutStr(joinSeparator), - }, - &functions.Overload{ - Operator: "list_join", - Unary: callInListStrOutStr(join), - }, - &functions.Overload{ - Operator: "list_join_string", - Binary: callInListStrStrOutStr(joinSeparator), - }, - ), - } + return []cel.ProgramOption{} } func charAt(str string, ind int64) (string, error) { @@ -546,3 +477,7 @@ func joinSeparator(strs []string, separator string) (string, error) { func join(strs []string) (string, error) { return strings.Join(strs, ""), nil } + +var ( + stringListType = reflect.TypeOf([]string{}) +) diff --git a/vendor/github.com/google/cel-go/interpreter/activation.go b/vendor/github.com/google/cel-go/interpreter/activation.go index 4f1315199..8686d4f04 100644 --- a/vendor/github.com/google/cel-go/interpreter/activation.go +++ b/vendor/github.com/google/cel-go/interpreter/activation.go @@ -35,13 +35,17 @@ type Activation interface { Parent() Activation } -// EmptyActivation returns a variable free activation. +// EmptyActivation returns a variable-free activation. func EmptyActivation() Activation { - // This call cannot fail. - a, _ := NewActivation(map[string]interface{}{}) - return a + return emptyActivation{} } +// emptyActivation is a variable-free activation. +type emptyActivation struct{} + +func (emptyActivation) ResolveName(string) (interface{}, bool) { return nil, false } +func (emptyActivation) Parent() Activation { return nil } + // NewActivation returns an activation based on a map-based binding where the map keys are // expected to be qualified names used with ResolveName calls. // diff --git a/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go b/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go index e6e724931..b33f7f7fd 100644 --- a/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go +++ b/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go @@ -105,7 +105,7 @@ func (apat *AttributePattern) QualifierPatterns() []*AttributeQualifierPattern { return apat.qualifierPatterns } -// AttributeQualifierPattern holds a wilcard or valued qualifier pattern. +// AttributeQualifierPattern holds a wildcard or valued qualifier pattern. type AttributeQualifierPattern struct { wildcard bool value interface{} @@ -125,7 +125,7 @@ func (qpat *AttributeQualifierPattern) Matches(q Qualifier) bool { // type, is equal to the value held in the Qualifier. This interface is used by the // AttributeQualifierPattern to determine pattern matches for non-wildcard qualifier patterns. // -// Note: Attribute values are also Qualifier values; however, Attriutes are resolved before +// Note: Attribute values are also Qualifier values; however, Attributes are resolved before // qualification happens. This is an implementation detail, but one relevant to why the Attribute // types do not surface in the list of implementations. // @@ -206,7 +206,7 @@ func (fac *partialAttributeFactory) AbsoluteAttribute(id int64, names ...string) } // MaybeAttribute implementation of the AttributeFactory interface which ensure that the set of -// 'maybe' NamespacedAttribute values are produced using the PartialAttributeFactory rather than +// 'maybe' NamespacedAttribute values are produced using the partialAttributeFactory rather than // the base AttributeFactory implementation. func (fac *partialAttributeFactory) MaybeAttribute(id int64, name string) Attribute { return &maybeAttribute{ diff --git a/vendor/github.com/google/cel-go/interpreter/attributes.go b/vendor/github.com/google/cel-go/interpreter/attributes.go index 19cf87d62..4f1772ea3 100644 --- a/vendor/github.com/google/cel-go/interpreter/attributes.go +++ b/vendor/github.com/google/cel-go/interpreter/attributes.go @@ -587,7 +587,7 @@ func (a *relativeAttribute) Resolve(vars Activation) (interface{}, error) { if types.IsUnknown(v) { return v, nil } - // Next, qualify it. Qualification handles unkonwns as well, so there's no need to recheck. + // Next, qualify it. Qualification handles unknowns as well, so there's no need to recheck. var err error var obj interface{} = v for _, qual := range a.qualifiers { @@ -637,6 +637,8 @@ func newQualifier(adapter ref.TypeAdapter, id int64, v interface{}) (Qualifier, qual = &uintQualifier{id: id, value: uint64(val), celValue: val, adapter: adapter} case types.Bool: qual = &boolQualifier{id: id, value: bool(val), celValue: val, adapter: adapter} + case types.Double: + qual = &doubleQualifier{id: id, value: float64(val), celValue: val, adapter: adapter} default: return nil, fmt.Errorf("invalid qualifier type: %T", v) } diff --git a/vendor/github.com/google/cel-go/interpreter/decorators.go b/vendor/github.com/google/cel-go/interpreter/decorators.go index 9e37e1856..bdbbad43e 100644 --- a/vendor/github.com/google/cel-go/interpreter/decorators.go +++ b/vendor/github.com/google/cel-go/interpreter/decorators.go @@ -98,7 +98,7 @@ func decDisableShortcircuits() InterpretableDecorator { } // decOptimize optimizes the program plan by looking for common evaluation patterns and -// conditionally precomputating the result. +// conditionally precomputing the result. // - build list and map values with constant elements. // - convert 'in' operations to set membership tests if possible. func decOptimize() InterpretableDecorator { diff --git a/vendor/github.com/google/cel-go/interpreter/functions/functions.go b/vendor/github.com/google/cel-go/interpreter/functions/functions.go index 4ca706e96..dd1e9ddd5 100644 --- a/vendor/github.com/google/cel-go/interpreter/functions/functions.go +++ b/vendor/github.com/google/cel-go/interpreter/functions/functions.go @@ -45,6 +45,10 @@ type Overload struct { // Function defines the overload with a FunctionOp implementation. May be // nil. Function FunctionOp + + // NonStrict specifies whether the Overload will tolerate arguments that + // are types.Err or types.Unknown. + NonStrict bool } // UnaryOp is a function that takes a single value and produces an output. diff --git a/vendor/github.com/google/cel-go/interpreter/interpretable.go b/vendor/github.com/google/cel-go/interpreter/interpretable.go index c87b351a6..324edccac 100644 --- a/vendor/github.com/google/cel-go/interpreter/interpretable.go +++ b/vendor/github.com/google/cel-go/interpreter/interpretable.go @@ -421,12 +421,13 @@ func (zero *evalZeroArity) Args() []Interpretable { } type evalUnary struct { - id int64 - function string - overload string - arg Interpretable - trait int - impl functions.UnaryOp + id int64 + function string + overload string + arg Interpretable + trait int + impl functions.UnaryOp + nonStrict bool } // ID implements the Interpretable interface method. @@ -438,12 +439,13 @@ func (un *evalUnary) ID() int64 { func (un *evalUnary) Eval(ctx Activation) ref.Val { argVal := un.arg.Eval(ctx) // Early return if the argument to the function is unknown or error. - if types.IsUnknownOrError(argVal) { + strict := !un.nonStrict + if strict && types.IsUnknownOrError(argVal) { return argVal } // If the implementation is bound and the argument value has the right traits required to // invoke it, then call the implementation. - if un.impl != nil && (un.trait == 0 || argVal.Type().HasTrait(un.trait)) { + if un.impl != nil && (un.trait == 0 || (!strict && types.IsUnknownOrError(argVal)) || argVal.Type().HasTrait(un.trait)) { return un.impl(argVal) } // Otherwise, if the argument is a ReceiverType attempt to invoke the receiver method on the @@ -478,13 +480,14 @@ func (un *evalUnary) Args() []Interpretable { } type evalBinary struct { - id int64 - function string - overload string - lhs Interpretable - rhs Interpretable - trait int - impl functions.BinaryOp + id int64 + function string + overload string + lhs Interpretable + rhs Interpretable + trait int + impl functions.BinaryOp + nonStrict bool } // ID implements the Interpretable interface method. @@ -497,15 +500,18 @@ func (bin *evalBinary) Eval(ctx Activation) ref.Val { lVal := bin.lhs.Eval(ctx) rVal := bin.rhs.Eval(ctx) // Early return if any argument to the function is unknown or error. - if types.IsUnknownOrError(lVal) { - return lVal - } - if types.IsUnknownOrError(rVal) { - return rVal + strict := !bin.nonStrict + if strict { + if types.IsUnknownOrError(lVal) { + return lVal + } + if types.IsUnknownOrError(rVal) { + return rVal + } } // If the implementation is bound and the argument value has the right traits required to // invoke it, then call the implementation. - if bin.impl != nil && (bin.trait == 0 || lVal.Type().HasTrait(bin.trait)) { + if bin.impl != nil && (bin.trait == 0 || (!strict && types.IsUnknownOrError(lVal)) || lVal.Type().HasTrait(bin.trait)) { return bin.impl(lVal, rVal) } // Otherwise, if the argument is a ReceiverType attempt to invoke the receiver method on the @@ -537,12 +543,13 @@ func (bin *evalBinary) Args() []Interpretable { } type evalVarArgs struct { - id int64 - function string - overload string - args []Interpretable - trait int - impl functions.FunctionOp + id int64 + function string + overload string + args []Interpretable + trait int + impl functions.FunctionOp + nonStrict bool } // NewCall creates a new call Interpretable. @@ -565,16 +572,17 @@ func (fn *evalVarArgs) ID() int64 { func (fn *evalVarArgs) Eval(ctx Activation) ref.Val { argVals := make([]ref.Val, len(fn.args)) // Early return if any argument to the function is unknown or error. + strict := !fn.nonStrict for i, arg := range fn.args { argVals[i] = arg.Eval(ctx) - if types.IsUnknownOrError(argVals[i]) { + if strict && types.IsUnknownOrError(argVals[i]) { return argVals[i] } } // If the implementation is bound and the argument value has the right traits required to // invoke it, then call the implementation. arg0 := argVals[0] - if fn.impl != nil && (fn.trait == 0 || arg0.Type().HasTrait(fn.trait)) { + if fn.impl != nil && (fn.trait == 0 || (!strict && types.IsUnknownOrError(arg0)) || arg0.Type().HasTrait(fn.trait)) { return fn.impl(argVals...) } // Otherwise, if the argument is a ReceiverType attempt to invoke the receiver method on the @@ -677,7 +685,19 @@ func (m *evalMap) Eval(ctx Activation) ref.Val { } func (m *evalMap) InitVals() []Interpretable { - return append(m.keys, m.vals...) + if len(m.keys) != len(m.vals) { + return nil + } + result := make([]Interpretable, len(m.keys)+len(m.vals)) + idx := 0 + for i, k := range m.keys { + v := m.vals[i] + result[idx] = k + idx++ + result[idx] = v + idx++ + } + return result } func (m *evalMap) Type() ref.Type { @@ -852,7 +872,7 @@ func (fold *evalFold) Cost() (min, max int64) { iMax + aMax + cMax*rangeCnt + sMax*rangeCnt + rMax } -// Optional Intepretable implementations that specialize, subsume, or extend the core evaluation +// Optional Interpretable implementations that specialize, subsume, or extend the core evaluation // plan via decorators. // evalSetMembership is an Interpretable implementation which tests whether an input value @@ -969,7 +989,7 @@ func (e *evalWatchConstQual) Qualify(vars Activation, obj interface{}) (interfac return out, err } -// QualifierValueEquals tests whether the incoming value is equal to the qualificying constant. +// QualifierValueEquals tests whether the incoming value is equal to the qualifying constant. func (e *evalWatchConstQual) QualifierValueEquals(value interface{}) bool { qve, ok := e.ConstantQualifier.(qualifierValueEquator) return ok && qve.QualifierValueEquals(value) diff --git a/vendor/github.com/google/cel-go/interpreter/interpreter.go b/vendor/github.com/google/cel-go/interpreter/interpreter.go index a59b3e61d..b3fd14f8b 100644 --- a/vendor/github.com/google/cel-go/interpreter/interpreter.go +++ b/vendor/github.com/google/cel-go/interpreter/interpreter.go @@ -162,7 +162,7 @@ type exprInterpreter struct { } // NewInterpreter builds an Interpreter from a Dispatcher and TypeProvider which will be used -// throughout the Eval of all Interpretable instances gerenated from it. +// throughout the Eval of all Interpretable instances generated from it. func NewInterpreter(dispatcher Dispatcher, container *containers.Container, provider ref.TypeProvider, diff --git a/vendor/github.com/google/cel-go/interpreter/planner.go b/vendor/github.com/google/cel-go/interpreter/planner.go index 562d46b17..938cf4d76 100644 --- a/vendor/github.com/google/cel-go/interpreter/planner.go +++ b/vendor/github.com/google/cel-go/interpreter/planner.go @@ -77,7 +77,7 @@ func newUncheckedPlanner(disp Dispatcher, } } -// planner is an implementatio of the interpretablePlanner interface. +// planner is an implementation of the interpretablePlanner interface. type planner struct { disp Dispatcher provider ref.TypeProvider @@ -302,8 +302,18 @@ func (p *planner) planCall(expr *exprpb.Expr) (Interpretable, error) { case 0: return p.planCallZero(expr, fnName, oName, fnDef) case 1: + // If the FunctionOp has been used, then use it as it may exist for the purposes + // of dynamic dispatch within a singleton function implementation. + if fnDef != nil && fnDef.Unary == nil && fnDef.Function != nil { + return p.planCallVarArgs(expr, fnName, oName, fnDef, args) + } return p.planCallUnary(expr, fnName, oName, fnDef, args) case 2: + // If the FunctionOp has been used, then use it as it may exist for the purposes + // of dynamic dispatch within a singleton function implementation. + if fnDef != nil && fnDef.Binary == nil && fnDef.Function != nil { + return p.planCallVarArgs(expr, fnName, oName, fnDef, args) + } return p.planCallBinary(expr, fnName, oName, fnDef, args) default: return p.planCallVarArgs(expr, fnName, oName, fnDef, args) @@ -334,20 +344,23 @@ func (p *planner) planCallUnary(expr *exprpb.Expr, args []Interpretable) (Interpretable, error) { var fn functions.UnaryOp var trait int + var nonStrict bool if impl != nil { if impl.Unary == nil { return nil, fmt.Errorf("no such overload: %s(arg)", function) } fn = impl.Unary trait = impl.OperandTrait + nonStrict = impl.NonStrict } return &evalUnary{ - id: expr.Id, - function: function, - overload: overload, - arg: args[0], - trait: trait, - impl: fn, + id: expr.Id, + function: function, + overload: overload, + arg: args[0], + trait: trait, + impl: fn, + nonStrict: nonStrict, }, nil } @@ -359,21 +372,24 @@ func (p *planner) planCallBinary(expr *exprpb.Expr, args []Interpretable) (Interpretable, error) { var fn functions.BinaryOp var trait int + var nonStrict bool if impl != nil { if impl.Binary == nil { return nil, fmt.Errorf("no such overload: %s(lhs, rhs)", function) } fn = impl.Binary trait = impl.OperandTrait + nonStrict = impl.NonStrict } return &evalBinary{ - id: expr.Id, - function: function, - overload: overload, - lhs: args[0], - rhs: args[1], - trait: trait, - impl: fn, + id: expr.Id, + function: function, + overload: overload, + lhs: args[0], + rhs: args[1], + trait: trait, + impl: fn, + nonStrict: nonStrict, }, nil } @@ -385,20 +401,23 @@ func (p *planner) planCallVarArgs(expr *exprpb.Expr, args []Interpretable) (Interpretable, error) { var fn functions.FunctionOp var trait int + var nonStrict bool if impl != nil { if impl.Function == nil { return nil, fmt.Errorf("no such overload: %s(...)", function) } fn = impl.Function trait = impl.OperandTrait + nonStrict = impl.NonStrict } return &evalVarArgs{ - id: expr.Id, - function: function, - overload: overload, - args: args, - trait: trait, - impl: fn, + id: expr.Id, + function: function, + overload: overload, + args: args, + trait: trait, + impl: fn, + nonStrict: nonStrict, }, nil } diff --git a/vendor/github.com/google/cel-go/interpreter/prune.go b/vendor/github.com/google/cel-go/interpreter/prune.go index 7dab68efb..0c01eb4f3 100644 --- a/vendor/github.com/google/cel-go/interpreter/prune.go +++ b/vendor/github.com/google/cel-go/interpreter/prune.go @@ -228,7 +228,7 @@ func (p *astPruner) prune(node *exprpb.Expr) (*exprpb.Expr, bool) { } } - // We have either an unknown/error value, or something we dont want to + // We have either an unknown/error value, or something we don't want to // transform, or expression was not evaluated. If possible, drill down // more. diff --git a/vendor/github.com/google/cel-go/interpreter/runtimecost.go b/vendor/github.com/google/cel-go/interpreter/runtimecost.go index d82338041..06b6b27ef 100644 --- a/vendor/github.com/google/cel-go/interpreter/runtimecost.go +++ b/vendor/github.com/google/cel-go/interpreter/runtimecost.go @@ -41,26 +41,42 @@ func CostObserver(tracker *CostTracker) EvalObserver { case ConstantQualifier: // TODO: Push identifiers on to the stack before observing constant qualifiers that apply to them // and enable the below pop. Once enabled this can case can be collapsed into the Qualifier case. - //tracker.stack.pop(1) tracker.cost++ case InterpretableConst: // zero cost case InterpretableAttribute: - // Ternary has no direct cost. All cost is from the conditional and the true/false branch expressions. - _, isConditional := t.Attr().(*conditionalAttribute) - if !isConditional { + switch a := t.Attr().(type) { + case *conditionalAttribute: + // Ternary has no direct cost. All cost is from the conditional and the true/false branch expressions. + tracker.stack.drop(a.falsy.ID(), a.truthy.ID(), a.expr.ID()) + default: + tracker.stack.drop(t.Attr().ID()) tracker.cost += common.SelectAndIdentCost } - case *evalExhaustiveConditional, *evalOr, *evalAnd, *evalExhaustiveOr, *evalExhaustiveAnd: + case *evalExhaustiveConditional: // Ternary has no direct cost. All cost is from the conditional and the true/false branch expressions. + tracker.stack.drop(t.attr.falsy.ID(), t.attr.truthy.ID(), t.attr.expr.ID()) + + // While the field names are identical, the boolean operation eval structs do not share an interface and so + // must be handled individually. + case *evalOr: + tracker.stack.drop(t.rhs.ID(), t.lhs.ID()) + case *evalAnd: + tracker.stack.drop(t.rhs.ID(), t.lhs.ID()) + case *evalExhaustiveOr: + tracker.stack.drop(t.rhs.ID(), t.lhs.ID()) + case *evalExhaustiveAnd: + tracker.stack.drop(t.rhs.ID(), t.lhs.ID()) + case *evalFold: + tracker.stack.drop(t.iterRange.ID()) case Qualifier: - tracker.stack.pop(1) tracker.cost++ case InterpretableCall: - if argVals, ok := tracker.stack.pop(len(t.Args())); ok { + if argVals, ok := tracker.stack.dropArgs(t.Args()); ok { tracker.cost += tracker.costCall(t, argVals, val) } case InterpretableConstructor: + tracker.stack.dropArgs(t.InitVals()) switch t.Type() { case types.ListType: tracker.cost += common.ListCreateBaseCost @@ -70,7 +86,7 @@ func CostObserver(tracker *CostTracker) EvalObserver { tracker.cost += common.StructCreateBaseCost } } - tracker.stack.push(val) + tracker.stack.push(val, id) if tracker.Limit != nil && tracker.cost > *tracker.Limit { panic(EvalCancelledError{Cause: CostLimitExceeded, Message: "operation cancelled: actual cost limit exceeded"}) @@ -170,19 +186,56 @@ func (c CostTracker) actualSize(value ref.Val) uint64 { return 1 } +type stackVal struct { + Val ref.Val + ID int64 +} + // refValStack keeps track of values of the stack for cost calculation purposes -type refValStack []ref.Val +type refValStack []stackVal -func (s *refValStack) push(value ref.Val) { +func (s *refValStack) push(val ref.Val, id int64) { + value := stackVal{Val: val, ID: id} *s = append(*s, value) } -func (s *refValStack) pop(count int) ([]ref.Val, bool) { - if len(*s) < count { +// TODO: Allowing drop and dropArgs to remove stack items above the IDs they are provided is a workaround. drop and dropArgs +// should find and remove only the stack items matching the provided IDs once all attributes are properly pushed and popped from stack. + +// drop searches the stack for each ID and removes the ID and all stack items above it. +// If none of the IDs are found, the stack is not modified. +// WARNING: It is possible for multiple expressions with the same ID to exist (due to how macros are implemented) so it's +// possible that a dropped ID will remain on the stack. They should be removed when IDs on the stack are popped. +func (s *refValStack) drop(ids ...int64) { + for _, id := range ids { + for idx := len(*s) - 1; idx >= 0; idx-- { + if (*s)[idx].ID == id { + *s = (*s)[:idx] + break + } + } + } +} + +// dropArgs searches the stack for all the args by their IDs, accumulates their associated ref.Vals and drops any +// stack items above any of the arg IDs. If any of the IDs are not found the stack, false is returned. +// Args are assumed to be found in the stack in reverse order, i.e. the last arg is expected to be found highest in +// the stack. +// WARNING: It is possible for multiple expressions with the same ID to exist (due to how macros are implemented) so it's +// possible that a dropped ID will remain on the stack. They should be removed when IDs on the stack are popped. +func (s *refValStack) dropArgs(args []Interpretable) ([]ref.Val, bool) { + result := make([]ref.Val, len(args)) +argloop: + for nIdx := len(args) - 1; nIdx >= 0; nIdx-- { + for idx := len(*s) - 1; idx >= 0; idx-- { + if (*s)[idx].ID == args[nIdx].ID() { + el := (*s)[idx] + *s = (*s)[:idx] + result[nIdx] = el.Val + continue argloop + } + } return nil, false } - idx := len(*s) - count - el := (*s)[idx:] - *s = (*s)[:idx] - return el, true + return result, true } diff --git a/vendor/github.com/google/cel-go/parser/BUILD.bazel b/vendor/github.com/google/cel-go/parser/BUILD.bazel index a1917b464..b76e6e484 100644 --- a/vendor/github.com/google/cel-go/parser/BUILD.bazel +++ b/vendor/github.com/google/cel-go/parser/BUILD.bazel @@ -23,7 +23,7 @@ go_library( "//common/operators:go_default_library", "//common/runes:go_default_library", "//parser/gen:go_default_library", - "@com_github_antlr//runtime/Go/antlr:go_default_library", + "@com_github_antlr_antlr4_runtime_go_antlr//:go_default_library", "@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/structpb:go_default_library", @@ -45,7 +45,7 @@ go_test( "//common/debug:go_default_library", "//parser/gen:go_default_library", "//test:go_default_library", - "@com_github_antlr//runtime/Go/antlr:go_default_library", + "@com_github_antlr_antlr4_runtime_go_antlr//:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", ], ) diff --git a/vendor/github.com/google/cel-go/parser/gen/BUILD.bazel b/vendor/github.com/google/cel-go/parser/gen/BUILD.bazel index 78e0432c4..22711310c 100644 --- a/vendor/github.com/google/cel-go/parser/gen/BUILD.bazel +++ b/vendor/github.com/google/cel-go/parser/gen/BUILD.bazel @@ -21,6 +21,6 @@ go_library( ], importpath = "github.com/google/cel-go/parser/gen", deps = [ - "@com_github_antlr//runtime/Go/antlr:go_default_library", + "@com_github_antlr_antlr4_runtime_go_antlr//:go_default_library", ], ) diff --git a/vendor/github.com/google/cel-go/parser/gen/CEL.interp b/vendor/github.com/google/cel-go/parser/gen/CEL.interp new file mode 100644 index 000000000..13e3a10d1 --- /dev/null +++ b/vendor/github.com/google/cel-go/parser/gen/CEL.interp @@ -0,0 +1,96 @@ +token literal names: +null +'==' +'!=' +'in' +'<' +'<=' +'>=' +'>' +'&&' +'||' +'[' +']' +'{' +'}' +'(' +')' +'.' +',' +'-' +'!' +'?' +':' +'+' +'*' +'/' +'%' +'true' +'false' +'null' +null +null +null +null +null +null +null +null + +token symbolic names: +null +EQUALS +NOT_EQUALS +IN +LESS +LESS_EQUALS +GREATER_EQUALS +GREATER +LOGICAL_AND +LOGICAL_OR +LBRACKET +RPRACKET +LBRACE +RBRACE +LPAREN +RPAREN +DOT +COMMA +MINUS +EXCLAM +QUESTIONMARK +COLON +PLUS +STAR +SLASH +PERCENT +CEL_TRUE +CEL_FALSE +NUL +WHITESPACE +COMMENT +NUM_FLOAT +NUM_INT +NUM_UINT +STRING +BYTES +IDENTIFIER + +rule names: +start +expr +conditionalOr +conditionalAnd +relation +calc +unary +member +primary +exprList +fieldInitializerList +mapInitializerList +literal + + +atn: +[4, 1, 36, 209, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 36, 8, 1, 1, 2, 1, 2, 1, 2, 5, 2, 41, 8, 2, 10, 2, 12, 2, 44, 9, 2, 1, 3, 1, 3, 1, 3, 5, 3, 49, 8, 3, 10, 3, 12, 3, 52, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 60, 8, 4, 10, 4, 12, 4, 63, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 74, 8, 5, 10, 5, 12, 5, 77, 9, 5, 1, 6, 1, 6, 4, 6, 81, 8, 6, 11, 6, 12, 6, 82, 1, 6, 1, 6, 4, 6, 87, 8, 6, 11, 6, 12, 6, 88, 1, 6, 3, 6, 92, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 102, 8, 7, 1, 7, 3, 7, 105, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 115, 8, 7, 1, 7, 3, 7, 118, 8, 7, 1, 7, 5, 7, 121, 8, 7, 10, 7, 12, 7, 124, 9, 7, 1, 8, 3, 8, 127, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 132, 8, 8, 1, 8, 3, 8, 135, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 143, 8, 8, 1, 8, 3, 8, 146, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 151, 8, 8, 1, 8, 3, 8, 154, 8, 8, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 163, 8, 9, 10, 9, 12, 9, 166, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 175, 8, 10, 10, 10, 12, 10, 178, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 188, 8, 11, 10, 11, 12, 11, 191, 9, 11, 1, 12, 3, 12, 194, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 199, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 207, 8, 12, 1, 12, 0, 3, 8, 10, 14, 13, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 0, 3, 1, 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, 235, 0, 26, 1, 0, 0, 0, 2, 29, 1, 0, 0, 0, 4, 37, 1, 0, 0, 0, 6, 45, 1, 0, 0, 0, 8, 53, 1, 0, 0, 0, 10, 64, 1, 0, 0, 0, 12, 91, 1, 0, 0, 0, 14, 93, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 159, 1, 0, 0, 0, 20, 167, 1, 0, 0, 0, 22, 179, 1, 0, 0, 0, 24, 206, 1, 0, 0, 0, 26, 27, 3, 2, 1, 0, 27, 28, 5, 0, 0, 1, 28, 1, 1, 0, 0, 0, 29, 35, 3, 4, 2, 0, 30, 31, 5, 20, 0, 0, 31, 32, 3, 4, 2, 0, 32, 33, 5, 21, 0, 0, 33, 34, 3, 2, 1, 0, 34, 36, 1, 0, 0, 0, 35, 30, 1, 0, 0, 0, 35, 36, 1, 0, 0, 0, 36, 3, 1, 0, 0, 0, 37, 42, 3, 6, 3, 0, 38, 39, 5, 9, 0, 0, 39, 41, 3, 6, 3, 0, 40, 38, 1, 0, 0, 0, 41, 44, 1, 0, 0, 0, 42, 40, 1, 0, 0, 0, 42, 43, 1, 0, 0, 0, 43, 5, 1, 0, 0, 0, 44, 42, 1, 0, 0, 0, 45, 50, 3, 8, 4, 0, 46, 47, 5, 8, 0, 0, 47, 49, 3, 8, 4, 0, 48, 46, 1, 0, 0, 0, 49, 52, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, 51, 7, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 53, 54, 6, 4, -1, 0, 54, 55, 3, 10, 5, 0, 55, 61, 1, 0, 0, 0, 56, 57, 10, 1, 0, 0, 57, 58, 7, 0, 0, 0, 58, 60, 3, 8, 4, 2, 59, 56, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 59, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 9, 1, 0, 0, 0, 63, 61, 1, 0, 0, 0, 64, 65, 6, 5, -1, 0, 65, 66, 3, 12, 6, 0, 66, 75, 1, 0, 0, 0, 67, 68, 10, 2, 0, 0, 68, 69, 7, 1, 0, 0, 69, 74, 3, 10, 5, 3, 70, 71, 10, 1, 0, 0, 71, 72, 7, 2, 0, 0, 72, 74, 3, 10, 5, 2, 73, 67, 1, 0, 0, 0, 73, 70, 1, 0, 0, 0, 74, 77, 1, 0, 0, 0, 75, 73, 1, 0, 0, 0, 75, 76, 1, 0, 0, 0, 76, 11, 1, 0, 0, 0, 77, 75, 1, 0, 0, 0, 78, 92, 3, 14, 7, 0, 79, 81, 5, 19, 0, 0, 80, 79, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 83, 1, 0, 0, 0, 83, 84, 1, 0, 0, 0, 84, 92, 3, 14, 7, 0, 85, 87, 5, 18, 0, 0, 86, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 86, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 92, 3, 14, 7, 0, 91, 78, 1, 0, 0, 0, 91, 80, 1, 0, 0, 0, 91, 86, 1, 0, 0, 0, 92, 13, 1, 0, 0, 0, 93, 94, 6, 7, -1, 0, 94, 95, 3, 16, 8, 0, 95, 122, 1, 0, 0, 0, 96, 97, 10, 3, 0, 0, 97, 98, 5, 16, 0, 0, 98, 104, 5, 36, 0, 0, 99, 101, 5, 14, 0, 0, 100, 102, 3, 18, 9, 0, 101, 100, 1, 0, 0, 0, 101, 102, 1, 0, 0, 0, 102, 103, 1, 0, 0, 0, 103, 105, 5, 15, 0, 0, 104, 99, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 121, 1, 0, 0, 0, 106, 107, 10, 2, 0, 0, 107, 108, 5, 10, 0, 0, 108, 109, 3, 2, 1, 0, 109, 110, 5, 11, 0, 0, 110, 121, 1, 0, 0, 0, 111, 112, 10, 1, 0, 0, 112, 114, 5, 12, 0, 0, 113, 115, 3, 20, 10, 0, 114, 113, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 117, 1, 0, 0, 0, 116, 118, 5, 17, 0, 0, 117, 116, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 119, 1, 0, 0, 0, 119, 121, 5, 13, 0, 0, 120, 96, 1, 0, 0, 0, 120, 106, 1, 0, 0, 0, 120, 111, 1, 0, 0, 0, 121, 124, 1, 0, 0, 0, 122, 120, 1, 0, 0, 0, 122, 123, 1, 0, 0, 0, 123, 15, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 125, 127, 5, 16, 0, 0, 126, 125, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 134, 5, 36, 0, 0, 129, 131, 5, 14, 0, 0, 130, 132, 3, 18, 9, 0, 131, 130, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 135, 5, 15, 0, 0, 134, 129, 1, 0, 0, 0, 134, 135, 1, 0, 0, 0, 135, 158, 1, 0, 0, 0, 136, 137, 5, 14, 0, 0, 137, 138, 3, 2, 1, 0, 138, 139, 5, 15, 0, 0, 139, 158, 1, 0, 0, 0, 140, 142, 5, 10, 0, 0, 141, 143, 3, 18, 9, 0, 142, 141, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 145, 1, 0, 0, 0, 144, 146, 5, 17, 0, 0, 145, 144, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 158, 5, 11, 0, 0, 148, 150, 5, 12, 0, 0, 149, 151, 3, 22, 11, 0, 150, 149, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 5, 17, 0, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 158, 5, 13, 0, 0, 156, 158, 3, 24, 12, 0, 157, 126, 1, 0, 0, 0, 157, 136, 1, 0, 0, 0, 157, 140, 1, 0, 0, 0, 157, 148, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 158, 17, 1, 0, 0, 0, 159, 164, 3, 2, 1, 0, 160, 161, 5, 17, 0, 0, 161, 163, 3, 2, 1, 0, 162, 160, 1, 0, 0, 0, 163, 166, 1, 0, 0, 0, 164, 162, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 19, 1, 0, 0, 0, 166, 164, 1, 0, 0, 0, 167, 168, 5, 36, 0, 0, 168, 169, 5, 21, 0, 0, 169, 176, 3, 2, 1, 0, 170, 171, 5, 17, 0, 0, 171, 172, 5, 36, 0, 0, 172, 173, 5, 21, 0, 0, 173, 175, 3, 2, 1, 0, 174, 170, 1, 0, 0, 0, 175, 178, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 21, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 21, 0, 0, 181, 189, 3, 2, 1, 0, 182, 183, 5, 17, 0, 0, 183, 184, 3, 2, 1, 0, 184, 185, 5, 21, 0, 0, 185, 186, 3, 2, 1, 0, 186, 188, 1, 0, 0, 0, 187, 182, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 23, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 194, 5, 18, 0, 0, 193, 192, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 207, 5, 32, 0, 0, 196, 207, 5, 33, 0, 0, 197, 199, 5, 18, 0, 0, 198, 197, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 207, 5, 31, 0, 0, 201, 207, 5, 34, 0, 0, 202, 207, 5, 35, 0, 0, 203, 207, 5, 26, 0, 0, 204, 207, 5, 27, 0, 0, 205, 207, 5, 28, 0, 0, 206, 193, 1, 0, 0, 0, 206, 196, 1, 0, 0, 0, 206, 198, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, 25, 1, 0, 0, 0, 29, 35, 42, 50, 61, 73, 75, 82, 88, 91, 101, 104, 114, 117, 120, 122, 126, 131, 134, 142, 145, 150, 153, 157, 164, 176, 189, 193, 198, 206] \ No newline at end of file diff --git a/vendor/github.com/google/cel-go/parser/gen/CELLexer.interp b/vendor/github.com/google/cel-go/parser/gen/CELLexer.interp new file mode 100644 index 000000000..26e7f471e --- /dev/null +++ b/vendor/github.com/google/cel-go/parser/gen/CELLexer.interp @@ -0,0 +1,136 @@ +token literal names: +null +'==' +'!=' +'in' +'<' +'<=' +'>=' +'>' +'&&' +'||' +'[' +']' +'{' +'}' +'(' +')' +'.' +',' +'-' +'!' +'?' +':' +'+' +'*' +'/' +'%' +'true' +'false' +'null' +null +null +null +null +null +null +null +null + +token symbolic names: +null +EQUALS +NOT_EQUALS +IN +LESS +LESS_EQUALS +GREATER_EQUALS +GREATER +LOGICAL_AND +LOGICAL_OR +LBRACKET +RPRACKET +LBRACE +RBRACE +LPAREN +RPAREN +DOT +COMMA +MINUS +EXCLAM +QUESTIONMARK +COLON +PLUS +STAR +SLASH +PERCENT +CEL_TRUE +CEL_FALSE +NUL +WHITESPACE +COMMENT +NUM_FLOAT +NUM_INT +NUM_UINT +STRING +BYTES +IDENTIFIER + +rule names: +EQUALS +NOT_EQUALS +IN +LESS +LESS_EQUALS +GREATER_EQUALS +GREATER +LOGICAL_AND +LOGICAL_OR +LBRACKET +RPRACKET +LBRACE +RBRACE +LPAREN +RPAREN +DOT +COMMA +MINUS +EXCLAM +QUESTIONMARK +COLON +PLUS +STAR +SLASH +PERCENT +CEL_TRUE +CEL_FALSE +NUL +BACKSLASH +LETTER +DIGIT +EXPONENT +HEXDIGIT +RAW +ESC_SEQ +ESC_CHAR_SEQ +ESC_OCT_SEQ +ESC_BYTE_SEQ +ESC_UNI_SEQ +WHITESPACE +COMMENT +NUM_FLOAT +NUM_INT +NUM_UINT +STRING +BYTES +IDENTIFIER + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 36, 423, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 177, 8, 31, 1, 31, 4, 31, 180, 8, 31, 11, 31, 12, 31, 181, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 192, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 225, 8, 38, 1, 39, 4, 39, 228, 8, 39, 11, 39, 12, 39, 229, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 238, 8, 40, 10, 40, 12, 40, 241, 9, 40, 1, 40, 1, 40, 1, 41, 4, 41, 246, 8, 41, 11, 41, 12, 41, 247, 1, 41, 1, 41, 4, 41, 252, 8, 41, 11, 41, 12, 41, 253, 1, 41, 3, 41, 257, 8, 41, 1, 41, 4, 41, 260, 8, 41, 11, 41, 12, 41, 261, 1, 41, 1, 41, 1, 41, 1, 41, 4, 41, 268, 8, 41, 11, 41, 12, 41, 269, 1, 41, 3, 41, 273, 8, 41, 3, 41, 275, 8, 41, 1, 42, 4, 42, 278, 8, 42, 11, 42, 12, 42, 279, 1, 42, 1, 42, 1, 42, 1, 42, 4, 42, 286, 8, 42, 11, 42, 12, 42, 287, 3, 42, 290, 8, 42, 1, 43, 4, 43, 293, 8, 43, 11, 43, 12, 43, 294, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 4, 43, 303, 8, 43, 11, 43, 12, 43, 304, 1, 43, 1, 43, 3, 43, 309, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 314, 8, 44, 10, 44, 12, 44, 317, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 323, 8, 44, 10, 44, 12, 44, 326, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 335, 8, 44, 10, 44, 12, 44, 338, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 349, 8, 44, 10, 44, 12, 44, 352, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 360, 8, 44, 10, 44, 12, 44, 363, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 370, 8, 44, 10, 44, 12, 44, 373, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 383, 8, 44, 10, 44, 12, 44, 386, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 398, 8, 44, 10, 44, 12, 44, 401, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 407, 8, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 3, 46, 414, 8, 46, 1, 46, 1, 46, 1, 46, 5, 46, 419, 8, 46, 10, 46, 12, 46, 422, 9, 46, 4, 336, 350, 384, 399, 0, 47, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 0, 59, 0, 61, 0, 63, 0, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 29, 81, 30, 83, 31, 85, 32, 87, 33, 89, 34, 91, 35, 93, 36, 1, 0, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 10, 12, 13, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 456, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, 3, 98, 1, 0, 0, 0, 5, 101, 1, 0, 0, 0, 7, 104, 1, 0, 0, 0, 9, 106, 1, 0, 0, 0, 11, 109, 1, 0, 0, 0, 13, 112, 1, 0, 0, 0, 15, 114, 1, 0, 0, 0, 17, 117, 1, 0, 0, 0, 19, 120, 1, 0, 0, 0, 21, 122, 1, 0, 0, 0, 23, 124, 1, 0, 0, 0, 25, 126, 1, 0, 0, 0, 27, 128, 1, 0, 0, 0, 29, 130, 1, 0, 0, 0, 31, 132, 1, 0, 0, 0, 33, 134, 1, 0, 0, 0, 35, 136, 1, 0, 0, 0, 37, 138, 1, 0, 0, 0, 39, 140, 1, 0, 0, 0, 41, 142, 1, 0, 0, 0, 43, 144, 1, 0, 0, 0, 45, 146, 1, 0, 0, 0, 47, 148, 1, 0, 0, 0, 49, 150, 1, 0, 0, 0, 51, 152, 1, 0, 0, 0, 53, 157, 1, 0, 0, 0, 55, 163, 1, 0, 0, 0, 57, 168, 1, 0, 0, 0, 59, 170, 1, 0, 0, 0, 61, 172, 1, 0, 0, 0, 63, 174, 1, 0, 0, 0, 65, 183, 1, 0, 0, 0, 67, 185, 1, 0, 0, 0, 69, 191, 1, 0, 0, 0, 71, 193, 1, 0, 0, 0, 73, 196, 1, 0, 0, 0, 75, 201, 1, 0, 0, 0, 77, 224, 1, 0, 0, 0, 79, 227, 1, 0, 0, 0, 81, 233, 1, 0, 0, 0, 83, 274, 1, 0, 0, 0, 85, 289, 1, 0, 0, 0, 87, 308, 1, 0, 0, 0, 89, 406, 1, 0, 0, 0, 91, 408, 1, 0, 0, 0, 93, 413, 1, 0, 0, 0, 95, 96, 5, 61, 0, 0, 96, 97, 5, 61, 0, 0, 97, 2, 1, 0, 0, 0, 98, 99, 5, 33, 0, 0, 99, 100, 5, 61, 0, 0, 100, 4, 1, 0, 0, 0, 101, 102, 5, 105, 0, 0, 102, 103, 5, 110, 0, 0, 103, 6, 1, 0, 0, 0, 104, 105, 5, 60, 0, 0, 105, 8, 1, 0, 0, 0, 106, 107, 5, 60, 0, 0, 107, 108, 5, 61, 0, 0, 108, 10, 1, 0, 0, 0, 109, 110, 5, 62, 0, 0, 110, 111, 5, 61, 0, 0, 111, 12, 1, 0, 0, 0, 112, 113, 5, 62, 0, 0, 113, 14, 1, 0, 0, 0, 114, 115, 5, 38, 0, 0, 115, 116, 5, 38, 0, 0, 116, 16, 1, 0, 0, 0, 117, 118, 5, 124, 0, 0, 118, 119, 5, 124, 0, 0, 119, 18, 1, 0, 0, 0, 120, 121, 5, 91, 0, 0, 121, 20, 1, 0, 0, 0, 122, 123, 5, 93, 0, 0, 123, 22, 1, 0, 0, 0, 124, 125, 5, 123, 0, 0, 125, 24, 1, 0, 0, 0, 126, 127, 5, 125, 0, 0, 127, 26, 1, 0, 0, 0, 128, 129, 5, 40, 0, 0, 129, 28, 1, 0, 0, 0, 130, 131, 5, 41, 0, 0, 131, 30, 1, 0, 0, 0, 132, 133, 5, 46, 0, 0, 133, 32, 1, 0, 0, 0, 134, 135, 5, 44, 0, 0, 135, 34, 1, 0, 0, 0, 136, 137, 5, 45, 0, 0, 137, 36, 1, 0, 0, 0, 138, 139, 5, 33, 0, 0, 139, 38, 1, 0, 0, 0, 140, 141, 5, 63, 0, 0, 141, 40, 1, 0, 0, 0, 142, 143, 5, 58, 0, 0, 143, 42, 1, 0, 0, 0, 144, 145, 5, 43, 0, 0, 145, 44, 1, 0, 0, 0, 146, 147, 5, 42, 0, 0, 147, 46, 1, 0, 0, 0, 148, 149, 5, 47, 0, 0, 149, 48, 1, 0, 0, 0, 150, 151, 5, 37, 0, 0, 151, 50, 1, 0, 0, 0, 152, 153, 5, 116, 0, 0, 153, 154, 5, 114, 0, 0, 154, 155, 5, 117, 0, 0, 155, 156, 5, 101, 0, 0, 156, 52, 1, 0, 0, 0, 157, 158, 5, 102, 0, 0, 158, 159, 5, 97, 0, 0, 159, 160, 5, 108, 0, 0, 160, 161, 5, 115, 0, 0, 161, 162, 5, 101, 0, 0, 162, 54, 1, 0, 0, 0, 163, 164, 5, 110, 0, 0, 164, 165, 5, 117, 0, 0, 165, 166, 5, 108, 0, 0, 166, 167, 5, 108, 0, 0, 167, 56, 1, 0, 0, 0, 168, 169, 5, 92, 0, 0, 169, 58, 1, 0, 0, 0, 170, 171, 7, 0, 0, 0, 171, 60, 1, 0, 0, 0, 172, 173, 2, 48, 57, 0, 173, 62, 1, 0, 0, 0, 174, 176, 7, 1, 0, 0, 175, 177, 7, 2, 0, 0, 176, 175, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 179, 1, 0, 0, 0, 178, 180, 3, 61, 30, 0, 179, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 64, 1, 0, 0, 0, 183, 184, 7, 3, 0, 0, 184, 66, 1, 0, 0, 0, 185, 186, 7, 4, 0, 0, 186, 68, 1, 0, 0, 0, 187, 192, 3, 71, 35, 0, 188, 192, 3, 75, 37, 0, 189, 192, 3, 77, 38, 0, 190, 192, 3, 73, 36, 0, 191, 187, 1, 0, 0, 0, 191, 188, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 190, 1, 0, 0, 0, 192, 70, 1, 0, 0, 0, 193, 194, 3, 57, 28, 0, 194, 195, 7, 5, 0, 0, 195, 72, 1, 0, 0, 0, 196, 197, 3, 57, 28, 0, 197, 198, 2, 48, 51, 0, 198, 199, 2, 48, 55, 0, 199, 200, 2, 48, 55, 0, 200, 74, 1, 0, 0, 0, 201, 202, 3, 57, 28, 0, 202, 203, 7, 6, 0, 0, 203, 204, 3, 65, 32, 0, 204, 205, 3, 65, 32, 0, 205, 76, 1, 0, 0, 0, 206, 207, 3, 57, 28, 0, 207, 208, 5, 117, 0, 0, 208, 209, 3, 65, 32, 0, 209, 210, 3, 65, 32, 0, 210, 211, 3, 65, 32, 0, 211, 212, 3, 65, 32, 0, 212, 225, 1, 0, 0, 0, 213, 214, 3, 57, 28, 0, 214, 215, 5, 85, 0, 0, 215, 216, 3, 65, 32, 0, 216, 217, 3, 65, 32, 0, 217, 218, 3, 65, 32, 0, 218, 219, 3, 65, 32, 0, 219, 220, 3, 65, 32, 0, 220, 221, 3, 65, 32, 0, 221, 222, 3, 65, 32, 0, 222, 223, 3, 65, 32, 0, 223, 225, 1, 0, 0, 0, 224, 206, 1, 0, 0, 0, 224, 213, 1, 0, 0, 0, 225, 78, 1, 0, 0, 0, 226, 228, 7, 7, 0, 0, 227, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 6, 39, 0, 0, 232, 80, 1, 0, 0, 0, 233, 234, 5, 47, 0, 0, 234, 235, 5, 47, 0, 0, 235, 239, 1, 0, 0, 0, 236, 238, 8, 8, 0, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 6, 40, 0, 0, 243, 82, 1, 0, 0, 0, 244, 246, 3, 61, 30, 0, 245, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 251, 5, 46, 0, 0, 250, 252, 3, 61, 30, 0, 251, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, 257, 3, 63, 31, 0, 256, 255, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 275, 1, 0, 0, 0, 258, 260, 3, 61, 30, 0, 259, 258, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 264, 3, 63, 31, 0, 264, 275, 1, 0, 0, 0, 265, 267, 5, 46, 0, 0, 266, 268, 3, 61, 30, 0, 267, 266, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 272, 1, 0, 0, 0, 271, 273, 3, 63, 31, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 275, 1, 0, 0, 0, 274, 245, 1, 0, 0, 0, 274, 259, 1, 0, 0, 0, 274, 265, 1, 0, 0, 0, 275, 84, 1, 0, 0, 0, 276, 278, 3, 61, 30, 0, 277, 276, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 290, 1, 0, 0, 0, 281, 282, 5, 48, 0, 0, 282, 283, 5, 120, 0, 0, 283, 285, 1, 0, 0, 0, 284, 286, 3, 65, 32, 0, 285, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 290, 1, 0, 0, 0, 289, 277, 1, 0, 0, 0, 289, 281, 1, 0, 0, 0, 290, 86, 1, 0, 0, 0, 291, 293, 3, 61, 30, 0, 292, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 292, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 7, 9, 0, 0, 297, 309, 1, 0, 0, 0, 298, 299, 5, 48, 0, 0, 299, 300, 5, 120, 0, 0, 300, 302, 1, 0, 0, 0, 301, 303, 3, 65, 32, 0, 302, 301, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 307, 7, 9, 0, 0, 307, 309, 1, 0, 0, 0, 308, 292, 1, 0, 0, 0, 308, 298, 1, 0, 0, 0, 309, 88, 1, 0, 0, 0, 310, 315, 5, 34, 0, 0, 311, 314, 3, 69, 34, 0, 312, 314, 8, 10, 0, 0, 313, 311, 1, 0, 0, 0, 313, 312, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 318, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 407, 5, 34, 0, 0, 319, 324, 5, 39, 0, 0, 320, 323, 3, 69, 34, 0, 321, 323, 8, 11, 0, 0, 322, 320, 1, 0, 0, 0, 322, 321, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 327, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 327, 407, 5, 39, 0, 0, 328, 329, 5, 34, 0, 0, 329, 330, 5, 34, 0, 0, 330, 331, 5, 34, 0, 0, 331, 336, 1, 0, 0, 0, 332, 335, 3, 69, 34, 0, 333, 335, 8, 12, 0, 0, 334, 332, 1, 0, 0, 0, 334, 333, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, 339, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 340, 5, 34, 0, 0, 340, 341, 5, 34, 0, 0, 341, 407, 5, 34, 0, 0, 342, 343, 5, 39, 0, 0, 343, 344, 5, 39, 0, 0, 344, 345, 5, 39, 0, 0, 345, 350, 1, 0, 0, 0, 346, 349, 3, 69, 34, 0, 347, 349, 8, 12, 0, 0, 348, 346, 1, 0, 0, 0, 348, 347, 1, 0, 0, 0, 349, 352, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 351, 353, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 353, 354, 5, 39, 0, 0, 354, 355, 5, 39, 0, 0, 355, 407, 5, 39, 0, 0, 356, 357, 3, 67, 33, 0, 357, 361, 5, 34, 0, 0, 358, 360, 8, 13, 0, 0, 359, 358, 1, 0, 0, 0, 360, 363, 1, 0, 0, 0, 361, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 364, 1, 0, 0, 0, 363, 361, 1, 0, 0, 0, 364, 365, 5, 34, 0, 0, 365, 407, 1, 0, 0, 0, 366, 367, 3, 67, 33, 0, 367, 371, 5, 39, 0, 0, 368, 370, 8, 14, 0, 0, 369, 368, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 374, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 375, 5, 39, 0, 0, 375, 407, 1, 0, 0, 0, 376, 377, 3, 67, 33, 0, 377, 378, 5, 34, 0, 0, 378, 379, 5, 34, 0, 0, 379, 380, 5, 34, 0, 0, 380, 384, 1, 0, 0, 0, 381, 383, 9, 0, 0, 0, 382, 381, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 385, 387, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 388, 5, 34, 0, 0, 388, 389, 5, 34, 0, 0, 389, 390, 5, 34, 0, 0, 390, 407, 1, 0, 0, 0, 391, 392, 3, 67, 33, 0, 392, 393, 5, 39, 0, 0, 393, 394, 5, 39, 0, 0, 394, 395, 5, 39, 0, 0, 395, 399, 1, 0, 0, 0, 396, 398, 9, 0, 0, 0, 397, 396, 1, 0, 0, 0, 398, 401, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 400, 402, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 402, 403, 5, 39, 0, 0, 403, 404, 5, 39, 0, 0, 404, 405, 5, 39, 0, 0, 405, 407, 1, 0, 0, 0, 406, 310, 1, 0, 0, 0, 406, 319, 1, 0, 0, 0, 406, 328, 1, 0, 0, 0, 406, 342, 1, 0, 0, 0, 406, 356, 1, 0, 0, 0, 406, 366, 1, 0, 0, 0, 406, 376, 1, 0, 0, 0, 406, 391, 1, 0, 0, 0, 407, 90, 1, 0, 0, 0, 408, 409, 7, 15, 0, 0, 409, 410, 3, 89, 44, 0, 410, 92, 1, 0, 0, 0, 411, 414, 3, 59, 29, 0, 412, 414, 5, 95, 0, 0, 413, 411, 1, 0, 0, 0, 413, 412, 1, 0, 0, 0, 414, 420, 1, 0, 0, 0, 415, 419, 3, 59, 29, 0, 416, 419, 3, 61, 30, 0, 417, 419, 5, 95, 0, 0, 418, 415, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, 417, 1, 0, 0, 0, 419, 422, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 94, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 36, 0, 176, 181, 191, 224, 229, 239, 247, 253, 256, 261, 269, 272, 274, 279, 287, 289, 294, 304, 308, 313, 315, 322, 324, 334, 336, 348, 350, 361, 371, 384, 399, 406, 413, 418, 420, 1, 0, 1, 0] \ No newline at end of file diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go b/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go index a3315b842..969a59861 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go @@ -1,4 +1,4 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/bin/../parser/gen/CEL.g4 by ANTLR 4.9.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. package gen // CEL import "github.com/antlr/antlr4/runtime/Go/antlr" diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go b/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go index daf7f807d..8e84579ed 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go @@ -1,4 +1,4 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/bin/../parser/gen/CEL.g4 by ANTLR 4.9.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. package gen // CEL import "github.com/antlr/antlr4/runtime/Go/antlr" diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go b/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go index 4af96aba5..7b4cca62e 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go @@ -1,9 +1,10 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/bin/../parser/gen/CEL.g4 by ANTLR 4.9.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. package gen import ( "fmt" + "sync" "unicode" "github.com/antlr/antlr4/runtime/Go/antlr" @@ -11,272 +12,292 @@ import ( // Suppress unused import error var _ = fmt.Printf +var _ = sync.Once{} var _ = unicode.IsLetter -var serializedLexerAtn = []uint16{ - 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 38, 425, - 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, - 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, - 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, - 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, - 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, - 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, - 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, - 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, - 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 3, 2, 3, - 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, - 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, - 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, - 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, - 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, - 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, - 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, - 32, 3, 32, 3, 33, 3, 33, 5, 33, 179, 10, 33, 3, 33, 6, 33, 182, 10, 33, - 13, 33, 14, 33, 183, 3, 34, 3, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, - 36, 5, 36, 194, 10, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, - 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, - 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, - 3, 40, 3, 40, 3, 40, 5, 40, 227, 10, 40, 3, 41, 6, 41, 230, 10, 41, 13, - 41, 14, 41, 231, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 7, 42, 240, - 10, 42, 12, 42, 14, 42, 243, 11, 42, 3, 42, 3, 42, 3, 43, 6, 43, 248, 10, - 43, 13, 43, 14, 43, 249, 3, 43, 3, 43, 6, 43, 254, 10, 43, 13, 43, 14, - 43, 255, 3, 43, 5, 43, 259, 10, 43, 3, 43, 6, 43, 262, 10, 43, 13, 43, - 14, 43, 263, 3, 43, 3, 43, 3, 43, 3, 43, 6, 43, 270, 10, 43, 13, 43, 14, - 43, 271, 3, 43, 5, 43, 275, 10, 43, 5, 43, 277, 10, 43, 3, 44, 6, 44, 280, - 10, 44, 13, 44, 14, 44, 281, 3, 44, 3, 44, 3, 44, 3, 44, 6, 44, 288, 10, - 44, 13, 44, 14, 44, 289, 5, 44, 292, 10, 44, 3, 45, 6, 45, 295, 10, 45, - 13, 45, 14, 45, 296, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 6, 45, 305, - 10, 45, 13, 45, 14, 45, 306, 3, 45, 3, 45, 5, 45, 311, 10, 45, 3, 46, 3, - 46, 3, 46, 7, 46, 316, 10, 46, 12, 46, 14, 46, 319, 11, 46, 3, 46, 3, 46, - 3, 46, 3, 46, 7, 46, 325, 10, 46, 12, 46, 14, 46, 328, 11, 46, 3, 46, 3, - 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 7, 46, 337, 10, 46, 12, 46, 14, - 46, 340, 11, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, - 3, 46, 7, 46, 351, 10, 46, 12, 46, 14, 46, 354, 11, 46, 3, 46, 3, 46, 3, - 46, 3, 46, 3, 46, 3, 46, 7, 46, 362, 10, 46, 12, 46, 14, 46, 365, 11, 46, - 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 7, 46, 372, 10, 46, 12, 46, 14, 46, - 375, 11, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 7, - 46, 385, 10, 46, 12, 46, 14, 46, 388, 11, 46, 3, 46, 3, 46, 3, 46, 3, 46, - 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 7, 46, 400, 10, 46, 12, 46, 14, - 46, 403, 11, 46, 3, 46, 3, 46, 3, 46, 3, 46, 5, 46, 409, 10, 46, 3, 47, - 3, 47, 3, 47, 3, 48, 3, 48, 5, 48, 416, 10, 48, 3, 48, 3, 48, 3, 48, 7, - 48, 421, 10, 48, 12, 48, 14, 48, 424, 11, 48, 6, 338, 352, 386, 401, 2, - 49, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, - 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, - 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, - 59, 2, 61, 2, 63, 2, 65, 2, 67, 2, 69, 2, 71, 2, 73, 2, 75, 2, 77, 2, 79, - 2, 81, 31, 83, 32, 85, 33, 87, 34, 89, 35, 91, 36, 93, 37, 95, 38, 3, 2, - 18, 4, 2, 67, 92, 99, 124, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, - 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 84, 84, 116, 116, 12, 2, 36, 36, 41, - 41, 65, 65, 94, 94, 98, 100, 104, 104, 112, 112, 116, 116, 118, 118, 120, - 120, 4, 2, 90, 90, 122, 122, 5, 2, 11, 12, 14, 15, 34, 34, 3, 2, 12, 12, - 4, 2, 87, 87, 119, 119, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 6, 2, 12, - 12, 15, 15, 41, 41, 94, 94, 3, 2, 94, 94, 5, 2, 12, 12, 15, 15, 36, 36, - 5, 2, 12, 12, 15, 15, 41, 41, 4, 2, 68, 68, 100, 100, 2, 458, 2, 3, 3, - 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, - 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, - 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, - 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, - 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, - 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, - 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, - 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, - 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, - 95, 3, 2, 2, 2, 3, 97, 3, 2, 2, 2, 5, 100, 3, 2, 2, 2, 7, 103, 3, 2, 2, - 2, 9, 106, 3, 2, 2, 2, 11, 108, 3, 2, 2, 2, 13, 111, 3, 2, 2, 2, 15, 114, - 3, 2, 2, 2, 17, 116, 3, 2, 2, 2, 19, 119, 3, 2, 2, 2, 21, 122, 3, 2, 2, - 2, 23, 124, 3, 2, 2, 2, 25, 126, 3, 2, 2, 2, 27, 128, 3, 2, 2, 2, 29, 130, - 3, 2, 2, 2, 31, 132, 3, 2, 2, 2, 33, 134, 3, 2, 2, 2, 35, 136, 3, 2, 2, - 2, 37, 138, 3, 2, 2, 2, 39, 140, 3, 2, 2, 2, 41, 142, 3, 2, 2, 2, 43, 144, - 3, 2, 2, 2, 45, 146, 3, 2, 2, 2, 47, 148, 3, 2, 2, 2, 49, 150, 3, 2, 2, - 2, 51, 152, 3, 2, 2, 2, 53, 154, 3, 2, 2, 2, 55, 159, 3, 2, 2, 2, 57, 165, - 3, 2, 2, 2, 59, 170, 3, 2, 2, 2, 61, 172, 3, 2, 2, 2, 63, 174, 3, 2, 2, - 2, 65, 176, 3, 2, 2, 2, 67, 185, 3, 2, 2, 2, 69, 187, 3, 2, 2, 2, 71, 193, - 3, 2, 2, 2, 73, 195, 3, 2, 2, 2, 75, 198, 3, 2, 2, 2, 77, 203, 3, 2, 2, - 2, 79, 226, 3, 2, 2, 2, 81, 229, 3, 2, 2, 2, 83, 235, 3, 2, 2, 2, 85, 276, - 3, 2, 2, 2, 87, 291, 3, 2, 2, 2, 89, 310, 3, 2, 2, 2, 91, 408, 3, 2, 2, - 2, 93, 410, 3, 2, 2, 2, 95, 415, 3, 2, 2, 2, 97, 98, 7, 63, 2, 2, 98, 99, - 7, 63, 2, 2, 99, 4, 3, 2, 2, 2, 100, 101, 7, 35, 2, 2, 101, 102, 7, 63, - 2, 2, 102, 6, 3, 2, 2, 2, 103, 104, 7, 107, 2, 2, 104, 105, 7, 112, 2, - 2, 105, 8, 3, 2, 2, 2, 106, 107, 7, 62, 2, 2, 107, 10, 3, 2, 2, 2, 108, - 109, 7, 62, 2, 2, 109, 110, 7, 63, 2, 2, 110, 12, 3, 2, 2, 2, 111, 112, - 7, 64, 2, 2, 112, 113, 7, 63, 2, 2, 113, 14, 3, 2, 2, 2, 114, 115, 7, 64, - 2, 2, 115, 16, 3, 2, 2, 2, 116, 117, 7, 40, 2, 2, 117, 118, 7, 40, 2, 2, - 118, 18, 3, 2, 2, 2, 119, 120, 7, 126, 2, 2, 120, 121, 7, 126, 2, 2, 121, - 20, 3, 2, 2, 2, 122, 123, 7, 93, 2, 2, 123, 22, 3, 2, 2, 2, 124, 125, 7, - 95, 2, 2, 125, 24, 3, 2, 2, 2, 126, 127, 7, 125, 2, 2, 127, 26, 3, 2, 2, - 2, 128, 129, 7, 127, 2, 2, 129, 28, 3, 2, 2, 2, 130, 131, 7, 42, 2, 2, - 131, 30, 3, 2, 2, 2, 132, 133, 7, 43, 2, 2, 133, 32, 3, 2, 2, 2, 134, 135, - 7, 48, 2, 2, 135, 34, 3, 2, 2, 2, 136, 137, 7, 46, 2, 2, 137, 36, 3, 2, - 2, 2, 138, 139, 7, 47, 2, 2, 139, 38, 3, 2, 2, 2, 140, 141, 7, 35, 2, 2, - 141, 40, 3, 2, 2, 2, 142, 143, 7, 65, 2, 2, 143, 42, 3, 2, 2, 2, 144, 145, - 7, 60, 2, 2, 145, 44, 3, 2, 2, 2, 146, 147, 7, 45, 2, 2, 147, 46, 3, 2, - 2, 2, 148, 149, 7, 44, 2, 2, 149, 48, 3, 2, 2, 2, 150, 151, 7, 49, 2, 2, - 151, 50, 3, 2, 2, 2, 152, 153, 7, 39, 2, 2, 153, 52, 3, 2, 2, 2, 154, 155, - 7, 118, 2, 2, 155, 156, 7, 116, 2, 2, 156, 157, 7, 119, 2, 2, 157, 158, - 7, 103, 2, 2, 158, 54, 3, 2, 2, 2, 159, 160, 7, 104, 2, 2, 160, 161, 7, - 99, 2, 2, 161, 162, 7, 110, 2, 2, 162, 163, 7, 117, 2, 2, 163, 164, 7, - 103, 2, 2, 164, 56, 3, 2, 2, 2, 165, 166, 7, 112, 2, 2, 166, 167, 7, 119, - 2, 2, 167, 168, 7, 110, 2, 2, 168, 169, 7, 110, 2, 2, 169, 58, 3, 2, 2, - 2, 170, 171, 7, 94, 2, 2, 171, 60, 3, 2, 2, 2, 172, 173, 9, 2, 2, 2, 173, - 62, 3, 2, 2, 2, 174, 175, 4, 50, 59, 2, 175, 64, 3, 2, 2, 2, 176, 178, - 9, 3, 2, 2, 177, 179, 9, 4, 2, 2, 178, 177, 3, 2, 2, 2, 178, 179, 3, 2, - 2, 2, 179, 181, 3, 2, 2, 2, 180, 182, 5, 63, 32, 2, 181, 180, 3, 2, 2, - 2, 182, 183, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, - 66, 3, 2, 2, 2, 185, 186, 9, 5, 2, 2, 186, 68, 3, 2, 2, 2, 187, 188, 9, - 6, 2, 2, 188, 70, 3, 2, 2, 2, 189, 194, 5, 73, 37, 2, 190, 194, 5, 77, - 39, 2, 191, 194, 5, 79, 40, 2, 192, 194, 5, 75, 38, 2, 193, 189, 3, 2, - 2, 2, 193, 190, 3, 2, 2, 2, 193, 191, 3, 2, 2, 2, 193, 192, 3, 2, 2, 2, - 194, 72, 3, 2, 2, 2, 195, 196, 5, 59, 30, 2, 196, 197, 9, 7, 2, 2, 197, - 74, 3, 2, 2, 2, 198, 199, 5, 59, 30, 2, 199, 200, 4, 50, 53, 2, 200, 201, - 4, 50, 57, 2, 201, 202, 4, 50, 57, 2, 202, 76, 3, 2, 2, 2, 203, 204, 5, - 59, 30, 2, 204, 205, 9, 8, 2, 2, 205, 206, 5, 67, 34, 2, 206, 207, 5, 67, - 34, 2, 207, 78, 3, 2, 2, 2, 208, 209, 5, 59, 30, 2, 209, 210, 7, 119, 2, - 2, 210, 211, 5, 67, 34, 2, 211, 212, 5, 67, 34, 2, 212, 213, 5, 67, 34, - 2, 213, 214, 5, 67, 34, 2, 214, 227, 3, 2, 2, 2, 215, 216, 5, 59, 30, 2, - 216, 217, 7, 87, 2, 2, 217, 218, 5, 67, 34, 2, 218, 219, 5, 67, 34, 2, - 219, 220, 5, 67, 34, 2, 220, 221, 5, 67, 34, 2, 221, 222, 5, 67, 34, 2, - 222, 223, 5, 67, 34, 2, 223, 224, 5, 67, 34, 2, 224, 225, 5, 67, 34, 2, - 225, 227, 3, 2, 2, 2, 226, 208, 3, 2, 2, 2, 226, 215, 3, 2, 2, 2, 227, - 80, 3, 2, 2, 2, 228, 230, 9, 9, 2, 2, 229, 228, 3, 2, 2, 2, 230, 231, 3, - 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 233, 3, 2, 2, - 2, 233, 234, 8, 41, 2, 2, 234, 82, 3, 2, 2, 2, 235, 236, 7, 49, 2, 2, 236, - 237, 7, 49, 2, 2, 237, 241, 3, 2, 2, 2, 238, 240, 10, 10, 2, 2, 239, 238, - 3, 2, 2, 2, 240, 243, 3, 2, 2, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, - 2, 2, 242, 244, 3, 2, 2, 2, 243, 241, 3, 2, 2, 2, 244, 245, 8, 42, 2, 2, - 245, 84, 3, 2, 2, 2, 246, 248, 5, 63, 32, 2, 247, 246, 3, 2, 2, 2, 248, - 249, 3, 2, 2, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 251, - 3, 2, 2, 2, 251, 253, 7, 48, 2, 2, 252, 254, 5, 63, 32, 2, 253, 252, 3, - 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 253, 3, 2, 2, 2, 255, 256, 3, 2, 2, - 2, 256, 258, 3, 2, 2, 2, 257, 259, 5, 65, 33, 2, 258, 257, 3, 2, 2, 2, - 258, 259, 3, 2, 2, 2, 259, 277, 3, 2, 2, 2, 260, 262, 5, 63, 32, 2, 261, - 260, 3, 2, 2, 2, 262, 263, 3, 2, 2, 2, 263, 261, 3, 2, 2, 2, 263, 264, - 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 266, 5, 65, 33, 2, 266, 277, 3, - 2, 2, 2, 267, 269, 7, 48, 2, 2, 268, 270, 5, 63, 32, 2, 269, 268, 3, 2, - 2, 2, 270, 271, 3, 2, 2, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, - 272, 274, 3, 2, 2, 2, 273, 275, 5, 65, 33, 2, 274, 273, 3, 2, 2, 2, 274, - 275, 3, 2, 2, 2, 275, 277, 3, 2, 2, 2, 276, 247, 3, 2, 2, 2, 276, 261, - 3, 2, 2, 2, 276, 267, 3, 2, 2, 2, 277, 86, 3, 2, 2, 2, 278, 280, 5, 63, - 32, 2, 279, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 279, 3, 2, 2, 2, - 281, 282, 3, 2, 2, 2, 282, 292, 3, 2, 2, 2, 283, 284, 7, 50, 2, 2, 284, - 285, 7, 122, 2, 2, 285, 287, 3, 2, 2, 2, 286, 288, 5, 67, 34, 2, 287, 286, - 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, - 2, 2, 290, 292, 3, 2, 2, 2, 291, 279, 3, 2, 2, 2, 291, 283, 3, 2, 2, 2, - 292, 88, 3, 2, 2, 2, 293, 295, 5, 63, 32, 2, 294, 293, 3, 2, 2, 2, 295, - 296, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 298, - 3, 2, 2, 2, 298, 299, 9, 11, 2, 2, 299, 311, 3, 2, 2, 2, 300, 301, 7, 50, - 2, 2, 301, 302, 7, 122, 2, 2, 302, 304, 3, 2, 2, 2, 303, 305, 5, 67, 34, - 2, 304, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, - 307, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 309, 9, 11, 2, 2, 309, 311, - 3, 2, 2, 2, 310, 294, 3, 2, 2, 2, 310, 300, 3, 2, 2, 2, 311, 90, 3, 2, - 2, 2, 312, 317, 7, 36, 2, 2, 313, 316, 5, 71, 36, 2, 314, 316, 10, 12, - 2, 2, 315, 313, 3, 2, 2, 2, 315, 314, 3, 2, 2, 2, 316, 319, 3, 2, 2, 2, - 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 320, 3, 2, 2, 2, 319, - 317, 3, 2, 2, 2, 320, 409, 7, 36, 2, 2, 321, 326, 7, 41, 2, 2, 322, 325, - 5, 71, 36, 2, 323, 325, 10, 13, 2, 2, 324, 322, 3, 2, 2, 2, 324, 323, 3, - 2, 2, 2, 325, 328, 3, 2, 2, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, - 2, 327, 329, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 329, 409, 7, 41, 2, 2, 330, - 331, 7, 36, 2, 2, 331, 332, 7, 36, 2, 2, 332, 333, 7, 36, 2, 2, 333, 338, - 3, 2, 2, 2, 334, 337, 5, 71, 36, 2, 335, 337, 10, 14, 2, 2, 336, 334, 3, - 2, 2, 2, 336, 335, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 339, 3, 2, 2, - 2, 338, 336, 3, 2, 2, 2, 339, 341, 3, 2, 2, 2, 340, 338, 3, 2, 2, 2, 341, - 342, 7, 36, 2, 2, 342, 343, 7, 36, 2, 2, 343, 409, 7, 36, 2, 2, 344, 345, - 7, 41, 2, 2, 345, 346, 7, 41, 2, 2, 346, 347, 7, 41, 2, 2, 347, 352, 3, - 2, 2, 2, 348, 351, 5, 71, 36, 2, 349, 351, 10, 14, 2, 2, 350, 348, 3, 2, - 2, 2, 350, 349, 3, 2, 2, 2, 351, 354, 3, 2, 2, 2, 352, 353, 3, 2, 2, 2, - 352, 350, 3, 2, 2, 2, 353, 355, 3, 2, 2, 2, 354, 352, 3, 2, 2, 2, 355, - 356, 7, 41, 2, 2, 356, 357, 7, 41, 2, 2, 357, 409, 7, 41, 2, 2, 358, 359, - 5, 69, 35, 2, 359, 363, 7, 36, 2, 2, 360, 362, 10, 15, 2, 2, 361, 360, - 3, 2, 2, 2, 362, 365, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 363, 364, 3, 2, - 2, 2, 364, 366, 3, 2, 2, 2, 365, 363, 3, 2, 2, 2, 366, 367, 7, 36, 2, 2, - 367, 409, 3, 2, 2, 2, 368, 369, 5, 69, 35, 2, 369, 373, 7, 41, 2, 2, 370, - 372, 10, 16, 2, 2, 371, 370, 3, 2, 2, 2, 372, 375, 3, 2, 2, 2, 373, 371, - 3, 2, 2, 2, 373, 374, 3, 2, 2, 2, 374, 376, 3, 2, 2, 2, 375, 373, 3, 2, - 2, 2, 376, 377, 7, 41, 2, 2, 377, 409, 3, 2, 2, 2, 378, 379, 5, 69, 35, - 2, 379, 380, 7, 36, 2, 2, 380, 381, 7, 36, 2, 2, 381, 382, 7, 36, 2, 2, - 382, 386, 3, 2, 2, 2, 383, 385, 11, 2, 2, 2, 384, 383, 3, 2, 2, 2, 385, - 388, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 389, - 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 390, 7, 36, 2, 2, 390, 391, 7, 36, - 2, 2, 391, 392, 7, 36, 2, 2, 392, 409, 3, 2, 2, 2, 393, 394, 5, 69, 35, - 2, 394, 395, 7, 41, 2, 2, 395, 396, 7, 41, 2, 2, 396, 397, 7, 41, 2, 2, - 397, 401, 3, 2, 2, 2, 398, 400, 11, 2, 2, 2, 399, 398, 3, 2, 2, 2, 400, - 403, 3, 2, 2, 2, 401, 402, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 402, 404, - 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 404, 405, 7, 41, 2, 2, 405, 406, 7, 41, - 2, 2, 406, 407, 7, 41, 2, 2, 407, 409, 3, 2, 2, 2, 408, 312, 3, 2, 2, 2, - 408, 321, 3, 2, 2, 2, 408, 330, 3, 2, 2, 2, 408, 344, 3, 2, 2, 2, 408, - 358, 3, 2, 2, 2, 408, 368, 3, 2, 2, 2, 408, 378, 3, 2, 2, 2, 408, 393, - 3, 2, 2, 2, 409, 92, 3, 2, 2, 2, 410, 411, 9, 17, 2, 2, 411, 412, 5, 91, - 46, 2, 412, 94, 3, 2, 2, 2, 413, 416, 5, 61, 31, 2, 414, 416, 7, 97, 2, - 2, 415, 413, 3, 2, 2, 2, 415, 414, 3, 2, 2, 2, 416, 422, 3, 2, 2, 2, 417, - 421, 5, 61, 31, 2, 418, 421, 5, 63, 32, 2, 419, 421, 7, 97, 2, 2, 420, - 417, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 420, 419, 3, 2, 2, 2, 421, 424, - 3, 2, 2, 2, 422, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 96, 3, 2, - 2, 2, 424, 422, 3, 2, 2, 2, 38, 2, 178, 183, 193, 226, 231, 241, 249, 255, - 258, 263, 271, 274, 276, 281, 289, 291, 296, 306, 310, 315, 317, 324, 326, - 336, 338, 350, 352, 363, 373, 386, 401, 408, 415, 420, 422, 3, 2, 3, 2, -} - -var lexerChannelNames = []string{ - "DEFAULT_TOKEN_CHANNEL", "HIDDEN", -} - -var lexerModeNames = []string{ - "DEFAULT_MODE", -} - -var lexerLiteralNames = []string{ - "", "'=='", "'!='", "'in'", "'<'", "'<='", "'>='", "'>'", "'&&'", "'||'", - "'['", "']'", "'{'", "'}'", "'('", "')'", "'.'", "','", "'-'", "'!'", "'?'", - "':'", "'+'", "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", +type CELLexer struct { + *antlr.BaseLexer + channelNames []string + modeNames []string + // TODO: EOF string } -var lexerSymbolicNames = []string{ - "", "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", - "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", - "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", - "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", "NUL", - "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", - "BYTES", "IDENTIFIER", +var cellexerLexerStaticData struct { + once sync.Once + serializedATN []int32 + channelNames []string + modeNames []string + literalNames []string + symbolicNames []string + ruleNames []string + predictionContextCache *antlr.PredictionContextCache + atn *antlr.ATN + decisionToDFA []*antlr.DFA } -var lexerRuleNames = []string{ - "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", - "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", - "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", - "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", "NUL", - "BACKSLASH", "LETTER", "DIGIT", "EXPONENT", "HEXDIGIT", "RAW", "ESC_SEQ", - "ESC_CHAR_SEQ", "ESC_OCT_SEQ", "ESC_BYTE_SEQ", "ESC_UNI_SEQ", "WHITESPACE", - "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", "BYTES", "IDENTIFIER", +func cellexerLexerInit() { + staticData := &cellexerLexerStaticData + staticData.channelNames = []string{ + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", + } + staticData.modeNames = []string{ + "DEFAULT_MODE", + } + staticData.literalNames = []string{ + "", "'=='", "'!='", "'in'", "'<'", "'<='", "'>='", "'>'", "'&&'", "'||'", + "'['", "']'", "'{'", "'}'", "'('", "')'", "'.'", "','", "'-'", "'!'", + "'?'", "':'", "'+'", "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", + } + staticData.symbolicNames = []string{ + "", "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", + "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", + "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", + "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", + "NUL", "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", + "STRING", "BYTES", "IDENTIFIER", + } + staticData.ruleNames = []string{ + "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", + "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", + "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", + "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", + "NUL", "BACKSLASH", "LETTER", "DIGIT", "EXPONENT", "HEXDIGIT", "RAW", + "ESC_SEQ", "ESC_CHAR_SEQ", "ESC_OCT_SEQ", "ESC_BYTE_SEQ", "ESC_UNI_SEQ", + "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", + "BYTES", "IDENTIFIER", + } + staticData.predictionContextCache = antlr.NewPredictionContextCache() + staticData.serializedATN = []int32{ + 4, 0, 36, 423, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, + 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, + 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, + 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, + 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, + 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, + 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, + 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, + 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, + 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, + 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, + 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, + 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, + 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, + 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, + 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, + 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 177, 8, 31, 1, 31, 4, 31, 180, 8, 31, + 11, 31, 12, 31, 181, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, + 34, 3, 34, 192, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, + 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, + 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, + 1, 38, 1, 38, 1, 38, 3, 38, 225, 8, 38, 1, 39, 4, 39, 228, 8, 39, 11, 39, + 12, 39, 229, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 238, 8, 40, + 10, 40, 12, 40, 241, 9, 40, 1, 40, 1, 40, 1, 41, 4, 41, 246, 8, 41, 11, + 41, 12, 41, 247, 1, 41, 1, 41, 4, 41, 252, 8, 41, 11, 41, 12, 41, 253, + 1, 41, 3, 41, 257, 8, 41, 1, 41, 4, 41, 260, 8, 41, 11, 41, 12, 41, 261, + 1, 41, 1, 41, 1, 41, 1, 41, 4, 41, 268, 8, 41, 11, 41, 12, 41, 269, 1, + 41, 3, 41, 273, 8, 41, 3, 41, 275, 8, 41, 1, 42, 4, 42, 278, 8, 42, 11, + 42, 12, 42, 279, 1, 42, 1, 42, 1, 42, 1, 42, 4, 42, 286, 8, 42, 11, 42, + 12, 42, 287, 3, 42, 290, 8, 42, 1, 43, 4, 43, 293, 8, 43, 11, 43, 12, 43, + 294, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 4, 43, 303, 8, 43, 11, 43, + 12, 43, 304, 1, 43, 1, 43, 3, 43, 309, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, + 314, 8, 44, 10, 44, 12, 44, 317, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, + 44, 323, 8, 44, 10, 44, 12, 44, 326, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, + 1, 44, 1, 44, 1, 44, 5, 44, 335, 8, 44, 10, 44, 12, 44, 338, 9, 44, 1, + 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 349, + 8, 44, 10, 44, 12, 44, 352, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, + 44, 5, 44, 360, 8, 44, 10, 44, 12, 44, 363, 9, 44, 1, 44, 1, 44, 1, 44, + 1, 44, 1, 44, 5, 44, 370, 8, 44, 10, 44, 12, 44, 373, 9, 44, 1, 44, 1, + 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 383, 8, 44, 10, 44, + 12, 44, 386, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, + 44, 1, 44, 1, 44, 5, 44, 398, 8, 44, 10, 44, 12, 44, 401, 9, 44, 1, 44, + 1, 44, 1, 44, 1, 44, 3, 44, 407, 8, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, + 46, 3, 46, 414, 8, 46, 1, 46, 1, 46, 1, 46, 5, 46, 419, 8, 46, 10, 46, + 12, 46, 422, 9, 46, 4, 336, 350, 384, 399, 0, 47, 1, 1, 3, 2, 5, 3, 7, + 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, + 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, + 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 0, 59, 0, 61, 0, 63, 0, + 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 29, 81, 30, 83, 31, + 85, 32, 87, 33, 89, 34, 91, 35, 93, 36, 1, 0, 16, 2, 0, 65, 90, 97, 122, + 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, + 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, + 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, + 120, 3, 0, 9, 10, 12, 13, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, + 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, + 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, + 39, 2, 0, 66, 66, 98, 98, 456, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, + 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, + 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, + 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, + 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, + 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, + 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, + 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, + 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, + 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, + 3, 98, 1, 0, 0, 0, 5, 101, 1, 0, 0, 0, 7, 104, 1, 0, 0, 0, 9, 106, 1, 0, + 0, 0, 11, 109, 1, 0, 0, 0, 13, 112, 1, 0, 0, 0, 15, 114, 1, 0, 0, 0, 17, + 117, 1, 0, 0, 0, 19, 120, 1, 0, 0, 0, 21, 122, 1, 0, 0, 0, 23, 124, 1, + 0, 0, 0, 25, 126, 1, 0, 0, 0, 27, 128, 1, 0, 0, 0, 29, 130, 1, 0, 0, 0, + 31, 132, 1, 0, 0, 0, 33, 134, 1, 0, 0, 0, 35, 136, 1, 0, 0, 0, 37, 138, + 1, 0, 0, 0, 39, 140, 1, 0, 0, 0, 41, 142, 1, 0, 0, 0, 43, 144, 1, 0, 0, + 0, 45, 146, 1, 0, 0, 0, 47, 148, 1, 0, 0, 0, 49, 150, 1, 0, 0, 0, 51, 152, + 1, 0, 0, 0, 53, 157, 1, 0, 0, 0, 55, 163, 1, 0, 0, 0, 57, 168, 1, 0, 0, + 0, 59, 170, 1, 0, 0, 0, 61, 172, 1, 0, 0, 0, 63, 174, 1, 0, 0, 0, 65, 183, + 1, 0, 0, 0, 67, 185, 1, 0, 0, 0, 69, 191, 1, 0, 0, 0, 71, 193, 1, 0, 0, + 0, 73, 196, 1, 0, 0, 0, 75, 201, 1, 0, 0, 0, 77, 224, 1, 0, 0, 0, 79, 227, + 1, 0, 0, 0, 81, 233, 1, 0, 0, 0, 83, 274, 1, 0, 0, 0, 85, 289, 1, 0, 0, + 0, 87, 308, 1, 0, 0, 0, 89, 406, 1, 0, 0, 0, 91, 408, 1, 0, 0, 0, 93, 413, + 1, 0, 0, 0, 95, 96, 5, 61, 0, 0, 96, 97, 5, 61, 0, 0, 97, 2, 1, 0, 0, 0, + 98, 99, 5, 33, 0, 0, 99, 100, 5, 61, 0, 0, 100, 4, 1, 0, 0, 0, 101, 102, + 5, 105, 0, 0, 102, 103, 5, 110, 0, 0, 103, 6, 1, 0, 0, 0, 104, 105, 5, + 60, 0, 0, 105, 8, 1, 0, 0, 0, 106, 107, 5, 60, 0, 0, 107, 108, 5, 61, 0, + 0, 108, 10, 1, 0, 0, 0, 109, 110, 5, 62, 0, 0, 110, 111, 5, 61, 0, 0, 111, + 12, 1, 0, 0, 0, 112, 113, 5, 62, 0, 0, 113, 14, 1, 0, 0, 0, 114, 115, 5, + 38, 0, 0, 115, 116, 5, 38, 0, 0, 116, 16, 1, 0, 0, 0, 117, 118, 5, 124, + 0, 0, 118, 119, 5, 124, 0, 0, 119, 18, 1, 0, 0, 0, 120, 121, 5, 91, 0, + 0, 121, 20, 1, 0, 0, 0, 122, 123, 5, 93, 0, 0, 123, 22, 1, 0, 0, 0, 124, + 125, 5, 123, 0, 0, 125, 24, 1, 0, 0, 0, 126, 127, 5, 125, 0, 0, 127, 26, + 1, 0, 0, 0, 128, 129, 5, 40, 0, 0, 129, 28, 1, 0, 0, 0, 130, 131, 5, 41, + 0, 0, 131, 30, 1, 0, 0, 0, 132, 133, 5, 46, 0, 0, 133, 32, 1, 0, 0, 0, + 134, 135, 5, 44, 0, 0, 135, 34, 1, 0, 0, 0, 136, 137, 5, 45, 0, 0, 137, + 36, 1, 0, 0, 0, 138, 139, 5, 33, 0, 0, 139, 38, 1, 0, 0, 0, 140, 141, 5, + 63, 0, 0, 141, 40, 1, 0, 0, 0, 142, 143, 5, 58, 0, 0, 143, 42, 1, 0, 0, + 0, 144, 145, 5, 43, 0, 0, 145, 44, 1, 0, 0, 0, 146, 147, 5, 42, 0, 0, 147, + 46, 1, 0, 0, 0, 148, 149, 5, 47, 0, 0, 149, 48, 1, 0, 0, 0, 150, 151, 5, + 37, 0, 0, 151, 50, 1, 0, 0, 0, 152, 153, 5, 116, 0, 0, 153, 154, 5, 114, + 0, 0, 154, 155, 5, 117, 0, 0, 155, 156, 5, 101, 0, 0, 156, 52, 1, 0, 0, + 0, 157, 158, 5, 102, 0, 0, 158, 159, 5, 97, 0, 0, 159, 160, 5, 108, 0, + 0, 160, 161, 5, 115, 0, 0, 161, 162, 5, 101, 0, 0, 162, 54, 1, 0, 0, 0, + 163, 164, 5, 110, 0, 0, 164, 165, 5, 117, 0, 0, 165, 166, 5, 108, 0, 0, + 166, 167, 5, 108, 0, 0, 167, 56, 1, 0, 0, 0, 168, 169, 5, 92, 0, 0, 169, + 58, 1, 0, 0, 0, 170, 171, 7, 0, 0, 0, 171, 60, 1, 0, 0, 0, 172, 173, 2, + 48, 57, 0, 173, 62, 1, 0, 0, 0, 174, 176, 7, 1, 0, 0, 175, 177, 7, 2, 0, + 0, 176, 175, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 179, 1, 0, 0, 0, 178, + 180, 3, 61, 30, 0, 179, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 179, + 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 64, 1, 0, 0, 0, 183, 184, 7, 3, + 0, 0, 184, 66, 1, 0, 0, 0, 185, 186, 7, 4, 0, 0, 186, 68, 1, 0, 0, 0, 187, + 192, 3, 71, 35, 0, 188, 192, 3, 75, 37, 0, 189, 192, 3, 77, 38, 0, 190, + 192, 3, 73, 36, 0, 191, 187, 1, 0, 0, 0, 191, 188, 1, 0, 0, 0, 191, 189, + 1, 0, 0, 0, 191, 190, 1, 0, 0, 0, 192, 70, 1, 0, 0, 0, 193, 194, 3, 57, + 28, 0, 194, 195, 7, 5, 0, 0, 195, 72, 1, 0, 0, 0, 196, 197, 3, 57, 28, + 0, 197, 198, 2, 48, 51, 0, 198, 199, 2, 48, 55, 0, 199, 200, 2, 48, 55, + 0, 200, 74, 1, 0, 0, 0, 201, 202, 3, 57, 28, 0, 202, 203, 7, 6, 0, 0, 203, + 204, 3, 65, 32, 0, 204, 205, 3, 65, 32, 0, 205, 76, 1, 0, 0, 0, 206, 207, + 3, 57, 28, 0, 207, 208, 5, 117, 0, 0, 208, 209, 3, 65, 32, 0, 209, 210, + 3, 65, 32, 0, 210, 211, 3, 65, 32, 0, 211, 212, 3, 65, 32, 0, 212, 225, + 1, 0, 0, 0, 213, 214, 3, 57, 28, 0, 214, 215, 5, 85, 0, 0, 215, 216, 3, + 65, 32, 0, 216, 217, 3, 65, 32, 0, 217, 218, 3, 65, 32, 0, 218, 219, 3, + 65, 32, 0, 219, 220, 3, 65, 32, 0, 220, 221, 3, 65, 32, 0, 221, 222, 3, + 65, 32, 0, 222, 223, 3, 65, 32, 0, 223, 225, 1, 0, 0, 0, 224, 206, 1, 0, + 0, 0, 224, 213, 1, 0, 0, 0, 225, 78, 1, 0, 0, 0, 226, 228, 7, 7, 0, 0, + 227, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 229, + 230, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 6, 39, 0, 0, 232, 80, + 1, 0, 0, 0, 233, 234, 5, 47, 0, 0, 234, 235, 5, 47, 0, 0, 235, 239, 1, + 0, 0, 0, 236, 238, 8, 8, 0, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, + 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, + 239, 1, 0, 0, 0, 242, 243, 6, 40, 0, 0, 243, 82, 1, 0, 0, 0, 244, 246, + 3, 61, 30, 0, 245, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 245, 1, + 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 251, 5, 46, 0, + 0, 250, 252, 3, 61, 30, 0, 251, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, + 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, + 257, 3, 63, 31, 0, 256, 255, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 275, + 1, 0, 0, 0, 258, 260, 3, 61, 30, 0, 259, 258, 1, 0, 0, 0, 260, 261, 1, + 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 263, 1, 0, 0, + 0, 263, 264, 3, 63, 31, 0, 264, 275, 1, 0, 0, 0, 265, 267, 5, 46, 0, 0, + 266, 268, 3, 61, 30, 0, 267, 266, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, + 267, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 272, 1, 0, 0, 0, 271, 273, + 3, 63, 31, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 275, 1, + 0, 0, 0, 274, 245, 1, 0, 0, 0, 274, 259, 1, 0, 0, 0, 274, 265, 1, 0, 0, + 0, 275, 84, 1, 0, 0, 0, 276, 278, 3, 61, 30, 0, 277, 276, 1, 0, 0, 0, 278, + 279, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 290, + 1, 0, 0, 0, 281, 282, 5, 48, 0, 0, 282, 283, 5, 120, 0, 0, 283, 285, 1, + 0, 0, 0, 284, 286, 3, 65, 32, 0, 285, 284, 1, 0, 0, 0, 286, 287, 1, 0, + 0, 0, 287, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 290, 1, 0, 0, 0, + 289, 277, 1, 0, 0, 0, 289, 281, 1, 0, 0, 0, 290, 86, 1, 0, 0, 0, 291, 293, + 3, 61, 30, 0, 292, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 292, 1, + 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 7, 9, 0, + 0, 297, 309, 1, 0, 0, 0, 298, 299, 5, 48, 0, 0, 299, 300, 5, 120, 0, 0, + 300, 302, 1, 0, 0, 0, 301, 303, 3, 65, 32, 0, 302, 301, 1, 0, 0, 0, 303, + 304, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, + 1, 0, 0, 0, 306, 307, 7, 9, 0, 0, 307, 309, 1, 0, 0, 0, 308, 292, 1, 0, + 0, 0, 308, 298, 1, 0, 0, 0, 309, 88, 1, 0, 0, 0, 310, 315, 5, 34, 0, 0, + 311, 314, 3, 69, 34, 0, 312, 314, 8, 10, 0, 0, 313, 311, 1, 0, 0, 0, 313, + 312, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, + 1, 0, 0, 0, 316, 318, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 407, 5, 34, + 0, 0, 319, 324, 5, 39, 0, 0, 320, 323, 3, 69, 34, 0, 321, 323, 8, 11, 0, + 0, 322, 320, 1, 0, 0, 0, 322, 321, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, + 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 327, 1, 0, 0, 0, 326, 324, + 1, 0, 0, 0, 327, 407, 5, 39, 0, 0, 328, 329, 5, 34, 0, 0, 329, 330, 5, + 34, 0, 0, 330, 331, 5, 34, 0, 0, 331, 336, 1, 0, 0, 0, 332, 335, 3, 69, + 34, 0, 333, 335, 8, 12, 0, 0, 334, 332, 1, 0, 0, 0, 334, 333, 1, 0, 0, + 0, 335, 338, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, + 339, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 340, 5, 34, 0, 0, 340, 341, + 5, 34, 0, 0, 341, 407, 5, 34, 0, 0, 342, 343, 5, 39, 0, 0, 343, 344, 5, + 39, 0, 0, 344, 345, 5, 39, 0, 0, 345, 350, 1, 0, 0, 0, 346, 349, 3, 69, + 34, 0, 347, 349, 8, 12, 0, 0, 348, 346, 1, 0, 0, 0, 348, 347, 1, 0, 0, + 0, 349, 352, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 351, + 353, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 353, 354, 5, 39, 0, 0, 354, 355, + 5, 39, 0, 0, 355, 407, 5, 39, 0, 0, 356, 357, 3, 67, 33, 0, 357, 361, 5, + 34, 0, 0, 358, 360, 8, 13, 0, 0, 359, 358, 1, 0, 0, 0, 360, 363, 1, 0, + 0, 0, 361, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 364, 1, 0, 0, 0, + 363, 361, 1, 0, 0, 0, 364, 365, 5, 34, 0, 0, 365, 407, 1, 0, 0, 0, 366, + 367, 3, 67, 33, 0, 367, 371, 5, 39, 0, 0, 368, 370, 8, 14, 0, 0, 369, 368, + 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, + 0, 0, 372, 374, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 375, 5, 39, 0, 0, + 375, 407, 1, 0, 0, 0, 376, 377, 3, 67, 33, 0, 377, 378, 5, 34, 0, 0, 378, + 379, 5, 34, 0, 0, 379, 380, 5, 34, 0, 0, 380, 384, 1, 0, 0, 0, 381, 383, + 9, 0, 0, 0, 382, 381, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 385, 1, 0, + 0, 0, 384, 382, 1, 0, 0, 0, 385, 387, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, + 387, 388, 5, 34, 0, 0, 388, 389, 5, 34, 0, 0, 389, 390, 5, 34, 0, 0, 390, + 407, 1, 0, 0, 0, 391, 392, 3, 67, 33, 0, 392, 393, 5, 39, 0, 0, 393, 394, + 5, 39, 0, 0, 394, 395, 5, 39, 0, 0, 395, 399, 1, 0, 0, 0, 396, 398, 9, + 0, 0, 0, 397, 396, 1, 0, 0, 0, 398, 401, 1, 0, 0, 0, 399, 400, 1, 0, 0, + 0, 399, 397, 1, 0, 0, 0, 400, 402, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 402, + 403, 5, 39, 0, 0, 403, 404, 5, 39, 0, 0, 404, 405, 5, 39, 0, 0, 405, 407, + 1, 0, 0, 0, 406, 310, 1, 0, 0, 0, 406, 319, 1, 0, 0, 0, 406, 328, 1, 0, + 0, 0, 406, 342, 1, 0, 0, 0, 406, 356, 1, 0, 0, 0, 406, 366, 1, 0, 0, 0, + 406, 376, 1, 0, 0, 0, 406, 391, 1, 0, 0, 0, 407, 90, 1, 0, 0, 0, 408, 409, + 7, 15, 0, 0, 409, 410, 3, 89, 44, 0, 410, 92, 1, 0, 0, 0, 411, 414, 3, + 59, 29, 0, 412, 414, 5, 95, 0, 0, 413, 411, 1, 0, 0, 0, 413, 412, 1, 0, + 0, 0, 414, 420, 1, 0, 0, 0, 415, 419, 3, 59, 29, 0, 416, 419, 3, 61, 30, + 0, 417, 419, 5, 95, 0, 0, 418, 415, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, + 417, 1, 0, 0, 0, 419, 422, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 421, + 1, 0, 0, 0, 421, 94, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 36, 0, 176, 181, + 191, 224, 229, 239, 247, 253, 256, 261, 269, 272, 274, 279, 287, 289, 294, + 304, 308, 313, 315, 322, 324, 334, 336, 348, 350, 361, 371, 384, 399, 406, + 413, 418, 420, 1, 0, 1, 0, + } + deserializer := antlr.NewATNDeserializer(nil) + staticData.atn = deserializer.Deserialize(staticData.serializedATN) + atn := staticData.atn + staticData.decisionToDFA = make([]*antlr.DFA, len(atn.DecisionToState)) + decisionToDFA := staticData.decisionToDFA + for index, state := range atn.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(state, index) + } } -type CELLexer struct { - *antlr.BaseLexer - channelNames []string - modeNames []string - // TODO: EOF string +// CELLexerInit initializes any static state used to implement CELLexer. By default the +// static state used to implement the lexer is lazily initialized during the first call to +// NewCELLexer(). You can call this function if you wish to initialize the static state ahead +// of time. +func CELLexerInit() { + staticData := &cellexerLexerStaticData + staticData.once.Do(cellexerLexerInit) } // NewCELLexer produces a new lexer instance for the optional input antlr.CharStream. -// -// The *CELLexer instance produced may be reused by calling the SetInputStream method. -// The initial lexer configuration is expensive to construct, and the object is not thread-safe; -// however, if used within a Golang sync.Pool, the construction cost amortizes well and the -// objects can be used in a thread-safe manner. func NewCELLexer(input antlr.CharStream) *CELLexer { + CELLexerInit() l := new(CELLexer) - lexerDeserializer := antlr.NewATNDeserializer(nil) - lexerAtn := lexerDeserializer.DeserializeFromUInt16(serializedLexerAtn) - lexerDecisionToDFA := make([]*antlr.DFA, len(lexerAtn.DecisionToState)) - for index, ds := range lexerAtn.DecisionToState { - lexerDecisionToDFA[index] = antlr.NewDFA(ds, index) - } l.BaseLexer = antlr.NewBaseLexer(input) - l.Interpreter = antlr.NewLexerATNSimulator(l, lexerAtn, lexerDecisionToDFA, antlr.NewPredictionContextCache()) - - l.channelNames = lexerChannelNames - l.modeNames = lexerModeNames - l.RuleNames = lexerRuleNames - l.LiteralNames = lexerLiteralNames - l.SymbolicNames = lexerSymbolicNames + staticData := &cellexerLexerStaticData + l.Interpreter = antlr.NewLexerATNSimulator(l, staticData.atn, staticData.decisionToDFA, staticData.predictionContextCache) + l.channelNames = staticData.channelNames + l.modeNames = staticData.modeNames + l.RuleNames = staticData.ruleNames + l.LiteralNames = staticData.literalNames + l.SymbolicNames = staticData.symbolicNames l.GrammarFileName = "CEL.g4" // TODO: l.EOF = antlr.TokenEOF diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_listener.go b/vendor/github.com/google/cel-go/parser/gen/cel_listener.go index e555ae627..1b631b6e1 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_listener.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_listener.go @@ -1,4 +1,4 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/bin/../parser/gen/CEL.g4 by ANTLR 4.9.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. package gen // CEL import "github.com/antlr/antlr4/runtime/Go/antlr" diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_parser.go b/vendor/github.com/google/cel-go/parser/gen/cel_parser.go index c5e18930e..afb3fe0d1 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_parser.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_parser.go @@ -1,161 +1,181 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/bin/../parser/gen/CEL.g4 by ANTLR 4.9.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. package gen // CEL import ( "fmt" - "reflect" "strconv" + "sync" "github.com/antlr/antlr4/runtime/Go/antlr" ) // Suppress unused import errors var _ = fmt.Printf -var _ = reflect.Copy var _ = strconv.Itoa - -var parserATN = []uint16{ - 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 38, 211, - 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, - 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, - 9, 13, 4, 14, 9, 14, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 5, 3, 38, 10, 3, 3, 4, 3, 4, 3, 4, 7, 4, 43, 10, 4, 12, 4, 14, 4, 46, - 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 51, 10, 5, 12, 5, 14, 5, 54, 11, 5, 3, 6, - 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 62, 10, 6, 12, 6, 14, 6, 65, 11, 6, - 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 76, 10, 7, - 12, 7, 14, 7, 79, 11, 7, 3, 8, 3, 8, 6, 8, 83, 10, 8, 13, 8, 14, 8, 84, - 3, 8, 3, 8, 6, 8, 89, 10, 8, 13, 8, 14, 8, 90, 3, 8, 5, 8, 94, 10, 8, 3, - 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 104, 10, 9, 3, 9, 5, - 9, 107, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 117, - 10, 9, 3, 9, 5, 9, 120, 10, 9, 3, 9, 7, 9, 123, 10, 9, 12, 9, 14, 9, 126, - 11, 9, 3, 10, 5, 10, 129, 10, 10, 3, 10, 3, 10, 3, 10, 5, 10, 134, 10, - 10, 3, 10, 5, 10, 137, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, - 5, 10, 145, 10, 10, 3, 10, 5, 10, 148, 10, 10, 3, 10, 3, 10, 3, 10, 5, - 10, 153, 10, 10, 3, 10, 5, 10, 156, 10, 10, 3, 10, 3, 10, 5, 10, 160, 10, - 10, 3, 11, 3, 11, 3, 11, 7, 11, 165, 10, 11, 12, 11, 14, 11, 168, 11, 11, - 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 177, 10, 12, 12, - 12, 14, 12, 180, 11, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, - 3, 13, 7, 13, 190, 10, 13, 12, 13, 14, 13, 193, 11, 13, 3, 14, 5, 14, 196, - 10, 14, 3, 14, 3, 14, 3, 14, 5, 14, 201, 10, 14, 3, 14, 3, 14, 3, 14, 3, - 14, 3, 14, 3, 14, 5, 14, 209, 10, 14, 3, 14, 2, 5, 10, 12, 16, 15, 2, 4, - 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 2, 5, 3, 2, 3, 9, 3, 2, 25, 27, - 4, 2, 20, 20, 24, 24, 2, 237, 2, 28, 3, 2, 2, 2, 4, 31, 3, 2, 2, 2, 6, - 39, 3, 2, 2, 2, 8, 47, 3, 2, 2, 2, 10, 55, 3, 2, 2, 2, 12, 66, 3, 2, 2, - 2, 14, 93, 3, 2, 2, 2, 16, 95, 3, 2, 2, 2, 18, 159, 3, 2, 2, 2, 20, 161, - 3, 2, 2, 2, 22, 169, 3, 2, 2, 2, 24, 181, 3, 2, 2, 2, 26, 208, 3, 2, 2, - 2, 28, 29, 5, 4, 3, 2, 29, 30, 7, 2, 2, 3, 30, 3, 3, 2, 2, 2, 31, 37, 5, - 6, 4, 2, 32, 33, 7, 22, 2, 2, 33, 34, 5, 6, 4, 2, 34, 35, 7, 23, 2, 2, - 35, 36, 5, 4, 3, 2, 36, 38, 3, 2, 2, 2, 37, 32, 3, 2, 2, 2, 37, 38, 3, - 2, 2, 2, 38, 5, 3, 2, 2, 2, 39, 44, 5, 8, 5, 2, 40, 41, 7, 11, 2, 2, 41, - 43, 5, 8, 5, 2, 42, 40, 3, 2, 2, 2, 43, 46, 3, 2, 2, 2, 44, 42, 3, 2, 2, - 2, 44, 45, 3, 2, 2, 2, 45, 7, 3, 2, 2, 2, 46, 44, 3, 2, 2, 2, 47, 52, 5, - 10, 6, 2, 48, 49, 7, 10, 2, 2, 49, 51, 5, 10, 6, 2, 50, 48, 3, 2, 2, 2, - 51, 54, 3, 2, 2, 2, 52, 50, 3, 2, 2, 2, 52, 53, 3, 2, 2, 2, 53, 9, 3, 2, - 2, 2, 54, 52, 3, 2, 2, 2, 55, 56, 8, 6, 1, 2, 56, 57, 5, 12, 7, 2, 57, - 63, 3, 2, 2, 2, 58, 59, 12, 3, 2, 2, 59, 60, 9, 2, 2, 2, 60, 62, 5, 10, - 6, 4, 61, 58, 3, 2, 2, 2, 62, 65, 3, 2, 2, 2, 63, 61, 3, 2, 2, 2, 63, 64, - 3, 2, 2, 2, 64, 11, 3, 2, 2, 2, 65, 63, 3, 2, 2, 2, 66, 67, 8, 7, 1, 2, - 67, 68, 5, 14, 8, 2, 68, 77, 3, 2, 2, 2, 69, 70, 12, 4, 2, 2, 70, 71, 9, - 3, 2, 2, 71, 76, 5, 12, 7, 5, 72, 73, 12, 3, 2, 2, 73, 74, 9, 4, 2, 2, - 74, 76, 5, 12, 7, 4, 75, 69, 3, 2, 2, 2, 75, 72, 3, 2, 2, 2, 76, 79, 3, - 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 13, 3, 2, 2, 2, 79, - 77, 3, 2, 2, 2, 80, 94, 5, 16, 9, 2, 81, 83, 7, 21, 2, 2, 82, 81, 3, 2, - 2, 2, 83, 84, 3, 2, 2, 2, 84, 82, 3, 2, 2, 2, 84, 85, 3, 2, 2, 2, 85, 86, - 3, 2, 2, 2, 86, 94, 5, 16, 9, 2, 87, 89, 7, 20, 2, 2, 88, 87, 3, 2, 2, - 2, 89, 90, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, - 3, 2, 2, 2, 92, 94, 5, 16, 9, 2, 93, 80, 3, 2, 2, 2, 93, 82, 3, 2, 2, 2, - 93, 88, 3, 2, 2, 2, 94, 15, 3, 2, 2, 2, 95, 96, 8, 9, 1, 2, 96, 97, 5, - 18, 10, 2, 97, 124, 3, 2, 2, 2, 98, 99, 12, 5, 2, 2, 99, 100, 7, 18, 2, - 2, 100, 106, 7, 38, 2, 2, 101, 103, 7, 16, 2, 2, 102, 104, 5, 20, 11, 2, - 103, 102, 3, 2, 2, 2, 103, 104, 3, 2, 2, 2, 104, 105, 3, 2, 2, 2, 105, - 107, 7, 17, 2, 2, 106, 101, 3, 2, 2, 2, 106, 107, 3, 2, 2, 2, 107, 123, - 3, 2, 2, 2, 108, 109, 12, 4, 2, 2, 109, 110, 7, 12, 2, 2, 110, 111, 5, - 4, 3, 2, 111, 112, 7, 13, 2, 2, 112, 123, 3, 2, 2, 2, 113, 114, 12, 3, - 2, 2, 114, 116, 7, 14, 2, 2, 115, 117, 5, 22, 12, 2, 116, 115, 3, 2, 2, - 2, 116, 117, 3, 2, 2, 2, 117, 119, 3, 2, 2, 2, 118, 120, 7, 19, 2, 2, 119, - 118, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 121, 3, 2, 2, 2, 121, 123, - 7, 15, 2, 2, 122, 98, 3, 2, 2, 2, 122, 108, 3, 2, 2, 2, 122, 113, 3, 2, - 2, 2, 123, 126, 3, 2, 2, 2, 124, 122, 3, 2, 2, 2, 124, 125, 3, 2, 2, 2, - 125, 17, 3, 2, 2, 2, 126, 124, 3, 2, 2, 2, 127, 129, 7, 18, 2, 2, 128, - 127, 3, 2, 2, 2, 128, 129, 3, 2, 2, 2, 129, 130, 3, 2, 2, 2, 130, 136, - 7, 38, 2, 2, 131, 133, 7, 16, 2, 2, 132, 134, 5, 20, 11, 2, 133, 132, 3, - 2, 2, 2, 133, 134, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 135, 137, 7, 17, 2, - 2, 136, 131, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 160, 3, 2, 2, 2, 138, - 139, 7, 16, 2, 2, 139, 140, 5, 4, 3, 2, 140, 141, 7, 17, 2, 2, 141, 160, - 3, 2, 2, 2, 142, 144, 7, 12, 2, 2, 143, 145, 5, 20, 11, 2, 144, 143, 3, - 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 147, 3, 2, 2, 2, 146, 148, 7, 19, 2, - 2, 147, 146, 3, 2, 2, 2, 147, 148, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, - 160, 7, 13, 2, 2, 150, 152, 7, 14, 2, 2, 151, 153, 5, 24, 13, 2, 152, 151, - 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 155, 3, 2, 2, 2, 154, 156, 7, 19, - 2, 2, 155, 154, 3, 2, 2, 2, 155, 156, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, - 157, 160, 7, 15, 2, 2, 158, 160, 5, 26, 14, 2, 159, 128, 3, 2, 2, 2, 159, - 138, 3, 2, 2, 2, 159, 142, 3, 2, 2, 2, 159, 150, 3, 2, 2, 2, 159, 158, - 3, 2, 2, 2, 160, 19, 3, 2, 2, 2, 161, 166, 5, 4, 3, 2, 162, 163, 7, 19, - 2, 2, 163, 165, 5, 4, 3, 2, 164, 162, 3, 2, 2, 2, 165, 168, 3, 2, 2, 2, - 166, 164, 3, 2, 2, 2, 166, 167, 3, 2, 2, 2, 167, 21, 3, 2, 2, 2, 168, 166, - 3, 2, 2, 2, 169, 170, 7, 38, 2, 2, 170, 171, 7, 23, 2, 2, 171, 178, 5, - 4, 3, 2, 172, 173, 7, 19, 2, 2, 173, 174, 7, 38, 2, 2, 174, 175, 7, 23, - 2, 2, 175, 177, 5, 4, 3, 2, 176, 172, 3, 2, 2, 2, 177, 180, 3, 2, 2, 2, - 178, 176, 3, 2, 2, 2, 178, 179, 3, 2, 2, 2, 179, 23, 3, 2, 2, 2, 180, 178, - 3, 2, 2, 2, 181, 182, 5, 4, 3, 2, 182, 183, 7, 23, 2, 2, 183, 191, 5, 4, - 3, 2, 184, 185, 7, 19, 2, 2, 185, 186, 5, 4, 3, 2, 186, 187, 7, 23, 2, - 2, 187, 188, 5, 4, 3, 2, 188, 190, 3, 2, 2, 2, 189, 184, 3, 2, 2, 2, 190, - 193, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 25, 3, - 2, 2, 2, 193, 191, 3, 2, 2, 2, 194, 196, 7, 20, 2, 2, 195, 194, 3, 2, 2, - 2, 195, 196, 3, 2, 2, 2, 196, 197, 3, 2, 2, 2, 197, 209, 7, 34, 2, 2, 198, - 209, 7, 35, 2, 2, 199, 201, 7, 20, 2, 2, 200, 199, 3, 2, 2, 2, 200, 201, - 3, 2, 2, 2, 201, 202, 3, 2, 2, 2, 202, 209, 7, 33, 2, 2, 203, 209, 7, 36, - 2, 2, 204, 209, 7, 37, 2, 2, 205, 209, 7, 28, 2, 2, 206, 209, 7, 29, 2, - 2, 207, 209, 7, 30, 2, 2, 208, 195, 3, 2, 2, 2, 208, 198, 3, 2, 2, 2, 208, - 200, 3, 2, 2, 2, 208, 203, 3, 2, 2, 2, 208, 204, 3, 2, 2, 2, 208, 205, - 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 208, 207, 3, 2, 2, 2, 209, 27, 3, 2, - 2, 2, 31, 37, 44, 52, 63, 75, 77, 84, 90, 93, 103, 106, 116, 119, 122, - 124, 128, 133, 136, 144, 147, 152, 155, 159, 166, 178, 191, 195, 200, 208, -} -var literalNames = []string{ - "", "'=='", "'!='", "'in'", "'<'", "'<='", "'>='", "'>'", "'&&'", "'||'", - "'['", "']'", "'{'", "'}'", "'('", "')'", "'.'", "','", "'-'", "'!'", "'?'", - "':'", "'+'", "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", -} -var symbolicNames = []string{ - "", "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", - "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", - "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", - "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", "NUL", - "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", - "BYTES", "IDENTIFIER", -} - -var ruleNames = []string{ - "start", "expr", "conditionalOr", "conditionalAnd", "relation", "calc", - "unary", "member", "primary", "exprList", "fieldInitializerList", "mapInitializerList", - "literal", -} +var _ = sync.Once{} type CELParser struct { *antlr.BaseParser } +var celParserStaticData struct { + once sync.Once + serializedATN []int32 + literalNames []string + symbolicNames []string + ruleNames []string + predictionContextCache *antlr.PredictionContextCache + atn *antlr.ATN + decisionToDFA []*antlr.DFA +} + +func celParserInit() { + staticData := &celParserStaticData + staticData.literalNames = []string{ + "", "'=='", "'!='", "'in'", "'<'", "'<='", "'>='", "'>'", "'&&'", "'||'", + "'['", "']'", "'{'", "'}'", "'('", "')'", "'.'", "','", "'-'", "'!'", + "'?'", "':'", "'+'", "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", + } + staticData.symbolicNames = []string{ + "", "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", + "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", + "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", + "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", + "NUL", "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", + "STRING", "BYTES", "IDENTIFIER", + } + staticData.ruleNames = []string{ + "start", "expr", "conditionalOr", "conditionalAnd", "relation", "calc", + "unary", "member", "primary", "exprList", "fieldInitializerList", "mapInitializerList", + "literal", + } + staticData.predictionContextCache = antlr.NewPredictionContextCache() + staticData.serializedATN = []int32{ + 4, 1, 36, 209, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, + 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, + 10, 2, 11, 7, 11, 2, 12, 7, 12, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 36, 8, 1, 1, 2, 1, 2, 1, 2, 5, 2, 41, 8, 2, 10, 2, + 12, 2, 44, 9, 2, 1, 3, 1, 3, 1, 3, 5, 3, 49, 8, 3, 10, 3, 12, 3, 52, 9, + 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 60, 8, 4, 10, 4, 12, 4, 63, + 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 74, 8, + 5, 10, 5, 12, 5, 77, 9, 5, 1, 6, 1, 6, 4, 6, 81, 8, 6, 11, 6, 12, 6, 82, + 1, 6, 1, 6, 4, 6, 87, 8, 6, 11, 6, 12, 6, 88, 1, 6, 3, 6, 92, 8, 6, 1, + 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 102, 8, 7, 1, 7, 3, + 7, 105, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 115, + 8, 7, 1, 7, 3, 7, 118, 8, 7, 1, 7, 5, 7, 121, 8, 7, 10, 7, 12, 7, 124, + 9, 7, 1, 8, 3, 8, 127, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 132, 8, 8, 1, 8, 3, + 8, 135, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 143, 8, 8, 1, 8, + 3, 8, 146, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 151, 8, 8, 1, 8, 3, 8, 154, 8, + 8, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 163, 8, 9, 10, + 9, 12, 9, 166, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, + 10, 175, 8, 10, 10, 10, 12, 10, 178, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, + 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 188, 8, 11, 10, 11, 12, 11, 191, 9, + 11, 1, 12, 3, 12, 194, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 199, 8, 12, 1, + 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 207, 8, 12, 1, 12, 0, 3, + 8, 10, 14, 13, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 0, 3, 1, + 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, 235, 0, 26, 1, 0, 0, 0, 2, + 29, 1, 0, 0, 0, 4, 37, 1, 0, 0, 0, 6, 45, 1, 0, 0, 0, 8, 53, 1, 0, 0, 0, + 10, 64, 1, 0, 0, 0, 12, 91, 1, 0, 0, 0, 14, 93, 1, 0, 0, 0, 16, 157, 1, + 0, 0, 0, 18, 159, 1, 0, 0, 0, 20, 167, 1, 0, 0, 0, 22, 179, 1, 0, 0, 0, + 24, 206, 1, 0, 0, 0, 26, 27, 3, 2, 1, 0, 27, 28, 5, 0, 0, 1, 28, 1, 1, + 0, 0, 0, 29, 35, 3, 4, 2, 0, 30, 31, 5, 20, 0, 0, 31, 32, 3, 4, 2, 0, 32, + 33, 5, 21, 0, 0, 33, 34, 3, 2, 1, 0, 34, 36, 1, 0, 0, 0, 35, 30, 1, 0, + 0, 0, 35, 36, 1, 0, 0, 0, 36, 3, 1, 0, 0, 0, 37, 42, 3, 6, 3, 0, 38, 39, + 5, 9, 0, 0, 39, 41, 3, 6, 3, 0, 40, 38, 1, 0, 0, 0, 41, 44, 1, 0, 0, 0, + 42, 40, 1, 0, 0, 0, 42, 43, 1, 0, 0, 0, 43, 5, 1, 0, 0, 0, 44, 42, 1, 0, + 0, 0, 45, 50, 3, 8, 4, 0, 46, 47, 5, 8, 0, 0, 47, 49, 3, 8, 4, 0, 48, 46, + 1, 0, 0, 0, 49, 52, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, + 51, 7, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 53, 54, 6, 4, -1, 0, 54, 55, 3, + 10, 5, 0, 55, 61, 1, 0, 0, 0, 56, 57, 10, 1, 0, 0, 57, 58, 7, 0, 0, 0, + 58, 60, 3, 8, 4, 2, 59, 56, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 59, 1, + 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 9, 1, 0, 0, 0, 63, 61, 1, 0, 0, 0, 64, + 65, 6, 5, -1, 0, 65, 66, 3, 12, 6, 0, 66, 75, 1, 0, 0, 0, 67, 68, 10, 2, + 0, 0, 68, 69, 7, 1, 0, 0, 69, 74, 3, 10, 5, 3, 70, 71, 10, 1, 0, 0, 71, + 72, 7, 2, 0, 0, 72, 74, 3, 10, 5, 2, 73, 67, 1, 0, 0, 0, 73, 70, 1, 0, + 0, 0, 74, 77, 1, 0, 0, 0, 75, 73, 1, 0, 0, 0, 75, 76, 1, 0, 0, 0, 76, 11, + 1, 0, 0, 0, 77, 75, 1, 0, 0, 0, 78, 92, 3, 14, 7, 0, 79, 81, 5, 19, 0, + 0, 80, 79, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 83, + 1, 0, 0, 0, 83, 84, 1, 0, 0, 0, 84, 92, 3, 14, 7, 0, 85, 87, 5, 18, 0, + 0, 86, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 86, 1, 0, 0, 0, 88, 89, + 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 92, 3, 14, 7, 0, 91, 78, 1, 0, 0, 0, + 91, 80, 1, 0, 0, 0, 91, 86, 1, 0, 0, 0, 92, 13, 1, 0, 0, 0, 93, 94, 6, + 7, -1, 0, 94, 95, 3, 16, 8, 0, 95, 122, 1, 0, 0, 0, 96, 97, 10, 3, 0, 0, + 97, 98, 5, 16, 0, 0, 98, 104, 5, 36, 0, 0, 99, 101, 5, 14, 0, 0, 100, 102, + 3, 18, 9, 0, 101, 100, 1, 0, 0, 0, 101, 102, 1, 0, 0, 0, 102, 103, 1, 0, + 0, 0, 103, 105, 5, 15, 0, 0, 104, 99, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, + 105, 121, 1, 0, 0, 0, 106, 107, 10, 2, 0, 0, 107, 108, 5, 10, 0, 0, 108, + 109, 3, 2, 1, 0, 109, 110, 5, 11, 0, 0, 110, 121, 1, 0, 0, 0, 111, 112, + 10, 1, 0, 0, 112, 114, 5, 12, 0, 0, 113, 115, 3, 20, 10, 0, 114, 113, 1, + 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 117, 1, 0, 0, 0, 116, 118, 5, 17, 0, + 0, 117, 116, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 119, 1, 0, 0, 0, 119, + 121, 5, 13, 0, 0, 120, 96, 1, 0, 0, 0, 120, 106, 1, 0, 0, 0, 120, 111, + 1, 0, 0, 0, 121, 124, 1, 0, 0, 0, 122, 120, 1, 0, 0, 0, 122, 123, 1, 0, + 0, 0, 123, 15, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 125, 127, 5, 16, 0, 0, + 126, 125, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, + 134, 5, 36, 0, 0, 129, 131, 5, 14, 0, 0, 130, 132, 3, 18, 9, 0, 131, 130, + 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 135, 5, 15, + 0, 0, 134, 129, 1, 0, 0, 0, 134, 135, 1, 0, 0, 0, 135, 158, 1, 0, 0, 0, + 136, 137, 5, 14, 0, 0, 137, 138, 3, 2, 1, 0, 138, 139, 5, 15, 0, 0, 139, + 158, 1, 0, 0, 0, 140, 142, 5, 10, 0, 0, 141, 143, 3, 18, 9, 0, 142, 141, + 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 145, 1, 0, 0, 0, 144, 146, 5, 17, + 0, 0, 145, 144, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, + 147, 158, 5, 11, 0, 0, 148, 150, 5, 12, 0, 0, 149, 151, 3, 22, 11, 0, 150, + 149, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, + 5, 17, 0, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 155, 1, 0, + 0, 0, 155, 158, 5, 13, 0, 0, 156, 158, 3, 24, 12, 0, 157, 126, 1, 0, 0, + 0, 157, 136, 1, 0, 0, 0, 157, 140, 1, 0, 0, 0, 157, 148, 1, 0, 0, 0, 157, + 156, 1, 0, 0, 0, 158, 17, 1, 0, 0, 0, 159, 164, 3, 2, 1, 0, 160, 161, 5, + 17, 0, 0, 161, 163, 3, 2, 1, 0, 162, 160, 1, 0, 0, 0, 163, 166, 1, 0, 0, + 0, 164, 162, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 19, 1, 0, 0, 0, 166, + 164, 1, 0, 0, 0, 167, 168, 5, 36, 0, 0, 168, 169, 5, 21, 0, 0, 169, 176, + 3, 2, 1, 0, 170, 171, 5, 17, 0, 0, 171, 172, 5, 36, 0, 0, 172, 173, 5, + 21, 0, 0, 173, 175, 3, 2, 1, 0, 174, 170, 1, 0, 0, 0, 175, 178, 1, 0, 0, + 0, 176, 174, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 21, 1, 0, 0, 0, 178, + 176, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 21, 0, 0, 181, 189, + 3, 2, 1, 0, 182, 183, 5, 17, 0, 0, 183, 184, 3, 2, 1, 0, 184, 185, 5, 21, + 0, 0, 185, 186, 3, 2, 1, 0, 186, 188, 1, 0, 0, 0, 187, 182, 1, 0, 0, 0, + 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, + 23, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 194, 5, 18, 0, 0, 193, 192, + 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 207, 5, 32, + 0, 0, 196, 207, 5, 33, 0, 0, 197, 199, 5, 18, 0, 0, 198, 197, 1, 0, 0, + 0, 198, 199, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 207, 5, 31, 0, 0, 201, + 207, 5, 34, 0, 0, 202, 207, 5, 35, 0, 0, 203, 207, 5, 26, 0, 0, 204, 207, + 5, 27, 0, 0, 205, 207, 5, 28, 0, 0, 206, 193, 1, 0, 0, 0, 206, 196, 1, + 0, 0, 0, 206, 198, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, + 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, + 25, 1, 0, 0, 0, 29, 35, 42, 50, 61, 73, 75, 82, 88, 91, 101, 104, 114, + 117, 120, 122, 126, 131, 134, 142, 145, 150, 153, 157, 164, 176, 189, 193, + 198, 206, + } + deserializer := antlr.NewATNDeserializer(nil) + staticData.atn = deserializer.Deserialize(staticData.serializedATN) + atn := staticData.atn + staticData.decisionToDFA = make([]*antlr.DFA, len(atn.DecisionToState)) + decisionToDFA := staticData.decisionToDFA + for index, state := range atn.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(state, index) + } +} + +// CELParserInit initializes any static state used to implement CELParser. By default the +// static state used to implement the parser is lazily initialized during the first call to +// NewCELParser(). You can call this function if you wish to initialize the static state ahead +// of time. +func CELParserInit() { + staticData := &celParserStaticData + staticData.once.Do(celParserInit) +} + // NewCELParser produces a new parser instance for the optional input antlr.TokenStream. -// -// The *CELParser instance produced may be reused by calling the SetInputStream method. -// The initial parser configuration is expensive to construct, and the object is not thread-safe; -// however, if used within a Golang sync.Pool, the construction cost amortizes well and the -// objects can be used in a thread-safe manner. func NewCELParser(input antlr.TokenStream) *CELParser { + CELParserInit() this := new(CELParser) - deserializer := antlr.NewATNDeserializer(nil) - deserializedATN := deserializer.DeserializeFromUInt16(parserATN) - decisionToDFA := make([]*antlr.DFA, len(deserializedATN.DecisionToState)) - for index, ds := range deserializedATN.DecisionToState { - decisionToDFA[index] = antlr.NewDFA(ds, index) - } this.BaseParser = antlr.NewBaseParser(input) - - this.Interpreter = antlr.NewParserATNSimulator(this, deserializedATN, decisionToDFA, antlr.NewPredictionContextCache()) - this.RuleNames = ruleNames - this.LiteralNames = literalNames - this.SymbolicNames = symbolicNames + staticData := &celParserStaticData + this.Interpreter = antlr.NewParserATNSimulator(this, staticData.atn, staticData.decisionToDFA, staticData.predictionContextCache) + this.RuleNames = staticData.ruleNames + this.LiteralNames = staticData.literalNames + this.SymbolicNames = staticData.symbolicNames this.GrammarFileName = "CEL.g4" return this @@ -273,7 +293,13 @@ func (s *StartContext) EOF() antlr.TerminalNode { } func (s *StartContext) Expr() IExprContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -313,6 +339,9 @@ func (s *StartContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } func (p *CELParser) Start() (localctx IStartContext) { + this := p + _ = this + localctx = NewStartContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 0, CELParserRULE_start) @@ -431,12 +460,20 @@ func (s *ExprContext) SetE1(v IConditionalOrContext) { s.e1 = v } func (s *ExprContext) SetE2(v IExprContext) { s.e2 = v } func (s *ExprContext) AllConditionalOr() []IConditionalOrContext { - var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IConditionalOrContext)(nil)).Elem()) - var tst = make([]IConditionalOrContext, len(ts)) + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IConditionalOrContext); ok { + len++ + } + } - for i, t := range ts { - if t != nil { + tst := make([]IConditionalOrContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IConditionalOrContext); ok { tst[i] = t.(IConditionalOrContext) + i++ } } @@ -444,7 +481,17 @@ func (s *ExprContext) AllConditionalOr() []IConditionalOrContext { } func (s *ExprContext) ConditionalOr(i int) IConditionalOrContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IConditionalOrContext)(nil)).Elem(), i) + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IConditionalOrContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } if t == nil { return nil @@ -462,7 +509,13 @@ func (s *ExprContext) QUESTIONMARK() antlr.TerminalNode { } func (s *ExprContext) Expr() IExprContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -502,6 +555,9 @@ func (s *ExprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } func (p *CELParser) Expr() (localctx IExprContext) { + this := p + _ = this + localctx = NewExprContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 2, CELParserRULE_expr) var _la int @@ -660,12 +716,20 @@ func (s *ConditionalOrContext) GetE1() []IConditionalAndContext { return s.e1 } func (s *ConditionalOrContext) SetE1(v []IConditionalAndContext) { s.e1 = v } func (s *ConditionalOrContext) AllConditionalAnd() []IConditionalAndContext { - var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IConditionalAndContext)(nil)).Elem()) - var tst = make([]IConditionalAndContext, len(ts)) + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IConditionalAndContext); ok { + len++ + } + } - for i, t := range ts { - if t != nil { + tst := make([]IConditionalAndContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IConditionalAndContext); ok { tst[i] = t.(IConditionalAndContext) + i++ } } @@ -673,7 +737,17 @@ func (s *ConditionalOrContext) AllConditionalAnd() []IConditionalAndContext { } func (s *ConditionalOrContext) ConditionalAnd(i int) IConditionalAndContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IConditionalAndContext)(nil)).Elem(), i) + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IConditionalAndContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } if t == nil { return nil @@ -721,6 +795,9 @@ func (s *ConditionalOrContext) Accept(visitor antlr.ParseTreeVisitor) interface{ } func (p *CELParser) ConditionalOr() (localctx IConditionalOrContext) { + this := p + _ = this + localctx = NewConditionalOrContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 4, CELParserRULE_conditionalOr) var _la int @@ -873,12 +950,20 @@ func (s *ConditionalAndContext) GetE1() []IRelationContext { return s.e1 } func (s *ConditionalAndContext) SetE1(v []IRelationContext) { s.e1 = v } func (s *ConditionalAndContext) AllRelation() []IRelationContext { - var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IRelationContext)(nil)).Elem()) - var tst = make([]IRelationContext, len(ts)) + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IRelationContext); ok { + len++ + } + } - for i, t := range ts { - if t != nil { + tst := make([]IRelationContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IRelationContext); ok { tst[i] = t.(IRelationContext) + i++ } } @@ -886,7 +971,17 @@ func (s *ConditionalAndContext) AllRelation() []IRelationContext { } func (s *ConditionalAndContext) Relation(i int) IRelationContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IRelationContext)(nil)).Elem(), i) + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IRelationContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } if t == nil { return nil @@ -934,6 +1029,9 @@ func (s *ConditionalAndContext) Accept(visitor antlr.ParseTreeVisitor) interface } func (p *CELParser) ConditionalAnd() (localctx IConditionalAndContext) { + this := p + _ = this + localctx = NewConditionalAndContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 6, CELParserRULE_conditionalAnd) var _la int @@ -1042,7 +1140,13 @@ func (s *RelationContext) GetOp() antlr.Token { return s.op } func (s *RelationContext) SetOp(v antlr.Token) { s.op = v } func (s *RelationContext) Calc() ICalcContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*ICalcContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICalcContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -1052,12 +1156,20 @@ func (s *RelationContext) Calc() ICalcContext { } func (s *RelationContext) AllRelation() []IRelationContext { - var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IRelationContext)(nil)).Elem()) - var tst = make([]IRelationContext, len(ts)) + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IRelationContext); ok { + len++ + } + } - for i, t := range ts { - if t != nil { + tst := make([]IRelationContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IRelationContext); ok { tst[i] = t.(IRelationContext) + i++ } } @@ -1065,7 +1177,17 @@ func (s *RelationContext) AllRelation() []IRelationContext { } func (s *RelationContext) Relation(i int) IRelationContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IRelationContext)(nil)).Elem(), i) + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IRelationContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } if t == nil { return nil @@ -1137,6 +1259,9 @@ func (p *CELParser) Relation() (localctx IRelationContext) { } func (p *CELParser) relation(_p int) (localctx IRelationContext) { + this := p + _ = this + var _parentctx antlr.ParserRuleContext = p.GetParserRuleContext() _parentState := p.GetState() localctx = NewRelationContext(p, p.GetParserRuleContext(), _parentState) @@ -1270,7 +1395,13 @@ func (s *CalcContext) GetOp() antlr.Token { return s.op } func (s *CalcContext) SetOp(v antlr.Token) { s.op = v } func (s *CalcContext) Unary() IUnaryContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IUnaryContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IUnaryContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -1280,12 +1411,20 @@ func (s *CalcContext) Unary() IUnaryContext { } func (s *CalcContext) AllCalc() []ICalcContext { - var ts = s.GetTypedRuleContexts(reflect.TypeOf((*ICalcContext)(nil)).Elem()) - var tst = make([]ICalcContext, len(ts)) + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(ICalcContext); ok { + len++ + } + } - for i, t := range ts { - if t != nil { + tst := make([]ICalcContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(ICalcContext); ok { tst[i] = t.(ICalcContext) + i++ } } @@ -1293,7 +1432,17 @@ func (s *CalcContext) AllCalc() []ICalcContext { } func (s *CalcContext) Calc(i int) ICalcContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*ICalcContext)(nil)).Elem(), i) + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ICalcContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } if t == nil { return nil @@ -1357,6 +1506,9 @@ func (p *CELParser) Calc() (localctx ICalcContext) { } func (p *CELParser) calc(_p int) (localctx ICalcContext) { + this := p + _ = this + var _parentctx antlr.ParserRuleContext = p.GetParserRuleContext() _parentState := p.GetState() localctx = NewCalcContext(p, p.GetParserRuleContext(), _parentState) @@ -1556,7 +1708,13 @@ func (s *LogicalNotContext) GetRuleContext() antlr.RuleContext { } func (s *LogicalNotContext) Member() IMemberContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IMemberContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IMemberContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -1614,7 +1772,13 @@ func (s *MemberExprContext) GetRuleContext() antlr.RuleContext { } func (s *MemberExprContext) Member() IMemberContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IMemberContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IMemberContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -1674,7 +1838,13 @@ func (s *NegateContext) GetRuleContext() antlr.RuleContext { } func (s *NegateContext) Member() IMemberContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IMemberContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IMemberContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -1714,6 +1884,9 @@ func (s *NegateContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } func (p *CELParser) Unary() (localctx IUnaryContext) { + this := p + _ = this + localctx = NewUnaryContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 12, CELParserRULE_unary) var _la int @@ -1898,7 +2071,13 @@ func (s *SelectOrCallContext) GetRuleContext() antlr.RuleContext { } func (s *SelectOrCallContext) Member() IMemberContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IMemberContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IMemberContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -1924,7 +2103,13 @@ func (s *SelectOrCallContext) LPAREN() antlr.TerminalNode { } func (s *SelectOrCallContext) ExprList() IExprListContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprListContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprListContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -1974,7 +2159,13 @@ func (s *PrimaryExprContext) GetRuleContext() antlr.RuleContext { } func (s *PrimaryExprContext) Primary() IPrimaryContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IPrimaryContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IPrimaryContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2034,7 +2225,13 @@ func (s *IndexContext) GetRuleContext() antlr.RuleContext { } func (s *IndexContext) Member() IMemberContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IMemberContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IMemberContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2052,7 +2249,13 @@ func (s *IndexContext) LBRACKET() antlr.TerminalNode { } func (s *IndexContext) Expr() IExprContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2112,7 +2315,13 @@ func (s *CreateMessageContext) GetRuleContext() antlr.RuleContext { } func (s *CreateMessageContext) Member() IMemberContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IMemberContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IMemberContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2134,7 +2343,13 @@ func (s *CreateMessageContext) COMMA() antlr.TerminalNode { } func (s *CreateMessageContext) FieldInitializerList() IFieldInitializerListContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IFieldInitializerListContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IFieldInitializerListContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2170,6 +2385,9 @@ func (p *CELParser) Member() (localctx IMemberContext) { } func (p *CELParser) member(_p int) (localctx IMemberContext) { + this := p + _ = this + var _parentctx antlr.ParserRuleContext = p.GetParserRuleContext() _parentState := p.GetState() localctx = NewMemberContext(p, p.GetParserRuleContext(), _parentState) @@ -2449,7 +2667,13 @@ func (s *CreateListContext) COMMA() antlr.TerminalNode { } func (s *CreateListContext) ExprList() IExprListContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprListContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprListContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2521,7 +2745,13 @@ func (s *CreateStructContext) COMMA() antlr.TerminalNode { } func (s *CreateStructContext) MapInitializerList() IMapInitializerListContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IMapInitializerListContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IMapInitializerListContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2571,7 +2801,13 @@ func (s *ConstantLiteralContext) GetRuleContext() antlr.RuleContext { } func (s *ConstantLiteralContext) Literal() ILiteralContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*ILiteralContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ILiteralContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2634,7 +2870,13 @@ func (s *NestedContext) RPAREN() antlr.TerminalNode { } func (s *NestedContext) Expr() IExprContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2720,7 +2962,13 @@ func (s *IdentOrGlobalCallContext) LPAREN() antlr.TerminalNode { } func (s *IdentOrGlobalCallContext) ExprList() IExprListContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprListContext)(nil)).Elem(), 0) + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprListContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } if t == nil { return nil @@ -2752,6 +3000,9 @@ func (s *IdentOrGlobalCallContext) Accept(visitor antlr.ParseTreeVisitor) interf } func (p *CELParser) Primary() (localctx IPrimaryContext) { + this := p + _ = this + localctx = NewPrimaryContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 16, CELParserRULE_primary) var _la int @@ -3007,12 +3258,20 @@ func (s *ExprListContext) GetE() []IExprContext { return s.e } func (s *ExprListContext) SetE(v []IExprContext) { s.e = v } func (s *ExprListContext) AllExpr() []IExprContext { - var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IExprContext)(nil)).Elem()) - var tst = make([]IExprContext, len(ts)) + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } - for i, t := range ts { - if t != nil { + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { tst[i] = t.(IExprContext) + i++ } } @@ -3020,7 +3279,17 @@ func (s *ExprListContext) AllExpr() []IExprContext { } func (s *ExprListContext) Expr(i int) IExprContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprContext)(nil)).Elem(), i) + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } if t == nil { return nil @@ -3068,6 +3337,9 @@ func (s *ExprListContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } func (p *CELParser) ExprList() (localctx IExprListContext) { + this := p + _ = this + localctx = NewExprListContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 18, CELParserRULE_exprList) @@ -3247,12 +3519,20 @@ func (s *FieldInitializerListContext) COLON(i int) antlr.TerminalNode { } func (s *FieldInitializerListContext) AllExpr() []IExprContext { - var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IExprContext)(nil)).Elem()) - var tst = make([]IExprContext, len(ts)) + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } - for i, t := range ts { - if t != nil { + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { tst[i] = t.(IExprContext) + i++ } } @@ -3260,7 +3540,17 @@ func (s *FieldInitializerListContext) AllExpr() []IExprContext { } func (s *FieldInitializerListContext) Expr(i int) IExprContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprContext)(nil)).Elem(), i) + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } if t == nil { return nil @@ -3308,6 +3598,9 @@ func (s *FieldInitializerListContext) Accept(visitor antlr.ParseTreeVisitor) int } func (p *CELParser) FieldInitializerList() (localctx IFieldInitializerListContext) { + this := p + _ = this + localctx = NewFieldInitializerListContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 20, CELParserRULE_fieldInitializerList) @@ -3492,12 +3785,20 @@ func (s *MapInitializerListContext) SetKeys(v []IExprContext) { s.keys = v } func (s *MapInitializerListContext) SetValues(v []IExprContext) { s.values = v } func (s *MapInitializerListContext) AllExpr() []IExprContext { - var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IExprContext)(nil)).Elem()) - var tst = make([]IExprContext, len(ts)) + children := s.GetChildren() + len := 0 + for _, ctx := range children { + if _, ok := ctx.(IExprContext); ok { + len++ + } + } - for i, t := range ts { - if t != nil { + tst := make([]IExprContext, len) + i := 0 + for _, ctx := range children { + if t, ok := ctx.(IExprContext); ok { tst[i] = t.(IExprContext) + i++ } } @@ -3505,7 +3806,17 @@ func (s *MapInitializerListContext) AllExpr() []IExprContext { } func (s *MapInitializerListContext) Expr(i int) IExprContext { - var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprContext)(nil)).Elem(), i) + var t antlr.RuleContext + j := 0 + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IExprContext); ok { + if j == i { + t = ctx.(antlr.RuleContext) + break + } + j++ + } + } if t == nil { return nil @@ -3561,6 +3872,9 @@ func (s *MapInitializerListContext) Accept(visitor antlr.ParseTreeVisitor) inter } func (p *CELParser) MapInitializerList() (localctx IMapInitializerListContext) { + this := p + _ = this + localctx = NewMapInitializerListContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 22, CELParserRULE_mapInitializerList) @@ -4112,6 +4426,9 @@ func (s *IntContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } func (p *CELParser) Literal() (localctx ILiteralContext) { + this := p + _ = this + localctx = NewLiteralContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 24, CELParserRULE_literal) var _la int @@ -4285,6 +4602,9 @@ func (p *CELParser) Sempred(localctx antlr.RuleContext, ruleIndex, predIndex int } func (p *CELParser) Relation_Sempred(localctx antlr.RuleContext, predIndex int) bool { + this := p + _ = this + switch predIndex { case 0: return p.Precpred(p.GetParserRuleContext(), 1) @@ -4295,6 +4615,9 @@ func (p *CELParser) Relation_Sempred(localctx antlr.RuleContext, predIndex int) } func (p *CELParser) Calc_Sempred(localctx antlr.RuleContext, predIndex int) bool { + this := p + _ = this + switch predIndex { case 1: return p.Precpred(p.GetParserRuleContext(), 2) @@ -4308,6 +4631,9 @@ func (p *CELParser) Calc_Sempred(localctx antlr.RuleContext, predIndex int) bool } func (p *CELParser) Member_Sempred(localctx antlr.RuleContext, predIndex int) bool { + this := p + _ = this + switch predIndex { case 3: return p.Precpred(p.GetParserRuleContext(), 3) diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_visitor.go b/vendor/github.com/google/cel-go/parser/gen/cel_visitor.go index 8195d0fb3..142675699 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_visitor.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_visitor.go @@ -1,4 +1,4 @@ -// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/bin/../parser/gen/CEL.g4 by ANTLR 4.9.1. DO NOT EDIT. +// Code generated from /Users/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.10.1. DO NOT EDIT. package gen // CEL import "github.com/antlr/antlr4/runtime/Go/antlr" diff --git a/vendor/github.com/google/cel-go/parser/gen/generate.sh b/vendor/github.com/google/cel-go/parser/gen/generate.sh new file mode 100644 index 000000000..3fcecf9eb --- /dev/null +++ b/vendor/github.com/google/cel-go/parser/gen/generate.sh @@ -0,0 +1,35 @@ +#!/bin/bash -eu +# +# Copyright 2018 Google LLC +# +# 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. + +# To regenerate the CEL lexer/parser statically do the following: +# 1. Download the latest anltr tool from https://www.antlr.org/download.html +# 2. Copy the downloaded jar to the gen directory. It will have a name +# like antlr--complete.jar. +# 3. Modify the script below to refer to the current ANTLR version. +# 4. Execute the generation script from the gen directory. +# 5. Delete the jar and commit the regenerated sources. + +#!/bin/sh + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# Generate AntLR artifacts. +java -Xmx500M -cp ${DIR}/antlr-4.10.1-complete.jar org.antlr.v4.Tool \ + -Dlanguage=Go \ + -package gen \ + -o ${DIR} \ + -visitor ${DIR}/CEL.g4 + diff --git a/vendor/github.com/google/cel-go/parser/helper.go b/vendor/github.com/google/cel-go/parser/helper.go index 56cd19469..a6d9578ed 100644 --- a/vendor/github.com/google/cel-go/parser/helper.go +++ b/vendor/github.com/google/cel-go/parser/helper.go @@ -435,6 +435,11 @@ func (e *exprHelper) Ident(name string) *exprpb.Expr { return e.parserHelper.newIdent(e.nextMacroID(), name) } +// AccuIdent implements the ExprHelper interface method. +func (e *exprHelper) AccuIdent() *exprpb.Expr { + return e.parserHelper.newIdent(e.nextMacroID(), AccumulatorName) +} + // GlobalCall implements the ExprHelper interface method. func (e *exprHelper) GlobalCall(function string, args ...*exprpb.Expr) *exprpb.Expr { return e.parserHelper.newGlobalCall(e.nextMacroID(), function, args...) diff --git a/vendor/github.com/google/cel-go/parser/macro.go b/vendor/github.com/google/cel-go/parser/macro.go index baeddd94e..9150b064e 100644 --- a/vendor/github.com/google/cel-go/parser/macro.go +++ b/vendor/github.com/google/cel-go/parser/macro.go @@ -23,8 +23,6 @@ import ( exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" ) -// TODO: Consider moving macros to common. - // NewGlobalMacro creates a Macro for a global function with the specified arg count. func NewGlobalMacro(function string, argCount int, expander MacroExpander) Macro { return ¯o{ @@ -50,8 +48,7 @@ func NewGlobalVarArgMacro(function string, expander MacroExpander) Macro { varArgStyle: true} } -// NewReceiverVarArgMacro creates a Macro for a receiver function matching a variable arg -// count. +// NewReceiverVarArgMacro creates a Macro for a receiver function matching a variable arg count. func NewReceiverVarArgMacro(function string, expander MacroExpander) Macro { return ¯o{ function: function, @@ -135,9 +132,13 @@ func makeVarArgMacroKey(name string, receiverStyle bool) string { return fmt.Sprintf("%s:*:%v", name, receiverStyle) } -// MacroExpander converts the target and args of a function call that matches a Macro. +// MacroExpander converts a call and its associated arguments into a new CEL abstract syntax tree, or an error +// if the input arguments are not suitable for the expansion requirements for the macro in question. +// +// The MacroExpander accepts as arguments a MacroExprHelper as well as the arguments used in the function call +// and produces as output an Expr ast node. // -// Note: when the Macros.IsReceiverStyle() is true, the target argument will be nil. +// Note: when the Macro.IsReceiverStyle() method returns true, the target argument will be nil. type MacroExpander func(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) @@ -208,6 +209,9 @@ type ExprHelper interface { // Ident creates an identifier Expr value. Ident(name string) *exprpb.Expr + // AccuIdent returns an accumulator identifier for use with comprehension results. + AccuIdent() *exprpb.Expr + // GlobalCall creates a function call Expr value for a global (free) function. GlobalCall(function string, args ...*exprpb.Expr) *exprpb.Expr @@ -225,34 +229,44 @@ type ExprHelper interface { } var ( - // AllMacros includes the list of all spec-supported macros. - AllMacros = []Macro{ - // The macro "has(m.f)" which tests the presence of a field, avoiding the need to specify - // the field as a string. - NewGlobalMacro(operators.Has, 1, makeHas), + // HasMacro expands "has(m.f)" which tests the presence of a field, avoiding the need to + // specify the field as a string. + HasMacro = NewGlobalMacro(operators.Has, 1, MakeHas) + + // AllMacro expands "range.all(var, predicate)" into a comprehension which ensures that all + // elements in the range satisfy the predicate. + AllMacro = NewReceiverMacro(operators.All, 2, MakeAll) - // The macro "range.all(var, predicate)", which is true if for all elements in range the - // predicate holds. - NewReceiverMacro(operators.All, 2, makeAll), + // ExistsMacro expands "range.exists(var, predicate)" into a comprehension which ensures that + // some element in the range satisfies the predicate. + ExistsMacro = NewReceiverMacro(operators.Exists, 2, MakeExists) - // The macro "range.exists(var, predicate)", which is true if for at least one element in - // range the predicate holds. - NewReceiverMacro(operators.Exists, 2, makeExists), + // ExistsOneMacro expands "range.exists_one(var, predicate)", which is true if for exactly one + // element in range the predicate holds. + ExistsOneMacro = NewReceiverMacro(operators.ExistsOne, 2, MakeExistsOne) - // The macro "range.exists_one(var, predicate)", which is true if for exactly one element - // in range the predicate holds. - NewReceiverMacro(operators.ExistsOne, 2, makeExistsOne), + // MapMacro expands "range.map(var, function)" into a comprehension which applies the function + // to each element in the range to produce a new list. + MapMacro = NewReceiverMacro(operators.Map, 2, MakeMap) - // The macro "range.map(var, function)", applies the function to the vars in the range. - NewReceiverMacro(operators.Map, 2, makeMap), + // MapFilterMacro expands "range.map(var, predicate, function)" into a comprehension which + // first filters the elements in the range by the predicate, then applies the transform function + // to produce a new list. + MapFilterMacro = NewReceiverMacro(operators.Map, 3, MakeMap) - // The macro "range.map(var, predicate, function)", applies the function to the vars in - // the range for which the predicate holds true. The other variables are filtered out. - NewReceiverMacro(operators.Map, 3, makeMap), + // FilterMacro expands "range.filter(var, predicate)" into a comprehension which filters + // elements in the range, producing a new list from the elements that satisfy the predicate. + FilterMacro = NewReceiverMacro(operators.Filter, 2, MakeFilter) - // The macro "range.filter(var, predicate)", filters out the variables for which the - // predicate is false. - NewReceiverMacro(operators.Filter, 2, makeFilter), + // AllMacros includes the list of all spec-supported macros. + AllMacros = []Macro{ + HasMacro, + AllMacro, + ExistsMacro, + ExistsOneMacro, + MapMacro, + MapFilterMacro, + FilterMacro, } // NoMacros list. @@ -270,62 +284,36 @@ const ( quantifierExistsOne ) -func makeAll(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { +// MakeAll expands the input call arguments into a comprehension that returns true if all of the +// elements in the range match the predicate expressions: +// .all(, ) +func MakeAll(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { return makeQuantifier(quantifierAll, eh, target, args) } -func makeExists(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { +// MakeExists expands the input call arguments into a comprehension that returns true if any of the +// elements in the range match the predicate expressions: +// .exists(, ) +func MakeExists(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { return makeQuantifier(quantifierExists, eh, target, args) } -func makeExistsOne(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { +// MakeExistsOne expands the input call arguments into a comprehension that returns true if exactly +// one of the elements in the range match the predicate expressions: +// .exists_one(, ) +func MakeExistsOne(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { return makeQuantifier(quantifierExistsOne, eh, target, args) } -func makeQuantifier(kind quantifierKind, eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { - v, found := extractIdent(args[0]) - if !found { - location := eh.OffsetLocation(args[0].GetId()) - return nil, &common.Error{ - Message: "argument must be a simple name", - Location: location} - } - accuIdent := func() *exprpb.Expr { - return eh.Ident(AccumulatorName) - } - - var init *exprpb.Expr - var condition *exprpb.Expr - var step *exprpb.Expr - var result *exprpb.Expr - switch kind { - case quantifierAll: - init = eh.LiteralBool(true) - condition = eh.GlobalCall(operators.NotStrictlyFalse, accuIdent()) - step = eh.GlobalCall(operators.LogicalAnd, accuIdent(), args[1]) - result = accuIdent() - case quantifierExists: - init = eh.LiteralBool(false) - condition = eh.GlobalCall( - operators.NotStrictlyFalse, - eh.GlobalCall(operators.LogicalNot, accuIdent())) - step = eh.GlobalCall(operators.LogicalOr, accuIdent(), args[1]) - result = accuIdent() - case quantifierExistsOne: - zeroExpr := eh.LiteralInt(0) - oneExpr := eh.LiteralInt(1) - init = zeroExpr - condition = eh.LiteralBool(true) - step = eh.GlobalCall(operators.Conditional, args[1], - eh.GlobalCall(operators.Add, accuIdent(), oneExpr), accuIdent()) - result = eh.GlobalCall(operators.Equals, accuIdent(), oneExpr) - default: - return nil, &common.Error{Message: fmt.Sprintf("unrecognized quantifier '%v'", kind)} - } - return eh.Fold(v, target, AccumulatorName, init, condition, step, result), nil -} - -func makeMap(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { +// MakeMap expands the input call arguments into a comprehension that transforms each element in the +// input to produce an output list. +// +// There are two call patterns supported by map: +// .map(, ) +// .map(, , ) +// In the second form only iterVar values which return true when provided to the predicate expression +// are transformed. +func MakeMap(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { v, found := extractIdent(args[0]) if !found { return nil, &common.Error{Message: "argument is not an identifier"} @@ -345,7 +333,6 @@ func makeMap(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.E accuExpr := eh.Ident(AccumulatorName) init := eh.NewList() condition := eh.LiteralBool(true) - // TODO: use compiler internal method for faster, stateful add. step := eh.GlobalCall(operators.Add, accuExpr, eh.NewList(fn)) if filter != nil { @@ -354,7 +341,10 @@ func makeMap(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.E return eh.Fold(v, target, AccumulatorName, init, condition, step, accuExpr), nil } -func makeFilter(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { +// MakeFilter expands the input call arguments into a comprehension which produces a list which contains +// only elements which match the provided predicate expression: +// .filter(, ) +func MakeFilter(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { v, found := extractIdent(args[0]) if !found { return nil, &common.Error{Message: "argument is not an identifier"} @@ -364,12 +354,60 @@ func makeFilter(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprp accuExpr := eh.Ident(AccumulatorName) init := eh.NewList() condition := eh.LiteralBool(true) - // TODO: use compiler internal method for faster, stateful add. step := eh.GlobalCall(operators.Add, accuExpr, eh.NewList(args[0])) step = eh.GlobalCall(operators.Conditional, filter, step, accuExpr) return eh.Fold(v, target, AccumulatorName, init, condition, step, accuExpr), nil } +// MakeHas expands the input call arguments into a presence test, e.g. has(.field) +func MakeHas(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + if s, ok := args[0].ExprKind.(*exprpb.Expr_SelectExpr); ok { + return eh.PresenceTest(s.SelectExpr.GetOperand(), s.SelectExpr.GetField()), nil + } + return nil, &common.Error{Message: "invalid argument to has() macro"} +} + +func makeQuantifier(kind quantifierKind, eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { + v, found := extractIdent(args[0]) + if !found { + location := eh.OffsetLocation(args[0].GetId()) + return nil, &common.Error{ + Message: "argument must be a simple name", + Location: location, + } + } + + var init *exprpb.Expr + var condition *exprpb.Expr + var step *exprpb.Expr + var result *exprpb.Expr + switch kind { + case quantifierAll: + init = eh.LiteralBool(true) + condition = eh.GlobalCall(operators.NotStrictlyFalse, eh.AccuIdent()) + step = eh.GlobalCall(operators.LogicalAnd, eh.AccuIdent(), args[1]) + result = eh.AccuIdent() + case quantifierExists: + init = eh.LiteralBool(false) + condition = eh.GlobalCall( + operators.NotStrictlyFalse, + eh.GlobalCall(operators.LogicalNot, eh.AccuIdent())) + step = eh.GlobalCall(operators.LogicalOr, eh.AccuIdent(), args[1]) + result = eh.AccuIdent() + case quantifierExistsOne: + zeroExpr := eh.LiteralInt(0) + oneExpr := eh.LiteralInt(1) + init = zeroExpr + condition = eh.LiteralBool(true) + step = eh.GlobalCall(operators.Conditional, args[1], + eh.GlobalCall(operators.Add, eh.AccuIdent(), oneExpr), eh.AccuIdent()) + result = eh.GlobalCall(operators.Equals, eh.AccuIdent(), oneExpr) + default: + return nil, &common.Error{Message: fmt.Sprintf("unrecognized quantifier '%v'", kind)} + } + return eh.Fold(v, target, AccumulatorName, init, condition, step, result), nil +} + func extractIdent(e *exprpb.Expr) (string, bool) { switch e.ExprKind.(type) { case *exprpb.Expr_IdentExpr: @@ -377,10 +415,3 @@ func extractIdent(e *exprpb.Expr) (string, bool) { } return "", false } - -func makeHas(eh ExprHelper, target *exprpb.Expr, args []*exprpb.Expr) (*exprpb.Expr, *common.Error) { - if s, ok := args[0].ExprKind.(*exprpb.Expr_SelectExpr); ok { - return eh.PresenceTest(s.SelectExpr.GetOperand(), s.SelectExpr.GetField()), nil - } - return nil, &common.Error{Message: "invalid argument to has() macro"} -} diff --git a/vendor/github.com/google/cel-go/parser/parser.go b/vendor/github.com/google/cel-go/parser/parser.go index 70dbdd7cf..477eede92 100644 --- a/vendor/github.com/google/cel-go/parser/parser.go +++ b/vendor/github.com/google/cel-go/parser/parser.go @@ -46,7 +46,7 @@ func NewParser(opts ...Option) (*Parser, error) { } } if p.maxRecursionDepth == 0 { - p.maxRecursionDepth = 200 + p.maxRecursionDepth = 250 } if p.maxRecursionDepth == -1 { p.maxRecursionDepth = int((^uint(0)) >> 1) @@ -270,6 +270,7 @@ type parser struct { errors *parseErrors helper *parserHelper macros map[string]Macro + recursionDepth int maxRecursionDepth int errorRecoveryLimit int errorRecoveryLookaheadTokenLimit int @@ -352,6 +353,13 @@ func (p *parser) parse(expr runes.Buffer, desc string) *exprpb.Expr { // Visitor implementations. func (p *parser) Visit(tree antlr.ParseTree) interface{} { + p.recursionDepth++ + if p.recursionDepth > p.maxRecursionDepth { + panic(&recursionError{message: "max recursion depth exceeded"}) + } + defer func() { + p.recursionDepth-- + }() switch tree.(type) { case *gen.StartContext: return p.VisitStart(tree.(*gen.StartContext)) diff --git a/vendor/github.com/google/cel-go/parser/unparser.go b/vendor/github.com/google/cel-go/parser/unparser.go index 6a610ff76..64440a945 100644 --- a/vendor/github.com/google/cel-go/parser/unparser.go +++ b/vendor/github.com/google/cel-go/parser/unparser.go @@ -36,9 +36,29 @@ import ( // - Floating point values are converted to the small number of digits needed to represent the value. // - Spacing around punctuation marks may be lost. // - Parentheses will only be applied when they affect operator precedence. -func Unparse(expr *exprpb.Expr, info *exprpb.SourceInfo) (string, error) { - un := &unparser{info: info} - err := un.visit(expr) +// +// This function optionally takes in one or more UnparserOption to alter the unparsing behavior, such as +// performing word wrapping on expressions. +func Unparse(expr *exprpb.Expr, info *exprpb.SourceInfo, opts ...UnparserOption) (string, error) { + unparserOpts := &unparserOption{ + wrapOnColumn: defaultWrapOnColumn, + wrapAfterColumnLimit: defaultWrapAfterColumnLimit, + operatorsToWrapOn: defaultOperatorsToWrapOn, + } + + var err error + for _, opt := range opts { + unparserOpts, err = opt(unparserOpts) + if err != nil { + return "", err + } + } + + un := &unparser{ + info: info, + options: unparserOpts, + } + err = un.visit(expr) if err != nil { return "", err } @@ -47,8 +67,10 @@ func Unparse(expr *exprpb.Expr, info *exprpb.SourceInfo) (string, error) { // unparser visits an expression to reconstruct a human-readable string from an AST. type unparser struct { - str strings.Builder - info *exprpb.SourceInfo + str strings.Builder + info *exprpb.SourceInfo + options *unparserOption + lastWrappedIndex int } func (un *unparser) visit(expr *exprpb.Expr) error { @@ -135,9 +157,8 @@ func (un *unparser) visitCallBinary(expr *exprpb.Expr) error { if !found { return fmt.Errorf("cannot unmangle operator: %s", fun) } - un.str.WriteString(" ") - un.str.WriteString(unmangled) - un.str.WriteString(" ") + + un.writeOperatorWithWrapping(fun, unmangled) return un.visitMaybeNested(rhs, rhsParen) } @@ -151,7 +172,8 @@ func (un *unparser) visitCallConditional(expr *exprpb.Expr) error { if err != nil { return err } - un.str.WriteString(" ? ") + un.writeOperatorWithWrapping(operators.Conditional, "?") + // add parens if operand is a conditional itself. nested = isSamePrecedence(operators.Conditional, args[1]) || isComplexOperator(args[1]) @@ -159,6 +181,7 @@ func (un *unparser) visitCallConditional(expr *exprpb.Expr) error { if err != nil { return err } + un.str.WriteString(" : ") // add parens if operand is a conditional itself. nested = isSamePrecedence(operators.Conditional, args[2]) || @@ -444,3 +467,130 @@ func bytesToOctets(byteVal []byte) string { } return b.String() } + +// writeOperatorWithWrapping outputs the operator and inserts a newline for operators configured +// in the unparser options. +func (un *unparser) writeOperatorWithWrapping(fun string, unmangled string) bool { + _, wrapOperatorExists := un.options.operatorsToWrapOn[fun] + lineLength := un.str.Len() - un.lastWrappedIndex + len(fun) + + if wrapOperatorExists && lineLength >= un.options.wrapOnColumn { + un.lastWrappedIndex = un.str.Len() + // wrapAfterColumnLimit flag dictates whether the newline is placed + // before or after the operator + if un.options.wrapAfterColumnLimit { + // Input: a && b + // Output: a &&\nb + un.str.WriteString(" ") + un.str.WriteString(unmangled) + un.str.WriteString("\n") + } else { + // Input: a && b + // Output: a\n&& b + un.str.WriteString("\n") + un.str.WriteString(unmangled) + un.str.WriteString(" ") + } + return true + } else { + un.str.WriteString(" ") + un.str.WriteString(unmangled) + un.str.WriteString(" ") + } + return false +} + +// Defined defaults for the unparser options +var ( + defaultWrapOnColumn = 80 + defaultWrapAfterColumnLimit = true + defaultOperatorsToWrapOn = map[string]bool{ + operators.LogicalAnd: true, + operators.LogicalOr: true, + } +) + +// UnparserOption is a functional option for configuring the output formatting +// of the Unparse function. +type UnparserOption func(*unparserOption) (*unparserOption, error) + +// Internal representation of the UnparserOption type +type unparserOption struct { + wrapOnColumn int + operatorsToWrapOn map[string]bool + wrapAfterColumnLimit bool +} + +// WrapOnColumn wraps the output expression when its string length exceeds a specified limit +// for operators set by WrapOnOperators function or by default, "&&" and "||" will be wrapped. +// +// Example usage: +// +// Unparse(expr, sourceInfo, WrapOnColumn(40), WrapOnOperators(Operators.LogicalAnd)) +// +// This will insert a newline immediately after the logical AND operator for the below example input: +// +// Input: +// 'my-principal-group' in request.auth.claims && request.auth.claims.iat > now - duration('5m') +// +// Output: +// 'my-principal-group' in request.auth.claims && +// request.auth.claims.iat > now - duration('5m') +func WrapOnColumn(col int) UnparserOption { + return func(opt *unparserOption) (*unparserOption, error) { + if col < 1 { + return nil, fmt.Errorf("Invalid unparser option. Wrap column value must be greater than or equal to 1. Got %v instead", col) + } + opt.wrapOnColumn = col + return opt, nil + } +} + +// WrapOnOperators specifies which operators to perform word wrapping on an output expression when its string length +// exceeds the column limit set by WrapOnColumn function. +// +// Word wrapping is supported on non-unary symbolic operators. Refer to operators.go for the full list +// +// This will replace any previously supplied operators instead of merging them. +func WrapOnOperators(symbols ...string) UnparserOption { + return func(opt *unparserOption) (*unparserOption, error) { + opt.operatorsToWrapOn = make(map[string]bool) + for _, symbol := range symbols { + _, found := operators.FindReverse(symbol) + if !found { + return nil, fmt.Errorf("Invalid unparser option. Unsupported operator: %s", symbol) + } + arity := operators.Arity(symbol) + if arity < 2 { + return nil, fmt.Errorf("Invalid unparser option. Unary operators are unsupported: %s", symbol) + } + + opt.operatorsToWrapOn[symbol] = true + } + + return opt, nil + } +} + +// WrapAfterColumnLimit dictates whether to insert a newline before or after the specified operator +// when word wrapping is performed. +// +// Example usage: +// +// Unparse(expr, sourceInfo, WrapOnColumn(40), WrapOnOperators(Operators.LogicalAnd), WrapAfterColumnLimit(false)) +// +// This will insert a newline immediately before the logical AND operator for the below example input, ensuring +// that the length of a line never exceeds the specified column limit: +// +// Input: +// 'my-principal-group' in request.auth.claims && request.auth.claims.iat > now - duration('5m') +// +// Output: +// 'my-principal-group' in request.auth.claims +// && request.auth.claims.iat > now - duration('5m') +func WrapAfterColumnLimit(wrapAfter bool) UnparserOption { + return func(opt *unparserOption) (*unparserOption, error) { + opt.wrapAfterColumnLimit = wrapAfter + return opt, nil + } +} diff --git a/vendor/github.com/google/gnostic/jsonschema/display.go b/vendor/github.com/google/gnostic/jsonschema/display.go index 028a760a9..8677ed49a 100644 --- a/vendor/github.com/google/gnostic/jsonschema/display.go +++ b/vendor/github.com/google/gnostic/jsonschema/display.go @@ -46,8 +46,23 @@ func (schema *Schema) describeSchema(indent string) string { if schema.Schema != nil { result += indent + "$schema: " + *(schema.Schema) + "\n" } + if schema.ReadOnly != nil && *schema.ReadOnly { + result += indent + fmt.Sprintf("readOnly: %+v\n", *(schema.ReadOnly)) + } + if schema.WriteOnly != nil && *schema.WriteOnly { + result += indent + fmt.Sprintf("writeOnly: %+v\n", *(schema.WriteOnly)) + } if schema.ID != nil { - result += indent + "id: " + *(schema.ID) + "\n" + switch strings.TrimSuffix(*schema.Schema, "#") { + case "http://json-schema.org/draft-04/schema#": + fallthrough + case "#": + fallthrough + case "": + result += indent + "id: " + *(schema.ID) + "\n" + default: + result += indent + "$id: " + *(schema.ID) + "\n" + } } if schema.MultipleOf != nil { result += indent + fmt.Sprintf("multipleOf: %+v\n", *(schema.MultipleOf)) diff --git a/vendor/github.com/google/gnostic/jsonschema/models.go b/vendor/github.com/google/gnostic/jsonschema/models.go index 4781bdc5f..0d877249a 100644 --- a/vendor/github.com/google/gnostic/jsonschema/models.go +++ b/vendor/github.com/google/gnostic/jsonschema/models.go @@ -23,9 +23,11 @@ import "gopkg.in/yaml.v3" // All fields are pointers and are nil if the associated values // are not specified. type Schema struct { - Schema *string // $schema - ID *string // id keyword used for $ref resolution scope - Ref *string // $ref, i.e. JSON Pointers + Schema *string // $schema + ID *string // id keyword used for $ref resolution scope + Ref *string // $ref, i.e. JSON Pointers + ReadOnly *bool + WriteOnly *bool // http://json-schema.org/latest/json-schema-validation.html // 5.1. Validation keywords for numeric instances (number and integer) diff --git a/vendor/github.com/google/gnostic/jsonschema/reader.go b/vendor/github.com/google/gnostic/jsonschema/reader.go index b8583d466..a909a3412 100644 --- a/vendor/github.com/google/gnostic/jsonschema/reader.go +++ b/vendor/github.com/google/gnostic/jsonschema/reader.go @@ -165,7 +165,6 @@ func NewSchemaFromObject(jsonData *yaml.Node) *Schema { default: fmt.Printf("schemaValue: unexpected node %+v\n", jsonData) - return nil } return nil diff --git a/vendor/github.com/google/gnostic/jsonschema/writer.go b/vendor/github.com/google/gnostic/jsonschema/writer.go index 340dc5f93..15b1f9050 100644 --- a/vendor/github.com/google/gnostic/jsonschema/writer.go +++ b/vendor/github.com/google/gnostic/jsonschema/writer.go @@ -16,6 +16,7 @@ package jsonschema import ( "fmt" + "strings" "gopkg.in/yaml.v3" ) @@ -33,7 +34,11 @@ func renderMappingNode(node *yaml.Node, indent string) (result string) { value := node.Content[i+1] switch value.Kind { case yaml.ScalarNode: - result += "\"" + value.Value + "\"" + if value.Tag == "!!bool" { + result += value.Value + } else { + result += "\"" + value.Value + "\"" + } case yaml.MappingNode: result += renderMappingNode(value, innerIndent) case yaml.SequenceNode: @@ -58,7 +63,11 @@ func renderSequenceNode(node *yaml.Node, indent string) (result string) { item := node.Content[i] switch item.Kind { case yaml.ScalarNode: - result += innerIndent + "\"" + item.Value + "\"" + if item.Tag == "!!bool" { + result += innerIndent + item.Value + } else { + result += innerIndent + "\"" + item.Value + "\"" + } case yaml.MappingNode: result += innerIndent + renderMappingNode(item, innerIndent) + "" default: @@ -260,11 +269,26 @@ func (schema *Schema) nodeValue() *yaml.Node { content = appendPair(content, "title", nodeForString(*schema.Title)) } if schema.ID != nil { - content = appendPair(content, "id", nodeForString(*schema.ID)) + switch strings.TrimSuffix(*schema.Schema, "#") { + case "http://json-schema.org/draft-04/schema": + fallthrough + case "#": + fallthrough + case "": + content = appendPair(content, "id", nodeForString(*schema.ID)) + default: + content = appendPair(content, "$id", nodeForString(*schema.ID)) + } } if schema.Schema != nil { content = appendPair(content, "$schema", nodeForString(*schema.Schema)) } + if schema.ReadOnly != nil && *schema.ReadOnly { + content = appendPair(content, "readOnly", nodeForBoolean(*schema.ReadOnly)) + } + if schema.WriteOnly != nil && *schema.WriteOnly { + content = appendPair(content, "writeOnly", nodeForBoolean(*schema.WriteOnly)) + } if schema.Type != nil { content = appendPair(content, "type", schema.Type.nodeValue()) } diff --git a/vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.go b/vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.go index 0f1790766..28c2777d5 100644 --- a/vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.go +++ b/vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.go @@ -7887,7 +7887,12 @@ func (m *Oauth2Scopes) ToRawInfo() *yaml.Node { if m == nil { return info } - // &{Name:additionalProperties Type:NamedString StringEnumValues:[] MapType:string Repeated:true Pattern: Implicit:true Description:} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Value)) + } + } return info } diff --git a/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go index 5f4a7025e..d54a84db7 100644 --- a/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go +++ b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go @@ -8560,7 +8560,12 @@ func (m *Strings) ToRawInfo() *yaml.Node { if m == nil { return info } - // &{Name:additionalProperties Type:NamedString StringEnumValues:[] MapType:string Repeated:true Pattern: Implicit:true Description:} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Value)) + } + } return info } diff --git a/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go index 499e7f932..90a56f552 100644 --- a/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go +++ b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go @@ -16,8 +16,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 -// protoc v3.18.1 +// protoc-gen-go v1.28.0 +// protoc v3.19.4 // source: openapiv3/OpenAPIv3.proto package openapi_v3 @@ -6760,12 +6760,13 @@ var file_openapiv3_OpenAPIv3_proto_rawDesc = []byte{ 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x3e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x56, 0x0a, 0x0e, 0x6f, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, 0x42, 0x0c, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x50, 0x49, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x16, 0x2e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x3b, 0x6f, 0x70, - 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, 0xa2, 0x02, 0x03, 0x4f, 0x41, 0x53, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x3b, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, + 0xa2, 0x02, 0x03, 0x4f, 0x41, 0x53, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto index 1be335b89..7aede5ed9 100644 --- a/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto +++ b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto @@ -42,7 +42,7 @@ option java_package = "org.openapi_v3"; option objc_class_prefix = "OAS"; // The Go package name. -option go_package = "./openapiv3;openapi_v3"; +option go_package = "github.com/google/gnostic/openapiv3;openapi_v3"; message AdditionalPropertiesItem { oneof oneof { diff --git a/vendor/github.com/google/gnostic/openapiv3/README.md b/vendor/github.com/google/gnostic/openapiv3/README.md index 5ee12d92e..83603b82a 100644 --- a/vendor/github.com/google/gnostic/openapiv3/README.md +++ b/vendor/github.com/google/gnostic/openapiv3/README.md @@ -19,3 +19,7 @@ for OpenAPI. The schema-generator directory contains support code which generates openapi-3.1.json from the OpenAPI 3.1 specification document (Markdown). + +### How to rebuild + +`protoc -I=. -I=third_party --go_out=. --go_opt=paths=source_relative openapiv3/*.proto` \ No newline at end of file diff --git a/vendor/github.com/google/gnostic/openapiv3/annotations.pb.go b/vendor/github.com/google/gnostic/openapiv3/annotations.pb.go new file mode 100644 index 000000000..ae242f304 --- /dev/null +++ b/vendor/github.com/google/gnostic/openapiv3/annotations.pb.go @@ -0,0 +1,183 @@ +// Copyright 2022 Google LLC. All Rights Reserved. +// +// 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.19.4 +// source: openapiv3/annotations.proto + +package openapi_v3 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var file_openapiv3_annotations_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.FileOptions)(nil), + ExtensionType: (*Document)(nil), + Field: 1143, + Name: "openapi.v3.document", + Tag: "bytes,1143,opt,name=document", + Filename: "openapiv3/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MethodOptions)(nil), + ExtensionType: (*Operation)(nil), + Field: 1143, + Name: "openapi.v3.operation", + Tag: "bytes,1143,opt,name=operation", + Filename: "openapiv3/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MessageOptions)(nil), + ExtensionType: (*Schema)(nil), + Field: 1143, + Name: "openapi.v3.schema", + Tag: "bytes,1143,opt,name=schema", + Filename: "openapiv3/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.FieldOptions)(nil), + ExtensionType: (*Schema)(nil), + Field: 1143, + Name: "openapi.v3.property", + Tag: "bytes,1143,opt,name=property", + Filename: "openapiv3/annotations.proto", + }, +} + +// Extension fields to descriptorpb.FileOptions. +var ( + // optional openapi.v3.Document document = 1143; + E_Document = &file_openapiv3_annotations_proto_extTypes[0] +) + +// Extension fields to descriptorpb.MethodOptions. +var ( + // optional openapi.v3.Operation operation = 1143; + E_Operation = &file_openapiv3_annotations_proto_extTypes[1] +) + +// Extension fields to descriptorpb.MessageOptions. +var ( + // optional openapi.v3.Schema schema = 1143; + E_Schema = &file_openapiv3_annotations_proto_extTypes[2] +) + +// Extension fields to descriptorpb.FieldOptions. +var ( + // optional openapi.v3.Schema property = 1143; + E_Property = &file_openapiv3_annotations_proto_extTypes[3] +) + +var File_openapiv3_annotations_proto protoreflect.FileDescriptor + +var file_openapiv3_annotations_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x1a, 0x19, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x50, 0x49, 0x76, 0x33, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x4f, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0xf7, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x54, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xf7, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x4c, 0x0a, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xf7, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x4e, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xf7, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x42, 0x5a, 0x0a, 0x0e, 0x6f, + 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, 0x42, 0x10, 0x41, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x3b, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, + 0x33, 0xa2, 0x02, 0x03, 0x4f, 0x41, 0x53, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_openapiv3_annotations_proto_goTypes = []interface{}{ + (*descriptorpb.FileOptions)(nil), // 0: google.protobuf.FileOptions + (*descriptorpb.MethodOptions)(nil), // 1: google.protobuf.MethodOptions + (*descriptorpb.MessageOptions)(nil), // 2: google.protobuf.MessageOptions + (*descriptorpb.FieldOptions)(nil), // 3: google.protobuf.FieldOptions + (*Document)(nil), // 4: openapi.v3.Document + (*Operation)(nil), // 5: openapi.v3.Operation + (*Schema)(nil), // 6: openapi.v3.Schema +} +var file_openapiv3_annotations_proto_depIdxs = []int32{ + 0, // 0: openapi.v3.document:extendee -> google.protobuf.FileOptions + 1, // 1: openapi.v3.operation:extendee -> google.protobuf.MethodOptions + 2, // 2: openapi.v3.schema:extendee -> google.protobuf.MessageOptions + 3, // 3: openapi.v3.property:extendee -> google.protobuf.FieldOptions + 4, // 4: openapi.v3.document:type_name -> openapi.v3.Document + 5, // 5: openapi.v3.operation:type_name -> openapi.v3.Operation + 6, // 6: openapi.v3.schema:type_name -> openapi.v3.Schema + 6, // 7: openapi.v3.property:type_name -> openapi.v3.Schema + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 4, // [4:8] is the sub-list for extension type_name + 0, // [0:4] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_openapiv3_annotations_proto_init() } +func file_openapiv3_annotations_proto_init() { + if File_openapiv3_annotations_proto != nil { + return + } + file_openapiv3_OpenAPIv3_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_openapiv3_annotations_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 4, + NumServices: 0, + }, + GoTypes: file_openapiv3_annotations_proto_goTypes, + DependencyIndexes: file_openapiv3_annotations_proto_depIdxs, + ExtensionInfos: file_openapiv3_annotations_proto_extTypes, + }.Build() + File_openapiv3_annotations_proto = out.File + file_openapiv3_annotations_proto_rawDesc = nil + file_openapiv3_annotations_proto_goTypes = nil + file_openapiv3_annotations_proto_depIdxs = nil +} diff --git a/vendor/github.com/google/gnostic/openapiv3/annotations.proto b/vendor/github.com/google/gnostic/openapiv3/annotations.proto new file mode 100644 index 000000000..0bd87810d --- /dev/null +++ b/vendor/github.com/google/gnostic/openapiv3/annotations.proto @@ -0,0 +1,60 @@ +// Copyright 2022 Google LLC. All Rights Reserved. +// +// 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. + +syntax = "proto3"; + +package openapi.v3; + +import "openapiv3/OpenAPIv3.proto"; +import "google/protobuf/descriptor.proto"; + +// This option lets the proto compiler generate Java code inside the package +// name (see below) instead of inside an outer class. It creates a simpler +// developer experience by reducing one-level of name nesting and be +// consistent with most programming languages that don't support outer classes. +option java_multiple_files = true; + +// The Java outer classname should be the filename in UpperCamelCase. This +// class is only used to hold proto descriptor, so developers don't need to +// work with it directly. +option java_outer_classname = "AnnotationsProto"; + +// The Java package name must be proto package name with proper prefix. +option java_package = "org.openapi_v3"; + +// A reasonable prefix for the Objective-C symbols generated from the package. +// It should at a minimum be 3 characters long, all uppercase, and convention +// is to use an abbreviation of the package name. Something short, but +// hopefully unique enough to not conflict with things that may come along in +// the future. 'GPB' is reserved for the protocol buffer implementation itself. +option objc_class_prefix = "OAS"; + +// The Go package name. +option go_package = "github.com/google/gnostic/openapiv3;openapi_v3"; + +extend google.protobuf.FileOptions { + Document document = 1143; +} + +extend google.protobuf.MethodOptions { + Operation operation = 1143; +} + +extend google.protobuf.MessageOptions { + Schema schema = 1143; +} + +extend google.protobuf.FieldOptions { + Schema property = 1143; +} \ No newline at end of file diff --git a/vendor/github.com/google/uuid/null.go b/vendor/github.com/google/uuid/null.go new file mode 100644 index 000000000..d7fcbf286 --- /dev/null +++ b/vendor/github.com/google/uuid/null.go @@ -0,0 +1,118 @@ +// Copyright 2021 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "bytes" + "database/sql/driver" + "encoding/json" + "fmt" +) + +var jsonNull = []byte("null") + +// NullUUID represents a UUID that may be null. +// NullUUID implements the SQL driver.Scanner interface so +// it can be used as a scan destination: +// +// var u uuid.NullUUID +// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&u) +// ... +// if u.Valid { +// // use u.UUID +// } else { +// // NULL value +// } +// +type NullUUID struct { + UUID UUID + Valid bool // Valid is true if UUID is not NULL +} + +// Scan implements the SQL driver.Scanner interface. +func (nu *NullUUID) Scan(value interface{}) error { + if value == nil { + nu.UUID, nu.Valid = Nil, false + return nil + } + + err := nu.UUID.Scan(value) + if err != nil { + nu.Valid = false + return err + } + + nu.Valid = true + return nil +} + +// Value implements the driver Valuer interface. +func (nu NullUUID) Value() (driver.Value, error) { + if !nu.Valid { + return nil, nil + } + // Delegate to UUID Value function + return nu.UUID.Value() +} + +// MarshalBinary implements encoding.BinaryMarshaler. +func (nu NullUUID) MarshalBinary() ([]byte, error) { + if nu.Valid { + return nu.UUID[:], nil + } + + return []byte(nil), nil +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler. +func (nu *NullUUID) UnmarshalBinary(data []byte) error { + if len(data) != 16 { + return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) + } + copy(nu.UUID[:], data) + nu.Valid = true + return nil +} + +// MarshalText implements encoding.TextMarshaler. +func (nu NullUUID) MarshalText() ([]byte, error) { + if nu.Valid { + return nu.UUID.MarshalText() + } + + return jsonNull, nil +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (nu *NullUUID) UnmarshalText(data []byte) error { + id, err := ParseBytes(data) + if err != nil { + nu.Valid = false + return err + } + nu.UUID = id + nu.Valid = true + return nil +} + +// MarshalJSON implements json.Marshaler. +func (nu NullUUID) MarshalJSON() ([]byte, error) { + if nu.Valid { + return json.Marshal(nu.UUID) + } + + return jsonNull, nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (nu *NullUUID) UnmarshalJSON(data []byte) error { + if bytes.Equal(data, jsonNull) { + *nu = NullUUID{} + return nil // valid null UUID + } + err := json.Unmarshal(data, &nu.UUID) + nu.Valid = err == nil + return err +} diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go index 60d26bb50..a57207aeb 100644 --- a/vendor/github.com/google/uuid/uuid.go +++ b/vendor/github.com/google/uuid/uuid.go @@ -12,6 +12,7 @@ import ( "fmt" "io" "strings" + "sync" ) // A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC @@ -33,7 +34,15 @@ const ( Future // Reserved for future definition. ) -var rander = rand.Reader // random function +const randPoolSize = 16 * 16 + +var ( + rander = rand.Reader // random function + poolEnabled = false + poolMu sync.Mutex + poolPos = randPoolSize // protected with poolMu + pool [randPoolSize]byte // protected with poolMu +) type invalidLengthError struct{ len int } @@ -41,6 +50,12 @@ func (err invalidLengthError) Error() string { return fmt.Sprintf("invalid UUID length: %d", err.len) } +// IsInvalidLengthError is matcher function for custom error invalidLengthError +func IsInvalidLengthError(err error) bool { + _, ok := err.(invalidLengthError) + return ok +} + // Parse decodes s into a UUID or returns an error. Both the standard UUID // forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the @@ -249,3 +264,31 @@ func SetRand(r io.Reader) { } rander = r } + +// EnableRandPool enables internal randomness pool used for Random +// (Version 4) UUID generation. The pool contains random bytes read from +// the random number generator on demand in batches. Enabling the pool +// may improve the UUID generation throughput significantly. +// +// Since the pool is stored on the Go heap, this feature may be a bad fit +// for security sensitive applications. +// +// Both EnableRandPool and DisableRandPool are not thread-safe and should +// only be called when there is no possibility that New or any other +// UUID Version 4 generation function will be called concurrently. +func EnableRandPool() { + poolEnabled = true +} + +// DisableRandPool disables the randomness pool if it was previously +// enabled with EnableRandPool. +// +// Both EnableRandPool and DisableRandPool are not thread-safe and should +// only be called when there is no possibility that New or any other +// UUID Version 4 generation function will be called concurrently. +func DisableRandPool() { + poolEnabled = false + defer poolMu.Unlock() + poolMu.Lock() + poolPos = randPoolSize +} diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go index 86160fbd0..7697802e4 100644 --- a/vendor/github.com/google/uuid/version4.go +++ b/vendor/github.com/google/uuid/version4.go @@ -27,6 +27,8 @@ func NewString() string { // The strength of the UUIDs is based on the strength of the crypto/rand // package. // +// Uses the randomness pool if it was enabled with EnableRandPool. +// // A note about uniqueness derived from the UUID Wikipedia entry: // // Randomly generated UUIDs have 122 random bits. One's annual risk of being @@ -35,7 +37,10 @@ func NewString() string { // equivalent to the odds of creating a few tens of trillions of UUIDs in a // year and having one duplicate. func NewRandom() (UUID, error) { - return NewRandomFromReader(rander) + if !poolEnabled { + return NewRandomFromReader(rander) + } + return newRandomFromPool() } // NewRandomFromReader returns a UUID based on bytes read from a given io.Reader. @@ -49,3 +54,23 @@ func NewRandomFromReader(r io.Reader) (UUID, error) { uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 return uuid, nil } + +func newRandomFromPool() (UUID, error) { + var uuid UUID + poolMu.Lock() + if poolPos == randPoolSize { + _, err := io.ReadFull(rander, pool[:]) + if err != nil { + poolMu.Unlock() + return Nil, err + } + poolPos = 0 + } + copy(uuid[:], pool[poolPos:(poolPos+16)]) + poolPos += 16 + poolMu.Unlock() + + uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4 + uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 + return uuid, nil +} diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go deleted file mode 100644 index 42e3129d8..000000000 --- a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go +++ /dev/null @@ -1,61 +0,0 @@ -// Package diskcache provides an implementation of httpcache.Cache that uses the diskv package -// to supplement an in-memory map with persistent storage -// -package diskcache - -import ( - "bytes" - "crypto/md5" - "encoding/hex" - "github.com/peterbourgon/diskv" - "io" -) - -// Cache is an implementation of httpcache.Cache that supplements the in-memory map with persistent storage -type Cache struct { - d *diskv.Diskv -} - -// Get returns the response corresponding to key if present -func (c *Cache) Get(key string) (resp []byte, ok bool) { - key = keyToFilename(key) - resp, err := c.d.Read(key) - if err != nil { - return []byte{}, false - } - return resp, true -} - -// Set saves a response to the cache as key -func (c *Cache) Set(key string, resp []byte) { - key = keyToFilename(key) - c.d.WriteStream(key, bytes.NewReader(resp), true) -} - -// Delete removes the response with key from the cache -func (c *Cache) Delete(key string) { - key = keyToFilename(key) - c.d.Erase(key) -} - -func keyToFilename(key string) string { - h := md5.New() - io.WriteString(h, key) - return hex.EncodeToString(h.Sum(nil)) -} - -// New returns a new Cache that will store files in basePath -func New(basePath string) *Cache { - return &Cache{ - d: diskv.New(diskv.Options{ - BasePath: basePath, - CacheSizeMax: 100 * 1024 * 1024, // 100MB - }), - } -} - -// NewWithDiskv returns a new Cache using the provided Diskv as underlying -// storage. -func NewWithDiskv(d *diskv.Diskv) *Cache { - return &Cache{d} -} diff --git a/vendor/github.com/imdario/mergo/README.md b/vendor/github.com/imdario/mergo/README.md index aa8cbd7ce..7e6f7aeee 100644 --- a/vendor/github.com/imdario/mergo/README.md +++ b/vendor/github.com/imdario/mergo/README.md @@ -8,8 +8,7 @@ [![Coverage Status][9]][10] [![Sourcegraph][11]][12] [![FOSSA Status][13]][14] - -[![GoCenter Kudos][15]][16] +[![Become my sponsor][15]][16] [1]: https://travis-ci.org/imdario/mergo.png [2]: https://travis-ci.org/imdario/mergo @@ -25,8 +24,8 @@ [12]: https://sourcegraph.com/github.com/imdario/mergo?badge [13]: https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield [14]: https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield -[15]: https://search.gocenter.io/api/ui/badge/github.com%2Fimdario%2Fmergo -[16]: https://search.gocenter.io/github.com/imdario/mergo +[15]: https://img.shields.io/github/sponsors/imdario +[16]: https://github.com/sponsors/imdario A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. @@ -36,11 +35,11 @@ Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the ## Status -It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc](https://github.com/imdario/mergo#mergo-in-the-wild). +It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, Microsoft, etc](https://github.com/imdario/mergo#mergo-in-the-wild). ### Important note -Please keep in mind that a problematic PR broke [0.3.9](//github.com/imdario/mergo/releases/tag/0.3.9). I reverted it in [0.3.10](//github.com/imdario/mergo/releases/tag/0.3.10), and I consider it stable but not bug-free. Also, this version adds suppot for go modules. +Please keep in mind that a problematic PR broke [0.3.9](//github.com/imdario/mergo/releases/tag/0.3.9). I reverted it in [0.3.10](//github.com/imdario/mergo/releases/tag/0.3.10), and I consider it stable but not bug-free. Also, this version adds support for go modules. Keep in mind that in [0.3.2](//github.com/imdario/mergo/releases/tag/0.3.2), Mergo changed `Merge()`and `Map()` signatures to support [transformers](#transformers). I added an optional/variadic argument so that it won't break the existing code. @@ -51,12 +50,12 @@ If you were using Mergo before April 6th, 2015, please check your project works If Mergo is useful to you, consider buying me a coffee, a beer, or making a monthly donation to allow me to keep building great free software. :heart_eyes: Buy Me a Coffee at ko-fi.com -[![Beerpay](https://beerpay.io/imdario/mergo/badge.svg)](https://beerpay.io/imdario/mergo) -[![Beerpay](https://beerpay.io/imdario/mergo/make-wish.svg)](https://beerpay.io/imdario/mergo) Donate using Liberapay +Become my sponsor ### Mergo in the wild +- [cli/cli](https://github.com/cli/cli) - [moby/moby](https://github.com/moby/moby) - [kubernetes/kubernetes](https://github.com/kubernetes/kubernetes) - [vmware/dispatch](https://github.com/vmware/dispatch) @@ -98,6 +97,8 @@ If Mergo is useful to you, consider buying me a coffee, a beer, or making a mont - [jnuthong/item_search](https://github.com/jnuthong/item_search) - [bukalapak/snowboard](https://github.com/bukalapak/snowboard) - [containerssh/containerssh](https://github.com/containerssh/containerssh) +- [goreleaser/goreleaser](https://github.com/goreleaser/goreleaser) +- [tjpnz/structbot](https://github.com/tjpnz/structbot) ## Install @@ -168,7 +169,7 @@ func main() { Note: if test are failing due missing package, please execute: - go get gopkg.in/yaml.v2 + go get gopkg.in/yaml.v3 ### Transformers @@ -218,7 +219,6 @@ func main() { } ``` - ## Contact me If I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): [@im_dario](https://twitter.com/im_dario) @@ -227,18 +227,6 @@ If I can help you, you have an idea or you are using Mergo in your projects, don Written by [Dario Castañé](http://dario.im). -## Top Contributors - -[![0](https://sourcerer.io/fame/imdario/imdario/mergo/images/0)](https://sourcerer.io/fame/imdario/imdario/mergo/links/0) -[![1](https://sourcerer.io/fame/imdario/imdario/mergo/images/1)](https://sourcerer.io/fame/imdario/imdario/mergo/links/1) -[![2](https://sourcerer.io/fame/imdario/imdario/mergo/images/2)](https://sourcerer.io/fame/imdario/imdario/mergo/links/2) -[![3](https://sourcerer.io/fame/imdario/imdario/mergo/images/3)](https://sourcerer.io/fame/imdario/imdario/mergo/links/3) -[![4](https://sourcerer.io/fame/imdario/imdario/mergo/images/4)](https://sourcerer.io/fame/imdario/imdario/mergo/links/4) -[![5](https://sourcerer.io/fame/imdario/imdario/mergo/images/5)](https://sourcerer.io/fame/imdario/imdario/mergo/links/5) -[![6](https://sourcerer.io/fame/imdario/imdario/mergo/images/6)](https://sourcerer.io/fame/imdario/imdario/mergo/links/6) -[![7](https://sourcerer.io/fame/imdario/imdario/mergo/images/7)](https://sourcerer.io/fame/imdario/imdario/mergo/links/7) - - ## License [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license, as [Go language](http://golang.org/LICENSE). diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go index 8c2a8fcd9..8b4e2f47a 100644 --- a/vendor/github.com/imdario/mergo/merge.go +++ b/vendor/github.com/imdario/mergo/merge.go @@ -79,7 +79,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co visited[h] = &visit{addr, typ, seen} } - if config.Transformers != nil && !isEmptyValue(dst) { + if config.Transformers != nil && !isReflectNil(dst) && dst.IsValid() { if fn := config.Transformers.Transformer(dst.Type()); fn != nil { err = fn(dst, src) return diff --git a/vendor/github.com/imdario/mergo/mergo.go b/vendor/github.com/imdario/mergo/mergo.go index 3cc926c7f..9fe362d47 100644 --- a/vendor/github.com/imdario/mergo/mergo.go +++ b/vendor/github.com/imdario/mergo/mergo.go @@ -17,7 +17,7 @@ import ( var ( ErrNilArguments = errors.New("src and dst must not be nil") ErrDifferentArgumentsTypes = errors.New("src and dst must be of same type") - ErrNotSupported = errors.New("only structs and maps are supported") + ErrNotSupported = errors.New("only structs, maps, and slices are supported") ErrExpectedMapAsDestination = errors.New("dst was expected to be a map") ErrExpectedStructAsDestination = errors.New("dst was expected to be a struct") ErrNonPointerAgument = errors.New("dst must be a pointer") @@ -65,7 +65,7 @@ func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) { return } vDst = reflect.ValueOf(dst).Elem() - if vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map { + if vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map && vDst.Kind() != reflect.Slice { err = ErrNotSupported return } diff --git a/vendor/github.com/mailru/easyjson/jlexer/lexer.go b/vendor/github.com/mailru/easyjson/jlexer/lexer.go index a42e9d65a..b5f5e2613 100644 --- a/vendor/github.com/mailru/easyjson/jlexer/lexer.go +++ b/vendor/github.com/mailru/easyjson/jlexer/lexer.go @@ -401,6 +401,7 @@ func (r *Lexer) scanToken() { // consume resets the current token to allow scanning the next one. func (r *Lexer) consume() { r.token.kind = tokenUndef + r.token.byteValueCloned = false r.token.delimValue = 0 } @@ -528,6 +529,7 @@ func (r *Lexer) Skip() { func (r *Lexer) SkipRecursive() { r.scanToken() var start, end byte + startPos := r.start switch r.token.delimValue { case '{': @@ -553,6 +555,14 @@ func (r *Lexer) SkipRecursive() { level-- if level == 0 { r.pos += i + 1 + if !json.Valid(r.Data[startPos:r.pos]) { + r.pos = len(r.Data) + r.fatalError = &LexerError{ + Reason: "skipped array/object json value is invalid", + Offset: r.pos, + Data: string(r.Data[r.pos:]), + } + } return } case c == '\\' && inQuotes: @@ -702,6 +712,10 @@ func (r *Lexer) Bytes() []byte { r.errInvalidToken("string") return nil } + if err := r.unescapeStringToken(); err != nil { + r.errInvalidToken("string") + return nil + } ret := make([]byte, base64.StdEncoding.DecodedLen(len(r.token.byteValue))) n, err := base64.StdEncoding.Decode(ret, r.token.byteValue) if err != nil { diff --git a/vendor/github.com/onsi/gomega/CHANGELOG.md b/vendor/github.com/onsi/gomega/CHANGELOG.md index 75af957f2..06065866b 100644 --- a/vendor/github.com/onsi/gomega/CHANGELOG.md +++ b/vendor/github.com/onsi/gomega/CHANGELOG.md @@ -1,3 +1,26 @@ +## 1.20.2 + +## Fixes +- label specs that rely on remote access; bump timeout on short-circuit test to make it less flaky [35eeadf] +- gexec: allow more headroom for SIGABRT-related unit tests (#581) [5b78f40] +- Enable reading from a closed gbytes.Buffer (#575) [061fd26] + +## Maintenance +- Bump github.com/onsi/ginkgo/v2 from 2.1.5 to 2.1.6 (#583) [55d895b] +- Bump github.com/onsi/ginkgo/v2 from 2.1.4 to 2.1.5 (#582) [346de7c] + +## 1.20.1 + +## Fixes +- fix false positive gleaks when using ginkgo -p (#577) [cb46517] +- Fix typos in gomega_dsl.go (#569) [5f71ed2] +- don't panic on Eventually(nil), fixing #555 (#567) [9d1186f] +- vet optional description args in assertions, fixing #560 (#566) [8e37808] + +## Maintenance +- test: add new Go 1.19 to test matrix (#571) [40d7efe] +- Bump tzinfo from 1.2.9 to 1.2.10 in /docs (#564) [5f26371] + ## 1.20.0 ## Features diff --git a/vendor/github.com/onsi/gomega/gomega_dsl.go b/vendor/github.com/onsi/gomega/gomega_dsl.go index 9b67f5190..60b1687ed 100644 --- a/vendor/github.com/onsi/gomega/gomega_dsl.go +++ b/vendor/github.com/onsi/gomega/gomega_dsl.go @@ -22,7 +22,7 @@ import ( "github.com/onsi/gomega/types" ) -const GOMEGA_VERSION = "1.20.0" +const GOMEGA_VERSION = "1.20.2" const nilGomegaPanic = `You are trying to make an assertion, but haven't registered Gomega's fail handler. If you're using Ginkgo then you probably forgot to put your assertion in an It(). @@ -34,7 +34,7 @@ Depending on your vendoring solution you may be inadvertently importing gomega a // to abstract between the standard package-level function implementations // and alternatives like *WithT. // -// The types in the top-level DSL have gotten a bit messy due to earlier depracations that avoid stuttering +// The types in the top-level DSL have gotten a bit messy due to earlier deprecations that avoid stuttering // and due to an accidental use of a concrete type (*WithT) in an earlier release. // // As of 1.15 both the WithT and Ginkgo variants of Gomega are implemented by the same underlying object @@ -83,7 +83,7 @@ func internalGomega(g Gomega) *internal.Gomega { return g.(*internal.Gomega) } -// NewWithT takes a *testing.T and returngs a `gomega.WithT` allowing you to use `Expect`, `Eventually`, and `Consistently` along with +// NewWithT takes a *testing.T and returns 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) { @@ -120,7 +120,7 @@ func RegisterTestingT(t types.GomegaTestingT) { // InterceptGomegaFailures runs a given callback and returns an array of // failure messages generated by any Gomega assertions within the callback. -// Exeuction continues after the first failure allowing users to collect all failures +// Execution continues after the first failure allowing users to collect all failures // in the callback. // // This is most useful when testing custom matchers, but can also be used to check @@ -247,7 +247,7 @@ There are several examples of values that can change over time. These can be pa will poll the channel repeatedly until it is closed. In this example `Eventually` will block until either the specified timeout of 50ms has elapsed or the channel is closed, whichever comes first. -Several Gomega libraries allow you to use Eventually in this way. For example, the gomega/gexec package allows you to block until a *gexec.Session exits successfuly via: +Several Gomega libraries allow you to use Eventually in this way. For example, the gomega/gexec package allows you to block until a *gexec.Session exits successfully via: Eventually(session).Should(gexec.Exit(0)) @@ -276,7 +276,7 @@ For example: will repeatedly poll client.FetchCount until the BeNumerically matcher is satisfied. (Note that this example could have been written as Eventually(client.FetchCount).Should(BeNumerically(">=", 17))) -If multple values are returned by the function, Eventually will pass the first value to the matcher and require that all others are zero-valued. This allows you to pass Eventually a function that returns a value and an error - a common patternin Go. +If multiple values are returned by the function, Eventually will pass the first value to the matcher and require that all others are zero-valued. 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: func FetchFromDB() (string, error) @@ -292,7 +292,7 @@ It is important to note that the function passed into Eventually is invoked *syn When testing complex systems it can be valuable to assert that a _set_ of assertions passes Eventually. Eventually supports this by accepting functions that take a single Gomega argument and return zero or more values. -Here's an example that makes some asssertions and returns a value and error: +Here's an example that makes some assertions and returns a value and error: Eventually(func(g Gomega) (Widget, error) { ids, err := client.FetchIDs() @@ -343,7 +343,7 @@ Consistently, like Eventually, enables making assertions on asynchronous behavio Consistently blocks when called for a specified duration. During that duration Consistently repeatedly polls its matcher and ensures that it is satisfied. If the matcher is consistently satisfied, then Consistently will pass. Otherwise Consistently will fail. -Both the total waiting duration and the polling interval are configurable as optional arguments. The first optional arugment is the duration that Consistently will run for (defaults to 100ms), and the second argument is the polling interval (defaults to 10ms). As with Eventually, these intervals can be passed in as time.Duration, parsable duration strings or an integer or float number of seconds. +Both the total waiting duration and the polling interval are configurable as optional arguments. The first optional argument is the duration that Consistently will run for (defaults to 100ms), and the second argument is the polling interval (defaults to 10ms). As with Eventually, these intervals can be passed in as time.Duration, parsable duration strings or an integer or float number of seconds. Consistently accepts the same three categories of actual as Eventually, check the Eventually docs to learn more. diff --git a/vendor/github.com/onsi/gomega/internal/assertion.go b/vendor/github.com/onsi/gomega/internal/assertion.go index b3c26889a..7b7bdd149 100644 --- a/vendor/github.com/onsi/gomega/internal/assertion.go +++ b/vendor/github.com/onsi/gomega/internal/assertion.go @@ -45,26 +45,31 @@ func (assertion *Assertion) Error() types.Assertion { func (assertion *Assertion) Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { assertion.g.THelper() + vetOptionalDescription("Assertion", optionalDescription...) return assertion.vet(assertion, optionalDescription...) && assertion.match(matcher, true, optionalDescription...) } func (assertion *Assertion) ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { assertion.g.THelper() + vetOptionalDescription("Assertion", optionalDescription...) return assertion.vet(assertion, optionalDescription...) && assertion.match(matcher, false, optionalDescription...) } func (assertion *Assertion) To(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { assertion.g.THelper() + vetOptionalDescription("Assertion", optionalDescription...) return assertion.vet(assertion, optionalDescription...) && assertion.match(matcher, true, optionalDescription...) } func (assertion *Assertion) ToNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { assertion.g.THelper() + vetOptionalDescription("Assertion", optionalDescription...) return assertion.vet(assertion, optionalDescription...) && assertion.match(matcher, false, optionalDescription...) } func (assertion *Assertion) NotTo(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { assertion.g.THelper() + vetOptionalDescription("Assertion", optionalDescription...) return assertion.vet(assertion, optionalDescription...) && assertion.match(matcher, false, optionalDescription...) } diff --git a/vendor/github.com/onsi/gomega/internal/async_assertion.go b/vendor/github.com/onsi/gomega/internal/async_assertion.go index 99f4ebcfe..126bbcb3f 100644 --- a/vendor/github.com/onsi/gomega/internal/async_assertion.go +++ b/vendor/github.com/onsi/gomega/internal/async_assertion.go @@ -40,7 +40,7 @@ func NewAsyncAssertion(asyncType AsyncAssertionType, actualInput interface{}, g } switch actualType := reflect.TypeOf(actualInput); { - case actualType.Kind() != reflect.Func: + case actualInput == nil || actualType.Kind() != reflect.Func: out.actualValue = actualInput case actualType.NumIn() == 0 && actualType.NumOut() > 0: out.actualIsFunc = true @@ -104,11 +104,13 @@ func (assertion *AsyncAssertion) WithPolling(interval time.Duration) types.Async func (assertion *AsyncAssertion) Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { assertion.g.THelper() + vetOptionalDescription("Asynchronous assertion", optionalDescription...) return assertion.match(matcher, true, optionalDescription...) } func (assertion *AsyncAssertion) ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { assertion.g.THelper() + vetOptionalDescription("Asynchronous assertion", optionalDescription...) return assertion.match(matcher, false, optionalDescription...) } diff --git a/vendor/github.com/onsi/gomega/internal/vetoptdesc.go b/vendor/github.com/onsi/gomega/internal/vetoptdesc.go new file mode 100644 index 000000000..f29587641 --- /dev/null +++ b/vendor/github.com/onsi/gomega/internal/vetoptdesc.go @@ -0,0 +1,22 @@ +package internal + +import ( + "fmt" + + "github.com/onsi/gomega/types" +) + +// vetOptionalDescription vets the optional description args: if it finds any +// Gomega matcher at the beginning it panics. This allows for rendering Gomega +// matchers as part of an optional Description, as long as they're not in the +// first slot. +func vetOptionalDescription(assertion string, optionalDescription ...interface{}) { + if len(optionalDescription) == 0 { + return + } + if _, isGomegaMatcher := optionalDescription[0].(types.GomegaMatcher); isGomegaMatcher { + panic(fmt.Sprintf("%s has a GomegaMatcher as the first element of optionalDescription.\n\t"+ + "Do you mean to use And/Or/SatisfyAll/SatisfyAny to combine multiple matchers?", + assertion)) + } +} diff --git a/vendor/github.com/operator-framework/api/pkg/validation/internal/good_practices.go b/vendor/github.com/operator-framework/api/pkg/validation/internal/good_practices.go index bdbdbe86f..8cd1ea62e 100644 --- a/vendor/github.com/operator-framework/api/pkg/validation/internal/good_practices.go +++ b/vendor/github.com/operator-framework/api/pkg/validation/internal/good_practices.go @@ -1,10 +1,13 @@ package internal import ( - goerrors "errors" "fmt" + "regexp" "strings" + goerrors "errors" + "github.com/blang/semver/v4" + "github.com/operator-framework/api/pkg/manifests" "github.com/operator-framework/api/pkg/operators/v1alpha1" operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" @@ -30,6 +33,9 @@ import ( // b) "An Operator shouldn't deploy or manage other operators (such patterns are known as meta or super operators or include CRDs in its Operands). It's the Operator Lifecycle Manager's job to manage the deployment and lifecycle of operators. For further information check Dependency Resolution: https://olm.operatorframework.io/docs/concepts/olm-architecture/dependency-resolution/" // // WARNING: if you create CRD's via the reconciliations or via the Operands then, OLM cannot handle CRDs migration and update, validation. +// - The bundle name (CSV.metadata.name) does not follow the naming convention: .v e.g. memcached-operator.v0.0.1 +// +// NOTE: The bundle name must be 63 characters or less because it will be used as k8s ownerref label which only allows max of 63 characters. var GoodPracticesValidator interfaces.Validator = interfaces.ValidatorFunc(goodPracticesValidator) func goodPracticesValidator(objs ...interface{}) (results []errors.ManifestResult) { @@ -60,6 +66,8 @@ func validateGoodPracticesFrom(bundle *manifests.Bundle) errors.ManifestResult { warns = append(warns, validateCrdDescriptions(bundle.CSV.Spec.CustomResourceDefinitions)...) warns = append(warns, validateHubChannels(bundle)) warns = append(warns, validateRBACForCRDsWith(bundle.CSV)) + warns = append(warns, checkBundleName(bundle.CSV)...) + for _, err := range errs { if err != nil { result.Add(errors.ErrFailedValidation(err.Error(), bundle.CSV.GetName())) @@ -96,6 +104,34 @@ func validateResourceRequests(csv *operatorsv1alpha1.ClusterServiceVersion) (err return errs, warns } +// checkBundleName will validate the operator bundle name informed via CSV.metadata.name. +// The motivation for the following check is to ensure that operators authors knows that operator bundles names should +// follow a name and versioning convention +func checkBundleName(csv *operatorsv1alpha1.ClusterServiceVersion) []error { + var warns []error + // Check if is following the semver + re := regexp.MustCompile("([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+)?$") + match := re.FindStringSubmatch(csv.Name) + + if len(match) > 0 { + if _, err := semver.Parse(match[0]); err != nil { + warns = append(warns, fmt.Errorf("csv.metadata.Name %v is not following the versioning "+ + "convention (MAJOR.MINOR.PATCH e.g 0.0.1): https://semver.org/", csv.Name)) + } + } else { + warns = append(warns, fmt.Errorf("csv.metadata.Name %v is not following the versioning "+ + "convention (MAJOR.MINOR.PATCH e.g 0.0.1): https://semver.org/", csv.Name)) + } + + // Check if its following the name convention + if len(strings.Split(csv.Name, ".v")) != 2 { + warns = append(warns, fmt.Errorf("csv.metadata.Name %v is not following the recommended "+ + "naming convention: .v e.g. memcached-operator.v0.0.1", csv.Name)) + } + + return warns +} + // validateHubChannels will check the channels. The motivation for the following check is to ensure that operators // authors knows if their operator bundles are or not respecting the Naming Convention Rules. // However, the operator authors still able to choose the names as please them. diff --git a/vendor/github.com/operator-framework/api/pkg/validation/internal/multiarch.go b/vendor/github.com/operator-framework/api/pkg/validation/internal/multiarch.go new file mode 100644 index 000000000..4321a73bd --- /dev/null +++ b/vendor/github.com/operator-framework/api/pkg/validation/internal/multiarch.go @@ -0,0 +1,623 @@ +package internal + +import ( + "encoding/json" + "fmt" + "os/exec" + "sort" + "strings" + + "github.com/operator-framework/api/pkg/manifests" + "github.com/operator-framework/api/pkg/validation/errors" + interfaces "github.com/operator-framework/api/pkg/validation/interfaces" +) + +// MultipleArchitecturesValidator validates the bundle against criteria to support Multiple Architectures. For further +// information check: https://olm.operatorframework.io/docs/advanced-tasks/ship-operator-supporting-multiarch/ +// +// This validator will inspect the images with the chosen container-tool. One of: [docker, podman, none] (By default docker) +// and then: (It is only used to $container-tool manifest inspect) +// +// - raise a error(s) when is possible to confirm that images do not provide the support defined via to the labels in the CSV +// +// - raise a warning when it is possible to check that the Operator manager image(s) supports architecture(s) not defined via labels. Therefore, it shows like the labels are missing. +// +// - raise warnings when it is possible to verify that the images defined in the CSV do not provide the same architecture(s) supported by the Operator manager image(s) or defined via the labels +// +// ### What is checked? +// +// On this check, we aggregate the archetype(s) and OS(s) provided via the labels and those which are found by checking the images so that, we can check: +// +// - If your CSV is missing labels +// +// - If your Operator bundle specifies images which do not support all archetypes found for your Operator image(s) (probably supported by your project) +// +// Note: To better guess the case scenarios where authors might have missed the labels, the following check will verify all architectures supported by the Operator image(s). However, by looking at the CSV we are not able to ensure what is the Operator image because this info is not provided. Therefore, we know by SDK the Operator image container will be called manager. +// +// ### How the Operator image(s) are identified? +// +// The container named as manager under the CSV Deployment InstallStrategy (`Spec.InstallStrategy.StrategySpec.DeploymentSpecs`) +// And if the above not found, all images under the InstallStrategy excluding the container named as `kube-rbac-proxy` since it is also scaffolded by default via SDK +var MultipleArchitecturesValidator interfaces.Validator = interfaces.ValidatorFunc(multipleArchitecturesValidate) + +// ContainerToolsKey defines the key which can be used by its consumers +// to inform where to find the container tool that should be used to inspect the image +const ContainerToolsKey = "container-tools" + +// operatorFrameworkArchLabel defines the label used to store the supported Arch on CSV +const operatorFrameworkArchLabel = "operatorframework.io/arch." + +// operatorFrameworkOSLabel stores the labels for the supported OS from the CSV +const operatorFrameworkOSLabel = "operatorframework.io/os." + +// default_container_scaffold_by_sdk defines the name of a default scaffold done by SDK +// it is useful for we are able to find the operator manager image more assertively +const default_container_scaffold_by_sdk = "kube-rbac-proxy" + +// multiArchValidator store the data to perform the tests +type multiArchValidator struct { + // infraCSVArchLabels store the arch labels (i.e amd64, ppc64le) from + // operatorframework.io/arch.: supported + infraCSVArchLabels []string + // InfraCVSOSLabels store the OS labels from + // operatorframework.io/os.: supported + infraCSVOSLabels []string + // allOtherImages stores the allOtherImages defined in the bundle with the platform.arch supported + allOtherImages map[string][]platform + // managerImages stores the images that we could consider as from the manager + managerImages map[string][]platform + // managerImagesString stores the images only + managerImagesString []string + // managerArchs contains a map of the arch types found + managerArchs map[string]string + // managerOs contains a map of the OSes found + managerOs map[string]string + // Store the bundle load + bundle *manifests.Bundle + // containerTool defines the container tool which will be used to inspect the allOtherImages + containerTool string + // warns stores the errors faced by the validator to return the warnings + warns []error + // warns stores the errors faced by the validator to return the warnings + errors []error +} + +// manifestInspect store the data obtained by running container-tool manifest inspect +type manifestInspect struct { + ManifestData []manifestData `json:"manifests"` +} + +// manifestData store the platforms +type manifestData struct { + Platform platform `json:"platform"` +} + +// platform store the Architecture and OS supported by the image +type platform struct { + Architecture string `json:"architecture"` + OS string `json:"os"` +} + +func multipleArchitecturesValidate(objs ...interface{}) (results []errors.ManifestResult) { + // Obtain the k8s version if informed via the objects an optional + var containerTool = "" + for _, obj := range objs { + switch obj.(type) { + case map[string]string: + // Check the key values informed + containerTool = obj.(map[string]string)[ContainerToolsKey] + if len(containerTool) > 0 { + // Make lower for we compare and use it + containerTool = strings.ToLower(containerTool) + break + } + } + } + + for _, obj := range objs { + switch v := obj.(type) { + case *manifests.Bundle: + results = append(results, validateMultiArchWith(v, containerTool)) + } + } + return results +} + +func validateMultiArchWith(bundle *manifests.Bundle, containerTool string) errors.ManifestResult { + result := errors.ManifestResult{} + if bundle == nil { + result.Add(errors.ErrInvalidBundle("bundle is nil", nil)) + return result + } + + result.Name = bundle.Name + + if bundle.CSV == nil { + result.Add(errors.ErrInvalidBundle("bundle csv is nil", bundle.Name)) + return result + } + + // Validate inputs. If a container-tool key be informed + // with an invalid/unsupported value then make no sense do the check + containerTool, err := validateContainerTool(containerTool) + if err != nil { + result.Add(errors.ErrFailedValidation(err.Error(), bundle.CSV.GetName())) + return result + } + + // Performs the checks + + multiArchValidator := multiArchValidator{bundle: bundle, containerTool: containerTool} + multiArchValidator.validate() + + for _, err := range multiArchValidator.warns { + // add the warn to the result + result.Add(errors.WarnFailedValidation(err.Error(), bundle.CSV.GetName())) + } + + for _, err := range multiArchValidator.errors { + // add the warn to the result + result.Add(errors.ErrFailedValidation(err.Error(), bundle.CSV.GetName())) + } + + return result +} + +// validateContainerTool verifies if the container tool informed is valid +func validateContainerTool(containerTool string) (string, error) { + if len(containerTool) == 0 || containerTool == "none" { + containerTool = "docker" + } else if containerTool != "docker" && containerTool != "podman" { + return containerTool, fmt.Errorf("invalid value (%s) for (%s). One of: [docker, podman, none] "+ + "(If not set, the default value is docker)", ContainerToolsKey, containerTool) + } + return containerTool, nil +} + +// validate performs all required checks to validate the bundle against the Multiple Architecture +// configuration to guess the missing labels and/or highlight what are the missing Architectures +// for the allOtherImages (for what is configured to be supported AND for what we guess that is supported +// and just is missing a label). +func (data *multiArchValidator) validate() { + data.loadInfraLabelsFromCSV() + data.loadImagesFromCSV() + data.managerImages = data.inspectImages(data.managerImages) + data.allOtherImages = data.inspectImages(data.allOtherImages) + data.loadAllPossibleArchSupported() + data.loadAllPossibleSoSupported() + data.doChecks() +} + +// loadInfraLabelsFromCSV will gather the respective labels from the CSV +func (data *multiArchValidator) loadInfraLabelsFromCSV() { + data.managerArchs = make(map[string]string) + data.managerOs = make(map[string]string) + + for k, v := range data.bundle.CSV.ObjectMeta.Labels { + if strings.Contains(k, operatorFrameworkArchLabel) && v == "supported" { + data.infraCSVArchLabels = append(data.infraCSVArchLabels, k) + } + } + for k, v := range data.bundle.CSV.ObjectMeta.Labels { + if strings.Contains(k, operatorFrameworkOSLabel) && v == "supported" { + data.infraCSVOSLabels = append(data.infraCSVOSLabels, k) + } + } +} + +// loadImagesFromCSV will add all allOtherImages found in the CSV +// it will be looking for all containers allOtherImages and what is defined +// via the spec.relatedImages (required for disconnect support) +func (data *multiArchValidator) loadImagesFromCSV() { + // We need to try looking for the manager image so that we can + // be more assertive in the guess to warning the Operator + // authors that when forgotten to use add the labels + // because we found images that provides more support + data.managerImages = make(map[string][]platform) + for _, v := range data.bundle.CSV.Spec.InstallStrategy.StrategySpec.DeploymentSpecs { + foundManager := false + // For the default scaffold we have a container called manager + for _, c := range v.Spec.Template.Spec.Containers { + if c.Name == "manager" && len(data.managerImages[c.Image]) == 0 { + data.managerImages[c.Image] = append(data.managerImages[c.Image], platform{}) + data.managerImagesString = append(data.managerImagesString, c.Image) + foundManager = true + break + } + } + // If we do not find a container called manager then we + // will add all from the Deployment Specs which is not the + // kube-rbac-proxy image scaffold by default + if !foundManager { + for _, c := range v.Spec.Template.Spec.Containers { + if c.Name != default_container_scaffold_by_sdk && len(data.managerImages[c.Image]) == 0 { + data.managerImages[c.Image] = append(data.managerImages[c.Image], platform{}) + data.managerImagesString = append(data.managerImagesString, c.Image) + } + } + } + } + + data.allOtherImages = make(map[string][]platform) + if data.bundle.CSV.Spec.InstallStrategy.StrategySpec.DeploymentSpecs != nil { + for _, v := range data.bundle.CSV.Spec.InstallStrategy.StrategySpec.DeploymentSpecs { + for _, c := range v.Spec.Template.Spec.Containers { + // If not be from manager the add + if len(data.managerImages[c.Image]) == 0 { + data.allOtherImages[c.Image] = append(data.allOtherImages[c.Image], platform{}) + } + } + } + } + + for _, v := range data.bundle.CSV.Spec.RelatedImages { + data.allOtherImages[v.Image] = append(data.allOtherImages[v.Image], platform{}) + } +} + +// runManifestInspect executes the command for we are able to check what +// are the Architecture(s) and SO(s) supported per each image found +func runManifestInspect(image, tool string) (manifestInspect, error) { + cmd := exec.Command(tool, "pull", image) + _, err := runCommand(cmd) + if err != nil { + return manifestInspect{}, err + } + + cmd = exec.Command(tool, "manifest", "inspect", image) + output, err := runCommand(cmd) + if err != nil { + return manifestInspect{}, err + } + + var inspect manifestInspect + if err := json.Unmarshal(output, &inspect); err != nil { + return manifestInspect{}, err + } + return inspect, nil +} + +// run executes the provided command within this context +func runCommand(cmd *exec.Cmd) ([]byte, error) { + command := strings.Join(cmd.Args, " ") + output, err := cmd.CombinedOutput() + if err != nil { + return output, fmt.Errorf("%s failed with error: (%v) %s", command, err, string(output)) + } + return output, nil +} + +// inspectAllOtherImages will perform the required steps to inspect all allOtherImages found +func (data *multiArchValidator) inspectImages(images map[string][]platform) map[string][]platform { + for k := range images { + manifest, err := runManifestInspect(k, data.containerTool) + if err != nil { + // try once more + manifest, err = runManifestInspect(k, data.containerTool) + if err != nil { + data.warns = append(data.warns, fmt.Errorf("unable to inspect the image (%s) : %s", k, err)) + + // We set the Arch and SO as error for we are able to deal witth these cases further + // Se that make no sense we raise a warning to notify the user that the image + // does not provide some kind of support only because we were unable to inspect it. + // Be aware that the validator raise warnings for all cases scenarios to let + // the author knows that those were not checked at all and why. + images[k][0] = platform{"error", "error"} + continue + } + } + + if manifest.ManifestData != nil { + for _, manifest := range manifest.ManifestData { + images[k] = append(images[k], manifest.Platform) + } + } + } + return images +} + +// doChecks centralize all checks which are done with this validator +func (data *multiArchValidator) doChecks() { + // the following check raise a error(s) when is possible to confirm that images does not provide the + // support defined via to the labels on the CSV + data.checkSupportDefined() + // Note that we can only check if the CSV is missing or not label after check all possible arch/so supported + // on the check above. The following check raise a warning when it is possible to check that the Operator + // manager image(s) supports architecture(s) not defined via labels. Therefore, it shows like the labels are missing + data.checkMissingLabelsForArchs() + data.checkMissingLabelsForSO() + // the following check will raise warnings when is possible to verify that the images defined in the CSV + // does not provide the same architecture(s) supported by the Operator manager or defined via the labels + data.checkMissingSupportForOtherImages() +} + +// checkMissingSupportForOtherImages checks if any image is missing some arch or so found +// (probably the image should support the arch or SO ) +func (data *multiArchValidator) checkMissingSupportForOtherImages() { + for image, plaformFromImage := range data.allOtherImages { + listArchNotFound := []string{} + for archFromList := range data.managerArchs { + found := false + for _, imageData := range plaformFromImage { + // Ignore the case when the Plataform.Architecture == "error" since that means + // that was not possible to inspect the image + if imageData.Architecture == "error" { + found = true + break + } + + if imageData.Architecture == archFromList { + found = true + break + } + } + if !found && archFromList != "error" { + listArchNotFound = append(listArchNotFound, archFromList) + } + } + if len(listArchNotFound) > 0 { + sort.Strings(listArchNotFound) + data.warns = append(data.warns, + fmt.Errorf("check if the image %s should not support %q. "+ + "Note that this CSV has labels for this Arch(s) "+ + "Your manager image %q are providing this support OR the CSV is configured via labels "+ + "to support it. Then, please verify if this image should not support it", + image, + listArchNotFound, + data.managerImagesString)) + } + + listAllSoNotFound := []string{} + for archOSList := range data.managerOs { + found := false + for _, imageData := range plaformFromImage { + // Ignore the case when the Plataform.Architecture == "error" since that means + // that was not possible to inspect the image + if imageData.OS == "error" { + found = true + break + } + + if imageData.OS == archOSList { + found = true + break + } + } + if !found && archOSList != "error" { + listAllSoNotFound = append(listAllSoNotFound, archOSList) + } + } + if len(listAllSoNotFound) > 0 { + sort.Strings(listAllSoNotFound) + data.warns = append(data.warns, + fmt.Errorf("check if the image %s should not support %q. "+ + "Note that this CSV has labels for this SO(s) "+ + "Your manager image %q are providing this support OR the CSV is configured via labels "+ + "to support it. Then, please verify if this image should not support it", + image, + listAllSoNotFound, + data.managerImagesString)) + } + } +} + +// verify if 1 or more allOtherImages has support for a SO not defined via the labels +// (probably the label for this SO is missing ) +func (data *multiArchValidator) checkMissingLabelsForSO() { + notFoundSoLabel := []string{} + for supported := range data.managerOs { + found := false + for _, infra := range data.infraCSVOSLabels { + if strings.Contains(infra, supported) { + found = true + break + } + } + // If the value is linux and no labels were added to the CSV then it is fine + if !found && supported != "error" { + // if the only arch supported is linux then, we should not ask for the label + if !(supported == "linux" && len(data.managerOs) == 1 && len(data.managerOs["linux"]) > 0) { + notFoundSoLabel = append(notFoundSoLabel, supported) + } + + } + } + + if len(notFoundSoLabel) > 0 { + // We need to sort, otherwise it is possible verify in the tests that we have + // this message as result + sort.Strings(notFoundSoLabel) + data.warns = append(data.warns, + fmt.Errorf("check if the CSV is missing the label (%s) for the SO(s): %q. "+ + "Be aware that your Operator manager image %q provides this support. "+ + "Thus, it is very likely that you want to provide it and if you support more than linux SO you MUST,"+ + "use the required labels for all which are supported."+ + "Otherwise, your solution cannot be listed on the cluster for these architectures", + operatorFrameworkOSLabel, + notFoundSoLabel, + data.managerImagesString)) + } +} + +// checkMissingLabelsForArchs verify if 1 or ore allOtherImages has support for a Arch not defined via the labels +// (probably the label for this Arch is missing ) +func (data *multiArchValidator) checkMissingLabelsForArchs() { + notFoundArchLabel := []string{} + for supported := range data.managerArchs { + found := false + for _, infra := range data.infraCSVArchLabels { + if strings.Contains(infra, supported) { + found = true + break + } + } + // If the value is amd64 and no labels were added to the CSV then it is fine + if !found && supported != "error" { + // if the only arch supported is amd64 then we should not ask for the label + if !(supported == "amd64" && len(data.managerArchs) == 1 && len(data.managerArchs["amd64"]) > 0) { + notFoundArchLabel = append(notFoundArchLabel, supported) + } + } + } + + if len(notFoundArchLabel) > 0 { + // We need to sort, otherwise it is possible verify in the tests that we have + // this message as result + sort.Strings(notFoundArchLabel) + + data.warns = append(data.warns, + fmt.Errorf("check if the CSV is missing the label (%s) for the Arch(s): %q. "+ + "Be aware that your Operator manager image %q provides this support. "+ + "Thus, it is very likely that you want to provide it and if you support more than amd64 architectures, you MUST,"+ + "use the required labels for all which are supported."+ + "Otherwise, your solution cannot be listed on the cluster for these architectures", + operatorFrameworkArchLabel, + notFoundArchLabel, + data.managerImagesString)) + } +} + +func (data *multiArchValidator) loadAllPossibleArchSupported() { + // Add the values provided via label + for _, v := range data.infraCSVArchLabels { + label := extractValueFromArchLabel(v) + data.managerArchs[label] = label + } + + // If a CSV does not include an arch label, it is treated as if it has the following AMD64 support label by default + if len(data.infraCSVArchLabels) == 0 { + data.managerArchs["amd64"] = "amd64" + } + + // Get all ARCH from the provided allOtherImages + for _, imageData := range data.managerImages { + for _, plataform := range imageData { + if len(plataform.Architecture) > 0 { + data.managerArchs[plataform.Architecture] = plataform.Architecture + } + } + } +} + +// loadAllPossibleSoSupported will verify all SO that this bundle can support +// for then, we aare able to check if it is missing labels. +// Note: +// - we check what are the SO of all allOtherImages informed +// - we ensure that the linux SO will be added when none so labels were informed +// - we check all labels to know what are the SO(s) to obtain the list of them which the bundle is defining +func (data *multiArchValidator) loadAllPossibleSoSupported() { + // Add the values provided via label + for _, v := range data.infraCSVOSLabels { + label := extractValueFromSoLabel(v) + data.managerOs[label] = label + } + + // If a ClusterServiceVersion does not include an os label, a target OS is assumed to be linux + if len(data.infraCSVOSLabels) == 0 { + data.managerOs["linux"] = "linux" + } + + // Get all SO from the provided allOtherImages + for _, imageData := range data.managerImages { + for _, plataform := range imageData { + if len(plataform.OS) > 0 { + data.managerOs[plataform.OS] = plataform.OS + } + } + } +} + +// checkSupportDefined checks if all allOtherImages supports the ARCHs and SOs defined +func (data *multiArchValidator) checkSupportDefined() { + configuredS0 := []string{} + if len(data.infraCSVOSLabels) == 0 { + configuredS0 = []string{"linux"} + } + + for _, label := range data.infraCSVOSLabels { + configuredS0 = append(configuredS0, extractValueFromSoLabel(label)) + } + + configuredArch := []string{} + if len(data.infraCSVArchLabels) == 0 { + configuredArch = []string{"amd64"} + } + + for _, label := range data.infraCSVArchLabels { + configuredArch = append(configuredArch, extractValueFromArchLabel(label)) + } + + allSupportedConfiguration := []string{} + for _, so := range configuredS0 { + for _, arch := range configuredArch { + allSupportedConfiguration = append(allSupportedConfiguration, fmt.Sprintf("%s.%s", so, arch)) + } + } + + notFoundImgPlat := map[string][]string{} + for _, config := range allSupportedConfiguration { + for image, allPlataformFromImage := range data.managerImages { + found := false + for _, imgPlat := range allPlataformFromImage { + // Ignore the errors since they mean that was not possible to inspect + // the image + if imgPlat.OS == "error" { + found = true + break + } + + if config == fmt.Sprintf("%s.%s", imgPlat.OS, imgPlat.Architecture) { + found = true + break + } + } + + if !found { + notFoundImgPlat[config] = append(notFoundImgPlat[config], image) + } + } + for image, allPlataformFromImage := range data.allOtherImages { + found := false + for _, imgPlat := range allPlataformFromImage { + // Ignore the errors since they mean that was not possible to inspect + // the image + if imgPlat.OS == "error" { + found = true + break + } + + if config == fmt.Sprintf("%s.%s", imgPlat.OS, imgPlat.Architecture) { + found = true + break + } + } + + if !found { + notFoundImgPlat[config] = append(notFoundImgPlat[config], image) + } + } + } + + if len(notFoundImgPlat) > 0 { + for platform, images := range notFoundImgPlat { + // If we not sort the allOtherImages we cannot check its result in the tests + sort.Strings(images) + data.errors = append(data.errors, + fmt.Errorf("not all images specified are providing the support described via the CSV labels. "+ + "Note that (SO.architecture): (%s) was not found for the image(s) %s", + platform, images)) + } + } +} + +// extractValueFromSoLabel returns only the value of the SO label (i.e. linux) +func extractValueFromSoLabel(v string) string { + label := strings.ReplaceAll(v, operatorFrameworkOSLabel, "") + return label +} + +// extractValueFromArchLabel returns only the value of the ARCH label (i.e. amd64) +func extractValueFromArchLabel(v string) string { + label := strings.ReplaceAll(v, operatorFrameworkArchLabel, "") + return label +} diff --git a/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go b/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go index cca7eddac..ac9fd0cf5 100644 --- a/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go +++ b/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go @@ -8,7 +8,6 @@ import ( "net/url" "os" "path/filepath" - "regexp" "strings" "github.com/blang/semver/v4" @@ -111,10 +110,6 @@ import ( // - If informed ONLY, check if the value csv.Spec.MinKubeVersion is parsable according to semver (https://semver.org/) // Also, this validator will raise warnings when: // -// - The bundle name (CSV.metadata.name) does not follow the naming convention: .v e.g. memcached-operator.v0.0.1 -// -// NOTE: The bundle name must be 63 characters or less because it will be used as k8s ownerref label which only allows max of 63 characters. -// // - The channel names seems are not following the convention https://olm.operatorframework.io/docs/best-practices/channel-naming/ // // - The usage of the removed APIs on Kubernetes 1.22 is found. More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22 @@ -230,7 +225,6 @@ func validateHubCSVSpec(csv v1alpha1.ClusterServiceVersion) CSVChecks { checks = checkSpecVersion(checks) checks = checkSpecIcon(checks) checks = checkSpecMinKubeVersion(checks) - checks = checkBundleName(checks) return checks } @@ -241,34 +235,6 @@ type CSVChecks struct { warns []error } -// checkBundleName will validate the operator bundle name informed via CSV.metadata.name. -// The motivation for the following check is to ensure that operators authors knows that operator bundles names should -// follow a name and versioning convention -func checkBundleName(checks CSVChecks) CSVChecks { - - // Check if is following the semver - re := regexp.MustCompile("([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+)?$") - match := re.FindStringSubmatch(checks.csv.Name) - - if len(match) > 0 { - if _, err := semver.Parse(match[0]); err != nil { - checks.warns = append(checks.warns, fmt.Errorf("csv.metadata.Name %v is not following the versioning "+ - "convention (MAJOR.MINOR.PATCH e.g 0.0.1): https://semver.org/", checks.csv.Name)) - } - } else { - checks.warns = append(checks.warns, fmt.Errorf("csv.metadata.Name %v is not following the versioning "+ - "convention (MAJOR.MINOR.PATCH e.g 0.0.1): https://semver.org/", checks.csv.Name)) - } - - // Check if its following the name convention - if len(strings.Split(checks.csv.Name, ".v")) < 2 { - checks.warns = append(checks.errs, fmt.Errorf("csv.metadata.Name %v is not following the recommended "+ - "naming convention: .v e.g. memcached-operator.v0.0.1", checks.csv.Name)) - } - - return checks -} - // checkSpecMinKubeVersion will validate the spec minKubeVersion informed via CSV.spec.minKubeVersion func checkSpecMinKubeVersion(checks CSVChecks) CSVChecks { if len(strings.TrimSpace(checks.csv.Spec.MinKubeVersion)) == 0 { diff --git a/vendor/github.com/operator-framework/api/pkg/validation/validation.go b/vendor/github.com/operator-framework/api/pkg/validation/validation.go index 1d87737fa..2f3f61eab 100644 --- a/vendor/github.com/operator-framework/api/pkg/validation/validation.go +++ b/vendor/github.com/operator-framework/api/pkg/validation/validation.go @@ -59,6 +59,10 @@ var AlphaDeprecatedAPIsValidator = internal.AlphaDeprecatedAPIsValidator // GoodPracticesValidator implements Validator to validate the criteria defined as good practices var GoodPracticesValidator = internal.GoodPracticesValidator +// MultipleArchitecturesValidator implements Validator to validate MultipleArchitectures configuration. For further +// information check: https://olm.operatorframework.io/docs/advanced-tasks/ship-operator-supporting-multiarch/ +var MultipleArchitecturesValidator = internal.MultipleArchitecturesValidator + // AllValidators implements Validator to validate all Operator manifest types. var AllValidators = interfaces.Validators{ PackageManifestValidator, @@ -71,6 +75,7 @@ var AllValidators = interfaces.Validators{ CommunityOperatorValidator, AlphaDeprecatedAPIsValidator, GoodPracticesValidator, + MultipleArchitecturesValidator, } var DefaultBundleValidators = interfaces.Validators{ diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/manifests.go b/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/manifests.go index 2c7fa60b0..e6e8a7375 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/manifests.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/bindata/olm/manifests.go @@ -1,12 +1,11 @@ -// Code generated by go-bindata. (@generated) DO NOT EDIT. - -//Package olm generated by go-bindata.// sources: -// olm-manifests/0.19.1-crds.yaml -// olm-manifests/0.19.1-olm.yaml +// Code generated by go-bindata. DO NOT EDIT. +// sources: // olm-manifests/0.20.0-crds.yaml // olm-manifests/0.20.0-olm.yaml // olm-manifests/0.21.2-crds.yaml // olm-manifests/0.21.2-olm.yaml +// olm-manifests/0.22.0-crds.yaml +// olm-manifests/0.22.0-olm.yaml package olm import ( @@ -24,7 +23,7 @@ import ( func bindataRead(data []byte, name string) ([]byte, error) { gz, err := gzip.NewReader(bytes.NewBuffer(data)) if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) + return nil, fmt.Errorf("Read %q: %v", name, err) } var buf bytes.Buffer @@ -32,7 +31,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) + return nil, fmt.Errorf("Read %q: %v", name, err) } if clErr != nil { return nil, err @@ -53,152 +52,141 @@ type bindataFileInfo struct { modTime time.Time } -// Name return file name func (fi bindataFileInfo) Name() string { return fi.name } - -// Size return file size func (fi bindataFileInfo) Size() int64 { return fi.size } - -// Mode return file mode func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode } - -// ModTime return file modify time func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime } - -// IsDir return file whether a directory func (fi bindataFileInfo) IsDir() bool { - return fi.mode&os.ModeDir != 0 + return false } - -// Sys return file is sys mode func (fi bindataFileInfo) Sys() interface{} { return nil } -var _olmManifests0191CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x77\xe3\xb6\xb5\x30\x80\xfe\xde\xbf\x02\xcb\xcd\xf9\x6c\x37\x92\x3c\x93\xf4\xe4\x3b\xf5\x6d\x4f\x96\x6b\x3b\xa9\x6f\x66\x3c\x5a\xb6\x93\x7c\xbd\x33\x39\x29\x44\x6e\x49\x38\x26\x01\x16\x00\x65\xab\x27\xe7\x7f\xbf\x0b\x1b\x00\x1f\x7a\x59\x22\x39\xe3\xc7\x00\x5d\xab\x19\x8b\xe4\x26\xb8\x01\xec\xf7\xa3\xdf\xef\xff\x8e\x66\xec\x27\x90\x8a\x09\x7e\x4c\x68\xc6\xe0\x5e\x03\x37\x7f\xa9\xc1\xed\x7f\xa8\x01\x13\x47\xb3\xd7\xbf\xbb\x65\x3c\x3e\x26\xa7\xb9\xd2\x22\xbd\x02\x25\x72\x19\xc1\x19\x8c\x19\x67\x9a\x09\xfe\xbb\x14\x34\x8d\xa9\xa6\xc7\xbf\x23\x84\x72\x2e\x34\x35\x3f\x2b\xf3\x27\x21\x91\xe0\x5a\x8a\x24\x01\xd9\x9f\x00\x1f\xdc\xe6\x23\x18\xe5\x2c\x89\x41\x22\x70\xff\xea\xd9\xab\xc1\x37\x83\x57\xbf\x23\x24\x92\x80\x8f\xdf\xb0\x14\x94\xa6\x69\x76\x4c\x78\x9e\x24\xbf\x23\x84\xd3\x14\x8e\x49\x44\x35\x4d\xc4\xc4\x4e\x42\x0d\x44\x06\x92\x6a\x21\xd5\x20\x12\x12\x84\xf9\x4f\xfa\x3b\x95\x41\x64\xde\x3e\x91\x22\xcf\x8e\xc9\xca\x7b\x2c\x3c\x3f\x49\xaa\x61\x22\x24\xf3\x7f\x13\xd2\x27\x22\x49\xf1\xdf\xee\xe3\xed\x6b\xaf\xf1\xb5\xf8\x7b\xc2\x94\xfe\x61\xf9\xda\x1b\xa6\x34\x5e\xcf\x92\x5c\xd2\x64\x71\xc2\x78\x49\x4d\x85\xd4\x97\xe5\xeb\xcd\xeb\x22\xaa\x95\x8c\xec\x65\xc6\x27\x79\x42\xe5\xc2\xb3\xbf\x23\x44\x45\x22\x83\x63\x82\x8f\x66\x34\x82\xf8\x77\x84\x38\x14\x3a\x50\x7d\x42\xe3\x18\x97\x85\x26\x43\xc9\xb8\x06\x79\x2a\x92\x3c\xe5\xc5\xab\xcc\x3d\x31\xa8\x48\xb2\x4c\x23\xea\x6f\xa6\x40\x32\x09\x5a\xcf\x11\x25\x44\x8c\x89\x9e\x82\x7f\x77\xf1\x14\x21\xff\xad\x04\x1f\x52\x3d\x3d\x26\x03\x83\xe1\x41\xcc\x54\x96\xd0\xb9\x99\x4d\xe5\x2e\xbb\x4c\x67\xf6\x5a\xe5\x77\x3d\x37\x53\x57\x5a\x32\x3e\xd9\x34\x15\x73\xdf\xf6\x73\xb0\xa8\xb9\x99\x67\xcb\x53\x58\xf8\x71\xdb\xf7\x67\xf9\x28\x61\x6a\x0a\x72\xfb\x49\x14\x8f\x2c\xcd\x61\xb8\xe2\xca\x9a\x89\x54\x80\xfa\x03\x35\x58\x3a\x0c\x4b\x2f\x38\x99\x2c\x7f\x63\x4c\xb5\xff\xd1\xde\x34\x7b\x4d\x93\x6c\x4a\x5f\xbb\x1f\x55\x34\x85\x94\x96\xfb\x41\x64\xc0\x4f\x86\x17\x3f\x7d\x7d\xbd\x70\x81\xd4\xb1\x53\xdb\xe7\x84\x29\x42\x89\x84\x4c\x28\xa6\x85\x9c\x1b\x6c\x9d\x5e\xff\xa4\x7a\xe4\xf4\xea\x4c\xf5\x08\xe5\x71\x71\xf0\x48\x46\xa3\x5b\x3a\x01\x35\x58\x9a\xab\x18\xfd\x37\x44\xba\xf2\xb3\x84\x7f\xe6\x4c\x42\x5c\x9d\x85\x41\x8f\xc7\xc9\xc2\xcf\x06\xff\x95\x9f\x32\x69\xde\xa9\x2b\x07\xd9\x8e\x0a\x95\xab\xfd\xbe\xf0\x85\xfb\x06\x0d\xf6\x3e\x12\x1b\x02\x07\x0a\xb7\x80\x3b\x63\x10\x3b\xdc\xd9\xad\xc1\x94\xf9\x7e\x09\x0a\xb8\x25\x79\xe6\x67\xca\xdd\x37\x0d\xc8\x35\x48\xf3\xa0\x39\xee\x79\x12\x1b\x4a\x38\x03\xa9\x89\x84\x48\x4c\x38\xfb\x57\x01\x4d\x11\x2d\xf0\x35\x09\xd5\xa0\x34\xc1\x53\xcb\x69\x42\x66\x34\xc9\xc1\xa2\x32\xa5\x73\x22\xc1\xc0\x25\x39\xaf\x40\xc0\x5b\xd4\x80\xbc\x15\x12\x08\xe3\x63\x71\x4c\xa6\x5a\x67\xea\xf8\xe8\x68\xc2\xb4\xa7\xe1\x91\x48\xd3\x9c\x33\x3d\x3f\x42\x72\xcc\x46\xb9\x21\x87\x47\x31\xcc\x20\x39\x52\x6c\xd2\xa7\x32\x9a\x32\x0d\x91\xce\x25\x1c\xd1\x8c\xf5\x71\xb2\x1c\xe9\xf8\x20\x8d\x7f\x2f\x1d\xd5\x57\xfb\x0b\xe8\x5b\xb9\x99\x89\x27\x9b\x1b\x71\x6d\x88\xa7\xdd\x45\xf6\x71\xfb\x2d\x25\x4a\xcd\x4f\x06\x2b\x57\xe7\xd7\x37\xc4\x4f\xc0\xa2\xdd\x62\xb8\xbc\x55\x95\xc8\x36\x88\x62\x7c\x0c\xd2\xde\x39\x96\x22\x45\x28\xc0\xe3\x4c\x30\xae\xed\x91\x4e\x18\x70\x4d\x54\x3e\x4a\x99\x56\xb8\xe7\x40\x69\xb3\x0e\x03\x72\x8a\x2c\x8c\x8c\x80\xe4\x99\x39\x49\xf1\x80\x5c\x70\x72\x4a\x53\x48\x4e\xa9\x82\x8f\x8e\x6a\x83\x51\xd5\x37\xe8\xdb\x1e\xd9\x55\x0e\xbc\xfc\xc0\xd2\x19\x23\xc4\x73\xc8\xad\x6e\x5e\x77\x28\x89\x3d\x81\xab\x28\x30\xd9\x70\x16\xcd\xa0\x71\x2c\x41\xad\xb8\xb0\x74\x20\xed\x8d\x76\x9f\x4c\x85\x32\xeb\x47\x35\x79\xf7\xe6\x2d\x89\x28\x27\xb9\x02\x73\x78\x22\xc1\xb9\xd9\x10\x5a\x10\x6a\x78\x59\x1f\xee\x99\xc2\x0d\x24\x61\xc2\x94\x96\xf3\x01\xf9\x4e\xc8\x94\xea\x63\xf2\x67\xff\x53\x1f\xc1\x09\x49\x58\xf6\x9f\xc7\x7f\xce\x84\xd4\xff\x49\xde\xf1\x64\x6e\x80\xc6\xe4\x6e\x0a\x9c\x5c\x17\xdf\x46\xfe\x52\xf9\xe3\x7b\x99\x45\x03\x72\x31\xe1\x42\xfa\x3b\xcd\xae\xba\x48\xe9\x04\xc8\x98\x41\x82\xfb\x5a\x81\x1e\x2c\xae\xe0\xc6\x55\x24\x56\x5c\x1a\xb3\xc9\x5b\x9a\x3d\x88\x9a\x53\x7f\xa7\x79\x97\x79\x7d\x95\x79\x97\x17\xb5\xc0\xad\x6c\x3e\xc9\xfc\x93\x46\xb7\x84\xba\xb7\xa4\x34\xeb\x2b\x3c\x36\x15\x34\x6d\x87\x81\x53\x0f\xc0\xe0\xaf\xfc\xf9\xc2\x51\xae\xc1\xae\x9f\x5d\xfd\xb2\x9d\x9f\x2d\xc5\x90\x07\x91\xf6\x76\x15\x17\xd9\xe2\x1d\x2c\xda\x34\xb1\x95\x67\x86\x6c\x3c\x37\x04\xcf\xce\x88\x2a\xf8\xe6\x8f\x6b\x26\x64\xb9\x5e\xcc\xa8\x5e\x3e\x5b\xe4\x81\xf3\x65\x46\x09\x7c\xf5\xf5\x07\x3e\x99\x20\x5d\x71\xaf\x6f\x04\x81\x99\xf3\xf0\xe0\x92\xd8\x53\x63\xce\x37\x2f\x04\x86\xbe\xdf\x8f\xa8\x3e\x50\xc6\x41\x5a\x68\x66\x0f\x33\xae\x34\xe5\x9a\x51\x0d\x28\x81\xb8\xd3\xec\x76\xf2\x1d\xd3\xd3\x6d\x77\xb1\x3b\xc7\x63\xe2\xd8\x48\x0f\xcf\x8e\xa3\x4d\xe5\x41\x66\xf6\xa0\xef\xbc\xa9\x33\xc9\x84\x64\x7a\xfe\x30\x95\x1b\xba\x3b\xdd\x3b\xa9\x52\x6c\xc2\x0d\xc5\xbb\x03\x36\x99\x6a\x2f\x1f\x38\x49\x94\x78\x56\x28\xfc\x2b\xd8\xbf\x0c\x63\x84\x94\x28\x61\xe9\x23\xd3\x48\x1e\x47\x60\x10\xa8\xf2\x14\x62\x32\x9a\x23\x8c\x18\x32\xe0\x31\xf0\x68\x8e\x3c\x35\x99\x81\x1c\x90\x1f\x95\x59\x29\xf2\x37\x36\x31\x72\xaf\x7b\x29\xe3\x31\x33\x8a\x91\xb2\x20\x91\x9d\x2e\xcc\x80\x29\x83\xba\x31\x48\x43\x07\x85\x41\x7f\x22\xee\x0a\x08\x10\x2f\xdc\xaf\x48\x9c\x23\xa7\x5f\x9c\x44\x6e\xf0\x30\x40\xf1\x5b\x52\x3e\x29\xc8\x98\xc7\xa0\x13\x0d\xcc\x27\x4d\x84\xe5\xe9\x28\x77\xb2\x19\x62\x81\xc3\x84\xe2\xbf\x99\x25\xc4\x05\x0c\xc6\xf5\xd7\x5f\x59\xb8\x31\x8c\x69\x9e\x68\x07\x09\x19\xc5\xc2\xc7\x98\x9d\x43\x72\x6e\x91\x0f\x71\xf9\xf2\x3b\x14\xdf\x46\x40\x5e\x59\x50\xab\x9e\x33\xaf\x55\x86\x00\xd7\xa7\xac\xc8\x1d\x4b\x12\xf3\xac\xa4\xfc\x16\x62\x92\xc0\x3d\x8b\xc4\x44\xd2\x6c\xca\x22\x9a\x24\x73\x3c\xa6\x31\x11\x9c\x18\x49\xc4\xd0\xf0\x0d\x4c\xc3\x48\x86\x93\x9a\x32\xe1\x76\x9a\x57\x33\x76\x26\x9e\x0a\x22\x09\xfa\x61\x46\x7c\x6d\xef\x2b\x45\x2e\xc3\xde\x0c\x8a\x1d\x00\xbb\x47\xdc\x9e\xf3\xdc\x86\x46\x91\x39\x48\xb8\x75\x05\xd7\x46\x50\x5b\x50\xaa\x06\xe4\x42\x9b\x5d\x34\x32\x72\xaf\x16\xe4\x16\x20\xb3\x3b\xcd\xa8\xd7\x44\xa5\x34\x49\x7a\x46\x21\x8e\x80\x00\x8d\xa6\x16\x9d\x1c\x1c\x37\x03\xa2\x25\x83\x98\x8c\x85\x24\x30\x03\x43\x2f\xdc\xda\x00\x37\xdc\x6c\x2d\x36\xa8\x94\x35\xe5\xd4\x0f\xa6\x21\x5d\x43\x4e\x37\xa3\xb1\xa0\x29\x0f\x63\xb2\xa4\x45\x8e\x71\x7b\x8d\x57\x95\xc6\x85\x1d\x5e\x6d\xa5\xd4\x6b\x2d\xa9\x86\xc9\xc3\xb4\xe6\xc7\xda\xed\x85\x96\x33\x15\x77\x5e\xde\x5d\x3a\xe4\x86\xf0\x2a\xbf\xb6\x31\x53\x91\x39\xe9\x10\x1b\x21\x43\x31\x65\xd7\x94\x72\xab\xb6\xcc\x68\x62\xb7\x82\x07\x9c\x89\x24\xc1\x23\x9f\x4b\xab\x23\x19\x6d\x86\x72\x02\xe9\x08\xe2\xd8\xe8\x40\x7e\x2a\x6b\xd8\xdc\x03\x2c\xf6\x21\x2e\xe8\xf9\xc3\x50\x24\xc9\x66\x2e\xb6\xf6\x15\xdb\xbc\xc6\x0c\x8f\x80\xf5\x77\x2c\xb2\x3e\x8f\x31\xa6\x8a\x33\x13\x83\x06\x99\x32\x0e\x76\x6b\xb0\x14\x4a\xc4\x8e\x40\xdf\x01\x70\x12\x4d\x21\xba\x2d\x8e\x92\xd3\x1a\x17\x56\xcd\xa9\xac\x75\x8a\x55\x2a\xe4\x22\x49\x50\xed\x54\x00\x84\x8d\x09\x25\x1c\xee\xfc\x33\x0b\x67\xb4\x42\xec\xe9\x8c\xb2\x84\x8e\x12\x40\xae\x59\xfc\xd5\xab\x69\xaf\x9e\x9f\x67\x79\x92\x40\x8c\xeb\x3d\xb9\x1a\x9e\x12\x2d\xe9\x78\xcc\x22\x73\x29\x66\x12\x22\x6d\x3f\x78\xed\x27\xac\x3a\xbd\xf5\x15\x5b\x71\x22\x94\xa6\x3a\x5f\x5a\xa3\x0d\x0b\xbc\x69\x61\x23\xc1\xad\x2d\xed\x61\xfa\x78\x55\xa8\xa2\x96\x15\x68\x23\x9d\x98\x73\x51\xb7\x9a\x0c\xc8\xa5\xd0\x60\x4f\xc8\x5b\x50\x86\xed\x22\x82\xae\x80\x2a\xc1\x2b\xd4\xd5\x00\x11\x92\x4d\x18\xa7\x89\xfb\x28\xd4\x39\x8d\x0e\xc3\x04\xef\x91\xbb\x29\x8b\xa6\xa8\xed\x8e\x80\xa4\x6c\x22\xa9\x2e\x88\x62\x39\x6f\xc7\x5d\x1c\x5f\x1c\xe7\x46\xe9\x1c\x90\x13\x3e\xc7\xf5\x1e\x03\x35\x3f\x18\xc8\x5a\x8a\x38\x8f\x8c\xbc\x64\x08\xac\x51\xab\x4a\x20\x9d\x92\xd1\x1a\xd6\xf6\x4e\xfd\x4b\xbc\xa0\xa7\xcc\x01\xa0\x2c\x51\x48\xd3\x05\x07\x42\x8d\xae\xaa\x8b\x3d\x99\x4b\x89\xdc\xc7\x23\x18\x99\xc5\xc9\xf0\x82\x78\xc3\xf4\x80\xf4\xfb\x7d\x72\x63\x7e\x56\x5a\xe6\x11\xf2\x17\x73\x84\x78\xec\x38\x85\xdd\x7d\xf8\x91\x14\xc5\x4e\xfc\x0c\x42\x2d\xd6\xad\x08\x96\x51\x3d\x25\x03\x8b\xf8\x41\x05\x15\xc4\xe8\x91\x04\xee\x69\x9a\xe1\xbe\x37\xa4\xfb\x3b\x21\xae\xed\x0a\xd9\x17\xfe\x0f\x7e\xe8\xd1\xd1\xe2\xa6\x10\x23\x23\xa3\x5a\xe3\xb8\xdd\x1b\x63\x21\xf6\x55\xfd\x9b\x06\xfe\xe1\x1f\xb8\xb8\xe3\xab\xa6\x80\xef\xa4\x12\x8e\xc9\x87\xbd\x13\x7f\x04\x3f\xec\xf5\xc8\x87\xbd\xa1\x14\x13\x23\xbb\x32\x3e\x31\x3f\x98\x9d\xf5\x61\xef\x0c\x26\x92\xc6\x10\x7f\xd8\xf3\xa0\xbf\xcc\xa8\x8e\xa6\x6f\x41\x4e\xe0\x07\x98\xff\x05\x01\xd6\x2e\x79\xf6\xf0\x97\xd4\xdc\x53\x5c\x33\x3c\xd9\x30\xae\xbf\x18\xc5\xaf\xfa\xe3\x5b\x9a\xd5\x00\x9d\x96\x1b\xf0\xfd\x2f\x29\x68\x3a\x7b\x3d\x28\x97\xfa\x1f\xff\xad\x04\x3f\xfe\xb0\x57\x7e\x53\x4f\xa4\x66\xcb\x64\x7a\xfe\x61\x8f\xd4\x66\x70\xfc\x61\x0f\xe7\xe0\x7f\xf7\x93\x3e\xfe\xb0\x67\xde\x66\x7e\x96\x42\x8b\x51\x3e\x3e\xfe\xb0\x37\x9a\x6b\x50\xbd\xd7\x3d\x09\x59\xcf\x48\x52\x7f\x29\xdf\xf0\x61\xef\x1f\xe4\x03\xf7\x93\x16\xda\xc8\xb9\xb8\xd2\x8a\xfc\xef\xde\x06\x7e\xbf\x81\x29\x6c\x56\xee\x8c\xf6\x96\x50\xa5\x6f\x24\xe5\x8a\x79\x23\xee\xda\x5b\x53\x4b\x0c\xd6\x5e\x97\x48\x20\xd6\x5e\xb6\xbb\x64\xed\xe5\x35\xac\x75\x1b\xb6\xb6\xfc\x0d\xeb\xd9\x5b\xed\x6c\x2f\x3f\xe8\xe5\x1d\x73\xc5\x72\x36\x27\x19\xba\x7d\xa1\x8b\xbb\xcd\x41\x35\x42\xbe\x39\xff\x8e\xf8\x19\x71\x92\xe3\xba\x0d\xdc\xe1\x9e\x7a\xb1\xbc\x30\xc0\xe4\x3c\x06\x99\xcc\x8d\xb8\x51\x42\x8d\xa6\x46\x1b\x88\x07\xc4\xb0\x2c\xab\x1c\x29\xc2\x85\x26\xb7\xe6\x80\x21\xeb\xe2\x24\x57\xde\xda\x88\xf3\x2a\x20\x1a\xc2\x62\x09\x82\x03\x83\x5c\x30\x8a\x20\xd3\xc8\x06\xd7\xa2\xe2\x41\xd5\xda\x8c\xb1\x33\x49\x19\xb1\xab\xaf\xd7\x6f\x0f\xb7\x39\xb6\x44\xbc\xbb\xdb\x99\xcc\xf2\x94\x1a\xbe\x42\x63\x33\xdf\xf2\x9a\xd5\xed\xac\x2e\x66\xe9\x2d\x1d\x89\xdc\x52\xc0\x72\x1d\x1c\xaa\x1d\x97\x41\xa9\x2d\xd3\x73\xf7\x59\x2d\x3f\x3e\xa5\xf7\x6f\x80\x4f\xf4\xf4\x98\x7c\xfd\xd5\xff\xfd\xe6\x3f\xd6\xdc\x68\x89\x26\xc4\xdf\x03\x07\x2b\x41\x6e\x89\x86\xe5\x07\x2b\xf6\x62\xfc\xce\xd2\xcf\x32\x29\xef\x71\xba\x6e\x75\x5f\xde\x51\x34\xe6\x39\x5e\x9a\x67\x06\x2f\x86\x0b\x58\x43\x44\x04\x3d\x23\x41\xad\x04\xc6\x0a\xe2\x9e\xcc\xc9\xeb\xaf\x7a\x64\xe4\x50\xbc\x4c\xd6\xdf\xdf\xff\x32\x58\x31\x65\xa6\xc8\x9f\x7a\x0b\xf3\x61\x8a\x98\xa5\x12\x63\xdc\x38\x56\xff\x94\x60\xd9\xa4\xb7\x14\x2c\xb3\x49\x28\xe6\xfb\xd0\xc2\xad\xd3\x32\xfd\xf0\xdb\x96\x71\xfd\xcd\x1f\xd7\xaf\x2f\xe3\x2c\xcd\xd3\x63\xf2\x6a\xcd\x2d\x96\xa4\x6d\xb9\x9a\xf6\xe6\x52\x4a\xa0\x86\x74\x4d\x24\x4d\x8d\x3c\x14\x11\x16\x03\xd7\x6c\xcc\x40\x56\xb7\x36\xda\x02\xec\x83\x86\xef\xd7\xb0\xb8\xaf\x1c\x1d\xaa\x6c\xf6\xa1\x15\x82\x24\x72\x67\x83\x4f\x66\xe4\xd5\x0a\x81\x9a\x67\x60\x4f\x83\xd5\x6e\x08\xdc\x67\x56\x8e\x75\xca\x3e\x7a\x6a\x80\x72\xc6\x27\xca\xbd\x92\x39\x43\x92\xe5\xc6\x77\x53\x40\xd6\x83\x4e\x25\xf7\x8c\xb4\x46\x1a\x16\xa3\x52\x45\xc9\x24\xa7\x92\x72\x6d\x74\xdc\x93\xe1\x85\x15\xe0\xad\xd5\xa2\x24\x79\xb4\x74\x48\xf8\xd3\x68\x8f\xaa\x25\x56\x66\x8a\xce\x89\x81\x27\xb6\xbb\xa3\xfa\xfa\xd5\x57\x1b\x97\xbc\xb8\x6f\xed\x4d\x19\xd5\x1a\x24\x3f\x26\xff\xf5\xfe\xa4\xff\xff\xa3\xfd\x7f\xfd\x72\xe0\xfe\xf1\xaa\xff\xa7\x5f\x7b\xc7\xbf\xfc\xa1\xf2\xe7\x2f\x87\xdf\x7e\xb1\x06\xd2\x6a\x49\x7f\xcd\xf6\x71\x4c\xc4\x0b\x91\x7e\x45\x7b\xc8\x61\xc4\x98\xdc\xc8\x1c\x7a\xe4\x3b\x9a\x28\xe8\x91\x1f\x39\xb2\x86\x96\x48\x03\x9e\xa7\x9b\x34\xc1\x3e\xd9\x33\x6f\x5d\x2d\x7c\x14\xb7\xe0\x94\x36\xdf\xe3\xa6\xbb\x49\xb7\xdd\x0e\x49\xde\x0e\x51\xa1\x34\x15\xc7\x17\x7a\x4a\xcc\x41\x12\x03\x27\xfe\x0e\x22\x91\x1e\x55\x1c\x63\x46\xee\x7e\x4b\xf9\x9c\x94\x64\xcd\x0a\xab\x8b\x3b\x5d\x69\x43\x9b\x68\x24\x85\x52\x85\x67\x4f\x91\x84\xdd\x02\x39\x29\x95\x4a\x43\x2c\x47\x10\x51\x14\xd4\xe5\x88\x69\x49\xad\x45\xd8\xcb\x96\xa5\xb9\x69\x9c\x27\xe4\xc0\xe8\xb2\x03\x2e\x62\x58\xa6\xae\x87\xce\xb4\x3b\x62\x09\xd3\x73\xab\x67\x47\x82\x8f\x13\xe6\xf4\x83\x34\x13\x52\x53\xae\x9d\x11\x12\x26\x70\x4f\x98\x26\xa9\x91\x39\x01\xdd\x4f\x07\x31\x57\xaf\x5f\x7f\xf5\xf5\x75\x3e\x8a\x45\x4a\x19\xff\x2e\xd5\x47\x87\xdf\x1e\xfc\x33\xa7\x89\xa1\x3c\xf1\x25\x4d\xe1\xbb\x54\x1f\x76\xc7\x16\x5f\x7f\xb3\xc5\x29\x3a\x78\x6f\xcf\xca\x2f\x07\xef\xfb\xee\x5f\x7f\xf0\x3f\x1d\x7e\x7b\xf0\x61\xb0\xf1\xfa\xe1\x1f\xcc\x37\x54\x4e\xe0\x2f\xef\xfb\xe5\xf1\x1b\xfc\xf2\x87\xc3\x6f\x2b\xd7\x0e\x57\x1d\xc6\xfb\xfe\x6d\x3e\x02\xc9\x41\x83\xea\x1b\x6d\xa0\x9f\xd2\xac\x7f\x0b\xf3\x35\x87\x73\xad\x38\xba\x0c\xc8\x62\x2c\xa5\xd9\x7a\x3f\xd9\x15\x8c\x41\x02\x8f\x56\x6e\xf2\x96\xee\x19\x4e\xd7\x88\x64\xf6\x12\x86\xe0\x34\x30\x49\x19\xbe\x63\xcd\x70\x9b\xc4\xe9\x2d\x76\xcb\x76\xf2\x23\x5f\xe3\x18\xdb\xea\x25\xc5\x77\x36\x86\xe0\xcf\xf7\x9a\xf8\x8b\xad\xe1\xe4\x6c\xad\xa6\x55\x37\x70\x5e\x9c\x59\xd1\x17\x49\x0f\x8a\x73\x53\x61\xf4\xbc\x9c\xb3\x7f\xe6\x40\x2e\xce\x1c\x3d\xea\x11\xc6\xa3\x24\x8f\x8d\xa4\xf0\xe3\x8f\x17\x67\x46\xb9\xff\xab\x23\x37\x77\x40\x62\xc1\xf7\x35\x79\x77\xf9\xe6\xef\x68\x29\xc0\x3b\x7a\x96\xa1\x5b\x67\x15\x4d\x98\x0d\xdd\xf0\x0c\x98\xfc\x15\x0c\x2c\xf7\xe6\x88\x66\x85\x71\x05\xc9\x1d\x8f\xc9\x14\x92\xcc\x08\x10\xb7\x40\x54\x2e\xdd\xec\x0c\x60\xbc\x8a\xb8\x26\xb1\x40\xd6\x3d\x01\x8d\x9b\x3c\xc1\x10\x84\x26\x48\x73\x4e\x71\x26\xf8\xb5\x91\x02\x3f\xc2\xf9\x30\x1b\xf9\x9d\x93\x59\xf1\x1d\x0d\x0e\xc3\x86\x48\x80\x07\xbf\x90\xb8\xc3\x74\x6a\xbf\xf4\xa3\x9f\xa4\xa5\xef\x6d\xf4\x46\x6b\xec\x44\xb7\xe7\xd5\x03\xc6\xe9\xa5\xe0\xb4\xba\xea\xbc\x10\x90\x85\x86\xd7\xc2\x73\x3a\xa5\x8a\x8c\x00\x38\xda\x7a\xad\x69\x10\xb8\xdb\x75\x50\x5a\x69\xf3\xac\xaf\x45\x3f\x5e\xbd\x78\x0f\x60\xee\x61\xac\x6d\xd0\x5c\x6b\xdf\x76\xb2\xb3\xa2\x7a\x37\x9d\xaf\xc2\x81\xb2\xb6\x4e\xa3\x78\x15\x32\xc8\xae\x1f\xb6\x5e\x31\x59\x30\xf9\xa2\x66\xe1\x8c\x1a\x4e\xcf\x58\x9e\x92\xd1\x1e\x6b\x96\x0d\x2d\xd0\xd5\x57\xb7\xfa\xed\x3e\x47\xbb\xcc\xd7\x20\x67\xac\x11\xf3\x7b\xe8\x60\x62\xec\x21\xc4\x27\x1f\xff\x58\x19\xd1\xab\xf1\x4b\xd0\xfc\x17\x89\x07\x7c\x3b\x1b\x00\x28\x8b\xc1\x75\xe1\x23\xbb\xc2\xd8\x95\x59\x5a\x6a\x72\x4c\xb4\xcc\x3d\x76\x94\x16\x12\xfd\xf1\xd5\xdf\xf2\x51\x21\x28\x97\xd0\x9d\x0e\x44\xfe\xe7\x7f\x7f\xf7\xbb\x67\x19\xcc\x9d\xe4\x4a\x83\x74\xe8\xf3\x91\xcc\x9f\x2e\xa8\xdb\xbe\xde\x9d\x21\x87\x39\xbc\x5e\x09\xee\x5e\x75\xcf\x72\x90\xf7\xca\x0f\xc1\x5b\x56\x06\x7b\xab\x59\xf5\xdf\xee\xc6\x32\xec\x7b\x15\xb4\x8f\x19\xfe\x5d\x0b\x1d\xbb\xfe\xa9\xb2\x7b\x3f\x4d\xcc\xf7\x82\xe3\x71\xf3\x14\x66\x95\x75\xaa\xbe\xfe\xa7\xa5\xdf\xb7\x7d\xbd\xff\x7c\x6a\xde\x5c\x89\x76\x11\x1c\xc3\x51\x13\xea\x03\xf7\x57\x4f\x68\xc5\x2d\x76\x46\x57\xcb\x17\x1e\x0e\xfe\x76\xba\x6b\x36\xa5\x6a\x19\xc5\xc3\x85\x5f\x57\x80\xeb\x36\xe4\x7b\xd5\xee\xb7\xe2\xb5\xa5\x20\x85\xdb\x0d\xd7\xce\xc8\xbd\xff\x58\xf9\xcc\x75\x06\xd1\x3f\x42\xf8\x77\x08\xff\x0e\xe1\xdf\x4f\x34\xfc\xfb\xe1\x73\x6f\xce\x30\x89\x21\x4a\xa8\x74\x4e\x6c\x0d\x49\x82\xb1\xd8\x53\x71\x57\x84\x66\x26\x49\x35\x94\xb3\x0c\x0c\x4b\x29\xc7\x70\x87\x2c\xb3\xb6\x71\x4a\x26\x6c\x06\xbc\x88\x54\xd9\x76\xf2\x9b\xc3\xd1\x57\x33\x28\x7f\xd5\x4d\x70\xe1\xca\xc6\x48\xf5\x45\x19\x68\x03\xd6\x4e\xca\x7b\x9d\x8d\x20\xe7\x36\x24\x20\x97\x10\x93\x5b\xf0\x81\x8c\x29\xcd\x50\xca\xc3\x78\x0b\x3d\xc5\x30\xd6\x62\x83\x53\xed\x1d\x6e\xe8\x74\x9a\x13\x23\xc6\x21\x41\xd0\x42\xb8\xa8\x1d\xf3\x2c\x12\x06\x09\x5a\x32\x98\x55\x0d\xa4\x85\x23\x6a\x77\x9d\xa0\x2a\x3c\x6c\xd6\x0e\x36\x8a\xc4\x34\x63\x4e\x76\x89\x0b\xc1\x72\x0b\xec\x0d\x2f\xdc\x7e\x2b\xc5\x51\xe5\xf6\x1b\x28\x62\xf6\x95\x93\x0f\x0a\xb9\x16\xdf\xe4\x36\x56\x4c\x84\x2c\x76\x86\x41\x5b\x75\x13\x8e\xd0\x32\x23\x29\x37\x17\x56\x6e\xee\x06\xd8\x7a\x48\x83\x12\x77\x7c\x7d\x74\xc0\xe6\x00\x1a\xb2\x39\x88\x66\x23\xee\x8a\x9f\xcd\x04\x67\x2c\x86\x32\xa6\x46\x0b\x3c\xad\x56\x83\x46\xdc\xb9\x5b\x62\x32\x63\x94\xd0\xc9\x44\x62\x28\xed\xda\x48\x83\xad\x62\xe5\x1e\x0e\x8d\x20\x78\x18\x51\x92\xdf\x78\x87\x21\x83\x1b\x6f\x58\x6b\xa1\xf5\x37\x2c\x0b\x8b\xf5\xb1\x4d\x5c\x1f\x21\x14\xcd\x68\x1e\xb5\x42\x6e\xbc\x79\x9b\xb5\xb5\xe3\x81\x15\xb6\xa3\xbe\xce\x0b\x13\x71\x57\x47\xe6\x7c\x94\xa4\xd9\x90\x83\xa8\xf4\x66\x3b\x37\x49\x06\xd2\xe8\xe3\x36\xd8\x98\x92\xc8\xca\x6f\x05\xe1\xf1\xde\xe1\x07\xa6\xb3\xd5\xfa\xdb\xb1\xcd\x2e\xb0\xa3\x8f\xf1\x56\x0f\xdc\xb6\xdd\x52\xd9\xf1\x40\x3e\xc9\xe2\xd8\xca\x33\x53\xc0\xde\x9c\x6f\xd2\x0a\xb6\x41\x43\xe7\x40\x91\xe7\x6c\x03\xb5\x6e\xde\xa2\x77\x6f\xab\x91\x24\x92\xde\x11\xe0\x91\x30\xc4\xe2\xff\x7b\xfd\xee\xd2\x82\xb5\x01\xdc\x69\x96\x40\x8a\x71\x15\x6f\xa9\x54\x53\x9a\x80\x44\xee\xf4\x23\x4f\x6b\x7f\x2f\xc4\x87\xc7\x90\xd0\xb9\x05\x16\x43\x24\xd0\x12\x2f\x24\xc9\x8c\x80\x9b\x66\x39\xe6\x77\xe0\x55\x7c\xef\xc6\x90\x93\x86\xa8\x29\x4d\x54\xa3\xf9\x4a\x0b\x68\x7d\xdc\xf7\xe3\x6d\x69\x40\x75\x32\x0f\x53\x02\x3b\xb6\xa2\x07\x55\xc0\x0f\x7e\x65\x91\x3e\x33\xdc\x60\x63\xab\x42\x7c\x28\xf6\x83\xd4\xe3\x3f\xbe\xfe\x6a\xc3\x9d\x31\x64\x89\x98\x9b\x7d\xf1\xf0\x59\xd9\xf2\x7b\xb6\x3e\xd7\xdb\xc2\xdb\xf6\x2c\x6f\x09\xcf\x1a\xa7\xba\x80\xb4\x4a\x81\x6a\x04\x68\x93\xfb\x6f\x27\x40\x2b\xec\x8f\xeb\xa1\x7d\x14\xe6\x37\xbc\xf0\xd6\x86\xc2\xeb\x6b\x69\xd3\x0f\x85\xdf\xb8\x22\x48\xcf\x33\x47\x69\x8c\x2c\xb8\xc8\xee\x1e\x87\xcb\x3d\x20\xcf\xf8\xdb\x1e\x90\x6a\xfc\x6d\x0f\xc9\x36\x76\xec\xc2\x36\x1f\xde\x74\x76\xec\x44\x63\x1f\xde\x80\x0d\x80\xce\x36\x7b\x93\x1b\xc0\x35\x3a\xf1\x13\x90\xf0\xae\x6b\xd3\xa8\xc9\x77\x2e\x21\xd1\x08\x6f\x66\xb2\x64\x94\x88\xe8\xd6\xd9\x2d\xaf\xce\x8a\xdc\x3f\x9f\x1b\xed\x32\xff\x08\x7b\x68\x07\x07\x91\x2e\x88\x74\x41\xa4\x7b\x2e\x22\x9d\xf5\x0f\x3c\x05\x4a\xb5\x30\x91\xb5\xb4\xca\xc6\x5e\x06\x6a\xb5\x61\x04\x6a\x85\x23\x50\xab\x07\xc6\xb3\xa3\x56\x5b\xc9\x69\x5b\xc4\x10\x6e\x3e\xc8\xc1\x98\x1a\x8c\xa9\xc1\x98\xea\x46\xe0\x65\x6e\x04\x5e\x16\x78\x59\x30\xa6\x6e\x02\x19\x8c\xa9\x3b\x02\x0a\xc6\xd4\x60\x4c\x0d\xc6\xd4\x60\x4c\x7d\xe8\x63\x82\x48\x17\x44\xba\x20\xd2\x6d\x3b\x99\x60\x4c\x0d\xc6\xd4\x4d\x23\x50\xab\xca\x08\xd4\x6a\xc3\x78\xd9\xd4\xaa\xbd\x31\x35\x4a\x80\xf2\xd5\x4a\xd5\x42\xfc\x37\xde\xe7\x8b\xa0\xb8\x3c\x08\xf7\x34\x19\xc1\x94\xce\x98\xc8\x65\x59\x28\xe9\xf4\xfa\x27\x32\x01\xad\xcc\x2e\x00\x0d\xab\x04\xf3\x96\xc9\xc6\xc0\xe9\x28\x59\x09\xf8\x21\x52\xe2\x9e\xdc\x6c\x3c\x1e\x09\x61\xbe\x6e\x19\x63\xa8\xea\x78\x4d\x67\x97\x78\xe6\xbd\x75\x39\x76\xab\x83\x9a\x4f\xaf\xce\xba\x0a\x65\x26\x1f\xb8\x2d\x76\x85\x50\x5d\x95\x5e\x2c\x2b\xe8\x0a\x01\xbe\xbb\xe3\x10\x63\x92\x5b\x8f\x30\x5f\x00\x23\x61\x11\xd3\xc9\xbc\x78\xf1\x60\x55\xd9\x91\xe7\x13\x12\x7d\x7a\x75\xb6\xbd\xf9\xde\x2f\xc0\xa7\xb0\xd4\x07\x3b\x7c\xb0\xc3\x17\x23\x88\x41\x0d\x81\x06\x31\x68\xc3\x78\xd9\x62\xd0\x53\xb7\x5b\x07\x6b\x33\x09\xd6\xe6\xcd\xb7\x05\x6b\x73\xb0\x36\x07\xfb\xcd\x9a\x11\x04\x17\x1c\x41\x70\x79\x60\x3c\x3b\xc1\x25\x58\x9b\x03\xb5\x0a\xd4\x2a\x50\xab\xe7\x41\xad\x9e\x63\xe8\x6e\x30\xfa\x05\xa3\x5f\x30\xfa\x05\x6e\x14\xb8\xd1\x03\xe3\xd9\x71\xa3\x60\xf4\xdb\x15\x50\x30\xfa\xad\x1c\xc1\xe8\xf7\xc0\x08\x46\xbf\x60\xf4\x5b\x33\x82\xe0\xd2\x10\x68\x10\x5c\x36\x8c\x97\x2d\xb8\x04\xa3\x5f\xa0\x56\x81\x5a\x05\x6a\xf5\x3c\xa8\x55\x7b\xa3\xdf\x03\x27\x69\xf3\xb3\x9b\x4f\xca\xc6\x67\x59\xb4\xe9\x85\x8d\x1b\xbe\xb7\x6a\x00\x3b\xa2\x0a\xbe\xf9\xe3\x52\xdd\xf2\xea\x2d\x29\xc4\x8c\xea\xe6\xfd\x59\xcb\x57\xac\x5f\xb3\x2d\xd6\xbe\x98\x46\x43\x28\xae\xb0\xf2\x83\x41\xb1\x66\x69\xe3\x0b\x7b\x73\xd1\x84\x7e\xa1\x2f\x67\xc9\x79\xf8\x9a\x02\xf4\x85\xd2\x78\x37\x05\xdf\xd0\xc6\x95\x9e\x2e\xda\xc9\x33\x55\x44\x2f\xaf\xec\x9f\xd4\x32\x1c\xd9\xbf\x67\xc5\xe5\x87\x16\x6d\x55\xf5\xed\x95\xc8\xf2\x08\x3a\xb3\xd6\xeb\xb3\x22\x05\x78\x11\x63\x19\x95\x86\x42\x7a\x2b\x37\x32\xed\xca\xdd\x0b\xf8\xde\xdc\x4d\x6a\x23\xa7\x7e\x98\x43\xf7\x2b\x99\xca\xeb\x2c\xeb\xdb\x30\x66\xd7\x03\x63\x08\x32\x65\x4a\xad\x0b\xb8\xae\x4f\xfd\x21\xb2\xb9\x05\xb9\x5c\x83\x7f\xff\x45\x95\xe9\x14\xe2\x93\x6d\xff\x33\xa2\x11\x91\x79\xe2\x9a\x80\xba\xf2\xd7\x84\x46\x91\xc8\xb9\x26\x1c\x20\xb6\x96\x8d\x55\x7b\x75\x0b\x62\xbb\x85\xfc\xb4\xad\xf4\xd4\xb7\xf3\x7c\xf0\x2e\xf7\x0d\x27\xf6\x13\x56\x16\x54\xaf\x8e\xed\xa5\x2d\x7c\xfd\xc3\x5c\x6b\x17\x56\xb8\x35\x23\xac\xad\xef\x50\x24\x2c\x9a\x5f\xe5\x09\xb8\x16\x71\x95\x0e\xfb\x56\xda\xad\x8a\xc8\x19\xde\x8d\xb3\xb7\xbd\x29\x63\x01\xb6\x93\xb4\x2b\x0c\x50\x7b\xdc\x77\xa9\xb2\xad\x1d\xcc\x43\x84\x66\x59\x82\xa9\x14\xc2\x08\x2d\xb6\x81\x7f\xd1\x5f\x6f\xd5\x6d\xdb\x4b\x2f\x5b\x89\xd7\x64\x27\x11\x9b\x78\x9b\xd5\xe8\xa1\xad\x42\x76\x94\xb5\x89\x2d\x11\xff\xbd\x14\x79\xb6\xe5\xed\xcb\x96\x45\xfb\xb4\xef\xbe\x55\x6d\x60\xe3\x2f\x3a\x97\x91\xef\x18\x6c\x9b\x74\x39\x93\xa8\xed\x06\x9e\xe6\x89\x66\x59\x62\xdb\x7c\x4f\x2c\x40\x2a\xa1\xe4\x1b\x3d\x42\xf9\xdc\x7b\xa0\x5c\x9b\x08\x88\x09\x9d\x18\x88\xda\x37\x8f\xb5\xfd\x25\xf2\x14\xcc\x69\x8e\x2b\x0d\x4d\x8d\x3a\xc5\xe7\x25\x74\x72\xc7\x92\x04\xdb\xf7\x26\x89\xb8\x5b\xdf\xd6\x6f\x71\xec\x26\x14\x92\xdd\x04\x43\xb2\xbb\x08\x4c\x08\x17\xdc\x9b\x76\x7f\xbc\x7a\xd3\x6c\x11\x2f\xeb\x30\x5c\x2f\x10\xc0\xc6\xd6\x19\x95\x9a\xd1\x84\xe4\x32\x51\x76\x1d\xa9\x51\x02\xa4\x6f\xa6\x32\xa5\xe8\x19\x8c\x40\xd9\xae\x1d\xe4\x0f\x76\xe5\x1c\x62\xed\xf9\x14\x3c\x99\x13\x6a\x57\x7e\x9c\x27\x49\x8f\x8c\x19\xa7\x86\xec\x42\xe6\x33\x61\x8c\xfe\x44\xae\x19\x8f\xc0\x7c\x53\xbf\x10\x2c\x70\x46\x06\xa2\x39\xdf\xc5\x21\x8d\x7b\x95\x8e\xce\xd8\x87\x1b\x5f\x61\x0e\x6c\x84\x6d\xeb\xc6\x42\x7a\x91\xe5\x4a\x24\x68\xde\x76\x86\x6f\xd7\xd1\x9e\x56\x2f\xff\x95\x71\x54\x52\xc8\x15\x32\x0e\xa3\xec\x00\xc3\xfe\xd0\x06\x24\xb6\xa9\x35\x7b\xa7\xdc\x50\x07\x2a\x8f\xa6\xe6\x93\xf6\x32\x11\xab\x3d\x43\x46\xf6\x14\x44\x12\xb4\xda\x3b\x34\x7f\x2d\x7e\x03\x7e\x5f\xf5\xb9\x23\x9a\xb1\xbd\xc3\x1e\x41\x04\x61\xa3\x13\xa1\xa7\xcf\x77\x1f\xfa\x6f\xad\xf5\xd7\x7a\x68\x2c\x74\xf1\xab\x40\x70\x5d\x3b\x44\x66\x9b\x60\x18\x1a\xad\x01\xf3\xa4\xcc\xa6\xb4\xfd\x39\x8b\x06\xf1\x8b\xc4\x9a\x90\x93\xa2\x41\x3e\x68\xec\x03\xee\xee\x86\x19\xc8\xb9\x9e\x1a\x6d\x95\xa9\xe7\x7f\xf8\xb7\x74\x2c\x95\x63\x25\xc2\xdd\x81\xf7\xc8\x2d\x37\xb9\xed\xac\xb4\x84\x5c\xff\xdc\x49\x92\x54\xc5\x5f\x8a\x7f\x7a\xb2\xfe\x6c\x71\x8a\x7c\xb6\x11\x3e\x7f\x32\x4f\xd6\x71\x69\x7f\xb2\x64\xb3\x20\x24\x6f\xde\xd8\x76\x4a\x0e\x57\x3f\x30\x1e\x5b\x59\xf5\x44\xdb\x3e\x45\x70\x05\x66\xc2\x91\xeb\xad\xed\x8a\x1d\xc5\x45\x43\x4d\xb3\x24\x03\x82\xc0\x57\xac\x01\x76\x2c\x7a\x8e\xf8\x5f\x16\x73\xb7\x15\x4d\x1f\x00\x5f\xd1\x83\x9e\x82\xea\x82\xdd\x9b\x6a\xd2\x90\xa1\x67\x3d\xeb\x9a\x32\xfb\x20\xa1\x23\x48\x6c\x6b\x26\x73\xb5\x9c\x3e\x39\x79\xf3\xb6\xe8\x62\x86\x5d\x41\x3f\xb5\xc2\xb2\x85\x83\x75\xa9\x17\xdc\xf2\xd8\x5e\x46\x45\x54\xec\x66\x34\x26\xd7\xa0\xed\x29\x4c\x69\x66\x0e\xa1\x85\xb1\xd2\xe6\xf9\x06\x31\xfd\xf0\x61\xd9\x49\xb6\xdf\xbe\x77\xd3\xaa\x97\x6c\x75\x54\xb6\xf3\x0c\xef\x72\xf6\x36\x58\x42\xca\x51\x43\xf3\xc2\x86\x76\xf2\xbf\x93\xd8\xa3\xa2\x0f\x9f\xdd\xc1\xca\x26\x50\xdb\x74\x75\xe9\x7f\x2f\x41\x74\xbc\x04\xbb\x28\x57\x46\xbf\x4e\x20\xd2\x62\x73\x79\x38\x7f\xb3\x86\x34\x4b\x1e\x3a\x79\x64\x67\x45\x2c\x65\xfc\x0a\x68\x3c\xbf\x86\x48\xf0\x78\x4b\x02\x5b\x5b\x8f\xb7\x8c\xb3\x34\x4f\x09\xcf\xd3\x11\x20\x8a\x95\x85\x85\x84\xc4\x2a\xb9\x94\x70\xb8\x4b\xe6\xbe\xa5\x30\xc9\x44\xec\xe9\xc9\x08\x3b\x27\xc7\x73\xec\x83\x86\x85\x54\xf9\xdc\x00\xc1\x0e\xc9\xbe\xde\x1e\x89\x24\x55\x46\x7c\xea\x21\x50\xa6\x0d\x43\x1b\x01\xfa\xa0\x58\x0c\x66\x8d\xe9\x8c\xb2\xc4\x88\xe0\x03\x72\x06\x63\x9a\x27\xd8\xce\x8f\xbc\x22\x07\xe6\x65\x5e\xef\x5a\xf5\x80\x11\x8b\x95\x30\x1a\xbb\x72\xb9\xf0\x38\xa1\xc3\x1d\xac\xea\xdb\xd4\xf9\xf3\x63\xdb\x7a\x7f\x7e\x64\x34\x57\xdb\xaa\xeb\xb5\x85\xb9\xb0\x9d\xb3\xab\x12\x6b\x85\xa4\x33\xe5\x20\x6f\xc7\xb2\x37\xd7\x48\x58\x31\x6b\x29\x26\x12\x94\x3a\x03\x1a\x27\x8c\x43\xf3\xfd\x75\x33\x05\x92\xd2\x7b\xdc\x63\xd8\xf8\x9c\xf1\xda\x0e\xa3\xd5\xaf\xd2\xc2\x36\xd7\xf7\xaf\x27\x23\x18\x63\xbb\x46\xfc\xe0\xca\xea\xdb\xfd\x33\xa6\x2c\x81\x78\x80\xef\xa8\x40\x29\xbb\x1c\xdb\x8d\x63\xfe\x66\x3c\x07\xf3\x54\x26\x05\x2a\x9d\xf6\xd1\x2a\x8f\x47\x1e\x4a\xcb\xb6\xe3\xbe\xb3\xdf\x70\x01\x15\xe7\xf7\x91\x35\x06\xba\x8e\xe1\x7e\x6f\xaa\x5c\x8e\x8d\x8a\xe9\x35\xd3\xca\x84\x5c\x4b\x58\x72\x29\xb4\x6b\x10\x58\x7c\x20\x3e\xed\x1a\x56\x82\xd2\x2c\xc5\x03\x16\xe7\xd2\xb7\xcf\x44\x9c\xd1\xd5\x4b\x5f\x3b\x2a\xdf\xbc\x7a\xb5\xa5\xfc\xf6\xf1\x37\xbd\x04\xd4\xa8\x9b\xec\x97\xcb\x82\x0e\x79\xf2\x6f\x54\x65\xb3\xc6\xcc\x49\xc9\xd8\x07\x14\x24\xfa\x13\x99\xd2\x8c\x4f\x72\xa6\xa6\x64\x04\xfa\x0e\x80\x13\xb8\xb7\x95\x30\xc8\xbf\x40\x0a\x5c\x54\x83\xde\xd2\x95\x50\x43\xda\xeb\xa7\x83\xb1\x19\x53\x4c\xf0\xbf\x31\xa5\x85\x9c\xbf\x61\x29\x7b\xa0\x44\xa9\x1f\xcb\xdd\x90\x0b\x0c\x8a\x24\xc6\x1e\xc6\x2c\xa2\xd7\x60\x3f\x58\x02\x5a\x3a\xb5\xb0\x6a\x2c\x31\xe7\x64\x44\xa3\xdb\x8f\x86\xe0\x57\x4f\x05\xc3\x9e\x5d\x37\xc0\x2a\xca\x7b\x05\x00\x24\x5b\x76\x53\x9e\xdf\x5b\xfc\xd4\xb0\x7c\x37\x15\x0a\xf0\x06\x6b\x8c\xc4\xc7\xbc\xf3\x80\xa9\x82\x60\x98\xd3\x2d\x38\x28\x42\xc7\xe3\xfa\x1d\xe5\x61\x47\xc9\x33\xcd\x95\x26\x29\xd5\xd1\xd4\x9a\xbc\x44\x5c\x88\x13\xfb\xca\x89\xfd\xbb\x60\x79\x6b\x63\xf3\xee\x66\x61\x62\xe7\x79\x7e\x6f\x74\xcb\x07\xbd\x3e\xf5\x51\x43\xf9\x22\x98\xba\x82\x9c\xd4\x17\xc4\xc9\x6d\xa9\x6d\x25\x7c\x83\x86\xe2\xf2\x17\x5c\x85\x93\xcb\xb3\xed\x4d\x36\x4d\x14\xdc\x9d\x55\xdc\x45\x93\xf8\x86\x8f\xf2\xa6\x55\x77\xa5\x6e\x17\xb7\x2d\xa4\x7b\x84\x92\x5b\x98\xdb\x6e\xd3\x4b\xed\x7b\x25\x24\x4e\x92\x00\xec\x62\x6b\x6e\x72\xad\xa7\x77\x98\xef\xce\xbb\xc7\x8e\xdd\x5c\x16\x7e\xf4\xcd\x44\x77\x7c\xc2\x7f\xf4\x0e\x8f\xed\xbe\xc1\xed\xb8\x85\xf9\x6e\x0f\x2c\x2c\xb7\x59\x05\xa7\xfb\xd8\x75\x37\x3f\x14\x82\x5e\xb1\xd4\xbb\xf9\x92\xaa\x63\x67\x0b\x96\x1f\x1e\x89\xad\x3e\xaf\xd8\x7e\x55\x2b\x93\xf9\xc6\x7d\x65\x37\xa3\x39\xd3\x53\x96\x21\x23\xf2\x4e\x03\xdf\x0c\xfd\x27\x9a\xb0\xb8\x00\x61\xcf\xef\x05\xef\x19\xf1\xc9\xfc\x07\x89\xae\x15\xd7\xce\x04\xa8\x4b\xa1\xf1\x97\x4f\x86\x20\x3b\xcd\x56\xe8\xb1\x20\x9c\xb5\x1a\xa9\x0c\x2a\x5e\x95\x3e\xea\x6a\xe0\x2b\x80\x15\xa8\x64\x8a\x5c\x70\x22\xa4\xc7\x03\x76\xb6\xb7\x80\x2c\x08\xe4\x13\x23\xeb\x08\x41\x3b\xf6\x4a\x18\x0e\x7d\x42\xd6\xb0\xb7\x01\x9c\x03\x85\xf2\x81\xbd\x62\x3b\xe7\x27\x28\xed\x3a\x51\x95\x7a\x67\x38\x8b\x48\x0a\x72\x82\x9e\x99\x68\x6b\xcf\x44\x7d\x51\x76\xa3\xbb\x76\xec\x4c\x7d\xab\x2f\xdc\x69\x17\x20\x6b\xb2\x26\xa0\x36\xcc\xcd\x42\xa8\x99\x9c\xfe\xc7\x50\x70\x5c\x83\xff\x25\x19\x65\x52\x0d\xc8\x09\x51\x8c\x4f\x12\xa8\x5d\x73\x1a\x46\x15\x8c\x81\xc0\x14\x31\xa4\x76\x46\x13\xa7\x4b\x51\x4e\xc0\xda\xac\x0c\xf4\x45\x96\xda\x73\x92\x8a\xa1\x3c\x85\x43\x6c\xef\x16\xe6\x7b\xbd\xa5\x4d\xb3\x77\xc1\xf7\x2c\x6f\x59\xda\x26\x05\x23\x42\x5f\xda\x1e\x5e\xdb\xeb\x92\x0b\xef\xc8\x70\x9a\xda\xd1\xea\x2f\xdd\x7a\x47\xf8\x18\x90\x86\xc2\x7a\x4d\x4b\x74\x91\x4f\x5a\x90\x5c\x81\x95\xd6\xf1\x94\x11\xf0\x72\x26\x4a\x95\xa8\x98\x72\xb8\x43\xe9\xf1\xc9\x08\x7e\x46\x93\x60\x7c\xf2\x63\x16\x53\xbd\x55\xf0\xa9\x1d\x35\x8c\xec\x5f\x59\x20\x24\x47\x28\x66\x6f\x8d\xd9\x84\x64\x54\xd2\x54\x0d\xc8\xd0\x55\x41\xc4\x9d\xc6\xc6\x55\x5b\xa2\xc3\xdd\xcd\x3c\x03\xf2\x17\x72\x55\x9d\xcb\x80\xf4\xfb\x7d\x72\xf3\xee\xec\xdd\x31\xb1\xbf\x58\x29\x5b\x0b\x32\x16\xa8\x04\x89\x5c\x9a\x57\xcd\x80\xa3\xe2\x6f\xe4\x7b\xc1\xe1\xdd\xd8\x9c\x10\xaa\x61\x06\x92\xdc\x99\xa5\x8a\x58\x0c\x85\xf5\x6a\xb0\xff\x71\xf7\x71\x33\xc9\x24\xa5\xf7\xd7\xb9\x9c\xec\xb0\x00\x64\x69\x11\xaa\x26\x9b\x52\x99\xc4\xad\x57\xcd\xe2\x55\xd1\x14\xe2\x3c\x81\x98\xd0\x91\x98\x41\xcd\x64\x5b\x7f\x0c\x59\x7a\x0e\xfe\x41\xc3\xf3\x46\x4a\x24\xb9\x2e\x94\xd5\x03\xb8\x3f\x26\xff\x8e\x2e\x70\x4a\x32\x90\x11\x70\x4d\x27\xb0\x68\x06\xb0\xf7\xbd\x7e\xf5\x6f\x87\x8e\x1f\x19\x88\xce\x7a\xf2\xca\xec\x88\xb7\xf4\xfe\x47\x5e\x9a\x06\x99\x22\xaf\x06\xe4\x64\xe1\x65\xf8\x5c\x12\xe5\x09\xda\x5a\xd0\xad\x5f\x79\xe5\x68\x4e\xa4\xc8\xd1\xb1\x4f\xf2\xac\xae\xcd\x7e\xf5\xef\xff\x66\x94\x3e\x9a\x66\x09\x1c\xfb\xe2\xa9\x56\x6d\x36\x32\x8c\x16\xe4\xeb\x57\xff\x66\xa9\xa7\x39\x9f\xa5\x56\x58\xe2\x8c\x1a\x84\xe5\x19\x61\xa9\x0d\xd9\x84\x64\x5e\x56\x61\x95\xf5\xed\xaf\x34\x95\x5a\xf5\x08\x7a\xff\x0b\xe1\x50\x0b\x4d\x93\x05\x2d\x1f\xb5\x70\xb8\xb3\x48\x8a\x05\xe2\x04\xd0\x50\x45\x5e\x7f\xfd\xea\xdf\x96\xcd\x29\xef\x78\x04\xf8\x24\x3e\x81\xe1\x18\x23\xa3\xdc\xdf\xb2\x24\x81\xb8\xf7\xe0\xf4\xc7\xb9\xd4\x53\x90\x3d\x02\x5c\x79\x63\x95\x99\xdf\xc2\xdc\x10\xba\xcc\x39\x47\x19\xc1\x5a\x87\xd1\xa2\x55\xb1\x70\xb9\x8f\x35\x8c\x50\x93\x54\x28\xbd\x7a\xca\xdb\x1f\x37\x33\x28\x9f\xbf\x1b\xef\x2a\x0e\xf4\x1b\x98\x21\x96\x9f\x6e\x20\x52\xde\xf7\x6f\x8b\x8c\xca\x3e\xe3\xba\x2f\x64\xdf\x82\x39\x26\x5a\xe6\x0f\x7b\x0d\xca\x91\xd6\x4e\xc0\x27\x20\x03\x79\xe5\xbc\x2d\xad\xea\x47\x39\xf9\xcd\xcf\x73\x2c\xee\xf8\x7a\xca\x81\x84\xd3\xd1\x8c\x86\xa7\xbe\x6e\x71\x5b\x38\x36\xe6\xed\xe6\xee\xff\xbb\xbc\xbb\x77\x20\x07\xee\xec\x16\xa7\xdd\xc8\x55\xe8\xf1\xe8\x6d\xf1\xf6\xe2\xd8\x5a\xce\x67\x6d\x4e\xe6\x06\xfb\x9a\x15\x94\x6b\xe9\x84\xaf\xa0\x40\x76\x1e\xa5\x43\x46\x63\x44\x81\x39\xe7\x6a\xed\x41\x4f\x80\x2a\xbd\x0a\x15\xe1\xa0\x3f\x3c\x36\x07\xfa\x2f\x8e\xba\xd0\x69\x24\x24\x44\x79\x69\x63\x3c\xb5\x1b\x65\xef\x0a\xac\x87\xcf\x06\xa6\xd5\x84\xa8\xbd\xe2\x48\x98\xf5\xab\xcb\x57\x1f\x2b\xaa\xc6\x1b\x39\x9b\x88\xd6\xee\xd1\x4a\x00\xb0\x33\x9d\x3a\xe2\x55\x78\x14\xad\x4b\xf3\xc9\x48\xd1\x29\x68\xba\x39\x19\x64\x71\xd4\x89\xf6\xb5\xa6\x3c\xa6\x32\x76\xb3\xdc\xdf\x57\x05\xc8\x01\x79\x8b\xbe\x34\x3e\x16\xc7\x64\xaa\x75\xa6\x8e\x8f\x8e\x26\x4c\x0f\x6e\xff\x43\x0d\x98\x38\x8a\x44\x9a\xe6\x9c\xe9\xf9\x11\x3a\xd0\xd8\x28\xd7\x42\xaa\xa3\x18\x66\x90\x1c\x29\x36\xe9\x53\x19\x4d\x99\x86\x48\xe7\x12\x8e\x68\xc6\xfa\xa5\xcc\xac\x06\x69\xfc\x7b\xff\xa2\x8f\x2c\x18\xd7\xce\x10\x5a\x97\xe4\x0c\xfa\x39\xbf\xe5\xe2\x8e\xf7\x51\x93\x55\x3b\x9d\xa6\xed\xa2\x18\xfc\x58\xc0\xf7\x2e\x81\x0b\x99\x88\x3f\xfa\x22\x98\x8f\xe9\x53\x1e\xf7\xad\xd3\xf1\x23\xaf\x45\x13\xdb\x6e\xbf\x0c\x0c\xd8\x26\x32\xdd\x8e\x66\xda\x10\x8d\x34\x9b\x41\x23\x27\xb6\x1f\xb5\xe5\x7e\xe7\x03\x4b\xe3\x5c\xda\x15\xaf\x78\xb3\xbd\x6f\x26\xa5\x73\x94\x75\xf0\xdd\x44\x58\x56\xce\x45\x0c\xce\xf2\x39\x43\xd5\xfe\xda\x30\xf3\x1b\x23\x0a\x3b\x1f\x37\xda\x7d\xe7\x4a\x43\x6a\x89\x93\x7d\x3e\x99\x13\x2d\xe7\xd6\x31\x2e\x6f\x8d\xf2\xe9\x3c\xd7\x46\xe2\xbf\xc5\xfb\x94\x12\x11\x43\xd1\xa7\xc4\xab\x97\xbb\xbc\x0d\x8f\x92\x4c\x28\x86\xef\x76\x3c\x6f\x37\xcb\x5c\x73\x76\x59\x71\xd3\x7d\xf3\xc7\x5d\x96\x6e\x8c\xed\x16\x76\xb4\xb2\xd7\x23\x28\xc6\xd5\x4c\x00\xb7\x3c\xfb\xca\x2b\xae\x46\x2c\x89\x04\x57\x5a\x52\xb6\x3e\xd7\x69\xf5\x68\xe8\x0a\x69\xee\x6f\x20\xb8\x83\x4e\x1a\x21\x85\x2c\xc7\x60\x79\xa6\x88\xdb\xd2\xa3\xba\x8a\x18\x9b\x0a\xe5\x63\x09\x0d\xe1\x6a\x68\x5a\x6d\x80\x23\xd2\x0a\x4f\xf6\x69\x18\x83\x94\x10\x9f\xa1\xf4\x79\x5d\x7c\xd7\xc5\x84\x8b\xe2\xe7\xf3\x7b\x88\xf2\x6d\x33\xc6\x97\xc7\x92\x2d\xcf\x1b\x44\x5c\xd8\x89\x9d\x84\x39\xba\xfe\x82\x93\x3f\x04\xa2\xdd\x09\x22\x8a\x6a\xa6\xc6\x36\xaf\xac\x58\x08\xa8\x38\x3e\x8b\x2d\x5c\xb8\x87\x91\xc5\xd9\x14\x09\xa6\x91\xdc\x44\x53\x21\x94\x39\xe5\xb8\x9e\x08\x77\xc6\x84\xf5\xf9\x61\x92\x8b\x24\xa9\xa1\x31\x3e\xd9\xa5\x04\x6f\x0d\xb5\xe5\x63\x4c\x59\x15\xbc\xc0\xa0\xf7\x52\x19\x30\x68\x78\x34\x7f\x4c\x50\x6a\x52\x9a\xa8\x3c\x35\x40\xef\x80\x4d\xa6\x5a\xf5\x08\x1b\xc0\x00\x77\x0d\xd0\x68\x5a\x01\x9b\x02\xe8\x5a\xb7\x94\xea\x56\xab\x5a\x89\x0f\x8a\xec\x07\x97\xae\xd3\x2b\x78\xcc\xe2\x5a\xae\x44\x57\x8f\x80\x8e\x06\x87\x3d\x52\x26\x94\x9b\x39\x8e\xe6\x84\x69\x30\x34\x1b\x75\x11\x29\xf2\x89\xfd\x12\xf0\x31\x9d\x38\xaf\x22\x35\x04\xbd\xa8\x31\xea\x8c\x7b\xf6\xe3\xf6\xcc\xba\xe1\xcc\xf3\xd4\xe8\x8b\x05\x51\x47\xb3\xba\x6f\xb0\x23\xa4\x04\x95\x09\xab\x6d\x2e\x1a\xdc\xff\x3f\xc5\x43\x07\xea\xb0\x44\xe6\x94\x4d\xa6\x1e\x97\xd4\x31\x82\xfa\x1a\xec\x7e\xf6\x48\x2b\x5f\x8a\x1d\x0d\x3d\x2a\x76\xd4\x7d\xdb\x3e\xaf\xa2\xdc\x55\x95\xf5\xd7\x20\xd3\x02\x8b\xb8\x45\x90\x64\x38\x3b\xb7\x6f\x6c\xe3\xf6\x18\x79\x45\x0e\x70\x93\x31\xbd\xaf\x70\xc3\xf7\x45\x76\x38\x20\x27\x84\xe7\xc5\x99\xdb\xf4\x02\x2e\x0a\xf8\x0e\x90\x79\xa9\x12\x25\xac\x86\x5f\xdc\x8a\xdc\xd9\xd1\xcc\x53\x5e\x1d\x7d\x87\x01\x78\xb8\x7c\xe2\x26\x20\x16\xd7\x0d\x01\xb4\x23\xdd\x1e\x86\xff\x8a\xe6\x30\x96\x02\x2c\xf0\xb8\x96\x51\x14\x20\xd3\x5e\x55\x7a\x2a\x0e\x64\xfd\x14\x5b\x5c\x34\xdd\x15\xa4\x9b\x9d\x41\x3a\xc2\x2b\x69\x15\xa1\xb3\x7a\x2c\x86\xb1\xf8\x6c\xab\x1a\xb6\x6b\x44\x7e\x34\xc7\xab\x3b\x06\x2f\xad\x1f\x6d\x29\x5d\x39\x5a\xd1\xbc\x72\x6c\xdc\x78\x4f\x2f\xb0\x67\xf5\xe8\x68\xdb\xda\xd1\x9e\xb4\x95\x63\xf7\xd0\xa0\x75\x70\x1a\x04\x0c\xad\x1e\x5d\x9d\x4d\x3b\x1a\x04\x17\xad\x1e\x4b\x22\xea\xc7\x89\x35\x5a\x3d\x1a\x1b\x49\x57\x8f\xa6\x71\x49\xab\xc7\x42\x4a\xe3\x47\x0a\x52\xea\xd5\x23\x94\xc8\xf7\xda\x9e\xe3\x37\xad\xf8\x49\x39\x3a\x46\x71\xb3\xc8\xa6\xd5\x63\x51\x00\x7c\x26\x51\x4e\x2b\x40\x7d\xaf\x0d\x98\x37\x6b\x1f\xb6\xb9\xec\x3e\x4e\xc7\x29\x14\x3d\x97\x3a\xe3\xed\xcc\x18\x51\x9d\x49\xc0\xf2\x03\x18\xf6\xe5\xed\x30\x9f\x26\xb0\x6a\xf5\xe8\x8e\x71\xda\xd1\x11\xfb\xb4\xa3\xb3\xcd\x8d\x02\xcf\x77\xd6\x2e\xfc\x88\xb2\x8e\xb5\x4c\x07\x59\x27\xc8\x3a\x3b\x8c\x20\xeb\x6c\x3b\x82\xac\xb3\x6e\x04\x59\x67\xc5\x08\xb2\x4e\x90\x75\x5a\x8d\xa7\x27\xeb\x58\x4b\x55\x67\x06\xb3\x9f\xad\xc1\x75\xd1\x42\x86\xd2\x94\x0f\xe9\xa9\x9b\xca\x0c\xef\xbf\x76\x24\xf6\x06\xcd\x6b\x2e\x52\x5d\x52\x3e\x01\xf2\xba\xff\xfa\xd5\x96\xe9\x80\xab\x47\x9b\xa0\x9d\xea\xd8\x35\x75\x70\x71\xac\xf3\x48\x7c\x34\xef\x92\x3b\xa9\x85\xc3\xa3\x26\x61\xae\x71\x10\x15\xd5\xaf\x52\xd0\x84\xea\x9a\x41\x9c\xa5\x50\x38\x44\x6b\x29\xc8\x65\x4c\xaf\xe0\xce\xdf\x61\x16\x75\xd0\x6c\x06\x11\x50\x1b\xc7\x3e\x82\x62\x16\x22\x05\x9b\x60\xea\x0f\xbd\x99\x02\x78\x5c\x91\x03\x18\x4c\x06\x24\xb6\xc9\xda\x94\xbb\x98\xb1\xc3\x5e\xd5\x3d\x9e\x1a\xe2\x2a\xf1\x3f\x66\xda\xce\x3f\x0e\x33\xe0\x3a\xa7\x49\x32\x27\x30\x63\x91\x2e\xbe\x0f\x03\x02\x99\xb6\xce\xce\x36\xae\x94\x16\xe2\x61\x5b\x91\xb0\xbf\x74\xb6\x76\xf3\x57\xfb\xd1\x5e\x76\x5b\x9a\x47\x73\x7a\xb3\x20\x97\x58\x0c\x0d\xd6\xaa\x55\xda\xbc\xcd\xfa\x2b\xf1\x9f\xb8\xc1\xdf\x5d\x35\x75\x8f\x91\x8e\x78\x42\x6b\x3e\xb0\xa8\x40\xe5\x49\x62\xb6\xb7\xf5\x98\x2d\xa3\x60\x85\x27\x6b\x45\xb6\x8d\x75\xb3\xa6\x95\xac\x1b\xbc\xe7\x46\x64\x22\x11\x93\x79\x75\x05\x6d\xe7\x96\x4a\x79\x1b\x4a\x54\x3e\x72\x22\xa0\x39\x44\x97\x0b\x4b\x1e\x7c\x21\x6b\x47\xf0\x85\x2c\x8d\x60\x1f\x58\x1c\xc1\x3e\xb0\xc3\x08\xf6\x81\x15\x23\xd8\x07\x96\x47\xb0\x0f\x04\xfb\x40\x9b\xf1\xf2\xed\x03\x24\xf8\x42\xd6\x8d\x20\xeb\x94\x23\xc8\x3a\xdb\x8f\x20\xeb\x2c\x8f\x20\xeb\x04\x59\x27\xc8\x3a\x41\xd6\x69\x3a\x5a\x6c\xee\x4c\xc4\x9d\xa7\xc8\x64\x22\xde\x90\x21\x63\xed\xd5\x91\xe8\x27\x22\x2a\x2a\x8b\x98\x47\x9c\xe7\x43\xd1\xd4\x9a\xd0\x7b\xe4\x5f\x82\x83\x4d\x4f\xb0\x25\x6b\x53\x20\x02\x9b\x45\x64\x22\x3e\x50\x87\x0d\x02\xcf\x43\x86\x4d\xc8\xb0\xf9\x0c\x32\x6c\xa6\x54\xb9\xc2\x47\x48\x5a\xd7\x27\xdc\x54\x8e\xff\x0d\xc8\xf4\xb3\xcd\xb7\x31\x1b\xce\x6d\x18\xec\x25\x57\x6e\x0a\x8b\xbb\xd8\xf9\x76\x21\x1e\xd6\x31\xe6\xf4\x32\xdb\x8a\x27\x8e\x21\x26\x19\xc8\xbe\xdd\x64\x82\x8c\x99\xab\xff\xb5\xb0\x7f\x1d\x86\x9f\x79\xde\x4c\x1d\x13\xcf\x3a\x79\xa6\xfe\x29\x9d\xf9\xa6\xaa\x2e\xba\x1a\x57\x7c\x76\xa9\x34\xdd\x68\xa5\x7d\xa2\x9d\x3b\xed\x87\x56\x7a\x69\x57\x4a\x24\x2a\x79\xd7\x3b\x95\x39\x5e\x3f\x56\x16\xa7\xfd\x67\x0e\x72\x4e\xc4\x0c\x64\xa9\x18\x15\xcd\x7b\x7a\x45\xa7\x99\x88\xba\x02\xc8\xdd\x18\x78\x3a\x31\x45\x74\xa9\xa9\x77\xed\x35\x24\x4f\xac\xfa\xf1\xfa\xd1\xad\xe2\xd0\xa1\xda\xf0\xdc\x6a\x29\xaf\x1f\x9d\x9a\xdf\x48\xc7\x26\x38\xd2\xa1\x19\x8e\x74\x6b\x8a\x23\x9d\x9b\xe3\x48\x97\x26\x39\xf2\xc9\x2b\x40\xaf\x1f\x1d\x9b\x8f\x48\xe7\x56\x3a\xf2\x0c\xeb\x49\xaf\x1f\x1f\x01\xdd\x5d\x5a\xec\x48\xa8\x4e\xdd\x7a\x74\x6d\x50\x23\x5d\x1b\xd5\x48\xd7\xfb\xb0\x51\x15\xec\xf5\x23\xd4\xc7\xfe\x08\x72\x5a\x67\x42\x44\xdb\x9a\xda\x0f\x4d\xb4\x83\x3d\x59\xf4\xf8\xfd\x54\x0a\x90\xe5\xd2\x65\x63\x59\xf3\xee\x4a\xaf\x2e\x0c\xd5\xac\x36\x40\xf5\x71\xab\xb8\xa3\xf1\xf7\xd8\x1b\xbc\x72\x5e\x29\x1e\x57\x01\xb6\xd4\x3a\xa6\x34\x9d\x15\xcd\x63\x8c\x52\x50\x36\x9d\xaa\x3c\x8c\xf7\x0e\x6c\x38\x69\x29\x4d\xf0\x78\x31\xc0\xb4\x7c\x02\xf5\x0b\xdb\xf6\x76\xcf\xdb\xb1\xf7\x55\x79\xc7\xde\xa0\xda\x21\xd7\x41\x3c\xf8\x9f\xff\x3d\xac\x55\x6f\x29\x01\x3a\xaa\x5c\x9c\x1d\x9a\x64\x53\xda\x4f\x60\x06\x09\x4e\xc4\xf7\x5f\x9e\x0a\x34\x19\xdb\xba\xa7\x15\x8b\xd4\xe5\xe2\x92\x92\x31\x50\x9d\x4b\x2c\x21\x0a\x9c\x8e\x92\xf6\x87\x25\x68\x98\x41\xc3\xdc\x6e\x04\x0d\x73\xed\x08\x1a\x66\x8b\x11\x34\xcc\xed\x46\xd0\x30\xd7\x8f\xa0\x61\x06\x0d\xb3\xc1\x08\x1a\x66\xd0\x30\x9b\x8e\xcf\x58\xc3\xec\x36\x72\xba\xaa\xef\xb9\x40\x14\x94\x1f\x35\xd5\x2c\x2a\xa3\xaa\xfd\x5d\xf6\x5f\xdd\xea\x99\x55\x1d\x72\xb5\x96\x59\xd5\x44\x97\x34\xed\xc1\x03\x2a\x65\xa1\x74\x2e\x3d\xb9\x51\xdb\x7c\x69\xc1\xe1\x9d\x6d\xc4\x8a\xd7\xb9\xd3\x9d\x78\xe3\x63\xd7\xca\xde\xee\x45\x60\x5b\x4c\x0e\xbc\xbb\x1f\x7b\xb5\x70\xa1\xeb\x17\xb9\x66\xfd\xf2\x8e\x22\x00\x00\xe3\x76\x6a\x25\x03\x6a\x5e\xea\x22\x4c\xae\x08\xc1\x2a\x37\x8f\xa1\x8e\x20\x6b\x73\xc0\xde\xb8\x63\xc6\x6d\x30\xa5\xef\x2b\x24\xb8\x8f\xcb\xb2\xe4\x14\x09\xa0\xdf\xe6\x56\xf2\xc5\xf9\xa0\xf8\x5b\xe2\xae\x12\x48\x44\xf1\x8c\x51\xee\xf2\x6d\x05\xf7\x8d\xef\x6d\x33\xfb\x52\x5c\x2e\xda\xb5\x14\x6f\x1f\x90\x73\xdc\xf4\x55\xc0\x4c\x21\x7e\xa8\x6d\xb1\xd2\x8d\x89\xe2\x69\xd5\x86\xb8\xdb\xb9\x36\xc4\x42\x50\x4a\x28\x0d\x11\x4a\x43\xb4\x2a\x0d\x81\x17\xed\xe1\xee\xbc\x46\x04\xf9\xd9\x75\x60\x92\x80\xa8\x4a\xf3\x44\xb3\xac\x0c\xf2\x56\xf6\x55\x89\x55\x24\xc6\x2e\xd8\xb4\xbe\xdf\xcd\xdb\x68\x34\x5d\xdc\xf7\x08\x0f\x83\xc2\x15\x92\x13\x17\xd0\x89\xfd\x92\xb0\xa8\x81\xd7\x3a\x6c\xd4\x2a\x7b\xfe\xc1\x88\x67\x48\xb0\x55\xa9\x34\xdb\x76\x5e\x86\xce\x27\x66\x4b\x18\x8a\xbd\x81\x41\x54\x7b\x66\x60\x60\x2c\x9b\x01\x2f\xb9\xc4\x81\x3a\x3c\xf4\xc2\x50\xa7\xdc\xeb\xa3\x70\x9f\x3f\x57\xb8\xc4\x7f\x6e\xc3\x7f\xf0\x83\x0a\x0e\x54\xa2\xaf\xe4\x3f\xcf\x3b\xea\xb2\x7d\x00\x5d\x17\x06\xb9\xce\x02\xe7\x1e\x3d\x68\xee\x73\x2a\xaf\xf1\x24\x5d\x18\x4f\x4e\xeb\x78\x19\x6e\x8b\x90\x93\xba\xfd\x78\x0e\x39\xa9\x8f\xe4\x9a\x78\x3e\xa9\xa9\xcf\xd6\x1d\xf1\x5c\x52\x53\x83\x0b\x62\xa7\xf1\x52\x33\x46\xeb\xa3\x43\x97\x43\x70\x37\x74\x2c\x53\x75\xc2\xfc\x3f\x8e\x9b\xa1\x93\xfd\xd7\x69\x00\x5b\x08\x5e\x7b\xe9\xc1\x6b\x41\xd3\x0b\x9a\x5e\x7d\x04\x4d\x6f\x69\x04\x4d\x6f\x87\x11\x34\xbd\xf5\x23\x68\x7a\xcb\x23\x68\x7a\x41\xd3\xdb\x62\x04\x4d\x2f\x68\x7a\xdb\x8e\xcf\x4c\xd3\xeb\xae\x6c\x7c\x08\x22\xeb\x3e\x88\xac\x1b\x42\xd8\x01\xf9\xeb\x64\xd3\x75\x14\x34\x16\x02\xc6\x9e\x76\xc0\x58\xcb\xe2\x79\x5c\xb3\x8f\x53\x40\xaf\xba\xda\xeb\xaa\xe8\xd1\x99\x60\x31\xc9\x72\xed\x6a\x88\x85\x4a\x7a\x4f\xb9\x92\x5e\x6d\x45\x43\x39\xbd\xad\xca\xe9\xad\xc3\x59\xa8\xa9\xb7\x66\x3c\x9d\x30\xb6\x50\x53\x6f\xd7\x11\x6a\xea\xad\x1e\xa1\xa6\xde\x86\x11\x6a\xea\x85\x9a\x7a\xa1\xe2\x41\x8b\x11\x2a\x1e\xac\x18\xa1\xe2\x41\xf3\x11\x2a\x1e\x6c\x35\x42\xc5\x83\x50\xf1\xa0\x3e\x82\x13\xaa\xdd\x08\x15\x0f\x5a\x8e\xe0\x98\x0a\x15\x0f\x5a\x01\x0c\x35\xf5\x42\x58\x62\x83\x11\x34\xcc\xa0\x61\x6e\x37\x82\x86\xb9\x76\x04\x0d\xb3\xc5\x08\x1a\xe6\x76\x23\x68\x98\xeb\x47\xd0\x30\x83\x86\xd9\x60\x04\x0d\x33\x68\x98\x4d\xc7\x67\xac\x61\x86\x9a\x7a\x4f\x3d\x1c\x92\x3c\xc5\x9c\xa7\x50\x53\x2f\x84\x48\x36\x5a\xee\x50\x53\xef\xe1\xf1\xd9\xd7\xd4\xab\x85\xeb\x3d\x5e\x61\xbd\xdd\xa7\x11\xaa\xeb\x85\xea\x7a\xa1\xba\x5e\xa8\xae\x17\xaa\xeb\x85\xea\x7a\xdb\x8f\xa7\xef\xcc\x78\x72\xfa\xc7\xcb\x70\x60\x84\x9a\x0b\xdb\x8f\x50\x73\x61\xed\x08\x35\x17\x42\xcd\x85\xe0\x8c\x68\x32\x42\xcd\x85\x1d\x47\x70\x3c\x84\x9a\x0b\x3b\x8d\x50\x5d\x2f\x84\xb1\xed\x30\x82\xa6\x17\x34\xbd\xfa\x08\x9a\xde\xd2\x08\x9a\xde\x0e\x23\x68\x7a\xeb\x47\xd0\xf4\x96\x47\xd0\xf4\x82\xa6\xb7\xc5\x08\x9a\x5e\xd0\xf4\xb6\x1d\x9f\x99\xa6\x17\xaa\xeb\x3d\xe5\x70\xb2\x50\x5d\x6f\xc5\x08\xa1\x63\x4f\x3b\x74\xac\xe1\x5e\xa1\xb9\x16\xa9\xc8\xb9\xbe\x06\x39\x63\x11\x9c\x44\x91\xf9\xeb\x46\xdc\xc2\x8e\xe1\x4a\x75\x2d\x74\x03\x58\xc2\x78\xcc\x22\xd4\x23\xef\xa6\x80\xc5\xf1\x8c\x78\x8b\xf7\x11\x6a\x6f\x24\x1a\xef\x2c\xb7\x17\xce\xd3\xd0\x34\x8c\xe1\x41\xd0\xbb\xe2\xcb\x62\x68\x24\x44\x02\x94\xef\xf0\xa4\x63\x86\x20\x77\x3c\xcd\x35\x84\xbc\x71\x94\xb8\x04\x46\x46\x90\x08\x3e\x71\x21\x43\xee\x04\x0c\xc8\x69\x79\x43\x44\x39\x1e\x9e\x5c\x4a\xe0\x3a\x99\x23\x1e\xb0\x4c\x17\x2a\x0d\xa9\x98\x41\x8c\x14\x1b\x23\x95\xac\x18\x49\x35\x49\x80\x9a\x77\x71\x28\x5f\x66\x0e\x0f\x25\x43\x84\x6f\x81\x8e\xc0\x45\x4f\x35\x42\xe2\xee\xb4\xb1\x11\x35\x5c\x30\x6c\x38\xa9\x09\xd9\x52\x84\xea\x51\xe5\x0b\xf1\x68\xce\x45\x4e\xee\xa8\x15\x94\x64\xce\xf1\x30\xe3\xa7\x1b\xd4\xee\xf8\xf2\x16\x22\x49\x73\xeb\x43\x1f\xa9\xda\x8e\x8f\xb5\xb1\x06\x50\x39\x69\xc4\xa4\x6a\x4b\xb3\x7f\x22\x27\xb9\x95\x08\xdd\x56\x06\xae\xe5\x1c\x43\xfa\xac\x48\x11\x8b\xe8\xd6\x6c\xc3\x94\x4e\x60\x7f\x5f\x91\xd3\xb7\x67\x86\xf6\xe5\xca\x90\x6a\x57\x28\xd0\xd1\xc2\x4c\x8a\x19\x8b\xcd\xce\xfe\x89\x4a\x46\x47\x89\x91\x39\xc7\x20\x81\x1b\x91\xe0\x8b\x83\x9f\x4e\xae\x7e\xbd\x3c\x79\x7b\x7e\x88\xd2\x27\xdc\x67\x94\x9b\x23\x91\xab\x32\x10\xd5\xed\x09\xf3\x22\xe0\x33\x26\x05\x37\x93\x43\x3d\x8d\x92\x99\x87\x1a\x15\x27\x41\x82\x12\xc9\x0c\x62\x2b\x23\x17\x6f\xf3\x2c\x87\xf1\x2c\xd7\x5e\x6f\xc4\xf0\x48\x73\x7a\x78\x34\xa5\x7c\xe2\x4e\x60\x6d\x5e\x6a\xce\x35\xbd\x37\xf0\x51\xb1\x53\x11\xcd\x7c\xc4\x2c\x25\xb1\xc8\xcd\xcb\xbf\xf8\xa2\x47\x18\x1c\x93\x2f\x2a\x0f\x0e\xc8\xb9\xbb\xb7\xf2\xc1\x36\x1c\x13\x66\x20\x11\x98\xfb\xdc\x1e\x91\x30\xa1\x32\x4e\x40\x61\x20\xa2\x27\xa4\x56\x92\x77\x1f\x08\x85\x0e\xca\x85\x5e\x75\xf2\xc9\x5b\x81\x41\x89\x63\x71\x4c\xa6\x5a\x67\xea\xf8\xe8\xe8\x36\x1f\x81\xe4\xa0\x41\x0d\x98\x38\x8a\x45\xa4\x8e\x34\x55\xb7\xea\x88\x71\x73\x12\xfa\x31\xd5\xb4\x5f\x39\x82\x47\x96\xcd\xf6\x23\x91\xa6\x94\xc7\x7d\xea\xb6\x42\xbf\x58\x86\xa3\xdf\x3b\x06\xd8\xa7\xc5\x5d\x8c\xf7\x69\x5f\x4d\x21\x49\xf6\x1b\x6c\xbe\x76\x02\x5a\x0b\xc1\xac\x95\x40\xe6\xbe\xbd\xfd\x69\x3b\x2f\x0e\x97\xc5\xc1\x80\x5c\x0a\xed\xe2\x65\xdd\x46\x43\xa2\x87\xf8\x5d\x7d\xfe\xce\x2f\x6f\xae\xfe\x3e\x7c\x77\x71\x79\x13\x8e\x61\x38\x86\x9f\xd5\x31\x04\x3e\x6b\x7d\x04\xbd\x34\x57\xd9\xd6\xc5\x7a\x23\x0f\x54\xa0\xfd\xb6\x2d\x16\xa0\xb5\xec\x65\xc7\xa3\x61\xbd\x86\x81\x73\x3e\xfb\x89\xd6\x4d\xd7\x7c\x25\x3a\x88\xbb\xc1\x8a\xa0\x85\x74\xdb\x26\xb8\xbd\x85\x99\xa8\xad\x5f\xa8\x91\x7c\x66\x47\x7b\x9f\x8d\x79\x75\x73\x15\xbe\xb6\x7c\x97\x34\x2d\x2b\x58\xaf\x58\xb5\x01\x79\xeb\x15\x0a\x72\xfa\xeb\xc5\xd9\xf9\xe5\xcd\xc5\x77\x17\xe7\x57\xcd\x35\xd4\x0e\x6c\x19\xa8\xad\x77\x84\x80\xfd\x86\x5c\x2d\x93\x30\x63\x22\x2f\xad\x0b\xab\x49\xc0\xe2\xd9\x77\xee\xd4\x79\xa1\xe7\xae\x7c\xec\x73\x67\x8d\x67\x30\xa6\x79\x62\xb5\x88\xbd\xbd\x41\x13\x9e\x64\x47\x57\x9b\xed\x3b\x29\x5a\xd4\x53\xae\x6d\xb8\x6b\x5b\x89\x7d\x2c\xe4\xda\x43\xb7\xef\x9c\xf0\x35\x46\xe1\x44\x33\x6b\xa9\x72\xb2\x99\xf5\x15\xb5\xc4\x4e\x4b\x63\x7b\x37\x2e\xe8\x48\xf0\x31\x9b\xbc\xa5\xd9\x0f\x30\xbf\x82\x71\x3b\x73\x69\x1d\xdf\x68\x85\x73\x1e\x55\xb4\xd9\x19\xe6\x63\x5f\xd6\xce\x5b\xd1\x99\xaf\xa2\xab\x20\x85\xf6\x01\x0a\xdd\xc5\x13\x74\x12\x4b\xb0\x54\xdd\xde\xda\x63\x9d\x65\xb5\xab\x50\x93\x4e\x1c\xd8\xed\x78\xb2\x1f\x75\xd6\x54\x65\xce\x8e\xce\xea\x6d\x95\x84\x48\xf0\x08\x32\xad\x8e\xc4\xcc\x70\x1a\xb8\x3b\xba\x13\xf2\xd6\x48\xfd\x86\xba\xf7\xed\xae\x55\x47\x68\x3b\x3f\xfa\xbd\xf5\x06\xdd\xbc\x3b\x7b\x77\x4c\x4e\xe2\xd8\xb5\x2a\xc9\x15\x8c\xf3\xc4\x35\x07\x18\x10\x9a\xb1\x9f\x40\x2a\x26\x78\x8f\xdc\x32\x1e\xf7\x48\xce\xe2\x6f\x9b\x13\x67\x3f\x3a\x5c\x05\x91\x59\x8f\x5f\xc7\x2b\x71\x8d\xbe\x86\x79\x8d\x77\x15\x44\xc4\x70\x2d\xa6\x15\xee\x4d\x6f\x7d\x75\x42\x41\x47\xa8\xd9\xdd\x54\xbd\x38\x70\x09\xbb\xa5\xab\xfb\x25\x61\xb5\x9e\x3e\xb7\x51\x33\x11\x1f\x13\x95\x67\x99\x90\x5a\x91\x14\x34\x35\x2a\xea\xc0\xec\xb0\x5e\xfd\x4f\xf4\xd9\xf4\xc8\x3f\x8a\x1f\xd1\xf1\xa2\xde\xef\xef\xff\xf9\x87\xf3\xbf\xff\xe7\xfe\xfe\x2f\xff\xa8\x5e\x45\x56\x68\x83\x61\xea\xb7\xa8\x0c\xa2\x01\x17\x31\x5c\xe2\x3b\xf0\x4f\x55\x73\x37\xb8\x0b\x9a\xea\x5c\x0d\xa6\x42\xe9\x8b\x61\xf1\x67\x26\xe2\xc5\xbf\x54\x0b\x89\x83\x3c\x4d\xc6\x80\x4b\x34\xa4\x7a\xfa\x44\xd8\x43\x49\x4b\x3a\x3e\xaa\x0e\x6a\xb5\x25\x4e\x4a\xf1\x9f\xdf\x79\x14\x18\xe9\xe9\x4e\x32\xad\xd1\x05\xe5\xb2\xae\xc5\xb8\x67\x4e\x6d\x29\x76\xce\x5e\xef\x3d\x29\x06\x53\xac\x60\xc7\x08\x43\x8c\x38\x6c\xd9\x83\x5c\x30\xd8\x65\x57\xeb\xc9\xf0\x82\xcc\x2c\x86\x9f\x0c\x72\x7c\x26\xed\x77\x1f\x95\xc6\x15\x2d\x94\x1c\xaa\x0a\x8d\xee\xd8\xc6\xc6\x14\xf9\xbc\x24\x61\x29\x73\x21\x77\xae\xdd\x92\x22\x07\xf6\xc7\x41\x94\xe5\x3d\x77\xc3\x20\x85\x54\xc8\x79\xf1\x27\x64\x53\x48\x41\xd2\xa4\xaf\xb4\x90\x74\x02\xbd\xe2\x71\xfb\x58\xf1\x97\x7d\xb0\xf6\x82\xe5\xa7\xad\xe2\x5a\xba\x0c\x1d\x45\x86\xf8\xe5\xd1\x36\x8f\xfa\x27\x42\xda\x8a\x9d\x71\xf9\x11\x44\xc2\xc2\x6e\x66\x05\xce\x02\x8b\xa8\x4f\xce\x44\x92\xa7\xa0\x7a\x85\x18\x64\xbb\x86\xf1\x99\xd1\x2c\xd5\x93\x12\xd4\x62\x36\x63\xaa\x8b\x68\xda\x15\x72\x1a\x73\x81\xe9\x22\xd7\x59\xae\x5d\x69\x97\x4a\x9b\x36\xa1\xd0\x6e\x51\xe4\xdf\xd7\xc8\xfe\xeb\xb6\xf5\xa7\x08\xc9\xa8\xd6\x20\xf9\x31\xf9\xaf\x83\x0f\x5f\xfe\xd6\x3f\xfc\xf6\xe0\xe0\xfd\xab\xfe\x9f\x7e\xf9\xf2\xe0\xc3\x00\xff\xf1\x87\xc3\x6f\x0f\x7f\xf3\x7f\x7c\x79\x78\x78\x70\xf0\xfe\x87\xb7\xdf\xdf\x0c\xcf\x7f\x61\x87\xbf\xbd\xe7\x79\x7a\x6b\xff\xfa\xed\xe0\x3d\x9c\xff\xb2\x25\x90\xc3\xc3\x6f\xbf\x68\x3d\x75\xca\xe7\xef\x5a\x12\x50\x3b\xfa\x9d\x55\xe6\x59\x84\xd8\x51\xb8\xf1\x7d\xbf\x54\x9a\xfa\x8c\xeb\xbe\x90\x7d\x0b\xfa\x98\x68\x99\xb7\x23\x26\x25\x53\xea\xfa\xfc\xfb\x5e\x5c\xc7\x25\x43\x2a\xd8\xf5\x93\x39\xe0\x0a\x22\x09\xfa\x53\x58\x72\xec\x9b\xbc\x9c\xb2\x10\xfa\xf7\xd2\xf8\xdc\xe7\x60\xdc\x29\x42\xe7\x70\x5d\x4b\x49\x74\x2c\x45\x3a\x20\x15\x67\xc4\x0c\xf3\x1e\xdc\x7d\xb7\xd0\xc2\x0a\xea\x47\x30\x06\x05\x63\xd0\x9a\xf1\xa0\x31\xe8\xda\xee\xc3\x27\x6b\x09\x02\x3e\x6b\xea\xc2\x58\xe9\xef\xf6\xba\x8e\x16\x24\x13\x59\x9e\x50\xbd\xc6\x93\xb5\xc2\xf9\xed\x8e\x7a\xe9\x39\x2b\xe3\x54\x2c\x43\x4b\x57\x7b\x1c\xc9\x49\x92\x10\xc6\xed\xc1\x47\x00\xde\xc1\x25\xc1\xaa\x36\x84\x5a\xef\xf3\xcc\x4c\xe1\xce\x55\x70\xab\x06\x3f\x2a\xa2\x34\x95\x1a\x63\x70\xb1\xc2\x9b\x65\x25\xce\xfb\xc4\x78\x59\xe7\xad\x10\x0e\x8b\x94\x88\x95\x7d\x2e\x13\xaa\xb4\x9f\x36\xce\x46\xd3\x5b\xf4\x0d\x46\x10\x03\x8f\x00\xf3\xb3\x72\x28\xbf\x75\x64\xf4\x36\x72\xce\x67\x85\x93\x2d\xb7\xa1\x1b\x96\xfc\xad\x86\xf1\xb2\xc2\x05\xcc\x46\xbc\xf6\xed\x88\x8b\xa8\x01\xa4\xfa\x85\x86\x5d\xa4\xb9\x15\x56\x56\xf5\x38\x71\x02\xed\x79\x66\xe1\xd9\x6a\x25\x0c\x2d\x31\xcb\xd2\xfc\x5c\x67\x92\x2f\xc1\x19\xd8\x9e\x7d\x7e\x76\xac\xb3\x23\xb6\xd9\x0d\xcb\xdc\xc1\x77\xd2\x25\x9b\xec\xc2\x59\x92\x49\x18\xb3\xfb\x8e\xce\xe9\x09\x2f\x2d\x31\x2c\x06\xae\xd9\x98\xd9\x0e\xf6\x99\x84\x0c\x78\x5c\xd4\x08\xc5\x1c\x69\x5e\xc7\xcd\x93\x0c\xbd\xb1\x02\x77\xb7\xa4\xec\x7a\x95\xb0\x1f\xe8\x18\x09\x74\xac\xf1\xf8\x44\x74\xcc\xed\xdc\xa7\x43\xc4\x30\xae\xbb\x7d\x60\xf9\x59\x25\x4a\x1c\x77\xf1\xce\xbb\xac\x4c\x6f\x3a\x42\x28\x6a\xa1\x98\x4e\x41\x17\xb5\xb0\x49\x6f\x64\xca\x26\x06\xad\xb6\xbe\x8e\x15\x9a\x48\x4a\x39\x9d\xd8\x1c\x67\x2d\xbc\x9d\xd6\x68\x59\x66\x13\x4b\x16\xd7\x84\x7b\xfb\x1a\xc6\x89\xd9\xd8\x89\xa0\x31\x5e\x94\x22\x49\x40\x2a\x92\xb0\x5b\x20\x67\x90\x25\x62\xee\x52\x96\x79\x4c\xae\x35\xd5\x66\x4b\x5f\x83\x6e\xe6\xf3\x6d\xb5\x5d\x71\xc6\xc3\x3c\x49\x86\x22\x61\x51\x23\x8b\x4a\x7d\xd9\x2e\x70\xbd\xb2\x3c\x49\x48\x86\x20\x07\xe4\x1d\x47\x8a\x71\x92\xdc\xd1\xb9\xea\x91\x4b\x98\x81\xec\x91\x8b\xf1\xa5\xd0\x43\x2b\x7a\xd7\xa3\xed\xec\x8d\x84\x8d\xc9\x31\x56\x78\xd1\x44\xd3\x09\x2a\x4e\xde\x07\xd8\x33\xf8\xaf\x02\xb0\xc4\xe1\x8e\xa9\x95\x9a\x4a\xeb\x8d\xf3\x7b\x84\x64\x08\x95\xfd\xfb\x93\x2f\x53\xc2\xc6\x10\xcd\xa3\xa4\xfd\xb9\x3a\x89\x30\x7a\xa1\xcc\xba\xae\xec\x6f\x57\xb5\xdc\x25\x3a\xa2\x0a\xc8\x38\xb1\xe5\xc4\x6d\x9d\xf4\x72\xab\x17\x33\xb2\xaa\xae\xea\x54\x43\x6c\xcc\x39\xdb\xf2\xcc\x4c\x28\x7d\x6d\xd4\xf3\x4e\x8a\x8e\xef\x0f\x3d\x38\x82\xa5\x95\x93\x04\x62\xc2\xd2\x14\x62\xa3\xc2\x27\x73\x42\xc7\x1a\x13\x4e\x6b\xe6\x81\x48\x82\xdd\xb5\xae\x92\xc7\x94\xf2\x38\x01\x49\xc6\x94\x25\xce\x18\x50\xbb\x5f\x83\x4c\x19\x47\x9b\x80\x75\xc7\xa2\x7d\xc1\xfc\x15\x45\x42\xfa\x32\xf0\x4c\x2b\x7f\xa9\x3c\x98\xc8\x44\x2a\x1b\x60\xd1\xaf\x4c\x46\x89\x88\x6e\x15\xc9\xb9\x66\x89\x9d\x8c\x10\xb7\x24\x12\x69\x96\xe0\xd1\x69\x71\xb2\x8a\x7f\xf6\x8b\xad\xd4\x37\xd0\xd5\xd1\xef\xcb\x4b\xf8\x43\x53\x6e\xde\x81\x14\xd6\x85\x0c\x06\xf7\x10\x75\x96\xec\x6e\x68\xa9\x59\x65\xf4\xf7\x0b\x5e\x88\x62\x63\x61\x18\x98\x59\xeb\x32\x4d\xb9\x20\x97\x03\x72\x7e\x0f\x51\xa5\x26\x03\xb6\x4b\x40\x42\x80\x39\x92\xf4\x16\x5e\x50\x11\xb8\x16\xa9\x6d\xd5\x51\x43\xfb\xa9\x85\xe9\x6b\x48\xb9\x57\x90\x84\x71\x24\x8b\x2e\xdd\x8d\x30\xae\x8c\x40\x50\x3b\x43\xf6\xc4\x3a\x41\x97\xc4\x4c\x62\x05\x81\x79\x11\x7c\xed\x61\x61\x72\xbe\x10\x9a\x1c\xec\x1f\xed\x1f\x2e\xd9\x2c\xf7\x8d\xe0\x92\x80\x25\xd1\xd6\x80\x19\x95\x93\x52\x2c\xcd\x92\x39\xce\x63\x3f\xee\x11\xa6\x7d\x74\xb6\xcc\xb9\x9f\x95\xcb\xc1\xeb\x11\x25\x88\x96\xd4\x17\x26\xb1\xbf\x9a\x9b\xb4\xcc\x1d\x73\x38\xd8\xff\x6d\xbf\x47\x40\x47\x87\xe4\x4e\xf0\x7d\x8d\xd3\x1f\x90\x1b\x61\xc4\xef\x12\xd0\x5c\xe4\x84\x83\x2d\xca\x01\xf7\x59\xc2\x22\xa6\x93\x39\x12\x3a\x22\x72\x6d\xf3\x6f\xa9\xf6\xb9\x7f\xe7\xf7\x4c\xbb\x18\x37\xb3\x6d\x5f\x21\x36\x2d\xb1\x23\xd4\x48\x47\x33\x38\x9a\x02\x4d\xf4\xd4\x06\x96\x70\xc1\xfb\xff\x02\x29\x30\x2b\x90\xbb\x2b\x2f\xae\x60\x5e\x27\xda\x86\xa1\xbd\xdf\x43\x77\x3d\x76\xfe\x76\x73\x33\xfc\x1e\xf4\x02\xc9\x30\x6f\xf1\xe1\x3e\x68\x41\x00\x39\x16\x32\x7d\x02\xb4\xa3\x1b\x07\x67\x9f\x64\x42\x3e\x05\x12\x36\x15\xaa\xd5\x5a\x92\xa5\xf5\x14\x4a\xa3\x12\xe5\x84\x38\x0e\x91\x59\xc1\x7a\xdc\x89\x6f\x43\x73\x31\x1c\x90\xbf\x8b\xdc\x7c\xcd\x88\x8e\x92\x79\x51\xc5\x40\x81\x26\x7b\x06\xd4\x9e\x21\x4f\x66\x37\xfc\x0d\x68\x6c\x34\x1b\x43\x3d\x80\x3e\x8d\x76\x53\xc4\x9d\x07\x37\xb7\x6e\xf9\x40\xae\xb4\x48\xc9\xd4\x7d\x76\x3d\xb9\xd2\x9d\x8c\x01\x9e\x1e\xab\x51\x62\xd5\x34\x4b\xe1\xdc\x33\x2f\x8e\x7e\x2d\xd1\x0d\x8b\x77\xf7\xfb\x08\x2b\x40\x45\x55\xb4\xb9\x7e\x4b\x36\x99\x88\x5b\x64\x99\xad\x06\xcd\xdc\x2b\xd5\xf1\x84\xcb\x76\x36\x4e\xd5\x5c\x04\x84\x8e\xc0\xf6\xf1\x61\x9d\x16\xed\xec\x26\xd6\x80\xac\x32\xcc\xba\x3d\x63\x8d\x36\x1d\x21\xf1\xe3\x54\x8d\xfc\x14\x08\xe8\x66\xf1\x49\x97\x18\xc8\x3a\x08\x07\x5f\x0e\x06\xd7\xc2\xa8\xaf\x98\xae\x69\x89\x2b\x92\x09\x05\x72\xd6\x34\x5d\xbb\x1c\xdd\x7d\xba\x68\x6e\x28\xf0\x63\x45\x26\xb4\x24\x3c\x4f\x47\x20\xcb\x6c\x16\xa9\x97\x11\x52\x89\x66\xb8\xb4\xb7\x7b\x13\x70\xbd\xbb\xa1\x79\xf2\x9b\x7f\xff\xf7\xaf\xff\x7d\x60\xc1\x17\x91\x0d\x9c\x5c\x9c\x5c\x9e\xfc\x7a\xfd\xd3\x29\xe6\xd3\xb6\xc5\x6a\x47\x61\x9b\x5d\x07\x6d\x76\x1a\xb2\xf9\x51\x03\x36\x31\x4d\xa4\x35\x15\xa9\xfb\x0b\x10\xa4\xd9\x01\x46\x6f\x33\x1a\xa7\x93\xfd\x2a\x85\xbe\x8c\xac\x59\xb7\xbf\x9a\xa3\xf6\x24\xce\x98\x8e\xb2\x6b\x11\xdd\x76\xa8\xd7\xec\xdf\x9c\x0e\x2d\xc8\x6a\x85\x4a\xee\x8d\x21\x8c\xcf\x44\x32\xb3\xc5\x6d\x6f\x4e\x87\x78\xf2\x06\xf8\x2f\x34\x44\xa1\x46\x3d\x37\xcf\xfa\x44\x06\xe7\x9e\x32\xda\xb7\xb5\xa0\x51\x22\x81\x26\x4c\x69\x16\xe1\x73\xa5\x99\xd4\x40\x68\xe3\x97\x0a\x9a\xd2\xaa\xd1\xb9\xa6\xb4\xff\xce\xbb\xed\x76\x56\x9a\xda\x06\x1e\x3e\x61\xbe\xe4\xf8\x91\xcd\xf8\x08\x7c\xe9\xb3\xe0\x4b\x99\x84\x6b\x2d\xb2\x8e\x3c\x21\x16\xd8\x1a\x3f\xc8\x08\xc6\x42\xc2\xa2\x23\xa4\xe2\xd8\xf0\xfd\x76\x39\x66\xff\x79\x13\x94\xa8\x39\x2f\x6c\xc8\xa5\xca\xa3\xa9\xb7\x26\x72\x50\xea\x08\x5d\x1e\x79\x66\x55\x4c\x74\xa2\xe4\x12\x7a\xe6\xeb\x20\xc5\xd9\xf5\xca\x34\x06\xf3\x7a\xe0\xf6\x47\xd0\x91\x35\xb3\x7a\xff\x8b\xb3\xa8\xfa\xe9\x2f\xba\x4a\x22\x49\xd5\x14\xb0\x7e\x08\xdc\xb3\xb2\xeb\x07\x55\x82\x5b\x63\xaf\xfb\x1c\x64\x34\x8a\x64\x54\xa9\xb2\x9e\xb1\x7b\x89\x7d\x68\x28\xe2\xfd\x7d\x55\x7b\x60\x22\x69\x04\x24\x03\xc9\x44\x4c\x30\x9f\x38\x16\x77\x9c\x8c\x60\xc2\xb8\xf2\xf8\x33\x80\x3c\xa2\x0d\xbb\xb1\xa5\x67\x7d\x2d\xb6\x01\xb9\xaa\x15\x41\x71\xe9\x49\x91\x28\x4f\xb4\x9b\xc5\xa2\x93\x09\x23\x42\x2b\x5d\x8b\x8b\x85\xf1\x61\xb3\xfa\xe1\x49\x77\xe0\x6d\x32\xa8\x2d\xaf\xad\xc5\x0e\x96\xaa\xa7\xd1\xb4\x9d\xe3\x37\xb8\xa7\xb6\x1c\xc1\x3d\xb5\xdb\x08\xee\xa9\xe0\x9e\x5a\x3f\x9e\x9c\x79\x37\xb8\xa7\x82\xd2\xb5\x38\x82\x7b\x2a\xb8\xa7\xd6\x8c\x27\x47\xbf\x82\x7b\x6a\x8b\x11\xdc\x53\x5b\x8e\xe0\x9e\x0a\xee\xa9\xe0\x9e\x0a\xee\xa9\xcf\xc8\x0c\xe8\x47\x70\x4f\x2d\x01\x09\xee\xa9\x0a\x32\x82\xa6\xb4\x62\x04\xf7\xd4\x8a\x11\xdc\x53\x95\x11\xf8\x52\x03\xbe\xe4\x9d\x3b\x43\xa3\x97\xb5\xcf\x59\x1b\xa2\xe3\x80\x45\xce\x47\x54\xed\x8c\x56\xbc\xaa\xd2\x0c\xad\x52\xf3\xc3\xa7\xda\x38\x6f\x50\xe9\x63\x5a\x99\x0f\xb5\xab\x3b\xc2\x27\x11\xaa\xa3\x4c\xd8\xff\x2b\x9d\x11\x15\x2f\x84\xd5\x4e\x9b\xe7\xa4\x3d\x5a\xb6\x55\x1b\xd7\xc3\x93\x76\x3b\x3c\x11\xd7\x4e\x07\xae\x86\xe0\x66\x78\x71\x6e\x86\x97\xd3\x51\xd6\x39\xf3\x6f\xa6\x12\xd4\x54\x24\x8d\x37\x7a\x6d\x93\xbf\x65\x9c\xa5\x79\x6a\xf6\x9c\x32\xfb\x99\xcd\x8a\xa8\x01\x55\x6c\x57\x4b\xe8\xad\xa5\xd0\xdc\xc8\x62\xc0\x02\xa8\x94\x25\x66\x19\x31\xad\x73\x4a\x51\x54\x57\x79\x14\x01\x60\xf3\xb2\xaa\x16\xf3\xf5\xa0\x78\x53\xd1\x4e\xe3\x75\x3b\x7a\xd3\x8e\xf7\xdb\x12\xa5\x08\xe5\xeb\xaf\x1a\xc1\x68\xe9\xe5\xf9\xf4\x1e\x9e\x0e\xc8\x74\x7b\x7d\xa5\x95\xae\xd2\x05\x97\x68\xab\xa3\x3c\x37\x4f\x4e\x67\x1e\xcd\x0e\x3c\x38\x4f\xc8\x7b\xf3\x64\xd8\xc2\x53\xf1\xd8\x3c\xc1\xea\xab\x1d\x38\x18\xba\xf0\xd0\x74\xe7\x9d\xf9\x08\x45\x4a\x3f\x8e\x57\xa6\x43\x6d\xb8\x23\x6f\xcc\xa7\xf0\xc4\x74\xf2\xd5\x6d\x3d\x30\x9f\xce\xfb\xd2\xcd\xe7\xb6\xb4\x6e\xbd\x08\x8f\x4b\x07\x56\xad\x2e\x2d\x5a\x9d\x59\xb3\x3e\x9a\x87\xa5\xbd\x77\xe5\x09\x78\x56\x5a\x23\x99\x71\xa6\x19\x4d\xce\x20\xa1\xf3\x6b\x88\x04\x8f\x1b\x73\x98\x85\xaa\x75\xc5\xf9\x51\x16\xac\xd3\xd1\xea\xf1\xc7\x53\xea\x8a\xf3\x42\xec\x43\xaa\xbd\xf9\xcf\x09\x14\xd8\xd0\xc4\xce\xf2\x49\x1a\xf4\xc8\x93\x51\x06\x6d\x30\x76\x97\x8b\xf8\x37\x71\x47\xc4\x58\x03\x27\x07\x8c\xfb\x75\x3c\xac\xa8\x81\xa5\x66\x5e\x6c\x6b\x73\xf5\xf5\x2b\x7f\xf3\xcb\x53\xb9\xd1\xb8\xa0\xd4\xc7\xb7\x80\xb8\x17\x3d\x6c\x02\x71\x37\x8e\xf3\xa4\x6e\x06\xb1\xa6\x91\x3a\xbd\x79\x5d\x96\x17\x7d\x8d\x70\x8b\xd3\x46\x79\x4c\x5c\xe2\xc6\xcb\x5b\xb4\xd6\x7e\xe3\x97\xe0\x33\x0e\xb6\x17\xd2\xb5\xed\xe5\x91\x7c\xc3\x4f\x50\x6a\x7e\xa6\xfe\xe0\x20\x35\xef\x30\x2a\xf9\x5f\xdf\x4b\x1a\xc1\xb0\x73\x81\xc3\x1f\x27\x12\xe7\xd2\xa5\xed\x15\x72\x47\x71\x78\x38\x40\x6c\x4f\x53\x91\x14\x87\xd9\x68\xe3\x3c\x49\xe6\x24\xcf\x04\xaf\x67\x1e\x5a\xa7\xd5\x62\xc2\x9a\x81\xb6\xea\x2d\xa5\x94\x9a\x49\xe1\x18\xb0\xcc\x39\x37\xf4\xbc\x6c\x38\x84\x52\xa9\xb2\xb4\xba\x9a\x16\xa7\xd8\xc4\x4c\xdf\x30\x53\xcc\x98\x63\x29\x94\x2d\x29\x4a\x80\xe6\xe9\xb1\x90\x11\x1b\x25\x73\x32\xa5\x89\x2e\xdb\xaf\xdf\xb2\x24\x71\x60\x06\xe4\x1a\x34\xd1\x53\xe6\x1a\x83\x93\x44\xf0\x09\x4e\x8e\x72\xdf\xd5\x0c\x22\xf3\x6c\x94\x00\xe5\x79\x66\xdf\x67\xd8\xfa\x5c\xe4\xd2\xbf\xcf\x95\xb5\x2c\xa0\x30\x45\x38\x4b\x7a\x95\xde\x49\x1b\x17\xb6\x6c\x28\xaf\xc0\xe7\x14\xde\x31\x05\xbd\x2a\x4c\x5f\x99\x57\x55\x3a\x67\x64\x52\xcc\x58\x6c\xbb\x5f\x78\xb4\x61\x97\x56\xdb\x1d\xa3\x38\xcf\x5c\xf0\x3e\x87\x09\x45\xa9\xc7\x9d\x22\xbb\x66\x16\x8e\x75\xc5\xf1\x18\xfb\x65\x18\x75\x41\x64\xb5\x54\xd6\x19\xb3\x9d\x3e\x2b\x98\x23\x07\x5c\x10\x81\xec\x35\xe7\x4c\xdb\xee\xd1\xd3\x5c\x93\x58\xdc\xf1\xc3\x81\xad\x4a\xcc\x2c\xd3\x4e\xb2\xa9\xef\x65\xeb\x7b\x2b\x32\x09\x8a\x00\xa7\xa3\xc4\xac\x3a\x86\x3c\xdc\xac\x44\x11\x19\x03\xd5\xb9\x04\x32\xa1\xba\xa5\xeb\xba\x33\x11\xe9\x9b\x3f\x36\x3b\xdc\x2c\x05\x91\xeb\x4f\xa2\x03\xde\x4d\x59\x34\xad\x8a\xb4\x2c\x05\x45\x44\xbe\xa0\x1c\xbf\x76\x8f\xad\x94\x47\x83\x22\xb8\x72\x34\x35\xef\xae\xb0\x81\x2d\xe6\x0a\x97\xfd\x60\xa9\x22\x94\x9c\x5d\x5e\xff\xfa\xe6\xe4\xaf\xe7\x6f\x06\xe4\x9c\x46\xd3\x6a\x22\x39\x27\x14\x4f\x3b\x9e\xf0\x29\x9d\x01\xa1\x24\xe7\xec\x9f\xb9\x2d\x2b\x4e\x0e\x8a\x67\x0f\x3b\x2d\x62\xdc\x90\x6d\x62\xcf\xea\xce\x9a\x24\xd9\x0e\xd8\x36\x32\x41\x28\xc0\xb6\x06\x8b\x72\xcf\xb9\xb9\x64\x35\x04\x94\x91\xa6\x60\x68\x08\x9b\x39\xfa\xe9\xaa\x42\xd3\xb8\x88\x95\x30\xfb\xdc\x6c\x0b\xc3\x63\xe8\x08\x63\x1c\xa6\x40\x38\x68\xb3\xad\x0b\x4b\x93\xe0\xaa\x96\xd1\x9f\x2b\x50\x3d\x32\xca\x31\x2a\x23\x93\x2c\xa5\x92\x25\xf3\x2a\x30\xc3\x64\x2e\x85\xd7\x63\xe6\x8b\x53\x3a\x7b\x77\x7e\x4d\x2e\xdf\xdd\x90\x4c\xda\x5c\x7f\x0c\xab\xc0\xeb\xf8\x59\x23\x30\x4f\xb8\xe6\x9a\x03\x72\xc2\xe7\xf6\xa2\x3d\xe0\x4c\x11\xa3\xc4\x00\xf2\x4e\x27\xfc\xf9\x6a\xee\x7b\xaf\x06\xf8\xbf\x3d\xf3\x95\xd2\x48\x87\x45\xb4\x48\xb4\x14\xf5\x65\xe5\x47\x36\x4a\x2a\xd8\x74\xdf\xfe\xa2\xda\x24\x15\xf1\x6e\x43\x83\xc4\x4a\x9b\x24\x5a\x2c\x35\xa2\xd7\xb6\xcd\x62\x7c\x92\x54\x77\x55\x33\xb2\xdf\x56\x29\x6c\xab\x12\xf6\xcb\x2f\x18\x36\xd5\x0c\x3b\x69\xd7\x54\xce\xa1\xa3\x26\x27\x25\xf7\xf3\x7a\x90\xa3\x08\xa2\xda\xb7\xf2\x62\xe8\x4f\x80\x13\x4b\xd2\x85\x66\x87\xf8\xb0\xf5\x46\xf4\xc8\x2b\xf2\x67\x72\x4f\xfe\x8c\x7a\xd1\x37\x6d\x5b\xc2\xb4\xd5\x58\xda\xdb\x65\xac\x3a\x7e\x31\xec\x08\xe3\x3f\x1b\xea\x64\x20\x1a\xac\x6a\x41\x46\xcc\xc9\xe1\x70\xaf\x41\x1a\x3a\xea\x56\xe2\x51\x9b\xe9\x98\x09\x7e\xc2\x6d\x66\x9d\x0e\x17\xe3\x6a\x2f\x07\xbd\xe3\x46\x33\x8f\xff\x4d\x28\x7d\xe9\xa8\x50\xbd\x33\x44\x09\x2d\xa5\x3a\x9a\xd6\xc9\x98\x11\xd4\x94\x2e\x0f\x98\x22\xb1\x40\x13\x98\x0d\xe0\x9b\xb2\x16\x21\x14\x4f\x67\x1b\xb7\xf3\xaa\xd7\xd6\x73\xd3\x4a\x2d\x58\x3e\x50\x61\x71\x82\x55\xa5\x2e\x4c\x26\x62\x27\x93\x99\x69\xc5\x15\x9e\xb1\x41\x28\x73\x46\x96\xc2\xd6\x8c\x7b\xc9\x9c\xa7\x88\x72\x1b\x79\x3d\x06\x29\x6d\xcc\xe5\x68\x8e\xae\x5f\x16\x41\xeb\xc5\x6b\x75\x92\x32\x29\xb4\x88\x44\x8b\x7e\x3f\x75\x4f\xb7\x03\x87\x48\xb0\x56\x5b\x6f\x2c\xff\xf1\x6c\xd8\x23\x37\xa7\x43\x6c\x83\x72\x7d\x7a\x33\xac\x6b\x2a\x7b\x37\xa7\xc3\xbd\x47\x45\x05\xf1\x92\xd5\xb1\x99\x66\x03\x20\x35\x8b\x91\x11\xdb\xfa\x29\xcd\xfa\xb7\x30\x6f\xc8\x53\xbb\xe0\xeb\xfd\x62\x85\x3b\xf9\x20\x8b\xe6\x94\x66\x3b\x43\x93\x40\x63\xf6\x89\xd2\x1f\xdc\xc9\x2a\xdf\xb9\x3a\x0f\x22\x15\x33\x88\xad\x38\xec\x9f\x00\x1e\x67\x82\x19\x79\x31\x24\x47\xec\xfe\x74\x48\x8e\xd8\x34\x42\x72\x44\x48\x8e\x08\xc9\x11\x9b\x47\x48\x8e\x70\xe3\xf1\xcd\xa0\x24\x24\x47\x34\x1c\x2f\xcb\x41\x1f\x92\x23\x76\x1a\x21\x39\x62\x79\x84\xe4\x88\x35\x23\x24\x47\xac\x19\x21\x39\x22\x24\x47\x84\xe4\x88\x10\xe6\xf5\x20\xac\xa7\x19\xe6\x45\x42\x72\x84\x1b\x21\x39\xe2\x45\xc4\xc4\x90\x90\x1c\xb1\xd5\x08\xc9\x11\x21\x39\xa2\xc9\x08\xc9\x11\x38\x82\xed\x25\x24\x47\xf8\x11\x92\x23\xec\xf8\x7c\xa4\xe6\x90\x1c\x11\x92\x23\x42\x72\x44\x48\x8e\xd8\x30\x42\x72\xc4\x23\x4b\xbb\xbe\xeb\x5c\xfb\x60\xff\xfd\x53\x91\x66\xb9\x06\x72\xe5\x41\x16\xe2\x9f\x3d\xd1\x4c\x55\x59\x79\xfb\xd8\x9b\x48\xf0\x31\x9b\x38\x92\x7c\x64\x5b\xba\xf5\x8b\xef\xe9\x57\xda\xa8\x3d\xc3\xc0\x9b\x84\xa5\xac\x59\x06\x06\x59\x5a\x98\x37\x08\xab\xe2\x9d\x31\x27\x29\xa5\xf7\x78\x44\x68\x2a\x72\xdb\x06\x2f\x72\xeb\x57\xa0\xd0\xfa\xb0\x9e\xdc\xca\x90\x6e\x74\x93\x32\x95\x64\xd8\x81\x9a\x90\x51\xad\x41\xf2\x63\xf2\x5f\x07\x1f\xbe\xfc\xad\x7f\xf8\xed\xc1\xc1\xfb\x57\xfd\x3f\xfd\xf2\xe5\xc1\x87\x01\xfe\xe3\x0f\x87\xdf\x1e\xfe\xe6\xff\xf8\xf2\xf0\xf0\xe0\xe0\xfd\x0f\x6f\xbf\xbf\x19\x9e\xff\xc2\x0e\x7f\x7b\xcf\xf3\xf4\xd6\xfe\xf5\xdb\xc1\x7b\x38\xff\x65\x4b\x20\x87\x87\xdf\x7e\xd1\x78\xca\xad\x65\xd9\xee\x24\xd9\x8e\xe4\xd8\x8f\x22\xc5\x3a\xb7\x6e\x47\x67\xf1\xca\x41\x5b\x3c\x8d\x8e\x61\x6d\x3a\x8d\x9e\x9a\xa2\x7c\x56\xc0\x61\x8a\x88\x94\x69\x23\xd5\x19\x41\x8e\x56\x03\xba\x98\xae\x69\x93\x8e\x0e\x60\x24\x24\xd5\xb6\x2b\x67\x11\x0c\x55\x09\xb0\x16\x5e\x64\x73\xdd\x4e\x0b\x43\x03\x9e\xe7\x7e\x0c\x63\xc6\xc1\x39\xb0\x02\x6d\x78\x78\x04\xda\xf0\x12\x69\x83\x82\x28\x97\x4c\xcf\x4f\x05\xd7\x70\xdf\xc8\x34\x52\x27\x0d\xd7\x0e\x20\x11\x99\x8d\x6e\x2c\x94\x20\x1b\x19\x2b\x73\x8e\x4a\xdf\xce\x47\x2e\x13\x09\x8b\xe6\x47\x7e\xc2\x78\xc6\xe0\x5e\x1f\x6d\x09\x47\x53\x75\x5b\x9e\x5b\xe8\x1b\x51\xb8\x38\xa6\xcb\x50\x9f\xa1\xb0\x85\x72\xce\x50\xb2\x19\x4b\x60\x02\xe7\x2a\xa2\x09\x92\xa7\x6e\x48\xfe\xc9\x1a\xe8\x48\xa9\xa5\x48\x94\xd1\xf8\xb1\x2d\x31\xf5\x2a\x38\x66\x98\x4c\x28\xe3\x24\x35\x4b\x94\xf9\x87\x95\xd5\xe5\x0d\x15\xcf\xa8\x04\xae\x4b\x9d\x1d\x55\xd4\x91\x10\x89\x0b\xdd\x4d\xe6\x25\x7c\x17\xfb\xce\xc5\xaf\x1c\xee\x7e\x35\xd0\x14\x19\x27\x74\x52\xa8\xea\x0a\xf4\x92\xb5\xad\x04\xbd\xf6\x03\x30\x2e\x36\x07\x42\x93\x3b\x3a\x57\xa5\xe1\xa2\xda\x40\xfb\x98\xbc\x3e\xc4\xad\x4b\x15\x29\x60\xc4\xe4\xab\x43\xf4\xe5\x9d\x9e\x0c\x7f\xbd\xfe\xfb\xf5\xaf\x27\x67\x6f\x2f\x2e\xdb\x11\x7c\xf3\xed\x40\x79\x23\x18\x11\xcd\xe8\x88\x25\xac\x0d\x9d\x5f\x8a\xf6\xa8\x02\x45\x4e\x1a\xc7\x47\xb1\x14\x99\xc5\x93\xb7\x11\x95\x0c\xaf\xae\xcc\x56\x33\x83\x71\x79\xc6\x75\x80\x13\x49\xb9\x2e\x8d\x25\x25\xca\x65\xce\x8d\x7e\xfc\xcc\x03\xe3\x69\xdc\x5d\x50\xfc\x49\x1c\x43\x5c\xc3\xde\x8b\x0b\xc2\x3b\xf5\x1f\x37\x2f\x73\xa4\xc9\xf0\xdd\xf5\xc5\xff\x5b\xd8\x86\xf3\xac\x5d\xcc\x51\x37\x79\x59\xb2\x79\x47\x7f\xb2\xf8\xe9\x57\x2e\xef\x27\xac\xef\x93\x58\xdf\x82\x57\x75\xe3\xe9\xbe\xca\x79\xbd\x8c\x46\x09\x9f\xa4\x22\x86\x01\x19\x16\x56\xf2\xfa\xd5\x4a\x7a\x2d\x95\x40\xcc\x2d\x5c\x33\x9a\x24\x73\x62\x14\xa9\x19\x4d\xc0\x86\x32\x63\x32\x4b\x2d\x33\xb8\x4a\x87\xc7\x34\x51\x2d\x89\x69\x1b\xce\x64\x98\xf0\x5b\xa3\x13\x76\x82\xcd\x02\x1a\x89\x81\x0b\xed\x94\x4f\x33\x4b\x4c\x96\x96\x22\x22\x56\x01\xad\x84\x25\xd5\xb8\x8b\xb2\x86\x76\xcf\x98\x98\xf2\xb8\x1a\x16\x90\xad\xb1\x36\x57\xa0\x56\x33\xa6\x52\x25\x35\xd0\x25\xd0\x18\x73\xc2\x32\xaa\xa7\x36\xaa\x20\xa5\xea\x16\x62\xfb\x83\x93\x6b\x0a\x23\xbb\x81\x58\xbc\xea\xc6\xcc\xdb\x5b\xd4\x51\x9e\xb1\xb1\x0e\x68\x89\x6f\x56\xf4\x82\x74\x71\x04\xcc\x37\xbd\xe3\xc9\xfc\x4a\x08\xfd\x5d\x91\x0b\xd5\xc9\x02\xfe\xec\x24\xc5\xba\x35\x15\x45\x29\x0c\x02\x88\xfb\x88\x4c\xdc\xd2\xd5\x34\xac\xb3\x72\xc1\x1e\x79\x43\xcb\x9c\x9f\xa8\xef\xa5\xc8\x1b\x73\x80\x25\x41\xeb\xfb\x8b\x33\x3c\xc7\xb9\xf3\x72\x71\x2d\xe7\x98\xf5\xb9\x5c\xb0\xa7\x90\x69\x7f\x74\x7e\xba\xea\x8e\x34\x72\x72\xce\x15\xe8\x01\x79\x4b\xe7\x84\x26\x4a\x78\xe1\x98\x71\x32\x44\x0f\x57\x55\xe5\x1b\x10\xcc\x4c\xb7\x97\x47\x42\x4f\xc9\xc2\x0d\xb8\x9d\x97\x9f\xeb\x55\x9c\x5e\x65\x05\x21\xc6\x97\x1e\xd7\xf4\x16\x14\xc9\x24\x44\x10\x03\x8f\x9e\xb9\xc7\x08\x57\xfe\x52\x70\x73\x2c\x3a\x59\xfb\x8b\xc2\xc7\x87\xf6\xac\xfa\x4a\xa3\xb7\xd0\xe9\x1d\x14\x7d\x86\x78\x28\x72\x05\xd2\x3a\x38\x65\x0e\x76\x21\x7e\xc8\x47\x90\x80\xb6\xca\x10\xd6\x7d\xa0\xda\xe6\x46\xb2\x94\x4e\x80\x50\x5d\x6c\x14\x2d\x08\x70\x65\xc8\x8d\xb5\xa0\x69\x12\x0b\x28\x13\x18\xa9\x22\x3f\x5e\x9c\x91\x57\xe4\xc0\xbc\xeb\x10\x97\x7f\x4c\x59\x82\xee\x44\x4d\xe5\xe2\x1c\xd9\xd8\x83\xc0\x29\xe1\xde\x23\x42\xda\x23\xda\x23\x5c\x10\x95\x47\x53\x3f\x27\xa3\x71\x79\x85\xcd\xc5\xd3\xa1\x6d\xfe\x05\x6e\xd5\xd6\x04\xe6\x47\x05\xb2\x33\xfa\xf2\x63\x03\xfa\x52\x15\x21\xcc\x9e\xab\x63\xcf\x6e\xac\x14\x34\x8d\xa9\xa6\x8e\xee\x94\x59\xcf\x2f\x71\x49\x1f\x9b\xfa\x28\x78\xc3\x78\x7e\x6f\x23\x46\xba\x53\xf2\xaf\xcf\x11\x2c\x89\x3c\xd2\x70\xd1\x68\x96\x25\xcc\xe6\x1b\x2f\x44\x30\x5d\xd4\x96\xba\xb7\x46\x44\xc2\x63\x4e\x93\x44\x18\xf2\x66\x38\x3b\xe5\xb1\x48\x97\x5e\x66\x04\x28\xa8\x15\x9a\x1b\x90\x17\xb9\x79\x1e\xdd\x1c\x91\xc0\x0c\x5a\xd4\x54\x59\xac\x8b\x67\xa0\x19\x59\xcc\x2f\x28\x82\x27\x09\x1d\x41\x62\x39\x8b\xdd\x40\x6a\x79\x03\x3d\x76\x14\xa0\x14\x49\x77\x39\x10\x57\x22\xc1\xe8\x0c\x5a\x20\xc2\x80\x7f\x16\x78\x40\x20\x5d\xe1\x01\x15\x99\x1a\x1e\x50\x25\x7b\x0e\x78\xc8\x5b\x30\x5a\xb2\x88\x07\xc3\xb5\xeb\x78\x40\xd6\xf9\xd4\xf1\xa0\x20\x8a\x44\x9a\x0d\xa5\x30\x2a\x57\x67\xac\xc5\x81\x2d\xdd\x41\x56\x27\x5f\x11\x4b\x83\xa4\xbc\x7e\x33\x95\x95\x80\x3a\xaa\x2d\x8d\xf7\x0e\xa5\xff\x53\x6d\x2d\x6c\x48\xcf\x22\x1f\xf2\x50\x7c\x98\x5e\xf1\xa4\xbb\xf0\xcc\xd3\xf9\x5b\x58\xc9\x3a\x61\x26\x22\xa2\x09\x96\xbc\x6b\xb7\x63\xc8\xe2\xae\x59\x04\x5c\x89\x82\x44\xd7\x12\xfe\xe6\xdd\xf7\x58\xfd\x0c\x7f\x71\xb6\x2f\x2e\x62\xa8\x54\xe1\xb1\xe1\x9b\x37\x36\xe8\x0e\xef\xf3\x01\x98\x86\xab\x7b\x6f\x60\x5c\x7b\x5a\x0b\x57\x81\xe5\x6d\x51\x48\xcf\x4c\x10\x78\xcc\xf8\x04\x2d\x3a\x3d\x22\x21\xb1\xa1\x9b\xee\x0c\xdf\x5a\xf5\x6b\x1f\x77\xb4\x07\xea\xb7\xb3\x7f\x35\x4a\x42\x4c\x70\x07\x19\x8d\x1c\x5e\xbe\x19\x5b\x6a\xc9\x14\xd9\x7b\xe3\x11\xd0\xa2\xf2\xd8\x53\x64\x10\x7b\xf6\x0b\x8b\xd5\xb4\x36\xb6\x5b\xc6\x63\x17\x2c\x59\x43\x56\x51\x23\xd6\x4a\xa1\x18\x3f\xcb\xe2\x2a\x69\x38\x26\x1f\x38\x29\x90\x45\xfa\x8d\xb7\xc7\x95\x15\x58\xbd\x79\xa9\xbf\xd9\xe4\x57\xbc\x64\x11\xcc\x8f\x1c\xd7\xde\xbc\xb7\x6f\xd4\xde\xe5\xfb\xfc\xb7\xec\x3d\xe6\xba\xde\x31\x1e\x8b\x3b\xd5\xb5\x0e\xf1\xb3\x05\xeb\x05\xea\xc8\x6c\x6b\xcd\xf8\x44\x55\xf5\x08\x9a\x24\x35\x33\xec\x2a\x45\xc2\xaf\x70\x51\x11\x78\x59\x80\x5f\x88\xce\x0e\x4a\xc0\x0e\x63\x92\x2a\x7a\x2a\xcd\xa7\x68\x46\x93\xeb\xac\x79\x69\x34\xb2\xb8\x0d\xbe\x7f\x7b\x7d\x52\x07\x6d\xe8\xd9\x1d\x56\x9c\x36\xc8\x36\xd7\x09\x8d\x53\xa6\x14\x9a\x81\x60\x34\x15\xe2\x96\x1c\xf8\xb0\x8d\x09\xd3\xd3\x7c\x34\x88\x44\x5a\x89\xe0\xe8\x2b\x36\x51\x47\x6e\xd3\xf6\xcd\xec\x0f\x09\xe3\x09\xe3\x15\xd3\x3c\xd6\x52\x76\x66\x0c\x7c\x49\x54\xcc\x02\xd7\xd6\xd5\xcb\x74\x5e\xe6\xe5\x69\xda\x0a\x99\x0c\x92\xc7\x2f\xf8\xb2\xbc\x3c\x97\x2d\x6b\x57\x3c\xb0\x44\xf8\xed\x2e\x35\xa4\x9a\xc6\xb4\x12\x8f\x56\x7a\x7b\x74\x24\x15\xd6\xb1\x4e\x71\x83\x56\x32\x07\xd4\x10\x02\x4f\xd1\xda\x58\xcd\xcc\x2d\x1f\xcb\x72\xf6\x3c\xc8\x1e\x69\xbb\xe8\x2e\x3f\xb7\xa3\x0a\x9d\xd7\x15\x68\x15\x59\xa4\xb0\xbd\x0f\x45\x6c\xf3\xf3\x8b\xfc\x62\x2c\xac\x8f\xf5\x02\xd8\xbf\x3c\xb7\x29\x39\x16\x17\x36\xd2\xb4\x9a\xb8\xef\x0a\x14\xc6\xc4\x08\x0e\x89\x57\x74\xd2\x2c\x01\x4c\xe5\xa9\x40\x2e\xb3\x94\x2a\x25\x3d\x7b\xc5\x44\xca\xaa\xa0\xae\x5c\x40\x8f\xfc\xb7\x91\x1c\x69\x11\x0d\xe5\x33\x99\x87\xc5\xe3\x56\xde\x65\xca\xd7\xf7\xc5\x72\x45\x5a\x78\x3d\x8a\xc4\x6c\x3c\x06\x1f\x75\x65\xe4\x60\x2a\x69\x0a\x1a\x3d\xcc\x16\x05\x23\x98\x30\x1b\xd6\x23\xc6\x84\x9a\x89\xec\xef\xab\x32\x1d\xb7\x67\x43\x7f\x98\x26\x29\x9b\x4c\xed\x46\x21\x14\xd3\xb4\x88\xf7\x2f\x24\x82\xc6\x04\xf7\xb6\x90\xe4\x8e\xca\x94\x50\x12\xd1\x68\x8a\xce\x0a\xca\x49\x9c\x4b\xac\x59\xa7\x81\xc6\xf3\xbe\xd2\x54\x1b\xbe\x0f\xd2\x89\xc7\x7e\xfe\xa1\xae\xe9\xc6\x11\xea\x9a\xae\x1f\xa1\xae\x69\xa8\x6b\x1a\xea\x9a\x6e\x1e\xa1\xae\xa9\x1b\x8f\x9f\xc1\x48\x42\x5d\xd3\x86\xe3\x65\xd5\xd6\x08\x75\x4d\x77\x1a\xa1\xae\xe9\xf2\x08\x75\x4d\xd7\x8c\x50\xd7\x74\xcd\x08\x75\x4d\x43\x5d\xd3\x50\xd7\x34\x54\x68\x7a\x10\xd6\xd3\xac\xd0\x44\x42\x5d\x53\x37\x42\x5d\xd3\x17\x51\xce\x86\x84\xba\xa6\x5b\x8d\x50\xd7\x34\xd4\x35\x6d\x32\x42\x5d\x53\x1c\xc1\xf6\x12\xea\x9a\xfa\x11\xea\x9a\xda\xf1\xf9\x48\xcd\xa1\xae\x69\xa8\x6b\x1a\xea\x9a\x86\xba\xa6\x1b\x46\xa8\x6b\xfa\xc8\xd2\xae\xd2\x31\x6b\x54\xbf\x69\x9b\x74\x7b\x17\xd2\x51\x49\xd0\x1b\xe5\xe3\x31\x48\x24\x39\xf8\xe6\xa5\xf0\x81\xa2\x2c\x4f\x41\x84\x5c\x80\x80\x02\xdd\xc3\xcc\x7d\x17\xb6\xbb\xe6\x71\x97\x11\x88\x75\x96\x24\x28\xcc\x56\xe7\xe4\xfc\xdd\x77\xdd\xe4\xf6\xb7\x4b\xbb\xc5\x39\xbf\xe3\x51\xfb\x20\xb3\x12\xe1\xab\xc2\xc8\x1d\xde\xa3\x44\x28\x1b\xe4\x61\x91\x15\x4d\x29\xe7\xe0\xb5\x3e\xa6\xd1\x9a\x32\x02\xe0\x44\x64\xc0\x2d\xe1\xa5\x44\x31\x3e\x49\x80\x50\xad\x69\x34\x1d\x98\x37\x71\x8f\x6c\x57\xc6\xaa\x84\xa8\xb4\x04\x9a\x5a\xa4\x4b\x48\x29\xb3\xa0\x08\x8d\xa4\x50\x8a\xa4\x79\xa2\x59\x56\x00\x23\x0a\x30\x2c\xd7\x72\x98\x02\x19\x18\x17\x02\x36\x0a\x03\x93\xcd\x8b\xb7\xb9\x69\x89\x6a\x69\x13\xd4\x39\x7b\x58\x94\x31\xcd\xf4\xbc\x08\x80\x03\x32\x66\x52\x69\x12\x25\x0c\xd9\x2c\xbe\xd1\x66\x40\x21\xbc\x9e\x67\xb2\xdc\xcd\x54\xb9\xa9\xf2\x18\xe5\xcd\x4c\x2b\x1b\x4e\x56\x02\x74\xa0\x62\xa6\x9c\x7c\xae\x7a\x84\xfa\xc2\x1d\x16\xd1\x7e\xa6\x88\x6a\xcf\x10\x2c\x74\xf7\x53\x05\x5c\xa5\xda\x57\x19\x6f\x57\x6e\x74\xac\xcc\xe1\x37\x67\xaf\x5a\xa1\xb2\x22\x09\x60\x9c\xca\xd2\x31\xc0\x05\xe0\x30\x33\x7b\x00\x22\x30\x8c\x91\xae\xd9\xf5\x9f\x7c\xd3\x57\x84\x85\xb7\xa0\x14\x9d\xc0\xb0\xa1\xbb\x61\x9d\x2a\x85\x1e\x87\x72\x61\x70\x2b\x24\x36\xc9\xa6\xf8\xa5\x8c\x4f\xaa\xcb\x2f\x24\xb5\x73\x2a\xa4\x96\x3b\xc9\xb4\x06\x5c\x54\x2c\xf1\x82\x1e\xcb\xc5\x34\xba\xfd\x85\x28\xa7\xb7\x1e\x48\xf9\xb0\x21\xea\x3c\xb6\x31\x47\x23\x20\x23\xc9\x60\x4c\xc6\x0c\x03\x99\x30\xb4\xa8\x67\x8b\x16\x50\x2b\x55\x28\x65\x14\x55\xc1\xbd\x10\xea\xe7\x35\x20\x3f\xbb\x89\x69\x99\xf3\x88\x56\x4a\x99\x61\xa2\x09\x1b\x93\x09\x86\x26\x39\x31\xef\x8f\xaf\xfe\xf4\x0d\x19\xcd\x0d\x4b\x43\x91\x48\x0b\x4d\x93\xe2\x23\x13\xe0\x13\x83\x2b\x7b\x3c\xeb\xa9\x12\x05\x06\xb0\xa4\xb2\x9d\xf8\xeb\xaf\x6e\x47\x75\x1e\x7b\x14\xc3\xec\xa8\x82\xbf\x7e\x22\x26\xab\x8a\x54\x37\x8f\x75\x6c\xa8\xcb\xac\xd8\x66\x58\xce\xb1\xf5\x46\xf3\xd5\x33\xc8\x54\xdc\x59\x21\x7d\xc5\xee\x29\x83\x17\x33\x91\xe5\x89\x35\x3d\x7f\x57\x24\x19\xe5\x0a\x96\x33\x09\x56\x9e\x0b\x34\x96\x3a\x10\x0b\x54\xc3\x45\xa4\xf9\x57\x0a\x17\x94\xed\xcc\x79\x45\x11\x0d\xd4\x60\xbe\xa3\x49\x32\xa2\xd1\xed\x8d\x78\x23\x26\xea\x1d\x3f\x97\x52\xc8\xfa\x5c\x12\x6a\xa8\xe5\x34\xe7\xb7\xb6\x8c\x6e\x91\xe8\x28\x26\x46\xb4\xca\x72\xed\x23\x80\x57\x7d\xb0\x4d\x9b\xf3\x44\xd8\xeb\x2f\x25\x14\xb8\x67\xa5\x92\xc2\x09\x98\xf7\xdb\x1d\x59\x85\xaf\xaa\x9b\xed\xab\x57\x7f\xfc\x0f\xbb\x75\x89\x90\xe4\x3f\x5e\x61\xd4\xa2\xea\xd9\x43\x8c\xb4\xcd\x30\x8a\x94\x26\x89\x91\xf7\xab\x9b\xd2\x20\x7a\xd5\x26\xfc\xe4\x7b\x50\xb7\xdf\x6e\x5b\x8b\x52\x37\x37\x7f\x47\x39\x8a\x69\x05\xc9\xb8\x67\xc3\xf9\x0b\x6d\x64\x1f\x19\xc3\xbe\xa3\x3e\x86\xaf\x3e\x05\x01\x68\x26\x92\x3c\x85\x33\x98\xb1\x2e\x2a\xe9\xd7\xa0\x79\x1d\x3d\x61\x0a\x33\x27\x46\x89\x88\x6e\x49\xec\x2e\x56\xe2\x4f\x16\x0b\x41\x36\xc7\x42\xd3\x48\x9c\x16\x11\x38\x6b\xbf\xbf\x16\x7b\x93\xd2\x2c\x2b\x82\xeb\x25\xbd\xab\x21\x03\xcf\x24\x66\x2d\xb6\xcc\x0a\x6f\x6d\x1f\x6e\x6b\x1d\xee\xbb\x2f\x32\x74\xb3\x31\x88\xc6\xb1\x27\xed\x8d\xcb\xe5\xec\x9b\x5b\x14\x6b\x1b\xa2\x04\xe8\x4f\x43\x86\xff\xb6\x71\xd5\x4b\xe9\x44\x45\x46\x4a\xb1\x31\xac\x00\x60\xb6\x0f\x92\xe4\xe6\x96\xd2\x0e\xcc\x92\xed\x02\x8f\x6a\x78\xe1\x85\x39\x38\xa5\xda\x09\x84\xde\xee\x4c\x49\x06\x52\x31\x65\xf8\xf2\x4f\x78\xa0\x4e\x13\xca\xd2\x8a\xed\xee\x71\x90\x60\x0f\x37\xd6\xef\x6b\x4f\x29\x87\x22\x76\x00\x91\x14\xda\xda\x85\x2b\xc4\xda\xba\x54\xdb\x21\x43\x7d\x6c\x52\xf9\x53\x89\xcd\x3a\xa5\x34\xbf\x14\xa4\xd2\xde\xf5\x92\x08\x24\x7e\xdf\x73\xa5\x8f\xc5\xe4\x3b\x22\x03\x48\x18\xdd\xe2\xd6\x29\x61\x4d\x79\xb4\x07\xa5\x22\xd2\x3b\x3d\x70\x40\xac\x2f\xdc\x9c\x09\xf7\x28\xd9\x3f\xde\x7f\x54\x22\x69\x51\x24\x45\x46\x27\xad\x2a\xb1\x2f\x60\x6a\x11\x2c\x89\xc1\x2a\x01\xa0\x50\x0d\xc2\xeb\x45\xf1\x14\xbc\x0b\xe2\x32\x9d\x1e\x8b\x25\x58\xb7\xa6\x47\xb0\x53\x10\x6c\x22\xe3\x1d\x9d\x13\x2a\x45\xce\x63\x67\x5f\x2a\x0c\x7c\x6f\x17\x5e\x7c\x29\x38\xaa\x19\xbe\xc8\x86\x11\x5d\xd1\xf4\xce\x14\x19\x81\xa6\x86\x4c\xbf\x1e\xbc\x7e\xf5\x52\x38\x15\x7e\xe1\x02\xa7\xba\x2c\x38\x95\xa5\x4f\x8f\xfa\xad\xbe\x66\x6b\x47\xdf\xfb\xd6\x99\x58\xca\x92\xac\xcc\x97\x9c\xc4\x9f\xee\x24\xd3\x50\x69\xb4\x72\x80\x8a\x8b\xd1\x0f\x2b\xe9\xcc\x87\x1d\x56\x22\xee\xa2\xb2\x22\x21\x2a\x1f\x7d\x44\xba\xe5\x08\x14\x1e\xb7\x55\x16\x2e\xb5\x81\x84\x55\x11\xb5\xb7\x47\x0e\xec\x9d\xfb\x36\xa5\xef\xf0\x51\xb7\x96\x43\xda\xf9\x7d\xd6\xa2\x52\x56\x0d\x71\xe7\xf7\x19\x45\x1b\x5c\xd6\x21\x06\xff\x0a\x53\x3a\x03\x4c\x65\x64\x09\x95\x09\x3a\x0b\xaf\xed\xdc\xc9\x28\xd7\x04\xf8\x8c\x49\xc1\x31\x32\x67\x46\x25\xa3\xa3\x04\x88\x04\x4c\x89\x36\xba\xe8\x17\x07\x3f\x9d\x5c\x61\x24\xc2\xa1\xcb\xe5\x76\xb3\xcc\x15\xc6\x7e\x2e\xcc\xa4\x02\xee\xc1\xe5\xf3\xf3\x30\x38\x44\x9a\xeb\xe7\x65\xde\x93\xe6\x3a\xb7\x65\xbd\xef\xa3\x24\x57\x6c\xf6\x58\x94\xc4\xe5\x98\x9e\xb1\x46\xeb\xbc\x90\xef\x5a\x22\x6a\x29\x75\x15\x4d\xeb\xc8\x5a\x1e\xa8\x23\xb9\xaf\x8a\xca\x3b\x55\xe7\xb5\x33\x3d\xb9\x24\x74\x1b\x44\xe7\x0b\x2f\x2d\x89\x10\x58\x70\xe1\x71\x8d\x50\x31\x57\xa7\x38\xc3\xdd\xd0\x5a\x0f\x4b\xae\x65\xf3\x9d\x5d\x5e\x57\xb3\xf7\xad\xba\x24\xe2\x01\x19\x96\x3f\x96\x25\x1e\xb0\x0a\x4b\xa1\x44\x82\x9c\x94\x95\x3d\x27\xc0\x41\xa2\x90\x60\x40\xd6\x7a\x5b\x91\x11\x55\xd6\xc9\x73\x76\x79\x6d\x6d\xb6\xbb\xe1\xac\xb1\x98\xdd\x5c\x42\x35\x1c\xdf\x26\x33\x34\x10\x6e\xeb\x3d\x37\x0a\x83\x95\x41\x0c\x2a\xa5\x16\x30\xb9\x18\x12\x1a\xc7\x12\xdd\x3e\x4e\xf4\xa9\x14\xac\x2a\x7c\x0b\x58\x4e\x81\x2a\xa8\xce\xa9\x82\x6e\x24\x71\x25\x62\xc9\x59\x9e\x25\xcc\xba\x11\xaa\x0f\x94\x65\x20\xb0\x49\xc4\xee\x9b\xb6\x8d\x9a\xd7\x58\xc9\x6b\x41\x85\x44\xd3\xda\x54\x1b\x56\x4f\x82\x12\xc9\xac\x2c\x0b\xb8\xb0\x6a\xee\x44\xa0\x49\xbc\x58\x35\x5f\x8a\x6a\xab\x15\x03\xae\xa5\x39\x9a\x8b\xab\x85\xad\x44\x93\x1c\x4f\x53\x01\x90\xcd\x00\xfd\xe3\xae\x0a\x97\x7d\xa8\x52\xa8\xd0\xfa\x86\x6d\xad\x48\xa0\xd2\x53\x34\x9c\x55\xc3\x93\x48\x1e\x6b\x23\x2c\x1a\x3b\xce\x2e\xaf\x2d\x25\xb4\x1f\xef\x8a\xb5\xa9\x95\xab\x54\x52\xb5\xc6\x3b\xf0\xd1\xca\x73\xb4\xd1\x3c\x16\x9a\xc3\xb8\x9e\x89\xad\x02\x59\x5a\x88\x7f\xad\x52\xee\x5a\xbc\x5d\x01\x95\xd1\xb4\x09\xfe\x37\x10\x02\x0b\x94\xc4\xc2\x46\x02\x8c\x85\x44\x95\xb8\x8f\xe4\x3d\x11\xe2\x36\xcf\xb6\xa1\xe8\x0e\x8c\xed\xf8\xb1\x15\x81\xa8\x3d\xf1\x59\xd1\xf4\x98\xab\x26\xfe\xde\xba\xec\x03\xda\x4a\x3c\x08\xa8\x4c\xa3\x10\x8b\x7a\xd3\x69\x92\x2b\x0d\xf2\x3b\x26\x95\xde\xf3\x65\x23\x71\x07\x5b\x9b\xc8\x7e\xf5\x86\x9f\x99\x9e\xfe\x4d\x28\x7d\x09\x7a\xbf\x57\xbf\x64\xfe\x76\x80\xf7\x8d\x4e\xbb\x7f\x29\x38\xec\x0f\x16\xc5\xae\x82\x94\x17\x64\x6d\x2d\x4f\x71\x53\x57\x90\xd8\x40\x4f\xbc\x50\xd9\x2b\x37\x82\x18\xed\x05\xdf\xe0\xe9\x9f\x02\x4d\x28\xd6\x56\xc2\xbb\xa7\x76\xae\x46\x9a\xb6\x95\x53\xf0\x01\x2d\x9c\xa0\x37\xaf\xa2\xa8\x52\x4c\x45\x8b\xf5\x9f\xdd\x44\x9e\xdb\x79\x07\xd8\x6e\x36\xd7\x20\x67\x2c\x82\x37\x8c\xdf\xee\xb8\xfd\xea\xd1\x25\xe7\x4b\xd0\x6a\x65\x45\xad\x8f\x96\x71\x1b\x7c\x67\x58\x0c\x1d\x89\x5c\xa3\xec\x86\x0e\xc7\x52\x71\x64\xfc\xbf\xed\x5a\xa0\xbd\x3d\xb3\xa5\xae\x56\xe9\x88\xaa\x67\x8d\x3e\x5e\x09\x54\x73\xae\xe9\x3d\xd2\x14\x11\xdd\x82\x24\x89\x99\xc6\x80\x94\x81\x2f\xb5\x32\x70\x32\x87\x1d\xa3\x2e\x9a\x5a\x3a\x20\x9b\x42\x0a\x92\x26\x85\xf6\xd5\x06\xd5\x6f\x1c\xe1\x2c\xa0\x56\x63\x52\x6c\x59\x20\x57\xbf\xcc\x9c\xc3\xf3\x55\x77\xa5\x14\xab\xdc\xba\x9b\x29\x27\x70\xcf\x14\x9a\xf5\x33\x11\x57\xd3\xcf\x72\x05\xb2\x5f\x24\x07\xba\x04\x1c\x55\x04\xe2\xc4\x30\xca\x27\x13\xc6\x27\x8e\x3a\x23\x4d\x2f\x8b\x84\x95\x9a\x0e\x86\x68\x47\x12\xa8\xb6\x69\x3b\x99\x88\x6d\x7c\x19\xab\xde\x9f\x8a\xd8\xde\x3e\x9a\x5b\x6d\xd0\xaf\x6c\x19\xd9\x7c\xc1\x89\x90\xae\x40\x02\x8d\x63\x9c\xfb\xf2\x17\xba\xfe\xc2\xd5\xaf\xea\x15\x71\x1c\x36\x24\xbb\x78\xaa\x82\x16\x95\x8f\x7c\xc3\xe0\x45\xdb\x29\x46\x31\xf7\x6d\x39\x7d\x57\x9a\x09\xad\x6f\x53\xc1\x85\x6b\x44\xef\x55\x03\x94\x11\xed\xe1\xc2\xf7\x9d\x2f\xaf\xbe\x0f\x6b\x6e\x72\xce\x77\x67\x2f\x8d\x58\x4b\x9d\x5b\xf3\x15\x5f\x61\x0b\xaa\x2f\x78\x47\xdd\xce\xa2\xd8\x19\x51\x43\x9a\x09\x49\x25\xb3\xe4\x6e\x71\x9f\x19\x7e\xb1\x62\x83\xcd\x6c\xc7\xb9\x15\x7b\x6c\xe5\x5e\x46\x6a\xcb\x45\xd1\xcf\xda\xf0\x05\x15\x4d\x21\xce\x31\xb8\x7c\x92\x53\x6c\x68\x69\xa8\x85\x33\xaa\xcf\x5d\xf8\x9f\xdd\x74\x45\x60\x61\x91\x47\x30\xc7\x60\x1c\x2c\x93\x67\x7e\xc1\xdd\x6a\x43\x10\x6d\x43\x40\xec\x2e\x56\x8d\x46\x5c\xb3\x09\x23\x8a\xcd\xca\xa8\x3f\x54\x70\x1f\x81\x21\x6b\x5a\x95\x93\x75\xf1\x29\x4c\xf0\x22\x5f\xc0\xe3\x10\x66\x2c\xc2\x37\xac\x3d\xc2\xee\x0b\x2c\xb2\x47\xf3\xb2\x41\xeb\x9a\xc3\x73\x63\xbe\xad\xc8\xf2\xc1\xa7\x7c\x6c\xff\x56\x87\x62\x11\x83\x75\x45\xc8\xbf\x87\x08\x1e\x39\xf0\xab\x12\x01\x5c\x40\xbf\xeb\xa5\xe6\xa3\x4b\x36\x1c\x12\x8c\xf3\xdc\x55\x18\x6b\xa1\x67\x34\x77\x22\x36\x72\xfe\xb5\x51\x69\xa8\x9c\xb4\x57\xff\xf6\x4f\xe4\x24\x4f\x31\xca\xce\x09\xd3\x65\x49\x55\xd7\x95\xcf\xb2\x53\xb4\xd8\x19\x66\x7c\xfa\xf6\xcc\xfb\x98\x6c\xc8\x5b\x19\x75\xee\x73\x52\x8c\x90\xd7\xd2\x92\xbb\x68\xca\x35\x07\xad\xb4\x0f\x97\x5c\xc3\xe9\xa7\xce\x56\x59\xbc\xcd\x6f\x4b\xc6\x33\x23\x67\xa0\x74\x54\x5a\x2b\x79\x34\xa5\x7c\xe2\x0b\xd1\x57\xe7\xe5\xa4\x08\x57\xaa\x13\x54\x44\xb3\x32\x79\x28\x16\xb9\x79\xf9\x17\x5f\xf4\x08\x83\x63\xf2\x45\xe5\xc1\x01\x39\x77\xf7\x56\x3e\xb8\x12\x67\x3c\x2a\x3f\xb7\x47\x24\x4c\xa8\x8c\x13\x4c\xda\x1b\x17\xe2\x91\x4d\xed\x71\x1f\x88\xa4\x12\x23\xfb\xb8\xd0\xab\xec\xa4\x3b\x75\xd9\xb6\x42\x55\x3f\xa6\x9a\xf6\xb1\xf8\xb7\x25\x3a\x47\x56\xd1\xef\xbb\x8a\x83\x7d\xea\xb6\x42\xa5\x0f\xf7\xef\x5d\x72\x56\x9f\x16\x77\x31\xde\xa7\x7d\xac\xfd\xd7\x3c\x6a\xf5\x11\x02\x1c\x5a\xe9\xdc\x2d\x0a\x4f\x2e\x0a\xca\x45\xbd\x62\xc4\xc1\x80\x5c\x0a\x5d\xd6\xa7\x2d\x62\x29\x5c\x6d\xc5\x55\xe7\xef\xfc\xf2\xe6\xea\xef\xc3\x77\x17\x97\x37\xe1\x18\x86\x63\xf8\x59\x1d\x43\xe0\xb3\xd6\x47\xb0\x50\xa0\x56\xe9\x94\x0b\x35\xea\x2a\xb9\xd4\x2f\x28\xba\xeb\x9c\xcf\x7e\xa2\xb2\xec\xf8\x8c\xf2\xd9\x4a\x37\xac\x6f\x09\x8d\x24\xe9\xf4\xd9\x87\x77\x3d\x62\x70\x56\x87\x41\x2f\x97\x95\x12\x00\xab\x56\xad\xda\x26\xe7\xf4\xd7\x8b\xb3\xf3\xcb\x9b\x8b\xef\x2e\xce\xaf\x1e\x35\x5a\xa1\x65\x8d\xb8\x3a\x13\x6d\xc8\xd5\x32\x09\x33\x26\x72\x55\x34\xa3\x59\x4d\x02\x96\xc3\xdd\x78\x4c\x28\x9f\x7b\x6b\xd5\xea\xc7\x3e\x77\xd6\x58\x0f\xb5\x68\x51\x7f\xa3\xab\xcd\xf6\x9d\x14\x8d\x9b\x63\x2f\x5a\xba\xad\xb6\xee\x2d\xdc\xab\xd6\x7f\xdf\xa5\xea\xd7\x18\x85\x13\xcd\xca\xba\x00\x46\xd4\x4b\x33\xdd\xa2\xda\x75\x27\x35\x3c\xbb\x29\x77\x69\xc3\x12\xde\xd2\xec\x07\x98\x5f\x41\xcb\x32\x1f\x0b\x9e\x85\x04\x22\xc3\x96\xc8\x2d\xcc\xad\xc3\xf1\xd4\xbf\xac\x4d\x39\x92\x27\x59\x02\xf5\x16\xda\x94\xa7\xed\xb2\x76\xe9\x2d\xb4\x88\x53\xf4\x63\xa9\x8a\xa7\x59\x42\x94\xaa\xcc\x9a\xb6\x5b\x3d\xd2\x6d\xdd\xd2\x8f\x50\xab\x75\xbf\xca\x9c\x1d\x9d\xd5\x3b\x17\x53\x10\x33\xc3\x69\xe0\xee\xc8\xc5\x68\xf5\x0d\x75\xef\xdb\x5d\xab\x8e\x30\x10\xe5\xe8\xf7\xf8\x1f\x57\xdb\xea\x24\x8e\x5d\xac\x70\xae\x60\x9c\x27\xd6\x72\xad\x06\x84\x66\xec\x27\x90\x0a\x0d\x8c\xb7\x8c\xc7\x3d\x92\xb3\xf8\xdb\x36\xc5\x91\xec\xe8\x70\x15\x84\xf7\xcf\x74\xbb\x12\xd7\xce\xfd\x56\xe5\x5d\x05\x11\x21\x36\x11\x10\xf7\xa6\xb7\x88\x3a\xa1\xa0\x23\xd4\xb4\x0b\x88\x35\x03\x97\xb0\x5b\xba\xba\x5f\x12\x56\xeb\xda\x28\x0a\x49\xc5\xc7\xbe\x5e\x9a\x2a\xba\x20\x0d\xcc\x0e\xeb\xd5\xff\x54\x19\x8d\xa0\x47\xfe\x51\xfc\x88\x4d\x54\xd5\xfb\xfd\xfd\x3f\xff\x70\xfe\xf7\xff\xdc\xdf\xff\xe5\x1f\xd5\xab\xc8\x0a\x51\xc7\x5d\xb8\x05\x2d\xd2\x5c\xc4\x70\x89\xef\xc0\x3f\x9d\x78\x75\x12\x45\x22\xe7\xda\x5d\xc0\x24\xde\xc1\x54\x28\x7d\x31\x2c\xfe\xcc\x44\xbc\xf8\x97\x6a\x55\xf1\xeb\x49\x32\x06\x5c\xa2\x16\xc9\x28\x76\x74\xc7\x1e\x4a\x5a\xd2\xf1\x51\x75\x50\xfd\x6e\xc4\xca\xb1\xd6\x2f\xf1\x9d\x47\x01\xb6\xad\xf3\xd5\x02\x38\xa6\x58\x1b\xc9\xb4\x5e\xfe\x6d\x6f\xf6\xba\x55\x83\x4e\x3b\x3a\x24\x6d\xc5\x0a\x76\x8c\x30\xc4\x88\xef\x08\x84\x07\xb9\x60\xb0\x5e\xab\x28\x9d\xaf\x27\xc3\x0b\x32\xb3\x18\x7e\x32\xc8\xf1\x2e\xa5\xef\x3e\x2a\x8d\x2b\x7d\x82\x0b\xa9\x9c\xc7\xd6\x7b\xeb\xaf\xbb\xb4\x7a\x55\x14\xa8\x02\xa3\xd8\x1c\xd8\x1f\x07\x51\x96\xf7\xdc\x0d\x83\x14\x52\x21\xe7\xc5\x9f\x85\xc3\xac\xaf\xb4\x90\x74\x82\x69\x18\xf6\x71\xfb\x58\xf1\x97\x7d\xb0\xf6\x82\xe5\xa7\xad\xe2\x1a\xe5\xd2\x08\x0d\xc9\xbc\xac\x60\xf9\xf2\x68\x9b\x47\xfd\x13\x21\x6d\xc5\xce\x68\xdb\xbe\xd0\x8e\xfa\x86\x2c\x5d\xe6\x28\x70\x16\x58\x44\x7d\xd2\xa5\x99\xf6\x0a\x31\x08\x7f\x05\x3e\x33\x9a\x65\xe3\x42\x59\xe5\xe8\x90\x9a\xc5\x6c\xc6\x94\x68\xd5\x96\xdd\x01\x5a\x1f\x41\xef\x2a\x5d\xd8\x38\xa1\xc2\xc8\x75\x9f\x61\x6d\xa0\xe2\xbc\x2e\x90\xfd\xd7\x6d\xba\xf7\xda\x91\x51\xad\x41\xf2\x63\xf2\x5f\x07\x1f\xbe\xfc\xad\x7f\xf8\xed\xc1\xc1\xfb\x57\xfd\x3f\xfd\xf2\xe5\xc1\x87\x01\xfe\xe3\x0f\x87\xdf\x1e\xfe\xe6\xff\xf8\xf2\xf0\xf0\xe0\xe0\xfd\x0f\x6f\xbf\xbf\x19\x9e\xff\xc2\x0e\x7f\x7b\xcf\xf3\xf4\xd6\xfe\xf5\xdb\xc1\x7b\x38\xff\x65\x4b\x20\x87\x87\xdf\x7e\xd1\x7a\xea\x1d\xd4\xd8\xb4\xa3\xcb\x4a\x9b\x75\x88\x9d\x6c\xbf\x8f\x58\xab\xde\x0e\xbf\xbd\xba\x3e\xff\x3e\x58\xf8\xb8\x64\x48\x05\xbb\x7e\x32\x07\x5c\x41\x24\x41\x7f\x0a\x4b\x8e\x7d\x53\x25\x6c\x64\x5f\x91\x42\xb5\x78\x69\x7c\xee\x73\x30\xee\x78\xb1\xdd\xae\x6b\x29\x89\x8e\xa5\x48\x7d\x12\x38\x3a\x23\x66\x18\xf8\xeb\xee\xbb\x85\x56\x3d\xff\xec\x08\xc6\xa0\x60\x0c\x5a\x33\x1e\x34\x06\x5d\xdb\x7d\xf8\x64\x2d\x41\xc0\x67\x4d\x5d\x18\x2b\xfd\xdd\x5e\xd7\xa9\x56\x4c\xdb\xce\x01\x36\xf0\x47\xbd\xf4\x9c\x95\x71\x2a\x96\xa1\xa5\xab\x3d\x8e\xe4\x04\x5b\x90\xda\x83\x8f\x00\xca\x2c\x0b\x57\x9c\xdf\x16\xf4\x83\x99\x99\x42\x51\xca\xb9\x56\xfb\x11\x63\x2d\x31\x02\xf4\x67\x1b\x90\x79\x6b\x63\x34\x8d\x92\xc6\x78\x59\x35\xb3\x10\x0e\xcb\x1a\xc9\x54\x29\x11\xd9\xd8\xd2\x22\xe6\x1f\x0b\xb9\xb9\x69\xe3\x6c\xb0\x5d\x72\xa5\xad\xb6\xad\x9f\x5c\x7e\xeb\x68\x8e\xd5\x21\xf9\xac\x70\xb2\xf9\x0c\x12\x9c\xc9\x6a\x18\x2f\x2b\x5c\xc0\x6c\x44\xe7\x04\xab\x44\x0d\x20\xd5\x2f\x34\x6c\x8a\x81\x13\x62\x5c\x5a\x59\x9b\x75\xab\x6b\xcd\xc5\xdb\xf3\xcc\xc2\xb3\xd5\x4a\x18\x5a\x62\x96\xa5\xf9\xb9\xce\x24\x5f\x82\x33\xb0\x3d\xfb\xfc\xec\x58\x67\x47\x6c\xb3\x1b\x96\xb9\x83\xef\xa4\x4b\x36\xd9\x85\xb3\x24\x93\x30\x66\xf7\x1d\x9d\xd3\x13\x5e\x5a\x62\x58\x0c\x5c\xb3\x31\xb3\x19\x25\x99\x84\x0c\xb8\x0d\xe5\xa7\xd1\x14\x69\xbf\xe3\x94\xa5\x73\xfa\x29\x86\xde\x58\x81\xbb\x5b\x52\x76\xbd\x4a\xd8\x0f\x74\x8c\x04\x3a\xd6\x78\x7c\x22\x3a\xe6\x76\xee\xd3\x21\x62\x18\xd7\xdd\x3e\xb0\xfc\xac\x12\x25\x8e\xbb\x78\xe7\x5d\x56\x66\xfd\x1c\x21\x94\x46\xd6\xe7\x56\x9b\x01\x5f\x3b\xcc\x93\xa4\xa3\x5a\xd4\xfb\x17\x88\x8d\x2c\x4f\x12\x97\x82\x3b\x20\xef\x38\x9e\xc7\x13\xec\x79\xd0\x23\x97\x30\x03\xd9\x23\x17\xe3\x4b\xa1\x87\x56\xb0\xad\xc7\xb2\xd9\x1b\x09\x1b\x93\x63\xa3\x32\x29\x4d\xb4\xad\x3b\x5f\xa9\x92\x23\x64\x0d\x40\x59\x80\xab\x45\xc4\xf8\xfa\x65\xf9\xbd\xcf\xef\xea\x3f\xd2\x32\x15\x8d\x3d\x3a\xd0\x4d\x7d\xe7\x35\x17\x1d\x87\x6d\xc0\x9d\x6b\x64\x55\x86\xeb\x33\x2c\x3a\x91\x09\xa5\xaf\x8d\x0a\xdb\x4d\xd3\x97\xa1\x07\x87\x7d\x14\x68\x92\x40\x5c\x6b\xd7\x63\xbb\x55\xd0\xba\x0a\x8d\xb9\xb7\x45\xf3\x04\x20\x53\xca\xe3\x04\x24\x16\x40\x57\x8b\x55\x9e\x58\x59\xf1\xbf\xe8\xd1\xe0\x93\x24\x69\x14\x09\x19\xbb\x9e\xab\x2e\x95\x11\x27\x53\x1c\x2f\x24\xb4\x29\xe5\x74\x62\x9b\xed\x2d\x95\xd1\xc5\xe2\xca\xaa\xd2\xe8\x61\x2a\xc4\x2d\x89\x44\x9a\x25\x78\x00\x5a\x9c\x8f\xb2\xcf\x4c\xb1\x45\xfb\xd8\x14\xf0\xa8\xd2\x82\x06\x7f\x78\xc4\x26\x7f\x5d\xc8\x29\x70\x0f\x51\x67\xcd\xe5\x0c\x45\x34\xab\x8c\x3e\x71\xc1\x0b\x71\x65\x2c\xcc\x61\x34\x6b\x5d\x66\xe7\x17\x44\x6f\x40\xce\xef\x21\xaa\x34\x68\x34\x4f\xb8\x0e\x8d\x5a\xa0\x3d\xa4\x7d\xe3\xdd\xd6\xa6\xfc\xae\xcc\xe7\x2d\xd2\xbf\xaa\x63\xa1\x16\x1b\xc2\xf4\xa5\xa7\xdd\x2b\xb0\x8a\xbf\x4d\x17\xc6\x94\x30\x5f\x8d\xba\x76\x86\xec\x89\x5d\x2a\xe0\x56\x04\x28\x7b\x58\x98\xb6\x2c\x84\x26\x07\xfb\x47\xfb\x87\x4b\x76\xbd\x85\xfa\xc5\x37\x95\x27\x19\x16\xec\xcb\xb0\xfa\x1d\x44\xfb\x71\x8f\x30\xed\x69\xb4\xad\x1b\x80\xb3\x72\x79\x6a\x3d\xa2\x04\xd1\x92\xc6\xcc\x69\x4e\xf8\xab\xb9\x49\xcb\xdc\x15\x0d\x38\xd8\xff\x6d\xbf\x47\x40\x47\x87\xe4\x4e\xf0\x7d\x8d\xd3\xc7\x0a\x1b\xb9\xaa\x00\x9a\x8b\x1c\x3b\xd0\x59\x14\x14\xe5\x32\x0c\xa1\x23\x22\xb7\x5d\x6f\xa6\x54\xfb\xfc\xb8\xf3\x7b\xa6\x7d\xa7\x07\x31\x26\xaf\x6c\xd3\x1d\xa0\xce\xb2\x98\xb0\x19\x1c\x4d\x81\x26\x7a\x6a\x83\x2f\xb8\xe0\x7d\xdb\xf0\xcc\x50\x20\x77\xa5\xad\x1f\xa2\x9d\x99\xae\x3a\x5a\x98\xec\x96\x27\xd4\x52\x22\x37\xb4\xf7\xfb\xe6\x2d\x5d\xc9\x52\xb7\xe3\x9b\x9b\xe1\xf7\xb5\x9e\xae\x48\xfc\xb5\xce\x7c\x48\x4c\xa5\xf4\xc4\x13\xa0\x1d\xdd\x38\x01\x5b\x35\x64\x25\x1d\x92\xb0\xb6\x8d\x59\xc9\x72\xf7\xea\xdd\x3a\xb2\x92\xbf\x8b\x1c\x1b\xd2\xd1\x51\x32\x27\x77\x94\x6b\x9f\x6c\xb7\x67\x40\xed\x19\xf2\x64\x76\xc3\xdf\x80\xc6\x20\x15\x52\x0f\xa0\x8d\x4b\x6c\xf9\xd1\x99\x73\xaa\x32\xb7\x6e\xf9\x40\xae\xb4\x48\xc9\xd4\x7d\x76\x3d\x01\xd1\x9d\x8c\x01\x9e\x1e\x2b\x1d\x1b\x99\x2b\xb3\x14\xce\x3d\xf3\xe2\xe8\xd7\x12\xdd\xb0\x78\xaf\x95\xa2\x8f\xaa\x68\xab\x36\x2c\x61\xdc\x22\xcb\xb6\x1a\xec\x88\x96\x76\x10\x54\x40\x3a\x0c\x2c\x20\xed\xd2\x19\x17\x01\xa1\xb3\xac\x7d\x0c\x55\x67\xb1\x0a\xa4\x33\x7f\x3c\x59\x65\xbc\x74\x7b\xc6\x46\xce\x76\x84\xc4\x4e\xbd\xe0\xa4\x7d\xc2\x64\x75\x6c\x46\x40\x37\x8b\x4f\xba\xc4\x40\xd6\x41\xc8\xf4\x72\xc0\xf4\x52\xa7\x6c\x24\x13\xb6\x6e\xd3\x93\xe1\x32\x6d\xdb\x86\x93\xd5\xd9\xc2\x92\xf0\xa2\x59\xec\xf3\x68\x1d\x4e\xba\x0b\x6d\xec\x3a\xb0\xb1\xd3\xb0\xc6\x8f\x1a\xd4\x88\xa9\x14\xad\xa9\x48\xdd\xa6\x8e\x20\xcd\x0e\x30\x7a\x9b\xd1\x38\x9d\xec\xe7\x8c\x42\xbe\xa1\x45\xdd\x8a\x6a\x8e\xda\x93\x38\x63\x3a\xca\xae\x45\x74\xdb\xa1\x5e\xb3\x7f\x73\x3a\xb4\x20\x2b\xaa\x0d\xe5\xde\x18\xc2\xf8\x4c\x24\x33\x5b\xf7\xee\xe6\x74\x88\x27\x6f\x80\xff\x42\x43\x14\x6a\xd4\x73\xf3\xac\x0f\xf6\x77\x2e\x1c\xa3\x7d\x5b\x0b\x1a\x25\x12\x68\xc2\x94\x66\x11\x3e\x57\xd8\xb6\x10\x42\x1b\xdf\x4d\xd0\x94\x56\x8d\xce\x35\xa5\x4a\xef\xd5\x5d\x95\xa6\xb6\xc1\x79\x4f\x98\x2f\x39\x7e\x24\x8b\xd6\x62\x81\x2f\x75\x04\xef\xe9\xf2\xa5\x4c\xc2\xb5\x16\x59\x47\x9e\x10\x0b\x6c\x8d\x1f\x64\x04\x63\x21\x61\xd1\x11\x52\x71\x6c\xc4\x39\xb8\xb2\x94\x27\xc3\x8b\xc2\x04\x25\x6a\xce\x0b\x1b\x96\xe8\x6b\x51\x26\x6c\x06\x1c\x94\x3a\x42\x97\x47\x9e\xb9\xf6\xfa\xae\x8b\x6c\xcf\x7c\x1d\xa4\x99\xad\xe6\x58\x84\xfa\xbb\x1e\xb6\xf8\x23\x68\x5b\x86\xb1\xf0\xbf\x38\x8b\xaa\x9f\xfe\xa2\xab\x24\x92\x54\x4d\x6d\x7f\x57\xb8\x67\xda\xf5\x28\x96\x40\x95\xe0\xd6\xd8\x5b\x69\x35\xcb\x14\xc9\xa8\x52\x65\x51\x6c\xf7\x12\xfb\xd0\xd0\x16\xd2\xad\x3e\x30\x91\x34\x02\x92\x81\x64\x22\x26\x98\x73\x1b\x8b\x3b\x4e\x46\x30\x61\x5c\x79\xfc\x19\x40\x1e\xd1\x86\xdd\x00\xda\x86\x7d\xbd\xb2\x01\xb9\xaa\x15\x0a\x71\x29\x3c\x91\x28\x4f\xb4\x9b\xc5\xa2\x93\x09\xa3\x26\x11\xbd\xb6\xc9\x4a\xb1\x30\xd5\xbe\x33\x0f\x4c\xba\x03\x6f\x93\x6d\x8d\xe4\xaf\xad\xc5\x0e\x96\xff\xa4\xd1\xb4\x9d\xfb\x36\xb8\xa7\xb6\x1c\xc1\x3d\xb5\xdb\x08\xee\xa9\xe0\x9e\x5a\x3f\x9e\x9c\x79\x37\xb8\xa7\x82\xd2\xb5\x38\x82\x7b\x2a\xb8\xa7\xd6\x8c\x27\x47\xbf\x82\x7b\x6a\x8b\x11\xdc\x53\x5b\x8e\xe0\x9e\x0a\xee\xa9\xe0\x9e\x0a\xee\xa9\xcf\xc8\x0c\xe8\x47\x70\x4f\x2d\x01\x09\xee\xa9\x0a\x32\x82\xa6\xb4\x62\x04\xf7\xd4\x8a\x11\xdc\x53\x95\x11\xf8\x52\x03\xbe\xe4\x9d\x3b\x43\xa3\x97\xb5\x6f\xaa\x8b\xda\x1d\xd6\xf3\x7b\xa1\x69\x4d\x6d\x6c\xfc\x4f\xda\xbe\xff\x44\x7c\x28\x1d\xd8\xf4\x83\x3d\xff\xc5\xd9\xf3\xbb\xb1\x85\x75\x60\x07\x6b\x4d\xca\x9d\xd7\xfc\x66\x2a\x41\x4d\x45\xd2\x78\xa3\xd7\x36\xf9\x5b\xc6\x59\x9a\xa7\x66\xcf\x29\xb3\x9f\xd9\xac\x70\xcf\xab\xb2\x41\x31\x7a\xed\xad\x49\xce\xdc\xc8\x62\xc0\x6a\x9c\x94\x25\x66\x19\x31\x7f\x72\x4a\x51\x26\x56\x79\x14\x01\x60\x27\xad\xaa\xba\xf0\xf5\xa0\x78\x53\xd1\xdb\xe1\x75\x3b\x7a\xd3\x8e\xc9\xda\x7a\x99\x08\xe5\xeb\xaf\x1a\xc1\x68\xe9\x4e\xf9\xf4\xae\x94\x0e\xc8\x74\x7b\xc5\xa0\x95\x52\xd0\x05\x97\x68\xab\x0c\x3c\x37\x97\x49\x67\xae\xc3\x0e\x5c\x25\x4f\xc8\x4d\xf2\x64\xd8\xc2\x53\x71\x8d\x3c\xc1\x52\xa0\x1d\x58\xf2\xbb\x70\x85\x74\xe7\x06\xf9\x08\x15\x33\x3f\x8e\xfb\xa3\x43\xb5\xb3\x23\xb7\xc7\xa7\x70\x79\x74\xf2\xd5\x6d\x5d\x1d\x9f\xce\xcd\xd1\xcd\xe7\xb6\x34\x23\xbd\x08\xd7\x46\x07\xe6\xa3\x2e\x4d\x47\x9d\x99\x8d\x3e\x9a\x2b\xa3\xbd\x1b\xe3\x09\xb8\x30\x5a\x23\xd9\xb6\xf1\x4f\xce\x20\xa1\xf3\x6b\x88\x04\x8f\x1b\x73\x98\x85\x12\x6a\xc5\xf9\x51\x16\xac\xd3\xd1\xea\x81\xbe\x53\xea\x2a\xc5\x42\xec\x63\x97\xbd\x49\xcf\x09\x14\x68\x8d\xb3\xb3\x6c\x52\x87\xe9\x4e\xc8\xdb\x44\xd0\x58\x1d\x65\xc2\xfe\x5f\x19\xc6\x5b\x89\xdf\xb5\xef\x6a\x17\xc0\xfb\xd8\xca\xa0\x8d\x7a\xee\x72\x11\xff\x26\xee\x88\x18\x6b\xe0\xe4\x80\x71\xbf\x8e\x87\x15\x35\xb0\xd4\xcc\x8b\x6d\x6d\xae\xbe\x7e\xe5\x6f\x7e\x79\x2a\x37\x1a\x17\x94\xfa\xf8\x16\x10\xf7\xa2\x87\x4d\x20\xee\xc6\x71\x9e\xd4\xcd\x20\xd6\x34\x52\xa7\x37\xaf\xcb\x5a\x97\xaf\x11\x6e\x71\xda\x28\x8f\x89\xcb\x90\x78\x79\x8b\xd6\xda\x41\xfb\x12\x9c\xb3\xc1\xf6\x42\xba\xb6\xbd\x3c\x92\x13\xf6\x09\x4a\xcd\xcf\xd4\xf1\x1a\xa4\xe6\x1d\x46\x25\xd1\xea\x7b\x49\x23\x18\x76\x2e\x70\xf8\xe3\x44\xe2\x5c\xba\xfc\xb8\x42\xee\x28\x0e\x0f\x07\x88\xed\x69\x2a\xb2\xcf\x30\xed\x6b\x9c\x27\xc9\x9c\xe4\x99\xe0\xf5\x14\x3f\xeb\xb4\x5a\xcc\x0c\x33\xd0\x56\xbd\xa5\x94\x52\x33\x29\x1c\x03\x96\x39\xe7\x86\x9e\x97\xdd\x6f\x50\x2a\x55\x96\x56\x57\xf3\xcf\x14\x9b\x98\xe9\x1b\x66\x8a\xa9\x69\x2c\x85\xb2\x3f\x42\x09\xd0\x3c\x3d\x16\x32\x62\xa3\x64\x4e\xa6\x34\xd1\x65\x2f\xf0\x5b\x96\x24\x0e\xcc\x80\x5c\x83\x26\x7a\xca\x5c\x97\x6a\x92\x08\x3e\xc1\xc9\x51\xee\x5b\x6c\x41\x64\x9e\x8d\x12\xa0\x3c\xcf\xec\xfb\x0c\x5b\x9f\x8b\x5c\xfa\xf7\xb9\xfa\x91\x05\x14\xa6\x08\x67\x49\xaf\xd2\xc8\x67\xe3\xc2\x96\xdd\xcd\x15\xf8\xe4\xbd\x3b\xa6\xa0\x57\x85\x29\x66\x20\x25\x8b\x9d\xd3\xc0\xfe\x96\x49\x31\x63\xb1\x6d\xc5\xe0\xd1\x86\x2d\x43\x6d\xab\x86\xe2\x3c\x73\xc1\xfb\x1c\x26\x14\xa5\x1e\x77\x8a\xec\x9a\x59\x38\xd6\x15\xc7\x63\x6c\xde\x60\xd4\x05\x91\xd5\x72\x46\x67\xcc\xb6\x9d\xac\x60\x8e\x1c\x70\x41\x04\xb2\xd7\x9c\x33\x6d\x5b\x19\x4f\x73\x4d\x62\x71\xc7\x0f\x0d\x70\xa6\x0c\x1e\x0c\xd3\x4e\xb2\xa9\x6f\xac\xea\x1b\xfd\x31\x09\x8a\x00\xa7\xa3\xc4\xac\x3a\x46\x05\xdc\xac\x44\x11\x19\x03\xd5\xb9\x04\x32\xa1\xba\xa5\xeb\xba\x33\x11\xe9\x9b\x3f\x36\x3b\xdc\x2c\x05\x91\xeb\x4f\xa2\x03\xde\x4d\x59\x34\xad\x8a\xb4\x2c\x05\x45\x44\xbe\xa0\x1c\xbf\x76\x8f\xad\x94\x47\x83\x22\xb8\x72\x34\x35\xef\xae\xb0\x81\xb9\x36\x7e\xcb\x81\x2f\x95\x36\xa5\x54\x11\x4a\xce\x2e\xaf\x7f\x7d\x73\xf2\xd7\xf3\x37\xee\x60\xf1\x2a\xb7\xce\x39\xfb\x67\x0e\x84\xa6\xc2\x08\xc4\x49\x35\x7e\xa6\x87\x7a\x7d\xe5\x07\x3c\x80\xdd\x46\xda\x34\xe4\xa4\xd8\x53\xb9\x7d\x3c\x11\x76\x66\xfe\xf8\xe1\x44\x8f\xdd\x6b\xa6\xe8\x95\x69\x3e\xb8\xda\x6b\x86\x12\x0e\xda\x9c\x3c\x2b\x0a\xda\xde\x43\x8c\x4f\x92\xaa\x14\xd8\x8c\x5c\xb5\x55\x66\xda\xaa\x32\xfd\xf2\x0b\x86\x4d\x35\x9a\x4e\x7a\xde\x94\x73\xe8\xa8\x53\x44\x49\xb5\xbd\xfc\x6e\x5b\x79\x7a\xf9\xdd\xca\x0c\x17\x43\x42\xe3\x58\xa2\x7c\x81\xa7\x3e\x5d\xe8\x18\x87\x0f\x5b\x2b\x7a\x8f\xbc\x22\x7f\x26\xf7\xe4\xcf\x28\xcf\x7f\xd3\xb6\xaf\x46\x5b\x49\xbb\xbd\x3d\xc1\xaa\x91\x17\xc3\x8e\x30\xfe\xf3\x94\x6a\x84\x68\xb0\xaa\x05\x19\x31\x27\x3f\xc2\xbd\x06\x69\xe4\x19\xb7\x12\x8f\xda\x91\xc4\x4c\xf0\x13\x6e\x33\x6b\x2c\xbf\x18\x57\x4b\xf6\xeb\x1d\x37\x9a\x79\xdc\x28\xe6\x97\x8e\x0a\xd5\x1b\x00\x94\xd0\x52\xaa\xa3\x69\x9d\x8c\x19\x01\x43\xd5\x98\x53\x2c\x90\x8c\xdb\xc0\xb3\x29\x6b\xe1\xfa\x7f\x3a\xdb\xb8\x9d\x37\xb8\xb6\x9e\x9b\x56\x6a\x41\x63\x47\x3e\xef\x04\x83\x4a\xe1\x90\x4c\xc4\x03\x72\x4e\xa3\x29\x4e\x2b\xae\xf0\x0c\xa3\x3a\x20\xb0\x29\x9d\x99\x85\x77\xcf\xda\x86\x19\x28\xad\x14\x36\x52\xdc\x4b\xe6\x3c\x45\x94\xdb\x96\x75\x63\x90\xd2\xc6\x0a\x8e\xe6\xe8\xb2\x64\x11\xb4\x5e\xbc\x56\x27\x29\x93\x42\x8b\x48\xb4\x68\x9a\xb2\x18\xb6\x8c\xe0\x10\x09\xd6\xda\xe8\x8d\xbc\x3f\x9e\x0d\x7b\xe4\xe6\x74\x88\xdd\x2e\xae\x4f\x6f\x86\x75\x09\x7b\xef\xe6\x74\xd8\xa2\xf9\x7e\x27\xc6\x0a\x67\x1f\x3b\x36\xd3\xdc\x19\x88\x04\x1a\xb3\x10\x00\xbe\xfd\x08\x01\xe0\xeb\x47\x08\x00\x0f\x01\xe0\x21\x00\x7c\xf3\x08\x01\xe0\x6e\x3c\xbe\xa9\x87\x84\x00\xf0\x86\xe3\x65\x39\x21\x43\x00\xf8\x4e\x23\x04\x80\x2f\x8f\x10\x00\xbe\x66\x84\x00\xf0\x35\x23\x04\x80\x87\x00\xf0\x10\x00\x1e\x42\x59\x1e\x84\xf5\x34\x43\x59\x48\x08\x00\x77\x23\x04\x80\xbf\x08\xbf\x3f\x09\x01\xe0\x5b\x8d\x10\x00\x1e\x02\xc0\x9b\x8c\x10\x00\x8e\x23\xd8\x5e\x42\x00\xb8\x1f\x21\x00\xdc\x8e\xcf\x47\x6a\x0e\x01\xe0\x21\x00\x3c\x04\x80\x87\x00\xf0\x0d\x23\x04\x80\x3f\xb2\xb4\xeb\x5b\x58\xb5\x8f\x5e\xbe\xf2\x90\xb6\x8f\x87\x21\xe7\x2b\x7e\x45\x7b\x88\xca\x0c\x10\x59\x82\x4c\x24\xd0\x78\x8e\x20\x23\xf4\xa7\x94\xd2\xd1\x33\x0c\xab\x49\x58\xca\x9a\x05\x8c\x93\xa5\x43\xf3\x06\x61\x55\x7c\x2f\x06\x2d\x29\xbd\xc7\x03\x40\x53\x91\xdb\x8e\x59\x91\x48\xb3\x5c\xd7\x71\x8a\xcb\xd3\xa4\xd9\xd5\x98\x4d\x1c\x2b\x3c\xb2\x7d\xb9\xfa\x05\xd8\x7e\xa5\x17\xd6\x23\x6a\x1e\x34\xf6\x71\x23\xc3\x0e\x94\x80\x8c\x6a\x0d\x92\x1f\x93\xff\x3a\xf8\xf0\xe5\x6f\xfd\xc3\x6f\x0f\x0e\xde\xbf\xea\xff\xe9\x97\x2f\x0f\x3e\x0c\xf0\x1f\x7f\x38\xfc\xf6\xf0\x37\xff\xc7\x97\x87\x87\x07\x07\xef\x7f\x78\xfb\xfd\xcd\xf0\xfc\x17\x76\xf8\xdb\x7b\x9e\xa7\xb7\xf6\xaf\xdf\x0e\xde\xc3\xf9\x2f\x5b\x02\x39\x3c\xfc\xf6\x8b\xc6\x53\x6e\x2d\xa9\x76\x27\xa7\x76\x24\xa5\x7e\x14\x19\xd5\x39\x6d\x3b\x3a\x8b\x57\x0e\xda\xe2\x69\x74\xec\x68\xd3\x69\xf4\xaa\x32\x4a\x5f\x05\x1c\xa6\x88\x48\x99\xd6\x8e\x8a\xd2\x6a\xb8\x16\xd3\x35\x5d\xd1\xd1\x01\xec\x2f\x48\xb5\x6d\xe0\x57\x84\x3a\x55\x42\x6d\x85\x17\xc8\x5c\x63\xc4\xc2\x8c\x80\xe7\xb9\x1f\xc3\x98\x71\x70\xee\xa9\x40\x1b\x1e\x1e\x81\x36\xbc\x44\xda\xa0\x20\xca\x25\xd3\xf3\x53\xc1\x35\xdc\x37\x32\x7c\xd4\xdd\x3d\x75\x78\x3e\xec\xf1\x05\x86\x0c\xe3\x27\x0d\x25\x9b\xb1\x04\x26\x70\xae\x22\x9a\x20\x35\xe8\x86\xc2\x9e\xac\x81\x8e\x38\x93\x22\x51\x46\x7d\xc6\x86\xa1\xd4\xeb\xb3\x18\xda\x3f\xa1\x8c\x93\xd4\x10\xb3\xcc\x3f\xac\xac\x62\x6c\x88\xa6\x91\x36\xb9\x2e\x15\x60\xd4\xf7\x46\x42\x24\x2e\x0e\x36\x99\x97\xf0\x5d\x03\x57\x2e\x7e\xe5\x70\xf7\xab\x81\xa6\xc8\x38\xa1\x93\x42\xef\x55\xa0\x97\x4c\x57\x25\xe8\xb5\x1f\x80\x41\xa6\x39\x10\x9a\xdc\xd1\xb9\x2a\xad\x00\xd5\xd6\xb6\xc7\xe4\xf5\x21\x86\xca\x52\x45\x0a\x18\x31\xf9\xea\x10\x1d\x63\xa7\x27\xc3\x5f\xaf\xff\x7e\xfd\xeb\xc9\xd9\xdb\x8b\xcb\x76\xf4\xd5\x7c\x3b\x50\xde\x08\x46\x44\x33\x3a\x62\x09\x6b\x43\x56\x97\x42\x27\xaa\x40\x91\x71\xc5\xf1\x51\x2c\x45\x66\xf1\xe4\x0d\x2e\x55\xdd\xe2\x6c\xc1\x8e\xea\x78\xa5\x5d\x9e\x71\x1d\xe0\x44\x52\xae\x4b\xcb\x43\x89\x72\x99\x73\xa3\x6c\x3e\xf3\x28\x73\x1a\x77\x17\x61\x7e\x12\xc7\x10\xd7\xb0\xf7\xe2\x22\xda\x4e\xfd\xc7\xcd\xcb\xe4\x54\x32\x7c\x77\x7d\xf1\xff\x16\xb6\xe1\x3c\x6b\x17\xc0\xd3\x4d\x42\x8c\x6c\xde\x6b\x9b\x2c\x2b\xf1\xa9\x98\x85\xf5\x7d\x2a\xeb\x5b\xf0\xaa\x6e\xdc\xc6\x57\x39\xaf\xb2\x13\x5e\x81\x4f\x52\x11\xc3\x80\x0c\x0b\x93\x73\xfd\x6a\x35\xe9\x5e\x02\x31\xb7\x70\xcd\xb0\xa9\xb7\xd1\x5b\x66\x34\x01\x1b\x17\x8c\x99\x21\xb5\x94\xcc\x2a\x1d\x1e\xd3\x44\xb5\x24\xa6\x6d\x38\x93\x61\xc2\x6f\x8d\x0a\xd6\x09\x36\x0b\x68\x24\x06\x2e\xb4\xd3\xf5\xcc\x2c\x31\x4b\x55\x8a\x88\x58\x7d\xaf\x12\xe3\x53\xe3\x2e\xae\xd5\xbb\x67\x4c\x4c\x79\x5c\x0d\x0b\xc8\xd6\xf2\x99\x2b\x50\xab\x19\x53\xa9\x01\x1a\xe8\x12\x68\x8c\x09\x56\x19\xd5\x53\xeb\xa2\x4f\xa9\xba\x85\xd8\xfe\xe0\xe4\x9a\xc2\x62\x6d\xdb\xbe\xbb\x57\xdd\x98\x79\x7b\xf3\x34\xca\x33\x36\x70\x00\xcd\xda\xd0\x38\x9c\xbb\xf5\x11\x30\xdf\xf4\x8e\x27\xf3\x2b\x21\xf4\x77\x45\x62\x51\x27\x0b\xf8\xb3\x93\x14\xd1\x2f\x51\x8f\x31\x42\x8f\x7a\xdc\x47\x64\xe2\x96\xae\xe6\x34\x9d\x95\x0b\xf6\xc8\x1b\x5a\xe6\xfc\x44\x7d\x2f\x45\xde\x98\x03\x2c\x09\x5a\xdf\x5f\x9c\xe1\x39\xce\x9d\xcb\x88\x6b\x39\xcf\x04\x5b\xd5\x76\xbf\x90\x69\x7f\x74\x4e\xaf\xea\x8e\x34\x72\x72\xce\x15\xe8\x01\x79\x4b\xe7\x84\x26\x4a\x78\xe1\x98\x71\x32\x44\x77\x51\x55\x23\x1a\x10\x4c\x09\xb6\x97\x47\x42\x4f\x97\x54\x26\xb3\x9d\x97\x9f\xeb\x55\x3c\x48\x65\xa1\x11\xc6\x97\x1e\xd7\xf4\x16\x14\xc9\x24\x44\x10\x03\x8f\x9e\xb9\xfb\x05\x57\xfe\x52\x70\x73\x2c\x3a\x59\xfb\x8b\xc2\x61\x86\xe6\xa3\xfa\x4a\xa3\xeb\xcd\xe9\x1d\x14\x1d\x70\x78\x28\x72\x05\xd2\x7a\x0b\x65\x0e\x76\x21\x7e\xc8\x47\x90\x80\xb6\xca\x10\x26\xdc\x53\x6d\x13\x0d\x59\x4a\x27\x40\xa8\x2e\x36\x8a\x16\x04\xb8\x32\xe4\xc6\x1a\xac\x34\x89\x05\x94\xd9\x80\x54\x91\x1f\x2f\xce\xc8\x2b\x72\x60\xde\x75\x88\xcb\x3f\xa6\x2c\x41\xdf\x9c\xa6\x72\x71\x8e\x6c\xec\x41\xe0\x94\x70\xef\x11\x21\xed\x11\xed\x11\x2e\x88\xca\xa3\xa9\x9f\x93\xd1\xb8\xbc\xc2\xe6\x82\xd3\xd0\x14\xfe\x02\xb7\x6a\x6b\x02\xf3\xa3\x02\xd9\x19\x7d\xf9\xb1\x01\x7d\xa9\x8a\x10\x66\xcf\xd5\xb1\x67\x37\x56\x0a\x9a\xc6\x54\x53\x47\x77\xca\x14\xe2\x97\xb8\xa4\x8f\x4d\x7d\x14\xbc\x61\x3c\xbf\xb7\xe1\x17\xdd\x29\xf9\xd7\xe7\x08\x16\xb7\x00\x22\x0d\x17\x8d\x66\x59\xc2\x4a\x8f\x5f\x25\x1c\xe8\xa2\xb6\xd4\xbd\x35\x22\x12\x1e\x73\xef\x38\x34\x9c\x9d\xf2\x58\xa4\x4b\x2f\x43\x13\x1c\x8d\xa6\xd5\x17\xbc\xc8\xcd\xf3\xe8\xe6\x88\x04\x66\xd0\xa2\x98\xc5\xc2\xc6\x79\x63\xa0\x19\x59\xcc\x2f\x28\x82\x27\x09\x1d\x41\x62\x39\x8b\xdd\x40\x6a\x79\x03\x3d\x76\x48\x9d\x14\x49\x77\x09\x05\x57\x22\xc1\x50\x07\x5a\x20\xc2\x80\x7f\x16\x78\x40\x20\x5d\xe1\x01\x15\x99\x1a\x1e\x50\x25\x7b\x0e\x78\xc8\x5b\x30\x5a\xb2\x88\x07\xc3\xb5\xeb\x78\x40\xd6\xf9\xd4\xf1\xa0\x20\x8a\x44\x9a\x0d\xa5\x30\x2a\x57\x67\xac\xc5\x81\x25\xc2\xb2\x2c\xaf\x93\xa3\xc1\xb7\xaa\xfd\xd9\x12\x52\x0b\x37\x53\x59\x89\x4e\xa3\xda\xd2\x78\x1f\xa2\xf6\x7f\x2a\x2c\x07\x49\xcf\x22\x1f\xf2\x50\x7c\xcc\x5b\xf1\xa4\xbb\xf0\xcc\x73\xe3\x5b\x58\xc9\x3a\x61\x26\x22\xa2\x09\xd6\x1a\x6b\xb7\x63\xc8\xe2\xae\x59\x04\x5c\x09\x29\x44\xd7\x12\xfe\xe6\xbd\xe5\x58\x76\x0a\x7f\x71\xb6\x2f\x2e\x62\xa8\x94\xb4\xb1\xb1\x90\x37\x36\x82\x0d\xef\xf3\xd1\x8c\x86\xab\x3b\xa7\x39\xc4\xb5\xa7\xb5\x70\xe5\x4c\xde\x16\x15\xcc\xcc\x04\x81\xc7\x8c\x4f\xd0\xa2\xd3\x23\x12\x12\x1b\x07\xe9\xce\xf0\xad\x55\xbf\xf6\x71\x47\x7b\xa0\x7e\x3b\xfb\x57\xa3\x24\xc4\x04\x77\x90\xd1\xc8\xe1\xe5\x9b\xb1\xa5\x96\x4c\x91\xbd\x37\x1e\x01\x2d\x4a\x3e\x3d\x45\x06\xb1\x67\xbf\xb0\x58\x4d\x6b\x63\xbb\x65\x3c\x76\x91\x87\x35\x64\x79\x25\xd1\x49\xa1\x18\x8c\xca\xe2\x2a\x69\x38\x26\x1f\x38\x29\x90\x45\xfa\x8d\xb7\xc7\x95\x15\x58\xbd\x79\xa9\xbf\xd9\xe4\x57\xbc\x64\x11\xcc\x8f\x1c\xd7\xde\xbc\xb7\x6f\xd4\xde\xe5\xfb\xfc\xb7\xec\x3d\xe6\xba\xde\x31\x1e\x8b\x3b\xd5\xb5\x0e\xf1\xb3\x05\xeb\x05\xea\xc8\x6c\x6b\xcd\xf8\x44\x55\xf5\x88\x7a\x61\xd9\xd5\x8a\x84\x5f\xe1\xb1\x14\x36\x6f\x6d\x59\x80\x5f\x08\x75\x0e\x4a\xc0\x0e\x63\x92\x2a\x7a\x2a\xcd\xa7\x68\x46\x93\xeb\xac\x79\x9d\x31\xb2\xb8\x0d\xbe\x7f\x7b\x7d\x52\x07\x6d\xe8\xd9\xdd\x14\xa4\xe5\xbd\xe6\x3a\xa1\x71\xca\x94\x42\x33\x10\x8c\xa6\x42\xdc\x92\x03\x1f\xe0\x34\x61\x7a\x9a\x8f\x06\x91\x48\x2b\xb1\x4e\x7d\xc5\x26\xea\xc8\x6d\xda\xbe\x99\xfd\x21\x61\x3c\x61\xbc\x62\x9a\xc7\x22\xb6\xce\x8c\x81\x2f\x89\x8a\x59\xe0\xda\xba\x42\x85\xce\xcb\xbc\x3c\x4d\x5b\x9a\x90\x41\xf2\xf8\xd5\x53\x96\x97\xe7\xb2\x65\x21\x88\x07\x96\x08\xbf\xdd\xe5\x59\x54\x73\x82\x56\xe2\xd1\x4a\x6f\x8f\x8e\xa4\xc2\x3a\xd6\x29\x6e\xd0\x4a\xe6\x80\x1a\x42\xe0\x29\x5a\x1b\xab\x99\xb9\xe5\x63\x59\xce\x9e\x07\xd9\x23\x6d\x17\xdd\x25\xbb\x86\xca\x91\xdb\x8d\x50\x39\x72\xfd\x08\x95\x23\x43\xe5\xc8\x50\x39\x72\xf3\x08\x95\x23\xdd\x78\xfc\x1c\x31\x12\x2a\x47\x36\x1c\x2f\xab\x7a\x41\xa8\x1c\xb9\xd3\x08\x95\x23\x97\x47\xa8\x1c\xb9\x66\x84\xca\x91\x6b\x46\xa8\x1c\x19\x2a\x47\x86\xca\x91\xa1\x06\xce\x83\xb0\x9e\x66\x0d\x1c\x12\x2a\x47\xba\x11\x2a\x47\xbe\x88\x82\x21\x24\x54\x8e\xdc\x6a\x84\xca\x91\xa1\x72\x64\x93\x11\x2a\x47\xe2\x08\xb6\x97\x50\x39\xd2\x8f\x50\x39\xd2\x8e\xcf\x47\x6a\x0e\x95\x23\x43\xe5\xc8\x50\x39\x32\x54\x8e\xdc\x30\x42\xe5\xc8\x47\x96\x76\x95\x8e\x59\xa3\xa2\x3e\xdb\xe4\x60\xbb\x90\x8e\x4a\xd6\xd6\x28\x1f\x8f\x41\x22\xc9\xc1\x37\x2f\x85\x0f\x14\xb5\x5a\x0a\x22\xe4\x02\x04\x14\xe8\x1e\xa6\x73\xbb\x58\xce\x35\x8f\xbb\x34\x31\x2c\xbe\x23\x41\x61\x0a\x33\x27\xe7\xef\xbe\xeb\x26\xe1\xbb\x5d\x2e\x26\xce\xf9\x1d\x8f\xda\x47\x1e\x95\x08\x5f\x15\x5b\xec\xf0\x1e\x25\x42\xd9\x20\x0f\x8b\xac\x68\x4a\x39\x07\xaf\xf5\x31\x8d\xd6\x94\x11\x00\x27\x22\x03\x6e\x09\x6f\xd1\xaa\x9f\x6a\x4d\xa3\xe9\xc0\xbc\x89\x7b\x64\xbb\xda\x46\x25\x44\xa5\x25\xd0\xd4\x22\x5d\x42\x4a\x99\x05\x45\x68\x24\x85\x52\x24\xcd\x13\xcd\xb2\x02\x18\x51\x80\xb1\x9a\x96\xc3\x14\xc8\xc0\xb8\x10\xb0\x51\x18\x98\x81\x5c\xbc\xcd\x4d\x4b\x54\xeb\x5d\xa0\xce\xd9\xc3\xc2\x78\x69\xa6\xe7\xc4\x7c\x72\x62\x43\x89\x98\x54\x9a\x44\x09\x43\x36\x8b\x6f\xb4\x69\x31\x08\xaf\xe7\x99\x2c\x77\x33\x55\x6e\xaa\x3c\x46\x79\x33\xd3\x8a\x60\xfc\x5c\x09\xd0\x81\x8a\x99\x72\xf2\xb9\xea\x11\xea\xab\x39\x58\x44\xfb\x99\x22\xaa\x3d\x43\xb0\xd0\xdd\x4f\x15\x70\x95\x12\x50\x66\x6f\x5a\x33\x56\xb9\xd1\xb1\x5c\x83\xdf\x9c\xbd\x6a\x95\xc0\x8a\x24\x80\x71\x2a\x4b\xc7\x00\x17\x80\xc3\xcc\xec\x01\x88\xc0\x30\x46\xba\x66\xd7\x7f\xf2\x4d\xaf\xa9\x9c\x80\x2e\xda\xac\x37\x0d\xb2\x5c\x6a\x3b\x0e\x2e\xfa\xb0\xaa\x40\x94\x18\x43\xe4\x0c\x45\x8c\x71\xc3\x2e\x17\xde\xec\x99\xe5\xb0\x3c\x37\x41\x57\xc6\x63\xd5\x0d\x5e\xa0\xb1\x31\x4a\xc5\x4b\x55\x46\x23\x50\xe4\xe0\x62\x78\xda\x23\xc3\x8b\x33\x17\x88\x24\xc6\xab\x92\x91\x1c\x09\xb3\x1b\x50\xaf\x79\x11\x53\xfe\x1d\x77\x53\xaa\x71\x39\x2b\x2f\x42\x11\x72\x4a\xa5\x8b\x30\xf4\x75\x73\xc9\xa5\xd0\xb0\x2a\xdd\xdf\x53\x03\x94\x9b\x9c\xf1\xc0\xed\x34\x2b\x85\x34\x27\x80\x0d\xf5\x8d\x8a\xdc\xf8\x16\x94\xa2\x13\x18\x36\xf4\x3c\xad\xd3\xaa\xd1\xf9\x54\x9e\x51\xa4\x0a\x89\x4d\xc2\x29\x7e\x29\x43\xd5\xea\xa2\xec\xff\x9f\xbd\xff\xe1\x6e\xdc\x36\xfe\x85\xf1\xb7\x82\xe3\xf6\xfe\x6c\x37\x92\xbc\x9b\xe6\xf6\xcf\xde\xfc\x9a\xe3\xd8\xde\xd4\x37\xbb\x5e\x7f\x6d\xef\xe6\xe9\x93\xe4\xdb\x42\x24\x24\xa1\x26\x01\x06\x00\xe5\x55\x6f\xee\x7b\x7f\x0e\x66\x00\x10\xa4\x64\xaf\x4d\xd2\x2b\xd9\x11\x7b\x4e\xb3\x96\x28\x10\x1c\x0c\x06\xf3\xf7\x33\x24\xc7\x39\x85\xf5\xbe\x51\xdc\x18\x06\xfb\x1b\x20\x60\x20\x78\xdd\x2c\xb3\xdb\x6d\x24\xbc\xbd\xf5\x83\x54\x3f\xb6\xe7\xbb\x48\x5d\x37\x7a\x46\xc6\x8a\xb3\x09\x99\x70\xc8\x69\x83\x2c\xb3\x01\x82\x1a\x50\x54\x30\xb5\x66\x0a\xe6\xe3\xec\x11\x3f\xaf\x11\xf9\xc1\x4d\xcc\xa8\x52\x20\x7e\xb2\x53\x95\xa1\x10\x85\x4f\xc8\x14\xb2\xd4\x9c\xc6\xff\xd5\x8b\xbf\xfe\x89\x8c\x17\x56\xbb\x01\xd6\x36\xd2\xd0\x2c\xbc\x64\xc6\xc4\xd4\xd2\x0a\x25\x75\xbd\x94\x22\x50\x00\x10\x8e\x71\xe2\x2f\xbf\xbc\x1e\xd7\xd5\xad\x83\x94\xcd\x0f\x22\xfa\x0d\x33\x39\x1d\x91\x23\x2a\x2c\xaf\x5b\xfd\xbf\x48\xc1\x05\xdf\x46\x39\xea\x9b\xcd\x64\xc6\x93\x45\x77\xb1\xe3\x8c\x0a\x32\x93\x37\x68\xaf\xad\xe0\x9e\x2a\x8f\xb5\x90\x45\x99\x61\x14\xe2\x75\x28\x42\x2a\x35\x5b\xae\x34\x58\xb9\x2f\xc0\x6f\xee\x86\x68\x6c\x6d\x97\x9c\xe8\x1f\x29\x5d\xd2\xb6\xf3\xec\x06\x90\x0d\x30\x66\x5f\xd3\x2c\x1b\xd3\xe4\xfa\x4a\xbe\x91\x53\xfd\x4e\x9c\x28\x25\x55\x7d\x2e\x19\xb5\x07\xe7\xac\x14\xd7\x88\x6a\x1b\x0a\x21\xe5\xd4\x6a\xd9\x45\x69\x3c\x5e\xe2\xaa\x17\xc6\xb2\x3a\x7f\x1e\x7b\x53\xb6\x1a\x85\x7d\xe4\x95\xbd\x2a\x08\xb3\xcf\x47\x8e\x8c\xc7\xd7\x31\xb3\x7d\xf9\xe2\xab\xbf\x20\xeb\x12\xa9\xc8\x5f\x5e\x40\x02\xab\x1e\xe0\x26\x06\xb9\x68\x75\x86\x9c\x66\x99\x15\xaf\x31\x53\x5a\x42\xaf\x62\xc2\xcf\xce\x83\xa6\x3b\xbb\xdd\x5b\xab\xbe\xba\xfa\x07\x1c\x09\xdc\x68\x96\x4d\x06\x98\xee\x1f\x0c\xd3\x5d\xd0\x11\x76\x9d\xf4\xb1\x2a\xd6\x26\xe8\xc2\x73\x99\x95\x39\x3b\x66\x73\xde\x07\x6c\x7d\x6d\x34\xef\xae\xc9\xb8\x86\xca\x8a\x71\x26\x93\x6b\x92\xba\x2f\xa3\x54\xa4\x26\x50\x64\x7b\x2a\xb4\x4d\xca\xea\x90\x8c\x75\xeb\xfb\xd7\xd2\xb0\x72\x5a\x14\x5c\x4c\x2d\x19\x28\x51\xf4\xa6\x46\x0c\xd8\x93\x50\xd5\xd8\xb1\x6a\xbc\x73\xa8\xa0\x6b\xa0\x60\xe8\xde\xc8\xca\xcd\xd6\x43\xb4\x4e\x43\xea\x1e\x67\xa8\x66\xdf\xde\xb9\x5c\x63\x88\x6a\x40\xbf\x1b\x0a\xf8\x37\xa6\xd8\x2f\xa9\xcb\x41\x7d\x0c\x8c\x81\x0a\x80\x65\x1f\x10\xc9\xed\x9d\xe6\x3d\x78\xa8\xbb\xe5\xa0\xd5\xe8\x22\x42\x64\x20\xa7\xc6\x29\x84\xde\x82\xa0\xa4\x60\x4a\x73\x6d\xcf\xe5\x0f\xb0\xa1\x8e\x32\xca\xf3\xc8\x8d\xbb\x1e\x22\xe0\xe6\x06\x7c\xbf\xee\x92\xf2\x5c\xa6\x6e\x40\x10\x85\x88\x6d\xb8\x42\xad\xad\x6b\xb5\x3d\x1e\xa8\xeb\x16\x95\x1f\x2a\x6a\xd6\x25\xa5\xfd\x24\x88\x4a\xbc\xeb\x39\x09\x48\x78\xbf\xa7\x2a\x1f\xc3\xe4\x7b\x12\x03\x20\x18\xdd\xe2\xd6\x25\x61\xcd\x78\xc4\x8d\x12\xa9\xf4\xce\x0e\x1c\x11\x4c\x8b\xb0\x7b\xc2\xfd\x94\xec\xbe\xda\x5d\xab\x90\x44\x12\x29\x59\xd0\x69\x27\xa4\xf6\x06\xa5\x9a\xc3\x92\x94\xa1\x11\xc0\x34\x98\x41\xf0\x7d\x00\x57\x81\xbb\x58\x5a\x95\xdb\x03\x98\x02\x46\xb8\x3d\x81\x9d\x81\x00\x1d\x2c\xc8\x0d\x5d\x10\xaa\x64\x29\x52\xe7\x6a\x0c\xbe\xde\xb7\x8d\x07\x9f\x49\x01\x66\x86\x07\xe1\xb0\xaa\x2b\x44\x61\xb8\x26\x63\x66\xa8\x15\xd3\x2f\x47\x2f\x5f\x3c\x97\x93\x0a\xde\xb0\x71\x52\x9d\x85\x93\x0a\xe5\xd3\x5a\xdf\xd5\x63\xba\xf6\xf4\xbe\x6f\x9d\x8b\xa5\x82\x6c\xe5\x1e\x92\x12\x3e\xba\x51\xdc\xb0\xa8\xef\xc9\x1e\x18\x2e\xd6\x3e\x8c\xca\x9d\xf7\x7b\x44\x2a\xee\x03\x79\x91\x10\x5d\x8e\x1f\x51\x6e\x39\x01\x05\xdb\x6d\x95\x87\x4b\xdf\x21\xc2\x62\x42\xed\xec\x90\x3d\xbc\x73\x17\xab\x3b\xf7\xd7\xca\x5a\x8e\x68\x27\x1f\x8b\x0e\x48\x5a\x35\xc2\x9d\x7c\x2c\x28\xf8\xe0\x8a\x1e\x29\xf8\x2d\x9b\xd1\x39\x83\xaa\x56\x9e\x51\x95\x41\xdc\xf8\x12\xe7\x4e\xc6\xa5\x21\x4c\xcc\xb9\x92\x02\x92\xb4\xe6\x54\x71\x3a\xce\x18\x51\x6c\xc2\x14\x13\xd6\x16\xfd\xfd\xde\x87\xc3\x0b\x48\x4a\xd9\x47\x44\x6e\x3f\xcb\x52\x43\x1a\x70\x63\x26\xd1\x70\x9f\x5c\x3e\x3f\x0f\x4b\x43\x90\xb9\x7e\x5e\xf6\x39\x79\x69\x4a\x84\xfd\xfe\x98\x64\xa5\xe6\xf3\x75\x49\x12\x57\x6e\x7c\xcc\x5b\xad\x73\xa3\xf4\xb9\x22\xd4\x52\x15\x73\xe5\x83\xff\x04\xce\xe4\xae\x0e\xc8\x3c\x71\x1e\x83\x73\x3d\x91\x9c\x4f\x67\xc6\xe5\x53\x7a\x60\xa6\x25\x15\x02\x00\x19\xd6\xeb\x84\xb2\xc7\xee\x61\xc6\xa9\x7e\xa8\xca\xb5\x54\x2a\xe8\x46\x71\xd9\x0f\xd2\x27\xdc\x78\xdf\x8a\x7d\x10\x3a\x1c\x4f\xcf\x5d\x74\xca\xd3\x8d\x8b\x7f\x63\xb6\x49\xb0\x2e\x30\x7b\x04\x7f\x82\x5e\xc3\x49\x5c\xec\xef\xb3\x2c\x40\xf8\x03\xc2\x2f\x78\xb5\x84\x14\x43\xfb\x9b\x33\x66\xec\xba\xda\x51\x1e\x58\x46\xd7\xd6\xf0\x68\x65\x72\xac\xa6\x20\x99\xc9\x2c\xf5\x5d\xfd\xd0\x25\x33\x66\xe6\x86\x31\x41\x4e\xcf\x81\x7e\xf6\x15\x21\xda\x73\x0b\x15\x31\x3a\x00\x98\x21\x91\x45\x5a\xa3\xe7\x43\x19\xac\x83\x55\xd2\x45\xa5\x0f\x6f\xda\x79\xcf\xff\x3d\xd0\xcc\x47\xc4\xe8\x58\xce\x19\x90\x34\x4d\x15\xd3\x1d\x30\x37\xd6\x60\xa7\x76\x12\xa5\xbc\x15\x7a\x7c\x3d\xbe\x11\xc8\xe6\x3d\x44\xa0\xbe\xc3\x56\x05\xc6\xfb\xcc\x12\xec\xf4\xfc\xa8\x83\xf4\xda\x7d\xef\xc2\x1b\x76\xa8\xdd\x5d\x4d\x78\x91\x54\xf1\xd4\x11\xa9\xa2\x86\x51\x29\x02\x6a\x8c\x0f\x0b\x59\xb5\x55\x13\x23\xa1\xd6\x51\x48\x13\x81\xc3\x58\xb1\xe2\xca\x90\x43\x94\x98\x6b\x0c\x13\xd7\xa8\xa1\xfd\x2f\x62\x82\xf8\x44\x04\x14\xf2\x2e\x2d\x63\x10\x32\x73\x1b\x82\x09\x3c\xe8\x3e\x27\x2f\x92\xe2\x4b\xc4\xfc\x6c\xb4\x3c\x3f\x3d\xee\x93\x5d\x0a\x9e\x6e\x1c\xbb\x3c\xdc\xbe\xac\x17\x9d\xd5\xb1\x1a\xdc\x80\x7e\xb3\x9f\xcb\xf4\x16\x35\xa9\x3a\x68\xe0\xfe\xb8\x47\x9a\x91\x84\x12\x74\x13\x36\xba\x4e\xb6\x20\xca\x83\xa5\x04\xa8\x5a\xe7\x65\x96\x5d\xb2\x44\xb1\x87\xba\x47\xeb\xeb\x7f\xda\x18\xeb\x36\x95\x27\xd2\xdf\x01\x00\xc0\xdd\x8c\x47\xb2\xb6\xf4\x09\x5c\x13\x97\xf7\x15\x65\x06\xe9\xa1\x54\x2c\x3c\xc1\x61\xf6\x3a\x8a\x45\x71\xed\x73\x56\x30\x45\xaa\xb6\x0a\x9a\x85\x87\x85\x9e\x07\x54\x6b\x8c\x98\x72\x91\xf2\x39\x4f\x4b\x9a\xc1\x83\x40\x0b\x8d\x3b\x82\x86\x13\x32\xf7\xb0\x6b\xe4\xb5\x54\x84\x7d\xa4\xf6\xb6\x41\x50\x62\xa9\x06\x76\x48\x65\x72\xcd\xd4\x00\x55\xb1\x63\xf8\xe3\x08\x34\x5e\x04\x16\xf5\xf3\xb0\xb6\xc4\x4c\x0a\xa9\xda\x35\x20\xf6\x5d\x44\x91\x0e\xbf\xc3\xd7\x5d\x70\x31\x1d\xc2\x27\xf6\x45\xdc\x93\x86\x52\x0c\xe9\xd0\xb2\xe1\x13\x51\xfc\x00\x49\xf4\x1d\x68\x56\x17\x9e\x5f\xbc\x89\x60\x0d\x39\x59\x4e\x67\x40\x2c\x95\x53\x8f\x67\x95\x31\x03\x50\x45\x2e\xae\x8b\x98\x12\xee\xb7\xa9\x53\xd3\x62\xe8\xa6\x3a\xaf\x3d\x11\xe5\xaf\xad\x87\xac\x91\x29\x1c\x89\x2d\x47\x23\xf3\x60\x0e\x94\x73\xa6\xe6\x9c\xdd\x1c\xb8\xa3\x73\x78\xc3\xcd\x6c\x88\x14\xd1\x07\x40\xd8\x83\xdf\xa1\x7a\x89\x15\x57\x87\x69\xea\xdc\x96\xa5\x66\x93\x32\x43\x07\xa4\x1e\x11\x5a\xf0\x0f\x4c\x69\x2e\xc5\x00\x20\x68\x07\xa4\xe4\xe9\x37\x9f\x31\xf1\x85\x0b\x5e\xa5\xd8\x75\x92\x82\x6f\x9c\x94\x73\x85\xbe\xfc\x3f\x55\x63\x4e\x97\x1c\x34\x66\x99\x14\xd3\xa8\x4c\x19\xd4\x8b\x53\xc1\xcd\x52\x83\x31\x84\x1b\x03\x13\x59\xaa\x14\x12\x19\xb9\x54\x35\x7f\xb0\x1d\x0f\x40\x98\xa2\x74\x48\x2b\x22\x79\x6d\x3c\x48\x67\xd1\xe1\x30\x22\x98\x10\xe1\x2b\x1a\x8d\x24\x33\xea\x40\xa0\x5c\x16\x26\xd7\x64\x46\x45\x0a\x7f\x26\x89\x54\xa9\x9b\x2f\x37\x21\xf7\x12\x93\x82\x30\x13\x05\x8e\x35\xe8\xcd\x2c\x9a\x4f\x06\x0b\x54\xe5\xb5\x44\x3d\xaf\xf6\x94\x82\xff\x52\x32\x42\x73\x69\x05\x7b\x13\x8e\xb6\x41\x91\x9c\x2e\xe0\x6c\x85\xa9\xbe\x09\x25\x7a\x58\x05\xa8\x07\xe4\x82\xd1\x94\x47\x95\xcc\x03\xf2\xa6\x5e\xda\x3c\xb0\x73\xb9\xc4\x9a\x4b\xf7\x11\xce\xde\xb7\x66\xbe\xc0\x20\x51\xee\xf3\x8a\x96\x5f\xc6\xae\x8a\xa1\xd7\x4c\xa0\x51\x6e\x49\x03\x71\xb0\x52\xc1\x1a\x24\x33\x96\x96\x70\x4a\x8d\x17\x64\xc2\x11\xa3\x1a\x54\x05\x3e\x9d\x31\x6d\xbc\x72\x79\x00\xb9\x3a\x55\xb3\x0d\x3f\x01\x60\xdf\x28\xd3\xb6\x72\x63\xe5\xf4\xa3\x9d\x91\x74\x7d\xad\x5d\x15\x08\xda\x6c\xba\xcc\xfd\x5e\x6e\x52\x5a\x8f\x7c\x47\x6c\x3b\xf3\x08\xfb\x97\x37\x88\x0b\x41\x3a\xe7\x87\x23\x13\xaa\x67\x80\x8c\xdd\x5c\x82\x04\x5d\x32\x49\xa9\xac\xc0\x40\xc0\x6c\x0a\xad\x30\xa1\xef\x1a\x74\x4d\x5c\xe5\xb8\xe9\x58\x3c\x60\x27\xdb\xbe\x6b\xf6\xfa\x0e\xb1\xc3\x90\x0c\x6e\x09\x9f\x34\x24\x01\xae\xa4\x3d\xb0\x3c\x28\x94\x2a\x45\x15\x31\xb5\x52\xe1\xf3\x1d\x49\xed\xe3\xa3\xad\xe2\x9a\x5d\x4e\x40\xaa\xa6\xdd\x3d\x1f\xbb\x87\x6a\x5a\xe2\x46\x77\x52\xb8\x42\x93\x75\x0d\x09\x41\x6b\x43\x1d\xd3\x9a\x33\x47\x6f\x8f\x7d\xf8\x0c\xb3\xf9\xaa\xda\x0a\x5f\x79\x35\x22\x1f\xba\x3a\xa9\x9b\x5e\x6a\x2b\xcd\x2b\xd7\x77\x12\x76\x96\x95\x18\xd9\xdc\xdb\x17\xe1\x69\x5e\x0f\xe5\xa2\x28\x8d\x3b\x06\x2b\x8b\x53\x24\x33\x2a\xa6\x1e\x83\x3f\x9e\x97\x5e\x08\x43\x3f\x42\x8f\xe8\x31\x23\x4c\x27\xb4\xa8\x4a\xe4\x52\x59\xda\x87\xff\xfe\xf7\x03\xc2\xd9\x2b\xf2\xfb\xe8\x87\x23\x72\xe2\xee\x8d\x5e\x38\xca\xa6\x1f\x57\xaf\x3b\x20\x8a\x4d\xa9\x4a\x33\xe7\x1e\xb9\x89\x4a\x30\xc2\x0b\xb2\x8f\x5c\x1b\x8d\x67\x86\xe9\x20\x49\x0c\xd5\xd7\x56\x6e\xd8\x9d\x30\x4c\xa9\xa1\xc3\x68\x0b\x1e\xa0\x9d\x35\x74\xb8\x9a\x43\xea\x58\xa1\x12\x31\x07\xbf\x73\x25\x88\x43\x1a\xee\xe2\x56\x83\x06\x84\xcb\xf6\x7a\xc9\x53\xf3\x89\x75\x80\x57\xad\xef\xb6\x93\x0a\xaa\x19\x68\x00\x59\xf7\x95\x7e\x13\x84\x9e\x43\x10\x5d\xb5\xff\x4e\xce\xae\x2e\xfe\x71\xfe\xee\xf4\xec\x6a\xbb\x0d\xb7\xdb\xf0\x37\xb5\x0d\x99\x98\x77\xde\x82\xde\x2e\x59\x15\x52\x6d\x22\x31\x46\xa5\x37\xcf\x28\x71\xed\x44\xcc\x3f\x50\x55\x35\xbb\x76\xf1\xa0\x15\x11\x66\xdf\x0d\x1b\x44\xd2\xd1\x93\xcf\x5c\x5b\x63\xde\x59\x8f\xf9\x3c\xb1\xcb\x62\xd5\xaa\xc5\x1d\x82\x8e\xfe\x79\x7a\x7c\x72\x76\x75\xfa\xfa\xf4\xe4\x62\xad\x89\x18\x1d\x91\x10\xeb\x87\x68\xcb\x53\xad\x50\x6c\xce\x65\xa9\x43\x1f\x9e\xd5\x22\x60\x39\x93\x4f\xa4\xe0\x49\xd0\x4c\x41\x4e\xf3\xca\x9f\xfd\xd6\x8f\xc6\x7a\x16\x49\x07\x94\x99\xbe\x98\xed\xb5\x92\xad\xfb\x82\x37\xa3\x1d\xe8\x93\xf0\xa1\xe1\x55\xeb\xbf\xeb\x00\x29\x6a\x07\x85\x53\xcd\x2a\xf4\x0b\xab\xea\xe5\x85\xe9\x80\xe9\xde\x0b\x52\x6d\x3f\xa0\xae\x98\xb9\xf2\x96\x16\xdf\xb3\xc5\x05\xeb\x08\x66\x53\xa7\x37\xcb\x58\x62\x8f\x25\x72\xcd\x16\x98\xa6\x78\xe4\x1f\xd6\x05\x74\x67\x23\x81\x7e\xaf\x59\x17\x10\xe6\x3e\x11\x7a\xaf\x59\x87\x14\x4c\x7f\x2d\x61\xd5\xda\x25\x04\xad\xca\xae\x69\xb7\xd5\x23\xfd\xa2\xf3\x3e\x02\x22\xf1\xf3\x8d\x27\xd4\xaf\x1e\x57\xc1\x87\x45\x7b\x5e\x09\x8c\x50\x2f\x6a\x67\x57\x10\x22\x04\x6b\x1c\x81\x37\xbd\x0b\xde\x29\x05\x3d\x91\xa6\x5b\xae\xaf\xbd\x60\x09\xfb\x95\xab\xbb\x95\x60\xc5\x8c\xf7\x00\x97\x96\xbe\xf2\x85\xfd\x3a\x34\x80\x1a\x59\x0e\x1b\xd4\xff\x84\x00\xe1\x80\xfc\x2b\x7c\x08\xfd\x63\xf5\x8f\xbb\xbb\x5f\x7f\x7f\xf2\x8f\xbf\xed\xee\xfe\xfc\xaf\xf8\x5b\x38\x0a\x31\x6c\x5c\xbf\x05\xe0\x98\x84\x4c\xd9\x19\x3c\x03\xfe\x74\xea\xd5\x21\x86\x12\xdc\x17\x50\x9f\x3c\xc2\x1c\x9e\xf0\x67\x21\xd3\xe6\x5f\xba\x13\xae\xdd\x46\x1e\x0c\xb0\x44\x1d\xea\x6c\xf0\xea\xef\x78\xa8\x64\x49\xcf\x5b\xd5\x8d\xea\xb9\x11\xf0\x91\x11\x59\xeb\xb5\x27\x01\x74\xec\xf3\x40\x08\x02\xaa\xc7\xad\x66\x5a\x07\x39\xdc\x99\xbf\xec\xd4\x9b\x14\xaf\x1e\x45\x5b\x58\xc1\x9e\x09\x06\x14\xf1\x7d\xaf\x60\x23\x87\x03\x36\xa4\x8f\x84\x26\x6a\x87\xe7\xa7\x64\x8e\x14\xde\x18\xe2\xf8\x30\xdf\xeb\x47\x95\x71\x21\x98\xd8\xac\x52\x7d\x85\xe9\x28\xfe\x7b\x87\x18\xa0\x03\x0c\x1b\xb3\x86\xcd\x1e\x7e\x38\x4a\x8a\x72\xe0\x6e\x18\xe5\x2c\x97\x6a\x11\xfe\x0c\xd0\x2b\x43\x6d\xa4\xa2\x53\xa8\x30\xc1\x9f\xe3\xcf\xc2\x5f\xf8\xc3\xda\x03\x96\x7f\x8d\x86\x6b\x15\x53\x0c\x38\xad\xcf\x4f\xb6\x79\xd2\x6f\x88\x68\x4b\xba\x82\x0a\xd5\xaf\x3a\x43\x06\xbf\x19\x2a\x9c\x81\x8a\x60\x4f\xba\x0a\xda\x41\x95\x1d\x06\xb1\x70\x31\xb7\x96\x65\x6b\x38\xb8\xea\xea\x51\x9a\xa5\x7c\xce\xb5\xec\xd4\x91\xde\x0d\x74\x7b\x26\xa1\x03\xf1\xc0\x6c\xa6\xe0\xe4\xfa\x58\x00\x02\x56\xd8\xaf\x0d\xb1\xff\xb2\x4b\xe3\x62\xbc\x0a\x6a\x0c\x53\xe2\x15\xf9\xef\xbd\x9f\xbe\xf8\x75\xb8\xff\xcd\xde\xde\x8f\x2f\x86\x7f\xfd\xf9\x8b\xbd\x9f\x46\xf0\x8f\x3f\xec\x7f\xb3\xff\xab\xff\xe3\x8b\xfd\xfd\xbd\xbd\x1f\xbf\x7f\xfb\xdd\xd5\xf9\xc9\xcf\x7c\xff\xd7\x1f\x45\x99\x5f\xe3\x5f\xbf\xee\xfd\xc8\x4e\x7e\xbe\xe7\x20\xfb\xfb\xdf\xfc\xbe\xf3\xd4\x7b\x40\x92\xc5\xab\x4f\x3c\xd9\xfa\x88\xbd\xb0\xdf\x23\x76\x64\xc0\xcb\xb3\x57\xdf\xfb\xff\xc2\x4b\xcd\x28\xbb\xc5\x1f\xd7\x1b\xb3\xc1\x31\x3d\xf2\x73\x78\x72\xf0\x49\xf5\xca\x93\x60\x5a\x3c\xb7\x73\xee\xb7\xe0\xdc\xf1\x6a\x3b\xae\x6b\xa5\x89\x4e\x94\xcc\x7d\x7d\x3b\x04\x23\xb0\x12\xcb\xdd\x77\xcd\x3a\x75\xb6\xc4\x6b\xeb\x0c\xda\x3a\x83\x6e\xb9\x3e\xe9\x0c\xc2\xe4\xfc\xcd\xf5\x04\x31\x31\x6f\x1b\xc2\x58\x19\xef\xf6\xb6\x4e\x0c\x06\x77\xbf\x00\xd8\xc8\x6f\xf5\x2a\x72\x56\xe5\xa9\xe0\x81\x96\xaf\x8e\x38\x92\x43\x68\xb4\x8b\x1b\x1f\x06\x08\x10\x98\xcc\xb5\xa0\x70\xd5\x88\x73\x3b\x85\x00\x58\x5e\x43\xb2\x84\x1c\x5b\x2e\xa6\x0e\xd7\x01\x8f\x12\x17\x7d\xe2\xa2\xc2\x86\x0d\xca\x61\x85\x04\x4e\xb5\x96\x09\xf4\xef\xc1\x00\x59\xc0\xa8\x73\xd3\x86\xd9\x18\x7a\xcd\xe2\x8e\xe2\x88\x12\x5e\xbd\xeb\x78\x01\x18\xa8\x62\x1e\x82\x6c\x25\xa6\x6e\xa0\xf8\x5b\x3d\xc6\xf3\x4a\x17\xb0\x8c\xe8\x82\x60\x51\xd6\x00\x48\xfd\x60\x61\x53\x48\x9c\x90\x93\xca\xcb\xda\xae\x27\x63\xe7\x53\xbc\xfb\x99\x19\x22\x5b\x9d\x94\xa1\xa5\xc3\xb2\x72\x3f\xd7\x0f\xc9\xe7\x10\x0c\xec\x7e\x7c\xfe\xe6\x8e\xce\x9e\x8e\xcd\x7e\x8e\xcc\x07\xc4\x4e\xfa\x3c\x26\xfb\x08\x96\x14\x8a\x4d\xf8\xc7\x9e\xf6\xe9\x61\x54\xa7\xc7\x53\x26\x0c\x9f\x70\x6c\x3b\x5b\x28\x56\x30\x81\xad\xdf\x69\x32\x03\xd9\xef\x4e\xca\x2a\x38\xbd\x89\xa9\x37\xa8\x70\xf7\x2b\xca\x2e\x57\x29\xfb\x5b\x39\x46\xb6\x72\xac\xf5\xf5\x99\xe4\x98\xe3\xdc\xcd\x11\x62\x90\xd7\xdd\x3d\xb1\xfc\x38\xca\x12\x07\x2e\xee\x5e\x47\xdb\xc0\x46\x0b\x72\xd1\x48\x6c\x4a\x8e\xc5\x5c\x8a\x64\x6c\xce\x32\xa7\x34\x91\x9c\x0a\x3a\xc5\x6e\x72\x46\x06\x08\x1c\xa9\x42\xa7\x9e\x26\xbe\x0d\x28\xf1\xbe\xce\x09\xbe\x54\x32\xcb\x98\xd2\x24\xe3\xd7\x8c\x1c\xb3\x22\x93\x8b\xdc\xa5\xa9\xa6\xe4\xd2\x50\x63\x59\xfa\x92\x99\x76\x31\xdf\x6e\xd8\x18\xbe\xb4\xbb\x27\x20\x70\xac\x15\x87\x4a\x6b\x52\xb8\x32\xc2\x77\x02\x24\xc6\x21\xf4\x1e\x19\x90\x33\x36\x67\x6a\x40\x4e\x27\x67\xd2\x9c\xa3\xea\x5d\xcf\xb6\xc3\x1b\x09\x9f\x90\x57\xd6\xa8\xd3\x86\x18\xec\xff\x10\x55\x7d\x4b\x55\x1b\xa0\x42\x3f\xeb\xa3\x48\x6d\xb9\x00\x1b\x46\x0a\xe5\xd7\xad\xc2\x18\x9d\x96\x29\x34\xd8\xe9\xbc\x40\x87\x58\x54\x59\xe1\xda\x46\xfc\x8d\x60\x05\x1e\xcf\x0b\x4c\x40\x2e\x88\x62\xba\x90\x42\xb3\x3a\x58\x61\xd5\x49\x11\x4c\x5d\xdd\xab\x85\xd8\xfa\xe4\xec\x7a\x66\x16\x52\x1b\xa8\x23\xed\xa7\x6d\xd3\xb9\x1f\x0e\xca\x72\x69\x96\xb1\xb4\xd6\x70\x0b\xfb\xcd\xd0\xba\x7b\x20\x81\x56\x05\xbe\xfd\x09\x73\xd5\xba\xb5\x42\xdf\xda\xfd\xa1\x79\x9b\xef\xb2\xe2\xdb\x00\xdf\x56\xde\x5b\x6d\x4c\x38\x44\x22\x06\x58\x42\x3f\x06\x4c\x6c\x1d\xb5\x6a\x99\x49\x79\x4d\x12\x99\x17\x19\x6c\x9d\x0e\x3b\xab\xea\x14\x15\x58\x69\x08\x6d\x3d\x0f\xa2\x26\x52\xf0\xc1\x1a\xdb\x74\xf6\xa1\x83\xb1\x8f\x2c\xe9\xad\x3d\xa4\x95\xa5\x76\x95\x21\xde\x2f\x45\x50\xc5\x26\xd2\x1e\x60\x50\xaa\x1c\xd0\xf8\x22\xe8\x99\x93\x8f\x2c\x89\x5a\xac\x02\x1e\x54\xe2\xd1\x15\xec\x46\xef\xde\x3a\xbb\x73\x98\xa2\xaf\xd0\x40\x87\xd2\xb6\xf8\x6a\x40\xe8\xc1\x98\x1e\x31\xdc\x3d\x02\x9a\x2f\x80\xfd\x84\xe5\x6e\x31\x04\x45\xe0\x61\xdc\xb1\x4b\xb8\x7b\x21\xf9\xda\x8f\x05\x3d\x6e\xa4\x34\x64\x6f\xf7\x60\x77\x7f\xc9\x67\xd9\x80\x9d\xbe\x8a\x7e\xc9\x01\x67\xb1\x00\xd0\x42\x96\xec\xa6\x03\xc2\x8d\xcf\xce\xc6\xae\x39\x30\x2b\x57\x83\x37\x20\x5a\x12\xa3\x68\xca\x9d\xf6\x03\x9f\xda\x9b\x8c\x2a\xdd\xe1\xb0\xb7\xfb\xeb\xae\x6b\xda\x73\x23\xc5\xae\x81\xe9\x8f\xc8\x15\x62\xb6\x84\x81\x16\xb2\x84\x1e\x92\x48\x82\x22\xe3\x09\x37\xd9\x02\x04\x1d\x91\x25\xf6\xad\xb2\xc7\x8c\xab\xfd\x3b\xf9\xc8\x8d\x6f\xd0\x21\x27\xe4\x05\xb6\xcd\x62\xd4\x79\x4d\x33\x3e\x67\x07\x33\x46\x33\x33\xc3\xc4\x12\x21\xc5\x10\x5b\x16\x5a\x09\xe4\xbe\xe9\x1a\x63\xe9\xe6\x82\x8c\xaf\x0e\xee\xc8\xe5\x09\x75\xb4\x36\xac\xec\xfd\xae\x7d\x53\x66\xb2\x04\x9d\x75\x75\x75\xfe\x5d\xad\x2b\x33\x08\x7f\x63\x0a\x9f\xee\x13\xf5\x2e\xdf\x00\xd9\xd1\x4f\x80\xb3\x53\x4b\x65\xd2\xa3\x08\xeb\xda\x5a\x99\xac\x86\x42\xbb\x7f\x4f\x65\xf2\x0f\x59\x02\x90\x06\x1d\x67\x8b\x80\x62\xa0\x99\x21\x3b\x76\xa8\x1d\x2b\x9e\x2c\x37\xfc\x9d\xd1\x14\x41\x26\xb4\x61\xb4\x95\xc6\x17\x5f\xbd\x05\xde\xa2\xb9\xf5\x7b\x0e\x94\xda\xc8\x9c\xcc\xdc\x6b\xd7\x8b\x2b\xdd\xce\x18\xc1\xee\x41\x8b\xd2\xea\x5c\x05\x4a\x38\xf7\x9b\x67\x27\xbf\x96\xe4\x06\xd2\xbd\xd6\x41\x20\x89\xc9\x16\xf7\x99\xe1\x02\x89\x85\x98\x2d\x3d\xc9\xd2\x1e\x12\x26\x48\x8f\x49\x13\xa4\x5b\xa9\x66\x73\x20\x08\x04\x76\xcf\x0f\xeb\x2d\x0f\x83\xf4\x96\x6b\x40\x56\x39\x66\x1d\xcf\xa0\xd3\xa6\x27\x22\xf6\x1a\xe1\x27\xdd\x8b\x41\xe3\xeb\x6e\x02\xf4\xb3\xf8\xa4\x4f\x0a\x14\x3d\xa4\x83\x2f\x27\x83\x2f\xf5\xba\x07\x31\xa1\x99\x9a\xb7\x2d\xd7\xae\xae\xfe\x5e\xbd\x63\xe3\x7f\xb2\xba\x12\x5a\x11\x11\xda\x3d\x9b\x27\xd1\xfc\x9f\xf4\x97\xb6\xd9\x77\xd2\x66\xaf\x29\x9b\x8f\x9a\xb0\x09\x65\x22\x9d\xa5\x48\x3d\x5e\x00\x43\xc6\x58\x9b\x4e\xf7\x8b\x30\xea\xac\xae\x59\xf7\xbf\xda\xad\xb6\x11\x7b\xcc\x24\xc5\xa5\x4c\xae\x7b\xb4\x6b\x76\xaf\x8e\xce\x71\xc8\xc8\xb4\xa1\xc2\x3b\x43\xb8\x98\xcb\x6c\x0e\x58\xa4\xe4\xea\xe8\x1c\x76\xde\x08\xfe\x05\x8e\x28\xb0\xa8\x17\xcc\x54\x85\x0c\x2e\x3c\x15\x10\x45\xa1\x48\x83\x66\x5c\x1b\x9e\xc0\xef\x2a\x37\xa9\x1d\xa1\x4b\x5c\x6a\x6b\x29\xad\xba\x7a\xb7\x94\xa2\x96\xb9\x0f\x35\x9a\xba\x26\x1e\x6e\xf0\xb9\xe4\xce\x23\x55\xeb\x29\xbd\x3d\x97\x7a\x18\x6f\x73\xcf\xa5\x42\xb1\x4b\x23\x5b\x61\xe7\x93\xe5\x48\x08\x0e\x76\x4b\x1c\x64\xcc\x26\x52\xb1\x66\x20\x24\x0a\x6c\xa4\x25\x6c\x42\x2a\xa0\xfa\xcf\xbb\xa0\x64\x2d\x78\x81\x29\x97\xbe\x5f\x74\xe6\x10\x42\x0f\x74\x0c\x0b\xea\x9b\xff\x0e\xec\xdb\xb1\x1c\x66\x37\xa8\xca\x18\x5c\xeb\x61\xf8\x90\x99\x04\xdd\xac\x3e\xfe\xe2\x3c\xaa\x7e\xfa\xcd\x50\x49\xa2\xa8\x9e\x61\x5b\x5e\xf6\x91\x9b\x00\x40\x4a\xb5\x14\xe8\xec\x8d\x3a\x04\x73\x1d\x21\x54\x47\x41\x1e\xfc\xd1\xb9\x4c\x9b\x1d\xb8\xa7\x8a\x26\x8c\x14\x4c\x71\x99\x12\xa8\x27\x4e\xe5\x8d\x20\x63\x36\xe5\x42\x7b\xfa\x01\x54\xb9\x23\xb4\x3d\x6e\x18\xf8\x86\x3d\x16\xdb\x88\x5c\xd4\x40\x50\x5c\x79\x52\x22\xab\x1d\xed\x66\xd1\x0c\x32\x41\x46\x28\x90\x17\x7b\xe3\x84\x85\x89\xdb\x05\x7d\x62\xd2\x3d\x44\x9b\xb0\xa3\x95\xff\xee\x56\xea\x70\x6d\xa9\x9e\xcc\xba\x05\x7e\xb7\xe1\xa9\x7b\x5e\xdb\xf0\xd4\xc3\xae\x6d\x78\x6a\x1b\x9e\xba\xfd\xda\x38\xf7\xee\x36\x3c\xb5\x35\xba\x9a\xd7\x36\x3c\xb5\x0d\x4f\xdd\x72\x6d\x9c\xfc\xda\x86\xa7\xee\x71\x6d\xc3\x53\xf7\xbc\xb6\xe1\xa9\x6d\x78\x6a\x1b\x9e\xda\x86\xa7\x7e\x43\x6e\x40\x7f\x6d\xc3\x53\x4b\x83\x6c\xc3\x53\x11\x31\xb6\x96\xd2\x8a\x6b\x1b\x9e\x5a\x71\x6d\xc3\x53\xd1\xb5\x3d\x97\x5a\x9c\x4b\x3e\xb8\x73\x6e\xed\xb2\xee\x35\x6b\xe7\x10\x38\xe0\x89\x8b\x11\xc9\x49\xad\xce\x09\x1f\x35\xaa\xda\x45\x44\x98\x1f\xbe\xd4\xc6\x45\x83\xaa\x18\xd3\xca\x7a\xa8\x8e\xcd\xd2\x0a\x99\x56\xc1\x88\x28\x0a\x81\xd6\x69\xfb\x9a\xb4\xb5\x55\x5b\x75\x09\x3d\x6c\x74\xd8\x61\x43\x42\x3b\x3d\x84\x1a\xb6\x61\x86\x67\x17\x66\xe8\xc7\x45\xd7\x83\x7b\xae\xf3\x09\xe3\x82\xf9\x57\x33\xc5\xf4\x4c\x66\xad\x19\xbd\xc6\xe4\x6f\xb9\xe0\x79\x99\x43\x17\x55\xcb\xcf\x7c\x1e\xb2\x06\x42\xab\x68\x27\xe8\xd1\x53\x18\xb5\x5b\xf5\x6d\x56\xa1\xac\x73\x46\x41\x55\xd7\x65\x92\x30\x96\x46\x0d\xe0\x41\x31\xfb\xe3\x28\x3c\x29\xb4\xd3\x78\xd9\x4d\xde\x74\x3b\xfb\x11\xa2\x14\x46\xf9\xe3\x97\xad\xc6\xe8\x18\xe5\xf9\xfc\x11\x9e\x1e\xc4\x74\x77\x7b\xa5\x93\xad\xd2\xc7\x29\xd1\xd5\x46\x79\x6a\x91\x9c\xde\x22\x9a\x3d\x44\x70\x36\x28\x7a\xb3\x31\xc7\xc2\xa6\x44\x6c\x36\x10\x7d\xb5\x87\x00\x43\x1f\x11\x9a\xfe\xa2\x33\x8f\x00\x52\xfa\x38\x51\x99\x1e\xad\xe1\x9e\xa2\x31\x9f\x23\x12\xd3\xcb\x5b\x77\x8d\xc0\x7c\xbe\xe8\x4b\x3f\xaf\xdb\xd1\xbb\xf5\x2c\x22\x2e\x3d\x78\xb5\xfa\xf4\x68\xf5\xe6\xcd\x7a\xb4\x08\x4b\xf7\xe8\xca\x06\x44\x56\x3a\x13\x99\x0b\x6e\x38\xcd\x8e\x59\x46\x17\x97\x2c\x91\x22\x6d\x7d\xc2\x34\x50\xeb\xc2\xfe\xd1\x38\xac\xb3\xd1\xea\xf9\xc7\x33\xea\xc0\x79\x59\xea\x53\xaa\xbd\xfb\xcf\x29\x14\xd0\xd0\x04\x67\xb9\x91\x0e\x3d\xb2\x31\xc6\x20\x26\x63\xf7\xb9\x88\x7f\x97\x37\x44\x4e\x0c\x13\x64\x8f\x0b\xbf\x8e\xfb\x91\x19\x58\x59\xe6\x81\xad\xed\xb7\x2f\x5f\xf8\x9b\x9f\x9f\xc9\x0d\xce\x05\xad\x1f\xdf\x03\xe2\x1e\xf4\x69\x17\x88\xbb\x71\x52\x66\x75\x37\x08\xba\x46\xea\xf2\xe6\x65\x05\x2f\xfa\x12\xc6\x0d\xbb\x8d\x8a\x94\xb8\xc2\x8d\xe7\xb7\x68\x9d\xe3\xc6\xcf\x21\x66\xbc\xf5\xbd\x90\xbe\x7d\x2f\x6b\x8a\x0d\x6f\xa0\xd6\xfc\x44\xe3\xc1\x5b\xad\xf9\x01\x57\x54\xff\xf5\x9d\xa2\x09\x3b\xef\x5d\xe1\xf0\xdb\x89\xa4\xa5\x72\x65\x7b\x41\xef\x08\x9b\x47\x30\x96\xe2\x6e\x0a\x45\x71\x50\x8d\x36\x29\xb3\x6c\x41\xca\x42\x8a\x7a\xe5\x21\x06\xad\x9a\x05\x6b\x76\xb4\x55\x4f\xa9\xb4\xd4\x42\x49\x77\x00\xab\x52\x08\x2b\xcf\xab\x86\x43\xa0\x95\x6a\x94\xd5\x71\x59\x9c\xe6\x53\x3b\x7d\x7b\x98\x42\xc5\x1c\xcf\x59\xd5\x92\xa2\x1a\xd0\xfe\x7a\x22\x55\xc2\xc7\xd9\x82\xcc\x68\x66\xaa\xf6\xeb\xd7\x3c\xcb\xdc\x30\x23\x72\xc9\x0c\x31\x33\xee\x1a\x83\x93\x4c\x8a\x29\x4c\x8e\x0a\xdf\xd5\x8c\x25\xf6\xb7\x49\xc6\xa8\x28\x0b\x7c\x9e\x3d\xd6\x17\xb2\x54\xfe\x79\x0e\xd6\x32\x8c\xc2\x35\x11\x3c\x1b\x44\xbd\x93\xee\x5c\xd8\xaa\xa1\xbc\x66\xbe\xa6\xf0\x86\x6b\x36\x88\xc7\xf4\xc8\xbc\x3a\xea\x9c\x51\x28\x39\xe7\x29\x76\xbf\xf0\x64\x83\x2e\xad\xd8\x1d\x23\xec\x67\x21\xc5\x50\xb0\x29\x05\xad\xc7\xed\x22\x5c\x33\x1c\x07\x43\x71\x22\x85\x7e\x19\xd6\x5c\x90\x45\xad\x94\x75\xce\xb1\xd3\x67\x44\x39\xb2\x27\x24\x91\x70\xbc\x96\x82\x1b\xec\x1e\x3d\x2b\x0d\x49\xe5\x8d\xd8\x1f\x21\x2a\x31\xc7\x43\x3b\x2b\x66\xbe\x97\xad\xef\xad\xc8\x15\xd3\x84\x09\x3a\xce\xec\xaa\x43\xca\xc3\xd5\x4a\x12\x91\x09\xa3\xa6\x54\x8c\x4c\xa9\xe9\x18\xba\xee\x4d\x45\xfa\xd3\x57\xed\x36\x37\xcf\x99\x2c\xcd\x67\xb1\x01\x6f\x66\x3c\x99\xc5\x2a\x2d\xcf\x99\x26\xb2\x6c\x18\xc7\x2f\xdd\xcf\x56\xea\xa3\x5b\x43\x70\xe5\xd5\xd6\xbd\xbb\xc2\x07\xd6\xac\x15\xae\xfa\xc1\x52\x4d\x28\x39\x3e\xbb\xfc\xe7\x9b\xc3\x6f\x4f\xde\x8c\xc8\x09\x4d\x66\x71\x21\xb9\x20\x14\x76\x3b\xec\xf0\x19\x9d\x33\x42\x49\x29\xf8\x2f\x25\xc2\x8a\x93\xbd\xf0\xdb\xfd\x5e\x41\x8c\x5b\x1e\x9b\xd0\xb3\xba\xb7\x26\x49\xd8\x01\x1b\x33\x13\xa4\x66\xd0\xd6\xa0\xa9\xf7\x9c\xd8\xaf\xd0\x42\x00\x1d\x69\xc6\xac\x0c\xe1\x73\x27\x3f\x1d\x2a\x34\x4d\x43\xae\x84\xe5\x73\xcb\x16\xf6\x8c\xa1\x63\xc8\x71\x98\x31\x22\x98\xb1\x6c\x1d\x3c\x4d\x52\xe8\x5a\x45\x7f\xa9\x99\x1e\x90\x71\x09\x59\x19\x85\xe2\x39\x55\x3c\x5b\xc4\x83\xd9\x43\xe6\x4c\x7a\x3b\x66\xd1\x9c\xd2\xf1\xbb\x93\x4b\x72\xf6\xee\x8a\x14\x0a\x6b\xfd\x21\xad\x02\xbe\x87\xd7\x1a\x33\xfb\x0b\xd7\x5c\x73\x44\x0e\xc5\x02\xbf\xc4\x0d\xce\x35\xb1\x46\x0c\x83\xb3\xd3\x29\x7f\x1e\xcd\x7d\xe7\xc5\x08\xfe\xb7\x63\xdf\x52\x59\xed\x30\x64\x8b\x24\x4b\x59\x5f\xa8\x3f\xf2\x71\x16\x51\xd3\xbd\xfb\xb3\x6a\x93\x14\xf2\xdd\xce\x2d\x11\xa3\x36\x49\x34\x2c\x35\x90\x17\xdb\x66\x71\x31\xcd\x62\xae\x6a\x27\xf6\xbb\x1a\x85\x5d\x4d\xc2\x61\xf5\x06\xe7\x6d\x2d\xc3\x5e\xda\x35\x55\x73\xe8\xa9\xc9\x49\x75\xfa\x79\x3b\xc8\x49\x04\x19\xf7\xad\x3c\x3d\xf7\x3b\xc0\xa9\x25\x79\xa3\xd9\x21\xfc\x18\xa3\x11\x03\xf2\x82\x7c\x4d\x3e\x92\xaf\xc1\x2e\xfa\x53\xd7\x96\x30\x5d\x2d\x96\xee\x7e\x19\x34\xc7\x4f\xcf\x7b\xa2\xf8\x0f\x56\x3a\xd9\x11\x2d\x55\x8d\x24\x63\xee\xf4\x70\xf6\xd1\x30\x65\xe5\xa8\x5b\x89\xb5\x36\xd3\xb1\x13\xfc\x8c\x6c\x86\x41\x87\xd3\x49\xdc\xcb\xc1\x3c\x90\xd1\xec\xcf\xff\x2e\xb5\x39\x73\x52\xa8\xde\x19\xa2\x1a\x2d\xa7\x26\x99\xd5\xc5\x98\x55\xd4\xb4\xa9\x36\x98\x26\xa9\x04\x17\x18\x26\xf0\xcd\x78\x87\x14\x8a\xcd\x61\xe3\x6e\x51\xf5\xda\x7a\xde\xb5\x52\x0d\xcf\x07\x18\x2c\x4e\xb1\x8a\x70\x61\x0a\x99\x3a\x9d\xcc\x4e\x2b\x8d\xce\x8c\x3b\x94\x32\xe7\x64\x09\xbe\x66\xe0\x25\xbb\x9f\x12\x2a\x30\xf3\x7a\xc2\x94\xc2\x9c\xcb\xf1\x02\x42\xbf\x3c\x61\x9d\x17\xaf\xd3\x4e\x2a\x94\x34\x32\x91\x1d\xfa\xfd\xd4\x23\xdd\x6e\x38\x20\x02\x7a\x6d\xbd\xb3\xfc\xfd\xf1\xf9\x80\x5c\x1d\x9d\x43\x1b\x94\xcb\xa3\xab\xf3\xba\xa5\xb2\x73\x75\x74\xbe\xb3\x56\x52\x10\xaf\x59\xbd\xb2\xd3\x6c\x31\x48\xcd\x63\x64\xd5\xb6\x61\x4e\x8b\xe1\x35\x5b\xb4\x3c\x53\xfb\x38\xd7\x87\x61\x85\x7b\x79\x21\x24\x73\x4e\x8b\x07\x8f\xa6\x18\x4d\xf9\x67\x2a\x7f\x70\x3b\xab\x7a\xe6\xea\x3a\x88\x5c\xce\x59\x8a\xea\xb0\xff\x05\x13\x69\x21\xb9\xd5\x17\xb7\xc5\x11\x0f\xff\xf5\xb6\x38\xe2\xae\x6b\x5b\x1c\xb1\x2d\x8e\xd8\x16\x47\xdc\x7d\x6d\x8b\x23\xdc\xb5\x7e\x37\x28\xd9\x16\x47\xb4\xbc\x9e\x57\x80\x7e\x5b\x1c\xf1\xa0\x6b\x5b\x1c\xb1\x7c\x6d\x8b\x23\x6e\xb9\xb6\xc5\x11\xb7\x5c\xdb\xe2\x88\x6d\x71\xc4\xb6\x38\x62\x9b\xe6\xf5\xc9\xb1\x36\x33\xcd\x8b\x6c\x8b\x23\xdc\xb5\x2d\x8e\x78\x16\x39\x31\x64\x5b\x1c\x71\xaf\x6b\x5b\x1c\xb1\x2d\x8e\x68\x73\x6d\x8b\x23\xe0\xda\xfa\x5e\xb6\xc5\x11\xfe\xda\x16\x47\xe0\xf5\xdb\xd1\x9a\xb7\xc5\x11\xdb\xe2\x88\x6d\x71\xc4\xb6\x38\xe2\x8e\x6b\x5b\x1c\xb1\x66\x6d\xd7\x77\x9d\xeb\x9e\xec\xbf\x7b\x24\xf3\xa2\x34\x8c\x5c\xf8\x21\x83\xfa\x87\x3b\x9a\xeb\xf8\x28\xef\x9e\x7b\x93\x48\x31\xe1\x53\x27\x92\x0f\xb0\xa5\xdb\x30\xbc\xcf\x30\x6a\xa3\xf6\x04\x13\x6f\x32\x9e\xf3\x76\x15\x18\x64\x69\x61\xde\xc0\x58\x51\x74\xc6\xee\xa4\x9c\x7e\x84\x2d\x42\x73\x59\x62\x1b\xbc\xc4\xad\x5f\x20\x21\xc6\xb0\x36\x6e\x65\x48\x3f\xb6\x49\x55\x4a\x72\xde\x83\x99\x50\x50\x63\x98\x12\xaf\xc8\x7f\xef\xfd\xf4\xc5\xaf\xc3\xfd\x6f\xf6\xf6\x7e\x7c\x31\xfc\xeb\xcf\x5f\xec\xfd\x34\x82\x7f\xfc\x61\xff\x9b\xfd\x5f\xfd\x1f\x5f\xec\xef\xef\xed\xfd\xf8\xfd\xdb\xef\xae\xce\x4f\x7e\xe6\xfb\xbf\xfe\x28\xca\xfc\x1a\xff\xfa\x75\xef\x47\x76\xf2\xf3\x3d\x07\xd9\xdf\xff\xe6\xf7\xad\xa7\xdc\x59\x97\xed\x4f\x93\xed\x49\x8f\x7d\x14\x2d\xd6\x85\x75\x7b\xda\x8b\x17\x6e\xb4\xe6\x6e\x74\x07\xd6\x5d\xbb\xd1\x4b\x53\xd0\xcf\xc2\x38\x5c\x13\x99\x73\x63\xb5\x3a\xab\xc8\xd1\x38\xa1\x8b\x9b\x9a\x35\xe9\xe4\x00\x64\x42\x52\x83\x5d\x39\x43\x32\x54\x94\x60\x2d\xbd\xca\xe6\xba\x9d\x06\x47\x03\xec\xe7\x61\xca\x26\x5c\x30\x17\xc0\xda\xca\x86\x4f\x5f\x5b\xd9\xf0\x1c\x65\x83\x66\x49\xa9\xb8\x59\x1c\x49\x61\xd8\xc7\x56\xae\x91\xba\x68\xb8\x74\x03\x12\x59\x60\x76\x63\x30\x82\x30\x33\x56\x95\x02\x8c\xbe\x07\x6f\xb9\x42\x66\x3c\x59\x1c\xf8\x09\xc3\x1e\x63\x1f\xcd\xc1\x3d\xc7\x31\x54\x5f\x57\xfb\x96\x0d\xad\x2a\x1c\xb6\xe9\xf2\xa8\x4f\x50\xd9\x02\x3d\xe7\x5c\xf1\x39\xcf\xd8\x94\x9d\xe8\x84\x66\x20\x9e\xfa\x11\xf9\x87\xb7\x8c\x0e\x92\x5a\xc9\x4c\x5b\x8b\x1f\xda\x12\x53\x6f\x82\x43\x85\xc9\x94\x72\x41\x72\xbb\x44\x85\xff\xb1\x46\x5b\xde\x4a\xf1\x82\x2a\x26\x4c\x65\xb3\x83\x89\x3a\x96\x32\x73\xa9\xbb\xd9\xa2\x1a\xdf\xe5\xbe\x0b\xf9\x4f\xc1\x6e\xfe\x69\x47\xd3\x64\x92\xd1\x69\x30\xd5\x35\x33\x4b\xde\xb6\x6a\xe8\x5b\x5f\x00\xf2\x62\x4b\x46\x68\x76\x43\x17\xba\x72\x5c\xc4\x0d\xb4\x5f\x91\x97\xfb\xc0\xba\x54\x93\x30\x46\x4a\xbe\xdc\x87\x58\xde\xd1\xe1\xf9\x3f\x2f\xff\x71\xf9\xcf\xc3\xe3\xb7\xa7\x67\xdd\x04\xbe\x7d\x77\x46\x45\xab\x31\x12\x5a\xd0\x31\xcf\x78\x17\x39\xbf\x94\xed\x11\x0f\x0a\x27\x69\x9a\x1e\xa4\x4a\x16\x48\x27\xef\x23\xaa\x0e\xbc\xba\x31\x1b\x57\x06\xc3\xf2\x4c\xea\x03\x4e\x15\x15\xa6\x72\x96\x54\x24\x57\xa5\xb0\xf6\xf1\x13\x4f\x8c\xa7\x69\x7f\x49\xf1\x87\x69\xca\xd2\x1a\xf5\x9e\x5d\x12\xde\x91\x7f\xb9\x45\x55\x23\x4d\xce\xdf\x5d\x9e\xfe\x3f\x0d\x36\x5c\x14\xdd\x72\x8e\xfa\xa9\xcb\x52\xed\x3b\xfa\x93\xe6\xab\x5f\xb8\xba\x9f\xed\xfa\x6e\xc4\xfa\x86\xb3\xaa\x9f\x48\xf7\x45\x29\xea\x30\x1a\xd5\xf8\x24\x97\x29\x1b\x91\xf3\xe0\x25\xaf\x7f\x1b\x95\xd7\x52\xc5\x88\xbd\x45\x18\x4e\xb3\x6c\x41\xac\x21\x35\xa7\x19\xc3\x54\x66\x28\x66\xa9\x55\x06\xc7\x72\x78\x42\x33\xdd\x51\x98\x76\x39\x99\xec\x21\xfc\xd6\xda\x84\xbd\x50\x33\x8c\x46\x52\x26\xa4\x71\xc6\xa7\x9d\x25\x14\x4b\x2b\x99\x10\x34\x40\xa3\xb4\xa4\xda\xe9\xa2\xd1\xd1\xee\x0f\x26\xae\x3d\xad\xce\xc3\xc8\xe8\xac\x2d\x35\xd3\xab\x0f\xa6\xca\x24\xb5\xa3\x2b\x46\x53\xa8\x09\x2b\xa8\x99\x61\x56\x41\x4e\xf5\x35\x4b\xf1\x03\xa7\xd7\x04\x27\xbb\x1d\x31\x3c\xea\xca\xce\xdb\x7b\xd4\x41\x9f\xc1\x5c\x07\xf0\xc4\xb7\x03\xbd\x20\x7d\x6c\x01\xfb\x4e\xef\x44\xb6\xb8\x90\xd2\xbc\x0e\xb5\x50\xbd\x2c\xe0\x0f\x4e\x53\xac\x7b\x53\x41\x95\x82\x24\x80\x74\x08\xc4\x04\x96\x8e\xcb\xb0\x8e\xab\x05\x5b\x33\x43\xab\x52\x1c\xea\xef\x94\x2c\x5b\x9f\x00\x4b\x8a\xd6\x77\xa7\xc7\xb0\x8f\x4b\x17\xe5\x12\x46\x2d\xa0\xea\x73\x19\xb0\x27\xe8\xb4\xef\x5d\x9c\x2e\xe6\x48\xab\x27\x97\x42\x33\x33\x22\x6f\xe9\x82\xd0\x4c\x4b\xaf\x1c\x73\x41\xce\x21\xc2\x15\x9b\x7c\x23\x02\x95\xe9\xf8\xf5\x58\x9a\x19\x69\xdc\x00\xec\xbc\xfc\xbb\x41\x14\xf4\xaa\x10\x84\xb8\x58\xfa\xb9\xa1\xd7\x4c\x93\x42\xb1\x84\xa5\x4c\x24\x4f\x3c\x62\x04\x2b\x7f\x26\x85\xdd\x16\xbd\xac\xfd\x69\x88\xf1\x81\x3f\xab\xbe\xd2\x10\x2d\x74\x76\x07\x85\x98\x21\x6c\x8a\x52\x33\x85\x01\x4e\x55\x32\x5c\x88\xef\xcb\x31\xcb\x98\x41\x63\x08\x70\x1f\xa8\xc1\xda\x48\x9e\xd3\x29\x23\xd4\x04\x46\x31\x92\x30\xa1\xad\xb8\x41\x0f\x9a\x21\xa9\x64\x55\x01\x23\xd5\xe4\xfd\xe9\x31\x79\x41\xf6\xec\xb3\xf6\x61\xf9\x27\x94\x67\x10\x4e\x34\x54\x35\xe7\xc8\x27\x7e\x08\x98\x12\xf0\x1e\x91\x0a\xb7\xe8\x80\x08\x49\x74\x99\xcc\xfc\x9c\xac\xc5\xe5\x0d\x36\x97\x4f\x07\xbe\xf9\x67\xc8\xaa\x9d\x05\xcc\x7b\xcd\x54\x6f\xf2\xe5\x7d\x0b\xf9\x12\xab\x10\x96\xe7\xea\xd4\x43\xc6\xca\x99\xa1\x29\x35\xd4\xc9\x9d\xaa\xea\xf9\x39\x2e\xe9\xba\xa5\x8f\x66\x6f\xb8\x28\x3f\x62\xc6\x48\x7f\x46\xfe\xe5\x09\x0c\x4b\x12\x4f\x34\x58\x34\x5a\x14\x19\xc7\x7a\xe3\x46\x06\xd3\x69\x6d\xa9\x07\xb7\xa8\x48\xb0\xcd\x69\x96\x49\x2b\xde\xec\xc9\x4e\x45\x2a\xf3\xa5\x87\x59\x05\x8a\xd5\x80\xe6\x46\xe4\x59\x32\xcf\xda\xdd\x11\x19\x9b\xb3\x0e\x98\x2a\x4d\x5c\x3c\x3b\x9a\xd5\xc5\xfc\x82\xc2\xf0\x24\xa3\x63\x96\xe1\xc9\x82\x0c\xa4\x97\x19\x68\xdd\x59\x80\x4a\x66\xfd\xd5\x40\x5c\xc8\x0c\xb2\x33\x68\x20\x84\x1d\xfe\x49\xd0\x01\x06\xe9\x8b\x0e\x60\xc8\xd4\xe8\x00\x26\xd9\x53\xa0\x43\xd9\xe1\xa0\x25\x4d\x3a\xd8\x53\xbb\x4e\x07\x38\x3a\x37\x9d\x0e\x9a\x25\x89\xcc\x8b\x73\x25\xad\xc9\xd5\xdb\xd1\xe2\x86\xad\xc2\x41\x68\x93\xaf\xc8\xa5\x01\x51\x5e\xbf\x99\xaa\x28\xa1\x8e\x1a\x94\xf1\x3e\xa0\xf4\xff\x8b\x5b\x0b\x5b\xd1\xd3\x3c\x87\xfc\x28\x3e\x4d\x2f\xfc\xd2\x7d\xf1\xc4\xcb\xf9\x3b\x78\xc9\x7a\x39\x4c\x64\x42\x33\x80\xbc\xeb\xc6\x31\xa4\xc9\x35\xcd\x81\xa3\x2c\x48\x08\x2d\xc1\x67\x3e\x7c\x0f\xe8\x67\xf0\x89\xf3\x7d\x09\x99\xb2\x08\x85\x07\xd3\x37\xaf\x30\xe9\x0e\xee\xf3\x09\x98\xf6\x54\xf7\xd1\xc0\xb4\xf6\x6b\x23\x1d\x02\xcb\xdb\x00\xa4\x67\x27\xc8\x44\xca\xc5\x14\x3c\x3a\x03\xa2\x58\x86\xa9\x9b\x6e\x0f\x5f\xa3\xf9\xb5\x0b\x1c\xed\x07\xf5\xec\xec\x1f\x0d\x9a\x10\x97\xc2\x8d\x0c\x4e\x0e\xaf\xdf\x4c\x50\x5a\x72\x4d\x76\xde\x78\x02\x74\x40\x1e\xdb\xc4\x03\x62\x07\xdf\x30\xac\x26\xfa\xd8\xae\xb9\x48\x5d\xb2\x64\x8d\x58\x01\x23\x16\xb5\x50\xc8\x9f\xe5\x69\x2c\x1a\x5e\x91\x9f\x04\x09\xc4\x22\xc3\xd6\xec\x71\x81\x0a\xab\x77\x2f\x0d\xef\x76\xf9\x85\x87\x34\x87\x79\x2f\x60\xed\xed\x73\x87\xd6\xec\x5d\xbe\xcf\xbf\xcb\xce\x3a\xd7\xf5\x86\x8b\x54\xde\xe8\xbe\x6d\x88\x1f\x70\x58\xaf\x50\x27\x96\xad\x0d\x17\x53\x1d\xdb\x11\x34\xcb\x6a\x6e\xd8\x55\x86\x84\x5f\xe1\x80\x08\xbc\xac\xc0\x37\xb2\xb3\xb7\x46\xc0\x03\xae\x69\xae\xe9\x91\xb2\xaf\x62\x38\xcd\x2e\x8b\xf6\xd0\x68\xa4\xc9\x06\xdf\xbd\xbd\x3c\xac\x0f\x6d\xe5\xd9\x0d\x20\x4e\x5b\x62\xdb\xef\x09\x4d\x73\xae\x35\xb8\x81\xd8\x78\x26\xe5\x35\xd9\xf3\x69\x1b\x53\x6e\x66\xe5\x78\x94\xc8\x3c\xca\xe0\x18\x6a\x3e\xd5\x07\x8e\x69\x87\x76\xf6\xfb\x84\x8b\x8c\x8b\xc8\x35\x0f\x58\xca\xce\x8d\x01\x0f\x49\xc2\x2c\x60\x6d\x1d\x5e\xa6\x8b\x32\x2f\x4f\x13\x11\x32\x39\xcb\xd6\x0f\xf8\xb2\xbc\x3c\x67\x1d\xb1\x2b\x3e\xb1\x44\xf0\xee\xae\x34\x24\x2e\x63\x5a\x49\x47\xd4\xde\xd6\x4e\xa4\xe0\x1d\xeb\x95\x36\xe0\x25\x73\x83\x5a\x41\xe0\x25\x5a\x17\xaf\x99\xbd\xe5\xb1\x3c\x67\x4f\x43\xec\x91\xae\x8b\xee\xea\x73\x7b\x42\xe8\xbc\x8c\x46\x8b\x74\x91\xe0\x7b\x3f\x97\x29\xd6\xe7\x87\xfa\x62\x00\xd6\x07\xbc\x00\xfe\x1f\x7f\xda\x54\x27\x96\x90\x98\x69\x1a\x17\xee\x3b\x80\xc2\x94\x58\xc5\x21\xf3\x86\x4e\x5e\x64\x0c\x4a\x79\xa2\x91\xab\x2a\xa5\x08\xd2\x73\x10\x26\x52\xa1\x82\x3a\xb8\x80\x01\xf9\xb7\xd5\x1c\x69\xc8\x86\xf2\x95\xcc\xe7\xe1\xe7\xa8\xef\x72\xed\xf1\x7d\x01\xae\xc8\x48\x6f\x47\x91\x94\x4f\x26\xcc\x67\x5d\x59\x3d\x98\x2a\x9a\x33\x03\x11\x66\x24\xc1\x98\x4d\x39\xa6\xf5\xc8\x09\xa1\x76\x22\xbb\xbb\xba\x2a\xc7\x1d\x60\xea\x0f\x37\x24\xe7\xd3\x19\x32\x0a\xa1\x50\xa6\x45\x7c\x7c\x21\x93\x34\x25\xc0\xdb\x52\x91\x1b\xaa\x72\x42\x49\x42\x93\x19\x04\x2b\xa8\x20\x69\xa9\x00\xb3\xce\x30\x9a\x2e\x86\xda\x50\x63\xcf\x7d\xa6\x9c\x7a\xec\xe7\xbf\xc5\x35\xbd\xf3\xda\xe2\x9a\xde\x7e\x6d\x71\x4d\xb7\xb8\xa6\x5b\x5c\xd3\xbb\xaf\x2d\xae\xa9\xbb\xd6\x5f\xc1\x48\xb6\xb8\xa6\x2d\xaf\xe7\x85\xad\xb1\xc5\x35\x7d\xd0\xb5\xc5\x35\x5d\xbe\xb6\xb8\xa6\xb7\x5c\x5b\x5c\xd3\x5b\xae\x2d\xae\xe9\x16\xd7\x74\x8b\x6b\xba\x45\x68\xfa\xe4\x58\x9b\x89\xd0\x44\xb6\xb8\xa6\xee\xda\xe2\x9a\x3e\x0b\x38\x1b\xb2\xc5\x35\xbd\xd7\xb5\xc5\x35\xdd\xe2\x9a\xb6\xb9\xb6\xb8\xa6\x70\x6d\x7d\x2f\x5b\x5c\x53\x7f\x6d\x71\x4d\xf1\xfa\xed\x68\xcd\x5b\x5c\xd3\x2d\xae\xe9\x16\xd7\x74\x8b\x6b\x7a\xc7\xb5\xc5\x35\x5d\xb3\xb6\xab\x4d\xca\x5b\xe1\x37\xdd\xa7\xdc\xde\xa5\x74\x44\x05\x7a\xe3\x72\x32\x61\x0a\x44\x0e\x3c\x79\x29\x7d\x20\xc0\xf2\x04\x21\xe4\x12\x04\x34\x33\x03\xa8\xdc\x77\x69\xbb\xb7\xfc\xdc\x55\x04\x02\xce\x92\x62\x1a\xaa\xd5\x05\x39\x79\xf7\xba\x9f\xda\xfe\x6e\x65\xb7\x30\xe7\x77\x22\xe9\x9e\x64\x56\x11\x7c\x55\x1a\xb9\xa3\x7b\x92\x49\x8d\x49\x1e\x48\xac\x64\x46\x85\x60\xde\xea\xe3\x06\xbc\x29\x63\xc6\x04\x91\x05\x13\x28\x78\x29\xd1\x5c\x4c\x33\x46\xa8\x31\x34\x99\x8d\xec\x93\x84\x27\xb6\x83\xb1\xaa\x46\xd4\x46\x31\x9a\x23\xd1\x15\xcb\x29\xc7\xa1\x08\x4d\x94\xd4\x9a\xe4\x65\x66\x78\x11\x06\x23\x9a\x41\x5a\x2e\x9e\x30\x81\x18\x90\x17\xc2\x30\x0b\x03\x8a\xcd\xc3\xd3\xdc\xb4\x64\x0c\x6d\x02\x36\xe7\x00\x40\x19\xf3\xc2\x2c\x42\x02\x1c\x23\x13\xae\xb4\x21\x49\xc6\xe1\x98\x85\x27\x62\x05\x14\x8c\x37\xf0\x87\xac\x70\x33\xd5\x6e\xaa\x22\x05\x7d\xb3\x30\x1a\xd3\xc9\xaa\x01\xdd\x50\x29\xd7\x4e\x3f\xd7\x03\x42\x3d\x70\x07\x12\xda\xcf\x14\x48\xed\x0f\x04\x1c\xdd\x7d\x14\x0d\x17\xa1\x7d\x55\xf9\x76\x15\xa3\x03\x32\x87\x67\xce\x41\x8c\x50\x19\x69\x02\x90\xa7\xb2\xb4\x0d\x60\x01\x04\x9b\x5b\x1e\x60\x09\xb3\x07\x23\xbd\x85\xeb\x3f\x3b\xd3\x47\xca\xc2\x5b\xa6\x35\x9d\xb2\xf3\x96\xe1\x86\xdb\x4c\x29\x88\x38\x54\x0b\x03\xac\x90\x61\x91\x4d\xf8\xa4\xca\x4f\xaa\xeb\x2f\x24\xc7\x39\x05\xad\xe5\x46\x71\x63\x18\x2c\x2a\x40\xbc\x40\xc4\xb2\x59\x46\xb7\xdb\xc8\x72\x7a\xeb\x07\xa9\x7e\x6c\x85\xba\x48\x31\xe7\x68\xcc\xc8\x58\x71\x36\x21\x13\x0e\x89\x4c\x90\x5a\x34\x40\xd0\x02\x8a\x5a\x85\xd6\xd6\x50\x95\xc2\x2b\xa1\x7e\x5e\x23\xf2\x83\x9b\x98\x51\xa5\x48\x68\x04\x65\x06\x85\x26\x7c\x42\xa6\x90\x9a\xe4\xd4\xbc\xaf\x5e\xfc\xf5\x4f\x64\xbc\xb0\x47\x1a\xa8\x44\x46\x1a\x9a\x85\x97\xcc\x98\x98\x5a\x5a\xe1\xf6\xac\x97\x4a\x04\x0a\x00\xa4\x32\x4e\xfc\xe5\x97\xd7\xe3\xfa\x19\x7b\x90\xb2\xf9\x41\x44\xbf\x61\x26\xa7\xab\x40\xaa\xdb\xe7\x3a\xb6\xb4\x65\x56\xb0\x19\xc0\x39\x76\x66\x34\x8f\x9e\x41\x66\xf2\x06\x95\xf4\x15\xdc\x53\x25\x2f\x16\xb2\x28\x33\x74\x3d\xbf\x0e\x45\x46\xa5\x66\xcb\x95\x04\x2b\xf7\x05\x38\x4b\xdd\x10\x0d\xa9\xe1\x32\xd2\xfc\x23\xa5\x4b\xca\x76\xee\xbc\x00\xa2\x01\x16\xcc\x6b\x9a\x65\x63\x9a\x5c\x5f\xc9\x37\x72\xaa\xdf\x89\x13\xa5\xa4\xaa\xcf\x25\xa3\x56\x5a\xce\x4a\x71\x8d\x30\xba\xa1\xd0\x51\x4e\xad\x6a\x55\x94\xc6\x67\x00\xaf\x7a\x61\x2c\x9b\xf3\x42\xd8\xdb\x2f\xd5\x28\xec\x23\xaf\x8c\x14\x41\x98\x7d\x3e\x72\x64\x3c\xbe\x8e\x99\xed\xcb\x17\x5f\xfd\x05\x59\x97\x48\x45\xfe\xf2\x02\xb2\x16\xf5\x00\x37\x31\xc8\x36\x7b\x50\xe4\x34\xcb\xac\xbe\x1f\x33\xa5\x25\xf4\x2a\x26\xfc\xec\x3c\x68\xba\xb3\xdb\xbd\x55\xa9\xab\xab\x7f\x80\x1e\xc5\x8d\x66\xd9\x64\x80\xe9\xfc\xc1\x1a\xd9\x85\x83\x61\xd7\x49\x1f\x7b\xae\x6e\x82\x02\x34\x97\x59\x99\xb3\x63\x36\xe7\x7d\x20\xe9\xd7\x46\xf3\x36\x7a\xc6\x35\x54\x4e\x8c\x33\x99\x5c\x93\xd4\x7d\x19\xe5\x9f\x34\x81\x20\xdb\x53\xa1\x6d\x26\x4e\x87\x0c\x9c\x5b\xdf\xbf\x96\x7b\x93\xd3\xa2\x08\xc9\xf5\x8a\xde\xd4\x88\x01\x7b\x12\xaa\x16\x3b\x56\x85\x77\xf6\x0f\x77\xf5\x0e\x0f\xdd\x1b\x59\xb9\xd9\x7a\x88\xd6\xb9\x27\xdd\x9d\xcb\xd5\xec\xdb\x7b\x14\x6b\x0c\x51\x0d\xe8\x77\x43\x01\xff\xc6\xbc\xea\xa5\x72\xa2\x50\x91\x12\x18\x03\x15\x00\xcb\x3e\x20\x92\xdb\x7b\x4a\x7b\x70\x4b\x76\x4b\x3c\xaa\xd1\x45\x04\x77\x70\x4e\x8d\x53\x08\xbd\xdf\x99\x92\x82\x29\xcd\xb5\x3d\x97\x3f\xc0\x86\x3a\xca\x28\xcf\x23\xdf\xdd\x7a\x88\x80\x9b\x1b\xf0\xfb\xba\x4b\xca\x73\x99\xba\x01\x41\x14\x22\x76\xe1\x0a\xb5\xb6\xae\xd5\xf6\x78\xa0\xae\x5b\x54\x7e\xa8\xa8\x59\x97\x94\xf6\x93\x20\x2a\xf1\xae\xe7\x24\x20\xe1\xfd\x9e\xaa\x7c\x0c\x93\xef\x49\x0c\x80\x60\x74\x8b\x5b\x97\x84\x35\xe3\x11\x37\x4a\xa4\xd2\x3b\x3b\x70\x44\x30\x16\x6e\xf7\x84\xfb\x29\xd9\x7d\xb5\xbb\x56\x21\x89\x24\x52\xb2\xa0\xd3\x4e\x48\xec\x0d\x4a\x35\x87\x25\x29\x43\x23\x80\x69\x30\x83\xe0\xfb\x00\x9e\x02\x77\xb1\xb4\x2a\xa7\x07\xb0\x04\x0c\x6b\x7a\x02\x3b\x03\x01\x0b\x19\x6f\xe8\x82\x50\x25\x4b\x91\x3a\xff\x52\x70\xf0\xbd\x6d\x3c\xf8\x4c\x0a\x30\x33\x3c\xc8\x86\x55\x5d\xc1\xf5\xce\x35\x19\x33\x43\xad\x98\x7e\x39\x7a\xf9\xe2\xb9\x9c\x54\xf0\x86\x8d\x93\xea\x2c\x9c\x54\x28\x9f\xd6\xfa\xae\x1e\xb3\xb5\xa7\xf7\x7d\xeb\x5c\x2c\x15\x24\x2b\xf7\x90\x93\xf0\xd1\x8d\xe2\x86\x45\x8d\x56\xf6\xc0\x70\xb1\xf6\x61\x54\xce\xbc\xdf\x23\x12\x71\x1f\xc8\x8a\x84\xe8\x72\xfc\x88\x72\xcb\x09\x28\xd8\x6e\xab\x3c\x5c\xfa\x0e\x11\x16\x13\x6a\x67\x87\xec\xe1\x9d\xbb\x58\xd2\xb7\xbf\x56\xd6\x72\x44\x3b\xf9\x58\x74\x40\xca\xaa\x11\xee\xe4\x63\x41\xc1\x07\x57\xf4\x48\xc1\x6f\xd9\x8c\xce\x19\x94\x32\xf2\x8c\xaa\x0c\x82\x85\x97\x38\x77\x32\x2e\x0d\x61\x62\xce\x95\x14\x90\x99\x33\xa7\x8a\xd3\x71\xc6\x88\x62\x50\x12\x6d\x6d\xd1\xdf\xef\x7d\x38\xbc\x80\x4c\x84\x7d\x57\xcb\xed\x66\x59\x6a\xc8\xfd\x6c\xcc\x24\x1a\xee\x93\xcb\xe7\xe7\x61\x69\x08\x32\xd7\xcf\xcb\x3e\x27\x2f\x4d\x89\xb0\xde\x1f\x93\xac\xd4\x7c\xbe\x2e\x49\xe2\x6a\x4c\x8f\x79\xab\x75\x6e\xd4\xbb\x56\x84\x5a\x2a\x5d\x05\xd7\x3a\x1c\x2d\x9f\xc0\x91\xdc\xd5\x01\x79\x27\x0e\x5e\x3b\xd7\x93\x2b\x42\xc7\x24\x3a\x0f\xbc\xb4\xa4\x42\x00\xe0\xc2\x7a\x9d\x50\x42\xa6\xec\xe1\x70\x15\xf5\xbc\x1c\x37\x04\xa2\xcb\x45\x75\x7c\x3a\x99\xb1\xb4\xcc\x98\x83\x12\x90\x29\x91\xd6\x7c\xa0\x15\x18\x8f\x00\x94\xf9\xd3\x49\x28\xea\x15\x43\x70\x0e\x22\xcd\xfd\xef\x95\x2f\x01\xf6\x1f\xe8\xc6\x88\x60\x94\xda\xb1\x06\x84\x6a\x5d\xe6\xb8\x25\x10\x44\x78\xc2\x8d\x0e\x8d\xbe\xbc\x76\x6c\x37\xc6\x03\xcb\xaa\x3a\xd0\xf7\x92\x65\xc0\x5c\x1d\x68\xbc\x7b\x16\x8d\x83\x84\xd6\xfe\x2f\xc7\x70\x2e\xd3\x01\xa2\x6d\x21\x9b\x53\x82\x97\x74\xc2\x01\x84\x9f\x3a\x7a\x5f\xae\xf8\x25\xaa\x0e\x78\x07\xe0\x2a\xd0\x31\xcb\x74\x73\xa0\x71\xb5\x28\x0e\x9c\xcc\x11\xbe\x63\xab\x32\xaa\x35\x9f\x0a\xe8\x7e\x64\x47\x7b\x60\x9f\xa3\xd6\x36\x53\x1f\xad\xc8\x5a\xf2\x85\x9c\x33\x35\x63\xf4\x81\x66\x5a\x23\x9a\xe5\xc6\xa8\xda\x56\x68\x57\x54\xe8\xb8\xdd\x3f\xc4\xee\x0a\x99\x40\x72\x3b\x7a\xd7\x7d\xb2\x11\x85\x85\xc5\xde\x76\x53\x3e\x67\xc2\x83\x8e\x1d\x65\x34\x34\x3e\x42\xe5\x39\x00\x9f\x95\x46\x86\x78\x85\x35\x82\x2a\xe4\x24\x08\x6f\x3a\x57\x69\x3c\x4e\x74\x8b\x6b\x9b\x94\x79\xa0\xf0\xfb\xdc\x09\x21\x03\x6c\x3b\x30\xa8\x5e\x29\xf7\x66\x55\x0d\x8d\x86\x24\x10\xd8\x0a\x8d\x05\x31\x7c\xf0\xe9\x47\xb8\x68\xb4\xe5\xa0\x55\xc3\xb8\x9d\x62\x0f\x71\x34\x49\x02\x61\x33\xab\x72\x2e\x08\x00\xdb\x9f\x4e\xea\x4f\xe2\x35\xd8\x3d\x48\x7e\x86\x9d\x57\x1d\x05\xe7\x32\xbd\x2c\x58\x32\x20\x61\x29\xe3\xae\x51\xce\xd5\x82\x09\x29\x11\x76\x1c\x1e\x22\x4a\x31\x5d\x48\x44\xff\x8b\x1f\x1b\xf7\x18\xe4\xa6\x16\x67\x47\x10\x74\xb0\xab\x2a\x68\x82\xff\x30\x25\x57\x6e\xdf\x29\x37\xa3\xeb\xbf\xc0\xde\x65\x62\x46\x45\x82\x62\xf3\xe0\x9a\x15\xfa\x40\xf3\x29\x6e\xd5\x2f\x5f\xbc\xfc\xeb\x8b\x2f\xbf\xfc\x13\x6c\x5e\x4f\x97\x51\x9e\x36\x0c\x2f\x48\x81\x1a\x22\x16\x2f\x85\x58\xd6\xf7\x41\x3a\x90\xf9\xcb\xd1\xcb\x3f\x61\xb0\x9d\x6b\x84\xfb\x98\x49\x21\x5d\x77\x5b\xac\x00\x73\x61\x6c\x64\x04\x4f\xbc\x40\x36\x97\x23\xf5\xc0\x10\xe2\x5a\x05\xc7\x93\xe9\x5c\xd8\x32\x7f\xb5\x6b\xce\x6a\xa7\x3c\xd5\x1e\x73\x53\x0b\xc5\xac\x4e\xc2\xa5\x68\x13\x1c\xae\x1b\x65\x8d\xa1\xbc\xc7\xdd\xfd\x65\xe5\xb0\x7f\x9a\x98\x5a\xd1\xac\x51\x5c\x67\xf2\x06\x12\x3a\xb8\x54\xdc\x2c\x46\x00\x8c\x23\x27\xe4\x8c\xcd\x99\x1a\xf8\x51\xdf\xd8\x9b\xce\xc3\x3d\xb1\xd6\xbf\xea\x8e\xa8\x21\xc7\xb2\x8b\x64\xe8\x90\x6b\xa7\x71\xee\xc0\x99\x14\xe7\x61\x76\x61\x18\xb7\xf3\x86\x0f\xcf\x4e\x6c\xb9\xbc\x9e\x0c\x1d\xd6\x01\x81\x57\xdd\x0b\xb8\x56\xab\x1f\xa8\xe2\xb2\xd4\x04\x1d\xd9\x00\x8c\x25\x05\x1c\xa9\x18\xfc\x0e\x24\x02\x7d\xca\xb9\xa6\xc2\x20\x21\x19\xdd\x7b\xa7\x02\x7d\x0e\xc3\x71\x73\xb4\xfa\x44\xe3\xc6\x2e\xfa\xdc\x3f\x4a\xf9\x24\x1d\xc4\xa9\x8c\x9e\x8c\x67\xd9\xca\xe3\xcb\x1f\xc8\x3a\x9e\x28\x0c\xe3\xe7\x01\x47\x83\xd5\xd2\x71\x94\x19\x9f\xfa\x54\x30\x78\x7f\x54\xb8\xa3\x4f\x03\xb3\xb5\x58\xd2\x36\x3b\xbe\x6d\x46\x62\xd1\x7c\xbf\x0e\x6c\x51\x87\x50\x8b\x51\xd8\x7c\x12\x73\xb5\x05\x77\x90\x4f\xe0\x0c\x1c\x26\x8a\x1b\x9e\xd0\x6c\x07\x8e\x30\xff\x95\x35\x98\x0d\x53\xf1\xb7\x8a\x11\x73\x23\xf1\x29\x34\x23\xd7\x6c\x71\x23\x55\xea\xd5\x0b\xff\xc4\x6a\x2d\xb4\xf1\x8f\xe4\xcc\xc9\x02\x04\xc0\x52\x39\x53\x64\xcc\xbc\xed\xdf\xb8\x79\x31\x22\x87\x62\xe1\x1c\xa7\x22\xae\x6b\xf0\x5a\xc4\x78\x81\x2a\x0e\x2a\x81\x35\x26\x71\xe7\xa1\x7f\x1a\xc5\x8a\x93\xdb\xec\x62\xab\x3f\x86\x5d\xe0\x95\x17\x6f\x18\x4b\xe5\x12\xab\x61\x77\x28\x4c\x0b\x97\xfe\xeb\xcf\x22\x2d\xac\x7a\xc6\x05\xd3\xfa\x3b\xbb\x94\x5d\xb4\xed\x3a\x77\x50\xd0\xaa\xdc\xd8\x20\x27\xab\x64\x28\x66\xb7\x14\xf5\x5d\xa3\x2d\x85\xc2\x9d\x23\x72\x08\x1f\x40\x36\x9f\x55\x1c\x21\x71\xdf\x0e\x66\xcd\xd4\x46\x5b\x35\xbc\xe3\xf0\xec\xd8\x67\x5d\xa1\xd2\xa1\xeb\x08\x89\xa8\xf1\xd7\x67\x02\x8a\xaa\xcb\xfd\x61\xbf\x94\x14\xba\xe4\xec\x5c\xa9\x92\xed\xb4\xd3\xf4\x98\xb9\x91\xea\xfa\xe0\xc5\x8b\x17\x7f\x06\x45\x0f\xa6\xf6\x3f\xbe\xfc\xf6\x7f\x7c\xf9\xed\x28\x4f\xdb\x68\x5d\x0f\x8f\xee\xb5\x8a\xeb\x35\x43\x9a\x17\x31\x3f\x78\x82\x7b\xb3\xc9\xb9\xdb\xa0\x9c\x08\x96\x29\xd0\xbc\x95\x51\xd8\x2a\x8a\xd7\x3e\x7e\x37\xac\xa6\x7b\xf5\x70\x10\xf6\x2e\xa1\xb7\xda\x73\xfb\xf0\xcf\x55\xa3\xe1\xaa\x60\x8f\xd7\xea\x39\x51\xa4\x1d\xb1\xcd\xdd\xc7\x90\xc8\x03\x82\x0b\xfc\x19\x20\x1e\x17\x45\x87\xa4\xa5\x16\xf2\x06\x72\x74\x3b\xab\x8a\xbb\x17\x38\x10\x29\x2a\xdd\x70\x29\xf7\x32\xf8\xa6\x41\xef\x70\x5a\xe1\x21\x24\xb2\x0f\xc8\x3b\xf1\x1a\x33\xfb\x06\xa8\x28\xd6\xaa\xa7\xf1\xa6\x5e\x0b\x1c\x0e\x7e\xe7\xde\x7d\x88\x53\x6e\x23\x14\x1e\x4e\xee\xc8\xf0\xed\x78\xfa\xef\x5e\x34\xc6\xaa\xb1\x5e\xcd\xb0\x77\x27\x24\xaf\xc0\xdb\x9d\xf8\x24\x53\x25\xcb\xc2\xfb\x80\xeb\x48\xec\x15\x60\x2f\xba\x2e\xb1\x4d\x90\x90\xf5\xa1\x83\xef\x06\x18\x98\x55\x00\xc8\x29\x49\xd0\xba\xf7\xa7\x2e\xe6\x6f\xa3\x03\x44\x95\xa2\xde\xe5\x2c\xf2\xa2\xee\x64\x6c\x4a\x93\xc5\x4e\xfd\x39\xab\x7c\xd6\x58\xac\xc4\x73\x04\x3b\xc4\xe7\x55\xd9\x98\x90\xb4\x09\xfa\x03\xee\x35\x50\x0d\x42\x2b\x4a\x7f\xe4\xfb\x72\x82\x19\x15\x29\x78\x79\x5a\x3b\x16\xdc\x48\x43\x98\x46\x70\x28\x80\xeb\x13\xa2\xb8\xbe\x2c\x6a\xa5\x37\xe1\xab\x56\x9e\x80\x07\xb3\x5f\xf0\x50\xf7\xaa\x79\xd6\x56\xd8\xaa\x53\x5c\x17\xc0\x0d\xe8\x0e\x09\x87\x7f\x78\xfa\x5d\xca\xd9\xea\x41\x42\xf7\xeb\x30\xc4\x67\x21\x57\x97\xb6\xfe\xab\x1b\xfa\x7b\x5c\xe8\x99\xcc\x52\xd8\x56\xce\xc7\xe4\x1f\x45\xa8\x31\x8a\x8f\x4b\xe8\xd3\x21\x52\xc0\x15\xad\xd7\x86\xb8\x7e\x00\x23\x52\x15\x07\xc4\xb6\x33\xf0\xfd\x88\x90\x4b\xe6\x9a\xb9\x46\xf3\x00\xa9\xec\x49\x09\x76\x14\xf0\x22\xb4\x0d\x43\x93\xed\x33\xf9\xa3\xda\x1f\xde\x93\xb6\xfd\x42\xeb\x3d\x34\x0e\x83\x4d\xa3\xcb\xc2\x41\x0c\xd0\x0c\xc5\xe1\x52\x77\xa1\xc6\x39\x06\x69\x53\x20\x10\x2f\x65\x1e\xe2\xac\x96\x16\x1a\x11\xf1\x80\x97\x7d\x27\x49\x23\xa1\x26\x69\xea\x1c\xb1\x37\x76\x88\x19\x2f\xd0\x02\xa7\x26\xfc\x1c\x82\x15\xf6\xeb\xb8\x36\x14\x7a\x73\xbc\x44\x13\x58\xde\x80\x0b\xfc\xbb\xd3\xe3\xb0\x47\xec\x5d\xaf\x2f\x81\x20\xe4\xcb\x91\x6b\x14\x64\xa6\x3c\x25\x63\x0c\x50\x59\xe9\xba\x27\xd8\x0d\xa6\xbc\x39\x2f\x71\xd0\xc2\xe7\x3e\x15\x0c\x47\x0b\x0f\x77\x43\xee\x93\x3f\xba\x9e\x2f\x4c\x79\x1b\x7e\xcc\x5d\x4a\xcc\xbb\x8b\x5d\xef\x9b\xbf\x19\xaa\x9b\xe1\x70\x38\xb4\x73\xf5\x32\x7d\x45\x37\x4d\xbb\xdf\x73\x99\xf2\xc9\xa2\x41\x09\xcb\xe6\xd5\x23\x80\x23\xa9\x58\xb8\xd9\xb5\x68\xf2\xd1\xcd\x8d\xd7\xa5\x6a\xd4\x31\xe7\x11\xac\x77\xdb\xd2\x8c\xba\xdc\x58\x31\xa4\x33\x8a\x35\x19\xb3\x19\x9d\x73\x09\xc5\xa4\xc0\x63\x90\xe4\x77\x0b\x5d\xbd\xcb\xc7\x2d\xba\x03\x16\x42\x93\x9c\x7d\x2c\x24\xc2\x16\x42\x12\xed\xb9\x4c\x97\x43\x29\xe0\xe5\xb6\x9b\x02\x72\x01\x6a\x4c\xef\xb4\x07\x84\xee\xf0\x44\x20\x63\x6a\x87\x0c\xd3\xd9\x6b\x2c\xf3\xfe\x88\x9c\x3a\xce\x00\xeb\x4f\x48\xc2\x26\x13\xab\xa6\x48\x41\x58\x31\x63\x39\x53\x34\xab\x3f\xc8\x15\x13\xbd\xb2\xd2\x52\x59\x26\xc3\x70\x45\x4e\x0b\x14\x96\x20\xfb\x52\xae\x7c\x97\x1b\x27\xe2\x2c\xbf\xee\xbc\x83\x5e\xb3\x6f\xb9\x06\x45\xc5\x79\x3e\x50\xad\xdc\x59\x75\x1e\xf9\xef\x42\x66\xd6\xc3\xab\x7d\x3a\xf8\x83\xbb\x74\x46\x5e\x53\x4f\xe4\x75\x77\x95\x74\xb1\x5f\x6a\xba\xa4\xb4\xae\x4f\x76\x74\xeb\x88\xbc\xed\x85\x7c\x9f\x5e\xc8\xeb\x66\xd1\xb6\xfc\xd8\x2e\x51\xaf\x43\xf3\xe3\x8d\x6c\x7b\xbc\xee\xd5\x7b\xe2\x02\xa6\x6b\xd3\xe3\x87\xb7\x3b\xbe\x4f\x9b\xb2\x47\xef\x77\xfc\x8c\xb8\xa6\x65\x95\x45\xb7\x22\x85\x0e\xdd\x8e\xd7\xda\xe7\xb8\x63\xb2\x6e\xfb\xde\xc6\x6b\xed\x6a\xdc\xf1\xad\xdb\x37\xaa\x5c\x6b\x0f\xe3\x8e\x6f\xdd\xbe\x6f\xf1\x5a\x3b\x16\x77\x78\xeb\xae\x5d\x8a\x1f\xd4\x9f\x98\x35\x9c\x27\xc1\xa1\xfc\x79\xc5\x60\x97\x42\xb3\x96\x6d\x82\x3b\x4a\xde\x5e\x5a\x03\x6f\x9b\x02\xf7\xd9\x14\x78\x33\xe4\xeb\xb6\x05\x70\xb7\x16\xc0\x5d\x24\x67\xe4\x2e\x06\xff\x4c\x57\x4d\xfa\x30\xa0\x39\x80\xf3\xb9\xd6\xe7\xb7\x42\x7c\x72\x46\x95\x6b\x21\xd6\x50\x7c\x07\xb0\x3a\x2e\xc5\x73\xe9\x70\xc1\x34\xa0\x9c\xaa\x05\xf9\xee\xf4\x18\xf5\xdf\x9a\x1a\x2e\xa4\x7f\x74\xe0\x94\xd4\x81\xfa\x50\xb1\xe8\xae\xb6\xb6\xab\x8b\x6e\x5d\x15\xdd\x15\x6f\xae\x93\x8d\xb5\xd0\x89\xc9\xba\xb2\xc4\x25\x8e\x02\x31\x22\x42\x03\x7f\x08\x9a\x33\x5d\xd0\xc4\x4a\x3f\x77\x07\xc4\x69\xa3\x9a\x87\x91\xb5\x5c\x5c\x0c\xb4\x14\x15\x98\xb2\xbf\x7f\xaf\x79\x20\xfb\x2d\xb9\xef\x0a\x80\xbc\x57\x26\xa3\xa5\x48\x66\x4f\x64\xc5\x57\x10\x2f\xf8\xc8\x29\xb9\x66\x4a\xb0\xac\x6a\xd0\xe9\xeb\x42\x58\x9b\x7a\xf5\x8e\xe5\xee\xdd\x8a\xdd\x3b\x14\xaa\xb7\xef\xb7\xd3\xb5\xc4\xbd\x4b\xe1\xf0\x8a\x26\x24\x13\x3c\x9b\xec\x94\x16\xae\x37\x55\xcb\xc1\x3b\x57\x73\x76\xea\xa0\x53\x47\x6e\x40\xbc\xd8\x8d\x78\xb7\xae\x7d\xed\x1f\xbf\xa3\xfd\x32\x74\xc5\xae\x5e\x72\xc3\x3c\xad\xd6\xf6\x6b\xf4\xef\xf4\xd5\xc8\x7e\xdb\xc2\x9e\x74\x17\x2a\x7d\xb6\xad\xdf\x94\x86\xf5\x5d\x1d\x71\xdd\x9b\xd4\x6f\xdb\xd3\x3f\x72\x7b\xfa\xd6\xe9\x55\x6a\xce\x13\x76\x98\x24\xb2\x14\x9d\xb2\xab\x8e\x99\x7d\x05\x6a\x58\x7a\x59\x1b\x13\xdd\x71\x29\x7c\x8b\xe5\xa4\x34\xe3\x14\xcb\x84\xeb\x77\x62\xa9\x49\x35\x0e\xb8\xf3\x1a\x33\x74\x2c\x83\xad\x3f\x3f\x4f\xbe\xde\xd2\xf3\xbb\xe5\xa0\x2d\xbf\xcd\xb2\x00\x68\x50\xd0\x79\xf2\x96\x92\x41\xef\x97\x89\x6b\xa8\xbe\xae\x8a\xa7\x19\xe4\xe2\x87\xcd\x14\x7d\xee\x5e\x74\x48\xf1\xa9\xad\x0a\xaa\x5b\x50\xd7\xfc\x5d\x6a\x63\x5f\xfe\x50\xbf\xfe\xaf\xe3\xb3\x6e\x19\x91\x01\x37\x1a\xb3\xbc\x67\x6e\xe8\xa0\x8a\xc4\xb5\xb5\x71\x91\x8e\x7d\xf2\x80\x28\xea\x20\x31\x5d\x1f\x83\x8c\x51\x34\xf9\xc8\x5e\x94\xaf\xba\x3f\x22\xa7\x82\x54\x91\x30\xd4\x97\x5c\xdb\x81\x9c\x51\xa1\xa3\x42\x2c\x06\x43\xfb\x6c\xaf\x30\x1f\x4c\xea\x71\xab\xed\xac\xa3\x3d\xef\xd2\xa9\xdf\x81\x6d\xc8\x49\x69\xb4\xfd\x1c\x1f\xee\x05\xe6\x3d\x1e\xaf\xd8\x94\x6b\xa3\x16\xbe\x21\xc2\x24\x9a\x84\x33\x5a\xc3\x2d\xd7\x6c\x41\xfe\xfe\xfd\xc9\x3f\xfe\xf9\xe6\xdd\xd1\xe1\x9b\x7f\xbe\x3d\x3c\xfa\xfb\xe9\xd9\xc9\x4f\x3f\x5d\xfe\xe3\xf2\xea\xe4\xed\x4f\x3f\x1d\x95\x4a\x31\x61\x5c\x51\xda\x25\x33\x3f\xfd\xe4\x38\x55\xff\xf4\xd3\x55\x52\xf0\xe2\xa7\x9f\xce\xbd\x8d\x87\x88\xa9\xff\x75\x7c\x06\xf2\x13\x6b\x23\x42\x46\x02\xa4\x1b\x21\xd1\x61\xde\x33\xaa\xab\xec\xa3\x5a\xd6\x79\x0b\x94\x9d\xb6\x01\x7b\x3d\xa3\x8a\x9d\xe3\xe1\x72\xe6\x0d\xfd\x4e\x9b\xdd\x0e\x58\x41\x9d\x7b\x07\x52\x70\x22\x90\x31\x33\x37\xcc\x15\xf3\x34\x8f\xb9\x38\xc9\xf1\x07\x6c\xd5\x81\xb9\xcc\xf6\x28\x5a\x01\xa7\x8c\x35\xce\x92\xcc\x39\xbb\xc1\xc2\x71\x6c\x39\x51\x61\x7a\x43\x71\x1f\x16\x78\x35\xa3\x01\x8c\x68\xcb\x11\x85\x4c\x03\x7e\x79\xc3\xeb\xb5\xe4\xf1\xaa\x25\x93\x23\x18\x03\x4b\xc9\xf9\xe9\x31\x79\x39\x82\xae\x43\xf6\x9f\x80\x0d\xb3\x8a\xac\x24\x71\x00\x26\xf6\x40\xc5\xd3\x77\x45\x36\x6d\xc5\x00\x6d\x84\x51\x0b\x0e\x28\xc7\xa9\xcc\xe9\x43\x3b\x15\x7c\x22\x2f\x1b\x1b\xc0\xfc\x52\xd2\x0c\x75\x80\x73\x99\x2e\x4b\xa6\x9d\xaf\xfd\x47\x7f\x1b\x7d\x1d\xe6\xf1\xb7\xd1\xd7\xd0\x5a\xc6\x93\xed\x6f\x23\x3d\x4f\x46\x5f\xbb\x32\x41\xe2\x6e\x5a\x99\x3c\xb7\x94\xf3\x0f\x7b\x8e\xba\xdf\xc0\xb3\xa9\xb1\x9c\xf7\x59\xd2\xb8\x7b\xec\xd1\xd3\x73\x67\x1e\xd4\x02\xa1\x02\x31\x51\x8c\xba\xd6\xd1\x29\xcb\x98\x89\x7a\x6d\xaf\xbd\x35\xcc\xed\xbd\x72\xbc\x27\xbf\xd6\x49\x28\xb6\xbd\x83\xbe\xf4\x9b\x6f\x38\x14\x1b\x0c\x7f\xac\x9a\x41\x7e\xfe\x7a\xe5\x07\x79\xb5\x8d\xcc\x18\xae\x4f\x97\x9d\xb2\xb2\x5e\x64\x57\xc7\xa3\xb7\x21\xc4\x3a\x6a\x32\xaf\x3c\xba\x90\xe5\x88\xab\x30\x7f\xb0\x34\xb0\x1f\x07\x86\x6e\xf0\x1b\xa8\xe2\x58\x10\x7b\x6a\x19\xcc\x01\x88\xeb\xa4\x8c\x82\xce\x21\x5f\x5f\xb3\xc5\x00\xcb\xda\x51\x09\xf9\x5b\x04\x93\x16\x0a\x03\x65\x61\x07\x94\x8a\x7c\xed\xff\xf5\xb7\x87\x5a\x6b\x1d\xdc\x4c\x5d\x9c\x4c\xf8\x52\x9d\x3d\xfb\x27\x98\x1e\x5e\xaf\x73\x47\xca\xba\xcc\x71\x23\x91\x5c\x23\x72\x02\xd5\x5f\xa8\x91\x3a\xa8\xa8\x2c\xab\xdd\xac\x7d\xdb\x97\x5a\x8d\xb4\xbc\x61\xb5\xb4\xf1\x33\x79\xe9\x2a\x8e\x00\xb7\x62\xc2\x54\xf5\x09\x08\x98\x33\x79\xf2\x91\x25\x65\xbb\x4e\x57\x9d\x5c\x23\xd7\xac\x3b\x10\xff\xf7\x2c\x60\x7a\x20\x6d\xac\x16\x1e\x92\x86\xab\xdd\x19\x65\xae\xdc\x4d\xdb\x6b\xb6\xd0\x01\x29\xe9\x1a\x47\x77\xb5\x7d\x81\x7f\xfd\x41\x76\xf2\x91\x6b\xa3\xff\x97\xef\x02\x90\x8f\xab\xfe\x0b\x14\x53\x48\xaa\xd1\xfd\x92\x08\x68\x0f\x80\x8f\xf9\xdc\x04\xf7\x2f\xd0\x99\xea\xef\x3c\x25\x22\x1c\x2c\x6a\xdf\x69\x57\xbb\xe4\x07\x29\xa0\x82\x23\x06\x54\xaa\xc2\xf6\xf8\x63\xe4\x4f\xa4\x21\xd0\xe5\xc4\x2a\x79\xf5\x63\xc6\x7d\xe4\x6e\xe2\x50\x5b\xcf\xe7\x34\x63\x68\xd7\xdf\xf0\x2c\x4d\xa8\xc2\x08\xa2\x83\xd5\xd0\x0e\x9d\xce\xd5\x93\xdb\x33\xce\x49\xb2\x6a\x95\xb5\x0b\x55\x50\x65\x78\x52\x66\x54\x11\xbb\x1f\xa7\x52\x3d\x10\x7d\x03\xaf\x6e\xdd\x28\x02\x8b\x76\x68\xd2\x56\x97\xef\xcd\x11\x9b\x68\x65\x4e\x7b\xb1\x26\x13\xa4\xbe\xd7\x37\xca\x5e\x1d\xdd\x4e\x4e\xbc\x6c\x0a\x82\x22\xc6\xbb\x32\x35\x24\x1b\x3e\x05\x0c\xa9\xfd\xe8\xf0\x08\x3b\x73\x44\xbe\x0d\x55\x90\x83\x00\x3f\xe8\x10\x85\xdd\x33\xdd\xb6\x71\xcb\x55\x6d\xea\x89\x54\xd0\x5a\x64\x2f\x95\xf0\x1b\x36\xe7\x89\xd9\x1f\x91\xff\xd7\x6a\x8a\x96\x75\x82\x3a\xe9\xb6\x59\xa8\x2f\xab\x50\xb7\x5e\x90\x3d\xf8\x59\xac\x4a\xee\x7b\x3f\xba\x03\x53\x7f\x62\xc1\xfa\x0e\x11\xbc\x15\xd1\xbb\x9a\x18\x45\x4d\xb1\xc1\x1a\xe1\xe4\x97\x41\x42\x06\x99\xc8\xb5\xdb\xa5\x35\xcf\x6d\x48\x77\xf1\x22\x34\x30\xce\xbf\x2d\x7f\x51\xa2\xd8\x14\xf6\x1f\xee\x9e\xcf\xb8\xfb\x8c\x2c\x64\x26\xa7\x8b\xcb\x42\x31\x9a\x1e\x49\xa1\x8d\x02\xd1\xd0\x05\xe5\xe8\xb6\x31\x23\x34\xfb\x99\xbc\x21\xd4\x95\x69\xca\x09\x42\x4e\xc9\x72\x3a\x43\xfc\x4e\xf8\xa1\xef\xfc\xe4\xa7\xe8\x8c\x4e\x3d\x22\x97\x01\x9f\x13\x18\x3c\xc0\x7d\xc2\x28\xe0\xf0\xb8\xa1\x0b\xb7\x99\xe8\x18\x3a\x77\x56\xf9\x12\x7e\x32\x23\x72\x68\xe5\xe0\xad\x73\xb5\x52\xf9\xf0\xec\xf8\xa1\xa0\xa8\x6b\x54\x68\x6f\x79\x95\xa8\x8f\x37\x74\x85\x0a\xf4\x0d\x1a\x29\xd0\x8d\xe6\xd2\x69\xaa\x08\xc8\xe8\x29\xf3\x19\x75\xd3\x2e\x10\x24\x39\xfd\x78\x79\xcd\x6e\x5a\xfc\xd2\xbf\xe8\xf7\xec\xe1\xa9\x2e\x43\xb0\x47\xdf\x0b\x4d\x0d\xd7\x13\x40\x4f\xfe\x8c\xfa\x38\x64\x24\xb7\x03\x79\xc5\xab\x9e\xd8\x1f\x8f\xe6\xab\x25\x03\xea\x58\x8d\x59\x5c\x7a\x52\x65\x07\xe1\x01\x88\x19\xd2\x01\x1f\xd6\xee\xa0\xc4\x61\xa6\x1b\x59\xc1\xf2\x63\xa4\x22\xb4\x4f\xf5\xbb\xd6\xcc\x18\x57\x0d\x7c\xc9\xc6\xde\x6f\x2f\x18\x5b\x67\xfa\x74\x4d\x9b\x01\xf2\x9c\x7c\xb4\x9a\x87\x6e\x97\x88\x81\x57\xbd\xe5\x41\x63\x50\x0c\x8f\xf9\xfc\xb2\xc6\x32\xd4\xa0\x87\xc1\xec\x8d\x3f\x69\x2b\xe7\xaa\xab\x5b\xd3\x14\xd2\xad\x71\x0a\x59\x91\x86\x79\xeb\xeb\x37\xf0\x8b\xe3\x62\x1e\xe7\x14\xd2\x03\x54\xe0\xd1\x81\x4d\x45\x75\xb0\xbb\x5e\x96\x59\xd0\xe6\xac\x51\x64\x6f\xc2\xdf\x75\x45\x27\xef\xd0\x78\x85\xf4\xd0\x7c\x85\x80\x2c\xbb\x6e\x21\x01\xe3\xdf\x7b\x62\xb5\x1e\xa4\x7b\x1b\x16\xd2\xde\xa0\xae\xae\x1a\x43\x5d\x57\xa6\x35\x72\x56\xcd\xb4\xae\x84\x5d\x65\x58\x77\x7a\x76\x4f\x3d\xf2\xbb\xd8\xb8\xd5\x55\x23\x84\x7c\x80\xb5\x4b\x21\xc0\x24\x27\x7e\x77\xac\xb4\x79\x4f\xc5\x80\x9c\x49\x63\xff\x13\x99\xbf\xc7\x92\xe9\x33\x69\xe0\x93\x8d\x20\x25\xbe\x42\x8f\x84\x74\xc6\x99\x6b\xd1\x6e\xe5\xa6\x0b\xd1\xda\x13\xcf\x13\x6c\x85\x61\x71\x2a\x88\x54\x9e\x62\xc1\xba\xd0\x6e\x88\x38\xac\xe0\xb0\x63\x6e\x35\x4e\xec\x38\x31\x9d\xef\x18\xce\x0d\x05\x28\x12\xf8\x0d\x40\x08\x16\x19\xe4\x2f\xa7\xa5\x42\x24\x47\xab\x6b\x1a\x36\xe5\x09\xc9\x99\x9a\x42\x2f\xb7\x36\x69\xc7\xf1\xd5\xfd\x5c\xc1\xab\xe3\xe9\x12\x4f\xa6\x03\x2f\xc1\x91\x0d\x2a\x56\x8f\x2a\x00\x8e\x87\xc7\x5a\x4e\xc1\x92\xfa\x3f\xc1\x07\xfd\x7f\x49\x41\xb9\x02\xe4\x47\x17\x3b\x8e\xbf\x73\xd1\x97\x78\x18\x3b\xc2\x92\x6f\x89\x0a\xc2\xb0\x4e\xc2\x8e\xde\x54\x3c\x06\xe4\x66\x26\x35\x1e\x86\xc1\xfd\xb1\x73\xcd\x16\x3b\x83\x25\xd6\xdb\x39\x15\x3b\x55\x60\xb8\xc6\x6c\xe1\x10\x86\x72\x9f\x1d\xf8\x6e\xe7\xf1\x74\x95\x4e\x87\x6d\x1f\x10\xdc\xcd\x09\xb5\xe4\x2b\x67\xf3\x74\x6f\x4f\xfd\x16\x07\x8a\xec\x73\x8c\x09\x4e\x15\x8b\x5a\x53\x83\xa2\x9e\x63\x9c\xb3\x14\x6c\xce\xec\x62\xa5\x5c\x3b\x9c\x2b\x9f\x62\xf0\xaf\x25\x93\xe8\xff\x7f\x2c\xcf\xa4\xf1\x56\xfb\xbf\xbc\xdb\x0b\xf9\xef\x23\xcf\xcb\x1c\x01\x65\x8c\xb5\x14\x52\x3e\xf1\x70\x98\x3e\xb3\xa1\x6e\x2f\xd4\xcd\x56\xc7\xc7\x86\xaa\x29\x80\x34\x39\x7b\xc1\xb3\xd9\x34\x93\x63\x9a\x91\x9c\x0b\xfb\x98\x11\x79\x2d\x15\x61\x1f\x69\x5e\x64\x0c\xab\x6d\xc8\x1f\x87\xff\x91\x82\x11\x17\x0d\x1f\x10\x4f\x8b\xaa\xd1\xfb\x4b\xe4\xda\x0a\x16\x3b\xa4\x3a\xd4\x0c\xb0\xe0\xb6\xd0\xe4\xe5\xc1\xcb\x83\x17\xaf\xc8\xaf\xc4\x0e\xfd\xd2\xfd\xf7\x4b\xf7\xdf\x3f\x92\x5f\xc9\xaf\x84\x90\x73\x42\x6a\xff\x25\xf0\xdf\x21\xe1\x93\x78\x0e\x2f\xed\x34\x13\x99\xbb\x17\x06\x4f\x6e\x28\x8a\x0b\x2d\x31\x8c\x74\x43\x43\x4d\x44\x22\x73\x06\x73\x78\xf9\xbf\xfc\x3d\x10\x70\x35\xd8\xb5\x04\x26\xb5\x07\x53\xda\x27\x37\xe0\x9a\xca\xe9\x35\x9a\x65\x87\x89\x29\x69\x66\x1f\xbe\xf7\xe5\xf0\xc5\x3e\x91\xa2\x7e\xfb\x9c\x4b\xe8\xf6\xec\x66\xb8\xf7\x72\x7f\xb4\x34\xe5\x2f\x57\x4c\xb9\xd1\xc0\xc3\x95\x24\xd9\x41\x6f\xe7\x1a\xcf\x30\x87\x62\x71\x43\x17\x81\x6d\xbc\x59\x3a\xe5\xf3\x80\x1c\x1d\x95\xe9\x43\xcc\x0e\xb8\x80\x7b\xe0\x14\x1c\x74\x41\xb8\x19\x91\x53\xb3\xbb\xeb\xdb\xc5\x58\x8d\xd9\x43\x5c\x1f\xc7\x68\x6a\x40\x78\x58\xf4\x17\xde\x3f\xeb\x62\x4a\x1d\x7a\x85\xf7\xe2\x1c\x7d\x10\x46\xb5\x7b\x7a\xe5\xdf\xe8\xc1\xa9\x1e\xc6\xf2\x3b\xd8\x8a\x7e\x39\xc1\x32\x42\x6c\xde\x32\x82\xce\x3c\x8e\xf6\x2e\x61\x04\x55\x67\xb7\x7b\xb8\x0e\xd6\x13\x87\xf4\xe4\x84\x66\x71\xb0\x2e\x91\x80\x5f\xa5\x42\x43\xfa\x38\xbd\x28\xf8\xa5\xc8\x0f\xd5\x9d\x98\x56\x04\xf1\x57\x1c\xe8\x6f\x08\x8b\xb3\x33\x2e\x93\x6b\x66\xfc\xb9\xa3\x20\x23\xa2\x28\x0d\x19\xd3\x8c\x0a\xab\xc1\x2c\xf9\x21\x8c\xc4\xc1\xf0\x97\xc0\x30\x2b\xf8\xe5\x73\xc7\x47\x96\x76\x47\x77\xa1\xff\x43\x73\xc8\x28\x22\xeb\x1c\x85\x29\xa3\x99\x4f\xa5\x00\xf4\xe8\x80\xe7\x23\x76\x77\xab\x7d\x05\x6b\x83\xc2\xaf\x72\xb0\x5a\xb9\x50\x93\xfb\x64\xcf\xe7\x3e\x12\xc3\xb2\x0c\xb9\xa7\x6a\xb5\x64\x37\x59\xdc\xbb\x89\xc3\x08\x75\x19\xb0\xf2\x87\xf5\x86\x4f\x18\xd4\xb7\x92\x5d\x2c\x42\x31\xf1\x80\x10\xe8\x76\x36\xe5\x73\x2b\x94\xee\x25\x34\x50\x30\xce\x58\x56\x10\xc5\xd2\x32\xc1\xc1\x09\xd1\xd7\xec\xc6\xea\x54\xd5\x9b\xba\x7e\x2b\x9e\x65\x77\x6a\x44\xdd\x41\x04\x5d\x51\x17\x89\x7c\x02\x0c\xe9\x9b\x08\xb2\x39\x53\x0b\x52\x48\xad\xb9\x5d\x07\xd8\x4b\x90\x0d\x07\x7a\x57\x00\x1e\x81\x4c\x2c\x98\x96\x17\xc3\x3b\x4e\xec\xee\x58\x41\xad\x65\x6d\x7b\x7c\x9e\xa3\xee\x8f\xf6\x98\xb9\xfb\xa8\x3b\x87\xff\x2d\x1f\x79\xa7\x13\xb2\x82\x07\xc3\x5c\x6a\xcc\xf3\x90\x53\xf0\x4b\x38\xac\xfe\xb8\x1f\x1d\x86\x7f\x3c\xf8\xf2\xe0\xe5\x9e\x9d\xeb\x97\xfb\x76\xd6\xb5\x63\xee\x65\x38\xe6\xc2\x2f\xdd\x8c\x98\xae\x1d\x74\xd6\x00\xc3\x9e\xa0\x52\xa5\x2e\xc2\xe3\xb3\xe8\xec\x8c\xb4\x71\xf1\x36\x9e\x7b\xf9\x32\x00\xbe\xab\x98\xf5\x46\xc2\xce\x81\xf3\x96\x1b\xf2\x87\x5c\x2a\xf6\x87\xe8\xfe\x5b\x0f\xa8\xf6\xe7\x4e\x0b\x89\x53\xeb\x62\x92\x71\x6d\x86\x39\x2d\x86\xd7\x6c\xf1\x60\x4d\xb7\x8b\x7b\xbd\xab\x73\x7d\xf9\x2d\x90\x20\x39\x2d\x1e\x30\x8e\x6b\x45\xdd\x25\x85\xf7\x8d\x73\xcc\x86\xae\xd6\xe0\x78\x44\xad\xc8\xb5\x6a\x84\xc6\x08\x55\x3e\xed\x98\x65\x12\x61\x20\x5d\xea\xc0\x03\x52\xf5\x03\x68\xb6\x36\x52\xd1\x29\x3b\x70\x8f\x7d\x2a\x60\xf9\xae\xb1\x75\xcd\xcb\x84\xd5\x5e\x0e\x43\xd2\xa7\x34\xfb\xf8\x03\x48\x01\x9a\x40\x36\x20\x10\xb2\x56\xed\x1e\xe5\x19\x3e\x91\x50\x56\x8b\xe2\xe0\x2e\x8e\x53\x7a\xa3\x4f\x32\xaa\x0d\x4f\xbe\xcd\x64\x72\x7d\x69\xa4\xea\x41\xbb\x38\xfc\xe1\x72\x69\xd4\xda\x9a\x0a\x72\xf8\xc3\x25\x39\xe6\xfa\xba\xc2\x1e\x47\xd0\xc1\x7a\x02\x1e\x0d\xb8\x21\xae\x16\x83\xe4\xd4\xda\x7f\xcc\xdb\x78\x22\xc0\x9e\xf6\xb7\x57\x7e\x47\x6f\x34\xc3\xe9\x8f\xed\xf4\xed\xd7\xac\xbd\x08\x5e\x5b\x9d\x39\xbe\xce\xe9\xf1\x1a\x02\x5f\x13\xdd\xb6\x29\x03\x59\x62\xa6\xd7\xa1\xd1\x3f\x22\xc0\xd4\x21\x70\x81\x6b\x16\xb2\x24\x37\x14\x7d\x56\x20\x53\x47\xe4\x8a\x17\xaf\xc8\x49\x04\x67\x89\x05\x09\xf5\xa1\xac\xbe\x11\xe0\x15\x5c\x96\x00\x70\x19\xba\xae\xac\x08\x76\x59\x31\xe4\x04\x95\x29\xfd\x8a\xec\xb0\x8f\xe6\xab\x9d\x01\xd9\xf9\x38\xd1\xf6\x3f\xc2\x4c\x00\x7c\xd6\x21\xd8\x5b\xa5\x4e\x4c\x98\xaa\x0c\x18\xfc\xc1\x72\xe9\x60\xff\x4c\x4a\xae\xde\x1d\xbf\x7b\x05\x0a\x7c\x2a\xc9\x0d\xf3\x3d\x9e\x08\x53\x4a\x56\x95\x1a\x11\x19\xa0\xa2\x23\x91\x79\xa1\x64\xce\xa3\x74\x55\xd8\x64\x6d\x78\x9e\xf4\xe1\x2f\x85\xa4\xb4\x2e\x5d\xe2\xeb\x1c\x04\xd9\xbe\x7e\xc8\x06\x6e\xf6\x6d\xfc\x73\x3a\x21\x12\x9d\x52\xf5\x1c\x79\xae\xc3\x4d\x96\x63\xdc\x28\xd8\xac\xa8\xe2\x11\xab\x7e\xbb\xaf\x0e\x52\x36\x3f\xd0\x29\x7d\x39\x80\xc7\x20\x03\x38\x6c\xf0\x30\x27\xaa\xc9\xce\xcb\x9d\x11\xb9\xf4\xad\x9a\x07\xf1\x1c\xab\xfb\xac\x35\xe0\x07\x04\xb7\xea\x8b\x1d\xb2\x87\x49\xea\xa0\x53\x64\xcc\x37\x8b\x0c\x10\x04\xe0\xc3\xdf\x6f\xa5\x42\x92\x1e\xdc\x17\xa4\xb3\x0b\x83\xf4\xd0\xcc\xbd\x51\x55\xe5\xd6\x60\xc7\x40\x6f\x22\x23\xa1\x82\x80\xb9\x66\x99\x28\x2a\x2e\xdc\x13\x2b\x42\x72\xe1\xb4\x13\x68\x05\x8f\x8d\xad\x61\x80\x3b\x99\x65\x07\xaa\x8f\x76\x36\xe6\x4c\x22\xbd\x34\x8e\xf7\x47\x4b\x3f\xeb\xf1\x5e\xf0\x5f\x4a\x46\x4e\x8f\x43\x47\x3b\xa6\x34\xd7\xc6\x4a\xae\xb4\xa6\x23\x70\x54\x1c\xf6\x0e\x73\xfa\x1f\x29\xc8\xc9\xb7\x97\x6e\x2a\xfb\x1b\x48\xe0\x96\x02\x90\xfe\xa7\x54\xcc\xaa\x46\x9d\xf5\xb0\x43\x3f\x52\x53\xf7\xb2\x9f\x93\x63\x6a\x28\xaa\x60\x28\xcd\x64\x55\x61\x0a\x3b\x61\x0c\x99\x3f\xbe\x7c\xb8\xa5\x16\x4d\xd6\xaf\x06\x59\x0e\x3a\x6b\x0f\xb9\x63\x7f\xfe\xfe\xe2\x74\x0d\x4a\x54\x02\xa7\xf0\xf4\xad\x4c\x7b\xd2\xa4\xfe\x6e\x97\xf6\x08\x47\x25\xb9\x1d\x96\x9c\x49\xc1\x06\x20\xec\x88\x95\x76\xee\x9f\x3f\x28\x6e\x1e\x5a\x31\x59\x5d\x9d\x8f\x7f\xbf\x62\xbd\xbc\xb5\x3d\xfc\xcf\xa2\xca\x78\x80\x71\x00\xa9\xe2\x14\x81\x71\x26\xc7\xc4\x49\x83\x75\xbe\xf1\xfb\x8b\xd3\xde\x5e\xf8\xfd\xc5\xe9\xe6\xbe\x6c\x8f\xc6\x41\xd3\x36\xa8\xf4\xb7\x0a\x9a\xb2\xa9\xf4\xdf\x5f\xe3\x1f\xf5\xa5\xeb\xaf\x8b\xd2\xd7\x5c\xb4\xce\x0a\xab\x8b\x8e\x13\x5f\x1f\xe9\x22\x35\x50\x92\x9d\xbe\x22\x79\x99\x19\x28\x7f\x03\xc6\xb2\x9c\xa6\xed\xe9\xed\x59\x8c\x38\x28\x08\x42\x8e\x19\x86\x17\xd2\x57\x3e\x21\x21\xfc\x62\xf5\x0f\xde\x52\x41\xa7\xf6\x76\x38\x0f\x49\x8e\x7f\x46\x1c\xbd\x87\x0e\x74\x11\xbe\xa2\x73\xca\x33\x3a\xe6\x19\x37\xd0\x1b\x7d\x7f\xe4\x15\x31\x8d\xb5\xb0\x76\xca\x6b\x13\x6a\xbd\xaa\xb0\x71\x7d\x10\x28\x98\x64\xcf\x8e\x7f\x70\x63\x05\xf7\xfe\xa8\xd2\x5e\x01\xac\x09\x12\xe5\x51\xc5\xad\xa9\xb6\x1e\xe5\xa1\xa1\xd9\x76\x63\xd7\xb6\x6a\x25\x2c\xf3\xeb\x96\x08\xb9\xcb\x6a\x8f\x1d\x69\xa5\xda\x03\x5f\x38\xd0\x89\x67\xae\xf9\x60\x83\x9d\x0e\xba\x0f\x6c\x99\x96\xbf\xef\xaa\xfd\x6c\xf7\xcb\xa7\xaf\x6a\x81\x7b\xa1\x52\x0c\x22\x84\x43\x37\xd2\xa4\x71\x07\x5d\x3a\x51\xed\xc1\x85\x40\xbb\xb2\xfb\xa6\x4d\x11\x05\x5e\x9d\xa5\x6b\xe0\xd4\x5e\x08\x81\xb0\x2b\xad\x37\x4e\xc7\xf7\x49\x58\x31\x9b\x74\xaf\x81\x3c\x62\xc5\xec\xf5\x65\x3d\x94\x62\x3f\x23\xaf\x2f\x57\xc8\x3d\xcc\x95\xb1\xef\xad\x31\xc0\xb2\xab\x49\xc6\x27\xcc\xf0\x56\x44\x58\xb3\xe4\xcb\xa5\xe0\x46\x2a\xbd\x8e\x9a\x0f\xf7\xe8\x7e\xf4\xae\x0b\x4f\x08\xf2\xd6\x8d\x8b\x09\x9f\x89\xcc\x32\x96\x18\xd7\x12\x0e\x96\xd5\x3f\x78\x95\x23\xc4\xa5\x02\x68\xdf\x01\xd5\x39\x3d\x0e\x90\xd5\x0e\x2e\x4e\x0e\x8f\xdf\x9e\x8c\xf2\xf4\x77\x33\x79\x33\x34\x72\x58\x6a\x36\xe4\xa6\x9b\xae\xb4\xc6\xa2\x90\x1e\x1c\xd0\x66\xd6\xcf\x02\x56\x88\x44\xef\x75\x85\x19\xe6\x03\xbf\x4a\x4a\xb3\x8c\x1a\x36\x29\xb3\x0c\xd7\xd4\x28\xc6\x06\xb1\x3b\xf1\x81\x98\x6a\xd5\xb5\x59\xfa\xeb\xee\xea\xb6\xa7\xfd\x1f\xcd\x9b\xb2\x19\xba\x9f\xf2\x6d\x55\x63\x72\x07\xed\x2f\xc3\xc8\x3e\xa1\xcf\x32\xbe\x5d\x89\x6b\xb6\x20\x90\xdd\x3f\x91\x0a\x90\x36\xeb\x5c\xc8\x4c\x02\xe4\x3a\x80\x8e\x73\x4e\x57\xd8\x10\x52\x77\xd1\x22\xe0\x45\x2e\xd8\xe4\x71\x08\x7d\xc1\x26\x58\x40\x11\xb5\xfc\xb7\x44\xa7\xa5\x99\x61\x26\x24\x22\x1f\x21\x39\x57\x52\xde\x55\x64\x6c\x08\xa9\x3b\xe5\xd2\xf7\x51\xef\xd5\x05\x97\x9c\x2c\xad\x57\xec\x26\x74\x8b\x64\x1e\x1c\x57\x90\x73\x6b\x5b\xb2\x1b\x68\x5b\xcf\xc5\x74\x78\xc3\xcd\x6c\x88\x94\xd2\x07\x80\xc3\x76\xf0\x3b\xf8\x8f\x8b\xd6\x1e\xa6\xa9\xcb\x2c\x2b\x35\x9b\x94\x19\xe6\x7c\xe9\x11\xa1\x05\xff\xc0\x94\x86\x14\xc6\x6b\x2e\xd2\x01\x29\x79\xfa\x4d\xdb\x15\x23\x7d\x6c\x90\xf6\x4d\x96\xee\x3c\x17\x95\x17\x3f\x8a\xa6\x52\x23\x0a\xaf\x25\x51\x8d\xf5\x69\x9a\x73\xb1\x29\x9c\xdf\x56\xb5\xe7\x22\x6d\x47\xc1\x3a\xf5\x8e\x60\x9c\xba\x6e\x8f\x63\xfb\x98\x71\xc8\xa2\xa1\xde\x97\x81\x4d\x7c\x5c\x3e\x4d\x3d\x9b\xe6\x5e\x02\x25\x5f\xe8\x5f\xb2\x21\x3e\x65\x58\xa4\x15\x5d\xb7\xa9\x31\x0f\xb9\x1e\x33\x35\xa6\x5f\xf7\xf7\x67\x48\x78\x79\x54\x1e\x23\x5b\xb5\x77\x0d\xb4\xee\xae\xe9\x3e\x82\xfe\x05\x38\xf0\xda\x17\x27\x83\x7a\x85\xb2\xc7\xfb\xb6\xb0\x71\x59\x00\x1e\xf6\x65\x46\x89\x14\xc2\x61\xd2\xbd\x2b\x98\xb8\x34\x34\xb9\xee\x18\x17\xdd\xea\x4c\xbf\x31\x9d\xa9\xdf\x5c\x19\x9f\x06\x9d\x06\x1e\xc5\x2a\x2a\x97\x52\x56\x65\x49\xe3\xc6\x7e\x82\x52\x17\x11\xd6\xdf\xd2\x16\x4d\xf3\x9b\x1e\x50\x3f\x52\x43\x51\x0a\x1f\x3b\xa7\x27\x54\xd5\x14\xb2\x28\x33\x84\x5c\xe3\xda\xd1\xf1\xf3\x2b\x36\x5d\x37\xb8\xd3\x97\xfb\xcb\x19\xa9\x64\x68\x2e\x53\x46\xc6\xdc\x54\xd2\x51\x33\x83\xb5\xbb\x0e\x88\x46\x0a\x92\x38\xb0\x39\xd0\x3a\xac\x86\xe1\x26\x14\x69\x24\x82\xc8\xc4\xf8\x9a\xbf\x50\xe6\xfb\xe2\xc5\x8b\x17\x58\x74\xf9\xe7\x3f\xff\x99\x48\x05\x1d\x1f\x12\x9e\x2f\xdf\x08\x77\xfd\xcf\x97\x2f\x47\xe4\x1f\x87\x6f\xdf\x40\xee\x7f\x61\x34\xe2\x80\xe3\xc8\xf6\x86\xda\x8f\xf5\x80\xfc\xef\xcb\x77\x67\x5e\x6d\xd4\x8d\x6f\xc1\xd4\x0e\xaf\x57\x47\x5f\x7c\xf1\xa7\xaf\xbe\x1a\x91\x63\xae\xa0\xf6\x89\xb3\xd0\xb9\x28\x78\x4b\xa8\x62\x58\x24\x0a\x10\x81\x5e\xaf\xe2\x01\x44\xdf\xe1\x27\x60\x6b\x36\xac\x67\xb4\x1c\x98\xf1\xc4\x60\x99\x15\x0a\xb2\xd0\x74\x15\x80\x1b\x1d\x14\xaa\x4b\xd6\x85\xc9\x0d\x48\xc6\xaf\x19\x99\x68\xe8\x58\x58\x15\xd3\x2b\xa6\xad\x85\xe4\x4a\x4a\x70\xb0\x6a\xad\x34\x33\x4f\x3c\xf7\xb3\x93\x2f\xb8\x09\x60\x5c\xeb\x47\x05\xa5\x9e\xd7\x6c\x31\x44\x0e\x2b\x28\x0f\x05\x23\x90\x1c\x57\xeb\xb1\x10\xbc\x36\x69\x24\x57\x3c\xc6\x62\xa1\xe4\xbf\x71\xf1\xa1\x86\x34\x92\xc4\x50\x89\x8a\x1d\x3c\x01\x2c\x41\x44\x0d\x3b\x7c\x1d\xac\xeb\x79\xe4\x3f\x76\x48\xa1\xcb\x70\xcb\x19\xd7\xf6\x11\xd7\x6c\xa1\xef\x7a\x72\xd5\x2b\xc6\xf2\xa7\x46\x4e\x29\xc5\xd2\xaf\x1d\xf2\xbe\x93\x8c\xae\xc9\x82\x43\xbc\xa9\xc6\xc0\xf2\x7f\x57\x08\xed\xee\xf5\x54\x0a\x84\xa8\xa5\x2b\x6b\x66\x4a\x47\x1a\xc8\x3b\xb7\xcf\x86\x06\x00\xf0\x86\x39\x55\xd7\xcc\x37\x2e\xa5\xd9\x88\x9c\xdb\x49\x06\xc8\x91\xd0\x37\x16\xec\x56\xba\x80\xc7\x3a\x25\x0d\x1e\xb2\x3b\x1a\xed\xe2\xc6\x93\x8a\x68\x43\x95\xdb\x45\xf6\xf3\xe7\x81\x62\xf5\x96\x16\x1a\x51\x55\xac\x56\x0a\x88\x43\x12\x90\x5a\xcd\xac\x6a\x9b\x86\xb4\xde\x22\x4f\x91\x21\x10\xa6\xf5\x00\x9b\x88\x3a\x75\xe5\x64\x83\x91\x7e\x7b\x6f\x04\x16\x52\xde\x41\xa9\xc0\xab\x93\x6a\xe1\x60\x76\x33\xf6\xa4\x74\x89\xd5\x6d\x35\x9c\xa4\x8c\xb4\xb5\x46\xaf\xc3\xa7\xaa\x32\xe0\xd5\x87\xe2\x80\x57\x77\xf5\x01\xaf\x2e\x01\x5d\xbc\x96\x76\x68\x38\xa9\xf0\x30\x9a\x54\xa4\x07\xd0\xf3\x22\x1c\xf1\x46\x62\x87\x10\xdf\xe9\x46\x10\x3a\xd6\x32\x2b\x0d\xfe\xb4\xfa\x32\x3e\xe6\x60\x50\x0f\xbe\x04\x67\x5b\xb8\x2d\x3a\xf4\xe0\xb8\xc7\x73\xa2\xcb\xf9\x87\x57\x67\x31\xd1\x5b\x97\xd8\xe7\xed\x55\xe8\x4c\x67\xaf\x3b\xf5\x93\xeb\xe4\x8a\xa1\x6e\x66\xcc\x65\x21\x44\x7a\x9d\x15\x9e\x56\x24\x80\xd2\xe8\x55\x34\xd7\x4d\x7e\x2d\x5e\xc2\x44\xf3\xee\x6e\x81\xcb\x53\xb2\x77\x14\x4a\xc4\x7d\x3a\xdb\xa9\x30\x4c\x4d\x68\xc2\xf6\x63\x77\x01\x2b\x66\x2c\x67\x8a\x66\x21\x43\xd9\xd7\x29\xcf\xa8\x48\x33\x57\xbc\xcf\x14\x6c\x5c\xf6\xd1\x30\x25\x68\x06\x8f\x48\x15\x9f\x33\xa5\xc9\xde\xb7\xcc\xda\x12\x8c\x9a\x52\xb1\xfd\x27\x98\x46\x8a\x2f\xb2\x0e\x67\x06\x3c\xb8\x9f\x04\x50\x18\x6a\x55\xa7\xc4\x6a\xa9\x3c\x66\x91\x5d\x56\x1d\xbb\x81\x46\x76\x43\xc0\x89\x09\x42\x17\x3a\x02\x61\x34\xd2\x37\xc0\x03\xe0\xe2\xc4\xe0\xc0\x54\xbb\x86\x78\x80\x08\xe3\xe4\xb9\x83\x0a\x59\x5b\x29\xc0\x67\x29\xba\xb8\xab\x64\x62\xe2\x0c\x48\x39\xe7\xa9\x57\x83\x20\x9b\xa1\x42\xdd\x2a\xa8\x8e\x2a\xf9\xa9\xd6\xd2\xf5\xfb\x8c\xd6\x08\xcd\x51\x50\x96\xea\x98\xd2\x3e\x52\x1c\xc7\xbb\x24\x20\xb3\xb6\x6a\x68\x41\x7a\x39\x10\x65\xca\xce\xcb\x71\xc6\xf5\xec\xb2\xd7\xd0\xc6\xd9\x8a\x81\x31\x31\x70\x29\xb9\xe4\xd6\x70\x87\x66\x42\x73\xd7\x7f\x0c\xd5\x2c\x6e\xb5\x6c\x09\xcb\xe0\x7f\x1d\xef\x0e\x09\x85\xe2\xd0\xd5\xcc\x7f\x15\xcd\xc3\x21\x77\x60\x3b\x9d\x94\xbd\x17\x45\xed\xf3\x84\x66\x99\x76\x7a\x6d\x00\x8b\xf4\x07\x19\x6a\xa6\x1e\xcd\x03\xb9\x82\x5b\x86\xf1\xb3\x87\xac\x19\x94\x62\x01\xd9\x74\xe5\x8b\x69\x92\x4b\xac\xf8\x17\x44\x0a\x7f\x13\x74\x05\xf2\x3f\x08\x14\x42\xbc\x31\x64\xba\x35\x62\x4a\x6e\x63\x3a\x4f\x2f\xa6\xd3\x6b\x54\xf8\x32\xb4\x68\xa0\x30\xf0\x10\x0a\x9b\x7c\xa3\x59\x1a\x0a\xff\x2b\xc3\x71\xf4\xa9\xf0\xf1\xda\x22\xb8\x38\xbf\x43\xe3\x60\x41\xfb\xf1\xdb\x7e\x68\x0c\x0a\xaa\x98\xb5\xbc\x41\x30\x0d\x9d\x6d\x9d\x44\x3b\xc9\x99\xc4\x61\x7b\x2f\x8b\xb3\xea\x4c\x87\xe3\x1c\x3f\xdc\xd5\x24\x95\x49\x69\x6d\xae\x8a\xec\x55\xc2\x44\x37\xb4\xf7\xe7\x05\x3f\x9b\xca\x1b\x71\x43\x55\x7a\x78\xde\xaa\x6a\xb5\xae\x9c\x55\x63\xc5\xaa\xb7\x7f\x04\xb1\x9f\xd3\xb1\x2c\x4d\x80\xf8\xdb\x06\xee\x56\x0e\xf1\x29\xef\x9a\x6b\x03\x7e\xbf\x38\x1d\xd9\x86\xfe\xb6\xa1\xbf\x67\x13\xfa\xb3\x23\xd5\x3b\xa5\xd4\xc4\x8b\x73\xc8\x5a\x8a\x3f\x8b\x18\x52\x24\x52\xf1\xf4\x6c\xd6\xc3\x36\x74\x7e\xdc\xbc\x15\xd7\x45\x76\x82\x97\xb9\xa0\x8e\x3d\x87\x78\xd3\x06\xc4\x8b\x80\x96\x1d\x8c\x41\xbc\x6e\x2b\x15\x43\xa4\x56\x0c\x3c\x47\x11\xec\x42\xa6\xaf\x10\x38\x15\x3a\xa7\x63\xcf\x8e\x81\xc3\x6d\x1e\x38\xdf\x85\x88\x7a\x85\x63\x6b\x66\xaf\xfe\xf4\x12\x13\xe8\xc8\x00\xa4\x27\x26\x20\xc0\x08\x40\x9d\xf3\x2e\xdc\x40\x7a\xe3\x08\x7b\x55\x86\x4e\xd7\x91\x9a\x0a\x34\x8e\xea\x19\x41\x27\x33\x96\x63\xff\xf0\xd7\x9e\x04\x56\x36\x5a\xe3\xc1\x30\x44\x48\x63\x2a\xd7\x44\x4e\x06\x35\x08\x85\x9d\xf9\xcb\x9d\x6e\x31\x06\xd2\x5f\x38\x92\xf8\x7d\x74\xde\x39\xb6\x43\x9a\x04\x3b\xaf\x85\x74\xec\x1e\x02\x9d\x27\xc3\xd6\xc5\x8d\x2c\x0b\x38\x3f\x90\xc2\x1b\x43\x9c\x4d\x89\xd5\x0e\x42\xd4\xe0\x09\x28\x7f\xdb\x58\xed\x73\x8c\xd5\x46\x07\xa3\x17\x74\x8e\xb0\x71\xfc\x36\x0e\x09\xf8\x20\xee\x98\x79\xa3\xc6\xd9\x30\x3e\x82\xeb\xc3\xb7\x52\xd5\x53\x93\x76\x47\xa3\xdd\x5d\x1f\xd4\x75\x7c\x5f\x9a\xc9\xf0\x2f\x84\x89\x44\xa6\xc8\x2c\x76\x7c\xa5\x0d\xa8\x7b\x95\x97\x2d\x9e\x4b\xee\x9f\x15\xa7\x37\xc1\xd8\x7d\x2c\x75\x67\xd9\xe2\xd1\xf8\x5e\x3f\x82\x12\x53\xa9\x2e\x01\xf3\xcf\x91\x28\x60\x3a\x3b\x1d\xc6\x7f\xaf\x49\xc6\x73\xee\xfa\x87\xd9\x8d\xce\xb4\xd1\x64\x0f\x3f\x1c\x25\x45\x39\x70\x37\x8c\x72\x96\x4b\xb5\x18\x84\x9b\xec\x97\xb5\x5f\xb9\x3b\xf6\xb1\x0f\x45\xa9\x14\x13\x26\x5b\x3c\x67\x0d\xc8\x13\x71\x43\x14\xa0\xb0\xc6\x5d\x90\x3c\xaa\xab\x51\x33\x17\x22\xbe\xe0\x2d\x8f\x30\xf6\x03\x58\xab\x1e\x84\x90\x04\x7c\xca\xc4\x9c\xcc\xa9\x7a\x20\x7a\xfa\xaa\xab\x47\x9d\x27\xe5\x73\xae\xbb\x36\xf7\x23\xb7\x3b\xa1\xa1\x75\x57\x69\x8a\xd2\x38\x89\xee\x77\xa0\x47\xda\x0e\x3b\xaf\xa1\x1c\xbe\xdc\xe9\x3c\xa5\x82\x1a\xc3\x94\x78\x45\xfe\x7b\xef\xa7\x2f\x7e\x1d\xee\x7f\xb3\xb7\xf7\xe3\x8b\xe1\x5f\x7f\xfe\x62\xef\xa7\x11\xfc\xe3\x0f\xfb\xdf\xec\xff\xea\xff\xf8\x62\x7f\x7f\x6f\xef\xc7\xef\xdf\x7e\x77\x75\x7e\xf2\x33\xdf\xff\xf5\x47\x51\xe6\xd7\xf8\xd7\xaf\x7b\x3f\xb2\x93\x9f\xef\x39\xc8\xfe\xfe\x37\xbf\xef\x3c\x75\x2a\x16\xef\x3a\x8a\x42\xbc\x86\x3d\x1e\xc9\xf5\x11\x7b\x61\xbf\x46\x6b\x05\x2e\xcc\x50\xaa\x21\x0e\xfd\x8a\x18\x55\x76\x13\x26\xd5\xf1\xd2\xf7\xfe\xaf\xd4\x80\x0a\x72\xde\x2b\xf5\x6b\xde\xe0\x10\xf1\x3c\xe6\x3d\x14\x06\x9f\xb8\x91\xea\x15\x2f\x86\xe5\x85\x54\x54\x2d\x48\xea\xbc\x99\x8b\x15\x80\x3f\x11\xe2\x4f\x67\x34\x5d\x78\xa3\x94\xab\x35\xd4\x06\x77\x06\xf0\x61\x29\x2f\xf3\x7e\x9c\xf0\x3f\x00\xf2\xbc\x43\xad\xf7\x09\x44\xf8\x00\x1f\xbe\x18\xd3\xe4\x1a\xed\xa5\xb0\x36\xa8\x25\xc6\x20\xd2\x3b\x2e\xef\x21\x67\x54\x04\x37\x3e\x64\xb2\xc8\x94\xd9\x85\xf3\x37\xe3\xd8\x35\x97\x3b\x86\xd3\x5d\x96\x60\xd5\x86\x49\x2a\xf2\x16\xd4\x9d\xb5\xae\x35\xe9\x05\xb6\x83\xff\x87\xbd\xb1\x3a\x5e\x4f\x70\xf1\x12\x8c\x49\x87\x91\x35\x81\x46\x52\x55\xfa\x57\x4d\x6d\x80\x75\x0b\x7b\xce\x07\x67\xed\xea\xd9\x39\xa1\xe2\x09\x5e\xe7\x4c\x63\x2e\x0a\x4f\xa0\xd1\x11\x18\x9e\x40\xfd\xb0\x62\x57\x51\x43\xc4\x52\xdb\x27\x49\x51\xbf\xa7\x7a\x10\xf6\x81\x1a\x23\x0b\xb8\xf6\x86\x0d\x73\xd9\x7e\x73\xe9\xe9\x12\x39\x2b\xa0\x9c\xd8\xdb\x96\xba\x04\x0b\xc4\x3d\xc5\xe9\xd1\x72\x02\xd9\x12\x51\x43\x1a\xdf\x73\x65\x89\x2f\x05\xcf\xea\x8c\xe9\x1b\x2d\x84\x17\x2f\x85\xcb\x16\x5c\xe2\xb2\xd5\x4c\x56\x6a\xa6\x86\xd3\x92\xa7\xfd\xb1\xd7\x93\xd3\x29\x3a\x6a\x12\x7d\xe9\x0f\xbd\x68\x0d\xbd\xeb\x0a\x21\x1f\xb3\xf3\x59\xb9\x73\x12\x52\x3b\x6b\x87\x65\xdc\x18\xa2\x9e\xe6\x49\x43\xc3\x2f\x2f\x0c\x7c\x2e\xc1\x55\xf0\x13\xb9\x43\x34\x59\x24\x0e\x54\x89\xd7\x7a\xd3\xe0\xb0\xb8\x27\xa0\x22\x6a\x68\xff\xcf\xfb\x93\x7c\x08\x75\xcc\x26\x98\xc5\x84\xbf\x01\x37\x80\xab\xe3\x4a\x59\xc6\x0c\x94\x65\x31\x51\x75\xbc\xd3\x44\xb1\x5c\xce\xed\x36\xfb\x49\x90\xf7\xda\x05\xc3\xf9\xe4\x15\xa1\xfb\xb5\xc2\x60\xd7\x66\x57\x30\x96\x62\x71\x57\xd4\x38\x4f\x95\x42\x0f\xc8\x78\xdf\x27\xab\x6a\xec\xed\xa8\xc0\x63\xe6\xda\x57\x81\x93\x4a\x31\x4b\x00\x80\x87\x52\x32\x27\x5a\xd0\x42\xcf\xa4\x01\x7f\x08\x2d\x68\xc2\xcd\xc2\x92\xdb\x28\x9a\x5c\x43\x8b\x68\xc5\xdc\x13\x07\x24\xd9\x77\x59\xeb\x31\x05\xeb\x25\x67\x66\xa6\x64\x39\x9d\x41\x0d\x14\xde\x95\x64\x54\x7b\x02\xac\xfc\xbd\xb3\xd1\x35\x49\x17\x82\xe6\x3c\x09\xad\x33\x94\x9c\x73\xcd\xa5\x8b\x64\xe1\xb8\x76\x8f\x91\xf3\xd0\x63\x00\x03\x64\x47\x19\xe5\x39\xd9\xd3\x8c\x91\xc0\x18\xf8\xcd\x25\x2a\x8b\xe8\x2c\x54\xcc\xfe\x3c\x8e\x9e\x39\x14\x45\x07\x15\x60\x3f\xa9\x64\x70\x48\x48\x40\x25\x00\x36\x77\xba\xfa\xd1\xfb\x61\xe9\x56\xcf\x4c\x2a\x48\x68\xf3\xdd\x6f\x98\x48\x65\x94\xfa\x72\x78\x7e\xaa\x63\x43\xd6\xf5\x0c\xc4\x91\xe0\x8b\x4c\x8a\x69\x0c\x32\x57\x71\xa9\x15\xf8\x02\xfa\x3f\xce\x79\x5a\xd2\x0c\x45\xbd\x9b\xcc\xd1\xe5\x29\xfe\x9c\x4f\x67\x66\x78\xc3\xc0\xcd\x89\x27\x62\x95\x1a\xed\x1f\xca\x97\x52\x6a\xb9\x86\xa3\xc1\x38\x77\x1a\xba\x8c\xa1\xc3\x22\x5d\x00\x42\xad\x4b\xde\xac\x65\xdd\x78\xa4\x76\x1c\x22\xd0\x3d\x22\x3a\x4c\xef\x30\x74\x03\xb4\xda\x10\xf8\x81\x2d\x95\x81\x6b\x97\xe7\x06\xad\x0d\xab\xbe\x12\xe1\x63\x13\x75\x17\x05\xcd\xf7\x27\x81\x1e\x5d\x08\x16\x8f\xa3\xdc\xed\xaa\x6b\xa3\x43\x9a\x86\xa2\x4e\xb7\x0d\xbf\x63\x82\x29\x9e\x34\x58\x27\xfc\x74\x4a\x0d\x6c\x3e\x26\xec\xcf\xd2\x51\x1b\x53\x79\xcd\x7a\xf1\xbc\x62\xc6\x2b\x96\x17\x19\x35\xfd\x64\xaa\xec\xfc\x10\x79\xd3\xa3\x58\xb4\xdd\xfd\x54\xa4\x43\x9a\x59\xbe\x3f\xff\x70\xe4\xea\xe1\x70\x3f\xd7\xb2\xe1\xae\xaa\xce\x9f\xa8\x8e\xa0\x5e\xb6\x72\x1b\x03\x88\xda\x98\xa5\x20\xfe\xdc\x93\xc1\xe5\x71\x23\xb0\x15\xac\xfd\xe3\xfc\xc3\xd1\x80\xf0\x11\x1b\xf9\xbf\xc2\xad\x5e\xfe\x1a\x39\xc5\x7a\x89\x50\x87\x03\xbb\x06\xa6\x12\xfb\x92\xe3\xdf\xfe\xeb\x6b\x3b\x49\xfb\xed\xdf\x86\x5f\x47\x9d\x83\xfe\xf6\x2f\xcb\x47\xca\xde\x50\xff\x34\x4e\x57\x07\x49\x6b\xff\xfa\xd7\xb9\x4c\x2f\x0b\x96\x8c\xf0\xb5\xf4\xbf\x5c\x1f\x75\x26\x8c\x55\xe6\xcf\x25\x24\xaa\xf1\x14\xf7\x12\x3c\x5b\xb1\x7f\xfb\x78\x83\x6b\x40\xea\x24\x56\x42\x0d\x13\x70\xe4\xf8\xba\x64\x21\x0d\xfe\x1c\x5b\x97\xc2\xfc\xf7\x26\x71\x37\x51\x23\x25\x08\x13\x14\x58\x87\x82\xb0\x8f\x5c\x03\x0a\x0d\xbe\x2b\x90\x83\xba\x5c\x78\x7f\x8a\xda\x61\x2d\x85\x03\xea\x10\xb4\x33\xb5\x73\xfb\x83\x90\xe6\x0f\x61\xf9\x7d\x9e\x23\x1c\x95\x92\xd0\xb9\x04\xa4\x0b\x38\x44\x04\x29\x05\x38\xca\xab\x6e\x80\xe3\x05\xc9\xb9\x36\xf4\x9a\x8d\xc8\xa5\x3d\x25\xe3\x84\x05\xa4\x9e\x20\xd0\xcf\x85\xa5\xa4\x14\x86\x67\xf0\x6d\x35\x8e\x9d\x72\x7c\x7a\x9e\x4e\x88\x2e\x13\x68\x79\xab\xd8\xd0\x9f\xc7\xee\xae\x25\x49\x56\xbd\xcb\x20\x2c\xf6\x8c\xa2\x81\x56\xa4\xf0\x53\x6c\xa0\x2b\x1c\x7b\x2d\x65\x67\xdb\x79\x4a\x91\x54\x67\x30\x10\x13\xba\x28\xdb\x63\x37\xf3\xf9\x44\x68\x2b\xba\xf8\x83\x60\x09\xd3\x9a\xaa\x05\x36\x18\xe5\xa1\x0f\xa2\x4b\x9c\x05\xa1\x94\x53\x51\xc2\x00\x8a\x61\xb7\xda\x32\x01\xea\x50\x32\x56\xf2\x9a\x89\x50\x91\x10\x04\x5e\x48\xcb\xae\x92\x50\x21\x1d\x40\x92\x64\x46\xc5\x94\x55\x45\xe7\x39\x4d\x81\xf6\xdf\x07\xdd\xce\xbf\x8f\xa5\x00\x9d\x58\x15\x89\x1b\x20\xc5\xd8\x1e\x84\x21\x8a\xf2\x93\x20\xde\x0d\x33\xa8\xc2\x1c\xf6\x95\x78\xd6\x4a\x26\x92\x7e\xfc\xea\xdd\x3d\xea\x43\xd0\x5f\xd6\x98\x02\x9e\x33\x43\x53\x6a\x68\x6f\x69\xe0\x6f\x69\x68\xa4\xe9\x72\x44\x80\x1d\xa2\xdc\x11\x77\x92\x7b\xe5\x55\x16\x3c\x86\x21\x00\x69\x30\xf3\xab\x8f\x3d\xe8\x2d\x5f\xbb\x18\x26\x66\x77\x83\x6a\xe8\xda\xab\xc3\xf0\x7e\x34\x14\x59\x2c\x25\x69\x09\x8a\x66\x25\xd2\xba\xc4\xd8\x7b\x09\xc1\xd8\x85\xee\x8d\xca\x57\x55\x2a\x41\x52\x4f\xf5\x5e\xa9\x06\xe2\x59\xc7\x84\xe1\xd8\x2a\xdd\xe3\x46\x38\xe2\x97\x02\xb7\x6a\x63\x19\x60\x9d\xa6\xcc\xe8\x2a\x49\x13\x4f\x13\x2b\x22\xdd\x59\xee\xdc\x16\x70\xd4\xb8\xa5\x71\x96\xff\x6a\x7d\x14\x17\x4e\x4b\x77\x5a\xd8\xf3\x6b\xed\x2b\xd3\x5f\x2c\x0a\x3b\xca\xbe\x95\x69\xf7\xa0\x56\xa3\x35\x6a\x35\x70\x55\xb3\x82\xf5\x4b\x1a\xdc\x4a\xf8\x64\x08\xf1\xeb\x1a\xaa\x06\x1e\x01\x33\x3a\x6f\xef\x9d\xad\xf4\xdf\x61\x68\x7b\x06\x8f\x1b\xc2\xe3\x86\x2f\xbb\xfa\xc1\xbb\x27\x41\xfa\xab\x63\x32\x64\x7d\x42\x3d\x04\x3e\xac\x68\xbd\xec\x25\x2e\xd1\xec\x4d\x19\x4e\x5e\x97\xe2\x11\xd2\x6a\x5c\x61\x2e\xe3\x56\x5e\xbe\x22\x7f\xa8\xe9\x5a\x4e\xa7\x0d\x96\x37\x56\x41\xed\x79\x53\x7c\xe4\x96\xdc\x43\x7c\xd5\x6f\xdf\x6f\x0c\x06\x4a\xde\x6a\xab\xb4\x71\x67\x52\x6a\x23\xf3\x66\xd3\x5e\xab\x18\xe6\x98\xb3\x4f\x0d\xf5\x19\xf9\x56\x98\xed\x1d\x66\xc5\x8c\xee\x43\xf7\x74\x95\x62\x15\x99\xb5\xd6\x96\xc6\x01\xc3\xad\x3e\x5a\x73\x30\xd4\xb1\x0e\xc5\x02\xe7\x77\x1c\x56\xa4\x6e\x65\xf9\x84\x23\x6f\x6a\xf9\x7a\xb1\x60\x3a\x58\x35\x1f\xba\xf2\x87\x72\x5d\xbb\x11\x95\xcc\x32\xdf\xca\x1d\x9d\x09\x8d\x34\x2f\x98\x0d\x4e\x77\x10\x9c\x36\xc1\x56\x11\xec\x26\x28\xa5\x54\x23\xd6\xaa\x4f\x5b\x00\xca\xf8\xdc\xbb\x55\xe3\x75\x4c\x2c\xe8\x31\xb5\xa0\xbf\xe4\x02\x40\x76\xe1\xa2\x7d\xc6\x70\x35\x4c\x8b\x9e\xd8\xcd\xab\xbf\x1c\x05\x48\xd3\x84\x1c\xad\x3e\x82\xbd\xf5\xc6\x45\xe7\xa7\x30\xb0\xb7\xfb\xa6\xf0\x87\xd7\x07\xc2\x5e\x19\x33\xbb\x13\x2b\x3c\x2a\xe0\xf0\xf8\xb7\x2b\x92\xd8\x2a\xb6\xfb\x1e\x9a\x1b\xb9\x3d\xe2\x8b\x93\xed\x71\x72\x78\x7e\x8a\x4f\x1c\x41\xfb\x5a\x2a\x16\x4e\x53\x33\x33\xae\xd2\x61\x41\x95\x59\xe0\x3e\x1d\xd4\x9e\x16\x0a\x33\x7b\x20\x47\xaf\x71\xea\x2e\xdd\xcf\xe2\xab\xb6\x46\x40\x3e\xb7\x3e\x3e\xb0\x77\xeb\xca\x6c\x1a\x45\xba\x96\x89\xfa\xab\x5e\x8b\x1c\x21\x9a\x79\xcf\xc7\x93\xa0\x48\xc8\x63\xe9\xf7\x44\xbf\x08\x89\x69\x51\x58\x21\x0e\xd4\x55\x99\x6b\x8f\xaf\xde\x85\x67\x6d\xd0\x09\xd3\xa7\x2c\xc6\x98\x65\xef\x3c\xbd\xfb\x06\x63\xa1\xf8\xe1\xd8\x2d\x95\x0f\xcf\x56\xa1\xe1\x44\xe6\x45\x69\x58\xb4\xa4\xce\x96\x7d\xf0\x1a\xd6\xca\x7d\x0f\xb0\xa5\xe1\x30\x0c\x3b\xac\xa2\xb1\xad\x3b\xc0\xc4\x57\x8f\xab\x49\x7a\xaf\x4b\x8d\xaf\x27\x17\xbc\xad\x5f\xbd\x25\x85\x91\x47\x49\x0c\x23\xfd\x27\x87\x91\xc7\x4f\x10\x23\x21\x61\xb7\xff\x7d\x7f\xe1\x13\x88\x1b\x3b\xdf\x89\xee\xbb\x76\x7e\x0d\xa0\x22\x8c\xc3\xb5\x6f\x0d\xef\x1c\xea\x61\x27\x83\x11\x11\x27\x50\x3a\x99\x03\xde\x79\xf4\x9a\xb3\x8f\x01\x62\x3f\xd2\xe7\x40\x2b\xbb\xe1\x1a\x9c\xc8\x54\x54\x06\x13\xc8\x8e\xa1\x4b\xb8\xf0\x30\xa2\x5b\x39\xd4\x7d\xdc\xad\x1c\x8a\xaf\xad\x1c\x22\xd0\xab\x20\x83\x6c\xbd\x5e\x95\xc7\x43\xf4\xb4\x93\x5f\x4a\xa6\x16\x44\xce\x59\x14\xd0\x87\x6e\x04\x9a\xa7\x2e\x24\x3e\xe6\x22\xe5\x62\xda\xd5\xea\xda\x50\xbd\x2e\xa7\x26\x99\x9d\x7c\xb4\xfa\x33\x14\x95\xf5\x2e\xe9\x9b\x0f\xa8\xd7\x86\xe3\x2a\xf8\x25\xf6\xa2\x1d\x5c\x5c\x23\x07\xfe\x58\x7d\x02\xae\xf0\xc3\xb3\xe3\x3e\x4d\xe0\x3e\x5c\xa8\xa4\x3f\x37\x2a\xb9\x8d\x51\x57\x91\x08\x49\x19\xbe\xa9\xb7\x90\xf5\x75\x79\x80\x34\x3d\x70\x11\x25\xd7\x7e\xc6\xdf\x8c\xc1\xd9\x3a\x46\x76\x37\xec\x95\xfa\xd5\xf3\xa9\xd3\xa7\xcf\x0c\xaf\xae\x98\xc8\xf5\xb1\x3c\x71\xfb\x39\x08\x7b\x3e\x58\x7b\xc0\x4e\x8e\xaf\x1a\x93\x3a\x2c\x73\xc8\x76\x02\x6e\x05\x34\x56\x9f\xa3\x1a\x18\x14\xf2\x72\x41\xc2\xf6\xc3\x5e\xa4\x6f\xb7\x0d\x5e\x7e\x19\x1f\x89\x58\x61\x0b\xd6\x92\x21\xaf\xd9\x62\x57\xbb\xf2\x44\x29\xf4\x8c\x17\xbe\x89\x0e\xc8\x49\xb7\x2b\xc9\x07\x88\x01\xfa\x21\x50\x22\x9e\x8a\x01\x39\x93\xc6\xfe\xe7\x04\x92\x1a\x60\x1f\x1f\x4b\xa6\xcf\xa4\x81\x4f\x36\x9a\xdc\xf8\x6a\x8f\x44\x6c\x57\x7f\xcc\xa1\x2f\x3d\xa6\xef\x40\x81\x80\x0f\x75\x03\x51\x5d\xdc\x22\x2c\x0c\xd7\x18\x46\xf1\x54\x0d\xbd\x02\xb4\x1b\xc2\x7b\x75\x85\x14\x43\xd7\x28\x72\xc5\x18\x6e\x31\xa4\xaa\xad\xc5\x1d\xc3\xb9\xa1\x20\x52\x85\xdf\x80\xd7\xb7\xc8\x68\x52\xc5\xe7\x01\xaf\x9e\x1a\x36\xe5\x09\xc9\x99\x9a\x42\x29\x6b\x32\xeb\x7b\x89\xfb\x3a\x17\xf1\xea\xf1\x74\xc4\xab\x57\x3e\x04\x15\xe5\x0d\x64\x5e\x3c\x8e\xfa\x83\x63\xe3\x71\x9d\xd3\xc2\xb2\xe0\xff\xb1\xa7\x32\x70\xc1\xff\x85\x7e\x18\x7a\x44\x0e\x89\xe6\x62\x9a\xb1\xda\x77\x2e\x70\x10\x0f\x63\x47\xb0\x36\xeb\x2f\x25\x9f\xd3\x8c\x61\xa6\x14\x15\x01\xc4\x5a\x4e\x96\x94\xae\x81\x6b\x8a\x61\xe5\x72\xc8\x3e\xda\xb9\x66\x8b\x9d\xc1\x12\xdb\xee\x9c\x8a\x9d\xaa\x2a\xbe\xc6\xa8\x41\xb9\x80\x9c\xa5\x1d\xf8\x6e\xe7\xf3\xe8\x69\x4f\xc0\x74\xed\x8d\x27\x9d\x9b\xf9\x28\xa3\x5a\xf7\x51\xa0\x7b\x3b\xe8\xe4\x65\xf4\xa4\xaa\xe0\xc6\x65\xdb\x25\x98\x07\xd3\x9f\x8f\x1c\x92\xcb\xfb\xca\x7d\xe8\x81\xce\x73\xd7\xc9\xaf\x2b\x82\x47\xf3\xcc\x09\xc3\x86\xfa\x83\x9b\xb8\x3c\xad\xaa\x10\xb8\x85\xe2\x1f\xa0\xc0\x48\x4e\x62\x00\x60\xae\xc1\xfd\xc4\x7d\x45\x82\x90\x86\x70\x91\x64\x65\x8a\xd0\xc7\xf0\x53\x70\x5e\xf5\x63\xa8\xf6\x46\xde\xde\x19\xf8\x43\x18\xd6\xeb\x9c\xce\x42\x5f\x4e\xfa\x6c\x66\x5a\x40\x0d\x20\x66\xae\x72\xed\xa8\xbd\x4e\x6a\x4d\x5a\xa5\xb7\xd5\x31\xa2\x8f\xea\x7a\xe4\x6b\x3e\x56\x8c\x1c\xcd\xa8\x10\x2c\x6b\xa6\x8f\xe8\xaa\x5b\x2d\x28\x97\xae\x47\xed\x6e\xbd\x49\xad\x97\xfd\x22\x14\xa2\x57\x39\xb4\x6b\x40\x55\xff\xed\xf4\x81\xbd\x1d\xd3\xfb\xa1\x1d\x60\x11\xe8\x77\x26\x6f\x48\x2a\xc9\x0d\xb4\x9e\x9a\x5b\xd5\x00\xda\x44\x69\xaf\x54\x44\x33\x85\x34\xc5\x44\xe6\x85\x92\x39\xd7\x3e\xb9\xdb\x31\xc4\xda\xea\x4d\xb3\xb2\x35\x40\xd7\x6d\xa8\x4a\xaf\x8f\x88\xa1\x6a\xca\x8c\x1d\x9c\x88\x32\x1f\xb3\x8e\xf5\xb4\xeb\xc6\x6e\x7c\x9a\x8d\x73\xd7\xd7\xfb\x16\x97\xff\x87\x1f\xce\xfa\x01\xbc\x5c\xc9\x5b\x37\x52\x65\xe9\x0d\x4f\x31\x51\x43\x93\x3d\xfb\xb8\xfd\x6e\xef\xbc\x46\xc4\xcb\xce\x1b\xf9\xe6\x86\xa7\x8f\x41\x6e\xa7\x4a\x01\xb9\x09\xd0\xdb\x35\x69\xe5\xd0\x10\x04\x1e\xbb\x4f\x4e\x38\x16\x10\xd9\xbf\x10\x4a\x2a\x1f\x73\x51\x95\xc0\x05\x86\x80\x93\xcf\xca\x05\x6f\x91\x6b\x66\xb0\xf4\x03\xaa\x27\xa4\x99\x11\xcd\xf3\x32\x33\x54\x30\x59\xea\x6c\xd1\x91\x8d\x9f\xea\x92\x4e\x32\xf6\x11\x77\x73\x77\xfd\x25\x0c\x55\xd7\x63\xa6\x58\xe6\xe7\x57\x78\x49\x91\xa9\x92\x4c\xd3\x83\xa0\xd4\x84\xfa\x25\xf6\x91\x25\x2e\x3d\xb4\xc8\xca\x29\x6f\x55\xcb\xb0\xed\x06\xd3\xea\xd7\xf7\xeb\x06\x53\xf5\xba\x28\x35\xab\x20\x1e\xba\x75\x5b\x7c\x1a\xcd\x5b\x1e\x55\x55\xbc\x5a\xdd\xa1\x25\x65\x05\x13\x29\x40\x46\x46\x3b\x0e\xa7\xbb\x36\x6a\x3b\xa8\xc6\xbe\xcf\x85\x93\x8f\x46\x51\x2b\xe4\x73\xa8\x23\x76\x78\x90\x7c\x42\xa8\xe8\x2a\xb0\x9f\x4b\x53\x01\xb2\xd5\x1b\x1f\x7c\xe9\x5e\x1b\x0b\x45\x04\xab\x35\x16\xea\xb9\xad\x10\x9e\x7e\x6e\xa3\xfb\xb6\x40\xb7\xb7\xff\x71\x4f\x89\x41\x22\xba\xb6\x01\xd2\x2b\xba\x83\x34\x66\xb5\xc6\x3d\xb9\xed\x09\xf4\xb4\x7a\x02\x4d\xa0\xc4\xbc\x3b\x7e\xdb\x6b\x1c\xa7\xe1\x3b\x73\x1f\xfa\x8e\xe2\xf7\xf0\x95\xb9\x1d\x15\x1d\xaf\x00\xf6\xed\x06\x72\xe5\x4e\x44\xdb\xd5\xa8\x92\xf4\x4b\x21\xda\x09\xed\x75\xb7\x4e\xa1\x86\x6a\x66\xba\x78\x74\x97\x0b\x1a\xbc\x3e\x88\x63\x63\xc7\xa1\x94\x50\x1d\xea\xac\xc9\xf0\x6f\x4e\x73\x14\xb5\x3b\xad\xce\xe8\x09\xed\x21\xde\x58\x48\xdd\xc2\x31\x52\xbb\xbc\x09\x35\x1d\x9b\x68\x76\x38\x65\xdd\x6c\xdf\xbf\x3f\x3d\xee\x85\x66\x76\xa0\x06\xcd\x46\x01\x46\xa5\x14\xfc\x97\x32\xb6\x81\x01\x72\x26\x50\xc9\xdd\xbf\x0e\x52\x4c\x13\x56\x39\xe3\x8f\xb9\xbe\xee\x8e\xc0\xf8\xdd\xd1\x49\x7d\xc8\xfa\x66\xfe\xee\xe8\x84\xb8\x4f\xef\xe5\x03\x7f\x88\x13\xbc\x2b\x90\xdf\x34\x61\x55\x78\x2c\xe5\xfa\x7a\x0d\xe8\x8d\x5d\xcd\xd3\x22\x3d\x6b\x57\x2d\xb8\xc9\xfe\x7c\x0f\xfa\x14\x21\x93\x2d\x64\x49\x6e\x1c\x1c\x89\x33\xe0\xae\x78\xf1\x8a\x9c\x08\x5d\x2a\x56\x65\x39\x35\x6d\x39\xab\x43\xdd\xdb\x9c\x03\xc4\x17\xfd\xaa\x37\xff\x7f\xdf\xfc\xf9\x5c\x02\x0a\x05\x55\x06\x6c\xb0\x9e\x00\x2c\xa1\x3f\x95\x1b\xd2\x13\xe1\x13\xcc\x73\x3a\xf1\x75\x0a\x03\x62\xea\x28\x8f\xfe\x26\xcb\x2e\x11\x3e\x51\xcc\x20\xaf\x03\xf2\x18\x39\x48\xd9\xfc\x40\xa7\xf4\xe5\x00\x1e\xe3\xab\xd8\x4d\x6d\x4e\x54\x93\x9d\x97\x3b\x23\x72\xc9\x73\x9e\x51\x95\x2d\x6a\xad\x16\xaa\xfb\xec\x61\xea\x07\x84\x24\x90\x17\x3b\x64\x4f\x2a\x18\x39\xa1\x82\x64\x8c\xce\x99\xaf\xee\xb6\xdb\x77\x81\xe6\xc3\xfe\x66\xc8\x42\xb2\x31\xd1\x18\x14\x8b\xfd\xb0\xd7\x7b\x3c\xce\x6b\x28\x57\xc7\xd5\x79\xc6\x85\x3d\xe4\x46\xe4\xbd\x3b\x9d\xdc\xb1\x8f\x2c\x00\xbb\xd6\xdf\xb1\x59\x4b\xb4\x31\x3e\x8b\x6e\x9e\x88\x65\x47\xc7\xa6\x11\xba\xad\xb7\x63\xca\xcd\x05\x2b\x64\x0f\x2a\x1a\x0e\xd4\xf0\xec\x73\x63\x3f\x90\x9a\x03\x3c\x36\x35\x84\xa2\x20\x4a\xca\x8c\x5a\x8b\x0c\xfd\xfa\x23\x72\x7c\x72\x7e\x71\x72\x74\x78\x75\x72\xfc\x8a\xf8\x91\x78\xac\xd3\x8f\xc8\x55\x0c\x54\x17\x95\x7c\x39\x34\xb0\xf0\xac\x81\x13\xac\x54\x54\xd8\xbe\x00\xdc\x43\x05\x39\x15\xdc\x54\x2d\x0b\x30\x89\x3e\x93\xc2\xa5\xc5\xdb\x5f\xbb\xb8\xc2\x94\x63\xf2\xa6\x70\x83\xd9\xaf\xeb\xa3\xc1\x0e\x45\x80\xef\x30\x95\x56\xde\x8d\x35\xeb\x76\xd5\xf2\xac\xc3\xca\xf4\xe8\xdc\xbd\x6c\xf2\x2b\x0c\xc8\x56\x70\xec\x78\xa2\x86\x2e\x33\x1e\x78\x4b\xaa\x5a\x13\x98\xd1\x68\x77\x44\xec\x59\xbd\x3b\xda\xf5\xaa\x5c\xb6\xd4\xa9\x28\x0c\x1a\xe3\x1b\xd6\xf9\x7b\x44\xc8\x3b\x5f\x46\x38\xb0\x7a\xda\xea\xa6\x47\x88\x71\x12\xb5\xb8\x69\xec\x12\xdf\x0b\xab\x1c\xc7\x0f\x75\x80\x88\x53\x3e\x67\x02\x5f\x6c\x7d\x82\xd9\x4f\xb5\x97\x55\xbb\xa8\xde\xfc\xfd\xc5\x9b\xf5\xbd\x14\x4a\x96\x5e\x5e\xe9\x48\xe6\x39\x42\xf5\xcd\x02\xd2\x48\x05\x16\x12\xa4\xde\x5a\x8c\x73\x04\x28\x9c\xb4\xda\xb0\x0d\x89\xef\x87\x6a\x18\xe3\xe1\x63\x57\xd7\x2b\x2a\x7b\xe8\xe1\xfd\x11\x1c\x42\xa6\xf6\x98\x4b\xee\xf8\x3c\x08\xef\x71\x70\x71\x72\x78\xfc\xf6\x64\x94\xa7\x4f\x50\xf8\x32\x91\x16\x92\x0b\xa3\xdb\x1a\xe6\xed\xfa\x2c\x76\x15\xdb\x61\xda\xfd\xe8\x66\x27\x7e\xb8\x38\xd1\xd3\x3f\x23\x82\x3c\x4d\x99\xa1\x3c\xd3\x11\x87\x19\x59\xc8\x4c\x4e\x57\xb7\x5b\x78\x00\xeb\xfc\x0e\x21\xa7\x86\x74\x68\x79\x72\x7d\x16\x6b\xfb\x1e\x6d\x75\x8a\xfa\x9e\x6c\x00\xa2\x1c\xa8\x15\x2c\x41\x68\xa5\xf6\x0c\x08\xf6\x19\x4d\x84\x25\x2a\xa2\x4f\x06\x44\x9c\x47\xa4\xad\x20\x5e\xa3\xce\x8d\xf7\xb5\x1d\xd6\x43\xfc\xb6\x66\x83\x95\xe6\x6d\x5b\x84\xd6\xa9\xfe\x77\x37\x52\xfd\x10\x29\x14\x1b\x06\x7c\x3c\x68\x1d\x28\x55\xa4\x83\xc5\x67\x8a\x77\xe2\x7a\x97\x2f\xde\x95\x2d\x9a\xce\xdc\x4a\x4b\x0f\x3e\x74\x48\x3c\x02\x3c\xdf\x80\x93\xec\x5c\x5a\x74\x8a\xf8\x72\xca\x45\xca\x0a\xc5\xe7\x3c\x63\x53\x40\x5a\xe7\x62\xea\x7b\x4e\x46\x40\xab\xd0\xf7\x88\x2d\xcd\xcb\x2e\xb6\x36\x71\xe7\x0f\xe0\xac\xb3\x77\x57\x80\xde\x0f\xa9\x30\x9d\x8d\x49\xfb\x40\xe8\x72\x38\x1c\x0e\xc1\x7f\xb7\xf7\x6f\x6b\xd5\xa4\xd9\x3e\xf9\x81\xb9\xe7\x48\xe8\x30\xa0\xa0\x85\xe6\x4c\x06\x88\x77\x98\x6b\x45\x59\x60\x68\x4c\x8e\x73\x77\x1d\xd8\x3b\xad\xfa\x8c\xc7\x79\xed\x7e\xce\x00\xd1\xb4\x8a\xf9\x3f\x45\x0b\x68\x4d\x87\x68\xcf\xd2\xde\xc7\x89\x56\xed\x91\x0a\xae\xd1\x9d\x0b\x94\xe8\x45\x9e\x71\x71\x5d\x81\x2e\x4e\xa4\xe5\x63\xd7\xc5\x40\x5c\xfb\x5d\xa3\x18\xcd\x6e\x3f\x31\xda\xf0\xe8\xda\x4e\x0b\xd3\x5b\x28\xe1\x6a\x51\x60\x1e\x5b\x10\x5e\x2e\xc9\x2a\x16\xf5\x3b\x3b\x4f\x9a\x62\x5c\x27\x9a\x77\x17\xef\xa7\x97\x47\x97\xa7\x35\xd9\x2e\x08\x7e\xf6\x39\x03\x76\xb7\x1d\xae\xf0\x92\x4f\xda\x82\xe0\xbf\xb4\xcb\x70\x1a\x92\xac\x6c\xfb\x4b\x4c\xa2\x3e\x97\xca\xd0\x6c\x0d\x82\x33\x99\xd1\xe2\xb0\x34\xb3\x63\xae\x13\x39\x67\x3d\xb9\x21\x6e\x66\xd8\x7a\xc2\xe3\xd4\x72\xcf\xa4\xf8\x0c\x72\xf4\xf7\xc3\x73\x42\x4b\xcb\x75\xc6\xa1\x8a\xaf\x2d\x3d\xcd\x53\xe0\x12\x4b\x7e\x1f\xf1\xfd\xdd\x13\x36\xea\xed\xb7\x41\xe1\x47\x0f\x0a\x83\x5c\x7c\x2e\x81\x60\x2e\xb8\xe1\xd4\xc8\x4e\x0d\x90\xeb\xfe\x3d\x04\xda\xc6\x2d\x72\xea\x87\x87\x1c\x27\x50\xb5\x6a\x4f\xac\xb7\xe1\x02\x43\x11\xc8\x7b\x2a\xac\x59\x47\x13\xd6\xa8\x33\x19\x00\xec\x35\x8e\xcd\xc3\x3d\x5f\xbb\x6a\xa3\x02\xa4\xee\xdf\x5e\xd5\x9a\xda\x2c\xf5\x3a\xf3\x4e\xc7\xaa\x7f\xd6\xda\xbc\xc5\xfc\x97\x7e\xe4\x93\x73\xee\x23\x5d\xfe\xab\xa4\x19\xd2\xf3\x6c\x9d\x9e\xf0\xfa\x3a\xf6\xf2\x9a\x9e\xa7\xfc\xba\x9f\x05\xef\x57\xa9\xa1\xe1\x96\xbb\xc3\x28\x2a\xb4\x65\x86\xba\x7f\x61\xd7\xa5\x18\xec\x92\x3d\x93\x14\xfb\x6b\xa3\x4c\x5f\xd5\x9c\xf8\xb2\x6e\xed\xdf\x84\x2a\xce\x6e\xef\xb5\xf6\xbc\x01\xd8\xc3\xfd\x38\x4f\x6b\x04\x42\x95\x8c\xbc\xe1\xda\xf8\xfe\x5d\xf0\x01\xd7\xae\xe1\x01\x68\xdf\xe7\x44\x2a\xc2\x8b\x7f\xd2\x34\x55\xaf\xf0\xac\x77\xd6\x21\xfc\x5b\x07\x84\x72\x2a\x42\xc6\xca\x9e\x59\x14\x3c\x01\x57\xc9\xd5\xd1\x39\xc1\xb6\x80\x7f\xf9\xd3\x0b\xd0\xc4\xff\xf8\xe5\x9f\x5e\x74\x64\xb5\xa7\x5a\x1d\x47\xfa\xf6\x42\xf6\x9e\xa7\xf0\x4c\x6a\x28\x40\x01\xc5\xea\x09\x38\xdd\x9c\x14\x44\xbe\xb7\x4c\x18\xce\xdc\x3e\xd5\xd4\x6d\xbd\xc1\x6f\xa8\xde\x80\x84\x82\x71\x94\xa3\x8f\x25\x9f\x51\x34\x9f\x3f\x15\xd1\xdc\x92\x9a\x6d\x39\xb7\xce\xb1\x28\xdd\x76\x77\x75\x9c\xcb\x01\xf5\x94\xc7\x67\x97\xff\x7c\x73\xf8\xed\xc9\x1b\x78\x4f\x97\x0d\x6f\x59\x91\x8b\xd6\xb9\xdb\xf7\x67\xed\xf6\x9e\xa2\xb6\xe4\xec\x23\x62\x7f\xf6\xfa\xb2\xe1\x8a\xb3\x9f\x3c\x30\x4c\xdf\xd5\xb6\x14\x93\x0e\xd4\x7b\x6a\x41\x02\xe8\x61\xc8\xd4\x7a\x8a\xbb\x7b\x8e\x30\x44\x00\xea\x35\xa7\x86\xe5\x21\x7c\xc7\xce\x7e\x87\x96\xbc\x41\x36\x4e\x8d\xbb\x3b\x98\x6c\x29\x86\x54\xec\x3d\x8c\xfc\x59\xa9\xdd\x4d\x3d\x54\x7d\x21\x0f\xec\x5e\xc2\x58\x3e\xe1\xc1\x8a\x30\xcc\xa3\x56\xf6\x44\xb5\x67\x29\xd3\xa1\x57\xd8\x33\xe0\xd6\x62\x55\x53\xb9\xee\xa7\xc3\xca\x5e\x75\xb5\x36\xcf\xb5\x10\x7d\xad\x7a\xf9\xb6\x86\x96\x3e\x97\x91\x3a\x57\x95\x2e\x68\xd2\x6b\x2f\x9e\xea\x23\xfc\x04\x80\xde\x9e\xe2\x01\x03\x13\x5f\x53\x99\x55\x78\x76\x3f\xdb\xf1\xc8\x0f\xd7\x04\x03\x79\x10\x97\x10\xaa\x43\x03\xe7\x52\x07\x24\x3f\xdf\x9e\x7c\x13\x59\x88\x6c\xdc\x39\xf4\x43\x4b\x07\xc2\x3a\x9d\x07\xc5\x4c\x1a\x29\x7a\x2e\x21\x3d\x5f\x31\x68\x5d\x9e\xe1\x1d\x47\x55\xd7\xca\x8a\x2f\xb0\xc2\x26\x84\xa6\xad\xc1\xe1\x4f\x6c\x29\x7c\x90\xba\x1e\xa2\x7e\x7a\x02\xa8\x48\x4f\x8f\xd7\x20\x7b\x9e\x3e\x0c\xcf\x43\x83\x73\x6b\x4b\x2f\x4d\x7b\xaa\x4b\x3f\x3d\x76\xb6\x80\xaf\x3d\xd7\x6e\xf3\x90\xdb\x77\xcf\x5a\xf4\x24\xa9\xcc\x8d\x54\x7d\xc1\x97\x9d\xd7\x86\x6b\xe4\x2b\xba\xef\x96\xf0\x24\x9e\xa7\xac\xc0\xb7\x7c\xf2\xf2\xe2\x12\x12\xb9\x1a\x1d\x25\x9b\x12\x22\x54\xea\x3e\x82\x10\x79\x3a\xc2\xa3\x57\xad\xe4\x71\x61\xa3\xd6\x66\xd2\xfa\x5d\xd1\x0b\x8d\x3e\xb8\xc1\x9c\x6b\xd3\xf2\x47\x25\x6e\x69\x10\x46\xee\xa1\x6b\x11\xaf\x4a\x5a\xf1\xd3\x4e\x8a\xd4\x0f\x14\xc3\x72\x8d\xad\xfc\xb2\xcc\xae\xa7\x14\x71\x13\x40\x07\x2e\x35\x20\xd8\x47\x2f\xa7\x85\xc6\xa6\x05\xa9\xbc\x11\x37\x54\xa5\xe4\xf0\xfc\xf4\xf3\x0b\xd1\xce\xc5\x8f\xb8\x0b\xba\x60\xd2\xd7\xa8\x08\x28\xf4\x63\x6e\x74\xd5\xed\x9e\x99\xd8\x87\x64\x0f\xa0\x90\x21\x62\x45\x98\x15\x57\x6e\x16\x91\x8e\x24\x88\x4c\x0c\xcd\xb0\x1d\x04\x19\x33\x73\xc3\x98\x20\x2f\x5e\xbc\xc0\x90\xc2\x8b\x3f\xff\xf9\xcf\xd0\xeb\x9d\xa4\x2c\xe1\xf9\xf2\x8d\x70\xd7\xff\x7c\xf9\x72\x44\xfe\x71\xf8\xf6\x0d\xa1\x09\x58\x60\x08\xa9\x8a\x23\xc3\xda\xc5\x3f\xd6\x03\xf2\xbf\x2f\xdf\x9d\xf9\x73\x49\x37\xbe\x05\xd6\xc8\xfd\xeb\x8d\xc8\x71\x94\x7e\x1e\xbb\xfc\xa9\x99\x41\x4a\xbe\x90\x86\xd0\xc9\x04\x98\x13\x45\x32\xd7\x5e\x5c\x78\x5c\x34\x3e\x9d\xf9\x6e\xdd\x96\xad\x32\xc8\x8b\xe7\x76\x8a\x10\x62\xf1\x50\x82\x98\xe6\x0f\x63\x85\xd3\x01\xa6\x32\x20\x19\xbf\x66\x64\xa2\xa1\x67\x77\xd5\x44\x43\x31\x6d\xed\xa7\x84\x0a\x3b\x3a\x0e\x16\xa6\x6e\x27\xf1\xb4\x73\x17\x3a\x76\x77\xae\x31\xac\x6f\x0c\xe7\xeb\x92\x50\x9e\x58\xb2\x3f\xd5\x5c\x82\xba\xbe\x18\xde\x07\xb9\xc8\x41\xf1\x05\xb1\x49\x68\x26\xc5\x34\x66\xba\x4a\x8f\xf0\x09\x88\x8b\x82\xb5\x25\x46\x4f\xdd\x54\xfa\xe9\x4d\x86\x92\xfb\x2d\xed\xd8\xdf\xbf\x1e\x5a\x8d\xa0\x10\xe9\x58\x96\xc6\xa7\xbc\xe1\x93\x00\x02\x0b\x30\x12\x91\xe0\x9d\x1e\xdc\x5b\x63\x9a\xfe\x5a\xbd\xf5\xd4\x67\xa9\x7e\x10\xd7\x94\xcd\x01\x61\x34\x99\x91\x6b\xb6\x18\xa2\x88\x2f\x28\xa0\x1f\x00\x9d\x8f\x2d\x75\xb1\xbf\x50\x3d\xa3\x20\x61\xa9\xb5\x03\xdd\x22\xf8\xcc\xc4\x8a\xeb\x03\x7a\x82\x37\x95\xb4\xd3\xa8\x5d\xdf\x22\x11\x39\x0e\x7d\xa3\xc2\x44\x0a\xe3\x9a\x20\x86\x46\x45\x90\x69\xd9\xa8\xb0\xb7\x12\x85\xa5\xf6\x67\xfa\xae\x27\x57\xe9\x98\xf6\xc8\x70\xca\x44\x29\x96\x7e\x0d\x48\xe0\x90\xf7\xaa\x99\xc3\xf3\xa1\xbe\x01\x5e\x94\xd2\x39\xe3\x09\x54\xd5\xd8\xdb\xdd\xbd\x9e\x4a\x81\x10\x35\x04\x00\xcd\x4c\xe9\x48\x03\xb9\xb4\xf6\xd9\x4c\x6b\xc2\xe1\x0d\x73\xaa\xae\x99\x07\xb3\xa5\xd9\x88\x9c\xdb\x49\x06\x9c\x72\xec\x1b\x37\xc7\x22\x08\x2b\x53\x62\x68\x03\xfb\x90\xdd\xd1\x68\x17\xcf\xc2\x15\x40\x07\x9d\xf9\xa5\xcf\x96\x61\xbd\xb5\x0a\xab\xeb\x41\xb4\xd0\xd8\x3a\xcd\x5a\x07\xd0\x9e\x50\x02\xee\x88\x99\x79\x6d\x81\x76\x04\x9f\x8e\xaf\x9e\x7b\x56\xf5\xdb\xf6\xb2\xbf\xa6\x97\x1d\x42\xe0\xf5\xab\xef\x66\x97\x3d\xb6\xba\xac\x27\x1c\x3b\xf9\x53\x9d\x20\x7d\xf5\xdd\xeb\xbd\xb1\x62\xde\x43\x5b\x2b\x7f\xdd\x86\x5c\x9c\xdf\xc7\xba\x00\x45\xdb\xca\xf2\x27\x65\x4e\x9c\x4e\x40\x86\xae\x46\x6b\x89\xac\xb4\x70\xa4\x58\x0a\xac\xdf\x8e\xe8\xa3\x57\x3c\xe9\xc9\xb0\x68\x5e\xdd\x0d\x8d\xe6\xd5\x25\x99\xa5\x79\x2d\xed\xf3\x70\xa6\x16\x51\x29\x2d\x2c\x91\x91\xd0\x83\xd1\x04\x61\x30\x22\x6f\xdd\x99\x8b\xcc\x4d\xc7\x5a\x66\xa5\x09\xb0\x0a\x2b\x0e\x64\x18\xd4\x77\x6c\x44\xb8\x21\x7f\x5b\x74\x3c\x83\x62\x82\x67\x56\x3f\x27\x35\x5e\x3d\x0a\x9b\xae\xc9\xa8\x78\xfd\xc6\x52\x52\xf1\xea\x71\x15\xbc\x5e\xd8\xf3\x4a\x5c\x3a\x4c\x49\x5f\x07\x58\xd3\x5e\x21\x2d\xd5\x68\x54\x8d\xbd\x22\x8a\x0d\x0f\xdb\xa2\x2d\x57\x57\x77\xc7\xab\x7b\x1d\xe7\x0d\x3c\x3c\x3f\x7d\x74\x2b\x33\x7a\xd6\xd6\xce\xbc\xd7\xb5\xc2\xe1\x0b\x40\x04\xde\x09\x74\x5c\x51\xd4\x05\xd8\xac\xfc\xfd\x0d\x98\x2b\x4b\x2f\xfe\xda\x9e\x3b\x51\x50\xaa\xd1\xf2\x01\x3d\xb8\xd5\x09\x15\xb5\x89\xf0\xe9\x32\x20\xcd\x9e\xbf\x69\xb3\xa1\x06\x09\x50\xbf\x43\xdd\x4b\xf3\x6a\x26\x96\x3a\x22\x92\x4b\xe8\xb5\x8f\xde\x93\xc8\x0d\x53\xc8\xf4\x15\x36\x6d\xa6\x42\x48\x83\x3d\xe6\x07\xd8\xac\x5f\x0f\xd0\xbd\x62\x95\xcc\x28\xd1\x4a\x45\x21\xcc\x9e\xd5\xca\xde\x98\x87\xf4\xce\x40\x04\x98\x08\x68\x77\xde\x0f\x27\x91\x47\xe0\x26\x7b\x55\x5a\x49\x9f\x7d\xd5\xeb\xe1\x46\x1c\xdf\x33\x91\x4e\x66\x2c\xa7\xd8\xe0\xc2\x13\xc8\xca\xeb\x1b\xc5\x8d\x61\x88\x7f\xcd\x54\xae\x89\x9c\x0c\xbc\x89\x84\xa8\x27\xf3\x97\x3b\xfd\xf5\xa7\x7f\x04\x5b\x99\xf8\x1d\xda\x16\xbe\xea\xb6\xab\xee\xfb\xaf\xd9\x11\x76\x77\x82\xc1\x9c\x41\xc7\x1d\xd1\x70\x42\x5a\x25\x62\x8e\xf4\xdf\x68\xd2\x6d\x9e\x9b\x61\x10\x94\xd1\xad\x9b\x61\xeb\x66\xe8\x63\xc4\x47\x73\x33\x44\x07\xb7\x17\xa6\x6e\x01\x62\xd7\x43\x8c\xff\xee\xfd\x0f\x15\xae\x43\x84\x65\x6c\x59\xde\x7b\x1e\xa4\xaa\xfb\xff\x77\x47\xa3\xdd\x5d\xef\x8f\x70\xfb\xa3\x34\x93\xe1\x5f\x08\x13\x89\x4c\x91\xa9\xec\xf8\x4a\x1b\x50\x6a\x2b\x03\x3c\x9e\x4b\xee\x9f\x15\xc7\x10\x60\xec\x7e\x59\xa2\x47\x09\xe5\x73\x46\x5e\x3f\xaa\x0a\x56\x29\x5e\x01\xbe\xca\x11\x30\xa0\xfc\x39\x0d\xac\xca\x61\xc9\x78\xce\x1d\xae\x9e\x15\x17\x4c\x1b\x4d\xf6\xf0\xc3\x51\x52\x94\x03\x77\xc3\x28\x67\xb9\x54\x8b\x41\xb8\xc9\x7e\x59\xfb\x95\xbb\x63\x1f\xb4\xb6\xa4\x54\x8a\x09\x93\x2d\x7e\xbb\xfa\x9b\x27\xf1\x06\xab\x6f\x81\x2b\xba\x94\x58\xac\xba\x1a\x65\x17\x01\xd8\x1e\x1c\x75\x81\xda\x70\x0e\xb9\x62\x87\x41\x70\x1f\xc1\xa7\x4c\xcc\xc9\x9c\xaa\xd6\xc5\x0e\xab\xae\x47\xd1\xd8\x52\x3e\xe7\x5a\xb6\x2e\x17\x5b\x39\xe4\xb2\xf7\x8b\xbb\x46\x00\xb2\x34\x45\x69\xdc\xe9\xe2\xf7\xb6\x87\x9a\x0b\x7b\xba\xa1\xf8\xbe\xdc\xe9\x71\x72\x05\x35\x86\x29\xf1\x8a\xfc\xf7\xde\x4f\x5f\xfc\x3a\xdc\xff\x66\x6f\xef\xc7\x17\xc3\xbf\xfe\xfc\xc5\xde\x4f\x23\xf8\xc7\x1f\xf6\xbf\xd9\xff\xd5\xff\xf1\xc5\xfe\xfe\xde\xde\x8f\xdf\xbf\xfd\xee\xea\xfc\xe4\x67\xbe\xff\xeb\x8f\xa2\xcc\xaf\xf1\xaf\x5f\xf7\x7e\x64\x27\x3f\xdf\x73\x90\xfd\xfd\x6f\x7e\xdf\xe3\x4b\x50\xb1\x78\xd7\x9b\x08\xc6\x6b\xf8\x28\x6a\x44\x7d\xec\x9e\x59\x97\x90\x8f\xc3\xca\x79\x3d\xe4\xc2\x0c\xa5\x1a\xe2\x43\x5e\x11\xa3\xca\xbe\x44\x57\x75\xfc\x3d\x9e\x8c\xa9\x94\x98\x0a\xb9\xd1\x1b\x36\x1b\x28\x44\x30\x73\xf4\xd1\xbd\xc1\xae\x5d\xea\xd6\x11\x7c\x9f\xeb\x51\x12\x8e\x1c\x32\xcc\x6f\x3c\xdb\xe8\xd2\x75\xe4\xdd\xa6\x1a\x2d\x5d\xdb\x54\xa3\xe5\x6b\x9b\x6a\xf4\xc0\x6b\x9b\x6a\xb4\x81\x3e\xc0\x6d\xaa\xd1\xd6\x07\xf8\x44\x7c\x80\xdb\x54\xa3\xfb\x5e\xdb\x54\xa3\xd6\xd7\xd3\x4c\x35\x72\x0a\x7c\x95\x67\xb4\xb1\x69\x46\xae\xc1\xff\x61\x92\xc8\x52\x98\x2b\x79\xcd\x3a\x46\x65\xef\x65\x60\x2e\x3d\x73\x33\xad\xcd\xbe\x54\xca\x1e\x54\xc0\xfe\x94\x3f\x5a\xa6\xdc\x9a\x99\x3d\x6f\x83\x43\x37\xac\xb7\x33\xed\xb1\x28\x52\x96\x86\xe7\x79\x61\x65\xec\x7a\x8f\xc8\x21\x51\x2c\xe1\x05\xb7\xa2\x1d\xc0\x74\xe0\x73\xdc\x27\xa1\x1f\x30\x37\x9a\x65\x13\xd7\x13\x55\x54\x35\xc3\x2a\x32\x21\xdd\x59\xb1\xf2\x31\xa8\x15\x48\xdf\xc6\x92\xe8\x99\x2c\xb3\x94\x28\xf6\x6f\xaf\x4e\xb8\xd9\x5c\xc5\x23\xc4\x8e\x50\x78\x95\xea\xb1\x6e\x70\x5a\x70\x87\xba\xb5\x49\x02\x8e\x7d\x2c\xb8\x82\xcd\x76\xc9\x12\x29\xd2\xbe\xdd\x1b\x27\xcd\xf1\xfd\x5a\xbb\x68\x0e\x4b\x49\x5a\xe2\x0d\x50\x08\x49\x33\x9e\x72\xb3\x08\x59\x18\xb8\xed\xad\x22\x8a\x5d\x68\x1d\x23\xe8\x6a\x21\x08\x2d\x0a\x25\x69\x32\x63\x3a\x7a\x1b\x54\x2b\x1d\xd8\x44\xa8\xaf\xcc\xca\x29\x17\xa8\x59\xc2\x6f\xac\x1a\x92\x2d\x88\x92\xc6\x27\x94\xdd\xf2\xc0\xab\x68\x30\xf8\x39\xea\x12\x46\x2d\x20\xeb\x4c\xc6\x43\xe0\xac\xf8\x24\xfe\x43\x13\x99\xa5\x1e\xb7\xf4\x2f\x2f\xac\x2a\x9f\x38\x2e\xb6\xd2\x1e\x50\x25\x8d\x24\x99\x55\x8b\xec\x09\x70\xfb\x8f\xbf\xfc\x8a\xcc\x64\xa9\xf4\x28\x86\x10\x78\x09\x9f\xa1\x93\xc2\x9b\x02\x86\x64\x8c\x6a\x43\x5e\xbe\x20\x39\x17\xa5\x3d\xcb\x7b\x62\xbc\xbe\xb4\xd7\x48\x6f\xfd\xd3\x57\x1d\x47\xeb\x47\x63\x5d\xce\x60\x71\xdc\x5a\x60\x7f\x36\xa7\xb8\xba\x3d\x8e\xa0\x18\xd8\xa3\xb1\xa1\xc6\xba\x23\x29\x5e\x45\x61\xe4\x9a\x77\xfe\x2f\xa5\x1c\x2f\x4c\x77\x18\x98\xff\xc2\x71\xea\xf8\x2f\xfe\xc3\xfb\x60\xa9\x56\x50\xaa\x2d\xa6\xb2\xf6\x6e\xd1\x53\xae\x4d\xab\x5e\xd1\x15\x6e\x4c\x8b\x1f\x77\x3d\xcc\xa7\xd6\xe2\xed\xa5\x68\x1d\x6c\x67\x6f\xab\x79\xa7\x72\x92\x30\x0d\xa2\xc8\xc3\xa7\x81\x7f\x16\x9f\xda\xf2\xa1\x9b\x85\xd8\x72\x27\x22\x8b\x67\xfe\x1e\x3a\x63\x76\x22\x56\x17\xdd\xde\x33\x76\x4f\xd4\xc2\xc1\xea\x32\x42\x73\x31\xc5\x46\x96\x79\x99\x19\x5e\x64\x15\xe5\xc2\x0f\xdc\x01\x1c\x3b\xfc\x69\xe4\x61\xa6\x08\x1c\x85\xd0\xe0\x10\x1c\xd9\x0b\x63\x31\x61\xb0\x1f\xa3\xb2\xe7\x78\x41\x15\x0d\xe4\x4f\x64\x9e\x53\xbd\xef\x62\x07\x14\x72\x57\x50\xb2\xdb\x63\x58\xd1\x2c\xbc\x7e\x9c\x2b\xb0\x2e\xc6\x35\x4c\x50\xd1\x3a\x68\x57\x77\xb8\xc0\x50\x44\xde\x84\xf4\x78\xec\x9f\xde\xe0\x58\xa7\x10\x7f\x4b\x93\x6b\x26\x52\xf2\x5e\x7b\xc2\xa5\x0b\x41\x73\x07\xae\x5e\x28\x89\x7d\xbb\x59\xda\xf8\xbd\x1e\x38\x47\x22\xa2\x8c\x78\x10\x28\xd4\xb7\xd6\x45\xc5\x52\xf7\x84\xae\xfb\x5e\x5b\xe5\xeb\x6e\x79\xa7\xd1\x49\xab\xf8\x3c\x61\x5e\x77\xb4\x13\x58\xd7\xcb\xcf\x5b\x23\xbe\x91\xd5\x38\x4c\xae\x69\x26\xee\x42\x38\xd2\x43\xf0\x11\x70\xd4\x69\x66\x45\xdc\x22\xc0\xeb\x34\x18\x6c\xbc\x58\x5f\xcb\x7e\x35\xee\x0e\xd0\xb4\x7b\xf1\xed\x71\x5d\x98\x5d\xd0\x54\x6a\xf2\x6d\x26\x93\x6b\x72\xcc\xc0\x68\x78\xcc\x76\xef\x6a\x9c\x3e\xed\x36\x8d\x39\x9d\xb6\xcb\xf3\x18\x92\x5c\x0a\x6e\xa4\x6a\x23\x8f\x37\x08\x6c\x6f\xdb\x6a\x6f\x35\x88\xb8\x1a\xa7\xcf\xa6\xd1\x9e\x65\xf2\x9e\x3a\xec\xce\x18\x51\x20\x62\x60\x50\xdf\xfd\xa3\xa5\xc0\xf8\xdd\x4c\xde\x0c\x8d\x1c\x96\x9a\x0d\x79\xeb\x3c\xa5\xce\xf4\xb9\x66\x0b\x48\xfa\xea\x85\x42\xdf\xe3\x60\x35\x13\xdd\x48\xf0\x9c\xc3\xe7\x56\x91\xbb\xf8\xf6\xd8\x9e\xde\xa3\xd8\x2c\x39\x60\x26\x39\x48\x58\x31\x3b\x70\xd3\x79\xf2\x64\xf5\xf2\xb1\x1f\xba\x1e\x92\x44\x66\x99\xc3\xed\x92\x13\x72\xc4\x8a\x59\x78\xc4\x66\xd0\xea\x29\x37\x4b\x2b\xa4\xec\xa7\xb1\x52\x24\x22\xec\x98\x4e\x42\x44\x8c\xae\xc6\x0f\xeb\x05\xbd\x89\xac\xfd\x19\x7b\x92\xb4\xe9\x2d\xb7\x11\xe4\xdd\x9c\x1e\x75\xbb\x97\x7e\x38\xf0\xff\x44\xe1\xe6\x7a\x4b\x3a\x9f\x2f\x5a\x13\xd1\xa7\x13\xb4\x30\x53\x96\x12\x39\x67\x4a\xf1\x94\x69\x12\x64\x74\xec\x58\xe2\xd9\x66\x50\x7e\xdb\x1d\xef\x69\xe5\x07\x6c\x8e\x4f\x21\x12\xde\x76\xcc\x65\xe1\x4d\xd3\x9c\x8b\xcd\xe0\xf2\x96\xf4\xd2\x09\xcd\xd8\xe9\xbb\xce\xa6\xf7\x25\x8e\x53\xb7\xbe\xfd\x87\x11\xc8\xfe\x27\x80\xe7\xbf\x0f\x3c\x4b\x84\x4c\xdb\x45\xc3\xd6\x6c\x43\x4f\xa9\x61\x37\x2d\x15\x9f\x61\x25\xea\xdb\xfe\x1e\x2c\xaf\xa7\x6d\x83\xaf\xa9\x41\x46\xb4\xaf\x11\xf5\x7e\x5d\xea\x94\xe3\xa0\x7e\x5c\xcb\x9e\x14\x8d\xfe\x62\x7e\x6b\x1e\x9e\x9f\x92\xef\xf0\x79\xeb\xeb\xf8\xa1\xa4\x41\x4b\xe6\x58\xe6\x94\xf7\xd4\x88\x3d\x6a\xe8\x14\xbf\xf0\x79\x78\x18\xc1\xa7\xc5\x5d\xe8\x27\x7c\x5a\x2a\x96\x12\xe7\xfd\xd8\xb6\x31\xd8\xe0\x36\x06\xfd\x2a\xc5\x95\x4e\x1c\x79\xcc\x7d\x65\x4c\xa5\x07\x7b\x2e\x02\x75\x20\xa4\x20\x11\xcd\x84\xe6\x90\x75\x10\x25\xc6\x81\xb2\x0c\xf9\xdf\xa1\x0c\x06\x15\xe7\x01\x79\x23\xa7\x5c\x78\xe9\x24\x5d\xb2\xcb\x84\xf2\xac\x1b\x39\xb7\x9a\xee\x6f\x4c\xd3\xd5\x3a\x3b\x11\x74\x9c\xb5\xcf\x64\xac\x1f\xbc\x19\x85\x3c\x29\x06\x63\x1e\xa4\x5c\xdb\xff\x92\xcb\xcb\x37\x10\x9b\x2d\x85\xb7\x0c\x21\xea\xe8\x8e\x8d\x50\x5f\x8c\xc2\x65\x7d\xf2\x00\x65\x76\x6f\x7d\x2a\x4e\x45\x6a\x5f\x97\xe9\x5a\x02\xb0\x7b\x0a\x76\x01\x09\xd5\x6b\x98\x7d\x38\x66\xe4\x6a\xc6\x93\xeb\xf3\x28\x04\x2b\x95\xfd\x4c\x44\x1f\xd5\x14\x8d\xe6\x77\xeb\x3a\x70\xdc\x6b\x9d\xf7\xe5\xf6\xba\x8a\x4e\xdc\x4b\x47\x32\x3b\x38\xa1\x5a\xcb\x84\x57\x31\x7f\x70\x0a\x57\x47\x72\x0a\x47\xf2\xfa\xc8\x00\x5a\xe2\xa3\xe8\x1f\x9e\x71\x9c\xd2\x4a\x75\xac\x6f\x70\xe1\xa9\xb5\xb6\x57\x47\x56\xee\xad\xbb\xe6\x55\xad\x9f\xa6\xb7\xfa\x1a\xe1\x67\x5f\x0f\xea\x18\xc5\xeb\xf3\xae\x81\xf3\x32\xab\x84\xbe\x9a\xae\xbf\xc7\x5a\x88\xd5\xbe\x58\x7b\x95\x17\xae\x91\x7b\x83\x9f\xb9\x80\x34\x08\x95\x42\x16\x65\x86\x59\xab\xdd\xdb\x8a\xfa\x68\x1e\x3e\x67\x0d\x01\xea\x4d\x6b\x46\xf4\xd0\x72\xbe\xe7\xd1\x97\x28\x32\x08\x5e\xfc\xe9\xab\xaf\x9e\x7a\xa7\xa2\x6e\x8e\xb3\x75\xb7\x2a\xea\x14\xea\xda\xa2\x14\x6c\x51\x0a\xee\xba\xd6\x1e\x89\xfd\xfc\x38\x04\xbd\x14\x89\xf5\x51\x20\xd6\x15\x69\xa0\x63\x71\x59\x3f\x85\x65\x9d\xb1\x04\x1e\x15\x41\xa0\xa7\x1a\xab\xee\x68\x01\x5b\x8c\x80\xdf\x06\x46\x40\x7f\xb5\x55\x7d\xe1\x01\x74\xaf\xa9\x7a\xfe\xb5\xff\x9d\xc5\x44\xd7\x0a\xf3\x87\xd7\x95\xf7\xd5\xbf\xa2\x2f\x3f\x7b\x6f\x8e\x81\x9a\x57\xd7\xd9\xbb\x9e\x33\x30\xf3\xba\x42\x7c\x37\xd2\x0a\x8d\x35\x5a\xbb\xa4\xb3\xb3\x00\xa7\x22\x5b\x9d\xc1\x75\xae\xc1\x91\xde\x5d\x36\x42\xec\xe1\xe3\xcd\x8f\xac\x6f\x43\xcc\xdb\x36\xea\xdb\xf8\x63\xb8\x6e\x89\x3f\xea\x1a\xc6\xab\xf7\x08\x82\x24\x04\x15\x4c\x8e\xe3\x3e\x2a\xd5\xfe\x3f\x3c\x3f\x25\x89\x62\x00\x69\x40\x33\x3d\x22\x2b\x34\x34\x1f\xa9\x71\x1a\x9d\xd7\xcc\xa8\x31\x2c\x2f\x4c\x57\x86\xdb\x86\x1f\x7f\x63\xe1\xc7\x9e\x63\x06\x1f\xc2\x70\xde\x5b\x34\x2b\x73\x2a\x86\x56\x5a\x40\x20\xb2\x96\xcf\xd1\x38\xf8\x46\xc4\xd7\xc0\x21\x35\xa9\x62\x08\x6e\x5e\x0a\xfe\x4b\xc9\x2a\xff\x42\x50\x2f\x36\x20\xd4\x02\xf3\xe8\x99\x76\xa8\x3a\x35\xa4\x48\x22\x97\x4a\x99\x1c\x41\x02\x1d\xbd\xc0\x88\xf4\xaf\x9a\xaf\xcc\xcc\x18\xaa\x69\xe7\x00\x0e\x50\xdd\x55\xb7\xef\xd0\xc0\xa3\x59\x26\x6f\xf0\xd9\xb1\xe2\x61\xd7\xcf\xce\xc5\xe1\x71\x8c\x19\xc9\xb9\x52\x52\xb9\x10\x4f\x3c\x1d\x4c\xcb\xb1\x76\x22\x53\x68\x70\x29\x97\x55\x71\xc9\x4c\xcc\x2a\x46\x12\x2a\xb0\x70\xd1\xfe\xdb\x27\x25\x63\xff\x33\x27\xef\xc6\x6c\x46\xe7\x5c\x96\x0a\x7f\x6d\x24\xd9\x71\x5f\xc1\x91\xbb\x90\x65\x70\x73\x97\x50\xa7\x14\xde\x4e\xaf\xa0\xd3\x59\xf5\x25\x18\xa8\xa9\xf4\xfe\xc3\x21\xfb\xc8\xb5\x59\x7e\x17\x4f\x22\xdf\x20\x61\x1d\x9c\x37\xd7\x85\x3d\x60\x3f\xb4\xae\x39\xad\xf3\x5b\x3c\x5a\x5d\x25\x9d\x5f\xc2\x57\x9f\x52\x48\x1d\x52\x0b\x96\x8a\xfb\xa2\xb0\xa7\x97\xee\x89\x6f\xd9\xb2\x33\xd3\x56\x23\x7e\x2a\x1a\x71\x48\x90\xc8\x78\xb2\x38\x3d\xee\x47\xe7\x0b\x89\x11\x76\x50\xf2\x2d\xd5\x2c\x25\x6f\xa9\xa0\x53\x74\x8e\xec\x5d\x9e\x7f\xfb\x76\xdf\x32\x09\x38\x5f\x4e\x8f\x57\x66\x4f\x5c\xc6\x33\x3b\x5b\x57\xf9\x36\x69\xd2\xa8\x37\xad\xe0\x81\x54\x5a\x5b\x01\x3b\x09\x27\x7b\x97\x96\x5d\xcb\xe0\x46\x98\x0e\xe1\x91\xca\x74\x53\xbc\xce\xf3\xf4\xfa\x31\x5f\x37\xf2\x55\xdf\xf5\x4e\xf7\x0b\x34\xdd\x23\x98\xd4\x58\x7b\x45\x0d\x9b\x2e\x8e\x59\x91\xc9\x85\x5d\xee\xf3\xc8\x75\x8e\xb7\x8e\xf1\xa8\x57\x63\x9a\x10\x55\x66\x0c\xbb\xd7\x34\x21\xc2\x04\x63\x69\x25\xa7\xb8\xd0\x86\x02\x40\x18\x8e\x7f\xe7\x8c\xee\x7d\xc0\xdc\xf7\x28\x19\xe2\x3c\x3f\x79\x57\x1d\x4e\xd1\x6e\xa8\x3b\x7f\x72\xff\xc3\x04\x1e\xff\x69\x0e\x7d\x48\xf0\xf0\xde\x61\xc2\x3a\x83\xc3\x9e\xbe\x28\x33\x7b\x74\x64\x69\xa3\x89\x28\xe8\x56\x6e\x8d\x11\x99\x01\x24\x80\x9d\xfd\x80\x8c\x4b\xab\x78\x31\x5d\xf3\x2f\x2f\xc3\x52\xde\xcc\x30\x6e\x6c\x7f\x44\x68\x51\x64\x1c\xf3\x7a\xa5\x72\xc1\xdf\xc8\xdb\xb8\x7c\xdb\x7d\x04\xc9\x03\xf5\x8f\x87\xe9\x1b\x43\x32\x67\x6a\x7c\x1f\x4c\x85\x87\xaa\x12\xb4\xe0\x10\x3b\xb9\xb7\xe6\x51\x07\x85\x3c\x3f\xc5\x5f\x7b\x4b\x2d\x36\xcd\xfc\x97\xb8\x82\x6e\x6d\x3c\xa0\xa0\xeb\x4a\x83\xd6\x46\x40\x05\x3a\x3c\x3f\x45\x18\x2a\x07\x0c\x54\xb9\x2c\xac\x6e\x4f\x31\x39\xb0\x42\x23\xa4\x53\x3b\xa2\x21\x52\x84\x87\x32\x51\xe6\x0c\xc1\x84\xaa\x76\x56\xd6\xe0\x13\x8b\x6a\xf4\xca\xe3\x61\xed\x93\xfb\xab\x13\x0f\x0f\xa3\x3f\x30\x6c\xfe\xe0\x93\x47\x48\x71\xe1\x5e\xf3\xfd\xc5\x9b\x76\x8b\x78\x56\x1f\xc3\x81\xc7\x30\xc0\xc9\x2b\xa8\x32\x9c\x66\xa4\x54\x99\x0f\xc3\x61\xd2\xbb\x4b\x4b\x9b\xd1\x79\x04\xb0\x33\x22\xe4\x0f\xb8\x72\x8e\xb0\xb8\x3f\xb1\xbd\x2b\xae\xfc\xa4\xcc\xb2\x01\x99\x70\x41\xad\xd8\x65\x05\x89\xc3\x41\x97\x5c\x24\xd6\xfc\xb2\xb6\xbe\xeb\xd7\x02\x33\xf2\x46\x59\xd8\xa4\x10\x65\x84\x68\x29\xcb\x52\x00\x5d\x84\x47\xd8\x0d\x9b\x80\x8b\xc0\x5a\x8d\x47\x59\xa9\x0d\x53\x17\xd2\x1e\x06\x51\x5e\x0b\xc0\x51\xd0\xf8\xeb\x6f\xb9\x48\x21\x85\xe9\x02\x0e\x8e\x84\x0a\xc2\x38\x38\x5f\xec\x90\x10\xa7\xb6\xbc\x53\x31\xd4\x9e\x2e\x93\x99\x7d\xa5\x9d\x42\xa6\x7a\xc7\x8a\x91\x1d\x74\xd1\xe9\x9d\x7d\xfb\x57\xf3\x1d\x30\x4d\x25\xfa\xdd\x01\x2d\xf8\xce\xfe\x80\x00\x81\x20\x70\x26\xcd\xec\xe9\xf2\xa1\x7f\x57\xb0\x89\x5b\x71\xe1\x45\x3c\x02\xf0\xa0\xa8\xba\x7f\xdd\xcc\xb8\x61\xa1\xf9\x36\x7a\x76\x02\xbe\x4a\x53\x58\x13\x72\x28\x08\xcb\x0b\x03\xde\x62\x92\x33\xea\x43\xc8\x6c\xce\xd4\xc2\xda\xe4\x00\x44\xf1\xe4\x37\x7f\xe0\xc7\x4e\x04\x6f\x74\x36\xaf\x98\x1c\x76\xd8\x32\x71\xfd\xef\x0e\xb3\xac\x66\xf0\xc3\x9f\x5e\xac\x3f\x59\x9a\xc2\x39\xdb\x8a\x9e\x1f\xec\x2f\xeb\xb4\xc4\x8f\x50\x6c\x06\x41\xf2\xe6\x8d\x8b\x68\x20\xad\xbe\xe7\x22\x45\x5d\xf5\xd0\x18\xc5\xc7\xa5\x61\x17\xcc\x4e\x38\xc1\xdc\x07\xdf\x8e\xcf\xa5\x49\xbb\x25\x19\x11\x18\x7c\xc5\x1a\x5c\xdb\xf1\x9e\x22\xfd\x97\xd5\xdc\xfb\xaa\xa6\x77\x0c\xef\x35\xfb\xdb\x86\xba\x73\x00\x67\x1e\xbc\x95\xe9\xea\x2d\xd6\xa8\x13\xa9\x6e\x76\x8a\x4b\xd4\xe7\xd2\x8f\xe5\x54\xda\x45\xb1\x52\xef\xbf\x7b\x39\xee\x20\xfd\x6d\x33\xa9\x3c\x05\x20\x4f\xa3\x6f\xae\x16\x05\x73\xb8\xdb\x64\x92\xd1\x69\xc5\x46\x20\x1d\x51\x99\x3a\xba\xfc\xe0\x5f\x41\x13\xbe\x5a\xad\xfd\xa4\xde\xfb\x29\x4d\x77\x58\x51\xe9\xd6\x3b\xec\x43\x56\x7e\xf9\x69\x75\x37\x0c\x7e\x3b\x37\xdd\x27\x08\x68\xee\x74\xb0\xdd\x46\xff\x2b\x87\xf7\x45\x23\x4e\xf0\x70\x62\xde\xf8\x84\xbc\x24\xd0\x57\x2e\x3f\xd4\xd8\xe4\x13\xf3\xbd\x85\x69\xaf\xd9\xe2\x46\xaa\xd5\xd8\xe0\xad\xf9\xeb\xce\x27\x62\xaf\xfe\x4f\x6e\x90\xb7\xb4\xb0\xaf\x5d\x65\x7d\xa2\xd4\x73\x31\x48\xb4\x11\x30\x5f\xcb\xe7\xc8\x49\x35\xa5\x82\xff\x07\x53\x65\x13\xbb\x8f\xa5\xb2\x7f\xee\x61\x1c\x03\xed\xfb\x8c\x25\x66\xdf\xf1\xdf\x4a\xb9\xf7\x09\x06\xa5\x69\xca\x51\xcb\x38\xff\x04\x2f\xdd\x4d\x04\x2e\xae\x1f\x83\xe6\x77\x6c\xac\x4f\xf3\xfe\xdd\x81\xd0\x7b\xc8\xe6\x52\xdd\x91\xeb\x74\xe7\xef\x73\xca\x5d\x7f\xd7\x8d\xa3\x0a\xcb\x29\x6f\xfb\x5a\x78\x75\xa0\x6b\x4e\x4d\xa9\xb8\x59\x79\x20\xdd\xfd\x43\x2e\xbe\x2f\xc7\xcc\xc5\x7e\x1f\xfc\x73\x01\xa9\x7c\x87\xe7\xa7\xfd\x2e\xc7\x32\xd8\xb4\x9b\xa0\x55\x6b\x48\x29\x68\x3e\xe6\xd3\x52\x96\x3a\x5b\xc4\xce\x4b\x0a\x6a\x8a\x35\xfe\xd1\x7b\x23\x76\x0d\xa1\x42\x8a\x45\xee\x6e\x15\x49\x56\xa6\xac\x36\x22\x44\xf8\xe6\x92\xa7\x84\x96\x46\xe6\xd4\xf0\x84\x24\x12\xbf\xab\x8f\x54\x6a\x46\xe8\x2d\xbf\x4d\x4a\x6d\x64\x4e\x72\xaa\xf4\x8c\x66\xd9\x6d\x6b\xdc\xc3\xa9\x76\x17\x9c\xf6\x10\xde\xff\xd6\x2f\xe7\x38\xeb\x96\xfc\xfd\x09\xf4\xf0\x7b\xf0\xb7\x9d\x5c\xa7\x01\xe6\xb7\x73\xe9\x3d\xc6\x70\x05\xf2\x2b\xc1\x7b\x3e\xb1\x30\x9f\xa2\xce\x5d\x3b\xf7\x93\xef\x75\x87\x34\xbc\xf3\xb7\x90\x48\xcb\xd2\xd3\x9c\x4e\xef\xa1\x48\xbe\xb1\xc6\x03\x15\x0b\xff\x33\xc4\x94\xd4\x03\x22\x95\xcb\x08\x09\x1d\xba\xdd\x57\x01\x8e\x54\x91\x77\x10\x74\x93\xca\xa5\x56\x3b\x2e\x85\x44\x7b\xa6\x26\x52\xe5\x56\xaf\xe3\x8a\x4c\x4a\x81\xf6\x85\xcb\xc4\x06\x8b\xc5\xf9\x74\x68\xa6\x65\xd8\x81\x10\xc5\x13\x7e\x12\x84\x6a\x72\xc3\xb2\x6c\x44\xac\xe5\x81\x60\x97\x11\x50\x42\x55\x00\x5d\xe5\x0b\x8c\x17\x24\xe5\x53\xa6\x0d\xd9\xbb\xfc\xfb\xe1\x3e\x9c\xda\xe0\xef\x58\x10\x43\x7d\xd5\x58\xdd\x8f\x03\xe7\x7f\x5a\x82\x9e\x90\x50\x43\x33\x39\xc5\x90\x39\xf8\x73\x45\x4a\x8a\x8c\x2e\x00\xb2\xbe\xa0\x0a\xd2\x46\x13\xf4\xe5\x10\x55\x0a\x00\xeb\xfd\xac\x27\xce\xa7\x45\xc1\x5d\x78\xba\x43\xe0\xc9\x96\x5b\xfd\x13\x18\xa6\x8f\x7b\x94\x29\x56\x64\xf4\x16\xef\xc3\x1d\x45\xc0\x56\xcd\x05\x3b\x56\x0a\x16\xc6\x18\x91\x4b\xe4\x9d\x9c\x9a\x04\x03\x9a\xff\xca\x99\xa1\x29\x35\x74\x64\x6d\xc1\x7f\xd5\xcb\xd4\x64\x96\xda\x81\x6e\x5f\xe8\x5b\xe6\x8c\xfa\xe2\xea\xd6\xec\xf5\x5d\x68\x95\xda\x70\x3b\xe8\xe7\x7e\x3f\xde\xe9\xe5\xe8\x28\x9f\xe0\xf5\x4f\x3e\x5a\x53\xec\xce\x58\x5b\x6d\xae\xcd\x1f\xd5\x9d\x10\x59\xfd\x4d\x1c\xb7\xe6\x0c\x50\x12\xaf\x5c\x77\x1f\xff\x09\xb8\x5a\x0f\xcf\x8e\x6f\x77\x8b\x7d\xda\x65\xf0\x09\x17\x41\x3d\x80\x70\xc7\xf4\xbc\x23\xda\x7d\x53\x8f\x22\xf8\x52\x15\xa8\xe6\xc3\xc2\x0f\xea\xa1\x54\xfc\xcd\xb8\x60\xf5\x3a\x44\xfc\xdd\xed\xfe\x91\x7b\x85\x71\xee\x13\xbc\xf9\x54\xd9\xd7\x30\x4c\xf6\xd6\x9b\xee\x17\xcb\xf9\x64\x69\x56\x8d\xe0\xae\xf6\x11\x4a\x2d\x81\xf2\x50\xc0\xe1\x5d\xa9\x81\xd8\xf7\x8d\x7d\xdd\xd3\xbf\xe3\x5f\xf5\x01\x13\x0d\x4b\x59\x4b\x2a\xba\x66\x8b\x5d\xed\x2a\x53\xa4\xd0\x33\x5e\x60\xed\xa0\x0b\x57\xb8\xd5\x25\x1f\x68\xc6\xd3\x30\x04\x72\xf5\xa9\x18\x90\x33\x69\xec\x7f\x4e\x3e\x72\x6d\xd0\xfc\xfc\xff\xd8\x7b\xd7\xee\xc6\x6d\x2c\x5d\xf8\x7b\x7e\x05\x96\x7a\xd6\xb2\x9d\x91\xe4\xaa\x74\x26\xdd\xa7\x4e\x4f\xf7\x72\x6c\x57\xc6\x27\x75\xf1\xb1\x5d\x95\x35\x27\x95\xb7\x03\x91\x90\x84\x36\x05\x30\x04\x68\x97\xba\xa7\xff\xfb\xbb\xb0\x37\x00\x02\x14\x25\x91\x92\x7c\x49\x5a\xfc\x90\x94\x29\x12\xc4\x75\xdf\xf7\xb3\xcf\x24\x53\xef\xa4\x86\x3b\x3b\x19\x2a\x76\xa1\xc3\x40\xad\x02\x8c\x16\x6f\x38\x57\x81\x9a\xec\x06\x74\x61\xc9\x9e\x9b\x14\xae\xc8\x85\x30\x12\x81\x1d\x91\xcf\xa9\x55\xb6\x09\x97\x36\x22\xa4\x18\x80\x2d\xbc\xb1\x0d\x3b\x11\xb2\x88\xe6\x61\x45\x73\xb6\x29\x0c\xee\x83\x5f\xb8\x72\x44\xdc\xf3\x6c\xea\xcc\x6e\x3c\x21\x33\x56\x4c\xc0\xbb\x93\xac\xf1\x6e\xb4\x35\x45\xb6\x32\x40\xae\x5d\x2b\x20\x99\x6f\x96\x1a\x2e\x16\x16\x29\x78\x1e\xc9\xd2\x0c\xad\x19\xff\x30\xd4\x07\x66\xea\x9f\x90\x58\xad\x86\xe4\xc4\x95\x4e\x09\x7f\xb3\x5e\xae\xb0\x19\xd3\x02\x57\xc4\x90\x92\x3b\x9a\x31\xc4\x91\xa7\xc2\xe7\x44\xc9\xf1\x02\x61\xef\xdb\x04\x6b\x73\x66\xbd\xc8\xd4\xbb\x65\xf3\x5e\x7f\x61\x69\x7b\x17\xa2\x57\x25\xc4\x45\x8b\xe9\x89\x28\x48\x5b\x3d\xf8\xad\xb7\x39\x2f\x58\x49\x2c\xdb\x9b\x57\xd6\xae\x9b\xba\xe5\xcd\x6e\xea\x46\x61\xe3\x50\x1d\x99\x29\x04\xd7\x70\x41\x66\xb2\x00\x73\xa6\xb9\x1b\xc2\x6a\x18\x51\xf5\x96\xe7\x79\x85\x42\x52\xe6\x93\x82\xa6\x8c\x4c\x0a\x9a\x4f\xbb\x8a\x25\x28\xdb\x34\x35\xff\xab\x11\x74\x97\x4c\xfe\x0a\x8d\x2e\x9a\x7e\xa7\x80\x38\xc5\x1b\x0e\xcb\x7d\x41\xf3\x9c\x15\x84\x16\xb2\x04\xa3\xdd\xec\x8e\x15\x43\xf7\x08\x06\x60\x78\x3b\x73\x22\x8b\x82\x25\xda\xa9\xe8\x36\x46\x18\xd3\x57\x45\x0a\xb9\xa9\x9d\xc5\xbe\x7b\x36\x9a\x4a\x79\x0b\x39\x74\xb0\x1d\x1f\xd0\x0a\xf2\x03\x7e\xeb\xac\xba\xe7\x14\x5a\x45\x52\xa6\x29\xcf\x20\xf2\xe4\xfd\x9b\xb7\x36\x36\xc5\x49\x13\xae\x97\xcd\x61\x1e\x3b\x50\x43\x68\x6a\x63\xa6\xae\xd8\x1d\x67\xf7\x76\xfe\x97\x45\x95\x0c\xc8\x84\x09\x08\xa5\x58\x11\x72\x34\x20\x8a\xa7\xec\x1c\x52\x73\x97\x37\xb4\x85\xf9\x7e\x49\x9f\xd7\x91\x90\xd5\x7c\x64\x2d\x0f\x69\xc1\xeb\xbd\x12\x7e\x29\x8b\x15\x30\x40\xed\x32\x85\xdb\x65\x01\xdb\x58\xf5\x57\xe4\xeb\xaf\x7f\xbf\xf4\xa1\x19\xfd\xcc\x67\xe5\xec\x15\xf9\xe6\x3f\xfe\xe3\xf7\xff\xb1\xfc\x31\x2e\xf0\xb1\x97\xcb\xc7\x67\xcf\xfc\xe9\xd5\xd9\x33\x98\xef\xd4\xc7\xfe\xad\x76\x0d\xb6\x68\x6a\x4c\x79\x56\x16\x36\x40\xb5\xa5\xa2\xf2\x3a\x7c\x07\xdc\x3a\x55\x6a\x05\x75\x2d\xba\xd0\x34\x1b\xb2\x36\xe6\x82\x29\x28\x94\x52\x8a\x82\x25\x72\x22\xf8\xdf\x59\xea\xea\xa4\x40\x18\x0a\xc0\xad\xbb\x2d\x4e\x98\x48\xb1\x42\xa5\xe1\xbc\x53\x2a\xd2\x6c\x55\x78\x42\x8b\x91\x86\x27\x78\xab\x29\x03\xfe\xd7\x69\xc2\xde\x56\x6f\xd4\xa6\x0b\xea\x6c\x5a\x27\x18\xf2\x55\x9c\xb6\xad\x46\x8a\x84\xf1\x7a\x85\x7a\xdf\xd0\xc7\x05\xed\x13\x15\x67\xb8\xf7\x4b\xc9\x8a\x39\xa4\x91\x54\xea\x45\x10\xb6\x76\x53\xa1\x0c\xb8\x61\x58\xb9\x0e\x71\x5d\x6a\x1a\x79\x25\x4a\x55\xc1\x29\xb5\x6f\xc3\x3b\x0c\x9d\xf8\xce\x9d\x45\x4e\x88\x28\xb3\x6c\xd9\xa3\x42\xae\x72\x7c\x85\x73\xb7\x46\xa1\x6d\xa7\x69\xb6\x35\x4e\x34\xcc\xf4\xa3\x9a\x28\xc2\x81\xef\x48\xa1\x78\xde\x46\x8b\x70\xc0\xad\x22\x50\xdb\x47\x9f\xb6\x43\xaf\x69\x61\xcc\xc0\xab\x4b\x78\x6a\x4b\xcc\x99\x87\x34\x6f\xe0\xd5\x29\x88\xa8\x9d\xa9\xa3\xa1\xeb\xcf\xce\xe0\xb1\xc1\xe0\xdb\x18\x3f\x1a\x86\xbe\x37\x81\x2c\x4c\x78\xdb\x98\xac\x0e\xf1\x58\x2d\x57\xb2\x85\x69\x04\xaf\xbd\x81\xa4\x13\x27\x6a\x41\x98\xbb\x19\x4b\x5a\xaf\x6a\xc1\xb8\xb8\x93\x88\xd9\xdc\x49\x86\xbb\x5a\x78\xb1\x26\xca\xdd\x03\x65\xb5\xb2\x9c\x17\x7e\x43\x91\xd6\x28\xb4\xa4\x54\xeb\x4d\xee\xab\x47\xb0\x3a\x53\x65\x27\x3a\x48\x3c\xf2\x32\x63\x3f\x70\x3d\x7d\xef\xb0\xd9\xed\xae\xd6\x65\x9e\xc1\x60\x83\x1f\xcc\x16\xba\xaa\x24\xc3\x0b\xac\xe7\xc5\x12\x39\x9b\x31\x91\x62\x28\xd3\x8c\xde\x32\x52\x95\x85\x34\x32\x1e\x88\xc1\xd0\x1c\xfb\x9c\x53\x51\xc9\x89\x77\x86\x96\xaf\xda\x51\x2d\xf7\x53\x5b\x5e\xdb\x3a\x05\x64\x75\xea\x47\x90\xbb\x11\xa5\x78\x90\x11\xcb\x24\x18\x71\x86\xe4\xe0\xcb\x03\x1b\x79\x6d\x1f\x05\x92\x6c\xef\x5a\xae\x67\x71\x20\x99\x98\x54\xa8\x53\x2a\x83\x92\xad\x96\x02\x4b\xc1\x86\xe4\xca\x8a\x30\xed\xa4\xa2\x36\xe4\xb4\x25\x29\x6d\xcd\x10\x2b\xa4\x86\xce\x33\xeb\xde\x0b\xe7\xf6\xce\xdd\x6b\x33\xbb\xee\xe1\xdf\xf2\xfc\xfa\xba\x09\xdd\xa6\x37\x3e\xd2\x15\x57\xf0\x73\x5b\x23\x5e\x09\x16\x04\x06\x53\xdd\x80\x9c\x5e\x9d\x9f\xdc\x9c\xf7\xc9\x87\xcb\x33\xf8\xff\xd9\xf9\x9b\x73\xf3\xff\xd3\xf7\xef\xde\x9d\x9f\xde\x18\x39\xe2\x4b\x44\x85\x37\x6a\x9c\x99\x5d\xc3\x8f\x64\x4c\x2d\xa8\x98\x93\x71\xa9\x0d\x39\xa8\x3e\x16\xf5\x82\xa2\x0d\x80\xa6\xa9\x51\x19\x7f\x75\x6b\xd8\x3c\xe1\x75\xb3\x49\x58\xfa\x02\x81\xf4\x6d\x6a\xd7\x7a\x31\xa9\xf5\x26\x69\x9d\x23\x11\x75\xb9\xb7\x61\x72\xc4\x27\x41\x5e\xcb\x82\xd8\xaa\x5f\xaf\xc8\x41\x2e\x53\x75\x60\x53\x50\xcc\xbf\x87\x78\xeb\x38\x93\x93\x03\x9f\x99\xc2\x48\x26\x27\x44\x95\x23\x9f\x31\x04\xdc\x14\x9e\xfe\xd2\x3d\x16\xe5\x57\xf4\x7d\xda\x50\xf0\x96\x6f\x3c\x7a\x27\x7c\x20\x6c\xf7\x18\x4a\x7e\x45\x4f\x9a\x1b\xf5\x06\xbf\x3c\x6e\xee\x81\x13\x9c\x78\x51\x7b\xe3\x93\x30\xdb\xf5\x9e\x67\x69\x42\x8b\x74\x61\xcf\x02\x73\xc3\x25\x87\xd9\x43\x14\x5d\xac\x98\x5c\x35\x6e\xa1\x34\xe4\x1d\x2b\x32\x9a\x63\x9c\x3a\xc0\x18\x43\x00\x14\x7c\xe4\x8c\xe5\x0c\xb2\xb6\x5c\x0d\x6f\x26\x92\x4c\x02\x6a\x07\x72\xc6\x7e\x3c\x74\x0c\x88\x72\x10\x85\x36\xf5\xa7\x3a\x21\xbd\x67\x4b\xe6\x20\xd8\xb9\xd3\xee\xc5\xf0\xe8\xa5\xd0\x2f\x3e\x85\x04\x95\x46\x2f\xf9\x32\xd2\xb3\x39\x71\xbd\x3e\xe9\x79\x74\x93\xd4\x4a\xc9\xbd\x2f\x7b\xd5\x03\x61\x56\x15\x08\xc9\xd6\x31\x35\x80\xef\x84\xb9\x97\xb0\xc0\xce\x7d\xe6\x3f\x5d\x21\xd4\x18\xd6\x66\x8d\x58\xd0\x87\xb8\xa1\x61\xd4\x91\x85\xaf\x56\x09\x81\x6b\xbf\x68\xba\x1f\xbc\xae\x21\x79\x1e\x13\x0b\xed\xe4\x14\x41\xda\xcd\x90\x5c\x47\x9b\xc7\xbb\xff\x42\x08\x1d\x5e\x90\x9c\x16\x46\x15\x71\x4f\xc6\xd5\xc3\xbe\x5c\x5b\x3b\xac\xc5\x26\x08\xfc\x2b\x2d\xa5\xf6\x6b\xff\xc6\x69\x46\x95\x6a\xb0\xbc\x02\x21\x30\x0d\x13\x86\x2d\x13\xea\x9c\x4f\x00\x49\x3d\xa5\x77\x2b\xc0\x13\x5a\x74\x5a\xd3\x62\xc2\xf4\x6a\xcf\x08\x15\xf3\xf7\x2b\x41\xd3\x06\xad\x61\x56\x07\xed\x4e\xd3\xe7\x41\x05\xd1\x35\xe0\x42\x0f\x64\x31\xc0\x57\x5e\x11\x5d\x94\xcb\x7c\x5c\x9a\xcf\x98\x2c\xf5\x35\x4b\xa4\x68\xce\xab\xb0\xcf\xed\xcc\xd5\xd3\x21\xd9\xc4\x7a\x1b\x4f\x9c\x18\xe1\x32\x4e\x42\x23\x7b\x25\x63\x38\x0f\x63\x0c\xd9\xf2\xfe\xcd\xdb\x6d\x16\x9b\x40\xd2\xf5\xea\x95\xfc\x68\xc9\xbe\x98\xf8\x9e\xda\x9e\xaf\x7c\xed\x6d\xa9\xbb\xbf\x74\xea\x3d\x57\xab\x9f\xb6\x93\xb1\x1a\xa6\x63\xe9\xf8\x95\xa6\xba\x5c\xd8\x0d\xd1\xda\x58\x62\x79\x8d\x89\x6d\x56\xa6\xbf\x86\xf7\x42\x23\xdf\x22\x5a\x01\xa2\xde\xc2\x73\x2e\x64\x72\x48\xec\x8b\xe6\x7c\xea\x82\x72\x54\x20\x69\xa2\x4b\xc8\xa4\xa6\xda\x86\x57\x5a\xb0\x9d\x2f\x9a\x86\xd1\xa8\x32\xae\x52\x13\x13\x56\x68\xf5\x86\x2a\xfd\x21\x4f\xe9\x92\x1c\xaa\x5a\xd8\xa4\xd2\x70\x60\x50\xb0\xbe\x17\x2c\x35\x14\xde\x4e\x01\xb6\x47\xee\x0d\xe9\x2d\xb1\xc5\xae\x9e\xfc\xea\x00\x99\xd7\x07\xe6\x53\xcd\xbd\xbe\x92\x66\x4e\x4e\x1a\x09\x50\x1c\x30\xb2\xae\xb7\x86\x9d\x14\xd0\x1a\x11\xec\x73\x93\xc6\xbd\x7d\x8f\x33\x46\x45\x73\xd0\x7e\x6d\x47\xc1\x73\xdd\xf7\x90\xfd\x00\xb9\x9f\x72\x23\xb2\x62\xae\x99\x22\x4e\x84\x4a\x59\xc6\x96\xa4\x9c\x6d\x19\xd0\x6a\xbf\x70\x66\x3f\xd0\x2a\xd8\xea\x32\x7e\xc7\x1b\xf4\xad\x10\x6e\x53\x38\x2a\x61\xd9\x4a\x0f\x5e\x6b\xaa\x8f\x0a\xc4\x97\x51\x26\x93\x5b\x84\x1c\x03\xf4\x01\xfe\x77\x56\xb8\xe8\x77\xee\x6b\x7c\xd9\x3a\x54\x13\x57\x23\xd3\xcd\x9b\x2b\x46\x04\xad\x98\xb6\xcd\x04\xfa\xf6\x65\x51\x59\x16\x4b\x61\x73\xf8\x1e\x27\x80\xd6\x29\x2a\x90\x35\x10\x79\x0e\x16\x75\x16\x0c\xb4\x01\x44\x44\xab\x32\xd2\x99\xcd\xb1\x39\xfe\x7e\x79\x3e\xca\x4e\x83\x62\x57\x65\xc5\xe0\x13\x30\x7d\x22\x59\x09\x8c\xb3\x32\x7f\xa6\xad\xe5\x6b\x4d\x9e\x0c\x69\x2f\xa4\xfb\x2e\xb7\x69\x6d\xa7\x21\x8e\x3b\xf7\xf6\x2d\x4d\x46\xa8\xae\x2e\x3e\xbc\xb6\x50\xac\x9d\xbc\x4c\xa2\x0b\x64\x66\x0c\x75\xe2\xd5\x0e\x9b\x6a\x8a\x9e\xf8\xb1\x2c\x96\x2a\x30\xbb\xeb\xfc\xea\xac\xaa\xb5\x0d\x19\xe9\x73\x79\xec\xda\x62\x0a\x91\xa1\x5e\xfe\x95\x3e\xa1\x64\xca\x95\x96\x85\x75\xad\x41\x29\xb1\x82\x42\xbd\xd2\xe6\x18\xb0\xdd\x44\xc3\x9d\xfa\x2e\x10\x9a\xe7\x8c\xfa\xd2\x43\x96\x37\x41\xed\xa0\x82\x25\xb2\x48\x1b\x3b\xe6\xb4\xfb\x46\x59\xaa\xf1\xf3\x3b\xc8\x10\xcd\xa8\xd2\x37\xbe\x0f\x46\x40\x68\x49\x8d\x63\xf1\xc7\x0e\xb1\x1a\x8d\x03\x9f\x91\xa2\xfa\x51\x12\x2a\xd0\xaa\xb1\x9d\x0c\xbe\x5e\xc8\xa8\xc6\x86\xd2\xdc\x46\xe3\xba\xf7\x92\x5b\x30\xc4\xc7\xe9\xf9\x8c\x29\xb5\x32\xdd\xa9\x16\xa4\x01\xa8\xc1\xc4\xa3\x06\xdb\xd7\x1d\xb3\x47\x01\x01\xc3\x31\x1d\x46\xd8\x7c\xf9\x56\x23\x20\x26\xa0\x41\xc1\x1f\xab\xad\x96\x2c\x9f\x52\xd5\x76\x30\xfe\x14\xf9\x40\xe3\xd6\xc7\xa1\x65\x6f\x0a\x46\xd5\xaa\x84\xcd\xda\xdc\x8e\x0a\xce\xc6\xe4\x94\xce\x58\x76\x4a\xd5\x2e\x27\x17\x28\xc0\x90\xb0\xe1\x64\x48\x0e\xae\x02\x6f\xeb\x3b\xa9\xdf\xae\x2a\xdf\xb0\x06\xa3\xa0\xcd\x89\x7e\xd0\xb3\xbc\xb5\x92\xb0\xfe\xe4\x6e\x79\x66\xb7\xee\xe1\x8a\x13\xfa\x2c\xce\xe6\xea\xac\xe3\x65\xe7\x31\x3e\x89\x65\x01\x16\xbf\x64\xd3\x13\xb9\x26\xa5\x72\xd9\x29\x7c\xce\xe7\x6f\xcd\x90\x7c\x13\xd7\x8d\x26\x93\x85\xd1\xdd\x44\x9a\x2b\x98\xfd\xc3\x00\x3b\xac\xd3\xcf\x95\x51\xc1\x76\x29\xb6\x3c\x6d\xca\xbf\x5d\xc0\xa5\xbf\xaf\x90\xcb\x07\xab\xb9\xf0\xb6\x70\x02\x29\x38\x5a\xcc\x0e\x78\xcc\x00\x8c\x33\xf7\x55\x6b\xeb\xb0\x36\x00\xbb\x2f\xc6\xb6\xe6\x99\x7d\x26\xda\x1f\x87\x50\x55\x8e\xdd\x61\x0d\x47\x48\xf8\x60\x44\x30\x65\x0e\xc5\xd1\x8a\xcf\xb7\x54\xa8\xda\x29\x53\xeb\x15\xdd\xb5\x4a\x2c\x59\xbf\xb4\xee\xa1\x55\x0b\x8c\x57\x5b\x9d\xad\x85\x4e\xdc\x41\x59\x5b\xaf\xf1\x74\x68\x6c\xad\xf8\xd7\xb1\xbd\x66\x03\x6e\xfd\xaa\xe1\x10\x9b\x57\xae\x80\x48\xa3\x63\x38\x31\x14\x38\x01\x2c\x6a\xa4\xdd\x96\x3c\xc5\xf6\xdb\xab\x3a\x0d\x84\x70\xc3\x78\x87\xef\x6a\x58\x65\xc9\x77\x37\xe7\x6b\x71\x3c\x5a\xb7\xf7\x0c\x40\x49\xd6\x6e\xa0\x87\x85\x4b\xc0\x6b\xdd\xae\x7b\xfa\xfd\xd6\x06\x16\x6a\xe5\x1e\x7b\x20\x7c\x18\xc5\x8a\x3b\x96\x46\x9e\x3a\x8b\x34\x1f\xdf\x0b\xfc\xb6\x55\xfb\x76\xda\xc9\x3f\xfe\xf9\xc5\x17\x83\xc1\xe0\x8b\x2a\x36\xeb\x15\xa1\x39\x67\x9f\x35\xc3\x08\xbc\xe1\xed\x1f\xa1\x7c\xcf\xdd\xcb\x2f\x60\xc3\x91\x53\xb0\x36\x3b\x33\xeb\x99\xcf\x20\xfc\xc2\xe5\x81\x9a\x8f\x50\x21\xa4\x0e\x63\x91\x12\x29\x74\x21\xb3\x8c\x15\x83\x09\x13\xc3\xdb\x72\xc4\x46\x25\xcf\x52\x56\x40\xe3\xee\xd3\x77\x2f\x86\xdf\x0c\x5f\x7c\x41\x7c\xd6\xa7\x91\xec\x95\xa6\xb3\xfc\x15\x24\x7e\x7c\x61\x77\x9c\xc3\x85\xcb\x33\x2a\xd4\xd0\x87\x79\x0f\x13\x59\x30\x69\xfe\x37\xfb\x42\xe5\x2c\x31\xdf\xc6\x83\x46\x1a\x9f\xb1\xa6\x33\xdb\x45\x0b\xa8\x56\x4d\xd3\x80\xc8\x6c\x06\xff\xc6\xa1\x5b\x20\xbb\xcb\xcc\xa2\xe2\x65\x5c\xe9\xef\xeb\xbf\xbc\xe1\x0a\xd9\x65\x9e\x95\x05\xcd\xe2\xae\xc2\x0f\x6a\x2a\x0b\x1d\x01\xc3\x0e\x08\x47\xd6\xa8\xb8\x98\x94\x19\x2d\xa2\xb7\xbe\x70\x31\x0f\x95\xb9\xce\x70\xc9\xbb\x28\x96\x6e\x10\x05\xcb\x72\xa1\x59\x71\x2a\xb3\x72\x16\x5a\xc7\x06\x8b\x72\xe5\x98\x17\x4a\x5b\xa4\xbd\xd8\xa9\xd0\x24\x17\xc3\xf7\x83\x3d\xfa\x37\x25\x05\xb8\x0b\xc9\xd0\x4c\xf7\x70\xf9\x4b\x3f\xbe\xf8\x29\x78\x0f\xd7\x30\x96\x57\x1b\x4f\x49\x43\x8f\x69\x9e\x17\xf2\x8e\x22\x4e\xe0\x8a\xbe\xb8\xe7\x16\x3e\x7b\xb2\xf8\xc3\x92\x6f\x37\x37\x19\xf9\xe8\xc2\x26\xa3\x1f\x74\x03\x86\x22\x3e\x7c\xf7\x92\x66\xf9\x94\xba\x3c\x43\x95\x4c\xd9\x8c\x56\x8b\x24\x73\x26\x4e\x2e\x2f\x3e\xfe\xfe\xba\xf6\x43\x33\xaa\xa2\xd9\x72\x3e\xb5\x2e\xc0\xf0\xa7\x4e\x17\xf3\xa9\x11\xd5\x09\x58\xe8\xe6\x82\x90\xd7\x2c\xd4\x19\xa9\x1c\xcf\x78\xed\xb6\x99\x9d\xe0\xd6\x32\xe1\x2a\x20\x32\x35\x42\x17\x57\x18\xab\x02\x3e\xa3\x91\xd9\x0d\xcf\x52\x3b\x67\x55\xf4\x8e\x73\xf3\x54\x83\x16\x76\x4c\x43\x62\x36\x23\x2b\x3c\x16\x13\xa6\x71\x6a\x12\xe4\x1f\x62\x6b\x60\xae\xc0\x3c\x19\xcd\x94\x86\xb8\x85\x42\xb8\x32\xbf\x7d\x5f\x9e\xbc\x60\xa6\xdd\x38\x83\xd1\xa5\x64\x34\x14\x41\x9b\x70\xed\x48\x68\x22\x67\xb3\x52\x70\x3d\x3f\x06\x6a\xc8\x47\xa5\x59\x8d\xe3\x94\xdd\xb1\xec\x58\xf1\xc9\x80\x16\xc9\x94\x6b\x96\xe8\xb2\x60\xc7\x34\xe7\x03\xe8\xac\xc0\x00\x9c\x59\xfa\x3b\x4f\xc7\xeb\x4a\xe7\x52\x0e\xd3\x24\x23\xc4\x73\x0d\xb8\x74\x3c\x28\x3f\x8e\x05\x93\x23\xf4\x53\x80\xe7\x3d\xbf\xbe\xa9\x5c\x8c\x88\x57\x04\x33\x1c\x38\xd9\xaa\xc9\x36\x13\x05\x75\x6b\x2c\x2c\xb9\x4b\xed\xf4\x09\x9d\xe6\x8f\x24\xe3\x46\x27\x51\xe5\x68\xc6\xb5\x72\xb1\x8e\x18\x38\x78\x0a\x1c\x04\xc0\x2f\xd1\x52\x33\x24\x17\xa2\xd2\xef\x1f\x7c\xaa\x21\x2a\x68\x00\xd8\xc1\xad\x27\x3b\x64\x80\x8b\x2f\x34\x28\x52\x8e\x45\x2d\x5d\x9d\xe0\x8c\x5f\xe7\x2c\xf1\xa7\xc1\x9f\xe9\x13\x44\x78\xb7\x65\x00\x7c\x2c\xa6\xc4\x1a\xd2\xf0\xf2\x42\x48\xc1\x0a\xbd\x6e\xb9\x2e\x37\x20\x0d\xf4\x34\xfe\xa9\x21\x76\x61\xd0\x8e\x8d\x90\x35\x0a\x99\xfb\xf4\x7a\x3b\x90\xe3\x0d\x56\x3b\x06\x64\x7e\xcf\x30\x6c\x3e\x06\xe8\xca\x22\x9c\x5b\xc8\x51\x08\x02\x85\xcd\xcc\xf6\x4e\x1c\xa8\x22\xa2\xd9\xbf\xa5\xa2\xa4\x59\x63\x00\xdb\x4a\xf9\xce\xcd\xcd\x72\x7c\x85\x65\x38\xbb\xcb\xa7\x6e\xa7\x58\x0d\x2b\x7b\x6f\xf3\xa5\x57\x02\x6c\x2e\x0b\xf0\xc2\xdd\xb8\xfc\xbd\x65\xa8\x26\x15\xea\xfd\x32\x97\xe6\x36\x31\x48\xbd\xf0\x4c\x2d\x84\x8d\x20\x03\x5d\x1d\x3a\xa2\x34\xcb\x55\x05\x52\xa1\x25\x49\xe4\x2c\xcf\x98\x8e\x79\x2f\x04\xe5\x76\x8b\x51\xaa\xc7\xdc\x6e\x78\x52\x2d\x72\xca\xf5\x12\x7f\xed\x00\x2d\xbb\x5d\xce\x9f\xd6\x4c\x94\x86\x0a\x5f\x47\x98\xe4\x4b\x8a\xbc\xc6\x47\x72\xf9\xbb\x21\x52\x22\x66\xa3\xc6\xb5\x89\x5c\x8c\x89\x83\x3f\x4e\x6d\x60\x6a\x1a\xa4\xad\x2d\x0f\x2d\xd9\x32\x4e\x67\xb9\xac\xd2\x3c\xcc\x2a\x21\x65\xa1\x36\xea\x92\xf7\xd7\xaa\x85\x90\xb0\xb7\x2a\x1a\x2f\xe6\xe4\x17\x76\x42\x0b\x8b\x10\x43\x49\xce\x19\xc6\xce\x7b\x71\x08\x26\x8c\xd1\xd4\xde\x34\x0c\xaf\x60\x3e\x3e\xdc\xda\xbb\xa1\x81\x4a\x5c\x82\x0a\x42\x14\x03\xd5\x01\x6d\xe6\xf8\x3b\x69\x93\x09\x6d\xa1\x13\xd8\xc9\x33\x08\x69\x77\xf5\x3c\x52\xa6\xcc\xf6\xbc\x06\xe3\xf9\x8c\x0a\x3e\x66\x4a\x0f\x3d\x46\x88\xfa\xf1\xab\x9f\x86\x61\x6a\x40\xdf\x41\xac\x7b\xa1\xc2\x6e\x0d\x20\xe5\x66\x30\x15\xc8\xa7\x2f\x59\x9a\x4b\x57\xf7\xe4\x1e\x3a\xab\xe9\xad\xa1\xdf\xd8\xd9\xd2\xe8\x32\xb7\xec\x15\xe9\xa1\x6a\xe2\x3f\xfd\x0f\x23\x86\xff\xb3\x47\x0e\xef\x21\xe4\xb9\x67\xfe\xec\xe1\x07\xbd\x0c\x18\x96\xed\xa9\x3e\x8c\x81\xd2\x05\x9f\x4c\x58\x61\x7d\x47\x60\x56\x85\x0a\x27\x1c\x8a\x84\x56\x0f\x0b\x5b\xaf\xb5\x42\xfe\xac\x77\xe4\xc7\xaf\x7e\xea\x91\xc3\x78\x5c\x84\x8b\x94\x7d\x26\x5f\x79\xf7\x43\x2e\xd3\x23\x1b\x95\xa5\xe6\x42\xd3\xcf\xa6\xcd\x64\x2a\x15\x13\x18\xf2\xad\x25\x16\x9d\x51\x12\x3c\x5b\x59\x36\xb0\x95\xf1\xc9\x3d\xa6\x0d\xbb\xa9\xc4\x34\x5c\x00\x4e\x8a\x25\x64\x2c\xb0\x0b\x5f\x33\xcb\x36\x01\xd3\x8a\x91\xbe\xb0\x2a\x0d\x26\x36\x84\x58\x4d\xaa\xc4\x45\x32\xa4\x6f\x4a\x05\xb8\x59\x6c\x31\x1b\x23\x4f\x0d\x97\xf9\x24\xd7\xee\xf8\x55\x26\xad\x06\xb1\xb5\x4d\x11\xe2\x47\x12\x0a\x5b\x0f\x71\x95\xc1\xec\x49\xeb\x2c\x6f\x35\xa2\x95\xd1\x47\x8b\xc3\xc2\x90\xa3\x47\x18\x1b\x54\xa3\x3d\xde\x78\x68\x4e\xa4\xee\xc2\x09\x0e\xae\xf1\xc0\x27\xf5\xb7\xcd\x71\xc1\x88\x43\xab\xb4\x06\x14\x6e\x46\x53\x24\x81\x54\xcc\x1f\x7c\x1b\x9b\x09\x04\xaf\x6d\x32\x1f\x58\xbb\xdc\x80\x8a\xd4\xfc\x5b\x71\xa5\xcd\xfd\x8d\x67\x6c\x85\x21\x34\x9e\xa5\x0f\x17\x67\x8f\xb3\xb9\x4b\xbe\xe1\x69\x1d\x95\x22\xcd\xd8\x1b\x29\x6f\x97\xa4\x02\x47\x03\xfa\x36\x7c\xda\x7b\xe7\x50\x4b\xe3\x62\xe0\x63\x68\x03\x2d\x97\xe4\x65\x86\xe4\xb5\x14\x39\x4d\x6e\xe9\x84\xd9\x8f\x02\x1b\xb1\x09\xfe\xa8\x29\x83\x2a\xb0\x53\x74\xbb\xa5\xbd\x47\x6b\x80\xed\xe7\x92\x6e\x3a\xbe\x68\x61\x07\xa8\xeb\xf7\xfa\xfe\xee\xc4\xaf\x1c\x49\xb8\x57\x6c\xbc\xf4\x41\x0f\xb1\xbf\x2c\xff\x64\x00\x85\xc8\x96\xfe\xe8\xe0\x98\x1b\x1f\x58\xef\x43\xac\xf7\xb3\x6d\x74\x53\xed\x35\xb7\x22\x8e\x60\xd8\x59\x8e\x1e\x83\x3b\x76\x15\xa0\x76\xdc\x3d\x55\x40\x81\xb2\x3b\x1b\x99\xf3\x28\x90\x48\xeb\xc5\xe6\x86\xf1\x6e\x20\x3c\x87\x1d\x5f\xeb\xb7\x5b\x2b\x48\x37\xf4\x69\x2f\x4e\xef\xc5\xe9\x67\x2e\x4e\x77\x3a\x03\xeb\x43\x0f\x7e\x1d\x02\x76\xa7\x41\xaf\x8f\xb6\x7f\x96\x22\x77\xe7\x31\xb6\x08\xfe\x7f\xb6\x42\x78\xa7\xc1\xb6\x14\xc8\x9b\x86\xfc\x5b\x16\xcb\x3b\xcd\xe1\xda\x78\x98\x67\x28\xa8\xb7\x1e\xe0\xea\xa4\x90\x86\xf1\x05\xf9\x18\x35\x3b\xb0\xe9\x34\x16\x43\xf7\x76\xda\x50\x4c\x5e\x27\x4e\xed\x04\x01\x76\x67\xd1\x77\xad\xc2\xe6\x96\xc2\x12\xe3\xd5\x36\x66\xae\x4b\xb6\x08\x5e\x2b\xe2\xcc\xab\xb8\xe2\xad\xd3\x46\xf0\xea\x90\x59\xd5\x36\x11\xa3\x1a\x76\x9b\x44\x92\x0e\x43\x36\x32\x7c\x5e\xc8\x51\x5b\xc4\x9a\x07\x18\x55\xcb\x28\xc3\x2d\xc3\xd9\x21\x3b\xdf\xaf\xef\xce\x06\xbb\x2e\x89\xa3\xa1\xef\x88\x69\x17\x45\x92\xf9\xf5\x38\x50\xb0\xc8\x0f\xd1\xd3\x8d\x83\x2f\x03\xb1\x1a\x3b\xd9\x77\x1e\xcc\x9b\xa2\x64\x7d\xf2\x9a\x66\x8a\xf5\xc9\x07\x71\x2b\xe4\xfd\xee\xfa\xbb\x1a\x91\xa1\xa1\xb7\x37\x16\x7b\xa1\x45\xae\x50\xeb\xae\x54\xda\x7d\x4b\x62\x7f\xe1\x5f\x70\x16\x1a\xab\xa1\x0f\x4a\xc1\x7f\x29\x63\x45\xc5\x3b\x99\x0e\xeb\x2a\xcc\xe9\xf5\x47\xd8\x1c\xa8\x6e\xab\x08\xd4\xd6\xfc\xa8\x96\x87\x55\xb7\xc9\x83\x5a\xa9\xa8\xc6\x89\xe1\x46\xd1\x8f\x55\xad\xcc\xc2\x13\xd6\xcd\x32\x79\x99\x65\x43\x72\xa1\x0f\x94\xe9\x03\x4f\x68\x96\xcd\x8d\xd6\x52\xab\x59\xb6\x5d\x06\x57\x0b\x06\xb1\x70\xd8\x10\x71\x85\xdf\xb1\xe0\x75\x37\xd1\x68\x70\x62\xa9\x1d\xc7\x76\x90\x89\x2b\xaa\x73\x35\x74\xed\xca\x3e\xee\x36\x4a\xb8\xfe\xd5\xac\xda\x46\x51\xd7\x84\x4d\x23\x18\x19\x43\x51\x07\xaa\x61\x79\x36\xec\x73\xec\xc3\x7d\x3c\x87\xff\x6a\xf9\x69\x37\xc6\xc6\xc0\x03\x5f\xe5\xf1\xad\x10\xbe\x2a\x22\xc7\x3e\xb3\xa4\x0c\x62\xbc\xc2\x18\x8e\xcd\x6c\x8d\xbb\xcd\x7d\x7d\x92\xc4\xd4\xc7\xcd\x29\xdd\x75\xea\xa4\xdf\x01\xed\xa3\xba\xdb\x89\x0a\x3b\x88\x3d\x6f\x03\xec\xd4\x1e\x99\xa8\x69\xdb\x03\x57\xc4\xa7\x46\x4c\x05\x23\x5c\xd8\xdf\x86\x9e\x50\x40\x60\x31\x4c\xc6\x56\x45\x00\x9c\xaa\xa9\xdc\x98\x32\xb6\xcd\x4f\x7c\xeb\xe4\x37\xf3\x41\x90\xed\x06\x0b\xb2\x9d\xe5\x7f\x95\x6c\x07\x25\x84\xaa\x50\x1a\x60\x92\x33\x3a\x87\xd0\xb4\x59\x2e\x0b\x4d\xd1\xc1\x51\x8a\x94\x15\x4a\x53\xc4\x28\x71\x79\x79\xb9\x19\xf3\x94\x2a\xc2\xb5\x22\x89\x4d\x32\xc4\x05\x7b\xa0\x4c\xc6\x60\xb2\x2f\xcd\x0b\x5e\x44\x88\x3e\x8e\x7c\x35\x5a\x98\x95\xab\xb0\xba\x63\x19\x5d\x11\x58\xb5\x2d\x9d\xbd\xd6\x2c\xaf\xd3\xd5\x60\x10\x02\xc4\xf1\x3b\x9e\x62\x30\x12\xcb\x09\x17\xbb\x21\xaa\xeb\x1d\x38\xe8\x98\x58\x7e\xac\x06\xde\x4a\xb3\xf4\x81\x15\x1a\xed\x7a\xa2\xee\xbf\xbf\x25\xa1\x5b\x1e\xe3\x86\xd7\xc2\x7a\xb8\xbc\x89\x15\xeb\x12\x44\xd9\x42\x1c\xa7\x2e\xac\x0c\x34\x6f\xb5\x3a\xe4\xb1\xf1\x69\xd6\x24\xed\xad\x85\x50\x19\x04\x21\x7f\x2d\x1f\x03\x93\xe2\xca\x67\xd7\x65\x00\x3e\x36\x22\xce\x96\x58\x27\xd5\xe5\x9c\x3f\x3b\x69\x6c\xbd\x7d\xbc\x65\x43\xd5\xd2\xec\xb8\xb9\x16\x96\xed\x96\x6d\xb6\x4a\xdd\xdb\x7d\xc2\x1a\xcb\xe3\x84\xdd\x26\x6e\x92\xd3\x42\xf3\xa4\xcc\x68\x51\x9d\x7d\x20\xcf\x0b\x19\x47\x9d\xfb\xac\x34\x2d\x74\x2b\x78\x84\x6b\xf7\xa4\x47\x4b\x04\xa8\x84\x29\x13\xde\x6d\x87\x09\x5c\x64\xc4\x26\x86\xed\xe5\x79\x36\x77\xd9\x01\x55\xec\x79\xc6\x95\xae\x8a\x07\x02\x17\x6f\x1b\xc4\xd0\x19\x68\xe1\x5f\x3a\x03\xce\x99\x27\x2a\x8d\xed\xd1\xf2\xe0\x5c\x4d\x43\x2f\xc6\xc2\x6f\x55\x36\xdc\xc2\xef\x0b\x39\x71\x8b\x9d\x87\x9f\x9b\x32\xe3\x92\xe8\x23\x55\x82\xdc\x42\x13\x2d\xd3\xe4\x5c\x12\x96\xdb\x1c\x1b\xa6\x5f\x2d\x8c\x11\x85\x63\xdc\x1b\x1e\x85\x0e\x14\x57\x23\xe3\xff\xbc\xf0\xfc\xcf\xd6\xeb\x14\x04\x38\x83\x43\x68\x1e\x4b\xcd\x61\x61\xc4\xba\x7a\xe0\xa6\x60\xb7\x09\x5d\xfb\xec\xad\x7d\xf6\xd6\x3e\x7b\x6b\xdd\x81\x6a\x91\xbd\xb5\x70\xe4\x21\x87\x0b\xa0\xd6\xc1\xc8\x61\x4b\xd7\xd2\x74\xc6\xc5\x92\xe3\xbf\xfa\xdc\x5b\xea\xd0\x27\xb9\xd4\x66\xf4\x60\xd3\x95\x77\xac\x28\x38\xe8\xd2\xf8\x4e\xc1\x2a\x64\xe3\xd0\xae\xbd\x23\x48\xdc\xaa\x0e\xe5\x23\x9a\x29\xed\x20\x77\x6c\x19\x8d\x13\x85\x2a\xca\xee\xcb\x1f\x39\xa7\xd5\x58\x16\x60\xe9\xa5\x66\x0f\x68\xef\x82\x09\x44\xbb\x0a\x5a\xfe\xe4\xf2\xc2\xb3\x83\x21\x19\x0c\x06\x36\xfa\x48\x17\x65\xa2\x11\x68\x48\x63\x59\x1c\xd3\x6a\xca\xa1\xd6\x6f\xa9\x18\xd8\x15\x5c\xf5\x2f\x5b\xaf\x0d\x43\x86\x20\xbc\x6f\x68\x6d\x21\x01\xfb\x27\x71\x04\x18\xf0\x9d\xd7\x52\x5a\xf9\x13\x3f\xf8\x0f\x18\xe8\xf1\x31\xb9\xaa\xd9\x5b\x47\x46\x98\xb2\xe5\x36\x40\x28\x1d\x4b\x79\x10\x5b\x5e\xd8\xd0\xbd\xfc\xbd\x90\xf7\xa2\xa9\x0b\xf0\x4d\x5a\xb0\x57\xe4\x53\xef\xe4\x8e\xf2\x8c\x8e\x32\xf6\xa9\xd7\x27\x9f\x7a\x97\x36\x02\x96\x8b\xc9\x27\x8b\xa0\xff\xa9\x77\xc6\xa0\xb8\x74\xfa\xa9\xe7\x9a\xfe\x77\xa8\x0b\xf6\x96\x15\x13\xf6\x3d\x9b\xff\x27\x34\x18\xfd\x74\x8d\x75\xc4\xe6\xff\x89\x65\xc4\xdc\x6f\x46\xfa\xb8\x99\xe7\xec\x3f\x67\x34\x8f\x6e\xbe\xa5\x79\xd4\x50\xe0\xf0\xff\xf1\x27\x73\xe8\xef\x5e\x0e\xab\xa5\xfe\xf9\x6f\x4a\x8a\x57\x9f\x7a\x01\x52\xa4\x9c\x99\x2d\x93\xeb\xf9\xa7\x1e\x89\x7a\xf0\xea\x53\x0f\xfa\xe0\xee\xbb\x4e\xbf\xfa\xd4\x33\x5f\x33\xb7\x0b\xa9\xe5\xa8\x1c\xbf\xfa\xd4\x1b\xcd\x35\x53\xfd\x97\xfd\x82\xe5\x7d\x23\x82\xfc\x67\xf5\x85\x4f\xbd\x9f\xc9\x27\xe1\x3a\x0d\x4e\x6c\x5c\x69\x45\xfe\xd9\x5c\x86\x61\x07\x16\x98\x75\xf8\x4a\x68\x77\xdd\xc4\xfa\xb2\x65\x81\xe3\x8d\xb1\x26\x17\x5f\xac\x2a\x1f\x6e\x17\x51\x60\x4f\xac\x2f\x61\xee\x95\x22\x30\x5d\xa2\x16\x54\xb5\x8a\x31\x7c\xe9\x90\x60\x75\x3d\xcc\x61\x33\xec\x10\x3c\xb0\x50\xf5\x43\x90\x52\x39\xd6\x1c\xab\x59\x86\x5a\xe0\x29\xb7\xcd\x00\x77\x4f\x12\x96\x6b\x73\x94\x1e\x09\x13\xb3\x1b\xb2\xe4\x6c\xc1\x3a\xbc\xb9\xe7\x1f\xa7\xda\x9a\x89\xa9\xab\x0c\x8b\xc3\xda\x72\xf0\x33\xfa\xf9\x0d\x14\x08\x7a\x45\x7e\xff\xd5\x1f\xbe\xf9\xe3\x92\x07\x91\x12\xb2\xf4\xbb\x95\xa9\xaf\x0d\xd3\xb0\xf8\x62\xdd\xc8\x37\xf4\xa5\xf2\xab\xbc\xda\xaa\x18\x67\x1c\xf6\xa1\x98\x26\x23\xf0\x80\x94\xb9\x99\x97\xd7\x2e\xdb\x51\x24\x18\x92\xd6\xd8\x18\xf7\x14\x3b\x9b\x93\x97\x5f\x61\x59\x1c\xf8\xf4\x02\xad\xfe\xf1\xf3\x4f\xc3\x86\x2e\x73\x45\xfe\x57\xbf\xd6\x1f\x23\x2d\x96\xc0\xe6\xcc\xc6\x41\x67\x67\xc1\x90\xf7\x39\xe5\x7e\x91\xf7\x31\xdf\xdf\x75\x0b\xd7\xa1\x44\xc4\x37\x5f\x2f\x5f\x5f\x57\xc1\xfb\xc5\x2e\xfc\x52\xd6\xef\xe4\x59\x3f\x45\x18\x74\x3a\x83\x9c\xf0\x20\xf4\x20\xdc\xda\xba\x5b\xf0\x08\xb9\x2c\x64\x5a\x26\x46\xe4\x96\x63\x17\xd9\x9c\x84\x04\x0a\x6a\x93\x98\xd3\x80\x9a\x14\x61\x9f\xcd\xa4\xb3\xaa\x48\x8d\x51\x6b\x18\x15\x5c\x4c\x54\x05\x04\x08\x04\x04\x59\xec\xfd\x94\x01\x3f\xd1\x61\x49\x47\xe8\x95\xe2\x29\x84\x5d\x53\x32\x29\x69\x41\x85\x66\x08\xf6\x8f\x65\x1d\x51\x8f\xa8\x48\x1e\x0d\xb0\x15\xed\x69\xc4\xa3\x8a\xc4\xca\x74\xd1\x4a\xfc\x58\x0e\x74\x67\x47\xf5\xe5\x8b\xaf\x56\x2e\xb9\x7f\x6e\xb9\xa9\x97\x6a\xa3\x0b\xbe\x22\xff\xdf\x8f\x27\x83\xff\x47\x07\x7f\xff\xe9\xd0\xfe\xe3\xc5\xe0\x7f\xfd\xb5\xff\xea\xa7\x2f\x83\x3f\x7f\x3a\xfa\xcb\xbf\xed\xc2\xf0\xa7\x76\x1a\x9c\xd3\x6a\xd2\xd6\x17\x1d\xe9\x99\xaf\xae\x2a\xec\x34\x20\x3d\xe8\xd2\xea\x67\x6c\x77\xb7\xf7\x88\xea\x7a\x4c\x10\xe1\x81\x96\x08\x59\x00\xe6\x20\xc9\xa1\x95\x69\x87\x89\x9c\x1d\x07\x5a\xa4\x11\xa6\xdf\x52\x31\x27\x15\x59\x43\x09\xb4\xbe\xd3\x15\x24\x2a\xd1\xa4\x90\x4a\x45\xb6\xca\x5b\x46\xbc\x98\x8a\xc4\x72\xc4\x12\x0a\xd2\x77\x31\xe2\xba\xa0\xc5\x3c\x08\x89\x70\x20\xe9\xa5\x62\xe3\x32\x23\x87\x8a\x31\x32\x14\x32\x65\x8b\xd4\xf5\x08\x69\x28\x1d\xf1\x8c\x6b\xc8\x2a\x48\x59\x22\xc5\x38\xe3\x56\xe8\x77\x1e\x50\x57\x45\x75\xc2\x3e\x13\xae\x7d\x25\x73\xae\xc8\x61\x2a\xd4\xcb\x97\x5f\xfd\xfe\xba\x1c\xa5\x72\x46\xb9\x78\x3d\xd3\xc7\x47\x7f\x39\xfc\xa5\xa4\x19\x64\x40\xbc\xa3\x33\xf6\x7a\xa6\xb7\x0a\x36\x8a\xd9\xe2\xcb\x6f\x5a\x9c\xa2\xc3\x1f\xf1\xac\xfc\x74\xf8\xe3\xc0\xfe\xeb\x4b\x77\xeb\xe8\x2f\x87\x9f\x86\x2b\x7f\x3f\xfa\xd2\x8c\x21\x38\x81\x3f\xfd\x38\xa8\x8e\xdf\xf0\xa7\x2f\x8f\xfe\x12\xfc\x76\xb4\x78\x18\x55\x04\x23\xf0\x48\x3a\x67\x0b\x60\x89\x45\x6d\xdf\x02\xba\x5b\x7d\x3f\x56\xdb\x1b\x74\x7d\xae\x95\x0b\x6f\x00\xb5\x7e\x18\x02\xbf\x3e\x6e\x95\x9b\x47\x08\x02\xda\xab\xd7\x7b\xf5\xfa\x37\xac\x5e\x2f\x2a\xa3\x7b\x4d\x7c\xaf\x89\x57\xd7\x5e\x13\xdf\x6b\xe2\x7b\x4d\xbc\xd5\x6a\xee\x35\xf1\xbd\x26\x1e\x5f\x7b\x4d\xdc\x3e\xb3\xd7\xc4\xf7\x9a\xf8\x63\x6b\xe2\xab\x82\xae\xc6\x66\xcb\xba\x9b\xeb\xa2\xae\x48\x18\x8e\xf3\xd5\x3e\x1c\x67\x1f\x8e\xb3\x0f\xc7\xd9\x87\xe3\xb8\xeb\xb1\xc3\x71\x62\xf3\x1c\xc6\xcc\x44\xe6\x38\xd8\xb3\x79\x21\xef\x78\xca\x54\x2d\x78\xc7\xa7\xff\x05\x5c\x66\x06\x80\xc1\x55\x40\x0e\x7b\x9c\x70\x9c\xbd\xed\x6e\x6f\xbb\xdb\xdb\xee\xf6\xb6\xbb\xbd\xed\x6e\x6f\xbb\xdb\xdb\xee\xf6\xb6\xbb\xea\xda\xdb\xee\xf6\xb6\xbb\x65\x4b\xbe\xb7\xdd\xb9\x6b\x6f\xbb\xdb\xdb\xee\x1a\x96\xe2\xb7\x61\xbb\x0b\x77\xd0\x3e\x6b\x63\xaf\x9a\xee\x55\xd3\x5f\x99\x6a\xba\xd7\x37\xf7\xfa\xe6\x5e\xdf\x6c\xb8\xf6\xfa\xe6\x5e\xdf\xdc\xeb\x9b\x7b\x7d\x73\xe1\xda\xeb\x9b\xf6\x99\xbd\xbe\xb9\xd7\x37\xf7\x59\x1b\x1d\xb3\x36\xde\xbf\x79\x1b\x44\x82\x60\x84\x48\xb0\xb3\xa0\x52\xc8\x88\x31\xe1\xc5\x88\xbd\x17\x77\xaf\x2a\xef\x55\xe5\xe7\xa0\x2a\xef\xbd\xb8\x7b\xad\x7a\xaf\x55\x2f\xb9\xf6\x5a\xf5\x5e\xab\xde\x6b\xd5\x7b\xad\x7a\xaf\x55\xaf\x7a\x64\xaf\x55\xef\xb5\xea\xa6\xeb\x19\x67\x60\xfc\xcb\xc0\xde\x02\x9c\xed\xe3\x43\xde\x7e\xe7\xe1\xd0\x17\xe1\x6e\xe1\xb7\xa5\x50\xb7\xd8\x61\xf8\xa9\x09\xe6\x56\xe2\xae\x5c\xc4\xb7\x75\x00\xec\x4f\x80\x6d\x0b\x03\x72\x8a\x43\x29\x38\x88\x3d\xb3\x32\xd3\x5c\x33\x41\x45\x32\x07\x36\xfb\xfe\xcd\x5b\x32\xa3\x82\x1a\x01\xbd\x9a\x6a\x72\x01\x25\x91\x94\x2e\x40\x64\xf0\x22\x50\x96\xf9\xbc\x12\xff\xb0\x21\x6d\x5c\xab\xaa\x94\x25\x96\xa8\xad\x4a\xbd\xda\x3a\xda\x9a\x16\x13\xa6\xab\xc7\xd4\x3e\xd3\x66\x9f\x69\xb3\xcf\xb4\x79\xb6\x99\x36\x40\x3f\x20\xcb\xc6\xd5\xc3\x37\xff\x36\x34\x83\x8a\x1a\x91\x71\x4b\xb4\x23\xfb\xa9\x62\x19\x4b\xb4\x6c\xac\x0b\x17\xa3\xde\xdb\x07\xed\x1b\xd8\xcd\xa8\x6b\x07\x6a\x35\xdd\x69\xd1\xd3\x75\xbd\x85\x55\x30\xc2\xce\xf9\xe7\x1c\x2c\x88\x2b\xca\x97\xc6\xd6\x86\xda\x4b\x78\x22\x0c\x67\x32\xd4\x24\xa3\x23\x96\xf9\xa9\x70\x94\x70\x86\x5b\x1e\x25\xad\xea\x0e\x08\x88\x27\xef\xce\x96\x97\x9a\x5c\x6d\x75\x26\xeb\x8b\x9a\xd6\x6a\x44\x2e\xef\x9e\x3d\xd8\xee\x97\xb0\xbc\x9e\xb2\x44\xab\x4f\x28\xb9\x65\x73\xa4\x6f\x51\xf2\x96\x79\xb8\x60\x40\x0d\x61\x31\x6f\xd9\x1c\x1e\xb2\xc4\x6e\x8d\x80\xb8\x93\x9a\x29\xb7\x6c\x79\xe1\x57\xe0\xf5\xb6\xb3\xcb\x05\xcc\x56\xd5\x49\x6e\xd9\x7c\x75\x35\x8b\x68\xc2\xcd\x3c\x78\x1b\xa0\x99\x79\x73\xc3\x1b\x5c\xfc\x64\xd3\x3c\xcf\x38\x03\x6a\xb6\xb2\xed\x96\x55\x37\xdc\x50\x3b\x74\xd4\x2f\x65\x60\x31\x82\xc5\x3e\x50\xb8\xb0\x66\xa7\x4f\x79\x6e\x85\x04\x14\x0d\x1c\x2b\xfb\x08\x65\xf5\x2b\xc9\xc2\xec\xea\x0b\xd1\x27\xef\xa4\x36\xff\x3b\xff\xcc\x0d\xa9\x36\xfb\xe1\x4c\x32\xf5\x4e\x6a\xb8\xb3\x93\xa1\x62\x17\x3a\x0c\xd4\x6a\x66\x3c\x70\x83\xc8\x71\xc4\xcf\x8c\x18\x55\x2b\x46\xc9\x95\xe1\x28\xb2\x70\x23\x8a\x8c\x19\xa6\x89\x59\xa9\x80\x01\x09\x29\x06\x68\x7f\x68\x6a\xc3\x4e\x84\x2c\xa2\x79\x58\xd1\x9c\x6d\x0a\xec\x1c\xf8\x0b\x4a\x30\x99\x11\x45\x49\x5a\x16\x58\x0f\x5f\xa1\xeb\x80\x27\x04\xbd\x17\xe0\x37\x68\x33\xbd\xab\xcb\x25\x93\x36\x25\x93\x5b\xad\x15\x90\xcc\x37\xe6\x00\x74\x20\xb1\xf8\x3c\x92\xa5\x19\xcd\xcd\x32\xfd\xc3\x50\x1f\x98\xa9\x7f\x92\x9c\x72\x23\xf1\x9e\x80\xf4\x9e\xb1\xe8\x37\x5b\x08\x25\x6c\xc6\xb4\xc0\x15\x31\xa4\xe4\x8e\x66\x0c\xab\xa0\x51\x41\x58\x86\xd4\xcf\x08\xd9\x35\xc2\xde\x27\xf7\x53\xa9\x90\x98\xa1\x95\x89\x2b\xd2\xbb\x65\xf3\x5e\x7f\x61\x69\x7b\x17\xc2\xba\x9f\x16\x16\xd3\x13\x51\x29\xb2\x39\xe9\xc1\x6f\xbd\xcd\x79\xc1\x4a\x62\x49\x53\x54\xff\x69\x76\xd9\x82\x9a\xad\x5c\xb7\xd8\x79\xbc\xac\xca\x50\x8d\xaf\xd7\x5f\x71\xc4\x0f\x33\x76\x43\xdd\x02\x9e\x24\x14\x1f\xb5\x4e\xde\x7b\x9e\x65\xd6\xbc\x91\xa2\xc5\x22\xcf\xe4\xdc\xcf\xf3\xa1\x3a\xc2\x95\x35\xf2\xa4\x9b\x7b\xd0\xd4\x3a\x97\xb7\x31\x0a\x39\x4f\x2e\x31\xb1\x38\x3d\xb9\xbc\x68\x9c\xa5\x85\xca\xbf\x3c\x21\x9a\x65\x19\xba\xa8\x8d\xcc\xa9\xa5\x95\x39\x1b\x45\x98\x3c\x68\x3f\x50\xd2\x97\x76\x76\x24\x65\xc6\x1a\x8a\x0e\xa1\x28\xe4\x95\xd0\xf5\x7d\xbd\xa9\xbd\x60\xc9\x1d\xfb\x9c\x67\x3c\xe1\xda\xd1\xef\x4a\xb6\x02\x7d\x06\x5e\x02\xc2\xc5\x41\x1a\x50\x4c\xf7\x2b\x59\x8d\x2b\xc2\x27\x42\x16\xcd\xfb\xf3\x61\x62\xd7\x09\xf9\x3c\xa8\x4a\xdc\x0f\x8c\x8c\x35\xb0\x2f\x30\xbd\x69\xd4\x01\x0a\xc8\x51\x7d\x28\x6b\x2c\x6d\x12\x92\xaf\xba\xcb\xc8\xcb\xe5\x95\x41\x50\x5f\xb4\x5e\xbe\x6d\xf3\xc8\x84\x65\xa5\xf5\x6b\x3c\xae\x69\x87\x06\x4e\xf6\x7d\xc8\xc3\x3e\xe4\x61\x1f\xf2\x50\xbf\xf6\x21\x0f\xf5\x6b\x1f\xf2\xe0\xaf\x7d\xc8\xc3\x3e\xe4\x61\x1f\xf2\xb0\x0f\x79\xd8\x87\x3c\xd4\xaf\x7d\xc8\x03\x5e\xfb\x90\x87\x7d\xc8\x43\xc3\xf5\xeb\x08\x79\xa8\xae\x40\x6b\x5d\xab\x80\xbe\xa9\x9e\x45\xe9\x44\xbb\xa0\x02\x77\x32\x63\xd1\xb0\xae\x92\xda\x53\x6c\xf8\xb1\x6d\x66\x87\xc5\x8b\xab\x4b\xb4\xb7\xa6\xc4\x76\x14\x34\xdc\x37\xbb\xc6\x3d\x07\x8a\x06\xf5\x1c\xed\x25\x64\xc1\xc2\x77\xc5\xc6\x1d\x0d\x7c\x57\x6c\x4c\x0a\x36\x66\x05\x13\x09\x73\x13\x13\xdb\xf5\xac\xdb\xd7\x1b\xfe\x1e\xc0\x87\xb7\x3c\x50\xa0\x71\x08\x46\xd8\xb7\xc1\x01\x6e\x3f\xda\x31\x2c\x75\x48\xac\x3d\xd2\xc0\x8f\x2f\xa9\x9e\xb6\xea\xc1\xc1\x85\x9d\x36\xb0\xde\x83\x3f\x25\xe7\x2c\x61\x51\x2c\x02\xc8\x71\x8c\xa6\xf6\xa6\x11\x7c\x0a\x66\x7f\xeb\xa3\xc4\x61\x7d\x16\x55\xac\x82\x11\x9a\x08\x35\x84\x98\xa7\xe4\xff\x5c\xbf\x7f\x77\xfc\x9d\xb4\xb2\x82\xd1\x66\x94\xad\x74\x32\x63\x42\xf7\x89\x2a\x93\x29\xa1\xca\x74\xcd\xe8\xb7\xd7\x60\x96\x70\x75\xee\x87\xb6\x35\x56\xa8\x1f\xbf\xfa\x69\x18\x9b\x43\xb8\x75\x6c\x38\x8f\xbe\xdd\x00\x70\x36\xcc\x60\xfc\xbb\x20\xb4\x42\x97\x72\x99\xda\x4e\xdf\x43\x67\x35\xbd\x65\x44\xda\xce\x96\x0c\x98\xc2\x2b\xd2\x33\xdb\x24\xf8\xf4\x3f\xcc\xc1\xfa\x67\x8f\x1c\xde\x4f\x59\xc1\x48\xcf\xfc\xd9\xc3\x0f\xfa\x00\x0c\x73\x2f\xe0\xf8\xf6\xc3\x28\xdf\x17\x7c\x32\x01\x71\x0b\xa2\x09\xee\x98\xd0\x47\xc0\xdf\xc6\x44\xc8\xe0\x61\x61\xed\xd4\x95\x75\xba\xde\x91\x1f\xbf\xfa\xa9\x47\x0e\xe3\x71\x19\x11\x94\x7d\x26\x5f\x79\x8b\x74\x2e\xd3\x23\xa7\xb5\xce\x85\xa6\x9f\x41\x31\x98\x4a\xc5\x04\x5a\xfe\xb5\xc4\xd4\x25\x25\x8d\xf2\xc9\xb2\x6c\x80\x02\x66\x4a\xee\xd1\x40\xe7\xa6\x12\x9d\x3a\x39\x2d\x74\x2d\x3c\xe5\xe6\xfd\xd9\xfb\x57\xf8\x35\xb3\x6c\x13\xe1\xb4\xdc\x31\x17\x34\xb3\xde\x07\x2f\x1f\x9a\x8e\x94\xb8\x48\x5a\x5a\xd5\xd6\x79\x46\xc6\xa5\x2e\x0b\x36\xac\x87\x2b\xb4\xde\xf1\x4d\xb1\x22\xcd\x9b\x1d\x62\x46\xea\x07\xed\x09\x23\x32\x5a\x0f\x51\x2c\xf1\x78\x2c\x0e\xf1\x5d\xb0\x07\x57\x0e\xb1\x22\xcd\x66\x94\xa9\x4c\x94\x19\x60\xc2\x72\xad\x8e\xe5\x9d\x21\x9d\xec\xfe\xf8\x5e\x16\xb7\x5c\x4c\x06\x66\x93\x0d\x70\xe5\xd5\x31\xb0\x98\xe3\xdf\xc1\xff\xb6\x1a\x11\xf0\xa9\xf6\xc3\xc2\xc0\xb0\x47\x18\x1b\xb0\xcf\xe3\x8d\x87\xe6\xe4\xcb\x2e\x9c\xe0\xe0\xda\x29\x7f\xb5\xb7\xcd\x71\x41\x87\x94\x8d\x18\x0b\x28\xdc\x8c\xa6\x48\x02\xa9\x98\x3f\xf8\x36\x36\x13\x08\x3a\x7e\x32\x1f\xd8\x90\xce\x01\x15\xe9\xc0\xcb\xd7\xc9\x7c\xe3\x19\x2b\x79\xcb\x03\xfc\xe1\xe2\xec\x71\x36\x77\xc9\x3b\x9d\xd6\x5d\x05\xe4\x92\x28\x88\x93\x66\xf9\x94\xee\x0a\x17\x7d\x1f\xca\x09\xd7\x3e\x94\x73\x1f\xca\xb9\x0f\xe5\xac\xae\x7d\x28\xe7\x3e\x94\xb3\xf1\xda\x87\x72\x92\x7d\x28\x67\x7c\xed\x43\x39\x97\x0f\x74\x1f\xca\x19\x4c\xef\x3e\x94\x73\x1f\xca\xb9\x0f\xe5\xdc\x87\x72\x3e\xc7\x50\xce\xdf\x76\x70\xe6\xde\x39\xf6\xeb\x70\x8e\xed\xdd\x5d\x7b\x77\xd7\xde\xdd\xb5\x77\x77\x6d\xb0\xe3\xf7\xee\xae\xbd\xbb\x6b\xef\xee\xda\xbb\xbb\x9e\xa9\xbb\xab\x53\x05\xe0\x5f\x35\x00\xcd\xe3\x63\xcf\xc0\xad\x45\xd8\x99\xa5\x88\x33\x16\x6c\x66\x01\x51\xa6\x02\x93\x39\xc5\x2a\xa6\x0f\x8f\x24\x13\x1b\x00\x5d\xf1\xd4\x0e\x05\x93\xf7\x0e\xbd\xbd\x43\x6f\xef\xd0\x5b\x77\x4a\x3a\x38\xf4\xc0\x97\x17\x1e\x05\xab\x8e\x54\x29\x1c\xef\x9b\x5d\x1b\xcb\x3f\xdd\xde\xb4\x62\xad\x2a\xe1\xe7\x5d\x2e\x4a\x54\x51\xdd\x93\x0f\x73\x52\xcc\x82\x26\x72\x96\x4b\x61\x36\xc6\x6e\x9c\x8b\x55\x7b\x2d\xb2\x59\xdd\xa3\xf6\xfe\x88\x85\xc1\xe4\xd6\xb3\x35\xcb\xa5\x62\x91\x1d\x77\x03\xc5\x7b\xb5\x6b\x6a\x80\x4e\x1f\x67\x42\xdb\x40\x71\x8f\xde\x6f\x25\x8b\xbc\x09\xdf\xb0\xae\x49\xf0\x3c\xfd\x52\xb2\x02\x4b\x5c\x57\x0e\x9c\x6a\x52\x9c\xc9\x15\x5d\x52\xd1\xb4\x1c\xac\x58\xcc\x96\xd3\xd4\x66\xa8\xa4\x83\x3f\x76\x61\xd4\x8f\xea\x93\x25\xad\xfd\x27\x2d\xbc\x27\xcf\xdb\x3f\x4b\xda\xfa\x68\x49\x4b\x3f\x2d\x69\xe1\xab\x25\xed\xfc\xb5\xa4\xb5\xcf\x96\xb4\xf1\xdb\x92\x07\xf6\xdd\x92\xf6\x4e\x4d\xd2\xda\x87\xbb\xd0\xe9\x67\xe7\xc7\xed\x38\xec\x36\xfe\xdc\x85\x41\xef\x7d\xba\xb5\xa9\x5e\xef\xd7\x25\x6d\x7d\xbb\xa4\x7d\x7a\xd2\x5a\x1f\x2f\xd9\xfb\x79\xbb\xf1\x97\xb5\x44\xb7\x9b\xbf\xb7\xd5\x5a\x16\x6c\xdc\xce\x49\x7f\xc5\xc6\x38\x98\x40\x9c\xa8\x1c\x1d\x72\xa9\x0c\x51\x49\x1d\x7d\x4b\x45\x59\x8a\xe6\xe2\x48\x76\x79\x9c\x88\xa8\x2b\x9e\x4c\xaf\x42\xe3\x15\x0d\x6c\x59\x40\x23\x5d\x6f\xfb\x84\x89\x82\x27\x53\xd7\x59\x23\xe4\x5a\xcf\xda\x6a\x40\x94\xb0\xdb\x6b\x16\xb4\x1d\x3b\x5b\xef\xcd\x69\x18\xe8\x06\x3e\x9d\xb0\xe3\x6b\x89\xf7\x6a\xb4\x99\x25\x9d\x0a\xd0\x40\x6a\x19\xf8\x56\x0f\x8f\xb2\xd4\xfd\x0e\x7a\xc4\xd0\x96\xe6\xee\x56\xbd\x0d\x3b\x4b\x5d\x82\xea\x22\x9e\x8b\xa8\x3a\x6f\x1d\xb2\x2b\x72\xed\xc3\x61\xb4\x10\xbb\xda\x0b\x5e\x6b\xf1\x40\xc2\x07\x97\x22\x83\x54\x57\x7b\xe9\xab\x1b\x5a\x48\x75\x2d\xf8\xc1\xb7\x41\x07\xd9\x15\xa7\xab\xae\xb6\x30\x1d\xf1\x34\xa0\x13\x7e\xa7\x53\x70\x4f\x21\xda\x64\xb4\x10\x83\xf0\x24\x83\x5c\x8b\x4a\xb2\x64\x74\x27\xdb\x82\x92\xec\x7a\xf0\xeb\x80\x28\x96\x8c\xe3\xa6\x1b\xba\xc4\xae\x7b\xbd\x0e\xff\x60\x49\xaf\xaf\x77\x8a\x84\xb0\x61\xdf\x57\x83\x12\x2c\xe9\xf9\x4d\x1d\x9e\x60\x87\xdd\x5a\x1b\xb7\xd0\xd0\x9f\x7d\xf4\xc2\x3e\x7a\xe1\x99\x47\x2f\x74\x3a\x03\xab\x22\x19\x9a\xb6\xff\x73\x8d\x67\xe8\x34\xe8\x55\xb1\x0d\x4d\x83\x7e\x26\x11\x0e\x9d\xc7\xb8\x32\xda\x61\xd9\x40\x9f\x49\xcc\x43\xa7\xc1\xb6\x8c\x7f\x68\x1a\xf2\x6f\x39\x0a\xa2\xd3\x1c\xae\x88\x88\x68\x9a\xb7\x67\x11\x17\xb1\x74\x80\xff\xd2\xd5\x79\x54\x39\xf2\x2b\xf5\x78\x01\x12\xd7\xc1\x57\x6b\x41\x12\xe1\x4f\x0b\x81\x12\x51\x6f\x31\x58\xa2\xa1\x32\x8f\x2a\x47\xe1\xbf\xeb\x51\x15\x2a\xfe\x78\x9b\x32\x3d\xa1\x7d\x0d\x62\x02\x4e\x65\x56\xce\x42\x1b\xc7\x60\x51\xf4\xcf\x69\x72\x6b\xb4\x16\xfb\xbd\x11\x78\xd6\x82\xcd\xf9\x37\x25\x05\x48\x94\x64\x08\x62\x88\x99\xc1\xe0\x67\x5c\x9f\x4b\x6c\xe4\x8b\x95\x3b\xb8\xf1\xf3\x09\xd5\x34\x93\x13\x62\xbd\xf5\x4e\x03\xa9\x84\x9f\x7c\xa1\xe9\x7a\x8f\xf0\xd5\x85\x3e\x5d\xd7\x6f\xb7\xee\xd2\x94\x0a\xc1\x32\x43\x0b\xd0\xa3\x0f\xd2\x9d\x9f\x9f\xd5\xd3\x63\x5f\x5e\xe8\xcd\xe9\xc2\xfd\x86\xee\x44\x29\xfa\xdb\xc6\xc8\x84\x5b\x94\xdc\x32\x96\xab\xc0\x59\x52\x82\x4f\x05\x72\x41\x46\x73\xa3\xde\x25\xb7\x00\x37\x0a\x52\x19\x8c\xf7\x14\x17\x66\xc7\x09\xf4\xb0\xd9\x73\x96\x04\xb7\xf6\x21\x38\xfb\x10\x9c\x7d\x08\xce\xba\x33\xd6\x22\x04\x27\x3c\xf0\x51\x18\x0e\x15\xe4\x24\xcf\x33\x30\x4a\x39\x68\x58\x8b\x39\x68\x01\x37\x16\x2c\x71\x1b\xa6\x17\xd5\x98\x83\xbb\xbd\x40\xa1\xe3\x1f\x3c\x53\xab\x3d\xb1\x32\xc2\x06\xe9\x69\x93\x7c\xb7\x52\x3a\x4c\xa4\x18\xf3\xc9\xfa\xbc\x98\x60\x2e\x4f\xe1\x95\xca\x63\x86\x4d\x94\x16\xd9\xb6\xe2\x54\x90\xbe\x15\xf1\xed\x07\x48\x8e\x61\xe2\xae\x95\xbf\xeb\x5c\xdc\xc5\x61\x25\x4c\xdc\xf1\x42\x0a\x70\x2b\xde\xd1\x82\xd3\x51\x66\x19\x1b\xd3\x4e\x0d\xf7\x26\x85\xa6\x23\xf5\x28\x1e\xae\x73\x71\xf7\x91\xc6\xf1\x00\xa2\xb1\xeb\xc4\xb9\x34\xc0\xa0\x73\xea\x3b\xbe\x9d\x4b\xab\x5d\xf2\x7e\xe3\x2e\x77\x57\x3b\x37\x43\x47\x7d\x3d\x54\xd7\x9b\x66\x63\x48\xde\x5a\x87\x3d\x25\xa7\x7f\xbd\x38\x3b\x7f\x77\x73\xf1\xfa\xe2\xfc\x6a\x77\x59\xeb\x5d\x14\xa9\x8f\x6e\x8d\x02\x17\xeb\xbf\x1d\x7e\x3c\xb9\xfa\xeb\xbb\x93\xb7\xe7\x47\xe0\x86\x65\x9f\x73\x0a\x95\x0c\x2a\xc8\xf2\xbc\x60\x77\x5c\xfa\xf8\xbd\x74\xc9\x96\xad\xef\x55\x1b\x3f\x34\xf7\xa9\x6a\x8d\xaf\x41\x38\x04\xad\xb6\x4f\xe2\xf7\xb7\x61\x53\xd9\x1d\x4b\xfb\xa1\xe6\x97\x78\xd3\x14\x17\x79\xa9\x1d\xbb\xf3\x39\xbf\xc2\xc3\xb1\x1b\x89\x31\x1c\x9c\x35\xb6\x59\xfa\xca\x54\x42\x73\xe7\x84\xa5\x24\x95\xa5\xf9\xf8\xbf\xfd\x5b\x9f\x70\xf6\x8a\xfc\x5b\xf0\xe2\x90\x9c\xdb\x67\x83\x59\x83\xef\x09\x76\xc7\x0a\x68\xcc\xce\x59\x9f\x14\x6c\x42\x8b\x34\x63\x0a\x2c\xe0\x31\x1a\xb3\x1d\x20\xf3\xa1\x1e\x42\xea\x21\x39\x63\x63\x5a\x66\xc0\x2f\x49\xaf\xb7\x1b\x4b\x1b\x6c\x8c\xd7\x85\x5c\x89\x0f\x5c\x27\xac\xb1\x9c\xdf\xb4\x56\x07\x36\x42\x2c\x22\x42\x8a\xa5\x84\xdb\xe0\x1f\x67\x66\x5c\x83\x09\x4d\xba\xf8\x25\xdb\x7b\x07\x91\xfc\x63\xa9\x88\x25\x29\x96\xab\xc6\x6f\x41\x64\x20\xcc\x09\xab\x67\x9c\xba\x06\xdb\x06\xcc\xb4\x72\xb3\x76\x71\xb4\xb6\x8b\x72\xeb\xe6\x42\x6d\x19\xc4\x46\x9a\xdc\x51\x10\xbb\xe6\xc2\x3b\xdb\xb8\x47\x3a\xbb\x09\xd7\xd3\xdf\xc6\xce\x3d\xb6\xdd\xd4\x9a\xd8\x4f\xd2\xd4\xd6\xfa\xb0\x18\xd1\x58\xf2\x63\x18\xe8\x48\x7d\x90\xde\xfb\xa4\xe4\xe9\x5f\x56\x1f\xee\x0d\x67\x4c\xe6\x68\x5a\xd8\x60\xd6\xd0\x20\x39\x8f\xe8\x94\xdf\xf4\xe0\x02\xd1\x0a\xd6\xdc\x45\x9d\x59\x06\xd0\x61\x18\xcb\xc0\x08\xe2\x0b\xa6\xad\xfb\x99\x3d\xa8\x0e\x2d\xba\x32\xec\x06\xc8\x65\xfa\x8a\xa8\x32\xcf\x65\xa1\x95\x17\xe8\xc1\x42\xd2\x8f\xff\x04\xe9\xb6\x4f\x7e\xf6\x37\x21\x46\x53\xfd\x78\x70\xf0\xa7\xef\xcf\xff\xfb\xcf\x07\x07\x3f\xfd\x1c\xfe\x1a\xd8\xd3\xe2\x47\xd0\x02\x23\x53\x10\x99\xed\x9f\x8b\xd0\x17\x7d\x6b\xef\x1b\x4e\xa5\xd2\x17\x97\xfe\xcf\x5c\xa6\xf5\xbf\xd4\x1a\x4e\x40\x1e\x96\xe8\x78\x7f\xe5\x8e\x49\x4f\xdb\xa0\x23\x77\x45\xcb\xfd\x31\x0e\x3c\xb2\xe6\x03\xf3\xcf\xd7\xae\xbb\x86\x03\xdd\x17\x5c\x6b\x06\xe0\xf2\x9a\x15\x33\xc3\x89\xfb\x66\xe7\x56\x6c\xf6\xee\x65\xef\x41\x88\x57\x4b\x2f\x6f\xe3\xe0\xa0\xf7\x76\x64\xb8\x99\xab\x38\x7a\x2b\xf1\x54\x1a\x4d\x10\x86\xb5\xf3\x81\x38\xeb\xc0\xeb\xad\xcf\xa4\xb7\x33\xd4\xfd\xae\xaf\xd0\xd1\x19\x22\xf3\x83\xed\xc0\x08\x8c\xde\x7e\x70\x88\x37\x87\x49\x5e\xf6\xed\x03\xc3\x19\x9b\xc9\x62\xee\xff\x64\xf9\x94\xcd\x58\x41\xb3\x81\xb5\xb8\xf7\xfd\xeb\xf8\x9a\xff\x0b\x5f\x8c\x3e\xb0\xf8\x36\x0a\xc0\x55\x41\x15\x4b\x41\x58\xfa\xb4\x67\xd1\x4d\xd3\x8e\x8f\xa2\x5f\x8d\x65\xa0\x3c\x8b\x57\xbc\xd0\xa7\x91\x67\xfc\x95\x1f\x15\xc8\x90\x77\x32\x2b\x67\x4c\xf5\x3d\x7b\x82\xbb\x4c\xdc\x19\x69\x72\x8d\x93\xc5\x5d\x1d\x4f\x5f\xca\xef\xb8\x6a\x13\xea\xbe\x30\x14\xeb\x98\x73\x99\x49\xa5\x36\x9a\x05\x06\x2c\x79\xe5\xee\x73\x2e\x15\xe8\x00\x3e\xea\x34\x22\x29\x2f\x57\xd5\xd0\xa8\xae\xa0\xac\xc2\xa7\x7f\xff\x9f\x01\x94\x46\x78\x31\xf8\x5f\x3f\xfd\xfb\xe1\xa7\x21\xfc\xe3\xcb\xa3\xbf\x1c\xfd\x8f\xfb\xe3\xdf\x8f\x8e\x0e\x0f\x7f\xfc\xfe\xed\x77\x37\x97\xe7\x3f\xf1\xa3\xff\xf9\x51\x94\xb3\x5b\xfc\xeb\x7f\x0e\x7f\x64\xe7\x3f\xb5\x6c\xe4\x68\x79\x95\x93\xf8\xa2\x62\xfe\xbe\xc5\x81\xc7\x6b\xd0\xb2\x9c\x4f\xf3\x5b\xad\x97\xb5\x56\x58\x80\x0b\x3d\x90\xc5\x00\x5f\x8f\x3c\x6c\xab\x2e\xb7\x6c\x9b\xec\xf3\x2b\x77\x5a\x03\xc3\xa9\x23\xcd\x3b\xdf\xc8\x8a\x25\x05\xd3\xbb\xd2\x60\xb0\x35\xc7\x3f\x72\x99\x1e\x04\x48\xbd\x7b\xa5\xa6\x52\x6a\x9c\x48\x81\xf3\x55\x71\xde\x71\x21\x67\x43\x12\x18\x71\x30\x68\xca\x3e\x77\xcb\xd6\x68\xb9\xee\xda\x2b\x41\xbf\x2e\x25\xe8\x1a\xd7\xf7\xc1\x35\x20\x26\xee\x56\x99\x69\xea\x16\x58\xf3\x6c\x6c\x3c\xf6\xd9\xa8\x92\xe4\x32\x2f\x33\xaa\x97\x98\xd9\x1a\x2c\xc9\x76\xef\x57\x66\x3d\x1f\x86\x67\xa9\xdc\xac\xd9\x74\x49\x4e\xb2\x8c\x70\x81\x27\x01\x1a\x70\xd6\xb7\x82\xa1\xbc\x64\xcb\x9e\x42\x28\x5d\x55\xeb\xb0\x32\x0c\x42\x50\x22\x2d\x34\x94\x15\xfb\xc1\xfc\x8e\x34\xcb\x9a\xc6\xb8\x40\xa4\xf2\x3c\x63\xc4\x73\x5b\x9f\x28\x43\xa8\x52\x32\xe1\xd4\xe7\x7b\x78\xe8\x32\xdb\x6d\xe8\x0d\x44\x0e\xe6\x05\x4b\x58\xca\x44\xc2\x20\x2b\xad\x64\xd5\x58\x47\x46\x18\x04\x63\xbc\xb3\x00\x96\xe8\x88\x41\x7a\xd0\xdc\xc6\xc5\x6c\x56\xae\xac\xcb\xb8\x73\x9b\xbb\x59\x71\x6b\x99\xab\xa5\x36\x54\xa2\xb5\x4f\x9c\xf1\xaa\xfb\xf2\xc0\xfc\x1d\xe6\x8f\x78\x73\xdb\x5a\x4e\xb5\x40\x71\x2b\x1b\x43\x4c\x69\x1f\xdb\x62\xd8\x8e\xce\xfe\x26\x69\x6c\xa7\x1c\xd2\xb6\xb4\xb5\x83\x71\xa9\x2b\x3d\x6d\x6b\x4d\xca\x0b\x36\xe6\x9f\xbb\x64\x34\x89\x4a\x45\x09\xaa\x3c\x1a\x82\x5a\xb0\x9c\x09\xd0\xc3\x19\x4d\xa6\x98\xc9\x2b\xe2\x71\x3c\xa8\x7f\x07\xa5\x8c\xee\xc7\xeb\xba\x49\x8a\xd9\x9f\xad\xdf\xf8\xd9\xb2\xab\xbe\xfb\x83\x25\x64\xca\x3a\x81\x47\x1c\xbc\x0b\xde\xa8\x01\x0e\x60\x9c\xab\xeb\xa4\xd1\xde\xbc\xcb\x29\x97\x70\xd6\xc6\x5c\x63\xc8\x3f\x54\x5a\xac\x90\x63\x83\x37\x21\xf5\xd6\x3e\x71\x00\xa9\x30\x90\xb4\x5b\x6b\x68\x84\x26\xc2\xb4\xcc\x58\x4a\x5c\x78\x05\x36\xda\x71\x4b\x45\x81\x05\xc7\x54\x29\x3e\x11\x83\x5c\xa6\x03\xd3\xda\x1a\x28\xb5\xc7\x02\x5a\x26\x81\x96\xdb\x2e\xf3\xf6\xe0\xca\xdb\xdf\x02\xd9\x22\x91\xb3\xbc\xd4\x2c\x30\xce\x79\xbb\xce\x68\x8e\x71\x40\x81\x0c\x59\x49\x44\xdb\xcd\x29\x16\xa1\x19\xd8\x8f\x0f\xfc\xc7\x07\xfe\x5b\xdb\x4c\x73\x1b\xaa\x85\x26\xc5\xd6\x39\xe7\x07\x6f\xd0\x64\x59\x41\xc3\x60\x0a\xf9\x67\x3e\x2b\x67\x84\xce\x10\x93\x75\xdc\x30\x9d\x34\xcb\xe4\x3d\x4b\x77\x33\x61\x0d\x13\xb5\x3a\xce\xfd\xc1\x32\xc2\x9f\xa9\x65\xab\x95\x45\xab\x9b\x25\xab\x83\x05\x6b\x63\xcb\x95\x33\x52\xb7\xdf\x8f\x57\xce\x6e\x5e\xdb\x91\x58\x25\x7b\xe5\x8e\x74\x07\x1c\x42\x31\x7c\x3b\x5c\x11\x39\xe3\x5a\xfb\x00\x2a\xbf\xc3\xfa\x84\xeb\xc8\xfa\x69\xcf\x02\xaf\xea\xdf\x3b\x8c\xf0\x6c\x5e\x79\x2d\xfa\xc8\x65\xef\xb9\x62\x16\x4d\x81\xcf\x72\xc4\x53\x80\x3d\xed\xd3\x9c\x6c\x90\xc1\xfe\x7c\xec\xcf\x47\xd3\x4b\xab\x0a\x04\x91\xa5\x45\x82\x22\x0c\x1e\x2f\x8e\x98\x9d\x9d\xcb\x54\x59\x79\xc1\xed\x21\x73\x16\x00\x81\x85\x8b\x09\xb9\x62\x60\x19\xb8\x66\x5a\x59\x88\x0f\x78\x83\x16\xac\x02\x9e\x70\xac\xd1\x59\x42\xc0\x8f\x00\x21\x9e\xe3\x71\xfc\x04\x56\x23\x98\x81\x64\x7b\xa1\x43\x79\xc6\x8b\x2e\x6c\x96\x67\x54\x33\x2f\xd8\x6c\x51\xc9\x61\x0f\x97\xb5\x7e\x18\x7b\xb8\xac\xea\x99\x3d\x5c\xd6\x1e\x2e\xab\xe5\xa0\xf7\x70\x59\xb5\xa9\xde\xc3\x65\xed\xe1\xb2\x36\x5d\x4b\x2d\x33\x56\xd0\x95\xc0\x47\xb1\x99\xaf\x7a\x1e\x86\x56\xb9\x77\x83\x96\x1e\xc7\x4b\x71\xe3\xc4\x16\x73\xb6\xaa\x7e\xc1\xd6\xd2\x9a\x02\xd4\x95\x96\xae\x5f\x90\xf5\x32\x27\x66\xcd\x34\xd2\x75\xd8\x18\x96\x43\xea\x02\x9c\x3e\x7f\xf2\xbb\xad\xcf\x40\x7e\xfa\x73\x10\x8d\x0e\xcf\x9b\x3f\xfc\x0e\xf9\x93\xfb\xd7\x9f\x1f\x05\x38\x0b\xbb\xd4\x41\xc0\x38\x87\x17\x1c\xfc\x8c\x1b\x2a\xcc\x00\xb6\x65\xe6\x07\x86\x35\x24\xe7\x86\x50\x91\x19\xa3\x42\x39\x33\x17\x78\xa2\xaa\x87\x95\x75\x99\x05\x7a\x95\x35\x29\x54\x27\x83\x91\x77\xf2\xda\xda\xbe\xfa\xe4\x12\x6c\xa9\xd5\x1d\x38\x49\xef\xe4\xf9\x67\x96\x94\xeb\x10\xa4\xda\x62\x3b\x74\xaa\x67\xf8\x7d\xc5\xe4\x71\x64\x11\x93\xaf\x76\x70\xc8\xe6\x57\xce\xcc\x2d\x9b\x57\xcc\xc6\x8a\x10\x40\xf2\xfb\xd5\x2e\x71\xac\x00\x79\xc7\xff\x76\xa6\xac\xd9\x88\x0b\xfc\x18\x36\xed\x96\x02\x5a\x77\x13\x6a\x24\xbb\x2c\xc3\xcf\xec\x62\xba\x36\x28\xad\xd8\x8c\xac\xde\x2c\x63\x78\x2a\xd9\x2c\x5d\x04\x22\xc5\xf9\x2f\x25\xcd\xe2\x24\x04\x7b\xcb\x3e\xb4\x40\xd5\xef\x79\x96\x26\xb4\xb0\x51\x5e\x98\x54\xa9\x24\xae\x1e\x00\xb8\x40\x86\x85\x3b\xed\xd5\x1a\x21\x82\x19\xa0\x95\xf0\xa4\xcc\x68\xe1\xf2\xbc\x5b\x25\x0a\xac\x9d\xd1\x6a\xd3\x5c\xb3\x44\x8a\xb4\x8b\x02\x70\x53\x7f\xb7\xee\x6b\xcd\x59\xc1\x25\x46\x17\x3b\xd0\xac\x60\x93\x1e\xc6\x36\x6d\x39\x76\xa7\xda\x1f\xb1\xc8\xf2\x11\x01\xaf\xd8\x5a\x68\x47\x01\x79\xf4\xa7\x62\x48\xbe\x9d\x3b\x33\x4b\xdf\x16\x53\x13\x52\x63\x41\x35\xfb\x4d\xbb\x65\xed\x64\x57\x07\x6a\x2c\x0b\x48\x4e\x39\x4c\x25\x66\x64\xdc\xf1\x44\x1f\x0d\xc9\xff\x63\x85\x84\x85\x17\x6c\x42\x35\xbf\xf3\xdc\xd4\x2b\xae\x05\xa3\xd6\x83\xff\x82\x1c\xc2\x6b\x84\xcf\x66\x2c\xe5\x54\xb3\x6c\x7e\x84\x7a\x2c\x23\x6a\xae\x34\x9b\xb5\x59\xba\x36\x46\x03\x07\x0e\xc6\x85\xfe\xe6\xeb\x15\x4f\x76\xcd\x78\xfa\xe8\xb2\x52\xaa\x99\xc1\x18\x82\xda\x12\x7a\x1e\x24\x57\x88\x9b\x61\x0c\x82\x4d\x43\x76\x92\x65\xb8\xc0\x7f\x33\xfb\x80\x92\x82\x01\x5e\x80\xdd\xb9\x5b\xee\x71\x8c\xa6\x7c\x2b\xcb\x25\xc0\xe5\x0b\x03\x7f\x63\x95\xf0\x8f\xc1\x8b\x4b\x73\x0a\x1f\x45\x4c\x08\x7a\x12\x98\x28\x29\x01\xbb\x24\xb0\x73\x43\x1e\xf0\xa9\x2a\x12\x65\x6d\x27\x77\x9a\x3f\x08\x7d\x59\x13\xf5\xbe\x93\x2c\x43\xff\xa1\x0e\x7b\x19\x02\xc4\xed\xc4\xd4\xf2\xec\xb4\x87\x8f\x61\x76\xab\x04\x1b\x14\xbe\xc5\x52\x17\xc5\x66\xa8\x81\xc3\x00\x3b\x78\x75\xb0\x13\xe2\x8b\xc3\x29\x64\x4e\x27\x70\x9e\x3a\x8c\xaa\xfe\x2a\x49\x99\x66\xc5\x0c\xd2\xa3\xa7\xf2\x1e\x7f\x47\xb6\x95\xdb\xa7\x1c\x3c\xa3\x19\xed\x54\x2a\x44\xad\x8a\x92\x0e\xe1\xfc\x82\x63\xf4\x9e\xce\x09\x2d\x64\x29\x52\x2b\x35\x79\x02\xfa\xb6\xf6\xe1\x77\x52\x00\xa5\x28\x15\x26\x0f\x86\x54\x7a\xc4\x34\x35\xc7\xe6\xe5\xf0\xe5\x8b\x9d\x4c\x58\xc7\x2c\x53\xe8\x4d\xcd\x52\xe8\x7c\xe5\xee\xcc\xec\xa4\x5f\x05\xa3\xe9\x7b\x91\x75\x91\xe5\xde\xe2\xf6\x82\x57\x07\xa0\x84\xf1\x31\xd8\x6e\xfb\x78\xeb\xbe\xe0\x9a\x05\xe4\xf1\x10\x2a\x06\x19\xd5\xbd\x14\x5e\x84\x3d\x8a\x45\x10\x78\xa4\xcd\x80\xd6\xc7\x83\xa8\x72\xb4\xe5\x39\xb3\x07\x0a\xb6\x5c\x75\xcc\xfc\x86\x3b\x50\x2b\x8e\x5c\x9c\xdc\x49\x0e\xf1\x49\x23\xb1\x49\xa9\x8f\x76\x13\x24\x82\x03\x34\x9a\x75\x17\x95\xc4\x65\xf9\xe6\x3b\x1c\xed\xb7\x6c\x4a\xef\x98\x22\x8a\xcf\x78\x46\x0b\x84\xb2\xbb\xc6\xfe\x91\x51\xa9\x9b\xf3\xc5\xbb\xe5\x22\x87\x3d\x09\x9a\x5b\x3b\xd5\xae\x1f\x66\x9e\x80\x46\xb8\x7e\x99\xef\xcc\x4a\x5d\xd2\x2c\x9b\x13\xf6\x39\xc9\x4a\xc5\xef\xb6\x3d\x4d\x36\xfb\x61\x03\x56\x5d\xe7\xd2\xb9\x4c\xaf\x73\x96\x3c\x26\x8f\x8e\x35\x0c\x43\xaa\x52\xb7\xe8\x0e\xa4\xd1\x69\xee\x73\x88\x7c\x02\xcc\x48\x17\x53\x39\x0f\xe3\x3c\xfd\x18\x7e\x2d\xe9\xff\xf4\x5e\x9d\x67\x54\x69\x9e\x7c\x9b\xc9\xe4\xf6\x5a\xcb\xa2\x53\x86\xfd\xc9\x0f\xd7\x0b\xef\xd7\x40\x13\x4e\x7e\xb8\x26\x67\x5c\xdd\x86\x30\x2c\xe8\x34\x0d\xcd\x25\x94\xdc\x96\x23\x96\x31\x7d\x70\xa0\x90\xcb\xcd\x68\x32\xe5\x82\x39\x06\x27\x7c\x4a\x8a\x55\xf8\xcc\x2c\x77\xf5\x99\xda\xc4\xa7\x63\xbb\x5f\x7f\x47\xef\x15\xc3\xee\x8f\x4c\xf7\xcd\xcf\xac\x4d\x46\xfa\x4e\xfd\x14\xd8\x99\x8b\xb3\x1d\xf9\x20\xc6\xea\xa6\x15\x1a\x6c\xbc\x90\xaf\x79\xc6\x50\xc7\x81\x21\xba\xa8\x34\x7b\x0e\x60\xc5\xe6\xb2\x24\xf7\x14\xb5\x62\xa0\x81\x43\x72\xc3\xf3\x57\xe4\x5c\xa8\xb2\x60\x95\x3d\x63\x5c\x6b\x0a\xf0\x36\x6d\x66\x99\x53\xa7\x60\x85\x51\xe5\x00\xac\x56\xd4\xae\xc8\x39\x62\xa9\xaa\x57\xa4\xc7\x3e\xeb\xaf\x7b\x7d\xd2\xfb\x3c\x56\xe6\x7f\x42\x8f\x55\x6f\x48\x2e\x66\xde\xcf\x0e\x40\x3d\x05\x73\xa1\x4f\xf8\x82\x61\xc6\x01\x9f\x7d\x90\x0d\x62\xc3\xe8\x8c\xb4\x96\x4a\x72\x8f\x78\x11\x86\xc4\xb3\xa2\x90\x85\x8f\x3c\x0f\xa6\x01\xb8\x4b\x22\x67\x79\x21\x67\x3c\x30\xec\xc1\x06\xdf\x69\x7c\x1d\x98\x1b\xd6\x8b\xa4\x8b\xeb\x8f\x08\x6c\xf6\x65\x12\x33\xc7\x65\xab\x7f\x31\x76\x11\x13\x7d\x5b\x61\x0b\x58\x92\x05\xbc\xc5\x00\x8c\xd1\xdc\xb5\x62\xa8\x55\xb8\xc2\xaf\x7d\xd6\x1c\x39\x4e\xd9\xdd\xb1\x4a\xe9\xcb\x3e\x7c\x46\xd9\x68\x3f\x1d\xf5\x89\x2a\xd2\x7b\xd9\x1b\x92\x6b\xc7\x6d\xfb\x61\x1f\xab\xe7\xc6\xb2\xf0\x0d\x82\x31\xfd\x45\x8f\x1c\xca\x02\x5a\x4e\xa8\x20\x19\xa3\x77\xd6\x80\x8c\x67\x6a\x8e\x3a\xed\x51\xeb\xac\xc7\xb6\x09\x60\x81\x96\xff\xfb\xaf\xd6\x3c\xdd\x4e\x12\x5d\x5c\x37\x17\x19\xd9\x33\x22\x68\x0f\x84\x49\x69\x68\xac\xa1\x9a\x86\xad\x02\x08\x96\x6d\xbb\x1a\x30\x17\x0b\x9a\x32\x36\xb0\x72\x51\x7b\x20\xa7\xf6\x9e\x80\xea\x92\x8e\xf9\xf5\x8e\xa4\x76\x9d\xcd\x0f\x82\xff\x52\x32\x52\xe1\x6f\xe6\xac\x40\x24\x50\x4d\xd2\x88\x87\x71\x64\x6c\x87\x27\x33\xfa\x77\x29\xc8\xf9\xb7\xd7\xf6\xa3\x47\x4f\x3a\x3d\x6b\x89\x04\xfd\x7b\x59\x30\xc3\x8e\xbb\x04\x0c\xb8\x77\xea\x9c\xdd\xdc\x27\x67\x54\x53\x64\xf0\x36\xe4\x4a\x54\x14\xde\xec\xc2\x11\x17\xa9\xfd\x29\xe0\xdc\x8f\xcd\x64\xcd\xea\xbd\x5b\x25\x2f\x85\x0f\x7e\xb8\xba\xd8\x11\x33\x4e\x80\xc6\x4f\xde\xca\xb4\x33\x47\xfe\x2f\x33\x81\xa7\xf8\x3e\x99\x99\x06\x88\xd1\xd9\xfb\x70\x9c\x89\x39\xcf\xf6\x9f\x3f\x18\x8d\xb3\x35\xf1\x6a\xc5\x46\xdc\x6c\x75\xec\xf3\x4d\xa0\xa7\x03\xed\x30\x5b\x03\xce\x8d\x65\x28\xa3\x4c\x8e\x1c\x5a\xec\xae\xfb\xfb\xe1\xea\x62\x83\xee\x7e\xb8\xba\x78\xdc\xae\x6e\x24\x9e\xd5\xa5\xb3\x8a\x07\x57\xe9\x18\x75\xb1\xab\xbd\xcc\x35\xdc\x95\xb4\xb5\xcb\x79\x5a\x8f\x9e\xbe\x30\x4b\x07\xe7\x9f\x73\x0c\x3e\xb3\x46\xfe\xeb\x29\x85\x3c\x66\x9f\x5d\x07\x8b\x6a\x56\x59\x19\xca\xee\x96\xd7\x68\x74\x40\x9f\xc8\x19\x43\x97\x65\xfa\xca\x05\x02\xf8\x37\x9a\x5f\x78\x0b\x61\x97\xe9\x2b\xa4\xab\x04\xa3\x30\xd3\x60\x37\x1d\xa2\x89\x48\xf8\x9f\x6c\xb9\x1b\x9e\x71\x3d\x37\x1c\xfa\x68\x18\x85\x96\x2a\xe8\xf2\x4e\x0f\xf3\x86\xa2\xc5\x82\x81\x8a\x1c\x9a\x96\x8e\xc1\xc0\x75\x34\xac\xa4\x0a\x28\x42\x00\xfe\x14\x14\x3d\x22\x91\x43\x31\x0d\xbb\xad\x26\x71\xb4\xdd\x2a\xeb\xd9\x3d\x4c\xbc\x39\x1f\x5d\x19\x9a\x79\xa7\x91\xa1\xc1\x0f\xd7\x16\xc3\xed\x39\xf3\x34\xcc\x97\x6a\xc5\xd5\x60\x5b\xad\x7d\xb2\x3d\x5f\xfb\x6d\xef\x29\xe2\x93\xd1\x36\x60\x82\x61\xf5\x0d\x97\x5f\x1f\x85\x51\xe2\x2e\xbb\xb6\xa4\xc4\xc2\x25\x21\xdf\x34\x7b\xeb\xfb\x16\x50\x01\x5d\x00\x16\xdc\xca\x77\x4d\xb9\x9a\x42\x58\xc5\xfa\xcd\xd5\xbe\xd6\x19\xcb\xa7\xcb\x8b\xe4\x35\x74\xe1\x94\xe5\xd3\xd7\xd7\xb1\x79\xce\xdc\x23\xaf\xaf\x1b\xce\x25\x4c\x32\x8c\x56\xa1\xd1\xee\x40\x91\x8c\x8f\xd9\xda\xda\x4b\x0f\x70\x32\x67\x52\x70\x5f\xa0\x7e\xd9\xd5\xfe\xb4\xb9\xe6\xba\xf2\xc3\x0a\xc9\xe3\xad\x6d\x01\x03\xe0\x12\x99\x65\x2c\x71\xa8\xd3\x30\xa5\xee\x13\x4d\xca\x8b\xad\x70\x53\x61\xf2\xa3\xa2\x72\x8c\x0b\x7a\x7c\x75\x7e\x72\xf6\xf6\x7c\x38\x4b\x7f\x37\x95\xf7\x03\x2d\x07\xa5\x62\x03\xde\x02\x2a\xe4\xe9\xc2\x08\xf1\xca\x5b\x21\x57\xc5\x53\xfa\xde\x25\x30\x92\x0f\x0a\xc3\x06\xc0\x94\xe3\x9c\x42\x52\xea\x3e\x29\xa8\x4d\x52\xa4\xae\xa8\x4c\x96\xe1\x2c\xeb\x82\xb1\x7e\xa8\x52\xaf\xa9\xd1\xd1\x71\x40\x9b\x1a\x11\xaa\x41\x3d\x2c\x81\x7e\xfc\xcd\xd5\x85\xd6\xaf\x17\x22\x56\xcd\xdc\xb5\x6f\xc3\xc5\x5f\x80\xab\x49\x4b\x88\xcf\x82\x78\xdb\xb1\x2c\xcc\xae\x29\xe2\x1d\xc0\x74\x02\x83\x3d\x2e\x15\x2b\x86\x96\x63\x3c\xfa\x44\x75\x00\xeb\xd9\x00\x23\xad\x3e\x4d\x57\x6c\x4c\xa2\xca\x2f\x56\x8a\xa2\xa5\x9e\x32\xa1\x1d\x40\xb8\x9d\x8c\xc6\x79\xb3\x11\xce\x8f\x3e\x51\x2d\xe1\x81\xba\x81\xf9\xec\x01\x70\xba\x6c\x43\x73\x50\xb6\xa2\xdb\x3e\x3b\xaa\xa0\xa9\x84\x10\x08\xc4\x74\x8b\x36\x18\x4d\x67\x5c\x3c\xc3\x83\x98\x70\x91\xae\x1b\x7f\x0d\xb8\x0e\xde\x88\xe5\x28\x6c\xc5\x59\xcf\xbd\x27\x8e\x3a\xbd\x06\x53\xc8\xad\x4f\x2e\xf6\xc8\xb5\x3a\x74\xb3\xb9\xfa\x25\x1b\xe0\x57\x06\x79\x5a\xcd\xca\xde\xbd\xb6\x7b\x03\xce\x23\x38\xcd\x76\xb4\xbe\xe4\x5f\x4f\xa0\xd9\x7a\xa6\xba\xc8\x30\x5b\xf1\x66\xa8\x71\xa2\x5c\xd2\x16\x22\x82\x61\xb1\x14\xab\xbb\x9a\x29\xc8\x69\x41\x67\x4c\xb3\x02\x43\xc7\x6c\x30\x9a\xb0\x51\xfd\xef\x73\x26\xae\x35\x4d\x6e\x77\x0d\x21\xba\xe7\xa7\x0f\xc7\x4f\x37\xf5\x96\xb9\x20\x99\xd4\xef\x04\x0b\x28\x34\x0f\x3d\xb3\x5c\x58\x66\xf3\x4c\xe8\x8a\xc7\xf1\xea\x62\x89\xf0\x38\x4e\x31\x13\xad\x70\xbd\xd0\xf8\x00\x21\x62\x1e\x98\x0e\x42\xdf\x71\x16\x76\xc3\xf4\xda\x1f\x02\x2b\xc7\x6c\xe2\x77\xaa\xe8\xc1\x4c\xa6\x8c\x8c\xb8\xae\x4e\xba\x62\x9a\xe4\xac\x98\x71\x9b\x00\x2d\x05\x56\xcc\x63\x29\x72\x2f\xc3\xa9\xec\xa7\x03\xce\x26\x88\x4c\xb4\x2b\x49\x45\x46\x4c\xdf\x33\x26\xc8\x8b\x17\x2f\x5e\x80\xbc\xf1\xe2\x0f\x7f\xf8\x03\x01\xc4\x85\x94\x25\x7c\xb6\xf8\x20\x3c\xf5\x1f\x2f\x5f\x0e\xc9\x7f\x9f\xbc\x7d\x03\xf1\x57\xb9\x56\x64\x24\xf5\xd4\xb6\x6c\x1e\x88\x5e\x56\x7d\x28\xf4\xeb\xc4\x04\x55\xfb\x15\x54\x0a\x3f\xbc\x38\x98\xee\xc5\x37\x5f\x7f\x3d\x24\x67\xbc\x80\xcc\x5b\x0e\xb9\x02\x3e\x5c\x30\x77\x21\x74\x42\xea\xc5\x5c\x77\xcb\x26\x6c\x38\xed\x8c\x4f\xa6\x1a\x6b\x1b\xc1\x4e\xc9\x78\xa2\x11\x7d\x0f\x0f\x3b\x62\x21\x29\x9b\x4a\x62\x13\xa3\x6c\xe0\x08\x74\xae\x0f\xf5\x7f\xc9\x58\x7d\x57\xc8\x32\xaf\x12\x02\x0b\xa6\x8c\x8c\x6a\x2b\x7b\x60\x63\xd5\x5a\x29\xa6\x9f\x34\x92\xa1\xa5\xa5\x26\xda\x74\x17\x91\x00\xd2\xf7\xf8\x63\x03\xdc\x09\x39\xe5\x3e\xb8\x0e\xdc\xcd\x11\xfa\xbd\xd7\x22\xd3\xe0\x9c\xba\xfc\x8e\xbc\x90\x7f\xc3\x45\xe2\xc2\x65\x0a\x59\x99\x57\x59\x99\xcb\x26\x66\xba\x72\xc7\x61\xe6\xba\xe1\x7b\x36\x2b\x3e\xc8\x31\xba\x18\x87\xc9\x68\x90\xba\xcd\x95\xf9\x44\x04\x0e\xd9\xf0\xe5\xb0\x98\xa0\x9e\x2a\x5c\xd1\x52\x2c\xbc\x6d\x6b\x8d\x58\x4a\x63\x2b\xc6\xd8\x34\xaf\xaa\x0d\x0c\x57\xb5\x49\x32\x41\x15\xa2\x08\xb0\x2d\x0a\x92\x51\x4c\x97\x76\x6a\x20\x56\xc9\x7c\x9b\x29\x65\x73\x6d\x66\xb4\xb8\x35\x62\xbf\x3d\xff\x43\x88\x0c\x56\x3e\xcf\x07\x93\xae\xee\x98\x2f\x29\x17\x46\xd6\x9b\x8f\x1c\x0c\x87\x07\x78\x40\x64\x81\x78\x97\xb8\xdb\xcd\xfd\x27\xca\x29\x8e\x23\xb7\x69\x1e\x14\x8c\xb3\xa5\x3d\x68\x14\x11\x4c\xed\x4c\xb5\xaf\x84\xde\x52\x7c\xe9\x86\x17\xdc\x16\x31\x18\x9f\xcc\xdb\x94\x2d\xe8\x2a\x41\x75\x00\x18\x5e\x5e\x37\xc5\x1e\x81\x76\x98\xc1\x9d\x31\x70\x09\x46\x45\x6c\xd2\xc7\xae\x4c\xce\x26\xb1\x45\xf5\xad\x9e\x3f\x57\xbb\x18\x63\xfa\x47\x4c\xab\x2c\x2d\x08\x24\x84\xaa\x9a\x54\x95\x0b\xf2\xac\x99\x57\xb8\x5d\xba\xa1\xb1\x77\x61\x64\x78\xb5\x73\x12\xe0\xb5\x70\x0e\x3c\xcd\xcc\xa3\x6a\x17\x19\x1a\x00\x40\x6e\x74\x87\x65\x48\xde\x5a\x9a\x8a\x9b\x8b\x8e\x94\xcc\x4a\x8d\xaf\x56\x3f\x86\x04\x17\x1a\x75\x90\x03\x40\x65\xfd\x63\x01\xf9\x05\xc6\x83\x34\xaf\x1d\x25\xc6\xab\xc3\x61\xdc\x43\x5f\x3e\x19\xac\x6c\x85\xd8\xad\x1e\x0c\x62\x36\x51\xbc\x8b\xaa\x74\x7d\x41\x0e\xab\x52\x19\xce\xcd\x7d\x21\x34\x2b\xc6\x34\x61\x47\xa1\x0a\xe5\x4b\x92\xf8\xc8\x1a\x97\x1b\x30\xa5\x22\xcd\x50\xb4\x4e\x58\x01\x5b\x9e\x7d\xb6\xa5\x6d\xcd\x27\xd2\x82\x43\xc9\xd6\xc3\x6f\x99\x91\x07\x19\xd5\x65\xc1\x5a\x65\x18\xed\x36\xac\x10\xba\xb1\x2b\xa5\x0d\x1a\xeb\x1a\x52\x01\x2f\x39\x09\x55\x04\xc7\xaa\x9a\x26\x9c\x55\x9c\x52\x15\xaa\xa5\x43\xb3\x95\x80\x1e\x03\xa9\x98\xcb\xb2\xb0\x76\x6f\x87\x2d\x9a\xc8\xc2\x28\x42\xd8\x30\x55\xa4\x60\x13\x23\xad\x16\x20\xd6\xe2\x13\x59\x69\x6e\xec\x34\xf8\x6b\xc7\x41\x72\xab\x42\xdc\xc6\x56\x7c\x96\x77\x3c\x75\x2c\x12\x7c\x4b\x55\x89\xbf\x9c\xaa\x20\xef\x24\x80\x63\x0f\x66\x18\x85\x71\x60\xa4\x3e\xa3\x33\x8a\x9f\x0e\xad\xbb\x12\x80\x1e\x5a\xd4\x52\xe8\x42\x84\x65\xca\x2e\xcb\x51\xc6\xd5\xf4\x7a\x43\x53\xe0\xbb\x86\x26\x30\x60\x60\xc1\x51\xb7\xd4\x3c\xa8\x98\x50\x1c\x58\x9e\x21\xe3\x86\xd9\x42\xa5\x5f\x09\x93\xe8\xde\x0e\x77\xa6\x84\xc4\x88\x8c\xd9\x74\x7e\xf3\x53\xd0\x0f\x9b\xa1\x85\x00\x1e\x29\xfb\x20\xf2\xe8\x7e\x42\xb3\x4c\xd5\xb3\x57\x1d\xa1\x45\x99\xc3\x65\x6d\xe1\x9a\x72\xb3\xdc\xbe\x4c\x48\x0d\x0a\x72\xe9\xc0\x14\x99\x49\xcc\x70\x11\x44\x0a\xf7\x10\xe0\x90\xb8\x17\x82\xac\x3e\xc8\xdd\x85\x2d\xb3\xe3\x3a\x8a\x7b\x1b\xe8\xc3\xd9\x40\x37\xf4\x34\x54\x95\x94\x68\x90\x11\x1c\x17\x66\x76\xa4\xd4\x91\xdc\x35\x2e\x89\x9d\x7a\x05\xf0\x9b\x27\x1a\x8b\x89\x77\xc6\x3c\xfb\x58\x7b\x1d\xd8\xb4\xd1\x3b\xe0\xf0\x0e\xac\x66\x91\x04\x3b\xd3\x2a\x04\xfe\x08\x2c\x1e\xf9\x8a\xe7\x00\xbb\xc1\x9b\x07\x8a\xa4\x32\x29\x3d\x36\x2a\x4c\x5a\xe5\x00\x6b\x83\x20\x48\xba\x1e\xa7\xee\xb0\x56\xe1\x47\xd6\xee\xaa\x54\xde\x8b\x7b\x5a\xa4\x27\x97\x6b\xe2\xd2\x63\x76\x5e\xbd\x15\x0a\x4a\xae\x31\xa8\x84\x47\x47\xb2\xd4\x15\x7c\xe6\x6f\xdb\xf4\xac\xa5\xa1\x08\x2d\x2d\xcd\x64\x6f\xbc\xde\x1b\xaf\xeb\xd7\x83\x1b\xaf\xcd\x3b\x31\x16\x6c\x74\x5c\x1d\xc4\x00\xcf\xda\x86\xd2\x3e\xa4\x15\x34\x20\x30\x48\xdd\xeb\x71\xf0\x35\xb9\x0d\x8f\x48\xb5\xb6\x81\xac\xe7\x28\x10\xb0\xea\xa7\xb7\x98\x3e\x90\x1d\xb4\x7d\xad\x5e\xbc\x96\x85\xe0\xae\xaa\xdd\x0b\x52\x43\x50\x6c\xb7\x6f\x91\x90\xfb\x56\xef\x12\x69\x55\xc6\x0e\x81\x98\x3b\x94\xea\xc4\xab\xe3\xe4\x93\xce\x0b\x40\x3a\x16\xd2\xc5\xab\xeb\x6a\x90\x0d\x8a\xea\xe2\xf5\xc4\xa5\x75\xf1\xea\x6c\xe2\x26\xdd\xcb\xec\x36\x0c\xf7\x61\x8b\xed\x6e\x38\xb4\xc7\xb7\xde\xf7\xab\x12\x6f\xcf\x9f\xad\xef\xad\xf7\x0b\xd7\x23\x5a\xef\x03\xc2\xed\x88\x81\x9d\x80\xd0\xa2\x1f\x9a\xdb\x9c\x59\x7f\xc4\x9c\x58\x39\xac\x10\xc8\xcc\x96\x73\x06\x7d\x59\xc4\x6e\xd3\x83\xe1\xf0\xe0\xc0\x99\xf9\xed\xfe\x2c\xf5\x78\xf0\x47\xc2\x44\x22\x53\x5c\x54\xd3\x7e\xa1\x34\x30\xfd\x4a\x3b\x0f\xfb\x32\x73\xdf\x0a\x5d\xaf\xd0\x76\xb7\x25\xe9\x70\x82\xbb\x97\xce\x6e\x9a\xe9\xc7\x28\xa0\x1d\x96\xc9\x8e\xab\x62\xe3\x13\xdb\x94\xc2\x0e\x27\xef\xc1\xf9\x6b\xeb\xe2\xd8\x78\x6d\xc2\x5e\x37\x28\x94\x8d\xd7\x23\x97\xcb\xc6\x6b\x23\x8e\xda\xa9\x74\x76\xc3\xe0\x1e\xaf\x80\x36\x5e\xcf\xb4\x98\x4a\x7c\x75\x2a\xa6\x8d\xd7\x66\x25\xb5\xe3\x77\x3b\x2e\xfd\x4e\xca\x6b\xe3\xd5\xad\xc8\x36\x5e\xbb\x2e\xb5\x8d\x57\xcb\x99\x00\x1b\xf8\x19\xef\x94\x3c\x70\x6e\xdf\x89\x23\x1f\x35\x9b\xe5\xb2\xa0\xc5\x9c\xa4\xd6\xd6\x30\x6f\x48\xc0\x0c\x32\x30\xb7\x46\x45\x81\xbe\xa7\xbc\xd8\x51\xfe\x40\x87\xe4\x4b\x96\xf2\x72\x69\xc9\xe2\x65\xd3\xf6\x03\xa0\x61\x59\x24\x2d\xe7\xdc\xc4\xa6\x3c\x94\x20\x4d\x6e\x6d\x8d\x1c\x37\x87\xc8\xe9\x43\xc8\x9d\x5e\x0d\xf9\x18\x8c\x61\xe0\xe9\xb3\xb5\x00\xdd\xc3\xd8\x76\x64\xb8\x42\x97\x87\xf5\xfd\x1f\xda\x07\x8f\x8c\xfc\xf1\x16\x98\xde\x23\xad\x09\xe9\x98\x64\xc6\xff\xce\xa0\xc0\x56\x67\x08\x2b\x09\x62\xb7\x2f\xfc\x95\xc9\x24\x70\x2c\x47\xec\x07\x66\xdd\xef\x6c\x67\x98\x37\x73\x6f\xbe\x8e\xc2\x03\x58\x74\x32\x85\xbe\x3a\x9e\x00\x76\x23\x88\xe8\x30\x77\x7e\xbe\x6f\x82\x32\x78\xa5\x32\x5f\x02\x68\xf5\xe0\x99\xea\x43\xf7\x0e\x42\x52\x07\x95\xca\x62\xc5\xc2\xfc\x72\xed\x66\x20\x50\xca\x20\x3d\xc1\x49\xe1\xaa\x04\x19\xd0\x7e\xc5\xca\x42\x72\x0c\xfe\xa8\xaa\xee\x97\x47\x2f\x5c\xd8\x55\x82\x67\xf1\xb6\x72\xd0\x6d\x7e\xe0\xa5\xb0\x51\x04\x0b\x7b\xa4\x79\x8b\x94\x8a\x15\x83\x49\xc9\xd3\x4d\x36\xc7\x33\xe6\x6e\xad\x79\x5a\x77\x4e\xd6\x91\x7f\x6d\xc1\xb5\x7c\x94\x45\x07\xba\xdf\x3b\xf7\xa1\x19\x11\xe1\x0f\x21\xe1\xe2\x30\x0d\xea\x22\x01\xfc\x91\x73\xfe\x9e\x1b\xaf\xb7\x5a\x86\x90\xcc\x13\x9b\x26\xcb\x23\x3c\x47\x6c\x16\x77\x1e\x44\xa5\x0e\xcc\x7f\x9c\x7e\xeb\x8c\xf5\x23\x36\x96\x55\x09\x10\x54\x77\x6c\x2c\x6d\xca\x32\x06\x75\xd2\x5d\x0d\x76\xf3\x00\xb8\x79\x67\xf2\xce\x6c\xe6\x4f\x82\x7c\x70\xa0\xf4\x7c\xfc\x8a\xd0\xa3\x28\x55\xc1\x96\x55\x11\x8c\xa5\x18\x60\x9b\x55\xdf\x29\x4a\xa1\xfa\x64\x74\xe4\x82\x4d\xe0\xc4\x09\x23\xf3\x65\x4e\x9c\x45\xa5\xb9\x60\x66\x02\x20\xe1\xb7\x90\x33\xa2\x04\xcd\xd5\x54\x42\x75\xfd\x84\xe6\x34\xe1\x7a\x6e\xa6\x5b\x17\x34\xb9\x85\x32\x3c\x05\xb3\x5f\xec\x93\xe4\xc8\xc6\x6b\x85\x33\x18\x87\xfd\xea\x69\x21\xcb\xc9\x14\x22\x59\xf1\xa9\x24\xa3\xca\x4d\x40\xe3\xfb\x56\x9b\x51\x24\x9d\x0b\x3a\xe3\x89\x07\xcd\x2b\xe4\x1d\x57\x5c\x5a\x6b\x2e\xb6\x6b\x76\x3d\xb9\xf4\xb8\x67\x68\x24\x3e\xcd\x28\x9f\x91\x43\xc5\x18\xf1\x1b\x03\x7f\xb1\xd5\xda\xd1\x78\x51\x30\xf3\x7a\x68\x41\x96\x1e\xbc\x5b\x58\xc4\x81\x8a\xd2\x79\x17\x15\x32\x4a\x38\x6e\x69\xf3\xa7\x8f\xfc\xd2\x35\xf7\x4c\x16\xe0\x98\x77\xa8\x95\x4c\xa4\x32\x70\x4f\x9e\x5c\x5e\xa8\x50\xed\xc0\x7d\x66\xb1\xdd\xe0\x87\x4c\x8a\x49\x98\xb2\x5f\xed\x52\x43\x56\x05\xd4\x32\xb9\xe3\x69\x49\x33\x24\xa8\xb6\x33\xa7\xd7\x17\xf8\x3a\x9f\x4c\xf5\xe0\x9e\x81\xd9\x05\xf9\x4e\x15\xda\xe4\x3e\xca\x17\xc2\x72\xb8\x02\x02\xac\xad\xd9\x00\x4d\x58\xa6\x6b\xf7\x74\x0e\xf8\x2e\x36\x84\x24\xf2\x8c\x3a\x6c\x2d\x6c\xc2\xcf\x7b\x30\xe9\xd0\xbd\x13\x5f\x9b\xc2\x48\x0c\x60\x97\x32\xb3\x0c\xbb\x76\xb1\x6f\x66\xe2\x03\xac\x3b\x7f\xdb\x96\x21\xa3\x66\x8d\x40\x8a\xfb\x24\xd0\xc2\x04\xee\x8e\x51\x10\x7b\x05\x4d\xa0\x1d\x1b\x11\x8e\x20\xb0\xde\x1e\xc3\xef\x98\x60\x05\x4f\x6a\x5b\xc7\xbf\x3a\xa1\x1a\x0e\x1f\x13\xe6\xb5\x74\xb8\x5a\x35\x7a\x00\x19\xef\xae\xda\x4a\x37\xb6\x1a\x61\x47\xe9\xa3\xf7\x43\x60\x85\x0b\xfc\x26\xe6\x94\x52\x91\x0e\x68\x66\xf6\xe7\xe5\xc7\x53\x1b\x17\x8d\xe7\x2e\x8a\x0b\x70\x85\x85\xb8\xf0\x48\xd4\x46\x4a\x69\x3c\x6e\x90\x00\x3f\x62\x29\x90\xa9\xb0\x06\xe3\xbd\x51\xb8\xed\x16\xb9\xfc\x78\xda\x27\x7c\xc8\x86\xee\x2f\xff\xa8\xa3\x93\x5a\x4e\x30\xaa\xd0\x47\x8a\xc2\xee\x86\xae\x84\xb6\xad\xf0\xdd\x9f\xff\x64\x3a\x69\x7e\xfd\xf3\xe0\x4f\x01\xb6\xe7\x9f\x7f\x36\xeb\x5d\x98\x07\xe2\xbb\x61\x68\x9a\x07\xb2\xff\xf9\xd2\x02\x3d\x5b\x18\xe8\x9f\x6d\x7d\x2b\x26\xb4\x11\x4c\x2f\x25\x38\xfd\x79\x8a\x7b\x1e\xbe\x5d\xb0\xbf\x39\x3b\x25\x4c\x93\xb7\x11\x25\x54\x33\x01\xac\xc1\xe5\x70\x08\xa9\xf1\x75\x5b\xca\xd5\xf4\xff\x10\x2c\x0c\x98\x6e\xd6\x27\x5a\x4a\x38\xf4\x48\x58\x4e\x04\x61\xae\xfc\x25\x8e\x15\xa6\x83\xda\xb8\x37\xc7\xed\x4c\xb3\x66\x86\x7d\x46\xae\xe9\x07\xf4\xed\x4b\x21\xf5\x97\x7e\xf9\x6b\x85\xb9\xe9\x9d\xe4\x0e\xd3\xdb\x9c\x47\x81\x45\x12\x3d\xca\xf4\x68\x4e\x66\x5c\x69\x7a\xcb\x86\xe4\xda\x70\xb3\xd0\xb9\x86\xb3\x27\x08\x60\x41\xb2\x94\x94\x42\xf3\x0c\x7e\xad\xda\x31\x5d\x0e\xb9\xdc\xc5\x98\xa8\x12\x2a\x86\xe7\x05\x1b\x38\xbe\x69\x9f\x5a\xa0\x38\xd5\x58\xfa\x7e\xb1\xa7\x14\x95\x8d\x3c\x85\x57\x61\x3e\xa8\xb0\xdb\x6b\x21\x1a\xcc\xf4\x53\x8a\xa4\xe2\x95\x30\x99\x6a\x48\xde\x01\x7b\xcc\x9c\x87\x19\xf5\x1e\x6b\x0f\x15\x2c\x61\x4a\xd1\x62\xde\x07\xac\x74\xee\xf1\xb5\x6d\x00\x10\x10\x8f\x19\x15\x88\x54\x5e\xb0\x44\x0a\xa5\x8b\x32\xd1\x58\xba\x6e\x54\xc8\x5b\x26\x7c\xf4\xa1\x27\x4c\x3e\x0c\xac\x0a\xc7\x01\xf7\x99\x24\xc9\x94\x8a\x49\x50\xfa\x65\x46\x53\x98\xfb\xef\xbd\x5c\xe5\xc6\x63\x66\x80\x8e\x8d\x28\xc3\x35\x4c\xc5\xc8\x30\x2c\x6f\xd5\xfd\x24\x88\x53\xdc\xfb\x95\xd9\xd5\x0c\x89\x67\x6b\x68\x57\x27\xfa\x45\x3a\xda\x08\x07\x20\x25\xec\x38\x8c\x6c\xc6\x34\x4d\xa9\xa6\x1b\x84\x92\xbd\xad\xea\xd5\xb9\x92\xf5\x58\x33\xd4\xfb\x39\x2d\xb7\x73\x02\x9e\xcc\x79\x98\x2e\x05\x27\x71\xea\x66\x1e\xf2\xaf\xb5\xd9\x53\xd6\xef\x80\x11\x62\x20\x3e\xb9\x82\x60\xa6\x79\xd7\x1a\x92\x8b\xaa\xda\x61\x45\x4e\xda\x79\xb5\x3a\x1a\x74\xcd\xd4\x6f\x30\x47\x37\x95\xeb\x2d\x89\xc3\xc5\x1a\x05\x1d\xe4\x12\x4c\x68\x5e\xb0\x30\x3b\xcd\x4e\x5d\x29\x70\x93\xd7\x26\x11\x66\x79\xc2\xb4\xaa\x02\x5e\x90\x0e\x1b\xe2\x62\xf9\x9d\x55\x7f\x81\x48\xdb\x89\xb5\x1a\x64\xb3\xc4\x85\xd3\xae\xa4\xa5\xb3\x86\xf2\x3f\xc8\xbc\x6e\x62\xc3\x46\x84\xfe\xb7\x32\xed\x62\xf6\xae\x01\xdb\x57\x4d\x54\x51\xa0\x18\xcf\xab\xc0\x8c\x80\xdf\x00\xe7\x97\x8a\x72\xec\x90\xc8\x4d\xe9\xdd\xe6\x36\xaf\x4a\x12\x1b\x78\x50\x60\xf8\xdc\x00\x3e\x37\x78\xd9\xde\x36\xd8\x25\xa0\xc4\x5d\xad\x03\x4b\xe2\x8f\x74\x32\xc4\x1a\x92\x72\xdd\xd1\x7a\x5a\x47\x2c\xf7\xd4\xde\xba\x23\xbd\x0b\xd8\xa6\x4c\x30\x6e\xe8\xc4\x2b\xf2\x65\xc4\xdf\xad\x1c\xe5\xb5\x32\x8c\xf4\x3d\x74\x6a\xda\xd0\x2e\x82\x4b\x48\x8f\x1f\x3f\xaa\x35\x06\x82\x45\xb3\xc6\x52\x7b\x32\x29\x95\x96\xb3\x7a\x11\x04\x57\x10\x5e\x21\x64\xa8\x8d\xdf\x83\x2a\x6b\x27\x59\x3e\xa5\x47\x58\x3e\x36\xc5\x48\x69\x23\xc9\x2f\xb4\x03\x42\x7d\xdc\x5a\xbd\x31\xe4\xeb\x27\x62\x8e\xfd\x3b\xf3\x73\x1f\x4b\xe0\xbe\x78\xac\x15\xc3\x5d\x4c\xb4\x17\x57\x8d\x68\x59\x80\x65\xd1\xa5\x62\x98\xa3\x51\xc8\x2c\x63\x05\x2c\x82\x55\x34\x6b\x01\x05\xd0\x1b\xec\x6e\xdf\x2b\xf4\x5e\x3e\x16\xec\xde\x0b\x42\x54\x21\xee\x8c\x73\xfe\x31\x5b\x47\x6f\x69\x7b\xad\xdd\x73\x1b\x39\xe8\x36\x71\xd1\x41\xee\x26\x17\x6d\xe2\xa1\xaa\x17\x56\x56\xf2\xa8\x5f\x9b\xf8\xf4\x20\x68\x06\x7c\xf9\xdd\x1c\x34\x31\x6c\xea\xe5\x05\x34\xe1\x24\xfa\x09\xfc\xe1\xf8\x95\xdf\x91\x23\x66\xf6\x7b\x95\x95\x0d\xfb\x28\x7c\xb7\x21\xac\xa1\x5a\xdc\xef\x01\x5a\xd5\xee\x44\x5f\xfa\xab\x60\x10\x96\x02\x5f\x1c\x42\xe9\x00\x2a\xe6\x56\x0e\xd0\x53\x5e\xa4\x83\x9c\x16\x7a\x8e\xa7\xa1\x1f\x7d\xcd\x87\xf8\x77\x1a\xf8\x86\xbe\xa5\x76\xa8\xc5\x4b\x67\x18\x06\xef\xca\xf7\x59\xe7\xc1\xd2\x79\x7d\x8c\xf1\xb4\x4f\x22\x68\x1c\xcf\xbb\x20\xa7\xde\xe9\x93\x4f\x36\x1e\xef\x89\xdd\x94\xe3\x5c\xf9\xf0\x83\x5a\xbd\x4c\x67\xca\xaf\xe2\x13\x1e\x5e\x20\xf0\xdf\x7a\x60\x0a\xb8\x19\xb5\x41\x9f\xc4\x16\x3b\xe7\xe0\x0d\x7a\x35\xaa\xd2\x89\x3a\x70\xb4\x54\x4e\x9e\x44\xce\xf2\x52\xb3\x60\xea\xad\x2e\xd0\x79\xae\xa3\xa4\x8d\x63\x84\xeb\x1e\xf8\x66\x07\x95\x5f\xa5\x05\x66\x67\x78\x6d\x34\xeb\x64\x8b\xfc\x84\xf0\x7a\xc6\xae\x95\xda\x60\xbb\x07\x0f\x90\x2d\x03\x08\xc8\x36\x41\x04\x64\x97\x81\x04\xc4\x87\x23\x6d\x73\x62\xae\x5c\x20\x54\xed\xcc\x58\xe2\xb4\xea\xcc\x44\x69\x70\xbe\x1d\xae\x5c\x29\x18\x6b\x46\xf3\x67\x00\xc4\xb8\x30\x9c\xc5\x9e\x56\xb0\xc9\xa1\xad\x8c\x7d\xf6\xa0\x73\x01\xaf\x0f\xea\x02\x43\xc1\x7c\x2f\xb2\xc2\xa9\x1b\x58\xa7\xa3\x03\x5a\xd9\x9f\xe0\xfd\x09\x6e\xfb\xfe\x53\x9e\x60\x0c\xd8\xe9\x12\x4f\x16\xcb\xd5\x68\x1d\x23\xbf\x94\xac\x98\x13\x79\xc7\x02\x47\x15\xa0\xeb\x29\x9e\x5a\x57\xcf\x88\x8b\x74\x6d\x79\xe5\xf0\x7a\x44\x9e\x0f\xb5\x5a\xcf\x3f\x1b\xc9\x08\x42\xaf\xb7\xa0\x65\xf5\xa6\xe2\xec\x1a\x9c\x2d\x37\xe9\x8e\x78\x81\x1a\x3d\xb4\xb0\x1b\xd5\x1d\x30\x54\x9d\xbc\x3b\xdb\x4c\x01\xe8\x66\x38\x21\x9b\x18\x4f\x16\x06\x7f\xb2\x62\x80\x38\x11\xfe\x97\xb8\xb0\x80\x8b\x32\x07\xac\xa8\xbe\xb5\xb5\x56\x85\xbd\xe1\x61\x74\x19\xc4\x28\x57\x6d\xb3\x2b\x9b\x26\x68\x03\xaa\xb8\x99\x56\x8d\x57\x7b\x5c\xa4\xf8\x2d\x37\x09\x5d\x89\xef\xc6\x64\xbb\x13\x7e\x52\x78\x45\x5b\xc1\x62\x7e\x81\x47\x1a\xf6\x04\x60\xc5\xb8\x68\x1d\xbf\x0d\x20\x42\x09\xcb\xb9\x6f\xf0\xc5\x2d\xe8\x27\xf1\x13\xbb\xf5\x50\xfd\x36\x8d\xc2\x4d\x6e\xd9\xfc\x40\xd9\x40\x77\x29\xd4\x94\xe7\x0e\x9e\x14\x28\x81\xdd\xb9\xe4\x23\xd8\xa0\x5d\x13\x78\xe6\x2f\x44\x9f\xbc\x93\xda\xfc\x0f\xeb\xd9\xc3\x5e\x3f\x93\x4c\xbd\x93\x1a\xee\x3c\xfa\x64\x61\x77\xb7\x9e\x2a\x9b\x2f\xc2\xa1\x66\x0d\xba\x4d\x21\xc8\xd0\xb9\x39\x60\x4a\x1a\xca\xfa\x83\x29\xd1\xcd\x89\xc7\xb3\x53\xb6\x09\x67\x73\x11\x52\x0c\x2c\xb8\x7a\x43\x1b\x76\x2a\x65\x11\xcd\xe4\x8a\xe6\x6c\x53\x60\xad\xc5\x5f\xc0\x26\x93\x67\x34\xa9\x7c\x33\x80\xca\x46\x35\x9b\xf0\x84\xcc\x58\x31\x81\x94\x86\x64\xba\xf9\x02\x75\xa7\xdb\x78\x6d\x44\xbd\xc3\x0f\x77\xde\x19\xc0\xea\xde\x80\x77\x6c\x5b\x86\x89\xad\x20\x8b\x98\xd1\xdc\x6c\x8a\x7f\x18\x4e\x00\xeb\xf2\x4f\x40\x51\x54\x43\x72\xe2\x4a\x5b\x85\xbf\x59\x43\x5b\xd8\x8c\x69\xc1\xc8\xf1\xbf\x94\xfc\x8e\x66\x0c\x7d\xc6\x54\x78\xc0\x29\x39\x5e\x60\xd3\x7d\x0b\xa5\x68\xa8\x94\xf7\xc3\xf6\x6e\xd9\xbc\xd7\x5f\xd8\x48\xbd\x0b\xd1\xab\xf2\x8a\xa2\xad\xe3\x19\x1a\x78\x6f\x7b\xf0\x5b\x6f\xd7\x9c\xfd\x89\xc4\xf9\x0d\x76\x89\x35\x02\x9d\x66\x54\xa9\x6e\x29\x19\xcb\x81\x3d\xae\x83\x36\xab\xd0\x58\x1b\x09\x90\xa0\xa7\x71\x77\xb6\x2a\x08\x50\xeb\xee\xb5\xea\x34\x4b\x77\x16\x97\xbb\x7d\x4e\x61\x9d\xaa\xfa\x06\x7c\x04\xe2\x7d\x18\xc4\x5d\xc5\x08\x2e\x99\xaf\x8f\x10\xc8\x2b\xc7\x21\x10\x11\x57\xa0\xe2\x72\x17\x93\x28\xa4\x26\x5c\x24\x59\x99\x22\x80\x12\xbc\x0a\x0a\x72\x57\x91\x7e\x83\xc9\xd9\x62\xf3\x7c\xf4\x0d\x38\x79\xc4\x6a\x22\x8b\xc1\x20\x75\x6f\x18\xc4\xb9\x63\x44\x0b\x57\x76\xae\x76\x3d\xd6\xf1\x1a\xd7\x7b\x8c\x13\x75\x1a\xcb\x18\xaf\xf9\xa8\x60\xe4\x74\x4a\x85\x60\x59\xdb\x2a\xe5\x1d\x8a\x94\x3f\x76\x30\xdb\x73\xac\x50\xb0\xb3\x12\x93\xcf\xb9\xf8\x76\x56\x76\x2e\xbb\x5d\x65\x32\xbf\x3e\x25\x9a\x16\x13\xa6\x4d\x33\x44\x94\xb3\x11\x6b\x9d\x57\xf1\x9c\x0a\x52\x3f\x56\xe9\x85\xdd\x56\x4f\xc0\xa9\xff\xe1\x87\x77\x9d\x6b\xac\x35\xad\xe0\xbd\x2c\xb2\xf4\x9e\xa7\xe8\xf4\x52\xe4\xd0\x34\x7c\xf4\xfc\x0b\xa2\xdd\xdf\xf3\x74\xbb\x09\xb0\x4c\x12\x26\x80\xc0\x0c\xd8\x92\x00\x1c\xc0\x1a\xe1\x03\x47\xe4\x9c\x63\xd0\xa9\xf9\x0b\xd3\xa1\x67\x23\x2e\xaa\xf0\x66\xbf\x18\x40\x57\xcd\x79\x70\xda\x84\x62\x1a\xc3\x05\x21\xe2\x4e\xea\x29\x51\x7c\x56\x66\x9a\x0a\x26\x4b\x95\xcd\x5b\x6f\x8b\xa7\x99\xe4\x71\xc6\x3e\xe3\x2e\xee\xc2\xaf\xfc\x4b\x31\xdf\x9a\x60\x50\xb5\x9b\xf3\x05\xc6\x55\x85\x6d\xa4\xc7\x9e\x89\xf9\x28\x54\xf6\x99\x25\x36\xe0\x22\xcf\xca\x09\x5f\x13\x15\xf7\x2f\x86\x9d\x59\xa1\x13\x96\x8a\x55\x29\x63\x6d\xd1\xc1\x7f\xa3\xf5\xa0\x6f\x9a\xf1\x2c\x53\x96\x33\x91\x02\xd4\x46\xb0\x57\xb1\xbb\x3b\x9d\x2b\x0b\x5b\xb1\x39\x85\x3a\xff\xac\x0b\x6a\xc8\xcd\x0c\xb2\x15\x2c\x0a\x06\x1f\x13\x2a\xda\x93\x8e\xe7\x01\x2f\x47\xfe\xe5\x78\xf4\x83\x57\x1f\xdc\x0e\xd4\x14\xa9\xa8\xdd\xf6\x0e\x94\x74\x39\xf8\xa8\xfd\x4a\x98\xda\xb5\x2d\x08\xa9\x6a\xc0\x5d\xac\xf5\x6a\x5f\x95\xe9\x57\x81\x48\x3a\x86\x64\x8f\x2e\x79\xfa\xaf\xf1\x8d\x9a\x66\x6b\x6f\xd6\xab\xfc\xad\xd0\x64\xed\xbe\x0d\x48\x3a\x80\x62\xd9\x86\x6c\xb8\x27\x51\xb6\x3a\xba\x0d\xe1\x2a\x85\x58\x47\xac\x1e\x02\x68\x92\x6a\xaa\x36\x2a\xd1\x1d\x6e\x28\xdb\x0a\x22\x9b\x42\x41\x5f\x97\xf1\x40\x06\x7f\xb6\x32\x81\x88\x9e\x34\xd2\x80\x9b\x10\x97\xca\xcf\xbc\x9b\x16\xdb\x48\xcd\x32\x24\x54\xb7\x86\x61\x6f\x45\xef\x6d\x0f\x3e\x7c\xe8\x5c\xab\xcb\xbc\x52\x1b\xf1\xd0\x27\xf2\x95\x82\xff\x52\x86\x92\x3a\x24\x3d\xfa\x31\xda\xe7\x77\x35\x90\x49\xc2\x2a\x13\xd1\x19\x57\xb7\x5d\xd0\x28\xbe\x3b\x3d\x8f\x5f\x8e\x37\xfc\x77\xa7\xe7\xc4\xde\x6d\x65\xc5\xe9\x62\xc6\xd9\x16\x2c\x61\x92\xb0\xca\x34\x9a\x72\x75\xfb\xe8\x95\x30\xf3\x74\x6d\x39\xf7\xc7\xb6\x32\xb9\x84\xdd\x20\xab\x7c\x2e\x4b\x72\x6f\x53\xd4\xac\x50\x7b\xc3\xf3\x57\xe4\x5c\xa8\xb2\x60\x95\xf7\xb3\x2e\xdf\x1a\x4e\xfa\x9c\x2a\x66\x6e\xb5\x37\x9e\xb3\x99\x2b\xa7\x85\x06\xc9\xb6\x33\x40\x07\x60\xd0\xda\x97\xdd\x10\xd6\x2c\xfd\xc5\xd8\xc5\xa0\xf5\x89\x8e\x51\x2c\xdc\x43\x66\xb1\x83\x8c\xd3\x70\x79\x5f\xfb\x9c\x6f\x72\x9c\xb2\xbb\x63\x95\xd2\x97\x7d\xf8\x8c\xcb\x11\xd1\x51\x9f\xa8\x22\xbd\x97\xbd\x21\xb9\xe6\x33\x9e\xd1\x22\x9b\x47\xa0\x7b\xd5\x73\x86\x05\xb8\x06\xc1\x99\xf5\xa2\x47\x0e\x65\x01\x2d\x27\x54\x90\x8c\xd1\x3b\xe6\x72\x27\xcc\x81\x9a\xa3\x08\x78\xf4\xd8\x54\x84\x3c\xa8\x8d\x10\x09\x4a\xd7\x6d\xf0\x01\xd9\x4d\x94\x5f\x7c\x56\x51\x6c\x2e\x0c\x19\x1f\x62\x7d\xfd\x7a\x4d\x49\x38\x1b\xee\x89\xa7\x9a\xca\x07\xd5\xcd\xb6\x2c\x48\xbb\xa0\xd0\x3d\xdd\x34\xad\xd7\xea\x26\x5c\x5f\xb1\x5c\x76\x12\x00\xf0\x95\x9a\x25\x8c\x6b\x73\x43\x2a\x0e\x40\x54\x54\x43\x59\xb7\x42\xf3\xa4\xcc\xa8\x91\x89\xd1\x0e\x36\x24\x67\xe7\x97\x57\xe7\xa7\x27\x37\xe7\x67\xaf\x88\x6b\x89\x87\xd2\xda\x90\xdc\x84\xe9\xf9\x41\xc8\xab\xcd\x81\xf6\xdf\xea\x5b\xe2\x43\x45\x85\xef\x03\x49\x97\x54\x90\x0b\xc1\x75\x05\x7f\x87\x41\x5a\x99\x14\x36\xec\xca\xbc\x6d\xed\x70\x13\x8e\xa1\x13\xc2\x36\x66\x7e\x8e\x5b\x83\xd3\x81\x50\x5a\xbe\x2b\x6b\xb4\xb8\x07\x90\x1c\xaa\xc9\xdd\x95\xec\xee\x10\xaf\x3a\x1e\x8f\x1b\x34\xb0\x57\xa0\x63\x48\xf1\x3d\xce\xa6\x4b\x37\x6e\xa8\x40\x48\x0c\x2f\x39\x18\x1e\x38\x41\x21\x5b\xc0\x54\xf5\x8d\x86\x88\x0a\xf1\xde\x1a\x12\xf2\xde\x85\x30\xf7\x8d\x14\xd0\x0c\xcf\x8a\x19\x6e\x01\xc8\x67\x6d\x87\x3a\xcc\xdd\x72\x14\x7e\xd4\x42\x30\x4c\xf8\x1d\x13\x38\xb0\xdd\x12\x24\xf7\xf9\x8e\x73\x7e\x55\xf5\xfb\xc3\xd5\x9b\xdd\x76\x09\xcf\x59\xc7\x0e\x9d\xca\xd9\x0c\x13\xf3\xa7\x3e\xfb\xac\x4a\x20\xf3\xa7\x7d\x67\x0a\x0b\x42\x0c\x8c\xd7\x6c\xea\x1a\x9d\x72\x2f\xd5\x14\x14\x7f\xdb\x46\xe3\x8b\x4a\x4e\xed\x8e\x9f\x57\x2f\x9e\x6c\x49\xf6\xb1\xef\xf1\x13\x96\xdd\x67\x22\xc5\x7a\xe2\xeb\xd5\x92\x75\x68\xe1\xed\xc9\x8a\xff\x68\x57\xae\x7b\xee\x5e\x0c\x43\x1c\x5c\x6b\x01\x08\x48\xca\x34\xe5\x99\x0a\xd6\x51\xcb\x5c\x66\x72\xd2\x0c\xa6\xd7\x61\x81\x7e\x87\x09\xb1\x03\x3a\x30\x2b\xbf\x5b\x79\xbd\x0d\x06\x72\x3c\x1f\x0e\xf3\x18\xc0\x7b\xfc\x58\xbd\x1c\x0c\x50\xc5\xcf\x74\xb8\x0f\x22\x78\x2d\xcc\x01\x6a\x83\x70\x88\x1d\x3e\x4a\x05\x38\x12\xe0\x8f\xb7\x95\xc8\x1e\x7a\xea\xd6\x0b\x63\x86\x06\xad\x07\x99\x8f\xe7\xec\xbf\xec\x3b\x31\x91\xcb\x0b\x36\xf0\x79\xef\x00\x8b\x2d\x8b\x80\xbb\x86\x34\xcf\x19\x5e\x9c\x99\x06\x9f\xca\xe6\x75\x03\x4c\x25\xfb\x78\xab\x15\xb8\x3f\x01\x1b\xc6\x63\xee\x58\x55\x98\x4e\x30\x6f\xbc\xb0\xf6\xdb\xbc\xe0\x77\x3c\x63\x13\x40\xd7\xe2\x62\x12\x14\x29\x72\xc0\x21\x80\xba\xca\x16\xfa\x65\x96\x4a\xe9\x10\x53\x11\xf6\xc5\xbb\xf7\x37\x80\xd8\x06\x4e\xc1\xad\x05\x6c\xf3\x41\x40\xf0\x1e\x0c\x06\xa0\xf7\x1f\xfe\xcd\xc8\x8a\x69\x76\x44\x7e\x60\xf6\x3b\x12\x50\xe5\x0a\x80\x71\x9f\x4a\x0f\xeb\x05\x7d\xad\x66\x16\xb6\x23\x3a\xcd\xed\x53\xc7\xe6\x49\x23\x18\x21\xbb\x89\x9e\x87\xaa\x55\x88\x93\x83\xfe\x9e\xc7\x97\x2b\x77\x48\xfa\x37\xa6\x72\xce\x2a\xda\xb4\x3f\x2b\x08\x04\x4b\x0f\x29\x51\xf3\x59\xc6\xc5\x6d\x05\x64\x30\x96\x66\x0f\x59\xd4\x38\x71\xeb\x76\x6c\xc1\x68\xb6\x9c\x52\x6e\xb2\x3f\x76\x4a\x25\xf5\x06\xc6\xbb\x9b\x79\x8e\xbe\x70\x7f\xec\xad\xab\x37\x24\x71\xbd\xde\xb3\x1b\x2f\x57\xdd\x4a\x98\x1e\x5c\x5c\x9f\x5e\x47\xe5\xb7\x8c\x4e\x07\xf7\x1e\xd3\xb8\xbc\x8c\x25\xc0\x70\x9e\x50\xb2\xe3\xbf\xac\xf3\xd4\x0e\x48\x56\xae\x7f\x06\xc3\x7c\x2e\x65\xa1\x69\xb6\x23\x22\x90\x4c\x69\x7e\x52\xea\xe9\x19\x57\x89\xbc\x63\x9d\x55\x1d\x57\x64\xd7\xe1\x98\x70\xb7\xe8\xd8\x1a\x39\xfd\xaf\x93\x4b\x42\x4b\xb3\x8a\xda\xe2\x35\xed\xd4\xc5\xed\xfa\x7f\x8d\x01\xf5\x3b\xe9\xbd\x6d\xeb\xc1\xfb\xbe\x77\x08\xec\xd0\x21\x00\x67\xfc\x39\x3b\x01\xb8\xe0\x9a\x53\x2d\x5b\x16\x89\x88\xf5\x77\x84\x30\xc2\xed\x79\xe1\x1a\x02\xaf\x2c\x30\xdc\xa8\xed\x18\xfc\x16\x04\x6d\x98\x1c\x5f\x50\xba\x16\x01\xd8\x07\x40\x21\x6c\x9b\xfb\x67\xfe\x64\x23\x33\x73\xa0\x36\x7f\x7e\x15\x41\x54\x2e\x20\x0c\x57\xc5\x8f\x1d\x6a\xed\x4e\x2d\x31\xfc\x97\xae\x27\xdb\x9a\xbd\x70\x54\xff\xb7\xa4\x19\xce\xc6\xbb\x5d\xdb\x88\xe2\x99\xed\xd8\x49\xb7\x9e\x6e\xce\xdf\x79\xad\xb9\x54\x00\x31\x6b\x9f\xd0\x05\x15\xca\x2c\x44\xac\x1b\x1d\x58\xd7\xce\x01\x39\xd4\x49\xde\xba\x0e\xea\x03\x45\x66\x63\x57\xed\xbc\xbf\xf1\x11\xd9\x6d\x7b\xf5\x20\xde\x16\xd8\xbb\x5d\x4d\x1b\xd1\x40\x90\xd9\x92\x37\x5c\x69\x87\x37\x0b\x37\xb8\xb2\x60\x69\x20\xe9\x5c\x42\x59\xf9\xfc\xaf\x34\x4d\x8b\x57\xc8\x49\x5c\xad\xba\x02\xe4\x1d\x87\xbb\x44\x85\xf7\xc7\x1d\xea\x79\xce\x13\x50\xc7\x6e\x4e\x2f\x09\xc2\x4d\xff\xf1\x1b\xac\x93\xf5\xfb\xaf\xbe\x79\xd1\x7a\x41\x9f\x2e\xfc\x79\x43\xcb\xc1\xce\x3d\x36\xcf\x22\x6a\x0e\xc4\x05\x8c\x97\x03\x7a\x68\xcf\x2e\xee\x23\xb3\xa8\x9e\x4a\x6f\x26\x54\xec\x23\xcc\x9e\xbc\xe6\x75\x28\x80\x6f\x4f\x55\x90\xa0\x5c\x3e\x3f\x82\xb2\x76\x2e\xd6\xef\x9a\x78\xb7\xe0\xf9\x35\xfa\x5d\xe0\x7d\x82\x98\xeb\xb3\x77\xd7\x7f\x7d\x73\xf2\xed\xf9\x1b\xe8\xa5\x8d\xab\x0a\x2b\xf0\x6e\x10\x47\xd4\x7e\x5b\xb5\xd1\x04\xd7\x4f\x46\x37\x3f\xc7\xbb\xd7\xd7\x35\x45\xd9\xdc\xe9\xe8\xdc\xd8\x56\x5a\x16\xe3\x56\x63\x7f\x5c\xd3\x15\xe0\x31\xb3\x62\x77\x29\x0e\x1b\x5b\xb8\x02\x48\xa6\x48\x19\x32\x2b\x85\x3d\xdc\x5a\x5f\x59\xbb\x02\xe4\x19\x18\xf1\xcd\x78\x71\x0e\x76\x6e\xbe\x7f\xa0\xb9\x6a\xcb\xe2\x8b\xee\xb9\x2f\x07\xd7\xf0\x96\x73\xf2\x98\x43\x8a\x11\x39\x85\xa1\xd7\x86\x52\x33\xe5\xb1\x57\x9f\xe9\x4e\xc9\x9b\x80\x77\xbb\x50\xaf\x46\xe4\xde\xa8\xd0\x42\xe4\xd8\x88\x32\x06\x96\x01\x63\x3b\xdf\x3e\xb5\xea\x25\x14\x6d\xde\x65\x36\x7d\x75\x0b\xef\x40\x4a\xf5\xe3\x13\x40\xf8\xec\x0e\x03\x4a\x7d\x7b\x5d\x37\xf2\xa9\x7b\xb1\x9e\xc8\xd5\x69\x85\x08\x55\xbe\x7c\x41\xa9\x7c\xbe\xba\x2b\xce\xf1\xb4\xcb\x47\x1e\x85\x7a\xfe\xb0\xa1\xea\xb2\x6b\xb5\x25\x9f\x4a\x2d\xc5\xc6\x41\xe2\x97\x0d\xaf\xc7\xe7\x18\x9f\x38\xad\xb0\xab\x83\xd2\x37\x10\x61\xe8\x0d\xfa\x46\x8c\x73\x5c\x42\x0a\x67\xda\x8f\x0d\xfb\x8f\x2e\x79\xa4\x17\x67\x3b\x3a\x73\xbf\xa6\xe4\xc3\xae\x26\xd8\x9d\x86\x50\xa4\x9d\x33\x2e\x2e\xce\xac\xdc\xe5\xb2\x2a\x94\xdd\x76\x64\xf9\xbe\xdb\x19\x5f\x94\x85\xbe\x97\x45\xf7\x54\xe3\xcb\xe8\xc5\x9a\x57\xdf\xfe\xb6\x90\x4d\xf4\x1c\xcf\x08\xf6\xf1\x89\xcf\xc9\x35\x38\x4c\x6b\x58\xd1\xf5\x93\xe1\xa3\xd8\x1f\xe0\xf0\x3c\xed\xa1\xd9\x90\x0b\x3d\x6c\x4a\xea\x4e\x05\x6f\xb7\xcb\x3a\x8e\xf0\xa3\x7d\xcd\x1a\x08\xcc\xda\x54\x44\x82\xfa\x43\x68\x9b\xdf\x19\x51\x28\x24\x16\xc4\xe9\x40\x0f\x2e\x34\x9b\x61\xe5\x3c\x9a\x65\x66\x2e\xa5\x08\x61\x83\x6d\xda\x69\x9f\x20\xf2\xee\x8c\xe6\xae\x0c\xa1\xbc\x17\xf7\xb4\x48\xc9\xc9\xe5\xc5\x6e\x8e\x7e\x87\xd0\x62\xdc\x3f\xed\x90\xa0\xe2\x7a\x45\x32\x65\x64\xc4\xb5\xaa\x2a\x89\x30\x1d\x6a\x83\x86\xbc\x79\x1f\x91\x39\xa4\xe6\x40\xda\xef\x45\x95\x77\x65\xa2\x69\x56\xab\xec\xfa\xe2\xc5\x0b\x34\x5e\xbd\xf8\xc3\x1f\xfe\x00\x75\x34\x48\xca\x12\x3e\x5b\x7c\x10\x9e\xfa\x8f\x97\x2f\x87\xe4\xbf\x4f\xde\xbe\x81\x4a\x33\xb9\x56\x08\x77\x81\x2d\x63\xad\xcb\xe0\x65\xd5\x27\xff\xe7\xfa\xfd\x3b\x47\x21\x55\xed\x57\x5b\x26\xd0\x0e\x6f\x48\xce\x82\x10\xa0\xd0\x3c\x45\xf5\x14\xcb\x51\x4a\x4d\xe8\x78\x8c\xf5\x93\x46\xae\x7c\x17\x1e\x29\x97\xd9\x0c\xb5\x0e\xb1\x46\x83\x59\xfe\x0c\x62\x93\x8c\x22\x8d\xc6\x3c\x97\x5c\x8f\xa1\x56\xd0\x96\xa7\x7f\xd0\x95\x3e\x56\xcb\x1c\x2b\xa8\xd4\x50\x41\xc1\x15\x4c\x19\x99\xd2\xd6\x74\xc1\xc6\x7c\xd7\x4d\x27\x9e\xd2\x07\xd3\xba\x82\x40\xb4\xb1\x1c\x70\x6d\x55\x76\xf3\x6f\xe8\x56\x5c\x17\x1c\xfb\x40\x3e\x91\x98\xe7\xfb\xde\xe0\x5a\xd9\x94\x75\x4f\x2e\x08\xcd\xa4\x98\x84\x4b\x5b\xf1\xa3\xa0\x7c\xe7\xfa\xa1\x74\x46\xde\xeb\x8a\xbe\x8a\x54\xe8\x2d\x6d\x5d\xe3\x24\x36\x69\x07\xa9\xfd\x74\x24\x4b\xed\x5c\xc0\xd8\x26\x56\x9d\xc1\xe2\x8d\x1d\x90\x03\x37\x00\x1b\xdc\x04\x74\xb6\x33\x6e\x65\x4c\xe6\x23\x21\xa0\x4f\x18\x4d\xa6\xe4\x96\xcd\x07\x48\x98\x72\x0a\xd9\x28\x30\x1f\x67\x66\x16\x10\xdb\x31\xf6\x97\x24\x2c\x35\x92\xad\x9d\x2c\xe7\x51\xaf\x76\x91\xcf\x66\x71\xe2\xa3\xb2\x92\x8e\xc5\x8c\x14\x81\x02\xef\x80\x89\x83\x02\x67\x1e\x24\x12\xab\x1b\xc6\x59\x17\xe6\x7c\xb1\xd4\xbc\xa6\x56\x7d\xb9\x0a\x23\x30\x84\xce\xb2\xaa\x52\x2c\xbc\x6d\xab\xf9\x59\xb1\x0d\x3e\x48\x1d\x14\x6f\x10\x8a\x00\x35\x3a\x6d\x39\x1b\xfb\xac\x9b\x25\x3f\x11\x51\x56\x88\x62\xba\xb4\x53\x03\x11\x1c\xe6\xdb\x4c\x41\xa1\x63\x80\x8a\x28\x6e\x99\x03\x25\xa1\xd9\x90\x5c\x9a\x4e\x7a\xe4\x23\xc4\xc0\xbd\xc3\x30\x32\x73\x46\xc3\x74\x17\xf3\x91\x83\xe1\xf0\x00\x29\x78\x43\xf2\x4b\x87\x9d\xb1\x19\x80\xea\x06\xc0\xa9\xb5\x5a\x81\xb9\x42\x18\x58\x23\xb5\x01\xcc\xb1\x84\x2c\x2e\x3d\x75\x1c\x8a\xb6\x86\xdf\x59\x1c\xce\x06\x68\x9f\x9b\x82\x54\x6f\x02\x51\xdd\xca\x9d\x10\x5f\x9b\x43\x53\x6f\x04\x4c\xbd\x50\xb4\xd0\x2e\x91\x3d\x66\xdd\x91\x7a\xb7\x00\x52\x9e\x75\x02\xf9\x74\xd7\x32\x4c\x98\x59\x1b\xa9\x4f\x63\xb1\xb9\x8c\xfd\xaa\xc4\xbc\x8b\x71\x53\xad\x2d\x97\xee\x56\xc9\xc9\x9e\x68\x9a\x19\x78\x7a\xf9\xae\x5b\x75\x0e\xd2\x59\xe0\xab\x5f\x5d\x04\xc0\xfa\xd5\xce\x29\x57\xbf\x16\x4e\x93\xa7\xee\x79\x10\x92\x0e\x53\xa9\x25\x20\x31\x6b\x7f\xe4\x86\x50\x57\xd5\xf2\x28\x6a\x64\x15\x25\xb3\x52\xfb\xb4\x9c\x06\xd6\x00\x8d\x3a\xdc\x66\x4c\x86\x74\x8f\x05\x8c\x02\x58\x24\xd2\xdf\xae\x3c\x03\xaf\x8d\x8e\x74\xd7\x0a\x63\xbf\xd9\xc0\x8d\x2d\xe6\xd0\xc9\x0c\x1b\xcf\xe3\xb5\x45\x43\x70\x11\xc4\x91\x0c\x03\xc1\x1b\x5a\xa1\x80\xe4\xc4\x11\x5b\xa9\xa7\xf3\xc8\xda\x19\x56\x6c\x17\xad\x15\xe1\xe4\xf2\x62\x87\x12\x7d\xd0\xea\x6f\x5a\xa6\x07\xd3\x4d\x54\x37\xe5\xac\x1a\xb9\x2b\xc0\xcf\xb3\x2e\x55\xaa\x9e\x46\x34\x5c\xe8\xf6\x6b\x43\x17\x03\xb3\x6a\x0d\x94\xcd\x56\x16\xf5\x14\x34\x00\x72\x73\x0e\x3e\x38\xaf\xcf\x5d\x8c\x7c\x44\x91\x10\xe6\xa3\x55\x8c\x60\xfd\x5a\x2c\x41\x06\x83\x25\xd7\x50\x9b\x04\x75\xbc\x40\x59\xcc\x65\xfa\x8a\xd8\xa2\xec\xbe\x0a\x78\xdf\x56\x07\xef\xa3\x12\x08\xe5\xda\x2b\xb7\x6c\x11\x18\xc0\x37\x16\x0d\x36\x2a\x53\xb3\x4d\xa1\x1a\xb3\x80\x30\xf2\xcb\xae\xab\x48\xb6\xac\x3b\x43\x02\x2e\xb4\x59\x25\x8b\xd8\x58\x8d\x2d\xf9\x2a\xbc\xc9\x94\xcd\x28\x82\xc2\xb9\xe1\x19\x2a\x73\x5f\x70\xad\x19\xa2\xfa\xb0\x62\xa6\x88\x1c\xf7\xa3\x0a\x71\xbd\xbb\x97\xbd\x4d\xea\x79\x6c\x59\x72\x85\x54\xab\xb0\x83\xc9\xb8\x8c\xa4\x33\xb3\xaf\x41\x5d\xc8\x00\xc9\x51\xd4\x8c\x0c\x86\xc1\xdc\xe1\xec\x3d\xfa\xc0\x9f\x52\x45\xea\x7b\x21\x61\xaf\x22\xed\x55\xa4\x9d\xa8\x48\x01\x63\x71\x04\xc7\x4e\x54\xa8\x36\x85\x88\x52\x4e\x77\xaa\xb2\x7a\x02\x94\x18\xb3\x35\x9d\xd6\x24\x8b\xd8\x8a\x66\x54\x9f\x03\xa7\x4b\xd9\x7d\x5c\xea\xf1\xe0\x8f\x84\x89\x44\xa6\xb8\xf8\xa6\xfd\x42\x69\x10\x6d\x2a\xf5\x23\xec\xcb\xcc\x7d\x2b\xb4\xc4\x41\xdb\x9b\x2e\xdd\x46\x74\xc0\xf9\xea\x5e\xef\x88\xc1\x57\x6c\xdd\x27\xc1\xda\xe1\xfb\x1c\x79\xcb\xdf\x2b\x2f\x21\xd6\x02\x86\xcd\xed\xca\x9c\x92\x43\xbc\x39\x4c\xf2\xb2\x6f\x1f\x18\xce\xd8\x4c\x16\xf3\xbe\x7f\xc8\xfc\x18\xbd\x65\x9f\x38\x02\x99\x20\x29\x0b\xa3\xec\x65\xf3\x5f\xab\x74\xe0\x26\xe8\x91\x85\x03\xbf\x4e\xdd\xaa\xc1\x84\x57\x2d\xfc\xce\x03\x5d\x81\x2a\x5f\x55\xc7\x19\x7b\xf0\x3d\xd5\xf7\x2a\x2a\xdc\x65\xe2\x8e\xdc\xd1\xa2\x43\xe9\xea\xf0\xda\x52\x1e\x48\xf9\x1d\x57\x9b\x15\xac\x6b\xd4\x9a\xb9\x85\xf5\x92\xa5\xce\x4b\x6d\x29\xa5\x3b\x15\x2e\xd5\xdb\x9f\x86\x9a\x50\xf4\xb2\xb7\x51\x37\x7e\x35\x45\x61\xf1\xda\xb0\x34\x2c\x5e\xdb\x16\x88\x8d\x5b\xd9\x78\xdb\xec\xb4\xdc\xb3\xbb\xdc\xb6\xd8\xc5\x39\xac\x58\x64\x85\x4f\xe0\x84\xd3\x47\x3a\x68\x18\x0f\xb2\x43\x5b\x8d\x05\x42\xff\x2d\x9b\x69\x76\xe4\x7a\xb5\x99\x7a\xff\xe2\x7e\xd7\x6b\x8b\x89\xbf\x77\xba\xb6\xda\x7c\x7b\xa7\xeb\xde\xe9\xda\xf6\xda\x3b\x5d\xf7\x16\x85\xf8\xfa\x55\x5b\x14\xf6\x4e\xd7\xbd\xd3\x75\xbb\x39\x7c\x10\xa7\xab\x15\xe3\x2a\x8f\xeb\xa3\x3a\x5c\x6d\x59\x97\x93\x24\x91\xa5\xd0\x37\xf2\x96\xb5\xf6\x20\xb4\x12\xe6\x17\x5a\x7f\x3c\xc9\xbe\xbb\x60\xd1\x49\x3c\xd8\x44\x30\xa0\x65\xca\x8d\xf0\xbe\xf1\x06\x3a\xb1\x0d\x38\x39\xdd\x90\x62\x91\xb2\xd4\xb7\xec\x0e\xa9\x36\x73\x3d\x24\x27\xa4\x60\x09\xcf\xb9\xad\xde\x4d\xf1\x3e\xee\x30\x8f\xb2\xcf\xb5\x62\xd9\xd8\xa2\x9d\x8b\xb0\x28\x4c\x25\x82\x5b\x0a\xd7\xf8\x19\xe4\x39\xd2\x81\x64\xbb\x0a\x39\x05\xfb\x9b\x63\x56\xb6\x37\x37\x61\x0b\xa1\x51\x04\x86\x12\xd5\xa2\x81\x8f\xe5\xdc\x66\x20\x3f\xf4\xc1\x66\x9f\x73\x5e\xc0\xe6\xbd\x66\x89\x14\x6d\x2a\x62\x2e\x59\xa0\xf3\x7a\x4b\x6e\xa5\xac\x45\x13\x0b\xe0\xfb\xba\x97\x77\x34\xe3\x29\xd7\x73\xef\x6b\xb3\x55\x96\x28\x9e\x18\xbf\x8c\xaa\x9a\x46\x42\xf3\xbc\x90\x34\x99\x32\x15\xf4\x1b\x45\x0e\x9b\x88\xe5\xa3\xce\xb1\x12\x18\x48\x1d\xf0\x8e\x61\x7d\xd9\x9c\x14\x52\x3b\x77\xf9\x92\x0f\xde\x04\x8d\xc1\xeb\xc8\xbf\x74\x31\x07\x9f\xba\x0c\x9b\xc0\x5e\xf1\x71\xf8\x87\x22\x32\x4b\x1d\xbe\xc7\x1f\x5f\x18\x31\x2f\xb1\x7b\xd0\x50\x39\x40\x80\xd0\x92\x64\x86\x15\x1b\xca\xb7\xfc\xe5\xaf\xbe\x26\x53\x59\x16\x6a\x18\x26\x09\xbd\x84\x7b\xa8\xa2\x39\x31\x51\x93\x8c\x51\xa5\xc9\xcb\x17\x64\xc6\x45\x69\x38\x50\xe7\x6d\xd3\x5d\xb2\x09\x64\x9a\x6f\xbe\x6e\xfd\x5e\x57\x69\x66\xd1\x23\x69\x77\x55\x8e\x48\xbc\x56\xa8\xb1\x27\x09\x93\xcb\x10\xc7\xba\x26\xe2\x58\xa2\x1b\xce\xb6\xd0\xf2\x01\xce\xd7\x2f\xa5\x1c\xcd\x75\x97\x44\xc4\xff\x8b\x6f\xc4\x19\x88\xee\x66\x1b\x74\x91\x0a\x5c\x64\xe5\x47\x1f\xa4\x56\xc2\x84\x2b\xbd\xa6\x52\x42\x95\xa3\xb8\xf2\xb1\xf6\x6c\x65\x62\xe4\xfd\x8e\x69\x29\xa0\x23\x38\x59\xd7\x99\x87\x92\x84\x61\x4d\xc3\xb3\xaa\xd2\x8e\x90\xd8\xfe\xda\xe6\x9f\x18\x6c\xcb\x6d\x90\x1d\x60\x74\xb7\x1c\x6a\x3b\xe9\xca\x6d\x89\xce\x63\xc5\xd7\xe2\x53\xa0\xb8\x98\x20\xa4\xf6\xac\xcc\x34\xcf\xb3\x6a\xdc\xfe\x05\x4b\xc8\x43\xb3\x19\x0d\x2c\x3d\x14\x93\x73\x11\x8a\x09\x4c\x8c\x87\xbe\x2d\x26\x34\x22\x43\x17\x86\x1f\xe4\xb4\xa0\x7e\xf2\xa0\x6e\xaa\x3a\xb2\x16\x38\x0a\x7e\x40\xa4\x3c\x86\x9c\x17\x34\xf3\x03\x0d\x7d\x3f\xbb\xdc\x34\x9a\x09\x2a\x5a\x18\x98\x63\x55\x0f\x5e\x22\xf2\xde\x87\x80\x61\x85\x8d\xda\x6e\xb1\x42\xcd\xb7\x34\xb9\x65\x22\xc5\xf2\x43\x30\xec\x74\x2e\xe8\xcc\x42\x51\x05\x35\x95\x6b\xef\xab\xbe\x35\x35\x60\xa6\x9c\x4b\xd5\x45\xae\xbb\xcb\x39\x28\x55\x67\xac\x97\x0f\x0a\x6b\x19\xaf\x3a\xe7\x0a\x8d\x30\x05\xbf\x4b\x98\xe3\xff\xe6\x53\xbb\xec\xfa\x5d\x8b\x7c\xf4\x85\xce\xdb\x50\x45\x1e\xec\x5f\x20\xf7\xde\xf8\x0d\xa8\x53\x34\x33\x47\x7b\xee\xd3\x33\x6b\x8b\x3b\x9a\xef\xb6\xa0\x4a\x31\xea\x92\x46\x7b\x70\xf5\xed\x59\x7c\x88\xaf\x68\x2a\x15\xf9\x36\x93\xc9\x2d\x39\x63\x20\x74\x3d\x64\x41\x90\x62\x94\x3e\x25\x60\xf4\x8c\x4e\xd6\x79\xc7\x06\x64\x26\x05\xd7\xb2\x58\x4d\x2f\xf6\xf5\x09\x9f\x04\x8e\xb8\x18\xa5\xcf\x1a\x8c\xd8\x6c\xb0\x4d\xaa\x11\x16\x70\x0c\xe1\x75\x87\xe5\xb7\xe1\xa1\xfa\xdd\x54\xde\x0f\xb4\x1c\x94\x8a\x0d\x78\x0b\x7f\x6b\x87\xd1\xdd\xb2\x39\x38\x99\x3b\x8e\xef\x7b\x7c\x2d\x52\x0e\xb4\x04\x9b\x12\xdc\x37\x2c\xfa\xea\xdb\x33\xc3\x1b\x86\xa1\xb0\x77\xcc\x74\x72\x9c\xb0\x7c\x7a\x6c\x3f\xfc\x2c\x27\xc5\x51\x8b\xae\xb3\x72\x42\x12\x99\x65\x36\xdf\x59\x8e\xc9\x29\xcb\xa7\xbe\xb1\xc7\x1e\xe9\xd3\x41\xdd\xe6\x52\x76\x85\xfc\x0c\x0e\x8c\x79\xdb\x9e\x97\x60\xe3\x14\xa3\x6e\x75\x0c\x1e\x6b\xab\x3c\xeb\x4a\x8c\x0f\x38\x39\x0f\x5c\x55\x3f\xaa\xa5\x1f\x86\x5e\xc6\x70\xc0\x2e\x86\x23\x22\x37\x17\x63\x94\xa4\x53\x96\x12\x79\xc7\x8a\x82\xa7\x4c\x11\x4f\x6f\x42\xd5\x93\x67\x8f\x3d\x6f\x7b\x64\xe2\x27\x47\x26\xde\x40\xc7\x09\xc8\x93\x79\x7b\x91\x3c\xd1\x74\xc6\xc5\xb3\x23\x50\x2a\xa1\x19\xbb\x78\xdf\x41\x99\xb8\xc6\x37\x62\x7d\xc2\xdd\x0c\x00\xc5\xd6\xc0\x74\x7d\xef\xf7\x0b\x11\x32\x5d\x67\x1f\x7d\x00\xad\x60\x42\x35\xbb\x5f\xcb\xfe\x06\x15\x81\x5a\xff\x24\xc8\x9d\x4f\xa9\x3f\x3c\x11\x34\x5e\xb0\xcb\x11\xf7\x6b\x97\xec\xd3\xae\x53\x57\xa3\x8b\x1b\x48\x0d\x49\xd6\x6d\xd4\x93\xcb\x0b\xf2\x1d\xb6\xbc\x5b\xa4\xbe\x42\x6a\x94\xee\xce\xe4\x8c\xf2\xce\x85\x36\xa6\x71\x61\x6a\xd7\xdd\x4b\xdf\x2c\xc1\x76\xc3\x1a\x21\x63\x3e\x29\x8d\x06\x66\xb5\xa6\x3d\x88\xda\xa3\x08\x20\x95\xfc\x11\x58\x82\x5c\xc4\x61\x25\x73\xb8\x15\x04\xa6\xe0\x5d\x93\x44\x31\xa1\x38\xf8\x49\x02\x67\xb5\x2d\xf7\x86\xf5\x05\x31\xbc\x10\x85\x94\x3e\x79\x23\x27\x5c\xb8\x53\x29\xad\x1b\x6d\x4c\x79\xd6\x76\x32\xf6\x52\xc5\x93\x4b\x15\x4a\x65\xe7\x82\x8e\xb2\x36\x51\x00\x31\x59\xcf\x28\xf8\x39\x19\xbc\x7d\x9c\x72\x65\xfe\x4f\xae\xaf\xdf\x80\x4d\xbc\x14\x4e\xd6\x05\x7b\xb1\x25\x6b\x3e\xd2\x1f\x0f\xe0\x6e\xcf\x0c\x52\x9a\x0d\x30\xee\x2e\x44\x6a\x3a\xcb\x54\x14\x76\x62\xdb\x43\xa4\x3f\x1f\x39\x8b\x9e\xfb\x11\x23\x37\x53\x9e\xdc\x5e\x06\xa6\x6f\x59\x98\x7b\x22\xb8\x15\x31\xa1\xfa\x6f\xbb\x24\x88\xb6\xab\x97\xdd\x15\xd8\x9b\x80\x9e\x5f\xdb\x01\x9b\x66\x08\x55\x4a\x26\xbc\xf2\x73\x80\xb9\xa4\x22\xf8\x29\x10\xfc\xdd\x0e\x02\x78\xfa\x96\xbc\xc9\x2d\x9a\xab\x7a\xaa\x42\x5e\xc4\x85\x1b\xeb\x4e\x3b\x8e\x5b\x63\x03\x94\xee\x9b\x08\x97\xdb\xc9\xa6\x35\xa3\xbd\x8b\xe2\xb6\x8b\xe4\xa4\x24\x57\x65\x71\x61\x99\x3c\x3e\xb7\xc5\xe5\xdb\xd9\x50\xdb\x24\x32\x34\x69\xc3\x35\x4f\x1d\xde\xb3\x66\x7c\x38\x4c\xb9\xcc\xcb\x0c\x63\x25\xb6\x07\x17\x77\xd6\x59\xfc\xce\x8e\xcc\xfa\x8f\x01\xb4\xd9\x35\x10\xf8\xb7\x81\xb9\x19\x88\x64\x2f\xbe\xf9\xfa\xeb\x5f\x3b\x0a\x67\x5b\x15\xf8\x21\x60\x38\x5b\x9a\x44\xf7\x99\x36\xfb\x4c\x9b\x70\x2b\x3e\x24\x8c\xea\x8e\x73\x69\x3a\x86\xb8\x76\x0b\x6f\x6d\x9f\x2d\xd3\x3a\x08\xb6\x6b\x00\x6c\x87\x7c\x98\x1d\x65\xc1\x74\x8e\x05\xed\x92\xf1\xb2\xcf\x73\xf9\xad\xe5\xb9\x6c\x12\x03\xda\x3d\xa7\xa5\x4b\xec\xe7\x6f\x29\x7f\xa5\xc3\x61\x6c\x9f\x67\xd1\x3d\xbb\xa2\x3b\x9e\x5d\x77\xcb\xd6\x26\x25\x8d\x42\xfb\x8c\xd5\x22\xaa\x0a\x82\xae\xf0\x20\xe2\x63\x69\x69\x0e\xd6\xa3\xe8\x10\xa4\x83\x02\x85\xcd\xcb\x2e\xb5\x04\xad\x4e\xfe\xfe\xba\xe6\xda\xf0\xb7\x9f\xc6\xa3\xf1\xdb\x74\x19\xec\x0b\x83\x3c\x6f\x9b\xb6\x8a\xb0\x45\x9c\x25\x01\xce\x3a\x30\x62\x39\x0a\x31\x0d\xab\x33\x72\x72\x79\x61\xd4\x65\x48\x9f\xa1\x99\x1a\x92\x06\x3e\xed\xec\x92\x96\xaf\x3b\xfe\x4c\xb5\x66\xb3\x5c\xb7\x5f\xec\xbd\x49\xfb\xc9\x4d\xda\x1b\xdb\xe3\x3e\xfa\x17\x7d\x05\xc8\x72\x46\xc5\xc0\x9c\x28\x30\x6e\x47\x5e\xb0\x1a\x09\x1e\x12\x17\x95\x8b\x73\x41\x0b\x86\xa0\x4f\x71\xc5\x5b\x1a\xd4\x3f\x7c\x18\x23\x24\xb4\xbd\xf1\xc8\x91\x81\xd6\x4e\x5a\x22\x17\xc2\x3e\xed\x70\xfc\x2c\xb8\x43\x15\x70\xe1\x48\x6f\xd6\x53\x86\xcc\xfa\x12\x12\x51\xaa\xa7\x62\x49\x18\x45\x61\x9a\x65\xf2\x1e\xbf\x1d\x32\x30\x33\xfb\xa6\x2f\x36\xc3\x6a\xc4\xc8\x8c\x1b\xa5\xda\x1a\x3f\xc3\xee\xa0\x2b\xd2\x48\xd4\xac\x40\x81\xb5\xb0\xde\xac\x6b\xa6\xc3\x85\x36\x0a\xa9\xc0\x40\x68\xf3\x6f\x17\x78\x83\xa8\xb8\x96\x26\x8c\xd8\x94\xde\x71\x59\x16\xf8\xb6\x96\xa4\x67\x7f\x02\x96\x30\x97\xa5\x37\x4d\x61\x95\x44\x3f\x3a\xd5\x30\x4f\xef\xaa\x1f\x41\x94\x4f\xa5\xb3\x25\x0c\xd8\x67\xae\xf4\xe2\x58\xdc\x14\x39\xd0\xb6\x5d\xed\x9b\x3b\x95\x1b\xb6\xd0\xb9\x22\xda\xc7\xf0\xbd\x58\x30\xb9\xbb\x86\x9f\x7e\x45\xf5\xd0\xd6\x62\x91\xee\x65\x9d\x5d\xcb\x3a\xde\x5d\x95\xf1\x64\xde\xb9\x52\x58\xe5\xa6\x32\xaf\x93\x6f\xa9\x62\x29\x79\x4b\x05\x9d\xa0\x5a\x76\x78\x7d\xf9\xed\xdb\x23\xb3\x6c\xa0\xf6\x5d\x9c\x35\xfa\xb2\xae\xc3\x3e\xbc\xdb\x65\x1a\xc4\xc2\x08\x37\xe0\x44\x1d\xc7\xb8\xd3\x34\x0e\xe2\xb9\x49\x3b\x80\xd8\xc5\xd4\xcb\x7a\x8d\xc7\x1a\x51\xb8\x9b\xa5\x5b\x56\x75\xe4\x42\x69\x9a\x65\x97\x19\x15\x27\x79\x5e\xc8\xbb\x66\x4d\x38\x4e\x0c\xb7\x0f\x3a\xd6\x8e\xb1\x0f\xee\x66\x8e\x13\x0d\xbe\x5e\x41\x2e\xaa\xf6\x87\xe4\x42\x7b\x85\x58\x0a\x60\x83\xbd\x93\x52\xcb\x19\xd5\x3c\xe9\x19\xbd\xb9\xf7\x96\x8a\x92\x66\x8d\x11\x46\x2b\x87\xb1\x4c\xac\x5b\xf9\xd2\x72\x70\xb4\x16\xaf\xad\x94\x0f\x56\xbf\xaf\x69\x61\x68\xcb\xe9\xf5\xc7\x4e\xef\x2a\x4d\x75\xb9\x40\x39\x57\x50\xf3\xe5\xf4\x7b\x40\x32\xaa\xf4\x87\x3c\x35\x27\xb9\xf6\xeb\x2a\x22\x9d\x50\x4d\x33\x39\xf9\x2f\x46\xb3\xe6\xfd\x1c\xed\x93\xd3\xf0\x69\x67\xfc\xc1\x2d\x73\x5d\x8e\xfc\x83\x07\x8a\x18\xa1\xd8\xe5\x6b\x17\x2c\x63\x77\x54\x68\xf7\x3a\x56\xca\x56\x07\x76\xfc\xb0\x8b\x78\x65\xf0\x4c\x99\x66\xc5\x8c\x8b\xb8\xcd\x6b\x78\xf6\x54\x8a\x94\xa3\xa9\x0f\x8c\x59\xf8\x46\xdc\xee\xf2\xad\xb6\xcc\x9c\xbf\xc2\x80\x1f\x53\x9e\xa0\x3f\xf1\x54\xe0\x63\x23\x2b\x13\x4e\xf1\x26\x78\xae\xa3\xbe\x2d\xcc\x14\xb9\x15\x46\x98\x03\xcc\x8b\x66\x22\xb5\x96\xb7\xaf\xe3\xe9\x03\xb7\xc6\xd8\x85\xe5\x71\x91\x03\xdb\xef\x65\x86\xfe\x55\x5b\x0c\xaf\xf5\xd2\x40\xbd\x2b\xcb\x29\x68\xd3\xbe\xf3\xaf\x61\x72\x5f\xad\xba\x7a\xf4\xd0\x72\x8a\xdf\x4a\x58\x6a\x27\xd7\xb4\xc5\x4d\x8f\x69\x6d\x85\xf2\xbd\xa0\x7e\xb6\x90\xf2\xd6\xb2\xa8\x96\xf0\xe5\xb1\x32\x7c\x61\x83\xe2\x0a\xab\x3e\x50\x92\x73\x86\x40\x1d\x54\xd8\xc9\x02\xce\xc2\x68\x6a\x6f\x1a\x0e\x66\xd4\x38\xf8\xad\x6f\x7d\xcd\x68\xd8\xb5\xb1\x0b\xce\x38\x4c\x11\xa8\x02\x9c\x05\xc7\xdf\x49\xeb\x28\xb5\x09\xa5\x86\x06\x00\xdf\xee\x13\x55\x26\x53\x42\x95\xe9\x9a\xd9\xd0\xe6\xc4\xb3\xe1\x8c\x0a\x3e\x66\x4a\x0f\x3d\x0e\xad\xfa\xf1\xab\x9f\x86\xe4\xb5\x2c\x88\x8d\xc3\xee\x3b\x04\x08\xdb\xcf\x6a\x5f\x70\x85\x83\xf1\xef\x56\x9a\x66\x2e\x53\xdb\xe9\x7b\xe8\xac\xa6\xb7\x86\x87\x61\x67\x4b\x06\xee\x82\x57\xa4\x67\x84\xbc\xe0\xd3\xff\x30\x6c\xe9\x9f\x3d\x72\x78\x0f\x4c\xbb\x67\xfe\xec\xe1\x07\x7d\x2c\x61\xa8\x08\x57\x1f\xc6\x34\xbf\x82\x4f\x26\xac\x40\x95\x8f\x40\x3a\xdc\x91\x45\xb0\x10\x32\x78\xd8\x79\x7e\x2b\x15\xb1\xde\x91\x1f\xbf\xfa\xa9\x47\x0e\xe3\x71\x11\x2e\x52\xf6\x99\x7c\x85\xa6\x5f\xae\xcc\x18\x8f\xac\x03\x45\xcd\x85\xa6\x9f\x4d\x9b\xc9\x54\x2a\x26\x50\xfd\xd6\x92\x4c\xe9\x1d\x23\x4a\x1a\xad\x95\x65\xd9\xc0\x9a\xb5\xc9\x3d\x05\x54\x11\x37\x95\x90\x04\x4e\x72\x5a\xe8\x68\x4b\x0c\xad\x55\x03\xbe\x66\x96\x6d\x22\x9c\xfb\x77\xcc\x85\xf5\x19\x59\x6f\x95\x59\x73\x48\x69\xc4\x45\xd2\x92\x24\x53\x2a\x26\x3e\x8f\x7a\x5c\xea\xb2\x60\x6b\xdc\x2d\x2d\xcf\xc0\x2d\x17\x9d\xd2\x6d\xbf\xe7\xa2\xee\xb9\x6f\xb6\x05\x4d\xb8\x76\x41\xff\x36\x90\x4f\xcf\x8f\xcd\x2a\x14\x7c\x54\x6a\x59\xa8\xe3\x94\xdd\xb1\xec\x58\xf1\xc9\x80\x16\xc9\x94\x6b\x96\x98\x61\x1d\xd3\x9c\x0f\x12\x29\xcc\x8a\x03\x82\xc0\x2c\xfd\x1d\x14\xc1\x1c\x98\xae\xae\xc1\x35\x6e\x39\xe8\xf5\x86\xb0\x27\x35\x80\xed\x6c\x8c\x2d\x6c\x38\x8b\x03\x45\x7b\xca\x23\x8c\x16\x8c\x17\xc7\x3b\x19\xac\x83\xe5\xed\xce\x63\x0e\x2c\xd2\x74\x52\x6f\xc3\x1c\x3b\x8c\xd2\x80\x53\x19\x51\xca\x19\x4d\x91\x94\x52\x31\x7f\xf0\xcd\x6f\xa6\x14\x00\xd9\x93\xf9\x20\xc1\xfa\xf6\x03\x2a\x52\xf3\x6f\xcc\x47\x49\xe6\x3b\x99\xc3\x92\x77\x22\x04\x1f\x2e\xce\x1e\xe7\x48\x94\x7c\x07\xa7\xde\xca\x6b\x2d\x85\x28\x14\x55\x21\x64\x47\x17\x25\x73\x4c\x33\x16\x50\xb9\x72\xad\xfe\x6f\xeb\x33\xf1\xc8\x5c\xeb\x44\xaa\xd5\x9e\x8e\x40\x76\x6c\xd9\xdf\x37\xd5\x1b\xf5\x9a\xf8\xa6\x31\x0b\x03\xe5\xb2\xe7\xa3\x61\x38\x05\x05\x18\xcc\x72\x1f\x6d\xab\x3d\xe4\x7c\xf4\xa6\x23\x83\x46\x7c\xa0\xc4\x2b\x25\xeb\x15\xa8\x4a\x7f\x89\x2a\x6d\xe1\xa0\x34\x53\x9a\xd0\x3b\xca\x33\xb0\xa8\xcb\x91\x62\xc5\x1d\x96\x3c\xb2\xb0\x78\xb4\xae\x67\xd9\xaa\x06\x28\x46\x3d\x92\xe6\xe3\xc6\xb0\xb8\x2a\xab\x06\x00\xda\x50\xad\xf7\x4b\x7b\xbd\x13\xbd\x07\xd5\xcb\xa5\x3f\x9b\x2f\x6c\xa8\xc6\x98\xfd\xf7\x5f\x8c\x16\x7a\xc4\xa8\xbe\xe1\xab\xf8\xee\xc2\x96\x8e\xde\x73\x06\x97\x6a\x43\xdf\x33\x32\x91\xda\x88\x58\x25\xec\x7d\x94\x49\x11\x80\xc6\x6f\xb4\x87\xde\xd1\xd5\x28\x6f\x0a\x0a\x79\x2f\x52\x74\x1c\x66\xfc\xe2\xe2\x38\xad\x74\x6c\x77\x92\xc6\xa7\x11\x02\x42\x0a\x66\xd7\x0e\x3d\x10\x40\x81\x1e\x67\xc8\x33\xa6\xd4\x4a\x68\x88\x38\x84\x0f\x9f\xc6\xa3\x5c\x73\x87\xcd\xdc\x6f\x98\x3f\x61\x04\xe8\x94\x69\xca\x33\x77\x94\x71\x2a\xfc\x2c\xad\xa3\xae\x2b\x07\x58\x30\xaa\x56\x09\x08\x75\x44\x2c\x25\x05\x76\x5a\x0a\x36\xb8\x97\x45\x4a\x4e\xe9\x8c\x65\xa7\x54\x31\xdb\x56\x98\xae\x86\x6b\x74\xa0\x76\xda\xe5\x66\xdb\xd7\x92\x2e\xa3\xf1\xc7\x6d\x22\xbb\x37\x2a\x15\x0b\x3b\xd8\x77\x26\xc8\x9b\xa2\x64\x7d\xf2\xda\x70\xaf\x3e\xf9\x20\x6e\x85\xbc\xdf\xae\xaf\x7a\xa5\xe7\x22\x0e\xb3\xb2\xc8\x2d\x00\x91\x67\x01\x61\x22\x83\x8f\xef\xee\x86\x3d\xb2\x04\x7f\x89\xa9\x31\x66\x36\xfe\x51\xd7\x23\xf3\xcf\x05\x13\x94\x51\x14\x0b\x39\x29\x98\x42\xcc\x95\x46\x40\xbf\xb6\x26\xe7\xef\x98\xb0\x19\x6f\x6b\xbb\x77\xd1\xf4\x96\xeb\xa9\xe3\x6b\x93\xea\x17\xbb\xde\xf6\x63\x79\xd6\x28\x6a\xac\x8e\xc2\x0b\x3a\xba\xc4\xf8\xb4\xac\x87\xcd\x46\xa7\x80\xeb\x05\xcf\xa2\x50\xb2\xca\x3a\xea\x46\x77\x7a\xfd\x71\xf9\x64\x2f\xe5\x7d\xeb\xf8\xd3\x7a\xb3\xd4\xb6\x06\xa9\xb5\x67\x66\xad\x11\x6a\x6f\x7e\xda\x9b\x9f\x7e\x4d\xe6\xa7\xb5\x3b\x7e\x95\xc9\xe9\xd7\x61\x6c\x5a\x3b\xc4\x55\x06\xa6\x67\x69\x5a\x6a\x35\xa2\x95\xe6\xa4\x67\x6b\x48\x5a\x3b\xb4\x96\xc6\xa3\x7f\x1d\xb3\xd1\xda\x19\x5b\x61\x2a\x7a\x86\x46\xa2\x36\x02\x19\x4b\xdb\x88\x89\x17\xc1\xc3\xa1\xa0\x58\x15\x4c\xf4\xcd\xb9\x90\x9a\x50\x9c\xd9\x54\x5a\x34\x02\xdc\xda\xbe\x1d\xd8\xce\xb5\x97\xbd\xac\xc0\x68\xcb\x09\x2e\x74\x96\x9c\x9d\x5f\x5e\x9d\x9f\x9e\xdc\x9c\x9f\xd5\xe5\xbb\xa6\x99\x5e\x23\x89\xad\xb6\x41\x0c\x02\x49\x6c\xc9\x03\x86\x20\x2f\xf9\xc9\xec\x81\x25\x3f\x95\x25\x6f\x7a\x6b\x7b\xb9\x70\x2b\x2e\xb7\x15\xff\x58\x7f\x3a\xdb\x1e\x4f\x73\x3a\x61\xb7\x60\xc4\x98\x91\x7b\xa6\x32\x4b\x95\x8b\x35\xbd\x38\xf3\xd9\x4b\x5c\x24\x59\x99\x1a\xe1\xe2\xc3\x87\x8b\x33\x35\x24\xe4\x5b\x96\xd0\x52\x81\x15\x26\x95\xe2\x40\x93\xf7\xef\xde\xfc\x37\xc4\x50\xc3\x13\x7d\x0f\xf6\x01\x08\xb2\x9c\x22\x08\xae\x46\x14\x32\xf2\x2d\x43\x41\x05\xbe\x9c\xd0\xdc\x50\x31\x85\x55\x16\x34\xc8\x22\x53\x96\xe5\x86\x62\xde\x32\x52\x61\x7f\x9a\x86\xab\x1a\xe6\x2e\xe4\x71\xc2\x34\x66\x3a\xad\x8a\x6a\x5c\x39\x6b\x6b\x2c\xae\x5b\xd8\x5a\x23\xf5\xd1\x6a\xe3\xf7\x54\x59\x8b\x55\x63\x6f\xd7\xac\xef\x7a\xfb\xcc\x72\x13\xc7\x12\xe3\x06\x92\x67\xf8\x6b\xa1\xcf\xa6\xb3\x95\x1d\x03\x83\x48\xb8\x6e\x6d\x4d\x5d\x1e\x06\xd4\x8c\x59\xbf\x60\xcb\x60\xf5\x49\x8e\x3e\xec\xa3\xa8\x83\x2e\xb7\xeb\x0b\x14\xbc\x48\xa3\xea\x92\x36\xda\x2e\xbe\x57\x8e\x7c\x7d\xd1\xaa\xbf\xd6\x22\x43\xfe\xf1\xcf\x2f\xbe\xf8\xff\x03\x00\x00\xff\xff\x8b\xf3\x10\xc0\x16\x33\x0a\x00") +var _olmManifests0200CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x77\xe3\xb6\xb5\x28\xfe\x7f\x3f\x05\x96\x9b\xf3\xb3\xdd\x48\xf2\x4c\xd2\x93\x7b\xea\xdb\xd3\x2c\xd7\x76\x52\xff\x32\xe3\xd1\x1a\x3b\xe9\xed\x9d\xe4\xa4\x10\xb9\x25\xa1\x26\x01\x16\x00\x65\xab\x27\xe7\xbb\xdf\x85\xbd\x01\x3e\xf4\xb2\x24\x72\x66\x3c\x0e\xd1\xb5\x9a\xb1\x48\x82\xe0\xc6\xc6\x7e\x3f\xfa\xfd\xfe\x6f\x78\x26\x7e\x00\x6d\x84\x92\xa7\x8c\x67\x02\x1e\x2c\x48\xf7\x97\x19\xdc\xfd\x87\x19\x08\x75\x32\x7b\xf9\x9b\x3b\x21\xe3\x53\x76\x9e\x1b\xab\xd2\xb7\x60\x54\xae\x23\xb8\x80\xb1\x90\xc2\x0a\x25\x7f\x93\x82\xe5\x31\xb7\xfc\xf4\x37\x8c\x71\x29\x95\xe5\xee\x67\xe3\xfe\x64\x2c\x52\xd2\x6a\x95\x24\xa0\xfb\x13\x90\x83\xbb\x7c\x04\xa3\x5c\x24\x31\x68\x9c\x3c\xbc\x7a\xf6\x62\xf0\xd5\xe0\x8b\xdf\x30\x16\x69\xc0\xc7\x6f\x45\x0a\xc6\xf2\x34\x3b\x65\x32\x4f\x92\xdf\x30\x26\x79\x0a\xa7\x2c\xe2\x96\x27\x6a\x42\x8b\x30\x03\x95\x81\xe6\x56\x69\x33\x88\x94\x06\xe5\xfe\x93\xfe\xc6\x64\x10\xb9\xb7\x4f\xb4\xca\xb3\x53\xb6\xf2\x1e\x9a\x2f\x2c\x92\x5b\x98\x28\x2d\xc2\xdf\x8c\xf5\x99\x4a\x52\xfc\xb7\xff\x78\x7a\xed\x0d\xbe\x16\x7f\x4f\x84\xb1\xdf\x2d\x5f\x7b\x25\x8c\xc5\xeb\x59\x92\x6b\x9e\x2c\x2e\x18\x2f\x99\xa9\xd2\xf6\xba\x7c\xbd\x7b\x5d\xc4\xad\xd1\x11\x5d\x16\x72\x92\x27\x5c\x2f\x3c\xfb\x1b\xc6\x4c\xa4\x32\x38\x65\xf8\x68\xc6\x23\x88\x7f\xc3\x98\x07\xa1\x9f\xaa\xcf\x78\x1c\xe3\xb6\xf0\x64\xa8\x85\xb4\xa0\xcf\x55\x92\xa7\xb2\x78\x95\xbb\x27\x06\x13\x69\x91\x59\x04\xfd\xed\x14\x58\xa6\xc1\xda\x39\x82\x84\xa9\x31\xb3\x53\x08\xef\x2e\x9e\x62\xec\x1f\x46\xc9\x21\xb7\xd3\x53\x36\x70\x10\x1e\xc4\xc2\x64\x09\x9f\xbb\xd5\x54\xee\xa2\x6d\xba\xa0\x6b\x95\xdf\xed\xdc\x2d\xdd\x58\x2d\xe4\x64\xd3\x52\xdc\x7d\xdb\xaf\x81\x40\x73\x3b\xcf\x96\x97\xb0\xf0\xe3\xb6\xef\xcf\xf2\x51\x22\xcc\x14\xf4\xf6\x8b\x28\x1e\x59\x5a\xc3\x70\xc5\x95\x35\x0b\xa9\x4c\x1a\x0e\xd4\x60\xe9\x30\x2c\xbd\xe0\x6c\xb2\xfc\x8d\x31\xb7\xe1\x47\xba\x69\xf6\x92\x27\xd9\x94\xbf\xf4\x3f\x9a\x68\x0a\x29\x2f\xf1\x41\x65\x20\xcf\x86\x57\x3f\x7c\x79\xb3\x70\x81\xd5\xa1\x53\xc3\x73\x26\x0c\xe3\x4c\x43\xa6\x8c\xb0\x4a\xcf\x1d\xb4\xce\x6f\x7e\x30\x3d\x76\xfe\xf6\xc2\xf4\x18\x97\x71\x71\xf0\x58\xc6\xa3\x3b\x3e\x01\x33\x58\x5a\xab\x1a\xfd\x03\x22\x5b\xf9\x59\xc3\x3f\x73\xa1\x21\xae\xae\xc2\x81\x27\xc0\x64\xe1\x67\x07\xff\xca\x4f\x99\x76\xef\xb4\x95\x83\x4c\xa3\x42\xe5\x6a\xbf\x2f\x7c\xe1\xa1\x03\x03\xdd\xc7\x62\x47\xe0\xc0\x20\x0a\xf8\x33\x06\xb1\x87\x1d\xa1\x86\x30\xee\xfb\x35\x18\x90\x44\xf2\xdc\xcf\x5c\xfa\x6f\x1a\xb0\x1b\xd0\xee\x41\x77\xdc\xf3\x24\x76\x94\x70\x06\xda\x32\x0d\x91\x9a\x48\xf1\xaf\x62\x36\xc3\xac\xc2\xd7\x24\xdc\x82\xb1\x0c\x4f\xad\xe4\x09\x9b\xf1\x24\x07\x02\x65\xca\xe7\x4c\x83\x9b\x97\xe5\xb2\x32\x03\xde\x62\x06\xec\xb5\xd2\xc0\x84\x1c\xab\x53\x36\xb5\x36\x33\xa7\x27\x27\x13\x61\x03\x0d\x8f\x54\x9a\xe6\x52\xd8\xf9\x09\x92\x63\x31\xca\x1d\x39\x3c\x89\x61\x06\xc9\x89\x11\x93\x3e\xd7\xd1\x54\x58\x88\x6c\xae\xe1\x84\x67\xa2\x8f\x8b\x95\x48\xc7\x07\x69\xfc\x5b\xed\xa9\xbe\x39\x5c\x00\xdf\x4a\x64\x66\x81\x6c\x6e\x84\xb5\x23\x9e\x84\x45\xf4\x38\x7d\x4b\x09\x52\xf7\x93\x83\xca\xdb\xcb\x9b\x5b\x16\x16\x40\x60\x27\x08\x97\xb7\x9a\x12\xd8\x0e\x50\x42\x8e\x41\xd3\x9d\x63\xad\x52\x9c\x05\x64\x9c\x29\x21\x2d\x1d\xe9\x44\x80\xb4\xcc\xe4\xa3\x54\x58\x83\x38\x07\xc6\xba\x7d\x18\xb0\x73\x64\x61\x6c\x04\x2c\xcf\xdc\x49\x8a\x07\xec\x4a\xb2\x73\x9e\x42\x72\xce\x0d\xbc\x77\x50\x3b\x88\x9a\xbe\x03\xdf\xf6\xc0\xae\x72\xe0\xe5\x07\x96\xce\x18\x63\x81\x43\x6e\x75\xf3\xba\x43\xc9\xe8\x04\xae\xa2\xc0\x6c\xc3\x59\x74\x83\xc7\xb1\x06\xb3\xe2\xc2\xd2\x81\xa4\x1b\x09\x4f\xa6\xca\xb8\xfd\xe3\x96\xbd\x79\xf5\x9a\x45\x5c\xb2\xdc\x80\x3b\x3c\x91\x92\xd2\x21\x84\x55\x8c\x3b\x5e\xd6\x87\x07\x61\x10\x81\x34\x4c\x84\xb1\x7a\x3e\x60\xdf\x28\x9d\x72\x7b\xca\xfe\x18\x7e\xea\xe3\x74\x4a\x33\x91\xfd\xe9\xf4\x8f\x99\xd2\xf6\x4f\xec\x8d\x4c\xe6\x6e\xd2\x98\xdd\x4f\x41\xb2\x9b\xe2\xdb\xd8\x7f\x56\xfe\xf8\x56\x67\xd1\x80\x5d\x4d\xa4\xd2\xe1\x4e\x87\x55\x57\x29\x9f\x00\x1b\x0b\x48\x10\xaf\x0d\xd8\xc1\xe2\x0e\x6e\xdc\x45\x46\xe2\xd2\x58\x4c\x5e\xf3\xec\x51\xd0\x9c\x87\x3b\xdd\xbb\xdc\xeb\xab\xcc\xbb\xbc\x68\x15\xa2\xb2\xfb\x24\xf7\x4f\x1e\xdd\x31\xee\xdf\x92\xf2\xac\x6f\xf0\xd8\x54\xc0\xb4\x1d\x04\xce\xc3\x04\x0e\x7e\xe5\xcf\x57\x9e\x72\x0d\x76\xfd\xec\xea\x97\xed\xfc\x6c\x29\x86\x3c\x0a\xb4\xd7\xab\xb8\xc8\x16\xef\x98\xe8\x2c\x1a\xaa\x98\x3e\xfb\xd1\xb7\x7c\x5b\xbd\x9b\xc1\x43\xa6\x0c\x18\x16\x8b\xf1\x18\xb4\xa3\x3b\x6a\x06\x5a\x8b\x18\x0c\x1b\x2b\x8d\xfb\x95\xa9\x18\xcf\x64\xb1\x7f\x35\x56\x3b\x54\xf1\xb6\x1b\xe3\x5e\x8d\x0c\x83\x90\xd1\xa3\xe1\xda\xcf\x5d\x79\xda\xd9\x23\x87\xd7\x0d\xa9\x62\xb8\x81\x04\x22\xab\xf4\xea\x3b\x16\x60\x72\x5d\x79\xc0\x53\xfd\xf0\xd7\xfd\x54\x44\x53\x96\xe6\x06\xa9\xae\xd5\x39\xd4\xe0\x62\x15\x1b\x0b\xcb\x94\x64\x1c\x5f\xeb\x68\xfd\xf2\x93\x29\xb7\xd1\xd4\xdf\x71\x68\x58\xc2\x47\x90\x98\xc5\x79\x46\x80\x2c\x37\xce\x13\x88\xdd\x84\x48\x4b\x70\xce\x35\x9f\xf0\x08\x94\x18\x91\xb2\x42\xde\xde\x0c\x33\xf6\x18\x96\x11\xe0\x85\xd2\xc2\xce\xcf\x13\x6e\xcc\x3a\x9c\x5e\x82\xee\xd5\x18\xd1\x47\x8c\x05\xc4\x3d\x26\x64\x2c\x9c\x4a\x63\xc2\xb7\x1f\x9a\x62\xde\x81\xbb\xd7\x31\xb8\xca\xfd\x01\x42\xe1\x1e\x76\x2f\x92\xc4\x01\x2b\x86\x31\xcf\x13\x24\x92\xff\x02\xad\x98\x40\xec\xd4\x88\x57\x52\x85\xcb\x9b\x81\xb7\xe1\x5b\xad\x4a\x9c\x80\x58\x6a\x2f\x8f\x7c\xe5\x6d\x79\x3f\xe3\x1a\xaa\xd2\xb9\x67\x43\xee\x43\xf1\x73\x2b\x53\x6f\x5e\x1e\xd7\xba\xa6\xa6\x54\x87\xb0\x90\x6e\xd8\xcb\x65\xd5\xc1\x61\x99\x93\x3a\xca\x85\x22\xaa\x5b\xcb\x1d\xd6\xa1\x98\x47\x57\xc0\x30\x2e\xe7\xcc\x72\x92\x48\xb8\xc7\x5f\xbf\x63\x56\x8b\x2c\x01\xf6\xc7\x3b\x98\xf7\x48\x06\x84\xf1\x18\x22\xfb\x27\x96\x9b\x20\x15\xe1\xfd\xee\x8f\x42\xc8\xfe\x63\xf8\xd7\x9f\xd6\x7d\xf1\x56\xf8\xfc\xf8\xd9\xa7\x41\x4b\xda\x74\xc7\x02\x84\x2e\xf1\x81\x05\xe4\x24\x08\xd0\x5c\x0e\x3e\xf8\x59\x03\x76\x99\x66\x76\xce\x52\xe0\xd2\x84\x93\x9d\x24\xb5\x9b\xcd\x80\xfd\xd5\xd1\xc1\x0a\x1a\xf3\x24\x51\xf7\x85\x4c\x8c\x18\x72\xad\x6e\xfc\x79\xef\xb1\xa1\x86\x31\xe8\xf2\x17\x24\x93\xd7\xea\xf2\x01\xa2\xdc\xae\xa5\x00\x55\xb8\x6d\x40\x65\x1a\x77\x30\xdf\x01\x20\xdf\xc1\x3c\xf0\x6e\xfa\xb2\x3b\x98\x13\x32\xe0\x4f\x25\x0e\xf1\x2c\x4b\x04\x90\x78\xba\x09\x32\x77\x30\x37\x78\xbe\xdd\xf3\x77\x34\x3b\xb8\xfb\x7b\x25\x96\x04\x32\x7b\xe9\x24\x24\xf3\xbf\x09\x5f\x23\x95\x8e\x84\xa4\x97\xd1\xd4\x61\x2b\x70\xf6\x00\x50\x19\xe3\x9f\xf8\x9a\x36\xc0\x15\x16\xb5\x03\xcc\xde\x84\xef\x28\x65\x7f\xc6\xdd\x8a\x0e\x9d\x18\x9f\xd0\x89\x9f\x8a\x2c\xa8\x54\xb8\xf4\x01\xfb\x81\x27\xa2\xd4\x47\x09\x37\x08\x02\xf8\x55\x97\xff\xcc\x79\x32\x60\x17\x44\xcf\xf0\xeb\xfd\x4f\xfe\x26\x07\xc8\x7f\xe6\x62\xc6\x13\xc7\xbf\xad\x72\x14\x32\x8e\xb8\x8e\x91\xc3\x78\x3d\xcd\x28\xda\x3d\x8e\x84\xc0\x89\xa7\xe1\xb4\x97\x7b\x64\x50\x47\x64\x19\xd7\x56\x44\x79\xc2\x75\xb0\x3d\xcd\x5b\x81\x68\x89\x34\x37\x10\x29\x19\x6f\x3c\xc1\x6b\xa9\xab\x7f\xb6\x0a\x63\x64\x11\xa0\x85\x8a\x51\x44\x11\x29\x2c\x22\xe9\x51\x9d\x8d\xab\x71\x38\xd5\xc5\x11\xeb\x31\xe5\xb8\xc7\xbd\x30\x5e\x8d\x2b\x44\x65\x41\xa2\xf4\x71\x85\x3c\x16\xa7\x62\xc0\xfe\x3c\x0f\x9c\xa6\xc7\x84\x25\xde\x63\x9d\x5c\xd3\x0b\x02\x80\x47\x59\x0f\xec\xf2\x40\x8d\x95\x06\x27\xde\x1e\xc5\x0a\x9f\x81\x99\x88\xec\xf1\x80\xfd\x5f\xc7\xcc\xdc\xc6\x4b\x98\x70\x2b\x66\x10\x50\x3c\x30\x3e\xab\xc1\xa9\x7e\x8c\x1b\xf6\x82\x1d\xe1\x63\x4c\xa4\x29\xc4\x82\x5b\x48\xe6\xc7\x6c\x34\xc7\xd7\x98\xb9\xb1\x90\x6e\xb3\x75\x4e\xa9\x9f\xd4\xec\x40\xcb\x63\xec\x55\x14\x21\xed\x57\xbf\xdf\x70\x27\x2e\x76\x87\x9d\xfd\x01\x15\xeb\x1a\xa9\x21\x5d\x7b\x61\x0b\x0b\x1e\xa4\x0a\x2a\x52\xd0\x0d\x61\xfc\x59\xe8\x95\xe7\x2a\x58\x36\x46\x50\x90\x99\x62\x83\xff\xe1\xf0\x80\x3b\xc5\x02\xb1\x9c\x30\xb7\x01\x8e\x8b\x68\x93\x6a\xb0\x96\xa3\xad\xd7\x5c\x19\x6a\xaf\x23\x6e\xe0\xab\xdf\xaf\x51\x09\xc8\xee\xe4\xf6\x7c\x59\xbb\x65\x5b\x30\xca\x72\xf2\x75\x9b\xf5\xe8\xb1\x2e\x5e\xbf\xd7\x0c\xc2\x29\x01\x8f\xaa\x2b\x85\xaa\xc0\x65\xb1\xdf\xfd\xa0\x11\xa2\x01\x9f\x0b\x09\x9a\x66\x73\xc4\x4f\x48\x63\xb9\xb4\x02\x29\x5b\xa1\x3b\x06\x5d\xf2\x5e\xd8\xe9\x2e\xea\x0a\xe2\x9a\x27\x34\x84\x5c\xde\x3a\xb0\x44\x1f\x76\x56\x2b\x83\x40\xfb\xb8\x9d\x61\x18\x44\x5f\x7a\x27\x37\x46\x4c\x9c\x94\xc9\xee\x41\x4c\xa6\x36\xb0\x93\xba\xb4\xe9\x7e\xf5\xaf\x10\xff\xc2\xd3\x94\x16\x4c\x40\x58\xe4\x00\x23\x70\x00\x34\x79\x0a\x71\xa0\x19\x31\x64\x20\x63\x90\xd1\x1c\xad\x5a\xc9\x0c\xf4\x80\x7d\x6f\xdc\x4e\xb1\xbf\x88\xc9\xd4\x81\x90\x5e\x5a\x15\x95\x50\x2a\x70\xac\xba\xbe\x02\xe1\x24\x7b\x27\xd7\x68\xa7\xd1\x38\xf0\x3b\x19\x28\xcc\x00\xf1\xc2\xfd\x86\xc5\x39\xda\xda\x16\x17\x91\x3b\x38\x0c\x50\x8a\xd5\x5c\x4e\x0a\x43\x42\xa1\x12\xd0\x81\x77\x9f\x34\x51\x64\x55\x43\xcb\xaf\xa3\x9d\x56\x95\x74\x54\x90\x29\xa4\x98\x43\x48\xfb\xe5\x17\x34\x6f\x50\x26\x3c\xe9\x51\x8c\x2f\x7e\x8c\xc3\x1c\x96\x4b\x02\x3e\x54\xf5\x91\x40\x66\x5e\xd0\x54\xab\x9e\x43\x72\xcc\xd3\xc5\x25\x97\x34\x5d\x73\x79\x07\x31\x4b\xe0\x41\x44\x6a\xa2\x79\x36\x15\x11\x4f\x92\x39\x1e\x53\x54\x07\x85\x35\x68\x45\xd9\x60\xb6\x59\x47\xc6\x0b\x17\xc0\xce\xe6\x0b\x03\x91\x06\xfb\xb8\x29\xec\x86\xee\x2b\x99\xb2\xe3\x80\x0e\xc4\x7e\x02\xc2\x11\x8f\x73\xc1\xde\xc3\xa3\xc8\x1d\x24\x44\x5d\x25\x2d\x78\x01\xa4\x82\xca\x03\x76\x85\x2c\x75\x04\x06\xb1\xfc\x0e\x20\x23\x4c\x4b\x84\xb1\xcc\xa4\x3c\x49\x7a\xcc\x08\x19\x01\x03\x1e\x4d\x09\x9c\x12\x20\x28\xd4\x56\x0b\x20\x31\xc8\xb1\xda\x79\xb1\x37\x20\xed\x6a\xa1\x66\xb3\xde\xb5\x41\xe7\xda\x0c\xc6\x82\xa6\x3c\x0e\xc9\x92\x16\x05\x9e\xe8\x7d\x4e\xa6\x74\xef\xed\xf0\x6a\xb2\x13\xdf\x58\x27\x7c\x4c\x1e\xa7\x35\xdf\xd7\x6e\x2f\xfc\x0c\x53\x75\x1f\x2c\xce\x4b\x87\xdc\x11\x5e\x13\xf6\x36\x16\x26\x72\x27\x1d\x62\x76\xae\xa4\x41\xf9\x94\x1c\x0f\xe8\x38\x98\xf1\x84\x50\x21\x4c\x9c\xa9\x24\xc1\x23\x9f\x07\x75\xc2\xc9\xf1\x92\x41\x3a\x82\x38\x86\xd8\x7d\x16\x2d\x65\x0d\x9b\x6b\x68\x2a\x0a\xfc\x61\xa8\x92\x64\x33\x17\xdb\xa8\x97\x6e\xa3\x95\x06\x00\x6c\x92\x8d\xea\xac\x2f\x40\x4c\x98\xe2\xcc\xc4\x60\x41\xa7\x42\x7a\xf1\xc8\x89\xba\x05\x60\x47\x60\xef\x01\x24\x8b\xa6\x10\xdd\x15\x47\xc9\xfb\x6d\x16\x76\xcd\x3b\x8d\xea\x14\xab\x74\x89\xa9\x24\x41\x45\xc3\x00\x30\xe1\x74\x02\x09\xf7\xe1\x99\x85\x33\x5a\x21\xf6\x7c\xc6\x45\xc2\x47\x09\x20\xd7\x2c\xfe\xea\xd5\xfc\x47\x81\x9f\x67\x79\x92\x38\x21\x56\xc6\x6c\xf2\x76\x78\xce\xac\xe6\xe3\xb1\x88\xdc\xa5\x58\x68\x88\xac\xb7\x49\xac\xfb\x84\x4d\xe2\xda\xda\x13\x61\x2c\xb7\xf9\xd2\x1e\x6d\xd8\xe0\x4d\x1b\xeb\xf4\x10\xb1\xd6\x40\x54\xdb\xca\xb7\x75\x65\xc5\x2d\x03\x48\xd9\xaa\x19\x53\x07\xec\x5a\xa1\x8e\xc0\x2d\x7b\x0d\xc6\xb1\x5d\x04\xd0\x5b\xe0\x46\xc9\x0a\x75\x45\xe9\x57\x8b\x89\x90\x3c\xf1\x1f\x85\x5e\x1f\x27\xa2\x0b\x25\x0b\xdd\x83\xcf\xdd\xa1\x4c\xc5\x44\x73\x5b\x10\xc5\x72\xdd\x9e\xbb\x78\xbe\x38\xce\x6d\xae\x61\xc0\xce\xe4\x1c\xf7\x7b\x0c\xdc\xfd\xe0\x66\xb6\x5a\xc5\x79\xe4\xe4\x25\x47\x60\x73\x53\x9d\xa4\x55\x32\x5a\x83\xda\xc1\x79\x78\x49\x10\xf4\x8c\x3b\x00\x5c\x78\xe3\xa9\x92\xc0\xb8\xc9\x9c\x1e\x17\x70\x32\xd7\x68\xc4\x2e\x00\x8c\xcc\xe2\x6c\x78\xc5\x42\x68\xc8\x80\xf5\xfb\x7d\x76\xeb\x7e\x36\x56\xe7\x11\xf2\x17\x77\x84\x64\xec\x39\x05\x61\x1f\x7e\x24\x47\xb1\x13\x3f\x83\x79\xcb\x07\x89\x60\x19\xb7\x53\x36\x20\xc0\x0f\x2a\xa0\x60\xec\x1b\xc7\x6b\x1e\x78\x9a\x21\xde\x3b\xd2\xfd\x8d\x52\x37\xb4\x43\xf4\xc2\xff\xc6\x0f\x3d\x39\x59\x44\x0a\x35\x72\x32\xaa\xb7\x20\x22\x6e\x8c\x95\x3a\x34\xf5\x6f\x1a\x84\x87\xbf\x93\xea\x5e\xae\x5a\x02\xbe\x93\x6b\x38\x65\x3f\x1e\x9c\x85\x23\xf8\xe3\x41\x8f\xfd\x78\x30\xd4\x6a\xe2\x64\x57\x21\x27\xee\x07\x87\x59\x3f\x1e\x5c\xc0\x44\xf3\x18\xe2\x1f\x0f\xc2\xd4\x9f\x67\x4e\xd5\x7a\x0d\x7a\x02\xdf\xc1\xfc\x3f\x71\xc2\xda\xa5\xc0\x1e\xfe\x33\x75\xf7\x14\xd7\x1c\x4f\x76\x8c\xeb\x3f\x53\x9e\xd5\x7e\x7c\xcd\xb3\xda\x44\xe7\x25\x02\xbe\xfb\x29\x05\xcb\x67\x2f\x07\xe5\x56\xff\xfd\x1f\x46\xc9\xd3\x1f\x0f\xca\x6f\xea\xa9\xd4\xa1\x4c\x66\xe7\x3f\x1e\xb0\xda\x0a\x4e\x7f\x3c\xc0\x35\x84\xdf\xc3\xa2\x4f\x7f\x3c\x70\x6f\x73\x3f\x6b\x65\xd5\x28\x1f\x9f\xfe\x78\x30\x9a\x5b\x30\xbd\x97\x3d\x0d\x59\xcf\x49\x52\xff\x59\xbe\xe1\xc7\x83\xbf\xb3\x1f\x65\x58\x34\x2a\x8a\xb4\xd3\x86\xfd\xcf\xc1\x06\x7e\xbf\x81\x29\x6c\x56\xee\x9c\xf6\x96\x70\x63\x6f\x35\x97\x46\x84\x30\x8a\xb5\xb7\xa6\x44\x0c\xd6\x5e\xd7\x48\x20\xd6\x5e\x26\x2c\x59\x7b\x79\x0d\x6b\xdd\x86\xad\x2d\x7f\xc3\x96\x26\xe9\xe5\x07\x83\xbc\xe3\xae\x94\x46\x9c\x62\x8f\x1c\x83\xf0\x77\xbb\x83\xea\x84\x7c\x77\xfe\x3d\xf1\x73\xe2\xa4\xc4\x7d\x1b\xf8\xc3\x5d\x68\xff\x85\x0b\x34\x97\x31\xe8\x64\xee\xc4\x8d\x72\xd6\x68\xea\xb4\x81\x78\xc0\xc8\xa8\xc0\x0b\x13\xce\x9d\x3b\x60\xc8\xba\x64\xc5\xb2\x8d\xeb\x2a\x66\x74\x84\x85\x08\x82\x9f\x06\xb9\x60\x14\x41\x66\x91\x0d\xee\xef\x69\x61\x15\x8b\x8b\x13\xbb\xfa\x76\x3d\x7a\x78\xe4\xd8\x12\xf0\xfe\x6e\xef\xb4\xce\x53\xee\xf8\x0a\x8f\xdd\x7a\xcb\x6b\xa4\xdb\x91\x2e\x46\xf4\x96\x8f\x54\xee\x6d\xbf\xc5\x3e\x78\x50\x7b\x2e\x83\x52\x5b\x66\xe7\x8f\x9a\x53\xb6\xfa\xf8\x94\x3f\xbc\x02\x39\xb1\xd3\x53\xf6\xe5\x17\xff\xeb\xab\xff\x58\x73\x23\x11\x4d\x88\xbf\x05\xe9\x0d\x45\x5b\x82\x61\xf9\xc1\x45\x8b\x62\x19\xe9\x34\x29\xef\x29\x2c\xe0\x25\x06\xdd\x73\xf4\x63\x7a\x5e\x9a\x67\x0e\x2e\x8e\x0b\x90\x21\x22\x82\x9e\x93\xa0\x56\x4e\x26\x0a\xe2\x9e\xcc\xd9\xcb\x2f\x7a\x6c\xe4\x41\xbc\x4c\xd6\xdf\x3d\xfc\x34\x58\xb1\x64\x61\xd8\x1f\x7a\x0b\xeb\x11\x86\xb9\xad\x52\x63\x44\x1c\xd2\x3f\x35\x10\x9b\x0c\x96\x82\x65\x36\x09\xc5\x7a\x1f\xdb\xb8\xc7\x8c\x85\xdb\x19\x0a\x53\x21\x45\x9a\xa7\xa7\xec\xc5\x9a\x5b\x88\xa4\x6d\xb9\x9b\x74\x73\x29\x25\x70\x47\xba\x26\x9a\xa7\x4e\x1e\x8a\x98\x88\x41\x5a\x31\x16\xa0\xab\xa8\x8d\xb6\x00\x7a\x30\xb8\x62\x0b\x28\xa2\x97\xd6\xd1\xa1\x0a\xb2\x0f\x49\x08\xd2\xc8\x9d\xbd\x6b\x27\xaa\x12\xa8\x79\x06\x74\x1a\x48\xbb\x61\xf0\x90\x91\x1c\x5b\xf1\x51\xa4\xc0\xa5\x90\x93\xe0\xfd\x0d\x86\x66\xe2\xc6\xf7\x53\x40\xd6\x53\x18\x31\xc9\x19\x10\x39\x4d\x2a\x46\xa5\x8a\xb3\x49\xce\x35\x97\xd6\xe9\xb8\x67\xc3\x2b\x12\xe0\x17\x0d\x9e\xbc\x0c\x09\x0a\xa7\x91\x8e\x2a\x11\x2b\xb7\x44\x1f\x46\x84\x27\xb6\xbd\xa3\xfa\xf2\xc5\x17\x1b\xb7\xbc\xb8\x6f\xbd\x7f\x8f\x5b\x0b\x5a\x9e\xb2\xff\x7a\x77\xd6\xff\xbf\xbc\xff\xaf\x9f\x8e\xfc\x3f\x5e\xf4\xff\xf0\x73\xef\xf4\xa7\xdf\x55\xfe\xfc\xe9\xf8\xeb\xcf\xd6\xcc\xb4\x5a\xd2\x5f\x83\x3e\x9e\x89\x04\x21\x32\xec\x68\x0f\x39\x8c\x1a\xb3\x5b\x9d\x43\x8f\x7d\xc3\x13\x03\x3d\xf6\xbd\x44\xd6\xd0\x10\x68\x20\xf3\x74\x93\x26\xd8\x67\x07\xee\xad\xab\x85\x8f\xe2\x16\x5c\xd2\xe6\x7b\xfc\x72\x37\xe9\xb6\xdb\x01\x29\xd8\x21\x2a\x94\xa6\x12\x7a\x86\xb1\x4a\xee\x20\xa9\x81\x17\x7f\x07\x91\x4a\x4f\x2a\xa1\x69\x4e\xee\x7e\xcd\xe5\x9c\x95\x64\x8d\x84\xd5\x45\x4c\x37\xd6\xd1\x26\x1e\x69\x65\x4c\x11\x5b\x67\x58\x22\xee\x80\x9d\x95\x4a\xa5\x23\x96\x23\x88\x38\x0a\xea\x7a\x24\xac\xe6\x64\x11\x0e\xb2\x65\x69\x6e\x1a\xe7\x09\x3b\x72\xba\xec\x00\xe3\x29\x96\xa8\xeb\xb1\x37\xed\x8e\x44\x22\xec\x9c\xf4\xec\x48\xc9\x71\x22\xbc\x7e\x90\x66\x4a\x5b\x2e\xad\x37\x42\xc2\x04\x1e\x98\x28\xfd\xe2\xc2\xb0\xa3\x58\x9a\x97\x2f\xbf\xf8\xf2\x26\x1f\xc5\x2a\xe5\x42\x7e\x93\xda\x93\xe3\xaf\x8f\xfe\x99\xf3\x04\x5d\xc0\xd7\x3c\x85\x6f\x52\x7b\xdc\x1e\x5b\x7c\xf9\xd5\x16\xa7\xe8\xe8\x1d\x9d\x95\x9f\x8e\xde\xf5\xfd\xbf\x7e\x17\x7e\x3a\xfe\xfa\xe8\xc7\xc1\xc6\xeb\xc7\xbf\x73\xdf\x50\x39\x81\x3f\xbd\xeb\x97\xc7\x6f\xf0\xd3\xef\x8e\xbf\xae\x5c\x3b\x5e\x75\x18\x1f\xfa\x77\xf9\x08\xb4\x04\x0b\xa6\xef\xb4\x81\x7e\xca\xb3\xfe\x1d\xcc\xd7\x1c\xce\xb5\xe2\xe8\xf2\x44\x04\xb1\x94\x67\xab\x54\x73\x0a\x31\x7b\x0b\x18\xd6\x14\xad\x44\xf2\x86\xee\x19\xc9\xd7\x88\x64\x74\x09\x83\xe0\xf7\x30\x49\x39\xbe\x43\x66\xb8\x4d\xe2\xf4\x16\xd8\xb2\x9d\xfc\x28\x37\x84\xf1\x3c\xfa\x92\xe2\x3b\xf7\x9e\x21\x9c\xef\x35\x11\xd0\x5b\xcf\x93\x8b\xb5\x9a\x56\xdd\xc0\x79\x75\x41\xa2\x2f\x92\x1e\x14\xe7\xa6\xca\xe9\x79\xb9\x14\xff\xcc\x81\x5d\x5d\x78\x7a\xd4\x63\x42\x46\x49\x1e\x3b\x49\xe1\xfb\xef\xaf\x2e\x9c\x72\xff\x67\x4f\x6e\xee\x81\xc5\x4a\x1e\x5a\xf6\xe6\xfa\xd5\xdf\xd0\x52\x80\x77\xf4\x88\xa1\x93\xb3\x8a\x27\x82\x82\xa7\x03\x03\x66\x7f\x06\x37\x97\x7f\x73\xc4\xb3\xc2\xb8\x82\xe4\x4e\xc6\x6c\x0a\x49\xe6\x04\x88\x3b\x60\x26\xd7\x7e\x75\x6e\x62\x72\x07\x3b\x58\x33\xef\x2c\x9e\x80\x45\x24\x4f\x30\x08\x78\x1f\xa0\xf9\xb0\x54\xa1\xe4\x8d\x93\x02\xdf\xc3\xf9\x70\x88\xfc\xc6\xcb\xac\xf8\x8e\x3d\x0e\xc3\x86\x58\xdc\x47\xbf\x90\xf9\xc3\x74\x4e\x5f\xfa\xde\x4f\xd2\xd2\xf7\xee\xf5\x46\x32\x76\xa2\xdb\xf3\xed\x23\xc6\xe9\xa5\x18\xaf\xba\xea\xbc\x90\x12\x81\x86\xd7\xc2\x73\x3a\xe5\x86\x8d\x00\x24\xda\x7a\xc9\x34\x08\xd2\x63\x1d\x94\x56\xda\x3c\xeb\x5b\xd5\x8f\x57\x6f\xde\x23\x90\x7b\x1c\x6a\x1b\x34\xd7\xda\xb7\x9d\xed\xac\xa8\xde\x4f\xe7\xab\x60\x60\xc8\xd6\x89\x51\x45\x41\x06\xd9\xf5\xc3\xd6\x2b\x26\x0b\x26\x5f\xd4\x2c\xbc\x51\xc3\xeb\x19\xcb\x4b\x72\xda\x63\xcd\xb2\x61\x15\xba\xfa\xea\x56\xbf\xdd\xd7\x48\xdb\x7c\x03\x7a\x26\xf6\x62\x7e\x8f\x1d\xcc\x88\x82\x50\xce\xde\xff\xb1\x72\xa2\xd7\xde\x2f\x41\xf3\x5f\xa4\x1e\xf1\xed\x6c\x98\xc0\x10\x04\x37\x05\xbb\xee\x32\xc7\xae\xcc\x92\xa8\xc9\x29\x06\x1e\x87\x9f\xac\xd2\xe8\x8f\xaf\xfe\x96\x8f\x0a\x41\xb9\x9c\xdd\xeb\x40\xec\xbf\xff\xe7\x37\xbf\xf9\x24\xd3\x29\x93\xdc\x58\xd0\x1e\x7c\x21\x97\xf0\xc3\xa5\x55\xd2\xeb\xfd\x19\xf2\x90\xc3\xeb\x95\xf4\xca\x55\xf7\x2c\xa7\x59\xae\xfc\x10\xbc\x65\x65\xba\xa5\x99\x55\xff\xed\x6f\x2c\x13\x2f\x57\xcd\xf6\x3e\x13\x30\x6b\xc9\x1b\x37\x3f\x54\xb0\xf7\xc3\x64\x5d\x2e\x38\x1e\x37\x2f\x61\x56\xd9\xa7\xea\xeb\x7f\x58\xfa\x7d\xdb\xd7\x87\xcf\xe7\xee\xcd\x95\x68\x17\x25\x31\x21\x2c\xe1\x21\x75\x76\xf5\x82\x56\xdc\x42\x2b\x7a\xbb\x7c\xe1\xf1\xf4\x4b\xaf\xbb\x66\x53\x6e\x96\x41\x3c\x5c\xf8\x75\xc5\x74\xed\x26\x5d\xae\xc2\x7e\x12\xaf\x89\x82\x14\x6e\x37\xdc\x3b\x27\xf7\xfe\x7d\xe5\x33\x37\x19\x44\x7f\xef\x12\x30\xbb\x04\xcc\x2e\x01\xf3\x89\x26\x60\x3e\x7e\xee\xdd\x19\x66\x31\x44\x09\x0f\x69\x30\x16\x92\x04\xb3\x21\xa7\xea\xbe\x08\xcd\x4c\x92\x6a\x28\x67\x19\x18\x96\x72\x89\xe1\x0e\x59\x46\xb6\x71\xce\x26\x62\x06\xb2\x88\x54\xd9\x76\xf1\x9b\x13\x42\x57\x33\xa8\x70\xd5\x2f\x70\xe1\xca\xc6\x5c\xd1\x45\x19\x68\x03\xd4\xce\xca\x7b\xbd\x8d\x20\x97\x14\x12\x90\x6b\x88\x31\x27\x82\x90\x3c\xe5\x19\x4a\x79\x18\x6f\x61\xa7\x18\xc6\x5a\x20\x38\xa6\xe3\xa0\xc3\x0d\x9d\x4e\x73\xe6\xc4\x38\x24\x08\x56\x29\x1f\xb5\xe3\x9e\x45\xc2\xa0\xc1\x6a\x01\xb3\xaa\x81\xb4\x70\x44\xed\xae\x13\x6c\x9f\x4d\xb6\x51\x24\xe6\x99\xf0\xb2\x4b\x5c\x08\x96\x5b\x40\x6f\x78\xe5\xf1\xad\x14\x47\x8d\xc7\x37\x30\x98\xc4\xe0\xe5\x83\x42\xae\xc5\x37\x79\xc4\x8a\x19\xe6\x65\x10\x66\x38\xb0\x55\x91\x70\x84\x96\x19\xcd\xa5\xbb\xb0\x12\xb9\xdf\x43\x96\xa2\xba\x97\xeb\xa3\x03\xda\xcd\xff\xaa\xc2\xae\xf8\xd9\x2d\x70\x86\x89\x9e\x41\x75\xb6\x0a\x4f\x2b\x69\xd0\x08\x3b\x7f\x4b\xcc\x66\x82\x33\x3e\x99\x68\x0c\xa5\x5d\x1b\x69\xb0\x65\x0e\xd7\x63\xa1\x11\x0c\x0f\x23\x4a\xf2\x1b\xef\x70\x64\x70\xe3\x0d\x6b\x2d\xb4\xe1\x86\x65\x61\xb1\x3e\xb6\xcb\x36\xe3\x68\x46\x0b\xa0\x55\xfa\x91\xc4\x96\xc7\xf7\x96\xc6\x23\x3b\x4c\xa3\xbe\xcf\x0b\x0b\xf1\x57\x47\xee\x7c\x94\xa4\xd9\x91\x83\xa8\xf4\x66\x7b\x37\x49\x06\xda\xe9\xe3\x14\x6c\xcc\x59\x44\xf2\x5b\x41\x78\x82\x77\xf8\x91\xe5\x6c\xb5\xff\x34\xb6\xc1\x02\x1a\x7d\x8c\xb7\x7a\xe4\xb6\xed\xb6\x8a\xc6\x23\x19\xdd\x8b\x63\xcb\xfc\x26\x3f\xf7\xe6\x8c\xef\x46\x73\x3b\x30\xb4\x3e\xe9\x16\x09\x3b\x34\xea\xe6\x2d\x7e\xff\xba\x1a\x49\xa2\xf9\x3d\x03\x19\x29\x47\x2c\xfe\xff\x9b\x37\xd7\x21\xb9\xed\xca\x32\x91\x66\x09\xa4\x18\x57\xf1\x9a\x6b\x33\xe5\x09\x68\xe4\x4e\xdf\xcb\xb4\xf6\xf7\x42\x7c\x78\x0c\x09\x9f\xd3\x64\x31\x44\x0a\x2d\xf1\x4a\xb3\xcc\x09\xb8\x69\x96\x63\x7e\x07\x5e\xc5\xf7\x3e\x9a\xc1\xb3\x07\x68\x4a\x13\xd5\x68\xbe\xd2\x02\x5a\x1f\x0f\xfd\x78\x5b\x1a\x50\x5d\xcc\xe3\x94\x80\xc6\x56\xf4\xa0\x3a\xf1\xa3\x5f\x59\xa4\xcf\x0c\x37\xd8\xd8\xaa\x33\xee\x98\x28\xf6\xe5\x17\x1b\xee\x8c\x21\x4b\xd4\xdc\xe1\xc5\xe3\x67\x65\xcb\xef\xd9\xfa\x5c\x6f\x3b\xdf\xb6\x67\x79\xcb\xf9\xc8\x38\xd5\xc6\x4c\xab\x14\xa8\xbd\x26\xda\xe4\xfe\xdb\x69\xa2\x15\xf6\xc7\xf5\xb3\xbd\x17\xe6\x37\xbc\x0a\xd6\x86\xc2\xeb\x4b\xb4\xe9\xbb\xc2\x6f\x5c\x11\xa4\xe7\x99\xa7\x34\x4e\x16\x5c\x64\x77\x1f\x87\xcb\x3d\x22\xcf\x84\xdb\x1e\x91\x6a\xc2\x6d\x8f\xc9\x36\x34\x76\x61\x9b\x8f\x23\x1d\x8d\x9d\x68\xec\xe3\x08\xb8\xc7\xa4\xb3\xcd\xde\xe4\x3d\xe6\x75\x3a\xf1\x13\x90\xf0\x6e\x6a\xcb\xa8\xc9\x77\x3e\x21\xd1\x09\x6f\x58\xad\x65\x94\xa8\xe8\xce\xdb\x2d\xdf\x5e\x14\xb9\x7f\xa1\x3a\x91\xcf\xfc\x63\xe2\x31\x0c\xee\x44\xba\x4e\xa4\xeb\x44\xba\x4f\x45\xa4\x23\xff\xc0\x53\xa0\x54\x0b\x0b\x59\x4b\xab\x28\xf6\xb2\xa3\x56\x1b\x46\x47\xad\x70\x74\xd4\xea\x91\xf1\xc9\x51\xab\xad\xe4\xb4\x2d\x62\x08\x37\x1f\xe4\xce\x98\xda\x19\x53\x3b\x63\xaa\x1f\x1d\x2f\xf3\xa3\xe3\x65\x1d\x2f\xeb\x8c\xa9\x9b\xa6\xec\x8c\xa9\x3b\x4e\xd4\x19\x53\x3b\x63\x6a\x67\x4c\xed\x8c\xa9\x8f\x7d\x4c\x27\xd2\x75\x22\x5d\x27\xd2\x6d\xbb\x98\xce\x98\xda\x19\x53\x37\x8d\x8e\x5a\x55\x46\x47\xad\x36\x8c\xe7\x4d\xad\x9a\x1b\x53\xa3\x04\xb8\x5c\xad\x54\x2d\xc4\x7f\xe3\x7d\x45\x7d\x7b\x5f\xc4\xd3\xff\x3a\x82\x29\x9f\x09\x95\xeb\xb2\x50\xd2\xf9\xcd\x0f\x6c\x02\xd6\x38\x2c\x00\x0b\xab\x04\xf3\x86\xc9\xc6\x20\xf9\x28\x59\x39\xf1\x63\xa4\xc4\x3f\xb9\xd9\x78\x3c\x52\xca\x7d\xdd\x32\xc4\x50\xd5\x09\x9a\xce\x2e\xf1\xcc\x07\xeb\x72\xec\x56\x07\x35\x9f\xbf\xbd\x68\x2b\x94\x99\xfd\x28\x43\x05\x6d\xc7\x1d\xa8\x4a\x2f\x96\x15\xf4\x85\x00\xdf\xdc\x4b\x88\x31\xc9\x2d\xd4\x34\x77\x87\x5e\x44\xc2\x26\xf3\xe2\xc5\x83\x55\x65\x47\x3e\x9d\x90\xe8\xf3\xb7\x17\xdb\x9b\xef\xc3\x06\x7c\x08\x4b\x7d\x67\x87\xef\xec\xf0\xc5\xe8\xc4\xa0\x3d\x27\xed\xc4\xa0\x0d\xe3\x79\x8b\x41\x4f\xdd\x6e\xdd\x59\x9b\x59\x67\x6d\xde\x7c\x5b\x67\x6d\xee\xac\xcd\x9d\xfd\x66\xcd\xe8\x04\x17\x1c\x9d\xe0\xf2\xc8\xf8\xe4\x04\x97\xce\xda\xdc\x51\xab\x8e\x5a\x75\xd4\xea\xd3\xa0\x56\x9f\x62\xe8\x6e\x67\xf4\xeb\x8c\x7e\x9d\xd1\xaf\xe3\x46\x1d\x37\x7a\x64\x7c\x72\xdc\xa8\x33\xfa\xed\x3a\x51\x67\xf4\x5b\x39\x3a\xa3\xdf\x23\xa3\x33\xfa\x75\x46\xbf\x35\xa3\x13\x5c\xf6\x9c\xb4\x13\x5c\x36\x8c\xe7\x2d\xb8\x74\x46\xbf\x8e\x5a\x75\xd4\xaa\xa3\x56\x9f\x06\xb5\x6a\x6e\xf4\x7b\xe4\x24\x6d\x7e\x76\xf3\x49\xd9\xf8\xac\x88\x36\xbd\x70\xef\x86\xef\x8d\x1a\xc0\x8e\xb8\x81\xaf\x7e\xbf\x54\xb7\xbc\x7a\x4b\x0a\xb1\xe0\x76\xff\xfe\xac\xe5\x2b\xd6\xef\xd9\x16\x7b\x5f\x2c\x63\xcf\x59\x7c\x61\xe5\x47\x83\x62\xdd\xd6\xc6\x57\x74\x73\xd1\x84\x7e\xa1\x2f\x67\xc9\x79\xe4\x9a\x02\xf4\x85\xd2\x78\x3f\x85\xd0\xd0\xc6\x97\x9e\x2e\xda\xc9\x0b\x53\x44\x2f\xaf\xec\x9f\xd4\x30\x1c\x39\xbc\x67\xc5\xe5\xc7\x36\x6d\x55\xf5\xed\x95\xc0\x0a\x00\xba\x20\xeb\xf5\x45\x91\x02\xbc\x08\xb1\x8c\x6b\x47\x21\x83\x95\x1b\x99\x76\xe5\xee\x05\x78\x6f\xee\x26\xb5\x91\x53\x3f\xce\xa1\xfb\x95\x4c\xe5\x75\x96\xf5\x6d\x18\xb3\xef\x81\x31\x04\x9d\x0a\x63\xd6\x05\x5c\xd7\x97\xfe\x18\xd9\xdc\x82\x5c\xae\x81\x7f\xf8\xa2\xca\x72\x0a\xf1\x89\xda\xff\x8c\x78\xc4\x74\x9e\xf8\x26\xa0\xbe\xfc\x35\xe3\x51\xa4\x72\x69\x99\x04\x88\xc9\xb2\xb1\x0a\x57\xb7\x20\xb6\x5b\xc8\x4f\xdb\x4a\x4f\x7d\x5a\xe7\xa3\x77\xf9\x6f\x38\xa3\x4f\x58\x59\x50\xbd\x3a\xb6\x97\xb6\xf0\xf5\x8f\x73\xad\x5d\x58\xe1\xd6\x8c\xb0\xb6\xbf\x43\x95\x88\x68\xfe\x36\x4f\xc0\xb7\x88\xab\x74\xd8\x27\x69\xb7\x2a\x22\x67\x78\x37\xae\x9e\x7a\x53\xc6\x0a\xa8\x93\xb4\x2f\x0c\x50\x7b\x3c\x74\xa9\xa2\xd6\x0e\xee\x21\xc6\xb3\x2c\xc1\x54\x0a\xe5\x84\x16\x6a\xe0\x5f\xf4\xd7\x5b\x75\xdb\xf6\xd2\xcb\x56\xe2\x35\xdb\x49\xc4\x66\xc1\x66\x35\x7a\x0c\x55\xd8\x8e\xb2\x36\xa3\x12\xf1\xdf\x6a\x95\x67\x5b\xde\xbe\x6c\x59\xa4\xa7\x43\xf7\xad\x6a\x03\x9b\x70\xd1\xbb\x8c\x42\xc7\x60\x6a\xd2\xe5\x4d\xa2\xd4\x0d\x3c\xcd\x13\x2b\xb2\x84\xda\x7c\x4f\x68\x42\xae\xa1\xe4\x1b\x3d\xc6\xe5\x3c\x78\xa0\x7c\x9b\x08\x88\x19\x9f\xb8\x19\x6d\x68\x1e\x4b\xfd\x25\xf2\x14\xdc\x69\x8e\x2b\x0d\x4d\x9d\x3a\x25\xe7\xe5\xec\xec\x5e\x24\x09\xb6\xef\x4d\x12\x75\xbf\xbe\xad\xdf\xe2\xd8\x4d\x28\x64\xbb\x09\x86\x6c\x77\x11\x98\x31\xa9\x64\x30\xed\x7e\xff\xf6\xd5\x7e\x9b\x78\x5d\x9f\xc3\xf7\x02\x01\x6c\x6c\x9d\x71\x6d\x05\x4f\x58\xae\x13\x43\xfb\xc8\x9d\x12\xa0\x43\x33\x95\x29\x47\xcf\x60\x04\x86\xba\x76\xb0\xdf\xd1\xce\x79\xc0\xd2\xf9\x54\x32\x99\x33\x4e\x3b\x3f\xce\x93\xa4\xc7\xc6\x42\x72\x47\x76\x21\x0b\x99\x30\x4e\x7f\x62\x37\x42\x46\xe0\xbe\xa9\x5f\x08\x16\xb8\x22\x37\xa3\x3b\xdf\xc5\x21\x8d\x7b\x95\x8e\xce\xd8\x87\x1b\x5f\xe1\x0e\x6c\x84\x6d\xeb\xc6\x4a\x07\x91\xe5\xad\x4a\xd0\xbc\xed\x0d\xdf\xbe\xa3\x3d\xaf\x5e\xfe\xb3\x90\xa8\xa4\xb0\xb7\xc8\x38\x9c\xb2\x03\x02\xfb\x43\xbb\x29\xb1\x4d\xad\xc3\x9d\x12\xa1\x8e\x4c\x1e\x4d\xdd\x27\x1d\x64\x2a\x36\x07\x8e\x8c\x1c\x18\x88\x34\x58\x73\x70\xec\xfe\x5a\xfc\x06\xfc\xbe\xea\x73\x27\x3c\x13\x07\xc7\x3d\x86\x00\xc2\x46\x27\xca\x4e\x3f\x5d\x3c\x0c\xdf\x5a\xeb\xaf\xf5\xd8\x58\xe8\xe2\x57\x99\xc1\x77\xed\x50\x19\x35\xc1\x70\x34\xda\x02\xe6\x49\x39\xa4\xa4\xfe\x9c\x45\x83\xf8\x45\x62\xcd\xd8\x59\xd1\x20\x1f\x2c\xf6\x01\xf7\x77\xc3\x0c\xf4\xdc\x4e\x9d\xb6\x2a\xcc\xa7\x7f\xf8\xb7\x74\x2c\x95\x63\x25\xc0\xfd\x81\x0f\xc0\x2d\x91\x9c\x3a\x2b\x2d\x02\xf7\xf0\x77\x87\x55\xa9\xd7\x89\x4f\x25\x35\xff\x64\x41\x89\xec\x75\x2f\x30\xfe\xe0\x9e\xac\x83\x90\x7e\x22\x6a\x59\xd0\x8f\x57\xaf\xa8\x8b\x92\x87\xd5\x77\x42\xc6\x24\xa2\x9e\x59\x6a\x4f\x04\x6f\xc1\x2d\x38\xf2\x2d\xb5\x7d\x8d\xa3\xb8\xe8\xa3\xe9\x76\x62\x25\xf8\x71\xed\x9f\x22\xe8\x97\x05\xdb\x6d\x85\xd1\x47\xa6\xaf\x68\x3e\x4f\x41\x59\xc1\x7e\x4d\x35\xf9\xc7\x51\xb0\x1e\x39\xa3\x1c\x0a\x24\x7c\x04\x09\x35\x63\x72\x57\xcb\xe5\xb3\xb3\x57\xaf\x8b\xbe\x65\xd8\x07\xf4\x43\xab\x28\x5b\xb8\x54\x97\xba\xbf\x2d\x8f\xed\xa5\x52\x04\xc5\x6e\x66\x62\x76\x03\x96\x0e\x60\xca\x33\x77\xfe\x68\x8e\x95\x56\xce\x57\x08\xe9\xc7\x0f\xcb\x4e\xd2\xfc\xf6\xdd\x9a\x56\xbd\x64\xab\xa3\xb2\x9d\x2f\x78\x97\xb3\xb7\xc1\xf6\x51\x8e\x1a\x98\x17\x10\xda\x4b\xfc\x5e\x46\x8f\x8a\xce\x7b\x84\xc1\x86\x52\xa6\x29\x41\x5d\x87\xdf\xcb\x29\x5a\xde\x82\x5d\xd4\x29\xa7\x51\x27\x10\x59\xb5\xb9\x20\x5c\xb8\xd9\x42\x9a\x25\x8f\x9d\x3c\xb6\xb3\xea\x95\x0a\xf9\x16\x78\x3c\xbf\x81\x48\xc9\x78\x4b\x02\x5b\xdb\x8f\xd7\x42\x8a\x34\x4f\x99\xcc\xd3\x11\x20\x88\x0d\xcd\x85\x84\x84\xd4\x5a\xce\x24\xdc\x27\xf3\xd0\x44\x98\x65\x2a\x0e\xf4\x64\x84\xbd\x92\xe3\x39\x76\x3e\xc3\xd2\xa9\x72\xee\x26\xc1\x9e\xc8\xa1\xc2\x1e\x8b\x34\x37\x4e\x60\xea\xe1\xa4\xc2\x3a\x5e\x36\x02\xf4\x3a\x89\x18\xdc\x1e\xf3\x19\x17\x89\x13\xba\x07\xec\x02\xc6\x3c\x4f\xb0\x81\x1f\x7b\xc1\x8e\xdc\xcb\x82\xa6\xb5\xea\x01\x27\x08\x1b\xe5\x74\x74\xe3\xb3\xdf\x71\x41\xc7\x3b\xd8\xd1\xb7\xa9\xec\x17\xc6\xb6\x15\xfe\xc2\xc8\x78\x6e\xb6\x55\xd0\x6b\x1b\x73\x45\xbd\xb2\xab\x32\x6a\x85\xa4\x0b\xe3\x67\xde\x8e\x65\x6f\xae\x8a\xb0\x62\xd5\x5a\x4d\x34\x18\x73\x01\x3c\x4e\x84\x84\xfd\xf1\xeb\x76\x0a\x2c\xe5\x0f\x88\x63\xd8\xea\x5c\xc8\x1a\x86\xf1\xea\x57\x59\x45\xed\xf4\xc3\xeb\xd9\x08\xc6\xd8\xa0\x11\x3f\xb8\xb2\xfb\x84\x3f\x63\x2e\x12\x88\x07\xf8\x8e\xca\x2c\x65\x5f\x63\x42\x1c\xf7\xb7\x90\x39\xb8\xa7\x32\xad\x50\xcd\xa4\x47\xab\x3c\x1e\x79\x28\x2f\x1b\x8d\x87\x5e\x7e\xc3\x05\x50\x5c\x3e\x44\x64\xfe\xf3\x3d\xc2\x03\x6e\x9a\x5c\x8f\x9d\x52\x19\x74\xd1\xca\x82\x7c\x13\x58\x76\xad\xac\x6f\x09\x58\x7c\x20\x3e\xed\x5b\x54\x82\xb1\x22\xc5\x03\x16\xe7\x3a\x34\xcc\x44\x98\xf1\xd5\x5b\x5f\x3b\x2a\x5f\xbd\x78\xb1\xa5\xfc\xf6\xfe\x91\x5e\x03\xea\xd0\xfb\xe0\xcb\x75\x41\x87\x02\xf9\x77\xca\xb1\xdb\x63\xe1\x05\x64\xec\xfc\x09\x1a\x3d\x88\xc2\x58\x21\x27\xb9\x30\x53\x36\x02\x7b\x0f\x20\x19\x3c\x50\xed\x0b\xf6\x2f\xd0\x0a\x37\xd5\x81\xb7\x74\x1e\xd4\x80\xf6\xf2\xe9\x40\x6c\x26\x8c\x50\xf2\x2f\xc2\x58\xa5\xe7\xaf\x44\x2a\x1e\x29\x4a\x1a\xc6\x72\xff\xe3\x02\x82\x2a\x89\xb1\x6b\xb1\x88\xf8\x0d\xd0\x07\x6b\x40\xdb\xa6\x55\xa4\xb8\x32\x77\x4e\x46\x3c\xba\x7b\x6f\x00\x7e\xf1\x54\x20\x1c\xd8\xf5\x1e\x50\x45\x79\xaf\x98\x00\xc9\x16\x21\xe5\xe5\x03\xc1\xa7\x06\xe5\xfb\xa9\x32\x80\x37\x90\xf9\x11\x1f\x0b\xee\x02\x61\x0a\x82\xe1\x4e\xb7\x92\x60\x18\x1f\x8f\xeb\x77\x94\x87\x1d\x25\xcf\x34\x37\x96\xa5\xdc\x46\x53\x32\x72\xa9\xb8\x10\x27\x0e\x8d\x17\xfb\x77\x81\xf2\xd6\xe6\xe5\xdd\x0d\xc1\x8c\xd6\x79\xf9\xe0\x74\xcb\x47\xfd\x3c\xf5\x51\x03\xf9\xe2\x34\x75\xdd\x38\xa9\x6f\x88\x97\xdb\x52\x6a\x1e\x7c\x8b\xa6\xe1\xf2\x17\xdc\x85\xb3\xeb\x8b\xed\x8d\x34\xfb\x28\xb8\x3b\xab\xb8\x8b\x46\xf0\x0d\x1f\x15\x8c\xa9\xfe\x4a\xdd\x12\x4e\x4d\xa3\x7b\x8c\xb3\x3b\x98\x53\x7f\xe9\xa5\x86\xbd\x1a\x12\x2f\x49\x00\xf6\xad\x75\x37\xf9\x66\xd3\x3b\xac\x77\x67\xec\xa1\xb1\x9b\x93\x22\x8c\xbe\x5b\xe8\x8e\x4f\x84\x8f\xde\xe1\xb1\xdd\x11\x9c\xc6\x1d\xcc\x77\x7b\x60\x61\xbb\xdd\x2e\x78\xdd\x87\xf6\xdd\xfd\x50\x08\x7a\xc5\x56\xef\xe6\x3d\xaa\x8e\x9d\x8d\x57\x61\x04\x20\x36\xfa\xbc\x02\xfd\xaa\x56\x26\xf7\x8d\x87\x86\x90\xd1\x9d\xe9\xa9\xc8\x90\x11\x05\x37\x41\x68\x7f\xfe\x03\x4f\x44\x5c\x4c\x41\xe7\xf7\x4a\xf6\x9c\xf8\xe4\xfe\x83\x44\x97\xc4\xb5\x0b\x05\xe6\x5a\x59\xfc\xe5\x83\x01\x88\x96\xd9\x08\x3c\x34\x85\xb7\x4f\x23\x95\x41\xc5\xab\xd2\x39\xdd\x0c\x42\xcd\xaf\x02\x94\xc2\xb0\x2b\xc9\x94\x0e\x70\xc0\x5e\xf6\x34\x11\x4d\x81\x7c\x62\x44\xae\x0f\xb4\x5c\xaf\x9c\xc3\x83\x4f\xe9\x1a\xf4\x36\x4c\xe7\xa7\x42\xf9\x80\xae\x50\xaf\xfc\x04\xa5\x5d\x2f\xaa\xf2\xe0\xfe\x16\x11\x4b\x41\x4f\xd0\x17\x13\x6d\xed\x8b\xa8\x6f\xca\x6e\x74\x97\xc6\xce\xd4\xb7\xfa\xc2\x9d\xb0\x00\x59\x13\x99\x80\x9a\x30\x37\x9a\xa1\x66\x72\xfa\x6f\x47\xc1\x71\x0f\xfe\x87\x65\x5c\x68\x33\x60\x67\xcc\x08\x39\x49\xa0\x76\xcd\x6b\x18\xd5\x69\xdc\x0c\xc2\x30\x47\x6a\x67\x3c\xf1\xba\x14\x97\x0c\xc8\x66\xe5\x66\x5f\x64\xa9\x3d\x2f\xa9\x38\xca\x53\xb8\xc0\x0e\xee\x60\x7e\xd0\x5b\x42\x9a\x83\x2b\x79\x40\xbc\x65\x09\x4d\x0a\x46\x84\xde\xb3\x03\xbc\x76\xd0\x26\x17\xde\x91\xe1\xec\x6b\x47\xab\xbf\x74\x6b\x8c\x08\x51\x1f\x7b\x0a\xeb\x35\x2d\xd1\xc7\x3a\x59\xc5\x72\x03\x24\xad\xe3\x29\x63\x10\xe4\x4c\x94\x2a\x51\x31\x95\x70\x8f\xd2\xe3\x93\x11\xfc\x9c\x26\x21\xe4\xe4\xfb\x2c\xe6\x76\xab\x70\x53\x1a\x35\x88\x1c\xbe\xa5\x49\x58\x8e\xb3\x38\xdc\x1a\x8b\x09\xcb\xb8\xe6\xa9\x19\xb0\xa1\xaf\x7b\x88\x98\x26\xc6\x55\x5b\xa2\x87\xdd\xed\x3c\x03\xf6\x9f\xec\x6d\x75\x2d\x03\xd6\xef\xf7\xd9\xed\x9b\x8b\x37\xa7\x8c\x7e\x21\x29\xdb\x2a\x36\x56\xa8\x04\xa9\x5c\xbb\x57\xcd\x40\xa2\xe2\xef\xe4\x7b\x25\xe1\xcd\xd8\x9d\x10\x6e\x61\x06\x9a\xdd\xbb\xad\x8a\x44\x0c\x85\xf5\x6a\x70\xf8\x7e\xf1\x78\x3f\xc9\x24\xe5\x0f\x37\xb9\x9e\xec\xb0\x01\x6c\x69\x13\xaa\x26\x9b\x52\x99\x44\xd4\xab\xe6\xed\x9a\x68\x0a\x71\x9e\x40\xcc\xf8\x48\xcd\xa0\x66\xb2\xad\x3f\x86\x2c\x3d\x87\xf0\xa0\xe3\x79\x23\xa3\x92\xdc\x16\xca\xea\x11\x3c\x9c\xb2\x7f\x47\xa7\x37\x67\x19\xe8\x08\xa4\xe5\x13\x58\x34\x03\xd0\x7d\x2f\x5f\xfc\xdb\xb1\xe7\x47\x6e\x46\x6f\x3d\x79\xe1\x30\xe2\x35\x7f\xf8\x5e\x96\xa6\x41\x61\xd8\x8b\x01\x3b\x5b\x78\x19\x3e\x97\x44\x79\x82\xb6\x16\x74\xe4\x57\x5e\x39\x9a\x33\xad\x72\x74\xe5\xb3\x3c\xab\x6b\xb3\x5f\xfc\xfb\xbf\x39\xa5\x8f\xa7\x59\x02\xa7\xa1\x5c\x2a\xa9\xcd\x4e\x86\xb1\x8a\x7d\xf9\xe2\xdf\x88\x7a\xba\xf3\x59\x6a\x85\x25\xcc\xb8\x03\x58\x9e\x31\x91\x52\x90\x26\x24\xf3\xb2\xee\xaa\xae\xa3\xbf\xb1\x5c\x5b\xd3\x63\xe8\xef\x2f\x84\x43\xab\x2c\x4f\x16\xb4\x7c\xd4\xc2\xe1\x9e\x80\x14\x2b\x84\x09\xa0\xa1\x8a\xbd\xfc\xf2\xc5\xbf\x2d\x9b\x53\xde\xc8\x08\xf0\x49\x7c\x02\x03\x30\x46\x4e\xb9\xbf\x13\x49\x02\x71\xef\xd1\xe5\x8f\x73\x6d\xa7\xa0\x7b\x0c\xa4\x09\xc6\x2a\xb7\xbe\x85\xb5\xe1\xec\x3a\x97\x12\x65\x04\xb2\x0e\xa3\x45\xab\x62\xe1\xf2\x1f\xeb\x18\xa1\x65\xa9\x32\x76\xf5\x92\xb7\x3f\x6e\x6e\x70\x39\x7f\x33\xde\x55\x1c\xe8\xef\x61\x86\x58\x7e\x7a\x0f\x91\xf2\xa1\x7f\x57\xe4\x50\xf6\x85\xb4\x7d\xa5\xfb\x34\xcd\x29\xb3\x3a\x7f\xdc\x6b\x50\x8e\xb4\x76\x02\x3e\x00\x19\xc8\x2b\xe7\x6d\x69\x57\xdf\xcb\xc9\xdf\xff\x3c\xc7\xea\x5e\xae\xa7\x1c\x48\x38\x3d\xcd\xd8\xf3\xd4\xd7\x2d\x6e\x0b\xc7\xc6\xbd\xdd\xdd\xfd\xbf\x96\xb1\x7b\x07\x72\xe0\xcf\x6e\x71\xda\x9d\x5c\x85\x1e\x8f\xde\x16\x6f\x2f\x8e\x2d\x71\x3e\xb2\x39\xb9\x1b\xe8\x35\x2b\x28\xd7\xd2\x09\x5f\x41\x81\x68\x1d\xa5\x43\xc6\x62\x44\x81\x3b\xe7\x66\xed\x41\x4f\x80\x1b\xbb\x0a\x14\xdd\x41\x7f\x7c\x6c\x0e\xed\x5f\x1c\x75\xa1\xd3\x49\x48\x08\xf2\xd2\xc6\x78\x4e\x88\x72\xf0\x16\xc8\xc3\x47\xa1\x68\x35\x21\xea\xa0\x38\x12\x6e\xff\xea\xf2\xd5\xfb\x0a\xa8\x09\x46\xce\x7d\x44\x6b\xff\x68\x25\xe4\xd7\x9b\x4e\x3d\xf1\x2a\x3c\x8a\xe4\xd2\x7c\x32\x52\x74\x0a\x96\x6f\x4e\xff\x58\x1c\x75\xa2\x7d\x63\xb9\x8c\xb9\x8e\xfd\x2a\x0f\x0f\x4d\x31\xe5\x80\xbd\x46\x5f\x9a\x1c\xab\x53\x36\xb5\x36\x33\xa7\x27\x27\x13\x61\x07\x77\xff\x61\x06\x42\x9d\x44\x2a\x4d\x73\x29\xec\xfc\x04\x1d\x68\x62\x94\x5b\xa5\xcd\x49\x0c\x33\x48\x4e\x8c\x98\xf4\xb9\x8e\xa6\xc2\x42\x64\x73\x0d\x27\x3c\x13\xfd\x52\x66\x36\x83\x34\xfe\x6d\x78\xd1\x7b\x16\x8c\x6b\x67\x08\xad\x4b\x7a\x06\xfd\x5c\xde\x49\x75\x2f\xfb\xa8\xc9\x9a\x9d\x4e\xd3\x76\x51\x0c\x61\x2c\xc0\x7b\x97\xc0\x85\x4c\xc5\xef\x7d\x13\xdc\xc7\xf4\xb9\x8c\xfb\xe4\x74\x7c\xcf\x7b\xb1\x8f\x6d\xb7\x5f\x06\x06\x6c\x13\x8b\x4e\x63\x3f\x6d\x88\x47\x56\xcc\x60\x2f\x27\x76\x18\xb5\xed\x7e\x13\x42\x49\xe3\x5c\xd3\x8e\x57\xbc\xd9\xc1\x37\x93\xf2\x39\xca\x3a\xf8\x6e\xa6\x88\x95\x4b\x15\x83\xb7\x7c\xce\x50\xb5\xbf\x71\xcc\xfc\xd6\x89\xc2\xde\xc7\x8d\x76\xdf\xb9\xb1\x90\x12\x71\xa2\xe7\x93\x39\xb3\x7a\x4e\x8e\x71\x7d\xe7\x94\x4f\xef\xb9\x76\x12\xff\x1d\xde\x67\x8c\x8a\x04\x8a\x3e\x25\x5c\x83\xdc\x15\x6c\x78\x9c\x65\xca\x08\x7c\xb7\xe7\x79\xbb\x59\xe6\xf6\x67\x97\x15\x37\xdd\x57\xbf\xdf\x65\xeb\xc6\xd8\x60\x61\x47\x2b\x7b\x3d\x82\x62\x5c\x8d\xfd\xf7\xdb\x73\x68\x82\xe2\xea\xc4\x92\x48\x49\x63\x35\x17\xeb\xb3\x9b\x56\x8f\x3d\x5d\x21\xfb\xfb\x1b\x18\x62\xd0\xd9\x5e\x40\x61\xcb\x31\x58\x81\x29\x22\x5a\x06\x50\x57\x01\x43\xc9\x4f\x21\x96\xd0\x11\xae\x3d\x4d\xab\x7b\xc0\x88\x35\x82\x13\x3d\x0d\x63\xd0\x1a\xe2\x0b\x94\x3e\x6f\x8a\xef\xba\x9a\x48\x55\xfc\x7c\xf9\x00\x51\xbe\x6d\x8e\xf8\xf2\x58\xb2\xe5\x05\x83\x88\x0f\x3b\xa1\x45\xb8\xa3\x1b\x2e\x78\xf9\x43\x21\xd8\xbd\x20\x62\xb8\x15\x66\x4c\x99\x64\xc5\x46\x40\xc5\xf1\x59\xa0\x70\xe1\x1e\x46\x16\x47\x49\x11\xc2\x22\xb9\x89\xa6\x4a\x19\x77\xca\x71\x3f\x71\xde\x99\x50\xe4\xf3\xc3\xb4\x16\xcd\x52\x47\x63\x42\x7a\x4b\x39\x3d\x19\x6a\xcb\xc7\x84\x21\x15\xbc\x80\x60\xf0\x52\xb9\x69\xd0\xf0\xe8\xfe\x98\xa0\xd4\x64\x2c\x33\x79\xea\x26\xbd\x07\x31\x99\x5a\xd3\x63\x62\x00\x03\xc4\x1a\xe0\xd1\xb4\x32\x6d\x0a\x60\x6b\xfd\x51\xaa\xa8\x56\xb5\x12\x1f\x15\xf9\x0e\x3e\x41\xa7\x57\xf0\x98\xc5\xbd\x5c\x09\xae\x1e\x03\x1b\x0d\x8e\x7b\xac\x4c\x21\x77\x6b\x1c\xcd\x99\xb0\xe0\x68\x36\xea\x22\x5a\xe5\x13\xfa\x12\x08\x31\x9d\xb8\xae\x22\x19\x04\xbd\xa8\x31\xea\x8c\x07\xf4\x71\x07\x6e\xdf\x70\xe5\x79\xea\xf4\xc5\x82\xa8\xa3\x59\x3d\xb4\xd4\x51\x5a\x83\xc9\x14\x69\x9b\x8b\x06\xf7\xff\x5d\x3c\x74\x64\x8e\x4b\x60\x4e\xc5\x64\x1a\x60\xc9\x3d\x23\xa8\xef\xc1\xee\x67\x8f\x35\xf2\xa5\xd0\xd8\xd3\xa3\x42\xa3\xee\xdb\x0e\x99\x14\x25\x56\x55\xf6\xdf\x82\x4e\x0b\x28\x22\x8a\x20\xc9\xf0\x76\xee\xd0\xca\xc6\xe3\x18\x7b\xc1\x8e\x10\xc9\x84\x3d\x34\x88\xf0\x7d\x95\x1d\x0f\xd8\x19\x93\x79\x71\xe6\x36\xbd\x40\xaa\x62\x7e\x3f\x91\x7b\xa9\x51\xe5\x5c\x7b\x7e\x71\x23\x72\x47\x63\x3f\x4f\x79\x75\xf4\x3d\x04\xe0\xf1\x82\x89\x9b\x26\x21\x58\xef\x39\x41\x33\xd2\x1d\xe6\x08\x5f\xb1\xff\x1c\x4b\x01\x16\x78\x5c\xcb\x28\x0a\xd0\x69\xaf\x2a\x3d\x15\x07\xb2\x7e\x8a\x09\x16\xfb\x62\x05\x6b\x07\x33\x58\x4b\x70\x65\x8d\x22\x74\x56\x8f\xc5\x30\x96\x90\x5f\x55\x83\x76\x8d\xc8\x8f\xe6\x78\x75\xc7\xe0\xa5\xf5\xa3\x29\xa5\x2b\x47\x23\x9a\x57\x8e\x8d\x88\xf7\xf4\x02\x7b\x56\x8f\x96\xd0\x96\x46\x73\xd2\x56\x8e\xdd\x43\x83\xd6\xcd\xb3\x47\xc0\xd0\xea\xd1\xd6\xd9\xa4\xb1\x47\x70\xd1\xea\xb1\x24\xa2\xbe\x9f\x58\xa3\xd5\x63\x6f\x23\xe9\xea\xb1\x6f\x5c\xd2\xea\xb1\x90\xc4\xf8\x9e\x82\x94\x7a\xf5\x08\x25\xf6\xad\xa5\x73\xfc\xaa\x11\x3f\x29\x47\xcb\x20\xde\x2f\xb2\x69\xf5\x58\x14\x00\x3f\x91\x28\xa7\x15\x53\x7d\x6b\xdd\x34\xaf\xd6\x3e\x4c\xd9\xeb\x21\x4e\xc7\x2b\x14\x3d\x9f\x3a\x13\xec\xcc\x18\x51\x9d\x69\xc0\x82\x03\x18\xf6\x15\xec\x30\x1f\x26\xb0\x6a\xf5\x68\x8f\x71\xd2\x68\x89\x7d\xd2\x68\x0d\xb9\x51\xe0\xf9\x86\xec\xc2\x1f\x51\xd6\x21\xcb\x74\x27\xeb\x74\xb2\xce\x0e\xa3\x93\x75\xb6\x1d\x9d\xac\xb3\x6e\x74\xb2\xce\x8a\xd1\xc9\x3a\x9d\xac\xd3\x68\x3c\x3d\x59\x87\x2c\x55\xad\x19\xcc\xfe\x4a\x06\xd7\x45\x0b\x19\x4a\x53\x21\xa4\xa7\x6e\x2a\x73\xbc\xff\xc6\x93\xd8\x5b\x34\xaf\xf9\x48\x75\xcd\xe5\x04\xd8\xcb\xfe\xcb\x17\x5b\xa6\x03\xae\x1e\x4d\x82\x76\xaa\x63\xd7\xd4\xc1\xc5\xb1\xce\x23\xf1\xde\xbc\x4b\xfe\xa4\x16\x0e\x8f\x9a\x84\xb9\xc6\x41\x54\xd4\xbb\x4a\xc1\x32\x6e\x6b\x06\x71\x91\x42\xe1\x10\xad\xa5\x20\x97\x31\xbd\x4a\x7a\x7f\x87\xdb\xd4\xc1\x7e\x2b\x88\x80\x53\x1c\xfb\x08\x8a\x55\xa8\x14\x28\xc1\x34\x1c\x7a\xb7\x04\x08\xb0\x62\x47\x30\x98\x0c\x58\x4c\xc9\xda\x5c\xfa\x98\xb1\xe3\x5e\xd5\x3d\x9e\x3a\xe2\xaa\xf1\x3f\x6e\xd9\xde\x3f\x0e\x33\x90\x36\xe7\x49\x32\x67\x30\x13\x91\x2d\xbe\x0f\x03\x02\x85\x25\x67\x67\x13\x57\x4a\x03\xf1\xb0\xa9\x48\xd8\x5f\x3a\x5b\xbb\xf9\xab\xc3\x68\x2e\xbb\x2d\xad\x63\x7f\x7a\xb3\x20\x97\x10\x84\x06\x6b\xd5\x2a\xeb\xde\x46\xfe\x4a\xfc\x27\x22\xf8\x9b\xb7\xfb\xba\xc7\x58\x4b\x3c\xa1\x31\x1f\x58\x54\xa0\xf2\x24\x71\xe8\x4d\x1e\xb3\x65\x10\xac\xf0\x64\xad\xc8\xb6\x21\x37\x6b\x5a\xc9\xba\xc1\x7b\x6e\x55\xa6\x12\x35\x99\x57\x77\x90\x7a\xb5\x54\xca\xdb\x70\x66\xf2\x91\x17\x01\xdd\x21\xba\x5e\xd8\xf2\xce\x17\xb2\x76\x74\xbe\x90\xa5\xd1\xd9\x07\x16\x47\x67\x1f\xd8\x61\x74\xf6\x81\x15\xa3\xb3\x0f\x2c\x8f\xce\x3e\xd0\xd9\x07\x9a\x8c\xe7\x6f\x1f\x60\x9d\x2f\x64\xdd\xe8\x64\x9d\x72\x74\xb2\xce\xf6\xa3\x93\x75\x96\x47\x27\xeb\x74\xb2\x4e\x27\xeb\x74\xb2\xce\xbe\xa3\x01\x72\x67\x2a\x6e\x3d\x45\x26\x53\xf1\x86\x0c\x19\xb2\x57\x47\xaa\x9f\xa8\xa8\xa8\x2c\xe2\x1e\xf1\x9e\x0f\xc3\x53\x32\xa1\xf7\xd8\xbf\x94\x04\x4a\x4f\xa0\x92\xb5\x29\x30\x85\xed\x21\x32\x15\x1f\x99\xe3\x3d\x02\xcf\xbb\x0c\x9b\x2e\xc3\xe6\x57\x90\x61\x33\xe5\xc6\x17\x3e\x42\xd2\xba\x3e\xe1\xa6\x72\xfc\x6f\x41\xa7\xbf\xda\x7c\x1b\x87\x70\x1e\x61\xb0\x7b\x5c\x89\x14\x04\xbb\xd8\xfb\x76\x21\x1e\xd6\x21\xe6\xf5\x32\x6a\xbe\x13\xc7\x10\xb3\x0c\x74\x9f\x90\x4c\xb1\xb1\xf0\xf5\xbf\x16\xf0\xd7\x43\xf8\x13\xcf\x9b\xa9\x43\xe2\x93\x4e\x9e\xa9\x7f\x4a\x6b\xbe\xa9\xaa\x8b\xae\xc6\x15\x3f\xb9\x54\x9a\x76\xb4\xd2\x3e\xb3\xde\x9d\xf6\x5d\x23\xbd\xb4\x2d\x25\x12\x95\xbc\x9b\x9d\xca\x1c\xaf\x1f\x2b\x8b\xd3\xfe\x33\x07\x3d\x67\x6a\x06\xba\x54\x8c\x8a\xbe\x3d\xbd\xa2\xc9\x4c\xc4\x7d\x01\xe4\x76\x0c\x3c\xad\x98\x22\xda\xd4\xd4\xdb\xf6\x1a\xb2\x27\x56\xfd\x78\xfd\x68\x57\x71\x68\x51\x6d\xf8\xd4\x6a\x29\xaf\x1f\xad\x9a\xdf\x58\xcb\x26\x38\xd6\xa2\x19\x8e\xb5\x6b\x8a\x63\xad\x9b\xe3\x58\x9b\x26\x39\xf6\xc1\x2b\x40\xaf\x1f\x2d\x9b\x8f\x58\xeb\x56\x3a\xf6\x09\xd6\x93\x5e\x3f\xde\x03\xb8\xdb\xb4\xd8\xb1\xae\x3a\x75\xe3\xd1\xb6\x41\x8d\xb5\x6d\x54\x63\x6d\xe3\xe1\x5e\x55\xb0\xd7\x8f\xae\x3e\xf6\x7b\x90\xd3\x5a\x13\x22\x9a\xd6\xd4\x7e\x6c\xa1\x2d\xe0\x64\xd1\xd5\xf7\x43\x29\x40\xc4\xa5\xcb\x56\xb2\xee\xdd\x95\x5e\x5d\x18\xaa\x59\x6d\x79\x1a\xe2\x56\x11\xa3\xf1\xf7\x38\x18\xbc\x72\x59\x29\x1e\x57\x99\x6c\xa9\x75\x4c\x69\x3a\x2b\x9a\xc7\x38\xa5\xa0\x6c\x3a\x55\x79\x18\xef\x1d\x50\x38\x69\x29\x4d\xc8\x78\x31\xc0\xb4\x7c\x02\xf5\x0b\x6a\x74\x7b\x10\xec\xd8\x87\xa6\xbc\xe3\x60\x50\xed\x89\xeb\x67\x3c\xfa\xef\xff\x39\xae\x55\x6f\x29\x27\xf4\x54\xb9\x38\x3b\x23\xb0\xbc\x9f\xc0\x0c\x12\x5c\x47\x68\xb8\x3c\x55\x68\x31\xa6\xb2\xa7\x15\x83\xd4\xf5\xe2\x8e\xb2\x31\x70\x9b\x6b\xac\x20\x0a\x92\x8f\x92\xe6\x67\xa5\x53\x30\x3b\x05\x73\xbb\xd1\x29\x98\x6b\x47\xa7\x60\x36\x18\x9d\x82\xb9\xdd\xe8\x14\xcc\xf5\xa3\x53\x30\x3b\x05\x73\x8f\xd1\x29\x98\x9d\x82\xb9\xef\xf8\x15\x2b\x98\xed\x06\x4e\x57\xd5\x3d\x1f\x87\x82\xf2\xa3\xe5\x56\x44\x65\x50\x75\xb8\x8b\xfe\xd5\xae\x9a\x59\x55\x21\x57\x2b\x99\x55\x45\x74\x49\xd1\x1e\x3c\xa2\x51\x16\x3a\xe7\xd2\x93\x1b\x95\xcd\xe7\x16\x1b\xde\x1a\x22\x56\x9c\xce\xad\x62\xe2\x6d\x08\x5d\x2b\x5b\xbb\x17\x71\x6d\x31\x3b\x0a\xde\x7e\x6c\xd5\x22\x95\xad\x5f\x94\x56\xf4\xcb\x3b\x0a\xff\x3f\x86\xed\xd4\x2a\x06\xd4\x9c\xd4\x45\x94\x5c\x11\x81\x55\x22\x8f\xa3\x8e\xa0\x6b\x6b\xc0\xd6\xb8\x63\x21\x29\x96\x32\xb4\x15\x52\x32\x84\x65\x11\x39\x45\x02\x18\xd0\x9c\x24\x5f\x5c\x0f\x8a\xbf\x25\xec\x2a\x71\x44\x1c\xcf\x18\x97\x3e\xdd\x56\xc9\xd0\xf7\x9e\x7a\xd9\x97\xe2\x72\xd1\xad\xa5\x78\xfb\x80\x5d\x22\xd2\x57\x27\x16\x06\xe1\xc3\xa9\xc3\x4a\x3b\x26\x8a\xa7\x55\x1a\xe2\x7e\xe7\xd2\x10\x0b\x31\x29\x5d\x65\x88\xae\x32\x44\xa3\xca\x10\x78\x91\x0e\x77\xeb\x25\x22\xd8\x5f\x7d\x03\x26\x0d\x08\xaa\x34\x4f\xac\xc8\xca\x18\x6f\x43\xaf\x4a\x48\x91\x18\xfb\x58\xd3\x3a\xbe\xbb\xb7\xf1\x68\xba\x88\xf7\x38\x1f\xc6\x84\x1b\x24\x27\x3e\x9e\x13\xdb\x25\x61\x4d\x83\xa0\x75\x50\xd0\xaa\xf8\xf4\x63\x11\x2f\x90\x60\x9b\x52\x69\xa6\x6e\x5e\x8e\xce\x27\x0e\x25\x1c\xc5\xde\xc0\x20\xaa\x2d\x33\x30\x2e\x56\xcc\x40\x96\x5c\xe2\xc8\x1c\x1f\x07\x61\xa8\x55\xee\xf5\x5e\xb8\xcf\x1f\x2b\x5c\xe2\x4f\xdb\xf0\x1f\xfc\xa0\x82\x03\x95\xe0\x2b\xf9\xcf\xa7\x1d\x74\xd9\x3c\x7e\xae\x0d\x83\x5c\x6b\x71\x73\x1f\x3d\x66\xee\xd7\x54\x5d\xe3\x49\xba\x30\x9e\x9c\xd6\xf1\x3c\xdc\x16\x5d\x4a\xea\xf6\xe3\x53\x48\x49\xfd\x48\xae\x89\x4f\x27\x33\xf5\x93\x75\x47\x7c\x2a\x99\xa9\x9d\x0b\x62\xa7\xf1\x5c\x13\x46\xeb\xa3\x45\x97\x43\xe7\x6e\x68\x59\xa6\x6a\x85\xf9\xbf\x1f\x37\x43\x2b\xf8\xd7\x6a\xfc\x5a\x17\xbb\xf6\xcc\x63\xd7\x3a\x45\xaf\x53\xf4\xea\xa3\x53\xf4\x96\x46\xa7\xe8\xed\x30\x3a\x45\x6f\xfd\xe8\x14\xbd\xe5\xd1\x29\x7a\x9d\xa2\xb7\xc5\xe8\x14\xbd\x4e\xd1\xdb\x76\xfc\xca\x14\xbd\xf6\x8a\xc6\x77\x31\x64\xed\xc7\x90\xb5\x43\x08\x5b\x20\x7f\xad\x20\x5d\x4b\x31\x63\x5d\xbc\xd8\xd3\x8e\x17\x6b\x58\x3a\x4f\x5a\xf1\x7e\xca\xe7\x55\x77\x7b\x5d\x0d\x3d\x3e\x53\x22\x66\x59\x6e\x7d\x05\xb1\xae\x8e\xde\x53\xae\xa3\x57\xdb\xd1\xae\x98\xde\x56\xc5\xf4\xd6\xc1\xac\xab\xa8\xb7\x66\x3c\x9d\x28\xb6\xae\xa2\xde\xae\xa3\xab\xa8\xb7\x7a\x74\x15\xf5\x36\x8c\xae\xa2\x5e\x57\x51\xaf\x2b\x78\xd0\x60\x74\x05\x0f\x56\x8c\xae\xe0\xc1\xfe\xa3\x2b\x78\xb0\xd5\xe8\x0a\x1e\x74\x05\x0f\xea\xa3\x73\x42\x35\x1b\x5d\xc1\x83\x86\xa3\x73\x4c\x75\x05\x0f\x1a\x4d\xd8\x55\xd4\xeb\xa2\x12\x77\x1f\x9d\x82\xd9\x29\x98\xdb\x8d\x4e\xc1\x5c\x3b\x3a\x05\xb3\xc1\xe8\x14\xcc\xed\x46\xa7\x60\xae\x1f\x9d\x82\xd9\x29\x98\x7b\x8c\x4e\xc1\xec\x14\xcc\x7d\xc7\xaf\x58\xc1\xec\x2a\xea\x3d\xf5\x68\x48\xf6\x14\x53\x9e\xba\x8a\x7a\x5d\x84\xe4\x5e\xdb\xdd\x55\xd4\x7b\x7c\xfc\xea\x2b\xea\xd5\xa2\xf5\x3e\x5e\x59\xbd\xdd\x97\xd1\xd5\xd6\xeb\x6a\xeb\x75\xb5\xf5\xba\xda\x7a\x5d\x6d\xbd\xae\xb6\xde\xf6\xe3\xe9\x3b\x33\x9e\x9c\xfe\xf1\x3c\x1c\x18\x5d\xc9\x85\xed\x47\x57\x72\x61\xed\xe8\x4a\x2e\x74\x25\x17\x3a\x67\xc4\x3e\xa3\x2b\xb9\xb0\xe3\xe8\x1c\x0f\x5d\xc9\x85\x9d\x46\x57\x5b\xaf\x8b\x62\xdb\x7e\x74\x8a\x5e\xa7\xe8\xd5\x47\xa7\xe8\x2d\x8d\x4e\xd1\xdb\x61\x74\x8a\xde\xfa\xd1\x29\x7a\xcb\xa3\x53\xf4\x3a\x45\x6f\x8b\xd1\x29\x7a\x9d\xa2\xb7\xed\xf8\x95\x29\x7a\x5d\x6d\xbd\xa7\x1c\x4d\xd6\xd5\xd6\x5b\x31\xba\xc8\xb1\xa7\x1d\x39\xb6\x27\xae\xf0\xdc\xaa\x54\xe5\xd2\xde\x80\x9e\x89\x08\xce\xa2\xc8\xfd\x75\xab\xee\x60\xc7\x68\xa5\xba\x16\xba\x61\x5a\x26\x64\x2c\x22\xd4\x23\xef\xa7\x80\xa5\xf1\x9c\x78\x8b\xf7\x31\x4e\x37\x32\x8b\x77\x96\xe8\x85\xeb\x74\x34\x0d\x43\x78\x70\xea\x5d\xe1\x45\x10\x1a\x29\x95\x00\x97\x3b\x3c\xe9\x99\x21\xe8\x1d\x4f\x73\x0d\x20\xaf\x3c\x25\x2e\x27\x63\x23\x48\x94\x9c\xf8\x88\x21\x7f\x02\x06\xec\xbc\xbc\x21\xe2\x12\x0f\x4f\xae\x35\x48\x9b\xcc\x11\x0e\x58\xa4\x0b\x95\x86\x54\xcd\x20\x46\x8a\x8d\x81\x4a\x24\x46\x72\xcb\x12\xe0\xee\x5d\x12\xca\x97\xb9\xc3\xc3\xd9\x10\xe7\xa7\x49\x47\xe0\x83\xa7\xf6\x02\xe2\xee\xb4\x71\x2f\x6a\xb8\x60\xd8\xf0\x52\x13\xb2\xa5\x08\xd5\xa3\xca\x17\xe2\xd1\x9c\xab\x9c\xdd\x73\x12\x94\x74\x2e\xf1\x30\xe3\xa7\x3b\xd0\xee\xf8\xf2\x06\x22\xc9\xfe\xd6\x87\x3e\x52\xb5\x1d\x1f\x6b\x62\x0d\xe0\x7a\xb2\x17\x93\xaa\x6d\xcd\xe1\x99\x9e\xe4\x24\x11\x7a\x54\x06\x69\xf5\x1c\x23\xfa\x48\xa4\x88\x55\x74\xe7\xd0\x30\xe5\x13\x38\x3c\x34\xec\xfc\xf5\x85\xa3\x7d\xb9\x71\xa4\xda\x97\x09\xf4\xb4\x30\xd3\x6a\x26\x62\x87\xd9\x3f\x70\x2d\xf8\x28\x71\x32\xe7\x18\x34\x48\x27\x12\x7c\x76\xf4\xc3\xd9\xdb\x9f\xaf\xcf\x5e\x5f\x1e\xa3\xf4\x09\x0f\x19\x97\xee\x48\xe4\xa6\x8c\x43\xf5\x38\xe1\x5e\x04\x72\x26\xb4\x92\x6e\x71\xa8\xa7\x71\x36\x0b\xb3\x46\xc5\x49\xd0\x60\x54\x32\x83\x98\x64\xe4\xe2\x6d\x81\xe5\x08\x99\xe5\x36\xe8\x8d\x18\x1d\xe9\x4e\x8f\x8c\xa6\x5c\x4e\xdc\x3a\x2f\x54\xee\xe6\xfb\xec\x33\x5c\x91\x86\x38\x8f\x48\x6a\xe2\x01\x65\x3f\xeb\x05\x36\xe1\x08\xbd\xa1\x9a\x8e\x26\xe2\x59\x58\x73\xf5\xb3\xcc\x5c\x5a\xfe\x70\x4a\xe1\x81\x07\x9f\x55\x2e\x1d\x84\x7a\x98\xca\xbd\x82\x98\x0d\xad\x2a\xc1\x52\x8c\x09\x3b\xa8\xde\x3d\x60\x97\xee\x1d\x10\x57\x01\x48\xd1\x9d\x30\x03\x8d\x5a\xa7\x07\x5f\x8f\x69\x98\x70\x1d\x27\x60\x30\xae\x31\x10\x66\xd2\x0c\x3c\xc0\xa0\xd0\x69\xa5\xb2\xab\x28\x09\x7b\xad\x30\xc6\x71\xac\x4e\xd9\xd4\xda\xcc\x9c\x9e\x9c\xdc\xe5\x23\xd0\x12\x2c\x98\x81\x50\x27\xb1\x8a\xcc\x89\xe5\xe6\xce\x9c\x08\xe9\x4e\x56\x3f\xe6\x96\xf7\x2b\x47\xfa\x84\xd8\x76\x3f\x52\x69\xca\x65\xdc\xe7\x1e\xb5\xfa\xc5\xb6\x9e\xfc\xd6\x33\xd4\x3e\x2f\xee\x12\xb2\xcf\xfb\x66\x0a\x49\x72\xb8\x07\x32\x37\x13\xf8\x1a\x08\x7a\x8d\x04\x3c\xff\xed\xcd\x4f\xef\x65\x71\x58\x09\x06\x03\x76\xad\xac\x0f\xbf\xf5\x91\xde\x48\x44\x11\xbe\xab\xcf\xf3\xe5\xf5\xed\xdb\xbf\x0d\xdf\x5c\x5d\xdf\x76\xc7\xba\x3b\xd6\xdd\xb1\x6e\x70\xac\x41\xce\x1a\x1f\xe9\x20\x6d\x56\x8e\x49\xb1\xdf\xc8\xa3\x0d\xd8\x70\x0c\x8a\x0d\x68\x2c\x1b\xd2\xf8\x68\x50\xaf\x41\xe0\x52\xce\x7e\xe0\x75\xd3\xba\x5c\x09\x0e\xe6\x6f\x20\x11\xb9\x90\xbe\x9b\xc4\xde\x37\x30\x63\x35\xf5\x5b\xed\x25\x3f\xd2\x68\xee\x53\x72\xaf\xde\xdf\xc4\x50\xdb\xbe\x6b\x9e\x96\xf5\xb5\x57\xec\xda\x80\xbd\x0e\x0a\x0f\x3b\xff\xf9\xea\xe2\xf2\xfa\xf6\xea\x9b\xab\xcb\xb7\xfb\x6b\xd0\x2d\xd8\x5a\xd0\x9a\xd0\x12\x00\x0e\xf7\xe4\x92\x99\x86\x99\x50\xb9\x49\xe6\x85\xfd\x63\x35\x11\x58\x3c\xfd\xde\xe1\x3b\x2f\x34\xf1\x95\x8f\x75\xcc\xb6\x5d\x66\x7b\x01\x63\x9e\x27\xa4\x37\x1d\x1c\x0c\xf6\xe1\x72\x34\xda\x42\xdf\x6f\xb4\x6a\x50\x3f\xba\x86\xc2\x37\x54\x79\x7e\xac\xf4\xda\x63\x7c\xe8\xc3\x0e\x6a\xac\xc7\x0b\x8f\x64\x9b\xf3\xd2\x23\x79\xc7\x1a\x42\xa7\xa1\x7b\xa1\x1d\xa7\x7b\xa4\xe4\x58\x4c\x5e\xf3\xec\x3b\x98\xbf\x85\x71\x33\x03\x71\x1d\xde\x68\x77\xf4\x3e\x64\xb4\x52\x3a\x76\x46\x2f\x6b\xe6\x9f\x69\xcd\x3b\xd3\x56\x58\x46\xf3\x90\x8c\xf6\x22\x28\x5a\x89\x9e\x58\xaa\xe6\x4f\x16\x68\x6f\x4b\x6e\x2b\xb8\xa6\x15\x97\x7d\x33\x2e\x1f\x46\x9d\xd9\x55\xd9\xbd\xa7\xb3\x76\x5b\xb5\x23\x52\x32\x82\xcc\x9a\x13\x35\x73\x9c\x0b\xee\x4f\xee\x95\xbe\x73\x7a\x84\x53\x5c\xfb\x84\xb5\xe6\x04\xbd\x05\x27\xbf\x25\xff\xd7\xed\x9b\x8b\x37\xa7\xec\x2c\x8e\x7d\x6b\x96\xdc\xc0\x38\x4f\x7c\x33\x84\x01\xe3\x99\xf8\x01\xb4\x11\x4a\xf6\xd8\x9d\x90\x71\x8f\xe5\x22\xfe\x7a\x7f\xe2\x1c\x46\x8b\xbb\xa0\x32\xf2\x71\xb6\xbc\x13\x37\xe8\x5d\x99\xd7\x78\x57\x41\x44\x1c\xd7\x12\xd6\x20\x6e\x06\x7b\xb3\x17\x32\x5a\x02\xcd\xee\xc6\xf9\xc5\x81\x5b\xd8\x2e\x5d\x3d\x2c\x09\x2b\xf9\x36\x3d\xa2\x66\x2a\x3e\x65\x26\xcf\x32\xa5\xad\x61\x29\x58\xee\x94\xde\x81\xc3\xb0\x5e\xfd\x4f\xf4\x52\xf5\xd8\xdf\x8b\x1f\xd1\xd5\x64\xde\x1d\x1e\xfe\xf1\xbb\xcb\xbf\xfd\xe9\xf0\xf0\xa7\xbf\x57\xaf\x22\x2b\xa4\xf0\x9f\xfa\x2d\x26\x83\x68\x20\x55\x0c\xd7\xf8\x0e\xfc\xd3\xd4\x1c\x2c\xfe\x82\xe5\x36\x37\x83\xa9\x32\xf6\x6a\x58\xfc\x99\xa9\x78\xf1\x2f\xd3\x40\xe2\x60\x4f\x93\x31\xe0\x16\x0d\xb9\x9d\x3e\x11\xf6\x50\xd2\x92\x96\x8f\xaa\x9f\xb5\xda\x02\x28\xe5\xf8\xcf\x6f\x02\x08\x9c\xf4\x74\xaf\x85\xb5\xe8\x74\xf3\x69\xe6\x6a\xdc\x73\xa7\xb6\x14\x3b\x67\x2f\x0f\x9e\x14\x83\x29\x76\xb0\x65\x80\x21\x44\x3c\xb4\xe8\x20\x17\x0c\x76\xd9\xb9\x7c\x36\xbc\x62\x33\x82\xf0\x93\x01\x4e\x48\x1d\xfe\xe6\xbd\xd2\xb8\xa2\x65\x94\x07\x55\xa1\x21\x9e\x52\x34\x50\x91\xc0\xcc\x12\x91\x0a\x1f\x64\xe8\xdb\x4b\x19\x76\x44\x3f\x0e\xa2\x2c\xef\xf9\x1b\x06\x29\xa4\x4a\xcf\x8b\x3f\x21\x9b\x42\xea\x34\xad\xbe\xb1\x4a\xf3\x09\xf4\x8a\xc7\xe9\xb1\xe2\x2f\x7a\xb0\xf6\x82\xe5\xa7\x49\x15\x2e\x9d\xa4\x9e\x22\x43\xfc\xfc\x68\x5b\x00\xfd\x13\x21\x6d\x05\x66\x5c\xbf\x07\x91\xb0\xb0\xc4\x91\xc0\x59\x40\x11\xf5\xc9\x99\x4a\xf2\x14\x4c\xaf\x10\x83\xc8\x1a\x20\x67\x4e\xb3\x34\x4f\x4a\x50\x8b\xc5\x4c\x98\x36\xe2\x87\x57\xc8\x69\xc2\x87\xe2\xab\xdc\x66\xb9\xf5\xb5\x6c\x2a\x6d\xe9\x94\x41\xbb\x45\x51\x70\xa0\x46\xf6\x5f\x36\x2d\xb8\xc5\x58\xc6\xad\x05\x2d\x4f\xd9\x7f\x1d\xfd\xf8\xf9\x2f\xfd\xe3\xaf\x8f\x8e\xde\xbd\xe8\xff\xe1\xa7\xcf\x8f\x7e\x1c\xe0\x3f\x7e\x77\xfc\xf5\xf1\x2f\xe1\x8f\xcf\x8f\x8f\x8f\x8e\xde\x7d\xf7\xfa\xdb\xdb\xe1\xe5\x4f\xe2\xf8\x97\x77\x32\x4f\xef\xe8\xaf\x5f\x8e\xde\xc1\xe5\x4f\x5b\x4e\x72\x7c\xfc\xf5\x67\x8d\x97\xce\xe5\xfc\x4d\x43\x02\x4a\xa3\xdf\x5a\x29\xa2\xc5\x19\x5b\x0a\xb0\x7e\xe8\x97\x4a\x53\x5f\x48\xdb\x57\xba\x4f\x53\x9f\x32\xab\xf3\x66\xc4\xa4\x64\x4a\x6d\x9f\xff\xd0\x7b\xec\xb4\x64\x48\x05\xbb\x7e\x32\x07\xdc\x40\xa4\xc1\x7e\x08\x4b\x0e\xbd\x29\xc8\x29\x0b\xc1\x8e\xcf\x8d\xcf\xfd\x1a\x8c\x3b\x45\xb0\x20\xee\x6b\x29\x89\x8e\xb5\x4a\x07\xac\xe2\xde\x98\x61\xa6\x87\xbf\xef\x0e\x1a\x58\x41\xc3\xe8\x8c\x41\x9d\x31\x68\xcd\x78\xd4\x18\x74\x43\x78\xf8\x64\x2d\x41\x20\x67\xfb\xba\x30\x56\x7a\xd0\x83\xae\x63\x15\xcb\x54\x96\x27\xdc\xae\xf1\x8c\xad\x70\xa7\xfb\xa3\x5e\x46\x22\x97\x91\x34\xc4\xd0\xd2\xd5\x3e\x4c\x76\x96\x24\x4c\x48\x3a\xf8\x38\x41\x70\x98\x69\x20\xd5\x86\x71\xf2\x67\xcf\xdc\x12\xee\x7d\xc9\xba\x6a\xb8\xa7\x61\xc6\x72\x6d\x31\xea\x18\x4b\xda\x11\x2b\xf1\xde\x27\x21\xcb\xc2\x76\x85\x70\x58\x24\x81\xac\xec\xeb\x99\x70\x63\xc3\xb2\x71\x35\x96\xdf\xa1\xb7\x31\x82\x18\x64\x04\x98\x91\x96\x43\xf9\xad\x23\xa7\xb7\xb1\x4b\x39\xa3\x39\x38\x8b\x73\x0a\x06\x21\xf2\xb7\x7a\x8e\xe7\x15\x80\xe0\x10\xf1\x26\xb4\x5f\x2e\xe2\x10\x90\xea\x17\x1a\x76\x91\xd8\x57\x58\x59\xcd\xc7\x89\x3c\x68\xce\x33\x0b\xcf\x56\x23\x61\x68\x89\x59\x96\xe6\xe7\x3a\x93\x7c\x0e\xce\xc0\xe6\xec\xf3\x57\xc7\x3a\x5b\x62\x9b\xed\xb0\xcc\x1d\x7c\x27\x6d\xb2\xc9\x36\x9c\x25\x99\x86\xb1\x78\x68\xe9\x9c\x9e\xc9\xd2\x12\x23\x62\x90\x56\x8c\x05\x75\xec\xcf\x34\x64\x20\xe3\xa2\x28\x2a\x66\x85\xcb\x3a\x6c\x9e\x64\x30\x0f\x09\xdc\xed\x92\xb2\x9b\x55\xc2\x7e\x47\xc7\x58\x47\xc7\xf6\x1e\x1f\x88\x8e\x79\xcc\x7d\x3a\x44\x0c\x23\xcf\x9b\x87\xbe\x5f\x54\xe2\xd8\x11\x8b\x77\xc6\xb2\x32\xa1\xeb\x04\x67\x31\x0b\xd5\x83\x0a\xba\x68\x15\x45\xae\xb1\xa9\x98\x38\xb0\x52\x45\x21\x12\x9a\x58\xca\x25\x9f\x50\x56\xb7\x55\xc1\x4e\xeb\xb4\x2c\x87\xc4\x5a\xc4\x35\xe1\x9e\x5e\x23\x24\x73\x88\x9d\x28\x1e\xe3\x45\xad\x92\x04\xb4\x61\x89\xb8\x03\x76\x01\x59\xa2\xe6\x3e\x49\x5b\xc6\xec\xc6\x72\xeb\x50\xfa\x06\xec\x7e\x3e\xdf\x46\xe8\x8a\x2b\x1e\xe6\x49\x32\x54\x89\x88\xf6\xb2\xa8\xd4\xb7\xed\x0a\xf7\x2b\xcb\x93\x84\x65\x38\xe5\x80\xbd\x91\x48\x31\xce\x92\x7b\x3e\x37\x3d\x76\x0d\x33\xd0\x3d\x76\x35\xbe\x56\x76\x48\xa2\x77\x3d\xda\x8e\x6e\x64\x62\xcc\x4e\xb1\xa6\x8d\x65\x96\x4f\x50\x71\x0a\x3e\xc0\x9e\x83\x7f\x75\x02\x22\x0e\xf7\xc2\xac\xd4\x54\x1a\x23\xce\x6f\x71\x26\x47\xa8\xe8\xef\x0f\xbe\x4d\x89\x18\x43\x34\x8f\x92\xe6\xe7\xea\x2c\xc2\xe8\x85\x32\xcf\xbc\x82\xdf\xbe\x4c\xbb\x4f\xed\x44\x15\x50\x48\x46\xf5\xd3\xa9\x30\x7c\x89\xea\xc5\x8a\x48\xd5\x35\xad\x6a\x88\x7b\x73\xce\xa6\x3c\x33\x53\xc6\xde\x38\xf5\xbc\x95\x2a\xeb\x87\xc3\x30\x1d\xc3\x5a\xd2\x49\x02\x31\x13\x69\x0a\xb1\x53\xe1\x93\x39\xe3\x63\x8b\x29\xb6\x35\xf3\x40\xa4\x81\xb0\xd6\xd7\x2e\x99\x72\x19\x27\xa0\xd9\x98\x8b\xc4\x1b\x03\x6a\xf7\x5b\xd0\xa9\x90\x68\x13\x20\x77\x2c\xda\x17\xdc\x5f\x51\xa4\x74\xa8\x7b\x2f\xac\x09\x97\xca\x83\x89\x4c\xa4\x82\x00\x8b\x7e\x65\x36\x4a\x54\x74\x67\x58\x2e\xad\x48\x68\x31\x4a\xdd\xb1\x48\xa5\x59\x82\x47\xa7\xc1\xc9\x2a\xfe\xd9\x2f\x50\xa9\xef\x66\x37\x27\xbf\x2d\x2f\xe1\x0f\xfb\x72\xf3\x16\xa4\xb0\x36\x64\x30\x78\x80\xa8\xb5\xf4\x7e\x47\x4b\xdd\x2e\xa3\xbf\x5f\xc9\x42\x14\x1b\x2b\xc7\xc0\xdc\x5e\x97\x89\xd9\x05\xb9\x1c\xb0\xcb\x07\x88\x2a\x55\x28\xb0\x3f\x04\x12\x02\xcc\x0a\xe5\x77\xf0\x8c\xca\xde\x35\x48\xbe\xab\x8e\x1a\xd8\xcf\x69\xce\x50\x35\xcb\xbf\x82\x25\x42\x22\x59\xf4\x09\x79\x4c\x48\xe3\x04\x82\xda\x19\xa2\x13\xeb\x05\x5d\x16\x0b\x8d\x35\x13\xe6\x45\xf0\x75\x98\x0b\xcb\x11\x28\x65\xd9\xd1\xe1\xc9\xe1\xf1\x92\xcd\xf2\xd0\x09\x2e\x09\x10\x89\x26\x03\x66\x54\x2e\xca\x88\x34\x4b\xe6\xb8\x8e\xc3\xb8\xc7\x84\x0d\xd1\xd9\x3a\x97\x61\x55\x3e\x4b\xb0\xc7\x8c\x62\x56\xf3\x50\x8a\x85\x7e\x75\x37\x59\x9d\x7b\xe6\x70\x74\xf8\xcb\x61\x8f\x81\x8d\x8e\xd9\xbd\x92\x87\x16\x97\x3f\x60\xb7\xca\x89\xdf\xe5\x44\x73\x95\x33\x09\x94\x0c\x00\x0f\x59\x22\x22\x61\x93\x39\x12\x3a\xa6\x72\x4b\x19\xc7\xdc\x86\xec\xc4\xcb\x07\x61\x7d\x8c\x9b\x43\xdb\x17\x08\x4d\x22\x76\x8c\x3b\xe9\x68\x06\x27\x53\xe0\x89\x9d\x52\x60\x89\x54\xb2\xff\x2f\xd0\x0a\xf3\x16\xa5\xbf\xf2\xec\x4a\x04\xb6\xa2\x6d\x38\xda\xfb\x2d\xb4\xd7\x54\xe8\x2f\xb7\xb7\xc3\x6f\xc1\x2e\x90\x0c\xf7\x96\x10\xee\x83\x16\x04\xd0\x63\xa5\xd3\x27\x40\x3b\xda\x71\x70\xf6\x59\xa6\xf4\x53\x20\x61\x53\x65\x1a\xed\x25\x5b\xda\x4f\x65\x2c\x2a\x51\x5e\x88\x93\x10\xb9\x1d\xac\xc7\x9d\x84\xbe\x3b\x57\xc3\x01\xfb\x9b\xca\xdd\xd7\x8c\xf8\x28\x99\x17\x75\x1b\x0c\x58\x76\xe0\xa6\x3a\x70\xe4\xc9\x61\xc3\x5f\x80\xc7\x4e\xb3\x71\xd4\x03\xf8\xd3\xe8\xaf\xc5\xfc\x79\xf0\x6b\x6b\x97\x0f\xe4\xc6\xaa\x94\x4d\xfd\x67\xd7\xd3\x35\xfd\xc9\x18\xe0\xe9\x09\xb9\x50\x1a\x32\xa2\x70\xfe\x99\x67\x47\xbf\x96\xe8\x06\xc1\xdd\xff\x3e\xc2\x9a\x57\x51\x15\x6c\xbe\xc1\x14\x25\x13\x49\x02\x96\x43\x35\xd8\xcf\xbd\x52\x1d\x4f\xb8\x50\xe9\xde\xc9\x9f\x8b\x13\xa1\x23\xb0\x79\x7c\x58\xab\x65\x4a\xdb\x89\x35\x60\xab\x0c\xb3\x1e\x67\xc8\x68\xd3\x12\x10\xdf\x4f\x9d\xcc\x0f\x01\x80\x76\x36\x9f\xb5\x09\x81\xac\x85\x70\xf0\xe5\x60\x70\xab\x9c\xfa\x8a\xe9\x9a\x44\x5c\x91\x4c\x18\xd0\xb3\x7d\x13\xc0\xcb\xd1\xde\xa7\xab\xfd\x0d\x05\x61\xac\xc8\xad\xd6\x4c\xe6\xe9\x08\x74\x99\xcd\xa2\xed\x32\x40\x2a\xd1\x0c\xd7\x74\x7b\x30\x01\xd7\xdb\x39\xba\x27\xbf\xfa\xf7\x7f\xff\xf2\xdf\x07\x34\x7d\x11\xd9\x20\xd9\xd5\xd9\xf5\xd9\xcf\x37\x3f\x9c\x63\x42\x6d\x53\xa8\xb6\x14\xb6\xd9\x76\xd0\x66\xab\x21\x9b\xef\x35\x60\x13\xd3\x44\x1a\x53\x91\xba\xbf\x00\xa7\x74\x18\xe0\xf4\x36\xa7\x71\x7a\xd9\xaf\x52\xda\xcc\xc9\x9a\x75\xfb\xab\x3b\x6a\x4f\xe2\x8c\xd9\x28\xbb\x51\xd1\x5d\x8b\x7a\xcd\xe1\xed\xf9\x90\xa6\xac\xd6\xe4\x94\xc1\x18\x22\xe4\x4c\x25\x33\x2a\xe7\x7b\x7b\x3e\xc4\x93\x37\xc0\x7f\xa1\x21\x0a\x35\xea\xb9\x7b\x36\x24\x32\x78\xf7\x94\xd3\xbe\xc9\x82\xc6\x99\x06\x9e\x08\x63\x45\x84\xcf\x95\x66\x52\x37\x43\x13\xbf\x54\xa7\x29\xad\x1a\xad\x6b\x4a\x87\x6f\x82\xdb\x6e\x67\xa5\xa9\x69\xe0\xe1\x13\xe6\x4b\x9e\x1f\x51\xc6\x47\xc7\x97\x7e\x15\x7c\x29\xd3\x70\x63\x55\xd6\x92\x27\x84\x26\x5b\xe3\x07\x19\xc1\x58\x69\x58\x74\x84\x54\x1c\x1b\xa1\xc1\xb0\xc4\xec\xbf\x60\x82\x52\x35\xe7\x05\x85\x5c\x9a\x3c\x9a\x06\x6b\xa2\x04\x63\x4e\xd0\xe5\x91\x67\xa4\x62\xa2\x13\x25\xd7\xd0\x73\x5f\x07\x29\xae\xae\x57\xa6\x31\xb8\xd7\x83\xa4\x1f\xc1\x46\x64\x66\x0d\xfe\x17\x6f\x51\x0d\xcb\x5f\x74\x95\x44\x9a\x9b\x29\x60\xfd\x10\x78\x10\x65\x9f\x13\x6e\x94\x24\x63\xaf\xff\x1c\x64\x34\x86\x65\xdc\x98\xb2\x82\xb3\x7f\x09\x3d\x34\x54\xf1\xe1\xa1\xa9\x3d\x30\xd1\x3c\x02\x96\x81\x16\x2a\x66\x98\x4f\x1c\xab\x7b\xc9\x46\x30\x11\xd2\x04\xf8\xb9\x89\x02\xa0\x1d\xbb\xa1\x62\xbb\xa1\x5a\xdc\x80\xbd\xad\x15\x41\xf1\xe9\x49\x91\x2a\x4f\xb4\x5f\xc5\xa2\x93\x09\x23\x42\x2b\x6d\x9a\x8b\x8d\x09\x61\xb3\xf6\xf1\x45\xb7\xe0\x6d\x72\xa0\x2d\xaf\xad\x85\x0e\x16\xe7\xe7\xd1\xb4\x99\xe3\xb7\x73\x4f\x6d\x39\x3a\xf7\xd4\x6e\xa3\x73\x4f\x75\xee\xa9\xf5\xe3\xc9\x99\x77\x3b\xf7\x54\xa7\x74\x2d\x8e\xce\x3d\xd5\xb9\xa7\xd6\x8c\x27\x47\xbf\x3a\xf7\xd4\x16\xa3\x73\x4f\x6d\x39\x3a\xf7\x54\xe7\x9e\xea\xdc\x53\x9d\x7b\xea\x57\x64\x06\x0c\xa3\x73\x4f\x2d\x4d\xd2\xb9\xa7\x2a\xc0\xe8\x34\xa5\x15\xa3\x73\x4f\xad\x18\x9d\x7b\xaa\x32\x3a\xbe\xb4\x07\x5f\x0a\xce\x9d\xa1\xd3\xcb\x9a\xe7\xac\x0d\xd1\x71\x20\x22\xef\x23\xaa\xf6\x82\x2b\x5e\x55\x69\xff\x56\xa9\xf9\x11\x52\x6d\xbc\x37\xa8\xf4\x31\xad\xcc\x87\xda\xd5\x1d\x11\x92\x08\xcd\x49\xa6\xe8\xff\x4a\x67\x44\xc5\x0b\x41\xda\xe9\xfe\x39\x69\x1f\x2d\xdb\xaa\x89\xeb\xe1\x49\xbb\x1d\x9e\x88\x6b\xa7\x05\x57\x43\xe7\x66\x78\x76\x6e\x86\xe7\xd3\x43\xd7\x3b\xf3\x6f\xa7\x1a\xcc\x54\x25\x7b\x23\x7a\x0d\xc9\x5f\x0b\x29\xd2\x3c\x75\x38\x67\x1c\x3e\x8b\x59\x11\x35\x60\x0a\x74\x25\x42\x4f\x96\x42\x77\xa3\x88\x01\x0b\xa0\x72\x91\xb8\x6d\xc4\xb4\xce\x29\x47\x51\xdd\xe4\x51\x04\x80\xed\xd5\xaa\x5a\xcc\x97\x83\xe2\x4d\x45\x3b\x8d\x97\xcd\xe8\x4d\x33\xde\x4f\x25\x4a\x71\x96\x2f\xbf\xd8\x6b\x8e\x86\x5e\x9e\x0f\xef\xe1\x69\x81\x4c\x37\xd7\x57\x1a\xe9\x2a\x6d\x70\x89\xa6\x3a\xca\xa7\xe6\xc9\x69\xcd\xa3\xd9\x82\x07\xe7\x09\x79\x6f\x9e\x0c\x5b\x78\x2a\x1e\x9b\x27\x58\x7d\xb5\x05\x07\x43\x1b\x1e\x9a\xf6\xbc\x33\xef\xa1\x48\xe9\xfb\xf1\xca\xb4\xa8\x0d\xb7\xe4\x8d\xf9\x10\x9e\x98\x56\xbe\xba\xa9\x07\xe6\xc3\x79\x5f\xda\xf9\xdc\x86\xd6\xad\x67\xe1\x71\x69\xc1\xaa\xd5\xa6\x45\xab\x35\x6b\xd6\x7b\xf3\xb0\x34\xf7\xae\x3c\x01\xcf\x4a\x63\x20\x0b\x29\xac\xe0\xc9\x05\x24\x7c\x7e\x03\x91\x92\xf1\xde\x1c\x66\xa1\x6a\x5d\x71\x7e\x0c\x4d\xeb\x75\xb4\x7a\xfc\xf1\x94\xfb\xe2\xbc\x10\x87\x90\xea\x60\xfe\xf3\x02\x05\x36\x34\xa1\x55\x3e\x49\x83\x1e\x7b\x32\xca\x20\x05\x63\xb7\xb9\x89\x7f\x51\xf7\x4c\x8d\x2d\x48\x76\x24\x64\xd8\xc7\xe3\x8a\x1a\x58\x6a\xe6\x05\x5a\xbb\xab\x2f\x5f\x84\x9b\x9f\x9f\xca\x8d\xc6\x05\x63\xde\xbf\x05\xc4\xbf\xe8\x71\x13\x88\xbf\x71\x9c\x27\x75\x33\x08\x99\x46\xea\xf4\xe6\x65\x59\x5e\xf4\x25\xce\x5b\x9c\x36\x2e\x63\xe6\x13\x37\x9e\xdf\xa6\x35\xf6\x1b\x3f\x07\x9f\x71\x67\x7b\x61\x6d\xdb\x5e\x3e\x92\x6f\xf8\x09\x4a\xcd\x9f\xa8\x3f\xb8\x93\x9a\x77\x18\x95\xfc\xaf\x6f\x35\x8f\x60\xd8\xba\xc0\x11\x8e\x13\x8b\x73\xed\xd3\xf6\x0a\xb9\xa3\x38\x3c\x12\x20\xa6\xd3\x54\x24\xc5\x61\x36\xda\x38\x4f\x92\x39\xcb\x33\x25\xeb\x99\x87\xe4\xb4\x5a\x4c\x58\x73\xb3\xad\x7a\x4b\x29\xa5\x66\x5a\x79\x06\xac\x73\x29\x1d\x3d\x2f\x1b\x0e\xa1\x54\x6a\x88\x56\x57\xd3\xe2\x8c\x98\xb8\xe5\x3b\x66\x8a\x19\x73\x22\x85\xb2\x25\x45\x39\xa1\x7b\x7a\xac\x74\x24\x46\xc9\x9c\x4d\x79\x52\x74\x97\xe0\xec\x4e\x24\x89\x9f\x66\xc0\x6e\xc0\x32\x3b\x15\xbe\x31\x38\x4b\x94\x9c\xe0\xe2\xb8\x0c\x5d\xcd\x20\x72\xcf\x46\x09\x70\x99\x67\xf4\x3e\xc7\xd6\xe7\x2a\xd7\xe1\x7d\xbe\xac\x65\x31\x8b\x30\x4c\x8a\xa4\x57\xe9\x9d\xb4\x71\x63\xcb\x06\xf5\x06\x42\x4e\xe1\xbd\x30\xd0\xab\xce\x19\x2a\xf3\x9a\x4a\xe7\x8c\x4c\xab\x99\x88\xa9\xfb\x45\x00\x1b\x76\x69\xa5\xee\x18\xc5\x79\x96\x4a\xf6\x25\x4c\x38\x4a\x3d\xfe\x14\xd1\x9e\xd1\x3c\xe4\x8a\x93\x31\xf6\xcb\x70\xea\x82\xca\x6a\xa9\xac\x33\x41\x9d\x3e\x2b\x90\x63\x47\x52\x31\x85\xec\x35\x97\xc2\x52\xf7\xe8\x69\x6e\x59\xac\xee\xe5\xf1\x80\xaa\x12\x0b\xc3\x38\x1b\x81\x0d\x9d\x6c\x43\x67\x45\xa1\xc1\x30\x90\x7c\x94\xb8\x3d\xc7\x80\x87\xdb\x95\x00\x62\x63\xe0\x36\xd7\xc0\x26\xdc\xc2\x4a\xa1\x89\xbe\x77\x33\x78\x85\x29\xba\xbc\xe7\xd2\xc0\xde\xfd\xad\x5b\x96\xb4\xbe\xfa\xfd\x7e\x34\x42\xa4\xa0\x72\xfb\x41\x54\xc9\xfb\xa9\x88\xa6\x55\xc9\x58\xa4\x60\x98\xca\x17\x74\xec\x97\xfe\xb1\xd5\x3b\xd4\xe9\x93\xab\xc6\xbe\x56\xe2\x15\xa6\xb4\xc5\x94\xe3\xb2\xad\x2c\x77\x07\xf0\xe2\xfa\xe6\xe7\x57\x67\x7f\xbe\x7c\x35\x60\x97\x3c\x9a\x56\xf3\xd1\x25\xe3\x48\x34\x90\x50\x4c\xf9\x0c\x18\x67\xb9\x14\xff\xcc\xa9\x3a\x39\x3b\x2a\x9e\x3d\x6e\xb5\x16\xf2\x9e\xdc\x17\x5b\x5f\xb7\xd6\x6b\x89\x1a\x69\x53\x80\x83\x32\x80\xdd\x11\x16\xc5\xa7\x4b\x77\x89\x14\x0d\x14\xb5\xa6\xe0\x88\x91\x98\x79\x32\xec\x8b\x4b\xf3\xb8\x08\xb9\x70\x78\xee\xd0\xc2\xb1\x2a\x3e\xc2\x50\x89\x29\x30\x09\xd6\xa1\x75\x61\xb0\x52\xd2\xd4\x0a\x03\xe4\x06\x4c\x8f\x8d\x72\x0c\xee\xc8\xb4\x48\xb9\x16\xc9\xbc\x3a\x99\xe3\x55\xd7\x2a\xa8\x43\xf3\xc5\x25\x5d\xbc\xb9\xbc\x61\xd7\x6f\x6e\x59\xa6\xa9\x64\x00\x46\x67\xe0\x75\xfc\xac\x11\xb8\x27\x7c\x8f\xce\x01\x3b\x93\x73\xba\x48\x07\x5c\x18\xe6\x74\x21\x40\x16\xec\x65\xc8\x50\x14\xfe\xe0\xc5\x00\xff\x77\xe0\xbe\x52\x3b\x21\xb3\x08\x3a\x89\x96\x82\xc7\x48\x0c\x15\xa3\xa4\x02\x4d\xff\xed\xcf\xaa\xdb\x52\x11\x36\x37\x74\x40\xac\x74\x5b\xe2\xc5\x56\x23\x78\xa9\xfb\x96\x90\x93\xa4\x8a\x55\xfb\x91\xfd\xa6\xba\x65\x53\xcd\xb2\x5f\x7e\xc1\x70\x5f\x05\xb3\x95\xae\x4f\xe5\x1a\x5a\xea\x95\x52\x72\xbf\xa0\x4e\x79\x8a\xa0\xaa\xed\x2f\xaf\x86\xe1\x04\x78\xe9\x26\x5d\xe8\x99\x88\x0f\x93\x53\xa3\xc7\x5e\xb0\x3f\xb2\x07\xf6\x47\x54\xaf\xbe\x6a\xda\x59\xa6\xa9\xe2\xd3\xdc\xbc\x43\x5a\xfd\xd5\xb0\x25\x88\xff\xd5\x51\x27\x37\xa3\x83\xaa\x55\x6c\x24\xbc\x38\x0f\x0f\x16\xb4\xa3\xa3\x7e\x27\x3e\x6a\x4f\x1e\xb7\xc0\x0f\x88\x66\xe4\xbb\xb8\x1a\x57\x5b\x42\xd8\x1d\x11\xcd\x3d\xfe\x17\x65\xec\xb5\xa7\x42\xf5\x06\x13\xe5\x6c\x29\xb7\xd1\xb4\x4e\xc6\x9c\xa0\x66\x6c\x79\xc0\x0c\x8b\x15\x5a\xd2\x28\x0e\x70\x2a\x1a\x44\x62\x3c\x1d\x34\x6e\xe6\x9c\xaf\xed\xe7\xa6\x9d\x5a\x30\xa0\xa0\xe6\xe3\x05\xab\x4a\x79\x99\x4c\xc5\x5e\x26\x73\xcb\x8a\x2b\x3c\x63\x83\x50\xe6\x6d\x35\x85\xc9\x1a\x71\xc9\x9d\xa7\x88\x4b\x0a\xe0\x1e\x83\xd6\x14\xba\x39\x9a\xa3\x07\x59\x44\xd0\x78\xf3\x1a\x9d\xa4\x4c\x2b\xab\x22\xd5\xa0\x6d\x50\xdd\x61\xee\xa7\x43\x20\x90\xf1\x37\xd8\xdc\xbf\xbf\x18\xf6\xd8\xed\xf9\x10\xbb\xa9\xdc\x9c\xdf\x0e\xeb\x9a\xca\xc1\xed\xf9\xf0\xe0\xa3\x82\x82\x05\xc9\xea\xd4\x2d\x73\x8f\x49\x6a\x86\x27\x27\xb6\xf5\x53\x9e\xf5\xef\x60\xbe\x27\x4f\x6d\x83\xaf\xf7\x8b\x1d\x6e\xe5\x83\x08\xcc\x29\xcf\x76\x9e\x4d\x03\x8f\xc5\x07\xca\xa2\xf0\x27\xab\x7c\xe7\xea\x74\x8a\x54\xcd\x20\x26\x71\x38\x3c\x01\x32\xce\x94\x70\xf2\x62\x97\x63\xb1\xfb\xd3\x5d\x8e\xc5\xa6\xd1\xe5\x58\x74\x39\x16\x5d\x8e\xc5\xe6\xd1\xe5\x58\xf8\xf1\xf1\xcd\xa0\xac\xcb\xb1\xd8\x73\x3c\x2f\x3f\x7f\x97\x63\xb1\xd3\xe8\x72\x2c\x96\x47\x97\x63\xb1\x66\x74\x39\x16\x6b\x46\x97\x63\xd1\xe5\x58\x74\x39\x16\x5d\xb4\xd8\xa3\x73\x3d\xcd\x68\x31\xd6\xe5\x58\xf8\xd1\xe5\x58\x3c\x8b\x98\x18\xd6\xe5\x58\x6c\x35\xba\x1c\x8b\x2e\xc7\x62\x9f\xd1\xe5\x58\xe0\xe8\x6c\x2f\x5d\x8e\x45\x18\x5d\x8e\x05\x8d\x5f\x8f\xd4\xdc\xe5\x58\x74\x39\x16\x5d\x8e\x45\x97\x63\xb1\x71\x15\x5d\x8e\xc5\x73\xd0\x27\x43\x0f\xbc\xe6\x39\x03\x87\xe7\x2a\xcd\x72\x0b\xec\x6d\x98\xb2\x90\x22\x89\x30\x08\x53\x95\x08\x9a\x87\xf0\x44\x4a\x8e\xc5\xc4\x53\xf6\x13\x6a\x30\xd7\x2f\xbe\xa7\x5f\x69\xea\xf6\x09\xc6\xef\x24\x22\x15\xfb\x25\x72\xb0\xa5\x8d\x79\x85\x73\x55\x9c\x3c\xee\x24\xa5\xfc\x01\x8f\x08\x4f\x55\x4e\x4d\xf9\x22\xbf\x7f\x05\x08\xc9\x15\xf6\xe4\x76\x86\xb5\xa3\xe2\x94\x19\x29\xc3\x16\xb4\x8d\x8c\x5b\x0b\x5a\x9e\xb2\xff\x3a\xfa\xf1\xf3\x5f\xfa\xc7\x5f\x1f\x1d\xbd\x7b\xd1\xff\xc3\x4f\x9f\x1f\xfd\x38\xc0\x7f\xfc\xee\xf8\xeb\xe3\x5f\xc2\x1f\x9f\x1f\x1f\x1f\x1d\xbd\xfb\xee\xf5\xb7\xb7\xc3\xcb\x9f\xc4\xf1\x2f\xef\x64\x9e\xde\xd1\x5f\xbf\x1c\xbd\x83\xcb\x9f\xb6\x9c\xe4\xf8\xf8\xeb\xcf\xf6\x5e\x72\x63\x91\xb8\x3d\x81\xb8\x25\x71\xf8\xbd\x08\xc3\xde\x3b\xdc\xd2\x59\x7c\xeb\x67\x5b\x3c\x8d\x9e\x61\x6d\x3a\x8d\x81\x9a\xa2\x98\x57\xcc\x23\x0c\x53\xa9\xb0\x4e\x38\x74\xf2\x20\xaf\xc6\x85\x09\x5b\x53\x4a\x3d\x1d\xc0\x80\x4a\x6e\xa9\x47\x68\x11\x53\x55\x89\xd3\x56\x41\xf2\xf3\xbd\x57\x0b\x7b\x05\x9e\xe7\x7e\x0c\x63\x21\xc1\xfb\xc1\x3a\xda\xf0\xf8\xe8\x68\xc3\x73\xa4\x0d\x06\xa2\x5c\x0b\x3b\x3f\x57\xd2\xc2\xc3\x5e\x16\x96\x3a\x69\xb8\xa9\x4f\xc8\xe8\x9c\xf9\x2c\x4a\x7f\x8d\xa9\x8c\x02\x28\x17\xd2\x59\x8b\x10\x5c\x9d\x4b\x54\x30\x29\x4b\x06\x2c\x69\x7f\xa8\xf7\x60\x4c\xe4\xe2\x4b\x82\x3e\x47\x6a\xe6\x3f\x73\x31\xe3\x89\xd3\x76\xcb\x27\x86\xa8\xc1\x54\x1f\xda\xf6\xcc\x5b\x6e\xee\xca\x03\x0f\x7d\x27\x43\x17\x6b\x3e\x09\x9f\x84\x3f\xc1\x83\xfd\x14\xa5\x34\x14\x90\x86\x5a\xcc\x44\x02\x13\xb8\x34\x11\x4f\x90\xae\xb5\xc3\x2b\xce\xd6\xcc\x8e\x1b\xaf\x55\x62\xd8\xfd\x14\xb0\xbb\x32\x0f\x26\x00\xcc\x70\x99\x70\x21\x59\xea\xb6\x28\x0b\x0f\x1b\xb2\x25\x38\xf2\x9f\x71\xed\x36\xb8\xb0\x19\xa0\x8a\x3c\x52\x2a\xf1\xa1\xc3\xc9\xbc\x9c\xdf\xc7\xde\x4b\xf5\xb3\x84\xfb\x9f\xdd\x6c\x86\x8d\x13\x3e\x29\x4c\x05\x06\xec\x92\xb5\xaf\x9c\x7a\xed\x07\x60\x5c\x6e\x0e\x8c\x27\xf7\x7c\x6e\x4a\xc3\x49\xb5\x0f\xf8\x29\x7b\x79\x8c\xe8\xcc\x0d\x2b\xe6\x88\xd9\x17\xc7\xe8\x4b\x3c\x3f\x1b\xfe\x7c\xf3\xb7\x9b\x9f\xcf\x2e\x5e\x5f\x5d\x37\xe3\x14\xee\xdb\x81\xcb\xbd\xe6\x88\x78\xc6\x47\x22\x11\x4d\x18\xc4\x52\xb4\x49\x75\x52\x64\xc1\x71\x7c\x12\x6b\x95\x11\x9c\x82\x8d\xaa\xe4\x94\x75\x2d\xb8\x9a\x99\x8c\xdb\x33\xae\x4f\x38\xd1\x5c\xda\xd2\x58\x53\x82\x5c\xe7\xd2\x29\xd6\x9f\x78\x60\x3e\x8f\xdb\x0b\xca\x3f\x8b\x63\x88\x6b\xd0\x7b\x76\x41\x80\xe7\xe1\xe3\xe6\x65\x8e\x36\x1b\xbe\xb9\xb9\xfa\x3f\x0b\x68\x38\xcf\x9a\xc5\x3c\xb5\x93\x17\xa6\x55\xd6\xda\xee\xbe\xf5\x79\x47\xdd\xfe\x3e\x89\xfd\x2d\x78\x55\x3b\x9e\xf6\xb7\xb9\xac\x97\xf1\x28\xe7\x67\xa9\x8a\x61\xc0\x86\x85\x95\xbe\x7e\xb5\x92\xde\xcb\x35\x30\x77\x8b\xb4\x82\x27\xc9\xbc\x2a\x20\x59\x45\xc9\x34\xb5\xcc\xe4\x2a\x1d\x1e\xf3\xc4\x34\x24\xa6\x4d\x38\x93\x63\xc2\xaf\x9d\x32\xd9\x0a\x34\x8b\xd9\x58\x0c\x52\x59\x2f\x95\xba\x55\x62\xb2\xb6\x56\x11\x23\xcd\xb5\x12\x16\x55\xe3\x2e\x86\x0c\xfd\x81\x31\x09\x13\x60\x35\x2c\x66\x26\x2b\x6f\x6e\x60\x51\xba\xf5\x8c\xa9\xd4\x65\xdd\xec\x1a\x78\x8c\x39\x69\x19\xb7\x53\x8a\x6a\x48\xb9\xb9\x83\x98\x7e\xf0\x72\x4d\x61\xe6\x77\x33\x16\xaf\xba\x75\xeb\x0e\x36\x7d\x94\x67\x28\xd6\x02\x7d\x01\xfb\x15\xdd\x60\x6d\x1c\x01\xf7\x4d\x6f\x64\x32\x7f\xab\x94\xfd\xa6\xc8\xc5\x6a\x65\x03\xff\xea\x25\xc5\xba\x19\x16\x45\x29\x0c\x42\x88\xfb\x08\x4c\x44\xe9\x6a\x1a\xd8\x45\xb9\x61\x1f\x19\xa1\x75\x2e\xcf\xcc\xb7\x5a\xe5\x7b\x73\x80\x25\x41\xeb\xdb\xab\x0b\x3c\xc7\xb9\xf7\xb2\x49\xab\xe7\x98\x75\xba\x5c\x30\xa8\x90\x69\xbf\xf7\x7e\xc2\x2a\x46\x96\x2e\x1d\xf6\x9a\xcf\x19\x4f\x8c\x0a\xc2\xb1\x90\x2b\x15\x28\xaf\x9d\xb9\xcb\x23\x65\xa7\x4b\x6a\x99\x43\xe7\xe5\xe7\x7a\x15\xa7\x5b\x59\xc1\x48\xc8\xa5\xc7\x2d\xbf\x03\xc3\x32\x0d\x11\xc4\x20\xa3\x86\xbb\xf6\xb1\x5d\x4d\xb8\xf3\xd7\x4a\xba\x63\xd1\xca\xde\x5f\x15\x3e\x46\x34\x84\xd5\x77\x1a\xbd\x95\x5e\xef\xe0\xe8\xb3\xc4\x43\x91\x1b\xd0\xe4\x60\xd5\x39\xd0\x46\x7c\x97\x8f\x20\x01\x4b\xca\x10\xd6\x9d\xe0\x96\x14\x69\x91\xf2\x09\x30\x6e\x0b\x44\xb1\x8a\x81\x34\x8e\xdc\x90\xe9\xcd\xb2\x58\x41\x99\x40\xc9\x0d\xfb\xfe\xea\x82\xbd\x60\x47\xee\x5d\xc7\xb8\xfd\x63\x2e\x12\x74\x67\x5a\xae\x17\xd7\x28\xc6\x61\x0a\x5c\x12\xe2\x1e\x53\x9a\x8e\x68\x8f\x49\xc5\x4c\x1e\x4d\xc3\x9a\x9c\xc6\x15\x14\x36\x1f\xcf\x87\x46\xfd\x67\x88\xaa\x8d\x09\xcc\xf7\x06\x74\x6b\xf4\xe5\xfb\x3d\xe8\x4b\x55\x84\x70\x38\x57\x87\x1e\x21\x56\x0a\x96\xc7\xdc\x72\x4f\x77\xca\xac\xeb\xe7\xb8\xa5\x1f\x9b\xfa\x18\x78\x25\x64\xfe\x40\x11\x2b\xed\x29\xf9\x37\x97\x38\x2d\x8b\x02\xd0\x70\xd3\x78\x96\x25\x82\xf2\x9d\x17\x22\xa8\xae\x6a\x5b\xdd\x5b\x23\x22\xe1\x31\xe7\x49\xa2\x1c\x79\x73\x9c\x9d\xcb\x58\xa5\x4b\x2f\x73\x02\x14\xd4\x0a\xdd\x0d\xd8\xb3\x44\x9e\x8f\x6e\x8e\x48\x60\x06\x0d\x6a\xba\x2c\xd6\xe5\x73\xb3\x39\x59\x2c\x6c\x28\x4e\xcf\x12\x3e\x82\x84\x38\x0b\x21\x90\x59\x46\xa0\x8f\x1d\x85\xa8\x55\xd2\x5e\x0e\xc6\x5b\x95\x00\x85\xf5\x04\x40\xb8\xe9\x3f\x09\x38\xe0\x24\x6d\xc1\x01\x15\x99\x1a\x1c\x50\x25\xfb\x14\xe0\x90\x37\x60\xb4\x6c\x11\x0e\x8e\x6b\xd7\xe1\x80\xac\xf3\xa9\xc3\xc1\x40\x14\xa9\x34\x1b\x6a\xe5\x54\xae\xd6\x58\x8b\x9f\xb6\xf4\x15\x91\x4e\xbe\x22\x08\x07\x49\x79\xfd\x66\xae\x2b\x01\x7d\xdc\x12\x8d\x0f\x51\x7d\xff\x5f\xb5\x43\xb2\x23\x3d\x8b\x7c\x28\xcc\x52\x73\x2b\xb9\x27\xfd\x85\x4f\xbc\x9c\x40\x03\x2b\x59\x2b\xcc\x44\x45\x3c\xc1\x92\x7b\xcd\x30\x86\x2d\x62\xcd\xe2\xc4\x95\x28\x4c\x74\x2d\xe1\x6f\xc1\xef\x8f\xd5\xd7\xf0\x17\x6f\xfb\x92\x2a\x86\x8a\x0b\x92\xc2\x47\x6f\x29\x5a\x0f\xef\x0b\x01\xa0\x8e\xab\x07\x6f\x60\x5c\x7b\xda\x2a\x5f\x01\xe6\x75\x51\xc8\xcf\x2d\x10\x64\x2c\xe4\x04\x2d\x3a\x3d\xa6\x21\xa1\xd0\x51\x7f\x86\xef\x48\xfd\x3a\x44\x8c\x0e\x93\x06\x74\x0e\xaf\x46\x49\x48\x28\xe9\x67\x46\x23\x47\x90\x6f\xc6\x44\x2d\x85\x61\x07\xaf\x02\x00\x1a\x54\x3e\x7b\x8a\x0c\xe2\x80\xbe\xb0\xd8\x4d\xb2\xb1\xdd\x09\x19\xfb\x28\xcb\x1a\xb0\x8a\x1a\xb5\x24\x85\x62\xfc\xae\x88\xab\xa4\xe1\x94\xfd\x28\x59\x01\x2c\xd6\xdf\x1b\x3d\xde\x92\xc0\x1a\xcc\x4b\xfd\xcd\x26\xbf\xe2\x25\x8b\xd3\x7c\x2f\x71\xef\xdd\x7b\xfb\x4e\xed\x5d\xbe\x2f\x7c\xcb\xc1\xc7\xdc\xd7\x7b\x21\x63\x75\x6f\xda\xd6\x21\xfe\x4a\xd3\x06\x81\x3a\x72\x68\x6d\x85\x9c\x98\xaa\x1e\xc1\x93\xa4\x66\x86\x5d\xa5\x48\x84\x1d\x2e\x2a\x12\x2f\x0b\xf0\x0b\xd1\xe1\x9d\x12\xb0\xc3\x98\xa4\x86\x9f\x6b\xf7\x29\x56\xf0\xe4\x26\xdb\xbf\x34\x1b\x5b\x44\x83\x6f\x5f\xdf\x9c\xd5\xa7\x76\xf4\xec\x1e\x2b\x5e\x3b\x60\xbb\xeb\x8c\xc7\xa9\x30\x06\xcd\x40\x30\x9a\x2a\x75\xc7\x8e\x42\xd8\xc6\x44\xd8\x69\x3e\x1a\x44\x2a\xad\x44\x70\xf4\x8d\x98\x98\x13\x8f\xb4\x7d\xb7\xfa\x63\x26\x64\x52\x44\xa3\xa0\x1a\x29\xad\x09\x66\x0c\x7c\x49\x54\xac\x02\xf7\xd6\xd7\xeb\xf4\x5e\xe6\xe5\x65\x52\x85\x4e\x01\xc9\xc7\x2f\x38\xb3\xbc\x3d\xd7\x0d\x6b\x67\x3c\xb2\x45\xf8\xed\x3e\x35\xa5\x9a\x46\xb5\x12\x8e\x24\xbd\x7d\x74\x20\x79\xe9\x20\x02\xd3\x5e\x55\x9e\xbf\x94\x73\xb2\x18\x28\x7b\x02\x30\xea\x84\xaf\x0d\x6e\x42\xab\xec\x21\x26\xe1\xf9\x47\x0f\xab\x12\x2d\x7a\x7d\x28\xcd\xc3\xe9\x03\x49\x36\xe5\x7d\x52\x92\x1d\x49\x42\x1a\x16\x64\x80\xa9\x92\xca\x07\xa7\x3b\x2e\xa8\x24\xa2\x34\x6a\x0b\xe4\x08\xc2\x3d\xf1\x34\xb6\xb2\xd4\xf3\xd2\x3f\x58\xf5\x21\x61\x12\x0f\x15\x01\x28\xd7\x70\x2f\xec\x34\x54\xb8\xaf\x39\x9c\x70\x25\x1a\x0c\x7a\x0f\x24\x03\xad\x95\xf6\x81\x30\xc1\x6a\x8b\x33\x21\x29\xc6\x48\x1a\x87\x24\xdc\xfd\x75\x68\xaa\x2e\xca\xb2\x04\x2e\xc6\x89\x39\x6c\x82\xf1\x18\x22\x94\x94\xaa\x00\x26\xb2\x7b\x54\x56\xee\xf3\xd1\xdd\x0e\xc1\x7c\x09\xdd\x54\x3c\xb8\xb7\x54\x9f\xaa\x3a\x43\x7d\xc5\xbc\xd5\x97\x8f\x07\x8c\x5d\xc9\x22\x72\xb2\xe7\x76\xb1\x7a\x67\x08\xf9\xb1\xee\x13\xab\xf5\x97\xf1\x03\xaa\x76\x27\x27\xde\xe9\xbc\x05\x8c\x6f\x62\x0c\x66\x55\x83\x70\xab\xe4\x00\x0d\xc3\x7e\x52\xb7\xf5\x81\x89\x37\x31\x14\xbb\x5b\xde\x97\xb1\xf8\xd3\xe0\xf4\xac\x29\x9d\xf3\x29\xf1\x2d\x15\xc5\xbd\xa9\xcc\x56\x11\xbf\x0b\x77\xd3\x50\xc5\x54\x12\xa3\x48\xe9\xc7\x5e\x16\x58\xa2\x43\xfc\x2b\x08\x58\xa5\x90\x26\x15\x45\x65\x57\x6b\x65\xf8\x9a\xa0\x31\x73\xb2\x72\x12\x74\xfb\x34\x4b\x00\xb3\xe7\x2a\x33\x97\x89\x81\x95\x2a\xba\xbd\x62\x21\x65\x21\x5e\x5f\xa1\xa3\xc7\xfe\x81\x87\xb2\x08\x00\x0c\xc5\x03\x86\xc5\xe3\xa4\xe2\x09\x13\x4a\x6a\x63\x66\x9b\x55\xc1\x74\xc0\x62\x31\x1e\x43\x08\x34\x74\xaa\x1f\xd7\x3c\x75\x24\xde\x30\x0f\x82\x11\x4c\x04\x45\xb2\x15\x84\xed\xd0\x94\x19\xf0\x3d\x22\x86\xc2\xb2\x54\x4c\xa6\x84\x28\x8c\x63\x66\x24\x0b\x2e\xb5\x44\xf1\x98\x21\x6e\x2b\xcd\xee\xb9\x4e\x1d\xdf\xe0\xd1\x14\xfd\x73\x5c\xb2\x38\xd7\x58\x26\xd2\x02\x8f\xe7\x7d\x63\xb9\x75\xa2\x2e\x68\xaf\x11\x86\xf5\x77\xa5\x84\x37\x8e\xae\x94\xf0\xfa\xd1\x95\x12\xee\x4a\x09\x77\xa5\x84\x37\x8f\xae\x94\xb0\x1f\x1f\x3f\xdb\x97\x75\xa5\x84\xf7\x1c\xcf\xab\x9c\x4d\x57\x4a\x78\xa7\xd1\x95\x12\x5e\x1e\x5d\x29\xe1\x35\xa3\x2b\x25\xbc\x66\x74\xa5\x84\xbb\x52\xc2\x5d\x29\xe1\xae\x28\xda\xa3\x73\x3d\xcd\xa2\x68\xac\x2b\x25\xec\x47\x57\x4a\xf8\x59\x94\x7e\x62\x5d\x29\xe1\xad\x46\x57\x4a\xb8\x2b\x25\xbc\xcf\xe8\x4a\x09\xe3\xe8\x6c\x2f\x5d\x29\xe1\x30\xba\x52\xc2\x34\x7e\x3d\x52\x73\x57\x4a\xb8\x2b\x25\xdc\x95\x12\xee\x4a\x09\x6f\x5c\x45\x57\x4a\xf8\x39\xe8\x93\xc6\xc6\x62\xaf\xca\x67\xdb\x14\xaa\xf0\x91\x21\x95\xd4\xd6\x51\x3e\x1e\x83\x46\xca\x85\x6f\x5e\x8a\x42\x28\x0a\x5a\x15\xb4\xcc\xc7\x19\x60\x59\x3c\x0d\x3c\xf6\x01\xef\x6b\x1e\xf7\xb9\xb4\x58\xa1\xac\x8c\xd4\xbc\x7c\xf3\x4d\x3b\x55\x31\x9a\xc5\x28\xe2\x9a\xdf\xc8\xa8\x79\xac\x5a\x09\xf0\x55\x09\x18\x1e\xee\x51\xa2\x8c\x8f\x30\x45\x60\x45\x53\x2e\x25\x04\xe5\x51\x58\x34\xca\x8c\x00\x24\x53\x19\x48\xa2\xdf\x9c\x19\x21\x27\x09\x30\x6e\x2d\x8f\xa6\x03\xf7\x26\x19\x80\x5d\x46\x83\xfa\x5f\x8c\xd5\xc0\xd3\x10\x17\x9b\x72\x41\x53\x31\x1e\x69\x65\x0c\x4b\xf3\xc4\x8a\xac\x98\x8c\x19\xc0\x80\x76\x62\x54\x05\x30\x30\xbc\xa4\x0c\x21\xed\x95\x6f\xf3\xcb\x52\xd5\xa2\x40\xa8\xba\xf6\xb0\x0e\x6a\x9a\xd9\x79\x11\x47\x07\x6c\x2c\xb4\xb1\x2c\x4a\x04\x72\x6b\x7c\x23\xe5\x0e\xe2\x7c\xbd\xc0\xab\xa5\x5f\xa9\xf1\x4b\x95\x31\x8a\xad\x99\x35\x14\x95\x56\x4e\xe8\xa7\x8a\x85\xf1\x62\xbe\xe9\x31\x1e\x4a\xde\x10\xa0\xc3\x4a\x11\xd4\x81\xb3\xd0\xec\xfe\xa7\xca\x74\x95\x3a\x79\x65\xd8\x5e\x89\xe8\x18\x62\x1c\x90\xb3\x57\x8b\xa6\x2e\x05\x0a\x0c\x77\x59\x3a\x06\xb8\x01\x12\x66\x0e\x07\x20\x02\xc7\x5f\xf9\x1a\xac\xff\xe0\x48\x5f\x61\x8a\xaf\xc1\x18\x3e\x81\xe1\x9e\x5e\x8b\x75\x1a\x19\x3a\x2e\xca\x8d\x41\x54\x48\x28\x3d\xad\xf8\xa5\x0c\x73\xaa\x8b\x41\x2c\xa5\x35\x15\xc2\xcf\xbd\x16\xd6\x02\x6e\x2a\x16\x47\x42\xc7\xe7\x62\x02\xea\xe1\x42\xb0\xd4\xeb\x30\x49\xf9\xb0\x23\xea\x32\xa6\xd0\xa5\x11\xb0\x91\x16\x30\x66\x63\x81\xf1\x50\x18\xa1\xd4\xa3\x72\x1f\x9c\x2c\x0a\xc6\x38\x7d\x57\xc9\x20\xcb\x86\x75\x0d\xd8\x5f\xfd\xc2\xac\xce\x65\xc4\x2b\x45\x00\x31\x45\x4b\x8c\xd9\x04\x23\x9c\xbc\xb4\xf8\xfb\x17\x7f\xf8\x8a\x8d\xe6\x8e\xa5\xa1\x64\x65\x95\xe5\x49\xf1\x91\x09\xc8\x89\x83\x15\x1d\xcf\x7a\x92\x51\x01\x01\xac\x62\x4e\x0b\x7f\xf9\xc5\xdd\xa8\xce\x63\x4f\x62\x98\x9d\x54\xe0\xd7\x4f\xd4\x64\x55\x5d\xf8\xfd\x43\x26\xf7\x54\x89\x56\xa0\x99\x4a\x44\x34\x6f\x8c\x68\xa1\xee\x0c\x9b\xaa\x7b\x92\xf5\x57\x60\x4f\x19\x03\x99\xa9\x2c\x4f\xc8\x82\xfd\x4d\x91\x9e\x97\x1b\x58\xce\xc1\x59\x79\x2e\xd0\xe6\xea\xa7\x58\xac\x17\x4b\x81\x6d\xe1\x95\xca\xc7\x76\x7b\xab\x60\x51\x7e\x06\x15\xa1\x6f\x78\x92\x8c\x78\x74\x77\xab\x5e\xa9\x89\x79\x23\x2f\xb5\x56\xba\xbe\x96\x84\x3b\x6a\x39\xcd\xe5\x1d\x55\xae\x2e\x52\x84\xd5\xc4\x89\x56\x59\x6e\x43\x20\xf1\xaa\x0f\xa6\x84\xd3\x40\x84\x83\x1a\x54\xce\x02\x0f\xa2\xd4\x75\x7c\xaa\x04\x61\x64\x75\x7e\x53\x45\xb6\x2f\x5e\xfc\xfe\x3f\x08\x75\x99\xd2\xec\x3f\x5e\x60\xf0\xa3\xe9\xd1\x21\x46\xda\xe6\x18\x45\xca\x93\xc4\xa9\x0d\x55\xa4\x74\x80\x5e\x85\x84\x1f\x1c\x07\x6d\x73\x74\xdb\x5a\x94\xba\xbd\xfd\x1b\xca\x51\xc2\x1a\x48\xc6\x3d\xca\x0a\x28\xd4\x9a\x43\x64\x0c\x87\x9e\xfa\x60\x6a\xc6\x13\x10\x80\x66\x2a\xc9\x53\xb8\x80\x99\x68\xa3\x79\x45\x6d\xb6\xa0\xea\x27\xc2\x60\x02\xc6\x28\x51\xd1\x1d\x8b\xfd\xc5\x4a\x18\xcb\x62\x09\xd5\xfd\xa1\xb0\x6f\x40\x4f\x83\x40\x9e\xb5\xdf\x5f\x0b\xe1\x49\x79\x96\x15\x31\xfa\x9a\xdf\xd7\x80\x81\x67\x12\xf3\x7d\x1b\xd6\x53\x68\x6c\x66\x6e\x6a\x64\xee\xfb\x2f\x72\x74\x73\xef\x29\xf6\x0e\x61\x69\x6e\xa3\x2e\x57\xbf\xbf\x61\xb2\x86\x10\xe5\x84\xe1\x34\x64\xf8\x6f\x0a\xcf\x5e\xca\x4a\x2a\x12\x5b\x0a\xc4\x20\x01\xc0\xa1\x0f\x92\xe4\xfd\x0d\xae\x2d\x58\x37\x9b\xc5\x2f\xd5\xe0\x22\x0b\xab\x72\xca\xad\x17\x08\x83\xf9\x9a\xb3\x0c\xb4\x11\xc6\xf1\xe5\x1f\xf0\x40\x9d\x27\x5c\xa4\x15\x13\xe0\xc7\x01\x02\x1d\x6e\xac\x7c\xd9\x9c\x52\x0e\x55\xec\x27\x44\x52\x48\x55\x3f\x57\x88\xb5\x75\xa9\xb6\x45\x86\xfa\xb1\x49\xe5\x0f\x25\x34\xeb\x94\xd2\xfd\x52\x90\x4a\xba\xeb\x39\x11\x48\xfc\xbe\x4f\x95\x3e\x16\x8b\x6f\x89\x0c\x20\x61\xf4\x9b\x5b\xa7\x84\x35\xe5\x91\x0e\x4a\x45\xa4\xf7\x7a\xe0\x80\x91\x4b\xdd\x9d\x09\xff\x28\x3b\x3c\x3d\xfc\xa8\x44\x92\x40\xa4\x55\xc6\x27\x8d\x7a\x18\x2c\x40\x6a\x71\xda\x6a\xa2\xb7\x53\x83\xf0\x7a\x51\x76\x08\xef\x82\xb8\x2c\x44\x81\x65\x46\xc8\x3b\x1a\x00\xec\x15\x04\xca\x87\xbc\xe7\x73\xc6\xb5\xca\x65\xec\xed\x4b\x85\x81\xef\xf5\xc2\x8b\xaf\x95\x84\x60\x38\x5f\xcc\x13\x47\x8b\xbe\x90\xec\xe5\xe0\xe5\x8b\xe7\xc2\xa9\xf0\x0b\x17\x38\xd5\x75\xc1\xa9\x88\x3e\x7d\xd4\x6f\x0d\xd5\x8e\x5b\xfa\xde\xd7\xde\xc4\x52\x16\x33\x16\xa1\x58\x2b\xfe\x74\xaf\x85\x85\x4a\x6f\xa3\x23\x54\x5c\x9c\x7e\x58\xc9\x8a\x3e\x6e\xb1\x86\x77\x3b\x69\xe8\x26\x1f\xbd\x47\xba\xe5\x09\x14\x1e\xb7\x55\x16\x2e\xb3\x81\x84\x55\x01\x75\x70\xc0\x8e\xe8\xce\x43\xca\x0c\x3c\xfe\xa8\xa8\xe5\x81\x76\xf9\x90\x35\xa8\x31\x57\x03\xdc\xe5\x43\xc6\xd1\x06\x97\xb5\x08\xc1\x3f\xc3\x94\xcf\x00\x33\x22\x45\xc2\x75\x82\x3e\xc7\x1b\x5a\x3b\x1b\xe5\x96\x81\x9c\x09\xad\x24\x06\xf8\xcc\xb8\x16\x58\x95\x42\x03\x66\x56\x3b\x5d\xf4\xb3\xa3\x1f\xce\xde\x62\x40\xc3\xb1\x4f\x09\xf7\xab\xcc\x4d\x28\x1f\x51\x5d\x49\x65\xba\x47\xb7\x2f\xac\xc3\xc1\x10\x69\x6e\x58\x97\x7b\x4f\x9a\xdb\x9c\x0a\xe2\x3f\x44\x49\x6e\xc4\xec\x63\x51\x12\x9f\xaa\x7a\x21\xf6\xda\xe7\x85\xb4\xd9\x12\x50\x4b\x19\xb0\x68\x5a\x47\xd6\xf2\x48\x05\xd6\x43\x53\xd4\xac\xaa\xfa\xc0\xbd\xe9\xc9\xe7\xb2\x53\x2c\x5e\x28\x59\xb6\x24\x42\x60\xdd\x86\x8f\x6b\x84\x8a\xa5\x39\xc7\x15\xee\x06\xd6\x7a\x74\x73\x2d\x29\xf0\xe2\xfa\xa6\x5a\x04\x80\xd4\x25\x15\x0f\xd8\xb0\xfc\xb1\xac\x14\x81\xf5\x8b\x0a\x25\x12\xf4\xa4\xac\x89\x3b\x01\x09\x1a\x85\x04\x37\x65\xad\x9d\x1c\x1b\x71\x43\x4e\x9e\x8b\xeb\x1b\xb2\xd9\xee\x06\xb3\xbd\xc5\xec\xfd\x25\x54\xc7\xf1\x29\x27\x62\x0f\xe1\xb6\xde\xad\xa6\x30\x58\x39\xc0\xa0\x52\x4a\x13\xb3\xab\x21\xe3\x71\xac\xd1\xed\xe3\x45\x9f\x4a\xa9\xb7\xc2\xb7\x80\x55\x19\xb8\x81\xea\x9a\x2a\xe0\x46\x12\x57\x02\x96\x5d\xe4\x59\x22\xc8\x8d\x50\x7d\xa0\xac\x26\x81\xed\x55\x76\x47\xda\x26\x6a\xde\xde\x4a\x5e\x03\x2a\xa4\xf6\xad\xea\xb6\x61\xf7\x34\x18\x95\xcc\xca\x82\x9a\x0b\xbb\xe6\x4f\x04\x9a\xc4\x8b\x5d\x0b\x45\xdc\xb6\xda\x31\x90\x56\xbb\xa3\xb9\xb8\x5b\xd8\xbd\x37\xc9\xf1\x34\x15\x13\x8a\x19\xa0\x7f\xdc\xd7\xaf\xf3\x65\x94\xca\x12\x9f\xe4\x1b\xa6\x2a\xab\xc0\x75\xa0\x68\xb8\xaa\x3d\x4f\x22\xfb\x58\x88\xb0\x68\xec\xb8\xb8\xbe\x21\x4a\x48\x1f\x5f\x74\xe5\x5b\xb5\x4b\x25\x55\xdb\x1b\x03\x3f\x5a\x95\x8f\x26\x9a\xc7\x42\x5b\x25\xdf\xa6\xb4\x51\x20\x4b\x03\xf1\xaf\x51\xe6\x5e\x83\xb7\x1b\xe0\x3a\x9a\xee\x03\xff\x0d\x84\x80\x26\x65\xb1\xa2\x48\x80\xb1\xd2\xa8\x12\xf7\x91\xbc\x27\x4a\xdd\xe5\xd9\x36\x14\xdd\x4f\x43\xbd\x72\xb6\x22\x10\xb5\x27\x7e\x55\x34\x3d\x96\x66\x1f\x7f\x6f\x5d\xf6\x01\x4b\x12\x0f\x4e\x54\x66\x63\xa8\x45\xbd\xe9\x3c\xc9\x8d\x05\xfd\x8d\xd0\xc6\x1e\x84\x82\xab\x88\xc1\x64\x13\x39\xac\xde\xf0\x57\x61\xa7\xbe\x74\xda\x61\xaf\x7e\xc9\xfd\xed\x27\x3e\x74\x3a\xed\xe1\xb5\x92\x70\x38\x58\x14\xbb\x0a\x52\x5e\x90\xb5\xb5\x3c\xc5\x2f\xdd\x40\x42\xf1\xa2\x78\xa1\x82\x2b\xb7\xbe\x6c\x9c\x7b\x43\xa0\x7f\x06\x2c\xe3\x58\xa2\x09\xef\x9e\x96\x65\xde\xa8\x00\x0b\xd5\xa9\x53\x5e\xd0\x9b\x57\x41\x54\xa9\xc9\x62\xd5\xfa\xcf\xde\x47\x9e\xdb\x19\x03\xa8\xfc\xdf\x0d\xe8\x99\x88\xe0\x95\x90\x77\x3b\xa2\x5f\x3d\xba\xe4\x72\x69\xb6\x5a\x41\x5e\xf2\xd1\x0a\x49\xc1\x77\x8e\xc5\xf0\x91\xca\x2d\xca\x6e\xe8\x70\x2c\x15\x47\x21\xff\x41\x7b\x81\xf6\xf6\x8c\x2a\x66\xad\xd2\x11\x4d\x8f\x8c\x3e\x41\x09\x34\x73\x69\x39\xd6\xf6\xbb\x50\xd1\x1d\x68\x96\xb8\x65\x0c\x58\x19\xf8\x52\xab\x26\xa7\x73\xd8\x31\xea\x62\x5f\x4b\x07\x64\x53\x48\x41\xf3\xa4\x2c\xaa\xd8\x00\xd4\xaf\x3c\xe1\x2c\x66\xad\xc6\xa4\x50\x75\x21\x5f\x06\xcd\x9d\xc3\xcb\x55\x77\xa5\x7c\x1e\x2a\x4d\x0a\x89\xe1\x06\x0f\xc2\xa0\x59\x3f\x53\x71\x35\x8b\x2d\x37\xa0\xfb\x45\x8e\xa1\xcf\xe3\x31\x45\x20\x4e\x0c\xa3\x7c\x32\x11\x72\xe2\xa9\x33\xd2\xf4\xb2\xd6\x58\xa9\xe9\x60\xa4\x77\xa4\x81\x0a\x3e\xa2\xf4\x40\xf1\x65\xa2\x7a\x7f\xaa\x62\xba\x7d\x34\x27\x6d\x30\xec\x6c\x19\x20\x7d\x25\x99\xd2\xbe\xce\x02\x8f\x63\x5c\xfb\xf2\x17\xfa\x96\xde\xd5\xaf\xea\x15\x71\x1c\x14\xd9\x5d\x3c\x55\x01\x8b\xc9\x47\xa1\x47\xf7\x63\x35\x36\x85\xa1\x02\x5f\x95\xf2\x9a\x41\x35\x58\xac\xad\x79\xb9\xbc\xfb\x21\x3e\x7a\x9f\x73\xbe\x3b\x7b\xd9\x8b\xb5\xd4\xb9\xb5\x5c\xf1\x15\x14\x26\xbe\xe0\x1d\xf5\x98\xc5\xb1\xa7\xa8\x85\x34\x53\x9a\x6b\x41\xe4\x6e\x11\xcf\x1c\xbf\x58\x81\x60\x33\xea\xd5\xb8\x02\xc7\x56\xe2\x32\x52\x5b\xa9\x8a\x16\xf2\x8e\x2f\x98\x68\x0a\x71\x8e\x51\xea\x93\x9c\x63\x2b\x58\x47\x2d\xbc\x51\x7d\xee\xc3\xff\x08\xe9\x8a\xc0\xc2\x22\x1d\x61\x8e\xc1\x38\x58\x6d\xcf\xfd\x82\xd8\x4a\x21\x88\xd4\x4a\x13\xfb\xf2\x55\xa3\x11\xd7\x20\x61\xc4\xb1\xcd\x1f\x0f\x87\x0a\x1e\x22\x70\x64\xcd\x9a\x72\xb1\x3e\x3e\x05\x6b\x89\x06\x4c\xf7\x30\x84\x99\x88\xf0\x0d\x6b\x8f\xb0\xff\x02\x02\xf6\x68\x5e\xb6\x36\x5e\x73\x78\x6e\xdd\xb7\x15\xc9\x42\xf8\x54\x48\x11\xd8\xea\x50\x2c\x42\xb0\xae\x08\x85\xf7\x30\x25\x23\x3f\x7d\x25\x9f\x40\xd2\x11\x2a\x32\x03\x7c\x17\xc2\x10\x5d\xb2\xe1\x90\x50\xdd\xd9\x1d\xd1\xb7\x81\x9e\xb1\xbf\x13\x71\x2f\xe7\x5f\x13\x95\x86\xeb\x49\x73\xf5\xef\xf0\x4c\x4f\xf2\x94\xca\x02\xab\x85\xca\xac\xbe\x9f\x25\xb1\x53\xb4\xd8\x39\x66\x7c\xfe\xfa\xa2\x9a\x9c\x51\x8d\x3a\x0f\xa9\x2d\x4e\xc8\x6b\x68\xc9\x5d\x34\xe5\xba\x83\x56\xda\x87\x4b\xae\xe1\xf5\x53\x6f\xab\x2c\xde\x16\xd0\x52\xc8\xcc\xc9\x19\x28\x1d\x95\xd6\x4a\x19\x4d\xb9\x9c\xa0\x81\x5f\xe5\x6e\xbe\xcf\x3e\xc3\x15\x69\x88\xf3\xc8\x97\x94\x0f\x91\xdd\x9f\x05\xbb\xa6\xaf\x74\x84\x7d\xa5\x4c\xc4\xb3\xb0\xe6\xea\x67\x91\x10\x72\xca\xc4\x00\x06\xec\xe0\xb3\xca\xa5\x03\x7a\x7b\xa6\x95\x7b\x85\x0f\x0a\xc7\x55\x25\xc2\xe2\xf1\x3e\xa8\xde\x3d\x60\x97\xee\x1d\xe8\xeb\x29\x00\x58\x89\x5b\x1e\x95\xe0\xeb\x31\x0d\x13\xae\xe3\x04\x73\x09\xc7\x85\xb8\x45\x19\x47\x1e\x60\x48\x7a\x31\x52\x50\x2a\xbb\xca\xee\xba\x53\xbf\x7b\x12\xd2\xfa\x31\xb7\xbc\x8f\x65\xf8\x89\x88\x9d\x90\xe1\xa0\xef\x0b\x21\xf6\xb9\x47\xad\x4a\x47\xfc\xdf\xfa\x9c\xb1\x3e\x2f\xee\x12\xb2\xcf\xfb\x58\x92\x70\xff\x28\xd8\x8f\x10\x30\xd1\x48\x87\x6f\x50\x0f\x73\x51\xf0\x2e\xca\x28\x23\x0c\x06\xec\x5a\xd9\xb2\x6c\x6e\x11\x9b\xe1\x4b\x3e\xae\x3a\xcf\x97\xd7\xb7\x6f\xff\x36\x7c\x73\x75\x7d\xdb\x1d\xeb\xee\x58\x77\xc7\xba\xc1\xb1\x06\x39\x6b\x7c\xa4\x0b\x05\x6f\x95\xce\xbb\x50\x8a\xaf\x92\x32\xfe\x8c\xa2\xcf\x2e\xe5\xec\x07\xae\xcb\x5e\xee\x28\x3f\xae\x74\x13\x87\x66\xef\x48\xe2\xce\x3f\xf9\xf0\xb3\x8f\x18\x3c\xd6\x62\x50\xce\x75\xa5\xd2\xc1\xaa\x5d\xab\x36\xc0\x3a\xff\xf9\xea\xe2\xf2\xfa\xf6\xea\x9b\xab\xcb\xb7\x1f\x35\x9a\xa2\x61\x29\xbc\x3a\x53\xde\x93\x4b\x66\x1a\x66\x42\xe5\x26\x99\x17\x8d\xa6\x56\x13\x81\xe5\x80\x3c\x19\x33\x2e\xe7\xc1\x9e\xb6\xfa\xb1\x8e\xd9\xb6\xcb\x6c\xeb\xc1\x25\x0d\x0a\x97\xb4\x85\xbe\xdf\x68\xb5\x77\x23\xfd\x45\xdb\x3e\xd9\x27\x82\x4d\x7f\x15\x3e\x1d\xfa\x1a\x07\x35\xd6\xe3\x85\xc7\xb2\xa0\x82\x13\x46\xd3\xcc\x36\x28\x13\xde\x4a\xf1\xd3\x76\xea\x84\x52\x20\xc6\x6b\x9e\x7d\x07\xf3\xb7\xd0\xb0\x3e\xca\x82\x2f\x25\x81\xc8\x31\x3a\x76\x07\x73\x72\xb1\x9e\x87\x97\x35\xa9\xe3\xf2\x24\x6b\xc7\xde\x41\x93\xba\xbe\x6d\x16\x7d\xbd\x83\x06\x91\x99\x61\x2c\x95\x3f\x75\x5b\x88\x72\x9a\xdb\xd3\x66\xbb\xc7\xda\x2d\xf8\xfa\x1e\x8a\xdc\x1e\x56\xd9\xbd\xa7\xb3\x76\xe7\xf2\x11\x6a\xe6\x38\x17\xdc\x9f\xf8\xa8\xb4\xbe\x53\x5c\xfb\x84\xb5\xe6\x04\x43\x6f\x4e\x7e\x8b\xff\xf1\x45\xc1\xce\xe2\xd8\x47\x47\xe7\x06\xc6\x79\x42\xb6\x7a\x33\x60\x3c\x13\x3f\x80\x36\x68\x52\xbd\x13\x32\xee\xb1\x5c\xc4\x5f\x37\xa9\x2a\x45\xa3\xc5\x5d\x50\xc1\x23\xd5\xee\x4e\xdc\x78\x87\x63\x95\x77\x15\x44\x84\x51\xea\x23\xe2\x66\xb0\x01\x7b\x21\xa3\x25\xd0\x34\xed\x44\xc5\x68\x0b\xdb\xa5\xab\x87\x25\x61\x25\x67\x4e\x51\x81\x2b\x3e\x0d\x85\xe6\x4c\xd1\x3e\x6a\xe0\x30\xac\x57\xff\xd3\x64\x3c\x82\x1e\xfb\x7b\xf1\x23\x36\x5c\x36\xef\x0e\x0f\xff\xf8\xdd\xe5\xdf\xfe\x74\x78\xf8\xd3\xdf\xab\x57\x91\x15\xa2\xd6\xbc\x70\x0b\xda\xe0\xa5\x8a\xe1\x1a\xdf\x81\x7f\x7a\x71\xed\x2c\x8a\x54\x2e\xad\xbf\x80\x69\xcb\x83\xa9\x32\xf6\x6a\x58\xfc\x99\xa9\x78\xf1\x2f\xd3\xa8\x54\xda\x93\x64\x0c\xb8\x45\x0d\xd2\x6f\x68\xb4\xc7\x1e\x4a\x5a\xd2\xf2\x51\xf5\xb3\x06\x6c\xc4\x92\xbb\xe4\x89\xf9\x26\x80\x00\x5b\x5c\x86\xfa\x08\x12\x93\xca\x9d\x64\x5a\xaf\x9b\x77\x30\x7b\xd9\xa8\x99\x2f\x8d\x16\x49\x5b\xb1\x83\x2d\x03\x0c\x21\x12\x5a\x29\xe1\x41\x2e\x18\x6c\xd0\x52\x4a\x77\xf3\xd9\xf0\x8a\xcd\x08\xc2\x4f\x06\x38\xc1\x89\xf6\xcd\x7b\xa5\x71\xa5\x17\x74\x21\x79\xf5\x94\xfc\xd5\xe1\xba\x2f\x24\x60\x8a\xda\x5e\xe0\x14\x9b\x23\xfa\x71\x10\x65\x79\xcf\xdf\x30\x48\x21\x55\x7a\x5e\xfc\x59\xb8\x08\xfb\xc6\x2a\xcd\x27\x98\x78\x42\x8f\xd3\x63\xc5\x5f\xf4\x60\xed\x05\xcb\x4f\x93\x2a\x1c\xe5\xda\x09\x0d\xc9\xbc\x2c\xfd\xf9\xfc\x68\x5b\x00\xfd\x13\x21\x6d\x05\x66\x34\xed\xfb\x48\xa3\x8e\x90\x65\x90\x00\x0a\x9c\x05\x14\x51\x9f\xf4\x89\xb5\xbd\x42\x0c\x22\x6b\x80\x9c\x39\xcd\x72\xef\xd2\x60\xe5\x68\x91\x9a\xc5\x62\x26\x8c\x6a\x90\x5e\x53\x4c\xb4\x3e\x67\xc0\xd7\xf6\xa0\xc8\xa8\xc2\x6c\xf6\x90\x61\x35\xa4\xe2\xbc\x2e\x90\xfd\x97\x4d\x3a\x7d\xd3\xc8\xb8\xb5\xa0\xe5\x29\xfb\xaf\xa3\x1f\x3f\xff\xa5\x7f\xfc\xf5\xd1\xd1\xbb\x17\xfd\x3f\xfc\xf4\xf9\xd1\x8f\x03\xfc\xc7\xef\x8e\xbf\x3e\xfe\x25\xfc\xf1\xf9\xf1\xf1\xd1\xd1\xbb\xef\x5e\x7f\x7b\x3b\xbc\xfc\x49\x1c\xff\xf2\x4e\xe6\xe9\x1d\xfd\xf5\xcb\xd1\x3b\xb8\xfc\x69\xcb\x49\x8e\x8f\xbf\xfe\xac\xf1\xd2\x5b\x28\x4e\x4a\xa3\xcd\x12\xa5\xf5\x19\x5b\x41\xbf\xf7\x58\xe4\x9f\x46\x40\xaf\xb6\xcf\x7f\x08\x8f\x3e\x2d\x19\x52\xc1\xae\x9f\xcc\x01\x37\x10\x69\xb0\x1f\xc2\x92\x43\x6f\xaa\x04\xca\x1c\x1a\x56\xa8\x16\xcf\x8d\xcf\xfd\x1a\x8c\x3b\x41\x6c\xa7\x7d\x2d\x25\xd1\xb1\x56\x69\x48\x7b\x47\xf7\x06\xb6\xb9\x0e\xf7\xdd\x41\xa3\x66\x89\x34\x3a\x63\x50\x67\x0c\x5a\x33\x1e\x35\x06\xdd\x10\x1e\x3e\x59\x4b\x10\xc8\xd9\xbe\x2e\x8c\x95\x1e\xf4\xa0\xeb\x54\x6b\xc4\x6d\xe7\x50\x1b\x84\xa3\x6e\x0a\x4f\x5c\x19\x49\x43\x0c\x2d\x5d\xed\xc3\xc4\x2e\xf6\x42\xd2\xc1\xc7\x09\xca\xbc\x12\xdf\xd5\x80\x4a\x18\xc2\xcc\x2d\xa1\xa8\x81\x5d\xab\x76\x89\xd1\xa5\x18\xf3\xfa\x57\x0a\x41\xbd\xa3\xa8\x54\xa7\xa4\x09\x59\xd6\x09\x2d\x84\xc3\xb2\xb8\x34\x37\x46\x45\x14\x4d\x5b\x64\x39\x60\xe9\x3a\xbf\x6c\x5c\x0d\xf6\x99\xae\xf4\x23\xa7\xc2\xd3\xe5\xb7\x8e\xe6\x58\x0f\x53\xce\x42\xf1\xed\x38\xe4\xcc\xe0\x4a\x56\xcf\xf1\xbc\x02\x10\x1c\x22\x7a\x27\x58\x25\x0e\x01\xa9\x7e\xa1\x61\x73\x0c\xc5\x50\xe3\xd2\xca\xba\x5f\x9b\xbf\xc6\x5c\xbc\x39\xcf\x2c\x3c\x5b\x8d\x84\xa1\x25\x66\x59\x9a\x9f\xeb\x4c\xf2\x39\x38\x03\x9b\xb3\xcf\x5f\x1d\xeb\x6c\x89\x6d\xb6\xc3\x32\x77\xf0\x9d\xb4\xc9\x26\xdb\x70\x96\x64\x1a\xc6\xe2\xa1\xa5\x73\x7a\x26\x4b\x4b\x8c\x88\x41\x5a\x31\x16\x94\x43\x93\x69\xc8\x40\x52\xf2\x02\x8f\xa6\x48\xfb\x3d\xa7\x2c\x9d\xd3\x4f\x31\x98\x87\x04\xee\x76\x49\xd9\xcd\x2a\x61\xbf\xa3\x63\xac\xa3\x63\x7b\x8f\x0f\x44\xc7\x3c\xe6\x3e\x1d\x22\x86\x91\xe7\xcd\x43\xdf\x2f\x2a\x71\xec\x88\xc5\x3b\x63\x59\x99\xe7\x74\x82\xb3\xec\x65\x7d\x6e\x84\x0c\xf8\xda\x61\x9e\x24\x2d\x55\xdf\x3e\xbc\x42\x68\x64\x79\x92\xf8\xa4\xe3\x01\x7b\x23\xf1\x3c\x9e\x61\x97\x87\x1e\xbb\x86\x19\xe8\x1e\xbb\x1a\x5f\x2b\x3b\x24\xc1\xb6\x1e\xcb\x46\x37\x32\x31\x66\xa7\x4e\x65\x32\x96\x59\xaa\xb4\x5f\xa9\x0b\xa4\x74\x6d\x82\xb2\xe4\x58\x83\x18\xf4\xf5\xdb\xf2\xdb\x90\xd1\xd6\xff\x48\xdb\x54\xb4\x32\x69\x41\x37\x0d\x2d\xeb\x7c\x74\x1c\x46\x44\x7a\xd7\xc8\xaa\x9c\xde\x4f\xb0\xcc\x46\xa6\x8c\xbd\x71\x2a\x6c\x3b\x6d\x6e\x86\x61\x3a\xec\x1c\xc1\x93\x04\xe2\x5a\x9f\x23\xea\xcf\xc1\xeb\x2a\x34\x66\x1b\x17\xed\x22\x80\x4d\xb9\x8c\x13\xd0\x58\xf2\xdd\x2c\xd6\xb5\x12\x65\x8f\x83\xa2\x2b\x45\x48\x0b\xe5\x51\xa4\x74\xec\x9b\xd5\xfa\xe4\x4d\x5c\x4c\x71\xbc\x90\xd0\xa6\x5c\xf2\x09\x75\x29\x5c\x2a\x1c\x8c\xe5\xa4\x4d\xa5\xb5\xc5\x54\xa9\x3b\x16\xa9\x34\x4b\xf0\x00\x34\x38\x1f\x65\x67\x9d\x02\x45\xfb\xd8\x4d\xf1\xa4\xd2\x74\x07\x7f\xf8\x88\xdd\x11\xdb\x90\x53\xe0\x01\xa2\xd6\xba\xf2\x39\x8a\xe8\x76\x19\x7d\xe2\x4a\x16\xe2\xca\x58\xb9\xc3\xe8\xf6\xba\xac\x47\x50\x10\xbd\x01\xbb\x7c\x80\xa8\xd2\xd9\xd2\x3d\xe1\x5b\x5b\x5a\x85\xf6\x90\xe6\x1d\x8b\x1b\x9b\xf2\xdb\x32\x9f\x37\x48\x50\xab\x8e\x85\xea\x73\x38\x67\x28\xb6\xed\x5f\x81\x7d\x0b\x28\x41\x1a\x93\xd6\x42\xfd\xed\xda\x19\xa2\x13\xbb\x54\xb2\xae\x08\x50\x0e\x73\x61\xa2\xb6\x52\x96\x1d\x1d\x9e\x1c\x1e\x2f\xd9\xf5\x16\x2a\x36\xdf\x56\x9e\x14\x58\xa2\x30\xc3\x7a\x7f\x10\x1d\xc6\x3d\x26\x6c\xa0\xd1\x54\x29\x01\x57\xe5\x33\xe9\x7a\xcc\x28\x66\x35\x8f\x85\xd7\x9c\xf0\x57\x77\x93\xd5\xb9\x2f\x93\x70\x74\xf8\xcb\x61\x8f\x81\x8d\x8e\xd9\xbd\x92\x87\x16\x97\x8f\x35\x45\x72\x53\x99\x68\xae\x72\x6c\xdd\x47\x20\x28\x0a\x84\x38\x42\xc7\x54\x4e\x7d\x7e\xa6\xdc\x86\x0c\xbe\xcb\x07\x61\x43\x6f\x0b\x35\x66\x2f\xa8\xcd\x10\x70\x6f\x59\x4c\xc4\x0c\x4e\xa6\xc0\x13\x3b\xa5\xe0\x0b\xa9\x64\x9f\x3a\xc5\x39\x0a\xe4\xaf\x34\xf5\x43\x34\x33\xd3\x55\x47\x03\x93\xdd\xf2\x82\x1a\x4a\xe4\x8e\xf6\x7e\xbb\x7f\x2f\x5c\xb6\xd4\x26\xfa\xf6\x76\xf8\x6d\xad\x19\x2e\x12\x7f\x6b\xb3\x10\x12\x53\x29\xb6\xf1\x04\x68\x47\x3b\x4e\xc0\x46\x9d\x6c\x59\x8b\x24\xac\x69\x47\x5b\xb6\xdc\xf6\x7b\xb7\x56\xb6\xec\x6f\x2a\xc7\x16\x7c\x7c\x94\xcc\xd9\x3d\x97\x36\xa4\xef\x1d\xb8\xa9\x0e\x1c\x79\x72\xd8\xf0\x17\xe0\x31\x68\x83\xd4\x03\xf8\xde\x45\xc5\xc2\x68\xcd\x39\x55\x59\x5b\xbb\x7c\x20\x37\x56\xa5\x6c\xea\x3f\xbb\x9e\xd2\xe8\x4f\xc6\x00\x4f\x4f\xc8\x17\xd2\x90\x11\x85\xf3\xcf\x3c\x3b\xfa\xb5\x44\x37\x08\xee\xb5\xe2\xfb\x51\x15\x6c\xd5\x16\x2d\x42\x12\xb0\xa8\xb9\x62\x4b\xb4\xb4\x85\xa0\x02\xd6\x62\x60\x01\x6b\x96\x20\xb9\x38\x11\x3a\xcb\x9a\xc7\x50\xb5\x16\xab\xc0\x5a\xf3\xc7\xb3\x55\xc6\x4b\x8f\x33\x14\x39\xdb\x12\x10\x5b\xf5\x82\xb3\xe6\x29\x98\xd5\xb1\x19\x00\xed\x6c\x3e\x6b\x13\x02\x59\x0b\x21\xd3\xcb\x01\xd3\x4b\x2d\xc6\x91\x4c\x50\xa5\xaa\x27\xc3\x65\x9a\xf6\x5b\x67\xab\xf3\x8f\x35\x93\x45\x7b\x5c\xfb\x49\xf4\x5c\x67\xed\x85\x36\xb6\x1d\xd8\xd8\x6a\x58\xe3\x7b\x0d\x6a\xc4\x54\x8a\xc6\x54\xa4\x6e\x53\xc7\x29\x1d\x06\x38\xbd\xcd\x69\x9c\x5e\xf6\xf3\x46\xa1\xd0\xc2\xa3\x6e\x45\x75\x47\xed\x49\x9c\x31\x1b\x65\x37\x2a\xba\x6b\x51\xaf\x39\xbc\x3d\x1f\xd2\x94\x15\xd5\x86\xcb\x60\x0c\x11\x72\xa6\x92\x19\x55\xfa\xbb\x3d\x1f\xe2\xc9\x1b\xe0\xbf\xd0\x10\x85\x1a\xf5\xdc\x3d\x1b\x82\xfd\xbd\x0b\xc7\x69\xdf\x64\x41\xe3\x4c\x03\x4f\x84\xb1\x22\xc2\xe7\x0a\xdb\x16\xce\xd0\xc4\x77\xd3\x69\x4a\xab\x46\xeb\x9a\x52\xa5\xdb\xec\xae\x4a\x53\xd3\xe0\xbc\x27\xcc\x97\x3c\x3f\xd2\x45\x33\xb5\x8e\x2f\xb5\x34\xdf\xd3\xe5\x4b\x99\x86\x1b\xab\xb2\x96\x3c\x21\x34\xd9\x1a\x3f\xc8\x08\xc6\x4a\xc3\xa2\x23\xa4\xe2\xd8\x88\x73\xf0\x85\x38\xcf\x86\x57\x85\x09\x4a\xd5\x9c\x17\x14\x96\x18\xaa\x6f\x26\x62\x06\x12\x8c\x39\x41\x97\x47\x9e\x91\x8a\x19\xfa\xe6\xf6\xdc\xd7\x41\x9a\x51\xfd\xca\x22\xd4\xdf\x77\xed\xc5\x1f\xc1\x52\xe1\xc9\xc2\xff\xe2\x2d\xaa\x61\xf9\x8b\xae\x92\x48\x73\x33\xa5\x8e\xb6\xf0\x20\xac\xef\xca\xac\x81\x1b\x25\xc9\xd8\x5b\x69\xae\x2b\x0c\xcb\xb8\x31\x65\x19\x70\xff\x12\x7a\x68\x48\xa5\x83\xab\x0f\x4c\x34\x8f\x80\x65\xa0\x85\x8a\x19\xe6\xdc\xc6\xea\x5e\xb2\x11\x4c\x84\x34\x01\x7e\x6e\xa2\x00\x68\xc7\x6e\x00\x6d\xc3\xa1\xa2\xda\x80\xbd\xad\x15\x0a\xf1\x29\x3c\x91\x2a\x4f\xb4\x5f\xc5\xa2\x93\x09\xa3\x26\x11\xbc\xd4\x56\xa6\xd8\x98\x6a\xa7\x9d\x47\x16\xdd\x82\xb7\x89\x9a\x41\x85\x6b\x6b\xa1\x83\x05\x4f\x79\x34\x6d\xe6\xbe\xed\xdc\x53\x5b\x8e\xce\x3d\xb5\xdb\xe8\xdc\x53\x9d\x7b\x6a\xfd\x78\x72\xe6\xdd\xce\x3d\xd5\x29\x5d\x8b\xa3\x73\x4f\x75\xee\xa9\x35\xe3\xc9\xd1\xaf\xce\x3d\xb5\xc5\xe8\xdc\x53\x5b\x8e\xce\x3d\xd5\xb9\xa7\x3a\xf7\x54\xe7\x9e\xfa\x15\x99\x01\xc3\xe8\xdc\x53\x4b\x93\x74\xee\xa9\x0a\x30\x3a\x4d\x69\xc5\xe8\xdc\x53\x2b\x46\xe7\x9e\xaa\x8c\x8e\x2f\xed\xc1\x97\x82\x73\x67\xe8\xf4\xb2\xe6\x6d\x84\x51\xbb\xc3\x7a\x7e\xcf\x34\xad\xa9\x89\x8d\xff\x49\xdb\xf7\x9f\x88\x0f\xa5\x05\x9b\x7e\x67\xcf\x7f\x76\xf6\xfc\x76\x6c\x61\x2d\xd8\xc1\x1a\x93\x72\xef\x35\xbf\x9d\x6a\x30\x53\x95\xec\x8d\xe8\x35\x24\x7f\x2d\xa4\x48\xf3\xd4\xe1\x9c\x71\xf8\x2c\x66\x85\x7b\xde\x94\x2d\x99\xd1\x6b\x4f\x26\x39\x77\xa3\x88\x01\xab\x71\x72\x91\xb8\x6d\xc4\xfc\xc9\x29\x47\x99\xd8\xe4\x51\x04\x80\xbd\xbe\xaa\xea\xc2\x97\x83\xe2\x4d\x45\x6f\x87\x97\xcd\xe8\x4d\x33\x26\x4b\xf5\x32\x71\x96\x2f\xbf\xd8\x6b\x8e\x86\xee\x94\x0f\xef\x4a\x69\x81\x4c\x37\x57\x0c\x1a\x29\x05\x6d\x70\x89\xa6\xca\xc0\xa7\xe6\x32\x69\xcd\x75\xd8\x82\xab\xe4\x09\xb9\x49\x9e\x0c\x5b\x78\x2a\xae\x91\x27\x58\x0a\xb4\x05\x4b\x7e\x1b\xae\x90\xf6\xdc\x20\xef\xa1\x62\xe6\xfb\x71\x7f\xb4\xa8\x76\xb6\xe4\xf6\xf8\x10\x2e\x8f\x56\xbe\xba\xa9\xab\xe3\xc3\xb9\x39\xda\xf9\xdc\x86\x66\xa4\x67\xe1\xda\x68\xc1\x7c\xd4\xa6\xe9\xa8\x35\xb3\xd1\x7b\x73\x65\x34\x77\x63\x3c\x01\x17\x46\x63\x20\x0b\x29\xac\xe0\xc9\x05\x24\x7c\x7e\x03\x91\x92\xf1\xde\x1c\x66\xa1\x84\x5a\x71\x7e\x0c\x4d\xeb\x75\xb4\x7a\xa0\xef\x94\xfb\x4a\xb1\x10\x87\xd8\xe5\x60\xd2\xf3\x02\x05\x5a\xe3\x68\x95\xfb\xd4\x61\xba\x57\xfa\x2e\x51\x3c\x36\x27\x99\xa2\xff\x2b\xc3\x78\x2b\xf1\xbb\xf4\xae\x66\x01\xbc\x1f\x5b\x19\xa4\xa8\xe7\x36\x37\xf1\x2f\xea\x9e\xa9\xb1\x05\xc9\x8e\x84\x0c\xfb\x78\x5c\x51\x03\x4b\xcd\xbc\x40\x6b\x77\xf5\xe5\x8b\x70\xf3\xf3\x53\xb9\xd1\xb8\x60\xcc\xfb\xb7\x80\xf8\x17\x3d\x6e\x02\xf1\x37\x8e\xf3\xa4\x6e\x06\x21\xd3\x48\x9d\xde\xbc\x2c\x6b\x5d\xbe\xc4\x79\x8b\xd3\xc6\x65\xcc\x7c\x86\xc4\xf3\xdb\xb4\xc6\x0e\xda\xe7\xe0\x9c\xed\x6c\x2f\xac\x6d\xdb\xcb\x47\x72\xc2\x3e\x41\xa9\xf9\x13\x75\xbc\x76\x52\xf3\x0e\xa3\x92\x68\xf5\xad\xe6\x11\x0c\x5b\x17\x38\xc2\x71\x62\x71\xae\x7d\x7e\x5c\x21\x77\x14\x87\x47\x02\xc4\x74\x9a\x8a\xec\x33\x4c\xfb\x1a\xe7\x49\x32\x67\x79\xa6\x64\x3d\xc5\x8f\x9c\x56\x8b\x99\x61\x6e\xb6\x55\x6f\x29\xa5\xd4\x4c\x2b\xcf\x80\x75\x2e\xa5\xa3\xe7\x65\xf7\x1b\x94\x4a\x0d\xd1\xea\x6a\xfe\x99\x11\x13\xb7\x7c\xc7\x4c\x31\x35\x4d\xa4\x50\xf6\x47\x28\x27\x74\x4f\x8f\x95\x8e\xc4\x28\x99\xb3\x29\x4f\x8a\x56\x07\x9c\xdd\x89\x24\xf1\xd3\x0c\xd8\x0d\x58\x66\xa7\xc2\x77\xa9\x66\x89\x92\x13\x5c\x1c\x97\xa1\xc5\x16\x44\xee\xd9\x28\x01\x2e\xf3\x8c\xde\xe7\xd8\xfa\x5c\xe5\x3a\xbc\xcf\xd7\x8f\x2c\x66\x11\x86\x49\x91\xf4\x2a\x8d\x7c\x36\x6e\x6c\xd9\x2d\xdd\x40\x48\xde\xbb\x17\x06\x7a\xd5\x39\xd5\x0c\xb4\x16\xb1\x77\x1a\xd0\x6f\x99\x56\x33\x11\x53\x2b\x86\x00\x36\x6c\x19\x4a\xad\x1a\x8a\xf3\x2c\x95\xec\x4b\x98\x70\x94\x7a\xfc\x29\xa2\x3d\xa3\x79\xc8\x15\x27\x63\x6c\xde\xe0\xd4\x05\x95\xd5\x72\x46\x67\x82\xda\x4e\x56\x20\xc7\x8e\xa4\x62\x0a\xd9\x6b\x2e\x85\xa5\x56\xc6\xd3\xdc\xb2\x58\xdd\xcb\x63\x37\xb9\x30\x0e\x0e\x9c\x8d\xc0\x86\xb6\xaa\xa1\xcd\x9f\xd0\x60\x18\x48\x3e\x4a\xdc\x9e\x63\x4c\xc0\xed\x4a\x00\xb1\x31\x70\x9b\x6b\x60\x13\x6e\x61\xa5\xd0\x44\xdf\xbb\x19\xbc\xc2\x14\x2d\xc7\x73\x69\x60\xef\x66\xcb\x2d\x4b\x5a\x5f\xfd\x7e\x3f\x1a\x21\x52\x50\xb9\xfd\x20\xaa\x24\xb5\xe3\xaf\x48\xc6\x22\x05\xc3\x54\xbe\xa0\x63\xbf\xf4\x8f\xad\xde\xa1\x4e\x9f\x5c\x35\xf6\xb5\x12\xaf\x30\xa5\xf9\x6e\x80\xcb\xf1\x33\x95\x6e\xa7\xdc\x1d\xc5\x8b\xeb\x9b\x9f\x5f\x9d\xfd\xf9\xf2\x95\x3f\x9f\xb2\xca\xf4\x73\x29\xfe\x99\x03\xe3\xa9\x72\x72\x75\x52\x0d\xc3\xe9\xa1\x79\xa0\xf2\x03\x9e\xe4\x76\x03\x76\xf6\x64\xc8\xd8\x9a\xb9\x79\x58\x12\x36\x78\x7e\xff\x51\x49\x1f\xbb\x65\x4d\xd1\x72\xd3\x7d\x70\xb5\x65\x0d\x67\x12\xac\x3b\x79\x24\x51\x52\x0b\x23\x21\x27\x49\x55\x98\xdc\x8f\x5c\x35\xd5\x89\x9a\x6a\x44\xfd\xf2\x0b\x86\xfb\x2a\x46\xad\xb4\xce\x29\xd7\xd0\x52\xc3\x89\x92\x6a\x07\x35\x80\x3a\x82\x06\x35\x80\x44\x8f\xab\x21\xe3\x71\xac\x51\x4c\xc1\x53\x9f\x2e\x34\x9e\xc3\x87\xc9\x18\xdf\x63\x2f\xd8\x1f\xd9\x03\xfb\x23\xaa\x05\x5f\x35\x6d\xcf\xd1\x54\x60\x6f\x6e\x96\x20\x6d\xf4\x6a\xd8\x12\xc4\xff\x3a\xe5\x16\x67\x74\x50\xb5\x8a\x8d\x84\x17\x43\xe1\xc1\x82\x76\x62\x91\xdf\x89\x8f\xda\xd8\xc4\x2d\xf0\x03\xa2\x19\xd9\xdc\xaf\xc6\xd5\xca\xff\x76\x47\x44\x73\x8f\x3b\xfd\xfe\xda\x53\xa1\x7a\x1f\x81\x72\xb6\x94\xdb\x68\x5a\x27\x63\x4e\xc0\x30\x35\xe6\x14\x2b\x24\xe3\x14\xbf\x36\x15\x0d\x22\x08\x9e\x0e\x1a\x37\x73\x2a\xd7\xf6\x73\xd3\x4e\x2d\x28\xfe\xc8\xe7\xbd\x60\x50\xa9\x3f\x92\xa9\x78\xc0\x2e\x79\x34\xc5\x65\xc5\x15\x9e\xe1\x34\x10\x9c\x6c\xca\x67\x6e\xe3\xfd\xb3\xd4\x77\x03\xa5\x95\xc2\xd4\x8a\xb8\xe4\xce\x53\xc4\x25\x75\xbe\x1b\x83\xd6\x14\x72\x38\x9a\xa3\xe7\x53\x44\xd0\x78\xf3\x1a\x9d\xa4\x4c\x2b\xab\x22\xd5\xa0\xf7\xca\x62\xf4\x33\x4e\x87\x40\x20\xa3\x65\xb0\x15\x7f\x7f\x31\xec\xb1\xdb\xf3\x21\x36\xcd\xb8\x39\xbf\x1d\xd6\x25\xec\x83\xdb\xf3\x61\x83\x1e\xfe\xad\xd8\x3c\xbc\x99\xed\xd4\x2d\x73\xe7\x49\x34\xf0\x58\x74\x71\xe4\xdb\x8f\x2e\x8e\x7c\xfd\xe8\xe2\xc8\xbb\x38\xf2\x2e\x8e\x7c\xf3\xe8\xe2\xc8\xfd\xf8\xf8\xa6\x1e\xd6\xc5\x91\xef\x39\x9e\x97\x2f\xb3\x8b\x23\xdf\x69\x74\x71\xe4\xcb\xa3\x8b\x23\x5f\x33\xba\x38\xf2\x35\xa3\x8b\x23\xef\xe2\xc8\xbb\x38\xf2\x2e\x22\xe6\xd1\xb9\x9e\x66\x44\x0c\xeb\xe2\xc8\xfd\xe8\xe2\xc8\x9f\x85\xdf\x9f\x75\x71\xe4\x5b\x8d\x2e\x8e\xbc\x8b\x23\xdf\x67\x74\x71\xe4\x38\x3a\xdb\x4b\x17\x47\x1e\x46\x17\x47\x4e\xe3\xd7\x23\x35\x77\x71\xe4\x5d\x1c\x79\x17\x47\xde\xc5\x91\x6f\x5c\x45\x17\x47\xfe\x1c\xf4\xc9\xd0\x50\xab\x79\x10\xf4\xdb\x30\xd3\xf6\x61\x35\xec\x72\xc5\xaf\x68\x56\x31\x99\x9b\x44\x97\x53\x26\x1a\x78\x3c\xc7\x29\x23\x74\xcb\x94\x42\xd6\x27\x18\x9d\x93\x88\x54\xec\x17\x77\xce\x96\x0e\xcd\x2b\x9c\xab\xe2\xc2\x71\x60\x49\xf9\x03\x1e\x00\x9e\xaa\x9c\xfa\x77\x45\x2a\xcd\x72\x5b\x87\x29\x6e\xcf\x3e\xad\xb7\xc6\x62\xe2\x39\xea\x09\x75\x09\xeb\x17\xd3\xf6\x2b\x9d\xb9\x3e\xa2\x02\xc3\xe3\x10\x7e\x32\x6c\x41\x97\xc8\xb8\xb5\xa0\xe5\x29\xfb\xaf\xa3\x1f\x3f\xff\xa5\x7f\xfc\xf5\xd1\xd1\xbb\x17\xfd\x3f\xfc\xf4\xf9\xd1\x8f\x03\xfc\xc7\xef\x8e\xbf\x3e\xfe\x25\xfc\xf1\xf9\xf1\xf1\xd1\xd1\xbb\xef\x5e\x7f\x7b\x3b\xbc\xfc\x49\x1c\xff\xf2\x4e\xe6\xe9\x1d\xfd\xf5\xcb\xd1\x3b\xb8\xfc\x69\xcb\x49\x8e\x8f\xbf\xfe\x6c\xef\x25\x37\x16\x78\xdb\x13\x77\x5b\x12\x76\xdf\x8b\xa8\xeb\x7d\xbf\x2d\x9d\xc5\xb7\x7e\xb6\xc5\xd3\xe8\xd9\xd1\xa6\xd3\x18\x34\x6e\x14\xe2\x8a\x79\x84\x61\x2a\x15\xd6\x7a\x2a\xca\xab\x51\x5f\xc2\xd6\x54\x4e\x4f\x07\xb0\xdb\x21\xb7\xd4\x4e\xb0\x88\x98\xaa\x44\xec\xaa\x20\xd7\xf9\x36\x8d\x85\x35\x02\xcf\x73\x3f\x86\xb1\x90\xe0\xbd\x5c\x1d\x6d\x78\x7c\x74\xb4\xe1\x39\xd2\x06\x03\x51\xae\x85\x9d\x9f\x2b\x69\xe1\x61\x2f\xfb\xc9\x3a\x03\xd2\x4d\x7d\x6a\x46\x27\x8e\x28\x45\x78\x2d\x53\x19\x05\x4a\xae\x4d\xcd\x2b\x82\x6e\x75\x2e\x51\xa5\xa4\x1c\x0a\xb0\xa4\xef\xa1\xa6\x83\x51\x90\x8b\xaf\x0b\x1a\x1c\x4d\xfd\xcf\x5c\xcc\x78\xe2\xf4\xdb\xf2\x89\x21\xea\x2c\xd5\x87\xf6\x32\x62\x7d\x64\x19\x0b\xc5\x9b\xa1\x16\x33\x91\xc0\x04\x2e\x4d\xc4\x13\xa4\x4a\xed\x50\xfa\xb3\x35\xb3\xe3\x16\x69\x95\x18\x76\x3f\x05\x6c\xa3\xca\x83\x7a\x8e\x99\x0a\x13\x2e\x24\x4b\x1d\x51\xcd\xc2\xc3\x86\xf4\x7c\x47\xbc\x9d\xd4\x2b\x6d\xa9\xcf\xa3\xfa\x3a\x52\x2a\xf1\x61\xbd\xc9\xbc\x9c\xdf\xb7\xb5\x95\xea\x67\x09\xf7\x3f\xbb\xd9\x0c\x1b\x27\x7c\x52\xa8\xf1\x06\xec\x92\x25\xae\x9c\x7a\xed\x07\x60\xcc\x6c\x0e\x8c\x27\xf7\x7c\x6e\x4a\xa3\x46\xb5\xe1\xef\x29\x7b\x79\x8c\x88\xc7\x0d\x2b\xe6\x88\xd9\x17\xc7\xe8\xe7\x3b\x3f\x1b\xfe\x7c\xf3\xb7\x9b\x9f\xcf\x2e\x5e\x5f\x5d\x37\xa3\xf3\xee\xdb\x81\xcb\xbd\xe6\x88\x78\xc6\x47\x22\x11\x4d\xc8\xfb\x52\x24\x48\x75\x52\x64\xa0\x71\x7c\x12\x6b\x95\x11\x9c\x82\xfd\xa8\xaa\xe3\x5c\x2c\x98\x85\x3d\xcf\xa6\xed\x19\xd7\x27\x9c\x68\x2e\x6d\x69\x48\x29\x41\xae\x73\xe9\x94\xde\x4f\x3c\x68\x9e\xc7\xed\x05\xcc\x9f\xc5\x31\xc4\x35\xe8\x3d\xbb\x00\xbd\xf3\xf0\x71\xf3\x32\xd7\x96\x0d\xdf\xdc\x5c\xfd\x9f\x05\x34\x9c\x67\xcd\xe2\x91\xda\xc9\xef\xd1\xfb\x77\x20\x67\xcb\xc6\x84\x54\xcd\xba\xfd\x7d\x2a\xfb\x5b\xf0\xaa\x76\xbc\xe0\x6f\x73\x59\x65\x27\xb2\x32\x3f\x4b\x55\x0c\x03\x36\x2c\x2c\xe8\xf5\xab\xd5\x1a\x02\x1a\x98\xbb\x45\x5a\x81\xad\xce\x2b\xa2\x8c\x55\x94\xe8\x52\xcb\x30\xad\xd2\xe1\x31\x4f\x4c\x43\x62\xda\x84\x33\x39\x26\xfc\xda\xa9\x82\xad\x40\xb3\x98\x8d\xc5\x20\x95\xf5\x92\xa4\x5b\x25\x26\xdd\x6a\x15\x31\xd2\x3b\x2b\x21\x4b\x35\xee\xe2\x1b\xe0\x07\xc6\x24\x4c\x80\xd5\xb0\x98\x99\x2c\xb0\xb9\x01\xb3\x9a\x31\x95\x9a\xa8\x9b\x5d\x03\x8f\x31\x5f\x2c\xe3\x76\x4a\x11\x07\x29\x37\x77\x10\xd3\x0f\x5e\xae\x29\x4c\xf0\xd4\x0c\xdf\xbf\xea\xd6\xad\x3b\xd8\xdb\x51\x9e\xa1\x38\x08\xb4\xd3\xc3\xde\xd1\xe9\x8d\x8f\x80\xfb\xa6\x37\x32\x99\xbf\x55\xca\x7e\x53\xe4\x49\xb5\xb2\x81\x7f\xf5\x92\x22\xba\x59\xea\x21\x53\x18\x20\x10\xf7\x11\x98\x88\xd2\xd5\x14\xad\x8b\x72\xc3\x3e\x32\x42\xeb\x5c\x9e\x99\x6f\xb5\xca\xf7\xe6\x00\x4b\x82\xd6\xb7\x57\x17\x78\x8e\x73\xef\x01\x93\x56\xcf\x33\x25\xc8\x7c\xb2\x46\xa6\xfd\xde\xfb\xf0\xaa\x18\x59\xba\x5b\xd8\x6b\x3e\x67\x3c\x31\x2a\x08\xc7\x42\xae\x52\x75\x98\xd7\xa3\xdc\xe5\x91\xb2\xd3\x25\x05\xca\xa1\xf3\xf2\x73\xbd\x8a\x43\xac\xac\x9b\x22\xe4\xd2\xe3\x96\xdf\x81\x61\x99\x86\x08\x62\x90\x51\xc3\x5d\xfb\xd8\x6e\x20\xdc\xf9\x6b\x25\xdd\xb1\x68\x65\xef\xaf\x0a\xff\x1f\x9a\xb1\xea\x3b\x8d\x9e\x44\xaf\x77\x70\xf4\x27\xe2\xa1\xc8\x0d\x68\x72\x7e\xea\x1c\x68\x23\xbe\xcb\x47\x90\x80\x25\x65\x08\xeb\x07\x70\x4b\x2a\xaf\x48\xf9\x04\x18\xb7\x05\xa2\x58\xc5\x40\x1a\x47\x6e\xc8\x70\x66\x59\xac\xa0\x4c\x6e\xe4\x86\x7d\x7f\x75\xc1\x5e\xb0\x23\xf7\xae\x63\xdc\xfe\x31\x17\x09\xba\x1a\x2d\xd7\x8b\x6b\x14\xe3\x30\x05\x2e\x09\x71\x8f\x29\x4d\x47\xb4\xc7\xa4\x62\x26\x8f\xa6\x61\x4d\x4e\xe3\x0a\x0a\x9b\x8f\xb5\x43\x93\xfc\x33\x44\xd5\xc6\x04\xe6\x7b\x03\xba\x35\xfa\xf2\xfd\x1e\xf4\xa5\x2a\x42\x38\x9c\xab\x43\x8f\x10\x2b\x05\xcb\x63\x6e\xb9\xa7\x3b\x65\x46\xf4\x73\xdc\xd2\x8f\x4d\x7d\x0c\xbc\x12\x32\x7f\x20\xdb\x5a\x7b\x4a\xfe\xcd\x25\x4e\x8b\x28\x80\x40\xc3\x4d\xe3\x59\x96\x88\xd2\xf3\x58\x89\x6e\xba\xaa\x6d\x75\x6f\x8d\x88\x84\xc7\x3c\x38\x30\x1d\x67\xe7\x32\x56\xe9\xd2\xcb\xd0\x5b\xca\xa3\x69\xf5\x05\xcf\x12\x79\x3e\xba\x39\x22\x81\x19\x34\xa8\xcd\xb1\x80\x38\xaf\xdc\x6c\x4e\x16\x0b\x1b\x8a\xd3\xb3\x84\x8f\x20\x21\xce\x42\x08\x64\x96\x11\xe8\x63\x47\x08\xfe\x3f\xf6\xfe\x87\xbb\x71\xdb\xe8\x17\x80\xbf\x0a\x8e\xdb\x73\x6d\xb7\x92\xbc\x9b\xfe\x79\xd2\xbd\x7d\x9b\xe3\xd8\xde\xd4\x37\xbb\x5e\x3f\x6b\x27\x79\xfb\x26\x79\x5a\x88\x84\x24\xd4\x24\xc0\x10\xa0\xbc\xea\xcd\xfd\xee\xef\xc1\xcc\x00\x04\x29\x79\xb3\x26\xb9\x2b\xdb\x11\x7b\x4e\xb3\x96\x28\x10\x1c\x0c\x06\xf3\xf7\x37\xa5\xce\x86\xab\x8f\x78\xab\x33\x81\x29\x37\x9e\x10\x6e\xf8\x47\x41\x07\x18\x64\x28\x3a\x80\x21\xd3\xa0\x03\x98\x64\x8f\x81\x0e\x55\x8f\x83\x96\xb5\xe9\xe0\x4e\xed\x26\x1d\xe0\xe8\x7c\xe8\x74\x30\x22\x49\x74\x5e\x5c\x96\xda\x99\x5c\x83\x1d\x2d\x34\x6c\x1d\xdf\x41\x9b\x1c\x1c\xbe\xb1\xf5\x47\xd1\x9c\xe6\xcd\xbc\x8c\x92\xed\xb8\x45\x19\xef\x33\xee\xfe\x57\x74\xe4\x80\xe8\x69\x9f\x43\x7e\x94\x46\x00\xc8\xfd\x92\xbe\x78\xe4\xa5\xfe\x3d\xbc\x64\x83\x1c\x26\x3a\xe1\x19\x40\xa7\xf5\xe3\x18\xd6\xe6\x9a\xf6\xc0\x51\x86\x24\x84\x96\xe0\x33\x1f\xb5\x07\x14\x2d\xf8\x84\x7c\x5f\x4a\xa7\x22\x0a\x16\x62\x6a\xe7\x35\x66\xd2\xc1\x7d\x3e\x39\xd3\x9d\xea\x14\xbc\x17\x69\xe3\xd7\x56\x13\x3a\xcb\xeb\x00\xc8\xe6\x26\x28\x54\x2a\xd5\x1c\x3c\x3a\x23\x56\x8a\x0c\xd3\x3a\x69\x0f\xdf\xa0\xf9\xb5\x0f\x1c\xed\x07\xf5\xec\xec\x1f\x0d\x9a\x90\xd4\x8a\x46\x06\x27\x87\xd7\x6f\x66\x28\x2d\xa5\x61\x7b\xaf\x3c\x01\x7a\x20\x58\x3d\xc4\x03\x62\x0f\xdf\x30\xac\x26\xfa\xd8\x6e\xa4\x4a\x29\x03\xb2\x41\x2c\x6f\x24\x92\x16\x0a\xb9\xb5\x32\x8d\x45\xc3\x0b\xf6\x83\x62\x81\x58\x6c\xdc\x99\x3d\xde\xa2\xc2\xea\xdd\x4b\xe3\xf7\xbb\xfc\xc2\x43\xda\xc3\x7c\xa3\x60\xed\xdd\x73\xc7\xce\xec\x5d\xbf\xcf\xbf\xcb\xde\x36\xd7\xf5\x56\xaa\x54\xdf\x9a\xa1\x6d\x88\xef\x70\x58\xaf\x50\x27\x8e\xad\xad\x54\x73\x13\xdb\x11\x4d\x9c\xdc\xcd\x86\x84\x5f\xe1\x59\xa9\xb1\x0c\x6f\x5d\x81\x6f\x65\x6e\xef\x8c\x80\x7b\x5c\xf3\xdc\xf0\x93\xd2\xbd\x8a\x95\x3c\xbb\x2a\xba\xc3\xa6\xb1\x36\x1b\x7c\xf5\xfa\xea\xb8\x39\xb4\x93\x67\xb7\x0b\x51\xe2\xd9\xeb\xbe\x67\x3c\xcd\xa5\x31\xe0\x06\x12\xd3\x85\xd6\x37\xec\xc0\x27\x5a\xcd\xa5\x5d\x54\xd3\x49\xa2\xf3\x28\xe7\x6a\x6c\xe4\xdc\x1c\x11\xd3\x8e\xdd\xec\x0f\x99\x54\x59\xc8\x20\x01\x33\x52\x59\xe3\xdd\x18\xf0\x90\x24\xcc\x02\xd6\x96\x70\x17\x29\xca\xbc\x3e\x4d\x44\x5a\x94\x22\xdb\x3e\x18\xcc\xfa\xf2\x5c\xf4\xc4\xb5\xf8\x85\x25\x82\x77\xa7\xb2\x91\xb8\xc4\x69\x23\x1d\x51\x7b\xdb\x3a\x91\x48\x3b\x48\x84\x19\x0e\x31\xe7\xef\xf5\x98\x2c\x15\x58\xd9\x20\x20\xeb\x84\xdf\x99\x86\x04\x5e\xd9\x7d\x28\x90\xa3\x9f\xee\xc7\x1a\x2d\x44\x7d\xb0\x04\xc3\xd9\x03\x59\xb1\xe0\x63\x34\x92\x9d\x48\x02\x19\xe6\x75\x80\x85\x56\xba\x44\x16\x75\xa7\xa0\x56\xc0\xd2\x60\x2d\x60\x20\x08\xd6\x84\x64\x6c\x34\xd5\x93\x3a\x3e\x18\xc7\x90\xa0\xc0\x06\x0b\xf4\xeb\x39\xdc\x4a\xbb\x00\x10\xb9\x45\x2b\xe0\x04\x33\x29\x85\x81\xe8\x81\x62\xa2\x2c\x75\x49\x89\x30\xde\x6b\x0b\x23\x81\x28\x86\x4c\x1a\xc7\x24\xdc\xfd\xb5\x6f\xe2\x10\x65\x0d\x65\x0a\xb9\x5d\x8e\x9b\xc4\x6c\x26\x12\xd0\x94\x62\x02\xa3\xd8\x3d\xa8\x51\xf5\x7c\xea\xbc\xd5\x1e\x0a\x35\x97\xef\xdc\x53\xe2\x5f\xb5\x00\xd5\x95\x56\xe3\xcd\x5f\x1f\x4e\x18\x3b\x57\x21\xef\x71\xe4\x56\x31\xbe\xd3\xa7\xfc\x58\xf7\x8a\x31\x8e\x2e\xbc\x40\xec\x77\x72\xea\x5d\x59\x0d\xc0\xf1\x7d\x9c\xc1\x2c\x76\x08\x0f\x2a\x0e\xc0\x31\x4c\x83\xba\xa5\xf7\x87\x78\x1f\x47\xb1\xbb\xe5\x63\x39\x8b\x1f\xc7\x49\xcf\xfa\xca\x39\x2a\x57\xdf\x61\xbf\x7e\xd8\xb5\xc3\x7e\xbd\xfb\xda\x61\xbf\xee\xb0\x5f\x77\xd8\xaf\xef\xbf\x76\xd8\xaf\x74\x6d\xbf\x3c\x93\xed\xb0\x5f\x3b\x5e\x4f\x0b\x7f\x64\x87\xfd\x7a\xaf\x6b\x87\xfd\xba\x7e\xed\xb0\x5f\xef\xb8\x76\xd8\xaf\x77\x5c\x3b\xec\xd7\x1d\xf6\xeb\x0e\xfb\x75\x87\x62\xf5\x8b\x63\x3d\x4c\x14\x2b\xb6\xc3\x7e\xa5\x6b\x87\xfd\xfa\x24\xb0\x7a\xd8\x0e\xfb\xf5\x83\xae\x1d\xf6\xeb\x0e\xfb\xb5\xcb\xb5\xc3\x7e\x85\x6b\xe7\x7b\xd9\x61\xbf\xfa\x6b\x87\xfd\x8a\xd7\xaf\x47\x6b\xde\x61\xbf\xee\xb0\x5f\x77\xd8\xaf\x3b\xec\xd7\xf7\xce\x62\x87\xfd\xfa\x14\xec\x49\x63\x53\xd9\x09\x0e\xeb\x43\xd0\x0b\x28\x33\x24\xaa\x77\x9c\x56\xb3\x99\x28\x41\x72\xc1\x93\xd7\xb2\x10\x02\xca\x51\x90\x65\x94\x67\x00\xa8\x66\xa5\xe0\x29\x65\x41\xdf\xf1\x73\x2a\xb0\x04\xd8\xaa\x3a\x7d\xef\xec\xcd\xcb\x61\xa0\x12\xfa\x25\xae\xc1\x9c\xdf\xa8\xa4\x7f\x02\x53\x4d\xf0\x4d\x59\xf9\x44\xf7\x24\xd3\x86\xd2\x0e\x81\x58\xc9\x82\x2b\x25\xbc\xf1\x28\x2d\x38\x65\xa6\x42\x28\xa6\x0b\xa1\x50\x7e\x73\x66\xa4\x9a\x67\x82\x71\x6b\x79\xb2\x98\xb8\x27\x29\x4f\xec\x3a\x45\x90\x3e\x31\xb6\x14\x3c\xf7\xc9\x92\x39\x97\x38\x14\xe3\x49\xa9\x8d\x61\x79\x95\x59\x59\x84\xc1\x98\x11\x90\xe5\x8c\x07\x55\x20\x06\xa4\x97\xd4\x79\x85\xa3\xfa\x69\x34\x2d\x1d\x23\xc5\x80\xe9\x3a\x02\x68\xcb\xbc\xb0\x2b\xe6\x5e\x39\x23\xb8\xbb\xd2\x58\x96\x64\x12\x4e\x6b\x78\x22\x16\x94\xc1\x78\x23\x7f\x56\x2b\x9a\xa9\xa1\xa9\xaa\x14\xd4\xd6\xc2\x1a\x06\x69\x78\xf5\x80\x34\x54\x2a\x0d\xa9\xf9\x66\xc4\xb8\xc7\x41\x41\x42\xfb\x99\x02\xa9\xfd\xc9\x82\xa3\xd3\x47\xd1\x70\x11\x78\x9a\xe3\x4d\xf4\x86\xd5\x8c\x0e\x79\xa7\x9e\x39\x47\x8d\x14\xdb\x5a\xa1\x80\x74\x97\xb5\x6d\x00\x0b\xa0\xc4\xd2\xf1\x80\x48\x84\x3b\x5f\xf9\x1d\x5c\xff\xc9\x99\xde\xf2\x72\x2e\x6c\x48\xca\xed\x9a\xab\xd9\x04\x88\x88\x50\x0e\x63\x3b\xa4\xa6\x18\x10\xe7\x52\xa7\x90\x71\x4f\x28\x12\x8e\x67\x36\xc0\x28\xe2\x04\x09\x00\x67\xd3\x0d\x5e\x2f\xc2\x54\xa7\xf0\x50\x53\xf0\x44\x18\x76\x70\x7e\x79\x32\x62\x97\xe7\xa7\x94\xcf\xa4\x67\x9b\xca\xf8\x48\x84\x21\x03\xde\x05\xe8\x28\x8d\x7f\xc6\xed\x82\x5b\x58\xce\xe8\x41\xa0\x89\x2e\x78\x49\x89\x8a\x1e\xf9\x9a\x5d\x68\x2b\x36\x01\x65\x78\x69\x00\xea\x17\xf9\x20\x88\xd3\x50\x9d\xe9\x2e\x00\x3b\x9a\x2d\x91\x7e\xf4\x5a\x18\xc3\xe7\xe2\xb2\x63\x00\xeb\x2e\xe3\x1c\x62\x58\xf5\x1e\x05\xa9\x90\x61\xf9\x5a\xf8\xa4\xce\x78\x6b\x6a\xc4\x2c\xc7\x39\x85\xf5\xbe\x2d\xa5\xb5\x02\xf6\x37\x80\x27\x41\x0c\xbc\x5d\xa0\xba\xdf\xca\x9b\x7b\xed\x07\xa9\x7f\xec\xce\x77\x95\x62\x16\xdb\x54\xb0\x69\x29\xc5\x8c\xcd\x24\xa4\xc6\x41\xb2\xda\x08\xe1\x40\x38\x3a\x97\x8c\x11\x25\xcc\x87\xcc\x1a\x3f\xaf\x09\xfb\x8e\x26\x66\xcb\x4a\x21\x02\x3a\x69\xdc\x50\xc2\x25\x67\x6c\x0e\xc9\x6e\x64\x38\xfc\xf1\xd9\x5f\xfe\xcc\xa6\x2b\xa7\xdd\x00\x6b\x5b\x6d\x79\x16\x5e\x32\x13\x6a\xee\x68\x85\x92\xba\x59\x84\x14\x28\x00\x18\xe5\x38\xf1\xe7\x9f\xdd\x4c\x9b\xea\xd6\x51\x2a\x96\x47\x11\xfd\xc6\x99\x9e\x4f\xd8\x09\x57\x8e\xd7\x9d\x19\x51\xa4\xe0\xc9\xef\x8e\x1b\x3a\x1c\x9b\xe9\x4c\x26\xab\xfe\x62\x87\x6c\x13\xb6\xd0\xb7\x68\xf6\x6d\xe0\x9e\x3a\x1d\xb6\xd0\x45\x95\x61\x30\xe3\x65\x28\xdf\xab\x8c\x58\xaf\xd1\xd9\xb8\x2f\xc0\xfd\x4e\x43\xb4\xb6\x36\xe5\x38\xfa\x47\x6a\xca\xfd\x26\x07\x71\x80\xa7\x01\x9b\xf8\x25\xcf\xb2\x29\x4f\x6e\xae\xf5\x2b\x3d\x37\x6f\xd4\x59\x59\xea\xb2\x39\x97\x8c\xbb\x83\x73\x51\xa9\x1b\xc4\xa5\x0e\x25\xc4\x7a\xee\xb4\xec\xa2\xb2\x1e\x69\x74\xd3\x0b\x63\x41\xaa\x3f\x8f\xbd\x45\x5c\x8f\x22\xde\xc9\xda\xec\xa5\x52\x0a\xe4\xc8\x78\x7c\x13\x33\xdb\x67\xcf\xfe\xf8\x39\xb2\x2e\xd3\x25\xfb\xfc\x19\xe4\xc1\x9a\x11\x6e\x62\x90\x8b\x4e\x67\xc8\x79\x96\x39\xf1\x1a\x33\xa5\x23\xf4\x26\x26\xfc\xe4\x3c\x68\xfb\xb3\xdb\x07\x6b\xd5\xd7\xd7\xff\x80\x23\x41\x5a\x23\xb2\xd9\x08\xab\x06\x82\x85\xbb\x0f\x3a\xc2\x3e\x49\x1f\x28\xdd\x78\x00\xba\xf0\x52\x67\x55\x2e\x4e\xc5\x52\x0e\xd1\x78\xa2\x31\x9a\xf7\xfa\x64\xd2\x40\x81\xc6\x34\xd3\xc9\x0d\x4b\xe9\xcb\x28\xa3\xa9\x0d\xb1\xda\x9d\x0a\x5d\x73\xbb\x7a\xe4\x74\xdd\xf9\xfe\x8d\x6c\xae\x9c\x17\x85\x54\x73\x2c\x4e\x2a\xf9\x6d\x83\x18\xb0\x27\xa1\x1e\xb8\x27\xde\x42\xef\x88\x43\xdf\x78\xc3\x98\xde\xc8\xc9\xcd\xce\x43\x74\xce\x66\xea\x1f\xae\xa8\x67\xdf\xdd\x47\xdd\x60\x88\x7a\x40\xbf\x1b\x0a\xf8\x37\x66\xea\xaf\xa9\xcb\x41\x7d\x0c\x8c\x81\x0a\x80\x63\x1f\x10\xc9\xdd\x7d\xef\x03\x38\xba\xfb\xa5\xb2\x35\xe8\xa2\x42\x80\x21\xe7\x96\x14\x42\x6f\x41\x70\x56\x88\xd2\x48\xe3\xce\xe5\x6f\x61\x43\x9d\x64\x5c\xe6\x91\x37\x78\x3b\x44\xc0\xcd\x0d\xc8\x98\xfd\x25\xe5\xa5\x4e\x69\x40\x10\x85\x88\x0a\xba\x41\xad\x6d\x6a\xb5\x03\x1e\xa8\xdb\x16\x95\xdf\xd6\xd4\x6c\x4a\x4a\xf7\x49\x10\x95\x78\xd7\x53\x12\x90\xf0\x7e\x8f\x55\x3e\x86\xc9\x0f\x24\x06\x40\x30\xd2\xe2\x36\x25\x61\xc3\x78\xc4\x8d\x12\xa9\xf4\x64\x07\x4e\x18\x66\x57\xb8\x3d\x41\x3f\x65\xfb\x2f\xf6\xb7\x2a\x24\x91\x44\xa5\x2e\xf8\xbc\x57\x8f\x83\x16\xa5\xda\xc3\xc6\x85\xe0\xce\x0c\x82\xef\x03\x2c\x11\xdc\x25\xd2\x1a\xa8\x02\x60\x48\x30\x50\xee\x09\x4c\x06\x02\xf4\xa0\x61\xb7\x7c\xc5\x78\xa9\x2b\x95\x92\xab\x31\xf8\x7a\x5f\xb7\x1e\x7c\xa1\x95\xf0\x31\x94\x76\x1d\x39\x04\x77\xa4\x62\xcf\x27\xcf\x9f\x3d\x95\x93\x0a\xde\xb0\x75\x52\x5d\x84\x93\x0a\xe5\xd3\x56\xdf\xd5\xa3\x21\x0f\xf4\xbe\xaf\xc9\xc5\x52\x83\x1d\x4b\x0f\xe6\x0a\x1f\xdd\x96\xd2\x8a\xa8\x73\xd1\x01\x18\x2e\xce\x3e\x8c\xaa\xa6\x0f\x07\xc4\xf8\x1e\xa6\x4c\xdd\x54\xd3\x8f\x28\xb7\x48\x40\xc1\x76\xdb\xe4\xe1\x32\xef\x11\x61\x31\xa1\xf6\xf6\xd8\x01\xde\xb9\x8f\x45\xa2\x87\x5b\x65\x2d\x22\xda\xd9\xbb\xa2\x07\x06\x5d\x83\x70\x67\xef\x0a\x0e\x3e\xb8\x62\x40\x0a\x7e\x29\x16\x7c\x29\xa0\x38\x56\x66\xbc\xcc\x20\xfc\x7c\x85\x73\x67\xd3\xca\x32\xa1\x96\xb2\xd4\x0a\x72\xbd\x96\xbc\x94\x80\x5a\x51\x8a\x99\x28\x85\x72\xb6\xe8\x6f\x0f\xbe\x3d\x7e\x0b\xb9\x2d\x87\x88\x65\xef\x67\x59\x19\x0f\x2f\x11\xcf\x24\x1a\xee\x17\x97\xcf\xcf\xc3\xd1\x10\x64\xae\x9f\x97\x7b\x4e\x5e\xd9\x0a\x01\xf3\xdf\x25\x59\x65\xe4\x72\x5b\x92\x84\xaa\x96\x4f\x65\xa7\x75\x6e\x55\x50\xd7\x84\x5a\x2b\x86\xae\x7d\xf0\xbf\x80\xd0\xba\x6f\x02\xa6\x55\x9c\x0e\x41\xae\x27\x96\xcb\xf9\xc2\x52\x5a\xa6\x87\x34\x5b\x53\x21\x00\xd7\x61\xbb\x4e\x28\x77\xec\x1e\x67\x92\x9b\xfb\xaa\x5c\x6b\x15\x87\x34\x0a\x24\x51\x28\x02\xa2\xe2\x59\xf0\xad\xb8\x07\xa1\xc3\xf1\xfc\x92\xa2\x53\x9e\x6e\x52\xfd\x1b\x93\x56\x82\x75\x81\x49\x28\xf8\x13\xf4\x1a\xce\x62\xcc\x00\x9f\xac\x01\xc2\x1f\x50\x56\xc0\xab\xa5\xb4\x1a\x2f\x22\x40\x92\x42\xa7\xf7\xac\xc6\xeb\x6a\x78\x74\x32\x39\x36\x53\x90\x2d\x74\x96\xfa\xbe\x9c\xe8\x92\x99\x0a\x7b\x2b\x84\x62\xe7\x97\x40\x3f\xf7\x8a\x10\xed\xb9\x83\x8a\x18\x1d\x00\xe8\x91\xc8\x22\x6d\xd0\xf3\xbe\x0c\xd6\xc3\x2a\xe9\xa3\xd2\x87\x37\xed\xbd\xe7\xff\x1e\x68\xe6\x23\x62\x7c\xaa\x97\x02\x48\x9a\xa6\xa5\x30\x3d\xa0\x3b\xb6\x60\xa7\xf6\x12\xa5\xb2\x53\xdf\x85\x66\x7c\x23\x90\xcd\x7b\x88\x40\x7d\x87\xad\x0a\x8c\xf7\x89\x25\xd8\xf9\xe5\x49\x0f\xe9\xb5\xff\x0d\x85\x37\xdc\x50\xfb\xfb\x86\xc9\x22\xa9\xe3\xa9\x13\x56\x47\x0d\xa3\x8a\x06\xd4\x18\xef\x17\xb2\xea\xaa\x26\x46\x42\xad\xa7\x90\x66\x0a\x87\x71\x62\x85\xaa\x99\x43\x94\x58\x1a\x0c\x13\x37\xa8\x61\xfc\x2f\x62\x82\xf8\x44\x04\x14\xf2\x94\x96\x31\x0a\x09\xbe\x2d\xc1\x04\x1e\x74\x9f\xda\x17\x49\xf1\x35\x62\x7e\x32\x5a\x5e\x9e\x9f\x0e\xc9\x2e\x85\x4c\x1f\x1c\xbb\xdc\xdf\xbe\x6c\xd6\xae\x35\x21\x1f\x68\x40\xbf\xd9\x2f\x75\x7a\x87\x9a\x54\x1f\x34\x70\x7f\xdc\x5d\xd0\x6a\xc6\x19\xba\x09\x5b\x7d\x63\x3b\x10\xe5\xde\x52\x02\x54\xad\xcb\x2a\xcb\xae\x44\x52\x8a\xfb\xba\x47\x9b\xeb\x7f\xde\x1a\xeb\x2e\x95\x27\xd2\xdf\x01\x47\x80\x6e\x56\x35\xc0\x5b\xe0\x9a\xb8\x4a\xb0\xa8\x32\xc8\x33\xe5\x6a\xe5\x09\x0e\xb3\x37\x51\x2c\x4a\x1a\x9f\xb3\x82\x29\x52\x8d\x55\x30\x22\x3c\x2c\x74\x0b\xe1\xc6\x60\xc4\x54\xaa\x54\x2e\x65\x5a\xf1\x0c\x1e\x04\x5a\x68\xdc\xd3\x37\x9c\x90\xb9\x07\x2c\x64\x2f\x75\xc9\xc4\x3b\xee\x6e\x1b\x05\x25\x96\x1b\x60\x87\x54\x27\x37\xa2\x1c\xa1\x2a\x76\x0a\x7f\x9c\x80\xc6\x8b\x90\xbc\x7e\x1e\xce\x96\x20\x98\xbe\x2e\x6d\x82\x7d\x1f\x60\xa4\xc3\x6f\xf0\x75\x57\x52\xcd\xc7\xf0\x89\x7b\x11\x7a\xd2\x58\xab\x31\x1f\x3b\x36\x7c\x24\x8a\x1f\x60\xf0\xbe\x01\xcd\xea\xad\xe7\x17\x6f\x22\x38\x43\x4e\x57\xf3\x05\x10\xab\xcc\xb9\x87\xc5\xca\x84\x05\xc4\x23\x8a\xeb\x22\x34\x05\xfd\x36\x25\x35\x2d\x46\x80\x6a\xf2\xda\x23\x51\xfe\xba\x7a\xc8\x5a\x99\xc2\x91\xd8\x22\x1a\xd9\x7b\x73\xa0\x5e\x8a\x72\x29\xc5\xed\x11\x1d\x9d\xe3\x5b\x69\x17\x63\xa4\x88\x39\x02\xc2\x1e\xfd\x06\xd5\x4b\x2c\xdc\x3a\x4e\x53\x72\x5b\x56\x46\xcc\xaa\x8c\xfa\xe5\x4e\x18\x2f\xe4\xb7\xa2\x34\x80\xab\x78\x23\x55\x3a\x62\x95\x4c\xbf\xf8\x84\x89\x2f\x52\xc9\x3a\xc5\xae\x97\x14\x7c\x45\x52\x8e\xea\x85\xe5\x7f\xea\x96\xb6\x94\x1c\x34\x15\x99\x56\xf3\xa8\xda\x19\xd4\x8b\x73\x25\xed\x5a\x6b\x3e\x44\x2d\x03\x13\x59\x97\x29\x24\x32\x4a\x5d\x36\xfc\xc1\x6e\x3c\xc0\x72\x8a\xd2\x21\x9d\x88\x94\x8d\xf1\x20\x9d\xc5\x84\xc3\x88\x61\x42\x84\x2f\x8c\xf4\x08\x99\x1e\x23\x0a\x21\xcb\x16\x5c\xa5\xf0\x67\x92\xe8\x32\xa5\xf9\x4a\x1b\x72\x2f\x31\x29\x08\x33\x51\xe0\x58\x83\xee\xea\xaa\xfd\x64\xb0\x40\xcb\xbc\x91\xa8\xe7\xd5\x9e\x4a\xc9\x9f\x2a\xc1\x78\xae\x9d\x60\x6f\x03\x39\xb7\x28\x92\xf3\x15\x9c\xad\x30\xd5\x57\xa1\xd2\x0f\x8b\x09\xcd\x88\xbd\x15\x3c\x95\x51\x41\xf4\x88\xbd\x6a\x56\x48\x8f\xdc\x5c\xae\xb0\x74\x93\x3e\xc2\xd9\xfb\xe6\xea\x6f\x31\x48\x94\xfb\xbc\xa2\xf5\x97\x71\xab\x62\xf9\x8d\x50\x68\x94\x3b\xd2\x40\x1c\xac\x2a\x61\x0d\x92\x85\x48\x2b\x38\xa5\xa6\x2b\x36\x93\x88\xee\x0e\xaa\x82\x9c\x2f\x84\xb1\x5e\xb9\x3c\x82\x5c\x9d\xba\x4d\x8d\x9f\x00\xb0\x6f\x94\x69\x5b\xbb\xb1\x72\x0e\xd0\xa5\x9a\x3a\xd3\x53\x31\x09\xda\x6c\xa6\xca\xfd\x5e\x6e\x53\xda\x4c\x7c\x4f\x7b\x37\xf3\x08\x35\x5b\xb6\x88\x0b\x41\x3a\xf2\xc3\xb1\x19\x37\x0b\xc0\x94\x6f\x2f\x41\x82\x2e\x99\xa4\x2a\x9d\xc0\x40\x98\x59\x0e\x4d\x64\xa1\x63\x21\xf4\x1b\xdd\xe4\xb8\xe9\x59\x3c\xe0\x26\xdb\xbd\xef\xfd\xf6\x0e\xb1\xe3\x90\x0c\xee\x08\x9f\xb4\x24\x01\xae\xa4\x3b\xb0\x3c\xb6\x94\x6f\x43\x0e\x8b\xe1\xa4\xc2\xa7\x3b\x92\xba\xc7\x47\x3b\xc5\x35\xfb\x9c\x80\xbc\x9c\xf7\xf7\x7c\xec\x1f\x97\xf3\x0a\x37\x3a\x49\xe1\x1a\x94\x96\x5a\x79\x82\xd6\x86\x3a\xa6\x33\x67\x4e\x5e\x9f\xc6\x25\x48\x71\x6d\x85\x2f\xe0\x9a\xb0\x6f\xfb\x3a\xa9\xdb\x5e\x6a\x27\xcd\x6b\xd7\x77\x12\x76\x96\x93\x18\xd9\xd2\xdb\x17\xe1\x69\x5e\x0f\x95\xaa\xa8\x2c\x1d\x83\xb5\xc5\xa9\x92\x05\x57\x73\x30\x32\x75\xe5\xc6\xfb\xed\x6f\x61\x46\xa5\x48\xab\x84\xd0\xf4\x3d\xcb\xfe\xd6\xbb\x6c\x09\xcf\x0b\x64\x95\x49\x78\xe1\xe7\x1c\xbf\x96\x59\x29\xcb\xdf\xbd\x60\x72\x22\x26\x6c\xef\xb7\xd1\x57\x7b\xf8\xf4\xa2\xd4\xee\x11\x54\xfa\x00\xb3\xca\xa4\x85\xf4\xed\xbd\xf8\xee\x09\x3b\x73\xcf\x80\x30\x56\x20\x60\x94\x9d\x3f\xad\xc9\x37\x62\xa5\x98\xf3\x32\xcd\xc8\xdd\x72\x1b\x95\x74\x04\x82\x89\x77\xd2\x58\x83\x67\x90\xed\x21\x99\x2c\x37\x37\x4e\x0e\xb9\x9d\x35\x4e\xb9\xe5\xe3\x68\x4b\x1f\xa1\xdd\x36\x26\xb8\xcf\x31\x27\xd6\xaa\x45\xd6\xd1\x6f\xa8\x32\x72\xcc\xc3\x5d\xd2\x69\xe4\x00\xbc\xd9\x5d\xcf\x79\x6c\x3e\xb6\x1e\xa8\xaf\xcd\xdd\x7b\x56\x23\x48\x03\x0d\x20\x8b\xbf\xd6\x97\x82\x10\x25\x60\xd3\x4d\xfb\xf9\xec\xe2\xfa\xed\x3f\x2e\xdf\x9c\x5f\x5c\xef\xb6\xf5\x6e\x5b\xef\xb6\x75\x8f\x6d\x2d\xd4\xb2\xf7\x96\xf6\x76\xd3\xa6\x90\x6f\x1b\x70\x32\x2a\x0d\x7a\x42\x89\x75\x67\x6a\xf9\x2d\x2f\xeb\x36\xf6\x14\xaf\xda\x10\x01\xf7\x7d\xee\x41\xc4\x9d\x3c\xfa\xcc\xba\x2d\xe6\xc5\x0d\x98\x6f\x14\xbb\x54\x36\xad\x5a\xdc\xfb\xeb\xe4\x9f\xe7\xa7\x67\x17\xd7\xe7\x2f\xcf\xcf\xde\x6e\x35\x51\xa4\x27\xe0\x63\xf3\x50\xee\x78\x4a\x16\xa5\x58\x4a\x5d\x99\x6c\x15\x7a\x6c\x6d\x16\x02\xeb\xb9\x86\x2a\x05\x5f\x87\x11\x25\x64\x5d\x6f\xfc\xd9\xee\xb0\x1d\xf6\xb0\x6d\xe6\xcd\xf4\x80\xe7\x19\x8a\x7d\x5f\x96\x3a\x1f\x88\x85\xaf\xd0\x0b\xe3\x83\xe1\x9b\xf8\x69\x9f\x90\x3c\x1a\x47\x0f\x29\x8f\x35\x6c\x88\x53\x46\xf3\xc2\xf6\x00\xc3\x1f\x04\xe2\x77\x18\x34\x5c\xcc\xd5\x79\xcd\x8b\xaf\xc5\xea\xad\xe8\x89\x02\xd4\xa4\xb7\xc8\x44\xe2\x0e\x3a\x76\x23\x56\x98\x98\x79\xe2\x1f\xd6\x07\xad\xe8\x41\x22\x24\xdf\x88\x3e\xe8\xd5\x43\x42\x1b\xdf\x88\x1e\x49\xa7\xfe\x5a\x03\xf9\x75\x4b\x08\x7a\x9a\x5b\xd3\x7e\xab\xc7\x86\x85\x35\xfe\x08\x50\xce\x4f\x37\x82\xd2\xbc\x06\x5c\x05\x1f\x08\x1e\x78\x25\x30\x26\xbf\x6a\x9c\x5d\x41\x88\x30\xac\xea\x04\xde\xf4\x41\x07\x52\x32\x06\x22\x4d\xdf\x26\x5c\x0c\x97\x70\x58\xb9\xba\x5f\x0b\x56\xcc\xf1\x0f\x38\x73\xe9\x0b\x0f\x65\x60\x42\xe7\xac\x89\xe3\xb0\x51\xf3\x4f\x08\x89\x8e\xd8\xbf\xc2\x87\xd0\x6b\xda\x7c\xbf\xbf\xff\xd7\xaf\xcf\xfe\xf1\xb7\xfd\xfd\x1f\xff\x15\x7f\x0b\x47\x21\x06\xca\x9b\xb7\x00\xae\x93\xd2\xa9\xb8\x80\x67\xc0\x9f\xa4\xae\x1d\x63\xf0\x84\xbe\x80\x8a\xec\x09\x66\x2d\x85\x3f\x0b\x9d\xb6\xff\x32\xbd\x00\x01\x1f\xe4\xc1\x00\x4b\xd4\xa3\xb2\x08\xaf\xe1\x8e\x87\x5a\x96\x0c\xbc\x55\x69\x54\xcf\x8d\x00\x2c\x8d\x90\x64\x2f\x3d\x09\xa0\xbb\xa7\x87\x7e\x50\x50\x2f\xef\x34\xd3\x26\x3a\xe4\xde\xf2\x79\xaf\x3e\xc6\x78\x0d\x28\xda\xc2\x0a\x0e\x4c\x30\xa0\x88\x6f\x18\x06\x1b\x39\x1c\xb0\x21\x61\x26\x74\x9f\x3b\xbe\x3c\x67\x4b\xa4\xf0\x83\x21\x8e\x0f\x6c\xbe\xfc\xa8\x32\x2e\x84\x4f\xdb\x75\xb9\x2f\x30\x01\xc7\x7f\x4f\x18\x09\x26\x20\xd8\x09\x67\xd8\x1c\xe0\x87\x93\xa4\xa8\x46\x74\xc3\x24\x17\xb9\x2e\x57\xe1\xcf\x00\x36\x33\x36\x56\x97\x7c\x0e\x35\x35\xf8\x73\xfc\x59\xf8\x0b\x7f\xd8\x78\xc0\xfa\xaf\xd1\x14\xae\xa3\xa8\x01\xe0\xf6\xe9\xc9\x36\x4f\xfa\x07\x22\xda\x92\xbe\x30\x4a\xcd\xab\xc9\x90\xc1\x13\x87\x0a\x67\xa0\x22\xd8\x93\x54\x33\x3c\xaa\xf3\xe1\xc0\x1b\xa0\x96\xce\xb2\xec\x0c\x80\x57\x5f\x03\x4a\xb3\x54\x2e\xa5\xd1\x3d\x2a\x87\xc2\x40\x77\xe7\x4e\x12\x6c\x09\xe6\x6f\x05\xb7\xd9\xbb\x02\x30\xbf\xc2\x7e\x6d\x89\xfd\xe7\x7d\x9a\x9c\xe3\x55\x70\x6b\x45\xa9\x5e\xb0\xff\x39\xf8\xe1\xf7\x3f\x8f\x0f\xbf\x38\x38\xf8\xfe\xd9\xf8\x2f\x3f\xfe\xfe\xe0\x87\x09\xfc\xe3\x77\x87\x5f\x1c\xfe\xec\xff\xf8\xfd\xe1\xe1\xc1\xc1\xf7\x5f\xbf\xfe\xea\xfa\xf2\xec\x47\x79\xf8\xf3\xf7\xaa\xca\x6f\xf0\xaf\x9f\x0f\xbe\x17\x67\x3f\x7e\xe0\x20\x87\x87\x5f\xfc\xb6\xf7\xd4\x07\x80\xe0\xc5\x6b\x48\x20\xde\xe6\x88\x83\xb0\xdf\x47\x6c\x65\x81\x97\x67\xaf\xa1\xf7\xff\x5b\x2f\x35\xa3\x7c\x1e\x7f\x5c\x3f\x98\x0d\x8e\x09\xa1\x9f\xc2\x93\x83\x4f\x6a\xd6\xda\x04\xd3\xe2\xa9\x9d\x73\xbf\x06\xe7\x8e\x57\xdb\x71\x5d\x6b\x4d\x74\x56\xea\xdc\x57\xf4\x43\x78\x03\x6b\xcf\xe8\xbe\x1b\xd1\xab\x25\x28\x5e\x3b\x67\xd0\xce\x19\x74\xc7\xf5\x8b\xce\x20\x2c\x47\x78\xb8\x9e\x20\xa1\x96\x5d\x43\x18\x1b\x23\xe8\xde\xd6\x89\xe1\xef\x3e\x2c\xa0\x36\xf1\x5b\xdd\x84\x48\x5c\x9d\x49\x83\x07\x5a\xbe\x39\x86\x09\x0d\xfc\xa5\xc2\x8d\x0f\x03\x04\xd0\x4f\x41\xbd\x3b\xa8\xfe\x72\xe9\xa6\x10\x90\xde\x1b\xd8\x9d\x90\x55\x2c\xd5\x9c\x90\x2c\xf0\x28\xa1\xe8\x93\x54\x35\x1a\x6e\x50\x0e\x6b\x08\x75\x6e\x8c\x4e\xa0\xf1\x11\xe2\xe4\x05\x54\x3e\x9a\x36\xcc\xc6\xf2\x1b\x11\xb7\x62\x47\x78\xf5\xfa\x5d\xa7\x2b\x40\x7d\x55\x4b\x0f\x31\x9f\x56\x98\x0c\x82\xe2\x6f\xf3\x18\x4f\x2b\x01\xc1\x31\x22\x05\xc1\xa2\x3c\x04\x90\xfa\xc1\xc2\xe6\x90\x8a\xa1\x67\xb5\x97\xb5\x5b\x33\xcb\xde\xa7\x78\xff\x33\x33\x44\xb6\x7a\x29\x43\x6b\x87\x65\xed\x7e\x6e\x1e\x92\x4f\x21\x18\xd8\xff\xf8\xfc\xd5\x1d\x9d\x03\x1d\x9b\xc3\x1c\x99\xf7\x88\x9d\x0c\x79\x4c\x0e\x11\x2c\x29\x4a\x31\x93\xef\x06\xda\xa7\xc7\x51\x65\xa2\x4c\x85\xb2\x72\x26\xb1\x5f\x6f\x51\x8a\x42\x28\xec\x99\xcf\x93\x05\xc8\x7e\x3a\x29\xeb\xe0\xf4\x43\x4c\xe6\x41\x85\x7b\x58\x51\x76\xb5\x49\xd9\xdf\xc9\x31\xb6\x93\x63\x9d\xaf\x4f\x24\xc7\x88\x73\x1f\x8e\x10\x83\xcc\xf3\xfe\xa9\xef\xa7\x51\x1e\x3b\x70\x71\xff\xca\xe1\x16\x1a\x5c\x90\x8b\x56\x63\xe6\x1a\x96\xaf\x95\x2c\x13\x4b\x91\x91\xd2\xc4\x72\xae\xf8\x1c\xdb\xf0\x59\x1d\x40\x7f\x74\x19\x5a\x1c\xb5\x11\x7d\x40\x89\xf7\x95\x5d\xf0\x65\xa9\xb3\x4c\x94\x86\x65\xf2\x46\xb0\x53\x51\x64\x7a\x95\x53\xe2\x6b\xca\xae\x2c\xb7\x8e\xa5\xaf\x84\xed\x16\xf3\xed\x87\x06\xe2\x8b\xd9\x07\x82\x3e\xc7\xea\x78\xa8\x2d\x67\x05\x15\x4e\xbe\x51\x20\x31\x8e\xa1\xdb\xca\x88\x5d\x88\xa5\x28\x47\xec\x7c\x76\xa1\xed\x25\xaa\xde\xcd\x6c\x3b\xbc\x91\xc9\x19\x7b\xe1\x8c\x3a\x63\x99\xc5\x8e\x17\x51\x9d\xbb\x2e\x1b\x03\xd4\x78\x6f\x43\x94\xe5\xad\x97\x9c\xc3\x48\xa1\xe0\xbc\x53\x18\xa3\xd7\x32\x85\x96\x42\xbd\x17\xe8\x18\xcb\x48\x6b\x24\xdf\x88\xbf\x11\x9e\xc1\x23\x98\x81\x09\x28\x15\x2b\x85\x29\xb4\x32\xa2\x09\xcf\x58\xb7\xa0\x04\x53\xd7\x0c\x6a\x21\x76\x3e\x39\xfb\x9e\x99\x85\x36\x16\x2a\x67\x87\x69\x54\x75\xe9\x87\x83\x42\x64\x9e\x65\x22\x6d\x74\x2a\xc3\x0e\x3b\xbc\xe9\x1e\x48\xa0\x39\x83\x6f\xf8\x22\xa8\x3e\xb9\x51\xda\xdc\xb8\x3f\x74\xbd\xf3\x7d\x65\x7c\xff\xe4\xbb\x0a\x9a\xeb\x8d\x09\x87\x48\xc4\x00\x6b\x78\xcf\x80\x02\x6e\xa2\xe6\x34\x0b\xad\x6f\x58\xa2\xf3\x22\x83\xad\xd3\x63\x67\xd5\xbd\xb1\x02\x2b\x8d\xa1\x1f\xea\x51\xd4\x36\x0b\x3e\xd8\x62\x7f\xd3\x21\x74\x30\xf1\x4e\x24\x83\xf5\xd5\x74\xb2\xd4\xad\x32\xc4\xfb\xb5\x0a\xaa\xd8\x4c\xbb\x03\x0c\x8a\xb3\x03\xfe\x60\x04\xb6\x73\xf6\x4e\x24\x51\x6f\x5a\x40\xc0\x4a\x3c\x9e\x84\xdb\xe8\xfd\x7b\x8e\xf7\x0e\x53\x0c\x15\x1a\xe8\x51\x7c\x17\x5f\x2d\xd0\x40\x18\xd3\x63\xa4\xd3\x23\xa0\xdd\x04\xd8\x4f\x58\x90\x17\x83\x6e\x04\x1e\xc6\x1d\xbb\x86\x34\x18\x92\xaf\xfd\x58\xd0\xd5\x47\x6b\xcb\x0e\xf6\x8f\xf6\x0f\xd7\x7c\x96\x2d\xa0\xed\xeb\xe8\x97\x12\x90\x25\x0b\x80\x69\x14\xc9\x7e\x3a\x62\xd2\xfa\xec\x6c\xec\x13\x04\xb3\xa2\x2a\xc1\x11\x33\x9a\xd9\x92\xa7\x92\xb4\x1f\xf8\xd4\xdd\x64\xcb\x8a\x0e\x87\x83\xfd\x9f\xf7\xa9\x4d\xd1\xad\x56\xfb\x16\xa6\x3f\x61\xd7\x88\x52\x13\x06\x5a\xe9\x0a\x9a\x6f\x22\x09\x8a\x4c\x26\xd2\x66\x2b\x10\x74\x4c\x57\xd8\xa9\xcb\x1d\x33\x54\x9d\x78\xf6\x4e\x5a\xdf\x92\x44\xcf\xd8\x33\x6c\x14\x26\x38\x79\x4d\x33\xb9\x14\x47\x0b\xc1\x33\xbb\xc0\xc4\x12\xa5\xd5\x18\x7b\x3d\x3a\x09\x44\xdf\xf4\x8d\xb1\xf4\x73\x41\xc6\x57\x0f\x77\xe4\xfa\x84\x7a\x5a\x1b\x4e\xf6\x7e\xd5\xbd\x9b\x35\x5b\x03\x0b\xbb\xbe\xbe\xfc\xaa\xd1\xce\x1a\x84\xbf\xb5\x85\x4f\xf7\x89\x9a\xbe\x3f\x00\xd9\x31\x4c\x80\xb3\x57\x2f\x6a\x36\xa0\x08\xeb\xdb\x93\x9a\x6d\x06\x7f\xfb\xf0\x66\xd4\xec\x1f\xba\x02\xe8\x10\x3e\xcd\x56\x01\xb7\xc1\x08\xcb\xf6\xdc\x50\x7b\x4e\x3c\x39\x6e\xf8\xbb\xe0\x29\xc2\x6a\x18\x2b\x78\x27\x8d\x2f\xbe\x06\x0b\xbc\x45\x73\x1b\xf6\x1c\xa8\x8c\xd5\x39\x5b\xd0\x6b\x37\xcb\x35\x69\x67\x4c\x60\xf7\xf8\x5a\xa8\x52\x14\x28\xe1\xe8\x37\x4f\x4e\x7e\xad\xc9\x0d\xa4\x7b\xa3\x67\x42\x12\x93\x2d\xee\xac\x23\x15\x12\x0b\x51\x6a\x06\x92\xa5\x03\x24\x4c\xb0\x01\x93\x26\x58\xbf\xe2\xcf\xf6\x40\x10\x08\xec\x9f\x1f\x36\x58\x1e\x06\x1b\x2c\xd7\x80\x6d\x72\xcc\x12\xcf\xa0\xd3\x66\x20\x22\x0e\x1a\xe1\x67\xfd\xcb\x4b\xe3\xeb\xfd\x04\x18\x66\xf1\xd9\x90\x14\x28\x06\x48\x07\x5f\x4f\x06\x47\xd0\x29\x28\xd7\x44\xe1\x0a\x62\xc2\x88\x72\xd9\xb5\x00\xbc\xbe\x86\x7b\x75\xdd\xdd\x51\xe0\xaf\x0d\xb5\xd5\x25\x53\xa1\xc1\xb5\x07\x55\x5d\x27\x48\x94\xcd\x40\xfd\xb0\xbd\x0b\xd8\x1f\x47\x5c\xcd\x05\x7b\xee\x7e\xf9\xe7\x3f\xfd\xe9\x0f\x7f\x9a\xe0\xf0\x21\xb3\x41\xb1\xf3\xe3\x8b\xe3\x7f\x5e\x7d\x7b\x02\x05\xb5\x7d\xa9\x3a\x50\xda\xe6\xd0\x49\x9b\x83\xa6\x6c\x7e\xd4\x84\x4d\x28\x13\xe9\x2d\x45\x9a\xf1\x02\x18\x32\x46\x17\x25\xdd\x2f\x42\xe5\x73\xba\x66\xd3\xff\xea\xb6\xda\x83\xd8\x63\x36\x29\xae\x74\x72\x33\xa0\x5d\xb3\x7f\x7d\x72\x89\x43\x46\xa6\x0d\x57\xde\x19\x22\xd5\x52\x67\x4b\x40\x5f\x65\xd7\x27\x97\xb0\xf3\x26\xf0\x2f\x70\x44\x81\x45\xbd\x12\xb6\x2e\x64\xa0\xf0\x54\xc0\x50\x85\x22\x0d\x9e\x49\x63\x65\x02\xbf\xab\xdd\xa4\x6e\x84\x3e\x71\xa9\x9d\xa5\xb4\xe9\x1a\xdc\x52\x8a\x9a\x04\xdf\xd7\x68\xea\x9b\x78\xf8\x80\xcf\x25\x3a\x8f\xca\x46\x17\xed\xdd\xb9\x34\xc0\x78\x0f\xf7\x5c\x2a\x4a\x71\x65\x75\xa7\x6e\x01\x6c\x3d\x12\x82\x83\xdd\x11\x07\x99\x8a\x99\x2e\x45\x3b\x10\x12\x05\x36\xd2\x0a\x36\x21\x57\x50\xfd\xe7\x5d\x50\xba\x11\xbc\xc0\x94\x4b\xdf\x21\x3b\x23\x4c\xd4\x23\x13\x03\xa1\xfa\x76\xc7\x23\xf7\x76\x22\x87\xd9\x8d\xea\x32\x06\x6a\xb6\x0c\x1f\x0a\x9b\xa0\x9b\xd5\xc7\x5f\xc8\xa3\xea\xa7\xdf\x0e\x95\x24\x25\x37\x0b\x6c\x44\x2c\xde\x49\x1b\x20\x57\xb9\xd1\x0a\x9d\xbd\x51\x4f\x64\x69\x22\x4c\xee\x28\xc8\x83\x3f\xba\xd4\x69\xbb\xe7\xf8\xbc\xe4\x89\x60\x85\x28\xa5\x4e\x19\xd4\x13\xa7\xfa\x56\xb1\xa9\x98\x4b\x65\x3c\xfd\x00\x9c\x9d\x08\xed\x8e\x1b\x01\xbe\x61\x8f\x16\x37\x61\x6f\x1b\x20\x28\x54\x9e\x94\xe8\x7a\x47\xd3\x2c\xda\x41\x26\xc8\x08\x05\xf2\x62\x37\xa0\xb0\x30\x71\x83\xa4\x5f\x98\xf4\x00\xd1\x26\xec\xe1\xe5\xbf\xbb\x93\x3a\xd2\x38\xaa\x27\x8b\x7e\x81\xdf\x5d\x78\xea\x03\xaf\x5d\x78\xea\x7e\xd7\x2e\x3c\xb5\x0b\x4f\xdd\x7d\x3d\x38\xf7\xee\x2e\x3c\xb5\x33\xba\xda\xd7\x2e\x3c\xb5\x0b\x4f\xdd\x71\x3d\x38\xf9\xb5\x0b\x4f\x7d\xc0\xb5\x0b\x4f\x7d\xe0\xb5\x0b\x4f\xed\xc2\x53\xbb\xf0\xd4\x2e\x3c\xf5\x2b\x72\x03\xfa\x6b\x17\x9e\x5a\x1b\x64\x17\x9e\x8a\x88\xb1\xb3\x94\x36\x5c\xbb\xf0\xd4\x86\x6b\x17\x9e\x8a\xae\xdd\xb9\xd4\xe1\x5c\xf2\xc1\x9d\x4b\x67\x97\xf5\xaf\x59\xbb\x84\xc0\x81\x4c\x28\x46\xa4\x67\x8d\x3a\x27\x7c\xd4\xa4\x6e\x40\x11\x61\x7e\xf8\x52\x1b\x8a\x06\xd5\x31\xa6\x8d\xf5\x50\x3d\xdb\xc3\x15\x3a\xad\x83\x11\x51\x14\x02\xad\xd3\xee\x35\x69\x5b\xab\xb6\xea\x13\x7a\x78\xd0\x61\x87\x07\x12\xda\x19\x20\xd4\xb0\x0b\x33\x3c\xb9\x30\xc3\x30\x2e\xba\x01\xdc\x73\xbd\x4f\x18\x0a\xe6\x5f\x2f\x4a\x61\x16\x3a\xeb\xcc\xe8\x0d\x26\x7f\x2d\x95\xcc\xab\x1c\xfa\xc6\x3a\x7e\x96\xcb\x90\x35\x10\x9a\x63\x93\xa0\x47\x4f\x61\xd4\x60\xd6\x37\x96\x85\xb2\xce\x05\x07\x55\xdd\x54\x49\x22\x44\x1a\xb5\xbc\x07\xc5\xec\x0f\x93\xf0\xa4\xd0\x4e\xe3\x79\x3f\x79\xd3\xef\xec\x47\x88\x52\x18\xe5\x0f\x9f\x75\x1a\xa3\x67\x94\xe7\xd3\x47\x78\x06\x10\xd3\xfd\xed\x95\x5e\xb6\xca\x10\xa7\x44\x5f\x1b\xe5\xb1\x45\x72\x06\x8b\x68\x0e\x10\xc1\x79\x40\xd1\x9b\x07\x73\x2c\x3c\x94\x88\xcd\x03\x44\x5f\x1d\x20\xc0\x30\x44\x84\x66\xb8\xe8\xcc\x47\x00\x29\xfd\x38\x51\x99\x01\xad\xe1\x81\xa2\x31\x9f\x22\x12\x33\xc8\x5b\xf7\x8d\xc0\x7c\xba\xe8\xcb\x30\xaf\xdb\xd3\xbb\xf5\x24\x22\x2e\x03\x78\xb5\x86\xf4\x68\x0d\xe6\xcd\xfa\x68\x11\x96\xfe\xd1\x95\x07\x10\x59\xe9\x4d\x64\xa9\xa4\x95\x3c\x3b\x15\x19\x5f\x5d\x89\x44\xab\xb4\xf3\x09\xd3\x42\xad\x0b\xfb\xc7\xe0\xb0\x64\xa3\x35\xf3\x8f\x17\x9c\xc0\x79\x45\xea\x53\xaa\xbd\xfb\x8f\x14\x0a\x68\x68\x82\xb3\x7c\x90\x0e\x3d\xf6\x60\x8c\x41\x4c\xc6\x1e\x72\x11\xff\xae\x6f\x99\x9e\x59\xa1\xd8\x81\x54\x7e\x1d\x0f\x23\x33\xb0\xb6\xcc\x03\x5b\xbb\x6f\x9f\x3f\xf3\x37\x3f\x3d\x93\x1b\x9c\x0b\xc6\x7c\x7c\x0f\x08\x3d\xe8\x97\x5d\x20\x74\xe3\xac\xca\x9a\x6e\x10\x74\x8d\x34\xe5\xcd\xf3\x1a\x5e\xf4\x39\x8c\x1b\x76\x1b\x57\x29\xa3\xc2\x8d\xa7\xb7\x68\xbd\xe3\xc6\x4f\x21\x66\xbc\xf3\xbd\xb0\xa1\x7d\x2f\x5b\x8a\x0d\x3f\x40\xad\xf9\x91\xc6\x83\x77\x5a\xf3\x3d\xae\xa8\xfe\xeb\xab\x92\x27\xe2\x72\x70\x85\xc3\x6f\x27\x96\x56\x25\x95\xed\x05\xbd\x23\x6c\x1e\x25\x44\x8a\xbb\x29\x14\xc5\x41\x35\xda\xac\xca\xb2\x15\xab\x0a\xad\x9a\x95\x87\x18\xb4\x6a\x17\xac\xb9\xd1\x36\x3d\xa5\xd6\x52\x8b\x52\xd3\x01\x5c\x56\x4a\x39\x79\x5e\x37\x1c\x02\xad\xd4\xa0\xac\x8e\xcb\xe2\x8c\x9c\xbb\xe9\xbb\xc3\x14\x2a\xe6\x64\x2e\xea\x96\x14\xf5\x80\xee\xd7\x33\x5d\x26\x72\x9a\xad\xd8\x82\x67\xa1\xbb\x04\x67\x37\x32\xcb\x68\x98\x09\xbb\x12\x96\xd9\x85\xa4\xc6\xe0\x2c\xd3\x6a\x0e\x93\xe3\xca\x77\x35\x13\x89\xfb\x6d\x92\x09\xae\xaa\x02\x9f\xe7\x8e\xf5\x95\xae\x4a\xff\x3c\x82\xb5\x0c\xa3\x48\xc3\x94\xcc\x46\x51\xef\xa4\xf7\x2e\x6c\xdd\xa0\xde\x08\x5f\x53\x78\x2b\x8d\x18\xc5\x63\x7a\x64\x5e\x13\x75\xce\x28\x4a\xbd\x94\x29\x76\xbf\xf0\x64\x83\x2e\xad\xd8\x1d\x23\xec\x67\xa5\xd5\x58\x89\x39\x07\xad\x87\x76\x11\xae\x19\x8e\x83\xa1\x38\x95\x42\xbf\x0c\x67\x2e\xe8\xa2\x51\xca\xba\x94\xd8\xe9\x33\xa2\x1c\x3b\x50\x9a\x69\x38\x5e\x2b\x25\x2d\x76\x8f\x5e\x54\x96\xa5\xfa\x56\x1d\x4e\x10\x95\x58\x1a\xc6\xd9\x54\x58\xdf\xc9\xd6\x77\x56\x94\xa5\x30\x4c\x28\x3e\xcd\xdc\x9a\x43\xc2\xc3\xf5\x46\x02\xb1\x99\xe0\xb6\x2a\x05\x9b\x73\x2b\x36\x2a\x4d\xf8\xbe\xef\x27\xaf\x34\xa1\xcb\x7b\xa5\x8c\xe8\xdc\xdf\x7a\x60\x4d\xeb\xcf\x7f\xec\x26\x23\x64\x2e\x74\x65\x3f\x89\x29\x79\xbb\x90\xc9\x22\xd6\x8c\x65\x2e\x0c\xd3\x55\xcb\xc6\x7e\x4e\x3f\xdb\xbc\x42\x3b\x7b\x72\xd3\xd5\xd5\x4b\xbc\xc1\x95\xd6\x2e\x39\xae\xdb\xca\x72\xb7\x01\x4f\x2f\xae\xfe\xf9\xea\xf8\xcb\xb3\x57\x13\x76\xc6\x93\x45\x5c\x8f\xae\x18\x07\xa1\x01\x82\x62\xc1\x97\x82\x71\x56\x29\xf9\x53\x85\xe8\xe4\xec\x20\xfc\xf6\x70\x50\x2c\xe4\x8e\xa7\x2f\xb4\xbe\x1e\xac\xd7\x12\x36\xd2\xc6\x04\x07\x6d\x04\x74\x47\x68\xab\x4f\x67\xee\x2b\x34\x34\x40\xd5\x5a\x08\x27\x8c\xe4\x92\xc4\x30\x81\x4b\xf3\x34\xa4\x5c\x38\x3e\x77\x6c\xe1\x8e\x2a\x3e\x85\x54\x89\x85\x60\x4a\x58\xc7\xd6\xc1\x61\xa5\x95\x69\x00\x03\x54\x46\x98\x11\x9b\x56\x90\xdc\x51\x94\x32\xe7\xa5\xcc\x56\xf1\x60\xee\xac\xba\xd0\xde\x1c\x5a\xb5\xa7\x74\xfa\xe6\xec\x8a\x5d\xbc\xb9\x66\x45\x89\x90\x01\x90\x9d\x01\xdf\xc3\x6b\x4d\x85\xfb\x05\xf5\xe8\x9c\xb0\x63\xb5\xc2\x2f\x71\x83\x4b\xc3\x9c\x2d\x24\xe0\x08\x26\x1d\xd2\x83\xc2\xef\x3d\x9b\xc0\xff\xf6\xdc\x5b\x96\x4e\xc9\x0c\x49\x27\xc9\x5a\xf2\x18\xaa\xa1\x72\x9a\x45\xd4\xa4\x77\x7f\x52\xdd\x96\x42\xda\xdc\xa5\x23\x62\xd4\x6d\x89\x87\xa5\x06\xf2\x62\xf7\x2d\xa9\xe6\x59\xcc\x55\xdd\xc4\x7e\x5f\xdb\xb2\xaf\x65\x39\xae\xdf\xe0\xb2\xab\x81\x39\x48\xd7\xa7\x7a\x0e\x03\xf5\x4a\xa9\x4f\x3f\x6f\x4e\x91\x44\xd0\x71\xfb\xcb\xf3\x4b\xbf\x03\x48\xbb\xc9\x5b\x3d\x13\xe1\xc7\x18\xd4\x18\xb1\x67\xec\xaf\xec\x1d\xfb\x2b\x98\x57\x7f\xee\xdb\x59\xa6\xaf\xe1\xd3\xdf\xbd\x83\x56\xfd\xf9\xe5\x40\x14\xff\xce\x49\x27\x37\xa2\xa3\xaa\xd5\x6c\x2a\x49\x9d\x17\xef\xac\x28\x9d\x1c\xa5\x95\xd8\x6a\x4f\x1e\x37\xc1\x4f\xc8\x66\x18\xbb\x38\x9f\xc5\x2d\x21\xec\x3d\x19\xcd\xfd\xfc\xef\xda\xd8\x0b\x92\x42\xcd\x06\x13\xf5\x68\x39\xb7\xc9\xa2\x29\xc6\x9c\xa2\x66\x6c\xbd\xc1\x0c\x4b\x35\x78\xd2\x30\x0f\x70\x21\x7b\x64\x62\x3c\x1c\x36\xee\x17\x9c\x6f\xac\xe7\xfb\x56\xaa\xe5\x40\x01\xcb\x87\x14\xab\x08\x5e\xa6\xd0\x29\xe9\x64\x6e\x5a\x69\x74\x66\xbc\x47\x29\x23\x5f\x4d\x70\x59\x03\x2f\xb9\xfd\x94\x70\x85\x09\xdc\x33\x51\x96\x98\xba\x39\x5d\x41\x04\x59\x26\xa2\xf7\xe2\xf5\xda\x49\x45\xa9\xad\x4e\x74\x8f\xb6\x41\xcd\x80\x39\x0d\x07\x44\x40\xe7\xaf\xf7\xb9\x7f\x73\x7a\x39\x62\xd7\x27\x97\xd0\x4d\xe5\xea\xe4\xfa\xb2\x69\xa9\xec\x5d\x9f\x5c\xee\x6d\x95\x14\xcc\x6b\x56\x2f\xdc\x34\x3b\x0c\xd2\x70\x3c\x39\xb5\x6d\x9c\xf3\x62\x7c\x23\x56\x1d\xcf\xd4\x21\xce\xf5\x71\x58\xe1\x41\x5e\x08\xc9\x9c\xf3\xe2\xde\xa3\x95\x82\xa7\xf2\x13\x55\x51\xd0\xce\xaa\x9f\xb9\xb9\x9c\x22\xd7\x4b\x91\xa2\x3a\xec\x7f\x21\x54\x5a\x68\xe9\xf4\xc5\x5d\x8d\xc5\xfd\x7f\xbd\xab\xb1\x78\xdf\xb5\xab\xb1\xd8\xd5\x58\xec\x6a\x2c\xde\x7f\xed\x6a\x2c\xe8\xda\xbe\x1b\x94\xed\x6a\x2c\x3a\x5e\x4f\x2b\xce\xbf\xab\xb1\xb8\xd7\xb5\xab\xb1\x58\xbf\x76\x35\x16\x77\x5c\xbb\x1a\x8b\x3b\xae\x5d\x8d\xc5\xae\xc6\x62\x57\x63\xb1\xcb\x16\xfb\xc5\xb1\x1e\x66\xb6\x18\xdb\xd5\x58\xd0\xb5\xab\xb1\x78\x12\x39\x31\x6c\x57\x63\xf1\x41\xd7\xae\xc6\x62\x57\x63\xd1\xe5\xda\xd5\x58\xc0\xb5\xf3\xbd\xec\x6a\x2c\xfc\xb5\xab\xb1\xc0\xeb\xd7\xa3\x35\xef\x6a\x2c\x76\x35\x16\xbb\x1a\x8b\x5d\x8d\xc5\x7b\x67\xb1\xab\xb1\x78\x0a\xf6\xa4\xef\x81\xd7\xbf\x66\x60\xff\x44\xe7\x45\x65\x05\x7b\xeb\x87\x0c\x5a\x24\x0a\x06\x69\x62\x8d\xa0\x7f\x0a\x4f\xa2\xd5\x4c\xce\x49\xb2\x1f\x61\x83\xb9\x71\x78\x9f\x71\xd4\xd4\xed\x11\xe6\xef\x64\x32\x97\xdd\x0a\x39\xd8\xda\xc2\xbc\x82\xb1\xa2\x20\x8f\xdb\x49\x39\x7f\x07\x5b\x84\xe7\xba\xc2\xa6\x7c\x09\xad\x5f\x20\x21\x86\xc2\x1e\xdc\xca\xb0\x61\x4c\x9c\xba\x22\xe5\x72\x00\x6b\xa3\xe0\xd6\x8a\x52\xbd\x60\xff\x73\xf0\xc3\xef\x7f\x1e\x1f\x7e\x71\x70\xf0\xfd\xb3\xf1\x5f\x7e\xfc\xfd\xc1\x0f\x13\xf8\xc7\xef\x0e\xbf\x38\xfc\xd9\xff\xf1\xfb\xc3\xc3\x83\x83\xef\xbf\x7e\xfd\xd5\xf5\xe5\xd9\x8f\xf2\xf0\xe7\xef\x55\x95\xdf\xe0\x5f\x3f\x1f\x7c\x2f\xce\x7e\xfc\xc0\x41\x0e\x0f\xbf\xf8\x6d\xe7\x29\xf7\x56\x89\x87\x53\x88\x07\x52\x87\x3f\x8a\x32\x4c\xd1\xe1\x81\xf6\xe2\x5b\x1a\xad\xbd\x1b\xe9\xc0\x7a\xdf\x6e\xf4\xd2\x14\xd4\xbc\x30\x8e\x34\x4c\xe7\xd2\x3a\xe5\xd0\xe9\x83\x3c\xce\x0b\x93\xb6\x61\x94\x92\x1c\x80\x84\x4a\x6e\xb1\x47\x68\xc8\xa9\x8a\xf2\xb4\xb5\xd7\xfc\xa8\xf7\x6a\xf0\x57\xc0\x7e\x1e\xa7\x62\x26\x95\xa0\x38\xd8\x4e\x36\xfc\xf2\xb5\x93\x0d\x4f\x51\x36\x18\x91\x54\xa5\xb4\xab\x13\xad\xac\x78\xd7\xc9\xc3\xd2\x14\x0d\x57\xcd\x01\x19\xee\x33\xaa\xa2\xa4\xef\x98\x2e\x30\x81\xb2\x55\xce\x1a\x52\x70\xcb\x4a\x81\x81\x89\x55\x32\xc2\xa2\xf5\x07\x76\x0f\xe4\x44\xb6\x1f\xe2\xed\x39\x34\x33\x7f\xaa\xe4\x92\x67\xce\xda\xad\x7f\x71\x09\x16\x4c\xfc\xa3\x0f\xdd\xf3\x96\x9b\x9b\x7a\xc3\x8b\xb1\xd3\xa1\xc3\x9c\x8f\xfc\x2b\xc1\x47\xe2\x9d\x7d\x8c\x5a\x1a\x28\x48\x97\xa5\x5c\xca\x4c\xcc\xc5\x99\x49\x78\x06\x72\x6d\x98\xb3\xe2\xf8\x8e\xd1\x61\xe1\x4b\x9d\x19\x76\xbb\x10\xd0\x5d\x99\x7b\x17\x00\x54\xb8\xcc\xb9\x54\x2c\x77\x4b\x54\xf8\x1f\x1b\xf4\x25\x38\xf1\x5f\xf0\xd2\x2d\x70\xf0\x19\x80\x89\x3c\xd5\x3a\xa3\xd4\xe1\x6c\x55\x8f\x4f\xb9\xf7\x4a\xff\x53\x89\xdb\x7f\xba\xd1\x0c\x9b\x65\x7c\x1e\x5c\x05\x46\xd8\x35\x6f\x5f\x3d\xf4\x9d\x2f\x00\x79\xb9\x95\x60\x3c\xbb\xe5\x2b\x53\x3b\x4e\xe2\x3e\xe0\x2f\xd8\xf3\x43\x60\x67\x6e\x58\x18\x23\x65\x9f\x1d\x42\x2c\xf1\xe4\xf8\xf2\x9f\x57\xff\xb8\xfa\xe7\xf1\xe9\xeb\xf3\x8b\x7e\x27\x85\x7b\x77\xc1\x55\xa7\x31\x12\x5e\xf0\xa9\xcc\x64\x9f\x03\x62\x2d\xdb\x24\x1e\x14\x8e\xe0\x34\x3d\x4a\x4b\x5d\x20\x9d\xbc\x8f\xaa\x3e\x29\x9b\x56\x70\x5c\x99\x0c\xcb\x33\x6b\x0e\x38\x2f\xb9\xb2\xb5\xb3\xa6\x26\x79\x59\x29\x67\x58\x3f\xf2\xc4\x7c\x9e\x0e\x97\x94\x7f\x9c\xa6\x22\x6d\x50\xef\xc9\x25\x01\x9e\xf8\x97\x5b\xd5\x35\xda\xec\xf2\xcd\xd5\xf9\xff\xb7\xc5\x86\xab\xa2\x5f\xce\xd3\x30\x75\x61\xa5\x2e\x06\x5b\xdd\xb7\x54\x77\xb4\x5b\xdf\x07\xb1\xbe\xe1\xac\x1a\x26\xd2\xfe\xb6\x52\x4d\x18\x8f\x7a\x7c\x96\xeb\x54\x4c\xd8\x65\xf0\xd2\x37\xbf\x8d\xca\x7b\x79\x29\x98\xbb\x45\x59\xc9\xb3\x6c\x15\x2b\x48\x56\x63\x31\x4d\xa3\x32\x39\x96\xc3\x33\x9e\x99\x9e\xc2\xb4\xcf\xc9\xe4\x0e\xe1\xd7\xce\x98\x1c\x84\x9a\x61\x34\x96\x0a\xa5\x2d\x69\xa5\x6e\x96\x50\xac\x5d\xea\x84\xa1\xe5\x1a\xa5\x45\x35\x4e\x17\x83\x8e\x7e\x7f\x30\x49\xe3\x69\x75\x19\x46\x46\x2f\x6f\x65\x44\x5b\xbb\xa5\x83\xa9\xb6\x65\xdd\xe8\xa5\xe0\x29\xd4\xa4\x15\xdc\x2e\x30\xab\x21\xe7\xe6\x46\xa4\xf8\x01\xe9\x35\xc1\xcd\xef\x46\x0c\x8f\xba\x76\xf3\xf6\x3e\x7d\xd0\x67\x30\xd7\x02\x62\x01\xdd\x40\x37\xd8\x10\x5b\xc0\xbd\xd3\x1b\x95\xad\xde\x6a\x6d\x5f\x86\x5a\xac\x41\x16\xf0\x3b\xd2\x14\x9b\x6e\x58\x50\xa5\x20\x09\x21\x1d\x03\x31\x81\xa5\xe3\x32\xb0\xd3\x7a\xc1\xb6\xcc\xd0\x65\xa5\x8e\xcd\x57\xa5\xae\x3a\x9f\x00\x6b\x8a\xd6\x57\xe7\xa7\xb0\x8f\x2b\x8a\xb2\x29\x5b\xae\xa0\xea\x74\x1d\x30\x28\xe8\xb4\xdf\x50\x9c\x30\xe6\xc8\x3a\xa4\xc3\x5e\xf3\x15\xe3\x99\xd1\x5e\x39\x96\x6a\xa3\x01\x45\xd6\x99\xfb\x7a\xaa\xed\x62\xcd\x2c\x73\xec\xbc\xfe\xbb\x51\x14\x74\xab\x11\x8c\xa4\x5a\xfb\xb9\xe5\x37\xc2\xb0\xa2\x14\x89\x48\x85\x4a\x7a\xae\xda\xb6\x43\x4d\xb0\xf2\x17\x5a\xb9\x6d\x31\xc8\xda\x9f\x87\x18\x23\x38\xc2\x9a\x2b\x0d\xd1\x4a\xb2\x3b\x38\xc4\x2c\x61\x53\x54\x46\x94\x18\x60\x2d\x2b\x81\x0b\xf1\x75\x35\x15\x99\xb0\x68\x0c\x01\xee\x04\xb7\x68\x48\xcb\x9c\xcf\x05\xe3\x36\x30\x8a\xd5\x4c\x28\xe3\xc4\x0d\xba\xde\x2c\x4b\xb5\xa8\x0b\x28\xb9\x61\xdf\x9c\x9f\xb2\x67\xec\xc0\x3d\xeb\x10\x96\x7f\xc6\x65\x06\xe1\x4c\xcb\xcb\xf6\x1c\xe5\xcc\x0f\x01\x53\x02\xde\x63\xba\xc4\x2d\x3a\x62\x4a\x33\x53\x25\x0b\x3f\x27\x67\x71\x79\x83\x8d\xf2\xf9\xc0\xa9\xff\x04\x59\xb5\xb7\x80\xf9\xc6\x88\x72\x30\xf9\xf2\x4d\x07\xf9\x12\xab\x10\x8e\xe7\x9a\xd4\x43\xc6\xca\x85\xe5\x29\xb7\x9c\xe4\x4e\x5d\x75\xfd\x14\x97\x74\xdb\xd2\xc7\x88\x57\x52\x55\xef\x30\x63\x65\x38\x23\xff\xea\x0c\x86\x65\x89\x27\x1a\x2c\x1a\x2f\x8a\x4c\x62\xbd\x73\x2b\x83\xea\xbc\xb1\xd4\xa3\x3b\x54\x24\xd8\xe6\x3c\xcb\xb4\x13\x6f\xee\x64\xe7\x2a\xd5\xf9\xda\xc3\x9c\x02\x25\x1a\x40\x77\x13\xf6\x24\x99\x67\xeb\xee\x88\x4c\x2c\x45\x0f\x4c\x97\x36\x2e\x9f\x1b\xcd\xe9\x62\x7e\x41\x61\x78\x96\xf1\xa9\xc8\xf0\x64\x41\x06\x32\xeb\x0c\xb4\xed\x2c\xc4\x52\x67\xc3\xd5\x60\xbc\xd5\x99\xc0\xb4\x1e\x4f\x08\x37\xfc\xa3\xa0\x03\x0c\x32\x14\x1d\xc0\x90\x69\xd0\x01\x4c\xb2\xc7\x40\x87\xaa\xc7\x41\xcb\xda\x74\x70\xa7\x76\x93\x0e\x70\x74\x3e\x74\x3a\x18\x91\x24\x3a\x2f\x2e\x4b\xed\x4c\xae\xc1\x8e\x16\x1a\xb6\x8e\x15\xa1\x4d\xbe\x21\x09\x07\x44\x79\xf3\x66\x5e\x46\x09\x7d\xdc\xa2\x8c\xf7\x59\x7d\xff\x2b\xee\x90\xec\x44\x4f\xfb\x1c\xf2\xa3\x34\xc2\x4a\xee\x97\xf4\xc5\x23\x87\x13\xe8\xe1\x25\x1b\xe4\x30\xd1\x09\xcf\x00\x72\xaf\x1f\xc7\xb0\x36\xd7\xb4\x07\x8e\xb2\x30\x21\xb4\x04\x9f\xf9\xb8\x3f\xa0\xaf\xc1\x27\xe4\xfb\x52\x3a\x15\x51\x08\x12\xd3\x47\xaf\x31\x5b\x0f\xee\xf3\x09\xa0\xee\x54\xf7\xd1\xc0\xb4\xf1\x6b\xab\x09\x01\xe6\x75\x00\xf2\x73\x13\x14\x2a\x95\x6a\x0e\x1e\x9d\x11\x2b\x45\x86\xa9\xa3\xb4\x87\x6f\xd0\xfc\xda\x07\x8e\xf6\x83\x7a\x76\xf6\x8f\x06\x4d\x48\x6a\x45\x23\x83\x93\xc3\xeb\x37\x33\x94\x96\xd2\xb0\xbd\x57\x9e\x00\x3d\x90\xcf\x1e\xe2\x01\xb1\x87\x6f\x18\x56\x13\x7d\x6c\x37\x52\xa5\x94\x65\xd9\x20\x56\xc0\xa8\x45\x2d\x14\xf2\x77\x65\x1a\x8b\x86\x17\xec\x07\xc5\x02\xb1\xd8\xb8\x33\x7b\xbc\x45\x85\xd5\xbb\x97\xc6\xef\x77\xf9\x85\x87\xb4\x87\xf9\x46\xc1\xda\xbb\xe7\x8e\x9d\xd9\xbb\x7e\x9f\x7f\x97\xbd\x6d\xae\xeb\xad\x54\xa9\xbe\x35\x43\xdb\x10\xdf\xe1\xb0\x5e\xa1\x4e\x1c\x5b\x5b\xa9\xe6\x26\xb6\x23\x78\x96\x35\xdc\xb0\x9b\x0c\x09\xbf\xc2\x01\x91\x78\x5d\x81\x6f\x65\x87\xef\x8c\x80\x7b\x5c\xf3\xdc\xf0\x93\xd2\xbd\x8a\x95\x3c\xbb\x2a\xba\x43\xb3\xb1\x36\x1b\x7c\xf5\xfa\xea\xb8\x39\xb4\x93\x67\xb7\x80\x78\xed\x88\xed\xbe\x67\x3c\xcd\xa5\x31\xe0\x06\x12\xd3\x85\xd6\x37\xec\xc0\xa7\x6d\xcc\xa5\x5d\x54\xd3\x49\xa2\xf3\x28\x83\x63\x6c\xe4\xdc\x1c\x11\xd3\x8e\xdd\xec\x0f\x99\x54\x59\xc8\x46\x01\x33\x52\x59\xe3\xdd\x18\xf0\x90\x24\xcc\x02\xd6\x96\xf0\x3a\x29\xca\xbc\x3e\x4d\x44\xe8\x94\x22\xdb\x3e\xe0\xcc\xfa\xf2\x5c\xf4\xc4\xce\xf8\x85\x25\x82\x77\xa7\xd2\x94\xb8\x8c\x6a\x23\x1d\x51\x7b\xdb\x3a\x91\x48\x3b\x48\x84\x19\x0e\x95\xe7\xef\xf5\x98\x2c\x15\x58\x3d\x21\x20\xeb\x84\xdf\x99\xdc\x04\x5e\xd9\x7d\x28\xc2\xa3\x9f\xee\xc7\x1a\x2d\x44\x7d\xb0\xcc\xc3\xd9\x03\x59\xb1\xe0\x63\x34\x92\x9d\x48\x02\x19\xe6\x75\x80\x85\x56\x9a\x92\xd3\xdd\x29\xa8\x15\xb0\x34\x58\x0b\x18\x08\x82\x35\x21\x19\x1b\x4d\xf5\xa4\x8e\x0f\xc6\x31\x24\x28\xe2\x41\x10\x80\x7a\x0e\xb7\xd2\x2e\x3c\xc2\x7d\x23\xe0\x04\x33\x29\x85\x81\xe8\x81\x62\xa2\x2c\x75\x49\x89\x30\xde\x6b\x0b\x23\x81\x28\x86\x4c\x1a\xc7\x24\xdc\xfd\xb5\x6f\xe2\x10\x65\x0d\x81\x0b\x79\x62\x8e\x9b\xc4\x6c\x26\x12\xd0\x94\x62\x02\xa3\xd8\x3d\xa8\x91\xfb\x28\xbb\xdb\x31\x18\x41\xe8\xe6\xf2\x9d\x7b\x4a\xfc\xab\x38\x18\x4a\x88\x79\x9b\xbf\x3e\x9c\x30\x76\xae\x42\xe6\xe4\xc8\xad\x62\x7c\xa7\x4f\xf9\xb1\xee\x15\x63\xfc\x65\x78\x81\xd8\xef\xe4\xd4\xbb\xb2\x1a\x80\xe3\xfb\x38\x83\x59\xec\x10\x1e\x54\x1c\x80\x63\x98\x06\x75\x4b\xef\x0f\xf1\x3e\x8e\x62\x77\xcb\xc7\x72\x16\x3f\x8e\x93\x9e\xf5\x95\x73\x54\x12\x3f\x10\x28\xee\x55\x34\x5a\xa4\x7e\x87\x70\xd3\xa5\x4e\x11\x12\x23\x94\xf4\x43\x2f\x0b\x80\xe8\x90\xff\xf1\x0a\x56\xad\xa4\x29\x8d\x59\xd9\x31\x56\x06\x61\x82\xa6\xcc\xe9\xca\x99\xb7\xed\xf3\x22\x13\x50\x3d\x17\x8d\x5c\x17\x06\x46\x28\xba\xa3\x30\x91\x1a\x88\x97\x10\x3a\x46\xec\xdf\xb0\x29\x43\x02\xa0\x07\x0f\xb8\x0c\x3f\x47\x13\x4f\x1a\x0f\xa9\x0d\x95\x6d\x56\x7b\xd7\x01\x4b\xe5\x6c\x26\x7c\xa2\xa1\x33\xfd\x78\xc9\x73\x27\xe2\x0d\x23\x12\x4c\xc5\x5c\x62\x26\x5b\x10\x6c\xfb\xa6\xae\x80\x1f\xa1\x30\x94\x96\xe5\x72\xbe\x40\x46\x61\x1c\x2a\x23\x99\x0f\xa9\x65\x9a\xa7\x0c\x78\x5b\x97\xec\x96\x97\xb9\x3b\x37\x78\xb2\x80\xf8\x1c\x57\x2c\xad\x4a\x80\x89\xb4\x82\xa7\xab\xb1\xb1\xdc\x3a\x55\x57\x94\x64\x11\xfa\xf9\xef\xa0\x84\xdf\x7b\xed\xa0\x84\xef\xbe\x76\x50\xc2\x3b\x28\xe1\x1d\x94\xf0\xfb\xaf\x1d\x94\x30\x5d\xdb\xaf\xf6\x65\x3b\x28\xe1\x8e\xd7\xd3\x82\xb3\xd9\x41\x09\xdf\xeb\xda\x41\x09\xaf\x5f\x3b\x28\xe1\x3b\xae\x1d\x94\xf0\x1d\xd7\x0e\x4a\x78\x07\x25\xbc\x83\x12\xde\x81\xa2\xfd\xe2\x58\x0f\x13\x14\x8d\xed\xa0\x84\xe9\xda\x41\x09\x3f\x09\xe8\x27\xb6\x83\x12\xfe\xa0\x6b\x07\x25\xbc\x83\x12\xee\x72\xed\xa0\x84\xe1\xda\xf9\x5e\x76\x50\xc2\xfe\xda\x41\x09\xe3\xf5\xeb\xd1\x9a\x77\x50\xc2\x3b\x28\xe1\x1d\x94\xf0\x0e\x4a\xf8\xbd\xb3\xd8\x41\x09\x3f\x05\x7b\xd2\xd8\x54\x76\x42\x3e\xfb\x10\xa0\x0a\xca\x0c\x89\x4a\x5b\xa7\xd5\x6c\x26\x4a\x90\x5c\xf0\xe4\xb5\x2c\x84\x00\x68\x15\x64\x19\xe5\x19\x00\x2c\x5e\x29\x78\x4a\x09\xef\x77\xfc\x9c\x6a\x69\x01\xa1\xac\xce\xd4\x3c\x7b\xf3\x72\x18\x54\x8c\x7e\x39\x8a\x30\xe7\x37\x2a\xe9\x9f\xab\x56\x13\x7c\x53\x01\x06\xd1\x3d\xc9\xb4\xa1\x0c\x53\x20\x56\xb2\xe0\x4a\x09\x6f\x3c\x4a\x0b\x4e\x99\xa9\x10\x8a\xe9\x42\x28\x94\xdf\x9c\x19\xa9\xe6\x99\x60\xdc\x5a\x9e\x2c\x26\xee\x49\xca\x13\xbb\xce\x06\xa5\x4f\x8c\x2d\x05\xcf\x7d\x5e\x6c\xce\x25\x0e\xc5\x78\x52\x6a\x63\x58\x5e\x65\x56\x16\x61\x30\x66\x04\x24\xb4\xe3\x41\x15\x88\x01\xe9\x25\x75\x0a\xe9\xa8\x7e\x1a\x4d\x4b\xc7\xa0\x40\x60\xba\x8e\x00\x07\x35\x2f\xec\x2a\xe4\xd1\x09\x36\x93\xa5\xb1\x2c\xc9\x24\x9c\xd6\xf0\x44\xac\x1d\x84\xf1\x46\xfe\xac\x56\x34\x53\x43\x53\x55\x29\xa8\xad\x85\x35\x98\x95\x56\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\xc8\x1b\x24\xb4\x9f\x29\x90\xda\x9f\x2c\x38\x3a\x7d\x14\x0d\x17\xe1\xe4\xd5\x69\x7b\x35\xa3\x43\x8a\xb1\x67\xce\x51\x23\x9b\xba\x56\x28\x20\xdd\x65\x6d\x1b\xc0\x02\x28\xb1\x74\x3c\x20\x12\xe1\xce\x57\x7e\x07\xd7\x7f\x72\xa6\x8f\x0e\xc5\xd7\xc2\x18\x3e\x17\x97\x1d\xa3\x16\x77\x59\x64\x10\xb8\xa8\x17\x06\x58\x21\xc3\xf2\xb4\xf0\x49\x9d\xe6\xd4\x54\x83\x58\x8e\x73\x0a\xca\xcf\x6d\x29\xad\x15\xb0\xa8\x00\x8e\x04\x81\xcf\x76\x01\xea\x7e\x2b\x59\xea\xb5\x1f\xa4\xfe\xb1\x13\xea\x2a\xc5\xd4\xa5\xa9\x60\xd3\x52\x8a\x19\x9b\x49\xc8\x87\x82\x0c\xa5\x11\xc2\x7d\x70\xf4\x28\x18\xe3\xec\x5d\xad\xbc\x2e\xeb\xe7\x35\x61\xdf\xd1\xc4\x6c\x59\xa9\x84\x47\x20\x80\x50\xa2\x25\x67\x6c\x0e\x19\x4e\xa4\x2d\xfe\xf1\xd9\x5f\xfe\xcc\xa6\x2b\x77\xa4\x81\x66\x65\xb5\xe5\x59\x78\xc9\x4c\xa8\xb9\xa3\x15\x6e\xcf\x66\x91\x51\xa0\x00\xa0\x98\xe3\xc4\x9f\x7f\x76\x33\x6d\x9e\xb1\x47\xa9\x58\x1e\x45\xf4\x1b\x67\x7a\xbe\x09\x17\xbe\x7b\xca\x64\x47\x93\x68\x03\x9b\xe9\x4c\x26\xab\xde\x8c\xe6\x71\x67\xd8\x42\xdf\xa2\xae\xbf\x81\x7b\xea\x1c\xc8\x42\x17\x55\x86\x1e\xec\x97\xa1\x3c\xaf\x32\x62\xbd\x06\x67\xe3\xbe\x00\x9f\x2b\x0d\xd1\xc6\x8b\xc5\xc4\x36\xff\x48\x4d\xb9\xdd\xe4\x15\x0c\xf0\x33\x60\x08\xbd\xe4\x59\x36\xe5\xc9\xcd\xb5\x7e\xa5\xe7\xe6\x8d\x3a\x2b\x4b\x5d\x36\xe7\x92\x71\x27\x2d\x17\x95\xba\x41\xe4\xea\x50\x22\xac\xe7\x4e\xb5\x2a\x2a\xeb\x13\x89\x37\xbd\x30\x16\x9c\x7a\x21\xec\xcd\xa0\x7a\x14\xf1\x4e\xd6\xb6\x0e\x95\x4a\x20\x47\xc6\xe3\x9b\x98\xd9\x3e\x7b\xf6\xc7\xcf\x91\x75\x99\x2e\xd9\xe7\xcf\x20\xf9\xd1\x8c\x70\x13\x83\x6c\x73\x07\x45\xce\xb3\xcc\x99\x0d\x31\x53\x3a\x42\x6f\x62\xc2\x4f\xce\x83\xb6\x3f\xbb\x7d\xb0\x2a\x75\x7d\xfd\x0f\xd0\xa3\xa4\x35\x22\x9b\x8d\xb0\x2a\x20\x98\x35\xfb\x70\x30\xec\x93\xf4\x81\xd2\x8c\x07\xa0\x00\x2d\x75\x56\xe5\xe2\x54\x2c\xe5\x10\xcd\x2b\x1a\xa3\x79\x53\x3f\x93\x06\x0a\x30\xa6\x99\x4e\x6e\x58\x4a\x5f\x46\x69\x2c\x6d\x08\xd5\xee\x54\xe8\x9a\xd0\xd3\x23\x91\xe7\xce\xf7\x6f\xa4\xf0\xe4\xbc\x28\x42\x8e\x7e\xc9\x6f\x1b\xc4\x80\x3d\x09\xf5\xbe\x3d\xf1\x14\x7a\xbb\x99\xfb\x3a\x99\xc7\xf4\x46\x4e\x6e\x76\x1e\xa2\x73\x0a\x4b\x7f\x1f\x75\x3d\xfb\xee\x8e\xc9\x06\x43\xd4\x03\xfa\xdd\x50\xc0\xbf\x31\x3d\x7b\xad\x2a\x29\x14\xb6\x04\xc6\x40\x05\xc0\xb1\x0f\x88\xe4\xee\x0e\xd7\x01\xbc\x9b\xfd\xf2\x97\x1a\x74\x51\xc1\xab\x9c\x73\x4b\x0a\xa1\x77\x5f\x73\x56\x88\xd2\x48\xe3\xce\xe5\x6f\x61\x43\x9d\x64\x5c\xe6\x91\x0b\x70\x3b\x44\xc0\xcd\x0d\xc8\x97\xfd\x25\xe5\xa5\x4e\x69\x40\x10\x85\x88\xfa\xb9\x41\xad\x6d\x6a\xb5\x03\x1e\xa8\xdb\x16\x95\xdf\xd6\xd4\x6c\x4a\x4a\xf7\x49\x10\x95\x78\xd7\x53\x12\x90\xf0\x7e\x8f\x55\x3e\x86\xc9\x0f\x24\x06\x40\x30\xd2\xe2\x36\x25\x61\xc3\x78\xc4\x8d\x12\xa9\xf4\x64\x07\x4e\x18\x86\xd4\xdd\x9e\xa0\x9f\xb2\xfd\x17\xfb\x5b\x15\x92\x48\xa2\x52\x17\x7c\xde\xab\x87\x41\x8b\x52\xed\x61\xe3\x42\x6f\x67\x06\xc1\xf7\x01\x76\x08\xee\x12\x69\x0d\x44\x01\x30\x23\x18\x1d\xf5\x04\x26\x03\x01\xeb\x21\x6f\xf9\x8a\xf1\x52\x57\x2a\x25\xff\x52\x70\xf0\xbd\x6e\x3d\xf8\x42\x2b\xe1\x1d\xe7\xed\x3a\x71\xf0\xe8\x4b\xc5\x9e\x4f\x9e\x3f\x7b\x2a\x27\x15\xbc\x61\xeb\xa4\xba\x08\x27\x15\xca\xa7\xad\xbe\xab\x47\x3b\x1e\xe8\x7d\x5f\x93\x8b\xa5\x06\x33\x96\x1e\xac\x15\x3e\xba\x2d\xa5\x15\x51\x6f\xa3\x03\x30\x5c\x9c\x7d\x18\x55\x45\x1f\x0e\x88\xe1\x3d\x4c\x19\xba\xa9\xa6\x1f\x51\x6e\x91\x80\x82\xed\xb6\xc9\xc3\x65\xde\x23\xc2\x62\x42\xed\xed\xb1\x03\xbc\x73\x1f\x2b\x03\x0f\xb7\xca\x5a\x44\xb4\xb3\x77\x45\x0f\x8c\xb9\x06\xe1\xce\xde\x15\x1c\x7c\x70\xc5\x80\x14\xfc\x52\x2c\xf8\x52\x40\x45\xa4\xcc\x78\x99\x41\xcc\xf1\x0a\xe7\xce\xa6\x95\x65\x42\x2d\x65\xa9\x15\x24\xf8\x2c\x79\x29\x01\x95\xa2\x14\x50\x59\xed\x6c\xd1\xdf\x1e\x7c\x7b\xfc\x16\x12\x1a\x0e\xa9\x24\x9c\x66\x59\x19\x0f\x1f\x11\xcf\x24\x1a\xee\x17\x97\xcf\xcf\xc3\xd1\x10\x64\xae\x9f\x97\x7b\x4e\x5e\xd9\x0a\x01\xf1\xdf\x25\x59\x65\xe4\x72\x5b\x92\x84\x4a\x55\x4f\x65\xa7\x75\x6e\x95\xcd\xd6\x84\x5a\xab\x80\x05\xd7\x3a\x1c\x2d\xbf\x80\xc0\xba\x6f\x02\x66\x55\x1c\x03\x27\xd7\x13\xd5\xb2\x63\x2e\x9e\x87\x2c\x5b\x53\x21\x00\xb7\x61\xbb\x4e\x28\xa5\x53\x71\x7f\xd4\x8b\x66\x7a\x0f\x0d\x81\x31\xf3\xa8\x1c\xd0\x24\x0b\x91\x56\x00\xaf\x22\x0d\x82\x03\x3a\xf3\x81\xd7\x30\x56\x0a\xfa\x33\x9c\xcf\x42\x6d\xb0\x1a\x83\x73\x10\x69\xee\x7f\x5f\xfa\x4a\x62\xff\x81\x69\x8d\x08\x46\xa9\x1b\x6b\xc4\xb8\x31\x55\x8e\x5b\x02\xe1\xb7\x67\xd2\x9a\xd0\x5b\xcf\x6b\xc7\x6e\x63\xdc\xb3\x3a\xab\x07\x7d\xaf\x44\x06\xcc\xd5\x83\xc6\xfb\x17\xd1\x38\x48\x68\xe3\xff\x22\x86\xa3\x84\x09\x88\xb6\x85\xa4\x50\x0d\x5e\xd2\x99\x84\xf6\x15\x9c\xe8\x7d\xb5\xe1\x97\xa8\x3a\xe0\x1d\x00\xcf\xc0\xa7\x22\x33\xed\x81\xa6\xf5\xa2\x10\xac\x1f\x11\xbe\x67\x77\x40\x6e\x8c\x9c\x2b\xe8\x1b\xe6\x46\xbb\x67\x87\xb0\xce\x36\xd3\x10\xdd\xff\x3a\x4b\xb5\x46\x16\x56\xce\x8b\x31\x59\xbd\x56\xe7\x32\xb9\xc7\x48\x7a\x29\xca\x85\xe0\xf7\x34\xf8\x5a\x71\x31\x1a\xa3\x6e\x1d\x63\xa8\xca\x91\xf6\x8d\x7f\x88\xdb\x5f\x3a\x81\x6c\x7b\xf4\xd3\xfb\xec\x27\x0e\x2c\x82\x8d\x29\xe7\x72\x29\x94\x07\xfe\x3b\xc9\x78\x68\x3e\xe6\xa1\x92\x08\x7c\xb0\xb2\x3a\x44\x3e\x9c\x39\x55\xa3\x97\x41\xa0\x94\x9c\xae\xf1\x38\xd1\x2d\xd4\xba\x2c\xf3\x60\xfd\x1f\x72\x27\x04\x1f\xb0\xf5\xc7\xa8\x7e\xa5\xdc\x1b\x68\x0d\x78\x1c\x96\x40\x88\x2c\x74\x05\xc5\x40\xc4\x2f\x3f\x82\xe2\xda\x8e\x17\x37\x0d\x43\x7b\x2e\xe0\x38\xd5\x84\xcd\x9c\xf2\xba\x62\xd0\x5c\xe2\x7c\xd6\x7c\x92\x6c\x40\x5f\x42\x36\x36\xec\xe1\xfa\x50\xb9\xd4\xe9\x55\x21\x92\x11\x0b\x4b\x19\x77\x6e\x23\xa7\x0d\xa6\xb6\x44\xf8\x8d\x78\x1c\x95\xa5\x30\x85\x46\x04\xce\xf8\xb1\x71\x83\x50\x69\x1b\x11\x7b\x6c\x44\x00\x16\x5a\x8d\x95\xf0\x1f\x51\xea\x8d\x82\x60\x2e\xed\xe4\xe6\x73\x90\x02\x42\x2d\xb8\x4a\x50\x00\x1f\xdd\x88\xc2\x1c\x19\x39\xc7\x4d\xff\xe7\xcf\x3f\x07\x09\xe0\x49\x72\xf4\xf6\xec\xf8\xf4\xf5\xd9\x24\x4f\x37\x18\x71\x1e\xeb\x0b\xc2\x62\x5f\x87\x8d\xc4\x96\xcf\x27\xcf\x3f\xc7\xb8\xbd\x34\x08\x40\x12\xc1\x7f\x61\x4d\xda\x3a\xf6\xd7\xa5\x4e\x03\xdd\x28\x6f\xeb\x9e\xd1\xc8\xad\xca\xa0\x47\xd3\x77\xb4\x63\x46\x6d\xdf\x2c\xda\x5e\x99\xb3\x03\x66\xcb\x16\xa5\x70\xea\x8d\xd4\xaa\x4b\x9c\xb9\x69\xdf\xb5\x86\xf2\xce\x7b\xfa\xcb\x09\x62\xff\x34\x35\x77\xb2\xd9\xa0\xbc\xce\xf4\x2d\xe4\x86\x48\x5d\x4a\xbb\x9a\x00\x54\x8f\x9e\xb1\x0b\xb1\x14\xe5\xc8\x8f\xfa\xca\xdd\x74\x19\xee\x89\x0d\x88\x4d\x77\x44\x5d\x71\xee\xda\xa8\x23\x36\x8f\xd3\x10\x2e\xb4\xba\x0c\xb3\x0b\xc3\xd0\xce\x1b\x43\xc6\xe4\xa7\x50\xce\x3c\x19\x7a\xac\x03\xa2\x1f\xd3\x0b\x50\xa3\xe4\x6f\x79\x29\x75\x65\x18\xfa\xc4\x63\xcc\x41\x8c\xa3\x07\x12\x81\x6a\x46\x5e\xae\x30\x48\x48\x8f\xf7\x8e\xae\x40\x9f\xe3\x70\xde\x9c\x6c\x3e\xd2\xa4\x75\x8b\xbe\xf4\x8f\x2a\x7d\xbe\xcf\x1a\x5c\x21\x1e\x66\x1b\xcf\x2f\x7f\x22\x9b\x78\xa2\x30\x8c\x9f\x07\x9c\x0d\x4e\xe1\xc7\x51\x16\x72\xee\xb3\xca\xe0\xfd\x51\x77\x8f\x3e\x0d\xcc\xd6\x61\x49\xbb\xec\xf8\xae\xc9\x8d\x45\xfb\xfd\x7a\xb0\x45\x13\xd4\x2d\xc6\x85\xf3\x69\xd5\xf5\x16\xdc\x43\x3e\x81\x43\x70\x9c\x94\xd2\xca\x84\x67\x7b\x70\x84\xf9\xaf\x9c\xed\x6d\x45\x19\x7f\x5b\x0a\x66\x6f\x35\x3e\x85\x67\xec\x46\xac\x6e\x75\x99\x7a\xfd\xc2\x3f\xb1\x5e\x0b\x63\xfd\x23\xa5\x20\x59\x80\x90\x5c\x65\x2e\x4a\x36\x15\xde\x8d\xd0\xba\x79\x35\x61\xc7\x6a\x45\x3e\x58\x15\x57\x5a\x78\x35\x62\xba\x42\x1d\x07\xb5\xc0\x06\x93\xd0\x79\xe8\x9f\xc6\xb1\x06\xe6\x2e\x13\xdb\x29\x90\x61\x17\x78\xed\xc5\xdb\xd8\xba\xa4\x54\x6f\xd8\x1d\x25\x26\xaa\x6b\xff\xf5\x27\x91\x16\x4e\x3f\x93\x4a\x18\xf3\x95\x5b\xca\x3e\xea\x76\x93\x3b\x38\xa8\x55\x34\x36\xc8\xc9\x3a\xaf\x4a\xb8\x2d\xc5\x7d\xcf\x77\x47\xa1\x70\xe7\x84\x1d\xc3\x07\x90\x18\xe8\x34\x47\x28\x25\x70\x83\x39\x8b\xb7\xd5\xdb\x10\xef\x38\xbe\x38\xf5\x09\x5c\xa8\x74\x98\x26\x66\x23\xaa\xfc\xcd\x99\x80\xa6\x4a\x69\x44\xe2\xa7\x8a\x43\xab\xaa\xbd\xeb\xb2\x12\x7b\xdd\x54\x3d\x44\x03\x3d\xfa\xd3\xe7\xcf\x40\xdb\x0b\xcf\x03\xb1\x7f\xcf\xac\xe8\xae\x81\xc2\x4e\x21\xc2\x76\x74\xf4\x6d\xcc\x0f\x9e\xe0\xde\x6e\x22\xcf\x1d\x14\x38\xc1\x32\x05\x9a\x77\xb2\x2f\x3b\x05\x04\xbb\x87\x02\xc7\xf5\x74\xaf\xef\xdf\x09\xa1\x4f\x14\xaf\xf1\xdc\x21\x5c\x7d\xf5\x68\xb8\x2a\xd8\x68\xb9\x7e\x4e\x14\xb4\x47\xbc\x5d\xfa\x18\x72\x82\x40\x70\x81\x6b\x04\xc4\xe3\xaa\xe8\x91\xff\xd4\x41\xde\x40\xba\x6f\x6f\x55\x71\xff\x2d\x0e\xc4\x8a\x5a\x37\x5c\x4b\xe3\x0c\x6e\x6e\xd0\x3b\x48\x2b\x3c\x86\x9c\xf8\x11\x7b\xa3\x5e\x62\x92\xe0\x08\x15\xc5\x46\x3d\x37\xde\x34\x68\xad\xc4\xd1\x6f\xe8\xdd\xc7\x38\xe5\x2e\x42\xe1\xfe\xe4\x8e\x2c\xdf\x9e\xa7\xff\xfe\xdb\xd6\x58\x0d\xd6\x6b\x58\xf6\x74\x42\xca\xba\x83\x02\x89\x4f\x36\x2f\x75\x55\x78\x77\x72\xb3\x1d\x42\x0d\x21\x8c\x5e\x50\xec\xd5\xa5\x74\x73\xe8\xe0\xbc\x01\x06\x16\x35\x0a\x79\xca\x12\x34\xef\xfd\xa9\x8b\xa9\xe0\xe8\x01\x29\x2b\xd5\x6c\x35\x18\x39\x64\xf7\x32\x31\xe7\xc9\x6a\xaf\xf9\x9c\x4d\xee\x6f\x09\x19\xca\x32\x47\xf8\x45\x7c\x5e\x9d\xd8\x09\xf9\x9f\xa0\x3f\xe0\x5e\x03\xd5\x20\xf4\x83\xf5\x47\xbe\xaf\x4c\x58\x70\x95\x82\x9b\xa7\xb3\x67\xe1\x4f\x9f\xff\x69\x4c\xa3\x8d\x71\x2a\xed\x1a\x2f\xaa\xd5\xda\xe8\x4e\xf8\x63\x27\x57\xc0\xbd\xf9\x2f\x78\xbb\x07\x55\x3d\x1b\x4b\xec\xf4\x29\x69\x0a\x60\x07\xf4\x87\x84\xd3\x3f\x3c\xfd\x7d\xda\xd9\xe6\x41\x42\x0f\xfa\x30\xc4\x27\x21\x57\x13\x5f\xba\xcf\x6e\x6d\x43\x55\x2f\x74\x96\xc2\xbe\x22\x27\x93\x7f\x14\xe3\xd6\x96\x72\x5a\x41\xb7\x1c\x95\x02\xd4\x69\xb3\xce\x84\xba\x72\x4c\x58\x5d\x68\x10\x1b\xcf\xc0\xf8\x13\xc6\xae\x04\xb5\x54\x8e\xe6\x01\x62\xd9\x93\x12\x0c\x29\xe0\x45\x68\xde\x87\x36\xdb\x27\x72\x48\x75\x3f\xbd\x67\x5d\xbb\xf6\x36\x3b\xd9\x1c\x07\xa3\xc6\x54\x05\xa1\x1e\xf0\x0c\xe5\xe1\x5a\x8f\xaf\xd6\x41\x06\x29\x58\x20\x11\xaf\x74\x1e\x62\xb6\x8e\x16\x06\x41\xfa\x80\x97\x7d\x3f\x57\xab\xa1\xbe\x69\x4e\xae\xd8\x5b\x37\xc4\x42\x16\x68\x82\x73\x1b\x7e\x0e\x81\x0f\xf7\x75\x5c\xae\x0a\x1d\x72\x9e\xa3\x0d\xac\x6f\xc1\x09\xfe\xd5\xf9\x69\xd8\x23\xee\xae\x97\x57\x40\x10\xf6\xd9\x84\xda\x75\xd9\xb9\x4c\xd9\x14\x83\x5d\x4e\xbc\x1e\x28\x71\x8b\xe9\x73\xe4\x27\x0e\x6a\xf8\xd2\xa7\x95\xe1\x68\xe1\xe1\x34\xe4\x21\xfb\x03\x75\x5e\x12\xa5\x37\xe2\xa7\x92\xd2\x6b\xde\xbc\xdd\xf7\xde\xf9\xdb\x71\x79\x3b\x1e\x8f\xc7\x6e\xae\x5e\xa8\x6f\xe8\x69\xeb\xf6\x7b\xae\x53\x39\x5b\xb5\x28\xe1\xd8\xbc\x7e\x04\x70\x24\x57\x2b\x9a\x5d\x87\x56\x3b\xfd\xfc\x78\x7d\x2a\x50\x89\x39\x4f\x60\xbd\xbb\x96\x79\x34\xe5\xc6\x86\x21\xc9\x2a\x36\x6c\x2a\x16\x7c\x29\x35\x14\xa6\x02\x8f\x41\xc2\xe0\x1d\x74\xf5\x3e\x1f\x5a\x74\xc2\x3a\x42\x9b\x5c\xbc\x2b\x34\x22\x29\x42\x42\x2e\x34\x89\x68\x07\x53\xc0\xcd\xed\x36\x05\xe4\x15\x34\x98\x9e\xd4\x07\x44\x13\xf1\x44\x60\x53\xee\x86\x0c\xd3\x39\x68\x2d\xf3\xe1\x84\x9d\x13\x67\x80\xf9\xa7\x34\xb5\x9a\x60\x5a\x31\x51\x2c\x44\x2e\x4a\x9e\x35\x1f\x44\x85\x49\x2f\x9c\xb4\x2c\x1d\x93\x61\xc0\x22\xe7\x05\x0a\x4b\x90\x7d\xa9\x2c\x7d\xaf\x29\x12\x71\x8e\x5f\xf7\xde\x40\xc7\xe7\xd7\xd2\x80\xa6\x42\xae\x0f\xd4\x2b\xf7\x36\x9d\x47\xfe\xbb\x90\xe5\x75\xff\xca\xa1\x1e\x0e\xe1\x3e\xfd\xc9\xb7\xd4\x99\x7c\xdb\xbd\x5d\x29\x8e\xcc\x6d\x9f\xf4\xd8\xed\xc9\x8e\x7e\x7d\xc9\x77\x1d\xc9\x3f\xa4\x23\xf9\xb6\x59\xb4\x2b\x3f\x76\x4b\xfa\xeb\xd1\x82\xfc\x41\x36\x1f\xdf\xf6\xea\x3d\x72\x01\xd3\xb7\xf5\xf8\xfd\x9b\x8e\x7f\x48\xb3\xc0\x8f\xde\x75\xfc\x09\x71\x4d\xc7\x8a\x8d\x7e\x05\x0f\x3d\x7a\x8e\x6f\xb5\xdb\x78\xcf\xc4\xdf\xee\x1d\xc6\xb7\xda\x5b\xbc\xe7\x5b\x77\x6f\x17\xbb\xd5\x4e\xe2\x3d\xdf\xba\x7b\xf7\xf0\xad\xf6\x0d\xef\xf1\xd6\x7d\x7b\x85\xdf\xab\x4b\xb8\x68\x39\x4f\x82\x47\xf9\xd3\x8a\xc1\x3e\x45\x6b\x1d\x9b\x75\xf7\x94\xbc\x83\x34\xe8\xde\xb5\xe6\x1e\xb2\x35\xf7\xc3\x90\xaf\xbb\x46\xdc\xfd\x1a\x71\xf7\x91\x9c\x91\xbb\x18\xfc\x33\x7d\x35\xe9\xe3\x80\x0c\x01\xce\xe7\x46\xb7\xed\x1a\x3d\x8a\x8c\x2a\xea\x6a\xd6\x52\x7c\x47\xb0\x3a\x94\xe3\xb9\x76\xb8\x60\x1e\x50\xce\xcb\x15\xfb\xea\xfc\x14\xf5\xdf\x86\x1a\xae\xb4\x7f\x74\xe0\x94\x94\x00\x82\xb8\x5a\xf5\x57\x5b\xbb\xd5\x58\x77\xae\xb0\xee\x8b\x5d\xd7\xcb\xc6\x5a\x99\xc4\x66\x7d\x59\xe2\x0a\x47\x81\x18\x11\xe3\x81\x3f\x14\xcf\x85\x29\x78\xe2\xa4\x1f\xdd\x01\x81\xda\xa8\x7e\x62\xe2\x2c\x17\x0a\x82\x56\xaa\xc6\x77\xf6\xf7\x1f\xb4\x0f\x64\xbf\x25\x0f\xa9\x98\xc8\x7b\x65\x32\x5e\xa9\x64\xf1\x48\x56\x7c\x03\xf1\x82\x8f\x9c\xb3\x1b\x51\x2a\x91\xd5\x3d\x43\x7d\x8d\x89\xe8\x52\xfb\xde\xb3\x74\xbe\x5f\xe1\x7c\x8f\xa2\xf7\xee\x2d\x80\xfa\x96\xcb\xf7\x29\x42\xde\xd0\x17\x65\x86\x67\x93\x9b\xd2\x8a\xda\x65\x75\x1c\xbc\x77\x65\x68\xaf\xa6\x3e\x4d\x14\x08\x84\xb0\x7d\x10\xef\x46\x8d\xfa\x87\x73\x13\xf9\x96\xd4\xa1\x20\xcf\x47\xb0\xef\xeb\x2a\xf2\x0a\xcb\x3a\x0c\xc6\xbe\x59\x73\xc3\x34\x31\x83\x1f\x87\x9b\x77\x2b\xfe\x9d\x79\x6e\xf8\x49\xe9\x26\x6e\x25\xcf\xae\x8a\xae\xed\x79\x1b\xeb\xfe\xd5\xeb\xab\xe3\xe6\xa0\x4e\xfb\xbe\x85\xa4\x5a\x47\x54\xf7\x7d\x94\x1a\x7e\x2b\xa6\x0b\xad\x6f\xd8\x41\x94\x72\xb3\xa8\xa6\x93\x44\xe7\x51\x7e\xd7\xd8\xc8\xb9\x39\x22\xfe\x1c\xbb\x79\x1f\x32\xa9\x00\x8c\x6d\x1d\xc4\xce\x3f\x24\x09\xb3\x80\x35\xa4\xdc\x24\x3a\x06\xd7\xa7\x09\x42\x06\x53\x21\xb6\x61\x1f\xac\x2f\x46\xf7\x6e\xf1\xbf\xb0\x20\xbe\x9a\x36\xc6\x1c\xba\x93\x6a\x68\xce\x6f\x85\x24\x8b\xba\xed\xff\x00\x74\xf8\x7b\x3d\x5a\x8c\x1d\x22\x67\x0d\x58\xd3\xda\xce\x08\x81\xb2\x7d\x68\xaf\x40\x3f\xdd\x8f\x9d\xce\xcd\x72\x14\x9e\x15\x8b\x50\x38\xa6\xe2\xd8\xf9\x54\xc4\x55\x62\x51\xc1\x46\xbb\x50\x8c\x04\x66\x34\xd5\x93\xda\x7f\xe2\xb3\xc8\x66\x19\x9f\x03\x3c\x7b\xab\xea\x02\xa4\x23\xb4\x20\x76\xb6\x43\x74\xb3\x2f\xad\xf3\xd0\xc3\x80\x7c\x68\x30\xa1\xdb\x07\xd2\x28\x3d\x1f\xe2\xff\xc7\x6e\xde\xbe\x97\x7a\x23\xd7\x1b\xac\xfc\x50\x5c\x68\x1c\xef\x60\xe4\xde\xd9\xec\x31\x81\x51\x74\x1e\xd4\x3d\x99\x21\x3b\x06\x05\x3e\xfc\x9e\xb3\x5c\xbe\x73\x4f\x89\x7f\x15\x67\x95\x53\x2f\xe4\xcd\x5f\x1f\x3a\x5b\xa6\x36\x7c\x46\x6e\x15\xe3\x3b\x23\x58\x60\x05\x5f\x5c\x60\x5a\x38\xbe\x40\x1c\x26\x20\x84\xdf\x3e\xfc\xdd\x1d\x97\x23\x84\xe9\x06\xda\xea\x10\xae\xa3\xe1\xdc\x42\xfb\xf3\xb7\x4f\xf8\xce\xdd\x32\x44\x08\x6f\xfd\x90\x7d\xf8\x67\x33\xeb\x93\x3f\x58\x2e\x65\x22\x8e\x93\x44\x57\xaa\x57\xfa\xe0\xa9\x70\xaf\xc0\xad\x48\xaf\x1a\x63\xa2\xbf\x39\x85\x6f\xb1\x62\x9a\x67\x92\x63\x4d\x7d\xf3\x4e\x2c\xa6\xaa\xc7\x01\x7f\x75\x6b\x86\xc4\x32\xd8\x6e\xf7\xd3\x24\xa4\xae\x3d\xbf\x5f\x92\xe5\xfa\xdb\xac\x9f\x70\x2d\x0a\x92\xab\x7a\x2d\xdd\xf9\xc3\x72\xcd\x2d\x37\x37\x35\xd2\x80\x80\x72\x93\xb0\x99\xa2\xcf\xe9\x45\xc7\x1c\x9f\xda\x09\x7d\xa0\x03\x75\xad\x93\x7b\xee\xe5\x8f\xcd\xcb\xff\x3e\xbd\xe8\x97\xf2\x1b\x40\xd6\xb1\x8e\x61\x41\x43\x07\x5d\x3b\x2e\x1f\x8f\xcb\xd0\xdc\x93\x47\xac\xe4\x84\x1f\x4b\xbd\x43\x32\xc1\xd1\xa7\xc1\x0e\xa2\x8c\xec\xc3\x89\x93\xe9\x75\xa8\x17\x45\x3d\xb5\xfa\xc8\x05\x57\x26\x2a\x35\x14\x30\xb4\x4f\x67\x0c\xf3\xc1\x83\x90\x56\x9b\xcc\xff\x03\xef\xb3\x6c\xde\x81\xad\xff\x59\x65\x8d\xfb\x1c\x1f\xee\x05\xe6\x07\x3c\xbe\x14\x73\x69\x6c\xb9\xf2\x4d\x48\x66\xd1\x24\xc8\x2b\x13\x6e\xb9\x11\x2b\xf6\xf7\xaf\xcf\xfe\xf1\xcf\x57\x6f\x4e\x8e\x5f\xfd\xf3\xf5\xf1\xc9\xdf\xcf\x2f\xce\x7e\xf8\xe1\xea\x1f\x57\xd7\x67\xaf\x7f\xf8\xe1\xa4\x2a\x4b\xa1\x2c\x95\x5d\x5e\x09\xfb\xc3\x0f\xc4\xa9\xe6\x87\x1f\xae\x93\x42\x16\x3f\xfc\x70\xe9\x9d\x18\x08\x2f\xfc\xdf\xa7\x17\x20\x3f\xb1\xfa\x27\xa4\xdc\xc0\xd9\x8a\x44\x87\x79\x2f\xb8\xa9\xd3\xeb\x1a\x75\x15\x1d\x20\xa9\xba\x1e\x77\x66\xc1\x4b\x41\x47\xf3\x85\xf7\x64\xf5\xda\xec\x6e\xc0\xba\x2f\x80\xf7\x90\x06\x2f\x19\x9b\x0a\x7b\x2b\xa8\x5c\xad\x7d\xcc\xc5\x59\xbc\xdf\x61\x7b\x1c\x4c\xd6\x77\x47\xd1\x06\xec\x71\x54\xce\x34\x5b\x4a\x71\x8b\xd8\x08\xd8\xe6\xa5\x06\xc0\x87\xf2\x55\x2c\x61\x6c\x87\xbb\x48\x49\x2a\x74\x1a\xc0\xfe\x5b\x6e\xdd\x35\x97\x6e\xa3\x5c\x02\x91\x4b\x44\xca\x2e\xcf\x4f\xd9\xf3\x09\x2a\x39\xe7\xa7\x08\xa4\xb4\x89\xac\x2c\x21\xb4\x1f\x77\xa0\xe2\xe9\xbb\x21\x5d\xbc\x66\x80\x2e\xc2\xa8\x03\x07\x54\xd3\x54\xe7\xfc\xbe\x6d\x3d\x7e\xa1\xf0\x00\x9b\x2e\xfd\x54\xf1\x0c\x75\x80\x4b\x9d\xae\x4b\xa6\xbd\xbf\xfa\x8f\xfe\x36\xf9\x6b\x98\xc7\xdf\x26\x7f\x85\x76\x4e\x9e\x6c\x7f\x9b\x98\x65\x32\xf9\x2b\x15\xc2\x32\xba\x69\x63\x76\xe8\x5a\x55\x0b\xe9\xb3\xf8\x1b\x78\x36\x07\x7d\xf7\x93\xd4\x29\x0c\xd8\x17\x6b\xe0\x6e\x58\xa8\x05\x42\x8d\x6d\x52\x0a\x4e\xed\xda\x53\x91\x09\x1b\xf5\xb7\xdf\x7a\x3b\xa6\xbb\xfb\x53\xf9\x50\x55\xa3\x7b\x57\xec\x5c\x0a\xfa\xd2\xaf\xbe\xc9\x57\x6c\x30\xfc\xa1\x6e\xc0\xda\x61\x03\xf4\xac\xc8\xbf\x57\xd8\xc6\xea\x4c\xe0\xfa\xf4\xd9\x29\x1b\x0b\xa2\xf6\x4d\x3c\x7a\x17\x42\x6c\xa3\xea\xf8\xda\x43\x71\x39\x8e\xb8\x0e\xf3\x07\x4b\x03\x9b\xd7\x60\x6c\x12\xbf\x81\x32\xa5\x15\x73\xa7\x96\x45\x4f\x46\x5c\x09\x68\x4b\x68\xb3\xf3\xd7\x1b\xb1\x1a\x21\x70\x03\x2a\x21\x7f\x8b\x30\x05\x43\xe9\xab\x2e\xdc\x80\xba\x64\x7f\xf5\xff\xfa\xdb\x7d\xad\xb5\x1e\x7e\xd4\x3e\x5e\x54\x7c\xa9\xde\xa1\xab\x33\xac\x7f\x68\x22\x39\x20\x65\xa9\x34\xc2\x6a\x24\xd7\x84\x9d\x41\x7d\x23\x6a\xa4\x84\xab\x96\x65\x8d\x9b\x8d\xef\x91\xd4\x40\x01\x00\xff\x4b\x54\x17\x71\xa1\xaf\xa8\xa4\x0e\x90\x59\x66\xa2\xac\x3f\x01\x01\x73\xa1\xcf\xde\x89\xa4\xba\x2f\x5a\x0a\x5e\xbd\x7c\x7f\x37\xa2\x7f\xd7\x8a\xaf\x45\x40\xad\x41\xda\x38\x2d\x3c\x64\xc5\xd7\xbb\x33\x4a\xcd\x7a\x3f\x6d\x6f\xc4\xca\x04\x30\xb0\x1b\x1c\x9d\xaa\x57\x03\xff\xfa\x83\xec\xec\x9d\x34\xd6\xfc\x6f\xdf\x32\x23\x9f\xd6\xcd\x4a\x38\xe6\x48\xd5\xa3\xfb\x25\x51\xd0\x4b\x03\x1f\xf3\xa9\x09\xee\x5f\xa0\x37\xd5\xdf\x78\x4a\x44\x50\x6f\xdc\xbd\xd3\xbe\xa1\xec\x1e\xad\xa0\x44\x29\xc6\x0c\xab\xf3\x52\xf0\xc7\xc8\x9f\x48\x43\xa0\xcb\x99\x53\xf2\x9a\xc7\x0c\x7d\x44\x37\x49\x40\x8f\x90\x4b\x9e\x09\xb4\xeb\x6f\x65\x96\x26\xbc\xc4\x10\x39\x01\xc7\x18\x82\x72\x24\xc4\x04\x77\xc6\x91\x24\xab\x57\xd9\x50\x2c\x8e\x97\x56\x26\x55\xc6\x4b\xe6\xf6\xe3\x5c\x97\xf7\xc4\x97\xc1\xab\x5f\xeb\x96\xc0\xa2\x3d\x3a\x1a\x36\xe5\x7b\x7b\xc4\x36\x20\x1f\x69\x2f\xce\x64\x82\xda\x8e\xe6\x46\x39\x68\x42\x41\xea\x99\x97\x4d\x41\x50\xc4\x90\x6e\xb6\xe1\x1c\x97\x73\xf0\x7f\x1f\x46\x87\x47\xd8\x99\x13\xf6\x65\x28\xf3\x1d\xb1\xda\x67\x0c\xc5\x84\xf4\x4c\xda\x36\xb4\x5c\xf5\xa6\x9e\xe9\x12\xfa\xf0\x1c\xa4\x1a\x7e\x23\x96\x32\xb1\x87\x13\xf6\xff\x73\x9a\x22\x38\x91\xbd\x3a\x49\xdb\x2c\x14\x50\xd6\xc0\x72\xcf\xd8\x01\xfc\x2c\x56\x25\x0f\x7d\xa0\x88\x3a\x0f\x3c\xb2\x6c\x94\x1e\x21\xea\x0d\xe1\xe9\x86\x18\x45\x4d\xb1\xc5\x1a\xe1\xe4\xd7\x41\x42\x06\x99\x28\x0d\xed\xd2\x86\xe7\x36\xc4\x59\xbc\x08\x0d\x8c\xf3\x6f\xf0\xd1\xb3\x52\xcc\x61\xff\xe1\xee\xf9\x84\xbb\xcf\xea\x42\x67\x7a\xbe\xba\x2a\x4a\xc1\xd3\x13\xad\x8c\x2d\x41\x34\xf4\xc1\xf1\xba\x6b\xcc\xa8\xf5\xc3\x42\xdf\x32\x4e\x75\xc8\x7a\x86\xa0\x6a\xba\x9a\x2f\x10\xec\x16\x7e\xe8\xdb\xa4\xf9\x29\x92\xd1\x69\x26\xec\x2a\x80\xd9\x02\x83\x07\x6c\x5c\x18\x05\x1c\x1e\xb7\x7c\x45\x9b\x89\x4f\xa1\x5b\x6e\x9d\x10\xe4\x27\x83\xa1\x9f\x3b\xdf\x1f\xa4\xf2\xf1\xc5\xe9\x7d\x11\x84\xb7\xa8\xd0\xde\xf1\x2a\x51\xef\x7c\x68\xa1\x16\xe8\x1b\x34\x52\xa0\x1b\xcf\x35\x69\xaa\x88\x39\xea\x29\xf3\x09\x75\xd3\x3e\x20\x3b\x39\x7f\x77\x75\x23\x6e\x3b\xfc\xd2\xbf\xe8\xd7\xe2\xfe\xb9\x5c\x63\xb0\x47\xbf\x51\x86\x5b\x69\x66\x00\x35\xfe\x09\xf5\x71\x48\xb9\xef\x86\x88\x8c\x57\xb3\x72\x25\x1e\x2d\x74\x4b\xf6\xb8\x7a\x0d\x66\xa1\xfc\xbb\xda\x0e\xc2\x03\x10\x4b\x00\x02\x98\xb2\xdb\x41\x09\x35\x18\xb0\xba\x8e\x43\x63\xa4\x22\xf4\x1a\xf6\xbb\xd6\x2e\x84\x2c\x5b\x10\xaa\xad\xbd\xdf\x5d\x30\x76\x4e\x65\xeb\x9b\x17\x06\xe4\x39\x7b\xe7\x34\x0f\xd3\x2d\xd3\x08\xaf\x66\x7f\x90\xd6\xa0\x18\x1e\xf3\x09\x94\xad\x65\x68\xe0\x74\x83\xd9\x1b\x7f\xd2\x55\xce\xd5\x57\xbf\x0e\x43\xac\x5f\x97\x21\xb6\x21\xcf\xf8\xce\xd7\x6f\x81\x7d\xc7\xd5\x6a\xe4\x14\x32\x23\x54\xe0\xd1\x81\xcd\x55\x7d\xb0\x53\xe3\xd7\x2c\x68\x73\xce\x28\x72\x37\xe1\xef\xfa\x42\xf9\xf7\xe8\x52\xc4\x06\xe8\x54\xc4\x40\x96\xdd\x74\x90\x80\xf1\xef\x3d\xb1\x3a\x0f\xd2\xbf\x67\x11\xeb\x6e\x50\xd7\x57\x83\xa1\x6e\x6a\xd3\x1a\x39\xab\x61\x5a\xd7\xc2\xae\x36\xac\x7b\x3d\x7b\x80\x46\x1e\xac\xa7\x8d\x5b\x5f\x0d\x42\xe8\x7b\x58\xbb\x1c\x02\x4c\x7a\xe6\x77\xc7\x46\x9b\xf7\x5c\x8d\xd8\x85\xb6\xee\x3f\x91\xf9\x7b\xaa\x85\xb9\xd0\x16\x3e\x79\x10\xa4\xc4\x57\x18\x90\x90\x64\x9c\x21\xae\x17\xc8\x4d\x0a\xd1\xba\x13\xcf\x13\x6c\x83\x61\x71\xae\x98\x2e\x3d\xc5\x82\x75\x61\x68\x88\x38\xac\x40\xe0\x48\x77\x1a\x27\x6e\x9c\x98\xce\xef\x19\x8e\x86\x82\xec\x2f\xfc\x06\x40\x32\x8b\x0c\x12\xf4\xd3\xaa\x44\xac\x52\xa7\x6b\x5a\x31\x97\x09\xcb\x45\x39\x87\xc6\x87\x5d\xf2\xea\xe3\xab\xff\xb9\x82\x57\xcf\xd3\x25\x9e\x4c\x0f\x5e\x82\x23\x1b\x54\xac\x01\x55\x00\x1c\x0f\x8f\xb5\x9c\x83\x25\xf5\x7f\x83\x0f\xfa\xff\xb1\x82\xcb\x12\xb0\x4d\x29\x76\x1c\x7f\x47\xd1\x97\x78\x18\x37\xc2\x9a\x6f\x89\x2b\x26\xb0\x10\xc8\x8d\xde\x56\x3c\x46\xec\x76\xa1\x0d\x1e\x86\xc1\xfd\xb1\x77\x23\x56\x7b\xa3\x35\xd6\xdb\x3b\x57\x7b\x75\x60\xb8\xc1\x6c\xe1\x10\x86\x0c\xc2\x3d\xf8\x6e\xef\xe3\xe9\x2a\xbd\x0e\xdb\x21\x40\xe6\xdb\x13\xea\xc8\x57\x64\xf3\xf4\xef\xe5\xfe\x1a\x07\x8a\xec\x73\x8c\x09\xce\x4b\x11\xf5\x71\x07\x45\x3d\xc7\x38\x67\xa5\xc4\x52\xb8\xc5\x4a\xa5\x21\x20\x37\x9f\x62\xf0\xaf\x35\x93\xe8\xff\x73\xaa\x2f\xb4\xf5\x56\xfb\xbf\xbc\xdb\x0b\xf9\xef\x9d\xcc\xab\x1c\x11\x93\xac\xb3\x14\x52\x39\xf3\x80\xaf\x3e\xb3\xa1\x69\x2f\x34\xcd\x56\xe2\x63\xcb\xcb\x39\x64\x38\x92\xbd\xe0\xd9\x6c\x9e\xe9\x29\xcf\x58\x2e\x95\x7b\xcc\x84\xbd\xd4\x25\x13\xef\x78\x5e\x64\x02\xcb\xc9\xd8\x1f\xc6\xff\xd1\x4a\x30\x8a\x86\x8f\x98\xa7\x05\x25\x49\x58\xcd\x9e\x23\xd7\xd6\xc0\xef\x21\xd5\xa1\x61\x80\x05\xb7\x85\x61\xcf\x8f\x9e\x1f\x3d\x7b\xc1\x7e\x66\x6e\xe8\xe7\xf4\xdf\xcf\xe8\xbf\x7f\x60\x3f\xb3\x9f\x19\x63\x97\x8c\x35\xfe\xcb\xe0\xbf\x63\x26\x67\xf1\x1c\x9e\xbb\x69\x26\x3a\xa7\x17\x06\x4f\x6e\xa8\xfa\x0c\xfd\x63\xac\xa6\xa1\xa1\xe8\x27\xd1\xb9\x80\x39\x3c\xff\xdf\xfe\x1e\x08\xb8\x5a\x6c\xf1\x03\x93\x3a\x80\x29\x1d\xb2\x5b\x70\x4d\xe5\xfc\x06\xcd\xb2\xe3\xc4\x56\x3c\x73\x0f\x3f\xf8\x6c\xfc\xec\x90\x69\xd5\xbc\x7d\x29\x35\xb4\x46\xa7\x19\x1e\x3c\x3f\x9c\xac\x4d\xf9\xb3\x0d\x53\x6e\x75\xbb\xa1\x9a\x3b\x37\xe8\xdd\x5c\xe3\x19\xe6\x58\xad\x6e\xf9\x2a\xb0\x8d\x37\x4b\xe7\x72\x19\xb0\xd1\x23\x1c\x0a\x88\xd9\x01\x17\x48\x8f\x0c\x84\x83\xae\x98\xb4\x13\x76\x6e\xf7\xf7\x7d\x6f\x25\xa7\x31\x7b\x10\xf7\xd3\x18\x2e\x10\x08\x0f\x8b\xfe\xac\x95\xd3\xdb\xa3\xb1\xfe\x20\xce\xd1\x7b\xa1\xb0\xd3\xd3\x6b\xff\xc6\x00\x4e\xf5\x30\x96\xdf\xc1\x4e\xf4\xeb\x19\xd6\xc9\x62\xa7\xa3\x09\xb4\xb1\x22\xda\x53\xc2\x08\xaa\xce\xb4\x7b\xa4\x09\xd6\x93\x84\xfc\xfb\x84\x67\x71\xb0\x2e\xd1\x00\xd0\x56\x0a\xdf\x28\x29\x4e\x2f\x0a\x7e\x29\xf6\x5d\x7d\x27\xa6\x15\x41\xfc\x15\x07\xfa\x1b\xa6\xb3\xef\x4d\xab\xe4\x46\x58\x7f\xee\x94\x90\x11\x51\x54\x96\x4d\x79\xc6\x95\xd3\x60\xd6\xfc\x10\x56\xe3\x60\xf8\x4b\x60\x98\x0d\xfc\xf2\xa9\xe3\x23\x6b\xbb\xa3\xbf\xd0\xff\xae\x3d\x64\x14\x91\x25\x47\x61\x2a\x78\xe6\x53\x29\x00\x1f\x3d\x00\x56\xa9\xfd\xfd\x7a\x5f\xc1\xda\xa0\xf0\xab\x1d\xac\x4e\x2e\x34\xe4\x3e\x3b\xf0\xb9\x8f\xcc\x8a\x2c\x43\xee\xa9\xfb\x92\xb9\x4d\x16\x37\x3a\x93\x30\x42\x53\x06\x6c\xfc\x61\xb3\x3b\x1a\x06\xf5\x9d\x64\x57\xab\x50\x2d\x3f\x62\x0c\x5a\x03\xce\xe5\xd2\x09\xa5\x0f\x12\x1a\x28\x18\x17\x22\x2b\x58\x29\xd2\x2a\xc1\xc1\x19\x33\x37\xe2\xd6\xe9\x54\xf5\x9b\x52\x4b\x21\xcf\xb2\x7b\x0d\xa2\xee\x21\x46\xb4\x6a\x8a\x44\x39\x03\x86\xf4\x1d\x37\xc5\x52\x94\x2b\x56\x68\x63\xa4\x5b\x07\xd8\x4b\x90\x0d\x07\x7a\x57\x40\xd6\x81\x4c\x2c\x98\x96\x17\xc3\x7b\x24\x76\xf7\x9c\xa0\x36\xba\xb1\x3d\x3e\xcd\x51\xf7\x07\x77\xcc\xbc\xff\xa8\xbb\x84\xff\xad\x1f\x79\xe7\x33\xb6\x81\x07\xc3\x5c\x1a\xcc\x73\x9f\x53\xf0\x33\x38\xac\xfe\x70\x18\x1d\x86\x7f\x38\xfa\xec\xe8\xf9\x81\x9b\xeb\x67\x87\x6e\xd6\x8d\x63\xee\x79\x38\xe6\xc2\x2f\x69\x46\xc2\x34\x0e\x3a\x67\x80\x61\x03\x5d\x5d\xa6\x14\xe1\xf1\x59\x74\x6e\x46\xc6\x52\xbc\x4d\xe6\x5e\xbe\x8c\x80\xef\x6a\x66\xbd\xd5\xb0\x73\xe0\xbc\x95\x96\xfd\x2e\xd7\xa5\xf8\x5d\x74\xff\x9d\x07\x54\xf7\x73\xa7\x6f\x3f\xb5\x4c\x1a\x0b\x4d\xd5\x6e\xc4\xea\xde\x9a\x6e\x1f\xf7\x7a\x5f\xe7\xfa\xfa\x5b\x20\x41\x72\x5e\xdc\x63\x1c\xea\xdb\xde\x27\x85\xf7\x15\x39\x66\x43\x0b\x78\x70\x3c\xa2\x56\x44\x7d\x4d\xb1\x56\x2a\xe4\xd3\x4e\x45\xa6\x11\xe7\x94\x52\x07\xee\x91\xaa\x1f\x60\xe1\x8d\xd5\x25\x9f\x8b\x23\x7a\xec\x63\x69\x07\x41\x5d\xe0\x1b\x5e\x26\x2c\x67\x24\x90\x54\x9f\xd2\xec\xe3\x0f\x20\x05\x78\x02\xd9\x80\x40\xc8\x06\x9c\x43\x94\x67\xf8\x48\x42\x59\x1d\xaa\xdf\xfb\x38\x4e\xf9\xad\x39\xcb\xb8\xb1\x32\xf9\x32\xd3\xc9\xcd\x95\xd5\xe5\x00\xda\xc5\xf1\x77\x57\x6b\xa3\x36\xd6\x54\xb1\xe3\xef\xae\xd8\xa9\x34\x37\x35\xba\x3e\xa2\x6a\x36\x13\xf0\x78\x00\xc6\xa1\x5a\x0c\x96\x73\x67\xff\x09\x6f\xe3\xa9\x80\xeb\x3b\xdc\x5e\xf9\x0d\xbf\x35\x02\xa7\x3f\x75\xd3\x77\x5f\x8b\xee\x22\x78\x6b\x40\x0a\xf8\x3a\xe7\xa7\x5b\x08\x7c\xcd\x4c\xd7\xb6\x23\x6c\x8d\x99\x5e\xca\x4c\x50\x07\x30\x80\x04\x6a\x62\x3c\x03\xd7\xac\x74\xc5\x6e\x39\xfa\xac\x40\xa6\x4e\xd8\xb5\x2c\x5e\xb0\xb3\x08\xaf\x15\x0b\x12\x9a\x43\x39\x7d\x23\xe0\x87\x50\x96\x00\x70\x19\xba\xae\x9c\x08\xa6\xac\x18\x76\x86\xca\x94\x79\xc1\xf6\xc4\x3b\xfb\xc7\xbd\x11\xdb\x7b\x37\x33\xee\x3f\xca\xce\x00\x5d\x99\x7a\x34\x38\xa5\x4e\xcd\x44\x59\x1b\x30\xf8\x83\xf5\xd2\xc1\xe1\x99\x94\x5d\xbf\x39\x7d\xf3\x02\x14\xf8\x54\xb3\x5b\xe1\xbb\x98\xf9\x42\x58\x92\x86\x11\x19\xa0\xa2\x23\xd1\x79\x51\xea\x5c\x46\xe9\xaa\xb0\xc9\xba\xf0\x3c\x1b\xc2\x5f\x0a\x49\x69\xb0\xfc\x83\x70\x10\x64\xfb\xfa\x21\x5b\xc0\xf0\x77\xf1\xcf\xf9\x8c\x69\x74\x4a\x35\x73\xe4\xa5\x09\x37\x39\x8e\xa1\x51\xb0\x1d\x57\xcd\x23\x4e\xfd\xa6\xaf\x8e\x52\xb1\x3c\x32\x29\x7f\x3e\x82\xc7\x20\x03\x10\xf8\x7d\x98\x13\x37\x6c\xef\xf9\xde\x84\x5d\xf9\xbe\xe6\xa3\x78\x8e\xf5\x7d\xce\x1a\xf0\x03\x82\x5b\xf5\xd9\x1e\x3b\xc0\x24\x75\xd0\x29\x32\xe1\x4b\x96\x03\xc6\x06\xf8\xf0\x0f\x3b\xa9\x90\x6c\x00\xf7\x05\xeb\xed\xc2\x60\xd4\x32\xec\x8d\xca\x3a\x87\xf6\x5a\x55\x55\xb4\x06\x7b\x16\xba\x6f\x59\x0d\x15\x04\x82\xfa\xc1\xa2\xa8\x78\x4b\x4f\xac\x09\x29\x15\x69\x27\xaf\xdd\xe2\x63\x17\x78\x18\xe0\xbd\xcc\xb2\x07\xd5\x47\x7b\x0f\xe6\x4c\x62\x03\x54\x73\xb3\x70\xb4\x0c\xb3\x1e\xdf\x28\xf9\x53\x25\xd8\xf9\x69\xe8\xd9\x28\x4a\x23\x8d\x75\x92\x2b\x6d\xe8\x08\x12\x15\x87\x83\xe3\x9c\xff\x47\x2b\x76\xf6\xe5\x15\x4d\xe5\xf0\x01\x12\xb8\xa3\x00\xe4\xff\xa9\x4a\xe1\x54\xa3\xde\x7a\xd8\xb1\x1f\xa9\xad\x7b\xb9\xcf\xd9\x29\xb7\x1c\x55\x30\x94\x66\xba\xae\x30\x85\x9d\x30\x85\xcc\x1f\x5f\x3e\xdc\x51\x8b\x66\xdb\x57\x83\x1c\x07\x5d\x74\xc7\x94\x72\x3f\xff\xe6\xed\xf9\x16\x94\xa8\x04\x4e\xe1\xf9\x6b\x9d\x0e\xa4\x49\x01\xbc\xc7\x09\x8e\xca\x72\x37\x2c\xbb\xd0\x4a\x8c\x40\xd8\x31\x27\xed\xe8\x9f\xdf\x95\xd2\xde\xb7\x62\xb2\xbe\x7a\x1f\xff\x7e\xc5\x06\x79\x6b\x77\xf8\x5f\x44\x95\xf1\x00\xe3\x00\x52\x85\x14\x81\x69\xa6\xa7\x8c\xa4\xc1\x36\xdf\xf8\x9b\xb7\xe7\x83\xbd\xf0\x37\x6f\xcf\x1f\xee\xcb\x0e\x68\x1c\xb4\x6d\x83\x5a\x7f\xab\xb1\x57\xdb\x4a\xff\x87\x6b\xfc\x93\xa1\x74\xfd\x6d\x51\xfa\x46\xaa\xce\x59\x61\x4d\xd1\x71\xe6\xeb\x23\x29\x52\x03\x25\xd9\xe9\x0b\x96\x57\x99\x85\xf2\x37\x60\x2c\xc7\x69\xc6\x9d\xde\x9e\xc5\x18\x41\x41\x30\x76\x2a\x30\xbc\x90\xbe\xf0\x09\x09\xe1\x17\x9b\x7f\xf0\x9a\x2b\x3e\x77\xb7\xc3\x79\xc8\x72\xfc\x33\xe2\xe8\x03\x74\xa0\xab\xf0\x15\x5f\x72\x99\xf1\xa9\xcc\xa4\x85\xf6\xff\x87\x13\xaf\x88\x19\xac\x85\x75\x53\xde\x9a\x50\x1b\x54\x85\x8d\xeb\x83\x40\xc1\x64\x07\x6e\xfc\xa3\x5b\x27\xb8\x0f\x27\xb5\xf6\x0a\x68\x64\x90\x28\x8f\x2a\x6e\x43\xb5\xf5\x28\x0f\x2d\xcd\xb6\x1f\xbb\x76\x55\x2b\x61\x99\x5f\x76\x84\x80\x5e\x57\x7b\xdc\x48\x1b\xd5\x1e\xf8\x82\x40\x27\x9e\xb8\xe6\x83\x1d\xa4\x7a\xe8\x3e\xb0\x65\x3a\xfe\xbe\xaf\xf6\xb3\xdb\x2f\xbf\x7c\xd5\x0b\x3c\x08\x95\x62\x10\x21\x1c\xba\x95\x26\x8d\x3b\xe8\x8a\x44\xb5\x07\x17\x02\xed\xca\xed\x9b\x2e\x45\x14\x78\xf5\x96\xae\x81\x53\x07\x21\x04\xc2\xae\x74\xde\x38\x3d\xdf\x27\x11\xc5\x62\xd6\xbf\x06\xf2\x44\x14\x8b\x97\x57\xcd\x50\x8a\xfb\x8c\xbd\xbc\xda\x20\xf7\x30\x57\xc6\xbd\xb7\xc1\x00\xcb\xbe\x61\x99\x9c\x09\x2b\x3b\x11\x61\xcb\x92\x2f\xd7\x4a\x5a\x5d\x9a\x6d\xd4\x7c\xd0\xa3\x87\xd1\xbb\xde\x7a\x42\xb0\xd7\x34\x2e\x26\x7c\x26\x3a\xcb\x44\x62\xa9\xe7\x21\x2c\xab\x7f\xf0\x26\x47\x08\xa5\x02\x18\xdf\xe3\x97\x9c\x1e\x47\xc8\x6a\x47\x6f\xcf\x8e\x4f\x5f\x9f\x4d\xf2\xf4\x37\x0b\x7d\x3b\xb6\x7a\x5c\x19\x31\x96\xb6\x9f\xae\xb4\xc5\xa2\x90\x01\x1c\xd0\x76\x31\xcc\x02\xd6\x88\x44\xdf\x98\x1a\x33\xcc\x07\x7e\x4b\xad\xed\x3a\x6a\xd8\xac\xca\x32\x5c\x53\x5b\x0a\x31\x8a\xdd\x89\xf7\xc4\x54\xab\xaf\x87\xa5\xbf\xee\x6f\xee\xeb\x3b\xfc\xd1\xfc\x50\x36\x43\xff\x53\xbe\xab\x6a\xcc\xde\x43\xfb\xab\x30\xb2\x4f\xe8\x73\x8c\xef\x56\xe2\x46\xac\x18\x64\xf7\xcf\x74\x09\x48\x9b\x4d\x2e\x14\x36\x01\x72\x1d\x41\x4b\x45\xd2\x15\x1e\x08\xa9\xfb\x68\x11\xf0\x22\x6f\xc5\xec\xe3\x10\xfa\xad\x98\x61\x01\x85\xcf\x71\x26\xeb\x82\x57\x76\x81\x99\x90\x88\x7c\x84\xe4\xdc\x48\x79\xaa\xc8\x78\x20\xa4\xee\x95\x4b\x3f\x44\xbd\x57\x1f\xe0\x7d\xb6\xb6\x5e\xb1\x9b\x90\x16\xc9\xde\x3b\xae\xa0\x97\xce\xb6\x14\xb7\x47\xb7\xba\xbc\x91\x6a\x3e\xbe\x95\x76\x31\x46\x4a\x99\x23\xc0\x61\x3b\xfa\x0d\xfc\x87\xa2\xb5\xc7\x69\x4a\x99\x65\x95\x11\xb3\x2a\xc3\x9c\x2f\x33\x61\xbc\x90\xdf\x8a\xd2\x40\x0a\xe3\x8d\x54\xe9\x88\x55\x32\xfd\xa2\xeb\x8a\xb1\x21\x36\x48\xf7\x2e\x62\xef\x3d\x17\x4b\x2f\x7e\x4a\x9e\x6a\x83\x28\xbc\x8e\x44\x0d\xd6\xe7\x69\x2e\xd5\x43\xe1\xfc\xae\xaa\xbd\x54\x69\x37\x0a\x36\xa9\x77\x02\xe3\x34\x75\x7b\x1c\xdb\xc7\x8c\x43\x16\x0d\xf7\xbe\x0c\xec\x52\x45\xf9\x34\xcd\x6c\x9a\x0f\x12\x28\xf9\xca\xfc\x94\x8d\xf1\x29\xe3\x22\xad\xe9\xba\x4b\x8d\xb9\xcf\xf5\x31\x53\x63\x86\x75\x7f\x7f\x82\x84\x97\x8f\xca\x63\x6c\xa7\xf6\x6e\x81\xd6\xfd\x35\xdd\x8f\xa0\x7f\x01\x0e\xbc\xf1\xc5\xc9\xa0\x5e\xa1\xec\xf1\xbe\x2d\xec\xcc\x17\x80\x87\x7d\x99\x51\xa2\x95\x22\x4c\xba\x37\x85\x50\x57\x96\x27\x37\x3d\xe3\xa2\x3b\x9d\xe9\x57\xa6\x33\x0d\x9b\x2b\xe3\xd3\xa0\xd3\xc0\xa3\x58\x45\x45\x29\x65\x75\x96\x34\x6e\xec\x47\x28\x75\x11\x61\xfd\x35\x2f\xfa\x7b\x40\xfd\x48\x2d\x45\x29\x7c\x4c\x4e\x4f\xa8\xaa\x29\x74\x51\x65\x08\xb9\x26\x0d\xd1\xf1\xd3\x2b\x36\x7d\x37\x38\xe9\xcb\xc3\xe5\x8c\xd4\x32\x34\xd7\xa9\x60\x53\x69\x6b\xe9\x68\x84\xc5\xda\x5d\x02\xa2\xd1\x8a\x25\x04\x36\x07\x5a\x87\xd3\x30\x68\x42\x91\x46\xa2\x98\x4e\xac\xaf\xf9\x0b\x65\xbe\xcf\x9e\x3d\x7b\x86\x45\x97\xff\xf5\x5f\xff\xc5\x74\x09\x1d\x1f\x12\x99\xaf\xdf\x08\x77\xfd\xe9\xf9\xf3\x09\xfb\xc7\xf1\xeb\x57\x90\xfb\x5f\x58\x83\x38\xe0\x38\xb2\xbb\xa1\xf1\x63\x33\x62\xff\xe7\xea\xcd\x85\x57\x1b\x4d\xeb\x5b\x30\xb5\xc3\xeb\x35\xd1\x17\x9f\xfd\xf9\x8f\x7f\x9c\xb0\x53\x59\x42\xed\x93\x14\xa1\x35\x57\xf0\x96\xf0\x52\x60\x91\x28\x40\x04\x7a\xbd\x4a\x06\x10\x7d\xc2\x4f\xc0\xde\x83\x58\xcf\xe8\x38\x30\x93\x89\xc5\x32\x2b\x14\x64\xa1\xab\x30\x00\x37\x12\x14\x2a\x25\xeb\xc2\xe4\x46\x2c\x93\x37\x82\xcd\x0c\xb4\xe4\xac\x8b\xe9\xa9\xdd\x0d\x95\x94\xe0\x60\xf5\x5a\x19\x61\x1f\x79\xee\x67\x2f\x5f\x70\x1b\xc0\xb8\xd1\x70\x0d\x4a\x3d\x6f\xc4\x6a\x8c\x1c\x56\x70\x19\x0a\x46\x20\x39\xae\xd1\x63\x21\x78\x6d\xd2\x48\xae\x78\x8c\xc5\xa2\xd4\xff\xc6\xc5\x87\x1a\xd2\x48\x12\x43\x25\x2a\xb6\xa8\x05\xb0\x04\x15\x35\xec\xf0\x75\xb0\xd4\xd4\xcb\x7f\x4c\x48\xa1\xeb\x70\xcb\x99\x34\xee\x11\x37\x62\x65\xde\xf7\xe4\xba\x57\x8c\xe3\x4f\x83\x9c\x52\xa9\xb5\x5f\x13\xf2\x3e\x49\x46\x6a\xb2\x40\x88\x37\xf5\x18\x58\xfe\x4f\x85\xd0\x74\xaf\xa7\x52\x20\x44\x23\x5d\xd9\x08\x5b\x11\x69\x20\xef\xdc\x3d\x1b\x1a\x00\xc0\x1b\xe6\xbc\xbc\x11\xbe\x33\x2f\xcf\x26\xec\xd2\x4d\x32\x40\x8e\x84\xc6\xc8\x60\xb7\xf2\x15\x3c\x96\x94\x34\x78\xc8\xfe\x64\xb2\x8f\x1b\x4f\x97\xcc\x58\x5e\xd2\x2e\x72\x9f\x3f\x0d\x14\xab\xd7\xbc\x30\x88\xaa\xe2\xb4\x52\x40\x1c\xd2\x80\xd4\x6a\x17\x75\x5f\x40\xa4\xf5\x0e\x79\x8a\x8d\x81\x30\x9d\x07\x78\x88\xa8\x53\xd7\x24\x1b\xac\xf6\xdb\xfb\x41\x60\x21\xe5\x3d\x94\x0a\xbc\x7a\xa9\x16\x04\xb3\x9b\x89\x47\xa5\x4b\x6c\x6e\xab\x41\x92\x32\xd2\xd6\x5a\xcd\x3c\x1f\xab\xca\x80\xd7\x10\x8a\x03\x5e\xfd\xd5\x07\xbc\xfa\x04\x74\xf1\x5a\xdb\xa1\xe1\xa4\xc2\xc3\x68\x56\x93\x1e\x40\xcf\x8b\x70\xc4\x5b\x8d\x1d\x42\x7c\xa7\x1b\xc5\xf8\xd4\xe8\xac\xb2\xf8\xd3\xfa\xcb\xf8\x98\x83\x41\x3d\xf8\x12\x9c\x6d\xe1\xb6\xe8\xd0\x83\xe3\x1e\xcf\x89\x3e\xe7\x1f\x5e\xbd\xc5\xc4\x60\x6d\x90\x9f\xb6\x57\xa1\x37\x9d\xbd\xee\x34\x4c\xae\x13\x15\x43\xdd\x2e\x04\x65\x21\x44\x7a\x9d\x13\x9e\x4e\x24\x80\xd2\xe8\x55\x34\x6c\x3b\x9e\x6e\xc5\x4b\x98\x18\xd9\xdf\x2d\x70\x75\xce\x0e\x42\xbb\xd1\x90\xce\x76\xae\xac\x28\x67\x3c\x11\x87\xb1\xbb\x40\x14\x0b\x91\x8b\x92\x67\x21\x43\xd9\xd7\x29\x2f\xb8\x4a\x33\x2a\xde\x17\x25\x6c\x5c\xf1\xce\x8a\x52\xf1\x0c\x1e\x91\x96\x72\x29\x4a\xc3\x0e\xbe\x14\xce\x96\xc0\x36\xa5\x87\x8f\x30\x8d\x14\x5f\x64\x1b\xce\x0c\x78\xf0\x30\x09\xa0\x30\xd4\xa6\x4e\x89\xf5\x52\x79\xcc\x22\xb7\xac\x26\x76\x03\x4d\xdc\x86\x80\x13\x13\x84\x2e\x74\x04\xc2\x68\xa4\x6f\x80\x07\xc0\xc5\x89\xc5\x81\xb9\xa1\x86\x78\x80\x08\x43\xf2\x9c\xa0\x42\xb6\x56\x0a\xf0\x49\x8a\x2e\xde\x57\x32\x31\x23\x03\x52\x2f\x65\xea\xd5\x20\xc8\x66\xa8\x51\xb7\x0a\x6e\xa2\x4a\x7e\x6e\x8c\xa6\x7e\x9f\xd1\x1a\xa1\x39\x0a\xca\x52\x13\x53\xda\x47\x8a\xe3\x78\x97\x06\x64\xd6\x4e\x0d\x2d\xd8\x20\x07\xa2\x4e\xc5\x65\x35\xcd\xa4\x59\x5c\x0d\x1a\xda\xb8\xd8\x30\x30\x26\x06\xae\x25\x97\xdc\x19\xee\x30\x42\x19\x49\xfd\xc7\x50\xcd\x92\x4e\xcb\xd6\xb0\x0c\xfe\xd7\xf1\xee\xd0\x50\x28\x0e\x5d\xcd\xfc\x57\xd1\x3c\x08\xb9\x03\xdb\xe9\xa4\xe2\x1b\x55\x34\x3e\x4f\x78\x96\x99\x76\x23\x69\x7f\x90\xa1\x66\xea\xd1\x3c\x90\x2b\xa4\x63\x18\x3f\x7b\xc8\x9a\x41\x29\x16\x90\x4d\x37\xbe\x98\x61\xb9\xc6\x8a\x7f\xc5\xb4\xf2\x37\x41\x57\x20\xff\x83\x40\x21\xc4\x1b\x43\xa6\xdb\x22\xa6\xe4\x2e\xa6\xf3\xf8\x62\x3a\x83\x46\x85\xaf\x42\x8b\x06\x0e\x03\x8f\xa1\xb0\xc9\x37\x9a\xe5\xa1\xf0\xbf\x36\x1c\x27\xbf\x14\x3e\xde\x5a\x04\x17\xe7\x77\x6c\x09\x16\x74\x18\xbf\xed\xb7\xad\x41\x41\x15\x73\x96\x37\x08\xa6\x31\xd9\xd6\x49\xb4\x93\xc8\x24\x0e\xdb\x7b\x5d\x9c\xd5\x67\x3a\x1c\xe7\xf8\xe1\xbe\x61\xa9\x4e\x2a\x67\x73\xd5\x64\xaf\x13\x26\xfa\xa1\xbd\x3f\x2d\xf8\xd9\x54\xdf\xaa\x5b\x5e\xa6\xc7\x97\x9d\xaa\x56\x9b\xca\x59\x3d\x56\xac\x7a\xfb\x47\x30\xf7\x39\x9f\xfa\x86\xff\x01\xfc\x69\x17\xb8\x6b\x0f\xf1\x4b\xde\x35\x6a\x03\xfe\x61\x71\x3a\xb6\x0b\xfd\xed\x42\x7f\x4f\x26\xf4\xe7\x46\x6a\x76\x4a\x69\x88\x17\x72\xc8\x3a\x8a\x3f\x89\x18\x52\x24\x52\xf1\xf4\x6c\xd7\xc3\xb6\x74\x7e\xdc\xbc\x35\xd7\x45\x76\x82\x97\xb9\xa0\x8e\x3d\x85\x78\xd3\x03\x88\x17\x01\x2d\x7b\x18\x83\x78\xdd\x55\x2a\x86\x48\xad\x18\x78\x8e\x22\xd8\x85\x4e\x5f\x20\x70\x2a\x74\x4e\xc7\x9e\x1d\x23\xc2\x6d\x1e\x91\xef\x42\x45\xbd\xc2\xb1\x35\xb3\x57\x7f\x06\x89\x09\xf4\x64\x00\x36\x10\x13\x30\x60\x04\xa0\xce\x65\x1f\x6e\x60\x83\x71\x84\xbb\x6a\x43\xa7\xef\x48\x6d\x05\x1a\x47\xf5\x8c\x60\x92\x85\xc8\xb1\x7f\xf8\x4b\x4f\x02\x27\x1b\x9d\xf1\x60\x05\x22\xa4\x89\x32\x37\x4c\xcf\x46\x0d\x08\x85\xbd\xe5\xf3\xbd\x7e\x31\x06\x36\x5c\x38\x92\xf9\x7d\x74\xd9\x3b\xb6\xc3\xda\x04\xbb\x6c\x84\x74\xdc\x1e\x02\x9d\x27\xc3\xd6\xc5\xad\x2c\x0b\x38\x3f\x90\xc2\x0f\x86\x38\x0f\x25\x56\x3b\x0a\x51\x83\x47\xa0\xfc\xed\x62\xb5\x4f\x31\x56\x1b\x1d\x8c\x5e\xd0\x11\x61\xe3\xf8\x6d\x1c\x12\xf0\x41\xdc\xa9\xf0\x46\x0d\xd9\x30\x3e\x82\xeb\xc3\xb7\xba\x6c\xa6\x26\xed\x4f\x26\xfb\xfb\x3e\xa8\x4b\x7c\x5f\xd9\xd9\xf8\x73\x26\x54\xa2\x53\x64\x16\x37\x7e\x69\x2c\xa8\x7b\xb5\x97\x2d\x9e\x4b\xee\x9f\x15\xa7\x37\xc1\xd8\x43\x2c\x75\x6f\xd9\xe2\xd1\xf8\x5e\x7e\x04\x25\xa6\x56\x5d\x02\xe6\x1f\x91\x28\x60\x3a\x93\x0e\xe3\xbf\x37\x2c\x93\xb9\xa4\xfe\x61\x6e\xa3\x0b\x63\x0d\x3b\xc0\x0f\x27\x49\x51\x8d\xe8\x86\x49\x2e\x72\x5d\xae\x46\xe1\x26\xf7\x65\xe3\x57\x74\xc7\x21\xf6\xa1\xa8\xca\x52\x28\x9b\xad\x9e\xb2\x06\xe4\x89\xf8\x40\x14\xa0\xb0\xc6\x7d\x90\x3c\xea\xab\x55\x33\x17\x22\xbe\xe0\x2d\x8f\x30\xf6\x03\x58\xab\x19\x85\x90\x04\x7c\x2a\xd4\x92\x2d\x79\x79\x4f\xf4\xf4\x4d\xd7\x80\x3a\x4f\x2a\x97\xd2\xf4\x6d\xee\xc7\xee\x76\x42\x43\xeb\xae\xca\x16\x95\x25\x89\xee\x77\xa0\x47\xda\x0e\x3b\xaf\xa5\x1c\x3e\xdf\xeb\x3d\xa5\x82\x5b\x2b\x4a\xf5\x82\xfd\xcf\xc1\x0f\xbf\xff\x79\x7c\xf8\xc5\xc1\xc1\xf7\xcf\xc6\x7f\xf9\xf1\xf7\x07\x3f\x4c\xe0\x1f\xbf\x3b\xfc\xe2\xf0\x67\xff\xc7\xef\x0f\x0f\x0f\x0e\xbe\xff\xfa\xf5\x57\xd7\x97\x67\x3f\xca\xc3\x9f\xbf\x57\x55\x7e\x83\x7f\xfd\x7c\xf0\xbd\x38\xfb\xf1\x03\x07\x39\x3c\xfc\xe2\xb7\xbd\xa7\xce\xd5\xea\x4d\x4f\x51\x88\xd7\x78\xc0\x23\xb9\x39\xe2\x20\xec\xd7\x6a\xad\x20\x95\x1d\xeb\x72\x8c\x43\xbf\x60\xb6\xac\xfa\x09\x93\xfa\x78\x19\x7a\xff\xd7\x6a\x40\x0d\x39\xef\x95\xfa\x2d\x6f\x70\x88\x78\x9e\xca\x01\x0a\x83\xcf\x68\xa4\x66\xc5\x8b\x15\x79\xa1\x4b\x5e\xae\x58\x4a\xde\xcc\xd5\x06\xc0\x9f\x08\xf1\xa7\x37\x9a\x2e\xbc\x51\x2a\xcb\x2d\xd4\x06\xf7\x06\xf0\x11\xa9\xac\xf2\x61\x9c\xf0\xdf\x01\xf2\x3c\xa1\xd6\xfb\x04\x22\x7c\x80\x0f\x5f\x4c\x79\x72\x83\xf6\x52\x58\x1b\xd4\x12\x63\x10\xe9\x3d\xca\x7b\xc8\x05\x57\xc1\x8d\x0f\x99\x2c\x3a\x15\x6e\xe1\xfc\xcd\x38\x76\xc3\xe5\x8e\xe1\x74\xca\x12\xac\xdb\x30\xe9\x92\xbd\x06\x75\x67\xab\x6b\xcd\x06\x81\xed\x90\xff\x11\xaf\x9c\x8e\x37\x10\x5c\xbc\x06\x63\x92\x30\xb2\x66\xd0\x48\xaa\x4e\xff\x6a\xa8\x0d\xb0\x6e\x61\xcf\xf9\xe0\xac\x5b\x3d\x37\x27\x54\x3c\xc1\xeb\x9c\x19\xcc\x45\x91\x09\x34\x3a\x02\xc3\x13\xa8\x1f\x56\xec\x3a\x6a\x88\x58\x19\xf7\x24\xad\x9a\xf7\xd4\x0f\xc2\x3e\x50\x53\x64\x01\x6a\x6f\xd8\x32\x97\xdd\x37\x57\x9e\x2e\x91\xb3\x02\xca\x89\xbd\x6d\x69\x2a\xb0\x40\xe8\x29\xa4\x47\xeb\x19\x64\x4b\x44\x0d\x69\x7c\xcf\x95\x35\xbe\x54\x32\x6b\x32\xa6\x6f\xb4\x10\x5e\xbc\x52\x94\x2d\xb8\xc6\x65\x9b\x99\xac\x32\xa2\x1c\xcf\x2b\x99\x0e\xc7\x5e\x8f\x4e\xa7\xe8\xa9\x49\x0c\xa5\x3f\x0c\xa2\x35\x0c\xae\x2b\x84\x7c\xcc\xde\x67\xe5\xde\x59\x48\xed\x6c\x1c\x96\x71\x63\x88\x66\x9a\x27\x0f\x0d\xbf\xbc\x30\xf0\xb9\x04\xd7\xc1\x4f\x44\x87\x68\xb2\x4a\x08\x54\x49\x36\x7a\xd3\xe0\xb0\xb8\x27\xa0\x22\x6a\xec\xfe\xcf\xfb\x93\x7c\x08\x75\x2a\x66\x98\xc5\x84\xbf\x01\x37\x00\xd5\x71\xa5\x22\x13\x16\xca\xb2\x84\xaa\x3b\xde\x19\x56\x8a\x5c\x2f\xdd\x36\xfb\x41\xb1\x6f\x0c\x05\xc3\xe5\xec\x05\xe3\x87\x8d\xc2\x60\x6a\xb3\xab\x84\x48\xb1\xb8\x2b\x6a\x9c\x57\x56\xca\x8c\xd8\xf4\xd0\x27\xab\x1a\xec\xed\x58\x82\xc7\x8c\xda\x57\x81\x93\xaa\x14\x8e\x00\x00\x0f\x55\xea\x9c\x19\xc5\x0b\xb3\xd0\x16\xfc\x21\xbc\xe0\x89\xb4\x2b\x47\x6e\x5b\xf2\xe4\x06\x5a\x44\x97\x82\x9e\x38\x62\xc9\x21\x65\xad\xc7\x14\x6c\x96\x9c\xd9\x45\xa9\xab\xf9\x02\x6a\xa0\xf0\xae\x24\xe3\xc6\x13\x60\xe3\xef\xc9\x46\x37\x2c\x5d\x29\x9e\xcb\x24\xb4\xce\x28\xf5\x52\x1a\xa9\x29\x92\x85\xe3\xba\x3d\xc6\x2e\x43\x8f\x01\x0c\x90\x9d\x64\x5c\xe6\xec\xc0\x08\xc1\x02\x63\xe0\x37\x57\xa8\x2c\xa2\xb3\xb0\x14\xee\xe7\x71\xf4\x8c\x50\x14\x09\x2a\xc0\x7d\x52\xcb\xe0\x90\x90\x80\x4a\x00\x6c\xee\x74\xf3\xa3\x0f\xc3\xd2\x6d\x9e\x99\x2e\x21\xa1\xcd\x77\xbf\x11\x2a\xd5\x51\xea\xcb\xf1\xe5\xb9\x89\x0d\x59\xea\x19\x88\x23\xc1\x17\x99\x56\xf3\x18\x64\xae\xe6\x52\x27\xf0\x15\xf4\x7f\x5c\xca\xb4\xe2\x19\x8a\x7a\x9a\xcc\xc9\xd5\x39\xfe\x5c\xce\x17\x76\x7c\x2b\xc0\xcd\x89\x27\x62\x9d\x1a\xed\x1f\x2a\xd7\x52\x6a\xa5\x81\xa3\xc1\x92\x3b\x0d\x5d\xc6\xd0\x61\x91\xaf\x00\xa1\x96\x92\x37\x1b\x59\x37\x1e\xa9\x1d\x87\x08\x74\x8f\x88\x0e\xd3\x3b\x0e\xdd\x00\x9d\x36\x04\x7e\x60\x47\x65\xe0\xda\xf5\xb9\x41\x6b\xc3\xba\xaf\x44\xf8\xd8\x46\xdd\x45\x41\xf3\xfd\x41\xa1\x47\x17\x82\xc5\xd3\x28\x77\xbb\xee\xda\x48\x48\xd3\x50\xd4\x49\xdb\xf0\x2b\xa1\x44\x29\x93\x16\xeb\x84\x9f\xce\xb9\x85\xcd\x27\x94\xfb\x59\x3a\xe9\x62\x2a\x6f\x59\x2f\x5e\xd6\xcc\x78\x2d\xf2\x22\xe3\x76\x98\x4c\x95\xbd\xef\x22\x6f\x7a\x14\x8b\x76\xbb\x9f\xab\x74\xcc\x33\xc7\xf7\x97\xdf\x9e\x50\x3d\x1c\xee\xe7\x46\x36\xdc\x75\xdd\xf9\x13\xd5\x11\xd4\xcb\x36\x6e\x63\x00\x51\x9b\x8a\x14\xc4\x1f\x3d\x19\x5c\x1e\xb7\x0a\x5b\xc1\xba\x3f\x2e\xbf\x3d\x19\x31\x39\x11\x13\xff\x57\xb8\xd5\xcb\x5f\xab\xe7\x58\x2f\x11\xea\x70\x60\xd7\xc0\x54\x62\x5f\x72\xfc\xdb\x7f\xfd\xd5\x4d\xd2\x7d\xfb\xb7\xf1\x5f\xa3\xce\x41\x7f\xfb\x97\xe3\xa3\xd2\xdd\xd0\xfc\x34\x4e\x57\x07\x49\xeb\xfe\xfa\xd7\xa5\x4e\xaf\x0a\x91\x4c\xf0\xb5\xcc\xbf\xa8\x8f\xba\x50\xd6\x29\xf3\x97\x1a\x12\xd5\x64\x8a\x7b\x09\x9e\x5d\x8a\x7f\xfb\x78\x03\x35\x20\x25\x89\x95\x70\x2b\x14\x1c\x39\xbe\x2e\x59\x69\x8b\x3f\xc7\xd6\xa5\x30\xff\x83\x59\xdc\x4d\xd4\x6a\x0d\xc2\x04\x05\xd6\xb1\x62\xe2\x9d\x34\x80\x42\x83\xef\x0a\xe4\xe0\x94\x0b\xef\x4f\x51\x37\xac\xa3\x70\x40\x1d\x82\x76\xa6\x6e\x6e\xbf\x53\xda\xfe\x2e\x2c\xbf\xcf\x73\x84\xa3\x52\x33\xbe\xd4\x80\x74\x01\x87\x88\x62\x95\x02\x47\x79\xdd\x0d\x70\xba\x62\xb9\x34\x96\xdf\x88\x09\xbb\x72\xa7\x64\x9c\xb0\x80\xd4\x53\x0c\xfa\xb9\x88\x94\x55\xca\xca\x0c\xbe\xad\xc7\x71\x53\x8e\x4f\xcf\xf3\x19\x33\x55\x02\x2d\x6f\x4b\x31\xf6\xe7\x31\xdd\xb5\x26\xc9\xea\x77\x19\x85\xc5\x5e\x70\x34\xd0\x8a\x14\x7e\x8a\x0d\x74\x15\xb1\xd7\x5a\x76\xb6\x9b\xa7\x56\x49\x7d\x06\x03\x31\xa1\x8b\xb2\x3b\x76\x33\x9f\x4f\x84\xb6\x22\xc5\x1f\x94\x48\x84\x31\xbc\x5c\x61\x83\x51\x19\xfa\x20\x52\xe2\x2c\x08\xa5\x9c\xab\x0a\x06\x28\x05\x76\xab\xad\x12\xa0\x0e\x67\xd3\x52\xdf\x08\x15\x2a\x12\x82\xc0\x0b\x69\xd9\x75\x12\x2a\xa4\x03\x68\x96\x2c\xb8\x9a\x8b\xba\xe8\x3c\xe7\x29\xd0\xfe\xeb\xa0\xdb\xf9\xf7\x71\x14\xe0\x33\xa7\x22\x49\x0b\xa4\x98\xba\x83\x30\x44\x51\x7e\x50\xcc\xbb\x61\x46\x75\x98\xc3\xbd\x92\xcc\x3a\xc9\x44\x36\x8c\x5f\xbd\xbf\x47\x7d\x0c\xfa\xcb\x16\x53\xc0\x73\x61\x79\xca\x2d\x1f\x2c\x0d\xfc\x35\x0f\x8d\x34\x29\x47\x04\xd8\x21\xca\x1d\xa1\x93\xdc\x2b\xaf\xba\x90\x31\x0c\x01\x48\x83\x85\x5f\x7d\xec\x41\xef\xf8\x9a\x62\x98\x98\xdd\x0d\xaa\x21\xb5\x57\x87\xe1\xfd\x68\x28\xb2\x44\xca\xd2\x0a\x14\xcd\x5a\xa4\xf5\x89\xb1\x0f\x12\x82\x71\x0b\x3d\x18\x95\xaf\xeb\x54\x82\xa4\x99\xea\xbd\x51\x0d\xc4\xb3\x4e\x28\x2b\xb1\x55\xba\xc7\x8d\x20\xe2\x57\x0a\xb7\x6a\x6b\x19\x60\x9d\xe6\xc2\x9a\x3a\x49\x13\x4f\x13\x27\x22\xe9\x2c\x27\xb7\x05\x1c\x35\xb4\x34\x64\xf9\x6f\xd6\x47\x71\xe1\x8c\xa6\xd3\xc2\x9d\x5f\x5b\x5f\x99\xe1\x62\x51\xd8\x51\xf6\xb5\x4e\xfb\x07\xb5\x5a\xad\x51\xeb\x81\xeb\x9a\x15\xac\x5f\x32\xe0\x56\xc2\x27\x43\x88\xdf\x34\x50\x35\xf0\x08\x58\xf0\x65\x77\xef\x6c\xad\xff\x8e\x43\xdb\x33\x78\xdc\x18\x1e\x37\x7e\xde\xd7\x0f\xde\x3f\x09\xd2\x5f\x3d\x93\x21\x9b\x13\x1a\x20\xf0\xe1\x44\xeb\xd5\x20\x71\x89\x76\x6f\xca\x70\xf2\x52\x8a\x47\x48\xab\xa1\xc2\x5c\x21\x9d\xbc\x7c\xc1\x7e\xd7\xd0\xb5\x48\xa7\x0d\x96\x37\x56\x41\x1d\x78\x53\x7c\x42\x4b\xee\x21\xbe\x9a\xb7\x1f\xb6\x06\x03\x25\x6f\xb3\x55\xea\xab\xad\x82\xe2\xed\x94\x64\xe8\x69\x1f\x8a\x5d\x1d\x1b\x97\x3a\xcb\x7c\x23\x74\x34\xc5\x5b\x49\x52\xd0\xb7\x07\xc3\x2e\xa3\xe0\xf2\x08\x9a\xbe\x12\xb7\x41\xa5\xe3\x06\x91\x4a\x7d\xd0\x1f\xdc\x32\x3e\x73\x6d\xd3\x78\xa1\x22\xec\x58\xad\x70\xea\xa7\x61\xb1\xee\x32\xc0\x46\x3e\x45\xc9\x11\x1e\xe6\xc2\xb3\x5b\xbe\x32\xb0\xbf\x6a\x8b\x30\x3c\x9f\x70\xdb\xeb\x81\xdf\x8a\x59\x8f\xe6\xec\xf1\x35\x58\x5a\xc0\x70\x89\x01\x80\xca\x22\x55\xf7\x6c\xdf\x7a\x98\x0e\xfd\xac\xdb\xd7\x70\xf9\x05\x90\x62\x09\xf9\x55\x43\x04\x6a\x9b\x4d\x87\x2e\xcf\x61\x60\x6f\xb3\xcd\xe1\x0f\x7f\x96\x87\x88\xe3\x54\xb8\xfd\x56\x63\x49\x01\xef\xc6\xbf\xdd\x90\x80\x56\x33\xfd\xd7\xd0\x98\x88\x42\x3b\xbe\xb0\xd8\x1d\x05\xc7\x97\xe7\xf8\xc4\x09\xb4\x9e\xe5\x6a\x45\x5a\x96\x5d\xc8\x32\x1d\x17\xbc\xb4\x2b\x74\x8e\x8c\x1a\x4f\x0b\x45\x95\x03\x90\x63\xd0\x18\x73\x9f\xce\x65\xf1\xd5\x58\x23\x20\x1f\xad\x8f\x0f\xca\xdd\xb9\x32\x0f\x8d\x22\x7d\x4b\x3c\xfd\xd5\xac\x23\x8e\xd0\xc8\xbc\xd7\xe2\x51\x50\x24\x8d\x05\xf1\xb0\x27\x72\x2b\x13\x06\x0f\x56\xd0\x97\xc9\xb7\xa4\xe3\x92\xb3\xa0\x9f\x81\xa1\xef\xa6\x35\x62\x72\xe6\x8e\x34\xad\xc6\x54\xdf\x1e\x5c\xef\xa4\xe3\xf9\x94\x51\x34\xda\xdd\x66\x45\x87\x6a\xfc\xac\x78\x80\xb0\xbb\xd9\x81\xd2\x0a\x77\x3c\xde\x7b\x88\x19\xb3\x77\x78\x8c\xe1\x96\x09\xfb\x6e\x21\x54\x7c\xdc\xc5\xbe\xf6\x51\x38\x76\xa5\x4a\xdd\x72\xc3\x59\x08\xb6\xbf\xa9\x92\x44\x88\xe0\x2d\x8a\x7b\xaf\xd7\x12\x89\xa6\x9c\x73\x9b\x2c\x84\x61\x46\x03\xf8\xa8\xb1\x3c\xcb\x6a\x2f\x0d\x91\x4b\x83\xe6\xe0\x1d\xf4\x91\x42\xd1\x28\x0b\x27\x87\x55\x91\x71\xf2\x8a\xcc\x2a\x95\x60\x4e\x96\xb4\x2b\x3f\x83\xf8\x84\x87\x9f\x81\x69\x6a\xd0\x79\x23\x67\xe8\x0d\x8e\x4c\xcc\x40\x4c\x10\xa9\x2b\x14\xa2\xcd\xb3\x9e\x60\xf7\x9c\xfc\x9c\xf2\xe4\xe6\x96\x97\xa9\x81\x8a\x77\x6e\x25\x36\x15\x1c\x35\x86\x3d\x88\xe6\xe0\x9e\xde\xd0\x0d\x0e\x83\x21\x0b\x0d\xa5\x75\xeb\x31\x8c\x57\x56\xe7\xdc\xca\x04\x5c\x34\x72\x16\xf9\xf6\xf3\xd0\xe7\x21\xc4\x69\x51\x96\xc3\xe9\x40\xaf\x01\xd6\x5a\x89\x15\x1a\xf6\x56\x33\x99\x3b\x9d\x8b\x43\xc3\xe4\x59\xa8\x6f\xf7\x81\x88\xf7\xcd\xd4\x29\x96\xdf\x41\x18\x28\xba\x0b\x9d\x3f\xce\x2c\x37\x30\x7c\x88\x33\x04\x07\x3b\x15\x72\x8f\x5a\x2a\x11\xf3\xbf\x72\x5c\xed\x66\x1b\x31\xeb\xc8\x2d\xd0\xad\x70\xba\x96\x79\x2f\xcb\x9a\xc9\xa6\x39\xc9\xb9\xc2\xaa\x5f\x69\xbc\xc3\x80\xd2\xb8\x0f\xd2\x52\x17\x05\xb9\xfe\xf2\xc3\xf5\x39\x41\x74\xaf\x5c\x0a\x03\x91\x6d\x9f\x1a\xee\x48\x31\x17\x4a\x94\xdc\x42\x7c\x80\xd0\x0a\x61\xf7\xb6\x1f\x02\x59\xc3\x2c\x02\x33\x3f\x38\xce\x8a\x05\x3f\x64\xdf\x50\xd3\xfc\xc0\xbf\x21\xd7\xfc\x83\x34\x52\x74\x26\xfa\xa8\xc0\x4e\x95\x7c\xdf\x30\x3b\x55\x72\xa7\x4a\x76\xb8\x76\xaa\x64\xfb\xda\xa9\x92\xf1\x15\xd2\x99\x87\x55\x23\xdf\x86\xfa\x84\x28\xbb\x24\xce\xd7\xaa\x0b\x18\x3e\xbe\x97\x2f\x3c\xeb\x01\x9d\x30\x43\xca\x62\x4c\x5d\x1b\x9c\xa7\xf7\x5f\x61\x4a\x1c\x7e\x38\xa5\xa5\xf2\x59\x7a\x75\x86\xa0\xd3\x12\x2b\x2b\xa2\x25\x25\xe5\xe1\xde\x6b\xd8\x40\x7d\x39\xc2\xce\xd6\xe3\x30\xec\xb8\x4e\xca\xeb\xdc\x08\x30\xbe\x06\x5c\x4d\x36\x38\x3c\x49\x7c\x3d\xba\x1c\xbe\xe6\x35\x58\x6d\x00\xfb\x28\xf5\x01\x6c\xf8\x1a\x01\xf6\xf1\xeb\x04\x58\xa8\xdb\x1a\x7e\xdf\xbf\xf5\x75\x64\xad\x9d\x4f\xa2\xfb\x7d\x3b\xbf\x81\x53\x16\xc6\x91\x86\xe9\x5c\x5a\x2b\x7c\x5e\x45\xd8\xc9\xe0\x0d\x8f\xeb\x68\x48\xe6\x80\xd9\x8d\xc9\x13\xe2\x5d\xe8\xb4\x14\xe9\x73\xa0\x95\xdd\x4a\x03\x46\x04\x57\xce\x04\x44\xb8\x58\x90\x1d\x63\xca\xbb\xf5\x66\xed\x4e\x0e\xf5\x1f\x77\x27\x87\xe2\x6b\x27\x87\x18\xb4\xac\xca\xa0\x68\x63\x50\xe5\xf1\x18\x13\x2e\xd8\x4f\x95\x28\x57\x4c\x2f\x45\x94\xd7\x09\x4d\xa9\x8c\x4c\x29\x33\x92\xfc\x76\x7d\xad\xae\x07\xaa\xd7\x81\x5f\xf1\xec\x9d\xd3\x9f\x01\x5b\x60\x70\x49\xdf\x7e\x40\x13\x22\x08\x57\xc1\x2f\xb1\x17\xed\x4e\xc6\x9a\x09\x61\x80\xd7\x9f\x80\x2f\xee\xf8\xe2\x74\x48\x13\x78\x88\x48\x3a\x1b\x2e\x9a\xce\xee\x62\xd4\x4d\x24\x42\x52\x86\x6f\xe0\x30\x0b\x19\x0f\xc1\x07\xc7\x6e\xc4\x6a\x44\x89\x45\xd4\x85\xd0\xdf\x8c\x39\x7a\xcd\x56\x29\xfd\x20\xf8\x9a\xd7\xc0\xa7\xce\x90\x3e\x33\xbc\xfa\xb6\xc6\x68\x8e\xe5\x89\x3b\xcc\x41\x38\xf0\xc1\x3a\x40\x0b\x8d\xf8\x6a\x30\x29\xb5\xb4\x81\xa4\x77\xe0\x56\x00\xe5\xf7\xa5\x4a\x81\x41\xa1\x3c\x0b\x24\xec\x30\xec\xc5\x86\x76\xdb\xe0\xe5\x97\xf1\x23\x11\x2b\x6c\xc1\x46\x4d\xcc\x8d\x58\xed\x1b\x42\xa9\xd0\xca\x2c\x64\xe1\x7b\x29\x82\x9c\xa4\x5d\xc9\xbe\x85\x54\x30\x3f\x04\x4a\xc4\x73\x35\x62\x17\xda\xba\xff\x9c\x41\x6e\x2b\x86\x20\xb4\x30\x17\xda\xc2\x27\x0f\x9a\xdc\xf8\x6a\x1f\x89\xd8\x14\xbf\x90\x10\x7d\xc0\x2c\x6e\xa8\x13\xf5\x19\x8f\x40\x54\x4a\x6e\x09\x0b\x23\x0d\x3b\x57\x4c\x97\x9e\xaa\xd6\xb7\x8c\x32\x34\x84\xf7\xea\x46\xc1\xa2\x0d\x63\xd0\x62\xe8\xb2\xb1\x16\xef\x19\x2e\xc4\x9d\xa4\xff\x06\xbc\xbe\x10\xa8\x0b\x69\x9a\xd0\xb6\x88\x5b\x31\x97\x09\xcb\x45\x39\x07\x44\x93\x64\x31\xf4\x12\x0f\x75\x2e\xe2\x35\xe0\xe9\x88\xd7\xa0\x7c\x08\x2a\xca\x2b\x48\xc0\xfd\x38\xea\x0f\x8e\x8d\xc7\x75\xce\x0b\xc7\x82\xff\xd7\x9d\xca\xc0\x05\xff\x0f\xda\xa2\x99\x09\x3b\x66\x46\xaa\x79\x26\x1a\xdf\x51\xe0\x20\x1e\xc6\x8d\xe0\x6c\xd6\x9f\x2a\xb9\xe4\x99\xc0\x84\x79\xae\x42\x2f\x13\x3d\x5b\x53\xba\x46\xd4\x1b\xcd\xc9\xe5\x10\xa2\xde\xbb\x11\xab\xbd\xd1\x1a\xdb\xee\x9d\xab\xbd\x1a\x1c\xa9\xc1\xa8\x41\xb9\x80\xe8\xe5\x1e\x7c\xb7\xf7\x69\xf4\xb4\x47\x60\xba\x0e\xc6\x93\xe4\x66\x3e\xc9\xb8\x31\x43\xe0\xb4\xdc\x8d\x3d\x7e\x15\x3d\xa9\xae\xbb\xa6\xa2\x8b\x04\xd3\xa1\x87\xf3\x91\x43\x8d\xe1\x50\x29\xb0\x03\xd0\x79\x49\x0d\x9d\xfb\x02\xb9\xb5\xcf\x9c\x30\x6c\x28\x43\xbd\x8d\x51\x0a\xea\x6c\x95\x3b\x28\xfe\x2d\xc4\xc3\xf5\x2c\xee\x03\x21\x0d\xb8\x9f\xa4\x2f\x4c\x55\xda\x32\xa9\x92\xac\x4a\xb1\x03\x06\xfc\x14\x9c\x57\xc3\x18\xaa\x83\x91\x77\x70\x06\xfe\x36\x0c\xeb\x75\x4e\x9f\x59\xb3\x56\xfb\xd3\x4e\x81\x80\xb4\x93\x90\x4d\x80\xd4\xde\x26\xb5\x66\x9d\xaa\x1c\x9a\xad\x42\x4e\x9a\x7a\xe4\x4b\x39\x2d\x05\x3b\x59\x70\xa5\x44\x16\xe1\xb0\x90\xa3\x93\x5b\xcb\x93\x05\xa6\x3f\x73\xe6\xf6\x71\x26\xec\xbe\xc1\x16\xf5\x39\x4f\x16\x52\x05\xf0\x02\x15\xf0\x88\xea\x52\xaa\x2d\x34\xd7\xe9\x6b\x08\x0d\xd8\x97\x65\xff\xee\xc6\x2c\x35\xa8\xf7\xac\x75\x4f\x8d\x6e\x4f\xbb\x1c\x68\x8d\x27\x2e\x74\x09\x81\x7b\xdf\xdf\xda\x25\x0f\xee\x69\xa9\x66\xa2\x2c\x71\x4d\xa6\x82\x7e\xc0\x64\xa3\xef\xea\x84\xfa\x3d\x2c\xf4\x2d\x4b\x35\xbb\x85\x0e\xa4\x4b\xa7\x1a\x40\xfe\x8d\xf1\x4a\x45\x34\x53\xc8\x88\x4b\x74\x5e\x94\x3a\x97\xc6\xd7\xf8\x11\x43\x6c\x0d\x76\x24\xab\x3a\xe3\xb4\xde\x05\xae\xf9\xf2\x84\x59\x5e\xce\x85\x75\x83\x33\x55\xe5\x53\xd1\x13\x56\x65\xdb\x10\xde\x83\x76\xca\x88\x28\xf5\x0b\x0d\x30\xd8\x5b\x7a\x2e\x02\x9e\x40\x32\xde\x4c\x97\x94\x52\x18\xbe\x24\x9c\x76\xc7\x72\xdf\xd2\xb9\x58\x29\x6b\x7a\xc2\xa6\xf7\x69\xa0\x81\xcb\xff\xdd\x77\x17\xc3\xe0\x9e\x6f\xe4\xad\x5b\x5d\x66\xe9\xad\x4c\x31\x51\xc3\xb0\x03\xf7\xb8\xc3\x7e\xef\xbc\x45\xe0\xf3\xde\x1b\xf9\xf6\x56\xa6\x1f\x83\xdc\x3e\x33\xd8\x91\x9b\x01\xbd\xa9\x57\xbf\x84\xbe\x70\xf0\xd8\x43\x76\x26\xb1\x8e\xdc\xfd\x85\x88\xa2\xf9\x54\xaa\x1a\x09\x21\x30\x04\x9c\x7c\x4e\x2e\x78\x8b\xdc\x08\x8b\x15\xc0\x50\x44\xab\xed\x82\x19\x99\x57\x99\xe5\x4a\xe8\xca\x64\xab\x9e\x6c\xfc\x58\x97\x74\x96\x89\x77\xb8\x9b\xfb\xeb\x2f\x61\xa8\xa6\x1e\x33\x47\xb4\x07\xbf\xc2\x6b\x8a\x4c\x9d\xdc\x9c\x1e\x05\xa5\x26\x94\xb1\x8b\x77\x22\xa1\x3a\xa7\x22\xab\xe6\xb2\x53\x49\xeb\xae\x29\x60\xa7\x5f\x7f\x58\x53\xc0\xba\xe5\x59\x65\x44\x8d\xf4\xd5\xaf\xe9\xf6\xe3\xe8\xe1\xf7\x51\x55\xc5\xeb\xcd\x8d\xfa\x52\x51\x08\x95\x02\x72\x78\xb4\xe3\x70\xba\x5b\xa3\x36\x21\x76\x0f\x7d\x2e\x9c\xbd\xb3\x25\x77\x42\x3e\x07\x38\x19\x82\x05\x97\x33\xc6\x55\x5f\x81\xfd\x54\x7a\x4b\xb1\x9d\xde\x78\xef\xcb\x0c\xda\x5f\x32\x22\x58\xa3\xbf\xe4\xc0\xdd\x25\xf1\xf4\xa3\x8d\x6e\x9a\x65\x51\x1b\xba\x40\xd2\x53\xe2\xfa\xa5\xbe\xdd\x20\xcd\x86\x26\x71\xad\x59\x6d\x71\x4f\xee\x5a\x43\x3e\xae\xd6\x90\x33\x40\x1a\xea\x0f\xe3\xfb\x12\xc7\x69\xf9\xce\xe8\x43\xd2\x39\x3f\xc4\x57\x46\x3b\x2a\x3a\x5e\xa1\xe7\x0b\x0d\x44\x75\xfb\xcc\xb8\xd5\xa8\x93\xf4\x2b\xa5\xba\x09\xed\x6d\x77\xd0\xe3\x96\x1b\x61\xfb\x78\x74\xd7\x0b\x1a\xbc\x3e\x88\x63\x63\xe3\x49\x28\x34\xf4\x70\x3b\x6c\xfc\x37\xd2\x1c\x55\xe3\x4e\xa7\x33\x7a\x42\x7b\xa4\x5f\x11\x52\xb7\x70\x8c\xd4\x2d\x6f\xc2\x6d\xcf\x5e\xea\x3d\x4e\x59\x9a\xed\x37\xdf\x9c\x9f\x0e\x42\x33\x37\x50\x8b\x66\x93\x80\xa6\x57\x29\xf9\x53\x15\xdb\xc0\x80\x3c\x18\xa8\x44\xf7\x6f\x83\x14\xf3\x44\xd4\xce\xf8\x53\x69\x6e\xfa\x03\x71\x7f\x75\x72\xd6\x1c\xb2\xb9\x99\xbf\x3a\x39\x63\xf4\xe9\x07\xf9\xc0\xef\xe3\x04\xef\x8b\xe7\x3c\x4f\x44\x1d\x1e\x4b\xa5\xb9\xd9\x02\x88\x77\x5f\xf3\xb4\x48\x2f\xba\x55\x0b\x3e\x64\x7f\xbe\xc7\xfe\x8c\x00\x6a\x57\xba\x62\xb7\x84\x4a\x47\x06\xdc\xb5\x2c\x5e\xb0\x33\x65\xaa\x52\xd4\x59\x4e\x6d\x5b\xce\xe9\x50\x1f\x6c\xce\x01\xf0\x9f\x79\x31\x98\xff\x7f\x68\xfe\x7c\x2a\x01\x85\x82\x97\x16\x6c\xb0\x81\x70\xcc\xa1\x4d\x29\x0d\xe9\x89\xf0\x0b\xcc\x73\x3e\xf3\x75\x0a\x23\x42\xa5\x0a\x60\xdf\xfe\x26\xc7\x2e\x11\x4c\x65\xcc\x20\x2f\x03\x00\x2d\x3b\x4a\xc5\xf2\xc8\xa4\xfc\xf9\x08\x1e\xe3\xc1\x8c\x6c\x63\x4e\xdc\xb0\xbd\xe7\x7b\x13\x76\x25\x73\x99\xf1\x32\x5b\x35\x3a\x6e\xd5\xf7\xb9\xc3\xd4\x0f\x08\x49\x20\xcf\xf6\xd8\x81\x2e\x61\xe4\x84\x2b\x96\x09\x5f\xc9\x4f\xdb\x77\x85\xe6\xc3\xe1\xc3\x90\x85\xec\xc1\x44\x63\x50\x2c\x0e\xc3\x5e\xdf\xe0\x71\xde\x00\x3b\x3d\xad\xcf\x33\xa9\xdc\x21\x37\x61\xdf\xd0\xe9\x44\xc7\x3e\xb2\x00\xec\x5a\x7f\xc7\xc3\x5a\xa2\x07\xe3\xb3\xe8\xe7\x89\x58\x77\x74\x3c\x34\x42\x77\xf5\x76\xcc\xa5\x7d\x2b\x0a\x3d\x80\x8a\x86\x03\xb5\x3c\xfb\xd2\xba\x0f\xb4\x91\xd0\x25\x85\x5b\xc6\x51\x10\x25\x55\xc6\x9d\x45\x86\x7e\xfd\x09\x3b\x3d\xbb\x7c\x7b\x76\x72\x7c\x7d\x76\xfa\x82\xf9\x91\x64\xac\xd3\x4f\xd8\x75\x8c\x57\x1c\x95\x7c\x11\x28\x6c\x78\xd6\x88\x04\x2b\x57\x75\x8b\x07\xc0\x6f\xe4\x8a\x9d\x2b\x69\xeb\xce\x55\x98\x44\x9f\x69\x45\x69\xf1\xee\xd7\x14\x57\x98\x4b\x4c\xde\x54\x34\x98\xfb\xba\x39\x1a\xec\x50\xec\xf3\x12\xa6\xd2\xc9\xbb\xb1\x65\xdd\xae\x5e\x9e\x6d\x58\x99\xbe\x49\xcb\x20\x9b\xfc\x1a\x03\xb2\x75\x57\x1e\x3c\x51\x43\xb3\x41\x8f\xbf\xaa\xcb\x46\x2f\xc0\xc9\x64\x7f\xc2\xdc\x59\xbd\x3f\xd9\xf7\xaa\x5c\xb6\xd6\xb0\x32\x0c\x1a\xc3\x5c\x37\xf9\x7b\xc2\xd8\x1b\x5f\x46\x08\xb8\x45\x9b\x7b\x5f\x22\x58\x5f\xd4\xe9\xb0\xb5\x4b\x7c\x4b\xd4\x6a\x1a\x3f\x94\x70\xb1\xe7\x72\x29\x14\xbe\xd8\xf6\x04\xb3\x9f\xea\x20\xab\xf6\xb6\x7e\xf3\x6f\xde\xbe\xda\xde\x4b\xa1\x64\x19\xe4\x95\x4e\x74\x9e\x23\x62\xf3\x22\x20\x8d\xd4\x60\x21\x41\xea\x6d\xc5\x38\x47\x9c\xea\x59\xa7\x0d\xdb\x92\xf8\x7e\xa8\x96\x31\x1e\x3e\xa6\xba\x5e\x55\xdb\x43\xf7\x6f\x93\x45\x40\xe9\xc6\x43\x6f\xd2\xf1\x79\x14\xde\xe3\xe8\xed\xd9\xf1\xe9\xeb\xb3\x49\x9e\x3e\x42\xe1\x2b\x54\x5a\x68\xa9\xac\xe9\x6a\x98\x77\x6b\xb7\xdd\x57\x6c\x87\x69\x0f\xa3\x9b\x9d\xf9\xe1\xe2\x44\x4f\xff\x8c\x08\xf9\x3e\x15\x96\xcb\xcc\x44\x1c\x66\x75\xa1\x33\x3d\xdf\xdc\x75\xeb\x1e\xac\xf3\x1b\xc4\x4e\x1d\xf3\xb1\xe3\xc9\xed\x59\xac\xdd\x5b\xf5\x36\x29\xea\x5b\xf3\x42\x2f\x8d\x40\xad\x60\x09\x42\x47\xdd\x27\x40\xb0\x4f\x68\x22\xac\x51\x11\x7d\x32\x20\xe2\x7c\x63\x82\x1a\xe9\x3f\x6a\xe0\xfd\xa1\xb6\xc3\x76\x88\xdf\xd5\x6c\x70\xd2\xbc\x6b\xa7\xf8\x26\xd5\xff\x4e\x23\x35\x0f\x91\xa2\x14\xe3\x00\xa8\x0c\x1d\xa4\x75\x19\xe9\x60\xf1\x99\xe2\x9d\xb8\xde\xe5\x8b\x77\x65\xab\xb6\x33\xb7\xd6\xd2\x83\x0f\x1d\xf1\xea\xb2\x6c\x55\xb7\xcb\x20\x97\x16\x9f\x23\x50\x72\x49\x91\xb2\xa2\x94\x4b\x99\x89\x39\x34\xdc\x91\x6a\xee\x5b\x8f\x47\x78\xfb\xd0\xfe\x52\xac\xcd\xcb\x2d\xb6\xb1\x71\x03\x38\xe0\xac\x8b\x37\xd7\xd0\xc4\x09\x52\x61\x7a\x1b\x93\xee\x81\xd0\xec\x7a\x3c\x1e\x83\xff\xee\xe0\xdf\xce\xaa\x49\xb3\x43\xf6\x9d\xa0\xe7\x68\x68\x34\x55\x42\x27\xf5\x85\x0e\x9d\x7e\x60\xae\x35\x65\x81\xa1\x31\x39\x8e\xee\x3a\x72\x77\x3a\xf5\x19\x8f\xf3\xc6\xfd\x52\x00\x98\x73\x1d\xf3\x7f\x8c\x16\xd0\x96\x0e\xd1\x81\xa5\xbd\x8f\x13\x6d\xda\x23\x21\xae\x5f\xd0\xb9\xc0\x99\x59\xe5\x99\x54\x37\x35\x7a\xf8\x4c\x3b\x3e\xc6\xba\x5e\xa9\x6e\xfc\xae\x29\x05\xcf\xee\x3e\x31\xba\xf0\xe8\xd6\x4e\x0b\x3b\x58\x28\xe1\x7a\x55\x60\x1e\x5b\x10\x5e\x94\x64\x15\x8b\xfa\xbd\xbd\x47\x4d\x31\x69\x12\x23\xfb\x8b\xf7\xf3\xab\x93\xab\xf3\x86\x6c\x57\x0c\x3f\xfb\x94\x01\xbb\xbb\x0e\x57\x78\xc9\x47\x6d\x41\xc8\x9f\xba\x65\x38\x8d\x59\x56\x75\xfd\x25\x26\x51\x5f\xea\xd2\xf2\x6c\x0b\x82\x33\x59\xf0\xe2\xb8\xb2\x8b\x53\x69\x12\xbd\x14\x03\xb9\x21\x6e\x17\xd8\x81\xcc\x37\x5c\x90\x9e\x49\xf1\x19\xec\xe4\xef\xc7\x97\x8c\x57\x8e\xeb\x2c\x35\x97\xd9\x5a\x7a\x9a\xa7\xc0\x15\x96\xfc\x7e\xc4\xf7\xa7\x27\x3c\xa8\xb7\xdf\x05\x85\x3f\x7a\x50\x18\xe4\xe2\x53\x09\x04\x4b\x25\xad\xe4\x56\x97\x83\x45\xeb\x4e\x2a\x63\x75\x4e\x5b\xe4\xdc\x0f\x0f\x39\x4e\xa0\x6a\x35\x9e\xd8\xec\xc6\x0a\x86\x22\x90\xf7\x5c\x39\xb3\x8e\x27\xa2\x55\x67\x32\x82\xfe\x2d\x38\xb6\x0c\xf7\xfc\x95\xaa\x8d\x00\x98\x3c\xfb\xdb\x8b\x46\x6f\xc3\xb5\x96\xb7\xde\xe9\x58\xb7\x51\xdd\x9a\xb7\x58\xfe\x34\x8c\x7c\x22\xe7\x3e\xd2\xe5\xbf\x2b\x9e\x21\x3d\x2f\xb6\xe9\x09\x6f\xae\xe3\x20\xaf\xe9\x79\xca\xaf\xfb\x45\xf0\x7e\x55\x06\x71\xd5\xf1\x0e\x5b\x72\x65\x1c\x33\x34\xfd\x0b\xfb\x94\x62\xb0\xcf\x0e\x6c\x52\x1c\x6e\x8d\x32\x43\x55\x73\xe2\xcb\xd2\xda\xbf\x0a\x55\x9c\xfd\xde\x6b\xeb\x79\x03\xb0\x87\x87\x71\x9e\x36\x08\x84\x2a\x19\x7b\x25\x8d\xf5\x6d\x5c\xe1\x03\x69\xa8\xef\x15\x68\xdf\x97\x4c\x97\x4c\x16\xff\xe4\x69\x5a\xbe\xc0\xb3\x9e\xac\x43\xf8\xb7\x09\x08\xe5\x5c\x85\x8c\x95\x03\xbb\x2a\xa8\xbd\xc2\xf5\xc9\x25\xc3\xee\xd0\x9f\xff\xf9\x19\x68\xe2\x7f\xf8\xec\xcf\xcf\x7a\xb2\xda\x63\xad\x8e\x63\x43\x7b\x21\x07\xcf\x53\x78\x22\x35\x14\xa0\x80\x62\xf5\x04\x9c\x6e\x24\x05\x91\xef\x1d\x13\x86\x33\x77\x48\x35\x75\x57\x6f\xf0\x2b\xaa\x37\x60\xa1\x60\x1c\xe5\xe8\xc7\x92\xcf\x28\x9a\x2f\x1f\x8b\x68\xee\x48\xcd\xae\x9c\xdb\xe4\x58\x94\x6e\xfb\xfb\x26\xce\xe5\x80\x7a\xca\xd3\x8b\xab\x7f\xbe\x3a\xfe\xf2\xec\x15\xbc\x27\x65\xc3\x3b\x56\x24\xb3\xa4\x4b\xee\xf6\x87\xb3\x76\x77\x4f\x51\x57\x72\x0e\x11\xb1\xbf\x78\x79\xd5\x72\xc5\xb9\x4f\xee\x19\xa6\xef\x6b\x5b\xaa\x59\x0f\xea\x3d\xb6\x20\x01\xb4\xb2\x16\xe5\x76\x8a\xbb\x07\x8e\x30\x44\x00\xea\x0d\xa7\x86\xe3\x21\x7c\xc7\xde\x7e\x87\x8e\xbc\xc1\x1e\x9c\x1a\xf7\xfe\x60\xb2\xa3\x18\x52\x71\xf0\x30\xf2\x27\xa5\x76\x3f\xf5\xb0\x1c\x0a\x79\x60\xff\x0a\xc6\xf2\x09\x0f\x4e\x84\x61\x1e\x75\xe9\x4e\x54\x77\x96\x0a\x13\x9a\xde\x3e\x01\x6e\x2d\x36\x75\x7b\xeb\x7f\x3a\x6c\x6c\x22\x47\xad\x8e\x31\x48\xd3\x08\xd1\x37\xaa\x97\xef\xea\x9a\xe8\x73\x19\x39\xb9\xaa\x4c\xc1\x93\x41\x7b\xf1\xd4\x1f\xe1\x27\x00\xf4\xf6\x18\x0f\x18\x98\xf8\x96\xca\xac\xc2\xb3\x87\xd9\x8e\x27\x7e\xb8\x36\x18\xc8\xbd\xb8\xc4\x77\x89\x2e\xb4\x07\x7b\x89\x51\x43\x1e\x24\x0b\xb1\x07\x77\x0e\x7d\xd7\xd1\x81\xb0\x4d\xe7\x41\xb1\xd0\x56\xab\x81\x4b\x48\x2f\x37\x0c\xda\x94\x67\x78\xc7\x49\xdd\x7e\xbd\xe6\x0b\xac\xb0\x09\xa1\x69\x67\x70\xf8\x13\x5b\x2b\x1f\xa4\x6e\x86\xa8\x1f\x9f\x00\x2a\xd2\xf3\xd3\x2d\xc8\x9e\xc7\x0f\xc3\x73\xdf\xe0\xdc\xd6\xd2\x4b\xd3\x81\xea\xd2\xcf\x4f\xc9\x16\xf0\xb5\xe7\x86\x36\x0f\xbb\x7b\xf7\x6c\x45\x4f\xd2\xa5\xbd\xd5\xe5\x50\xf0\x65\x97\x8d\xe1\x5a\xf9\x8a\xf4\xdd\x1a\x9e\xc4\xd3\x94\x15\xf8\x96\x8f\x5e\x5e\x5c\x41\x22\x57\xab\xa3\x64\x5b\x42\x84\x4a\xdd\x8f\x20\x44\x1e\x8f\xf0\x18\x54\x2b\xf9\xb8\xb0\x51\x5b\x33\x69\xfd\xae\x18\x84\x46\xdf\xd2\x60\xe4\xda\x74\xfc\x51\x8b\x5b\x1e\x84\x11\x3d\x74\x2b\xe2\xb5\xd4\x4e\xfc\x74\x93\x22\xcd\x03\xc5\x8a\xdc\x60\x2b\xbf\x2c\x73\xeb\xa9\x55\xdc\x04\x90\xc0\xa5\x46\x0c\xfb\xe8\xe5\xbc\xa0\x7e\xe3\xa9\xbe\x55\xb7\xbc\x4c\xd9\xf1\xe5\xf9\xa7\x17\xa2\xbd\x8b\x1f\x71\x17\xf4\xc1\xa4\x6f\x50\x11\x50\xe8\xa7\xd2\x1a\xcc\x66\x87\x7c\x74\x1b\xfb\x90\xdc\x01\x14\x32\x44\x9c\x08\x73\xe2\x8a\x66\x11\xe9\x48\x8a\xe9\xc4\x72\xea\xec\x1e\xba\xde\x3f\x7b\xf6\x0c\x43\x0a\xcf\xfe\xeb\xbf\xfe\x8b\x41\xd7\xc5\x54\x24\x32\x5f\xbf\x11\xee\xfa\xd3\xf3\xe7\x13\xf6\x8f\xe3\xd7\xaf\x18\x4f\xc0\x02\x43\x48\x55\x1c\x19\xd6\x2e\xfe\xb1\x19\xb1\xff\x73\xf5\xe6\xa2\x6e\xf7\xde\xfc\x16\x58\x23\xf7\xaf\x37\x61\xa7\x51\xfa\x79\xec\xf2\xe7\x76\x01\x29\xf9\x4a\x5b\xc6\x67\x33\x60\x4e\x14\xc9\xd2\x78\x71\xe1\x71\xd1\xe4\x7c\xe1\xbb\x75\x3b\xb6\xca\x20\x2f\x5e\xba\x29\x42\x88\xc5\x43\x09\x62\x9a\x3f\x8c\x15\x4e\x07\x98\xca\x88\x65\xf2\x46\xb0\x99\x81\x9e\xdd\x75\x13\x8d\x52\x18\x67\x3f\x25\x5c\xb9\xd1\x71\xb0\x30\x75\x37\x89\xc7\x9d\xbb\xd0\xb3\xbb\x73\x83\x61\x7d\x63\x38\x5f\x97\x84\xf2\xc4\x91\xfd\xb1\xe6\x12\x34\xf5\xc5\xf0\x3e\xc8\x45\x04\xc5\x17\xc4\x26\xe3\x99\x56\xf3\x98\xe9\x6a\x3d\xc2\x27\x20\xae\x0a\xd1\x95\x18\x03\x75\x53\x19\xa6\x37\x19\x4a\xee\xd7\xbc\x67\x7f\xff\x66\x68\x35\x82\x42\xe4\x53\x5d\x59\x9f\xf2\x86\x4f\x02\x08\x2c\xc0\x48\x44\x82\xf7\x7a\xf0\x60\x8d\x69\x86\x6b\xf5\x36\x50\x9f\xa5\xe6\x41\xdc\x50\x36\x47\x4c\xf0\x64\xc1\x6e\xc4\x6a\x8c\x22\xbe\xe0\x80\x7e\x00\x74\x3e\x75\xd4\xc5\xfe\x42\xcd\x8c\x82\x44\xa4\xce\x0e\xa4\x45\xf0\x99\x89\x35\xd7\x07\xf4\x04\x6f\x2a\x19\xd2\xa8\xa9\x6f\x91\x8a\x1c\x87\xbe\x51\x61\xa2\x95\xa5\x26\x88\xa1\x51\x11\x64\x5a\xb6\x2a\xec\x9d\x44\x11\xa9\xfb\x99\x79\xdf\x93\xeb\x74\x4c\x77\x64\x90\x32\x51\xa9\xb5\x5f\x03\x12\x38\xe4\xbd\x1a\x41\x78\x3e\xdc\x37\xc0\x8b\x52\x3a\x17\x32\x81\xaa\x1a\x77\x3b\xdd\xeb\xa9\x14\x08\xd1\x40\x00\x30\xc2\x56\x44\x1a\xc8\xa5\x75\xcf\x16\xc6\x30\x09\x6f\x98\xf3\xf2\x46\x78\x30\x5b\x9e\x4d\xd8\xa5\x9b\x64\xc0\x29\xc7\xbe\x71\x4b\x2c\x82\x70\x32\x25\x86\x36\x70\x0f\xd9\x9f\x4c\xf6\xf1\x2c\xdc\x00\x74\xd0\x9b\x5f\x86\x6c\x19\x36\x58\xab\xb0\xa6\x1e\xc4\x0b\x83\xad\xd3\x9c\x75\x00\xed\x09\x35\xe0\x8e\xd8\x85\xd7\x16\x78\x4f\xf0\xe9\xf8\x1a\xb8\x67\xd5\xb0\x6d\x2f\x87\x6b\x7a\xd9\x23\x04\xde\xbc\x86\x6e\x76\x39\x60\xab\xcb\x66\xc2\x31\xc9\x9f\xfa\x04\x19\xaa\xef\xde\xe0\x8d\x15\xf3\x01\xda\x5a\xf9\xeb\x2e\xe4\xe2\xfc\x43\xac\x0b\x50\xb4\x9d\x2c\x7f\x54\xe6\xc4\xf9\x0c\x64\xe8\x66\xb4\x96\xc8\x4a\x0b\x47\x8a\xa3\xc0\xf6\xed\x88\x21\x7a\xc5\xb3\x81\x0c\x8b\xf6\xd5\xdf\xd0\x68\x5f\x7d\x92\x59\xda\xd7\xda\x3e\x0f\x67\x6a\x11\x95\xd2\xc2\x12\x59\x0d\x3d\x18\x6d\x10\x06\x13\xf6\x9a\xce\x5c\x64\x6e\x3e\x35\x3a\xab\x6c\x80\x55\xd8\x70\x20\xc3\xa0\xbe\x63\x23\xc2\x0d\xf9\xdb\xa2\xe3\x19\x14\x13\x3c\xb3\x86\x39\xa9\xf1\x1a\x50\xd8\xf4\x4d\x46\xc5\xeb\x57\x96\x92\x8a\xd7\x80\xab\xe0\xf5\xc2\x81\x57\xe2\x8a\x30\x25\x7d\x1d\x60\x43\x7b\x85\xb4\x54\x6b\x50\x35\xf6\x8a\x28\x36\x3c\xec\x8a\xb6\x5c\x5f\xfd\x1d\xaf\xf4\x3a\xe4\x0d\x3c\xbe\x3c\xff\xe8\x56\x66\xf4\xac\x9d\x9d\xf9\x41\xd7\x06\x87\x2f\x00\x11\x78\x27\xd0\x69\x4d\x51\x0a\xb0\x39\xf9\xfb\x2b\x30\x57\xd6\x5e\xfc\xa5\x3b\x77\xa2\xa0\x54\xab\xe5\x03\x7a\x70\xeb\x13\x2a\x6a\x13\xe1\xd3\x65\x40\x9a\x3d\x7d\xd3\xe6\x81\x1a\x24\x40\xfd\x1e\x75\x2f\xed\xab\x9d\x58\x4a\x44\x64\x57\xd0\x6b\x1f\xbd\x27\x91\x1b\xa6\xd0\xe9\x0b\x6c\xda\xcc\x95\xd2\x16\x7b\xcc\x8f\xb0\x59\xbf\x19\xa1\x7b\xc5\x29\x99\x51\xa2\x55\x19\x85\x30\x07\x56\x2b\x07\x63\x1e\x36\x38\x03\x31\x60\x22\xa0\xdd\xe5\x30\x9c\xc4\x3e\x02\x37\xb9\xab\xd6\x4a\x86\xec\xab\xde\x0c\x37\xe2\xf8\x9e\x89\x4c\xb2\x10\x39\xc7\x06\x17\x9e\x40\x4e\x5e\xdf\x96\xd2\x5a\x81\xf8\xd7\xa2\xcc\x0d\xd3\xb3\x91\x37\x91\x10\xf5\x64\xf9\x7c\x6f\xb8\xfe\xf4\x1f\xc1\x56\x66\x7e\x87\x76\x85\xaf\xba\xeb\x6a\xfa\xfe\x1b\x76\x84\xdb\x9d\x60\x30\x67\xd0\x71\x47\xb5\x9c\x90\x4e\x89\x58\x22\xfd\x1f\x34\xe9\x1e\x9e\x9b\x61\x14\x94\xd1\x9d\x9b\x61\xe7\x66\x18\x62\xc4\x8f\xe6\x66\x88\x0e\x6e\x2f\x4c\x69\x01\x62\xd7\x43\x8c\xff\xee\xfd\x0f\x35\xae\x43\x84\x65\xec\x58\xde\x7b\x1e\x74\xd9\xf4\xff\xef\x4f\x26\xfb\xfb\xde\x1f\x41\xfb\xa3\xb2\xb3\xf1\xe7\x4c\xa8\x44\xa7\xc8\x54\x6e\xfc\xd2\x58\x50\x6a\x6b\x03\x3c\x9e\x4b\xee\x9f\x15\xc7\x10\x60\xec\x61\x59\x62\x40\x09\xe5\x73\x46\x5e\x7e\x54\x15\xac\x56\xbc\x02\x7c\x15\x11\x30\xa0\xfc\x91\x06\x56\xe7\xb0\x64\x32\x97\x84\xab\xe7\xc4\x85\x30\xd6\xb0\x03\xfc\x70\x92\x14\xd5\x88\x6e\x98\xe4\x22\xd7\xe5\x6a\x14\x6e\x72\x5f\x36\x7e\x45\x77\x1c\x82\xd6\x96\x54\x65\x29\x94\xcd\x56\xbf\x5e\xfd\xcd\x93\xf8\x01\xab\x6f\x81\x2b\xfa\x94\x58\x6c\xba\x5a\x65\x17\x01\xd8\x1e\x1c\x75\x81\xda\x70\x0e\x51\xb1\xc3\x28\xb8\x8f\xe0\x53\xa1\x96\x6c\xc9\xcb\xce\xc5\x0e\x9b\xae\x8f\xa2\xb1\xa5\x72\x29\x8d\xee\x5c\x2e\xb6\x71\xc8\x75\xef\x97\xa4\x46\x00\xba\xb2\x45\x65\xe9\x74\xf1\x7b\xdb\x43\xcd\x85\x3d\xdd\x52\x7c\x9f\xef\x0d\x38\xb9\x82\x5b\x2b\x4a\xf5\x82\xfd\xcf\xc1\x0f\xbf\xff\x79\x7c\xf8\xc5\xc1\xc1\xf7\xcf\xc6\x7f\xf9\xf1\xf7\x07\x3f\x4c\xe0\x1f\xbf\x3b\xfc\xe2\xf0\x67\xff\xc7\xef\x0f\x0f\x0f\x0e\xbe\xff\xfa\xf5\x57\xd7\x97\x67\x3f\xca\xc3\x9f\xbf\x57\x55\x7e\x83\x7f\xfd\x7c\xf0\xbd\x38\xfb\xf1\x03\x07\x39\x3c\xfc\xe2\xb7\x03\xbe\x04\x57\xab\x37\x83\x89\x60\xbc\xc6\x1f\x45\x8d\x68\x8e\x3d\x30\xeb\x32\xf6\x6e\x5c\x3b\xaf\xc7\x52\xd9\xb1\x2e\xc7\xf8\x90\x17\xcc\x96\xd5\x50\xa2\xab\x3e\xfe\x3e\x9e\x8c\xa9\x95\x98\x1a\xb9\xd1\x1b\x36\x0f\x50\x88\x60\xe6\xe8\x47\xf7\x06\x53\xbb\xd4\x9d\x23\xf8\x43\xae\x8f\x92\x70\x44\xc8\x30\xbf\xf2\x6c\xa3\x2b\xea\xc8\xbb\x4b\x35\x5a\xbb\x76\xa9\x46\xeb\xd7\x2e\xd5\xe8\x9e\xd7\x2e\xd5\xe8\x01\xfa\x00\x77\xa9\x46\x3b\x1f\xe0\x23\xf1\x01\xee\x52\x8d\x3e\xf4\xda\xa5\x1a\x75\xbe\x1e\x67\xaa\x11\x29\xf0\x75\x9e\xd1\x83\x4d\x33\xa2\x06\xff\xc7\x49\xa2\x2b\x65\xaf\xf5\x8d\xe8\x19\x95\xfd\x20\x03\x73\xed\x99\x0f\xd3\xda\x1c\x4a\xa5\x1c\x40\x05\x1c\x4e\xf9\xe3\x55\x2a\x9d\x99\x39\xf0\x36\x38\xa6\x61\xbd\x9d\xe9\x8e\x45\x95\x8a\x34\x3c\xcf\x0b\x2b\xeb\xd6\x7b\xc2\x8e\x59\x29\x12\x59\x48\x27\xda\x01\x4c\x07\x3e\xc7\x7d\x12\xfa\x01\x4b\x6b\x44\x36\xa3\x9e\xa8\xaa\xae\x19\x2e\x23\x13\x92\xce\x8a\x8d\x8f\x41\xad\x40\xfb\x36\x96\xcc\x2c\x74\x95\xa5\xac\x14\xff\xf6\xea\x04\xcd\xe6\x3a\x1e\x21\x76\x84\xc2\xab\xd4\x8f\xa5\xc1\x79\x21\x09\x75\xeb\x21\x09\x38\xf1\xae\x90\x25\x6c\xb6\x2b\x91\x68\x95\x0e\xed\xde\x38\x6b\x8f\xef\xd7\x9a\xa2\x39\x22\x65\x69\x85\x37\x40\x21\x24\xcf\x64\x2a\xed\x2a\x64\x61\xe0\xb6\x77\x8a\x28\x76\xa1\x25\x46\x30\xf5\x42\x30\x5e\x14\xa5\xe6\xc9\x42\x98\xe8\x6d\x50\xad\x24\xb0\x89\x50\x5f\x99\x55\x73\xa9\x50\xb3\x84\xdf\x38\x35\x24\x5b\xb1\x52\x5b\x9f\x50\x76\xc7\x03\xaf\xa3\xc1\xe0\xe7\xa8\x4b\xd8\x72\x05\x59\x67\x3a\x1e\x02\x67\x25\x67\xf1\x1f\x86\xe9\x2c\xf5\xb8\xa5\x9f\x3f\x73\xaa\x7c\x42\x5c\xec\xa4\x3d\xa0\x4a\x5a\xcd\x32\xa7\x16\xb9\x13\xe0\xee\x1f\x7f\xf6\x47\xb6\xd0\x55\x69\x26\x31\x84\xc0\x73\xf8\x0c\x9d\x14\xde\x14\xb0\x2c\x13\xdc\x58\xf6\xfc\x19\xcb\xa5\xaa\xdc\x59\x3e\x10\xe3\x0d\xa5\xbd\x46\x7a\xeb\x9f\xff\xd8\x73\xb4\x61\x34\xd6\xf5\x0c\x16\xe2\xd6\x02\xfb\xb3\x91\xe2\x4a\x7b\x1c\x41\x31\xb0\x47\x63\x4b\x8d\xa5\x23\x29\x5e\x45\x65\xf5\x96\x77\xfe\x4f\x95\x9e\xae\x6c\x7f\x18\x98\xff\xc6\x71\x9a\xf8\x2f\xfe\xc3\x0f\xc1\x52\xad\xa1\x54\x3b\x4c\x65\xeb\xdd\xa2\xe7\xd2\xd8\x4e\xbd\xa2\x6b\xdc\x98\x0e\x3f\xee\x7b\x98\xcf\x9d\xc5\x3b\x48\xd1\x3a\xd8\xce\xde\x56\xf3\x4e\xe5\x24\x11\x06\x44\x91\x87\x4f\x03\xff\x2c\x3e\xb5\xe3\x43\x1f\x16\x62\xcb\x7b\x11\x59\x3c\xf3\x0f\xd0\x19\xb3\x17\xb1\xfa\xe8\xf6\x9e\xb1\x07\xa2\x16\x0e\xd6\x94\x11\x46\xaa\x39\x36\xb2\xcc\xab\xcc\xca\x22\xab\x29\x17\x7e\x40\x07\x70\xec\xf0\xe7\x91\x87\x99\x23\x70\x14\x42\x83\x43\x70\xe4\x20\x8c\x25\x94\xc5\x7e\x8c\xa5\x3b\xc7\x0b\x5e\xf2\x40\xfe\x44\xe7\x39\x37\x87\x14\x3b\xe0\x90\xbb\x82\x92\xdd\x1d\xc3\x25\xcf\xc2\xeb\xc7\xb9\x02\xdb\x62\x5c\x2b\x14\x57\x9d\x83\x76\x4d\x87\x0b\x0c\xc5\xf4\x6d\x48\x8f\xc7\xfe\xe9\x2d\x8e\x25\x85\xf8\x4b\x9e\xdc\x08\x95\xb2\x6f\x8c\x27\x5c\xba\x52\x3c\x27\x70\xf5\xa2\xd4\xd8\xb7\x5b\xa4\xad\xdf\x9b\x11\x39\x12\x11\x65\xc4\x83\x40\xa1\xbe\xb5\x2d\x2a\x56\x66\x20\x74\xdd\x6f\x8c\x53\xbe\xde\x2f\xef\x0c\x3a\x69\x4b\xb9\x4c\x84\xd7\x1d\xdd\x04\xb6\xf5\xf2\xcb\xce\x88\x6f\x6c\x33\x0e\x13\x35\xcd\xc4\x5d\x08\x47\x7a\x08\x3e\x02\x8e\x3a\xcf\x9c\x88\x5b\x05\x78\x9d\x16\x83\x4d\x57\xdb\x6b\xd9\x5f\x4e\xfb\x03\x34\xed\xbf\xfd\xf2\xb4\x29\xcc\xde\xf2\x54\x1b\xf6\x65\xa6\x93\x1b\x76\x2a\xc0\x68\xf8\x98\xed\xde\xcb\x69\xfa\xb8\xdb\x34\xe6\x7c\xde\x2d\xcf\x63\xcc\x72\xad\xa4\xd5\x65\x17\x79\xfc\x80\xc0\xf6\x76\xad\xf6\x36\x83\x88\x97\xd3\xf4\xc9\x34\xda\x73\x4c\x3e\x50\x87\xdd\x85\x60\x25\x88\x18\x18\xd4\x77\xff\xe8\x28\x30\x7e\xb3\xd0\xb7\x63\xab\xc7\x95\x11\x63\xd9\x39\x4f\xa9\x37\x7d\x6e\xc4\x0a\x92\xbe\x06\xa1\xd0\xd7\x38\x58\xc3\x44\xb7\x1a\x3c\xe7\xf0\xb9\x53\xe4\xde\x7e\x79\xea\x4e\xef\x49\x6c\x96\x1c\x09\x9b\x1c\x25\xa2\x58\x1c\xd1\x74\x1e\x3d\x59\xbd\x7c\x1c\x86\xae\xc7\x2c\xd1\x59\x46\xb8\x5d\x7a\xc6\x4e\x44\xb1\x08\x8f\x78\x18\xb4\x7a\xcc\xcd\xd2\x0a\xad\x87\x69\xac\x14\x89\x08\x37\x26\x49\x88\x88\xd1\xcb\xe9\xfd\x7a\x41\x3f\x44\xd6\xfe\x84\x3d\x49\xba\xf4\x96\x7b\x10\xe4\x7d\x38\x3d\xea\xf6\xaf\xfc\x70\xe0\xff\x89\xc2\xcd\xcd\x96\x74\x3e\x5f\xb4\x21\xa2\xcf\x67\x68\x61\xa6\x22\x65\x7a\x29\xca\x52\xa6\xc2\xb0\x20\xa3\x63\xc7\x92\xcc\x1e\x06\xe5\x77\xdd\xf1\x1e\x57\x7e\xc0\xc3\xf1\x29\x44\xc2\xdb\x8d\xb9\x2e\xbc\x79\x9a\x4b\xf5\x30\xb8\xbc\x23\xbd\x4c\xc2\x33\x71\xfe\xa6\xb7\xe9\x7d\x85\xe3\x34\xad\x6f\xff\x61\x04\xb2\xff\x0b\xc0\xf3\x5f\x07\x9e\x65\x4a\xa7\xdd\xa2\x61\x5b\xb6\xa1\xe7\xdc\x8a\xdb\x8e\x8a\xcf\xb8\x16\xf5\x5d\x7f\x0f\x96\xd7\xe3\xb6\xc1\xb7\xd4\x20\x23\xda\xd7\x88\x7a\xbf\x2d\x75\x8a\x38\x68\x18\xd7\xb2\x27\x45\xab\xbf\x98\xdf\x9a\xc7\x97\xe7\xec\x2b\x7c\xde\xf6\x3a\x7e\x94\xda\xa2\x25\x73\xaa\x73\x2e\x07\x6a\xc4\x1e\x35\x74\x8a\x5f\xf8\x32\x3c\x8c\xe1\xd3\xe2\x2e\xf4\x33\x39\xaf\x4a\x91\x32\xf2\x7e\xec\xda\x18\x3c\xe0\x36\x06\xc3\x2a\xc5\xb5\x4e\x1c\x79\xcc\x7d\x65\x4c\xad\x07\x7b\x2e\x02\x75\x20\xa4\x20\x31\x23\x94\x91\x90\x75\x10\x25\xc6\x81\xb2\x0c\xf9\xdf\xa1\x0c\x06\x15\xe7\x11\x7b\xa5\xe7\x52\x79\xe9\xa4\x29\xd9\x65\xc6\x65\xd6\x8f\x9c\x3b\x4d\xf7\x57\xa6\xe9\x1a\x93\xfd\xff\xd9\x7b\xd7\xee\xc6\x6d\x2c\x5d\xf8\x7b\x7e\x05\x96\xba\xd7\xb2\x9d\x91\xe4\xaa\x74\x26\x3d\xa7\xce\x4c\xcf\x72\x6c\x57\xda\x27\x75\xf1\xb1\x5c\x95\x35\x27\xc9\x3b\x81\x48\x48\x42\x9b\x02\x18\x02\x94\x4b\xdd\xd3\xff\xfd\x5d\xd8\x1b\x00\x41\x8a\x92\x48\x49\xbe\x54\x42\x7e\x48\xca\x22\x09\xe2\xba\xef\xfb\xd9\x97\x82\x8e\x93\xdd\x23\x19\xcb\x8c\x37\xa1\x10\x27\xc5\xa0\xcd\xd3\x98\x2b\xf3\x7f\x32\x1a\xbd\x01\xdf\x6c\x2e\x9c\x66\x08\x5e\x47\xcb\x36\x7c\x7e\x31\x12\x97\xa7\xa3\x07\x48\xb3\x0f\x56\xa7\xe2\x4a\xc4\x66\xb8\x4c\x95\x02\x80\xed\x57\xb0\x0a\x88\xcf\x5e\xc3\xe8\xc3\x31\x23\xb7\x33\x1e\xdd\x5d\x07\x2e\x58\x99\x99\xdf\x44\xf0\x53\x49\xd0\xa8\xde\x7b\x2a\x86\x63\x87\x75\x7d\x28\xb3\xd7\x6d\xc0\x71\x47\x76\xca\x4c\xe3\x84\x2a\x25\x23\x5e\xf8\xfc\xc1\x28\x5c\xb0\xe4\x18\x58\xf2\xd3\x4d\x03\x48\x89\x0f\x22\x7f\xb8\x8d\x63\x85\x56\xaa\x42\x79\x83\x0b\x37\x5b\x4f\x36\x74\xdc\xca\x07\xab\xae\x79\x5b\xaa\xa7\xe9\xb4\xbe\x8a\xfb\xd9\xe5\x83\xda\x8d\xe2\xe4\x79\x5b\xc0\x79\x75\xab\xf8\xba\x9a\xb6\xbe\xc7\x93\x4c\xd6\xee\xc9\xda\x75\x56\xb8\x4a\xec\x0d\xfe\x66\x1d\xd2\x40\x54\x52\x99\xe6\x09\x46\xad\xee\x5f\x56\xd4\x79\xf3\xf0\x3b\x4f\xe0\xa0\x7e\x6e\xc5\x88\xda\xa6\xf3\xfd\x36\xea\x12\x05\x0a\xc1\x8b\x6f\xbe\xfe\xfa\x73\xaf\x54\xb4\x9f\xe1\xec\xa9\x4b\x15\xed\xe5\xea\xea\x50\x0a\x3a\x94\x82\x4d\xd7\x93\x7b\x62\x1f\x1f\x87\xe0\x20\x49\x62\x87\x48\x10\xdb\x17\x69\x60\xcf\xe4\xb2\xc3\x24\x96\xed\x8d\x25\xf0\xa0\x08\x02\x07\xca\xb1\xda\x1f\x2d\xa0\xc3\x08\xf8\x7d\x60\x04\x1c\x2e\xb7\xea\x50\x78\x00\xfb\xe7\x54\xfd\xf6\x73\xff\xf7\x26\x13\xfb\x66\x98\xb7\xcf\x2b\x3f\x54\xfd\x8a\x43\xd9\xd9\x0f\x66\x18\x28\x59\x75\xad\xbe\xeb\x76\x06\x46\x5e\x17\x88\xef\x5a\x1a\xa2\xf1\x84\xda\x2e\xd9\xdb\x58\x80\x5d\x91\x3b\xf1\xe0\xf2\xae\xc1\x96\xde\x8f\x2a\x2e\x76\xff\xf3\xf3\xf7\xac\x77\x2e\xe6\xae\x8c\x7a\xe7\x7f\xf4\xd7\x1a\xff\xa3\x2a\x61\xbc\x3a\x8b\x20\x50\x42\x10\xc1\xe4\x38\xac\xa3\x52\x9c\xff\xb3\xeb\x2b\x12\x65\x0c\x20\x0d\x68\xa2\x86\xa4\x46\x42\x73\x9e\x1a\x2b\xd1\x39\xc9\x8c\x6a\xcd\xe6\xa9\xde\x77\xc3\x75\xee\xc7\xdf\x99\xfb\xf1\xc0\x3e\x83\x8f\xbe\x39\x67\x2d\x9a\xe5\x73\x2a\x06\x86\x5a\x80\x23\xb2\x14\xcf\x51\x61\x7c\x43\xe2\x72\xe0\x70\x36\x69\xc6\x10\xdc\x3c\x17\xfc\xd7\x9c\x15\xf6\x05\x2f\x5e\x3c\x03\x57\x0b\xf4\xe3\xc0\x73\x87\xa2\x53\x85\x8a\x44\x72\x25\x95\xc9\x4e\x88\x9f\x47\x47\x30\x02\xf9\xab\x64\x2b\xd3\x33\x86\x62\xda\x35\x80\x03\x14\x4f\x95\xf5\x3b\x54\xf0\x68\x92\xc8\x7b\xfc\x76\x28\x78\x98\xf5\x33\x7d\xb1\x78\x1c\x63\x46\xe6\x3c\xcb\x64\x66\x5d\x3c\x61\x77\x30\x2c\xc7\xe8\x89\x2c\x43\x85\x2b\xb3\x51\x15\x23\xa6\xc3\xad\xa2\x25\xa1\x02\x13\x17\xcd\xbf\x5d\x50\x32\xd6\x3f\xb3\xf4\x6e\xcc\x66\x74\xc1\x65\x9e\xe1\xdb\x5a\x92\x9e\xbd\x05\x2c\x77\x29\x73\x6f\xe6\xce\x21\x4f\xc9\x8f\x4e\xd5\xcc\xd3\xbb\xe2\x26\x28\xa8\xb1\x74\xf6\xc3\x01\xfb\xc4\x95\x5e\x1d\x8b\x9b\x22\x57\x20\xe1\x29\x76\xde\x42\xa5\x86\xc1\x7e\xdc\x39\xe7\xb4\xbc\xdf\xc2\xd6\xca\x22\xe9\x62\x04\xb7\xb6\x09\xa4\x16\xa9\x05\x53\xc5\x5d\x52\xd8\xe7\x17\xee\x89\xa3\xdc\xb1\x32\x53\x27\x11\x7f\x2e\x12\xb1\x0f\x90\x48\x78\xb4\xbc\xba\x38\x8c\xcc\xe7\x03\x23\x4c\xa3\xe4\x5b\xaa\x58\x4c\xde\x52\x41\xa7\x68\x1c\x39\x1e\x5d\x7f\xfb\xf6\xc4\x6c\x12\x30\xbe\x5c\x5d\xd4\x46\x4f\x8c\xc2\x9e\xbd\x7b\xaa\xf4\x6d\x52\x9d\xa3\x83\x49\x05\x2d\x67\xe9\xc9\x12\xd8\x89\xe7\xec\xfb\x94\xec\x5a\x05\x37\xc2\x70\x08\x87\x54\xa6\xaa\xe4\x75\x31\x8f\xef\x1e\x72\xb8\x81\xad\x7a\xd3\x98\x9a\x39\x9a\x1a\x38\x93\x2a\x6b\x9f\x51\xcd\xa6\xcb\x0b\x96\x26\x72\x69\x96\xfb\x3a\x30\x9d\xe3\xa3\x63\x64\xf5\xd9\x98\x46\x24\xcb\x13\x86\xd5\x6b\xaa\x10\x61\x82\xb1\xb8\xa0\x53\x5c\x28\x4d\x01\x20\x0c\xdb\xdf\xd8\xa3\xc6\x0c\xa6\x29\x2b\x19\x60\x3f\xb7\x3e\x55\x86\x53\x34\x07\x6a\xe3\x2b\xcd\x99\x09\x7c\x7e\xfb\x0e\x6d\xe3\x3c\x6c\xec\x26\x2c\x6f\x70\x38\xd3\x37\x79\x62\x58\x47\x12\x57\x8a\x88\x82\x6c\x65\xd7\x18\x91\x19\x80\x02\x98\xde\xf7\xc9\x38\x37\x82\x17\x53\x25\xfb\xf2\x2a\x2c\xe5\xfd\x0c\xfd\xc6\xe6\x25\x42\xd3\x34\xe1\x18\xd7\x2b\x33\xeb\xfc\x0d\xac\x8d\xab\x8f\x35\x21\x24\x2d\xe5\x8f\x76\xf2\xc6\x80\x2c\x58\x36\x6e\x82\xa9\xd0\x56\x94\xa0\x29\x07\xdf\x49\x63\xc9\xa3\x0c\x0a\x79\x7d\x85\x6f\x3b\x4d\x2d\x54\xcd\xdc\x4d\x5c\x41\xbb\x36\x0e\x50\xd0\x56\xa5\x41\x6d\xc3\xa3\x02\x9d\x5d\x5f\x21\x0c\x95\x05\x06\x2a\x4c\x16\x46\xb6\xa7\x18\x1c\x58\xa0\x11\xd2\xa9\x69\x51\x13\x29\xfc\x47\x99\xc8\xe7\x0c\xc1\x84\x8a\x72\x56\x46\xe1\x13\xcb\xa2\xf5\xc2\xe2\x61\xf4\x93\xe6\xe2\x44\x7b\x37\x7a\x4b\xb7\x79\x6b\xce\x23\xa4\xb8\xb1\xc3\xfc\x70\xf3\x66\xb7\x45\x7c\x57\x6e\xc3\x82\xc7\x30\xc0\xc9\x4b\x69\xa6\x39\x4d\x48\x9e\x25\xce\x0d\x87\x41\xef\x36\x2c\x6d\x46\x17\x01\xc0\xce\x90\x90\x2f\x71\xe5\xec\xc4\xe2\xf9\xc4\xf2\xae\xb8\xf2\x93\x3c\x49\xfa\x64\xc2\x05\x35\x64\x97\xa5\x24\x74\x07\x8d\xb8\x88\x8c\xfa\x65\x74\x7d\x5b\xaf\x05\x7a\xe4\x94\x32\x7f\x48\xc1\xcb\x08\xde\x52\x96\xc4\x00\xba\x08\x9f\x30\x07\x36\x02\x13\x81\xd1\x1a\xcf\x93\x5c\x69\x96\xdd\x48\xc3\x0c\x82\xb8\x16\x80\xa3\xa0\xe1\xed\x6f\xb9\x88\x21\x84\xe9\x06\x18\x47\x44\x05\x61\x1c\x8c\x2f\xa6\x49\xf0\x53\x9b\xbd\x53\x6c\xa8\x63\x95\x47\x33\x33\xa4\x5e\x2a\x63\xd5\x33\x64\xa4\x87\x26\x3a\xd5\x3b\x31\x7f\x55\xc7\x80\x61\x2a\xc1\x7b\xa7\x34\xe5\xbd\x93\x3e\x81\x09\x02\xc7\x99\xd4\xb3\xcf\x77\x1f\xba\xb1\x82\x4e\xbc\xd3\x2e\xbc\x09\x5b\x80\x3d\x28\x8a\xea\x5f\xf7\x33\xae\x99\x2f\xbe\x8d\x96\x1d\x8f\xaf\x52\x25\xd6\x84\x9c\x09\xc2\xe6\xa9\x06\x6b\x31\x99\x33\xea\x5c\xc8\x6c\xc1\xb2\xa5\xd1\xc9\x01\x88\xe2\xb3\x3f\xfc\x7e\x3f\xee\x35\xe1\x95\xca\xe6\xc5\x26\x87\x13\xb6\x32\xb9\x47\x5f\x1e\x95\xf4\xfc\x24\x09\xa8\xf9\x67\x3b\x95\xc0\x5e\x77\x9a\xc6\x8f\xe6\xcd\xf2\x14\xe2\x4f\x48\x2d\x3d\xfd\x78\xf3\xc6\x3a\x32\x70\xae\xbe\xe7\x22\x46\x11\xf5\x4c\xeb\x8c\x8f\x73\xcd\x6e\x98\xe9\x70\x84\x21\x0f\xae\x0a\x9f\x8d\x8e\xb6\x2b\x51\x3b\xfd\xd0\xf7\xcf\x71\xea\x57\x05\xdb\xa6\xc2\xe8\x86\xe6\x9d\x2c\xbf\xae\xa9\x8d\x0d\x58\x85\xe0\xad\x8c\xeb\x0f\x55\x25\x33\xa4\x78\xd8\x8a\x2a\x41\x65\x4b\xd7\x96\x15\x62\x97\x69\xad\xa4\xbf\x79\x39\x36\x4c\xfd\xba\x9e\x14\xb6\x01\xa0\xa0\xc1\x9d\xdb\x65\xca\x2c\xd2\x36\x99\x24\x74\x5a\x6c\x23\xa0\x87\x28\x3e\x9d\x8f\x3e\xba\x21\x28\xc2\xeb\x05\xd9\xad\x92\xee\x36\xd9\x76\x50\xcc\xd2\xda\x27\xcc\x47\x6a\x6f\x6e\x17\x70\x7d\xe3\xeb\x77\x53\x13\xb7\x9f\xde\x68\x52\x5b\x37\xff\xb7\x16\xe1\x8b\x06\x3b\xc1\x01\x88\x39\x75\x13\x22\x91\x40\x42\x19\x7d\x2c\x6d\x93\x2d\xfd\x5d\xb3\x69\xef\xd8\xf2\x5e\x66\xf5\x68\xe0\x3b\xef\xaf\x8d\x5f\xc4\xea\xfc\x5b\x0f\xc8\x5b\x9a\x9a\x61\x17\x71\x9e\x48\xf0\xac\xd7\x11\xb5\x02\x8c\xd0\x72\x51\x71\x32\x9b\x52\xc1\xff\x8e\xc1\xb1\x91\x39\xc7\x32\x33\x7f\x1e\xa3\xe7\x02\x35\xfa\x84\x45\xfa\xc4\xee\xbf\x5a\xba\xb7\x65\x83\xd2\x38\xe6\x28\x57\x5c\x6f\xd9\x4b\x9b\x27\x81\x8b\xbb\x87\x98\xf3\x0d\x07\x6b\xfb\xde\xdf\xec\xfa\x6c\x40\x9b\xf3\x6c\x43\x74\xd3\xc6\xf7\xe7\x94\xdb\x8a\xae\xcf\x6e\x56\xd8\x9c\xf2\x5d\x87\x85\xd7\x1e\xf3\x3a\xa7\x3a\xcf\xb8\xae\x65\x48\x9b\x5f\xe4\xe2\xfb\x7c\xcc\xac\xb7\xb7\xf5\xeb\x02\x82\xf7\xce\xae\xaf\x0e\xbb\x1c\xab\xf0\xd2\xb6\x83\x46\xa2\x21\xb9\xa0\xf3\x31\x9f\xe6\x32\x57\xc9\x32\x34\x57\x52\x70\x56\x1b\x75\x1f\xed\x35\xe2\x48\x13\x2a\xa4\x58\xce\xed\xa3\x22\x4a\xf2\x98\x95\x5a\x04\x9f\xde\x42\xf2\x98\xd0\x5c\xcb\x39\xd5\x3c\x22\x91\xc4\x7b\xe5\x96\x72\xc5\x08\x5d\xf3\x6e\x94\x2b\x2d\xe7\x64\x4e\x33\x35\xa3\x49\xb2\x6e\x8d\x0f\xc0\xd5\x36\x01\x68\x0f\x60\xfc\x6b\x6f\x2e\xb0\xd7\x3b\xee\xef\x2d\x78\xe1\x0d\xf6\xb7\xe9\xdc\x5e\x0d\x2c\xd6\xef\xd2\x06\x6d\xd8\x94\xf8\x5a\xb8\x9e\x2d\x0b\xb3\x6d\x76\x36\x9d\xdc\xad\xe3\xda\x40\x0d\x37\xbe\x0b\xa1\xb3\x2c\xbe\x9a\xd3\x69\x03\x41\xf2\x8d\xd1\x1b\xa8\x58\xba\xd7\x10\x45\x52\xf5\x89\xcc\x6c\x0c\x88\xaf\xc9\x6d\x6f\x79\x00\xd2\x8c\xbc\x07\x37\x9b\xcc\x6c\x30\xb5\xdd\xa5\x10\x5a\xcf\xb2\x89\xcc\xe6\x46\xae\xe3\x19\x99\xe4\x02\x55\x0b\x1b\x7b\x0d\xca\x8a\xb5\xe2\xd0\x44\x49\x7f\x02\xc1\x6f\x27\x5c\x27\x08\x55\xe4\x9e\x25\xc9\x90\x9c\x25\x89\x85\xb7\x0c\xa0\x11\x8a\x94\xe7\x22\x42\x60\xbc\x24\x31\x9f\x32\xa5\xc9\xf1\xe8\xaf\x67\x27\xc0\xb5\xc1\xc2\xb1\x24\x9a\xba\x3c\xb1\xb2\xe5\x06\xf8\x7f\x9c\x83\x9c\x10\x51\x4d\x13\x39\x45\x27\x39\x58\x70\x45\x4c\xd2\x84\x2e\x01\xa4\x3e\xa5\x19\x04\x8a\x46\x68\xbd\x21\x59\x2e\x00\x9e\xf7\x51\x39\xce\x76\x52\xb0\x09\x41\x77\x00\x7b\x72\xc7\xa3\xbe\x05\xb5\xf4\x61\x59\x59\xc6\xd2\x84\xae\xb1\x37\x6c\x48\xfb\x35\x62\x2e\xa8\xb0\x52\x30\xdf\xc6\x90\x8c\x70\xef\xcc\xa9\x8e\xd0\x85\xf9\xcb\x9c\x69\x1a\x53\x4d\x87\x46\x17\xfc\xa5\x9c\x98\x26\x93\xd8\x34\xb4\x7e\xa1\xd7\xf4\x19\xe5\xc5\xfa\x62\xec\xe5\x53\x68\x84\x5a\xff\x38\xc8\xe7\xee\x3c\x6e\x34\x70\xec\x49\x9f\x60\xf8\x97\x9f\x8c\x2a\xb6\xd1\xbb\x56\xea\x6b\xf5\xa5\xb2\xfd\x21\x29\x8f\xc4\xee\xd6\x39\x03\x5c\xc4\x5b\x5b\xcf\xc7\xfd\x02\xc6\xd5\xb3\x77\x17\xeb\x0d\x61\xdb\x4d\x06\x5b\x4c\x04\x65\x97\xc1\x86\xee\x39\xd3\xb3\xbd\x53\xf6\x1b\xb8\xe4\x14\xc8\xdf\xc3\x54\x0f\xea\xc0\x53\xdc\xc3\xb8\x60\xe5\xcc\x43\x7c\x6f\xbd\x7d\xa4\x91\xe3\xa6\x89\xbb\x66\x5b\xa2\xd7\xc0\x77\x76\xed\x43\xcd\xbc\x37\x5b\x93\xb1\x4a\x13\x6e\xb3\x1d\x21\xb9\x12\x66\x1e\x52\x36\x9c\xf1\xd4\x4f\x76\x53\x6f\x57\x43\xfb\x8e\x1b\x6a\x8b\x8e\xfa\xa5\x2c\x85\x11\xdd\xb1\xe5\x91\xb2\xb9\x28\x52\xa8\x19\x4f\x31\x5b\xd0\x3a\x28\xec\xea\x92\x8f\x34\xe1\xb1\x6f\x02\x77\xf5\x95\xe8\x93\x77\x52\x9b\xff\x5d\x7e\xe2\x4a\xa3\xfa\x79\x21\x99\x7a\x27\x35\xfc\x72\x90\xa1\x62\x17\x5a\x0c\xd4\x2a\xc0\x68\xe3\x86\x73\x15\xa8\xc9\x6e\x40\x57\x96\xec\xb9\x49\xe1\x8a\x5c\x09\x23\x11\xd8\x11\xf9\x2c\x5a\x65\x9b\x70\x89\x22\x42\x8a\x01\x58\xbf\x6b\xdb\xb0\x13\x21\xb3\xd2\x3c\x6c\x68\xce\x36\x85\xe1\x7c\x70\x87\x2b\x47\xc4\x3d\xcf\xa6\xce\xec\xc6\x23\x32\x67\xd9\x14\xfc\x39\xd1\x16\x7f\x46\x53\x53\x64\x23\x03\xe4\xd6\xb5\x02\x92\xf9\x66\xad\xe1\x62\x65\x91\x82\xe7\x91\x2c\xcd\xd1\x9a\xf1\x0f\x43\x7d\x60\xa6\xfe\x09\xa9\xd4\x6a\x48\xce\x5c\xb1\x94\xf0\x9e\xf5\x6b\x85\xcd\x98\x16\xb8\x22\x86\x94\x2c\x68\xc2\x10\x39\x9e\x0a\x9f\x05\x25\x27\x2b\x84\xbd\x6f\x53\xaa\xcd\x99\xf5\x22\x53\xef\x8e\x2d\x7b\xfd\x95\xa5\xed\x5d\x89\x5e\x91\x02\x57\x5a\x4c\x4f\x44\x41\xda\xea\xc1\xbd\xde\xee\xbc\x60\x23\xb1\x6c\x6e\x5e\xd9\xba\x6e\xea\x8e\xd7\x3b\xa6\x6b\x85\x8d\x63\x75\x62\xa6\x10\x9c\xc1\x19\x99\xcb\x0c\xcc\x99\xe6\xd7\x10\x48\xc3\x88\xaa\x77\x3c\x4d\x0b\xdc\x91\x3c\x9d\x66\x34\x66\x64\x9a\xd1\x74\xd6\x56\x2c\x41\xd9\xa6\xae\xf9\xcf\x46\xd0\x5d\x33\xf9\x1b\x34\xba\xd2\xf4\x3b\x05\xc4\x29\xde\x70\x58\xee\x33\x9a\xa6\x2c\x23\x34\x93\x39\x18\xed\xe6\x0b\x96\x0d\xdd\x23\x18\x72\xe1\xed\xcc\x91\xcc\x32\x16\x69\xa7\xa2\xdb\xa8\x60\x4c\x58\x15\x31\x64\xa3\xb6\x16\xfb\xee\xd9\x78\x26\xe5\x1d\x64\xcd\xc1\x76\x7c\x40\x2b\xc8\x0f\xf8\xad\x8b\xe2\x37\xa7\xd0\x2a\x12\x33\x4d\x79\x02\xb1\x26\xef\xdf\xbc\xb5\xd1\x28\x4e\x9a\x70\xbd\xac\x0f\xec\x38\x80\x1a\x42\x63\x1b\x25\x75\xc3\x16\x9c\xdd\xdb\xf9\x5f\x17\x47\x32\x20\x53\x26\x20\x78\x62\x43\x90\xd1\x80\x28\x1e\xb3\x4b\x48\xc6\x5d\xdf\xd0\x1e\xe6\xfb\x35\x7d\xde\x46\x42\x36\xf3\x91\xad\x3c\xa4\x01\xaf\xf7\x4a\xf8\xb5\xcc\x36\x00\xff\x34\xcb\x0d\x6e\x96\xf7\x6b\xa3\xd3\x5f\x91\xaf\xbf\xfe\xd3\xda\x87\xe6\xf4\x13\x9f\xe7\xf3\x57\xe4\x9b\x7f\xfd\xd7\x3f\xfd\xeb\xfa\xc7\xb8\xc0\xc7\x5e\xae\x1f\x9f\x3d\xf3\xe7\x37\x17\xcf\x60\xbe\x63\x1f\xed\xb7\xd9\x35\xd8\xa0\xa9\x09\xe5\x49\x9e\xd9\x90\xd4\x86\x8a\xca\xeb\xf0\x1d\x70\xeb\x14\xc9\x14\xd4\xb5\xe8\x82\xd1\x6c\x90\xda\x84\x0b\xa6\xa0\x34\x4a\x2e\x32\x16\xc9\xa9\xe0\x7f\x67\xb1\xab\x8c\x02\x81\x27\x00\xb0\xee\xb6\x38\x61\x22\xc6\x9a\x94\x86\xf3\xce\xa8\x88\x93\x4d\x01\x09\x0d\x46\x1a\x9e\xe0\xbd\xa6\x0c\xf8\x5f\xab\x09\x7b\x5b\xbc\x51\x99\x2e\xa8\xac\x69\x9d\x60\xc8\x57\x71\xda\xf6\x1a\x29\x12\xc6\xd1\x06\xf5\xbe\xa6\x8f\x2b\xda\x27\x2a\xce\xf0\xdb\xaf\x39\xcb\x96\x90\x38\x52\xa8\x17\x41\xa0\xda\x6d\x81\x2b\xe0\x86\x61\xe5\x3a\x44\x72\xa9\x68\xe4\x85\x28\x55\x84\xa3\x54\xbe\x0d\xef\x30\x74\xe2\x3b\x77\x16\x39\x23\x22\x4f\x92\x75\x8f\x0a\xb9\xc9\xf1\x15\xce\xdd\x16\x85\xb6\x99\xa6\xd9\xd4\x38\x51\x33\xd3\x8f\x6a\xa2\x08\x07\x7e\x20\x85\xe2\x79\x1b\x2d\xc2\x01\x37\x8a\x39\x6d\x1e\x6f\xda\x0c\xaf\xa6\x81\x31\x03\xaf\x36\x01\xa9\x0d\x51\x66\x1e\xd2\xbc\x81\x57\xab\xf8\xa1\x66\xa6\x8e\x9a\xae\x3f\x3b\x83\xc7\x0e\x83\x6f\x62\xfc\xa8\x19\x7a\x67\x02\x59\x99\xf0\xa6\x31\x59\x2d\xe2\xb1\x1a\xae\x64\x03\xd3\x08\x5e\x9d\x81\xa4\x15\x27\x6a\x40\x98\xdb\x19\x4b\x1a\xaf\x6a\xc6\xb8\x58\x48\x44\x69\x6e\x25\xc3\xdd\xac\xbc\x58\x11\xe5\xee\x81\xb2\x5a\x59\xce\x0b\xbf\xa1\x48\x6b\x14\x5a\x92\xab\xed\x26\xf7\xcd\x23\xd8\x9c\x9b\x72\x10\x1d\xa4\x3c\xf2\x3c\x61\x3f\x70\x3d\x7b\xef\xd0\xd8\xed\xae\xd6\x79\x9a\xc0\x60\x83\x1b\x66\x0b\xdd\x14\x92\xe1\x15\x56\xf0\x62\x91\x9c\xcf\x99\x88\x31\x94\x69\x4e\xef\x18\x29\x0a\x41\x1a\x19\x0f\xc4\x60\x68\x8e\x7d\x4a\xa9\x28\xe4\xc4\x85\xa1\xe5\x9b\x76\x54\xc3\xfd\xd4\x94\xd7\x36\x4e\xfa\xd8\x9c\xec\x11\x64\x6b\x94\x92\x3a\xc8\x98\x25\x12\x8c\x38\x18\xaf\x8a\xb1\xd6\xf6\x51\x20\xc9\xf6\x57\xcb\xf5\x2c\xf2\x23\x13\xd3\x02\x67\x4a\x25\x50\xa4\xd5\x52\x60\x29\xd8\x90\xdc\x58\x11\xa6\x99\x54\xd4\x84\x9c\x36\x24\xa5\x8d\x19\x62\x81\xcd\xd0\x7a\x66\xdd\x7b\xe1\xdc\x2e\xdc\x6f\x4d\x66\xd7\x3d\xfc\x5b\x9e\x5f\x5f\x29\xa1\xdd\xf4\x96\x8f\x74\xc1\x15\xfc\xdc\x56\x88\x57\x84\x25\x80\xc1\x54\x37\x20\xe7\x37\x97\x67\xb7\x97\x7d\xf2\xe1\xfa\x02\xfe\x7f\x71\xf9\xe6\xd2\xfc\xff\xfc\xfd\xbb\x77\x97\xe7\xb7\x46\x8e\xf8\x12\x71\xe0\x8d\x1a\x67\x66\xd7\xf0\x23\x59\xa6\x16\x54\x2c\xc9\x24\xd7\x86\x1c\x14\x1f\x2b\xf5\x82\xa2\x0d\x80\xc6\xb1\x51\x19\x3f\xbb\x35\xac\x9f\xf0\xaa\xd9\x24\x2c\x76\x81\xd0\xf9\x36\x99\x6b\xbb\x98\xd4\x78\x93\x34\xce\x8a\x28\x75\xb9\xb7\x63\x3a\xc4\x4f\x82\xbc\x96\x19\xb1\x75\xbe\x5e\x91\xa3\x54\xc6\xea\xc8\x26\x9d\x98\x7f\x0f\xf1\xa7\xd3\x44\x4e\x8f\x7c\x2e\x0a\x23\x89\x9c\x12\x95\x8f\x7d\x8e\x10\x70\x53\x78\xfa\x4b\xf7\x58\x29\xb5\xa2\xef\x13\x85\x82\xb7\x7c\xe3\xa5\x77\xc2\x07\xc2\x76\x4f\xa1\xc8\x57\xe9\x49\xf3\x43\xb5\xc1\x2f\x4f\xeb\x7b\xe0\x04\x27\x9e\x55\xde\xf8\x49\x98\xed\x7a\xcf\x93\x38\xa2\x59\xbc\xb2\x67\x81\xb9\xe1\x92\xc3\xec\x21\x6e\x2e\xd6\x48\x2e\x1a\xb7\xe0\x19\x72\xc1\xb2\x84\xa6\x18\xa7\x0e\xc0\xc5\x10\x00\x05\x1f\xb9\x60\x29\x83\x3c\x2d\x57\xb5\x9b\x89\x28\x91\x80\xd3\x81\x9c\xb1\x5f\x1e\x3a\x06\x44\x39\x50\x42\x9b\xec\x53\x9c\x90\xde\xb3\x25\x73\x10\xec\xdc\x6a\xf7\x62\x78\xf4\x5a\xb0\x17\x9f\x3d\x82\x4a\xa3\x97\x7c\x19\xe9\xd9\x2c\xb8\x5e\x9f\xf4\x3c\x9e\x49\x6c\xa5\xe4\xde\x97\xbd\xe2\x81\x30\x8f\x0a\x84\x64\xeb\x98\x1a\xc0\x77\xc2\x6c\x4b\x58\x60\xe7\x3e\xf3\x9f\x2e\x30\x69\x0c\x6b\xb3\x46\x2c\xe8\x43\xb9\xa1\x61\xa9\x23\x2b\x5f\x2d\x52\x00\xb7\x7e\xd1\x74\x3f\x78\x5d\x43\xba\x3c\xa6\x12\xda\xc9\xc9\x82\x8c\x9b\x21\x19\x95\x36\x8f\x77\xff\x85\xa0\x39\x3c\x23\x29\xcd\x8c\x2a\xe2\x9e\x2c\xd7\x0b\xfb\x72\x6b\xb5\xb0\x06\x9b\x20\xf0\xaf\x34\x94\xda\x47\xfe\x8d\xf3\x84\x2a\x55\x63\x79\x05\x42\x60\x1a\x26\x0c\x5b\x26\xd4\x39\x9f\x00\x84\x7a\x46\x17\x1b\xe0\x12\x1a\x74\x5a\xd3\x6c\xca\xf4\x66\xcf\x08\x15\xcb\xf7\x1b\x61\xd2\x06\x8d\x81\x55\x07\xcd\x4e\xd3\xa7\x41\x01\xca\x35\xe0\x42\x0f\x64\x36\xc0\x57\x5e\x11\x9d\xe5\xeb\x7c\x5c\x9a\xcf\x99\xcc\xf5\x88\x45\x52\xd4\xe7\x55\xd8\xe7\x0e\xe6\xea\x69\x91\x6c\x62\xbd\x8d\x67\x4e\x8c\x70\x19\x27\xa1\x91\xbd\x90\x31\x9c\x87\xb1\x0c\xd2\xf2\xfe\xcd\xdb\x7d\x16\x9b\x40\x9a\xf5\xe6\x95\xfc\x68\xc9\xbe\x98\xfa\x9e\xda\x9e\x6f\x7c\xed\x6d\xae\xdb\xbf\x74\xee\x3d\x57\x9b\x9f\xb6\x93\xb1\x19\x98\x63\xed\xf8\x95\xa6\x3a\x5f\xd9\x0d\xa5\xb5\xb1\xc4\x72\x84\x89\x6d\x56\xa6\x1f\xc1\x7b\xa1\x91\x6f\x15\x9f\x00\x71\x6e\xe1\x39\x17\x32\x39\x24\xf6\x45\x73\x3e\x75\x46\x39\x2a\x90\x34\xd2\x39\xe4\x4e\x53\x6d\xc3\x2b\x2d\xbc\xce\x17\x75\xc3\xa8\x55\x19\x37\xa9\x89\x11\xcb\xb4\x7a\x43\x95\xfe\x90\xc6\x74\x4d\x0e\x55\x25\x6c\x52\x69\x38\x30\x28\x58\xdf\x0b\x16\x1b\x0a\x6f\xa7\x00\xdb\x23\xf7\x86\xf4\xe6\xd8\x62\x5b\x4f\x7e\x71\x80\xcc\xeb\x03\xf3\xa9\xfa\x5e\xdf\x48\x33\x27\x67\xb5\x04\xa8\x1c\x30\xb2\xad\xb7\x86\x9d\x64\xd0\x1a\x11\xec\x53\x9d\xc6\xbd\x7f\x8f\x13\x46\x45\x7d\xd0\x7e\x65\x47\xc1\x73\xed\xf7\x90\xfd\x00\xb9\x9f\x71\x23\xb2\x62\xae\x99\x22\x4e\x84\x8a\x59\xc2\xd6\xa4\x9c\xed\x19\xd0\x6a\xbf\x70\x61\x3f\xd0\x28\xd8\xea\xba\xfc\x8e\x37\xe8\x5b\x21\xdc\xa6\x70\x14\xc2\xb2\x95\x1e\xbc\xd6\x54\x1d\x15\x88\x2f\xe3\x44\x46\x77\x08\x32\x06\x78\x03\xfc\xef\x2c\x73\xd1\xef\xdc\x57\xf5\xb2\x95\xa7\xa6\xae\x2a\xa6\x9b\x37\x57\x7e\x08\x5a\x31\x6d\x9b\x09\xf4\xed\xcb\xac\xb0\x2c\xe6\xc2\xe6\xf0\x3d\x4e\x00\xad\x53\x54\x20\x6b\xa0\xe4\x39\x58\xd5\x59\x30\xd0\x06\x30\x10\xad\xca\x48\xe7\x36\xc7\xe6\xf4\xfb\xf5\xf9\x28\x07\x0d\x8a\xdd\x94\x15\x83\x4f\xc0\xf4\x89\x68\x23\x14\xce\xc6\xfc\x99\xa6\x96\xaf\x2d\x79\x32\xa4\xb9\x90\xee\xbb\xdc\xa4\xb5\x83\x86\x38\x1e\xdc\xdb\xb7\x36\x19\xa1\xb8\xda\xf8\xf0\x9a\x82\xaf\xb6\xf2\x32\x89\x36\x20\x99\x65\x70\x13\xaf\x76\xd8\x54\x53\xf4\xc4\x4f\x64\xb6\x56\x81\x39\x5c\xe7\x37\x67\x55\x6d\x6d\xc8\x48\x9f\xeb\x63\xd7\x56\x53\x88\x0c\xf5\xf2\xaf\xf4\x09\x25\x33\xae\xb4\xcc\xac\x6b\x0d\x8a\x87\x65\x14\x2a\x94\xd6\xc7\x80\x1d\x26\x1a\xee\xdc\x77\x81\xd0\x34\x65\xd4\x17\x1b\xb2\xbc\x09\xaa\x05\x65\x2c\x92\x59\x5c\xdb\x31\xa7\xdd\xd7\xca\x52\xb5\x9f\x3f\x40\x86\x68\x42\x95\xbe\xf5\x7d\x30\x02\x42\x43\x6a\x5c\x16\x7f\xec\x10\x8b\xd1\x38\xb8\x19\x29\x8a\x9b\x92\x50\x81\x56\x8d\xfd\x64\xf0\xed\x42\x46\x31\x36\x94\xe6\x76\x1a\xd7\xbd\x97\xdc\x82\x21\x3e\x4e\xcf\xe7\x4c\xa9\x8d\xe9\x4e\x95\x20\x0d\xc0\x09\x26\x1e\x27\xd8\xbe\xee\x98\x3d\x0a\x08\x18\x8e\xe9\x50\xc1\x96\xeb\xb7\x1a\x01\x31\x01\x0d\x0a\xfe\x58\xed\xb5\x64\xe9\x8c\xaa\xa6\x83\xf1\xa7\xc8\x07\x1a\x37\x3e\x0e\x0d\x7b\x93\x31\xaa\x36\x25\x6c\x56\xe6\x76\x9c\x71\x36\x21\xe7\x74\xce\x92\x73\xaa\x0e\x39\xb9\x40\x01\x86\x84\x0d\xa7\x43\x72\x74\x13\x78\x5b\xdf\x49\xfd\x76\x53\xc1\x86\x2d\x18\x05\x4d\x4e\xf4\x83\x9e\xe5\xbd\x95\x84\xed\x27\x77\xcf\x33\xbb\x77\x0f\x37\x9c\xd0\x67\x71\x36\x37\x67\x1d\xaf\x3b\x8f\xe5\x93\x98\x67\x60\xf1\x8b\x76\x3d\x91\x5b\x52\x2a\xd7\x9d\xc2\xe7\x7c\xfe\xb6\x0c\xc9\x37\x31\xaa\x35\x99\xac\x8c\xee\xb6\xa4\xb9\x82\xd9\x3f\x0c\xb0\xc3\xca\xfc\x5c\x19\x15\xec\x90\x62\xcb\xd3\xa6\xfc\xdb\x05\x5c\x7b\x7f\x83\x5c\x3e\xd8\xcc\x85\xf7\x85\x13\x88\xc1\xd1\x62\x76\xc0\x63\x06\x60\x5c\xb8\xaf\x5a\x5b\x87\xb5\x01\xd8\x7d\x31\xb1\x55\xce\xec\x33\xa5\xfd\x71\x0c\x75\xe4\xd8\x02\xab\x36\x42\xc2\x07\x23\x82\x29\x73\x28\x4e\x36\x7c\xbe\xa1\x42\xd5\x4c\x99\xda\xae\xe8\x6e\x55\x62\xc9\xf6\xa5\x75\x0f\x6d\x5a\x60\xbc\x9a\xea\x6c\x0d\x74\xe2\x16\xca\xda\x76\x8d\xa7\x45\x63\x5b\xc5\xbf\x96\xed\xd5\x1b\x70\xab\x57\x05\x79\xd8\xbc\x72\x03\x44\x1a\x1d\xc3\x91\xa1\xc0\x11\xa0\x4f\x23\xed\xb6\xe4\xa9\x6c\xbf\xbd\xa9\xd2\x40\x08\x37\x2c\xef\xf0\x43\x0d\x2b\xcf\xf9\xe1\xe6\x7c\x2b\x8e\x47\xe3\xf6\x9e\x01\x28\xc9\xd6\x0d\xf4\xb0\x70\x09\x78\x6d\xdb\x75\x4f\xbf\xdf\x9a\xc0\x42\x6d\xdc\x63\x0f\x84\x0f\xa3\x58\xb6\x60\x71\xc9\x53\x67\xb1\xe5\xcb\xbf\x05\x7e\xdb\xa2\x7d\x3b\xed\xe4\x1f\xff\xfc\xe2\x8b\xc1\x60\xf0\x45\x11\x9b\xf5\x8a\xd0\x94\xb3\x4f\x9a\x61\x04\xde\xf0\xee\xdf\xa0\x60\xcf\xe2\xe5\x17\xb0\xe1\xc8\x39\x58\x9b\x9d\x99\xf5\xc2\x67\x10\x7e\xe1\xf2\x40\xcd\x47\xa8\x10\x52\x87\xb1\x48\x91\x14\x3a\x93\x49\xc2\xb2\xc1\x94\x89\xe1\x5d\x3e\x66\xe3\x9c\x27\x31\xcb\xa0\x71\xf7\xe9\xc5\x8b\xe1\x37\xc3\xaf\xbe\x20\x3e\xeb\xd3\x48\xf6\x4a\xd3\x79\xfa\x0a\x12\x3f\xbe\xb0\x3b\xce\xe1\xc2\xa5\x09\x15\x6a\xe8\xc3\xbc\x87\x91\xcc\x98\x34\xff\x9b\x7f\xa1\x52\x16\x99\x6f\xe3\x41\x23\xb5\xcf\x58\xd3\x99\xed\xa2\x05\x54\x2b\xa6\x69\x40\x64\x32\x87\x7f\xe3\xd0\x2d\x90\xdd\x75\x62\x51\xf1\x12\xae\xf4\xf7\xd5\x3b\x6f\xb8\x42\x76\x99\x26\x79\x46\x93\x72\x57\xe1\x86\x9a\xc9\x4c\x97\xa0\x60\x07\x84\x23\x6b\x54\x5c\x4c\xf3\x84\x66\xa5\xb7\xbe\x70\x31\x0f\x85\xb9\xce\x70\xc9\x45\x29\x96\x6e\x50\x0a\x96\xe5\x42\xb3\xec\x5c\x26\xf9\x3c\xb4\x8e\x0d\x56\xe5\xca\x09\xcf\x94\xb6\x48\x7b\x65\xa7\x42\x9d\x5c\x0c\xdf\x0f\xf6\xe8\xdf\x94\x14\xe0\x2e\x24\x43\x33\xdd\xc3\xf5\x2f\xfd\xf8\xe2\xe7\xe0\x3d\x5c\xc3\xb2\xbc\x5a\x7b\x4a\x6a\x7a\x4c\xd3\x34\x93\x0b\x8a\x38\x81\x1b\xfa\xe2\x9e\x5b\xf9\xec\xd9\xea\x8d\x35\xdf\xae\x6f\xb2\xe4\xa3\x0b\x9b\x2c\xdd\xd0\x35\x18\x8a\xf8\xf0\xe2\x25\x4d\xd2\x19\x75\x79\x86\x2a\x9a\xb1\x39\x2d\x16\x49\xa6\x4c\x9c\x5d\x5f\x7d\xfc\xd3\xa8\x72\xa3\x1e\x55\xd1\x6c\x39\x9f\x5a\x17\xa0\xf6\x53\xa7\x8b\xf9\xd4\x88\xe2\x04\xac\x74\x73\x45\xc8\xab\x17\xea\x8c\x54\x8e\x67\xbc\xf2\xb3\x99\x9d\xe0\xa7\x75\xc2\x55\x40\x64\x2a\x84\xae\x5c\x53\xac\x08\xf8\x2c\x8d\xcc\x6e\x78\x16\xdb\x39\x2b\xa2\x77\x9c\x9b\xa7\x18\xb4\xb0\x63\x1a\x12\xb3\x19\x59\xe6\xb1\x98\x30\x8d\x53\x93\x20\xff\x10\x5b\x03\x73\x05\xe6\xc9\x68\xa6\x34\xc4\x2d\x64\xc2\x15\xf6\xed\xfb\x82\xe4\x19\x33\xed\x96\x33\x18\x5d\x4a\x46\x4d\xd9\xb3\x29\xd7\x8e\x84\x46\x72\x3e\xcf\x05\xd7\xcb\x53\xa0\x86\x7c\x9c\x9b\xd5\x38\x8d\xd9\x82\x25\xa7\x8a\x4f\x07\x34\x8b\x66\x5c\xb3\x48\xe7\x19\x3b\xa5\x29\x1f\x40\x67\x05\x06\xe0\xcc\xe3\x3f\x78\x3a\x5e\x55\x3a\xd7\x72\x98\x3a\x19\xa1\x3c\xd7\x80\x4b\xc7\x83\x82\xe3\x58\x22\xb9\x84\x7e\x0a\xc8\xbc\x97\xa3\xdb\xc2\xc5\x88\x78\x45\x30\xc3\x81\x93\xad\x98\x6c\x33\x51\x50\xa9\xc6\x02\x91\xbb\xd4\x4e\x9f\xd0\x69\xfe\x88\x12\x6e\x74\x12\x95\x8f\xe7\x5c\x2b\x17\xeb\x88\x81\x83\xe7\xc0\x41\x00\xfc\x12\x2d\x35\x43\x72\x25\x0a\xfd\xfe\xc1\xa7\x1a\xa2\x82\x06\x66\xfa\x9a\x4f\x76\xc8\x00\x57\x5f\xa8\x51\xa4\x1c\x8b\x5a\xbb\x3a\xc1\x19\x1f\xa5\x2c\xf2\xa7\xc1\x9f\xe9\x33\xc4\x74\xb7\xc0\xff\x3e\x16\x53\x62\xd5\x68\x78\x79\x25\xa4\x60\x83\x5e\xb7\x5e\x97\x1b\x90\x1a\x7a\x5a\xbe\x55\x13\xbb\x30\x68\xc6\x46\xc8\x16\x85\xcc\x7d\x7a\xbb\x1d\xc8\xf1\x06\xab\x1d\x03\x16\xbf\x67\x18\x36\x1f\x03\x74\x65\x11\xce\x2d\xe4\x28\x04\x81\xc2\x66\x66\x7b\x67\x0e\x54\x11\xf1\xeb\xdf\x52\x91\xd3\xa4\x36\x80\x6d\xa3\x7c\xe7\xe6\x66\x3d\xbe\xc2\x3a\x9c\xdd\xf5\x53\x77\x50\xac\x86\x8d\xbd\xb7\xf9\xd2\x1b\x01\x36\xd7\x05\x78\xe1\x6e\x5c\xff\xde\x3a\x54\x93\x02\xe7\x7e\x9d\x4b\x73\x9f\x18\xa4\x5e\x78\xa6\x56\xc2\x46\x90\x81\x6e\x0e\x1d\x51\x9a\xa5\xaa\x00\xa9\xd0\x92\x44\x72\x9e\x26\x4c\x97\x79\x2f\x04\xe5\xb6\x8b\x51\xaa\xc6\xdc\xee\x78\x52\x2d\x72\xca\x68\x8d\xbf\x76\x80\x96\xdd\x36\xe7\x4f\x6b\x26\x72\x43\x85\x47\x25\x4c\xf2\x35\x65\x5d\xcb\x47\x72\xfd\xbb\x21\x52\x22\x66\xa3\x96\xab\x11\xb9\x18\x13\x07\x7f\x1c\xdb\xc0\xd4\x38\x48\x5b\x5b\x1f\x5a\xb2\x67\x9c\xce\x7a\x59\xa5\x7e\x98\x45\x42\xca\x4a\x35\xd4\x35\xef\x6f\x55\x0b\x21\x61\x6f\x53\x34\x5e\x99\x93\x5f\xd9\x09\xcd\x2c\x42\x0c\x25\x29\x67\x18\x3b\xef\xc5\x21\x98\x30\x46\x63\xfb\xa3\x61\x78\x19\xf3\xf1\xe1\xd6\xde\x0d\x0d\x14\xe2\x12\xd4\x0c\xa2\x18\xa8\x0e\x68\x33\xa7\xdf\x49\x9b\x4c\x68\x4b\x9b\xc0\x4e\x9e\x43\x48\xbb\xab\xe0\x11\x33\x65\xb6\xe7\x08\x8c\xe7\x73\x2a\xf8\x84\x29\x3d\xf4\x18\x21\xea\xc7\xaf\x7e\x1e\x86\xa9\x01\x7d\x07\xb1\xee\x85\x0a\xbb\x35\x80\x94\x9b\xc1\x14\x20\x9f\xbe\x48\x69\x2a\x5d\xa5\x93\x7b\xe8\xac\xa6\x77\x86\x7e\x63\x67\x73\xa3\xcb\xdc\xb1\x57\xa4\x87\xaa\x89\xff\xf4\x3f\x8c\x18\xfe\xcf\x1e\x39\xbe\x87\x90\xe7\x9e\xf9\xb3\x87\x1f\xf4\x32\x60\x58\xa8\xa7\xf8\x30\x06\x4a\x67\x7c\x3a\x65\x99\xf5\x1d\x81\x59\x15\x6a\x9a\x70\x28\x0b\x5a\x3c\x2c\x6c\x85\xd6\x02\xf9\xb3\xda\x91\x1f\xbf\xfa\xb9\x47\x8e\xcb\xe3\x22\x5c\xc4\xec\x13\xf9\xca\xbb\x1f\x52\x19\x9f\xd8\xa8\x2c\xb5\x14\x9a\x7e\x32\x6d\x46\x33\xa9\x98\xc0\x90\x6f\x2d\xb1\xcc\x8c\x92\xe0\xd9\x4a\x92\x81\xad\x85\x4f\xee\x31\x6d\xd8\x4d\x25\xa6\xe1\x02\x70\x52\x59\x42\xc6\x92\xba\xf0\x35\xb3\x6c\x53\x30\xad\x18\xe9\x0b\xeb\xd0\x60\x62\x43\x88\xd5\xa4\x72\x5c\x24\x43\xfa\x66\x54\x80\x9b\xc5\x96\xaf\x31\xf2\xd4\x70\x9d\x4f\x72\xeb\x8e\xdf\x64\xd2\xaa\x11\x5b\x9b\x94\x1d\x7e\x24\xa1\xb0\xf1\x10\x37\x19\xcc\x9e\xb4\xb2\xf2\x5e\x23\xda\x18\x7d\xb4\x3a\x2c\x0c\x39\x7a\x84\xb1\x41\xfd\xd9\xd3\x9d\x87\xe6\x44\xea\x36\x9c\xe0\x68\x84\x07\x3e\xaa\xbe\x6d\x8e\x0b\x46\x1c\x5a\xa5\x35\xa0\x70\x73\x1a\x23\x09\xa4\x62\xf9\xe0\xdb\xd8\x4c\x20\x78\x6d\xa3\xe5\xc0\xda\xe5\x06\x54\xc4\xe6\xdf\x8a\x2b\x6d\x7e\xdf\x79\xc6\x36\x18\x42\xcb\xb3\xf4\xe1\xea\xe2\x71\x36\x77\xce\x77\x3c\xad\xe3\x5c\xc4\x09\x7b\x23\xe5\xdd\x9a\x54\xe0\xd2\x80\xbe\x0d\x9f\xf6\xde\x39\xd4\xd2\xb8\x18\xf8\x18\xda\x40\xcb\x25\x69\x9e\x20\x79\xcd\x45\x4a\xa3\x3b\x3a\x65\xf6\xa3\xc0\x46\x6c\x82\x3f\x6a\xca\xa0\x0a\x1c\x14\xdd\x6e\x6d\xef\xd1\x1a\x60\xfb\xb9\xa6\x9b\x8e\x2f\x5a\xd8\x01\xea\xfa\xbd\xbd\xbf\x07\xf1\x2b\x97\x24\xdc\x1b\x36\x59\xfb\xa0\x87\xd8\x5f\x97\x7f\x32\x80\xd2\x63\x6b\x6f\x3a\x38\xe6\xda\x07\xb6\xfb\x10\xab\xfd\x6c\x1a\xdd\x54\x79\xcd\xad\x88\x23\x18\x76\x96\x4b\x8f\xc1\x2f\x76\x15\xa0\x5a\xdc\x3d\x55\x40\x81\x92\x85\x8d\xcc\x79\x14\x48\xa4\xed\x62\x73\xcd\x78\x77\x10\x9e\xc3\x8e\x6f\xf5\xdb\x6d\x15\xa4\x6b\xfa\xd4\x89\xd3\x9d\x38\xfd\xcc\xc5\xe9\x56\x67\x60\x7b\xe8\xc1\xe7\x21\x60\xb7\x1a\xf4\xf6\x68\xfb\x67\x29\x72\xb7\x1e\x63\x83\xe0\xff\x67\x2b\x84\xb7\x1a\x6c\x43\x81\xbc\x6e\xc8\xbf\x65\xb1\xbc\xd5\x1c\x6e\x8d\x87\x79\x86\x82\x7a\xe3\x01\x6e\x4e\x0a\xa9\x19\x5f\x90\x8f\x51\xb1\x03\x9b\x4e\x63\xf9\x73\x6f\xa7\x0d\xc5\xe4\x6d\xe2\xd4\x41\x10\x60\x0f\x16\x7d\xd7\x28\x6c\x6e\x2d\x2c\x31\x5e\x4d\x63\xe6\xda\x64\x8b\xe0\xb5\x21\xce\xbc\x88\x2b\xde\x3b\x6d\x04\xaf\x16\x99\x55\x4d\x13\x31\x8a\x61\x37\x49\x24\x69\x31\x64\x23\xc3\xa7\x99\x1c\x37\x45\xac\x79\x80\x51\x35\x8c\x32\xdc\x33\x9c\x1d\xb2\xf3\xfd\xfa\x1e\x6c\xb0\xdb\x92\x38\x6a\xfa\x8e\x98\x76\xa5\x48\x32\xbf\x1e\x47\x0a\x16\xf9\x21\x7a\xba\x73\xf0\x65\x20\x56\x63\x27\xfb\xce\x83\x79\x9b\xe5\xac\x4f\x5e\xd3\x44\xb1\x3e\xf9\x20\xee\x84\xbc\x3f\x5c\x7f\x37\x23\x32\xd4\xf4\xf6\xd6\x62\x2f\x34\xc8\x15\x6a\xdc\x95\x42\xbb\x6f\x48\xec\xaf\xfc\x0b\xce\x42\x63\x35\xf4\x41\x2e\xf8\xaf\x79\x59\x51\xf1\x4e\xa6\xe3\xaa\x0a\x73\x3e\xfa\x08\x9b\x03\xd5\x6d\x55\x02\xb5\x35\x37\xd5\xfa\xb0\xea\x26\x79\x50\x1b\x15\xd5\x72\x62\xb8\x51\xf4\xcb\xaa\x56\x62\xe1\x09\xab\x66\x99\x34\x4f\x92\x21\xb9\xd2\x47\xca\xf4\x81\x47\x34\x49\x96\x46\x6b\xa9\xd4\x2c\xdb\x2f\x83\xab\x01\x83\x58\x39\x6c\x88\xb8\xc2\x17\x2c\x78\xdd\x4d\x34\x1a\x9c\x58\x6c\xc7\xb1\x1f\x64\xe2\x86\xea\x5c\x35\x5d\xbb\xb1\x8f\xbb\x8d\x12\xae\x7f\x31\xab\xb6\x51\xd4\x35\x61\xd3\x08\x46\x26\x50\xd4\x81\x6a\x58\x9e\x1d\xfb\x5c\xf6\xe1\x3e\x9e\xc3\x7f\xb3\xfc\x74\x18\x63\x63\xe0\x81\x2f\xf2\xf8\x36\x08\x5f\x05\x91\x63\x9f\x58\x94\x07\x31\x5e\x61\x0c\xc7\x6e\xb6\xc6\xc3\xe6\xbe\x3e\x49\x62\xea\xe3\xe6\x94\x1e\x3a\x75\xd2\xef\x80\xe6\x51\xdd\xcd\x44\x85\x03\xc4\x9e\x37\x01\x76\x6a\x8e\x4c\x54\xb7\xed\x81\x2b\xe2\x53\x63\xa6\x82\x11\xae\xec\x6f\x43\x4f\x28\x20\xb0\x18\x26\x63\xab\x22\x00\x4e\xd5\x4c\xee\x4c\x19\x9b\xe6\x27\xbe\x75\xf2\x9b\xf9\x20\xc8\x76\x83\x15\xd9\xce\xf2\xbf\x42\xb6\x83\x12\x42\x45\x28\x0d\x30\xc9\x39\x5d\x42\x68\xda\x3c\x95\x99\xa6\xe8\xe0\xc8\x45\xcc\x32\xa5\x29\x62\x94\xb8\xbc\xbc\xd4\x8c\x79\x46\x15\xe1\x5a\x91\xc8\x26\x19\xe2\x82\x3d\x50\x26\x63\x30\xd9\xd7\xe6\x05\x2f\x22\x94\x3e\x8e\x7c\xb5\xb4\x30\x1b\x57\x61\x73\xc7\x12\xba\x21\xb0\x6a\x5f\x3a\x3b\xd2\x2c\xad\xd2\xd5\x60\x10\x02\xc4\xf1\x05\x8f\x31\x18\x89\xa5\x84\x8b\xc3\x10\xd5\xed\x0e\x1c\x74\x4c\xac\x3f\x56\x03\x6f\xa5\x59\xfb\xc0\x06\x8d\x76\x3b\x51\xf7\xdf\xdf\x93\xd0\xad\x8f\x71\xc3\x6b\x65\x3d\x5c\xde\xc4\x86\x75\x09\xa2\x6c\x21\x8e\x53\x67\x56\x06\x5a\x36\x5a\x1d\xf2\xd8\xf8\x34\x5b\x92\xf6\xb6\x42\xa8\x0c\x82\x90\xbf\x86\x8f\x81\x49\x71\xe3\xb3\xdb\x32\x00\x1f\x1b\x11\x67\x4f\xac\x93\xe2\x72\xce\x9f\x83\x34\xb6\xdd\x3e\xde\xb0\xa1\x62\x69\x0e\xdc\x5c\x03\xcb\x76\xc3\x36\x1b\xa5\xee\x1d\x3e\x61\x8d\xa5\xe5\x84\xdd\x3a\x6e\x92\xd2\x4c\xf3\x28\x4f\x68\x56\x9c\x7d\x20\xcf\x2b\x19\x47\xad\xfb\xac\x34\xcd\x74\x23\x78\x84\x91\x7b\xd2\xa3\x25\x02\x54\xc2\x8c\x09\xef\xb6\xc3\x04\x2e\x32\x66\x53\xc3\xf6\xd2\x34\x59\xba\xec\x80\x22\xf6\x3c\xe1\x4a\x17\xc5\x03\x81\x8b\x37\x0d\x62\x68\x0d\xb4\xf0\xbb\xce\x80\x93\xc9\x3c\x92\x62\xc2\xa7\x8f\x97\xff\xf6\xfe\xcd\xdb\x73\xf8\x24\xfc\x56\x64\xbf\xf9\xdf\x57\x72\xdf\x8a\x4e\xc2\xcf\x45\x7a\x9b\xbf\x51\x24\xb7\x59\x24\x86\x9a\xcc\x36\x97\x37\xe5\xd6\x73\xc7\x8c\x29\xdf\x4d\x17\x4f\xe1\x59\xb1\x4a\xa5\x50\xdc\x48\xb3\x80\x7c\x05\x0f\x61\xdd\x92\xf7\x6f\xde\x1e\x36\x5d\xaa\xcb\x8d\xea\x72\xa3\xba\xdc\xa8\x6d\x07\xaa\x41\x6e\x94\x3f\xcd\x90\x19\xe5\x02\xee\xcc\xbf\x6d\x82\x4f\x71\xdc\x3d\x1a\x75\xd3\x8f\x6f\x96\x0f\x27\x8c\x9a\xa9\xd9\x1e\x13\xf8\xda\x3e\x58\xd4\xcf\x29\x65\xd8\x5a\x32\x03\x5a\xf4\xfb\x37\x6f\x7d\xbb\x0f\x90\xcd\x10\x73\x65\x3e\x73\x2e\x53\xce\xe2\xf3\xd1\xc7\x66\x45\x9e\x2f\xaa\x6f\x95\xb2\x31\xf0\xa6\xe9\xf9\x91\x22\x3d\x7c\x88\x9c\x8f\x3e\xf6\xdc\x40\x60\x21\x8a\x12\x5c\x3e\x1f\x8d\x50\x1d\x0a\x04\x48\xff\xfb\x04\xe3\x87\x68\xf9\xe7\xb8\x54\xa2\x48\x0a\x5b\x2f\x66\x46\x15\x19\x33\x26\x82\x46\x51\x79\x75\xe5\x76\x01\xc4\xd3\x46\x18\x01\xf6\x36\xc2\xf5\x17\xf1\x08\x43\xf2\x83\x11\x6d\x32\xc6\x84\x19\x46\xdc\x87\x25\x40\x6c\x5b\x06\xbc\x17\x9d\x71\xc1\xc0\x54\x0f\x46\x04\x00\x3c\x6b\x3a\xb9\x39\xd7\xa3\x2e\xd3\xab\x41\xca\x52\xb1\xd3\xd7\x42\xbf\x3c\xe0\x6e\x7f\x0c\x8b\x70\xaf\xb0\x03\xfb\xa3\xe2\x1c\x84\xb0\x89\x04\x23\xd4\x9c\x6d\xed\xdd\x5d\x81\x18\x5d\xc0\xf8\x9f\x5d\x5f\x79\x00\xd8\x21\x19\x0c\x06\x36\xd2\x4b\x67\x79\xa4\x11\xd4\x49\x63\x09\x22\xd3\x6a\xcc\xa1\xae\x72\xae\x18\xd8\x70\x5c\xa5\x35\xbb\x3b\x31\x3c\x0b\x42\x29\x87\xd6\xee\x54\x4c\xc5\x90\x94\xa3\xed\xcc\x34\x90\xd7\x52\xda\x15\xc2\x0f\xfe\x03\x06\x7a\x7a\x4a\x6e\x2a\xb6\xed\xb1\x11\x5c\x6d\x69\x13\x50\x00\x26\x52\x1e\x95\xad\x5c\x6c\xe8\x5e\xfe\x5e\xc8\x7b\x51\xd7\x05\xf8\x26\xcd\xd8\x2b\xf2\x53\xef\x6c\x41\x79\x62\xf6\xf1\x4f\xbd\x3e\xf9\xa9\x77\x6d\xa3\x8d\xb9\x98\xfe\x64\xab\x15\xfc\xd4\xbb\x60\x50\xc8\x3b\xfe\xa9\xe7\x9a\xfe\x17\xa8\xc1\xf6\x96\x65\x53\xf6\x3d\x5b\xfe\x07\x34\x58\xba\x35\xc2\x9a\x6d\xcb\xff\xc0\x92\x6d\xee\x9e\xa1\x60\xb7\xcb\x94\xfd\xc7\x9c\xa6\xa5\x1f\xdf\xd2\xb4\xd4\x50\x10\x5c\xf1\xe3\xcf\x86\x05\x2c\x5e\x0e\x8b\xa5\xfe\xe5\x6f\x4a\x8a\x57\x3f\xf5\x02\x54\x4e\x39\x37\x5b\x26\xd5\xcb\x9f\x7a\xa4\xd4\x83\x57\x3f\xf5\xa0\x0f\xee\x77\xd7\xe9\x57\x3f\xf5\xcc\xd7\xcc\xcf\x99\xd4\x72\x9c\x4f\x5e\xfd\xd4\x1b\x2f\x35\x53\xfd\x97\xfd\x8c\xa5\x7d\x73\xe2\xff\xa3\xf8\xc2\x4f\xbd\x5f\xc8\x4f\xc2\x75\x1a\x02\x06\x70\xa5\x15\xf9\x67\x7d\xc9\x8b\x03\x58\xbb\x56\x5d\x08\x6b\x1f\xdd\x06\x7b\x85\xe6\xf0\x5d\x8c\x62\x7b\xd6\x9d\xde\x19\x02\x74\xf5\xc5\xa2\x20\xe5\x7e\x81\x1e\xf6\x70\xfb\xca\xf2\x5e\x57\x05\x8b\x32\x2a\xa7\x45\xab\x18\x5a\x19\x0f\x09\x16\x3d\xc4\xd4\x42\x23\x47\x81\x63\x1c\x8a\xb1\x08\x92\x2b\x27\xd3\x95\xb5\x5f\x43\x58\x90\x20\xd8\x66\x40\x2c\x8c\x22\x96\x6a\x73\xea\x1e\x09\xaa\xb4\x1d\xe0\xe7\x7c\xc5\x68\xbf\x7b\x40\x06\x4e\xb5\xb5\xde\x53\x57\xb0\x17\x87\xb5\xe7\xe0\xe7\xf4\xd3\x1b\xa8\xdb\xf4\x8a\xfc\xe9\xab\x3f\x7f\xf3\x6f\x6b\x1e\x44\xa2\xc9\xe2\xef\x36\x66\x24\xd7\x4c\xc3\xea\x8b\x55\xdb\xeb\xd0\x09\xa7\xc3\x22\xdd\xb9\xa8\x91\x5a\x8e\xc6\x51\x4c\x93\x31\x38\xa6\xf2\xd4\xcc\xcb\x6b\x97\x84\x2a\x22\x8c\x14\xac\x6d\x8c\x7b\xe2\x9e\x2c\xc9\xcb\xaf\xb0\x5a\x11\x7c\x7a\x85\xac\xff\xf8\xe9\xe7\x61\x4d\x97\xb9\x22\xff\xab\x5f\xe9\x8f\x11\x88\x72\xe0\x88\x66\xe3\xa0\x0f\xda\xe8\xb2\x36\x96\x78\x0d\x9b\x64\xbe\xbf\xdb\x16\xae\x45\xe5\x8e\x6f\xbe\x5e\xbf\xbe\xae\xb0\xfa\x8b\x43\xb8\x0b\xad\x3b\xd0\x4b\x09\x14\xd1\xe9\xe9\x1c\x52\xf5\x83\x88\x90\x70\x6b\xeb\x76\x31\x3d\xe4\x3a\x93\x71\x1e\x19\x5d\x4d\x4e\x5c\xc0\x79\x14\x12\x28\x28\x19\x63\x4e\x03\xaa\xe0\x84\x7d\x32\x93\xce\x8a\xda\x41\x46\x1f\x66\x54\x70\x31\x55\x05\x3e\x23\x10\x10\xe4\xc6\xf7\x33\x06\xac\x47\x87\x95\x36\xa1\x57\x8a\xc7\x10\x0d\x4f\xc9\x34\xa7\x19\x15\x9a\x61\x0d\x06\xac\xb6\x89\x0a\x68\x41\xf2\x68\x00\x79\x69\x4f\x23\x1e\x55\x24\x56\xa6\x8b\x56\x55\xc4\x2a\xad\x07\x3b\xaa\x2f\x5f\x7c\xb5\x71\xc9\xfd\x73\xeb\x2d\xf0\x54\x6b\x96\x89\x57\xe4\xff\xfb\xf1\x6c\xf0\xff\xe8\xe0\xef\x3f\x1f\xdb\x7f\xbc\x18\xfc\xaf\xff\xee\xbf\xfa\xf9\xcb\xe0\xcf\x9f\x4f\xfe\xf3\x8f\x87\xb0\xc7\xaa\x83\xc6\x4c\x35\x9a\xb4\xed\xb5\x60\x7a\xe6\xab\x9b\xea\x6d\x0d\x48\x0f\xba\xb4\xf9\x19\xdb\xdd\x4d\x1a\x48\xb3\x49\xd2\xd5\x50\x2d\xa3\x5b\x15\xfb\x0c\x28\x9e\x11\x59\x87\x56\xfc\x1d\x46\x72\x7e\x1a\x98\x1f\x8c\xdc\xfd\x96\x8a\x25\x29\xc8\x1a\x0a\xab\xd5\x9d\xae\x20\x7f\x8c\x46\x99\x54\xaa\x64\x42\xbe\x63\xc4\x4b\xb4\x48\x2c\xc7\x2c\xa2\x20\xa8\x67\x63\xae\x33\x9a\x2d\x03\xbd\xc4\x61\xd7\xe7\x8a\x4d\xf2\x84\x1c\x2b\xc6\xc8\x50\xc8\x98\xad\x52\xd7\x13\xa4\xa1\x74\xcc\x13\xae\x21\xd9\x23\x66\x46\x0f\x4f\xb8\xd5\x0f\x9c\x63\xda\x15\xb7\x9d\xb2\x4f\x84\x6b\x5f\x60\x9e\x2b\x72\x1c\x0b\xf5\xf2\xe5\x57\x7f\x1a\xe5\xe3\x58\xce\x29\x17\xaf\xe7\xfa\xf4\xe4\x3f\x8f\x7f\xcd\x69\x02\x89\x29\xef\xe8\x9c\xbd\x9e\xeb\xbd\x62\xc0\xca\x6c\xf1\xe5\x37\x0d\x4e\xd1\xf1\x8f\x78\x56\x7e\x3e\xfe\x71\x60\xff\xf5\xa5\xfb\xe9\xe4\x3f\x8f\x7f\x1a\x6e\xbc\x7f\xf2\xa5\x19\x43\x70\x02\x7f\xfe\x71\x50\x1c\xbf\xe1\xcf\x5f\x9e\xfc\x67\x70\xef\xe4\x8f\x9d\x05\xbe\x30\xa9\x07\x3a\xd9\xa3\x59\xe2\x6d\x1b\x5e\x99\xaa\x5a\xe4\xab\xf7\x57\x2d\xf3\x2b\x9d\x47\x0b\x7d\x0d\x36\x5d\x54\xfa\x48\x60\xc3\xaf\x36\xd1\x10\xa8\xee\x50\xe6\xfc\xea\x18\x51\xd2\xc5\xbd\xe1\xcd\x00\x40\xeb\x0d\xf1\xf9\x65\xe5\xf9\x5f\x6c\xde\x47\x60\xd4\x02\x4b\xe7\xb2\x1c\xb7\x22\xc1\x32\x54\x46\x82\xf1\x69\x80\x35\x76\x9f\xce\x47\xd0\xf9\x08\x3a\x1f\xc1\xf3\xf0\x11\x54\x8f\x3c\xf8\x0a\xa0\xd8\xa9\x0a\x2c\xcd\x34\x9e\x73\xb1\xe6\xf8\x6f\x3e\xf7\x96\x3a\xf4\x49\x2a\x8d\x2c\xc3\x21\xaa\x5a\x2e\x58\x96\x71\x88\x66\xc3\x77\x32\x56\xd4\x16\x0c\x23\xcb\x0f\x64\xa1\x8d\x59\x9a\xc8\xe5\x7c\x1d\x22\xf9\xc3\x04\x0a\xdb\x41\x1e\x38\x36\xb9\xb3\x0a\x77\x56\xe1\xdf\x8b\x55\xb8\x33\xf5\x76\xa6\xde\xce\xd4\x5b\x73\x75\xa6\xde\xce\xd4\xdb\x99\x7a\x3b\x53\xef\xca\xd5\x99\x7a\xed\x33\x9d\xa9\xb7\x33\xf5\x3e\xb6\xa9\xb7\xb8\x54\x09\xc8\xf7\x91\x74\xce\x26\x71\x52\x2b\xda\xbe\x2d\xa9\x6a\xf5\xfd\xb2\xda\x5e\xa3\xeb\x73\xad\x5c\x82\x21\xa8\xf5\xc3\xb0\xf4\xda\xe3\xd6\x99\xef\x82\xae\x3a\xf5\xba\x53\xaf\xbb\xa0\xab\x4e\x13\xef\x34\xf1\x4e\x13\xef\x34\x71\x7f\x75\x9a\x78\xa7\x89\xaf\x5b\xf2\x4e\x13\x77\x57\xa7\x89\x77\x9a\x78\xcd\x52\xfc\x36\x34\xf1\x4d\x41\x57\x13\xb3\x65\xdd\x8f\xdb\xa2\xae\x48\x18\x8e\xf3\x55\x17\x8e\xd3\x85\xe3\x74\xe1\x38\x5d\x38\x8e\xbb\x1e\x3b\x1c\xa7\x6c\x9e\xc3\x98\x99\x92\x39\x0e\xf6\x6c\x9a\xc9\x05\x8f\x99\xaa\x04\xef\x78\x00\xbe\x80\xcb\xcc\xa1\x64\x5f\x11\x90\xc3\x1e\x27\x1c\xa7\xb3\xdd\x75\xb6\xbb\xce\x76\xd7\xd9\xee\x3a\xdb\x5d\x67\xbb\xeb\x6c\x77\x9d\xed\xae\xb8\x3a\xdb\x5d\x67\xbb\x5b\xb7\xe4\x9d\xed\xce\x5d\x9d\xed\xae\xb3\xdd\xd5\x2c\xc5\x6f\xc3\x76\x17\xee\xa0\x2e\x6b\xa3\x53\x4d\x3b\xd5\xf4\x33\x53\x4d\x3b\x7d\xb3\xd3\x37\x3b\x7d\xb3\xe6\xea\xf4\xcd\x4e\xdf\xec\xf4\xcd\x4e\xdf\x5c\xb9\x3a\x7d\xd3\x3e\xd3\xe9\x9b\x9d\xbe\xd9\x65\x6d\xb4\xcc\xda\x78\xff\xe6\x6d\x10\x09\x82\x11\x22\xc1\xce\x82\x5a\xdd\x80\x04\xec\x78\x72\xe7\xc5\xed\x54\xe5\x4e\x55\x7e\x0e\xaa\x72\xe7\xc5\xed\xb4\xea\x4e\xab\x5e\x73\x75\x5a\x75\xa7\x55\x77\x5a\x75\xa7\x55\x77\x5a\xf5\xa6\x47\x3a\xad\xba\xd3\xaa\xeb\xae\x67\x9c\x81\xf1\xbb\x81\xbd\x05\x38\xdb\xc7\x87\xbc\xfd\xce\x17\x24\x5d\x85\xbb\x85\x7b\x6b\xa1\x6e\xb1\xc3\x70\xab\x0e\xe6\x56\xe2\xae\x5c\xc5\xb7\x75\x25\x50\x9f\x00\xdb\x16\xcb\x18\x59\xc5\x21\x17\x1c\xc4\x9e\x79\x9e\x68\xae\x99\xa0\x22\x5a\x02\x9b\x7d\xff\xe6\x2d\x99\x53\x41\xa7\x41\x25\x22\x35\x24\x57\x1a\xe8\x8d\xce\x7c\xe9\x29\x5b\x2d\xc9\xe7\x95\x84\xc5\x99\x00\xfd\xc2\xd7\x47\x02\x85\xc3\x09\x01\x2c\x06\x01\xd0\xb0\x0f\xa8\xa5\x14\x96\x51\xfa\xa2\x7a\xc0\xbb\x4c\x9b\x2e\xd3\xa6\xcb\xb4\x79\x26\x99\x36\x40\x3f\xd6\x16\xc8\x2b\x11\x99\x03\x97\x0d\x53\x2c\x61\x91\x96\xd9\xd6\x22\x79\x23\xfb\xa0\x7d\x03\xbb\x59\xea\xda\x91\xda\x4c\x77\x1a\xf4\x74\x5b\x6f\x61\x15\x8c\xb0\x73\xf9\x29\x05\x0b\xe2\x1a\xbb\xef\x4a\xef\xab\x2f\xe1\x89\x70\x25\xfe\x12\x3a\x66\x89\x9f\x0a\x47\x09\xe7\xb8\xe5\x51\xd2\x2a\x7e\x01\x01\xf1\xec\xdd\xc5\xaa\x09\xbb\x3c\xc0\x75\x56\x67\xb2\xd9\xf2\xbc\xd2\xf5\xb3\x0d\xdd\xb3\x07\xdb\xdd\x01\xab\x80\x57\x3e\x91\x68\xf5\x09\x25\x77\x6c\x89\xf4\xad\x94\xbc\x65\x1e\xce\x18\x50\x43\x58\xcc\x3b\xb6\x84\x87\x2c\xb1\xdb\x22\x20\x1e\xa4\x6a\xf9\x1d\x5b\x37\x43\x78\xdf\x75\x76\xbd\x80\xd9\xa8\x3e\xf8\x1d\x5b\x6e\xba\x5d\x99\x70\x33\x0f\xde\x06\x68\x66\xde\xfc\xe0\x0d\x2e\x7e\xb2\x69\x9a\x26\x9c\x01\x35\xdb\xd8\x76\x23\x79\x9a\xf8\xa1\xb6\xe8\xa8\x5f\xca\xc0\x62\x04\x8b\x7d\xa4\x70\x61\xcd\x4e\x9f\xf1\xd4\x0a\x09\x28\x1a\x38\x56\xf6\x91\x26\x3c\x10\x43\x60\x57\x5f\x89\x3e\x79\x27\xb5\xf9\xdf\xe5\x27\x6e\x48\xb5\xd9\x0f\x17\x92\xa9\x77\x52\xc3\x2f\x07\x19\x2a\x76\xa1\xc5\x40\xad\x66\xc6\x03\x37\x88\x9c\x94\xf8\x99\x11\xa3\x26\xa5\x2c\x41\xf3\xf4\x95\x30\xea\xa0\x1d\x51\xc9\x98\x61\x9a\x98\xe7\x0a\x18\x90\x90\x62\x80\xf6\x87\xba\x36\xec\x44\xc8\xac\x34\x0f\x1b\x9a\xb3\x4d\x81\x9d\x03\xef\xa0\x04\x93\x18\x51\x94\xc4\x58\xaf\x18\xb8\xb1\x91\xa5\x79\x44\xd0\x7b\x01\x7e\x83\x26\xd3\xbb\x89\xae\xe0\xb5\x85\xba\x34\x5c\x2b\x20\x99\x6f\xcc\x01\x68\x41\x62\xf1\x79\x24\x4b\x73\x9a\x9a\x65\xfa\x87\xa1\x3e\x30\x53\xff\x24\x29\xe5\x46\xe2\x3d\x03\xe9\x3d\x61\xa5\x7b\xb6\x14\x79\xd8\x8c\x69\x81\x2b\x62\x48\xc9\x82\x26\x86\xde\x81\x7d\x9d\xb0\x04\xa9\x9f\x11\xb2\x2b\x84\xbd\x4f\xee\x67\x52\x21\x31\x43\x2b\x13\x57\xa4\x77\xc7\x96\xbd\xfe\xca\xd2\xf6\xae\x84\x75\x3f\xad\x2c\xa6\x27\xa2\x52\x24\x4b\xd2\x83\x7b\xbd\xdd\x79\xc1\x46\x62\x49\x63\x54\xff\x69\x72\xdd\x80\x9a\x6d\x5c\xb7\xb2\xf3\x78\x5d\x9d\xff\x0a\x5f\xaf\xbe\xe2\x88\x1f\x66\xec\x86\xba\x05\x3c\x49\x28\x3e\x6a\x9d\xbc\x50\x8a\x15\xcd\x1b\x58\x6f\x16\xe2\xa5\xfd\x3c\x1f\xab\x13\x5c\x59\x23\x4f\xba\xb9\x07\x4d\xad\x75\x81\x79\xa3\x90\xf3\xe8\x1a\x13\x8b\xe3\xb3\xeb\xab\xed\x95\x7d\x47\xf0\x0a\xd1\x2c\x49\xd0\x45\x6d\x64\x4e\x2d\xad\xcc\x59\x2b\xc2\xa4\x41\xfb\x81\x92\xbe\xb6\xb3\x75\xc5\x62\xe1\x2e\x88\x42\x5e\x09\xdd\xde\xd7\xdb\xca\x0b\x96\xdc\xb1\x4f\x69\xc2\x23\xae\x1d\xfd\x2e\x64\x2b\xd0\x67\xe0\x25\x20\x5c\x1c\xa4\x01\xc5\x74\xbf\x90\xd5\xb8\x22\x7c\x2a\x64\x56\xbf\x3f\x1f\x26\x76\x9d\x90\x4f\x83\xbb\x7c\xcc\x32\xc1\x34\x53\x03\x23\x63\x0d\xec\x0b\x4c\xef\x1a\x75\x80\x02\xf2\xa6\xba\xba\xe1\x83\x37\xed\x65\xe4\xf5\xf2\x0a\x3a\x48\x3f\xa0\x96\x72\xb0\xc8\x84\xd2\x28\x03\x47\x74\x85\xc7\xd5\xed\xd0\xc0\xc9\xde\x85\x3c\x74\x21\x0f\x5d\xc8\x43\xf5\xea\x42\x1e\xaa\x57\x17\xf2\xe0\xaf\x2e\xe4\xa1\x0b\x79\xe8\x42\x1e\xba\x90\x87\x2e\xe4\xa1\x7a\x75\x21\x0f\x78\x75\x21\x0f\x5d\xc8\x43\xcd\xf5\x79\x84\x3c\x14\x57\xa0\xb5\x6e\x55\x40\xdf\x14\xcf\xa2\x74\xa2\x5d\x50\x81\x3b\x99\x65\xd1\xb0\xaa\x92\xda\x53\x6c\xf8\xb1\x6d\xa6\xb5\x75\xa7\x89\xd0\x25\x9a\x5b\x53\xca\x76\x14\x34\xdc\xd7\xbb\xc6\x3d\x07\x2a\x0d\xea\x39\xda\x4b\xc8\x8a\x85\xef\x86\x4d\x5a\x1a\xf8\x6e\xd8\x84\x64\x6c\xc2\x32\x26\x22\xe6\x26\xa6\x6c\xd7\xb3\x6e\x5f\x6f\xf8\x7b\x00\x1f\xde\xfa\x40\x81\xda\x21\x18\x61\xdf\x06\x07\xb8\xfd\x68\xc7\xb0\xd6\x21\xb1\xf5\x48\x03\x3f\xbe\xa6\x7a\xd6\xa8\x07\x47\x57\x76\xda\xc0\x7a\x0f\xfe\x94\x94\xb3\x88\x95\x62\x11\x40\x8e\x63\x34\xb6\x3f\x1a\xc1\x27\x63\xf6\x5e\x1f\x25\x0e\xeb\xb3\x28\x62\x15\x8c\xd0\x44\xa8\x21\xc4\x3c\x26\xff\x67\xf4\xfe\xdd\xe9\x77\xd2\xca\x0a\x46\x9b\x51\xb6\xd2\xc9\x9c\x09\xdd\x27\x2a\x8f\x66\x84\x2a\xd3\x35\xa3\xdf\x8e\xc0\x2c\x31\xa7\x82\x4f\x98\xd2\x43\xdb\x1a\xcb\xd4\x8f\x5f\xfd\x3c\x2c\x9b\x43\xb8\x75\x6c\x38\x8f\xbe\xdd\x00\x70\x36\xcc\x60\xfc\xbb\x20\xb4\x42\x97\x52\x19\xdb\x4e\xdf\x43\x67\x35\xbd\x63\x44\xda\xce\xe6\x0c\x98\xc2\x2b\xd2\x33\xdb\x24\xf8\xf4\x3f\xcc\xc1\xfa\x67\x8f\x1c\xdf\xcf\x58\xc6\x48\xcf\xfc\xd9\xc3\x0f\xfa\x00\x0c\xf3\x5b\xc0\xf1\xed\x87\x51\xbe\xcf\xf8\x74\x0a\xe2\x16\x44\x13\x2c\x98\xd0\x27\xc0\xdf\x26\x44\xc8\xe0\x61\x61\xed\xd4\x85\x75\xba\xda\x91\x1f\xbf\xfa\xb9\x47\x8e\xcb\xe3\x32\x22\x28\xfb\x44\xbe\xf2\x16\xe9\x54\xc6\x27\x4e\x6b\x5d\x0a\x4d\x3f\x81\x62\x30\x93\x8a\x09\xb4\xfc\x6b\x89\xa9\x4b\x4a\x1a\xe5\x93\x25\xc9\x00\x05\xcc\x98\xdc\xa3\x81\xce\x4d\x25\x3a\x75\x52\x9a\xe9\x4a\x78\xca\xed\xfb\x8b\xf7\xaf\xf0\x6b\x66\xd9\xa6\xc2\x69\xb9\x13\x2e\x68\x62\xbd\x0f\x5e\x3e\x34\x1d\xc9\x71\x91\xb4\xb4\xaa\xad\xf3\x8c\x4c\x72\x9d\x67\x6c\x58\x0d\x57\x68\xbc\xe3\xeb\x62\x45\xea\x37\x3b\xc4\x8c\x54\x0f\xda\x13\x46\x64\x34\x1e\xa2\x58\xe3\xf1\x58\x1d\xe2\xbb\x60\x0f\x6e\x1c\x62\x41\x9a\xcd\x28\x63\x19\x29\x33\xc0\x88\xa5\x5a\x9d\xca\x85\x21\x9d\xec\xfe\xf4\x5e\x66\x77\x5c\x4c\x07\x66\x93\x0d\x70\xe5\xd5\x29\xb0\x98\xd3\x3f\xc0\xff\xf6\x1a\x11\xf0\xa9\xe6\xc3\xc2\xc0\xb0\x47\x18\x1b\xb0\xcf\xd3\x9d\x87\xe6\xe4\xcb\x36\x9c\xe0\x68\xe4\x94\xbf\xca\xdb\xe6\xb8\xa0\x43\xca\x46\x8c\x05\x14\x6e\x4e\x63\x24\x81\x54\x2c\x1f\x7c\x1b\x9b\x09\x04\x1d\x3f\x5a\x0e\x6c\x48\xe7\x80\x8a\x78\xe0\xe5\xeb\x68\xb9\xf3\x8c\xe5\xbc\xe1\x01\xfe\x70\x75\xf1\x38\x9b\x3b\xe7\xad\x4e\xeb\xa1\x02\x72\x49\x29\x88\x93\x26\xe9\x8c\x1e\x0a\x17\xbd\x0b\xe5\x84\xab\x0b\xe5\xec\x42\x39\xbb\x50\xce\xe2\xea\x42\x39\xbb\x50\xce\xda\xab\x0b\xe5\x24\x5d\x28\x67\xf9\xea\x42\x39\xd7\x0f\xb4\x0b\xe5\x0c\xa6\xb7\x0b\xe5\xec\x42\x39\xbb\x50\xce\x2e\x94\xf3\x39\x86\x72\xfe\xb6\x83\x33\x3b\xe7\xd8\xe7\xe1\x1c\xeb\xdc\x5d\x9d\xbb\xab\x73\x77\x75\xee\xae\x1d\x76\x7c\xe7\xee\xea\xdc\x5d\x9d\xbb\xab\x73\x77\x3d\x53\x77\x57\xab\x0a\xc0\x9f\x35\x00\xcd\xe3\x63\xcf\xc0\x4f\xab\xb0\x33\x6b\x11\x67\x2c\xd8\xcc\x0a\xa2\x4c\x01\x26\x73\x8e\x55\x4c\x1f\x1e\x49\xa6\x6c\x00\x74\xc5\x53\x5b\x14\x4c\xee\x1c\x7a\x9d\x43\xaf\x73\xe8\x6d\x3b\x25\x2d\x1c\x7a\xe0\xcb\x0b\x8f\x82\x55\x47\x8a\x14\x8e\xf7\xf5\xae\x8d\xf5\x9f\x6e\x6e\x5a\xb1\x56\x95\xf0\xf3\x2e\x17\xa5\x54\x51\xdd\x93\x0f\x73\x52\xcc\x82\x46\x72\x9e\x4a\x61\x36\xc6\x61\x9c\x8b\x45\x7b\x0d\xb2\x59\xdd\xa3\xf6\xf7\x31\x0b\x83\xc9\xad\x67\x6b\x9e\x4a\xc5\x4a\x76\xdc\x1d\x14\xef\xcd\xae\xa9\x01\x3a\x7d\x9c\x09\x6d\x07\xc5\xbd\xf4\x7e\x23\x59\xe4\x4d\xf8\x86\x75\x4d\x82\xe7\xe9\xd7\x9c\x65\x58\xe2\xba\x70\xe0\x14\x93\xe2\x4c\xae\xe8\x92\x2a\x4d\xcb\xd1\x86\xc5\x6c\x38\x4d\x4d\x86\x4a\x5a\xf8\x63\x57\x46\xfd\xa8\x3e\x59\xd2\xd8\x7f\xd2\xc0\x7b\xf2\xbc\xfd\xb3\xa4\xa9\x8f\x96\x34\xf4\xd3\x92\x06\xbe\x5a\xd2\xcc\x5f\x4b\x1a\xfb\x6c\x49\x13\xbf\x2d\x79\x60\xdf\x2d\x69\xee\xd4\x24\x8d\x7d\xb8\x2b\x9d\x7e\x76\x7e\xdc\x96\xc3\x6e\xe2\xcf\x5d\x19\x74\xe7\xd3\xad\x4c\xf5\x76\xbf\x2e\x69\xea\xdb\x25\xcd\xd3\x93\xb6\xfa\x78\x49\xe7\xe7\x6d\xc7\x5f\xb6\x12\xdd\x76\xfe\xde\x46\x6b\x99\xb1\x49\x33\x27\xfd\x0d\x9b\xe0\x60\x02\x71\xa2\x70\x74\xc8\xb5\x32\x44\x21\x75\xf4\x2d\x15\x65\x31\x9a\x8b\x4b\xb2\xcb\xe3\x44\x44\xdd\xf0\x68\x76\x13\x1a\xaf\x68\x60\xcb\x02\x1a\xe9\x7a\xdb\x27\x4c\x64\x3c\x9a\xb9\xce\x1a\x21\xd7\x7a\xd6\x36\x03\xa2\x84\xdd\xde\xb2\xa0\xcd\xd8\xd9\x76\x6f\x4e\xcd\x40\x77\xf0\xe9\x84\x1d\xdf\x4a\xbc\x37\xa3\xcd\xac\xe9\x54\x80\x06\x52\xc9\xc0\xb7\x7a\x78\x29\x4b\xdd\xef\xa0\x47\x0c\x6d\xa9\xef\x6e\xd1\xdb\xb0\xb3\xd4\x25\xa8\xae\xe2\xb9\x88\xa2\xf3\xd6\x21\xbb\x21\xd7\x3e\x1c\x46\x03\xb1\xab\xb9\xe0\xb5\x15\x0f\x24\x7c\x70\x2d\x32\x48\x71\x35\x97\xbe\xda\xa1\x85\x14\xd7\x8a\x1f\x7c\x1f\x74\x90\x43\x71\xba\xe2\x6a\x0a\xd3\x51\x9e\x06\x74\xc2\x1f\x74\x0a\xee\x29\x44\x9b\x8c\x57\x62\x10\x9e\x64\x90\x5b\x51\x49\xd6\x8c\xee\x6c\x5f\x50\x92\x43\x0f\x7e\x1b\x10\xc5\x9a\x71\xdc\xb6\x43\x97\x38\x74\xaf\xb7\xe1\x1f\xac\xe9\xf5\xe8\xa0\x48\x08\x3b\xf6\x7d\x33\x28\xc1\x9a\x9e\xdf\x56\xe1\x09\x0e\xd8\xad\xad\x71\x0b\x35\xfd\xe9\xa2\x17\xba\xe8\x85\x67\x1e\xbd\xd0\xea\x0c\x6c\x8a\x64\xa8\xdb\xfe\xcf\x35\x9e\xa1\xd5\xa0\x37\xc5\x36\xd4\x0d\xfa\x99\x44\x38\xb4\x1e\xe3\xc6\x68\x87\x75\x03\x7d\x26\x31\x0f\xad\x06\xdb\x30\xfe\xa1\x6e\xc8\xbf\xe5\x28\x88\x56\x73\xb8\x21\x22\xa2\x6e\xde\x9e\x45\x5c\xc4\xda\x01\xfe\xae\xab\xf3\xa8\x7c\xec\x57\xea\xf1\x02\x24\x46\xc1\x57\x2b\x41\x12\xe1\xad\x95\x40\x89\x52\x6f\x31\x58\xa2\xa6\x32\x8f\xca\xc7\xe1\xbf\xab\x51\x15\xaa\xfc\xf1\x26\x65\x7a\x42\xfb\x1a\xc4\x04\x9c\xcb\x24\x9f\x87\x36\x8e\xc1\xaa\xe8\x9f\xd2\xe8\xce\x68\x2d\xf6\x7b\x63\xf0\xac\x05\x9b\xf3\x6f\x4a\x0a\x90\x28\xc9\x10\xc4\x10\x33\x83\xc1\x6d\x5c\x9f\x6b\x6c\xe4\x8b\x8d\x3b\xb8\xf6\xf3\x11\xd5\x34\x91\x53\x62\xbd\xf5\x4e\x03\x29\x84\x9f\x74\xa5\xe9\x6a\x8f\xf0\xd5\x95\x3e\x8d\xaa\x3f\x37\xee\xd2\x8c\x0a\xc1\x12\x43\x0b\xd0\xa3\x0f\xd2\x9d\x9f\x9f\xcd\xd3\x63\x5f\x5e\xe9\xcd\xf9\xca\xef\x35\xdd\x29\xa5\xe8\xef\x1b\x23\x13\x6e\x51\x72\xc7\x58\xaa\x02\x67\x49\x0e\x3e\x15\xc8\x05\x19\x2f\x8d\x7a\x17\xdd\x01\xdc\x28\x48\x65\x30\xde\x73\x5c\x98\x03\x27\xd0\xc3\x66\x4f\x59\x14\xfc\xd4\x85\xe0\x74\x21\x38\x5d\x08\xce\xb6\x33\xd6\x20\x04\x27\x3c\xf0\xa5\x30\x1c\x2a\xc8\x59\x9a\x26\x60\x94\x72\xd0\xb0\x16\x73\xd0\x02\x6e\xac\x58\xe2\x76\x4c\x2f\xaa\x30\x07\xf7\xf3\x0a\x85\x2e\xdf\xf0\x4c\xad\xf2\xc4\xc6\x08\x1b\xa4\xa7\x75\xf2\xdd\x46\xe9\x30\x92\x62\xc2\xa7\xdb\xf3\x62\x82\xb9\x3c\x87\x57\x0a\x8f\x19\x36\x91\x5b\x64\xdb\x82\x53\x41\xfa\x56\x89\x6f\x3f\x40\x72\x0c\x13\x8b\x46\xfe\xae\x4b\xb1\x28\x87\x95\x30\xb1\xe0\x99\x14\xe0\x56\x5c\xd0\x8c\xd3\x71\x62\x19\x1b\xd3\x4e\x0d\xf7\x26\x85\xba\x23\xf5\x28\x1e\xae\x4b\xb1\xf8\x48\xcb\xf1\x00\xa2\xb6\xeb\xc4\xb9\x34\xc0\xa0\x73\xee\x3b\xbe\x9f\x4b\xab\x59\xf2\x7e\xed\x2e\x77\x57\x33\x37\x43\x4b\x7d\x3d\x54\xd7\xeb\x66\x63\x48\xde\x5a\x87\x3d\x25\xe7\xff\x7d\x75\x71\xf9\xee\xf6\xea\xf5\xd5\xe5\xcd\xe1\xb2\xd6\xdb\x28\x52\x1f\xdd\x1a\x05\x2e\xd6\x3f\x1e\x7f\x3c\xbb\xf9\xef\x77\x67\x6f\x2f\x4f\xc0\x0d\xcb\x3e\xa5\x14\x2a\x19\x14\x90\xe5\x69\xc6\x16\x5c\xe6\x2a\x71\xb8\xc4\xf1\x9a\x4d\x5b\xdd\xad\x36\x82\x68\xe9\x93\xd5\x6a\x5f\x83\x80\x08\x5a\x6c\xa0\xc8\xef\x70\xc3\xa8\x92\x05\x8b\xfb\xa1\xee\x17\x79\xe3\x14\x17\x69\xae\x1d\xc3\xf3\x59\xbf\xc2\x03\xb2\x5f\xc8\xdc\xb4\xf7\xc7\x3f\xc2\xc0\x32\x16\xe7\x11\x86\xa7\x51\x17\x05\xf0\xc7\xbe\x55\xbc\x69\x92\xc8\x7b\x4c\x13\x64\x2a\xa2\xa9\x1b\x7a\x38\x3b\x68\xad\x7b\x45\xf8\x90\x0d\x49\xef\x8f\xc1\xad\x1e\x7e\x3d\x45\x78\x67\x9b\x39\x0a\xbd\x4a\xb8\x66\x19\x4d\x48\x2f\x7c\x7a\x48\x2e\xcd\x37\x58\x1c\xae\x03\xb4\x20\xd8\x82\x65\x10\xde\x61\x57\xa1\x4f\x32\x36\xa5\x59\x9c\x30\x05\x36\xf5\x32\xbe\xb3\x9d\x30\xe6\x83\x47\x84\xd4\x43\x72\xc1\x26\x34\x4f\x80\x03\x93\x5e\xef\x30\xb6\x3b\xd8\x6a\xaf\x33\xb9\x11\x71\xb8\x4a\xaa\xcb\x9a\x43\xdd\xda\x1f\xd9\x98\xb3\x12\x59\x53\x2c\x26\xdc\x86\x13\x39\xc3\xe5\x16\x94\x69\xd2\xc6\xd3\xd9\xdc\xdf\x88\x0c\x05\x8b\x4f\xac\x49\xda\xdc\x34\x7e\x0b\x4b\x03\x81\x53\x58\x8f\xe3\xdc\x35\xd8\x34\x04\xa7\x91\xe3\xb6\x8d\xeb\xb6\x59\xdc\x5c\x3b\xa7\x6c\xc3\xb0\x38\x52\xe7\xe0\x82\x68\x38\x17\x30\xda\xc4\xe1\xd2\xda\xf1\xb8\x9d\xa2\xd7\x76\xee\xb1\x2d\xb1\xd6\x68\x7f\x16\xc7\xb6\x7a\x88\x45\x9d\xc6\x22\x22\xc3\x40\xeb\xea\x83\x3e\xd0\x27\x39\x8f\xff\x73\xf3\xe1\xde\x71\xc6\x64\x8a\xc6\x8a\x1d\x66\x0d\x4d\x9c\xcb\x12\x9d\xf2\x9b\x1e\x9c\x2a\x5a\xc1\x9a\xbb\x38\x36\xcb\x50\x5a\x0c\x63\x1d\xbc\x41\xf9\x82\x69\x6b\x7f\x66\x8f\x8a\x43\x8b\xce\x11\xbb\x01\x52\x19\xbf\x22\x2a\x4f\x53\x99\x69\xe5\x55\x04\xb0\xb9\xf4\xcb\x7f\x82\xbc\xdc\x27\xbf\xf8\x1f\x21\xea\x53\xfd\x78\x74\xf4\xef\xdf\x5f\xfe\xd7\x5f\x8e\x8e\x7e\xfe\x25\xbc\x1b\x58\xe8\xca\x8f\xa0\x4d\x47\xc6\x20\x84\xdb\x3f\x57\xc1\x34\xfa\xd6\x82\x38\x9c\x49\xa5\xaf\xae\xfd\x9f\xa9\x8c\xab\x7f\xa9\x2d\x9c\x80\x3c\x2c\xd1\xf1\x1e\xd0\x03\x93\x9e\xa6\x61\x4c\xee\x2a\x2d\xf7\xc7\x72\x28\x93\x35\x48\x98\x7f\xbe\x76\xdd\x35\x1c\xe8\x3e\xe3\x5a\x33\x80\xab\xd7\x2c\x9b\x1b\x4e\xdc\x37\x3b\xb7\x60\xb3\x8b\x97\xbd\x07\x21\x5e\x0d\xfd\xc6\xb5\x83\x83\xde\xdb\x91\xe1\x66\x2e\x22\xf3\xad\x04\x55\xe8\x48\x41\x60\xd7\xc1\x07\xe2\xec\x0d\xaf\xf7\x3e\x93\xde\x72\x51\xf5\xe4\xbe\x42\xd7\x69\x88\xf5\x0f\xd6\x08\x23\x80\x7a\x8b\xc4\x31\xfe\x38\x8c\xd2\xbc\x6f\x1f\x18\xce\xd9\x5c\x66\x4b\xff\x27\x4b\x67\x6c\x6e\x24\xb6\x81\xb5\xe1\xf7\xfd\xeb\xf8\x9a\xff\x0b\x5f\x2c\x7d\x60\xf5\x6d\x14\xa9\x8b\x12\x2d\x96\x82\xb0\xf8\x69\xcf\xa2\x9b\xa6\x03\x1f\x45\xbf\x1a\xeb\x60\x7e\x56\xaf\xf2\x42\x9f\x97\x7c\xed\xaf\xfc\xa8\x40\x86\x5c\xc8\x24\x9f\x33\xd5\xf7\xec\x09\xa5\x75\xb1\x30\xd2\xe4\x16\xb7\x8d\xbb\x5a\x9e\xbe\x98\x2f\xb8\x6a\x12\x3c\xbf\x32\x14\xeb\xea\x73\xb9\x4e\xb9\x36\x9a\x0a\x86\x40\x79\x75\xf1\x53\x2a\x15\xe8\x00\x3e\x8e\xb5\x44\x52\x5e\x6e\xaa\xca\x51\x5c\x41\xa1\x86\x9f\xfe\xe5\x7f\x06\x50\x6c\xe1\xc5\xe0\x7f\xfd\xfc\x2f\xc7\x3f\x0d\xe1\x1f\x5f\x9e\xfc\xe7\xc9\xff\xb8\x3f\xfe\xe5\xe4\xe4\xf8\xf8\xc7\xef\xdf\x7e\x77\x7b\x7d\xf9\x33\x3f\xf9\x9f\x1f\x45\x3e\xbf\xc3\xbf\xfe\xe7\xf8\x47\x76\xf9\x73\xc3\x46\x4e\xd6\xd7\x4d\x29\x5f\x54\x2c\xdf\x37\x38\xf0\x78\x0d\x1a\x16\x08\xaa\x7f\xab\xf1\xb2\x56\x4a\x15\x70\xa1\x07\x32\x1b\xe0\xeb\x25\x9f\xdd\xa6\xcb\x2d\xdb\x2e\xfb\xfc\xc6\x9d\xd6\xc0\x14\xeb\x48\xf3\xc1\x37\xb2\x62\x51\xc6\xf4\xa1\x34\x18\x6c\xcd\xf1\x8f\x54\xc6\x47\x01\xf6\x6f\xa7\xd4\x14\x4a\x8d\x13\x29\x70\xbe\x0a\xce\x3b\xc9\xe4\x7c\x48\x02\xb3\x10\x86\x61\xd9\xe7\xee\xd8\x16\x2d\xd7\x5d\x9d\x12\xf4\x79\x29\x41\x23\x5c\xdf\x07\xd7\x80\x98\x58\x6c\x32\xd3\x54\x6d\xba\xe6\xd9\xb2\x39\xda\xe7\xb7\x4a\x92\xca\x34\x4f\xa8\x5e\x63\xb6\xab\xb1\x4d\xdb\xbd\xaf\xbc\x99\xd0\x07\xf6\x59\x2a\x37\xaf\x37\x86\x92\xb3\x24\x21\x5c\xe0\x49\x80\x06\x9c\x35\x2f\x63\x28\x2f\xd9\x42\xaa\x10\x9c\x57\x54\x4f\x2c\x0c\x8d\x10\xe6\x48\x33\x0d\x85\xca\x7e\x30\xf7\x91\x66\x59\xd3\x18\x17\x88\x7d\x9e\x26\x8c\x78\x6e\xeb\x53\x6f\x08\x55\x4a\x46\x9c\xfa\x0c\x12\x0f\x86\x66\xbb\x0d\xbd\x81\x58\xc4\x34\x63\x11\x8b\x99\x88\x18\xe4\xb9\xe5\xac\x18\xeb\xd8\x08\x83\x60\xde\x87\x36\x28\x89\x73\x74\xed\x20\x3d\xa8\x6f\xe3\x6a\x3e\xcf\x37\x56\x7a\x3c\xb8\x15\xdf\xac\xb8\xb5\xcc\x55\x92\x25\x0a\xd1\xda\xa7\xe2\x78\xd5\x7d\x7d\xa8\xff\x01\x33\x52\xbc\xb9\x6d\x2b\xa7\x5a\xa1\xb8\x85\x8d\xa1\x4c\x69\x1f\xdb\x62\xd8\x8c\xce\xfe\x26\x69\x6c\xab\xac\xd4\xa6\xb4\xb5\x85\x71\xa9\x2d\x3d\x6d\x6a\x4d\x4a\x33\x36\xe1\x9f\xda\xe4\x48\x89\x42\x45\x09\xea\x46\x1a\x82\x9a\xb1\x94\x09\xd0\xc3\x19\x8d\x66\x98\x1b\x2c\xca\xe3\x78\x50\x8f\x11\x4a\x19\xed\x8f\xd7\xa8\x4e\x8a\xe9\xce\xd6\x6f\xfc\x6c\xd9\x55\x3f\xfc\xc1\x12\x32\x66\xad\xe0\x28\x8e\xde\x05\x6f\x54\x20\x0c\xd0\x81\xe7\x3a\x69\xb4\x37\xef\x72\x4a\x25\x9c\xb5\x09\xd7\x98\x44\x00\xb5\x1b\x0b\x2c\xda\xe0\x4d\x48\xe6\xb5\x4f\x1c\x41\x72\x0d\xa4\x01\x57\x1a\x1a\xa3\x89\x30\xce\x13\x16\x13\x17\xb0\x81\x8d\xb6\xdc\x52\xa5\x50\x85\x53\xaa\x14\x9f\x8a\x41\x2a\xe3\x81\x69\x6d\x0b\x38\xdb\x63\x41\x37\x93\x40\xcb\x6d\x96\xcb\x7b\x74\xe3\xed\x6f\x81\x6c\x11\xc9\x79\x9a\x6b\x16\x18\xe7\xbc\x5d\x67\xbc\xc4\xc8\xa2\x40\x86\x2c\x24\xa2\xfd\xe6\x14\xcb\xda\x0c\xec\xc7\x07\xfe\xe3\x03\xff\xad\x7d\xa6\xb9\x09\xd5\x42\x93\x62\xe3\x2c\xf6\xa3\x37\x68\xb2\x2c\xc0\x66\x30\x29\xfd\x13\x9f\xe7\x73\x42\xe7\x88\xf2\x3a\xa9\x99\x4e\x70\x5e\xb3\xf8\x30\x13\x56\x33\x51\x9b\x23\xe7\x1f\x2c\xc7\xfc\x99\x5a\xb6\x1a\x59\xb4\xda\x59\xb2\x5a\x58\xb0\x76\xb6\x5c\x39\x23\x75\xf3\xfd\x78\xe3\xec\xe6\x95\x1d\x89\x75\xb7\x37\xee\x48\x77\xc0\x21\xb4\xc3\xb7\xc3\x15\x91\x73\xae\xb5\x0f\xc9\xf2\x3b\xac\x4f\xb8\x2e\x59\x3f\xed\x59\xe0\x45\x45\x7d\x87\x3a\x9e\x2c\x0b\xaf\x45\x1f\xb9\xec\x3d\x57\xcc\xe2\x33\xf0\x79\x8a\x08\x0d\xb0\xa7\x7d\xe2\x94\x0d\x32\xe8\xce\x47\x77\x3e\xea\x5e\xda\x54\x72\x88\xac\x2d\x3b\x54\x42\xf5\xf1\xe2\x88\xd9\xd9\xa9\x8c\x95\x95\x17\xdc\x1e\x32\x67\x01\x30\x5d\xb8\x98\x92\x1b\x06\x96\x81\x11\xd3\xca\x82\x86\xc0\x1b\x34\x63\x05\x94\x85\x63\x8d\xce\x12\x02\x7e\x04\x08\x1a\x9d\x4c\xca\x4f\x60\x7d\x83\x39\x48\xb6\x57\x3a\x94\x67\xbc\xe8\xc2\xe6\x69\x42\x35\xf3\x82\xcd\x1e\xb5\x21\x3a\x00\xae\xed\xc3\xe8\x00\xb8\x8a\x67\x3a\x00\xae\x0e\x80\xab\xe1\xa0\x3b\x00\xae\xca\x54\x77\x00\x5c\x1d\x00\xd7\xae\x6b\xa9\x65\xc2\x32\xba\x11\x4a\xa9\x6c\xe6\x2b\x9e\x87\xa1\x15\xee\xdd\xa0\xa5\xc7\xf1\x52\xdc\x3a\xb1\xc5\x9c\xad\xa2\x5f\xb0\xb5\xb4\xa6\x00\x9e\xa5\xa5\xeb\x17\xe4\xd1\x2c\x89\x59\x33\x8d\x74\x1d\x36\x86\xe5\x90\x3a\x03\xa7\xcf\xbf\xfb\xdd\xd6\x67\x20\x3f\xfd\x25\x88\x6f\x87\xe7\xcd\x1f\x7e\x87\xfc\xbb\xfb\xd7\x5f\x1e\x05\x8a\x0b\xbb\xd4\x42\xc0\xb8\x84\x17\x1c\xa0\x8d\x1b\x2a\xcc\x00\xb6\x65\xe6\x07\x86\x35\x24\x97\x86\x50\x91\x39\xa3\x42\x39\x33\x17\x78\xa2\x8a\x87\x95\x75\x99\x05\x7a\x95\x35\x29\x14\x27\x83\x91\x77\x72\x64\x6d\x5f\x7d\x72\x0d\xb6\xd4\xe2\x17\x38\x49\xef\xe4\xe5\x27\x16\xe5\xdb\x30\xa9\x9a\xa2\x45\xb4\xaa\x90\xf8\x7d\xc1\xe4\x71\x64\x25\x26\x5f\xec\xe0\x90\xcd\x6f\x9c\x99\x3b\xb6\x2c\x98\x8d\x15\x21\x80\xe4\xf7\x8b\x5d\xe2\x58\x01\xf2\x8e\xff\xed\x4c\x59\xf3\x31\x17\xf8\x31\x6c\xda\x2d\x05\xb4\xee\x26\xd4\x48\x76\x49\x82\x9f\x39\xc4\x74\xed\x50\xac\xb1\x1e\xab\xbd\x5e\xc6\xf0\x54\xb2\x5e\xba\x08\x44\x8a\xcb\x5f\x73\x9a\x94\x93\x10\xec\x4f\xf6\xa1\x15\xaa\x7e\xcf\x93\x38\xa2\x99\x8d\xf2\xc2\x34\x4d\x25\x71\xf5\x00\x12\x06\x72\xe2\xdc\x69\x2f\xd6\x08\x31\xd1\x00\xff\x84\x47\x79\x42\x33\x97\x39\xde\x28\x51\x60\xeb\x8c\x16\x9b\x66\xc4\x22\x29\xe2\x36\x0a\xc0\x6d\xf5\xdd\xaa\xaf\x35\x65\x19\x97\x18\x5d\xec\x60\xb8\x82\x4d\x7a\x5c\xb6\x69\xcb\x89\x3b\xd5\xfe\x88\x95\x2c\x1f\x25\x28\x17\x5b\x5d\xed\x24\x20\x8f\xfe\x54\x0c\xc9\xb7\x4b\x67\x66\xe9\xdb\xf2\x6c\x42\x6a\x2c\xd1\x66\xbf\x69\xb7\xac\x9d\xec\xe2\x40\x4d\x64\x06\xc9\x29\xc7\xb1\xc4\x8c\x8c\x05\x8f\xf4\xc9\x90\xfc\x3f\x96\x49\x58\x78\xc1\xa6\x54\xf3\x85\xe7\xa6\x5e\x71\xcd\x18\xb5\x1e\xfc\x17\xe4\x18\x5e\x23\x7c\x3e\x67\x31\xa7\x9a\x25\xcb\x13\xd4\x63\x19\x51\x4b\xa5\xd9\xbc\xc9\xd2\x35\x31\x1a\x38\xb8\x31\x2e\xf4\x37\x5f\x6f\x78\xb2\x6d\x0e\xd5\x47\x97\x95\x52\xcc\x0c\xc6\x10\x54\x96\xd0\xf3\x20\xb9\x41\xdc\x0c\x63\x10\x6c\x62\xb3\x93\x2c\xc3\x05\xfe\x9b\xd9\x07\x94\x64\x0c\x10\x08\xec\xce\xdd\x73\x8f\x63\x34\xe5\x5b\x99\xaf\x81\x42\x5f\x19\xf8\x1b\xab\x84\x7f\x0c\x5e\x5c\x9b\xa5\xf8\x28\x62\x42\xd0\x93\xc0\x44\x49\x09\xd8\x25\x81\x9d\x1b\xf2\x80\x4f\x15\x91\x28\x5b\x3b\x79\xd0\x8c\x44\xe8\xcb\x96\xa8\xf7\x83\xe4\x2d\xfa\x0f\xb5\xd8\xcb\x10\x20\x6e\x27\xa6\x92\xb7\xa7\x3d\x20\x0d\xb3\x5b\x25\xd8\xa0\xf0\x2d\x16\xbb\x28\x36\x43\x0d\x1c\xaa\xd8\xd1\xab\xa3\x83\x10\x5f\x1c\x4e\x26\x53\x3a\x85\xf3\xd4\x62\x54\xd5\x57\x49\xcc\x34\xcb\xe6\x90\x70\x3d\x93\xf7\x78\x1f\xd9\x56\x6a\x9f\x72\x80\x8f\x66\xb4\x33\xa9\x10\x07\xab\x94\xc4\x08\xe7\x17\x1c\xa3\xf7\x74\x49\x68\x26\x73\x11\x5b\xa9\xc9\x13\xd0\xb7\x95\x0f\xbf\x93\x02\x28\x45\xae\xcc\x5c\xdd\x96\xa8\xf4\x98\x69\x6a\x8e\xcd\xcb\xe1\xcb\x17\x07\x99\xb0\x96\x79\xab\xd0\x9b\x8a\xa5\xd0\xf9\xca\xdd\x99\x39\x48\xbf\x32\x46\xe3\xf7\x22\x69\x23\xcb\xbd\xc5\xed\x05\xaf\x0e\x40\x09\xe3\x13\xb0\xdd\xf6\xf1\xa7\xfb\x8c\x6b\x16\x90\xc7\x63\xa8\x41\x64\x54\xf7\x5c\x78\x11\xf6\xa4\x2c\x82\xc0\x23\x4d\x06\xb4\x3d\x1e\x44\xe5\xe3\x3d\xcf\x99\x3d\x50\xb0\xe5\x8a\x63\xe6\x37\xdc\x91\xda\x70\xe4\xca\xc9\x9d\xe4\x18\x9f\x34\x12\x9b\x94\xfa\xe4\x30\x41\x22\x38\x40\xa3\x59\xb7\x51\x49\x5c\xde\x70\x7a\xc0\xd1\x7e\xcb\x66\x74\xc1\x14\x51\x7c\xce\x13\x9a\x21\x38\xde\x08\xfb\x47\xc6\xb9\xae\xcf\x40\x6f\x97\xdd\x1c\xf6\x24\x68\x6e\xeb\x54\xbb\x7e\x98\x79\x02\x1a\xe1\xfa\x65\xbe\x33\xcf\x75\x4e\x93\x64\x49\xd8\xa7\x28\xc9\x15\x5f\xec\x7b\x9a\x6c\xf6\xc3\x0e\xac\xba\xca\xa5\x53\x19\x8f\x52\x16\x3d\x26\x8f\x2e\x6b\x18\x86\x54\xc5\x6e\xd1\x1d\xec\xa3\xd3\xdc\x97\x10\xf9\x04\x28\x94\x2e\xa6\x72\x19\xc6\x79\xfa\x31\x7c\x2e\x80\x02\xf4\x5e\x5d\x26\x54\x69\x1e\x7d\x9b\xc8\xe8\x6e\xa4\x65\xd6\x2a\x67\xff\xec\x87\xd1\xca\xfb\x15\x18\x86\xb3\x1f\x46\xe4\x82\xab\xbb\x10\xd8\x05\x9d\xa6\xa1\xb9\x84\x92\xbb\x7c\xcc\x12\xa6\x8f\x8e\x14\x72\xb9\x39\x8d\x66\x5c\x30\xc7\xe0\x84\x4f\x49\xb1\x0a\x9f\x99\xe5\xb6\x3e\x53\x9b\xf8\x74\x6a\xf7\xeb\x1f\xe8\xbd\x62\xd8\xfd\xb1\xe9\xbe\xb9\xcd\x9a\x64\xa4\x1f\xd4\x4f\x81\x9d\xb9\xba\x38\x90\x0f\x62\xa2\x6e\x1b\xe1\xcb\x96\x17\xf2\x35\x4f\x18\xea\x38\x30\x44\x17\x95\x66\xcf\x01\xac\xd8\x52\xe6\xe4\x9e\xa2\x56\x0c\x34\x70\x48\x6e\x79\xfa\x8a\x5c\x0a\x95\x67\xac\xb0\x67\x4c\x2a\x4d\x01\x82\xa7\xcd\x2c\x73\xea\x14\xac\x30\xaa\x1c\x80\xfe\x8a\xda\x15\xb9\x44\x74\x56\xf5\x8a\xf4\xd8\x27\xfd\x75\xaf\x4f\x7a\x9f\x26\xca\xfc\x4f\xe8\x89\xea\x0d\xc9\xd5\xdc\xfb\xd9\x01\xfa\x27\x63\x2e\xf4\x09\x5f\x30\xcc\x38\xe0\xb3\x0f\xb2\x41\x6c\x18\x9d\x91\xd6\x62\x49\xee\x11\x81\xc2\x90\x78\x96\x65\x32\xf3\x91\xe7\xc1\x34\x00\x77\x89\xe4\x3c\xcd\xe4\x9c\x07\x86\x3d\xd8\xe0\x07\x8d\xaf\x03\x73\xc3\x76\x91\x74\x75\xfd\x11\xd3\xcd\xbe\x4c\xca\xcc\x71\xdd\xea\x5f\x4d\x5c\xc4\x44\xdf\xd6\xec\x02\x96\x64\x21\x74\x31\x00\x63\xbc\x74\xad\x18\x6a\x15\xae\xf0\x6b\x9f\x35\x47\x4e\x63\xb6\x38\x55\x31\x7d\xd9\x87\xcf\x28\x1b\xed\xa7\x4b\x7d\xa2\x8a\xf4\x5e\xf6\x86\x64\xe4\xb8\x6d\x3f\xec\x63\xf1\xdc\x44\x66\xbe\x41\x30\xa6\xbf\xe8\x91\x63\x99\x41\xcb\x11\x15\x24\x61\x74\x61\x0d\xc8\x78\xa6\x96\xa8\xd3\x9e\x34\xce\x7a\x6c\x9a\x00\x16\x68\xf9\x7f\xfa\x6a\xcb\xd3\xcd\x24\xd1\xd5\x75\x73\x91\x91\x3d\x23\x82\xf6\x40\x98\x94\x86\xc6\x1a\xaa\x69\xd8\x2a\xc0\x6a\xd9\xb6\x8b\x01\x73\xb1\xa2\x29\x63\x03\x1b\x17\xb5\x07\x72\x6a\xef\x09\xa8\x2e\x69\x99\x5f\xef\x48\x6a\xdb\xd9\xfc\x20\xf8\xaf\x39\x23\x05\xa2\x67\xca\x32\xc4\x16\xd5\x24\x2e\xf1\x30\x8e\x8c\xed\xf8\x6c\x4e\xff\x2e\x05\xb9\xfc\x76\x64\x3f\x7a\xf2\xa4\xd3\xb3\x95\x48\xd0\xbf\xe7\x19\x33\xec\xb8\x4d\xc0\x80\x7b\xa7\xca\xd9\xcd\xef\xe4\x82\x6a\x8a\x0c\xde\x86\x5c\x89\x82\xc2\x9b\x5d\x38\xe6\x22\xb6\xb7\x02\xce\xfd\xd8\x4c\xd6\xac\xde\xbb\x4d\xf2\x52\xf8\xe0\x87\x9b\xab\x03\x31\xe3\x08\x68\xfc\xf4\xad\x8c\x5b\x73\xe4\xbf\x9a\x09\x3c\xc7\xf7\xc9\xdc\x34\x40\x8c\xce\xde\x87\xe3\x4c\xcc\x79\xb6\xff\xfc\xc1\x68\x9c\x8d\x89\x57\x23\x36\xe2\x66\xab\x65\x9f\x6f\x03\x3d\x1d\x68\x87\xd9\x1a\x70\x6e\x2c\x43\x19\x27\x72\xec\xf0\x67\x0f\xdd\xdf\x0f\x37\x57\x3b\x74\xf7\xc3\xcd\xd5\xe3\x76\x75\x27\xf1\xac\x2a\x9d\x15\x3c\xb8\x48\xc7\xa8\x8a\x5d\xcd\x65\xae\xe1\xa1\xa4\xad\x43\xce\xd3\x76\x3c\xf6\x95\x59\x3a\xba\xfc\x94\x62\xf0\x99\x35\xf2\x8f\x66\x14\xf2\x98\x7d\x76\x1d\x2c\xaa\x59\x65\x65\x28\xbb\x5b\x5e\xa3\xd1\x01\x7d\x22\x17\x0c\x5d\x96\xf1\x2b\x17\x08\xe0\xdf\xa8\x7f\xe1\x2d\x84\x5d\xc6\xaf\x90\xae\x12\x8c\xc2\x8c\x83\xdd\x74\x8c\x26\x22\xe1\x6f\xd9\x02\x3a\x3c\xe1\x7a\x69\x38\xf4\xc9\xb0\x14\x5a\xaa\xa0\xcb\x07\x3d\xcc\x3b\x8a\x16\x2b\x06\x2a\x72\x6c\x5a\x3a\x05\x03\xd7\xc9\xb0\x90\x2a\xa0\xac\x01\xf8\x53\x50\xf4\x28\x89\x1c\x8a\x69\xd8\x6d\x15\x89\xa3\xe9\x56\xd9\xce\xee\x61\xe2\xcd\xf9\x68\xcb\xd0\xcc\x3b\xb5\x0c\x0d\x6e\x8c\x2c\x26\xdc\x73\xe6\x69\x98\x2f\xd5\x88\xab\xc1\xb6\xda\xfa\x64\x73\xbe\xf6\xdb\xde\x53\xc4\x27\xa3\xed\xc0\x04\xc3\x7a\x1e\x2e\xbf\xbe\x14\x46\x89\xbb\x6c\x64\x49\x89\x85\x4b\x42\xbe\x69\xf6\xd6\xf7\x0d\xa0\x02\xda\x00\x2c\xb8\x95\x6f\x9b\x72\x35\x83\xb0\x8a\xed\x9b\xab\x79\xf5\x34\x96\xce\xd6\x97\xdd\xab\xe9\xc2\x39\x4b\x67\xaf\x47\x65\xf3\x9c\xf9\x8d\xbc\x1e\xd5\x9c\x4b\x98\x64\x18\xad\x42\xa3\xdd\x91\x22\x09\x9f\xb0\xad\xd5\x9c\x1e\xe0\x64\xce\xa5\xe0\xbe\xe4\xfd\xba\xab\xf9\x69\x73\xcd\xb5\xe5\x87\x05\x92\xc7\x5b\xdb\x02\x06\xc0\x45\x32\x49\x58\xe4\x70\xac\x61\x4a\xdd\x27\xea\x94\x17\x5b\x33\xa7\x40\xf9\x47\x45\xe5\x14\x17\xf4\xf4\xe6\xf2\xec\xe2\xed\xe5\x70\x1e\xff\x61\x26\xef\x07\x5a\x0e\x72\xc5\x06\xbc\x01\x54\xc8\xd3\x85\x11\xe2\x95\x36\x42\xae\x2a\x4f\xe9\x7b\x97\xc0\x48\x3e\x28\x0c\x1b\x00\x53\x8e\x73\x0a\x49\xa9\xfb\x24\xa3\x36\x49\x91\xba\x32\x35\x49\x82\xb3\xac\x33\xc6\xfa\xa1\x4a\xbd\xa5\xea\x47\xcb\x01\xed\x6a\x44\x28\x06\xf5\xb0\x04\xfa\xf1\x37\x57\x1b\x5a\xbf\x5d\x88\xd8\x34\x73\x23\xdf\x86\x8b\xbf\x00\x57\x93\x96\x10\x9f\x05\xf1\xb6\x13\x99\x99\x5d\x93\x95\x77\x00\xd3\x11\x0c\xf6\x34\x57\x2c\x1b\x5a\x8e\xf1\xe8\x13\xd5\x02\xac\x67\x07\x8c\xb4\xea\x34\xdd\xb0\x09\x29\xd5\x92\xb1\x52\x14\xcd\xf5\x8c\x09\xed\x20\xc7\xed\x64\xd4\xce\x9b\x8d\x70\x7e\xf4\x89\x6a\x08\x0f\xd4\x0e\xcc\xa7\x03\xc0\x69\xb3\x0d\xcd\x41\xd9\x8b\x6e\xfb\xec\xa8\x8c\xc6\x12\x42\x20\x10\xd3\xad\xb4\xc1\x68\x3c\xe7\xe2\x19\x1e\xc4\x88\x8b\x78\xdb\xf8\x2b\xc0\x75\xf0\x46\x59\x8e\xc2\x56\x9c\xf5\xdc\x7b\xe2\xa8\xd3\x6b\x30\x85\xdc\xfa\xe4\xca\x1e\xb9\x46\x87\x6e\xbe\x54\xbf\x26\x03\xfc\xca\x20\x8d\x8b\x59\xe9\xdc\x6b\x87\x37\xe0\x3c\x82\xd3\xec\x40\xeb\x4b\x7e\x7f\x02\xcd\xde\x33\xd5\x46\x86\xd9\x8b\x37\x43\xd5\x14\xe5\x92\xb6\x10\x11\x0c\xcb\xaf\x58\xdd\xd5\x4c\x41\x4a\x33\x3a\x67\x9a\x65\x18\x3a\x66\x83\xd1\x84\x8d\xea\x7f\x9f\x32\x31\xd2\x34\xba\x3b\x34\x84\x68\xc7\x4f\x1f\x8e\x9f\xee\xea\x2d\x73\x41\x32\xb1\xdf\x09\x16\x50\x68\x19\x7a\x66\xb9\xb0\xcc\xe6\x99\xd0\x15\x8f\xe3\xd5\xc6\x12\xe1\x71\x9c\xca\x4c\xb4\xc0\xf5\x42\xe3\x03\x84\x88\x79\x60\x3a\x08\x7d\xc7\x59\x38\x0c\xd3\x6b\x7e\x08\xac\x1c\xb3\x8b\xdf\xa9\xa0\x07\x73\x19\x33\x32\xe6\xba\x38\xe9\x8a\x69\x92\xb2\x6c\xce\x6d\x02\xb4\x14\x58\x83\x8f\xc5\xc8\xbd\x0c\xa7\xb2\x9f\x0e\x38\x9b\x20\x32\xd2\xae\xc8\x15\x19\x33\x7d\xcf\x98\x20\x2f\x5e\xbc\x78\x01\xf2\xc6\x8b\x3f\xff\xf9\xcf\x04\x10\x17\x62\x16\xf1\xf9\xea\x83\xf0\xd4\xbf\xbe\x7c\x39\x24\xff\x75\xf6\xf6\x0d\xc4\x5f\xa5\x5a\x91\xb1\xd4\x33\xdb\xb2\x79\xa0\xf4\xb2\xea\x43\xe9\x60\x27\x26\xa8\xca\x5d\x50\x29\xfc\xf0\xca\xc1\x74\x2f\xbe\xf9\xfa\xeb\x21\xb9\xe0\x19\x64\xde\x72\xc8\x15\xf0\xe1\x82\xa9\x0b\xa1\x13\x52\xaf\xe6\xba\x5b\x36\x61\xc3\x69\xe7\x7c\x3a\xd3\x58\x2d\x09\x76\x4a\xc2\x23\x8d\xe8\x7b\x78\xd8\x11\x0b\x49\xd9\x54\x12\x9b\x18\x65\x03\x47\xa0\x73\x7d\xa8\x28\x4c\x26\xea\xbb\x4c\xe6\x69\x91\x10\x98\x31\x65\x64\x54\x5b\x8b\x09\x1b\x2b\xd6\x4a\x31\xfd\xa4\x91\x0c\x0d\x2d\x35\xa5\x4d\x77\x55\x12\x40\xfa\x1e\x7f\x6c\x80\x3b\x21\xa5\xdc\x07\xd7\x81\xbb\xb9\x84\x7e\xef\xb5\xc8\x38\x38\xa7\x2e\xbf\x23\xcd\xe4\xdf\x70\x91\xb8\x70\x99\x42\x56\xe6\x55\x56\xe6\xb2\x89\x99\xae\x80\x72\x98\xb9\x6e\xf8\x9e\xcd\x8a\x0f\x72\x8c\xae\x26\x61\x32\x1a\xa4\x6e\x73\x65\x3e\x51\x02\x87\xac\xf9\x72\x58\x9e\x50\xcf\x14\xae\x68\x2e\x56\xde\xb6\xb5\x46\x2c\xa5\xb1\x15\x68\x6c\x9a\x57\xd1\x06\x86\xab\xda\x24\x99\xa0\xae\x51\x09\xb0\xad\x14\x24\xa3\x98\xce\xed\xd4\x40\xac\x92\xf9\x36\x53\xca\xe6\xda\xcc\x69\x76\x67\xc4\x7e\x7b\xfe\x87\x10\x19\xac\x7c\x9e\x0f\x26\x5d\x2d\x98\x2f\x52\x17\x46\xd6\x9b\x8f\x1c\x0d\x87\x47\x78\x40\x64\x86\x78\x97\xb8\xdb\xcd\xef\x4f\x94\x53\x5c\x8e\xdc\xa6\x69\x50\x82\xce\x96\xf6\xa0\xa5\x88\x60\x6a\x67\xaa\x79\x6d\xf5\x86\xe2\x4b\x3b\xbc\xe0\xa6\x88\xc1\xf8\x64\xda\xa4\x6c\x41\x5b\x09\xaa\x05\xc0\xf0\xfa\xba\x29\xf6\x08\x34\xc3\x0c\x6e\x8d\x81\x4b\x30\x2a\x62\x97\x3e\xb6\x65\x72\x36\x89\xad\x54\x31\xeb\xf9\x73\xb5\xab\x09\xa6\x7f\x94\x69\x95\xa5\x05\x81\x84\x50\x54\xa7\x2a\x72\x41\x9e\x35\xf3\x0a\xb7\x4b\x3b\x34\xf6\x36\x8c\x0c\xaf\x66\x4e\x02\xbc\x56\xce\x81\xa7\x99\x69\xa9\xda\x45\x82\x06\x00\x90\x1b\xdd\x61\x19\x92\xb7\x96\xa6\xe2\xe6\xa2\x63\x25\x93\x5c\xe3\xab\xc5\xcd\x90\xe0\x42\xa3\x0e\x72\x00\xa8\xac\x7f\x2c\x20\xbf\xba\xa8\xf7\xd5\x8c\x12\xe3\xd5\xe2\x30\x76\xd0\x97\x4f\x06\x2b\x5b\x20\x76\xab\x07\x83\x98\x8d\x14\x6f\xa3\x2a\x8d\xae\xc8\x71\x51\x2a\xc3\xb9\xb9\xaf\x84\x66\xd9\x84\x46\xec\x24\x54\xa1\x7c\x49\x12\x1f\x59\xe3\x72\x03\x66\x54\xc4\x09\x8a\xd6\x11\xcb\x60\xcb\xb3\x4f\xb6\x58\xae\xf9\x44\x9c\x71\x28\x02\x7b\xfc\x2d\x33\xf2\x20\xa3\x3a\xcf\x58\xa3\x0c\xa3\xc3\x86\x15\x42\x37\x0e\xa5\xb4\x41\x63\x6d\x43\x2a\xe0\x25\x27\xa1\x8a\xe0\x58\x15\xd3\x84\xb3\x8a\x53\xaa\x42\xb5\x74\x68\xb6\x12\xd0\x63\x20\x15\x4b\x99\x67\xd6\xee\xed\xb0\x45\x23\x99\x19\x45\x08\x1b\xa6\x8a\x64\x6c\x6a\xa4\xd5\x0c\xc4\x5a\x7c\x22\xc9\xcd\x0f\x07\x0d\xfe\x3a\x70\x90\xdc\xa6\x10\xb7\x89\x15\x9f\xe5\x82\xc7\x8e\x45\x82\x6f\xa9\x28\xf1\x97\x52\x15\xe4\x9d\x04\x70\xec\xc1\x0c\xa3\x30\x0e\x8c\xd4\x67\x74\x96\xe2\xa7\x43\xeb\xae\x04\xa0\x87\x06\xb5\x14\xda\x10\x61\x19\xb3\xeb\x7c\x9c\x70\x35\x1b\xed\x68\x0a\x7c\x57\xd3\x04\x06\x0c\xac\x38\xea\xd6\x9a\x07\x15\x13\x8a\x03\xcb\x33\x64\xdc\x30\x5b\xa8\x1d\x2c\x61\x12\xdd\xdb\xe1\xce\x94\x90\x18\x91\x30\x9b\xce\x6f\x6e\x05\xfd\xb0\x19\x5a\x08\xe0\x11\xb3\x0f\x22\x2d\xfd\x1e\xd1\x24\x51\xd5\xec\x55\x47\x68\x51\xe6\x70\x59\x5b\xb8\xa6\xdc\x2c\xb7\x2f\x13\x52\x81\x82\x5c\x3b\x30\x45\xe6\x12\x33\x5c\x04\x91\xc2\x3d\x04\x38\x24\xee\x85\x20\xab\x0f\x72\x77\x61\xcb\x1c\xb8\x8e\x62\x67\x03\x7d\x38\x1b\xe8\x8e\x9e\x86\xa2\x92\x12\x0d\x32\x82\xcb\xa5\x9e\x1d\x29\x75\x24\x77\x8b\x4b\xe2\xa0\x5e\x01\xfc\xe6\x99\xc6\xf2\xe4\xad\x31\xcf\x3e\x56\x5e\x07\x36\x6d\xf4\x0e\x38\xbc\x03\xab\x59\x44\xc1\xce\xb4\x0a\x81\x3f\x02\xab\x47\xbe\xe0\x39\xc0\x6e\xf0\xc7\x23\x45\x62\x19\xe5\x1e\x1b\x15\x26\xad\x70\x80\x35\x41\x10\x24\x6d\x8f\x53\x7b\x58\xab\xf0\x23\x5b\x77\x55\x2c\xef\xc5\x3d\xcd\xe2\xb3\xeb\x2d\x71\xe9\x65\x76\x5e\xbc\x15\x0a\x4a\xae\x31\xa8\x84\x47\xc7\x32\xd7\x05\x7c\xe6\x6f\xdb\xf4\xac\xa5\xa1\x08\x0d\x2d\xcd\xa4\x33\x5e\x77\xc6\xeb\xea\xf5\xe0\xc6\x6b\xf3\x4e\x19\x0b\xb6\x74\x5c\x1d\xc4\x00\x4f\x9a\x86\xd2\x3e\xa4\x15\x34\x20\x30\x48\xdd\xab\x71\xf0\x15\xb9\x0d\x8f\x48\xb1\xb6\x81\xac\xe7\x28\x10\xb0\xea\xa7\xb7\x98\x3e\x90\x1d\xb4\x79\xad\x5e\xbc\xd6\x85\xe0\x6e\xaa\xdd\x0b\x52\x43\x50\x6c\xb7\x6f\x91\x90\xfb\x56\xef\x12\x71\x51\xc6\x0e\x81\x98\x5b\x94\xea\xc4\xab\xe5\xe4\x93\xd6\x0b\x40\x5a\x16\xd2\xc5\xab\xed\x6a\x90\x1d\x8a\xea\xe2\xf5\xc4\xa5\x75\xf1\x6a\x6d\xe2\x26\xed\xcb\xec\xd6\x0c\xf7\x61\x8b\xed\xee\x38\xb4\xc7\xb7\xde\xf7\x8b\x12\x6f\xcf\x9f\xad\x77\xd6\xfb\x95\xeb\x11\xad\xf7\x01\xe1\x76\xc4\xc0\x4e\x40\x68\xd1\x0f\xcd\x6d\xce\xac\x3f\x66\x4e\xac\x1c\x16\x08\x64\x66\xcb\x39\x83\xbe\xcc\xca\x6e\xd3\xa3\xe1\xf0\xe8\xc8\x99\xf9\xed\xfe\xcc\xf5\x64\xf0\x6f\x84\x89\x48\xc6\xb8\xa8\xa6\xfd\x4c\x69\x60\xfa\x85\x76\x1e\xf6\x65\xee\xbe\x15\xba\x5e\xa1\xed\x76\x4b\xd2\xe2\x04\xb7\x2f\x9d\x5d\x37\xd3\x8f\x51\x40\x3b\x2c\x93\x5d\xae\x8a\x8d\x4f\xec\x53\x0a\x3b\x9c\xbc\x07\xe7\xaf\x8d\x8b\x63\xe3\xb5\x0b\x7b\xdd\xa1\x50\x36\x5e\x8f\x5c\x2e\x1b\xaf\x9d\x38\x6a\xab\xd2\xd9\x35\x83\x7b\xbc\x02\xda\x78\x3d\xd3\x62\x2a\xe5\xab\x55\x31\x6d\xbc\x76\x2b\xa9\x5d\x7e\xb7\xe5\xd2\x1f\xa4\xbc\x36\x5e\xed\x8a\x6c\xe3\x75\xe8\x52\xdb\x78\x35\x9c\x09\xb0\x81\x5f\xf0\x56\xc9\x03\x97\xf6\x9d\x72\xe4\xa3\x66\xf3\x54\x66\x34\x5b\x92\xd8\xda\x1a\x96\x35\x09\x98\x41\x06\xe6\xde\xa8\x28\xd0\xf7\x98\x67\x07\xca\x1f\x68\x91\x7c\xc9\x62\x9e\xaf\x2d\x59\xbc\x6e\xda\x7e\x00\x34\x2c\x8b\xa4\xe5\x9c\x9b\xd8\x94\x87\x12\xa4\xd1\x9d\xad\x91\xe3\xe6\x10\x39\x7d\x08\xb9\xd3\xab\x20\x1f\x83\x31\x0c\x3c\x7d\xb6\x16\xa0\x7b\x18\xdb\x2e\x19\xae\xd0\xe5\x61\x7d\xff\xc7\xf6\xc1\x13\x23\x7f\xbc\x05\xa6\xf7\x48\x6b\x42\x5a\x26\x99\xf1\xbf\x33\x28\xb0\xd5\x1a\xc2\x4a\x82\xd8\xed\x0b\x7f\x25\x32\x0a\x1c\xcb\x25\xf6\x03\xb3\xee\x77\xb6\x33\xcc\x9b\xb9\x37\x5f\x47\xe1\x01\x2c\x3a\x89\x42\x5f\x1d\x8f\x00\xbb\x11\x44\x74\x98\x3b\x3f\xdf\xb7\x41\x19\xbc\x5c\x99\x2f\x01\xb4\x7a\xf0\x4c\xf1\xa1\x7b\x07\x21\xa9\x83\x4a\x65\x65\xc5\xc2\xdc\x19\xb9\x19\x08\x94\x32\x48\x4f\x70\x52\xb8\xca\x41\x06\xb4\x5f\xb1\xb2\x90\x9c\x80\x3f\xaa\xa8\xfb\xe5\xd1\x0b\x57\x76\x95\xe0\x49\x79\x5b\x39\xe8\x36\x3f\xf0\x5c\xd8\x28\x82\x95\x3d\x52\xbf\x45\x72\xc5\xb2\xc1\x34\xe7\xf1\x2e\x9b\xe3\x19\x73\xb7\xc6\x3c\xad\x3d\x27\x6b\xc9\xbf\xf6\xe0\x5a\x3e\xca\xa2\x05\xdd\xef\x5d\xfa\xd0\x8c\x12\xe1\x0f\x21\xe1\xca\x61\x1a\xd4\x45\x02\xf8\x23\xe7\xfc\x3d\xb7\x5e\x6f\xb5\x0c\x21\x5a\x46\x36\x4d\x96\x97\xf0\x1c\xb1\x59\xdc\x79\x10\x95\x3a\x30\xff\x71\xfa\xad\x33\xd6\x8f\xd9\x44\x16\x25\x40\x50\xdd\xb1\xb1\xb4\x31\x4b\x18\xd4\x49\x77\x35\xd8\xcd\x03\xe0\xe6\x9d\xcb\x85\xd9\xcc\x3f\x09\xf2\xc1\x81\xd2\xf3\xc9\x2b\x42\x4f\x4a\xa9\x0a\xb6\xac\x8a\x60\x2c\xc6\x00\xdb\xa4\xf8\x4e\x96\x0b\xd5\x27\xe3\x13\x17\x6c\x02\x27\x4e\x18\x99\x2f\x71\xe2\x2c\x2a\xcd\x19\x33\x13\x00\x09\xbf\x99\x9c\x13\x25\x68\xaa\x66\x12\xaa\xeb\x47\x34\xa5\x11\xd7\x4b\x33\xdd\x3a\xa3\xd1\x1d\x94\xe1\xc9\x98\xfd\x62\x9f\x44\x27\x36\x5e\x2b\x9c\xc1\x72\xd8\xaf\x9e\x65\x32\x9f\xce\x20\x92\x15\x9f\x8a\x12\xaa\xdc\x04\xd4\xbe\x6f\xb5\x19\x45\xe2\xa5\xa0\x73\x1e\x79\xd0\xbc\x4c\x2e\xb8\xe2\xd2\x5a\x73\xb1\x5d\xb3\xeb\xc9\xb5\xc7\x3d\x43\x23\xf1\x79\x42\xf9\x9c\x1c\x2b\xc6\x88\xdf\x18\x78\xc7\x56\x6b\x47\xe3\x45\xc6\xcc\xeb\xa1\x05\x59\x7a\xf0\x6e\x61\x11\x07\x0a\x4a\xe7\x5d\x54\xc8\x28\xe1\xb8\xc5\xf5\x9f\x3e\xf1\x4b\x57\xdf\x33\x99\x81\x63\xde\xa1\x56\x32\x11\xcb\xc0\x3d\x79\x76\x7d\xa5\x42\xb5\x03\xf7\x99\xc5\x76\x83\x1b\x89\x14\xd3\x30\x65\xbf\xd8\xa5\x86\xac\x0a\xa8\x65\xb2\xe0\x71\x4e\x13\x24\xa8\xb6\x33\xe7\xa3\x2b\x7c\x9d\x4f\x67\x7a\x70\xcf\xc0\xec\x82\x7c\xa7\x08\x6d\x72\x1f\xe5\x2b\x61\x39\x5c\x01\x01\xd6\xd6\x6c\x80\x26\x2c\xd3\xb5\x7b\xba\x04\x7c\x17\x1b\x42\x52\xf2\x8c\x3a\x6c\x2d\x6c\xc2\xcf\x7b\x30\xe9\xd0\xbd\x33\x5f\x9b\xc2\x48\x0c\x60\x97\x32\xb3\x0c\xbb\x76\xb5\x6f\x66\xe2\x03\xac\x3b\xff\xb3\x2d\x43\x46\xcd\x1a\x81\x14\xf7\x93\x40\x0b\x13\xb8\x3b\xc6\x41\xec\x15\x34\x81\x76\x6c\x44\x38\x82\xc0\x7a\x7b\x0c\xbf\x63\x82\x65\x3c\xaa\x6c\x1d\xff\xea\x94\x6a\x38\x7c\x4c\x98\xd7\xe2\xe1\x66\xd5\xe8\x01\x64\xbc\x45\xb1\x95\x6e\x6d\x35\xc2\x96\xd2\x47\xef\x87\xc0\x0a\x17\xf8\x4d\xcc\x29\xa5\x22\x1e\xd0\xc4\xec\xcf\xeb\x8f\xe7\x36\x2e\x1a\xcf\x5d\x29\x2e\xc0\x15\x16\xe2\xc2\x23\x51\x1b\x29\xa5\xf6\xb8\x41\x02\xfc\x98\xc5\x40\xa6\xc2\x1a\x8c\xf7\x46\xe1\xb6\x5b\xe4\xfa\xe3\x79\x9f\xf0\x21\x1b\xba\xbf\xfc\xa3\x8e\x4e\x6a\x39\xc5\xa8\x42\x1f\x29\x0a\xbb\x1b\xba\x12\xda\xb6\xc2\x77\x7f\xf9\x77\xd3\x49\x73\xf7\x2f\x83\x7f\x0f\xb0\x3d\xff\xf2\x8b\x59\xef\xcc\x3c\x50\xfe\x35\x0c\x4d\xf3\x40\xf6\xbf\x5c\x5b\xa0\x67\x0b\x03\xfd\x8b\xad\x6f\xc5\x84\x36\x82\xe9\xb5\x04\xa7\x3f\x8f\x71\xcf\xc3\xb7\x33\xf6\x37\x67\xa7\x84\x69\xf2\x36\xa2\x88\x6a\x26\x80\x35\xb8\x1c\x0e\x21\x35\xbe\x6e\x4b\xb9\x9a\xfe\x1f\x83\x85\x01\xd3\xcd\xfa\x44\x4b\x09\x87\x1e\x09\xcb\x99\x20\xcc\x95\xbf\xc4\xb1\xc2\x74\x50\x1b\xf7\xe6\xb8\x9d\x69\xd6\xcc\xb0\xcf\xc8\x35\xfd\x80\xbe\x7d\x29\xa4\xfe\xd2\x2f\x7f\xa5\x30\x37\x5d\x48\xee\x30\xbd\xcd\x79\x14\x58\x24\xd1\xa3\x4c\x8f\x97\x64\xce\x95\xa6\x77\x6c\x48\x46\x86\x9b\x85\xce\x35\x9c\x3d\x41\x00\x0b\x92\xc5\x24\x17\x9a\x27\x70\xb7\x68\xc7\x74\x39\xe4\x72\x57\x13\xa2\x72\xa8\x18\x9e\x66\x6c\xe0\xf8\xa6\x7d\x6a\x85\xe2\x14\x63\xe9\xfb\xc5\x9e\x51\x54\x36\xd2\x18\x5e\x85\xf9\xa0\xc2\x6e\xaf\x95\x68\x30\xd3\x4f\x29\xa2\x82\x57\xc2\x64\xaa\x21\x79\x07\xec\x31\x71\x1e\x66\xd4\x7b\xac\x3d\x54\xb0\x88\x29\x45\xb3\x65\x1f\xb0\xd2\xb9\xc7\xd7\xb6\x01\x40\x40\x3c\xe6\x54\x20\x52\x79\xc6\x22\x29\x94\xce\xf2\x48\x63\xe9\xba\x71\x26\xef\x98\xf0\xd1\x87\x9e\x30\xf9\x30\xb0\x22\x1c\x07\xdc\x67\x92\x44\x33\x2a\xa6\x41\xe9\x97\x39\x8d\x61\xee\xbf\xf7\x72\x95\x1b\x8f\x99\x01\x3a\x31\xa2\x0c\xd7\x30\x15\x63\xc3\xb0\xbc\x55\xf7\x27\x41\x9c\xe2\xde\x2f\xcc\xae\x66\x48\x3c\xd9\x42\xbb\x5a\xd1\x2f\xd2\xd2\x46\x38\x00\x29\xe1\xc0\x61\x64\x73\xa6\x69\x4c\x35\xdd\x21\x94\xec\x6d\x51\xaf\xce\x95\xac\xc7\x9a\xa1\xde\xcf\x69\xb9\x9d\x13\xf0\x64\xca\xc3\x74\x29\x38\x89\x33\x37\xf3\x90\x7f\xad\xcd\x9e\xb2\x7e\x07\x8c\x10\x03\xf1\xc9\x15\x04\x33\xcd\xbb\xd6\x90\x5c\x14\xd5\x0e\x0b\x72\xd2\xcc\xab\xd5\xd2\xa0\x6b\xa6\x7e\x87\x39\xba\x2d\x5c\x6f\x51\x39\x5c\xac\x56\xd0\x41\x2e\xc1\x84\xe6\x19\x0b\xb3\xd3\xec\xd4\xe5\x02\x37\x79\x65\x12\x61\x96\xa7\x4c\xab\x22\xe0\x05\xe9\xb0\x21\x2e\x96\xdf\x59\xf5\x17\x88\xb4\x9d\x58\xab\x41\xd6\x4b\x5c\x38\xed\x4a\x5a\x3a\x6b\x28\xff\x83\xcc\xeb\x2e\x36\x6c\x44\xe8\x7f\x2b\xe3\x36\x66\xef\x0a\xb0\x7d\xd1\x44\x11\x05\x8a\xf1\xbc\x0a\xcc\x08\xf8\x0d\x70\x7e\xa9\x52\x8e\x1d\x12\xb9\x19\x5d\xec\x6e\xf3\x2a\x24\xb1\x81\x07\x05\x86\xcf\x0d\xe0\x73\x83\x97\xcd\x6d\x83\x6d\x02\x4a\xdc\xd5\x38\xb0\xa4\xfc\x91\x56\x86\x58\x43\x52\x46\x2d\xad\xa7\x55\xc4\x72\x4f\xed\xad\x3b\xd2\xbb\x80\x6d\xca\x04\xe3\x86\x4e\xbc\x22\x5f\x96\xf8\xbb\x95\xa3\xbc\x56\x86\x91\xbe\xc7\x4e\x4d\x1b\xda\x45\x70\x09\xe9\xe5\xc7\x4f\x2a\x8d\x81\x60\x51\xaf\xb1\xb8\x88\x62\x2f\xec\x19\xc1\x2c\x03\xbb\x9c\x4b\x64\x30\x1b\x2b\x93\x49\xc2\x32\x18\x82\x55\xd3\x2a\xee\x78\xc0\x12\x45\xe3\x70\xdf\xab\xc3\x5e\xba\x14\xec\xde\x8b\x11\x54\x21\x6a\x8b\x73\x9d\x31\x5b\x85\x6e\x6d\x7b\x3e\xea\xf9\x4c\x2c\xb1\xeb\x17\x7e\x59\xd6\x09\xe7\xfd\xb0\xa2\x1b\xf4\x85\x26\xf7\x74\xa9\x60\xc7\x17\xda\x82\xff\xbe\x45\x48\x2b\x1a\xbe\x61\x13\x7c\xbb\xb1\x6b\x6d\x27\xe7\xda\x2e\xee\x35\xc8\xbb\xe4\xa2\x49\x2c\x53\xf1\xc2\xc6\x2a\x1c\xd5\x6b\x17\x7f\x1c\x04\xbc\x80\x1f\xbe\x9d\x73\xa5\x0c\x79\x7a\x7d\x05\x4d\x38\x69\x7c\x0a\x7f\x38\x5e\xe3\xbd\x0f\x63\x66\x76\x75\x91\x51\x0d\x3b\x24\x7c\xb7\x26\x24\xa1\xd8\x5a\xdf\x03\x2c\xaa\x35\x40\xfb\xb2\x5d\x19\x83\x90\x12\xf8\xe2\x10\x60\xff\xa9\x58\x5a\x1e\xae\x67\x3c\x8b\x07\x29\xcd\xf4\x12\xd5\xd3\x7e\xe9\x6b\x3e\x3c\xbf\xd5\xc0\x77\xf4\x0b\x35\x43\x1c\x5e\x3b\xc3\x30\x78\x57\x7a\xcf\x1a\xfe\xd7\xce\xeb\x63\x8c\xa7\x79\x02\x40\xed\x78\xde\x05\xf9\xf0\x4e\x17\x7c\xb2\xf1\xc4\x21\xf9\xd8\x95\x63\x54\xbc\xb6\x48\xf8\xc3\xca\x4f\x32\x0c\xa0\xf6\x1c\x1d\x94\x1f\xd3\x81\xbe\xd1\x39\x69\x51\xaa\x3b\x30\x1b\x5a\xa9\xc0\x85\xdf\xd8\x42\x41\x62\x69\x8d\x41\xe1\xb7\xc2\x06\xfc\xb9\x20\xc7\x42\x0a\x3c\x2b\xf8\xec\x09\x46\x1f\xad\xb1\x76\xc1\x23\xb6\xc2\x5b\xb9\xc0\x66\x70\x36\x1d\x5b\xe0\x22\x36\x8b\x05\xb4\x1a\xf4\x21\x95\x47\x11\x63\x5e\x83\x0e\xeb\xbd\x14\x67\xd9\x76\xd9\x55\x8a\x54\x12\xa0\x5c\x94\xa6\x49\x52\x68\xae\x76\xba\x24\x70\x36\x67\x5c\x0c\x18\x5e\x29\x35\xc7\x2a\xf1\x50\x83\x1c\x23\x66\x72\x11\xa1\xf7\x9f\xeb\xa5\xeb\x41\xc8\x81\xe0\x35\x50\x19\x14\x2a\xb4\x7c\x82\x96\xac\x40\xf4\xf7\x93\x09\xc4\xc8\x56\x40\x2f\xf3\x22\x0b\xdb\x60\x28\xcf\x98\x46\x77\xf7\x34\x8b\xa1\x12\x6e\x4a\x35\x47\x20\xee\x7e\xa9\xd9\xe3\xa0\x0f\x50\x87\x3e\xdc\x7c\x27\x5e\xc1\x80\xf2\x1a\xb2\xf2\x19\x42\x73\x2d\xe7\x54\xf3\x08\xd4\x56\x3e\x09\xec\x92\x73\x8f\x5b\x58\xa9\xda\x07\x74\xd5\xd7\x7f\xbf\x45\x5f\x4f\xc6\x88\xbe\x97\x84\xcf\x8d\x4c\x40\xa1\x00\xc5\xc4\xe7\x18\x39\x23\xea\xa6\x9e\x1a\xc1\xe7\x07\x30\x61\x07\x4f\xa1\x42\x6c\xd4\x25\x05\xcd\x7b\x1b\xa9\x37\x0e\xda\x24\x9d\x7e\x85\x65\x13\xf7\x96\xd9\xd5\xa6\xb7\xc1\x66\xed\x9b\x05\xba\x67\x46\x16\x50\x1b\xb7\xac\x1a\xd6\xf5\x09\x8b\xc2\x2a\x12\x73\x55\xa9\xec\x7c\x1c\x67\x32\x4d\xad\x39\x64\x7e\xb2\xda\x27\xf0\x4c\x64\x0b\xa6\x82\xf2\xc5\x68\x09\x9f\x32\xe1\xeb\x6f\x5b\xb4\x0b\x38\xbd\xd5\x8f\x40\x64\x17\x09\xc0\xcf\x8e\xcf\x92\x74\x46\x4f\xc8\x07\x5b\xa8\xc7\xef\x5f\x1f\xb7\xd7\x48\x62\x42\x03\x8b\xb3\x68\x76\xa2\x4e\xc3\xab\x13\x75\x3a\x51\xe7\xf7\x2d\xea\xf8\x80\xb1\x5d\xc5\x9c\x1b\x1f\x25\x59\x29\xeb\xed\x22\x0e\x8a\x30\xca\x87\xb7\x5b\xf8\x6f\x3d\x30\x05\xdc\x8d\xda\x60\xe8\xc4\x1e\x3b\xe7\xe8\x0d\x06\x5f\x14\x15\x9e\x75\x10\x0f\x52\xc4\xa2\x18\x69\x23\xd7\x2c\x98\x7a\xcb\x84\x5a\xcf\x75\x29\xb7\xf4\x14\xab\x8a\x0c\x7c\xb3\x83\x22\xfc\xa3\x01\xb4\x78\x78\xed\x34\xeb\x64\x8f\x34\xca\xf0\x7a\xc6\x11\x20\x95\xc1\xb6\x8f\x71\x24\x7b\xc6\x39\x92\x7d\x62\x1d\xc9\x21\xe3\x1d\x89\x8f\x9a\xde\xe7\xc4\xdc\xb8\x78\xed\xca\x99\xb1\xc4\x69\xd3\x99\x29\x65\xeb\xfb\x76\xb8\x72\x15\xeb\xac\xb7\xcf\x9f\x01\xb0\x97\x85\x51\xb7\xf6\xb4\x82\xe2\x83\x2e\x3d\xf6\xc9\x63\xe3\x06\xbc\xbe\x28\xdf\xac\x25\xb8\xff\xe7\x29\xc2\xec\xc0\xa9\x1b\xd8\xd8\x28\xa7\x58\x74\x27\xb8\x3b\xc1\x4d\xdf\x7f\xca\x13\x8c\x71\xc5\x6d\xc2\xde\xcb\x72\x35\x3a\xf1\xc8\xaf\x39\xcb\x96\x44\x2e\x58\x10\x4f\x03\x20\xc0\x8a\xc7\x36\x22\xc5\xda\x1c\x9a\xcb\xb2\x8f\xc8\xf3\xc1\xa2\x71\xf9\xc9\x48\x46\x90\x21\xb6\x07\x2d\xab\x36\x55\x4e\x02\xc6\xd9\x72\x93\xee\x88\x97\xa1\x22\x6a\x68\xd1\xc1\x8a\x5f\x40\xdf\x3f\x7b\x77\xb1\x9b\x02\xd0\xce\xbf\x43\x76\xf1\xf1\xac\x0c\xfe\x6c\xc3\x00\x71\x22\xfc\x9d\x72\xfd\x23\xaf\xa5\x93\x3b\xb6\xec\x5b\x97\xb0\xc5\x35\x77\x0f\x63\x64\x43\x19\x8c\xb3\x29\x08\x44\xdd\x04\xed\x40\x15\x77\xd3\xaa\xf1\x6a\x0e\xdf\x58\x7e\xcb\x4d\x42\x5b\xe2\xbb\x33\xd9\x6e\x05\xf3\x18\x5e\xa5\xad\x60\xa1\x49\x21\x70\x0e\xf6\x04\x40\xda\xb9\xa0\x62\xbf\x0d\x20\x90\x1a\xa8\x45\xdb\x45\x24\xbb\xab\x86\x78\xb9\x89\xdd\x7b\xa8\x7e\x9b\x96\xa2\x62\xef\xd8\xf2\x48\xd9\x7c\x3c\x29\xd4\x8c\xa7\x0e\x45\x1d\x28\x81\xdd\xb9\xe4\x23\xb8\xca\x5d\x13\x78\xe6\xaf\x44\x9f\xbc\x93\xda\xfc\xef\x12\xa2\x66\xd0\x90\x27\x99\x7a\x27\x35\xfc\xf2\xe8\x93\x85\xdd\xdd\x7b\xaa\xac\x0d\x8f\x83\x05\x0e\xa3\xbb\x20\x17\xc2\x45\x63\xc0\x94\x58\x07\xa4\x9f\x56\xae\xc8\x95\x20\x32\x73\x73\xa2\x1d\xec\xae\xb2\x4d\x38\x9b\x4b\x60\x30\xad\x69\xc3\x4e\xa5\xcc\x4a\x33\xb9\xa1\x39\x6f\x7b\xe5\xee\x0e\xd8\x64\xc0\x58\xed\x43\x48\x00\x3c\x96\x6a\x36\xe5\x11\x99\xb3\x6c\x0a\x99\x97\xd1\x6c\xf7\x05\x6a\x4f\xb7\xf1\xda\x89\x7a\x87\x1f\x6e\xbd\x33\x80\xd5\xbd\x81\x20\x9e\x7d\x19\x26\xb6\x82\x2c\x62\x4e\x53\xb3\x29\xfe\x61\x38\x01\xac\xcb\x3f\x01\xec\x59\x0d\xc9\x99\xab\xc0\x19\xde\xb3\x86\xb6\xb0\x19\xd3\x82\x91\xe3\x7f\xcd\xf9\x82\x26\x0c\x43\xdb\xa8\xf0\xb8\x98\x72\xb2\xc2\xa6\xfb\x16\xf1\xd9\x50\x29\xef\x38\xe9\xdd\xb1\x65\xaf\xbf\xb2\x91\x7a\x57\xa2\x57\xa4\x3f\x97\xb6\x8e\x67\x68\x60\x53\xef\xc1\xbd\xde\xa1\x39\xfb\x13\x89\xf3\x3b\xec\x12\x6b\x04\x3a\x4f\xa8\x52\xed\x32\x47\xd7\xe3\x8f\x8d\x82\x36\x8b\x0c\x1e\x1b\xb0\x18\x61\x40\xd4\xe1\x6c\x55\x10\x47\xdf\x3e\xb8\xa6\xd5\x2c\x2d\x6c\xf9\x90\xe6\xd0\x07\x55\xaa\xea\x1b\xf0\x89\x12\xf7\x61\xae\x59\xe1\x93\x5c\x33\x5f\x1f\xc1\xeb\x21\x27\x21\x5e\x22\x57\xa0\xe2\x72\x97\x3a\x21\xa4\x26\x5c\x44\x49\x1e\x23\xce\x23\xbc\x0a\x0a\x72\x5b\x91\x7e\x87\xc9\xd9\x63\xf3\x7c\xf4\x0d\x38\x79\xc4\x79\x3f\x57\x62\x56\xab\x6e\x2a\x70\x0d\x7a\x8f\x0f\xce\xd5\xa1\xc7\x3a\xd9\x12\x21\x58\x86\xb3\x3c\x2f\xcb\x18\xaf\xf9\x38\x63\xe4\x7c\x46\x85\x60\x49\x90\x2f\x6a\x0d\x19\xbe\x84\x13\x08\x1e\xb6\x70\xd3\x51\xb9\x72\x93\xa3\x63\xc2\x67\x27\x1f\xbc\x7a\xed\xe7\x5d\x48\xe9\x60\x95\xb0\x2d\xaa\xe1\x4c\xde\x93\x58\x92\x7b\xc0\xf2\x5f\x18\x76\x04\x9e\x48\xe5\x18\x59\xd0\x53\x88\x0d\x88\xe4\x3c\xcd\xe4\x9c\x2b\x17\x01\x6e\x17\xee\xa0\x09\x96\x49\xde\x00\x37\x67\x1d\xe0\xca\xeb\x73\xa2\x69\x36\x65\xda\x34\x43\x44\x3e\x1f\xb3\xc6\xe9\x9f\x0f\x01\xd8\xf5\xdc\x2b\x44\x1d\xb6\xc8\x13\x4e\xfd\x0f\x3f\xbc\x6b\x5d\x0a\xb6\x6e\x05\xef\x65\x96\xc4\xf7\x3c\x46\xa7\x97\x22\xc7\xa6\xe1\x93\xe7\x5f\xb7\xf5\xfe\x9e\xc7\xfb\x4d\x80\x8b\xec\x31\x13\x40\x60\x06\x6c\xe5\x22\x0e\x98\xd2\xf0\x81\x13\x72\xc9\x31\x37\xc6\xfc\x85\xa8\x2d\xf3\x31\x17\x45\x16\x96\x5f\x0c\xa0\xab\xe6\x3c\x38\x6d\x42\x31\x8d\x59\x0d\x90\x18\x20\xf5\x8c\x28\x3e\xcf\x13\x4d\x05\x93\xb9\x4a\x96\x8d\xb7\xc5\xd3\x4c\xf2\x24\x61\x9f\x70\x17\xb7\xe1\x57\xfe\xa5\x32\xdf\x9a\x62\xee\x97\x9b\xf3\x15\xc6\x55\x84\x0b\xc5\xa7\x9e\x89\xf9\x64\x19\xf6\x89\x45\x36\xb2\x35\x4d\xf2\x29\xdf\x12\xbc\xff\x3b\x83\xf8\x2e\x40\x94\x73\xc5\x8a\xcc\xf6\xa6\x45\x4c\x9e\x0e\x91\xfb\x41\x99\xf5\x6d\x3d\xec\x76\xcc\x52\x26\x62\x40\x04\x0b\xf6\x2a\x76\xf7\xa0\x73\x65\xd1\xb5\x76\xa7\x50\x97\x9f\x74\x46\x0d\xb9\x99\x43\x52\xa5\x05\xeb\xe2\x13\x42\x45\x73\xd2\xf1\x3c\x50\x70\xc9\xef\x8e\x47\x3f\x78\x91\xe4\xfd\xb0\xd7\x91\x8a\xda\x6d\xaf\xca\x01\xab\x35\x18\xe9\xf6\x2b\x61\x64\xe9\xbe\x58\xe9\xaa\x06\x1e\xba\xd2\xab\xae\x78\xe4\x67\x01\x9c\x3e\x81\x9c\xd4\x36\x70\x42\xaf\xf1\x8d\x8a\x66\x6b\x7f\xac\x16\x23\xde\xa0\xc9\xda\x7d\x1b\x90\x74\xc0\xee\xb4\x0d\xd9\xbc\x1a\xa2\xcc\x5c\x16\x21\x5c\xb9\x10\xdb\x88\xd5\x43\xe0\x61\x53\x4d\x15\xd3\xcd\xac\x1a\xab\x61\x69\x8e\xd3\x63\x2b\x08\xc0\x0e\x01\xd1\x2e\x31\x93\x0c\xfe\x62\x65\x02\x51\x7a\xd2\x48\x03\x6e\x42\x1c\xe2\x10\xf3\x6e\x5a\x6c\x23\x36\xcb\x10\x51\xdd\xb8\x5a\x4c\x23\x7a\x6f\x7b\xf0\xe1\x43\xeb\x92\xa2\xe6\x95\xca\x88\x87\x1e\x6f\x20\x17\xfc\xd7\x3c\x94\xd4\x01\x9b\xc1\x8f\xd1\x3e\x7f\xa8\x81\x4c\x23\x56\x98\x88\x2e\xb8\xba\x6b\x03\x9a\xf5\xdd\xf9\x65\xf9\xe5\xf2\x86\xff\xee\xfc\x92\xd8\x5f\x1b\x59\x71\xda\x98\x71\xf6\xc5\x74\x9a\x46\xac\x30\x8d\xc6\x5c\xdd\x3d\x7a\xc1\xee\x34\x7e\xb7\x2d\xce\xf8\xb1\xad\x4c\x0e\x57\x24\x00\xbf\x59\xca\x9c\xdc\xdb\x4c\x7a\x2b\xd4\xde\xf2\xf4\x15\xb9\x14\x2a\xcf\x58\xe1\xfd\xac\xca\xb7\x86\x93\x3e\xa7\xc2\xde\x7b\xed\x8d\xe7\x6c\xe6\x4a\x69\xa6\x41\xb2\x6d\x8d\x23\x06\x50\xf9\xf6\x65\x37\x84\x2d\x4b\x7f\x35\x71\x31\x68\x7d\x9b\x25\xec\xc1\xb6\xdc\x43\x66\xb1\x03\x60\x8c\x70\x79\x5f\x7b\x68\x1a\x72\x1a\xb3\xc5\xa9\x8a\xe9\xcb\x3e\x7c\xc6\xa5\xb2\xea\x52\x9f\xa8\x22\xbd\x97\xbd\x21\x19\xf1\x39\x4f\x68\x96\x2c\x4b\xd8\xc0\xc5\x73\x86\x05\xb8\x06\xc1\x99\xf5\xa2\x47\x8e\x65\x06\x2d\x47\x54\x90\x84\xb9\x3c\x19\x7b\xa0\x96\x28\x02\x9e\x3c\x36\x15\x21\x0f\x6a\x23\x44\x82\xd2\x76\x1b\x7c\x40\x76\x53\x82\x41\xb9\x28\x28\x36\x17\x86\x8c\x0f\xc9\x87\xba\xd2\xd7\x70\x36\xdc\x13\x4f\x35\x95\x0f\xaa\x9b\xed\x59\x37\x7f\x45\xa1\x7b\xba\x69\xda\xae\xd5\x4d\xb9\xbe\x61\xa9\x6c\x25\x00\xe0\x2b\x15\x4b\x18\xd7\xe6\x07\xa9\x38\xe0\x65\x52\x0d\xd5\x67\x33\xcd\xa3\x3c\xa1\x46\x26\x46\x3b\xd8\x90\x5c\x5c\x5e\xdf\x5c\x9e\x9f\xdd\x5e\x5e\xbc\x22\xae\x25\x1e\x4a\x6b\x43\x72\x1b\xa2\x08\x05\x21\xaf\x16\xaa\xc5\x7f\xab\x6f\x89\x0f\x15\x05\x0c\x21\x60\x43\x50\x41\xae\x04\xd7\x05\x4a\x2f\x06\x69\x25\x52\xd8\xb0\x2b\xf3\xb6\xb5\xc3\x4d\x39\x86\x4e\x08\xdb\x98\xb9\x5d\x6e\x0d\x4e\x07\x22\x7e\xfa\xae\x6c\xd1\xe2\x1e\x40\x72\x28\x26\xf7\x50\xb2\xbb\x03\xe6\x6c\x79\x3c\x6e\xd1\xc0\x5e\x60\xa3\x22\xc5\xf7\x70\xe0\x0e\x15\xa5\xa6\x50\x32\x31\xbc\xe4\x68\x78\xe4\x04\x85\x64\x05\xfa\xdd\x37\x1a\x02\x3f\x95\xf7\xd6\x90\x90\xf7\x2e\x84\x19\xb2\x56\xeb\x51\xe4\x11\x4a\x20\xc0\x22\xaf\xec\x50\x57\x1a\x20\x1f\x87\x1f\xb5\x48\x51\x53\xbe\x60\x02\x07\x76\x58\x82\xe4\x3e\xdf\x72\xce\x6f\x8a\x7e\x7f\xb8\x79\x73\xd8\x2e\xe1\x39\x6b\xd9\xa1\x73\x39\x9f\x23\x7e\xd0\xcc\x67\x9f\x15\x09\x64\xfe\xb4\x1f\x4c\x61\x41\x24\xa4\xc9\x96\x4d\x5d\xa1\x53\xee\xa5\x8a\x82\xe2\x7f\xb6\xd1\xf8\xa2\x90\x53\xdb\xc3\xfc\x5a\xd0\x2d\xe5\x20\x35\x2c\xc9\x3e\xf5\x3d\x3e\xbd\xb9\x3c\xbb\x78\x7b\x39\x9c\xc7\x8f\x4e\x32\x98\x88\x53\xc9\x85\x56\xdb\xd5\x92\x6d\x45\x4d\x9a\x93\x15\xff\xd1\xb6\x5c\xf7\xd2\xbd\x18\x86\x38\xb8\xd6\x02\xac\xb2\x98\x69\xca\x13\x15\xac\xa3\x96\xa9\x4c\xe4\xb4\x1e\xf3\xb7\xc5\x02\xfd\x01\x91\x47\x06\x74\x60\x56\xfe\xb0\xf2\x7a\x93\x52\x0d\xe5\xf9\x70\xa5\x19\x00\x63\xd0\x8f\xd5\xcb\xc1\x50\x51\xe1\x99\x0e\xf7\x41\x04\xaf\x95\x39\x40\x6d\x10\x0e\xb1\x83\x71\x2b\x70\xd1\x82\x32\x29\x4d\x25\xb2\x87\x9e\xba\xed\xc2\x98\xa1\x41\xdb\x6b\xe1\x94\xe7\xec\xaf\xf6\x9d\x32\x91\x4b\x33\x36\xf0\x40\x3e\x50\xbd\x43\x66\x01\x77\x0d\x69\x9e\x33\xbc\x38\x33\x0d\x3e\x95\x2c\xab\x06\x98\x42\xf6\xf1\x56\x2b\xcc\x43\x4f\x92\x65\x01\x0d\x68\x55\x61\x3a\x45\x80\x9e\xcc\xda\x6f\xd3\x8c\x2f\x78\xc2\xa6\x00\x02\xca\xc5\x34\xa8\xa5\xe8\x32\xd6\x01\x1c\x9e\xad\xf4\xcb\x2c\x95\xd2\x21\xf4\x33\xec\x8b\x77\xef\x6f\x01\x58\x16\x9c\x82\x7b\x0b\xd8\xe6\x83\x50\x68\x64\x30\x18\x80\xde\x7f\xfc\x37\x23\x2b\xc6\xc9\x09\xf9\x81\xd9\xef\x48\x00\xbf\xcd\xa0\xda\xcc\x4c\x7a\xf4\x51\xe8\x6b\x31\xb3\xb0\x1d\xd1\x69\x6e\x9f\x3a\x35\x4f\x1a\xc1\x08\xd9\x4d\xe9\x79\x28\xae\x89\x70\x7e\xe8\xef\x79\x7c\xb9\xf2\x80\xa4\x7f\x67\x2a\xe7\xac\xa2\x75\xfb\xd3\x7b\x64\x52\x4b\x0f\x29\x51\xcb\x79\xc2\xc5\x5d\x81\x18\x35\x91\x66\x0f\x61\x8c\x3e\x17\x77\x6e\xc7\x66\x8c\x26\xeb\x29\xe5\x2e\xfb\xe3\xa0\x54\x52\xef\x60\xbc\xbb\x5d\xa6\xe8\x0b\xf7\xc7\xde\xba\x7a\x43\x12\xd7\xeb\x3d\xbb\xf1\x72\xd5\xae\xd2\xfa\xd1\xd5\xe8\x7c\x54\xaa\x12\x6a\x74\x3a\xf8\xed\x31\x8d\xcb\xeb\x58\x02\x0c\xe7\x09\x25\x3b\xfe\xeb\x36\x4f\xed\x80\x24\xf9\xf6\x67\x30\xcc\xe7\x5a\x66\x9a\x26\x07\x22\x02\xd1\x8c\xa6\x67\xb9\x9e\x5d\x70\x15\xc9\x05\x6b\xad\xea\xdc\xcf\x10\xb5\xd7\x01\xc6\x71\xb7\xe8\xd8\x1a\x39\xff\xeb\xd9\x35\xa1\xb9\x59\x45\x6d\x61\x25\x0f\xea\xe2\x76\xfd\x1f\x61\x40\xfd\x41\x7a\x6f\xdb\x7a\xf0\xbe\x77\x0e\x81\x03\x3a\x04\xe0\x8c\x3f\x67\x27\x00\x17\x5c\x73\xaa\x65\xc3\x5a\x56\x65\xfd\x3d\x57\x5a\xce\xed\xf6\xbc\x72\x0d\x81\x57\x16\x18\x6e\xa9\xed\x32\x46\x3f\x08\xda\x30\x39\x57\xc2\x88\xc5\x34\x62\x95\x08\xc0\x3e\x20\x37\x62\xdb\xdc\x3f\xf3\xef\x36\x32\x13\x20\x9f\x92\xbf\xbc\x2a\x21\x69\xaf\x14\x42\x70\x46\x85\x02\x5c\xff\xa0\x96\x18\xfe\x6b\xdb\x93\x6d\xcd\x5e\x38\xaa\xff\x9b\xd3\x04\x67\xe3\xdd\xa1\x6d\x44\xe5\x99\x6d\xd9\x49\xb7\x9e\x6e\xce\xdf\x79\xad\x39\x57\x88\x16\x85\x4f\xe8\x8c\x0a\x65\x16\xa2\xac\x1b\x1d\x59\xd7\xce\x11\x39\xd6\x51\xda\xb8\x5c\xfb\x03\x45\x66\x63\x57\xed\xbc\xbf\xf1\x11\xd9\x4d\x7b\xf5\x20\xde\x16\xd8\xbb\x6d\x4d\x1b\xa5\x81\x20\xb3\x25\x6f\xb8\xd2\x0e\x16\x1f\x7e\xe0\xca\x62\xba\x82\xa4\x73\x6d\x54\x27\x9e\xfe\x37\x8d\xe3\xec\x15\x72\x12\x57\x52\x37\x03\x79\xc7\xe1\x2e\x51\xe1\xfd\x71\xc7\x7a\x99\x5a\x68\xb6\xdb\xf3\x6b\x82\x55\x31\xfe\xed\x1b\x2c\xe7\xf9\xa7\xaf\xbe\x79\xd1\x78\x41\x9f\x2e\xfc\x79\x47\xcb\xc1\xc1\x3d\x36\xcf\x22\x6a\x0e\xc4\x05\x8c\x97\x03\x7a\x68\xcf\x2e\xee\x23\xb3\xa8\x9e\x4a\xef\x26\x54\x74\x11\x66\x4f\x1a\x61\x46\x7c\xd2\x03\xd2\x84\xfd\xa9\x0a\x12\x94\xeb\xe7\x47\x50\xb6\xce\xc5\xf6\x5d\x53\xde\x2d\x78\x7e\x8d\x7e\x17\x78\x9f\x20\xe6\xfa\xe2\xdd\xe8\xbf\xdf\x9c\x7d\x7b\xf9\x06\x7a\x69\xe3\xaa\xcc\x36\xe0\x62\xe7\x38\xa2\xe6\xdb\xaa\x89\x26\xb8\x7d\x32\xda\xf9\x39\xde\xbd\x1e\x55\x14\x65\xf3\x4b\x4b\xe7\xc6\xbe\xd2\xb2\x98\x34\x1a\xfb\xe3\x9a\xae\xa0\x6c\x04\xcb\x0e\x97\xe2\xb0\xb3\x85\x2b\x80\x64\x2a\x29\x43\x66\xa5\xb0\x87\x7b\xeb\x2b\x5b\x57\x80\x3c\x03\x23\xbe\x19\x2f\xce\xc1\xc1\xcd\xf7\x0f\x34\x57\x4d\x59\x7c\xd6\x3e\xf7\xe5\x68\x04\x6f\x39\x27\x8f\x39\xa4\x18\x91\x93\x19\x7a\x6d\x28\x35\x53\x1e\xe4\xfe\x99\xee\x94\xb4\x0e\x11\xb7\x0d\xf5\xaa\x85\xd4\x2d\xd5\x83\x2a\x39\x36\x4a\x19\x03\xeb\x30\xa4\x9d\x6f\x9f\x5a\xf5\x52\xa5\x34\x3a\x28\xf2\x63\xf1\x13\xfe\x02\x29\xd5\x8f\x4f\x00\xe1\xb3\x07\x0c\x28\xf5\xed\xb5\xdd\xc8\xe7\xee\xc5\x6a\x22\x57\xab\x15\x72\xf5\x14\x52\xe9\x92\xe4\xc2\x8c\xaf\x27\x5e\x3e\xf2\x28\xd4\xf3\x87\x1d\x55\x97\x43\xab\x2d\xe9\x4c\x6a\x29\x76\x0e\x12\xbf\xae\x79\xbd\x7c\x8e\xf1\x89\xf3\xa2\x48\x48\x50\xa1\x0f\x22\x0c\xbd\x41\xdf\x88\x71\x8e\x4b\x48\xe1\x4c\xfb\x65\xc3\xfe\xa3\x4b\x1e\xf1\xd5\xc5\x81\xce\xdc\xe7\x94\x7c\xd8\xd6\x04\x7b\xd0\x10\x8a\xb8\x75\xc6\xc5\xd5\x85\x95\xbb\x5c\x56\x85\xb2\xdb\x8e\xac\xdf\x77\x07\xe3\x8b\x32\xd3\xf7\x32\x6b\x9f\x6a\x7c\x5d\x7a\xb1\xe2\xd5\xb7\xf7\x56\xb2\x89\x9e\xe3\x19\xc1\x3e\x3e\xf1\x39\x19\x81\xc3\xb4\x82\x15\x5d\x3d\x19\x3e\x8a\xfd\x01\x0e\xcf\xd3\x1e\x9a\x1d\xb9\xd0\xc3\xa6\xa4\x1e\x54\xf0\x76\xbb\xac\xe5\x08\x3f\xda\xd7\xac\x81\xc0\xac\x4d\x41\x24\xa8\x3f\x84\xb6\xf9\x83\x11\x85\x4c\x62\xdd\xbe\x16\xf4\xe0\x4a\xb3\x39\x16\xf8\xa5\x49\x62\xe6\x52\x8a\x10\x36\xd8\xa6\x9d\xf6\x09\x22\xef\xce\x69\xea\xaa\x25\xcb\x7b\x71\x4f\xb3\x98\x9c\x5d\x5f\x1d\xe6\xe8\xb7\x08\x2d\xc6\xfd\xd3\x0c\x09\xaa\x5c\x56\x51\xc6\x8c\x8c\xb9\x56\x45\xc1\x33\xa6\x43\x6d\xd0\x90\x37\xef\x23\x32\x87\xd4\x1c\x48\xfb\xbd\x80\xfb\x09\x22\x23\x4d\x93\x4a\x01\xfa\x17\x2f\x5e\xa0\xf1\xea\xc5\x9f\xff\xfc\x67\x2c\x42\x13\xb3\x88\xcf\x57\x1f\x84\xa7\xfe\xf5\xe5\xcb\x21\xf9\xaf\xb3\xb7\x6f\xa0\x20\x5e\xaa\x15\xc2\x5d\x60\xcb\x58\x92\x3b\x78\x59\xf5\xc9\xff\x19\xbd\x7f\x57\x94\xd2\x28\xdf\xb5\xd5\x8c\xed\xf0\x86\xe4\x22\x08\x01\x0a\xcd\x53\x54\xcf\x6c\xed\x17\x4d\xe8\x64\x82\x65\x1e\xc7\xae\xca\x28\x1e\x29\x97\xd9\x0c\x25\x99\xb1\x46\x83\x59\xfe\x04\x62\x93\x8c\x22\x8d\xc6\x3c\x97\x5c\x8f\xa1\x56\xd0\x96\xa7\x7f\xd0\x95\x3e\x16\xf5\x9e\x28\xa8\xd4\x50\x40\xc1\x65\x4c\x19\x99\xd2\x96\x9e\xc3\xc6\x7c\xd7\x4d\x27\x9e\xd2\x07\xd3\xb8\x82\x40\x69\x63\x39\xe0\xda\xa2\x3a\xf8\xdf\xd0\xad\xb8\x2d\x38\xf6\x81\x7c\x22\x65\x9e\xef\x7b\x83\x6b\x65\x53\xd6\x3d\xb9\x20\x34\x91\x50\xe5\xc8\x2f\x6d\xc1\x8f\x82\x2a\xe3\xdb\x87\xd2\x1a\x79\xaf\x2d\xfa\x2a\x52\xa1\xb7\xb4\x71\x8d\x93\xb2\x49\x3b\x48\xed\xa7\x63\x99\x6b\xe7\x02\xc6\x36\xb1\xbc\x1f\xd6\x98\x6e\x81\x1c\xb8\x03\xd8\xe0\x2e\xa0\xb3\xad\x71\x2b\xcb\x64\xbe\x24\x04\xf4\x09\xa3\xd1\x8c\xdc\xb1\xe5\x00\x09\x53\x4a\x21\x1b\xc5\x57\x91\xb2\xd8\x8e\x65\x7f\x49\xc4\x62\x23\xd9\xda\xc9\x72\x1e\xf5\x62\x17\xf9\x6c\x16\x27\x3e\x2a\x2b\xe9\x58\xcc\x48\x11\x28\xf0\x0e\x98\x38\xa8\xc3\xea\x41\x22\xb1\x08\x73\x39\xeb\xc2\x9c\x2f\x16\x9b\xd7\xd4\xa6\x2f\x17\x61\x04\x86\xd0\x59\x56\x95\x8b\x95\xb7\x6d\xd1\x61\x2b\xb6\xc1\x07\xa9\x83\xe2\x0d\x42\x11\xa0\xb4\x99\x2d\x67\x63\x9f\x75\xb3\xe4\x27\xa2\x94\x15\xa2\x98\xce\xed\xd4\x60\xdd\xa4\x5c\x24\x4c\x29\xc2\x61\x84\x73\x9a\xdd\x31\x07\x4a\x42\x93\x21\xb9\x36\x9d\xf4\xc8\x47\x88\x81\xbb\xc0\x30\x32\x73\x46\xc3\x74\x17\xf3\x91\xa3\xe1\xf0\x08\x29\x78\x4d\xf2\x4b\x8b\x9d\xb1\x1b\x80\xea\x0e\xc0\xa9\x95\x92\xc6\xa9\x42\x18\x58\x23\xb5\x01\xcc\xb1\x84\x2c\x2e\x3d\x73\x1c\x8a\x36\x86\xdf\x59\x1d\xce\x0e\x68\x9f\xbb\x82\x54\xef\x02\x51\xdd\xc8\x9d\x50\xbe\x76\x87\xa6\xde\x09\x98\x7a\xa5\xb6\xb2\x5d\x22\x7b\xcc\xda\x23\xf5\xee\x01\xa4\x3c\x6f\x05\xf2\xe9\xae\x75\x98\x30\xf3\x26\x52\x9f\xad\x56\x96\xb0\xcf\x4a\xcc\xbb\x9a\xd4\xd5\xda\x72\xe9\x6e\x85\x9c\xec\x89\xa6\x99\x81\xa7\x97\xef\xda\x55\xe7\x20\xad\x05\xbe\xea\xd5\x46\x00\xac\x5e\xcd\x9c\x72\xd5\x6b\xe5\x34\x79\xea\x9e\x06\x21\xe9\x30\x95\x5a\x02\x12\xb3\xf6\x47\x6e\x08\xe5\xdf\x2d\x8f\xa2\x46\x56\x51\x32\xc9\xb5\x4f\xcb\xa9\x61\x0d\xd0\xa8\xc3\x6d\xc6\x64\x48\xf7\x58\xc0\x28\x80\x45\x22\xfd\x6d\xcb\x33\xf0\xda\xe9\x48\xb7\xad\x30\xf6\x9b\x0d\xdc\xd8\x63\x0e\x9d\xcc\xb0\xf3\x3c\x8e\x2c\x1a\x82\x8b\x20\x2e\xc9\x30\x10\xbc\xa1\x15\x0a\x48\x4e\x1c\xb1\x95\x7a\x5a\x8f\xac\x99\x61\xc5\x76\xd1\x5a\x11\xce\xae\xaf\x0e\x28\xd1\x07\xad\xfe\xa6\x65\x7a\x30\xdd\x94\xea\xa6\x5c\x14\x23\xb7\x06\x5e\x43\x61\x9e\xbd\x68\xb8\xd2\xed\xd7\x86\x2e\x06\x66\xd5\x0a\x28\x9b\x2d\xe1\xee\x29\x68\x00\xe4\xe6\x1c\x7c\x70\x5e\x9f\xbb\x18\xf9\x88\x22\x21\xcc\x47\xab\x02\xd0\xee\x5a\x2d\x41\x06\x83\x25\x23\xa8\x4d\x82\x3a\x5e\xa0\x2c\xa6\x32\x7e\x65\x4b\xe5\x0a\x21\xb1\xea\x97\xea\x63\x71\x13\xd5\x47\x25\xd0\x08\x0a\x81\x5b\x36\x0b\x0c\xe0\x3b\x8b\x06\x3b\x95\xa9\xd9\xa7\x50\x8d\x59\x40\x18\xf9\x75\xdb\x55\x24\x7b\xd6\x9d\x21\x01\x17\xda\xad\x92\x45\xd9\x58\x8d\x2d\xf9\x3a\xd6\xd1\x8c\xcd\x29\x82\xc2\xb9\xe1\x19\x2a\x73\x9f\x71\xad\x19\xa2\xfa\xb0\x6c\xae\x88\x9c\xf4\x4b\x15\xe2\x7a\x8b\x97\xbd\x5d\xea\x79\xec\x59\x72\x85\x14\xab\x70\x80\xc9\xb8\x2e\x49\x67\x66\x5f\x83\xba\x90\x00\x92\xa3\xa8\x18\x19\x0c\x83\x59\xe0\xec\x3d\xfa\xc0\x9f\x52\x45\xea\x7b\x21\xa1\x53\x91\x3a\x15\xe9\x20\x2a\x52\xc0\x58\x1c\xc1\xb1\x13\x15\xaa\x4d\x21\xa2\x94\xd3\x9d\x8a\xac\x9e\x00\x25\xc6\x6c\x4d\xa7\x35\xc9\xac\x6c\x45\x33\xaa\xcf\x91\xd3\xa5\xec\x3e\xce\xf5\x64\xf0\x6f\x84\x89\x48\xc6\xb8\xf8\xa6\xfd\x4c\x69\x10\x6d\x0a\xf5\x23\xec\xcb\xdc\x7d\x2b\xb4\xc4\x41\xdb\xbb\x2e\xdd\x4e\x74\xc0\xf9\xea\x5e\x1f\x88\xc1\x17\x6c\xdd\x27\xc1\xda\xe1\xfb\x1c\x79\xcb\xdf\x0b\x2f\x21\xd6\x02\x86\xcd\xed\xca\x9c\x92\x63\xfc\x71\x18\xa5\x79\xdf\x3e\x30\x9c\xb3\xb9\xcc\x96\x7d\xff\x90\xb9\x59\x7a\xcb\x3e\x71\x02\x32\x41\x94\x67\x46\xd9\x4b\x96\x9f\xab\x74\xe0\x26\xe8\x91\x85\x03\xbf\x4e\xed\xaa\xc1\x84\x57\x25\xfc\xce\x03\x5d\x81\x2a\x5f\x54\xc7\x99\x78\xf0\x3d\xd5\xf7\x2a\x2a\xfc\xca\xc4\x82\x2c\x68\xd6\xa2\x74\x75\x78\xed\x29\x0f\xc4\x7c\xc1\xd5\x6e\x05\xeb\x6a\xb5\x66\x6e\x61\xbd\x64\xae\xd3\x5c\x5b\x4a\xe9\x4e\x85\x4b\xf5\xf6\xa7\xa1\x22\x14\xbd\xec\xed\xd4\x8d\xcf\xa6\x28\x2c\x5e\x3b\x96\x86\xc5\x6b\xdf\x02\xb1\xe5\x56\x76\xde\x36\x07\x2d\xf7\xec\x2e\xb7\x2d\x0e\x71\x0e\x0b\x16\x59\xe0\x13\x38\xe1\xf4\x91\x0e\x1a\xc6\x83\x1c\xd0\x56\x63\x81\xd0\x7f\xcb\x66\x9a\x03\xb9\x5e\x6d\xa6\xde\xef\xdc\xef\x3a\xb2\x98\xf8\x9d\xd3\xb5\xd1\xe6\xeb\x9c\xae\x9d\xd3\xb5\xe9\xd5\x39\x5d\x3b\x8b\x42\xf9\xfa\xac\x2d\x0a\x9d\xd3\xb5\x73\xba\xee\x37\x87\x0f\xe2\x74\xb5\x62\x5c\xe1\x71\x7d\x54\x87\xab\x2d\xeb\x72\x16\x45\x32\x17\xfa\x56\xde\xb1\xc6\x1e\x84\x46\xc2\xfc\x4a\xeb\x8f\x27\xd9\xb7\x17\x2c\x5a\x89\x07\xbb\x08\x06\x34\x8f\xb9\x11\xde\x77\xde\x40\x67\xb6\x01\x27\xa7\x1b\x52\x2c\x62\x16\xfb\x96\xdd\x21\xd5\x66\xae\x87\xe4\x8c\x64\x2c\xe2\x29\xb7\xd5\xbb\x29\xfe\x8e\x3b\xcc\xa3\xec\x73\xad\x58\x32\xb1\x68\xe7\x22\x2c\x0a\x53\x88\xe0\x96\xc2\xd5\x7e\x06\x79\x8e\x74\x20\xd9\xae\x42\x4e\xc6\xfe\xe6\x98\x95\xed\xcd\x6d\xd8\x42\x68\x14\x81\xa1\x94\x6a\xd1\xc0\xc7\x52\x6e\x33\x90\x1f\xfa\x60\xb3\x4f\x29\xcf\x60\xf3\x8e\x58\x24\x45\x93\x8a\x98\x6b\x16\xe8\xb2\xda\x92\x5b\x29\x6b\xd1\xc4\x02\xf8\xbe\xee\xe5\x82\x26\x3c\xe6\x7a\xe9\x7d\x6d\xb6\xca\x12\xc5\x13\xe3\x97\x51\x15\xd3\x48\x68\x9a\x66\x92\x46\x33\xa6\x82\x7e\xa3\xc8\x61\x13\xb1\x7c\xd4\x39\x56\x02\x03\xa9\x03\xde\x31\xac\x2f\x59\x92\x4c\x6a\xe7\x2e\x5f\xf3\xc1\xdb\xa0\x31\x78\x1d\xf9\x97\xce\x96\xe0\x53\x97\x61\x13\xd8\x2b\x3e\x09\xff\x50\x44\x26\xb1\xc3\xf7\xf8\xb7\x17\x46\xcc\x8b\xec\x1e\x34\x54\x0e\x10\x20\xb4\x24\x89\x61\xc5\x86\xf2\xad\x7f\xf9\xab\xaf\xc9\x4c\xe6\x99\x1a\x86\x49\x42\x2f\xe1\x37\x54\xd1\x9c\x98\xa8\x49\xc2\xa8\xd2\xe4\xe5\x0b\x32\xe7\x22\x37\x1c\xa8\xf5\xb6\x69\x2f\xd9\x04\x32\xcd\x37\x5f\x37\x7e\xaf\xad\x34\xb3\xea\x91\xb4\xbb\x2a\x45\x24\x5e\x2b\xd4\xd8\x93\x84\xc9\x65\x88\x63\x5d\x11\x71\x2c\xd1\x0d\x67\x5b\x68\xf9\x00\xe7\xeb\xd7\x5c\x8e\x97\xba\x4d\x22\xe2\xff\xc5\x37\xca\x19\x88\xee\xc7\x26\xe8\x22\x05\xb8\xc8\xc6\x8f\x3e\x48\xad\x84\x29\x57\x7a\x4b\xa5\x84\x22\x47\x71\xe3\x63\xcd\xd9\xca\xd4\xc8\xfb\x2d\xd3\x52\x40\x47\x70\xb2\xae\x33\x0f\x45\x11\xc3\x9a\x86\x17\x45\xa5\x1d\x21\xb1\xfd\xad\xcd\x3f\x31\xd8\x96\xdb\x20\x07\xc0\xe8\x6e\x38\xd4\x66\xd2\x95\xdb\x12\xad\xc7\x8a\xaf\x95\x4f\x81\xe2\x62\x8a\x90\xda\xf3\x3c\xd1\x3c\x4d\x8a\x71\xfb\x17\x2c\x21\x0f\xcd\x66\x34\xb0\xf4\x50\x4c\xce\x45\x28\x26\x30\x31\x1e\xfb\xb6\x98\xd0\x88\x0c\x9d\x19\x7e\x90\xd2\x8c\xfa\xc9\x83\xba\xa9\xea\xc4\x5a\xe0\x28\xf8\x01\x91\xf2\x18\x72\x9e\xd1\xc4\x0f\x34\xf4\xfd\x1c\x72\xd3\x68\x26\xa8\x68\x60\x60\x2e\xab\x7a\xf0\x12\x91\xf7\x3e\x04\x0c\x2b\x6c\x54\x76\x8b\x15\x6a\xbe\xa5\xd1\x1d\x13\x31\x96\x1f\x82\x61\xc7\x4b\x41\xe7\x16\x8a\x2a\xa8\xa9\x5c\x79\x5f\xf5\xad\xa9\x01\x33\xe5\x5c\xaa\x2e\x72\xdd\x43\xce\x41\xae\x5a\x63\xbd\x7c\x50\x58\xcb\x78\xd3\x39\x57\x68\x84\xc9\xf8\x22\x62\x8e\xff\x9b\x4f\x1d\xb2\xeb\x8b\x06\xf9\xe8\x2b\x9d\xb7\xa1\x8a\x3c\xd8\xbf\x40\xee\xbd\xf1\x1b\x50\xa7\x68\x62\x8e\xf6\xd2\xa7\x67\x56\x16\x77\xbc\x3c\x6c\x41\x95\x6c\xdc\x26\x8d\xf6\xe8\xe6\xdb\x8b\xf2\x21\xbe\xa1\xb1\x54\xe4\xdb\x44\x46\x77\xe4\x82\x81\xd0\xf5\x90\x05\x41\xb2\x71\xfc\x94\x80\xd1\x73\x3a\xdd\xe6\x1d\x1b\x90\xb9\x14\x5c\xcb\x6c\x33\xbd\xe8\xea\x13\x3e\x09\x1c\x71\x36\x8e\x9f\x35\x18\xb1\xd9\x60\xbb\x54\x23\xcc\xe0\x18\xc2\xeb\x0e\xcb\x6f\xc7\x43\xf5\x87\x99\xbc\x1f\x68\x39\xc8\x15\x1b\xf0\x06\xfe\xd6\x16\xa3\xbb\x63\x4b\x70\x32\xb7\x1c\xdf\xf7\xf8\x5a\x49\x39\xd0\x12\x6c\x4a\xf0\xbb\x61\xd1\x37\xdf\x5e\x18\xde\x30\x0c\x85\xbd\x53\xa6\xa3\xd3\x88\xa5\xb3\x53\xfb\xe1\x67\x39\x29\x8e\x5a\xb4\x9d\x95\x33\x12\xc9\x24\xb1\xf9\xce\x72\x42\xce\x59\x3a\xf3\x8d\x3d\xf6\x48\x9f\x0e\xea\x36\x95\xb2\x2d\xe4\x67\x70\x60\xcc\xdb\xf6\xbc\x04\x1b\x27\x1b\xb7\xab\x63\xf0\x58\x5b\xe5\x59\x57\x62\x7c\xc0\xc9\x79\xe0\xaa\xfa\xa5\x5a\xfa\x61\xe8\x65\x19\x0e\xd8\xc5\x70\x94\xc8\xcd\xd5\x04\x25\xe9\x98\xc5\x44\x2e\x58\x96\xf1\x98\x29\xe2\xe9\x4d\xa8\x7a\xf2\xe4\xb1\xe7\xad\x43\x26\x7e\x72\x64\xe2\x1d\x74\x9c\x80\x3c\x99\xb7\x57\xc9\x13\x8d\xe7\x5c\x3c\x3b\x02\xa5\x22\x9a\xb0\xab\xf7\x2d\x94\x89\x11\xbe\x51\xd6\x27\xdc\x8f\x01\xa0\xd8\x16\x98\xae\xef\xfd\x7e\x21\x42\xc6\xdb\xec\xa3\x0f\xa0\x15\x4c\xa9\x66\xf7\x5b\xd9\xdf\xa0\x20\x50\xdb\x9f\x04\xb9\xf3\x29\xf5\x87\x27\x82\xc6\x0b\x76\x39\xe2\x7e\x1d\x92\x7d\xda\x75\x6a\x6b\x74\x71\x03\xa9\x20\xc9\xba\x8d\x7a\x76\x7d\x45\xbe\xc3\x96\x0f\x8b\xd4\x97\x49\x8d\xd2\xdd\x85\x9c\x53\xde\xba\xd0\xc6\xac\x5c\x98\xda\x75\xf7\xda\x37\x4b\xb0\xdd\xb0\x46\xc8\x84\x4f\x73\xa3\x81\x59\xad\xa9\x03\x51\x7b\x14\x01\xa4\x90\x3f\x02\x4b\x90\x8b\x38\x2c\x64\x0e\xb7\x82\xc0\x14\xbc\x6b\x92\x28\x26\x14\x07\x3f\x49\xe0\xac\xb6\xe5\xde\xb0\xbe\x20\x86\x17\xa2\x90\xd2\x27\x6f\xe4\x94\x0b\x77\x2a\xa5\x75\xa3\x4d\x28\x4f\x9a\x4e\x46\x27\x55\x3c\xb9\x54\xa1\x54\x72\x29\xe8\x38\x69\x12\x05\x50\x26\xeb\x09\x05\x3f\x27\x83\xb7\x4f\x63\xae\xcc\xff\xc9\x68\xf4\x06\x6c\xe2\xb9\x70\xb2\x2e\xd8\x8b\x2d\x59\xf3\x91\xfe\x78\x00\x0f\x7b\x66\x90\xd2\xec\x80\x71\x77\x25\x62\xd3\x59\xa6\x4a\x61\x27\xb6\x3d\x44\xfa\xf3\x91\xb3\xe8\xb9\x1f\x33\x72\x3b\xe3\xd1\xdd\x75\x60\xfa\x96\x99\xf9\x4d\x04\x3f\x95\x98\x50\xf5\xde\x21\x09\xa2\xed\xea\x75\x7b\x05\xf6\x36\xa0\xe7\x23\x3b\x60\xd3\x0c\xa1\x4a\xc9\x88\x17\x7e\x0e\x30\x97\x14\x04\x3f\x06\x82\x7f\xd8\x41\x00\x4f\xdf\x93\x37\xb9\x45\x73\x55\x4f\x55\xc8\x8b\xb8\x70\x63\x3d\x68\xc7\x71\x6b\xec\x80\xd2\x7d\x5b\xc2\xe5\x76\xb2\x69\xc5\x68\xef\xa2\xb8\xed\x22\x39\x29\xc9\x55\x59\x5c\x59\x26\x8f\xcf\x6d\x71\xf9\x0e\x36\xd4\x26\x89\x0c\x75\xda\x70\xc5\x53\x87\xbf\x59\x33\x3e\x1c\xa6\x54\xa6\x79\x82\xb1\x12\xfb\x83\x8b\x3b\xeb\x2c\x7e\xe7\x40\x66\xfd\xc7\x00\xda\x6c\x1b\x08\xfc\xdb\xc0\xdc\x0c\x44\xb2\x17\xdf\x7c\xfd\xf5\xe7\x8e\xc2\xd9\x54\x05\x7e\x08\x18\xce\x86\x26\xd1\x2e\xd3\xa6\xcb\xb4\x09\xb7\xe2\x43\xc2\xa8\x1e\x38\x97\xa6\x65\x88\x6b\xbb\xf0\xd6\xe6\xd9\x32\x8d\x83\x60\xdb\x06\xc0\xb6\xc8\x87\x39\x50\x16\x4c\xeb\x58\xd0\x36\x19\x2f\x5d\x9e\xcb\x6f\x2d\xcf\x65\x97\x18\xd0\xf6\x39\x2d\x6d\x62\x3f\x7f\x4b\xf9\x2b\x2d\x0e\x63\xf3\x3c\x8b\xf6\xd9\x15\xed\xf1\xec\xda\x5b\xb6\x76\x29\x69\x14\xda\x67\xac\x16\x51\x54\x10\x74\x85\x07\x11\x1f\x4b\x4b\x73\xb0\x1e\x45\x87\x20\x2d\x14\x28\x6c\x5e\xb6\xa9\x25\x68\x75\xf2\xf7\xa3\x8a\x6b\xc3\xff\xfc\x34\x1e\x8d\xdf\xa6\xcb\xa0\x2b\x0c\xf2\xbc\x6d\xda\xaa\x84\x2d\xe2\x2c\x09\x70\xd6\x81\x11\xcb\x71\x88\x69\x58\x9c\x91\xb3\xeb\x2b\xa3\x2e\x43\xfa\x0c\x4d\xd4\x90\xd4\xf0\x69\x67\x97\xb4\x7c\xdd\xf1\x67\xaa\x35\x9b\xa7\xba\xf9\x62\x77\x26\xed\x27\x37\x69\xef\x6c\x8f\xfb\xe8\x5f\xf4\x15\x20\xf3\x39\x15\x03\x73\xa2\xc0\xb8\x5d\xf2\x82\x55\x48\xf0\x90\xb8\xa8\x5c\x9c\x0b\x9a\x31\x04\x7d\x2a\x57\xbc\xa5\x41\xfd\xc3\x87\x31\x42\x42\xdb\x3b\x8f\x1c\x19\x68\xe5\xa4\x45\x72\x25\xec\xd3\x0e\xc7\xcf\x82\x3b\x54\x01\x17\x2e\xe9\xcd\x7a\xc6\x90\x59\x5f\x43\x22\x4a\xf1\x54\x59\x12\x46\x51\x98\x26\x89\xbc\xc7\x6f\x87\x0c\xcc\xcc\xbe\xe9\x8b\xcd\xb0\x1a\x33\x32\xe7\x46\xa9\xb6\xc6\xcf\xb0\x3b\xe8\x8a\x34\x12\x35\xcb\x50\x60\xcd\xac\x37\x6b\xc4\x74\xb8\xd0\x46\x21\x15\x18\x08\x6d\xfe\xed\x02\x6f\x10\x15\xd7\xd2\x84\x31\x9b\xd1\x05\x97\x79\x86\x6f\x6b\x49\x7a\xf6\x16\xb0\x84\xa5\xcc\xbd\x69\x0a\xab\x24\xfa\xd1\xa9\x9a\x79\x7a\x57\xdc\x04\x51\x3e\x96\xce\x96\x30\x60\x9f\xb8\xd2\xab\x63\x71\x53\xe4\x40\xdb\x0e\xb5\x6f\x16\x2a\x35\x6c\xa1\x75\x45\xb4\x8f\xe1\x7b\x65\xc1\x64\x31\x82\x5b\x9f\x51\x3d\xb4\xad\x58\xa4\x9d\xac\x73\x68\x59\xc7\xbb\xab\x12\x1e\x2d\x5b\x57\x0a\x2b\xdc\x54\xe6\x75\xf2\x2d\x55\x2c\x26\x6f\xa9\xa0\x53\x54\xcb\x8e\x47\xd7\xdf\xbe\x3d\x31\xcb\x06\x6a\xdf\xd5\x45\xad\x2f\x6b\x14\xf6\xe1\xdd\x21\xd3\x20\x56\x46\xb8\x03\x27\x6a\x39\xc6\x83\xa6\x71\x10\xcf\x4d\x9a\x01\xc4\xae\xa6\x5e\x56\x6b\x3c\x56\x88\xc2\x62\x1e\xef\x59\xd5\x91\x0b\xa5\x69\x92\x5c\x27\x54\x9c\xa5\x69\x26\x17\xf5\x9a\x70\x39\x31\xdc\x3e\xe8\x58\x3b\xc6\x3e\xb8\x1f\x53\x9c\x68\xf0\xf5\x0a\x72\x55\xb4\x3f\x24\x57\xda\x2b\xc4\x52\x00\x1b\xec\x9d\xe5\x5a\xce\xa9\xe6\x51\xcf\xe8\xcd\xbd\xb7\x54\xe4\x34\xa9\x8d\x30\xda\x38\x8c\x75\x62\xdd\xc6\x97\xd6\x83\xa3\x35\x78\x6d\xa3\x7c\xb0\xf9\x7d\x4d\x33\x43\x5b\xce\x47\x1f\x5b\xbd\xab\x34\xd5\xf9\x0a\xe5\xdc\x40\xcd\xd7\xd3\xef\x01\x49\xa8\xd2\x1f\xd2\xd8\x9c\xe4\xca\xdd\x4d\x44\x3a\xa2\x9a\x26\x72\xfa\x57\x46\x93\xfa\xfd\x5c\xda\x27\xe7\xe1\xd3\xce\xf8\x83\x5b\x66\x94\x8f\xfd\x83\x47\x8a\x18\xa1\xd8\xe5\x6b\x67\x2c\x61\x0b\x2a\xb4\x7b\x1d\x2b\x65\xab\x23\x3b\x7e\xd8\x45\xbc\x30\x78\xc6\x4c\xb3\x6c\xce\x45\xb9\xcd\x11\x3c\x7b\x2e\x45\xcc\xd1\xd4\x07\xc6\x2c\x7c\xa3\xdc\xee\xfa\xad\xb6\xce\x9c\xbf\xc1\x80\x5f\xa6\x3c\x41\x7f\xca\x53\x81\x8f\x8d\xad\x4c\x38\xc3\x1f\xc1\x73\x5d\xea\xdb\xca\x4c\x91\x3b\x61\x84\x39\xc0\xbc\xa8\x27\x52\x5b\x79\xfb\x36\x9e\x3e\x70\x6b\x8c\x5d\x58\x1f\x17\x39\xb0\xfd\x5e\x67\xe8\xdf\xb4\xc5\xf0\xda\x2e\x0d\x54\xbb\xb2\x9e\x82\xd6\xed\x3b\xff\x1a\x26\xf7\x55\xaa\xab\x97\x1e\x5a\x4f\xf1\x1b\x09\x4b\xcd\xe4\x9a\xa6\xb8\xe9\x65\x5a\x5b\xa0\x7c\xaf\xa8\x9f\x0d\xa4\xbc\xad\x2c\xaa\x21\x7c\x79\x59\x19\xbe\xb2\x41\x71\x99\x55\x1f\x28\x49\x39\x43\xa0\x0e\x2a\xec\x64\x01\x67\x61\x34\xb6\x3f\x1a\x0e\x66\xd4\x38\xb8\xd7\xb7\xbe\x66\x34\xec\xda\xd8\x05\x67\x1c\xa6\x08\x54\x01\xce\x82\xd3\xef\xa4\x75\x94\xda\x84\x52\x43\x03\x80\x6f\xf7\x89\xca\xa3\x19\xa1\xca\x74\xcd\x6c\x68\x73\xe2\xd9\x70\x4e\x05\x9f\x30\xa5\x87\x1e\x87\x56\xfd\xf8\xd5\xcf\x43\xf2\x5a\x66\xc4\xc6\x61\xf7\x1d\x02\x84\xed\x67\xb1\x2f\xb8\xc2\xc1\xf8\x77\x0b\x4d\x33\x95\xb1\xed\xf4\x3d\x74\x56\xd3\x3b\xc3\xc3\xb0\xb3\x39\x03\x77\xc1\x2b\xd2\x33\x42\x5e\xf0\xe9\x7f\x18\xb6\xf4\xcf\x1e\x39\xbe\x07\xa6\xdd\x33\x7f\xf6\xf0\x83\x3e\x96\x30\x54\x84\x8b\x0f\x63\x9a\x5f\xc6\xa7\x53\x96\xa1\xca\x47\x20\x1d\xee\xc4\x22\x58\x08\x19\x3c\xec\x3c\xbf\x85\x8a\x58\xed\xc8\x8f\x5f\xfd\xdc\x23\xc7\xe5\x71\x11\x2e\x62\xf6\x89\x7c\x85\xa6\x5f\xae\xcc\x18\x4f\xac\x03\x45\x2d\x85\xa6\x9f\x4c\x9b\xd1\x4c\x2a\x26\x50\xfd\xd6\x92\xcc\xe8\x82\x11\x25\x8d\xd6\xca\x92\x64\x60\xcd\xda\xe4\x9e\x02\xaa\x88\x9b\x4a\x48\x02\x27\x29\xcd\x74\x69\x4b\x0c\xad\x55\x03\xbe\x66\x96\x6d\x2a\x9c\xfb\x77\xc2\x85\xf5\x19\x59\x6f\x95\x59\x73\x48\x69\xc4\x45\xd2\x92\x44\x33\x2a\xa6\x3e\x8f\x7a\x92\xeb\x3c\x63\x5b\xdc\x2d\x0d\xcf\xc0\x1d\x17\xad\xd2\x6d\xbf\xe7\xa2\xea\xb9\xaf\xb7\x05\x4d\xb9\x76\x41\xff\x36\x90\x4f\x2f\x4f\xcd\x2a\x64\x7c\x9c\x6b\x99\xa9\xd3\x98\x2d\x58\x72\xaa\xf8\x74\x40\xb3\x68\xc6\x35\x8b\xcc\xb0\x4e\x69\xca\x07\x91\x14\x66\xc5\x01\x41\x60\x1e\xff\x01\x8a\x60\x0e\x4c\x57\xb7\xe0\x1a\x37\x1c\xf4\x76\x43\xd8\x93\x1a\xc0\x0e\x36\xc6\x06\x36\x9c\xd5\x81\xa2\x3d\xe5\x11\x46\x0b\xc6\x8b\xd3\x83\x0c\xd6\xc1\xf2\xb6\xe7\x31\x47\x16\x69\x3a\xaa\xb6\x61\x8e\x1d\x46\x69\xc0\xa9\x2c\x51\xca\x39\x8d\x91\x94\x52\xb1\x7c\xf0\xcd\x6f\xa6\x14\x00\xd9\xa3\xe5\x20\xc2\xfa\xf6\x03\x2a\x62\xf3\x6f\xcc\x47\x89\x96\x07\x99\xc3\x9c\xb7\x22\x04\x1f\xae\x2e\x1e\xe7\x48\xe4\xfc\x00\xa7\xde\xca\x6b\x0d\x85\x28\x14\x55\x21\x64\x47\x67\x39\x73\x4c\xb3\x2c\xa0\x72\xe5\x5a\xfd\xdf\xd6\x67\xe2\x91\xb9\xb6\x89\x54\x9b\x3d\x1d\x81\xec\xd8\xb0\xbf\x6f\x8a\x37\xaa\x35\xf1\x4d\x63\x16\x06\xca\x65\xcf\x97\x86\xe1\x14\x14\x60\x30\xeb\x7d\xb4\x8d\xf6\x90\xf3\xd1\x9b\x8e\x0c\x6a\xf1\x81\x22\xaf\x94\x6c\x57\xa0\x0a\xfd\xa5\x54\x69\x0b\x07\xa5\x99\xd2\x84\x2e\x28\x4f\xc0\xa2\x2e\xc7\x8a\x65\x0b\x2c\x79\x64\x61\xf1\x68\x55\xcf\xb2\x55\x0d\x50\x8c\x7a\x24\xcd\xc7\x8d\x61\x75\x55\x36\x0d\x00\xb4\xa1\x4a\xef\xd7\xf6\xfa\x20\x7a\x0f\xaa\x97\x6b\x6f\x9b\x2f\xec\xa8\xc6\x98\xfd\xf7\x57\x46\x33\x3d\x66\x54\xdf\xf2\x4d\x7c\x77\x65\x4b\x97\xde\x73\x06\x97\x62\x43\xdf\x33\x32\x95\xda\x88\x58\x39\xec\x7d\x94\x49\x11\x80\xc6\x6f\xb4\x87\xde\xd1\xc5\x28\x6f\x33\x0a\x79\x2f\x52\xb4\x1c\x66\xf9\xc5\xd5\x71\x5a\xe9\xd8\xee\x24\x8d\x4f\x23\x04\x84\x14\xcc\xae\x1d\x7a\x20\x80\x02\x3d\xce\x90\xe7\x4c\xa9\x8d\xd0\x10\xe5\x10\x3e\x7c\x1a\x8f\x72\xc5\x1d\x36\x77\xf7\x30\x7f\xc2\x08\xd0\x31\xd3\x94\x27\xee\x28\xe3\x54\xf8\x59\xda\x46\x5d\x37\x0e\x30\x63\x54\x6d\x12\x10\xaa\x88\x58\x4a\x0a\xec\xb4\x14\x6c\x70\x2f\xb3\x98\x9c\xd3\x39\x4b\xce\xa9\x62\xb6\xad\x30\x5d\x0d\xd7\xe8\x48\x1d\xb4\xcb\xf5\xb6\xaf\x35\x5d\x46\xe3\x8f\xdb\x44\x76\x6f\x14\x2a\x16\x76\xb0\xef\x4c\x90\xb7\x59\xce\xfa\xe4\xb5\xe1\x5e\x7d\xf2\x41\xdc\x09\x79\xbf\x5f\x5f\xf5\x46\xcf\x45\x39\xcc\xca\x22\xb7\x00\x44\x9e\x05\x84\x29\x19\x7c\x7c\x77\x77\xec\x91\x25\xf8\x6b\x4c\x8d\x65\x66\xe3\x1f\x75\x3d\x32\xff\x5c\x31\x41\x19\x45\x31\x93\xd3\x8c\x29\xc4\x5c\xa9\x05\xf4\x6b\x6a\x72\xfe\x8e\x09\x9b\xf1\xb6\xb5\x7b\x57\x75\x6f\xb9\x9e\x3a\xbe\x36\x2d\xee\xd8\xf5\xb6\x1f\x4b\x93\x5a\x51\x63\x73\x14\x5e\xd0\xd1\x35\xc6\xa7\x75\x3d\xac\x37\x3a\x05\x5c\x2f\x78\x16\x85\x92\x4d\xd6\x51\x37\xba\xf3\xd1\xc7\xf5\x93\xbd\x96\xf7\x6d\xe3\x4f\xdb\xcd\x52\xfb\x1a\xa4\xb6\x9e\x99\xad\x46\xa8\xce\xfc\xd4\x99\x9f\x3e\x27\xf3\xd3\xd6\x1d\xbf\xc9\xe4\xf4\x79\x18\x9b\xb6\x0e\x71\x93\x81\xe9\x59\x9a\x96\x1a\x8d\x68\xa3\x39\xe9\xd9\x1a\x92\xb6\x0e\xad\xa1\xf1\xe8\xf7\x63\x36\xda\x3a\x63\x1b\x4c\x45\xcf\xd0\x48\xd4\x44\x20\x63\x71\x13\x31\xf1\x2a\x78\x38\x14\x14\x8b\x82\x89\xbe\x39\x17\x52\x13\x8a\x33\xbb\x4a\x8b\x46\x80\xdb\xda\xb7\x23\xdb\xb9\xe6\xb2\x97\x15\x18\x6d\x39\xc1\x95\xce\x92\x8b\xcb\xeb\x9b\xcb\xf3\xb3\xdb\xcb\x8b\xaa\x7c\x57\x37\xd3\x5b\x24\xb1\xcd\x36\x88\x41\x20\x89\xad\x79\xc0\x10\xe4\x35\xb7\xcc\x1e\x58\x73\x2b\xcf\x79\xdd\x5b\xfb\xcb\x85\x7b\x71\xb9\xbd\xf8\xc7\xf6\xd3\xd9\xf4\x78\x9a\xd3\x09\xbb\x05\x23\xc6\x8c\xdc\x33\x93\x49\xac\x5c\xac\xe9\xd5\x85\xcf\x5e\xe2\x22\x4a\xf2\xd8\x08\x17\x1f\x3e\x5c\x5d\xa8\x21\x21\xdf\xb2\x88\xe6\x0a\xac\x30\xb1\x14\x47\x9a\xbc\x7f\xf7\xe6\xbf\x20\x86\x1a\x9e\xe8\x7b\xb0\x0f\x40\x90\xe5\x14\x41\x70\x35\xa2\x90\x91\x6f\x19\x0a\x2a\xf0\xe5\x88\xa6\x86\x8a\x29\xac\xb2\xa0\x41\x16\x99\xb1\x24\x35\x14\xf3\x8e\x91\x02\xfb\xd3\x34\x5c\xd4\x30\x77\x21\x8f\x53\xa6\x31\xd3\x69\x53\x54\xe3\xc6\x59\xdb\x62\x71\xdd\xc3\xd6\x5a\x52\x1f\xad\x36\x7e\x4f\x95\xb5\x58\xd5\xf6\x76\xcb\xfa\x6e\xb7\xcf\xac\x37\x71\xac\x31\x6e\x20\x79\x86\xbf\x56\xfa\x6c\x3a\x5b\xd8\x31\x30\x88\x84\xeb\xc6\xd6\xd4\xf5\x61\x40\xf5\x98\xf5\x2b\xb6\x0c\x56\x9d\xe4\xd2\x87\x7d\x14\x75\xd0\xe5\x66\x7d\x81\x82\x17\x71\xa9\xba\xa4\x8d\xb6\x2b\xff\x96\x8f\x7d\x7d\xd1\xa2\xbf\xd6\x22\x43\xfe\xf1\xcf\x2f\xbe\xf8\xff\x03\x00\x00\xff\xff\x1d\x2f\x2f\x16\x4f\x7b\x0a\x00") -func olmManifests0191CrdsYamlBytes() ([]byte, error) { +func olmManifests0200CrdsYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0191CrdsYaml, - "olm-manifests/0.19.1-crds.yaml", + _olmManifests0200CrdsYaml, + "olm-manifests/0.20.0-crds.yaml", ) } -func olmManifests0191CrdsYaml() (*asset, error) { - bytes, err := olmManifests0191CrdsYamlBytes() +func olmManifests0200CrdsYaml() (*asset, error) { + bytes, err := olmManifests0200CrdsYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.19.1-crds.yaml", size: 668438, mode: os.FileMode(420), modTime: time.Unix(1655230540, 0)} + info := bindataFileInfo{name: "olm-manifests/0.20.0-crds.yaml", size: 686927, mode: os.FileMode(420), modTime: time.Unix(1661216762, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0191OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xeb\x6f\x1b\xb9\x11\xff\xae\xbf\x62\x20\x14\x70\x5b\xdc\xea\xe1\xf8\x91\x2c\x70\xc0\xb9\xbe\xdc\xe5\xd0\xd8\x11\x2c\xa7\x5f\x8a\xa2\xe0\x72\x47\x2b\xd6\x7c\xec\x91\x5c\x29\xba\xa2\xff\x7b\xc1\xe5\xbe\x45\xc9\x8e\xe3\x34\xfd\x70\xfc\x22\x89\x9c\xe1\x0c\x87\xb3\xf3\xf8\xad\xa2\x28\x1a\x91\x9c\xfd\x0d\xb5\x61\x4a\xc6\xb0\x99\x8f\x1e\x98\x4c\x63\xb8\x25\x02\x4d\x4e\x28\x8e\x04\x5a\x92\x12\x4b\xe2\x11\x80\x24\x02\x63\x50\x5c\x8c\x9e\xc7\x98\xa3\x26\x56\x69\x53\xb2\x7b\xfa\x25\xea\x0d\xa3\x78\x45\xa9\x2a\xa4\x1d\xee\x19\x14\x1e\xd5\xfb\x44\xc6\x33\x93\x8a\xd9\xd3\x94\xd2\xc3\x5a\xea\x84\xd0\x09\x29\xec\x5a\x69\xf6\x1b\xb1\x4c\xc9\xc9\xc3\x6b\x33\x61\x6a\xda\xe8\x7f\xcd\x0b\x63\x51\xdf\x29\x1e\x3a\x81\xd9\x19\x8b\x22\xa6\x4a\x5a\xad\x38\x47\x1d\x37\xba\x70\xb6\x42\xba\xa3\x1c\x23\x41\x24\xc9\x50\x8f\x74\xc1\xd1\xc4\xa3\x08\x48\xce\x7e\xd6\xaa\xc8\x4d\x0c\x7f\x1f\xff\x79\xfc\x8f\x11\x80\x46\xa3\x0a\x4d\xb1\x33\xb5\x41\x9d\x34\x3f\x23\x90\x4a\xde\x55\x44\x1f\xef\xde\x1f\xa4\xfb\xa2\x13\xfe\x85\xc9\x94\xc9\xec\x31\x33\x27\x9e\x2c\x72\x26\xd5\x8a\xe3\x1d\xae\x1c\x65\x7d\xac\x23\x52\x47\x00\xfb\x66\x7d\x96\x31\x4d\x91\xfc\x0b\xa9\x2d\xed\x19\xf4\x9c\x17\x71\x10\x92\xe7\xa6\xb5\xd4\x8f\x98\x73\xb5\x13\x28\xed\x23\x16\xda\xdf\x18\x80\x93\x04\xb9\x71\xf4\xce\x52\xf9\x80\xc1\xe4\x48\xdd\x9a\xb1\x9a\x58\xcc\x76\x9e\xce\xee\x72\x8c\xe1\x4e\x71\xce\x64\xf6\x31\x4f\x89\xc5\xd2\x57\x72\xce\x28\x31\x31\xcc\x1d\x07\x72\xa4\x56\x69\xcf\x21\x88\xa5\xeb\xf7\x1d\x51\x21\x61\x00\x16\x45\xce\x89\xc5\x8a\xa9\x73\x18\x37\x78\x8f\x3f\xbc\x03\x40\xad\x72\xf9\xbd\x67\xfb\xdb\x27\x18\xde\x0d\x77\xd3\x84\x49\xd4\x1d\x59\x51\xd8\x9c\xf5\xa0\x4a\x08\x22\xd3\xb8\x33\x15\xc1\x34\x61\x72\xea\xad\xdc\xa8\xac\x33\xd3\x27\x8a\xa2\xe6\x4a\x7a\xf3\x7f\xf8\xe3\x87\xc5\xdb\xbb\xab\xfb\x0f\x77\xff\xbc\xbd\xba\x79\xbb\x5c\x5c\x5d\xbf\xfd\xd3\x80\x73\xab\x99\xc5\xa5\x25\xb6\x30\xee\x6c\xbd\xd5\xf1\xb8\xf3\x93\x09\x92\x61\x0c\xbf\x16\x64\xe7\x9e\xb1\xe6\xf8\x2b\x4d\x04\x6e\x95\x7e\x70\x6a\xfe\x60\xd6\xe4\xf4\xfc\x22\xbe\x4c\x57\x67\x38\x5f\xcd\x2f\x92\x55\x3a\x9f\x5d\x12\x4a\x2f\x2f\x12\x3a\xc7\x57\xe4\xfc\xcd\x7c\x76\x7a\x7a\x96\xbc\x99\x25\xaf\xe6\x97\x84\x92\x8b\x37\x97\xc9\xc5\xf9\xd9\x9c\xbe\xc2\xf3\x73\x7a\x7a\x99\xd0\x53\xc4\xa1\xdc\x45\xc1\xf9\x42\x71\x46\x77\x31\xfc\xb2\xba\x55\x76\xa1\xd1\x60\x63\x6d\x37\x72\xa5\x6d\xcf\x2e\xee\x04\xcd\x35\x2c\x94\xb6\x31\xbc\x9e\xbd\x9e\xf5\x28\x6a\x0f\x17\x68\x35\xa3\xa6\xb3\xc6\xd9\x06\x25\x1a\xb3\xd0\x2a\xc1\xfe\xb6\x6b\x6b\xf3\x9f\xd1\xc6\x83\x9d\x72\x62\xd7\x31\x4c\xd7\x48\xb8\x5d\xff\x36\x5c\x3c\x24\xdf\xd0\x35\x3a\x0d\xde\xdd\xdf\x2f\x3a\x4b\x1a\x49\xca\xbe\xa1\x7c\x8b\x5a\x30\x59\xc6\xb7\x1b\x34\xc6\x5d\x41\x65\xfe\x9f\x08\xe7\x09\xa1\x0f\xf7\xea\xbd\xca\xcc\x07\xf9\x56\xeb\x9e\x1b\xa3\xdc\xf4\xbd\xd3\x5b\x78\xdf\x13\x7b\x8a\x6c\x08\x2f\xf0\x27\xad\xc4\xf0\x54\x2b\x86\x3c\xad\xa2\x70\x60\x65\x51\x1e\xba\x7e\xca\x27\xe1\xe7\x20\xa0\xc1\xbe\xf0\x83\xcf\x65\x9b\xbf\x7a\x4c\x1a\x7f\x2d\xd0\x0c\x5d\x0e\x80\xe6\x45\x0c\xf3\x99\x18\x4c\x0b\x14\x4a\xef\x62\x98\x5f\xcc\x6e\x58\xb5\x26\x55\x8a\xcb\x5e\x8c\x73\xe3\xa1\x48\x50\x4b\xb4\x58\xe6\x32\x65\x62\xe0\x4c\x16\x9f\xbe\x24\x80\x53\x62\x09\x57\xd9\xe7\x05\xf1\x3d\xa6\xaf\x1d\xc8\x03\x5a\x3e\x23\x98\x07\x76\xf9\xda\x01\x3d\x28\xb2\x66\x3b\x14\xd4\x2b\xa6\xa3\x81\xfd\xa4\x0d\xec\x27\xbd\x85\x7e\x46\x88\x20\xa2\x4a\xae\x58\x26\x48\xee\x4a\x05\xd4\xbf\xb8\xa0\xf9\xfd\x91\x58\xdd\xd0\xb7\xc7\xd6\x98\x31\x63\xf5\x2e\x76\x06\x37\xb6\xbf\x7f\x61\x19\x8f\xca\x50\xdc\x9b\xff\x46\xe9\xe0\xf7\x34\xf4\x7b\x1a\x7a\x24\x0d\xbd\x6c\xd4\x7e\xfd\x25\x41\x7b\xbf\x2d\x78\x72\x1b\xb3\x1f\xca\x49\x96\x69\xcc\x88\x45\xd7\xa2\x44\x98\x32\x3b\x88\xdd\x87\xf7\x6b\x59\xad\x8a\x48\x2a\x98\x8c\x61\x6c\x75\x81\xe3\xcf\x61\x74\x22\x1b\xbe\x70\xdf\xd7\x34\xbf\x13\xaa\x34\x2a\xf7\x21\xf6\x5b\x41\x53\x24\x86\x6a\x96\x3b\x49\xa6\xdf\xee\x51\x8d\xc4\xe2\xf8\x3b\x18\x17\x65\x42\x71\xdf\x72\x97\x35\xdc\x97\x14\x39\x5a\x2c\x1b\xc7\x67\x48\xa5\xfe\x1a\xaa\x18\xbf\xf1\xb7\x60\xdc\xbe\x55\x40\xae\x68\xdd\x0c\x93\xc6\x12\xce\x73\x4e\x3c\xc5\x11\x8d\x5b\xa5\xbe\xee\x85\x6f\x18\x6e\xbf\xe5\x85\x7f\x06\x9f\x53\xf5\x45\x1c\xe5\xe5\xae\xec\x3b\x68\x44\x66\xa5\x12\xfd\x4b\xcc\xd0\x3a\x12\xce\x4c\xf9\xb9\x2d\x3d\x6e\xcf\xcf\x72\x42\x1f\x48\x86\x66\xf2\x34\xed\x2b\x72\x41\x24\x5b\xb9\xc8\xe3\x7d\xb9\x3f\x37\x65\x54\xc9\xa7\xe9\x32\x28\x02\x43\x3a\xb4\x45\xe1\x87\x6a\xb5\x54\x3e\xe0\x5b\x19\x57\x09\xe1\x51\x0b\x56\xf5\xeb\xc2\x1e\x86\xf5\x72\x52\xbb\xc5\xd6\x50\x24\x17\x4d\x99\x69\x89\xce\xd0\x36\x20\x5b\xe5\xed\x51\x10\xcc\x38\xa0\x10\xe1\xf9\x9a\x0c\xc0\xa0\x0a\x4b\xa9\x58\x03\xea\xd5\xf7\x5b\x16\x52\x8f\x55\xca\x8a\x8b\xc9\xa6\x41\xf1\x66\x93\xf9\x9b\xc9\xbc\x39\x41\xca\x4c\xce\xc9\xce\x97\x98\x0b\xbf\x2d\x2c\xeb\x7d\x53\x6c\x3c\x33\x86\x3b\xcc\x7d\x29\x61\x80\xc8\xc6\x82\xb5\x2e\x60\xd7\xc4\x02\x33\x40\x36\x84\x71\x92\x70\x84\x95\x56\x02\x08\x64\xae\x3e\x80\x6b\xff\x1c\x2c\x4b\xaf\x83\xed\x9a\xd1\x35\x6c\x19\xe7\xa5\x27\xf2\x0d\x82\x55\x40\xc2\x06\x98\x8c\x00\x04\x93\x7f\x2d\x12\x6c\xac\x39\x9f\xcc\xe7\x13\x97\xa1\x1f\x70\xb7\x55\x3a\x75\x0e\x79\x32\xf4\xd9\x93\xef\xe0\x44\x71\xe1\x3e\x6a\x8b\x9d\x38\x0f\x16\x84\x75\x2b\xe5\xba\x46\xbe\xc3\x14\xde\x11\x5f\x29\xa1\x20\x8c\x97\x97\x26\xcd\x9a\xad\x6c\xeb\x0d\x3f\x68\x4c\xd7\xc4\xba\xeb\x1b\x01\xe4\x5a\x6d\x58\x8a\x55\x9a\x1d\xee\xc3\x99\x7c\xe8\x89\xd8\xb3\x30\x40\xa1\x79\x5c\x16\x2a\x26\x9e\x4e\x33\x66\xd7\x45\x52\xba\x46\xa8\x6c\x3c\x08\xc8\x4d\xad\x46\x9c\x0a\xe2\x8c\x37\xcd\x1f\xb2\x69\x75\xde\xa8\x71\x91\x2a\xea\xdc\xa8\x14\x2b\x8d\x7c\x57\xf4\x61\x2b\x6f\x7b\x1d\xa9\x29\x72\x57\x02\x61\x1a\x83\x8b\x8b\x1d\xd2\x25\x93\x19\xc7\xa7\x52\xdf\x14\xdc\xb2\xa7\x12\x5f\x71\xde\x3e\x45\x07\x68\xab\x13\x78\x4b\x37\x0d\x1e\xa4\x6d\x57\x09\x83\x36\xaa\x8a\xca\x0b\x57\xa1\x99\x32\x22\xd7\x2b\xd1\x33\x5b\x2c\x80\x2a\x4b\xd4\x3f\xbb\x81\x77\x50\x51\x1f\x40\x60\x1f\xa9\xfe\x22\xa8\xb0\x55\x42\x29\x1a\xa3\xd1\xe5\xa8\x6e\xb9\xed\xc3\xef\xb0\x7a\x2f\xab\x91\xc1\x64\x86\xf6\x31\x3d\x07\x00\x5a\x50\xa7\xb2\x37\xf0\x9d\xd8\x51\x3d\xfa\x02\xdd\x6f\x97\x19\x7a\x13\x65\x8a\x78\x82\x4e\xc1\xb4\xf5\x04\x3d\x7b\xb9\xf6\x7f\xa4\xeb\xf1\x5c\xfb\xb8\xd2\xc3\xa0\xf5\x6c\xb5\xdb\x07\xa1\xe3\xe6\xe1\x7c\xe1\x47\xf7\x51\x01\x18\x82\x26\xf5\x08\x83\x27\x9d\x63\x75\x57\x86\x3d\x8b\x20\x9f\x3e\xca\x26\x23\x78\xa4\x65\xb0\xbe\x2c\x74\x36\x58\x69\x91\x99\xd3\xae\x7a\x7b\x1d\x0d\x84\x91\x9a\x7a\x94\x58\x4b\xf8\xe8\x43\xd8\xa6\xd9\x6d\x00\xdf\xd4\x63\x08\xe3\x3c\x49\xc4\xbe\x85\xe1\xd9\xd8\x4e\x3d\xc2\xad\x5d\x3d\x0e\xb5\x78\x7d\xaa\x10\x4e\xe4\xc7\x71\x7f\x69\xf9\xf7\x00\xa3\x9a\xbd\x84\x8d\xf6\x72\xcf\x90\x2a\xda\x7c\x7f\x16\x9a\x8e\x0c\xd2\x42\x63\xe4\x02\x7f\x60\x7d\x7c\x7e\x76\xf6\x6a\x1c\x64\xac\xaa\xc4\x10\xb6\x5a\x13\xf5\xf1\x28\x3f\xbe\x15\x52\xd3\x91\xde\xc5\x6b\xae\xf8\x96\xec\xcc\x1e\x5d\x00\xaf\x81\x10\x66\xe3\xcc\xb3\x47\x75\x04\x9d\xf1\xe3\x00\x46\xe2\x47\x17\xf3\x58\x06\x29\x8e\x62\x29\xad\xfe\x07\xb4\x3b\x06\xde\xfc\x1f\xa8\xf7\x7c\x6c\xa7\x3e\x5e\x30\xc7\xd7\x8b\x61\x9c\xc7\x8f\x03\x68\x8f\x1f\x35\xe6\x73\xde\x62\x3e\x1d\xa3\xb8\x87\x88\xd9\xdd\xb5\x92\x16\x3f\x05\x2d\xa7\x0b\x79\x65\x3e\x1a\xd4\x4e\xc4\x6c\x08\x74\x01\x6c\x14\x2f\x04\xde\xb8\xf8\x13\x74\x3c\x1f\x25\xac\xc8\x57\xfb\xde\x0a\x20\x1c\x9f\x7f\xeb\x31\xb5\x22\x1f\x85\xf6\x3e\x18\x7a\xc2\x9b\xa2\xc8\xed\xee\x47\xa6\x63\xf8\xf7\x7f\xca\x02\xde\x96\x47\x8c\xa1\x6c\x9f\x7c\x53\xda\x6f\x70\xca\x17\xe2\x55\x28\x4d\x71\xc5\x24\xb3\x6d\x01\xa8\xb6\x12\xd3\xba\x59\xcb\xfc\x5b\xf3\xa3\x79\xbc\x52\x68\xd3\xf9\x33\x84\x9f\xf1\x7d\x5b\x55\xd6\xdf\x54\x39\xbc\x86\xe1\xba\xb1\x74\x98\xdf\x43\x8d\xd7\x80\xbf\xd7\x7d\x5d\x0d\x89\xca\x5e\xab\xf1\x30\xc8\x50\x3a\xb5\x31\xf5\x6d\x17\x7e\x62\xc6\x32\x99\xf5\xfb\x2e\xd7\xb9\xa5\x60\xd7\xc8\x34\x5c\x97\x45\xdd\x4d\x5b\xd4\xb5\xf5\xc3\xed\xc1\x24\x10\x8a\x38\xcf\x6a\x74\xbb\x5a\x1d\xf9\x6f\xca\xba\x48\x98\x8a\xda\xf7\x10\x07\xfa\x70\x6f\x83\xfb\xb2\x52\xc9\x74\x4e\x47\x07\x43\x7b\xb9\x61\xfd\x62\xa3\x7d\x8d\xd0\xbb\x8d\x6b\x25\x44\x21\x99\xdd\x35\x4d\xae\x33\x51\x5e\x24\x9c\x99\xb5\x7b\x66\xea\xe9\x77\x45\xe2\x6b\x7a\x0f\x01\x2e\x7b\xf5\x53\xfd\xae\x62\xa1\xea\x9e\xc5\xb5\x30\x16\xf5\x86\xf0\x18\x2e\x66\x62\xf4\xdf\x00\x00\x00\xff\xff\x04\xc0\x47\x1c\xef\x23\x00\x00") +var _olmManifests0200OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xeb\x6f\xe3\xb8\x11\xff\xee\xbf\x62\x60\x14\x48\x5b\x9c\xfc\xc8\x6b\x13\x01\x07\x5c\x9a\xdb\xbb\x3d\x74\x93\x18\x71\xb6\x5f\x8a\xa2\xa0\xa4\xb1\xcc\x86\x0f\x1d\x49\xd9\xeb\x2b\xfa\xbf\x17\x14\xf5\x16\xed\x3c\x36\xdb\xed\x87\xe3\x17\xdb\xe4\x0c\x67\x38\x1c\xcd\xe3\x27\x07\x41\x30\x22\x19\xfd\x1b\x2a\x4d\xa5\x08\x61\x33\x1f\x3d\x52\x91\x84\x70\x4b\x38\xea\x8c\xc4\x38\xe2\x68\x48\x42\x0c\x09\x47\x00\x82\x70\x0c\x41\x32\x3e\x7a\x1d\x63\x86\x8a\x18\xa9\x74\xc1\xee\xe8\x97\xa8\x36\x34\xc6\xab\x38\x96\xb9\x30\xfd\x3d\xbd\xc2\x83\x6a\x9f\x40\x3b\x66\x52\x32\x3b\x9a\x42\xba\x5f\x4b\x15\x91\x78\x42\x72\xb3\x96\x8a\xfe\x46\x0c\x95\x62\xf2\x78\xa1\x27\x54\x4e\x6b\xfd\xaf\x59\xae\x0d\xaa\x7b\xc9\x7c\x27\xd0\x3b\x6d\x90\x87\xb1\x14\x46\x49\xc6\x50\x85\xb5\x2e\x8c\xae\x30\xde\xc5\x0c\x03\x4e\x04\x49\x51\x8d\x54\xce\x50\x87\xa3\x00\x48\x46\x7f\x56\x32\xcf\x74\x08\x7f\x1f\xff\x79\xfc\x8f\x11\x80\x42\x2d\x73\x15\x63\x6b\x6a\x83\x2a\xaa\x7f\x06\x20\xa4\xb8\x2f\x89\x3e\xdd\x7f\xdc\x4b\xf7\x45\x27\xfc\x0b\x15\x09\x15\xe9\x53\x66\x8e\x1c\x59\x60\x4d\xaa\x24\xc3\x7b\x5c\x59\xca\xea\x58\x07\xa4\x8e\x00\x86\x66\x7d\x95\x31\x75\x1e\xfd\x0b\x63\x53\xd8\xd3\xeb\x39\x6f\xe2\x20\xb5\x87\x4e\x62\xa9\x50\xda\x0f\xde\x58\xee\xee\xe3\xcd\xb5\x14\x2b\xea\x33\x58\xec\x0e\x38\xd8\x91\x64\x99\x6e\x76\xf8\x11\x33\x26\x77\x1c\x85\x79\xc2\xe6\x43\x55\x01\x18\x89\x90\x69\x4b\x6f\x6d\x9f\xf5\x18\x74\x86\xb1\x5d\xd3\x46\x11\x83\xe9\xce\xd1\x99\x5d\x86\x21\xdc\x4b\xc6\xa8\x48\x3f\x65\x09\x31\x58\x78\x5f\xc6\x68\x4c\x74\x08\x73\xcb\x81\x0c\x63\x23\x95\xe3\xe0\xc4\xc4\xeb\x8f\x2d\x51\x3e\x61\x00\x06\x79\xc6\x88\xc1\x92\xa9\x75\x18\x3b\x58\x87\xdf\xbf\x03\x40\xa5\x72\xf1\xbd\x73\x9b\xb7\xcf\xb8\x4a\x3b\xac\xef\x10\x2a\x50\xb5\x64\x05\x7e\x73\x56\x23\x96\x9c\x13\x91\x84\xad\xa9\x00\xa6\x11\x15\x53\x67\xe5\x5a\x65\x95\xea\x2e\x51\x10\xd4\x57\xd2\x99\xff\xc3\x1f\xef\x16\xef\xef\xaf\x1e\xee\xee\xff\x79\x7b\x75\xf3\x7e\xb9\xb8\xba\x7e\xff\xa7\x1e\xe7\x56\x51\x83\x4b\x43\x4c\xae\xed\xd9\x3a\xab\xe3\x71\xeb\x27\xe5\x24\xc5\x10\x7e\xcd\xc9\xce\x3e\xb5\xf5\xf1\x57\x8a\x70\xdc\x4a\xf5\x68\xd5\xfc\x41\xaf\xc9\xf1\xd9\x79\x38\x3b\x7b\x97\x90\xd3\xe4\xe4\xec\xe4\x74\x75\x39\xbf\xbc\xc0\xcb\x24\x79\x17\xcf\x30\x3e\xbb\x9c\xcf\x4f\x66\xe7\xc7\xa7\x31\x9e\x9c\x1d\x47\xd1\xfc\x1d\x39\xbe\x8c\x92\x79\x74\x71\x3c\x5f\x45\xe7\xd1\xec\xf8\xf8\x34\x8a\xce\xfa\x72\x17\x39\x63\x0b\xc9\x68\xbc\x0b\xe1\x97\xd5\xad\x34\x0b\x85\x1a\x6b\x6b\xdb\x91\x49\x65\x3a\x76\xb1\x27\xa8\xaf\x61\x21\x95\x09\xe1\x62\x76\x31\xeb\x50\x54\x1e\xce\xd1\x28\x1a\xeb\xd6\x1a\xa3\x1b\x14\xa8\xf5\x42\xc9\x08\xbb\xdb\xae\x8d\xc9\x7e\x46\x13\xf6\x76\xca\x88\x59\x87\x30\x5d\x23\x61\x66\xfd\x5b\x7f\x71\x9f\x7c\x1d\xaf\xd1\x6a\xf0\xe1\xe1\x61\xd1\x5a\x52\x48\x12\xfa\x0d\xe5\x1b\x54\x9c\x8a\x22\x62\xde\xa0\xd6\xf6\x0a\x4a\xf3\xff\x44\x18\x8b\x48\xfc\xf8\x20\x3f\xca\x54\xdf\x89\xf7\x4a\x75\xdc\x18\xc5\xa6\xeb\x9d\xce\xc2\x43\x4f\xec\x28\xb2\x21\x2c\xc7\x9f\x94\xe4\xfd\x53\xad\x28\xb2\xa4\x8c\xeb\x9e\x95\x45\x71\xe8\xea\x29\x9f\xf8\x9f\x03\x8f\x06\x43\xe1\x7b\x9f\xcb\x26\x23\x76\x98\x14\xfe\x9a\xa3\xee\xbb\x1c\x40\x9c\xe5\x21\xcc\x67\xbc\x37\xcd\x91\x4b\xb5\x0b\x61\x7e\x3e\xbb\xa1\xe5\x9a\x90\x09\x2e\x3b\x31\xce\x8e\xc7\x3c\x42\x25\xd0\x60\x91\x1d\xa5\x0e\x81\x51\x91\x7f\xfe\x92\x00\x1e\x13\x43\x98\x4c\x5f\x16\xc4\x07\x4c\x5f\x3b\x90\x7b\xb4\x7c\x45\x30\xf7\xec\xf2\xb5\x03\xba\x57\x64\xc5\xb6\x2f\xa8\x97\x4c\x07\x03\xfb\x51\x13\xd8\x8f\x3a\x0b\xdd\x8c\x10\x40\x10\x17\xe9\x9f\x93\xcc\x16\x1f\xa8\x7e\xb1\x41\xf3\xfb\x03\xb1\xba\xa6\x6f\x8e\xad\x30\xa5\xda\xa8\x5d\x68\x0d\xae\x4d\x77\xff\xdc\x50\x16\x14\xa1\xb8\x33\xff\x8d\xd2\xc1\xef\x69\xe8\xf7\x34\xf4\x44\x1a\x7a\xdb\xa8\x7d\xf1\x25\x41\x7b\xd8\x68\x3c\xbb\x31\x1a\x86\x72\x92\xa6\x0a\x53\x62\xd0\x36\x3d\x01\x26\xd4\xf4\x62\xf7\xfe\xfd\x1a\x56\x23\x03\x92\x70\x2a\x42\x18\x1b\x95\xe3\xf8\x25\x8c\x56\x64\xcd\xe7\xef\x24\x7d\xcd\xca\xb0\xb9\xd4\x79\xa4\x63\x45\x33\x2b\x49\x77\x1b\xc8\x58\x21\x31\x38\xfe\x0e\xc6\x79\x91\x50\xec\xb7\xcc\x66\x0d\xfb\x25\x41\x86\x06\x8b\x56\xf4\x15\x52\xcb\x76\xa8\x8c\xf1\x1b\x77\x0b\xda\xee\x5b\x06\xe4\x92\xd6\xce\x50\xa1\x0d\x61\x2c\x63\xc4\x51\x1c\xd0\xb8\x51\xea\xeb\x5e\xf8\x86\xe2\xf6\x5b\x5e\xf8\x0b\xf8\xac\xaa\x6f\xe2\x28\x6f\x77\x65\xdf\x41\x2d\x32\x2d\x94\xe8\x5e\x62\x8a\xc6\x92\x30\xaa\x8b\xcf\x6d\xe1\x71\x03\x3f\xcb\x48\xfc\x48\x52\xd4\x93\xe7\x69\x5f\x92\x73\x22\xe8\xca\x46\x1e\xe7\xcb\xdd\xb9\x29\x8d\xa5\x78\x9e\x2e\x2f\xc3\x05\xca\xd5\x42\x79\x8f\x6f\xa5\x4c\x46\x84\x05\x0d\xfc\xd5\xad\x0b\x3b\xa8\xd8\xdb\x49\x6d\x17\x5b\x7d\x91\x8c\xd7\x65\xa6\x21\x2a\x45\x53\xc3\x76\xa5\xb7\x07\x2f\x81\x47\x08\xcb\xd6\xa4\x07\x2f\x95\xe8\x4c\xc9\xea\x51\xaf\xba\xdf\xa2\x90\x7a\xaa\x52\x96\x8c\x4f\x36\x35\x2e\x38\x9b\x1c\xcf\x26\xb3\xfa\x04\x09\xd5\x19\x23\x3b\x57\x62\x2e\xdc\xb6\xb0\xac\xf6\x4d\xb0\xf6\xcc\x10\xee\x31\x73\xa5\x84\x06\x22\x6a\x0b\x56\xba\x80\x59\x13\x03\x54\x03\xd9\x10\xca\x48\xc4\x10\x56\x4a\x72\x20\x90\xda\xfa\x00\xae\xdd\x73\xb0\x2c\xbc\x0e\xb6\x6b\x1a\xaf\x61\x4b\x19\x2b\x3c\x91\x6d\x10\x8c\x04\xe2\x37\xc0\x64\x04\xc0\xa9\xf8\x6b\x1e\x61\x6d\xcd\xf9\x64\x3e\x9f\xd8\x0c\xfd\x88\xbb\xad\x54\x89\x75\xc8\xa3\xbe\xcf\x1e\x7d\x07\x47\x92\x71\xfb\x51\x59\xec\xc8\x7a\x30\x27\xb4\x5d\x29\x57\x35\xf2\x3d\x26\xf0\x81\xb8\x4a\x09\x39\xa1\xac\xb8\x34\xa1\xd7\x74\x65\x1a\x6f\xf8\x41\x61\xb2\x26\xc6\x5e\xdf\x08\x20\x53\x72\x43\x13\x2c\xd3\x6c\x7f\x1f\x46\xc5\x63\x47\xc4\xc0\xc2\x00\xb9\x62\x61\x51\xa8\xe8\x70\x3a\x4d\xa9\x59\xe7\x51\xe1\x1a\xbe\xb2\x71\x2f\xc4\x37\x35\x0a\x71\xca\x89\x35\xde\x34\x7b\x4c\xa7\xe5\x79\x83\xda\x45\xca\xa8\x73\x23\x13\x2c\x35\x72\x5d\xd1\xdd\x56\xdc\x76\x3a\x52\x9d\x67\xb6\x04\xc2\x24\x04\x1b\x17\x5b\xa4\x4b\x2a\x52\x86\xcf\xa5\xbe\xc9\x99\xa1\xcf\x25\xbe\x62\xac\x79\x8a\xf6\xd0\x96\x27\x70\x96\xae\x1b\x3c\x48\x9a\xae\x12\x7a\x6d\x54\x19\x95\x17\xb6\x42\xd3\x45\x44\xae\x56\x82\x57\xb6\x58\x00\x65\x96\xa8\x7e\xb6\x03\x6f\xaf\xa2\xde\x83\xe9\x3e\x51\xfd\x05\x50\xa2\xb5\x24\x8e\x51\x6b\x85\x36\x47\xb5\xcb\x6d\x17\x7e\xfb\xd5\x7b\x51\x8d\xf4\x26\x53\x34\x4f\xe9\xd9\x03\xd0\xbc\x3a\x15\xbd\x81\xeb\xc4\x0e\xea\xd1\x15\x68\x7f\xdb\xcc\xd0\x99\x28\x52\xc4\x33\x74\xf2\xa6\xad\x67\xe8\xd9\xc9\xb5\xff\x23\x5d\x0f\xe7\xda\xa7\x95\xee\x07\xad\x57\xab\xdd\x3c\x08\x2d\x37\xf7\xe7\x0b\x37\xda\x8f\x0a\x40\x1f\x34\xa9\x86\x1f\x3c\x69\x1d\xab\xbd\xd2\xef\x59\x38\xf9\xfc\x49\xd4\x19\xc1\x21\x2d\xbd\xf5\x65\xae\xd2\xde\x4a\x83\xcc\x1c\xb7\xd5\x1b\x74\x34\xe0\x47\x6a\xaa\x51\x60\x2d\xfe\xa3\xf7\x61\x9b\x7a\xb7\x1e\x7c\x53\x8d\x3e\x8c\xf3\x2c\x11\x43\x0b\xc3\xab\xb1\x9d\x6a\xf8\x5b\xbb\x6a\xec\x6b\xf1\xba\x54\x3e\x9c\xc8\x8d\xc3\xfe\xd2\xf0\x0f\x00\xa3\x8a\xbd\x80\x8d\x06\xb9\xa7\x4f\x15\x6c\xbe\x3f\xf5\x4d\x07\x1a\xe3\x5c\x61\x60\x03\xbf\x67\x7d\x7c\x76\x7a\x7a\x32\xf6\x32\x96\x55\xa2\x0f\x5b\xad\x88\xba\x78\x94\x1b\xdf\x0a\xa9\x69\x49\x6f\xe3\x35\x57\x6c\x4b\x76\x7a\x40\xe7\xc1\x6b\xc0\x87\xd9\x58\xf3\x0c\xa8\x0e\xa0\x33\x6e\xec\xc1\x48\xdc\x68\x63\x1e\x4b\x2f\xc5\x41\x2c\xa5\xd1\x7f\x8f\x76\x87\xc0\x9b\xff\x03\xf5\x5e\x8f\xed\x54\xc7\xf3\xe6\xf8\x6a\xd1\x8f\xf3\xb8\xb1\x07\xed\x71\xa3\xc2\x7c\xce\x1a\xcc\xa7\x65\x14\xfb\x10\x51\xb3\xbb\x96\xc2\xe0\x67\xaf\xe5\x54\x2e\xae\xf4\x27\x8d\xca\x8a\x98\xf5\x81\x2e\x80\x8d\x64\x39\xc7\x1b\x1b\x7f\xbc\x8e\xe7\xa2\x84\xe1\xd9\x6a\xe8\xad\x00\xdc\xf2\xb9\xb7\x1e\x53\xc3\xb3\x91\x6f\xef\xbd\xa1\xc7\xbf\x29\xf2\xcc\xec\x7e\xa4\x2a\x84\x7f\xff\xa7\x28\xe0\x4d\x71\xc4\x10\x8a\xf6\xc9\x35\xa5\xdd\x06\xa7\x78\xc5\x5e\x86\xd2\x04\x57\x54\x50\xd3\x14\x80\x72\x2b\x30\xa9\x9a\xb5\xd4\xbd\x87\x3f\x98\xc7\x4b\x85\x36\xad\xbf\x57\xb8\x19\xd7\xb7\x95\x65\xfd\x4d\x99\xc3\x2b\x18\xae\x1d\x4b\xfb\xf9\xdd\xd7\x78\xf5\xf8\x3b\xdd\xd7\x55\x9f\xa8\xe8\xb5\x6a\x0f\x83\x14\x85\x55\x1b\x13\xd7\x76\xe1\x67\xaa\x0d\x15\x69\xb7\xef\xb2\x9d\x5b\x02\x66\x8d\x54\x81\x7b\x1b\x7f\xd3\x14\x75\x4d\xfd\x70\xbb\x37\x09\xf8\x22\xce\xab\x1a\xdd\xb6\x56\x07\xfe\xed\xb2\xce\x23\x2a\x83\xe6\x3d\xc4\x9e\x3e\xdc\xd9\xe0\xa1\xa8\x54\x52\x95\xc5\xa3\xbd\xa1\xbd\xd8\xb0\x7a\xb1\xd1\xbc\x46\xe8\xdc\xc6\xb5\xe4\x3c\x17\xd4\xec\xea\x26\xd7\x9a\x28\xcb\x23\x46\xf5\xda\x3e\x33\xd5\xf4\x87\x3c\x72\x35\xbd\x83\x00\x97\x9d\xfa\xa9\x7a\x57\xb1\x90\x55\xcf\x62\x5b\x18\x83\x6a\x43\x58\x08\xe7\x33\x3e\xfa\x6f\x00\x00\x00\xff\xff\xef\xf0\x09\xa9\x41\x24\x00\x00") -func olmManifests0191OlmYamlBytes() ([]byte, error) { +func olmManifests0200OlmYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0191OlmYaml, - "olm-manifests/0.19.1-olm.yaml", + _olmManifests0200OlmYaml, + "olm-manifests/0.20.0-olm.yaml", ) } -func olmManifests0191OlmYaml() (*asset, error) { - bytes, err := olmManifests0191OlmYamlBytes() +func olmManifests0200OlmYaml() (*asset, error) { + bytes, err := olmManifests0200OlmYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.19.1-olm.yaml", size: 9199, mode: os.FileMode(420), modTime: time.Unix(1655230539, 0)} + info := bindataFileInfo{name: "olm-manifests/0.20.0-olm.yaml", size: 9281, mode: os.FileMode(420), modTime: time.Unix(1661216761, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0200CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x77\xe3\xb6\xb5\x28\xfe\x7f\x3f\x05\x96\x9b\xf3\xb3\xdd\x48\xf2\x4c\xd2\x93\x7b\xea\xdb\xd3\x2c\xd7\x76\x52\xff\x32\xe3\xd1\x1a\x3b\xe9\xed\x9d\xe4\xa4\x10\xb9\x25\xa1\x26\x01\x16\x00\x65\xab\x27\xe7\xbb\xdf\x85\xbd\x01\x3e\xf4\xb2\x24\x72\x66\x3c\x0e\xd1\xb5\x9a\xb1\x48\x82\xe0\xc6\xc6\x7e\x3f\xfa\xfd\xfe\x6f\x78\x26\x7e\x00\x6d\x84\x92\xa7\x8c\x67\x02\x1e\x2c\x48\xf7\x97\x19\xdc\xfd\x87\x19\x08\x75\x32\x7b\xf9\x9b\x3b\x21\xe3\x53\x76\x9e\x1b\xab\xd2\xb7\x60\x54\xae\x23\xb8\x80\xb1\x90\xc2\x0a\x25\x7f\x93\x82\xe5\x31\xb7\xfc\xf4\x37\x8c\x71\x29\x95\xe5\xee\x67\xe3\xfe\x64\x2c\x52\xd2\x6a\x95\x24\xa0\xfb\x13\x90\x83\xbb\x7c\x04\xa3\x5c\x24\x31\x68\x9c\x3c\xbc\x7a\xf6\x62\xf0\xd5\xe0\x8b\xdf\x30\x16\x69\xc0\xc7\x6f\x45\x0a\xc6\xf2\x34\x3b\x65\x32\x4f\x92\xdf\x30\x26\x79\x0a\xa7\x2c\xe2\x96\x27\x6a\x42\x8b\x30\x03\x95\x81\xe6\x56\x69\x33\x88\x94\x06\xe5\xfe\x93\xfe\xc6\x64\x10\xb9\xb7\x4f\xb4\xca\xb3\x53\xb6\xf2\x1e\x9a\x2f\x2c\x92\x5b\x98\x28\x2d\xc2\xdf\x8c\xf5\x99\x4a\x52\xfc\xb7\xff\x78\x7a\xed\x0d\xbe\x16\x7f\x4f\x84\xb1\xdf\x2d\x5f\x7b\x25\x8c\xc5\xeb\x59\x92\x6b\x9e\x2c\x2e\x18\x2f\x99\xa9\xd2\xf6\xba\x7c\xbd\x7b\x5d\xc4\xad\xd1\x11\x5d\x16\x72\x92\x27\x5c\x2f\x3c\xfb\x1b\xc6\x4c\xa4\x32\x38\x65\xf8\x68\xc6\x23\x88\x7f\xc3\x98\x07\xa1\x9f\xaa\xcf\x78\x1c\xe3\xb6\xf0\x64\xa8\x85\xb4\xa0\xcf\x55\x92\xa7\xb2\x78\x95\xbb\x27\x06\x13\x69\x91\x59\x04\xfd\xed\x14\x58\xa6\xc1\xda\x39\x82\x84\xa9\x31\xb3\x53\x08\xef\x2e\x9e\x62\xec\x1f\x46\xc9\x21\xb7\xd3\x53\x36\x70\x10\x1e\xc4\xc2\x64\x09\x9f\xbb\xd5\x54\xee\xa2\x6d\xba\xa0\x6b\x95\xdf\xed\xdc\x2d\xdd\x58\x2d\xe4\x64\xd3\x52\xdc\x7d\xdb\xaf\x81\x40\x73\x3b\xcf\x96\x97\xb0\xf0\xe3\xb6\xef\xcf\xf2\x51\x22\xcc\x14\xf4\xf6\x8b\x28\x1e\x59\x5a\xc3\x70\xc5\x95\x35\x0b\xa9\x4c\x1a\x0e\xd4\x60\xe9\x30\x2c\xbd\xe0\x6c\xb2\xfc\x8d\x31\xb7\xe1\x47\xba\x69\xf6\x92\x27\xd9\x94\xbf\xf4\x3f\x9a\x68\x0a\x29\x2f\xf1\x41\x65\x20\xcf\x86\x57\x3f\x7c\x79\xb3\x70\x81\xd5\xa1\x53\xc3\x73\x26\x0c\xe3\x4c\x43\xa6\x8c\xb0\x4a\xcf\x1d\xb4\xce\x6f\x7e\x30\x3d\x76\xfe\xf6\xc2\xf4\x18\x97\x71\x71\xf0\x58\xc6\xa3\x3b\x3e\x01\x33\x58\x5a\xab\x1a\xfd\x03\x22\x5b\xf9\x59\xc3\x3f\x73\xa1\x21\xae\xae\xc2\x81\x27\xc0\x64\xe1\x67\x07\xff\xca\x4f\x99\x76\xef\xb4\x95\x83\x4c\xa3\x42\xe5\x6a\xbf\x2f\x7c\xe1\xa1\x03\x03\xdd\xc7\x62\x47\xe0\xc0\x20\x0a\xf8\x33\x06\xb1\x87\x1d\xa1\x86\x30\xee\xfb\x35\x18\x90\x44\xf2\xdc\xcf\x5c\xfa\x6f\x1a\xb0\x1b\xd0\xee\x41\x77\xdc\xf3\x24\x76\x94\x70\x06\xda\x32\x0d\x91\x9a\x48\xf1\xaf\x62\x36\xc3\xac\xc2\xd7\x24\xdc\x82\xb1\x0c\x4f\xad\xe4\x09\x9b\xf1\x24\x07\x02\x65\xca\xe7\x4c\x83\x9b\x97\xe5\xb2\x32\x03\xde\x62\x06\xec\xb5\xd2\xc0\x84\x1c\xab\x53\x36\xb5\x36\x33\xa7\x27\x27\x13\x61\x03\x0d\x8f\x54\x9a\xe6\x52\xd8\xf9\x09\x92\x63\x31\xca\x1d\x39\x3c\x89\x61\x06\xc9\x89\x11\x93\x3e\xd7\xd1\x54\x58\x88\x6c\xae\xe1\x84\x67\xa2\x8f\x8b\x95\x48\xc7\x07\x69\xfc\x5b\xed\xa9\xbe\x39\x5c\x00\xdf\x4a\x64\x66\x81\x6c\x6e\x84\xb5\x23\x9e\x84\x45\xf4\x38\x7d\x4b\x09\x52\xf7\x93\x83\xca\xdb\xcb\x9b\x5b\x16\x16\x40\x60\x27\x08\x97\xb7\x9a\x12\xd8\x0e\x50\x42\x8e\x41\xd3\x9d\x63\xad\x52\x9c\x05\x64\x9c\x29\x21\x2d\x1d\xe9\x44\x80\xb4\xcc\xe4\xa3\x54\x58\x83\x38\x07\xc6\xba\x7d\x18\xb0\x73\x64\x61\x6c\x04\x2c\xcf\xdc\x49\x8a\x07\xec\x4a\xb2\x73\x9e\x42\x72\xce\x0d\xbc\x77\x50\x3b\x88\x9a\xbe\x03\xdf\xf6\xc0\xae\x72\xe0\xe5\x07\x96\xce\x18\x63\x81\x43\x6e\x75\xf3\xba\x43\xc9\xe8\x04\xae\xa2\xc0\x6c\xc3\x59\x74\x83\xc7\xb1\x06\xb3\xe2\xc2\xd2\x81\xa4\x1b\x09\x4f\xa6\xca\xb8\xfd\xe3\x96\xbd\x79\xf5\x9a\x45\x5c\xb2\xdc\x80\x3b\x3c\x91\x92\xd2\x21\x84\x55\x8c\x3b\x5e\xd6\x87\x07\x61\x10\x81\x34\x4c\x84\xb1\x7a\x3e\x60\xdf\x28\x9d\x72\x7b\xca\xfe\x18\x7e\xea\xe3\x74\x4a\x33\x91\xfd\xe9\xf4\x8f\x99\xd2\xf6\x4f\xec\x8d\x4c\xe6\x6e\xd2\x98\xdd\x4f\x41\xb2\x9b\xe2\xdb\xd8\x7f\x56\xfe\xf8\x56\x67\xd1\x80\x5d\x4d\xa4\xd2\xe1\x4e\x87\x55\x57\x29\x9f\x00\x1b\x0b\x48\x10\xaf\x0d\xd8\xc1\xe2\x0e\x6e\xdc\x45\x46\xe2\xd2\x58\x4c\x5e\xf3\xec\x51\xd0\x9c\x87\x3b\xdd\xbb\xdc\xeb\xab\xcc\xbb\xbc\x68\x15\xa2\xb2\xfb\x24\xf7\x4f\x1e\xdd\x31\xee\xdf\x92\xf2\xac\x6f\xf0\xd8\x54\xc0\xb4\x1d\x04\xce\xc3\x04\x0e\x7e\xe5\xcf\x57\x9e\x72\x0d\x76\xfd\xec\xea\x97\xed\xfc\x6c\x29\x86\x3c\x0a\xb4\xd7\xab\xb8\xc8\x16\xef\x98\xe8\x2c\x1a\xaa\x98\x3e\xfb\xd1\xb7\x7c\x5b\xbd\x9b\xc1\x43\xa6\x0c\x18\x16\x8b\xf1\x18\xb4\xa3\x3b\x6a\x06\x5a\x8b\x18\x0c\x1b\x2b\x8d\xfb\x95\xa9\x18\xcf\x64\xb1\x7f\x35\x56\x3b\x54\xf1\xb6\x1b\xe3\x5e\x8d\x0c\x83\x90\xd1\xa3\xe1\xda\xcf\x5d\x79\xda\xd9\x23\x87\xd7\x0d\xa9\x62\xb8\x81\x04\x22\xab\xf4\xea\x3b\x16\x60\x72\x5d\x79\xc0\x53\xfd\xf0\xd7\xfd\x54\x44\x53\x96\xe6\x06\xa9\xae\xd5\x39\xd4\xe0\x62\x15\x1b\x0b\xcb\x94\x64\x1c\x5f\xeb\x68\xfd\xf2\x93\x29\xb7\xd1\xd4\xdf\x71\x68\x58\xc2\x47\x90\x98\xc5\x79\x46\x80\x2c\x37\xce\x13\x88\xdd\x84\x48\x4b\x70\xce\x35\x9f\xf0\x08\x94\x18\x91\xb2\x42\xde\xde\x0c\x33\xf6\x18\x96\x11\xe0\x85\xd2\xc2\xce\xcf\x13\x6e\xcc\x3a\x9c\x5e\x82\xee\xd5\x18\xd1\x47\x8c\x05\xc4\x3d\x26\x64\x2c\x9c\x4a\x63\xc2\xb7\x1f\x9a\x62\xde\x81\xbb\xd7\x31\xb8\xca\xfd\x01\x42\xe1\x1e\x76\x2f\x92\xc4\x01\x2b\x86\x31\xcf\x13\x24\x92\xff\x02\xad\x98\x40\xec\xd4\x88\x57\x52\x85\xcb\x9b\x81\xb7\xe1\x5b\xad\x4a\x9c\x80\x58\x6a\x2f\x8f\x7c\xe5\x6d\x79\x3f\xe3\x1a\xaa\xd2\xb9\x67\x43\xee\x43\xf1\x73\x2b\x53\x6f\x5e\x1e\xd7\xba\xa6\xa6\x54\x87\xb0\x90\x6e\xd8\xcb\x65\xd5\xc1\x61\x99\x93\x3a\xca\x85\x22\xaa\x5b\xcb\x1d\xd6\xa1\x98\x47\x57\xc0\x30\x2e\xe7\xcc\x72\x92\x48\xb8\xc7\x5f\xbf\x63\x56\x8b\x2c\x01\xf6\xc7\x3b\x98\xf7\x48\x06\x84\xf1\x18\x22\xfb\x27\x96\x9b\x20\x15\xe1\xfd\xee\x8f\x42\xc8\xfe\x63\xf8\xd7\x9f\xd6\x7d\xf1\x56\xf8\xfc\xf8\xd9\xa7\x41\x4b\xda\x74\xc7\x02\x84\x2e\xf1\x81\x05\xe4\x24\x08\xd0\x5c\x0e\x3e\xf8\x59\x03\x76\x99\x66\x76\xce\x52\xe0\xd2\x84\x93\x9d\x24\xb5\x9b\xcd\x80\xfd\xd5\xd1\xc1\x0a\x1a\xf3\x24\x51\xf7\x85\x4c\x8c\x18\x72\xad\x6e\xfc\x79\xef\xb1\xa1\x86\x31\xe8\xf2\x17\x24\x93\xd7\xea\xf2\x01\xa2\xdc\xae\xa5\x00\x55\xb8\x6d\x40\x65\x1a\x77\x30\xdf\x01\x20\xdf\xc1\x3c\xf0\x6e\xfa\xb2\x3b\x98\x13\x32\xe0\x4f\x25\x0e\xf1\x2c\x4b\x04\x90\x78\xba\x09\x32\x77\x30\x37\x78\xbe\xdd\xf3\x77\x34\x3b\xb8\xfb\x7b\x25\x96\x04\x32\x7b\xe9\x24\x24\xf3\xbf\x09\x5f\x23\x95\x8e\x84\xa4\x97\xd1\xd4\x61\x2b\x70\xf6\x00\x50\x19\xe3\x9f\xf8\x9a\x36\xc0\x15\x16\xb5\x03\xcc\xde\x84\xef\x28\x65\x7f\xc6\xdd\x8a\x0e\x9d\x18\x9f\xd0\x89\x9f\x8a\x2c\xa8\x54\xb8\xf4\x01\xfb\x81\x27\xa2\xd4\x47\x09\x37\x08\x02\xf8\x55\x97\xff\xcc\x79\x32\x60\x17\x44\xcf\xf0\xeb\xfd\x4f\xfe\x26\x07\xc8\x7f\xe6\x62\xc6\x13\xc7\xbf\xad\x72\x14\x32\x8e\xb8\x8e\x91\xc3\x78\x3d\xcd\x28\xda\x3d\x8e\x84\xc0\x89\xa7\xe1\xb4\x97\x7b\x64\x50\x47\x64\x19\xd7\x56\x44\x79\xc2\x75\xb0\x3d\xcd\x5b\x81\x68\x89\x34\x37\x10\x29\x19\x6f\x3c\xc1\x6b\xa9\xab\x7f\xb6\x0a\x63\x64\x11\xa0\x85\x8a\x51\x44\x11\x29\x2c\x22\xe9\x51\x9d\x8d\xab\x71\x38\xd5\xc5\x11\xeb\x31\xe5\xb8\xc7\xbd\x30\x5e\x8d\x2b\x44\x65\x41\xa2\xf4\x71\x85\x3c\x16\xa7\x62\xc0\xfe\x3c\x0f\x9c\xa6\xc7\x84\x25\xde\x63\x9d\x5c\xd3\x0b\x02\x80\x47\x59\x0f\xec\xf2\x40\x8d\x95\x06\x27\xde\x1e\xc5\x0a\x9f\x81\x99\x88\xec\xf1\x80\xfd\x5f\xc7\xcc\xdc\xc6\x4b\x98\x70\x2b\x66\x10\x50\x3c\x30\x3e\xab\xc1\xa9\x7e\x8c\x1b\xf6\x82\x1d\xe1\x63\x4c\xa4\x29\xc4\x82\x5b\x48\xe6\xc7\x6c\x34\xc7\xd7\x98\xb9\xb1\x90\x6e\xb3\x75\x4e\xa9\x9f\xd4\xec\x40\xcb\x63\xec\x55\x14\x21\xed\x57\xbf\xdf\x70\x27\x2e\x76\x87\x9d\xfd\x01\x15\xeb\x1a\xa9\x21\x5d\x7b\x61\x0b\x0b\x1e\xa4\x0a\x2a\x52\xd0\x0d\x61\xfc\x59\xe8\x95\xe7\x2a\x58\x36\x46\x50\x90\x99\x62\x83\xff\xe1\xf0\x80\x3b\xc5\x02\xb1\x9c\x30\xb7\x01\x8e\x8b\x68\x93\x6a\xb0\x96\xa3\xad\xd7\x5c\x19\x6a\xaf\x23\x6e\xe0\xab\xdf\xaf\x51\x09\xc8\xee\xe4\xf6\x7c\x59\xbb\x65\x5b\x30\xca\x72\xf2\x75\x9b\xf5\xe8\xb1\x2e\x5e\xbf\xd7\x0c\xc2\x29\x01\x8f\xaa\x2b\x85\xaa\xc0\x65\xb1\xdf\xfd\xa0\x11\xa2\x01\x9f\x0b\x09\x9a\x66\x73\xc4\x4f\x48\x63\xb9\xb4\x02\x29\x5b\xa1\x3b\x06\x5d\xf2\x5e\xd8\xe9\x2e\xea\x0a\xe2\x9a\x27\x34\x84\x5c\xde\x3a\xb0\x44\x1f\x76\x56\x2b\x83\x40\xfb\xb8\x9d\x61\x18\x44\x5f\x7a\x27\x37\x46\x4c\x9c\x94\xc9\xee\x41\x4c\xa6\x36\xb0\x93\xba\xb4\xe9\x7e\xf5\xaf\x10\xff\xc2\xd3\x94\x16\x4c\x40\x58\xe4\x00\x23\x70\x00\x34\x79\x0a\x71\xa0\x19\x31\x64\x20\x63\x90\xd1\x1c\xad\x5a\xc9\x0c\xf4\x80\x7d\x6f\xdc\x4e\xb1\xbf\x88\xc9\xd4\x81\x90\x5e\x5a\x15\x95\x50\x2a\x70\xac\xba\xbe\x02\xe1\x24\x7b\x27\xd7\x68\xa7\xd1\x38\xf0\x3b\x19\x28\xcc\x00\xf1\xc2\xfd\x86\xc5\x39\xda\xda\x16\x17\x91\x3b\x38\x0c\x50\x8a\xd5\x5c\x4e\x0a\x43\x42\xa1\x12\xd0\x81\x77\x9f\x34\x51\x64\x55\x43\xcb\xaf\xa3\x9d\x56\x95\x74\x54\x90\x29\xa4\x98\x43\x48\xfb\xe5\x17\x34\x6f\x50\x26\x3c\xe9\x51\x8c\x2f\x7e\x8c\xc3\x1c\x96\x4b\x02\x3e\x54\xf5\x91\x40\x66\x5e\xd0\x54\xab\x9e\x43\x72\xcc\xd3\xc5\x25\x97\x34\x5d\x73\x79\x07\x31\x4b\xe0\x41\x44\x6a\xa2\x79\x36\x15\x11\x4f\x92\x39\x1e\x53\x54\x07\x85\x35\x68\x45\xd9\x60\xb6\x59\x47\xc6\x0b\x17\xc0\xce\xe6\x0b\x03\x91\x06\xfb\xb8\x29\xec\x86\xee\x2b\x99\xb2\xe3\x80\x0e\xc4\x7e\x02\xc2\x11\x8f\x73\xc1\xde\xc3\xa3\xc8\x1d\x24\x44\x5d\x25\x2d\x78\x01\xa4\x82\xca\x03\x76\x85\x2c\x75\x04\x06\xb1\xfc\x0e\x20\x23\x4c\x4b\x84\xb1\xcc\xa4\x3c\x49\x7a\xcc\x08\x19\x01\x03\x1e\x4d\x09\x9c\x12\x20\x28\xd4\x56\x0b\x20\x31\xc8\xb1\xda\x79\xb1\x37\x20\xed\x6a\xa1\x66\xb3\xde\xb5\x41\xe7\xda\x0c\xc6\x82\xa6\x3c\x0e\xc9\x92\x16\x05\x9e\xe8\x7d\x4e\xa6\x74\xef\xed\xf0\x6a\xb2\x13\xdf\x58\x27\x7c\x4c\x1e\xa7\x35\xdf\xd7\x6e\x2f\xfc\x0c\x53\x75\x1f\x2c\xce\x4b\x87\xdc\x11\x5e\x13\xf6\x36\x16\x26\x72\x27\x1d\x62\x76\xae\xa4\x41\xf9\x94\x1c\x0f\xe8\x38\x98\xf1\x84\x50\x21\x4c\x9c\xa9\x24\xc1\x23\x9f\x07\x75\xc2\xc9\xf1\x92\x41\x3a\x82\x38\x86\xd8\x7d\x16\x2d\x65\x0d\x9b\x6b\x68\x2a\x0a\xfc\x61\xa8\x92\x64\x33\x17\xdb\xa8\x97\x6e\xa3\x95\x06\x00\x6c\x92\x8d\xea\xac\x2f\x40\x4c\x98\xe2\xcc\xc4\x60\x41\xa7\x42\x7a\xf1\xc8\x89\xba\x05\x60\x47\x60\xef\x01\x24\x8b\xa6\x10\xdd\x15\x47\xc9\xfb\x6d\x16\x76\xcd\x3b\x8d\xea\x14\xab\x74\x89\xa9\x24\x41\x45\xc3\x00\x30\xe1\x74\x02\x09\xf7\xe1\x99\x85\x33\x5a\x21\xf6\x7c\xc6\x45\xc2\x47\x09\x20\xd7\x2c\xfe\xea\xd5\xfc\x47\x81\x9f\x67\x79\x92\x38\x21\x56\xc6\x6c\xf2\x76\x78\xce\xac\xe6\xe3\xb1\x88\xdc\xa5\x58\x68\x88\xac\xb7\x49\xac\xfb\x84\x4d\xe2\xda\xda\x13\x61\x2c\xb7\xf9\xd2\x1e\x6d\xd8\xe0\x4d\x1b\xeb\xf4\x10\xb1\xd6\x40\x54\xdb\xca\xb7\x75\x65\xc5\x2d\x03\x48\xd9\xaa\x19\x53\x07\xec\x5a\xa1\x8e\xc0\x2d\x7b\x0d\xc6\xb1\x5d\x04\xd0\x5b\xe0\x46\xc9\x0a\x75\x45\xe9\x57\x8b\x89\x90\x3c\xf1\x1f\x85\x5e\x1f\x27\xa2\x0b\x25\x0b\xdd\x83\xcf\xdd\xa1\x4c\xc5\x44\x73\x5b\x10\xc5\x72\xdd\x9e\xbb\x78\xbe\x38\xce\x6d\xae\x61\xc0\xce\xe4\x1c\xf7\x7b\x0c\xdc\xfd\xe0\x66\xb6\x5a\xc5\x79\xe4\xe4\x25\x47\x60\x73\x53\x9d\xa4\x55\x32\x5a\x83\xda\xc1\x79\x78\x49\x10\xf4\x8c\x3b\x00\x5c\x78\xe3\xa9\x92\xc0\xb8\xc9\x9c\x1e\x17\x70\x32\xd7\x68\xc4\x2e\x00\x8c\xcc\xe2\x6c\x78\xc5\x42\x68\xc8\x80\xf5\xfb\x7d\x76\xeb\x7e\x36\x56\xe7\x11\xf2\x17\x77\x84\x64\xec\x39\x05\x61\x1f\x7e\x24\x47\xb1\x13\x3f\x83\x79\xcb\x07\x89\x60\x19\xb7\x53\x36\x20\xc0\x0f\x2a\xa0\x60\xec\x1b\xc7\x6b\x1e\x78\x9a\x21\xde\x3b\xd2\xfd\x8d\x52\x37\xb4\x43\xf4\xc2\xff\xc6\x0f\x3d\x39\x59\x44\x0a\x35\x72\x32\xaa\xb7\x20\x22\x6e\x8c\x95\x3a\x34\xf5\x6f\x1a\x84\x87\xbf\x93\xea\x5e\xae\x5a\x02\xbe\x93\x6b\x38\x65\x3f\x1e\x9c\x85\x23\xf8\xe3\x41\x8f\xfd\x78\x30\xd4\x6a\xe2\x64\x57\x21\x27\xee\x07\x87\x59\x3f\x1e\x5c\xc0\x44\xf3\x18\xe2\x1f\x0f\xc2\xd4\x9f\x67\x4e\xd5\x7a\x0d\x7a\x02\xdf\xc1\xfc\x3f\x71\xc2\xda\xa5\xc0\x1e\xfe\x33\x75\xf7\x14\xd7\x1c\x4f\x76\x8c\xeb\x3f\x53\x9e\xd5\x7e\x7c\xcd\xb3\xda\x44\xe7\x25\x02\xbe\xfb\x29\x05\xcb\x67\x2f\x07\xe5\x56\xff\xfd\x1f\x46\xc9\xd3\x1f\x0f\xca\x6f\xea\xa9\xd4\xa1\x4c\x66\xe7\x3f\x1e\xb0\xda\x0a\x4e\x7f\x3c\xc0\x35\x84\xdf\xc3\xa2\x4f\x7f\x3c\x70\x6f\x73\x3f\x6b\x65\xd5\x28\x1f\x9f\xfe\x78\x30\x9a\x5b\x30\xbd\x97\x3d\x0d\x59\xcf\x49\x52\xff\x59\xbe\xe1\xc7\x83\xbf\xb3\x1f\x65\x58\x34\x2a\x8a\xb4\xd3\x86\xfd\xcf\xc1\x06\x7e\xbf\x81\x29\x6c\x56\xee\x9c\xf6\x96\x70\x63\x6f\x35\x97\x46\x84\x30\x8a\xb5\xb7\xa6\x44\x0c\xd6\x5e\xd7\x48\x20\xd6\x5e\x26\x2c\x59\x7b\x79\x0d\x6b\xdd\x86\xad\x2d\x7f\xc3\x96\x26\xe9\xe5\x07\x83\xbc\xe3\xae\x94\x46\x9c\x62\x8f\x1c\x83\xf0\x77\xbb\x83\xea\x84\x7c\x77\xfe\x3d\xf1\x73\xe2\xa4\xc4\x7d\x1b\xf8\xc3\x5d\x68\xff\x85\x0b\x34\x97\x31\xe8\x64\xee\xc4\x8d\x72\xd6\x68\xea\xb4\x81\x78\xc0\xc8\xa8\xc0\x0b\x13\xce\x9d\x3b\x60\xc8\xba\x64\xc5\xb2\x8d\xeb\x2a\x66\x74\x84\x85\x08\x82\x9f\x06\xb9\x60\x14\x41\x66\x91\x0d\xee\xef\x69\x61\x15\x8b\x8b\x13\xbb\xfa\x76\x3d\x7a\x78\xe4\xd8\x12\xf0\xfe\x6e\xef\xb4\xce\x53\xee\xf8\x0a\x8f\xdd\x7a\xcb\x6b\xa4\xdb\x91\x2e\x46\xf4\x96\x8f\x54\xee\x6d\xbf\xc5\x3e\x78\x50\x7b\x2e\x83\x52\x5b\x66\xe7\x8f\x9a\x53\xb6\xfa\xf8\x94\x3f\xbc\x02\x39\xb1\xd3\x53\xf6\xe5\x17\xff\xeb\xab\xff\x58\x73\x23\x11\x4d\x88\xbf\x05\xe9\x0d\x45\x5b\x82\x61\xf9\xc1\x45\x8b\x62\x19\xe9\x34\x29\xef\x29\x2c\xe0\x25\x06\xdd\x73\xf4\x63\x7a\x5e\x9a\x67\x0e\x2e\x8e\x0b\x90\x21\x22\x82\x9e\x93\xa0\x56\x4e\x26\x0a\xe2\x9e\xcc\xd9\xcb\x2f\x7a\x6c\xe4\x41\xbc\x4c\xd6\xdf\x3d\xfc\x34\x58\xb1\x64\x61\xd8\x1f\x7a\x0b\xeb\x11\x86\xb9\xad\x52\x63\x44\x1c\xd2\x3f\x35\x10\x9b\x0c\x96\x82\x65\x36\x09\xc5\x7a\x1f\xdb\xb8\xc7\x8c\x85\xdb\x19\x0a\x53\x21\x45\x9a\xa7\xa7\xec\xc5\x9a\x5b\x88\xa4\x6d\xb9\x9b\x74\x73\x29\x25\x70\x47\xba\x26\x9a\xa7\x4e\x1e\x8a\x98\x88\x41\x5a\x31\x16\xa0\xab\xa8\x8d\xb6\x00\x7a\x30\xb8\x62\x0b\x28\xa2\x97\xd6\xd1\xa1\x0a\xb2\x0f\x49\x08\xd2\xc8\x9d\xbd\x6b\x27\xaa\x12\xa8\x79\x06\x74\x1a\x48\xbb\x61\xf0\x90\x91\x1c\x5b\xf1\x51\xa4\xc0\xa5\x90\x93\xe0\xfd\x0d\x86\x66\xe2\xc6\xf7\x53\x40\xd6\x53\x18\x31\xc9\x19\x10\x39\x4d\x2a\x46\xa5\x8a\xb3\x49\xce\x35\x97\xd6\xe9\xb8\x67\xc3\x2b\x12\xe0\x17\x0d\x9e\xbc\x0c\x09\x0a\xa7\x91\x8e\x2a\x11\x2b\xb7\x44\x1f\x46\x84\x27\xb6\xbd\xa3\xfa\xf2\xc5\x17\x1b\xb7\xbc\xb8\x6f\xbd\x7f\x8f\x5b\x0b\x5a\x9e\xb2\xff\x7a\x77\xd6\xff\xbf\xbc\xff\xaf\x9f\x8e\xfc\x3f\x5e\xf4\xff\xf0\x73\xef\xf4\xa7\xdf\x55\xfe\xfc\xe9\xf8\xeb\xcf\xd6\xcc\xb4\x5a\xd2\x5f\x83\x3e\x9e\x89\x04\x21\x32\xec\x68\x0f\x39\x8c\x1a\xb3\x5b\x9d\x43\x8f\x7d\xc3\x13\x03\x3d\xf6\xbd\x44\xd6\xd0\x10\x68\x20\xf3\x74\x93\x26\xd8\x67\x07\xee\xad\xab\x85\x8f\xe2\x16\x5c\xd2\xe6\x7b\xfc\x72\x37\xe9\xb6\xdb\x01\x29\xd8\x21\x2a\x94\xa6\x12\x7a\x86\xb1\x4a\xee\x20\xa9\x81\x17\x7f\x07\x91\x4a\x4f\x2a\xa1\x69\x4e\xee\x7e\xcd\xe5\x9c\x95\x64\x8d\x84\xd5\x45\x4c\x37\xd6\xd1\x26\x1e\x69\x65\x4c\x11\x5b\x67\x58\x22\xee\x80\x9d\x95\x4a\xa5\x23\x96\x23\x88\x38\x0a\xea\x7a\x24\xac\xe6\x64\x11\x0e\xb2\x65\x69\x6e\x1a\xe7\x09\x3b\x72\xba\xec\x00\xe3\x29\x96\xa8\xeb\xb1\x37\xed\x8e\x44\x22\xec\x9c\xf4\xec\x48\xc9\x71\x22\xbc\x7e\x90\x66\x4a\x5b\x2e\xad\x37\x42\xc2\x04\x1e\x98\x28\xfd\xe2\xc2\xb0\xa3\x58\x9a\x97\x2f\xbf\xf8\xf2\x26\x1f\xc5\x2a\xe5\x42\x7e\x93\xda\x93\xe3\xaf\x8f\xfe\x99\xf3\x04\x5d\xc0\xd7\x3c\x85\x6f\x52\x7b\xdc\x1e\x5b\x7c\xf9\xd5\x16\xa7\xe8\xe8\x1d\x9d\x95\x9f\x8e\xde\xf5\xfd\xbf\x7e\x17\x7e\x3a\xfe\xfa\xe8\xc7\xc1\xc6\xeb\xc7\xbf\x73\xdf\x50\x39\x81\x3f\xbd\xeb\x97\xc7\x6f\xf0\xd3\xef\x8e\xbf\xae\x5c\x3b\x5e\x75\x18\x1f\xfa\x77\xf9\x08\xb4\x04\x0b\xa6\xef\xb4\x81\x7e\xca\xb3\xfe\x1d\xcc\xd7\x1c\xce\xb5\xe2\xe8\xf2\x44\x04\xb1\x94\x67\xab\x54\x73\x0a\x31\x7b\x0b\x18\xd6\x14\xad\x44\xf2\x86\xee\x19\xc9\xd7\x88\x64\x74\x09\x83\xe0\xf7\x30\x49\x39\xbe\x43\x66\xb8\x4d\xe2\xf4\x16\xd8\xb2\x9d\xfc\x28\x37\x84\xf1\x3c\xfa\x92\xe2\x3b\xf7\x9e\x21\x9c\xef\x35\x11\xd0\x5b\xcf\x93\x8b\xb5\x9a\x56\xdd\xc0\x79\x75\x41\xa2\x2f\x92\x1e\x14\xe7\xa6\xca\xe9\x79\xb9\x14\xff\xcc\x81\x5d\x5d\x78\x7a\xd4\x63\x42\x46\x49\x1e\x3b\x49\xe1\xfb\xef\xaf\x2e\x9c\x72\xff\x67\x4f\x6e\xee\x81\xc5\x4a\x1e\x5a\xf6\xe6\xfa\xd5\xdf\xd0\x52\x80\x77\xf4\x88\xa1\x93\xb3\x8a\x27\x82\x82\xa7\x03\x03\x66\x7f\x06\x37\x97\x7f\x73\xc4\xb3\xc2\xb8\x82\xe4\x4e\xc6\x6c\x0a\x49\xe6\x04\x88\x3b\x60\x26\xd7\x7e\x75\x6e\x62\x72\x07\x3b\x58\x33\xef\x2c\x9e\x80\x45\x24\x4f\x30\x08\x78\x1f\xa0\xf9\xb0\x54\xa1\xe4\x8d\x93\x02\xdf\xc3\xf9\x70\x88\xfc\xc6\xcb\xac\xf8\x8e\x3d\x0e\xc3\x86\x58\xdc\x47\xbf\x90\xf9\xc3\x74\x4e\x5f\xfa\xde\x4f\xd2\xd2\xf7\xee\xf5\x46\x32\x76\xa2\xdb\xf3\xed\x23\xc6\xe9\xa5\x18\xaf\xba\xea\xbc\x90\x12\x81\x86\xd7\xc2\x73\x3a\xe5\x86\x8d\x00\x24\xda\x7a\xc9\x34\x08\xd2\x63\x1d\x94\x56\xda\x3c\xeb\x5b\xd5\x8f\x57\x6f\xde\x23\x90\x7b\x1c\x6a\x1b\x34\xd7\xda\xb7\x9d\xed\xac\xa8\xde\x4f\xe7\xab\x60\x60\xc8\xd6\x89\x51\x45\x41\x06\xd9\xf5\xc3\xd6\x2b\x26\x0b\x26\x5f\xd4\x2c\xbc\x51\xc3\xeb\x19\xcb\x4b\x72\xda\x63\xcd\xb2\x61\x15\xba\xfa\xea\x56\xbf\xdd\xd7\x48\xdb\x7c\x03\x7a\x26\xf6\x62\x7e\x8f\x1d\xcc\x88\x82\x50\xce\xde\xff\xb1\x72\xa2\xd7\xde\x2f\x41\xf3\x5f\xa4\x1e\xf1\xed\x6c\x98\xc0\x10\x04\x37\x05\xbb\xee\x32\xc7\xae\xcc\x92\xa8\xc9\x29\x06\x1e\x87\x9f\xac\xd2\xe8\x8f\xaf\xfe\x96\x8f\x0a\x41\xb9\x9c\xdd\xeb\x40\xec\xbf\xff\xe7\x37\xbf\xf9\x24\xd3\x29\x93\xdc\x58\xd0\x1e\x7c\x21\x97\xf0\xc3\xa5\x55\xd2\xeb\xfd\x19\xf2\x90\xc3\xeb\x95\xf4\xca\x55\xf7\x2c\xa7\x59\xae\xfc\x10\xbc\x65\x65\xba\xa5\x99\x55\xff\xed\x6f\x2c\x13\x2f\x57\xcd\xf6\x3e\x13\x30\x6b\xc9\x1b\x37\x3f\x54\xb0\xf7\xc3\x64\x5d\x2e\x38\x1e\x37\x2f\x61\x56\xd9\xa7\xea\xeb\x7f\x58\xfa\x7d\xdb\xd7\x87\xcf\xe7\xee\xcd\x95\x68\x17\x25\x31\x21\x2c\xe1\x21\x75\x76\xf5\x82\x56\xdc\x42\x2b\x7a\xbb\x7c\xe1\xf1\xf4\x4b\xaf\xbb\x66\x53\x6e\x96\x41\x3c\x5c\xf8\x75\xc5\x74\xed\x26\x5d\xae\xc2\x7e\x12\xaf\x89\x82\x14\x6e\x37\xdc\x3b\x27\xf7\xfe\x7d\xe5\x33\x37\x19\x44\x7f\xef\x12\x30\xbb\x04\xcc\x2e\x01\xf3\x89\x26\x60\x3e\x7e\xee\xdd\x19\x66\x31\x44\x09\x0f\x69\x30\x16\x92\x04\xb3\x21\xa7\xea\xbe\x08\xcd\x4c\x92\x6a\x28\x67\x19\x18\x96\x72\x89\xe1\x0e\x59\x46\xb6\x71\xce\x26\x62\x06\xb2\x88\x54\xd9\x76\xf1\x9b\x13\x42\x57\x33\xa8\x70\xd5\x2f\x70\xe1\xca\xc6\x5c\xd1\x45\x19\x68\x03\xd4\xce\xca\x7b\xbd\x8d\x20\x97\x14\x12\x90\x6b\x88\x31\x27\x82\x90\x3c\xe5\x19\x4a\x79\x18\x6f\x61\xa7\x18\xc6\x5a\x20\x38\xa6\xe3\xa0\xc3\x0d\x9d\x4e\x73\xe6\xc4\x38\x24\x08\x56\x29\x1f\xb5\xe3\x9e\x45\xc2\xa0\xc1\x6a\x01\xb3\xaa\x81\xb4\x70\x44\xed\xae\x13\x6c\x9f\x4d\xb6\x51\x24\xe6\x99\xf0\xb2\x4b\x5c\x08\x96\x5b\x40\x6f\x78\xe5\xf1\xad\x14\x47\x8d\xc7\x37\x30\x98\xc4\xe0\xe5\x83\x42\xae\xc5\x37\x79\xc4\x8a\x19\xe6\x65\x10\x66\x38\xb0\x55\x91\x70\x84\x96\x19\xcd\xa5\xbb\xb0\x12\xb9\xdf\x43\x96\xa2\xba\x97\xeb\xa3\x03\xda\xcd\xff\xaa\xc2\xae\xf8\xd9\x2d\x70\x86\x89\x9e\x41\x75\xb6\x0a\x4f\x2b\x69\xd0\x08\x3b\x7f\x4b\xcc\x66\x82\x33\x3e\x99\x68\x0c\xa5\x5d\x1b\x69\xb0\x65\x0e\xd7\x63\xa1\x11\x0c\x0f\x23\x4a\xf2\x1b\xef\x70\x64\x70\xe3\x0d\x6b\x2d\xb4\xe1\x86\x65\x61\xb1\x3e\xb6\xcb\x36\xe3\x68\x46\x0b\xa0\x55\xfa\x91\xc4\x96\xc7\xf7\x96\xc6\x23\x3b\x4c\xa3\xbe\xcf\x0b\x0b\xf1\x57\x47\xee\x7c\x94\xa4\xd9\x91\x83\xa8\xf4\x66\x7b\x37\x49\x06\xda\xe9\xe3\x14\x6c\xcc\x59\x44\xf2\x5b\x41\x78\x82\x77\xf8\x91\xe5\x6c\xb5\xff\x34\xb6\xc1\x02\x1a\x7d\x8c\xb7\x7a\xe4\xb6\xed\xb6\x8a\xc6\x23\x19\xdd\x8b\x63\xcb\xfc\x26\x3f\xf7\xe6\x8c\xef\x46\x73\x3b\x30\xb4\x3e\xe9\x16\x09\x3b\x34\xea\xe6\x2d\x7e\xff\xba\x1a\x49\xa2\xf9\x3d\x03\x19\x29\x47\x2c\xfe\xff\x9b\x37\xd7\x21\xb9\xed\xca\x32\x91\x66\x09\xa4\x18\x57\xf1\x9a\x6b\x33\xe5\x09\x68\xe4\x4e\xdf\xcb\xb4\xf6\xf7\x42\x7c\x78\x0c\x09\x9f\xd3\x64\x31\x44\x0a\x2d\xf1\x4a\xb3\xcc\x09\xb8\x69\x96\x63\x7e\x07\x5e\xc5\xf7\x3e\x9a\xc1\xb3\x07\x68\x4a\x13\xd5\x68\xbe\xd2\x02\x5a\x1f\x0f\xfd\x78\x5b\x1a\x50\x5d\xcc\xe3\x94\x80\xc6\x56\xf4\xa0\x3a\xf1\xa3\x5f\x59\xa4\xcf\x0c\x37\xd8\xd8\xaa\x33\xee\x98\x28\xf6\xe5\x17\x1b\xee\x8c\x21\x4b\xd4\xdc\xe1\xc5\xe3\x67\x65\xcb\xef\xd9\xfa\x5c\x6f\x3b\xdf\xb6\x67\x79\xcb\xf9\xc8\x38\xd5\xc6\x4c\xab\x14\xa8\xbd\x26\xda\xe4\xfe\xdb\x69\xa2\x15\xf6\xc7\xf5\xb3\xbd\x17\xe6\x37\xbc\x0a\xd6\x86\xc2\xeb\x4b\xb4\xe9\xbb\xc2\x6f\x5c\x11\xa4\xe7\x99\xa7\x34\x4e\x16\x5c\x64\x77\x1f\x87\xcb\x3d\x22\xcf\x84\xdb\x1e\x91\x6a\xc2\x6d\x8f\xc9\x36\x34\x76\x61\x9b\x8f\x23\x1d\x8d\x9d\x68\xec\xe3\x08\xb8\xc7\xa4\xb3\xcd\xde\xe4\x3d\xe6\x75\x3a\xf1\x13\x90\xf0\x6e\x6a\xcb\xa8\xc9\x77\x3e\x21\xd1\x09\x6f\x58\xad\x65\x94\xa8\xe8\xce\xdb\x2d\xdf\x5e\x14\xb9\x7f\xa1\x3a\x91\xcf\xfc\x63\xe2\x31\x0c\xee\x44\xba\x4e\xa4\xeb\x44\xba\x4f\x45\xa4\x23\xff\xc0\x53\xa0\x54\x0b\x0b\x59\x4b\xab\x28\xf6\xb2\xa3\x56\x1b\x46\x47\xad\x70\x74\xd4\xea\x91\xf1\xc9\x51\xab\xad\xe4\xb4\x2d\x62\x08\x37\x1f\xe4\xce\x98\xda\x19\x53\x3b\x63\xaa\x1f\x1d\x2f\xf3\xa3\xe3\x65\x1d\x2f\xeb\x8c\xa9\x9b\xa6\xec\x8c\xa9\x3b\x4e\xd4\x19\x53\x3b\x63\x6a\x67\x4c\xed\x8c\xa9\x8f\x7d\x4c\x27\xd2\x75\x22\x5d\x27\xd2\x6d\xbb\x98\xce\x98\xda\x19\x53\x37\x8d\x8e\x5a\x55\x46\x47\xad\x36\x8c\xe7\x4d\xad\x9a\x1b\x53\xa3\x04\xb8\x5c\xad\x54\x2d\xc4\x7f\xe3\x7d\x45\x7d\x7b\x5f\xc4\xd3\xff\x3a\x82\x29\x9f\x09\x95\xeb\xb2\x50\xd2\xf9\xcd\x0f\x6c\x02\xd6\x38\x2c\x00\x0b\xab\x04\xf3\x86\xc9\xc6\x20\xf9\x28\x59\x39\xf1\x63\xa4\xc4\x3f\xb9\xd9\x78\x3c\x52\xca\x7d\xdd\x32\xc4\x50\xd5\x09\x9a\xce\x2e\xf1\xcc\x07\xeb\x72\xec\x56\x07\x35\x9f\xbf\xbd\x68\x2b\x94\x99\xfd\x28\x43\x05\x6d\xc7\x1d\xa8\x4a\x2f\x96\x15\xf4\x85\x00\xdf\xdc\x4b\x88\x31\xc9\x2d\xd4\x34\x77\x87\x5e\x44\xc2\x26\xf3\xe2\xc5\x83\x55\x65\x47\x3e\x9d\x90\xe8\xf3\xb7\x17\xdb\x9b\xef\xc3\x06\x7c\x08\x4b\x7d\x67\x87\xef\xec\xf0\xc5\xe8\xc4\xa0\x3d\x27\xed\xc4\xa0\x0d\xe3\x79\x8b\x41\x4f\xdd\x6e\xdd\x59\x9b\x59\x67\x6d\xde\x7c\x5b\x67\x6d\xee\xac\xcd\x9d\xfd\x66\xcd\xe8\x04\x17\x1c\x9d\xe0\xf2\xc8\xf8\xe4\x04\x97\xce\xda\xdc\x51\xab\x8e\x5a\x75\xd4\xea\xd3\xa0\x56\x9f\x62\xe8\x6e\x67\xf4\xeb\x8c\x7e\x9d\xd1\xaf\xe3\x46\x1d\x37\x7a\x64\x7c\x72\xdc\xa8\x33\xfa\xed\x3a\x51\x67\xf4\x5b\x39\x3a\xa3\xdf\x23\xa3\x33\xfa\x75\x46\xbf\x35\xa3\x13\x5c\xf6\x9c\xb4\x13\x5c\x36\x8c\xe7\x2d\xb8\x74\x46\xbf\x8e\x5a\x75\xd4\xaa\xa3\x56\x9f\x06\xb5\x6a\x6e\xf4\x7b\xe4\x24\x6d\x7e\x76\xf3\x49\xd9\xf8\xac\x88\x36\xbd\x70\xef\x86\xef\x8d\x1a\xc0\x8e\xb8\x81\xaf\x7e\xbf\x54\xb7\xbc\x7a\x4b\x0a\xb1\xe0\x76\xff\xfe\xac\xe5\x2b\xd6\xef\xd9\x16\x7b\x5f\x2c\x63\xcf\x59\x7c\x61\xe5\x47\x83\x62\xdd\xd6\xc6\x57\x74\x73\xd1\x84\x7e\xa1\x2f\x67\xc9\x79\xe4\x9a\x02\xf4\x85\xd2\x78\x3f\x85\xd0\xd0\xc6\x97\x9e\x2e\xda\xc9\x0b\x53\x44\x2f\xaf\xec\x9f\xd4\x30\x1c\x39\xbc\x67\xc5\xe5\xc7\x36\x6d\x55\xf5\xed\x95\xc0\x0a\x00\xba\x20\xeb\xf5\x45\x91\x02\xbc\x08\xb1\x8c\x6b\x47\x21\x83\x95\x1b\x99\x76\xe5\xee\x05\x78\x6f\xee\x26\xb5\x91\x53\x3f\xce\xa1\xfb\x95\x4c\xe5\x75\x96\xf5\x6d\x18\xb3\xef\x81\x31\x04\x9d\x0a\x63\xd6\x05\x5c\xd7\x97\xfe\x18\xd9\xdc\x82\x5c\xae\x81\x7f\xf8\xa2\xca\x72\x0a\xf1\x89\xda\xff\x8c\x78\xc4\x74\x9e\xf8\x26\xa0\xbe\xfc\x35\xe3\x51\xa4\x72\x69\x99\x04\x88\xc9\xb2\xb1\x0a\x57\xb7\x20\xb6\x5b\xc8\x4f\xdb\x4a\x4f\x7d\x5a\xe7\xa3\x77\xf9\x6f\x38\xa3\x4f\x58\x59\x50\xbd\x3a\xb6\x97\xb6\xf0\xf5\x8f\x73\xad\x5d\x58\xe1\xd6\x8c\xb0\xb6\xbf\x43\x95\x88\x68\xfe\x36\x4f\xc0\xb7\x88\xab\x74\xd8\x27\x69\xb7\x2a\x22\x67\x78\x37\xae\x9e\x7a\x53\xc6\x0a\xa8\x93\xb4\x2f\x0c\x50\x7b\x3c\x74\xa9\xa2\xd6\x0e\xee\x21\xc6\xb3\x2c\xc1\x54\x0a\xe5\x84\x16\x6a\xe0\x5f\xf4\xd7\x5b\x75\xdb\xf6\xd2\xcb\x56\xe2\x35\xdb\x49\xc4\x66\xc1\x66\x35\x7a\x0c\x55\xd8\x8e\xb2\x36\xa3\x12\xf1\xdf\x6a\x95\x67\x5b\xde\xbe\x6c\x59\xa4\xa7\x43\xf7\xad\x6a\x03\x9b\x70\xd1\xbb\x8c\x42\xc7\x60\x6a\xd2\xe5\x4d\xa2\xd4\x0d\x3c\xcd\x13\x2b\xb2\x84\xda\x7c\x4f\x68\x42\xae\xa1\xe4\x1b\x3d\xc6\xe5\x3c\x78\xa0\x7c\x9b\x08\x88\x19\x9f\xb8\x19\x6d\x68\x1e\x4b\xfd\x25\xf2\x14\xdc\x69\x8e\x2b\x0d\x4d\x9d\x3a\x25\xe7\xe5\xec\xec\x5e\x24\x09\xb6\xef\x4d\x12\x75\xbf\xbe\xad\xdf\xe2\xd8\x4d\x28\x64\xbb\x09\x86\x6c\x77\x11\x98\x31\xa9\x64\x30\xed\x7e\xff\xf6\xd5\x7e\x9b\x78\x5d\x9f\xc3\xf7\x02\x01\x6c\x6c\x9d\x71\x6d\x05\x4f\x58\xae\x13\x43\xfb\xc8\x9d\x12\xa0\x43\x33\x95\x29\x47\xcf\x60\x04\x86\xba\x76\xb0\xdf\xd1\xce\x79\xc0\xd2\xf9\x54\x32\x99\x33\x4e\x3b\x3f\xce\x93\xa4\xc7\xc6\x42\x72\x47\x76\x21\x0b\x99\x30\x4e\x7f\x62\x37\x42\x46\xe0\xbe\xa9\x5f\x08\x16\xb8\x22\x37\xa3\x3b\xdf\xc5\x21\x8d\x7b\x95\x8e\xce\xd8\x87\x1b\x5f\xe1\x0e\x6c\x84\x6d\xeb\xc6\x4a\x07\x91\xe5\xad\x4a\xd0\xbc\xed\x0d\xdf\xbe\xa3\x3d\xaf\x5e\xfe\xb3\x90\xa8\xa4\xb0\xb7\xc8\x38\x9c\xb2\x03\x02\xfb\x43\xbb\x29\xb1\x4d\xad\xc3\x9d\x12\xa1\x8e\x4c\x1e\x4d\xdd\x27\x1d\x64\x2a\x36\x07\x8e\x8c\x1c\x18\x88\x34\x58\x73\x70\xec\xfe\x5a\xfc\x06\xfc\xbe\xea\x73\x27\x3c\x13\x07\xc7\x3d\x86\x00\xc2\x46\x27\xca\x4e\x3f\x5d\x3c\x0c\xdf\x5a\xeb\xaf\xf5\xd8\x58\xe8\xe2\x57\x99\xc1\x77\xed\x50\x19\x35\xc1\x70\x34\xda\x02\xe6\x49\x39\xa4\xa4\xfe\x9c\x45\x83\xf8\x45\x62\xcd\xd8\x59\xd1\x20\x1f\x2c\xf6\x01\xf7\x77\xc3\x0c\xf4\xdc\x4e\x9d\xb6\x2a\xcc\xa7\x7f\xf8\xb7\x74\x2c\x95\x63\x25\xc0\xfd\x81\x0f\xc0\x2d\x91\x9c\x3a\x2b\x2d\x02\xf7\xf0\x77\x87\x55\xa9\xd7\x89\x4f\x25\x35\xff\x64\x41\x89\xec\x75\x2f\x30\xfe\xe0\x9e\xac\x83\x90\x7e\x22\x6a\x59\xd0\x8f\x57\xaf\xa8\x8b\x92\x87\xd5\x77\x42\xc6\x24\xa2\x9e\x59\x6a\x4f\x04\x6f\xc1\x2d\x38\xf2\x2d\xb5\x7d\x8d\xa3\xb8\xe8\xa3\xe9\x76\x62\x25\xf8\x71\xed\x9f\x22\xe8\x97\x05\xdb\x6d\x85\xd1\x47\xa6\xaf\x68\x3e\x4f\x41\x59\xc1\x7e\x4d\x35\xf9\xc7\x51\xb0\x1e\x39\xa3\x1c\x0a\x24\x7c\x04\x09\x35\x63\x72\x57\xcb\xe5\xb3\xb3\x57\xaf\x8b\xbe\x65\xd8\x07\xf4\x43\xab\x28\x5b\xb8\x54\x97\xba\xbf\x2d\x8f\xed\xa5\x52\x04\xc5\x6e\x66\x62\x76\x03\x96\x0e\x60\xca\x33\x77\xfe\x68\x8e\x95\x56\xce\x57\x08\xe9\xc7\x0f\xcb\x4e\xd2\xfc\xf6\xdd\x9a\x56\xbd\x64\xab\xa3\xb2\x9d\x2f\x78\x97\xb3\xb7\xc1\xf6\x51\x8e\x1a\x98\x17\x10\xda\x4b\xfc\x5e\x46\x8f\x8a\xce\x7b\x84\xc1\x86\x52\xa6\x29\x41\x5d\x87\xdf\xcb\x29\x5a\xde\x82\x5d\xd4\x29\xa7\x51\x27\x10\x59\xb5\xb9\x20\x5c\xb8\xd9\x42\x9a\x25\x8f\x9d\x3c\xb6\xb3\xea\x95\x0a\xf9\x16\x78\x3c\xbf\x81\x48\xc9\x78\x4b\x02\x5b\xdb\x8f\xd7\x42\x8a\x34\x4f\x99\xcc\xd3\x11\x20\x88\x0d\xcd\x85\x84\x84\xd4\x5a\xce\x24\xdc\x27\xf3\xd0\x44\x98\x65\x2a\x0e\xf4\x64\x84\xbd\x92\xe3\x39\x76\x3e\xc3\xd2\xa9\x72\xee\x26\xc1\x9e\xc8\xa1\xc2\x1e\x8b\x34\x37\x4e\x60\xea\xe1\xa4\xc2\x3a\x5e\x36\x02\xf4\x3a\x89\x18\xdc\x1e\xf3\x19\x17\x89\x13\xba\x07\xec\x02\xc6\x3c\x4f\xb0\x81\x1f\x7b\xc1\x8e\xdc\xcb\x82\xa6\xb5\xea\x01\x27\x08\x1b\xe5\x74\x74\xe3\xb3\xdf\x71\x41\xc7\x3b\xd8\xd1\xb7\xa9\xec\x17\xc6\xb6\x15\xfe\xc2\xc8\x78\x6e\xb6\x55\xd0\x6b\x1b\x73\x45\xbd\xb2\xab\x32\x6a\x85\xa4\x0b\xe3\x67\xde\x8e\x65\x6f\xae\x8a\xb0\x62\xd5\x5a\x4d\x34\x18\x73\x01\x3c\x4e\x84\x84\xfd\xf1\xeb\x76\x0a\x2c\xe5\x0f\x88\x63\xd8\xea\x5c\xc8\x1a\x86\xf1\xea\x57\x59\x45\xed\xf4\xc3\xeb\xd9\x08\xc6\xd8\xa0\x11\x3f\xb8\xb2\xfb\x84\x3f\x63\x2e\x12\x88\x07\xf8\x8e\xca\x2c\x65\x5f\x63\x42\x1c\xf7\xb7\x90\x39\xb8\xa7\x32\xad\x50\xcd\xa4\x47\xab\x3c\x1e\x79\x28\x2f\x1b\x8d\x87\x5e\x7e\xc3\x05\x50\x5c\x3e\x44\x64\xfe\xf3\x3d\xc2\x03\x6e\x9a\x5c\x8f\x9d\x52\x19\x74\xd1\xca\x82\x7c\x13\x58\x76\xad\xac\x6f\x09\x58\x7c\x20\x3e\xed\x5b\x54\x82\xb1\x22\xc5\x03\x16\xe7\x3a\x34\xcc\x44\x98\xf1\xd5\x5b\x5f\x3b\x2a\x5f\xbd\x78\xb1\xa5\xfc\xf6\xfe\x91\x5e\x03\xea\xd0\xfb\xe0\xcb\x75\x41\x87\x02\xf9\x77\xca\xb1\xdb\x63\xe1\x05\x64\xec\xfc\x09\x1a\x3d\x88\xc2\x58\x21\x27\xb9\x30\x53\x36\x02\x7b\x0f\x20\x19\x3c\x50\xed\x0b\xf6\x2f\xd0\x0a\x37\xd5\x81\xb7\x74\x1e\xd4\x80\xf6\xf2\xe9\x40\x6c\x26\x8c\x50\xf2\x2f\xc2\x58\xa5\xe7\xaf\x44\x2a\x1e\x29\x4a\x1a\xc6\x72\xff\xe3\x02\x82\x2a\x89\xb1\x6b\xb1\x88\xf8\x0d\xd0\x07\x6b\x40\xdb\xa6\x55\xa4\xb8\x32\x77\x4e\x46\x3c\xba\x7b\x6f\x00\x7e\xf1\x54\x20\x1c\xd8\xf5\x1e\x50\x45\x79\xaf\x98\x00\xc9\x16\x21\xe5\xe5\x03\xc1\xa7\x06\xe5\xfb\xa9\x32\x80\x37\x90\xf9\x11\x1f\x0b\xee\x02\x61\x0a\x82\xe1\x4e\xb7\x92\x60\x18\x1f\x8f\xeb\x77\x94\x87\x1d\x25\xcf\x34\x37\x96\xa5\xdc\x46\x53\x32\x72\xa9\xb8\x10\x27\x0e\x8d\x17\xfb\x77\x81\xf2\xd6\xe6\xe5\xdd\x0d\xc1\x8c\xd6\x79\xf9\xe0\x74\xcb\x47\xfd\x3c\xf5\x51\x03\xf9\xe2\x34\x75\xdd\x38\xa9\x6f\x88\x97\xdb\x52\x6a\x1e\x7c\x8b\xa6\xe1\xf2\x17\xdc\x85\xb3\xeb\x8b\xed\x8d\x34\xfb\x28\xb8\x3b\xab\xb8\x8b\x46\xf0\x0d\x1f\x15\x8c\xa9\xfe\x4a\xdd\x12\x4e\x4d\xa3\x7b\x8c\xb3\x3b\x98\x53\x7f\xe9\xa5\x86\xbd\x1a\x12\x2f\x49\x00\xf6\xad\x75\x37\xf9\x66\xd3\x3b\xac\x77\x67\xec\xa1\xb1\x9b\x93\x22\x8c\xbe\x5b\xe8\x8e\x4f\x84\x8f\xde\xe1\xb1\xdd\x11\x9c\xc6\x1d\xcc\x77\x7b\x60\x61\xbb\xdd\x2e\x78\xdd\x87\xf6\xdd\xfd\x50\x08\x7a\xc5\x56\xef\xe6\x3d\xaa\x8e\x9d\x8d\x57\x61\x04\x20\x36\xfa\xbc\x02\xfd\xaa\x56\x26\xf7\x8d\x87\x86\x90\xd1\x9d\xe9\xa9\xc8\x90\x11\x05\x37\x41\x68\x7f\xfe\x03\x4f\x44\x5c\x4c\x41\xe7\xf7\x4a\xf6\x9c\xf8\xe4\xfe\x83\x44\x97\xc4\xb5\x0b\x05\xe6\x5a\x59\xfc\xe5\x83\x01\x88\x96\xd9\x08\x3c\x34\x85\xb7\x4f\x23\x95\x41\xc5\xab\xd2\x39\xdd\x0c\x42\xcd\xaf\x02\x94\xc2\xb0\x2b\xc9\x94\x0e\x70\xc0\x5e\xf6\x34\x11\x4d\x81\x7c\x62\x44\xae\x0f\xb4\x5c\xaf\x9c\xc3\x83\x4f\xe9\x1a\xf4\x36\x4c\xe7\xa7\x42\xf9\x80\xae\x50\xaf\xfc\x04\xa5\x5d\x2f\xaa\xf2\xe0\xfe\x16\x11\x4b\x41\x4f\xd0\x17\x13\x6d\xed\x8b\xa8\x6f\xca\x6e\x74\x97\xc6\xce\xd4\xb7\xfa\xc2\x9d\xb0\x00\x59\x13\x99\x80\x9a\x30\x37\x9a\xa1\x66\x72\xfa\x6f\x47\xc1\x71\x0f\xfe\x87\x65\x5c\x68\x33\x60\x67\xcc\x08\x39\x49\xa0\x76\xcd\x6b\x18\xd5\x69\xdc\x0c\xc2\x30\x47\x6a\x67\x3c\xf1\xba\x14\x97\x0c\xc8\x66\xe5\x66\x5f\x64\xa9\x3d\x2f\xa9\x38\xca\x53\xb8\xc0\x0e\xee\x60\x7e\xd0\x5b\x42\x9a\x83\x2b\x79\x40\xbc\x65\x09\x4d\x0a\x46\x84\xde\xb3\x03\xbc\x76\xd0\x26\x17\xde\x91\xe1\xec\x6b\x47\xab\xbf\x74\x6b\x8c\x08\x51\x1f\x7b\x0a\xeb\x35\x2d\xd1\xc7\x3a\x59\xc5\x72\x03\x24\xad\xe3\x29\x63\x10\xe4\x4c\x94\x2a\x51\x31\x95\x70\x8f\xd2\xe3\x93\x11\xfc\x9c\x26\x21\xe4\xe4\xfb\x2c\xe6\x76\xab\x70\x53\x1a\x35\x88\x1c\xbe\xa5\x49\x58\x8e\xb3\x38\xdc\x1a\x8b\x09\xcb\xb8\xe6\xa9\x19\xb0\xa1\xaf\x7b\x88\x98\x26\xc6\x55\x5b\xa2\x87\xdd\xed\x3c\x03\xf6\x9f\xec\x6d\x75\x2d\x03\xd6\xef\xf7\xd9\xed\x9b\x8b\x37\xa7\x8c\x7e\x21\x29\xdb\x2a\x36\x56\xa8\x04\xa9\x5c\xbb\x57\xcd\x40\xa2\xe2\xef\xe4\x7b\x25\xe1\xcd\xd8\x9d\x10\x6e\x61\x06\x9a\xdd\xbb\xad\x8a\x44\x0c\x85\xf5\x6a\x70\xf8\x7e\xf1\x78\x3f\xc9\x24\xe5\x0f\x37\xb9\x9e\xec\xb0\x01\x6c\x69\x13\xaa\x26\x9b\x52\x99\x44\xd4\xab\xe6\xed\x9a\x68\x0a\x71\x9e\x40\xcc\xf8\x48\xcd\xa0\x66\xb2\xad\x3f\x86\x2c\x3d\x87\xf0\xa0\xe3\x79\x23\xa3\x92\xdc\x16\xca\xea\x11\x3c\x9c\xb2\x7f\x47\xa7\x37\x67\x19\xe8\x08\xa4\xe5\x13\x58\x34\x03\xd0\x7d\x2f\x5f\xfc\xdb\xb1\xe7\x47\x6e\x46\x6f\x3d\x79\xe1\x30\xe2\x35\x7f\xf8\x5e\x96\xa6\x41\x61\xd8\x8b\x01\x3b\x5b\x78\x19\x3e\x97\x44\x79\x82\xb6\x16\x74\xe4\x57\x5e\x39\x9a\x33\xad\x72\x74\xe5\xb3\x3c\xab\x6b\xb3\x5f\xfc\xfb\xbf\x39\xa5\x8f\xa7\x59\x02\xa7\xa1\x5c\x2a\xa9\xcd\x4e\x86\xb1\x8a\x7d\xf9\xe2\xdf\x88\x7a\xba\xf3\x59\x6a\x85\x25\xcc\xb8\x03\x58\x9e\x31\x91\x52\x90\x26\x24\xf3\xb2\xee\xaa\xae\xa3\xbf\xb1\x5c\x5b\xd3\x63\xe8\xef\x2f\x84\x43\xab\x2c\x4f\x16\xb4\x7c\xd4\xc2\xe1\x9e\x80\x14\x2b\x84\x09\xa0\xa1\x8a\xbd\xfc\xf2\xc5\xbf\x2d\x9b\x53\xde\xc8\x08\xf0\x49\x7c\x02\x03\x30\x46\x4e\xb9\xbf\x13\x49\x02\x71\xef\xd1\xe5\x8f\x73\x6d\xa7\xa0\x7b\x0c\xa4\x09\xc6\x2a\xb7\xbe\x85\xb5\xe1\xec\x3a\x97\x12\x65\x04\xb2\x0e\xa3\x45\xab\x62\xe1\xf2\x1f\xeb\x18\xa1\x65\xa9\x32\x76\xf5\x92\xb7\x3f\x6e\x6e\x70\x39\x7f\x33\xde\x55\x1c\xe8\xef\x61\x86\x58\x7e\x7a\x0f\x91\xf2\xa1\x7f\x57\xe4\x50\xf6\x85\xb4\x7d\xa5\xfb\x34\xcd\x29\xb3\x3a\x7f\xdc\x6b\x50\x8e\xb4\x76\x02\x3e\x00\x19\xc8\x2b\xe7\x6d\x69\x57\xdf\xcb\xc9\xdf\xff\x3c\xc7\xea\x5e\xae\xa7\x1c\x48\x38\x3d\xcd\xd8\xf3\xd4\xd7\x2d\x6e\x0b\xc7\xc6\xbd\xdd\xdd\xfd\xbf\x96\xb1\x7b\x07\x72\xe0\xcf\x6e\x71\xda\x9d\x5c\x85\x1e\x8f\xde\x16\x6f\x2f\x8e\x2d\x71\x3e\xb2\x39\xb9\x1b\xe8\x35\x2b\x28\xd7\xd2\x09\x5f\x41\x81\x68\x1d\xa5\x43\xc6\x62\x44\x81\x3b\xe7\x66\xed\x41\x4f\x80\x1b\xbb\x0a\x14\xdd\x41\x7f\x7c\x6c\x0e\xed\x5f\x1c\x75\xa1\xd3\x49\x48\x08\xf2\xd2\xc6\x78\x4e\x88\x72\xf0\x16\xc8\xc3\x47\xa1\x68\x35\x21\xea\xa0\x38\x12\x6e\xff\xea\xf2\xd5\xfb\x0a\xa8\x09\x46\xce\x7d\x44\x6b\xff\x68\x25\xe4\xd7\x9b\x4e\x3d\xf1\x2a\x3c\x8a\xe4\xd2\x7c\x32\x52\x74\x0a\x96\x6f\x4e\xff\x58\x1c\x75\xa2\x7d\x63\xb9\x8c\xb9\x8e\xfd\x2a\x0f\x0f\x4d\x31\xe5\x80\xbd\x46\x5f\x9a\x1c\xab\x53\x36\xb5\x36\x33\xa7\x27\x27\x13\x61\x07\x77\xff\x61\x06\x42\x9d\x44\x2a\x4d\x73\x29\xec\xfc\x04\x1d\x68\x62\x94\x5b\xa5\xcd\x49\x0c\x33\x48\x4e\x8c\x98\xf4\xb9\x8e\xa6\xc2\x42\x64\x73\x0d\x27\x3c\x13\xfd\x52\x66\x36\x83\x34\xfe\x6d\x78\xd1\x7b\x16\x8c\x6b\x67\x08\xad\x4b\x7a\x06\xfd\x5c\xde\x49\x75\x2f\xfb\xa8\xc9\x9a\x9d\x4e\xd3\x76\x51\x0c\x61\x2c\xc0\x7b\x97\xc0\x85\x4c\xc5\xef\x7d\x13\xdc\xc7\xf4\xb9\x8c\xfb\xe4\x74\x7c\xcf\x7b\xb1\x8f\x6d\xb7\x5f\x06\x06\x6c\x13\x8b\x4e\x63\x3f\x6d\x88\x47\x56\xcc\x60\x2f\x27\x76\x18\xb5\xed\x7e\x13\x42\x49\xe3\x5c\xd3\x8e\x57\xbc\xd9\xc1\x37\x93\xf2\x39\xca\x3a\xf8\x6e\xa6\x88\x95\x4b\x15\x83\xb7\x7c\xce\x50\xb5\xbf\x71\xcc\xfc\xd6\x89\xc2\xde\xc7\x8d\x76\xdf\xb9\xb1\x90\x12\x71\xa2\xe7\x93\x39\xb3\x7a\x4e\x8e\x71\x7d\xe7\x94\x4f\xef\xb9\x76\x12\xff\x1d\xde\x67\x8c\x8a\x04\x8a\x3e\x25\x5c\x83\xdc\x15\x6c\x78\x9c\x65\xca\x08\x7c\xb7\xe7\x79\xbb\x59\xe6\xf6\x67\x97\x15\x37\xdd\x57\xbf\xdf\x65\xeb\xc6\xd8\x60\x61\x47\x2b\x7b\x3d\x82\x62\x5c\x8d\xfd\xf7\xdb\x73\x68\x82\xe2\xea\xc4\x92\x48\x49\x63\x35\x17\xeb\xb3\x9b\x56\x8f\x3d\x5d\x21\xfb\xfb\x1b\x18\x62\xd0\xd9\x5e\x40\x61\xcb\x31\x58\x81\x29\x22\x5a\x06\x50\x57\x01\x43\xc9\x4f\x21\x96\xd0\x11\xae\x3d\x4d\xab\x7b\xc0\x88\x35\x82\x13\x3d\x0d\x63\xd0\x1a\xe2\x0b\x94\x3e\x6f\x8a\xef\xba\x9a\x48\x55\xfc\x7c\xf9\x00\x51\xbe\x6d\x8e\xf8\xf2\x58\xb2\xe5\x05\x83\x88\x0f\x3b\xa1\x45\xb8\xa3\x1b\x2e\x78\xf9\x43\x21\xd8\xbd\x20\x62\xb8\x15\x66\x4c\x99\x64\xc5\x46\x40\xc5\xf1\x59\xa0\x70\xe1\x1e\x46\x16\x47\x49\x11\xc2\x22\xb9\x89\xa6\x4a\x19\x77\xca\x71\x3f\x71\xde\x99\x50\xe4\xf3\xc3\xb4\x16\xcd\x52\x47\x63\x42\x7a\x4b\x39\x3d\x19\x6a\xcb\xc7\x84\x21\x15\xbc\x80\x60\xf0\x52\xb9\x69\xd0\xf0\xe8\xfe\x98\xa0\xd4\x64\x2c\x33\x79\xea\x26\xbd\x07\x31\x99\x5a\xd3\x63\x62\x00\x03\xc4\x1a\xe0\xd1\xb4\x32\x6d\x0a\x60\x6b\xfd\x51\xaa\xa8\x56\xb5\x12\x1f\x15\xf9\x0e\x3e\x41\xa7\x57\xf0\x98\xc5\xbd\x5c\x09\xae\x1e\x03\x1b\x0d\x8e\x7b\xac\x4c\x21\x77\x6b\x1c\xcd\x99\xb0\xe0\x68\x36\xea\x22\x5a\xe5\x13\xfa\x12\x08\x31\x9d\xb8\xae\x22\x19\x04\xbd\xa8\x31\xea\x8c\x07\xf4\x71\x07\x6e\xdf\x70\xe5\x79\xea\xf4\xc5\x82\xa8\xa3\x59\x3d\xb4\xd4\x51\x5a\x83\xc9\x14\x69\x9b\x8b\x06\xf7\xff\x5d\x3c\x74\x64\x8e\x4b\x60\x4e\xc5\x64\x1a\x60\xc9\x3d\x23\xa8\xef\xc1\xee\x67\x8f\x35\xf2\xa5\xd0\xd8\xd3\xa3\x42\xa3\xee\xdb\x0e\x99\x14\x25\x56\x55\xf6\xdf\x82\x4e\x0b\x28\x22\x8a\x20\xc9\xf0\x76\xee\xd0\xca\xc6\xe3\x18\x7b\xc1\x8e\x10\xc9\x84\x3d\x34\x88\xf0\x7d\x95\x1d\x0f\xd8\x19\x93\x79\x71\xe6\x36\xbd\x40\xaa\x62\x7e\x3f\x91\x7b\xa9\x51\xe5\x5c\x7b\x7e\x71\x23\x72\x47\x63\x3f\x4f\x79\x75\xf4\x3d\x04\xe0\xf1\x82\x89\x9b\x26\x21\x58\xef\x39\x41\x33\xd2\x1d\xe6\x08\x5f\xb1\xff\x1c\x4b\x01\x16\x78\x5c\xcb\x28\x0a\xd0\x69\xaf\x2a\x3d\x15\x07\xb2\x7e\x8a\x09\x16\xfb\x62\x05\x6b\x07\x33\x58\x4b\x70\x65\x8d\x22\x74\x56\x8f\xc5\x30\x96\x90\x5f\x55\x83\x76\x8d\xc8\x8f\xe6\x78\x75\xc7\xe0\xa5\xf5\xa3\x29\xa5\x2b\x47\x23\x9a\x57\x8e\x8d\x88\xf7\xf4\x02\x7b\x56\x8f\x96\xd0\x96\x46\x73\xd2\x56\x8e\xdd\x43\x83\xd6\xcd\xb3\x47\xc0\xd0\xea\xd1\xd6\xd9\xa4\xb1\x47\x70\xd1\xea\xb1\x24\xa2\xbe\x9f\x58\xa3\xd5\x63\x6f\x23\xe9\xea\xb1\x6f\x5c\xd2\xea\xb1\x90\xc4\xf8\x9e\x82\x94\x7a\xf5\x08\x25\xf6\xad\xa5\x73\xfc\xaa\x11\x3f\x29\x47\xcb\x20\xde\x2f\xb2\x69\xf5\x58\x14\x00\x3f\x91\x28\xa7\x15\x53\x7d\x6b\xdd\x34\xaf\xd6\x3e\x4c\xd9\xeb\x21\x4e\xc7\x2b\x14\x3d\x9f\x3a\x13\xec\xcc\x18\x51\x9d\x69\xc0\x82\x03\x18\xf6\x15\xec\x30\x1f\x26\xb0\x6a\xf5\x68\x8f\x71\xd2\x68\x89\x7d\xd2\x68\x0d\xb9\x51\xe0\xf9\x86\xec\xc2\x1f\x51\xd6\x21\xcb\x74\x27\xeb\x74\xb2\xce\x0e\xa3\x93\x75\xb6\x1d\x9d\xac\xb3\x6e\x74\xb2\xce\x8a\xd1\xc9\x3a\x9d\xac\xd3\x68\x3c\x3d\x59\x87\x2c\x55\xad\x19\xcc\xfe\x4a\x06\xd7\x45\x0b\x19\x4a\x53\x21\xa4\xa7\x6e\x2a\x73\xbc\xff\xc6\x93\xd8\x5b\x34\xaf\xf9\x48\x75\xcd\xe5\x04\xd8\xcb\xfe\xcb\x17\x5b\xa6\x03\xae\x1e\x4d\x82\x76\xaa\x63\xd7\xd4\xc1\xc5\xb1\xce\x23\xf1\xde\xbc\x4b\xfe\xa4\x16\x0e\x8f\x9a\x84\xb9\xc6\x41\x54\xd4\xbb\x4a\xc1\x32\x6e\x6b\x06\x71\x91\x42\xe1\x10\xad\xa5\x20\x97\x31\xbd\x4a\x7a\x7f\x87\xdb\xd4\xc1\x7e\x2b\x88\x80\x53\x1c\xfb\x08\x8a\x55\xa8\x14\x28\xc1\x34\x1c\x7a\xb7\x04\x08\xb0\x62\x47\x30\x98\x0c\x58\x4c\xc9\xda\x5c\xfa\x98\xb1\xe3\x5e\xd5\x3d\x9e\x3a\xe2\xaa\xf1\x3f\x6e\xd9\xde\x3f\x0e\x33\x90\x36\xe7\x49\x32\x67\x30\x13\x91\x2d\xbe\x0f\x03\x02\x85\x25\x67\x67\x13\x57\x4a\x03\xf1\xb0\xa9\x48\xd8\x5f\x3a\x5b\xbb\xf9\xab\xc3\x68\x2e\xbb\x2d\xad\x63\x7f\x7a\xb3\x20\x97\x10\x84\x06\x6b\xd5\x2a\xeb\xde\x46\xfe\x4a\xfc\x27\x22\xf8\x9b\xb7\xfb\xba\xc7\x58\x4b\x3c\xa1\x31\x1f\x58\x54\xa0\xf2\x24\x71\xe8\x4d\x1e\xb3\x65\x10\xac\xf0\x64\xad\xc8\xb6\x21\x37\x6b\x5a\xc9\xba\xc1\x7b\x6e\x55\xa6\x12\x35\x99\x57\x77\x90\x7a\xb5\x54\xca\xdb\x70\x66\xf2\x91\x17\x01\xdd\x21\xba\x5e\xd8\xf2\xce\x17\xb2\x76\x74\xbe\x90\xa5\xd1\xd9\x07\x16\x47\x67\x1f\xd8\x61\x74\xf6\x81\x15\xa3\xb3\x0f\x2c\x8f\xce\x3e\xd0\xd9\x07\x9a\x8c\xe7\x6f\x1f\x60\x9d\x2f\x64\xdd\xe8\x64\x9d\x72\x74\xb2\xce\xf6\xa3\x93\x75\x96\x47\x27\xeb\x74\xb2\x4e\x27\xeb\x74\xb2\xce\xbe\xa3\x01\x72\x67\x2a\x6e\x3d\x45\x26\x53\xf1\x86\x0c\x19\xb2\x57\x47\xaa\x9f\xa8\xa8\xa8\x2c\xe2\x1e\xf1\x9e\x0f\xc3\x53\x32\xa1\xf7\xd8\xbf\x94\x04\x4a\x4f\xa0\x92\xb5\x29\x30\x85\xed\x21\x32\x15\x1f\x99\xe3\x3d\x02\xcf\xbb\x0c\x9b\x2e\xc3\xe6\x57\x90\x61\x33\xe5\xc6\x17\x3e\x42\xd2\xba\x3e\xe1\xa6\x72\xfc\x6f\x41\xa7\xbf\xda\x7c\x1b\x87\x70\x1e\x61\xb0\x7b\x5c\x89\x14\x04\xbb\xd8\xfb\x76\x21\x1e\xd6\x21\xe6\xf5\x32\x6a\xbe\x13\xc7\x10\xb3\x0c\x74\x9f\x90\x4c\xb1\xb1\xf0\xf5\xbf\x16\xf0\xd7\x43\xf8\x13\xcf\x9b\xa9\x43\xe2\x93\x4e\x9e\xa9\x7f\x4a\x6b\xbe\xa9\xaa\x8b\xae\xc6\x15\x3f\xb9\x54\x9a\x76\xb4\xd2\x3e\xb3\xde\x9d\xf6\x5d\x23\xbd\xb4\x2d\x25\x12\x95\xbc\x9b\x9d\xca\x1c\xaf\x1f\x2b\x8b\xd3\xfe\x33\x07\x3d\x67\x6a\x06\xba\x54\x8c\x8a\xbe\x3d\xbd\xa2\xc9\x4c\xc4\x7d\x01\xe4\x76\x0c\x3c\xad\x98\x22\xda\xd4\xd4\xdb\xf6\x1a\xb2\x27\x56\xfd\x78\xfd\x68\x57\x71\x68\x51\x6d\xf8\xd4\x6a\x29\xaf\x1f\xad\x9a\xdf\x58\xcb\x26\x38\xd6\xa2\x19\x8e\xb5\x6b\x8a\x63\xad\x9b\xe3\x58\x9b\x26\x39\xf6\xc1\x2b\x40\xaf\x1f\x2d\x9b\x8f\x58\xeb\x56\x3a\xf6\x09\xd6\x93\x5e\x3f\xde\x03\xb8\xdb\xb4\xd8\xb1\xae\x3a\x75\xe3\xd1\xb6\x41\x8d\xb5\x6d\x54\x63\x6d\xe3\xe1\x5e\x55\xb0\xd7\x8f\xae\x3e\xf6\x7b\x90\xd3\x5a\x13\x22\x9a\xd6\xd4\x7e\x6c\xa1\x2d\xe0\x64\xd1\xd5\xf7\x43\x29\x40\xc4\xa5\xcb\x56\xb2\xee\xdd\x95\x5e\x5d\x18\xaa\x59\x6d\x79\x1a\xe2\x56\x11\xa3\xf1\xf7\x38\x18\xbc\x72\x59\x29\x1e\x57\x99\x6c\xa9\x75\x4c\x69\x3a\x2b\x9a\xc7\x38\xa5\xa0\x6c\x3a\x55\x79\x18\xef\x1d\x50\x38\x69\x29\x4d\xc8\x78\x31\xc0\xb4\x7c\x02\xf5\x0b\x6a\x74\x7b\x10\xec\xd8\x87\xa6\xbc\xe3\x60\x50\xed\x89\xeb\x67\x3c\xfa\xef\xff\x39\xae\x55\x6f\x29\x27\xf4\x54\xb9\x38\x3b\x23\xb0\xbc\x9f\xc0\x0c\x12\x5c\x47\x68\xb8\x3c\x55\x68\x31\xa6\xb2\xa7\x15\x83\xd4\xf5\xe2\x8e\xb2\x31\x70\x9b\x6b\xac\x20\x0a\x92\x8f\x92\xe6\x67\xa5\x53\x30\x3b\x05\x73\xbb\xd1\x29\x98\x6b\x47\xa7\x60\x36\x18\x9d\x82\xb9\xdd\xe8\x14\xcc\xf5\xa3\x53\x30\x3b\x05\x73\x8f\xd1\x29\x98\x9d\x82\xb9\xef\xf8\x15\x2b\x98\xed\x06\x4e\x57\xd5\x3d\x1f\x87\x82\xf2\xa3\xe5\x56\x44\x65\x50\x75\xb8\x8b\xfe\xd5\xae\x9a\x59\x55\x21\x57\x2b\x99\x55\x45\x74\x49\xd1\x1e\x3c\xa2\x51\x16\x3a\xe7\xd2\x93\x1b\x95\xcd\xe7\x16\x1b\xde\x1a\x22\x56\x9c\xce\xad\x62\xe2\x6d\x08\x5d\x2b\x5b\xbb\x17\x71\x6d\x31\x3b\x0a\xde\x7e\x6c\xd5\x22\x95\xad\x5f\x94\x56\xf4\xcb\x3b\x0a\xff\x3f\x86\xed\xd4\x2a\x06\xd4\x9c\xd4\x45\x94\x5c\x11\x81\x55\x22\x8f\xa3\x8e\xa0\x6b\x6b\xc0\xd6\xb8\x63\x21\x29\x96\x32\xb4\x15\x52\x32\x84\x65\x11\x39\x45\x02\x18\xd0\x9c\x24\x5f\x5c\x0f\x8a\xbf\x25\xec\x2a\x71\x44\x1c\xcf\x18\x97\x3e\xdd\x56\xc9\xd0\xf7\x9e\x7a\xd9\x97\xe2\x72\xd1\xad\xa5\x78\xfb\x80\x5d\x22\xd2\x57\x27\x16\x06\xe1\xc3\xa9\xc3\x4a\x3b\x26\x8a\xa7\x55\x1a\xe2\x7e\xe7\xd2\x10\x0b\x31\x29\x5d\x65\x88\xae\x32\x44\xa3\xca\x10\x78\x91\x0e\x77\xeb\x25\x22\xd8\x5f\x7d\x03\x26\x0d\x08\xaa\x34\x4f\xac\xc8\xca\x18\x6f\x43\xaf\x4a\x48\x91\x18\xfb\x58\xd3\x3a\xbe\xbb\xb7\xf1\x68\xba\x88\xf7\x38\x1f\xc6\x84\x1b\x24\x27\x3e\x9e\x13\xdb\x25\x61\x4d\x83\xa0\x75\x50\xd0\xaa\xf8\xf4\x63\x11\x2f\x90\x60\x9b\x52\x69\xa6\x6e\x5e\x8e\xce\x27\x0e\x25\x1c\xc5\xde\xc0\x20\xaa\x2d\x33\x30\x2e\x56\xcc\x40\x96\x5c\xe2\xc8\x1c\x1f\x07\x61\xa8\x55\xee\xf5\x5e\xb8\xcf\x1f\x2b\x5c\xe2\x4f\xdb\xf0\x1f\xfc\xa0\x82\x03\x95\xe0\x2b\xf9\xcf\xa7\x1d\x74\xd9\x3c\x7e\xae\x0d\x83\x5c\x6b\x71\x73\x1f\x3d\x66\xee\xd7\x54\x5d\xe3\x49\xba\x30\x9e\x9c\xd6\xf1\x3c\xdc\x16\x5d\x4a\xea\xf6\xe3\x53\x48\x49\xfd\x48\xae\x89\x4f\x27\x33\xf5\x93\x75\x47\x7c\x2a\x99\xa9\x9d\x0b\x62\xa7\xf1\x5c\x13\x46\xeb\xa3\x45\x97\x43\xe7\x6e\x68\x59\xa6\x6a\x85\xf9\xbf\x1f\x37\x43\x2b\xf8\xd7\x6a\xfc\x5a\x17\xbb\xf6\xcc\x63\xd7\x3a\x45\xaf\x53\xf4\xea\xa3\x53\xf4\x96\x46\xa7\xe8\xed\x30\x3a\x45\x6f\xfd\xe8\x14\xbd\xe5\xd1\x29\x7a\x9d\xa2\xb7\xc5\xe8\x14\xbd\x4e\xd1\xdb\x76\xfc\xca\x14\xbd\xf6\x8a\xc6\x77\x31\x64\xed\xc7\x90\xb5\x43\x08\x5b\x20\x7f\xad\x20\x5d\x4b\x31\x63\x5d\xbc\xd8\xd3\x8e\x17\x6b\x58\x3a\x4f\x5a\xf1\x7e\xca\xe7\x55\x77\x7b\x5d\x0d\x3d\x3e\x53\x22\x66\x59\x6e\x7d\x05\xb1\xae\x8e\xde\x53\xae\xa3\x57\xdb\xd1\xae\x98\xde\x56\xc5\xf4\xd6\xc1\xac\xab\xa8\xb7\x66\x3c\x9d\x28\xb6\xae\xa2\xde\xae\xa3\xab\xa8\xb7\x7a\x74\x15\xf5\x36\x8c\xae\xa2\x5e\x57\x51\xaf\x2b\x78\xd0\x60\x74\x05\x0f\x56\x8c\xae\xe0\xc1\xfe\xa3\x2b\x78\xb0\xd5\xe8\x0a\x1e\x74\x05\x0f\xea\xa3\x73\x42\x35\x1b\x5d\xc1\x83\x86\xa3\x73\x4c\x75\x05\x0f\x1a\x4d\xd8\x55\xd4\xeb\xa2\x12\x77\x1f\x9d\x82\xd9\x29\x98\xdb\x8d\x4e\xc1\x5c\x3b\x3a\x05\xb3\xc1\xe8\x14\xcc\xed\x46\xa7\x60\xae\x1f\x9d\x82\xd9\x29\x98\x7b\x8c\x4e\xc1\xec\x14\xcc\x7d\xc7\xaf\x58\xc1\xec\x2a\xea\x3d\xf5\x68\x48\xf6\x14\x53\x9e\xba\x8a\x7a\x5d\x84\xe4\x5e\xdb\xdd\x55\xd4\x7b\x7c\xfc\xea\x2b\xea\xd5\xa2\xf5\x3e\x5e\x59\xbd\xdd\x97\xd1\xd5\xd6\xeb\x6a\xeb\x75\xb5\xf5\xba\xda\x7a\x5d\x6d\xbd\xae\xb6\xde\xf6\xe3\xe9\x3b\x33\x9e\x9c\xfe\xf1\x3c\x1c\x18\x5d\xc9\x85\xed\x47\x57\x72\x61\xed\xe8\x4a\x2e\x74\x25\x17\x3a\x67\xc4\x3e\xa3\x2b\xb9\xb0\xe3\xe8\x1c\x0f\x5d\xc9\x85\x9d\x46\x57\x5b\xaf\x8b\x62\xdb\x7e\x74\x8a\x5e\xa7\xe8\xd5\x47\xa7\xe8\x2d\x8d\x4e\xd1\xdb\x61\x74\x8a\xde\xfa\xd1\x29\x7a\xcb\xa3\x53\xf4\x3a\x45\x6f\x8b\xd1\x29\x7a\x9d\xa2\xb7\xed\xf8\x95\x29\x7a\x5d\x6d\xbd\xa7\x1c\x4d\xd6\xd5\xd6\x5b\x31\xba\xc8\xb1\xa7\x1d\x39\xb6\x27\xae\xf0\xdc\xaa\x54\xe5\xd2\xde\x80\x9e\x89\x08\xce\xa2\xc8\xfd\x75\xab\xee\x60\xc7\x68\xa5\xba\x16\xba\x61\x5a\x26\x64\x2c\x22\xd4\x23\xef\xa7\x80\xa5\xf1\x9c\x78\x8b\xf7\x31\x4e\x37\x32\x8b\x77\x96\xe8\x85\xeb\x74\x34\x0d\x43\x78\x70\xea\x5d\xe1\x45\x10\x1a\x29\x95\x00\x97\x3b\x3c\xe9\x99\x21\xe8\x1d\x4f\x73\x0d\x20\xaf\x3c\x25\x2e\x27\x63\x23\x48\x94\x9c\xf8\x88\x21\x7f\x02\x06\xec\xbc\xbc\x21\xe2\x12\x0f\x4f\xae\x35\x48\x9b\xcc\x11\x0e\x58\xa4\x0b\x95\x86\x54\xcd\x20\x46\x8a\x8d\x81\x4a\x24\x46\x72\xcb\x12\xe0\xee\x5d\x12\xca\x97\xb9\xc3\xc3\xd9\x10\xe7\xa7\x49\x47\xe0\x83\xa7\xf6\x02\xe2\xee\xb4\x71\x2f\x6a\xb8\x60\xd8\xf0\x52\x13\xb2\xa5\x08\xd5\xa3\xca\x17\xe2\xd1\x9c\xab\x9c\xdd\x73\x12\x94\x74\x2e\xf1\x30\xe3\xa7\x3b\xd0\xee\xf8\xf2\x06\x22\xc9\xfe\xd6\x87\x3e\x52\xb5\x1d\x1f\x6b\x62\x0d\xe0\x7a\xb2\x17\x93\xaa\x6d\xcd\xe1\x99\x9e\xe4\x24\x11\x7a\x54\x06\x69\xf5\x1c\x23\xfa\x48\xa4\x88\x55\x74\xe7\xd0\x30\xe5\x13\x38\x3c\x34\xec\xfc\xf5\x85\xa3\x7d\xb9\x71\xa4\xda\x97\x09\xf4\xb4\x30\xd3\x6a\x26\x62\x87\xd9\x3f\x70\x2d\xf8\x28\x71\x32\xe7\x18\x34\x48\x27\x12\x7c\x76\xf4\xc3\xd9\xdb\x9f\xaf\xcf\x5e\x5f\x1e\xa3\xf4\x09\x0f\x19\x97\xee\x48\xe4\xa6\x8c\x43\xf5\x38\xe1\x5e\x04\x72\x26\xb4\x92\x6e\x71\xa8\xa7\x71\x36\x0b\xb3\x46\xc5\x49\xd0\x60\x54\x32\x83\x98\x64\xe4\xe2\x6d\x81\xe5\x08\x99\xe5\x36\xe8\x8d\x18\x1d\xe9\x4e\x8f\x8c\xa6\x5c\x4e\xdc\x3a\x2f\x54\xee\xe6\xfb\xec\x33\x5c\x91\x86\x38\x8f\x48\x6a\xe2\x01\x65\x3f\xeb\x05\x36\xe1\x08\xbd\xa1\x9a\x8e\x26\xe2\x59\x58\x73\xf5\xb3\xcc\x5c\x5a\xfe\x70\x4a\xe1\x81\x07\x9f\x55\x2e\x1d\x84\x7a\x98\xca\xbd\x82\x98\x0d\xad\x2a\xc1\x52\x8c\x09\x3b\xa8\xde\x3d\x60\x97\xee\x1d\x10\x57\x01\x48\xd1\x9d\x30\x03\x8d\x5a\xa7\x07\x5f\x8f\x69\x98\x70\x1d\x27\x60\x30\xae\x31\x10\x66\xd2\x0c\x3c\xc0\xa0\xd0\x69\xa5\xb2\xab\x28\x09\x7b\xad\x30\xc6\x71\xac\x4e\xd9\xd4\xda\xcc\x9c\x9e\x9c\xdc\xe5\x23\xd0\x12\x2c\x98\x81\x50\x27\xb1\x8a\xcc\x89\xe5\xe6\xce\x9c\x08\xe9\x4e\x56\x3f\xe6\x96\xf7\x2b\x47\xfa\x84\xd8\x76\x3f\x52\x69\xca\x65\xdc\xe7\x1e\xb5\xfa\xc5\xb6\x9e\xfc\xd6\x33\xd4\x3e\x2f\xee\x12\xb2\xcf\xfb\x66\x0a\x49\x72\xb8\x07\x32\x37\x13\xf8\x1a\x08\x7a\x8d\x04\x3c\xff\xed\xcd\x4f\xef\x65\x71\x58\x09\x06\x03\x76\xad\xac\x0f\xbf\xf5\x91\xde\x48\x44\x11\xbe\xab\xcf\xf3\xe5\xf5\xed\xdb\xbf\x0d\xdf\x5c\x5d\xdf\x76\xc7\xba\x3b\xd6\xdd\xb1\x6e\x70\xac\x41\xce\x1a\x1f\xe9\x20\x6d\x56\x8e\x49\xb1\xdf\xc8\xa3\x0d\xd8\x70\x0c\x8a\x0d\x68\x2c\x1b\xd2\xf8\x68\x50\xaf\x41\xe0\x52\xce\x7e\xe0\x75\xd3\xba\x5c\x09\x0e\xe6\x6f\x20\x11\xb9\x90\xbe\x9b\xc4\xde\x37\x30\x63\x35\xf5\x5b\xed\x25\x3f\xd2\x68\xee\x53\x72\xaf\xde\xdf\xc4\x50\xdb\xbe\x6b\x9e\x96\xf5\xb5\x57\xec\xda\x80\xbd\x0e\x0a\x0f\x3b\xff\xf9\xea\xe2\xf2\xfa\xf6\xea\x9b\xab\xcb\xb7\xfb\x6b\xd0\x2d\xd8\x5a\xd0\x9a\xd0\x12\x00\x0e\xf7\xe4\x92\x99\x86\x99\x50\xb9\x49\xe6\x85\xfd\x63\x35\x11\x58\x3c\xfd\xde\xe1\x3b\x2f\x34\xf1\x95\x8f\x75\xcc\xb6\x5d\x66\x7b\x01\x63\x9e\x27\xa4\x37\x1d\x1c\x0c\xf6\xe1\x72\x34\xda\x42\xdf\x6f\xb4\x6a\x50\x3f\xba\x86\xc2\x37\x54\x79\x7e\xac\xf4\xda\x63\x7c\xe8\xc3\x0e\x6a\xac\xc7\x0b\x8f\x64\x9b\xf3\xd2\x23\x79\xc7\x1a\x42\xa7\xa1\x7b\xa1\x1d\xa7\x7b\xa4\xe4\x58\x4c\x5e\xf3\xec\x3b\x98\xbf\x85\x71\x33\x03\x71\x1d\xde\x68\x77\xf4\x3e\x64\xb4\x52\x3a\x76\x46\x2f\x6b\xe6\x9f\x69\xcd\x3b\xd3\x56\x58\x46\xf3\x90\x8c\xf6\x22\x28\x5a\x89\x9e\x58\xaa\xe6\x4f\x16\x68\x6f\x4b\x6e\x2b\xb8\xa6\x15\x97\x7d\x33\x2e\x1f\x46\x9d\xd9\x55\xd9\xbd\xa7\xb3\x76\x5b\xb5\x23\x52\x32\x82\xcc\x9a\x13\x35\x73\x9c\x0b\xee\x4f\xee\x95\xbe\x73\x7a\x84\x53\x5c\xfb\x84\xb5\xe6\x04\xbd\x05\x27\xbf\x25\xff\xd7\xed\x9b\x8b\x37\xa7\xec\x2c\x8e\x7d\x6b\x96\xdc\xc0\x38\x4f\x7c\x33\x84\x01\xe3\x99\xf8\x01\xb4\x11\x4a\xf6\xd8\x9d\x90\x71\x8f\xe5\x22\xfe\x7a\x7f\xe2\x1c\x46\x8b\xbb\xa0\x32\xf2\x71\xb6\xbc\x13\x37\xe8\x5d\x99\xd7\x78\x57\x41\x44\x1c\xd7\x12\xd6\x20\x6e\x06\x7b\xb3\x17\x32\x5a\x02\xcd\xee\xc6\xf9\xc5\x81\x5b\xd8\x2e\x5d\x3d\x2c\x09\x2b\xf9\x36\x3d\xa2\x66\x2a\x3e\x65\x26\xcf\x32\xa5\xad\x61\x29\x58\xee\x94\xde\x81\xc3\xb0\x5e\xfd\x4f\xf4\x52\xf5\xd8\xdf\x8b\x1f\xd1\xd5\x64\xde\x1d\x1e\xfe\xf1\xbb\xcb\xbf\xfd\xe9\xf0\xf0\xa7\xbf\x57\xaf\x22\x2b\xa4\xf0\x9f\xfa\x2d\x26\x83\x68\x20\x55\x0c\xd7\xf8\x0e\xfc\xd3\xd4\x1c\x2c\xfe\x82\xe5\x36\x37\x83\xa9\x32\xf6\x6a\x58\xfc\x99\xa9\x78\xf1\x2f\xd3\x40\xe2\x60\x4f\x93\x31\xe0\x16\x0d\xb9\x9d\x3e\x11\xf6\x50\xd2\x92\x96\x8f\xaa\x9f\xb5\xda\x02\x28\xe5\xf8\xcf\x6f\x02\x08\x9c\xf4\x74\xaf\x85\xb5\xe8\x74\xf3\x69\xe6\x6a\xdc\x73\xa7\xb6\x14\x3b\x67\x2f\x0f\x9e\x14\x83\x29\x76\xb0\x65\x80\x21\x44\x3c\xb4\xe8\x20\x17\x0c\x76\xd9\xb9\x7c\x36\xbc\x62\x33\x82\xf0\x93\x01\x4e\x48\x1d\xfe\xe6\xbd\xd2\xb8\xa2\x65\x94\x07\x55\xa1\x21\x9e\x52\x34\x50\x91\xc0\xcc\x12\x91\x0a\x1f\x64\xe8\xdb\x4b\x19\x76\x44\x3f\x0e\xa2\x2c\xef\xf9\x1b\x06\x29\xa4\x4a\xcf\x8b\x3f\x21\x9b\x42\xea\x34\xad\xbe\xb1\x4a\xf3\x09\xf4\x8a\xc7\xe9\xb1\xe2\x2f\x7a\xb0\xf6\x82\xe5\xa7\x49\x15\x2e\x9d\xa4\x9e\x22\x43\xfc\xfc\x68\x5b\x00\xfd\x13\x21\x6d\x05\x66\x5c\xbf\x07\x91\xb0\xb0\xc4\x91\xc0\x59\x40\x11\xf5\xc9\x99\x4a\xf2\x14\x4c\xaf\x10\x83\xc8\x1a\x20\x67\x4e\xb3\x34\x4f\x4a\x50\x8b\xc5\x4c\x98\x36\xe2\x87\x57\xc8\x69\xc2\x87\xe2\xab\xdc\x66\xb9\xf5\xb5\x6c\x2a\x6d\xe9\x94\x41\xbb\x45\x51\x70\xa0\x46\xf6\x5f\x36\x2d\xb8\xc5\x58\xc6\xad\x05\x2d\x4f\xd9\x7f\x1d\xfd\xf8\xf9\x2f\xfd\xe3\xaf\x8f\x8e\xde\xbd\xe8\xff\xe1\xa7\xcf\x8f\x7e\x1c\xe0\x3f\x7e\x77\xfc\xf5\xf1\x2f\xe1\x8f\xcf\x8f\x8f\x8f\x8e\xde\x7d\xf7\xfa\xdb\xdb\xe1\xe5\x4f\xe2\xf8\x97\x77\x32\x4f\xef\xe8\xaf\x5f\x8e\xde\xc1\xe5\x4f\x5b\x4e\x72\x7c\xfc\xf5\x67\x8d\x97\xce\xe5\xfc\x4d\x43\x02\x4a\xa3\xdf\x5a\x29\xa2\xc5\x19\x5b\x0a\xb0\x7e\xe8\x97\x4a\x53\x5f\x48\xdb\x57\xba\x4f\x53\x9f\x32\xab\xf3\x66\xc4\xa4\x64\x4a\x6d\x9f\xff\xd0\x7b\xec\xb4\x64\x48\x05\xbb\x7e\x32\x07\xdc\x40\xa4\xc1\x7e\x08\x4b\x0e\xbd\x29\xc8\x29\x0b\xc1\x8e\xcf\x8d\xcf\xfd\x1a\x8c\x3b\x45\xb0\x20\xee\x6b\x29\x89\x8e\xb5\x4a\x07\xac\xe2\xde\x98\x61\xa6\x87\xbf\xef\x0e\x1a\x58\x41\xc3\xe8\x8c\x41\x9d\x31\x68\xcd\x78\xd4\x18\x74\x43\x78\xf8\x64\x2d\x41\x20\x67\xfb\xba\x30\x56\x7a\xd0\x83\xae\x63\x15\xcb\x54\x96\x27\xdc\xae\xf1\x8c\xad\x70\xa7\xfb\xa3\x5e\x46\x22\x97\x91\x34\xc4\xd0\xd2\xd5\x3e\x4c\x76\x96\x24\x4c\x48\x3a\xf8\x38\x41\x70\x98\x69\x20\xd5\x86\x71\xf2\x67\xcf\xdc\x12\xee\x7d\xc9\xba\x6a\xb8\xa7\x61\xc6\x72\x6d\x31\xea\x18\x4b\xda\x11\x2b\xf1\xde\x27\x21\xcb\xc2\x76\x85\x70\x58\x24\x81\xac\xec\xeb\x99\x70\x63\xc3\xb2\x71\x35\x96\xdf\xa1\xb7\x31\x82\x18\x64\x04\x98\x91\x96\x43\xf9\xad\x23\xa7\xb7\xb1\x4b\x39\xa3\x39\x38\x8b\x73\x0a\x06\x21\xf2\xb7\x7a\x8e\xe7\x15\x80\xe0\x10\xf1\x26\xb4\x5f\x2e\xe2\x10\x90\xea\x17\x1a\x76\x91\xd8\x57\x58\x59\xcd\xc7\x89\x3c\x68\xce\x33\x0b\xcf\x56\x23\x61\x68\x89\x59\x96\xe6\xe7\x3a\x93\x7c\x0e\xce\xc0\xe6\xec\xf3\x57\xc7\x3a\x5b\x62\x9b\xed\xb0\xcc\x1d\x7c\x27\x6d\xb2\xc9\x36\x9c\x25\x99\x86\xb1\x78\x68\xe9\x9c\x9e\xc9\xd2\x12\x23\x62\x90\x56\x8c\x05\x75\xec\xcf\x34\x64\x20\xe3\xa2\x28\x2a\x66\x85\xcb\x3a\x6c\x9e\x64\x30\x0f\x09\xdc\xed\x92\xb2\x9b\x55\xc2\x7e\x47\xc7\x58\x47\xc7\xf6\x1e\x1f\x88\x8e\x79\xcc\x7d\x3a\x44\x0c\x23\xcf\x9b\x87\xbe\x5f\x54\xe2\xd8\x11\x8b\x77\xc6\xb2\x32\xa1\xeb\x04\x67\x31\x0b\xd5\x83\x0a\xba\x68\x15\x45\xae\xb1\xa9\x98\x38\xb0\x52\x45\x21\x12\x9a\x58\xca\x25\x9f\x50\x56\xb7\x55\xc1\x4e\xeb\xb4\x2c\x87\xc4\x5a\xc4\x35\xe1\x9e\x5e\x23\x24\x73\x88\x9d\x28\x1e\xe3\x45\xad\x92\x04\xb4\x61\x89\xb8\x03\x76\x01\x59\xa2\xe6\x3e\x49\x5b\xc6\xec\xc6\x72\xeb\x50\xfa\x06\xec\x7e\x3e\xdf\x46\xe8\x8a\x2b\x1e\xe6\x49\x32\x54\x89\x88\xf6\xb2\xa8\xd4\xb7\xed\x0a\xf7\x2b\xcb\x93\x84\x65\x38\xe5\x80\xbd\x91\x48\x31\xce\x92\x7b\x3e\x37\x3d\x76\x0d\x33\xd0\x3d\x76\x35\xbe\x56\x76\x48\xa2\x77\x3d\xda\x8e\x6e\x64\x62\xcc\x4e\xb1\xa6\x8d\x65\x96\x4f\x50\x71\x0a\x3e\xc0\x9e\x83\x7f\x75\x02\x22\x0e\xf7\xc2\xac\xd4\x54\x1a\x23\xce\x6f\x71\x26\x47\xa8\xe8\xef\x0f\xbe\x4d\x89\x18\x43\x34\x8f\x92\xe6\xe7\xea\x2c\xc2\xe8\x85\x32\xcf\xbc\x82\xdf\xbe\x4c\xbb\x4f\xed\x44\x15\x50\x48\x46\xf5\xd3\xa9\x30\x7c\x89\xea\xc5\x8a\x48\xd5\x35\xad\x6a\x88\x7b\x73\xce\xa6\x3c\x33\x53\xc6\xde\x38\xf5\xbc\x95\x2a\xeb\x87\xc3\x30\x1d\xc3\x5a\xd2\x49\x02\x31\x13\x69\x0a\xb1\x53\xe1\x93\x39\xe3\x63\x8b\x29\xb6\x35\xf3\x40\xa4\x81\xb0\xd6\xd7\x2e\x99\x72\x19\x27\xa0\xd9\x98\x8b\xc4\x1b\x03\x6a\xf7\x5b\xd0\xa9\x90\x68\x13\x20\x77\x2c\xda\x17\xdc\x5f\x51\xa4\x74\xa8\x7b\x2f\xac\x09\x97\xca\x83\x89\x4c\xa4\x82\x00\x8b\x7e\x65\x36\x4a\x54\x74\x67\x58\x2e\xad\x48\x68\x31\x4a\xdd\xb1\x48\xa5\x59\x82\x47\xa7\xc1\xc9\x2a\xfe\xd9\x2f\x50\xa9\xef\x66\x37\x27\xbf\x2d\x2f\xe1\x0f\xfb\x72\xf3\x16\xa4\xb0\x36\x64\x30\x78\x80\xa8\xb5\xf4\x7e\x47\x4b\xdd\x2e\xa3\xbf\x5f\xc9\x42\x14\x1b\x2b\xc7\xc0\xdc\x5e\x97\x89\xd9\x05\xb9\x1c\xb0\xcb\x07\x88\x2a\x55\x28\xb0\x3f\x04\x12\x02\xcc\x0a\xe5\x77\xf0\x8c\xca\xde\x35\x48\xbe\xab\x8e\x1a\xd8\xcf\x69\xce\x50\x35\xcb\xbf\x82\x25\x42\x22\x59\xf4\x09\x79\x4c\x48\xe3\x04\x82\xda\x19\xa2\x13\xeb\x05\x5d\x16\x0b\x8d\x35\x13\xe6\x45\xf0\x75\x98\x0b\xcb\x11\x28\x65\xd9\xd1\xe1\xc9\xe1\xf1\x92\xcd\xf2\xd0\x09\x2e\x09\x10\x89\x26\x03\x66\x54\x2e\xca\x88\x34\x4b\xe6\xb8\x8e\xc3\xb8\xc7\x84\x0d\xd1\xd9\x3a\x97\x61\x55\x3e\x4b\xb0\xc7\x8c\x62\x56\xf3\x50\x8a\x85\x7e\x75\x37\x59\x9d\x7b\xe6\x70\x74\xf8\xcb\x61\x8f\x81\x8d\x8e\xd9\xbd\x92\x87\x16\x97\x3f\x60\xb7\xca\x89\xdf\xe5\x44\x73\x95\x33\x09\x94\x0c\x00\x0f\x59\x22\x22\x61\x93\x39\x12\x3a\xa6\x72\x4b\x19\xc7\xdc\x86\xec\xc4\xcb\x07\x61\x7d\x8c\x9b\x43\xdb\x17\x08\x4d\x22\x76\x8c\x3b\xe9\x68\x06\x27\x53\xe0\x89\x9d\x52\x60\x89\x54\xb2\xff\x2f\xd0\x0a\xf3\x16\xa5\xbf\xf2\xec\x4a\x04\xb6\xa2\x6d\x38\xda\xfb\x2d\xb4\xd7\x54\xe8\x2f\xb7\xb7\xc3\x6f\xc1\x2e\x90\x0c\xf7\x96\x10\xee\x83\x16\x04\xd0\x63\xa5\xd3\x27\x40\x3b\xda\x71\x70\xf6\x59\xa6\xf4\x53\x20\x61\x53\x65\x1a\xed\x25\x5b\xda\x4f\x65\x2c\x2a\x51\x5e\x88\x93\x10\xb9\x1d\xac\xc7\x9d\x84\xbe\x3b\x57\xc3\x01\xfb\x9b\xca\xdd\xd7\x8c\xf8\x28\x99\x17\x75\x1b\x0c\x58\x76\xe0\xa6\x3a\x70\xe4\xc9\x61\xc3\x5f\x80\xc7\x4e\xb3\x71\xd4\x03\xf8\xd3\xe8\xaf\xc5\xfc\x79\xf0\x6b\x6b\x97\x0f\xe4\xc6\xaa\x94\x4d\xfd\x67\xd7\xd3\x35\xfd\xc9\x18\xe0\xe9\x09\xb9\x50\x1a\x32\xa2\x70\xfe\x99\x67\x47\xbf\x96\xe8\x06\xc1\xdd\xff\x3e\xc2\x9a\x57\x51\x15\x6c\xbe\xc1\x14\x25\x13\x49\x02\x96\x43\x35\xd8\xcf\xbd\x52\x1d\x4f\xb8\x50\xe9\xde\xc9\x9f\x8b\x13\xa1\x23\xb0\x79\x7c\x58\xab\x65\x4a\xdb\x89\x35\x60\xab\x0c\xb3\x1e\x67\xc8\x68\xd3\x12\x10\xdf\x4f\x9d\xcc\x0f\x01\x80\x76\x36\x9f\xb5\x09\x81\xac\x85\x70\xf0\xe5\x60\x70\xab\x9c\xfa\x8a\xe9\x9a\x44\x5c\x91\x4c\x18\xd0\xb3\x7d\x13\xc0\xcb\xd1\xde\xa7\xab\xfd\x0d\x05\x61\xac\xc8\xad\xd6\x4c\xe6\xe9\x08\x74\x99\xcd\xa2\xed\x32\x40\x2a\xd1\x0c\xd7\x74\x7b\x30\x01\xd7\xdb\x39\xba\x27\xbf\xfa\xf7\x7f\xff\xf2\xdf\x07\x34\x7d\x11\xd9\x20\xd9\xd5\xd9\xf5\xd9\xcf\x37\x3f\x9c\x63\x42\x6d\x53\xa8\xb6\x14\xb6\xd9\x76\xd0\x66\xab\x21\x9b\xef\x35\x60\x13\xd3\x44\x1a\x53\x91\xba\xbf\x00\xa7\x74\x18\xe0\xf4\x36\xa7\x71\x7a\xd9\xaf\x52\xda\xcc\xc9\x9a\x75\xfb\xab\x3b\x6a\x4f\xe2\x8c\xd9\x28\xbb\x51\xd1\x5d\x8b\x7a\xcd\xe1\xed\xf9\x90\xa6\xac\xd6\xe4\x94\xc1\x18\x22\xe4\x4c\x25\x33\x2a\xe7\x7b\x7b\x3e\xc4\x93\x37\xc0\x7f\xa1\x21\x0a\x35\xea\xb9\x7b\x36\x24\x32\x78\xf7\x94\xd3\xbe\xc9\x82\xc6\x99\x06\x9e\x08\x63\x45\x84\xcf\x95\x66\x52\x37\x43\x13\xbf\x54\xa7\x29\xad\x1a\xad\x6b\x4a\x87\x6f\x82\xdb\x6e\x67\xa5\xa9\x69\xe0\xe1\x13\xe6\x4b\x9e\x1f\x51\xc6\x47\xc7\x97\x7e\x15\x7c\x29\xd3\x70\x63\x55\xd6\x92\x27\x84\x26\x5b\xe3\x07\x19\xc1\x58\x69\x58\x74\x84\x54\x1c\x1b\xa1\xc1\xb0\xc4\xec\xbf\x60\x82\x52\x35\xe7\x05\x85\x5c\x9a\x3c\x9a\x06\x6b\xa2\x04\x63\x4e\xd0\xe5\x91\x67\xa4\x62\xa2\x13\x25\xd7\xd0\x73\x5f\x07\x29\xae\xae\x57\xa6\x31\xb8\xd7\x83\xa4\x1f\xc1\x46\x64\x66\x0d\xfe\x17\x6f\x51\x0d\xcb\x5f\x74\x95\x44\x9a\x9b\x29\x60\xfd\x10\x78\x10\x65\x9f\x13\x6e\x94\x24\x63\xaf\xff\x1c\x64\x34\x86\x65\xdc\x98\xb2\x82\xb3\x7f\x09\x3d\x34\x54\xf1\xe1\xa1\xa9\x3d\x30\xd1\x3c\x02\x96\x81\x16\x2a\x66\x98\x4f\x1c\xab\x7b\xc9\x46\x30\x11\xd2\x04\xf8\xb9\x89\x02\xa0\x1d\xbb\xa1\x62\xbb\xa1\x5a\xdc\x80\xbd\xad\x15\x41\xf1\xe9\x49\x91\x2a\x4f\xb4\x5f\xc5\xa2\x93\x09\x23\x42\x2b\x6d\x9a\x8b\x8d\x09\x61\xb3\xf6\xf1\x45\xb7\xe0\x6d\x72\xa0\x2d\xaf\xad\x85\x0e\x16\xe7\xe7\xd1\xb4\x99\xe3\xb7\x73\x4f\x6d\x39\x3a\xf7\xd4\x6e\xa3\x73\x4f\x75\xee\xa9\xf5\xe3\xc9\x99\x77\x3b\xf7\x54\xa7\x74\x2d\x8e\xce\x3d\xd5\xb9\xa7\xd6\x8c\x27\x47\xbf\x3a\xf7\xd4\x16\xa3\x73\x4f\x6d\x39\x3a\xf7\x54\xe7\x9e\xea\xdc\x53\x9d\x7b\xea\x57\x64\x06\x0c\xa3\x73\x4f\x2d\x4d\xd2\xb9\xa7\x2a\xc0\xe8\x34\xa5\x15\xa3\x73\x4f\xad\x18\x9d\x7b\xaa\x32\x3a\xbe\xb4\x07\x5f\x0a\xce\x9d\xa1\xd3\xcb\x9a\xe7\xac\x0d\xd1\x71\x20\x22\xef\x23\xaa\xf6\x82\x2b\x5e\x55\x69\xff\x56\xa9\xf9\x11\x52\x6d\xbc\x37\xa8\xf4\x31\xad\xcc\x87\xda\xd5\x1d\x11\x92\x08\xcd\x49\xa6\xe8\xff\x4a\x67\x44\xc5\x0b\x41\xda\xe9\xfe\x39\x69\x1f\x2d\xdb\xaa\x89\xeb\xe1\x49\xbb\x1d\x9e\x88\x6b\xa7\x05\x57\x43\xe7\x66\x78\x76\x6e\x86\xe7\xd3\x43\xd7\x3b\xf3\x6f\xa7\x1a\xcc\x54\x25\x7b\x23\x7a\x0d\xc9\x5f\x0b\x29\xd2\x3c\x75\x38\x67\x1c\x3e\x8b\x59\x11\x35\x60\x0a\x74\x25\x42\x4f\x96\x42\x77\xa3\x88\x01\x0b\xa0\x72\x91\xb8\x6d\xc4\xb4\xce\x29\x47\x51\xdd\xe4\x51\x04\x80\xed\xd5\xaa\x5a\xcc\x97\x83\xe2\x4d\x45\x3b\x8d\x97\xcd\xe8\x4d\x33\xde\x4f\x25\x4a\x71\x96\x2f\xbf\xd8\x6b\x8e\x86\x5e\x9e\x0f\xef\xe1\x69\x81\x4c\x37\xd7\x57\x1a\xe9\x2a\x6d\x70\x89\xa6\x3a\xca\xa7\xe6\xc9\x69\xcd\xa3\xd9\x82\x07\xe7\x09\x79\x6f\x9e\x0c\x5b\x78\x2a\x1e\x9b\x27\x58\x7d\xb5\x05\x07\x43\x1b\x1e\x9a\xf6\xbc\x33\xef\xa1\x48\xe9\xfb\xf1\xca\xb4\xa8\x0d\xb7\xe4\x8d\xf9\x10\x9e\x98\x56\xbe\xba\xa9\x07\xe6\xc3\x79\x5f\xda\xf9\xdc\x86\xd6\xad\x67\xe1\x71\x69\xc1\xaa\xd5\xa6\x45\xab\x35\x6b\xd6\x7b\xf3\xb0\x34\xf7\xae\x3c\x01\xcf\x4a\x63\x20\x0b\x29\xac\xe0\xc9\x05\x24\x7c\x7e\x03\x91\x92\xf1\xde\x1c\x66\xa1\x6a\x5d\x71\x7e\x0c\x4d\xeb\x75\xb4\x7a\xfc\xf1\x94\xfb\xe2\xbc\x10\x87\x90\xea\x60\xfe\xf3\x02\x05\x36\x34\xa1\x55\x3e\x49\x83\x1e\x7b\x32\xca\x20\x05\x63\xb7\xb9\x89\x7f\x51\xf7\x4c\x8d\x2d\x48\x76\x24\x64\xd8\xc7\xe3\x8a\x1a\x58\x6a\xe6\x05\x5a\xbb\xab\x2f\x5f\x84\x9b\x9f\x9f\xca\x8d\xc6\x05\x63\xde\xbf\x05\xc4\xbf\xe8\x71\x13\x88\xbf\x71\x9c\x27\x75\x33\x08\x99\x46\xea\xf4\xe6\x65\x59\x5e\xf4\x25\xce\x5b\x9c\x36\x2e\x63\xe6\x13\x37\x9e\xdf\xa6\x35\xf6\x1b\x3f\x07\x9f\x71\x67\x7b\x61\x6d\xdb\x5e\x3e\x92\x6f\xf8\x09\x4a\xcd\x9f\xa8\x3f\xb8\x93\x9a\x77\x18\x95\xfc\xaf\x6f\x35\x8f\x60\xd8\xba\xc0\x11\x8e\x13\x8b\x73\xed\xd3\xf6\x0a\xb9\xa3\x38\x3c\x12\x20\xa6\xd3\x54\x24\xc5\x61\x36\xda\x38\x4f\x92\x39\xcb\x33\x25\xeb\x99\x87\xe4\xb4\x5a\x4c\x58\x73\xb3\xad\x7a\x4b\x29\xa5\x66\x5a\x79\x06\xac\x73\x29\x1d\x3d\x2f\x1b\x0e\xa1\x54\x6a\x88\x56\x57\xd3\xe2\x8c\x98\xb8\xe5\x3b\x66\x8a\x19\x73\x22\x85\xb2\x25\x45\x39\xa1\x7b\x7a\xac\x74\x24\x46\xc9\x9c\x4d\x79\x52\x74\x97\xe0\xec\x4e\x24\x89\x9f\x66\xc0\x6e\xc0\x32\x3b\x15\xbe\x31\x38\x4b\x94\x9c\xe0\xe2\xb8\x0c\x5d\xcd\x20\x72\xcf\x46\x09\x70\x99\x67\xf4\x3e\xc7\xd6\xe7\x2a\xd7\xe1\x7d\xbe\xac\x65\x31\x8b\x30\x4c\x8a\xa4\x57\xe9\x9d\xb4\x71\x63\xcb\x06\xf5\x06\x42\x4e\xe1\xbd\x30\xd0\xab\xce\x19\x2a\xf3\x9a\x4a\xe7\x8c\x4c\xab\x99\x88\xa9\xfb\x45\x00\x1b\x76\x69\xa5\xee\x18\xc5\x79\x96\x4a\xf6\x25\x4c\x38\x4a\x3d\xfe\x14\xd1\x9e\xd1\x3c\xe4\x8a\x93\x31\xf6\xcb\x70\xea\x82\xca\x6a\xa9\xac\x33\x41\x9d\x3e\x2b\x90\x63\x47\x52\x31\x85\xec\x35\x97\xc2\x52\xf7\xe8\x69\x6e\x59\xac\xee\xe5\xf1\x80\xaa\x12\x0b\xc3\x38\x1b\x81\x0d\x9d\x6c\x43\x67\x45\xa1\xc1\x30\x90\x7c\x94\xb8\x3d\xc7\x80\x87\xdb\x95\x00\x62\x63\xe0\x36\xd7\xc0\x26\xdc\xc2\x4a\xa1\x89\xbe\x77\x33\x78\x85\x29\xba\xbc\xe7\xd2\xc0\xde\xfd\xad\x5b\x96\xb4\xbe\xfa\xfd\x7e\x34\x42\xa4\xa0\x72\xfb\x41\x54\xc9\xfb\xa9\x88\xa6\x55\xc9\x58\xa4\x60\x98\xca\x17\x74\xec\x97\xfe\xb1\xd5\x3b\xd4\xe9\x93\xab\xc6\xbe\x56\xe2\x15\xa6\xb4\xc5\x94\xe3\xb2\xad\x2c\x77\x07\xf0\xe2\xfa\xe6\xe7\x57\x67\x7f\xbe\x7c\x35\x60\x97\x3c\x9a\x56\xf3\xd1\x25\xe3\x48\x34\x90\x50\x4c\xf9\x0c\x18\x67\xb9\x14\xff\xcc\xa9\x3a\x39\x3b\x2a\x9e\x3d\x6e\xb5\x16\xf2\x9e\xdc\x17\x5b\x5f\xb7\xd6\x6b\x89\x1a\x69\x53\x80\x83\x32\x80\xdd\x11\x16\xc5\xa7\x4b\x77\x89\x14\x0d\x14\xb5\xa6\xe0\x88\x91\x98\x79\x32\xec\x8b\x4b\xf3\xb8\x08\xb9\x70\x78\xee\xd0\xc2\xb1\x2a\x3e\xc2\x50\x89\x29\x30\x09\xd6\xa1\x75\x61\xb0\x52\xd2\xd4\x0a\x03\xe4\x06\x4c\x8f\x8d\x72\x0c\xee\xc8\xb4\x48\xb9\x16\xc9\xbc\x3a\x99\xe3\x55\xd7\x2a\xa8\x43\xf3\xc5\x25\x5d\xbc\xb9\xbc\x61\xd7\x6f\x6e\x59\xa6\xa9\x64\x00\x46\x67\xe0\x75\xfc\xac\x11\xb8\x27\x7c\x8f\xce\x01\x3b\x93\x73\xba\x48\x07\x5c\x18\xe6\x74\x21\x40\x16\xec\x65\xc8\x50\x14\xfe\xe0\xc5\x00\xff\x77\xe0\xbe\x52\x3b\x21\xb3\x08\x3a\x89\x96\x82\xc7\x48\x0c\x15\xa3\xa4\x02\x4d\xff\xed\xcf\xaa\xdb\x52\x11\x36\x37\x74\x40\xac\x74\x5b\xe2\xc5\x56\x23\x78\xa9\xfb\x96\x90\x93\xa4\x8a\x55\xfb\x91\xfd\xa6\xba\x65\x53\xcd\xb2\x5f\x7e\xc1\x70\x5f\x05\xb3\x95\xae\x4f\xe5\x1a\x5a\xea\x95\x52\x72\xbf\xa0\x4e\x79\x8a\xa0\xaa\xed\x2f\xaf\x86\xe1\x04\x78\xe9\x26\x5d\xe8\x99\x88\x0f\x93\x53\xa3\xc7\x5e\xb0\x3f\xb2\x07\xf6\x47\x54\xaf\xbe\x6a\xda\x59\xa6\xa9\xe2\xd3\xdc\xbc\x43\x5a\xfd\xd5\xb0\x25\x88\xff\xd5\x51\x27\x37\xa3\x83\xaa\x55\x6c\x24\xbc\x38\x0f\x0f\x16\xb4\xa3\xa3\x7e\x27\x3e\x6a\x4f\x1e\xb7\xc0\x0f\x88\x66\xe4\xbb\xb8\x1a\x57\x5b\x42\xd8\x1d\x11\xcd\x3d\xfe\x17\x65\xec\xb5\xa7\x42\xf5\x06\x13\xe5\x6c\x29\xb7\xd1\xb4\x4e\xc6\x9c\xa0\x66\x6c\x79\xc0\x0c\x8b\x15\x5a\xd2\x28\x0e\x70\x2a\x1a\x44\x62\x3c\x1d\x34\x6e\xe6\x9c\xaf\xed\xe7\xa6\x9d\x5a\x30\xa0\xa0\xe6\xe3\x05\xab\x4a\x79\x99\x4c\xc5\x5e\x26\x73\xcb\x8a\x2b\x3c\x63\x83\x50\xe6\x6d\x35\x85\xc9\x1a\x71\xc9\x9d\xa7\x88\x4b\x0a\xe0\x1e\x83\xd6\x14\xba\x39\x9a\xa3\x07\x59\x44\xd0\x78\xf3\x1a\x9d\xa4\x4c\x2b\xab\x22\xd5\xa0\x6d\x50\xdd\x61\xee\xa7\x43\x20\x90\xf1\x37\xd8\xdc\xbf\xbf\x18\xf6\xd8\xed\xf9\x10\xbb\xa9\xdc\x9c\xdf\x0e\xeb\x9a\xca\xc1\xed\xf9\xf0\xe0\xa3\x82\x82\x05\xc9\xea\xd4\x2d\x73\x8f\x49\x6a\x86\x27\x27\xb6\xf5\x53\x9e\xf5\xef\x60\xbe\x27\x4f\x6d\x83\xaf\xf7\x8b\x1d\x6e\xe5\x83\x08\xcc\x29\xcf\x76\x9e\x4d\x03\x8f\xc5\x07\xca\xa2\xf0\x27\xab\x7c\xe7\xea\x74\x8a\x54\xcd\x20\x26\x71\x38\x3c\x01\x32\xce\x94\x70\xf2\x62\x97\x63\xb1\xfb\xd3\x5d\x8e\xc5\xa6\xd1\xe5\x58\x74\x39\x16\x5d\x8e\xc5\xe6\xd1\xe5\x58\xf8\xf1\xf1\xcd\xa0\xac\xcb\xb1\xd8\x73\x3c\x2f\x3f\x7f\x97\x63\xb1\xd3\xe8\x72\x2c\x96\x47\x97\x63\xb1\x66\x74\x39\x16\x6b\x46\x97\x63\xd1\xe5\x58\x74\x39\x16\x5d\xb4\xd8\xa3\x73\x3d\xcd\x68\x31\xd6\xe5\x58\xf8\xd1\xe5\x58\x3c\x8b\x98\x18\xd6\xe5\x58\x6c\x35\xba\x1c\x8b\x2e\xc7\x62\x9f\xd1\xe5\x58\xe0\xe8\x6c\x2f\x5d\x8e\x45\x18\x5d\x8e\x05\x8d\x5f\x8f\xd4\xdc\xe5\x58\x74\x39\x16\x5d\x8e\x45\x97\x63\xb1\x71\x15\x5d\x8e\xc5\x73\xd0\x27\x43\x0f\xbc\xe6\x39\x03\x87\xe7\x2a\xcd\x72\x0b\xec\x6d\x98\xb2\x90\x22\x89\x30\x08\x53\x95\x08\x9a\x87\xf0\x44\x4a\x8e\xc5\xc4\x53\xf6\x13\x6a\x30\xd7\x2f\xbe\xa7\x5f\x69\xea\xf6\x09\xc6\xef\x24\x22\x15\xfb\x25\x72\xb0\xa5\x8d\x79\x85\x73\x55\x9c\x3c\xee\x24\xa5\xfc\x01\x8f\x08\x4f\x55\x4e\x4d\xf9\x22\xbf\x7f\x05\x08\xc9\x15\xf6\xe4\x76\x86\xb5\xa3\xe2\x94\x19\x29\xc3\x16\xb4\x8d\x8c\x5b\x0b\x5a\x9e\xb2\xff\x3a\xfa\xf1\xf3\x5f\xfa\xc7\x5f\x1f\x1d\xbd\x7b\xd1\xff\xc3\x4f\x9f\x1f\xfd\x38\xc0\x7f\xfc\xee\xf8\xeb\xe3\x5f\xc2\x1f\x9f\x1f\x1f\x1f\x1d\xbd\xfb\xee\xf5\xb7\xb7\xc3\xcb\x9f\xc4\xf1\x2f\xef\x64\x9e\xde\xd1\x5f\xbf\x1c\xbd\x83\xcb\x9f\xb6\x9c\xe4\xf8\xf8\xeb\xcf\xf6\x5e\x72\x63\x91\xb8\x3d\x81\xb8\x25\x71\xf8\xbd\x08\xc3\xde\x3b\xdc\xd2\x59\x7c\xeb\x67\x5b\x3c\x8d\x9e\x61\x6d\x3a\x8d\x81\x9a\xa2\x98\x57\xcc\x23\x0c\x53\xa9\xb0\x4e\x38\x74\xf2\x20\xaf\xc6\x85\x09\x5b\x53\x4a\x3d\x1d\xc0\x80\x4a\x6e\xa9\x47\x68\x11\x53\x55\x89\xd3\x56\x41\xf2\xf3\xbd\x57\x0b\x7b\x05\x9e\xe7\x7e\x0c\x63\x21\xc1\xfb\xc1\x3a\xda\xf0\xf8\xe8\x68\xc3\x73\xa4\x0d\x06\xa2\x5c\x0b\x3b\x3f\x57\xd2\xc2\xc3\x5e\x16\x96\x3a\x69\xb8\xa9\x4f\xc8\xe8\x9c\xf9\x2c\x4a\x7f\x8d\xa9\x8c\x02\x28\x17\xd2\x59\x8b\x10\x5c\x9d\x4b\x54\x30\x29\x4b\x06\x2c\x69\x7f\xa8\xf7\x60\x4c\xe4\xe2\x4b\x82\x3e\x47\x6a\xe6\x3f\x73\x31\xe3\x89\xd3\x76\xcb\x27\x86\xa8\xc1\x54\x1f\xda\xf6\xcc\x5b\x6e\xee\xca\x03\x0f\x7d\x27\x43\x17\x6b\x3e\x09\x9f\x84\x3f\xc1\x83\xfd\x14\xa5\x34\x14\x90\x86\x5a\xcc\x44\x02\x13\xb8\x34\x11\x4f\x90\xae\xb5\xc3\x2b\xce\xd6\xcc\x8e\x1b\xaf\x55\x62\xd8\xfd\x14\xb0\xbb\x32\x0f\x26\x00\xcc\x70\x99\x70\x21\x59\xea\xb6\x28\x0b\x0f\x1b\xb2\x25\x38\xf2\x9f\x71\xed\x36\xb8\xb0\x19\xa0\x8a\x3c\x52\x2a\xf1\xa1\xc3\xc9\xbc\x9c\xdf\xc7\xde\x4b\xf5\xb3\x84\xfb\x9f\xdd\x6c\x86\x8d\x13\x3e\x29\x4c\x05\x06\xec\x92\xb5\xaf\x9c\x7a\xed\x07\x60\x5c\x6e\x0e\x8c\x27\xf7\x7c\x6e\x4a\xc3\x49\xb5\x0f\xf8\x29\x7b\x79\x8c\xe8\xcc\x0d\x2b\xe6\x88\xd9\x17\xc7\xe8\x4b\x3c\x3f\x1b\xfe\x7c\xf3\xb7\x9b\x9f\xcf\x2e\x5e\x5f\x5d\x37\xe3\x14\xee\xdb\x81\xcb\xbd\xe6\x88\x78\xc6\x47\x22\x11\x4d\x18\xc4\x52\xb4\x49\x75\x52\x64\xc1\x71\x7c\x12\x6b\x95\x11\x9c\x82\x8d\xaa\xe4\x94\x75\x2d\xb8\x9a\x99\x8c\xdb\x33\xae\x4f\x38\xd1\x5c\xda\xd2\x58\x53\x82\x5c\xe7\xd2\x29\xd6\x9f\x78\x60\x3e\x8f\xdb\x0b\xca\x3f\x8b\x63\x88\x6b\xd0\x7b\x76\x41\x80\xe7\xe1\xe3\xe6\x65\x8e\x36\x1b\xbe\xb9\xb9\xfa\x3f\x0b\x68\x38\xcf\x9a\xc5\x3c\xb5\x93\x17\xa6\x55\xd6\xda\xee\xbe\xf5\x79\x47\xdd\xfe\x3e\x89\xfd\x2d\x78\x55\x3b\x9e\xf6\xb7\xb9\xac\x97\xf1\x28\xe7\x67\xa9\x8a\x61\xc0\x86\x85\x95\xbe\x7e\xb5\x92\xde\xcb\x35\x30\x77\x8b\xb4\x82\x27\xc9\xbc\x2a\x20\x59\x45\xc9\x34\xb5\xcc\xe4\x2a\x1d\x1e\xf3\xc4\x34\x24\xa6\x4d\x38\x93\x63\xc2\xaf\x9d\x32\xd9\x0a\x34\x8b\xd9\x58\x0c\x52\x59\x2f\x95\xba\x55\x62\xb2\xb6\x56\x11\x23\xcd\xb5\x12\x16\x55\xe3\x2e\x86\x0c\xfd\x81\x31\x09\x13\x60\x35\x2c\x66\x26\x2b\x6f\x6e\x60\x51\xba\xf5\x8c\xa9\xd4\x65\xdd\xec\x1a\x78\x8c\x39\x69\x19\xb7\x53\x8a\x6a\x48\xb9\xb9\x83\x98\x7e\xf0\x72\x4d\x61\xe6\x77\x33\x16\xaf\xba\x75\xeb\x0e\x36\x7d\x94\x67\x28\xd6\x02\x7d\x01\xfb\x15\xdd\x60\x6d\x1c\x01\xf7\x4d\x6f\x64\x32\x7f\xab\x94\xfd\xa6\xc8\xc5\x6a\x65\x03\xff\xea\x25\xc5\xba\x19\x16\x45\x29\x0c\x42\x88\xfb\x08\x4c\x44\xe9\x6a\x1a\xd8\x45\xb9\x61\x1f\x19\xa1\x75\x2e\xcf\xcc\xb7\x5a\xe5\x7b\x73\x80\x25\x41\xeb\xdb\xab\x0b\x3c\xc7\xb9\xf7\xb2\x49\xab\xe7\x98\x75\xba\x5c\x30\xa8\x90\x69\xbf\xf7\x7e\xc2\x2a\x46\x96\x2e\x1d\xf6\x9a\xcf\x19\x4f\x8c\x0a\xc2\xb1\x90\x2b\x15\x28\xaf\x9d\xb9\xcb\x23\x65\xa7\x4b\x6a\x99\x43\xe7\xe5\xe7\x7a\x15\xa7\x5b\x59\xc1\x48\xc8\xa5\xc7\x2d\xbf\x03\xc3\x32\x0d\x11\xc4\x20\xa3\x86\xbb\xf6\xb1\x5d\x4d\xb8\xf3\xd7\x4a\xba\x63\xd1\xca\xde\x5f\x15\x3e\x46\x34\x84\xd5\x77\x1a\xbd\x95\x5e\xef\xe0\xe8\xb3\xc4\x43\x91\x1b\xd0\xe4\x60\xd5\x39\xd0\x46\x7c\x97\x8f\x20\x01\x4b\xca\x10\xd6\x9d\xe0\x96\x14\x69\x91\xf2\x09\x30\x6e\x0b\x44\xb1\x8a\x81\x34\x8e\xdc\x90\xe9\xcd\xb2\x58\x41\x99\x40\xc9\x0d\xfb\xfe\xea\x82\xbd\x60\x47\xee\x5d\xc7\xb8\xfd\x63\x2e\x12\x74\x67\x5a\xae\x17\xd7\x28\xc6\x61\x0a\x5c\x12\xe2\x1e\x53\x9a\x8e\x68\x8f\x49\xc5\x4c\x1e\x4d\xc3\x9a\x9c\xc6\x15\x14\x36\x1f\xcf\x87\x46\xfd\x67\x88\xaa\x8d\x09\xcc\xf7\x06\x74\x6b\xf4\xe5\xfb\x3d\xe8\x4b\x55\x84\x70\x38\x57\x87\x1e\x21\x56\x0a\x96\xc7\xdc\x72\x4f\x77\xca\xac\xeb\xe7\xb8\xa5\x1f\x9b\xfa\x18\x78\x25\x64\xfe\x40\x11\x2b\xed\x29\xf9\x37\x97\x38\x2d\x8b\x02\xd0\x70\xd3\x78\x96\x25\x82\xf2\x9d\x17\x22\xa8\xae\x6a\x5b\xdd\x5b\x23\x22\xe1\x31\xe7\x49\xa2\x1c\x79\x73\x9c\x9d\xcb\x58\xa5\x4b\x2f\x73\x02\x14\xd4\x0a\xdd\x0d\xd8\xb3\x44\x9e\x8f\x6e\x8e\x48\x60\x06\x0d\x6a\xba\x2c\xd6\xe5\x73\xb3\x39\x59\x2c\x6c\x28\x4e\xcf\x12\x3e\x82\x84\x38\x0b\x21\x90\x59\x46\xa0\x8f\x1d\x85\xa8\x55\xd2\x5e\x0e\xc6\x5b\x95\x00\x85\xf5\x04\x40\xb8\xe9\x3f\x09\x38\xe0\x24\x6d\xc1\x01\x15\x99\x1a\x1c\x50\x25\xfb\x14\xe0\x90\x37\x60\xb4\x6c\x11\x0e\x8e\x6b\xd7\xe1\x80\xac\xf3\xa9\xc3\xc1\x40\x14\xa9\x34\x1b\x6a\xe5\x54\xae\xd6\x58\x8b\x9f\xb6\xf4\x15\x91\x4e\xbe\x22\x08\x07\x49\x79\xfd\x66\xae\x2b\x01\x7d\xdc\x12\x8d\x0f\x51\x7d\xff\x5f\xb5\x43\xb2\x23\x3d\x8b\x7c\x28\xcc\x52\x73\x2b\xb9\x27\xfd\x85\x4f\xbc\x9c\x40\x03\x2b\x59\x2b\xcc\x44\x45\x3c\xc1\x92\x7b\xcd\x30\x86\x2d\x62\xcd\xe2\xc4\x95\x28\x4c\x74\x2d\xe1\x6f\xc1\xef\x8f\xd5\xd7\xf0\x17\x6f\xfb\x92\x2a\x86\x8a\x0b\x92\xc2\x47\x6f\x29\x5a\x0f\xef\x0b\x01\xa0\x8e\xab\x07\x6f\x60\x5c\x7b\xda\x2a\x5f\x01\xe6\x75\x51\xc8\xcf\x2d\x10\x64\x2c\xe4\x04\x2d\x3a\x3d\xa6\x21\xa1\xd0\x51\x7f\x86\xef\x48\xfd\x3a\x44\x8c\x0e\x93\x06\x74\x0e\xaf\x46\x49\x48\x28\xe9\x67\x46\x23\x47\x90\x6f\xc6\x44\x2d\x85\x61\x07\xaf\x02\x00\x1a\x54\x3e\x7b\x8a\x0c\xe2\x80\xbe\xb0\xd8\x4d\xb2\xb1\xdd\x09\x19\xfb\x28\xcb\x1a\xb0\x8a\x1a\xb5\x24\x85\x62\xfc\xae\x88\xab\xa4\xe1\x94\xfd\x28\x59\x01\x2c\xd6\xdf\x1b\x3d\xde\x92\xc0\x1a\xcc\x4b\xfd\xcd\x26\xbf\xe2\x25\x8b\xd3\x7c\x2f\x71\xef\xdd\x7b\xfb\x4e\xed\x5d\xbe\x2f\x7c\xcb\xc1\xc7\xdc\xd7\x7b\x21\x63\x75\x6f\xda\xd6\x21\xfe\x4a\xd3\x06\x81\x3a\x72\x68\x6d\x85\x9c\x98\xaa\x1e\xc1\x93\xa4\x66\x86\x5d\xa5\x48\x84\x1d\x2e\x2a\x12\x2f\x0b\xf0\x0b\xd1\xe1\x9d\x12\xb0\xc3\x98\xa4\x86\x9f\x6b\xf7\x29\x56\xf0\xe4\x26\xdb\xbf\x34\x1b\x5b\x44\x83\x6f\x5f\xdf\x9c\xd5\xa7\x76\xf4\xec\x1e\x2b\x5e\x3b\x60\xbb\xeb\x8c\xc7\xa9\x30\x06\xcd\x40\x30\x9a\x2a\x75\xc7\x8e\x42\xd8\xc6\x44\xd8\x69\x3e\x1a\x44\x2a\xad\x44\x70\xf4\x8d\x98\x98\x13\x8f\xb4\x7d\xb7\xfa\x63\x26\x64\x52\x44\xa3\xa0\x1a\x29\xad\x09\x66\x0c\x7c\x49\x54\xac\x02\xf7\xd6\xd7\xeb\xf4\x5e\xe6\xe5\x65\x52\x85\x4e\x01\xc9\xc7\x2f\x38\xb3\xbc\x3d\xd7\x0d\x6b\x67\x3c\xb2\x45\xf8\xed\x3e\x35\xa5\x9a\x46\xb5\x12\x8e\x24\xbd\x7d\x74\x20\x79\xe9\x20\x02\xd3\x5e\x55\x9e\xbf\x94\x73\xb2\x18\x28\x7b\x02\x30\xea\x84\xaf\x0d\x6e\x42\xab\xec\x21\x26\xe1\xf9\x47\x0f\xab\x12\x2d\x7a\x7d\x28\xcd\xc3\xe9\x03\x49\x36\xe5\x7d\x52\x92\x1d\x49\x42\x1a\x16\x64\x80\xa9\x92\xca\x07\xa7\x3b\x2e\xa8\x24\xa2\x34\x6a\x0b\xe4\x08\xc2\x3d\xf1\x34\xb6\xb2\xd4\xf3\xd2\x3f\x58\xf5\x21\x61\x12\x0f\x15\x01\x28\xd7\x70\x2f\xec\x34\x54\xb8\xaf\x39\x9c\x70\x25\x1a\x0c\x7a\x0f\x24\x03\xad\x95\xf6\x81\x30\xc1\x6a\x8b\x33\x21\x29\xc6\x48\x1a\x87\x24\xdc\xfd\x75\x68\xaa\x2e\xca\xb2\x04\x2e\xc6\x89\x39\x6c\x82\xf1\x18\x22\x94\x94\xaa\x00\x26\xb2\x7b\x54\x56\xee\xf3\xd1\xdd\x0e\xc1\x7c\x09\xdd\x54\x3c\xb8\xb7\x54\x9f\xaa\x3a\x43\x7d\xc5\xbc\xd5\x97\x8f\x07\x8c\x5d\xc9\x22\x72\xb2\xe7\x76\xb1\x7a\x67\x08\xf9\xb1\xee\x13\xab\xf5\x97\xf1\x03\xaa\x76\x27\x27\xde\xe9\xbc\x05\x8c\x6f\x62\x0c\x66\x55\x83\x70\xab\xe4\x00\x0d\xc3\x7e\x52\xb7\xf5\x81\x89\x37\x31\x14\xbb\x5b\xde\x97\xb1\xf8\xd3\xe0\xf4\xac\x29\x9d\xf3\x29\xf1\x2d\x15\xc5\xbd\xa9\xcc\x56\x11\xbf\x0b\x77\xd3\x50\xc5\x54\x12\xa3\x48\xe9\xc7\x5e\x16\x58\xa2\x43\xfc\x2b\x08\x58\xa5\x90\x26\x15\x45\x65\x57\x6b\x65\xf8\x9a\xa0\x31\x73\xb2\x72\x12\x74\xfb\x34\x4b\x00\xb3\xe7\x2a\x33\x97\x89\x81\x95\x2a\xba\xbd\x62\x21\x65\x21\x5e\x5f\xa1\xa3\xc7\xfe\x81\x87\xb2\x08\x00\x0c\xc5\x03\x86\xc5\xe3\xa4\xe2\x09\x13\x4a\x6a\x63\x66\x9b\x55\xc1\x74\xc0\x62\x31\x1e\x43\x08\x34\x74\xaa\x1f\xd7\x3c\x75\x24\xde\x30\x0f\x82\x11\x4c\x04\x45\xb2\x15\x84\xed\xd0\x94\x19\xf0\x3d\x22\x86\xc2\xb2\x54\x4c\xa6\x84\x28\x8c\x63\x66\x24\x0b\x2e\xb5\x44\xf1\x98\x21\x6e\x2b\xcd\xee\xb9\x4e\x1d\xdf\xe0\xd1\x14\xfd\x73\x5c\xb2\x38\xd7\x58\x26\xd2\x02\x8f\xe7\x7d\x63\xb9\x75\xa2\x2e\x68\xaf\x11\x86\xf5\x77\xa5\x84\x37\x8e\xae\x94\xf0\xfa\xd1\x95\x12\xee\x4a\x09\x77\xa5\x84\x37\x8f\xae\x94\xb0\x1f\x1f\x3f\xdb\x97\x75\xa5\x84\xf7\x1c\xcf\xab\x9c\x4d\x57\x4a\x78\xa7\xd1\x95\x12\x5e\x1e\x5d\x29\xe1\x35\xa3\x2b\x25\xbc\x66\x74\xa5\x84\xbb\x52\xc2\x5d\x29\xe1\xae\x28\xda\xa3\x73\x3d\xcd\xa2\x68\xac\x2b\x25\xec\x47\x57\x4a\xf8\x59\x94\x7e\x62\x5d\x29\xe1\xad\x46\x57\x4a\xb8\x2b\x25\xbc\xcf\xe8\x4a\x09\xe3\xe8\x6c\x2f\x5d\x29\xe1\x30\xba\x52\xc2\x34\x7e\x3d\x52\x73\x57\x4a\xb8\x2b\x25\xdc\x95\x12\xee\x4a\x09\x6f\x5c\x45\x57\x4a\xf8\x39\xe8\x93\xc6\xc6\x62\xaf\xca\x67\xdb\x14\xaa\xf0\x91\x21\x95\xd4\xd6\x51\x3e\x1e\x83\x46\xca\x85\x6f\x5e\x8a\x42\x28\x0a\x5a\x15\xb4\xcc\xc7\x19\x60\x59\x3c\x0d\x3c\xf6\x01\xef\x6b\x1e\xf7\xb9\xb4\x58\xa1\xac\x8c\xd4\xbc\x7c\xf3\x4d\x3b\x55\x31\x9a\xc5\x28\xe2\x9a\xdf\xc8\xa8\x79\xac\x5a\x09\xf0\x55\x09\x18\x1e\xee\x51\xa2\x8c\x8f\x30\x45\x60\x45\x53\x2e\x25\x04\xe5\x51\x58\x34\xca\x8c\x00\x24\x53\x19\x48\xa2\xdf\x9c\x19\x21\x27\x09\x30\x6e\x2d\x8f\xa6\x03\xf7\x26\x19\x80\x5d\x46\x83\xfa\x5f\x8c\xd5\xc0\xd3\x10\x17\x9b\x72\x41\x53\x31\x1e\x69\x65\x0c\x4b\xf3\xc4\x8a\xac\x98\x8c\x19\xc0\x80\x76\x62\x54\x05\x30\x30\xbc\xa4\x0c\x21\xed\x95\x6f\xf3\xcb\x52\xd5\xa2\x40\xa8\xba\xf6\xb0\x0e\x6a\x9a\xd9\x79\x11\x47\x07\x6c\x2c\xb4\xb1\x2c\x4a\x04\x72\x6b\x7c\x23\xe5\x0e\xe2\x7c\xbd\xc0\xab\xa5\x5f\xa9\xf1\x4b\x95\x31\x8a\xad\x99\x35\x14\x95\x56\x4e\xe8\xa7\x8a\x85\xf1\x62\xbe\xe9\x31\x1e\x4a\xde\x10\xa0\xc3\x4a\x11\xd4\x81\xb3\xd0\xec\xfe\xa7\xca\x74\x95\x3a\x79\x65\xd8\x5e\x89\xe8\x18\x62\x1c\x90\xb3\x57\x8b\xa6\x2e\x05\x0a\x0c\x77\x59\x3a\x06\xb8\x01\x12\x66\x0e\x07\x20\x02\xc7\x5f\xf9\x1a\xac\xff\xe0\x48\x5f\x61\x8a\xaf\xc1\x18\x3e\x81\xe1\x9e\x5e\x8b\x75\x1a\x19\x3a\x2e\xca\x8d\x41\x54\x48\x28\x3d\xad\xf8\xa5\x0c\x73\xaa\x8b\x41\x2c\xa5\x35\x15\xc2\xcf\xbd\x16\xd6\x02\x6e\x2a\x16\x47\x42\xc7\xe7\x62\x02\xea\xe1\x42\xb0\xd4\xeb\x30\x49\xf9\xb0\x23\xea\x32\xa6\xd0\xa5\x11\xb0\x91\x16\x30\x66\x63\x81\xf1\x50\x18\xa1\xd4\xa3\x72\x1f\x9c\x2c\x0a\xc6\x38\x7d\x57\xc9\x20\xcb\x86\x75\x0d\xd8\x5f\xfd\xc2\xac\xce\x65\xc4\x2b\x45\x00\x31\x45\x4b\x8c\xd9\x04\x23\x9c\xbc\xb4\xf8\xfb\x17\x7f\xf8\x8a\x8d\xe6\x8e\xa5\xa1\x64\x65\x95\xe5\x49\xf1\x91\x09\xc8\x89\x83\x15\x1d\xcf\x7a\x92\x51\x01\x01\xac\x62\x4e\x0b\x7f\xf9\xc5\xdd\xa8\xce\x63\x4f\x62\x98\x9d\x54\xe0\xd7\x4f\xd4\x64\x55\x5d\xf8\xfd\x43\x26\xf7\x54\x89\x56\xa0\x99\x4a\x44\x34\x6f\x8c\x68\xa1\xee\x0c\x9b\xaa\x7b\x92\xf5\x57\x60\x4f\x19\x03\x99\xa9\x2c\x4f\xc8\x82\xfd\x4d\x91\x9e\x97\x1b\x58\xce\xc1\x59\x79\x2e\xd0\xe6\xea\xa7\x58\xac\x17\x4b\x81\x6d\xe1\x95\xca\xc7\x76\x7b\xab\x60\x51\x7e\x06\x15\xa1\x6f\x78\x92\x8c\x78\x74\x77\xab\x5e\xa9\x89\x79\x23\x2f\xb5\x56\xba\xbe\x96\x84\x3b\x6a\x39\xcd\xe5\x1d\x55\xae\x2e\x52\x84\xd5\xc4\x89\x56\x59\x6e\x43\x20\xf1\xaa\x0f\xa6\x84\xd3\x40\x84\x83\x1a\x54\xce\x02\x0f\xa2\xd4\x75\x7c\xaa\x04\x61\x64\x75\x7e\x53\x45\xb6\x2f\x5e\xfc\xfe\x3f\x08\x75\x99\xd2\xec\x3f\x5e\x60\xf0\xa3\xe9\xd1\x21\x46\xda\xe6\x18\x45\xca\x93\xc4\xa9\x0d\x55\xa4\x74\x80\x5e\x85\x84\x1f\x1c\x07\x6d\x73\x74\xdb\x5a\x94\xba\xbd\xfd\x1b\xca\x51\xc2\x1a\x48\xc6\x3d\xca\x0a\x28\xd4\x9a\x43\x64\x0c\x87\x9e\xfa\x60\x6a\xc6\x13\x10\x80\x66\x2a\xc9\x53\xb8\x80\x99\x68\xa3\x79\x45\x6d\xb6\xa0\xea\x27\xc2\x60\x02\xc6\x28\x51\xd1\x1d\x8b\xfd\xc5\x4a\x18\xcb\x62\x09\xd5\xfd\xa1\xb0\x6f\x40\x4f\x83\x40\x9e\xb5\xdf\x5f\x0b\xe1\x49\x79\x96\x15\x31\xfa\x9a\xdf\xd7\x80\x81\x67\x12\xf3\x7d\x1b\xd6\x53\x68\x6c\x66\x6e\x6a\x64\xee\xfb\x2f\x72\x74\x73\xef\x29\xf6\x0e\x61\x69\x6e\xa3\x2e\x57\xbf\xbf\x61\xb2\x86\x10\xe5\x84\xe1\x34\x64\xf8\x6f\x0a\xcf\x5e\xca\x4a\x2a\x12\x5b\x0a\xc4\x20\x01\xc0\xa1\x0f\x92\xe4\xfd\x0d\xae\x2d\x58\x37\x9b\xc5\x2f\xd5\xe0\x22\x0b\xab\x72\xca\xad\x17\x08\x83\xf9\x9a\xb3\x0c\xb4\x11\xc6\xf1\xe5\x1f\xf0\x40\x9d\x27\x5c\xa4\x15\x13\xe0\xc7\x01\x02\x1d\x6e\xac\x7c\xd9\x9c\x52\x0e\x55\xec\x27\x44\x52\x48\x55\x3f\x57\x88\xb5\x75\xa9\xb6\x45\x86\xfa\xb1\x49\xe5\x0f\x25\x34\xeb\x94\xd2\xfd\x52\x90\x4a\xba\xeb\x39\x11\x48\xfc\xbe\x4f\x95\x3e\x16\x8b\x6f\x89\x0c\x20\x61\xf4\x9b\x5b\xa7\x84\x35\xe5\x91\x0e\x4a\x45\xa4\xf7\x7a\xe0\x80\x91\x4b\xdd\x9d\x09\xff\x28\x3b\x3c\x3d\xfc\xa8\x44\x92\x40\xa4\x55\xc6\x27\x8d\x7a\x18\x2c\x40\x6a\x71\xda\x6a\xa2\xb7\x53\x83\xf0\x7a\x51\x76\x08\xef\x82\xb8\x2c\x44\x81\x65\x46\xc8\x3b\x1a\x00\xec\x15\x04\xca\x87\xbc\xe7\x73\xc6\xb5\xca\x65\xec\xed\x4b\x85\x81\xef\xf5\xc2\x8b\xaf\x95\x84\x60\x38\x5f\xcc\x13\x47\x8b\xbe\x90\xec\xe5\xe0\xe5\x8b\xe7\xc2\xa9\xf0\x0b\x17\x38\xd5\x75\xc1\xa9\x88\x3e\x7d\xd4\x6f\x0d\xd5\x8e\x5b\xfa\xde\xd7\xde\xc4\x52\x16\x33\x16\xa1\x58\x2b\xfe\x74\xaf\x85\x85\x4a\x6f\xa3\x23\x54\x5c\x9c\x7e\x58\xc9\x8a\x3e\x6e\xb1\x86\x77\x3b\x69\xe8\x26\x1f\xbd\x47\xba\xe5\x09\x14\x1e\xb7\x55\x16\x2e\xb3\x81\x84\x55\x01\x75\x70\xc0\x8e\xe8\xce\x43\xca\x0c\x3c\xfe\xa8\xa8\xe5\x81\x76\xf9\x90\x35\xa8\x31\x57\x03\xdc\xe5\x43\xc6\xd1\x06\x97\xb5\x08\xc1\x3f\xc3\x94\xcf\x00\x33\x22\x45\xc2\x75\x82\x3e\xc7\x1b\x5a\x3b\x1b\xe5\x96\x81\x9c\x09\xad\x24\x06\xf8\xcc\xb8\x16\x58\x95\x42\x03\x66\x56\x3b\x5d\xf4\xb3\xa3\x1f\xce\xde\x62\x40\xc3\xb1\x4f\x09\xf7\xab\xcc\x4d\x28\x1f\x51\x5d\x49\x65\xba\x47\xb7\x2f\xac\xc3\xc1\x10\x69\x6e\x58\x97\x7b\x4f\x9a\xdb\x9c\x0a\xe2\x3f\x44\x49\x6e\xc4\xec\x63\x51\x12\x9f\xaa\x7a\x21\xf6\xda\xe7\x85\xb4\xd9\x12\x50\x4b\x19\xb0\x68\x5a\x47\xd6\xf2\x48\x05\xd6\x43\x53\xd4\xac\xaa\xfa\xc0\xbd\xe9\xc9\xe7\xb2\x53\x2c\x5e\x28\x59\xb6\x24\x42\x60\xdd\x86\x8f\x6b\x84\x8a\xa5\x39\xc7\x15\xee\x06\xd6\x7a\x74\x73\x2d\x29\xf0\xe2\xfa\xa6\x5a\x04\x80\xd4\x25\x15\x0f\xd8\xb0\xfc\xb1\xac\x14\x81\xf5\x8b\x0a\x25\x12\xf4\xa4\xac\x89\x3b\x01\x09\x1a\x85\x04\x37\x65\xad\x9d\x1c\x1b\x71\x43\x4e\x9e\x8b\xeb\x1b\xb2\xd9\xee\x06\xb3\xbd\xc5\xec\xfd\x25\x54\xc7\xf1\x29\x27\x62\x0f\xe1\xb6\xde\xad\xa6\x30\x58\x39\xc0\xa0\x52\x4a\x13\xb3\xab\x21\xe3\x71\xac\xd1\xed\xe3\x45\x9f\x4a\xa9\xb7\xc2\xb7\x80\x55\x19\xb8\x81\xea\x9a\x2a\xe0\x46\x12\x57\x02\x96\x5d\xe4\x59\x22\xc8\x8d\x50\x7d\xa0\xac\x26\x81\xed\x55\x76\x47\xda\x26\x6a\xde\xde\x4a\x5e\x03\x2a\xa4\xf6\xad\xea\xb6\x61\xf7\x34\x18\x95\xcc\xca\x82\x9a\x0b\xbb\xe6\x4f\x04\x9a\xc4\x8b\x5d\x0b\x45\xdc\xb6\xda\x31\x90\x56\xbb\xa3\xb9\xb8\x5b\xd8\xbd\x37\xc9\xf1\x34\x15\x13\x8a\x19\xa0\x7f\xdc\xd7\xaf\xf3\x65\x94\xca\x12\x9f\xe4\x1b\xa6\x2a\xab\xc0\x75\xa0\x68\xb8\xaa\x3d\x4f\x22\xfb\x58\x88\xb0\x68\xec\xb8\xb8\xbe\x21\x4a\x48\x1f\x5f\x74\xe5\x5b\xb5\x4b\x25\x55\xdb\x1b\x03\x3f\x5a\x95\x8f\x26\x9a\xc7\x42\x5b\x25\xdf\xa6\xb4\x51\x20\x4b\x03\xf1\xaf\x51\xe6\x5e\x83\xb7\x1b\xe0\x3a\x9a\xee\x03\xff\x0d\x84\x80\x26\x65\xb1\xa2\x48\x80\xb1\xd2\xa8\x12\xf7\x91\xbc\x27\x4a\xdd\xe5\xd9\x36\x14\xdd\x4f\x43\xbd\x72\xb6\x22\x10\xb5\x27\x7e\x55\x34\x3d\x96\x66\x1f\x7f\x6f\x5d\xf6\x01\x4b\x12\x0f\x4e\x54\x66\x63\xa8\x45\xbd\xe9\x3c\xc9\x8d\x05\xfd\x8d\xd0\xc6\x1e\x84\x82\xab\x88\xc1\x64\x13\x39\xac\xde\xf0\x57\x61\xa7\xbe\x74\xda\x61\xaf\x7e\xc9\xfd\xed\x27\x3e\x74\x3a\xed\xe1\xb5\x92\x70\x38\x58\x14\xbb\x0a\x52\x5e\x90\xb5\xb5\x3c\xc5\x2f\xdd\x40\x42\xf1\xa2\x78\xa1\x82\x2b\xb7\xbe\x6c\x9c\x7b\x43\xa0\x7f\x06\x2c\xe3\x58\xa2\x09\xef\x9e\x96\x65\xde\xa8\x00\x0b\xd5\xa9\x53\x5e\xd0\x9b\x57\x41\x54\xa9\xc9\x62\xd5\xfa\xcf\xde\x47\x9e\xdb\x19\x03\xa8\xfc\xdf\x0d\xe8\x99\x88\xe0\x95\x90\x77\x3b\xa2\x5f\x3d\xba\xe4\x72\x69\xb6\x5a\x41\x5e\xf2\xd1\x0a\x49\xc1\x77\x8e\xc5\xf0\x91\xca\x2d\xca\x6e\xe8\x70\x2c\x15\x47\x21\xff\x41\x7b\x81\xf6\xf6\x8c\x2a\x66\xad\xd2\x11\x4d\x8f\x8c\x3e\x41\x09\x34\x73\x69\x39\xd6\xf6\xbb\x50\xd1\x1d\x68\x96\xb8\x65\x0c\x58\x19\xf8\x52\xab\x26\xa7\x73\xd8\x31\xea\x62\x5f\x4b\x07\x64\x53\x48\x41\xf3\xa4\x2c\xaa\xd8\x00\xd4\xaf\x3c\xe1\x2c\x66\xad\xc6\xa4\x50\x75\x21\x5f\x06\xcd\x9d\xc3\xcb\x55\x77\xa5\x7c\x1e\x2a\x4d\x0a\x89\xe1\x06\x0f\xc2\xa0\x59\x3f\x53\x71\x35\x8b\x2d\x37\xa0\xfb\x45\x8e\xa1\xcf\xe3\x31\x45\x20\x4e\x0c\xa3\x7c\x32\x11\x72\xe2\xa9\x33\xd2\xf4\xb2\xd6\x58\xa9\xe9\x60\xa4\x77\xa4\x81\x0a\x3e\xa2\xf4\x40\xf1\x65\xa2\x7a\x7f\xaa\x62\xba\x7d\x34\x27\x6d\x30\xec\x6c\x19\x20\x7d\x25\x99\xd2\xbe\xce\x02\x8f\x63\x5c\xfb\xf2\x17\xfa\x96\xde\xd5\xaf\xea\x15\x71\x1c\x14\xd9\x5d\x3c\x55\x01\x8b\xc9\x47\xa1\x47\xf7\x63\x35\x36\x85\xa1\x02\x5f\x95\xf2\x9a\x41\x35\x58\xac\xad\x79\xb9\xbc\xfb\x21\x3e\x7a\x9f\x73\xbe\x3b\x7b\xd9\x8b\xb5\xd4\xb9\xb5\x5c\xf1\x15\x14\x26\xbe\xe0\x1d\xf5\x98\xc5\xb1\xa7\xa8\x85\x34\x53\x9a\x6b\x41\xe4\x6e\x11\xcf\x1c\xbf\x58\x81\x60\x33\xea\xd5\xb8\x02\xc7\x56\xe2\x32\x52\x5b\xa9\x8a\x16\xf2\x8e\x2f\x98\x68\x0a\x71\x8e\x51\xea\x93\x9c\x63\x2b\x58\x47\x2d\xbc\x51\x7d\xee\xc3\xff\x08\xe9\x8a\xc0\xc2\x22\x1d\x61\x8e\xc1\x38\x58\x6d\xcf\xfd\x82\xd8\x4a\x21\x88\xd4\x4a\x13\xfb\xf2\x55\xa3\x11\xd7\x20\x61\xc4\xb1\xcd\x1f\x0f\x87\x0a\x1e\x22\x70\x64\xcd\x9a\x72\xb1\x3e\x3e\x05\x6b\x89\x06\x4c\xf7\x30\x84\x99\x88\xf0\x0d\x6b\x8f\xb0\xff\x02\x02\xf6\x68\x5e\xb6\x36\x5e\x73\x78\x6e\xdd\xb7\x15\xc9\x42\xf8\x54\x48\x11\xd8\xea\x50\x2c\x42\xb0\xae\x08\x85\xf7\x30\x25\x23\x3f\x7d\x25\x9f\x40\xd2\x11\x2a\x32\x03\x7c\x17\xc2\x10\x5d\xb2\xe1\x90\x50\xdd\xd9\x1d\xd1\xb7\x81\x9e\xb1\xbf\x13\x71\x2f\xe7\x5f\x13\x95\x86\xeb\x49\x73\xf5\xef\xf0\x4c\x4f\xf2\x94\xca\x02\xab\x85\xca\xac\xbe\x9f\x25\xb1\x53\xb4\xd8\x39\x66\x7c\xfe\xfa\xa2\x9a\x9c\x51\x8d\x3a\x0f\xa9\x2d\x4e\xc8\x6b\x68\xc9\x5d\x34\xe5\xba\x83\x56\xda\x87\x4b\xae\xe1\xf5\x53\x6f\xab\x2c\xde\x16\xd0\x52\xc8\xcc\xc9\x19\x28\x1d\x95\xd6\x4a\x19\x4d\xb9\x9c\xa0\x81\x5f\xe5\x6e\xbe\xcf\x3e\xc3\x15\x69\x88\xf3\xc8\x97\x94\x0f\x91\xdd\x9f\x05\xbb\xa6\xaf\x74\x84\x7d\xa5\x4c\xc4\xb3\xb0\xe6\xea\x67\x91\x10\x72\xca\xc4\x00\x06\xec\xe0\xb3\xca\xa5\x03\x7a\x7b\xa6\x95\x7b\x85\x0f\x0a\xc7\x55\x25\xc2\xe2\xf1\x3e\xa8\xde\x3d\x60\x97\xee\x1d\xe8\xeb\x29\x00\x58\x89\x5b\x1e\x95\xe0\xeb\x31\x0d\x13\xae\xe3\x04\x73\x09\xc7\x85\xb8\x45\x19\x47\x1e\x60\x48\x7a\x31\x52\x50\x2a\xbb\xca\xee\xba\x53\xbf\x7b\x12\xd2\xfa\x31\xb7\xbc\x8f\x65\xf8\x89\x88\x9d\x90\xe1\xa0\xef\x0b\x21\xf6\xb9\x47\xad\x4a\x47\xfc\xdf\xfa\x9c\xb1\x3e\x2f\xee\x12\xb2\xcf\xfb\x58\x92\x70\xff\x28\xd8\x8f\x10\x30\xd1\x48\x87\x6f\x50\x0f\x73\x51\xf0\x2e\xca\x28\x23\x0c\x06\xec\x5a\xd9\xb2\x6c\x6e\x11\x9b\xe1\x4b\x3e\xae\x3a\xcf\x97\xd7\xb7\x6f\xff\x36\x7c\x73\x75\x7d\xdb\x1d\xeb\xee\x58\x77\xc7\xba\xc1\xb1\x06\x39\x6b\x7c\xa4\x0b\x05\x6f\x95\xce\xbb\x50\x8a\xaf\x92\x32\xfe\x8c\xa2\xcf\x2e\xe5\xec\x07\xae\xcb\x5e\xee\x28\x3f\xae\x74\x13\x87\x66\xef\x48\xe2\xce\x3f\xf9\xf0\xb3\x8f\x18\x3c\xd6\x62\x50\xce\x75\xa5\xd2\xc1\xaa\x5d\xab\x36\xc0\x3a\xff\xf9\xea\xe2\xf2\xfa\xf6\xea\x9b\xab\xcb\xb7\x1f\x35\x9a\xa2\x61\x29\xbc\x3a\x53\xde\x93\x4b\x66\x1a\x66\x42\xe5\x26\x99\x17\x8d\xa6\x56\x13\x81\xe5\x80\x3c\x19\x33\x2e\xe7\xc1\x9e\xb6\xfa\xb1\x8e\xd9\xb6\xcb\x6c\xeb\xc1\x25\x0d\x0a\x97\xb4\x85\xbe\xdf\x68\xb5\x77\x23\xfd\x45\xdb\x3e\xd9\x27\x82\x4d\x7f\x15\x3e\x1d\xfa\x1a\x07\x35\xd6\xe3\x85\xc7\xb2\xa0\x82\x13\x46\xd3\xcc\x36\x28\x13\xde\x4a\xf1\xd3\x76\xea\x84\x52\x20\xc6\x6b\x9e\x7d\x07\xf3\xb7\xd0\xb0\x3e\xca\x82\x2f\x25\x81\xc8\x31\x3a\x76\x07\x73\x72\xb1\x9e\x87\x97\x35\xa9\xe3\xf2\x24\x6b\xc7\xde\x41\x93\xba\xbe\x6d\x16\x7d\xbd\x83\x06\x91\x99\x61\x2c\x95\x3f\x75\x5b\x88\x72\x9a\xdb\xd3\x66\xbb\xc7\xda\x2d\xf8\xfa\x1e\x8a\xdc\x1e\x56\xd9\xbd\xa7\xb3\x76\xe7\xf2\x11\x6a\xe6\x38\x17\xdc\x9f\xf8\xa8\xb4\xbe\x53\x5c\xfb\x84\xb5\xe6\x04\x43\x6f\x4e\x7e\x8b\xff\xf1\x45\xc1\xce\xe2\xd8\x47\x47\xe7\x06\xc6\x79\x42\xb6\x7a\x33\x60\x3c\x13\x3f\x80\x36\x68\x52\xbd\x13\x32\xee\xb1\x5c\xc4\x5f\x37\xa9\x2a\x45\xa3\xc5\x5d\x50\xc1\x23\xd5\xee\x4e\xdc\x78\x87\x63\x95\x77\x15\x44\x84\x51\xea\x23\xe2\x66\xb0\x01\x7b\x21\xa3\x25\xd0\x34\xed\x44\xc5\x68\x0b\xdb\xa5\xab\x87\x25\x61\x25\x67\x4e\x51\x81\x2b\x3e\x0d\x85\xe6\x4c\xd1\x3e\x6a\xe0\x30\xac\x57\xff\xd3\x64\x3c\x82\x1e\xfb\x7b\xf1\x23\x36\x5c\x36\xef\x0e\x0f\xff\xf8\xdd\xe5\xdf\xfe\x74\x78\xf8\xd3\xdf\xab\x57\x91\x15\xa2\xd6\xbc\x70\x0b\xda\xe0\xa5\x8a\xe1\x1a\xdf\x81\x7f\x7a\x71\xed\x2c\x8a\x54\x2e\xad\xbf\x80\x69\xcb\x83\xa9\x32\xf6\x6a\x58\xfc\x99\xa9\x78\xf1\x2f\xd3\xa8\x54\xda\x93\x64\x0c\xb8\x45\x0d\xd2\x6f\x68\xb4\xc7\x1e\x4a\x5a\xd2\xf2\x51\xf5\xb3\x06\x6c\xc4\x92\xbb\xe4\x89\xf9\x26\x80\x00\x5b\x5c\x86\xfa\x08\x12\x93\xca\x9d\x64\x5a\xaf\x9b\x77\x30\x7b\xd9\xa8\x99\x2f\x8d\x16\x49\x5b\xb1\x83\x2d\x03\x0c\x21\x12\x5a\x29\xe1\x41\x2e\x18\x6c\xd0\x52\x4a\x77\xf3\xd9\xf0\x8a\xcd\x08\xc2\x4f\x06\x38\xc1\x89\xf6\xcd\x7b\xa5\x71\xa5\x17\x74\x21\x79\xf5\x94\xfc\xd5\xe1\xba\x2f\x24\x60\x8a\xda\x5e\xe0\x14\x9b\x23\xfa\x71\x10\x65\x79\xcf\xdf\x30\x48\x21\x55\x7a\x5e\xfc\x59\xb8\x08\xfb\xc6\x2a\xcd\x27\x98\x78\x42\x8f\xd3\x63\xc5\x5f\xf4\x60\xed\x05\xcb\x4f\x93\x2a\x1c\xe5\xda\x09\x0d\xc9\xbc\x2c\xfd\xf9\xfc\x68\x5b\x00\xfd\x13\x21\x6d\x05\x66\x34\xed\xfb\x48\xa3\x8e\x90\x65\x90\x00\x0a\x9c\x05\x14\x51\x9f\xf4\x89\xb5\xbd\x42\x0c\x22\x6b\x80\x9c\x39\xcd\x72\xef\xd2\x60\xe5\x68\x91\x9a\xc5\x62\x26\x8c\x6a\x90\x5e\x53\x4c\xb4\x3e\x67\xc0\xd7\xf6\xa0\xc8\xa8\xc2\x6c\xf6\x90\x61\x35\xa4\xe2\xbc\x2e\x90\xfd\x97\x4d\x3a\x7d\xd3\xc8\xb8\xb5\xa0\xe5\x29\xfb\xaf\xa3\x1f\x3f\xff\xa5\x7f\xfc\xf5\xd1\xd1\xbb\x17\xfd\x3f\xfc\xf4\xf9\xd1\x8f\x03\xfc\xc7\xef\x8e\xbf\x3e\xfe\x25\xfc\xf1\xf9\xf1\xf1\xd1\xd1\xbb\xef\x5e\x7f\x7b\x3b\xbc\xfc\x49\x1c\xff\xf2\x4e\xe6\xe9\x1d\xfd\xf5\xcb\xd1\x3b\xb8\xfc\x69\xcb\x49\x8e\x8f\xbf\xfe\xac\xf1\xd2\x5b\x28\x4e\x4a\xa3\xcd\x12\xa5\xf5\x19\x5b\x41\xbf\xf7\x58\xe4\x9f\x46\x40\xaf\xb6\xcf\x7f\x08\x8f\x3e\x2d\x19\x52\xc1\xae\x9f\xcc\x01\x37\x10\x69\xb0\x1f\xc2\x92\x43\x6f\xaa\x04\xca\x1c\x1a\x56\xa8\x16\xcf\x8d\xcf\xfd\x1a\x8c\x3b\x41\x6c\xa7\x7d\x2d\x25\xd1\xb1\x56\x69\x48\x7b\x47\xf7\x06\xb6\xb9\x0e\xf7\xdd\x41\xa3\x66\x89\x34\x3a\x63\x50\x67\x0c\x5a\x33\x1e\x35\x06\xdd\x10\x1e\x3e\x59\x4b\x10\xc8\xd9\xbe\x2e\x8c\x95\x1e\xf4\xa0\xeb\x54\x6b\xc4\x6d\xe7\x50\x1b\x84\xa3\x6e\x0a\x4f\x5c\x19\x49\x43\x0c\x2d\x5d\xed\xc3\xc4\x2e\xf6\x42\xd2\xc1\xc7\x09\xca\xbc\x12\xdf\xd5\x80\x4a\x18\xc2\xcc\x2d\xa1\xa8\x81\x5d\xab\x76\x89\xd1\xa5\x18\xf3\xfa\x57\x0a\x41\xbd\xa3\xa8\x54\xa7\xa4\x09\x59\xd6\x09\x2d\x84\xc3\xb2\xb8\x34\x37\x46\x45\x14\x4d\x5b\x64\x39\x60\xe9\x3a\xbf\x6c\x5c\x0d\xf6\x99\xae\xf4\x23\xa7\xc2\xd3\xe5\xb7\x8e\xe6\x58\x0f\x53\xce\x42\xf1\xed\x38\xe4\xcc\xe0\x4a\x56\xcf\xf1\xbc\x02\x10\x1c\x22\x7a\x27\x58\x25\x0e\x01\xa9\x7e\xa1\x61\x73\x0c\xc5\x50\xe3\xd2\xca\xba\x5f\x9b\xbf\xc6\x5c\xbc\x39\xcf\x2c\x3c\x5b\x8d\x84\xa1\x25\x66\x59\x9a\x9f\xeb\x4c\xf2\x39\x38\x03\x9b\xb3\xcf\x5f\x1d\xeb\x6c\x89\x6d\xb6\xc3\x32\x77\xf0\x9d\xb4\xc9\x26\xdb\x70\x96\x64\x1a\xc6\xe2\xa1\xa5\x73\x7a\x26\x4b\x4b\x8c\x88\x41\x5a\x31\x16\x94\x43\x93\x69\xc8\x40\x52\xf2\x02\x8f\xa6\x48\xfb\x3d\xa7\x2c\x9d\xd3\x4f\x31\x98\x87\x04\xee\x76\x49\xd9\xcd\x2a\x61\xbf\xa3\x63\xac\xa3\x63\x7b\x8f\x0f\x44\xc7\x3c\xe6\x3e\x1d\x22\x86\x91\xe7\xcd\x43\xdf\x2f\x2a\x71\xec\x88\xc5\x3b\x63\x59\x99\xe7\x74\x82\xb3\xec\x65\x7d\x6e\x84\x0c\xf8\xda\x61\x9e\x24\x2d\x55\xdf\x3e\xbc\x42\x68\x64\x79\x92\xf8\xa4\xe3\x01\x7b\x23\xf1\x3c\x9e\x61\x97\x87\x1e\xbb\x86\x19\xe8\x1e\xbb\x1a\x5f\x2b\x3b\x24\xc1\xb6\x1e\xcb\x46\x37\x32\x31\x66\xa7\x4e\x65\x32\x96\x59\xaa\xb4\x5f\xa9\x0b\xa4\x74\x6d\x82\xb2\xe4\x58\x83\x18\xf4\xf5\xdb\xf2\xdb\x90\xd1\xd6\xff\x48\xdb\x54\xb4\x32\x69\x41\x37\x0d\x2d\xeb\x7c\x74\x1c\x46\x44\x7a\xd7\xc8\xaa\x9c\xde\x4f\xb0\xcc\x46\xa6\x8c\xbd\x71\x2a\x6c\x3b\x6d\x6e\x86\x61\x3a\xec\x1c\xc1\x93\x04\xe2\x5a\x9f\x23\xea\xcf\xc1\xeb\x2a\x34\x66\x1b\x17\xed\x22\x80\x4d\xb9\x8c\x13\xd0\x58\xf2\xdd\x2c\xd6\xb5\x12\x65\x8f\x83\xa2\x2b\x45\x48\x0b\xe5\x51\xa4\x74\xec\x9b\xd5\xfa\xe4\x4d\x5c\x4c\x71\xbc\x90\xd0\xa6\x5c\xf2\x09\x75\x29\x5c\x2a\x1c\x8c\xe5\xa4\x4d\xa5\xb5\xc5\x54\xa9\x3b\x16\xa9\x34\x4b\xf0\x00\x34\x38\x1f\x65\x67\x9d\x02\x45\xfb\xd8\x4d\xf1\xa4\xd2\x74\x07\x7f\xf8\x88\xdd\x11\xdb\x90\x53\xe0\x01\xa2\xd6\xba\xf2\x39\x8a\xe8\x76\x19\x7d\xe2\x4a\x16\xe2\xca\x58\xb9\xc3\xe8\xf6\xba\xac\x47\x50\x10\xbd\x01\xbb\x7c\x80\xa8\xd2\xd9\xd2\x3d\xe1\x5b\x5b\x5a\x85\xf6\x90\xe6\x1d\x8b\x1b\x9b\xf2\xdb\x32\x9f\x37\x48\x50\xab\x8e\x85\xea\x73\x38\x67\x28\xb6\xed\x5f\x81\x7d\x0b\x28\x41\x1a\x93\xd6\x42\xfd\xed\xda\x19\xa2\x13\xbb\x54\xb2\xae\x08\x50\x0e\x73\x61\xa2\xb6\x52\x96\x1d\x1d\x9e\x1c\x1e\x2f\xd9\xf5\x16\x2a\x36\xdf\x56\x9e\x14\x58\xa2\x30\xc3\x7a\x7f\x10\x1d\xc6\x3d\x26\x6c\xa0\xd1\x54\x29\x01\x57\xe5\x33\xe9\x7a\xcc\x28\x66\x35\x8f\x85\xd7\x9c\xf0\x57\x77\x93\xd5\xb9\x2f\x93\x70\x74\xf8\xcb\x61\x8f\x81\x8d\x8e\xd9\xbd\x92\x87\x16\x97\x8f\x35\x45\x72\x53\x99\x68\xae\x72\x6c\xdd\x47\x20\x28\x0a\x84\x38\x42\xc7\x54\x4e\x7d\x7e\xa6\xdc\x86\x0c\xbe\xcb\x07\x61\x43\x6f\x0b\x35\x66\x2f\xa8\xcd\x10\x70\x6f\x59\x4c\xc4\x0c\x4e\xa6\xc0\x13\x3b\xa5\xe0\x0b\xa9\x64\x9f\x3a\xc5\x39\x0a\xe4\xaf\x34\xf5\x43\x34\x33\xd3\x55\x47\x03\x93\xdd\xf2\x82\x1a\x4a\xe4\x8e\xf6\x7e\xbb\x7f\x2f\x5c\xb6\xd4\x26\xfa\xf6\x76\xf8\x6d\xad\x19\x2e\x12\x7f\x6b\xb3\x10\x12\x53\x29\xb6\xf1\x04\x68\x47\x3b\x4e\xc0\x46\x9d\x6c\x59\x8b\x24\xac\x69\x47\x5b\xb6\xdc\xf6\x7b\xb7\x56\xb6\xec\x6f\x2a\xc7\x16\x7c\x7c\x94\xcc\xd9\x3d\x97\x36\xa4\xef\x1d\xb8\xa9\x0e\x1c\x79\x72\xd8\xf0\x17\xe0\x31\x68\x83\xd4\x03\xf8\xde\x45\xc5\xc2\x68\xcd\x39\x55\x59\x5b\xbb\x7c\x20\x37\x56\xa5\x6c\xea\x3f\xbb\x9e\xd2\xe8\x4f\xc6\x00\x4f\x4f\xc8\x17\xd2\x90\x11\x85\xf3\xcf\x3c\x3b\xfa\xb5\x44\x37\x08\xee\xb5\xe2\xfb\x51\x15\x6c\xd5\x16\x2d\x42\x12\xb0\xa8\xb9\x62\x4b\xb4\xb4\x85\xa0\x02\xd6\x62\x60\x01\x6b\x96\x20\xb9\x38\x11\x3a\xcb\x9a\xc7\x50\xb5\x16\xab\xc0\x5a\xf3\xc7\xb3\x55\xc6\x4b\x8f\x33\x14\x39\xdb\x12\x10\x5b\xf5\x82\xb3\xe6\x29\x98\xd5\xb1\x19\x00\xed\x6c\x3e\x6b\x13\x02\x59\x0b\x21\xd3\xcb\x01\xd3\x4b\x2d\xc6\x91\x4c\x50\xa5\xaa\x27\xc3\x65\x9a\xf6\x5b\x67\xab\xf3\x8f\x35\x93\x45\x7b\x5c\xfb\x49\xf4\x5c\x67\xed\x85\x36\xb6\x1d\xd8\xd8\x6a\x58\xe3\x7b\x0d\x6a\xc4\x54\x8a\xc6\x54\xa4\x6e\x53\xc7\x29\x1d\x06\x38\xbd\xcd\x69\x9c\x5e\xf6\xf3\x46\xa1\xd0\xc2\xa3\x6e\x45\x75\x47\xed\x49\x9c\x31\x1b\x65\x37\x2a\xba\x6b\x51\xaf\x39\xbc\x3d\x1f\xd2\x94\x15\xd5\x86\xcb\x60\x0c\x11\x72\xa6\x92\x19\x55\xfa\xbb\x3d\x1f\xe2\xc9\x1b\xe0\xbf\xd0\x10\x85\x1a\xf5\xdc\x3d\x1b\x82\xfd\xbd\x0b\xc7\x69\xdf\x64\x41\xe3\x4c\x03\x4f\x84\xb1\x22\xc2\xe7\x0a\xdb\x16\xce\xd0\xc4\x77\xd3\x69\x4a\xab\x46\xeb\x9a\x52\xa5\xdb\xec\xae\x4a\x53\xd3\xe0\xbc\x27\xcc\x97\x3c\x3f\xd2\x45\x33\xb5\x8e\x2f\xb5\x34\xdf\xd3\xe5\x4b\x99\x86\x1b\xab\xb2\x96\x3c\x21\x34\xd9\x1a\x3f\xc8\x08\xc6\x4a\xc3\xa2\x23\xa4\xe2\xd8\x88\x73\xf0\x85\x38\xcf\x86\x57\x85\x09\x4a\xd5\x9c\x17\x14\x96\x18\xaa\x6f\x26\x62\x06\x12\x8c\x39\x41\x97\x47\x9e\x91\x8a\x19\xfa\xe6\xf6\xdc\xd7\x41\x9a\x51\xfd\xca\x22\xd4\xdf\x77\xed\xc5\x1f\xc1\x52\xe1\xc9\xc2\xff\xe2\x2d\xaa\x61\xf9\x8b\xae\x92\x48\x73\x33\xa5\x8e\xb6\xf0\x20\xac\xef\xca\xac\x81\x1b\x25\xc9\xd8\x5b\x69\xae\x2b\x0c\xcb\xb8\x31\x65\x19\x70\xff\x12\x7a\x68\x48\xa5\x83\xab\x0f\x4c\x34\x8f\x80\x65\xa0\x85\x8a\x19\xe6\xdc\xc6\xea\x5e\xb2\x11\x4c\x84\x34\x01\x7e\x6e\xa2\x00\x68\xc7\x6e\x00\x6d\xc3\xa1\xa2\xda\x80\xbd\xad\x15\x0a\xf1\x29\x3c\x91\x2a\x4f\xb4\x5f\xc5\xa2\x93\x09\xa3\x26\x11\xbc\xd4\x56\xa6\xd8\x98\x6a\xa7\x9d\x47\x16\xdd\x82\xb7\x89\x9a\x41\x85\x6b\x6b\xa1\x83\x05\x4f\x79\x34\x6d\xe6\xbe\xed\xdc\x53\x5b\x8e\xce\x3d\xb5\xdb\xe8\xdc\x53\x9d\x7b\x6a\xfd\x78\x72\xe6\xdd\xce\x3d\xd5\x29\x5d\x8b\xa3\x73\x4f\x75\xee\xa9\x35\xe3\xc9\xd1\xaf\xce\x3d\xb5\xc5\xe8\xdc\x53\x5b\x8e\xce\x3d\xd5\xb9\xa7\x3a\xf7\x54\xe7\x9e\xfa\x15\x99\x01\xc3\xe8\xdc\x53\x4b\x93\x74\xee\xa9\x0a\x30\x3a\x4d\x69\xc5\xe8\xdc\x53\x2b\x46\xe7\x9e\xaa\x8c\x8e\x2f\xed\xc1\x97\x82\x73\x67\xe8\xf4\xb2\xe6\x6d\x84\x51\xbb\xc3\x7a\x7e\xcf\x34\xad\xa9\x89\x8d\xff\x49\xdb\xf7\x9f\x88\x0f\xa5\x05\x9b\x7e\x67\xcf\x7f\x76\xf6\xfc\x76\x6c\x61\x2d\xd8\xc1\x1a\x93\x72\xef\x35\xbf\x9d\x6a\x30\x53\x95\xec\x8d\xe8\x35\x24\x7f\x2d\xa4\x48\xf3\xd4\xe1\x9c\x71\xf8\x2c\x66\x85\x7b\xde\x94\x2d\x99\xd1\x6b\x4f\x26\x39\x77\xa3\x88\x01\xab\x71\x72\x91\xb8\x6d\xc4\xfc\xc9\x29\x47\x99\xd8\xe4\x51\x04\x80\xbd\xbe\xaa\xea\xc2\x97\x83\xe2\x4d\x45\x6f\x87\x97\xcd\xe8\x4d\x33\x26\x4b\xf5\x32\x71\x96\x2f\xbf\xd8\x6b\x8e\x86\xee\x94\x0f\xef\x4a\x69\x81\x4c\x37\x57\x0c\x1a\x29\x05\x6d\x70\x89\xa6\xca\xc0\xa7\xe6\x32\x69\xcd\x75\xd8\x82\xab\xe4\x09\xb9\x49\x9e\x0c\x5b\x78\x2a\xae\x91\x27\x58\x0a\xb4\x05\x4b\x7e\x1b\xae\x90\xf6\xdc\x20\xef\xa1\x62\xe6\xfb\x71\x7f\xb4\xa8\x76\xb6\xe4\xf6\xf8\x10\x2e\x8f\x56\xbe\xba\xa9\xab\xe3\xc3\xb9\x39\xda\xf9\xdc\x86\x66\xa4\x67\xe1\xda\x68\xc1\x7c\xd4\xa6\xe9\xa8\x35\xb3\xd1\x7b\x73\x65\x34\x77\x63\x3c\x01\x17\x46\x63\x20\x0b\x29\xac\xe0\xc9\x05\x24\x7c\x7e\x03\x91\x92\xf1\xde\x1c\x66\xa1\x84\x5a\x71\x7e\x0c\x4d\xeb\x75\xb4\x7a\xa0\xef\x94\xfb\x4a\xb1\x10\x87\xd8\xe5\x60\xd2\xf3\x02\x05\x5a\xe3\x68\x95\xfb\xd4\x61\xba\x57\xfa\x2e\x51\x3c\x36\x27\x99\xa2\xff\x2b\xc3\x78\x2b\xf1\xbb\xf4\xae\x66\x01\xbc\x1f\x5b\x19\xa4\xa8\xe7\x36\x37\xf1\x2f\xea\x9e\xa9\xb1\x05\xc9\x8e\x84\x0c\xfb\x78\x5c\x51\x03\x4b\xcd\xbc\x40\x6b\x77\xf5\xe5\x8b\x70\xf3\xf3\x53\xb9\xd1\xb8\x60\xcc\xfb\xb7\x80\xf8\x17\x3d\x6e\x02\xf1\x37\x8e\xf3\xa4\x6e\x06\x21\xd3\x48\x9d\xde\xbc\x2c\x6b\x5d\xbe\xc4\x79\x8b\xd3\xc6\x65\xcc\x7c\x86\xc4\xf3\xdb\xb4\xc6\x0e\xda\xe7\xe0\x9c\xed\x6c\x2f\xac\x6d\xdb\xcb\x47\x72\xc2\x3e\x41\xa9\xf9\x13\x75\xbc\x76\x52\xf3\x0e\xa3\x92\x68\xf5\xad\xe6\x11\x0c\x5b\x17\x38\xc2\x71\x62\x71\xae\x7d\x7e\x5c\x21\x77\x14\x87\x47\x02\xc4\x74\x9a\x8a\xec\x33\x4c\xfb\x1a\xe7\x49\x32\x67\x79\xa6\x64\x3d\xc5\x8f\x9c\x56\x8b\x99\x61\x6e\xb6\x55\x6f\x29\xa5\xd4\x4c\x2b\xcf\x80\x75\x2e\xa5\xa3\xe7\x65\xf7\x1b\x94\x4a\x0d\xd1\xea\x6a\xfe\x99\x11\x13\xb7\x7c\xc7\x4c\x31\x35\x4d\xa4\x50\xf6\x47\x28\x27\x74\x4f\x8f\x95\x8e\xc4\x28\x99\xb3\x29\x4f\x8a\x56\x07\x9c\xdd\x89\x24\xf1\xd3\x0c\xd8\x0d\x58\x66\xa7\xc2\x77\xa9\x66\x89\x92\x13\x5c\x1c\x97\xa1\xc5\x16\x44\xee\xd9\x28\x01\x2e\xf3\x8c\xde\xe7\xd8\xfa\x5c\xe5\x3a\xbc\xcf\xd7\x8f\x2c\x66\x11\x86\x49\x91\xf4\x2a\x8d\x7c\x36\x6e\x6c\xd9\x2d\xdd\x40\x48\xde\xbb\x17\x06\x7a\xd5\x39\xd5\x0c\xb4\x16\xb1\x77\x1a\xd0\x6f\x99\x56\x33\x11\x53\x2b\x86\x00\x36\x6c\x19\x4a\xad\x1a\x8a\xf3\x2c\x95\xec\x4b\x98\x70\x94\x7a\xfc\x29\xa2\x3d\xa3\x79\xc8\x15\x27\x63\x6c\xde\xe0\xd4\x05\x95\xd5\x72\x46\x67\x82\xda\x4e\x56\x20\xc7\x8e\xa4\x62\x0a\xd9\x6b\x2e\x85\xa5\x56\xc6\xd3\xdc\xb2\x58\xdd\xcb\x63\x37\xb9\x30\x0e\x0e\x9c\x8d\xc0\x86\xb6\xaa\xa1\xcd\x9f\xd0\x60\x18\x48\x3e\x4a\xdc\x9e\x63\x4c\xc0\xed\x4a\x00\xb1\x31\x70\x9b\x6b\x60\x13\x6e\x61\xa5\xd0\x44\xdf\xbb\x19\xbc\xc2\x14\x2d\xc7\x73\x69\x60\xef\x66\xcb\x2d\x4b\x5a\x5f\xfd\x7e\x3f\x1a\x21\x52\x50\xb9\xfd\x20\xaa\x24\xb5\xe3\xaf\x48\xc6\x22\x05\xc3\x54\xbe\xa0\x63\xbf\xf4\x8f\xad\xde\xa1\x4e\x9f\x5c\x35\xf6\xb5\x12\xaf\x30\xa5\xf9\x6e\x80\xcb\xf1\x33\x95\x6e\xa7\xdc\x1d\xc5\x8b\xeb\x9b\x9f\x5f\x9d\xfd\xf9\xf2\x95\x3f\x9f\xb2\xca\xf4\x73\x29\xfe\x99\x03\xe3\xa9\x72\x72\x75\x52\x0d\xc3\xe9\xa1\x79\xa0\xf2\x03\x9e\xe4\x76\x03\x76\xf6\x64\xc8\xd8\x9a\xb9\x79\x58\x12\x36\x78\x7e\xff\x51\x49\x1f\xbb\x65\x4d\xd1\x72\xd3\x7d\x70\xb5\x65\x0d\x67\x12\xac\x3b\x79\x24\x51\x52\x0b\x23\x21\x27\x49\x55\x98\xdc\x8f\x5c\x35\xd5\x89\x9a\x6a\x44\xfd\xf2\x0b\x86\xfb\x2a\x46\xad\xb4\xce\x29\xd7\xd0\x52\xc3\x89\x92\x6a\x07\x35\x80\x3a\x82\x06\x35\x80\x44\x8f\xab\x21\xe3\x71\xac\x51\x4c\xc1\x53\x9f\x2e\x34\x9e\xc3\x87\xc9\x18\xdf\x63\x2f\xd8\x1f\xd9\x03\xfb\x23\xaa\x05\x5f\x35\x6d\xcf\xd1\x54\x60\x6f\x6e\x96\x20\x6d\xf4\x6a\xd8\x12\xc4\xff\x3a\xe5\x16\x67\x74\x50\xb5\x8a\x8d\x84\x17\x43\xe1\xc1\x82\x76\x62\x91\xdf\x89\x8f\xda\xd8\xc4\x2d\xf0\x03\xa2\x19\xd9\xdc\xaf\xc6\xd5\xca\xff\x76\x47\x44\x73\x8f\x3b\xfd\xfe\xda\x53\xa1\x7a\x1f\x81\x72\xb6\x94\xdb\x68\x5a\x27\x63\x4e\xc0\x30\x35\xe6\x14\x2b\x24\xe3\x14\xbf\x36\x15\x0d\x22\x08\x9e\x0e\x1a\x37\x73\x2a\xd7\xf6\x73\xd3\x4e\x2d\x28\xfe\xc8\xe7\xbd\x60\x50\xa9\x3f\x92\xa9\x78\xc0\x2e\x79\x34\xc5\x65\xc5\x15\x9e\xe1\x34\x10\x9c\x6c\xca\x67\x6e\xe3\xfd\xb3\xd4\x77\x03\xa5\x95\xc2\xd4\x8a\xb8\xe4\xce\x53\xc4\x25\x75\xbe\x1b\x83\xd6\x14\x72\x38\x9a\xa3\xe7\x53\x44\xd0\x78\xf3\x1a\x9d\xa4\x4c\x2b\xab\x22\xd5\xa0\xf7\xca\x62\xf4\x33\x4e\x87\x40\x20\xa3\x65\xb0\x15\x7f\x7f\x31\xec\xb1\xdb\xf3\x21\x36\xcd\xb8\x39\xbf\x1d\xd6\x25\xec\x83\xdb\xf3\x61\x83\x1e\xfe\xad\xd8\x3c\xbc\x99\xed\xd4\x2d\x73\xe7\x49\x34\xf0\x58\x74\x71\xe4\xdb\x8f\x2e\x8e\x7c\xfd\xe8\xe2\xc8\xbb\x38\xf2\x2e\x8e\x7c\xf3\xe8\xe2\xc8\xfd\xf8\xf8\xa6\x1e\xd6\xc5\x91\xef\x39\x9e\x97\x2f\xb3\x8b\x23\xdf\x69\x74\x71\xe4\xcb\xa3\x8b\x23\x5f\x33\xba\x38\xf2\x35\xa3\x8b\x23\xef\xe2\xc8\xbb\x38\xf2\x2e\x22\xe6\xd1\xb9\x9e\x66\x44\x0c\xeb\xe2\xc8\xfd\xe8\xe2\xc8\x9f\x85\xdf\x9f\x75\x71\xe4\x5b\x8d\x2e\x8e\xbc\x8b\x23\xdf\x67\x74\x71\xe4\x38\x3a\xdb\x4b\x17\x47\x1e\x46\x17\x47\x4e\xe3\xd7\x23\x35\x77\x71\xe4\x5d\x1c\x79\x17\x47\xde\xc5\x91\x6f\x5c\x45\x17\x47\xfe\x1c\xf4\xc9\xd0\x50\xab\x79\x10\xf4\xdb\x30\xd3\xf6\x61\x35\xec\x72\xc5\xaf\x68\x56\x31\x99\x9b\x44\x97\x53\x26\x1a\x78\x3c\xc7\x29\x23\x74\xcb\x94\x42\xd6\x27\x18\x9d\x93\x88\x54\xec\x17\x77\xce\x96\x0e\xcd\x2b\x9c\xab\xe2\xc2\x71\x60\x49\xf9\x03\x1e\x00\x9e\xaa\x9c\xfa\x77\x45\x2a\xcd\x72\x5b\x87\x29\x6e\xcf\x3e\xad\xb7\xc6\x62\xe2\x39\xea\x09\x75\x09\xeb\x17\xd3\xf6\x2b\x9d\xb9\x3e\xa2\x02\xc3\xe3\x10\x7e\x32\x6c\x41\x97\xc8\xb8\xb5\xa0\xe5\x29\xfb\xaf\xa3\x1f\x3f\xff\xa5\x7f\xfc\xf5\xd1\xd1\xbb\x17\xfd\x3f\xfc\xf4\xf9\xd1\x8f\x03\xfc\xc7\xef\x8e\xbf\x3e\xfe\x25\xfc\xf1\xf9\xf1\xf1\xd1\xd1\xbb\xef\x5e\x7f\x7b\x3b\xbc\xfc\x49\x1c\xff\xf2\x4e\xe6\xe9\x1d\xfd\xf5\xcb\xd1\x3b\xb8\xfc\x69\xcb\x49\x8e\x8f\xbf\xfe\x6c\xef\x25\x37\x16\x78\xdb\x13\x77\x5b\x12\x76\xdf\x8b\xa8\xeb\x7d\xbf\x2d\x9d\xc5\xb7\x7e\xb6\xc5\xd3\xe8\xd9\xd1\xa6\xd3\x18\x34\x6e\x14\xe2\x8a\x79\x84\x61\x2a\x15\xd6\x7a\x2a\xca\xab\x51\x5f\xc2\xd6\x54\x4e\x4f\x07\xb0\xdb\x21\xb7\xd4\x4e\xb0\x88\x98\xaa\x44\xec\xaa\x20\xd7\xf9\x36\x8d\x85\x35\x02\xcf\x73\x3f\x86\xb1\x90\xe0\xbd\x5c\x1d\x6d\x78\x7c\x74\xb4\xe1\x39\xd2\x06\x03\x51\xae\x85\x9d\x9f\x2b\x69\xe1\x61\x2f\xfb\xc9\x3a\x03\xd2\x4d\x7d\x6a\x46\x27\x8e\x28\x45\x78\x2d\x53\x19\x05\x4a\xae\x4d\xcd\x2b\x82\x6e\x75\x2e\x51\xa5\xa4\x1c\x0a\xb0\xa4\xef\xa1\xa6\x83\x51\x90\x8b\xaf\x0b\x1a\x1c\x4d\xfd\xcf\x5c\xcc\x78\xe2\xf4\xdb\xf2\x89\x21\xea\x2c\xd5\x87\xf6\x32\x62\x7d\x64\x19\x0b\xc5\x9b\xa1\x16\x33\x91\xc0\x04\x2e\x4d\xc4\x13\xa4\x4a\xed\x50\xfa\xb3\x35\xb3\xe3\x16\x69\x95\x18\x76\x3f\x05\x6c\xa3\xca\x83\x7a\x8e\x99\x0a\x13\x2e\x24\x4b\x1d\x51\xcd\xc2\xc3\x86\xf4\x7c\x47\xbc\x9d\xd4\x2b\x6d\xa9\xcf\xa3\xfa\x3a\x52\x2a\xf1\x61\xbd\xc9\xbc\x9c\xdf\xb7\xb5\x95\xea\x67\x09\xf7\x3f\xbb\xd9\x0c\x1b\x27\x7c\x52\xa8\xf1\x06\xec\x92\x25\xae\x9c\x7a\xed\x07\x60\xcc\x6c\x0e\x8c\x27\xf7\x7c\x6e\x4a\xa3\x46\xb5\xe1\xef\x29\x7b\x79\x8c\x88\xc7\x0d\x2b\xe6\x88\xd9\x17\xc7\xe8\xe7\x3b\x3f\x1b\xfe\x7c\xf3\xb7\x9b\x9f\xcf\x2e\x5e\x5f\x5d\x37\xa3\xf3\xee\xdb\x81\xcb\xbd\xe6\x88\x78\xc6\x47\x22\x11\x4d\xc8\xfb\x52\x24\x48\x75\x52\x64\xa0\x71\x7c\x12\x6b\x95\x11\x9c\x82\xfd\xa8\xaa\xe3\x5c\x2c\x98\x85\x3d\xcf\xa6\xed\x19\xd7\x27\x9c\x68\x2e\x6d\x69\x48\x29\x41\xae\x73\xe9\x94\xde\x4f\x3c\x68\x9e\xc7\xed\x05\xcc\x9f\xc5\x31\xc4\x35\xe8\x3d\xbb\x00\xbd\xf3\xf0\x71\xf3\x32\xd7\x96\x0d\xdf\xdc\x5c\xfd\x9f\x05\x34\x9c\x67\xcd\xe2\x91\xda\xc9\xef\xd1\xfb\x77\x20\x67\xcb\xc6\x84\x54\xcd\xba\xfd\x7d\x2a\xfb\x5b\xf0\xaa\x76\xbc\xe0\x6f\x73\x59\x65\x27\xb2\x32\x3f\x4b\x55\x0c\x03\x36\x2c\x2c\xe8\xf5\xab\xd5\x1a\x02\x1a\x98\xbb\x45\x5a\x81\xad\xce\x2b\xa2\x8c\x55\x94\xe8\x52\xcb\x30\xad\xd2\xe1\x31\x4f\x4c\x43\x62\xda\x84\x33\x39\x26\xfc\xda\xa9\x82\xad\x40\xb3\x98\x8d\xc5\x20\x95\xf5\x92\xa4\x5b\x25\x26\xdd\x6a\x15\x31\xd2\x3b\x2b\x21\x4b\x35\xee\xe2\x1b\xe0\x07\xc6\x24\x4c\x80\xd5\xb0\x98\x99\x2c\xb0\xb9\x01\xb3\x9a\x31\x95\x9a\xa8\x9b\x5d\x03\x8f\x31\x5f\x2c\xe3\x76\x4a\x11\x07\x29\x37\x77\x10\xd3\x0f\x5e\xae\x29\x4c\xf0\xd4\x0c\xdf\xbf\xea\xd6\xad\x3b\xd8\xdb\x51\x9e\xa1\x38\x08\xb4\xd3\xc3\xde\xd1\xe9\x8d\x8f\x80\xfb\xa6\x37\x32\x99\xbf\x55\xca\x7e\x53\xe4\x49\xb5\xb2\x81\x7f\xf5\x92\x22\xba\x59\xea\x21\x53\x18\x20\x10\xf7\x11\x98\x88\xd2\xd5\x14\xad\x8b\x72\xc3\x3e\x32\x42\xeb\x5c\x9e\x99\x6f\xb5\xca\xf7\xe6\x00\x4b\x82\xd6\xb7\x57\x17\x78\x8e\x73\xef\x01\x93\x56\xcf\x33\x25\xc8\x7c\xb2\x46\xa6\xfd\xde\xfb\xf0\xaa\x18\x59\xba\x5b\xd8\x6b\x3e\x67\x3c\x31\x2a\x08\xc7\x42\xae\x52\x75\x98\xd7\xa3\xdc\xe5\x91\xb2\xd3\x25\x05\xca\xa1\xf3\xf2\x73\xbd\x8a\x43\xac\xac\x9b\x22\xe4\xd2\xe3\x96\xdf\x81\x61\x99\x86\x08\x62\x90\x51\xc3\x5d\xfb\xd8\x6e\x20\xdc\xf9\x6b\x25\xdd\xb1\x68\x65\xef\xaf\x0a\xff\x1f\x9a\xb1\xea\x3b\x8d\x9e\x44\xaf\x77\x70\xf4\x27\xe2\xa1\xc8\x0d\x68\x72\x7e\xea\x1c\x68\x23\xbe\xcb\x47\x90\x80\x25\x65\x08\xeb\x07\x70\x4b\x2a\xaf\x48\xf9\x04\x18\xb7\x05\xa2\x58\xc5\x40\x1a\x47\x6e\xc8\x70\x66\x59\xac\xa0\x4c\x6e\xe4\x86\x7d\x7f\x75\xc1\x5e\xb0\x23\xf7\xae\x63\xdc\xfe\x31\x17\x09\xba\x1a\x2d\xd7\x8b\x6b\x14\xe3\x30\x05\x2e\x09\x71\x8f\x29\x4d\x47\xb4\xc7\xa4\x62\x26\x8f\xa6\x61\x4d\x4e\xe3\x0a\x0a\x9b\x8f\xb5\x43\x93\xfc\x33\x44\xd5\xc6\x04\xe6\x7b\x03\xba\x35\xfa\xf2\xfd\x1e\xf4\xa5\x2a\x42\x38\x9c\xab\x43\x8f\x10\x2b\x05\xcb\x63\x6e\xb9\xa7\x3b\x65\x46\xf4\x73\xdc\xd2\x8f\x4d\x7d\x0c\xbc\x12\x32\x7f\x20\xdb\x5a\x7b\x4a\xfe\xcd\x25\x4e\x8b\x28\x80\x40\xc3\x4d\xe3\x59\x96\x88\xd2\xf3\x58\x89\x6e\xba\xaa\x6d\x75\x6f\x8d\x88\x84\xc7\x3c\x38\x30\x1d\x67\xe7\x32\x56\xe9\xd2\xcb\xd0\x5b\xca\xa3\x69\xf5\x05\xcf\x12\x79\x3e\xba\x39\x22\x81\x19\x34\xa8\xcd\xb1\x80\x38\xaf\xdc\x6c\x4e\x16\x0b\x1b\x8a\xd3\xb3\x84\x8f\x20\x21\xce\x42\x08\x64\x96\x11\xe8\x63\x47\x08\xfe\x3f\xf6\xfe\x87\xbb\x71\xdb\xe8\x17\x80\xbf\x0a\x8e\xdb\x73\x6d\xb7\x92\xbc\x9b\xfe\x79\xd2\xbd\x7d\x9b\xe3\xd8\xde\xd4\x37\xbb\x5e\x3f\x6b\x27\x79\xfb\x26\x79\x5a\x88\x84\x24\xd4\x24\xc0\x10\xa0\xbc\xea\xcd\xfd\xee\xef\xc1\xcc\x00\x04\x29\x79\xb3\x26\xb9\x2b\xdb\x11\x7b\x4e\xb3\x96\x28\x10\x1c\x0c\x06\xf3\xf7\x37\xa5\xce\x86\xab\x8f\x78\xab\x33\x81\x29\x37\x9e\x10\x6e\xf8\x47\x41\x07\x18\x64\x28\x3a\x80\x21\xd3\xa0\x03\x98\x64\x8f\x81\x0e\x55\x8f\x83\x96\xb5\xe9\xe0\x4e\xed\x26\x1d\xe0\xe8\x7c\xe8\x74\x30\x22\x49\x74\x5e\x5c\x96\xda\x99\x5c\x83\x1d\x2d\x34\x6c\x1d\xdf\x41\x9b\x1c\x1c\xbe\xb1\xf5\x47\xd1\x9c\xe6\xcd\xbc\x8c\x92\xed\xb8\x45\x19\xef\x33\xee\xfe\x57\x74\xe4\x80\xe8\x69\x9f\x43\x7e\x94\x46\x00\xc8\xfd\x92\xbe\x78\xe4\xa5\xfe\x3d\xbc\x64\x83\x1c\x26\x3a\xe1\x19\x40\xa7\xf5\xe3\x18\xd6\xe6\x9a\xf6\xc0\x51\x86\x24\x84\x96\xe0\x33\x1f\xb5\x07\x14\x2d\xf8\x84\x7c\x5f\x4a\xa7\x22\x0a\x16\x62\x6a\xe7\x35\x66\xd2\xc1\x7d\x3e\x39\xd3\x9d\xea\x14\xbc\x17\x69\xe3\xd7\x56\x13\x3a\xcb\xeb\x00\xc8\xe6\x26\x28\x54\x2a\xd5\x1c\x3c\x3a\x23\x56\x8a\x0c\xd3\x3a\x69\x0f\xdf\xa0\xf9\xb5\x0f\x1c\xed\x07\xf5\xec\xec\x1f\x0d\x9a\x90\xd4\x8a\x46\x06\x27\x87\xd7\x6f\x66\x28\x2d\xa5\x61\x7b\xaf\x3c\x01\x7a\x20\x58\x3d\xc4\x03\x62\x0f\xdf\x30\xac\x26\xfa\xd8\x6e\xa4\x4a\x29\x03\xb2\x41\x2c\x6f\x24\x92\x16\x0a\xb9\xb5\x32\x8d\x45\xc3\x0b\xf6\x83\x62\x81\x58\x6c\xdc\x99\x3d\xde\xa2\xc2\xea\xdd\x4b\xe3\xf7\xbb\xfc\xc2\x43\xda\xc3\x7c\xa3\x60\xed\xdd\x73\xc7\xce\xec\x5d\xbf\xcf\xbf\xcb\xde\x36\xd7\xf5\x56\xaa\x54\xdf\x9a\xa1\x6d\x88\xef\x70\x58\xaf\x50\x27\x8e\xad\xad\x54\x73\x13\xdb\x11\x4d\x9c\xdc\xcd\x86\x84\x5f\xe1\x59\xa9\xb1\x0c\x6f\x5d\x81\x6f\x65\x6e\xef\x8c\x80\x7b\x5c\xf3\xdc\xf0\x93\xd2\xbd\x8a\x95\x3c\xbb\x2a\xba\xc3\xa6\xb1\x36\x1b\x7c\xf5\xfa\xea\xb8\x39\xb4\x93\x67\xb7\x0b\x51\xe2\xd9\xeb\xbe\x67\x3c\xcd\xa5\x31\xe0\x06\x12\xd3\x85\xd6\x37\xec\xc0\x27\x5a\xcd\xa5\x5d\x54\xd3\x49\xa2\xf3\x28\xe7\x6a\x6c\xe4\xdc\x1c\x11\xd3\x8e\xdd\xec\x0f\x99\x54\x59\xc8\x20\x01\x33\x52\x59\xe3\xdd\x18\xf0\x90\x24\xcc\x02\xd6\x96\x70\x17\x29\xca\xbc\x3e\x4d\x44\x5a\x94\x22\xdb\x3e\x18\xcc\xfa\xf2\x5c\xf4\xc4\xb5\xf8\x85\x25\x82\x77\xa7\xb2\x91\xb8\xc4\x69\x23\x1d\x51\x7b\xdb\x3a\x91\x48\x3b\x48\x84\x19\x0e\x31\xe7\xef\xf5\x98\x2c\x15\x58\xd9\x20\x20\xeb\x84\xdf\x99\x86\x04\x5e\xd9\x7d\x28\x90\xa3\x9f\xee\xc7\x1a\x2d\x44\x7d\xb0\x04\xc3\xd9\x03\x59\xb1\xe0\x63\x34\x92\x9d\x48\x02\x19\xe6\x75\x80\x85\x56\xba\x44\x16\x75\xa7\xa0\x56\xc0\xd2\x60\x2d\x60\x20\x08\xd6\x84\x64\x6c\x34\xd5\x93\x3a\x3e\x18\xc7\x90\xa0\xc0\x06\x0b\xf4\xeb\x39\xdc\x4a\xbb\x00\x10\xb9\x45\x2b\xe0\x04\x33\x29\x85\x81\xe8\x81\x62\xa2\x2c\x75\x49\x89\x30\xde\x6b\x0b\x23\x81\x28\x86\x4c\x1a\xc7\x24\xdc\xfd\xb5\x6f\xe2\x10\x65\x0d\x65\x0a\xb9\x5d\x8e\x9b\xc4\x6c\x26\x12\xd0\x94\x62\x02\xa3\xd8\x3d\xa8\x51\xf5\x7c\xea\xbc\xd5\x1e\x0a\x35\x97\xef\xdc\x53\xe2\x5f\xb5\x00\xd5\x95\x56\xe3\xcd\x5f\x1f\x4e\x18\x3b\x57\x21\xef\x71\xe4\x56\x31\xbe\xd3\xa7\xfc\x58\xf7\x8a\x31\x8e\x2e\xbc\x40\xec\x77\x72\xea\x5d\x59\x0d\xc0\xf1\x7d\x9c\xc1\x2c\x76\x08\x0f\x2a\x0e\xc0\x31\x4c\x83\xba\xa5\xf7\x87\x78\x1f\x47\xb1\xbb\xe5\x63\x39\x8b\x1f\xc7\x49\xcf\xfa\xca\x39\x2a\x57\xdf\x61\xbf\x7e\xd8\xb5\xc3\x7e\xbd\xfb\xda\x61\xbf\xee\xb0\x5f\x77\xd8\xaf\xef\xbf\x76\xd8\xaf\x74\x6d\xbf\x3c\x93\xed\xb0\x5f\x3b\x5e\x4f\x0b\x7f\x64\x87\xfd\x7a\xaf\x6b\x87\xfd\xba\x7e\xed\xb0\x5f\xef\xb8\x76\xd8\xaf\x77\x5c\x3b\xec\xd7\x1d\xf6\xeb\x0e\xfb\x75\x87\x62\xf5\x8b\x63\x3d\x4c\x14\x2b\xb6\xc3\x7e\xa5\x6b\x87\xfd\xfa\x24\xb0\x7a\xd8\x0e\xfb\xf5\x83\xae\x1d\xf6\xeb\x0e\xfb\xb5\xcb\xb5\xc3\x7e\x85\x6b\xe7\x7b\xd9\x61\xbf\xfa\x6b\x87\xfd\x8a\xd7\xaf\x47\x6b\xde\x61\xbf\xee\xb0\x5f\x77\xd8\xaf\x3b\xec\xd7\xf7\xce\x62\x87\xfd\xfa\x14\xec\x49\x63\x53\xd9\x09\x0e\xeb\x43\xd0\x0b\x28\x33\x24\xaa\x77\x9c\x56\xb3\x99\x28\x41\x72\xc1\x93\xd7\xb2\x10\x02\xca\x51\x90\x65\x94\x67\x00\xa8\x66\xa5\xe0\x29\x65\x41\xdf\xf1\x73\x2a\xb0\x04\xd8\xaa\x3a\x7d\xef\xec\xcd\xcb\x61\xa0\x12\xfa\x25\xae\xc1\x9c\xdf\xa8\xa4\x7f\x02\x53\x4d\xf0\x4d\x59\xf9\x44\xf7\x24\xd3\x86\xd2\x0e\x81\x58\xc9\x82\x2b\x25\xbc\xf1\x28\x2d\x38\x65\xa6\x42\x28\xa6\x0b\xa1\x50\x7e\x73\x66\xa4\x9a\x67\x82\x71\x6b\x79\xb2\x98\xb8\x27\x29\x4f\xec\x3a\x45\x90\x3e\x31\xb6\x14\x3c\xf7\xc9\x92\x39\x97\x38\x14\xe3\x49\xa9\x8d\x61\x79\x95\x59\x59\x84\xc1\x98\x11\x90\xe5\x8c\x07\x55\x20\x06\xa4\x97\xd4\x79\x85\xa3\xfa\x69\x34\x2d\x1d\x23\xc5\x80\xe9\x3a\x02\x68\xcb\xbc\xb0\x2b\xe6\x5e\x39\x23\xb8\xbb\xd2\x58\x96\x64\x12\x4e\x6b\x78\x22\x16\x94\xc1\x78\x23\x7f\x56\x2b\x9a\xa9\xa1\xa9\xaa\x14\xd4\xd6\xc2\x1a\x06\x69\x78\xf5\x80\x34\x54\x2a\x0d\xa9\xf9\x66\xc4\xb8\xc7\x41\x41\x42\xfb\x99\x02\xa9\xfd\xc9\x82\xa3\xd3\x47\xd1\x70\x11\x78\x9a\xe3\x4d\xf4\x86\xd5\x8c\x0e\x79\xa7\x9e\x39\x47\x8d\x14\xdb\x5a\xa1\x80\x74\x97\xb5\x6d\x00\x0b\xa0\xc4\xd2\xf1\x80\x48\x84\x3b\x5f\xf9\x1d\x5c\xff\xc9\x99\xde\xf2\x72\x2e\x6c\x48\xca\xed\x9a\xab\xd9\x04\x88\x88\x50\x0e\x63\x3b\xa4\xa6\x18\x10\xe7\x52\xa7\x90\x71\x4f\x28\x12\x8e\x67\x36\xc0\x28\xe2\x04\x09\x00\x67\xd3\x0d\x5e\x2f\xc2\x54\xa7\xf0\x50\x53\xf0\x44\x18\x76\x70\x7e\x79\x32\x62\x97\xe7\xa7\x94\xcf\xa4\x67\x9b\xca\xf8\x48\x84\x21\x03\xde\x05\xe8\x28\x8d\x7f\xc6\xed\x82\x5b\x58\xce\xe8\x41\xa0\x89\x2e\x78\x49\x89\x8a\x1e\xf9\x9a\x5d\x68\x2b\x36\x01\x65\x78\x69\x00\xea\x17\xf9\x20\x88\xd3\x50\x9d\xe9\x2e\x00\x3b\x9a\x2d\x91\x7e\xf4\x5a\x18\xc3\xe7\xe2\xb2\x63\x00\xeb\x2e\xe3\x1c\x62\x58\xf5\x1e\x05\xa9\x90\x61\xf9\x5a\xf8\xa4\xce\x78\x6b\x6a\xc4\x2c\xc7\x39\x85\xf5\xbe\x2d\xa5\xb5\x02\xf6\x37\x80\x27\x41\x0c\xbc\x5d\xa0\xba\xdf\xca\x9b\x7b\xed\x07\xa9\x7f\xec\xce\x77\x95\x62\x16\xdb\x54\xb0\x69\x29\xc5\x8c\xcd\x24\xa4\xc6\x41\xb2\xda\x08\xe1\x40\x38\x3a\x97\x8c\x11\x25\xcc\x87\xcc\x1a\x3f\xaf\x09\xfb\x8e\x26\x66\xcb\x4a\x21\x02\x3a\x69\xdc\x50\xc2\x25\x67\x6c\x0e\xc9\x6e\x64\x38\xfc\xf1\xd9\x5f\xfe\xcc\xa6\x2b\xa7\xdd\x00\x6b\x5b\x6d\x79\x16\x5e\x32\x13\x6a\xee\x68\x85\x92\xba\x59\x84\x14\x28\x00\x18\xe5\x38\xf1\xe7\x9f\xdd\x4c\x9b\xea\xd6\x51\x2a\x96\x47\x11\xfd\xc6\x99\x9e\x4f\xd8\x09\x57\x8e\xd7\x9d\x19\x51\xa4\xe0\xc9\xef\x8e\x1b\x3a\x1c\x9b\xe9\x4c\x26\xab\xfe\x62\x87\x6c\x13\xb6\xd0\xb7\x68\xf6\x6d\xe0\x9e\x3a\x1d\xb6\xd0\x45\x95\x61\x30\xe3\x65\x28\xdf\xab\x8c\x58\xaf\xd1\xd9\xb8\x2f\xc0\xfd\x4e\x43\xb4\xb6\x36\xe5\x38\xfa\x47\x6a\xca\xfd\x26\x07\x71\x80\xa7\x01\x9b\xf8\x25\xcf\xb2\x29\x4f\x6e\xae\xf5\x2b\x3d\x37\x6f\xd4\x59\x59\xea\xb2\x39\x97\x8c\xbb\x83\x73\x51\xa9\x1b\xc4\xa5\x0e\x25\xc4\x7a\xee\xb4\xec\xa2\xb2\x1e\x69\x74\xd3\x0b\x63\x41\xaa\x3f\x8f\xbd\x45\x5c\x8f\x22\xde\xc9\xda\xec\xa5\x52\x0a\xe4\xc8\x78\x7c\x13\x33\xdb\x67\xcf\xfe\xf8\x39\xb2\x2e\xd3\x25\xfb\xfc\x19\xe4\xc1\x9a\x11\x6e\x62\x90\x8b\x4e\x67\xc8\x79\x96\x39\xf1\x1a\x33\xa5\x23\xf4\x26\x26\xfc\xe4\x3c\x68\xfb\xb3\xdb\x07\x6b\xd5\xd7\xd7\xff\x80\x23\x41\x5a\x23\xb2\xd9\x08\xab\x06\x82\x85\xbb\x0f\x3a\xc2\x3e\x49\x1f\x28\xdd\x78\x00\xba\xf0\x52\x67\x55\x2e\x4e\xc5\x52\x0e\xd1\x78\xa2\x31\x9a\xf7\xfa\x64\xd2\x40\x81\xc6\x34\xd3\xc9\x0d\x4b\xe9\xcb\x28\xa3\xa9\x0d\xb1\xda\x9d\x0a\x5d\x73\xbb\x7a\xe4\x74\xdd\xf9\xfe\x8d\x6c\xae\x9c\x17\x85\x54\x73\x2c\x4e\x2a\xf9\x6d\x83\x18\xb0\x27\xa1\x1e\xb8\x27\xde\x42\xef\x88\x43\xdf\x78\xc3\x98\xde\xc8\xc9\xcd\xce\x43\x74\xce\x66\xea\x1f\xae\xa8\x67\xdf\xdd\x47\xdd\x60\x88\x7a\x40\xbf\x1b\x0a\xf8\x37\x66\xea\xaf\xa9\xcb\x41\x7d\x0c\x8c\x81\x0a\x80\x63\x1f\x10\xc9\xdd\x7d\xef\x03\x38\xba\xfb\xa5\xb2\x35\xe8\xa2\x42\x80\x21\xe7\x96\x14\x42\x6f\x41\x70\x56\x88\xd2\x48\xe3\xce\xe5\x6f\x61\x43\x9d\x64\x5c\xe6\x91\x37\x78\x3b\x44\xc0\xcd\x0d\xc8\x98\xfd\x25\xe5\xa5\x4e\x69\x40\x10\x85\x88\x0a\xba\x41\xad\x6d\x6a\xb5\x03\x1e\xa8\xdb\x16\x95\xdf\xd6\xd4\x6c\x4a\x4a\xf7\x49\x10\x95\x78\xd7\x53\x12\x90\xf0\x7e\x8f\x55\x3e\x86\xc9\x0f\x24\x06\x40\x30\xd2\xe2\x36\x25\x61\xc3\x78\xc4\x8d\x12\xa9\xf4\x64\x07\x4e\x18\x66\x57\xb8\x3d\x41\x3f\x65\xfb\x2f\xf6\xb7\x2a\x24\x91\x44\xa5\x2e\xf8\xbc\x57\x8f\x83\x16\xa5\xda\xc3\xc6\x85\xe0\xce\x0c\x82\xef\x03\x2c\x11\xdc\x25\xd2\x1a\xa8\x02\x60\x48\x30\x50\xee\x09\x4c\x06\x02\xf4\xa0\x61\xb7\x7c\xc5\x78\xa9\x2b\x95\x92\xab\x31\xf8\x7a\x5f\xb7\x1e\x7c\xa1\x95\xf0\x31\x94\x76\x1d\x39\x04\x77\xa4\x62\xcf\x27\xcf\x9f\x3d\x95\x93\x0a\xde\xb0\x75\x52\x5d\x84\x93\x0a\xe5\xd3\x56\xdf\xd5\xa3\x21\x0f\xf4\xbe\xaf\xc9\xc5\x52\x83\x1d\x4b\x0f\xe6\x0a\x1f\xdd\x96\xd2\x8a\xa8\x73\xd1\x01\x18\x2e\xce\x3e\x8c\xaa\xa6\x0f\x07\xc4\xf8\x1e\xa6\x4c\xdd\x54\xd3\x8f\x28\xb7\x48\x40\xc1\x76\xdb\xe4\xe1\x32\xef\x11\x61\x31\xa1\xf6\xf6\xd8\x01\xde\xb9\x8f\x45\xa2\x87\x5b\x65\x2d\x22\xda\xd9\xbb\xa2\x07\x06\x5d\x83\x70\x67\xef\x0a\x0e\x3e\xb8\x62\x40\x0a\x7e\x29\x16\x7c\x29\xa0\x38\x56\x66\xbc\xcc\x20\xfc\x7c\x85\x73\x67\xd3\xca\x32\xa1\x96\xb2\xd4\x0a\x72\xbd\x96\xbc\x94\x80\x5a\x51\x8a\x99\x28\x85\x72\xb6\xe8\x6f\x0f\xbe\x3d\x7e\x0b\xb9\x2d\x87\x88\x65\xef\x67\x59\x19\x0f\x2f\x11\xcf\x24\x1a\xee\x17\x97\xcf\xcf\xc3\xd1\x10\x64\xae\x9f\x97\x7b\x4e\x5e\xd9\x0a\x01\xf3\xdf\x25\x59\x65\xe4\x72\x5b\x92\x84\xaa\x96\x4f\x65\xa7\x75\x6e\x55\x50\xd7\x84\x5a\x2b\x86\xae\x7d\xf0\xbf\x80\xd0\xba\x6f\x02\xa6\x55\x9c\x0e\x41\xae\x27\x96\xcb\xf9\xc2\x52\x5a\xa6\x87\x34\x5b\x53\x21\x00\xd7\x61\xbb\x4e\x28\x77\xec\x1e\x67\x92\x9b\xfb\xaa\x5c\x6b\x15\x87\x34\x0a\x24\x51\x28\x02\xa2\xe2\x59\xf0\xad\xb8\x07\xa1\xc3\xf1\xfc\x92\xa2\x53\x9e\x6e\x52\xfd\x1b\x93\x56\x82\x75\x81\x49\x28\xf8\x13\xf4\x1a\xce\x62\xcc\x00\x9f\xac\x01\xc2\x1f\x50\x56\xc0\xab\xa5\xb4\x1a\x2f\x22\x40\x92\x42\xa7\xf7\xac\xc6\xeb\x6a\x78\x74\x32\x39\x36\x53\x90\x2d\x74\x96\xfa\xbe\x9c\xe8\x92\x99\x0a\x7b\x2b\x84\x62\xe7\x97\x40\x3f\xf7\x8a\x10\xed\xb9\x83\x8a\x18\x1d\x00\xe8\x91\xc8\x22\x6d\xd0\xf3\xbe\x0c\xd6\xc3\x2a\xe9\xa3\xd2\x87\x37\xed\xbd\xe7\xff\x1e\x68\xe6\x23\x62\x7c\xaa\x97\x02\x48\x9a\xa6\xa5\x30\x3d\xa0\x3b\xb6\x60\xa7\xf6\x12\xa5\xb2\x53\xdf\x85\x66\x7c\x23\x90\xcd\x7b\x88\x40\x7d\x87\xad\x0a\x8c\xf7\x89\x25\xd8\xf9\xe5\x49\x0f\xe9\xb5\xff\x0d\x85\x37\xdc\x50\xfb\xfb\x86\xc9\x22\xa9\xe3\xa9\x13\x56\x47\x0d\xa3\x8a\x06\xd4\x18\xef\x17\xb2\xea\xaa\x26\x46\x42\xad\xa7\x90\x66\x0a\x87\x71\x62\x85\xaa\x99\x43\x94\x58\x1a\x0c\x13\x37\xa8\x61\xfc\x2f\x62\x82\xf8\x44\x04\x14\xf2\x94\x96\x31\x0a\x09\xbe\x2d\xc1\x04\x1e\x74\x9f\xda\x17\x49\xf1\x35\x62\x7e\x32\x5a\x5e\x9e\x9f\x0e\xc9\x2e\x85\x4c\x1f\x1c\xbb\xdc\xdf\xbe\x6c\xd6\xae\x35\x21\x1f\x68\x40\xbf\xd9\x2f\x75\x7a\x87\x9a\x54\x1f\x34\x70\x7f\xdc\x5d\xd0\x6a\xc6\x19\xba\x09\x5b\x7d\x63\x3b\x10\xe5\xde\x52\x02\x54\xad\xcb\x2a\xcb\xae\x44\x52\x8a\xfb\xba\x47\x9b\xeb\x7f\xde\x1a\xeb\x2e\x95\x27\xd2\xdf\x01\x47\x80\x6e\x56\x35\xc0\x5b\xe0\x9a\xb8\x4a\xb0\xa8\x32\xc8\x33\xe5\x6a\xe5\x09\x0e\xb3\x37\x51\x2c\x4a\x1a\x9f\xb3\x82\x29\x52\x8d\x55\x30\x22\x3c\x2c\x74\x0b\xe1\xc6\x60\xc4\x54\xaa\x54\x2e\x65\x5a\xf1\x0c\x1e\x04\x5a\x68\xdc\xd3\x37\x9c\x90\xb9\x07\x2c\x64\x2f\x75\xc9\xc4\x3b\xee\x6e\x1b\x05\x25\x96\x1b\x60\x87\x54\x27\x37\xa2\x1c\xa1\x2a\x76\x0a\x7f\x9c\x80\xc6\x8b\x90\xbc\x7e\x1e\xce\x96\x20\x98\xbe\x2e\x6d\x82\x7d\x1f\x60\xa4\xc3\x6f\xf0\x75\x57\x52\xcd\xc7\xf0\x89\x7b\x11\x7a\xd2\x58\xab\x31\x1f\x3b\x36\x7c\x24\x8a\x1f\x60\xf0\xbe\x01\xcd\xea\xad\xe7\x17\x6f\x22\x38\x43\x4e\x57\xf3\x05\x10\xab\xcc\xb9\x87\xc5\xca\x84\x05\xc4\x23\x8a\xeb\x22\x34\x05\xfd\x36\x25\x35\x2d\x46\x80\x6a\xf2\xda\x23\x51\xfe\xba\x7a\xc8\x5a\x99\xc2\x91\xd8\x22\x1a\xd9\x7b\x73\xa0\x5e\x8a\x72\x29\xc5\xed\x11\x1d\x9d\xe3\x5b\x69\x17\x63\xa4\x88\x39\x02\xc2\x1e\xfd\x06\xd5\x4b\x2c\xdc\x3a\x4e\x53\x72\x5b\x56\x46\xcc\xaa\x8c\xfa\xe5\x4e\x18\x2f\xe4\xb7\xa2\x34\x80\xab\x78\x23\x55\x3a\x62\x95\x4c\xbf\xf8\x84\x89\x2f\x52\xc9\x3a\xc5\xae\x97\x14\x7c\x45\x52\x8e\xea\x85\xe5\x7f\xea\x96\xb6\x94\x1c\x34\x15\x99\x56\xf3\xa8\xda\x19\xd4\x8b\x73\x25\xed\x5a\x6b\x3e\x44\x2d\x03\x13\x59\x97\x29\x24\x32\x4a\x5d\x36\xfc\xc1\x6e\x3c\xc0\x72\x8a\xd2\x21\x9d\x88\x94\x8d\xf1\x20\x9d\xc5\x84\xc3\x88\x61\x42\x84\x2f\x8c\xf4\x08\x99\x1e\x23\x0a\x21\xcb\x16\x5c\xa5\xf0\x67\x92\xe8\x32\xa5\xf9\x4a\x1b\x72\x2f\x31\x29\x08\x33\x51\xe0\x58\x83\xee\xea\xaa\xfd\x64\xb0\x40\xcb\xbc\x91\xa8\xe7\xd5\x9e\x4a\xc9\x9f\x2a\xc1\x78\xae\x9d\x60\x6f\x03\x39\xb7\x28\x92\xf3\x15\x9c\xad\x30\xd5\x57\xa1\xd2\x0f\x8b\x09\xcd\x88\xbd\x15\x3c\x95\x51\x41\xf4\x88\xbd\x6a\x56\x48\x8f\xdc\x5c\xae\xb0\x74\x93\x3e\xc2\xd9\xfb\xe6\xea\x6f\x31\x48\x94\xfb\xbc\xa2\xf5\x97\x71\xab\x62\xf9\x8d\x50\x68\x94\x3b\xd2\x40\x1c\xac\x2a\x61\x0d\x92\x85\x48\x2b\x38\xa5\xa6\x2b\x36\x93\x88\xee\x0e\xaa\x82\x9c\x2f\x84\xb1\x5e\xb9\x3c\x82\x5c\x9d\xba\x4d\x8d\x9f\x00\xb0\x6f\x94\x69\x5b\xbb\xb1\x72\x0e\xd0\xa5\x9a\x3a\xd3\x53\x31\x09\xda\x6c\xa6\xca\xfd\x5e\x6e\x53\xda\x4c\x7c\x4f\x7b\x37\xf3\x08\x35\x5b\xb6\x88\x0b\x41\x3a\xf2\xc3\xb1\x19\x37\x0b\xc0\x94\x6f\x2f\x41\x82\x2e\x99\xa4\x2a\x9d\xc0\x40\x98\x59\x0e\x4d\x64\xa1\x63\x21\xf4\x1b\xdd\xe4\xb8\xe9\x59\x3c\xe0\x26\xdb\xbd\xef\xfd\xf6\x0e\xb1\xe3\x90\x0c\xee\x08\x9f\xb4\x24\x01\xae\xa4\x3b\xb0\x3c\xb6\x94\x6f\x43\x0e\x8b\xe1\xa4\xc2\xa7\x3b\x92\xba\xc7\x47\x3b\xc5\x35\xfb\x9c\x80\xbc\x9c\xf7\xf7\x7c\xec\x1f\x97\xf3\x0a\x37\x3a\x49\xe1\x1a\x94\x96\x5a\x79\x82\xd6\x86\x3a\xa6\x33\x67\x4e\x5e\x9f\xc6\x25\x48\x71\x6d\x85\x2f\xe0\x9a\xb0\x6f\xfb\x3a\xa9\xdb\x5e\x6a\x27\xcd\x6b\xd7\x77\x12\x76\x96\x93\x18\xd9\xd2\xdb\x17\xe1\x69\x5e\x0f\x95\xaa\xa8\x2c\x1d\x83\xb5\xc5\xa9\x92\x05\x57\x73\x30\x32\x75\xe5\xc6\xfb\xed\x6f\x61\x46\xa5\x48\xab\x84\xd0\xf4\x3d\xcb\xfe\xd6\xbb\x6c\x09\xcf\x0b\x64\x95\x49\x78\xe1\xe7\x1c\xbf\x96\x59\x29\xcb\xdf\xbd\x60\x72\x22\x26\x6c\xef\xb7\xd1\x57\x7b\xf8\xf4\xa2\xd4\xee\x11\x54\xfa\x00\xb3\xca\xa4\x85\xf4\xed\xbd\xf8\xee\x09\x3b\x73\xcf\x80\x30\x56\x20\x60\x94\x9d\x3f\xad\xc9\x37\x62\xa5\x98\xf3\x32\xcd\xc8\xdd\x72\x1b\x95\x74\x04\x82\x89\x77\xd2\x58\x83\x67\x90\xed\x21\x99\x2c\x37\x37\x4e\x0e\xb9\x9d\x35\x4e\xb9\xe5\xe3\x68\x4b\x1f\xa1\xdd\x36\x26\xb8\xcf\x31\x27\xd6\xaa\x45\xd6\xd1\x6f\xa8\x32\x72\xcc\xc3\x5d\xd2\x69\xe4\x00\xbc\xd9\x5d\xcf\x79\x6c\x3e\xb6\x1e\xa8\xaf\xcd\xdd\x7b\x56\x23\x48\x03\x0d\x20\x8b\xbf\xd6\x97\x82\x10\x25\x60\xd3\x4d\xfb\xf9\xec\xe2\xfa\xed\x3f\x2e\xdf\x9c\x5f\x5c\xef\xb6\xf5\x6e\x5b\xef\xb6\x75\x8f\x6d\x2d\xd4\xb2\xf7\x96\xf6\x76\xd3\xa6\x90\x6f\x1b\x70\x32\x2a\x0d\x7a\x42\x89\x75\x67\x6a\xf9\x2d\x2f\xeb\x36\xf6\x14\xaf\xda\x10\x01\xf7\x7d\xee\x41\xc4\x9d\x3c\xfa\xcc\xba\x2d\xe6\xc5\x0d\x98\x6f\x14\xbb\x54\x36\xad\x5a\xdc\xfb\xeb\xe4\x9f\xe7\xa7\x67\x17\xd7\xe7\x2f\xcf\xcf\xde\x6e\x35\x51\xa4\x27\xe0\x63\xf3\x50\xee\x78\x4a\x16\xa5\x58\x4a\x5d\x99\x6c\x15\x7a\x6c\x6d\x16\x02\xeb\xb9\x86\x2a\x05\x5f\x87\x11\x25\x64\x5d\x6f\xfc\xd9\xee\xb0\x1d\xf6\xb0\x6d\xe6\xcd\xf4\x80\xe7\x19\x8a\x7d\x5f\x96\x3a\x1f\x88\x85\xaf\xd0\x0b\xe3\x83\xe1\x9b\xf8\x69\x9f\x90\x3c\x1a\x47\x0f\x29\x8f\x35\x6c\x88\x53\x46\xf3\xc2\xf6\x00\xc3\x1f\x04\xe2\x77\x18\x34\x5c\xcc\xd5\x79\xcd\x8b\xaf\xc5\xea\xad\xe8\x89\x02\xd4\xa4\xb7\xc8\x44\xe2\x0e\x3a\x76\x23\x56\x98\x98\x79\xe2\x1f\xd6\x07\xad\xe8\x41\x22\x24\xdf\x88\x3e\xe8\xd5\x43\x42\x1b\xdf\x88\x1e\x49\xa7\xfe\x5a\x03\xf9\x75\x4b\x08\x7a\x9a\x5b\xd3\x7e\xab\xc7\x86\x85\x35\xfe\x08\x50\xce\x4f\x37\x82\xd2\xbc\x06\x5c\x05\x1f\x08\x1e\x78\x25\x30\x26\xbf\x6a\x9c\x5d\x41\x88\x30\xac\xea\x04\xde\xf4\x41\x07\x52\x32\x06\x22\x4d\xdf\x26\x5c\x0c\x97\x70\x58\xb9\xba\x5f\x0b\x56\xcc\xf1\x0f\x38\x73\xe9\x0b\x0f\x65\x60\x42\xe7\xac\x89\xe3\xb0\x51\xf3\x4f\x08\x89\x8e\xd8\xbf\xc2\x87\xd0\x6b\xda\x7c\xbf\xbf\xff\xd7\xaf\xcf\xfe\xf1\xb7\xfd\xfd\x1f\xff\x15\x7f\x0b\x47\x21\x06\xca\x9b\xb7\x00\xae\x93\xd2\xa9\xb8\x80\x67\xc0\x9f\xa4\xae\x1d\x63\xf0\x84\xbe\x80\x8a\xec\x09\x66\x2d\x85\x3f\x0b\x9d\xb6\xff\x32\xbd\x00\x01\x1f\xe4\xc1\x00\x4b\xd4\xa3\xb2\x08\xaf\xe1\x8e\x87\x5a\x96\x0c\xbc\x55\x69\x54\xcf\x8d\x00\x2c\x8d\x90\x64\x2f\x3d\x09\xa0\xbb\xa7\x87\x7e\x50\x50\x2f\xef\x34\xd3\x26\x3a\xe4\xde\xf2\x79\xaf\x3e\xc6\x78\x0d\x28\xda\xc2\x0a\x0e\x4c\x30\xa0\x88\x6f\x18\x06\x1b\x39\x1c\xb0\x21\x61\x26\x74\x9f\x3b\xbe\x3c\x67\x4b\xa4\xf0\x83\x21\x8e\x0f\x6c\xbe\xfc\xa8\x32\x2e\x84\x4f\xdb\x75\xb9\x2f\x30\x01\xc7\x7f\x4f\x18\x09\x26\x20\xd8\x09\x67\xd8\x1c\xe0\x87\x93\xa4\xa8\x46\x74\xc3\x24\x17\xb9\x2e\x57\xe1\xcf\x00\x36\x33\x36\x56\x97\x7c\x0e\x35\x35\xf8\x73\xfc\x59\xf8\x0b\x7f\xd8\x78\xc0\xfa\xaf\xd1\x14\xae\xa3\xa8\x01\xe0\xf6\xe9\xc9\x36\x4f\xfa\x07\x22\xda\x92\xbe\x30\x4a\xcd\xab\xc9\x90\xc1\x13\x87\x0a\x67\xa0\x22\xd8\x93\x54\x33\x3c\xaa\xf3\xe1\xc0\x1b\xa0\x96\xce\xb2\xec\x0c\x80\x57\x5f\x03\x4a\xb3\x54\x2e\xa5\xd1\x3d\x2a\x87\xc2\x40\x77\xe7\x4e\x12\x6c\x09\xe6\x6f\x05\xb7\xd9\xbb\x02\x30\xbf\xc2\x7e\x6d\x89\xfd\xe7\x7d\x9a\x9c\xe3\x55\x70\x6b\x45\xa9\x5e\xb0\xff\x39\xf8\xe1\xf7\x3f\x8f\x0f\xbf\x38\x38\xf8\xfe\xd9\xf8\x2f\x3f\xfe\xfe\xe0\x87\x09\xfc\xe3\x77\x87\x5f\x1c\xfe\xec\xff\xf8\xfd\xe1\xe1\xc1\xc1\xf7\x5f\xbf\xfe\xea\xfa\xf2\xec\x47\x79\xf8\xf3\xf7\xaa\xca\x6f\xf0\xaf\x9f\x0f\xbe\x17\x67\x3f\x7e\xe0\x20\x87\x87\x5f\xfc\xb6\xf7\xd4\x07\x80\xe0\xc5\x6b\x48\x20\xde\xe6\x88\x83\xb0\xdf\x47\x6c\x65\x81\x97\x67\xaf\xa1\xf7\xff\x5b\x2f\x35\xa3\x7c\x1e\x7f\x5c\x3f\x98\x0d\x8e\x09\xa1\x9f\xc2\x93\x83\x4f\x6a\xd6\xda\x04\xd3\xe2\xa9\x9d\x73\xbf\x06\xe7\x8e\x57\xdb\x71\x5d\x6b\x4d\x74\x56\xea\xdc\x57\xf4\x43\x78\x03\x6b\xcf\xe8\xbe\x1b\xd1\xab\x25\x28\x5e\x3b\x67\xd0\xce\x19\x74\xc7\xf5\x8b\xce\x20\x2c\x47\x78\xb8\x9e\x20\xa1\x96\x5d\x43\x18\x1b\x23\xe8\xde\xd6\x89\xe1\xef\x3e\x2c\xa0\x36\xf1\x5b\xdd\x84\x48\x5c\x9d\x49\x83\x07\x5a\xbe\x39\x86\x09\x0d\xfc\xa5\xc2\x8d\x0f\x03\x04\xd0\x4f\x41\xbd\x3b\xa8\xfe\x72\xe9\xa6\x10\x90\xde\x1b\xd8\x9d\x90\x55\x2c\xd5\x9c\x90\x2c\xf0\x28\xa1\xe8\x93\x54\x35\x1a\x6e\x50\x0e\x6b\x08\x75\x6e\x8c\x4e\xa0\xf1\x11\xe2\xe4\x05\x54\x3e\x9a\x36\xcc\xc6\xf2\x1b\x11\xb7\x62\x47\x78\xf5\xfa\x5d\xa7\x2b\x40\x7d\x55\x4b\x0f\x31\x9f\x56\x98\x0c\x82\xe2\x6f\xf3\x18\x4f\x2b\x01\xc1\x31\x22\x05\xc1\xa2\x3c\x04\x90\xfa\xc1\xc2\xe6\x90\x8a\xa1\x67\xb5\x97\xb5\x5b\x33\xcb\xde\xa7\x78\xff\x33\x33\x44\xb6\x7a\x29\x43\x6b\x87\x65\xed\x7e\x6e\x1e\x92\x4f\x21\x18\xd8\xff\xf8\xfc\xd5\x1d\x9d\x03\x1d\x9b\xc3\x1c\x99\xf7\x88\x9d\x0c\x79\x4c\x0e\x11\x2c\x29\x4a\x31\x93\xef\x06\xda\xa7\xc7\x51\x65\xa2\x4c\x85\xb2\x72\x26\xb1\x5f\x6f\x51\x8a\x42\x28\xec\x99\xcf\x93\x05\xc8\x7e\x3a\x29\xeb\xe0\xf4\x43\x4c\xe6\x41\x85\x7b\x58\x51\x76\xb5\x49\xd9\xdf\xc9\x31\xb6\x93\x63\x9d\xaf\x4f\x24\xc7\x88\x73\x1f\x8e\x10\x83\xcc\xf3\xfe\xa9\xef\xa7\x51\x1e\x3b\x70\x71\xff\xca\xe1\x16\x1a\x5c\x90\x8b\x56\x63\xe6\x1a\x96\xaf\x95\x2c\x13\x4b\x91\x91\xd2\xc4\x72\xae\xf8\x1c\xdb\xf0\x59\x1d\x40\x7f\x74\x19\x5a\x1c\xb5\x11\x7d\x40\x89\xf7\x95\x5d\xf0\x65\xa9\xb3\x4c\x94\x86\x65\xf2\x46\xb0\x53\x51\x64\x7a\x95\x53\xe2\x6b\xca\xae\x2c\xb7\x8e\xa5\xaf\x84\xed\x16\xf3\xed\x87\x06\xe2\x8b\xd9\x07\x82\x3e\xc7\xea\x78\xa8\x2d\x67\x05\x15\x4e\xbe\x51\x20\x31\x8e\xa1\xdb\xca\x88\x5d\x88\xa5\x28\x47\xec\x7c\x76\xa1\xed\x25\xaa\xde\xcd\x6c\x3b\xbc\x91\xc9\x19\x7b\xe1\x8c\x3a\x63\x99\xc5\x8e\x17\x51\x9d\xbb\x2e\x1b\x03\xd4\x78\x6f\x43\x94\xe5\xad\x97\x9c\xc3\x48\xa1\xe0\xbc\x53\x18\xa3\xd7\x32\x85\x96\x42\xbd\x17\xe8\x18\xcb\x48\x6b\x24\xdf\x88\xbf\x11\x9e\xc1\x23\x98\x81\x09\x28\x15\x2b\x85\x29\xb4\x32\xa2\x09\xcf\x58\xb7\xa0\x04\x53\xd7\x0c\x6a\x21\x76\x3e\x39\xfb\x9e\x99\x85\x36\x16\x2a\x67\x87\x69\x54\x75\xe9\x87\x83\x42\x64\x9e\x65\x22\x6d\x74\x2a\xc3\x0e\x3b\xbc\xe9\x1e\x48\xa0\x39\x83\x6f\xf8\x22\xa8\x3e\xb9\x51\xda\xdc\xb8\x3f\x74\xbd\xf3\x7d\x65\x7c\xff\xe4\xbb\x0a\x9a\xeb\x8d\x09\x87\x48\xc4\x00\x6b\x78\xcf\x80\x02\x6e\xa2\xe6\x34\x0b\xad\x6f\x58\xa2\xf3\x22\x83\xad\xd3\x63\x67\xd5\xbd\xb1\x02\x2b\x8d\xa1\x1f\xea\x51\xd4\x36\x0b\x3e\xd8\x62\x7f\xd3\x21\x74\x30\xf1\x4e\x24\x83\xf5\xd5\x74\xb2\xd4\xad\x32\xc4\xfb\xb5\x0a\xaa\xd8\x4c\xbb\x03\x0c\x8a\xb3\x03\xfe\x60\x04\xb6\x73\xf6\x4e\x24\x51\x6f\x5a\x40\xc0\x4a\x3c\x9e\x84\xdb\xe8\xfd\x7b\x8e\xf7\x0e\x53\x0c\x15\x1a\xe8\x51\x7c\x17\x5f\x2d\xd0\x40\x18\xd3\x63\xa4\xd3\x23\xa0\xdd\x04\xd8\x4f\x58\x90\x17\x83\x6e\x04\x1e\xc6\x1d\xbb\x86\x34\x18\x92\xaf\xfd\x58\xd0\xd5\x47\x6b\xcb\x0e\xf6\x8f\xf6\x0f\xd7\x7c\x96\x2d\xa0\xed\xeb\xe8\x97\x12\x90\x25\x0b\x80\x69\x14\xc9\x7e\x3a\x62\xd2\xfa\xec\x6c\xec\x13\x04\xb3\xa2\x2a\xc1\x11\x33\x9a\xd9\x92\xa7\x92\xb4\x1f\xf8\xd4\xdd\x64\xcb\x8a\x0e\x87\x83\xfd\x9f\xf7\xa9\x4d\xd1\xad\x56\xfb\x16\xa6\x3f\x61\xd7\x88\x52\x13\x06\x5a\xe9\x0a\x9a\x6f\x22\x09\x8a\x4c\x26\xd2\x66\x2b\x10\x74\x4c\x57\xd8\xa9\xcb\x1d\x33\x54\x9d\x78\xf6\x4e\x5a\xdf\x92\x44\xcf\xd8\x33\x6c\x14\x26\x38\x79\x4d\x33\xb9\x14\x47\x0b\xc1\x33\xbb\xc0\xc4\x12\xa5\xd5\x18\x7b\x3d\x3a\x09\x44\xdf\xf4\x8d\xb1\xf4\x73\x41\xc6\x57\x0f\x77\xe4\xfa\x84\x7a\x5a\x1b\x4e\xf6\x7e\xd5\xbd\x9b\x35\x5b\x03\x0b\xbb\xbe\xbe\xfc\xaa\xd1\xce\x1a\x84\xbf\xb5\x85\x4f\xf7\x89\x9a\xbe\x3f\x00\xd9\x31\x4c\x80\xb3\x57\x2f\x6a\x36\xa0\x08\xeb\xdb\x93\x9a\x6d\x06\x7f\xfb\xf0\x66\xd4\xec\x1f\xba\x02\xe8\x10\x3e\xcd\x56\x01\xb7\xc1\x08\xcb\xf6\xdc\x50\x7b\x4e\x3c\x39\x6e\xf8\xbb\xe0\x29\xc2\x6a\x18\x2b\x78\x27\x8d\x2f\xbe\x06\x0b\xbc\x45\x73\x1b\xf6\x1c\xa8\x8c\xd5\x39\x5b\xd0\x6b\x37\xcb\x35\x69\x67\x4c\x60\xf7\xf8\x5a\xa8\x52\x14\x28\xe1\xe8\x37\x4f\x4e\x7e\xad\xc9\x0d\xa4\x7b\xa3\x67\x42\x12\x93\x2d\xee\xac\x23\x15\x12\x0b\x51\x6a\x06\x92\xa5\x03\x24\x4c\xb0\x01\x93\x26\x58\xbf\xe2\xcf\xf6\x40\x10\x08\xec\x9f\x1f\x36\x58\x1e\x06\x1b\x2c\xd7\x80\x6d\x72\xcc\x12\xcf\xa0\xd3\x66\x20\x22\x0e\x1a\xe1\x67\xfd\xcb\x4b\xe3\xeb\xfd\x04\x18\x66\xf1\xd9\x90\x14\x28\x06\x48\x07\x5f\x4f\x06\x47\xd0\x29\x28\xd7\x44\xe1\x0a\x62\xc2\x88\x72\xd9\xb5\x00\xbc\xbe\x86\x7b\x75\xdd\xdd\x51\xe0\xaf\x0d\xb5\xd5\x25\x53\xa1\xc1\xb5\x07\x55\x5d\x27\x48\x94\xcd\x40\xfd\xb0\xbd\x0b\xd8\x1f\x47\x5c\xcd\x05\x7b\xee\x7e\xf9\xe7\x3f\xfd\xe9\x0f\x7f\x9a\xe0\xf0\x21\xb3\x41\xb1\xf3\xe3\x8b\xe3\x7f\x5e\x7d\x7b\x02\x05\xb5\x7d\xa9\x3a\x50\xda\xe6\xd0\x49\x9b\x83\xa6\x6c\x7e\xd4\x84\x4d\x28\x13\xe9\x2d\x45\x9a\xf1\x02\x18\x32\x46\x17\x25\xdd\x2f\x42\xe5\x73\xba\x66\xd3\xff\xea\xb6\xda\x83\xd8\x63\x36\x29\xae\x74\x72\x33\xa0\x5d\xb3\x7f\x7d\x72\x89\x43\x46\xa6\x0d\x57\xde\x19\x22\xd5\x52\x67\x4b\x40\x5f\x65\xd7\x27\x97\xb0\xf3\x26\xf0\x2f\x70\x44\x81\x45\xbd\x12\xb6\x2e\x64\xa0\xf0\x54\xc0\x50\x85\x22\x0d\x9e\x49\x63\x65\x02\xbf\xab\xdd\xa4\x6e\x84\x3e\x71\xa9\x9d\xa5\xb4\xe9\x1a\xdc\x52\x8a\x9a\x04\xdf\xd7\x68\xea\x9b\x78\xf8\x80\xcf\x25\x3a\x8f\xca\x46\x17\xed\xdd\xb9\x34\xc0\x78\x0f\xf7\x5c\x2a\x4a\x71\x65\x75\xa7\x6e\x01\x6c\x3d\x12\x82\x83\xdd\x11\x07\x99\x8a\x99\x2e\x45\x3b\x10\x12\x05\x36\xd2\x0a\x36\x21\x57\x50\xfd\xe7\x5d\x50\xba\x11\xbc\xc0\x94\x4b\xdf\x21\x3b\x23\x4c\xd4\x23\x13\x03\xa1\xfa\x76\xc7\x23\xf7\x76\x22\x87\xd9\x8d\xea\x32\x06\x6a\xb6\x0c\x1f\x0a\x9b\xa0\x9b\xd5\xc7\x5f\xc8\xa3\xea\xa7\xdf\x0e\x95\x24\x25\x37\x0b\x6c\x44\x2c\xde\x49\x1b\x20\x57\xb9\xd1\x0a\x9d\xbd\x51\x4f\x64\x69\x22\x4c\xee\x28\xc8\x83\x3f\xba\xd4\x69\xbb\xe7\xf8\xbc\xe4\x89\x60\x85\x28\xa5\x4e\x19\xd4\x13\xa7\xfa\x56\xb1\xa9\x98\x4b\x65\x3c\xfd\x00\x9c\x9d\x08\xed\x8e\x1b\x01\xbe\x61\x8f\x16\x37\x61\x6f\x1b\x20\x28\x54\x9e\x94\xe8\x7a\x47\xd3\x2c\xda\x41\x26\xc8\x08\x05\xf2\x62\x37\xa0\xb0\x30\x71\x83\xa4\x5f\x98\xf4\x00\xd1\x26\xec\xe1\xe5\xbf\xbb\x93\x3a\xd2\x38\xaa\x27\x8b\x7e\x81\xdf\x5d\x78\xea\x03\xaf\x5d\x78\xea\x7e\xd7\x2e\x3c\xb5\x0b\x4f\xdd\x7d\x3d\x38\xf7\xee\x2e\x3c\xb5\x33\xba\xda\xd7\x2e\x3c\xb5\x0b\x4f\xdd\x71\x3d\x38\xf9\xb5\x0b\x4f\x7d\xc0\xb5\x0b\x4f\x7d\xe0\xb5\x0b\x4f\xed\xc2\x53\xbb\xf0\xd4\x2e\x3c\xf5\x2b\x72\x03\xfa\x6b\x17\x9e\x5a\x1b\x64\x17\x9e\x8a\x88\xb1\xb3\x94\x36\x5c\xbb\xf0\xd4\x86\x6b\x17\x9e\x8a\xae\xdd\xb9\xd4\xe1\x5c\xf2\xc1\x9d\x4b\x67\x97\xf5\xaf\x59\xbb\x84\xc0\x81\x4c\x28\x46\xa4\x67\x8d\x3a\x27\x7c\xd4\xa4\x6e\x40\x11\x61\x7e\xf8\x52\x1b\x8a\x06\xd5\x31\xa6\x8d\xf5\x50\x3d\xdb\xc3\x15\x3a\xad\x83\x11\x51\x14\x02\xad\xd3\xee\x35\x69\x5b\xab\xb6\xea\x13\x7a\x78\xd0\x61\x87\x07\x12\xda\x19\x20\xd4\xb0\x0b\x33\x3c\xb9\x30\xc3\x30\x2e\xba\x01\xdc\x73\xbd\x4f\x18\x0a\xe6\x5f\x2f\x4a\x61\x16\x3a\xeb\xcc\xe8\x0d\x26\x7f\x2d\x95\xcc\xab\x1c\xfa\xc6\x3a\x7e\x96\xcb\x90\x35\x10\x9a\x63\x93\xa0\x47\x4f\x61\xd4\x60\xd6\x37\x96\x85\xb2\xce\x05\x07\x55\xdd\x54\x49\x22\x44\x1a\xb5\xbc\x07\xc5\xec\x0f\x93\xf0\xa4\xd0\x4e\xe3\x79\x3f\x79\xd3\xef\xec\x47\x88\x52\x18\xe5\x0f\x9f\x75\x1a\xa3\x67\x94\xe7\xd3\x47\x78\x06\x10\xd3\xfd\xed\x95\x5e\xb6\xca\x10\xa7\x44\x5f\x1b\xe5\xb1\x45\x72\x06\x8b\x68\x0e\x10\xc1\x79\x40\xd1\x9b\x07\x73\x2c\x3c\x94\x88\xcd\x03\x44\x5f\x1d\x20\xc0\x30\x44\x84\x66\xb8\xe8\xcc\x47\x00\x29\xfd\x38\x51\x99\x01\xad\xe1\x81\xa2\x31\x9f\x22\x12\x33\xc8\x5b\xf7\x8d\xc0\x7c\xba\xe8\xcb\x30\xaf\xdb\xd3\xbb\xf5\x24\x22\x2e\x03\x78\xb5\x86\xf4\x68\x0d\xe6\xcd\xfa\x68\x11\x96\xfe\xd1\x95\x07\x10\x59\xe9\x4d\x64\xa9\xa4\x95\x3c\x3b\x15\x19\x5f\x5d\x89\x44\xab\xb4\xf3\x09\xd3\x42\xad\x0b\xfb\xc7\xe0\xb0\x64\xa3\x35\xf3\x8f\x17\x9c\xc0\x79\x45\xea\x53\xaa\xbd\xfb\x8f\x14\x0a\x68\x68\x82\xb3\x7c\x90\x0e\x3d\xf6\x60\x8c\x41\x4c\xc6\x1e\x72\x11\xff\xae\x6f\x99\x9e\x59\xa1\xd8\x81\x54\x7e\x1d\x0f\x23\x33\xb0\xb6\xcc\x03\x5b\xbb\x6f\x9f\x3f\xf3\x37\x3f\x3d\x93\x1b\x9c\x0b\xc6\x7c\x7c\x0f\x08\x3d\xe8\x97\x5d\x20\x74\xe3\xac\xca\x9a\x6e\x10\x74\x8d\x34\xe5\xcd\xf3\x1a\x5e\xf4\x39\x8c\x1b\x76\x1b\x57\x29\xa3\xc2\x8d\xa7\xb7\x68\xbd\xe3\xc6\x4f\x21\x66\xbc\xf3\xbd\xb0\xa1\x7d\x2f\x5b\x8a\x0d\x3f\x40\xad\xf9\x91\xc6\x83\x77\x5a\xf3\x3d\xae\xa8\xfe\xeb\xab\x92\x27\xe2\x72\x70\x85\xc3\x6f\x27\x96\x56\x25\x95\xed\x05\xbd\x23\x6c\x1e\x25\x44\x8a\xbb\x29\x14\xc5\x41\x35\xda\xac\xca\xb2\x15\xab\x0a\xad\x9a\x95\x87\x18\xb4\x6a\x17\xac\xb9\xd1\x36\x3d\xa5\xd6\x52\x8b\x52\xd3\x01\x5c\x56\x4a\x39\x79\x5e\x37\x1c\x02\xad\xd4\xa0\xac\x8e\xcb\xe2\x8c\x9c\xbb\xe9\xbb\xc3\x14\x2a\xe6\x64\x2e\xea\x96\x14\xf5\x80\xee\xd7\x33\x5d\x26\x72\x9a\xad\xd8\x82\x67\xa1\xbb\x04\x67\x37\x32\xcb\x68\x98\x09\xbb\x12\x96\xd9\x85\xa4\xc6\xe0\x2c\xd3\x6a\x0e\x93\xe3\xca\x77\x35\x13\x89\xfb\x6d\x92\x09\xae\xaa\x02\x9f\xe7\x8e\xf5\x95\xae\x4a\xff\x3c\x82\xb5\x0c\xa3\x48\xc3\x94\xcc\x46\x51\xef\xa4\xf7\x2e\x6c\xdd\xa0\xde\x08\x5f\x53\x78\x2b\x8d\x18\xc5\x63\x7a\x64\x5e\x13\x75\xce\x28\x4a\xbd\x94\x29\x76\xbf\xf0\x64\x83\x2e\xad\xd8\x1d\x23\xec\x67\xa5\xd5\x58\x89\x39\x07\xad\x87\x76\x11\xae\x19\x8e\x83\xa1\x38\x95\x42\xbf\x0c\x67\x2e\xe8\xa2\x51\xca\xba\x94\xd8\xe9\x33\xa2\x1c\x3b\x50\x9a\x69\x38\x5e\x2b\x25\x2d\x76\x8f\x5e\x54\x96\xa5\xfa\x56\x1d\x4e\x10\x95\x58\x1a\xc6\xd9\x54\x58\xdf\xc9\xd6\x77\x56\x94\xa5\x30\x4c\x28\x3e\xcd\xdc\x9a\x43\xc2\xc3\xf5\x46\x02\xb1\x99\xe0\xb6\x2a\x05\x9b\x73\x2b\x36\x2a\x4d\xf8\xbe\xef\x27\xaf\x34\xa1\xcb\x7b\xa5\x8c\xe8\xdc\xdf\x7a\x60\x4d\xeb\xcf\x7f\xec\x26\x23\x64\x2e\x74\x65\x3f\x89\x29\x79\xbb\x90\xc9\x22\xd6\x8c\x65\x2e\x0c\xd3\x55\xcb\xc6\x7e\x4e\x3f\xdb\xbc\x42\x3b\x7b\x72\xd3\xd5\xd5\x4b\xbc\xc1\x95\xd6\x2e\x39\xae\xdb\xca\x72\xb7\x01\x4f\x2f\xae\xfe\xf9\xea\xf8\xcb\xb3\x57\x13\x76\xc6\x93\x45\x5c\x8f\xae\x18\x07\xa1\x01\x82\x62\xc1\x97\x82\x71\x56\x29\xf9\x53\x85\xe8\xe4\xec\x20\xfc\xf6\x70\x50\x2c\xe4\x8e\xa7\x2f\xb4\xbe\x1e\xac\xd7\x12\x36\xd2\xc6\x04\x07\x6d\x04\x74\x47\x68\xab\x4f\x67\xee\x2b\x34\x34\x40\xd5\x5a\x08\x27\x8c\xe4\x92\xc4\x30\x81\x4b\xf3\x34\xa4\x5c\x38\x3e\x77\x6c\xe1\x8e\x2a\x3e\x85\x54\x89\x85\x60\x4a\x58\xc7\xd6\xc1\x61\xa5\x95\x69\x00\x03\x54\x46\x98\x11\x9b\x56\x90\xdc\x51\x94\x32\xe7\xa5\xcc\x56\xf1\x60\xee\xac\xba\xd0\xde\x1c\x5a\xb5\xa7\x74\xfa\xe6\xec\x8a\x5d\xbc\xb9\x66\x45\x89\x90\x01\x90\x9d\x01\xdf\xc3\x6b\x4d\x85\xfb\x05\xf5\xe8\x9c\xb0\x63\xb5\xc2\x2f\x71\x83\x4b\xc3\x9c\x2d\x24\xe0\x08\x26\x1d\xd2\x83\xc2\xef\x3d\x9b\xc0\xff\xf6\xdc\x5b\x96\x4e\xc9\x0c\x49\x27\xc9\x5a\xf2\x18\xaa\xa1\x72\x9a\x45\xd4\xa4\x77\x7f\x52\xdd\x96\x42\xda\xdc\xa5\x23\x62\xd4\x6d\x89\x87\xa5\x06\xf2\x62\xf7\x2d\xa9\xe6\x59\xcc\x55\xdd\xc4\x7e\x5f\xdb\xb2\xaf\x65\x39\xae\xdf\xe0\xb2\xab\x81\x39\x48\xd7\xa7\x7a\x0e\x03\xf5\x4a\xa9\x4f\x3f\x6f\x4e\x91\x44\xd0\x71\xfb\xcb\xf3\x4b\xbf\x03\x48\xbb\xc9\x5b\x3d\x13\xe1\xc7\x18\xd4\x18\xb1\x67\xec\xaf\xec\x1d\xfb\x2b\x98\x57\x7f\xee\xdb\x59\xa6\xaf\xe1\xd3\xdf\xbd\x83\x56\xfd\xf9\xe5\x40\x14\xff\xce\x49\x27\x37\xa2\xa3\xaa\xd5\x6c\x2a\x49\x9d\x17\xef\xac\x28\x9d\x1c\xa5\x95\xd8\x6a\x4f\x1e\x37\xc1\x4f\xc8\x66\x18\xbb\x38\x9f\xc5\x2d\x21\xec\x3d\x19\xcd\xfd\xfc\xef\xda\xd8\x0b\x92\x42\xcd\x06\x13\xf5\x68\x39\xb7\xc9\xa2\x29\xc6\x9c\xa2\x66\x6c\xbd\xc1\x0c\x4b\x35\x78\xd2\x30\x0f\x70\x21\x7b\x64\x62\x3c\x1c\x36\xee\x17\x9c\x6f\xac\xe7\xfb\x56\xaa\xe5\x40\x01\xcb\x87\x14\xab\x08\x5e\xa6\xd0\x29\xe9\x64\x6e\x5a\x69\x74\x66\xbc\x47\x29\x23\x5f\x4d\x70\x59\x03\x2f\xb9\xfd\x94\x70\x85\x09\xdc\x33\x51\x96\x98\xba\x39\x5d\x41\x04\x59\x26\xa2\xf7\xe2\xf5\xda\x49\x45\xa9\xad\x4e\x74\x8f\xb6\x41\xcd\x80\x39\x0d\x07\x44\x40\xe7\xaf\xf7\xb9\x7f\x73\x7a\x39\x62\xd7\x27\x97\xd0\x4d\xe5\xea\xe4\xfa\xb2\x69\xa9\xec\x5d\x9f\x5c\xee\x6d\x95\x14\xcc\x6b\x56\x2f\xdc\x34\x3b\x0c\xd2\x70\x3c\x39\xb5\x6d\x9c\xf3\x62\x7c\x23\x56\x1d\xcf\xd4\x21\xce\xf5\x71\x58\xe1\x41\x5e\x08\xc9\x9c\xf3\xe2\xde\xa3\x95\x82\xa7\xf2\x13\x55\x51\xd0\xce\xaa\x9f\xb9\xb9\x9c\x22\xd7\x4b\x91\xa2\x3a\xec\x7f\x21\x54\x5a\x68\xe9\xf4\xc5\x5d\x8d\xc5\xfd\x7f\xbd\xab\xb1\x78\xdf\xb5\xab\xb1\xd8\xd5\x58\xec\x6a\x2c\xde\x7f\xed\x6a\x2c\xe8\xda\xbe\x1b\x94\xed\x6a\x2c\x3a\x5e\x4f\x2b\xce\xbf\xab\xb1\xb8\xd7\xb5\xab\xb1\x58\xbf\x76\x35\x16\x77\x5c\xbb\x1a\x8b\x3b\xae\x5d\x8d\xc5\xae\xc6\x62\x57\x63\xb1\xcb\x16\xfb\xc5\xb1\x1e\x66\xb6\x18\xdb\xd5\x58\xd0\xb5\xab\xb1\x78\x12\x39\x31\x6c\x57\x63\xf1\x41\xd7\xae\xc6\x62\x57\x63\xd1\xe5\xda\xd5\x58\xc0\xb5\xf3\xbd\xec\x6a\x2c\xfc\xb5\xab\xb1\xc0\xeb\xd7\xa3\x35\xef\x6a\x2c\x76\x35\x16\xbb\x1a\x8b\x5d\x8d\xc5\x7b\x67\xb1\xab\xb1\x78\x0a\xf6\xa4\xef\x81\xd7\xbf\x66\x60\xff\x44\xe7\x45\x65\x05\x7b\xeb\x87\x0c\x5a\x24\x0a\x06\x69\x62\x8d\xa0\x7f\x0a\x4f\xa2\xd5\x4c\xce\x49\xb2\x1f\x61\x83\xb9\x71\x78\x9f\x71\xd4\xd4\xed\x11\xe6\xef\x64\x32\x97\xdd\x0a\x39\xd8\xda\xc2\xbc\x82\xb1\xa2\x20\x8f\xdb\x49\x39\x7f\x07\x5b\x84\xe7\xba\xc2\xa6\x7c\x09\xad\x5f\x20\x21\x86\xc2\x1e\xdc\xca\xb0\x61\x4c\x9c\xba\x22\xe5\x72\x00\x6b\xa3\xe0\xd6\x8a\x52\xbd\x60\xff\x73\xf0\xc3\xef\x7f\x1e\x1f\x7e\x71\x70\xf0\xfd\xb3\xf1\x5f\x7e\xfc\xfd\xc1\x0f\x13\xf8\xc7\xef\x0e\xbf\x38\xfc\xd9\xff\xf1\xfb\xc3\xc3\x83\x83\xef\xbf\x7e\xfd\xd5\xf5\xe5\xd9\x8f\xf2\xf0\xe7\xef\x55\x95\xdf\xe0\x5f\x3f\x1f\x7c\x2f\xce\x7e\xfc\xc0\x41\x0e\x0f\xbf\xf8\x6d\xe7\x29\xf7\x56\x89\x87\x53\x88\x07\x52\x87\x3f\x8a\x32\x4c\xd1\xe1\x81\xf6\xe2\x5b\x1a\xad\xbd\x1b\xe9\xc0\x7a\xdf\x6e\xf4\xd2\x14\xd4\xbc\x30\x8e\x34\x4c\xe7\xd2\x3a\xe5\xd0\xe9\x83\x3c\xce\x0b\x93\xb6\x61\x94\x92\x1c\x80\x84\x4a\x6e\xb1\x47\x68\xc8\xa9\x8a\xf2\xb4\xb5\xd7\xfc\xa8\xf7\x6a\xf0\x57\xc0\x7e\x1e\xa7\x62\x26\x95\xa0\x38\xd8\x4e\x36\xfc\xf2\xb5\x93\x0d\x4f\x51\x36\x18\x91\x54\xa5\xb4\xab\x13\xad\xac\x78\xd7\xc9\xc3\xd2\x14\x0d\x57\xcd\x01\x19\xee\x33\xaa\xa2\xa4\xef\x98\x2e\x30\x81\xb2\x55\xce\x1a\x52\x70\xcb\x4a\x81\x81\x89\x55\x32\xc2\xa2\xf5\x07\x76\x0f\xe4\x44\xb6\x1f\xe2\xed\x39\x34\x33\x7f\xaa\xe4\x92\x67\xce\xda\xad\x7f\x71\x09\x16\x4c\xfc\xa3\x0f\xdd\xf3\x96\x9b\x9b\x7a\xc3\x8b\xb1\xd3\xa1\xc3\x9c\x8f\xfc\x2b\xc1\x47\xe2\x9d\x7d\x8c\x5a\x1a\x28\x48\x97\xa5\x5c\xca\x4c\xcc\xc5\x99\x49\x78\x06\x72\x6d\x98\xb3\xe2\xf8\x8e\xd1\x61\xe1\x4b\x9d\x19\x76\xbb\x10\xd0\x5d\x99\x7b\x17\x00\x54\xb8\xcc\xb9\x54\x2c\x77\x4b\x54\xf8\x1f\x1b\xf4\x25\x38\xf1\x5f\xf0\xd2\x2d\x70\xf0\x19\x80\x89\x3c\xd5\x3a\xa3\xd4\xe1\x6c\x55\x8f\x4f\xb9\xf7\x4a\xff\x53\x89\xdb\x7f\xba\xd1\x0c\x9b\x65\x7c\x1e\x5c\x05\x46\xd8\x35\x6f\x5f\x3d\xf4\x9d\x2f\x00\x79\xb9\x95\x60\x3c\xbb\xe5\x2b\x53\x3b\x4e\xe2\x3e\xe0\x2f\xd8\xf3\x43\x60\x67\x6e\x58\x18\x23\x65\x9f\x1d\x42\x2c\xf1\xe4\xf8\xf2\x9f\x57\xff\xb8\xfa\xe7\xf1\xe9\xeb\xf3\x8b\x7e\x27\x85\x7b\x77\xc1\x55\xa7\x31\x12\x5e\xf0\xa9\xcc\x64\x9f\x03\x62\x2d\xdb\x24\x1e\x14\x8e\xe0\x34\x3d\x4a\x4b\x5d\x20\x9d\xbc\x8f\xaa\x3e\x29\x9b\x56\x70\x5c\x99\x0c\xcb\x33\x6b\x0e\x38\x2f\xb9\xb2\xb5\xb3\xa6\x26\x79\x59\x29\x67\x58\x3f\xf2\xc4\x7c\x9e\x0e\x97\x94\x7f\x9c\xa6\x22\x6d\x50\xef\xc9\x25\x01\x9e\xf8\x97\x5b\xd5\x35\xda\xec\xf2\xcd\xd5\xf9\xff\xb7\xc5\x86\xab\xa2\x5f\xce\xd3\x30\x75\x61\xa5\x2e\x06\x5b\xdd\xb7\x54\x77\xb4\x5b\xdf\x07\xb1\xbe\xe1\xac\x1a\x26\xd2\xfe\xb6\x52\x4d\x18\x8f\x7a\x7c\x96\xeb\x54\x4c\xd8\x65\xf0\xd2\x37\xbf\x8d\xca\x7b\x79\x29\x98\xbb\x45\x59\xc9\xb3\x6c\x15\x2b\x48\x56\x63\x31\x4d\xa3\x32\x39\x96\xc3\x33\x9e\x99\x9e\xc2\xb4\xcf\xc9\xe4\x0e\xe1\xd7\xce\x98\x1c\x84\x9a\x61\x34\x96\x0a\xa5\x2d\x69\xa5\x6e\x96\x50\xac\x5d\xea\x84\xa1\xe5\x1a\xa5\x45\x35\x4e\x17\x83\x8e\x7e\x7f\x30\x49\xe3\x69\x75\x19\x46\x46\x2f\x6f\x65\x44\x5b\xbb\xa5\x83\xa9\xb6\x65\xdd\xe8\xa5\xe0\x29\xd4\xa4\x15\xdc\x2e\x30\xab\x21\xe7\xe6\x46\xa4\xf8\x01\xe9\x35\xc1\xcd\xef\x46\x0c\x8f\xba\x76\xf3\xf6\x3e\x7d\xd0\x67\x30\xd7\x02\x62\x01\xdd\x40\x37\xd8\x10\x5b\xc0\xbd\xd3\x1b\x95\xad\xde\x6a\x6d\x5f\x86\x5a\xac\x41\x16\xf0\x3b\xd2\x14\x9b\x6e\x58\x50\xa5\x20\x09\x21\x1d\x03\x31\x81\xa5\xe3\x32\xb0\xd3\x7a\xc1\xb6\xcc\xd0\x65\xa5\x8e\xcd\x57\xa5\xae\x3a\x9f\x00\x6b\x8a\xd6\x57\xe7\xa7\xb0\x8f\x2b\x8a\xb2\x29\x5b\xae\xa0\xea\x74\x1d\x30\x28\xe8\xb4\xdf\x50\x9c\x30\xe6\xc8\x3a\xa4\xc3\x5e\xf3\x15\xe3\x99\xd1\x5e\x39\x96\x6a\xa3\x01\x45\xd6\x99\xfb\x7a\xaa\xed\x62\xcd\x2c\x73\xec\xbc\xfe\xbb\x51\x14\x74\xab\x11\x8c\xa4\x5a\xfb\xb9\xe5\x37\xc2\xb0\xa2\x14\x89\x48\x85\x4a\x7a\xae\xda\xb6\x43\x4d\xb0\xf2\x17\x5a\xb9\x6d\x31\xc8\xda\x9f\x87\x18\x23\x38\xc2\x9a\x2b\x0d\xd1\x4a\xb2\x3b\x38\xc4\x2c\x61\x53\x54\x46\x94\x18\x60\x2d\x2b\x81\x0b\xf1\x75\x35\x15\x99\xb0\x68\x0c\x01\xee\x04\xb7\x68\x48\xcb\x9c\xcf\x05\xe3\x36\x30\x8a\xd5\x4c\x28\xe3\xc4\x0d\xba\xde\x2c\x4b\xb5\xa8\x0b\x28\xb9\x61\xdf\x9c\x9f\xb2\x67\xec\xc0\x3d\xeb\x10\x96\x7f\xc6\x65\x06\xe1\x4c\xcb\xcb\xf6\x1c\xe5\xcc\x0f\x01\x53\x02\xde\x63\xba\xc4\x2d\x3a\x62\x4a\x33\x53\x25\x0b\x3f\x27\x67\x71\x79\x83\x8d\xf2\xf9\xc0\xa9\xff\x04\x59\xb5\xb7\x80\xf9\xc6\x88\x72\x30\xf9\xf2\x4d\x07\xf9\x12\xab\x10\x8e\xe7\x9a\xd4\x43\xc6\xca\x85\xe5\x29\xb7\x9c\xe4\x4e\x5d\x75\xfd\x14\x97\x74\xdb\xd2\xc7\x88\x57\x52\x55\xef\x30\x63\x65\x38\x23\xff\xea\x0c\x86\x65\x89\x27\x1a\x2c\x1a\x2f\x8a\x4c\x62\xbd\x73\x2b\x83\xea\xbc\xb1\xd4\xa3\x3b\x54\x24\xd8\xe6\x3c\xcb\xb4\x13\x6f\xee\x64\xe7\x2a\xd5\xf9\xda\xc3\x9c\x02\x25\x1a\x40\x77\x13\xf6\x24\x99\x67\xeb\xee\x88\x4c\x2c\x45\x0f\x4c\x97\x36\x2e\x9f\x1b\xcd\xe9\x62\x7e\x41\x61\x78\x96\xf1\xa9\xc8\xf0\x64\x41\x06\x32\xeb\x0c\xb4\xed\x2c\xc4\x52\x67\xc3\xd5\x60\xbc\xd5\x99\xc0\xb4\x1e\x4f\x08\x37\xfc\xa3\xa0\x03\x0c\x32\x14\x1d\xc0\x90\x69\xd0\x01\x4c\xb2\xc7\x40\x87\xaa\xc7\x41\xcb\xda\x74\x70\xa7\x76\x93\x0e\x70\x74\x3e\x74\x3a\x18\x91\x24\x3a\x2f\x2e\x4b\xed\x4c\xae\xc1\x8e\x16\x1a\xb6\x8e\x15\xa1\x4d\xbe\x21\x09\x07\x44\x79\xf3\x66\x5e\x46\x09\x7d\xdc\xa2\x8c\xf7\x59\x7d\xff\x2b\xee\x90\xec\x44\x4f\xfb\x1c\xf2\xa3\x34\xc2\x4a\xee\x97\xf4\xc5\x23\x87\x13\xe8\xe1\x25\x1b\xe4\x30\xd1\x09\xcf\x00\x72\xaf\x1f\xc7\xb0\x36\xd7\xb4\x07\x8e\xb2\x30\x21\xb4\x04\x9f\xf9\xb8\x3f\xa0\xaf\xc1\x27\xe4\xfb\x52\x3a\x15\x51\x08\x12\xd3\x47\xaf\x31\x5b\x0f\xee\xf3\x09\xa0\xee\x54\xf7\xd1\xc0\xb4\xf1\x6b\xab\x09\x01\xe6\x75\x00\xf2\x73\x13\x14\x2a\x95\x6a\x0e\x1e\x9d\x11\x2b\x45\x86\xa9\xa3\xb4\x87\x6f\xd0\xfc\xda\x07\x8e\xf6\x83\x7a\x76\xf6\x8f\x06\x4d\x48\x6a\x45\x23\x83\x93\xc3\xeb\x37\x33\x94\x96\xd2\xb0\xbd\x57\x9e\x00\x3d\x90\xcf\x1e\xe2\x01\xb1\x87\x6f\x18\x56\x13\x7d\x6c\x37\x52\xa5\x94\x65\xd9\x20\x56\xc0\xa8\x45\x2d\x14\xf2\x77\x65\x1a\x8b\x86\x17\xec\x07\xc5\x02\xb1\xd8\xb8\x33\x7b\xbc\x45\x85\xd5\xbb\x97\xc6\xef\x77\xf9\x85\x87\xb4\x87\xf9\x46\xc1\xda\xbb\xe7\x8e\x9d\xd9\xbb\x7e\x9f\x7f\x97\xbd\x6d\xae\xeb\xad\x54\xa9\xbe\x35\x43\xdb\x10\xdf\xe1\xb0\x5e\xa1\x4e\x1c\x5b\x5b\xa9\xe6\x26\xb6\x23\x78\x96\x35\xdc\xb0\x9b\x0c\x09\xbf\xc2\x01\x91\x78\x5d\x81\x6f\x65\x87\xef\x8c\x80\x7b\x5c\xf3\xdc\xf0\x93\xd2\xbd\x8a\x95\x3c\xbb\x2a\xba\x43\xb3\xb1\x36\x1b\x7c\xf5\xfa\xea\xb8\x39\xb4\x93\x67\xb7\x80\x78\xed\x88\xed\xbe\x67\x3c\xcd\xa5\x31\xe0\x06\x12\xd3\x85\xd6\x37\xec\xc0\xa7\x6d\xcc\xa5\x5d\x54\xd3\x49\xa2\xf3\x28\x83\x63\x6c\xe4\xdc\x1c\x11\xd3\x8e\xdd\xec\x0f\x99\x54\x59\xc8\x46\x01\x33\x52\x59\xe3\xdd\x18\xf0\x90\x24\xcc\x02\xd6\x96\xf0\x3a\x29\xca\xbc\x3e\x4d\x44\xe8\x94\x22\xdb\x3e\xe0\xcc\xfa\xf2\x5c\xf4\xc4\xce\xf8\x85\x25\x82\x77\xa7\xd2\x94\xb8\x8c\x6a\x23\x1d\x51\x7b\xdb\x3a\x91\x48\x3b\x48\x84\x19\x0e\x95\xe7\xef\xf5\x98\x2c\x15\x58\x3d\x21\x20\xeb\x84\xdf\x99\xdc\x04\x5e\xd9\x7d\x28\xc2\xa3\x9f\xee\xc7\x1a\x2d\x44\x7d\xb0\xcc\xc3\xd9\x03\x59\xb1\xe0\x63\x34\x92\x9d\x48\x02\x19\xe6\x75\x80\x85\x56\x9a\x92\xd3\xdd\x29\xa8\x15\xb0\x34\x58\x0b\x18\x08\x82\x35\x21\x19\x1b\x4d\xf5\xa4\x8e\x0f\xc6\x31\x24\x28\xe2\x41\x10\x80\x7a\x0e\xb7\xd2\x2e\x3c\xc2\x7d\x23\xe0\x04\x33\x29\x85\x81\xe8\x81\x62\xa2\x2c\x75\x49\x89\x30\xde\x6b\x0b\x23\x81\x28\x86\x4c\x1a\xc7\x24\xdc\xfd\xb5\x6f\xe2\x10\x65\x0d\x81\x0b\x79\x62\x8e\x9b\xc4\x6c\x26\x12\xd0\x94\x62\x02\xa3\xd8\x3d\xa8\x91\xfb\x28\xbb\xdb\x31\x18\x41\xe8\xe6\xf2\x9d\x7b\x4a\xfc\xab\x38\x18\x4a\x88\x79\x9b\xbf\x3e\x9c\x30\x76\xae\x42\xe6\xe4\xc8\xad\x62\x7c\xa7\x4f\xf9\xb1\xee\x15\x63\xfc\x65\x78\x81\xd8\xef\xe4\xd4\xbb\xb2\x1a\x80\xe3\xfb\x38\x83\x59\xec\x10\x1e\x54\x1c\x80\x63\x98\x06\x75\x4b\xef\x0f\xf1\x3e\x8e\x62\x77\xcb\xc7\x72\x16\x3f\x8e\x93\x9e\xf5\x95\x73\x54\x12\x3f\x10\x28\xee\x55\x34\x5a\xa4\x7e\x87\x70\xd3\xa5\x4e\x11\x12\x23\x94\xf4\x43\x2f\x0b\x80\xe8\x90\xff\xf1\x0a\x56\xad\xa4\x29\x8d\x59\xd9\x31\x56\x06\x61\x82\xa6\xcc\xe9\xca\x99\xb7\xed\xf3\x22\x13\x50\x3d\x17\x8d\x5c\x17\x06\x46\x28\xba\xa3\x30\x91\x1a\x88\x97\x10\x3a\x46\xec\xdf\xb0\x29\x43\x02\xa0\x07\x0f\xb8\x0c\x3f\x47\x13\x4f\x1a\x0f\xa9\x0d\x95\x6d\x56\x7b\xd7\x01\x4b\xe5\x6c\x26\x7c\xa2\xa1\x33\xfd\x78\xc9\x73\x27\xe2\x0d\x23\x12\x4c\xc5\x5c\x62\x26\x5b\x10\x6c\xfb\xa6\xae\x80\x1f\xa1\x30\x94\x96\xe5\x72\xbe\x40\x46\x61\x1c\x2a\x23\x99\x0f\xa9\x65\x9a\xa7\x0c\x78\x5b\x97\xec\x96\x97\xb9\x3b\x37\x78\xb2\x80\xf8\x1c\x57\x2c\xad\x4a\x80\x89\xb4\x82\xa7\xab\xb1\xb1\xdc\x3a\x55\x57\x94\x64\x11\xfa\xf9\xef\xa0\x84\xdf\x7b\xed\xa0\x84\xef\xbe\x76\x50\xc2\x3b\x28\xe1\x1d\x94\xf0\xfb\xaf\x1d\x94\x30\x5d\xdb\xaf\xf6\x65\x3b\x28\xe1\x8e\xd7\xd3\x82\xb3\xd9\x41\x09\xdf\xeb\xda\x41\x09\xaf\x5f\x3b\x28\xe1\x3b\xae\x1d\x94\xf0\x1d\xd7\x0e\x4a\x78\x07\x25\xbc\x83\x12\xde\x81\xa2\xfd\xe2\x58\x0f\x13\x14\x8d\xed\xa0\x84\xe9\xda\x41\x09\x3f\x09\xe8\x27\xb6\x83\x12\xfe\xa0\x6b\x07\x25\xbc\x83\x12\xee\x72\xed\xa0\x84\xe1\xda\xf9\x5e\x76\x50\xc2\xfe\xda\x41\x09\xe3\xf5\xeb\xd1\x9a\x77\x50\xc2\x3b\x28\xe1\x1d\x94\xf0\x0e\x4a\xf8\xbd\xb3\xd8\x41\x09\x3f\x05\x7b\xd2\xd8\x54\x76\x42\x3e\xfb\x10\xa0\x0a\xca\x0c\x89\x4a\x5b\xa7\xd5\x6c\x26\x4a\x90\x5c\xf0\xe4\xb5\x2c\x84\x00\x68\x15\x64\x19\xe5\x19\x00\x2c\x5e\x29\x78\x4a\x09\xef\x77\xfc\x9c\x6a\x69\x01\xa1\xac\xce\xd4\x3c\x7b\xf3\x72\x18\x54\x8c\x7e\x39\x8a\x30\xe7\x37\x2a\xe9\x9f\xab\x56\x13\x7c\x53\x01\x06\xd1\x3d\xc9\xb4\xa1\x0c\x53\x20\x56\xb2\xe0\x4a\x09\x6f\x3c\x4a\x0b\x4e\x99\xa9\x10\x8a\xe9\x42\x28\x94\xdf\x9c\x19\xa9\xe6\x99\x60\xdc\x5a\x9e\x2c\x26\xee\x49\xca\x13\xbb\xce\x06\xa5\x4f\x8c\x2d\x05\xcf\x7d\x5e\x6c\xce\x25\x0e\xc5\x78\x52\x6a\x63\x58\x5e\x65\x56\x16\x61\x30\x66\x04\x24\xb4\xe3\x41\x15\x88\x01\xe9\x25\x75\x0a\xe9\xa8\x7e\x1a\x4d\x4b\xc7\xa0\x40\x60\xba\x8e\x00\x07\x35\x2f\xec\x2a\xe4\xd1\x09\x36\x93\xa5\xb1\x2c\xc9\x24\x9c\xd6\xf0\x44\xac\x1d\x84\xf1\x46\xfe\xac\x56\x34\x53\x43\x53\x55\x29\xa8\xad\x85\x35\x98\x95\x56\x0f\x48\x43\xa5\xd2\x90\x9a\x6f\x46\x8c\x7b\xc8\x1b\x24\xb4\x9f\x29\x90\xda\x9f\x2c\x38\x3a\x7d\x14\x0d\x17\xe1\xe4\xd5\x69\x7b\x35\xa3\x43\x8a\xb1\x67\xce\x51\x23\x9b\xba\x56\x28\x20\xdd\x65\x6d\x1b\xc0\x02\x28\xb1\x74\x3c\x20\x12\xe1\xce\x57\x7e\x07\xd7\x7f\x72\xa6\x8f\x0e\xc5\xd7\xc2\x18\x3e\x17\x97\x1d\xa3\x16\x77\x59\x64\x10\xb8\xa8\x17\x06\x58\x21\xc3\xf2\xb4\xf0\x49\x9d\xe6\xd4\x54\x83\x58\x8e\x73\x0a\xca\xcf\x6d\x29\xad\x15\xb0\xa8\x00\x8e\x04\x81\xcf\x76\x01\xea\x7e\x2b\x59\xea\xb5\x1f\xa4\xfe\xb1\x13\xea\x2a\xc5\xd4\xa5\xa9\x60\xd3\x52\x8a\x19\x9b\x49\xc8\x87\x82\x0c\xa5\x11\xc2\x7d\x70\xf4\x28\x18\xe3\xec\x5d\xad\xbc\x2e\xeb\xe7\x35\x61\xdf\xd1\xc4\x6c\x59\xa9\x84\x47\x20\x80\x50\xa2\x25\x67\x6c\x0e\x19\x4e\xa4\x2d\xfe\xf1\xd9\x5f\xfe\xcc\xa6\x2b\x77\xa4\x81\x66\x65\xb5\xe5\x59\x78\xc9\x4c\xa8\xb9\xa3\x15\x6e\xcf\x66\x91\x51\xa0\x00\xa0\x98\xe3\xc4\x9f\x7f\x76\x33\x6d\x9e\xb1\x47\xa9\x58\x1e\x45\xf4\x1b\x67\x7a\xbe\x09\x17\xbe\x7b\xca\x64\x47\x93\x68\x03\x9b\xe9\x4c\x26\xab\xde\x8c\xe6\x71\x67\xd8\x42\xdf\xa2\xae\xbf\x81\x7b\xea\x1c\xc8\x42\x17\x55\x86\x1e\xec\x97\xa1\x3c\xaf\x32\x62\xbd\x06\x67\xe3\xbe\x00\x9f\x2b\x0d\xd1\xc6\x8b\xc5\xc4\x36\xff\x48\x4d\xb9\xdd\xe4\x15\x0c\xf0\x33\x60\x08\xbd\xe4\x59\x36\xe5\xc9\xcd\xb5\x7e\xa5\xe7\xe6\x8d\x3a\x2b\x4b\x5d\x36\xe7\x92\x71\x27\x2d\x17\x95\xba\x41\xe4\xea\x50\x22\xac\xe7\x4e\xb5\x2a\x2a\xeb\x13\x89\x37\xbd\x30\x16\x9c\x7a\x21\xec\xcd\xa0\x7a\x14\xf1\x4e\xd6\xb6\x0e\x95\x4a\x20\x47\xc6\xe3\x9b\x98\xd9\x3e\x7b\xf6\xc7\xcf\x91\x75\x99\x2e\xd9\xe7\xcf\x20\xf9\xd1\x8c\x70\x13\x83\x6c\x73\x07\x45\xce\xb3\xcc\x99\x0d\x31\x53\x3a\x42\x6f\x62\xc2\x4f\xce\x83\xb6\x3f\xbb\x7d\xb0\x2a\x75\x7d\xfd\x0f\xd0\xa3\xa4\x35\x22\x9b\x8d\xb0\x2a\x20\x98\x35\xfb\x70\x30\xec\x93\xf4\x81\xd2\x8c\x07\xa0\x00\x2d\x75\x56\xe5\xe2\x54\x2c\xe5\x10\xcd\x2b\x1a\xa3\x79\x53\x3f\x93\x06\x0a\x30\xa6\x99\x4e\x6e\x58\x4a\x5f\x46\x69\x2c\x6d\x08\xd5\xee\x54\xe8\x9a\xd0\xd3\x23\x91\xe7\xce\xf7\x6f\xa4\xf0\xe4\xbc\x28\x42\x8e\x7e\xc9\x6f\x1b\xc4\x80\x3d\x09\xf5\xbe\x3d\xf1\x14\x7a\xbb\x99\xfb\x3a\x99\xc7\xf4\x46\x4e\x6e\x76\x1e\xa2\x73\x0a\x4b\x7f\x1f\x75\x3d\xfb\xee\x8e\xc9\x06\x43\xd4\x03\xfa\xdd\x50\xc0\xbf\x31\x3d\x7b\xad\x2a\x29\x14\xb6\x04\xc6\x40\x05\xc0\xb1\x0f\x88\xe4\xee\x0e\xd7\x01\xbc\x9b\xfd\xf2\x97\x1a\x74\x51\xc1\xab\x9c\x73\x4b\x0a\xa1\x77\x5f\x73\x56\x88\xd2\x48\xe3\xce\xe5\x6f\x61\x43\x9d\x64\x5c\xe6\x91\x0b\x70\x3b\x44\xc0\xcd\x0d\xc8\x97\xfd\x25\xe5\xa5\x4e\x69\x40\x10\x85\x88\xfa\xb9\x41\xad\x6d\x6a\xb5\x03\x1e\xa8\xdb\x16\x95\xdf\xd6\xd4\x6c\x4a\x4a\xf7\x49\x10\x95\x78\xd7\x53\x12\x90\xf0\x7e\x8f\x55\x3e\x86\xc9\x0f\x24\x06\x40\x30\xd2\xe2\x36\x25\x61\xc3\x78\xc4\x8d\x12\xa9\xf4\x64\x07\x4e\x18\x86\xd4\xdd\x9e\xa0\x9f\xb2\xfd\x17\xfb\x5b\x15\x92\x48\xa2\x52\x17\x7c\xde\xab\x87\x41\x8b\x52\xed\x61\xe3\x42\x6f\x67\x06\xc1\xf7\x01\x76\x08\xee\x12\x69\x0d\x44\x01\x30\x23\x18\x1d\xf5\x04\x26\x03\x01\xeb\x21\x6f\xf9\x8a\xf1\x52\x57\x2a\x25\xff\x52\x70\xf0\xbd\x6e\x3d\xf8\x42\x2b\xe1\x1d\xe7\xed\x3a\x71\xf0\xe8\x4b\xc5\x9e\x4f\x9e\x3f\x7b\x2a\x27\x15\xbc\x61\xeb\xa4\xba\x08\x27\x15\xca\xa7\xad\xbe\xab\x47\x3b\x1e\xe8\x7d\x5f\x93\x8b\xa5\x06\x33\x96\x1e\xac\x15\x3e\xba\x2d\xa5\x15\x51\x6f\xa3\x03\x30\x5c\x9c\x7d\x18\x55\x45\x1f\x0e\x88\xe1\x3d\x4c\x19\xba\xa9\xa6\x1f\x51\x6e\x91\x80\x82\xed\xb6\xc9\xc3\x65\xde\x23\xc2\x62\x42\xed\xed\xb1\x03\xbc\x73\x1f\x2b\x03\x0f\xb7\xca\x5a\x44\xb4\xb3\x77\x45\x0f\x8c\xb9\x06\xe1\xce\xde\x15\x1c\x7c\x70\xc5\x80\x14\xfc\x52\x2c\xf8\x52\x40\x45\xa4\xcc\x78\x99\x41\xcc\xf1\x0a\xe7\xce\xa6\x95\x65\x42\x2d\x65\xa9\x15\x24\xf8\x2c\x79\x29\x01\x95\xa2\x14\x50\x59\xed\x6c\xd1\xdf\x1e\x7c\x7b\xfc\x16\x12\x1a\x0e\xa9\x24\x9c\x66\x59\x19\x0f\x1f\x11\xcf\x24\x1a\xee\x17\x97\xcf\xcf\xc3\xd1\x10\x64\xae\x9f\x97\x7b\x4e\x5e\xd9\x0a\x01\xf1\xdf\x25\x59\x65\xe4\x72\x5b\x92\x84\x4a\x55\x4f\x65\xa7\x75\x6e\x95\xcd\xd6\x84\x5a\xab\x80\x05\xd7\x3a\x1c\x2d\xbf\x80\xc0\xba\x6f\x02\x66\x55\x1c\x03\x27\xd7\x13\xd5\xb2\x63\x2e\x9e\x87\x2c\x5b\x53\x21\x00\xb7\x61\xbb\x4e\x28\xa5\x53\x71\x7f\xd4\x8b\x66\x7a\x0f\x0d\x81\x31\xf3\xa8\x1c\xd0\x24\x0b\x91\x56\x00\xaf\x22\x0d\x82\x03\x3a\xf3\x81\xd7\x30\x56\x0a\xfa\x33\x9c\xcf\x42\x6d\xb0\x1a\x83\x73\x10\x69\xee\x7f\x5f\xfa\x4a\x62\xff\x81\x69\x8d\x08\x46\xa9\x1b\x6b\xc4\xb8\x31\x55\x8e\x5b\x02\xe1\xb7\x67\xd2\x9a\xd0\x5b\xcf\x6b\xc7\x6e\x63\xdc\xb3\x3a\xab\x07\x7d\xaf\x44\x06\xcc\xd5\x83\xc6\xfb\x17\xd1\x38\x48\x68\xe3\xff\x22\x86\xa3\x84\x09\x88\xb6\x85\xa4\x50\x0d\x5e\xd2\x99\x84\xf6\x15\x9c\xe8\x7d\xb5\xe1\x97\xa8\x3a\xe0\x1d\x00\xcf\xc0\xa7\x22\x33\xed\x81\xa6\xf5\xa2\x10\xac\x1f\x11\xbe\x67\x77\x40\x6e\x8c\x9c\x2b\xe8\x1b\xe6\x46\xbb\x67\x87\xb0\xce\x36\xd3\x10\xdd\xff\x3a\x4b\xb5\x46\x16\x56\xce\x8b\x31\x59\xbd\x56\xe7\x32\xb9\xc7\x48\x7a\x29\xca\x85\xe0\xf7\x34\xf8\x5a\x71\x31\x1a\xa3\x6e\x1d\x63\xa8\xca\x91\xf6\x8d\x7f\x88\xdb\x5f\x3a\x81\x6c\x7b\xf4\xd3\xfb\xec\x27\x0e\x2c\x82\x8d\x29\xe7\x72\x29\x94\x07\xfe\x3b\xc9\x78\x68\x3e\xe6\xa1\x92\x08\x7c\xb0\xb2\x3a\x44\x3e\x9c\x39\x55\xa3\x97\x41\xa0\x94\x9c\xae\xf1\x38\xd1\x2d\xd4\xba\x2c\xf3\x60\xfd\x1f\x72\x27\x04\x1f\xb0\xf5\xc7\xa8\x7e\xa5\xdc\x1b\x68\x0d\x78\x1c\x96\x40\x88\x2c\x74\x05\xc5\x40\xc4\x2f\x3f\x82\xe2\xda\x8e\x17\x37\x0d\x43\x7b\x2e\xe0\x38\xd5\x84\xcd\x9c\xf2\xba\x62\xd0\x5c\xe2\x7c\xd6\x7c\x92\x6c\x40\x5f\x42\x36\x36\xec\xe1\xfa\x50\xb9\xd4\xe9\x55\x21\x92\x11\x0b\x4b\x19\x77\x6e\x23\xa7\x0d\xa6\xb6\x44\xf8\x8d\x78\x1c\x95\xa5\x30\x85\x46\x04\xce\xf8\xb1\x71\x83\x50\x69\x1b\x11\x7b\x6c\x44\x00\x16\x5a\x8d\x95\xf0\x1f\x51\xea\x8d\x82\x60\x2e\xed\xe4\xe6\x73\x90\x02\x42\x2d\xb8\x4a\x50\x00\x1f\xdd\x88\xc2\x1c\x19\x39\xc7\x4d\xff\xe7\xcf\x3f\x07\x09\xe0\x49\x72\xf4\xf6\xec\xf8\xf4\xf5\xd9\x24\x4f\x37\x18\x71\x1e\xeb\x0b\xc2\x62\x5f\x87\x8d\xc4\x96\xcf\x27\xcf\x3f\xc7\xb8\xbd\x34\x08\x40\x12\xc1\x7f\x61\x4d\xda\x3a\xf6\xd7\xa5\x4e\x03\xdd\x28\x6f\xeb\x9e\xd1\xc8\xad\xca\xa0\x47\xd3\x77\xb4\x63\x46\x6d\xdf\x2c\xda\x5e\x99\xb3\x03\x66\xcb\x16\xa5\x70\xea\x8d\xd4\xaa\x4b\x9c\xb9\x69\xdf\xb5\x86\xf2\xce\x7b\xfa\xcb\x09\x62\xff\x34\x35\x77\xb2\xd9\xa0\xbc\xce\xf4\x2d\xe4\x86\x48\x5d\x4a\xbb\x9a\x00\x54\x8f\x9e\xb1\x0b\xb1\x14\xe5\xc8\x8f\xfa\xca\xdd\x74\x19\xee\x89\x0d\x88\x4d\x77\x44\x5d\x71\xee\xda\xa8\x23\x36\x8f\xd3\x10\x2e\xb4\xba\x0c\xb3\x0b\xc3\xd0\xce\x1b\x43\xc6\xe4\xa7\x50\xce\x3c\x19\x7a\xac\x03\xa2\x1f\xd3\x0b\x50\xa3\xe4\x6f\x79\x29\x75\x65\x18\xfa\xc4\x63\xcc\x41\x8c\xa3\x07\x12\x81\x6a\x46\x5e\xae\x30\x48\x48\x8f\xf7\x8e\xae\x40\x9f\xe3\x70\xde\x9c\x6c\x3e\xd2\xa4\x75\x8b\xbe\xf4\x8f\x2a\x7d\xbe\xcf\x1a\x5c\x21\x1e\x66\x1b\xcf\x2f\x7f\x22\x9b\x78\xa2\x30\x8c\x9f\x07\x9c\x0d\x4e\xe1\xc7\x51\x16\x72\xee\xb3\xca\xe0\xfd\x51\x77\x8f\x3e\x0d\xcc\xd6\x61\x49\xbb\xec\xf8\xae\xc9\x8d\x45\xfb\xfd\x7a\xb0\x45\x13\xd4\x2d\xc6\x85\xf3\x69\xd5\xf5\x16\xdc\x43\x3e\x81\x43\x70\x9c\x94\xd2\xca\x84\x67\x7b\x70\x84\xf9\xaf\x9c\xed\x6d\x45\x19\x7f\x5b\x0a\x66\x6f\x35\x3e\x85\x67\xec\x46\xac\x6e\x75\x99\x7a\xfd\xc2\x3f\xb1\x5e\x0b\x63\xfd\x23\xa5\x20\x59\x80\x90\x5c\x65\x2e\x4a\x36\x15\xde\x8d\xd0\xba\x79\x35\x61\xc7\x6a\x45\x3e\x58\x15\x57\x5a\x78\x35\x62\xba\x42\x1d\x07\xb5\xc0\x06\x93\xd0\x79\xe8\x9f\xc6\xb1\x06\xe6\x2e\x13\xdb\x29\x90\x61\x17\x78\xed\xc5\xdb\xd8\xba\xa4\x54\x6f\xd8\x1d\x25\x26\xaa\x6b\xff\xf5\x27\x91\x16\x4e\x3f\x93\x4a\x18\xf3\x95\x5b\xca\x3e\xea\x76\x93\x3b\x38\xa8\x55\x34\x36\xc8\xc9\x3a\xaf\x4a\xb8\x2d\xc5\x7d\xcf\x77\x47\xa1\x70\xe7\x84\x1d\xc3\x07\x90\x18\xe8\x34\x47\x28\x25\x70\x83\x39\x8b\xb7\xd5\xdb\x10\xef\x38\xbe\x38\xf5\x09\x5c\xa8\x74\x98\x26\x66\x23\xaa\xfc\xcd\x99\x80\xa6\x4a\x69\x44\xe2\xa7\x8a\x43\xab\xaa\xbd\xeb\xb2\x12\x7b\xdd\x54\x3d\x44\x03\x3d\xfa\xd3\xe7\xcf\x40\xdb\x0b\xcf\x03\xb1\x7f\xcf\xac\xe8\xae\x81\xc2\x4e\x21\xc2\x76\x74\xf4\x6d\xcc\x0f\x9e\xe0\xde\x6e\x22\xcf\x1d\x14\x38\xc1\x32\x05\x9a\x77\xb2\x2f\x3b\x05\x04\xbb\x87\x02\xc7\xf5\x74\xaf\xef\xdf\x09\xa1\x4f\x14\xaf\xf1\xdc\x21\x5c\x7d\xf5\x68\xb8\x2a\xd8\x68\xb9\x7e\x4e\x14\xb4\x47\xbc\x5d\xfa\x18\x72\x82\x40\x70\x81\x6b\x04\xc4\xe3\xaa\xe8\x91\xff\xd4\x41\xde\x40\xba\x6f\x6f\x55\x71\xff\x2d\x0e\xc4\x8a\x5a\x37\x5c\x4b\xe3\x0c\x6e\x6e\xd0\x3b\x48\x2b\x3c\x86\x9c\xf8\x11\x7b\xa3\x5e\x62\x92\xe0\x08\x15\xc5\x46\x3d\x37\xde\x34\x68\xad\xc4\xd1\x6f\xe8\xdd\xc7\x38\xe5\x2e\x42\xe1\xfe\xe4\x8e\x2c\xdf\x9e\xa7\xff\xfe\xdb\xd6\x58\x0d\xd6\x6b\x58\xf6\x74\x42\xca\xba\x83\x02\x89\x4f\x36\x2f\x75\x55\x78\x77\x72\xb3\x1d\x42\x0d\x21\x8c\x5e\x50\xec\xd5\xa5\x74\x73\xe8\xe0\xbc\x01\x06\x16\x35\x0a\x79\xca\x12\x34\xef\xfd\xa9\x8b\xa9\xe0\xe8\x01\x29\x2b\xd5\x6c\x35\x18\x39\x64\xf7\x32\x31\xe7\xc9\x6a\xaf\xf9\x9c\x4d\xee\x6f\x09\x19\xca\x32\x47\xf8\x45\x7c\x5e\x9d\xd8\x09\xf9\x9f\xa0\x3f\xe0\x5e\x03\xd5\x20\xf4\x83\xf5\x47\xbe\xaf\x4c\x58\x70\x95\x82\x9b\xa7\xb3\x67\xe1\x4f\x9f\xff\x69\x4c\xa3\x8d\x71\x2a\xed\x1a\x2f\xaa\xd5\xda\xe8\x4e\xf8\x63\x27\x57\xc0\xbd\xf9\x2f\x78\xbb\x07\x55\x3d\x1b\x4b\xec\xf4\x29\x69\x0a\x60\x07\xf4\x87\x84\xd3\x3f\x3c\xfd\x7d\xda\xd9\xe6\x41\x42\x0f\xfa\x30\xc4\x27\x21\x57\x13\x5f\xba\xcf\x6e\x6d\x43\x55\x2f\x74\x96\xc2\xbe\x22\x27\x93\x7f\x14\xe3\xd6\x96\x72\x5a\x41\xb7\x1c\x95\x02\xd4\x69\xb3\xce\x84\xba\x72\x4c\x58\x5d\x68\x10\x1b\xcf\xc0\xf8\x13\xc6\xae\x04\xb5\x54\x8e\xe6\x01\x62\xd9\x93\x12\x0c\x29\xe0\x45\x68\xde\x87\x36\xdb\x27\x72\x48\x75\x3f\xbd\x67\x5d\xbb\xf6\x36\x3b\xd9\x1c\x07\xa3\xc6\x54\x05\xa1\x1e\xf0\x0c\xe5\xe1\x5a\x8f\xaf\xd6\x41\x06\x29\x58\x20\x11\xaf\x74\x1e\x62\xb6\x8e\x16\x06\x41\xfa\x80\x97\x7d\x3f\x57\xab\xa1\xbe\x69\x4e\xae\xd8\x5b\x37\xc4\x42\x16\x68\x82\x73\x1b\x7e\x0e\x81\x0f\xf7\x75\x5c\xae\x0a\x1d\x72\x9e\xa3\x0d\xac\x6f\xc1\x09\xfe\xd5\xf9\x69\xd8\x23\xee\xae\x97\x57\x40\x10\xf6\xd9\x84\xda\x75\xd9\xb9\x4c\xd9\x14\x83\x5d\x4e\xbc\x1e\x28\x71\x8b\xe9\x73\xe4\x27\x0e\x6a\xf8\xd2\xa7\x95\xe1\x68\xe1\xe1\x34\xe4\x21\xfb\x03\x75\x5e\x12\xa5\x37\xe2\xa7\x92\xd2\x6b\xde\xbc\xdd\xf7\xde\xf9\xdb\x71\x79\x3b\x1e\x8f\xc7\x6e\xae\x5e\xa8\x6f\xe8\x69\xeb\xf6\x7b\xae\x53\x39\x5b\xb5\x28\xe1\xd8\xbc\x7e\x04\x70\x24\x57\x2b\x9a\x5d\x87\x56\x3b\xfd\xfc\x78\x7d\x2a\x50\x89\x39\x4f\x60\xbd\xbb\x96\x79\x34\xe5\xc6\x86\x21\xc9\x2a\x36\x6c\x2a\x16\x7c\x29\x35\x14\xa6\x02\x8f\x41\xc2\xe0\x1d\x74\xf5\x3e\x1f\x5a\x74\xc2\x3a\x42\x9b\x5c\xbc\x2b\x34\x22\x29\x42\x42\x2e\x34\x89\x68\x07\x53\xc0\xcd\xed\x36\x05\xe4\x15\x34\x98\x9e\xd4\x07\x44\x13\xf1\x44\x60\x53\xee\x86\x0c\xd3\x39\x68\x2d\xf3\xe1\x84\x9d\x13\x67\x80\xf9\xa7\x34\xb5\x9a\x60\x5a\x31\x51\x2c\x44\x2e\x4a\x9e\x35\x1f\x44\x85\x49\x2f\x9c\xb4\x2c\x1d\x93\x61\xc0\x22\xe7\x05\x0a\x4b\x90\x7d\xa9\x2c\x7d\xaf\x29\x12\x71\x8e\x5f\xf7\xde\x40\xc7\xe7\xd7\xd2\x80\xa6\x42\xae\x0f\xd4\x2b\xf7\x36\x9d\x47\xfe\xbb\x90\xe5\x75\xff\xca\xa1\x1e\x0e\xe1\x3e\xfd\xc9\xb7\xd4\x99\x7c\xdb\xbd\x5d\x29\x8e\xcc\x6d\x9f\xf4\xd8\xed\xc9\x8e\x7e\x7d\xc9\x77\x1d\xc9\x3f\xa4\x23\xf9\xb6\x59\xb4\x2b\x3f\x76\x4b\xfa\xeb\xd1\x82\xfc\x41\x36\x1f\xdf\xf6\xea\x3d\x72\x01\xd3\xb7\xf5\xf8\xfd\x9b\x8e\x7f\x48\xb3\xc0\x8f\xde\x75\xfc\x09\x71\x4d\xc7\x8a\x8d\x7e\x05\x0f\x3d\x7a\x8e\x6f\xb5\xdb\x78\xcf\xc4\xdf\xee\x1d\xc6\xb7\xda\x5b\xbc\xe7\x5b\x77\x6f\x17\xbb\xd5\x4e\xe2\x3d\xdf\xba\x7b\xf7\xf0\xad\xf6\x0d\xef\xf1\xd6\x7d\x7b\x85\xdf\xab\x4b\xb8\x68\x39\x4f\x82\x47\xf9\xd3\x8a\xc1\x3e\x45\x6b\x1d\x9b\x75\xf7\x94\xbc\x83\x34\xe8\xde\xb5\xe6\x1e\xb2\x35\xf7\xc3\x90\xaf\xbb\x46\xdc\xfd\x1a\x71\xf7\x91\x9c\x91\xbb\x18\xfc\x33\x7d\x35\xe9\xe3\x80\x0c\x01\xce\xe7\x46\xb7\xed\x1a\x3d\x8a\x8c\x2a\xea\x6a\xd6\x52\x7c\x47\xb0\x3a\x94\xe3\xb9\x76\xb8\x60\x1e\x50\xce\xcb\x15\xfb\xea\xfc\x14\xf5\xdf\x86\x1a\xae\xb4\x7f\x74\xe0\x94\x94\x00\x82\xb8\x5a\xf5\x57\x5b\xbb\xd5\x58\x77\xae\xb0\xee\x8b\x5d\xd7\xcb\xc6\x5a\x99\xc4\x66\x7d\x59\xe2\x0a\x47\x81\x18\x11\xe3\x81\x3f\x14\xcf\x85\x29\x78\xe2\xa4\x1f\xdd\x01\x81\xda\xa8\x7e\x62\xe2\x2c\x17\x0a\x82\x56\xaa\xc6\x77\xf6\xf7\x1f\xb4\x0f\x64\xbf\x25\x0f\xa9\x98\xc8\x7b\x65\x32\x5e\xa9\x64\xf1\x48\x56\x7c\x03\xf1\x82\x8f\x9c\xb3\x1b\x51\x2a\x91\xd5\x3d\x43\x7d\x8d\x89\xe8\x52\xfb\xde\xb3\x74\xbe\x5f\xe1\x7c\x8f\xa2\xf7\xee\x2d\x80\xfa\x96\xcb\xf7\x29\x42\xde\xd0\x17\x65\x86\x67\x93\x9b\xd2\x8a\xda\x65\x75\x1c\xbc\x77\x65\x68\xaf\xa6\x3e\x4d\x14\x08\x84\xb0\x7d\x10\xef\x46\x8d\xfa\x87\x73\x13\xf9\x96\xd4\xa1\x20\xcf\x47\xb0\xef\xeb\x2a\xf2\x0a\xcb\x3a\x0c\xc6\xbe\x59\x73\xc3\x34\x31\x83\x1f\x87\x9b\x77\x2b\xfe\x9d\x79\x6e\xf8\x49\xe9\x26\x6e\x25\xcf\xae\x8a\xae\xed\x79\x1b\xeb\xfe\xd5\xeb\xab\xe3\xe6\xa0\x4e\xfb\xbe\x85\xa4\x5a\x47\x54\xf7\x7d\x94\x1a\x7e\x2b\xa6\x0b\xad\x6f\xd8\x41\x94\x72\xb3\xa8\xa6\x93\x44\xe7\x51\x7e\xd7\xd8\xc8\xb9\x39\x22\xfe\x1c\xbb\x79\x1f\x32\xa9\x00\x8c\x6d\x1d\xc4\xce\x3f\x24\x09\xb3\x80\x35\xa4\xdc\x24\x3a\x06\xd7\xa7\x09\x42\x06\x53\x21\xb6\x61\x1f\xac\x2f\x46\xf7\x6e\xf1\xbf\xb0\x20\xbe\x9a\x36\xc6\x1c\xba\x93\x6a\x68\xce\x6f\x85\x24\x8b\xba\xed\xff\x00\x74\xf8\x7b\x3d\x5a\x8c\x1d\x22\x67\x0d\x58\xd3\xda\xce\x08\x81\xb2\x7d\x68\xaf\x40\x3f\xdd\x8f\x9d\xce\xcd\x72\x14\x9e\x15\x8b\x50\x38\xa6\xe2\xd8\xf9\x54\xc4\x55\x62\x51\xc1\x46\xbb\x50\x8c\x04\x66\x34\xd5\x93\xda\x7f\xe2\xb3\xc8\x66\x19\x9f\x03\x3c\x7b\xab\xea\x02\xa4\x23\xb4\x20\x76\xb6\x43\x74\xb3\x2f\xad\xf3\xd0\xc3\x80\x7c\x68\x30\xa1\xdb\x07\xd2\x28\x3d\x1f\xe2\xff\xc7\x6e\xde\xbe\x97\x7a\x23\xd7\x1b\xac\xfc\x50\x5c\x68\x1c\xef\x60\xe4\xde\xd9\xec\x31\x81\x51\x74\x1e\xd4\x3d\x99\x21\x3b\x06\x05\x3e\xfc\x9e\xb3\x5c\xbe\x73\x4f\x89\x7f\x15\x67\x95\x53\x2f\xe4\xcd\x5f\x1f\x3a\x5b\xa6\x36\x7c\x46\x6e\x15\xe3\x3b\x23\x58\x60\x05\x5f\x5c\x60\x5a\x38\xbe\x40\x1c\x26\x20\x84\xdf\x3e\xfc\xdd\x1d\x97\x23\x84\xe9\x06\xda\xea\x10\xae\xa3\xe1\xdc\x42\xfb\xf3\xb7\x4f\xf8\xce\xdd\x32\x44\x08\x6f\xfd\x90\x7d\xf8\x67\x33\xeb\x93\x3f\x58\x2e\x65\x22\x8e\x93\x44\x57\xaa\x57\xfa\xe0\xa9\x70\xaf\xc0\xad\x48\xaf\x1a\x63\xa2\xbf\x39\x85\x6f\xb1\x62\x9a\x67\x92\x63\x4d\x7d\xf3\x4e\x2c\xa6\xaa\xc7\x01\x7f\x75\x6b\x86\xc4\x32\xd8\x6e\xf7\xd3\x24\xa4\xae\x3d\xbf\x5f\x92\xe5\xfa\xdb\xac\x9f\x70\x2d\x0a\x92\xab\x7a\x2d\xdd\xf9\xc3\x72\xcd\x2d\x37\x37\x35\xd2\x80\x80\x72\x93\xb0\x99\xa2\xcf\xe9\x45\xc7\x1c\x9f\xda\x09\x7d\xa0\x03\x75\xad\x93\x7b\xee\xe5\x8f\xcd\xcb\xff\x3e\xbd\xe8\x97\xf2\x1b\x40\xd6\xb1\x8e\x61\x41\x43\x07\x5d\x3b\x2e\x1f\x8f\xcb\xd0\xdc\x93\x47\xac\xe4\x84\x1f\x4b\xbd\x43\x32\xc1\xd1\xa7\xc1\x0e\xa2\x8c\xec\xc3\x89\x93\xe9\x75\xa8\x17\x45\x3d\xb5\xfa\xc8\x05\x57\x26\x2a\x35\x14\x30\xb4\x4f\x67\x0c\xf3\xc1\x83\x90\x56\x9b\xcc\xff\x03\xef\xb3\x6c\xde\x81\xad\xff\x59\x65\x8d\xfb\x1c\x1f\xee\x05\xe6\x07\x3c\xbe\x14\x73\x69\x6c\xb9\xf2\x4d\x48\x66\xd1\x24\xc8\x2b\x13\x6e\xb9\x11\x2b\xf6\xf7\xaf\xcf\xfe\xf1\xcf\x57\x6f\x4e\x8e\x5f\xfd\xf3\xf5\xf1\xc9\xdf\xcf\x2f\xce\x7e\xf8\xe1\xea\x1f\x57\xd7\x67\xaf\x7f\xf8\xe1\xa4\x2a\x4b\xa1\x2c\x95\x5d\x5e\x09\xfb\xc3\x0f\xc4\xa9\xe6\x87\x1f\xae\x93\x42\x16\x3f\xfc\x70\xe9\x9d\x18\x08\x2f\xfc\xdf\xa7\x17\x20\x3f\xb1\xfa\x27\xa4\xdc\xc0\xd9\x8a\x44\x87\x79\x2f\xb8\xa9\xd3\xeb\x1a\x75\x15\x1d\x20\xa9\xba\x1e\x77\x66\xc1\x4b\x41\x47\xf3\x85\xf7\x64\xf5\xda\xec\x6e\xc0\xba\x2f\x80\xf7\x90\x06\x2f\x19\x9b\x0a\x7b\x2b\xa8\x5c\xad\x7d\xcc\xc5\x59\xbc\xdf\x61\x7b\x1c\x4c\xd6\x77\x47\xd1\x06\xec\x71\x54\xce\x34\x5b\x4a\x71\x8b\xd8\x08\xd8\xe6\xa5\x06\xc0\x87\xf2\x55\x2c\x61\x6c\x87\xbb\x48\x49\x2a\x74\x1a\xc0\xfe\x5b\x6e\xdd\x35\x97\x6e\xa3\x5c\x02\x91\x4b\x44\xca\x2e\xcf\x4f\xd9\xf3\x09\x2a\x39\xe7\xa7\x08\xa4\xb4\x89\xac\x2c\x21\xb4\x1f\x77\xa0\xe2\xe9\xbb\x21\x5d\xbc\x66\x80\x2e\xc2\xa8\x03\x07\x54\xd3\x54\xe7\xfc\xbe\x6d\x3d\x7e\xa1\xf0\x00\x9b\x2e\xfd\x54\xf1\x0c\x75\x80\x4b\x9d\xae\x4b\xa6\xbd\xbf\xfa\x8f\xfe\x36\xf9\x6b\x98\xc7\xdf\x26\x7f\x85\x76\x4e\x9e\x6c\x7f\x9b\x98\x65\x32\xf9\x2b\x15\xc2\x32\xba\x69\x63\x76\xe8\x5a\x55\x0b\xe9\xb3\xf8\x1b\x78\x36\x07\x7d\xf7\x93\xd4\x29\x0c\xd8\x17\x6b\xe0\x6e\x58\xa8\x05\x42\x8d\x6d\x52\x0a\x4e\xed\xda\x53\x91\x09\x1b\xf5\xb7\xdf\x7a\x3b\xa6\xbb\xfb\x53\xf9\x50\x55\xa3\x7b\x57\xec\x5c\x0a\xfa\xd2\xaf\xbe\xc9\x57\x6c\x30\xfc\xa1\x6e\xc0\xda\x61\x03\xf4\xac\xc8\xbf\x57\xd8\xc6\xea\x4c\xe0\xfa\xf4\xd9\x29\x1b\x0b\xa2\xf6\x4d\x3c\x7a\x17\x42\x6c\xa3\xea\xf8\xda\x43\x71\x39\x8e\xb8\x0e\xf3\x07\x4b\x03\x9b\xd7\x60\x6c\x12\xbf\x81\x32\xa5\x15\x73\xa7\x96\x45\x4f\x46\x5c\x09\x68\x4b\x68\xb3\xf3\xd7\x1b\xb1\x1a\x21\x70\x03\x2a\x21\x7f\x8b\x30\x05\x43\xe9\xab\x2e\xdc\x80\xba\x64\x7f\xf5\xff\xfa\xdb\x7d\xad\xb5\x1e\x7e\xd4\x3e\x5e\x54\x7c\xa9\xde\xa1\xab\x33\xac\x7f\x68\x22\x39\x20\x65\xa9\x34\xc2\x6a\x24\xd7\x84\x9d\x41\x7d\x23\x6a\xa4\x84\xab\x96\x65\x8d\x9b\x8d\xef\x91\xd4\x40\x01\x00\xff\x4b\x54\x17\x71\xa1\xaf\xa8\xa4\x0e\x90\x59\x66\xa2\xac\x3f\x01\x01\x73\xa1\xcf\xde\x89\xa4\xba\x2f\x5a\x0a\x5e\xbd\x7c\x7f\x37\xa2\x7f\xd7\x8a\xaf\x45\x40\xad\x41\xda\x38\x2d\x3c\x64\xc5\xd7\xbb\x33\x4a\xcd\x7a\x3f\x6d\x6f\xc4\xca\x04\x30\xb0\x1b\x1c\x9d\xaa\x57\x03\xff\xfa\x83\xec\xec\x9d\x34\xd6\xfc\x6f\xdf\x32\x23\x9f\xd6\xcd\x4a\x38\xe6\x48\xd5\xa3\xfb\x25\x51\xd0\x4b\x03\x1f\xf3\xa9\x09\xee\x5f\xa0\x37\xd5\xdf\x78\x4a\x44\x50\x6f\xdc\xbd\xd3\xbe\xa1\xec\x1e\xad\xa0\x44\x29\xc6\x0c\xab\xf3\x52\xf0\xc7\xc8\x9f\x48\x43\xa0\xcb\x99\x53\xf2\x9a\xc7\x0c\x7d\x44\x37\x49\x40\x8f\x90\x4b\x9e\x09\xb4\xeb\x6f\x65\x96\x26\xbc\xc4\x10\x39\x01\xc7\x18\x82\x72\x24\xc4\x04\x77\xc6\x91\x24\xab\x57\xd9\x50\x2c\x8e\x97\x56\x26\x55\xc6\x4b\xe6\xf6\xe3\x5c\x97\xf7\xc4\x97\xc1\xab\x5f\xeb\x96\xc0\xa2\x3d\x3a\x1a\x36\xe5\x7b\x7b\xc4\x36\x20\x1f\x69\x2f\xce\x64\x82\xda\x8e\xe6\x46\x39\x68\x42\x41\xea\x99\x97\x4d\x41\x50\xc4\x90\x6e\xb6\xe1\x1c\x97\x73\xf0\x7f\x1f\x46\x87\x47\xd8\x99\x13\xf6\x65\x28\xf3\x1d\xb1\xda\x67\x0c\xc5\x84\xf4\x4c\xda\x36\xb4\x5c\xf5\xa6\x9e\xe9\x12\xfa\xf0\x1c\xa4\x1a\x7e\x23\x96\x32\xb1\x87\x13\xf6\xff\x73\x9a\x22\x38\x91\xbd\x3a\x49\xdb\x2c\x14\x50\xd6\xc0\x72\xcf\xd8\x01\xfc\x2c\x56\x25\x0f\x7d\xa0\x88\x3a\x0f\x3c\xb2\x6c\x94\x1e\x21\xea\x0d\xe1\xe9\x86\x18\x45\x4d\xb1\xc5\x1a\xe1\xe4\xd7\x41\x42\x06\x99\x28\x0d\xed\xd2\x86\xe7\x36\xc4\x59\xbc\x08\x0d\x8c\xf3\x6f\xf0\xd1\xb3\x52\xcc\x61\xff\xe1\xee\xf9\x84\xbb\xcf\xea\x42\x67\x7a\xbe\xba\x2a\x4a\xc1\xd3\x13\xad\x8c\x2d\x41\x34\xf4\xc1\xf1\xba\x6b\xcc\xa8\xf5\xc3\x42\xdf\x32\x4e\x75\xc8\x7a\x86\xa0\x6a\xba\x9a\x2f\x10\xec\x16\x7e\xe8\xdb\xa4\xf9\x29\x92\xd1\x69\x26\xec\x2a\x80\xd9\x02\x83\x07\x6c\x5c\x18\x05\x1c\x1e\xb7\x7c\x45\x9b\x89\x4f\xa1\x5b\x6e\x9d\x10\xe4\x27\x83\xa1\x9f\x3b\xdf\x1f\xa4\xf2\xf1\xc5\xe9\x7d\x11\x84\xb7\xa8\xd0\xde\xf1\x2a\x51\xef\x7c\x68\xa1\x16\xe8\x1b\x34\x52\xa0\x1b\xcf\x35\x69\xaa\x88\x39\xea\x29\xf3\x09\x75\xd3\x3e\x20\x3b\x39\x7f\x77\x75\x23\x6e\x3b\xfc\xd2\xbf\xe8\xd7\xe2\xfe\xb9\x5c\x63\xb0\x47\xbf\x51\x86\x5b\x69\x66\x00\x35\xfe\x09\xf5\x71\x48\xb9\xef\x86\x88\x8c\x57\xb3\x72\x25\x1e\x2d\x74\x4b\xf6\xb8\x7a\x0d\x66\xa1\xfc\xbb\xda\x0e\xc2\x03\x10\x4b\x00\x02\x98\xb2\xdb\x41\x09\x35\x18\xb0\xba\x8e\x43\x63\xa4\x22\xf4\x1a\xf6\xbb\xd6\x2e\x84\x2c\x5b\x10\xaa\xad\xbd\xdf\x5d\x30\x76\x4e\x65\xeb\x9b\x17\x06\xe4\x39\x7b\xe7\x34\x0f\xd3\x2d\xd3\x08\xaf\x66\x7f\x90\xd6\xa0\x18\x1e\xf3\x09\x94\xad\x65\x68\xe0\x74\x83\xd9\x1b\x7f\xd2\x55\xce\xd5\x57\xbf\x0e\x43\xac\x5f\x97\x21\xb6\x21\xcf\xf8\xce\xd7\x6f\x81\x7d\xc7\xd5\x6a\xe4\x14\x32\x23\x54\xe0\xd1\x81\xcd\x55\x7d\xb0\x53\xe3\xd7\x2c\x68\x73\xce\x28\x72\x37\xe1\xef\xfa\x42\xf9\xf7\xe8\x52\xc4\x06\xe8\x54\xc4\x40\x96\xdd\x74\x90\x80\xf1\xef\x3d\xb1\x3a\x0f\xd2\xbf\x67\x11\xeb\x6e\x50\xd7\x57\x83\xa1\x6e\x6a\xd3\x1a\x39\xab\x61\x5a\xd7\xc2\xae\x36\xac\x7b\x3d\x7b\x80\x46\x1e\xac\xa7\x8d\x5b\x5f\x0d\x42\xe8\x7b\x58\xbb\x1c\x02\x4c\x7a\xe6\x77\xc7\x46\x9b\xf7\x5c\x8d\xd8\x85\xb6\xee\x3f\x91\xf9\x7b\xaa\x85\xb9\xd0\x16\x3e\x79\x10\xa4\xc4\x57\x18\x90\x90\x64\x9c\x21\xae\x17\xc8\x4d\x0a\xd1\xba\x13\xcf\x13\x6c\x83\x61\x71\xae\x98\x2e\x3d\xc5\x82\x75\x61\x68\x88\x38\xac\x40\xe0\x48\x77\x1a\x27\x6e\x9c\x98\xce\xef\x19\x8e\x86\x82\xec\x2f\xfc\x06\x40\x32\x8b\x0c\x12\xf4\xd3\xaa\x44\xac\x52\xa7\x6b\x5a\x31\x97\x09\xcb\x45\x39\x87\xc6\x87\x5d\xf2\xea\xe3\xab\xff\xb9\x82\x57\xcf\xd3\x25\x9e\x4c\x0f\x5e\x82\x23\x1b\x54\xac\x01\x55\x00\x1c\x0f\x8f\xb5\x9c\x83\x25\xf5\x7f\x83\x0f\xfa\xff\xb1\x82\xcb\x12\xb0\x4d\x29\x76\x1c\x7f\x47\xd1\x97\x78\x18\x37\xc2\x9a\x6f\x89\x2b\x26\xb0\x10\xc8\x8d\xde\x56\x3c\x46\xec\x76\xa1\x0d\x1e\x86\xc1\xfd\xb1\x77\x23\x56\x7b\xa3\x35\xd6\xdb\x3b\x57\x7b\x75\x60\xb8\xc1\x6c\xe1\x10\x86\x0c\xc2\x3d\xf8\x6e\xef\xe3\xe9\x2a\xbd\x0e\xdb\x21\x40\xe6\xdb\x13\xea\xc8\x57\x64\xf3\xf4\xef\xe5\xfe\x1a\x07\x8a\xec\x73\x8c\x09\xce\x4b\x11\xf5\x71\x07\x45\x3d\xc7\x38\x67\xa5\xc4\x52\xb8\xc5\x4a\xa5\x21\x20\x37\x9f\x62\xf0\xaf\x35\x93\xe8\xff\x73\xaa\x2f\xb4\xf5\x56\xfb\xbf\xbc\xdb\x0b\xf9\xef\x9d\xcc\xab\x1c\x11\x93\xac\xb3\x14\x52\x39\xf3\x80\xaf\x3e\xb3\xa1\x69\x2f\x34\xcd\x56\xe2\x63\xcb\xcb\x39\x64\x38\x92\xbd\xe0\xd9\x6c\x9e\xe9\x29\xcf\x58\x2e\x95\x7b\xcc\x84\xbd\xd4\x25\x13\xef\x78\x5e\x64\x02\xcb\xc9\xd8\x1f\xc6\xff\xd1\x4a\x30\x8a\x86\x8f\x98\xa7\x05\x25\x49\x58\xcd\x9e\x23\xd7\xd6\xc0\xef\x21\xd5\xa1\x61\x80\x05\xb7\x85\x61\xcf\x8f\x9e\x1f\x3d\x7b\xc1\x7e\x66\x6e\xe8\xe7\xf4\xdf\xcf\xe8\xbf\x7f\x60\x3f\xb3\x9f\x19\x63\x97\x8c\x35\xfe\xcb\xe0\xbf\x63\x26\x67\xf1\x1c\x9e\xbb\x69\x26\x3a\xa7\x17\x06\x4f\x6e\xa8\xfa\x0c\xfd\x63\xac\xa6\xa1\xa1\xe8\x27\xd1\xb9\x80\x39\x3c\xff\xdf\xfe\x1e\x08\xb8\x5a\x6c\xf1\x03\x93\x3a\x80\x29\x1d\xb2\x5b\x70\x4d\xe5\xfc\x06\xcd\xb2\xe3\xc4\x56\x3c\x73\x0f\x3f\xf8\x6c\xfc\xec\x90\x69\xd5\xbc\x7d\x29\x35\xb4\x46\xa7\x19\x1e\x3c\x3f\x9c\xac\x4d\xf9\xb3\x0d\x53\x6e\x75\xbb\xa1\x9a\x3b\x37\xe8\xdd\x5c\xe3\x19\xe6\x58\xad\x6e\xf9\x2a\xb0\x8d\x37\x4b\xe7\x72\x19\xb0\xd1\x23\x1c\x0a\x88\xd9\x01\x17\x48\x8f\x0c\x84\x83\xae\x98\xb4\x13\x76\x6e\xf7\xf7\x7d\x6f\x25\xa7\x31\x7b\x10\xf7\xd3\x18\x2e\x10\x08\x0f\x8b\xfe\xac\x95\xd3\xdb\xa3\xb1\xfe\x20\xce\xd1\x7b\xa1\xb0\xd3\xd3\x6b\xff\xc6\x00\x4e\xf5\x30\x96\xdf\xc1\x4e\xf4\xeb\x19\xd6\xc9\x62\xa7\xa3\x09\xb4\xb1\x22\xda\x53\xc2\x08\xaa\xce\xb4\x7b\xa4\x09\xd6\x93\x84\xfc\xfb\x84\x67\x71\xb0\x2e\xd1\x00\xd0\x56\x0a\xdf\x28\x29\x4e\x2f\x0a\x7e\x29\xf6\x5d\x7d\x27\xa6\x15\x41\xfc\x15\x07\xfa\x1b\xa6\xb3\xef\x4d\xab\xe4\x46\x58\x7f\xee\x94\x90\x11\x51\x54\x96\x4d\x79\xc6\x95\xd3\x60\xd6\xfc\x10\x56\xe3\x60\xf8\x4b\x60\x98\x0d\xfc\xf2\xa9\xe3\x23\x6b\xbb\xa3\xbf\xd0\xff\xae\x3d\x64\x14\x91\x25\x47\x61\x2a\x78\xe6\x53\x29\x00\x1f\x3d\x00\x56\xa9\xfd\xfd\x7a\x5f\xc1\xda\xa0\xf0\xab\x1d\xac\x4e\x2e\x34\xe4\x3e\x3b\xf0\xb9\x8f\xcc\x8a\x2c\x43\xee\xa9\xfb\x92\xb9\x4d\x16\x37\x3a\x93\x30\x42\x53\x06\x6c\xfc\x61\xb3\x3b\x1a\x06\xf5\x9d\x64\x57\xab\x50\x2d\x3f\x62\x0c\x5a\x03\xce\xe5\xd2\x09\xa5\x0f\x12\x1a\x28\x18\x17\x22\x2b\x58\x29\xd2\x2a\xc1\xc1\x19\x33\x37\xe2\xd6\xe9\x54\xf5\x9b\x52\x4b\x21\xcf\xb2\x7b\x0d\xa2\xee\x21\x46\xb4\x6a\x8a\x44\x39\x03\x86\xf4\x1d\x37\xc5\x52\x94\x2b\x56\x68\x63\xa4\x5b\x07\xd8\x4b\x90\x0d\x07\x7a\x57\x40\xd6\x81\x4c\x2c\x98\x96\x17\xc3\x7b\x24\x76\xf7\x9c\xa0\x36\xba\xb1\x3d\x3e\xcd\x51\xf7\x07\x77\xcc\xbc\xff\xa8\xbb\x84\xff\xad\x1f\x79\xe7\x33\xb6\x81\x07\xc3\x5c\x1a\xcc\x73\x9f\x53\xf0\x33\x38\xac\xfe\x70\x18\x1d\x86\x7f\x38\xfa\xec\xe8\xf9\x81\x9b\xeb\x67\x87\x6e\xd6\x8d\x63\xee\x79\x38\xe6\xc2\x2f\x69\x46\xc2\x34\x0e\x3a\x67\x80\x61\x03\x5d\x5d\xa6\x14\xe1\xf1\x59\x74\x6e\x46\xc6\x52\xbc\x4d\xe6\x5e\xbe\x8c\x80\xef\x6a\x66\xbd\xd5\xb0\x73\xe0\xbc\x95\x96\xfd\x2e\xd7\xa5\xf8\x5d\x74\xff\x9d\x07\x54\xf7\x73\xa7\x6f\x3f\xb5\x4c\x1a\x0b\x4d\xd5\x6e\xc4\xea\xde\x9a\x6e\x1f\xf7\x7a\x5f\xe7\xfa\xfa\x5b\x20\x41\x72\x5e\xdc\x63\x1c\xea\xdb\xde\x27\x85\xf7\x15\x39\x66\x43\x0b\x78\x70\x3c\xa2\x56\x44\x7d\x4d\xb1\x56\x2a\xe4\xd3\x4e\x45\xa6\x11\xe7\x94\x52\x07\xee\x91\xaa\x1f\x60\xe1\x8d\xd5\x25\x9f\x8b\x23\x7a\xec\x63\x69\x07\x41\x5d\xe0\x1b\x5e\x26\x2c\x67\x24\x90\x54\x9f\xd2\xec\xe3\x0f\x20\x05\x78\x02\xd9\x80\x40\xc8\x06\x9c\x43\x94\x67\xf8\x48\x42\x59\x1d\xaa\xdf\xfb\x38\x4e\xf9\xad\x39\xcb\xb8\xb1\x32\xf9\x32\xd3\xc9\xcd\x95\xd5\xe5\x00\xda\xc5\xf1\x77\x57\x6b\xa3\x36\xd6\x54\xb1\xe3\xef\xae\xd8\xa9\x34\x37\x35\xba\x3e\xa2\x6a\x36\x13\xf0\x78\x00\xc6\xa1\x5a\x0c\x96\x73\x67\xff\x09\x6f\xe3\xa9\x80\xeb\x3b\xdc\x5e\xf9\x0d\xbf\x35\x02\xa7\x3f\x75\xd3\x77\x5f\x8b\xee\x22\x78\x6b\x40\x0a\xf8\x3a\xe7\xa7\x5b\x08\x7c\xcd\x4c\xd7\xb6\x23\x6c\x8d\x99\x5e\xca\x4c\x50\x07\x30\x80\x04\x6a\x62\x3c\x03\xd7\xac\x74\xc5\x6e\x39\xfa\xac\x40\xa6\x4e\xd8\xb5\x2c\x5e\xb0\xb3\x08\xaf\x15\x0b\x12\x9a\x43\x39\x7d\x23\xe0\x87\x50\x96\x00\x70\x19\xba\xae\x9c\x08\xa6\xac\x18\x76\x86\xca\x94\x79\xc1\xf6\xc4\x3b\xfb\xc7\xbd\x11\xdb\x7b\x37\x33\xee\x3f\xca\xce\x00\x5d\x99\x7a\x34\x38\xa5\x4e\xcd\x44\x59\x1b\x30\xf8\x83\xf5\xd2\xc1\xe1\x99\x94\x5d\xbf\x39\x7d\xf3\x02\x14\xf8\x54\xb3\x5b\xe1\xbb\x98\xf9\x42\x58\x92\x86\x11\x19\xa0\xa2\x23\xd1\x79\x51\xea\x5c\x46\xe9\xaa\xb0\xc9\xba\xf0\x3c\x1b\xc2\x5f\x0a\x49\x69\xb0\xfc\x83\x70\x10\x64\xfb\xfa\x21\x5b\xc0\xf0\x77\xf1\xcf\xf9\x8c\x69\x74\x4a\x35\x73\xe4\xa5\x09\x37\x39\x8e\xa1\x51\xb0\x1d\x57\xcd\x23\x4e\xfd\xa6\xaf\x8e\x52\xb1\x3c\x32\x29\x7f\x3e\x82\xc7\x20\x03\x10\xf8\x7d\x98\x13\x37\x6c\xef\xf9\xde\x84\x5d\xf9\xbe\xe6\xa3\x78\x8e\xf5\x7d\xce\x1a\xf0\x03\x82\x5b\xf5\xd9\x1e\x3b\xc0\x24\x75\xd0\x29\x32\xe1\x4b\x96\x03\xc6\x06\xf8\xf0\x0f\x3b\xa9\x90\x6c\x00\xf7\x05\xeb\xed\xc2\x60\xd4\x32\xec\x8d\xca\x3a\x87\xf6\x5a\x55\x55\xb4\x06\x7b\x16\xba\x6f\x59\x0d\x15\x04\x82\xfa\xc1\xa2\xa8\x78\x4b\x4f\xac\x09\x29\x15\x69\x27\xaf\xdd\xe2\x63\x17\x78\x18\xe0\xbd\xcc\xb2\x07\xd5\x47\x7b\x0f\xe6\x4c\x62\x03\x54\x73\xb3\x70\xb4\x0c\xb3\x1e\xdf\x28\xf9\x53\x25\xd8\xf9\x69\xe8\xd9\x28\x4a\x23\x8d\x75\x92\x2b\x6d\xe8\x08\x12\x15\x87\x83\xe3\x9c\xff\x47\x2b\x76\xf6\xe5\x15\x4d\xe5\xf0\x01\x12\xb8\xa3\x00\xe4\xff\xa9\x4a\xe1\x54\xa3\xde\x7a\xd8\xb1\x1f\xa9\xad\x7b\xb9\xcf\xd9\x29\xb7\x1c\x55\x30\x94\x66\xba\xae\x30\x85\x9d\x30\x85\xcc\x1f\x5f\x3e\xdc\x51\x8b\x66\xdb\x57\x83\x1c\x07\x5d\x74\xc7\x94\x72\x3f\xff\xe6\xed\xf9\x16\x94\xa8\x04\x4e\xe1\xf9\x6b\x9d\x0e\xa4\x49\x01\xbc\xc7\x09\x8e\xca\x72\x37\x2c\xbb\xd0\x4a\x8c\x40\xd8\x31\x27\xed\xe8\x9f\xdf\x95\xd2\xde\xb7\x62\xb2\xbe\x7a\x1f\xff\x7e\xc5\x06\x79\x6b\x77\xf8\x5f\x44\x95\xf1\x00\xe3\x00\x52\x85\x14\x81\x69\xa6\xa7\x8c\xa4\xc1\x36\xdf\xf8\x9b\xb7\xe7\x83\xbd\xf0\x37\x6f\xcf\x1f\xee\xcb\x0e\x68\x1c\xb4\x6d\x83\x5a\x7f\xab\xb1\x57\xdb\x4a\xff\x87\x6b\xfc\x93\xa1\x74\xfd\x6d\x51\xfa\x46\xaa\xce\x59\x61\x4d\xd1\x71\xe6\xeb\x23\x29\x52\x03\x25\xd9\xe9\x0b\x96\x57\x99\x85\xf2\x37\x60\x2c\xc7\x69\xc6\x9d\xde\x9e\xc5\x18\x41\x41\x30\x76\x2a\x30\xbc\x90\xbe\xf0\x09\x09\xe1\x17\x9b\x7f\xf0\x9a\x2b\x3e\x77\xb7\xc3\x79\xc8\x72\xfc\x33\xe2\xe8\x03\x74\xa0\xab\xf0\x15\x5f\x72\x99\xf1\xa9\xcc\xa4\x85\xf6\xff\x87\x13\xaf\x88\x19\xac\x85\x75\x53\xde\x9a\x50\x1b\x54\x85\x8d\xeb\x83\x40\xc1\x64\x07\x6e\xfc\xa3\x5b\x27\xb8\x0f\x27\xb5\xf6\x0a\x68\x64\x90\x28\x8f\x2a\x6e\x43\xb5\xf5\x28\x0f\x2d\xcd\xb6\x1f\xbb\x76\x55\x2b\x61\x99\x5f\x76\x84\x80\x5e\x57\x7b\xdc\x48\x1b\xd5\x1e\xf8\x82\x40\x27\x9e\xb8\xe6\x83\x1d\xa4\x7a\xe8\x3e\xb0\x65\x3a\xfe\xbe\xaf\xf6\xb3\xdb\x2f\xbf\x7c\xd5\x0b\x3c\x08\x95\x62\x10\x21\x1c\xba\x95\x26\x8d\x3b\xe8\x8a\x44\xb5\x07\x17\x02\xed\xca\xed\x9b\x2e\x45\x14\x78\xf5\x96\xae\x81\x53\x07\x21\x04\xc2\xae\x74\xde\x38\x3d\xdf\x27\x11\xc5\x62\xd6\xbf\x06\xf2\x44\x14\x8b\x97\x57\xcd\x50\x8a\xfb\x8c\xbd\xbc\xda\x20\xf7\x30\x57\xc6\xbd\xb7\xc1\x00\xcb\xbe\x61\x99\x9c\x09\x2b\x3b\x11\x61\xcb\x92\x2f\xd7\x4a\x5a\x5d\x9a\x6d\xd4\x7c\xd0\xa3\x87\xd1\xbb\xde\x7a\x42\xb0\xd7\x34\x2e\x26\x7c\x26\x3a\xcb\x44\x62\xa9\xe7\x21\x2c\xab\x7f\xf0\x26\x47\x08\xa5\x02\x18\xdf\xe3\x97\x9c\x1e\x47\xc8\x6a\x47\x6f\xcf\x8e\x4f\x5f\x9f\x4d\xf2\xf4\x37\x0b\x7d\x3b\xb6\x7a\x5c\x19\x31\x96\xb6\x9f\xae\xb4\xc5\xa2\x90\x01\x1c\xd0\x76\x31\xcc\x02\xd6\x88\x44\xdf\x98\x1a\x33\xcc\x07\x7e\x4b\xad\xed\x3a\x6a\xd8\xac\xca\x32\x5c\x53\x5b\x0a\x31\x8a\xdd\x89\xf7\xc4\x54\xab\xaf\x87\xa5\xbf\xee\x6f\xee\xeb\x3b\xfc\xd1\xfc\x50\x36\x43\xff\x53\xbe\xab\x6a\xcc\xde\x43\xfb\xab\x30\xb2\x4f\xe8\x73\x8c\xef\x56\xe2\x46\xac\x18\x64\xf7\xcf\x74\x09\x48\x9b\x4d\x2e\x14\x36\x01\x72\x1d\x41\x4b\x45\xd2\x15\x1e\x08\xa9\xfb\x68\x11\xf0\x22\x6f\xc5\xec\xe3\x10\xfa\xad\x98\x61\x01\x85\xcf\x71\x26\xeb\x82\x57\x76\x81\x99\x90\x88\x7c\x84\xe4\xdc\x48\x79\xaa\xc8\x78\x20\xa4\xee\x95\x4b\x3f\x44\xbd\x57\x1f\xe0\x7d\xb6\xb6\x5e\xb1\x9b\x90\x16\xc9\xde\x3b\xae\xa0\x97\xce\xb6\x14\xb7\x47\xb7\xba\xbc\x91\x6a\x3e\xbe\x95\x76\x31\x46\x4a\x99\x23\xc0\x61\x3b\xfa\x0d\xfc\x87\xa2\xb5\xc7\x69\x4a\x99\x65\x95\x11\xb3\x2a\xc3\x9c\x2f\x33\x61\xbc\x90\xdf\x8a\xd2\x40\x0a\xe3\x8d\x54\xe9\x88\x55\x32\xfd\xa2\xeb\x8a\xb1\x21\x36\x48\xf7\x2e\x62\xef\x3d\x17\x4b\x2f\x7e\x4a\x9e\x6a\x83\x28\xbc\x8e\x44\x0d\xd6\xe7\x69\x2e\xd5\x43\xe1\xfc\xae\xaa\xbd\x54\x69\x37\x0a\x36\xa9\x77\x02\xe3\x34\x75\x7b\x1c\xdb\xc7\x8c\x43\x16\x0d\xf7\xbe\x0c\xec\x52\x45\xf9\x34\xcd\x6c\x9a\x0f\x12\x28\xf9\xca\xfc\x94\x8d\xf1\x29\xe3\x22\xad\xe9\xba\x4b\x8d\xb9\xcf\xf5\x31\x53\x63\x86\x75\x7f\x7f\x82\x84\x97\x8f\xca\x63\x6c\xa7\xf6\x6e\x81\xd6\xfd\x35\xdd\x8f\xa0\x7f\x01\x0e\xbc\xf1\xc5\xc9\xa0\x5e\xa1\xec\xf1\xbe\x2d\xec\xcc\x17\x80\x87\x7d\x99\x51\xa2\x95\x22\x4c\xba\x37\x85\x50\x57\x96\x27\x37\x3d\xe3\xa2\x3b\x9d\xe9\x57\xa6\x33\x0d\x9b\x2b\xe3\xd3\xa0\xd3\xc0\xa3\x58\x45\x45\x29\x65\x75\x96\x34\x6e\xec\x47\x28\x75\x11\x61\xfd\x35\x2f\xfa\x7b\x40\xfd\x48\x2d\x45\x29\x7c\x4c\x4e\x4f\xa8\xaa\x29\x74\x51\x65\x08\xb9\x26\x0d\xd1\xf1\xd3\x2b\x36\x7d\x37\x38\xe9\xcb\xc3\xe5\x8c\xd4\x32\x34\xd7\xa9\x60\x53\x69\x6b\xe9\x68\x84\xc5\xda\x5d\x02\xa2\xd1\x8a\x25\x04\x36\x07\x5a\x87\xd3\x30\x68\x42\x91\x46\xa2\x98\x4e\xac\xaf\xf9\x0b\x65\xbe\xcf\x9e\x3d\x7b\x86\x45\x97\xff\xf5\x5f\xff\xc5\x74\x09\x1d\x1f\x12\x99\xaf\xdf\x08\x77\xfd\xe9\xf9\xf3\x09\xfb\xc7\xf1\xeb\x57\x90\xfb\x5f\x58\x83\x38\xe0\x38\xb2\xbb\xa1\xf1\x63\x33\x62\xff\xe7\xea\xcd\x85\x57\x1b\x4d\xeb\x5b\x30\xb5\xc3\xeb\x35\xd1\x17\x9f\xfd\xf9\x8f\x7f\x9c\xb0\x53\x59\x42\xed\x93\x14\xa1\x35\x57\xf0\x96\xf0\x52\x60\x91\x28\x40\x04\x7a\xbd\x4a\x06\x10\x7d\xc2\x4f\xc0\xde\x83\x58\xcf\xe8\x38\x30\x93\x89\xc5\x32\x2b\x14\x64\xa1\xab\x30\x00\x37\x12\x14\x2a\x25\xeb\xc2\xe4\x46\x2c\x93\x37\x82\xcd\x0c\xb4\xe4\xac\x8b\xe9\xa9\xdd\x0d\x95\x94\xe0\x60\xf5\x5a\x19\x61\x1f\x79\xee\x67\x2f\x5f\x70\x1b\xc0\xb8\xd1\x70\x0d\x4a\x3d\x6f\xc4\x6a\x8c\x1c\x56\x70\x19\x0a\x46\x20\x39\xae\xd1\x63\x21\x78\x6d\xd2\x48\xae\x78\x8c\xc5\xa2\xd4\xff\xc6\xc5\x87\x1a\xd2\x48\x12\x43\x25\x2a\xb6\xa8\x05\xb0\x04\x15\x35\xec\xf0\x75\xb0\xd4\xd4\xcb\x7f\x4c\x48\xa1\xeb\x70\xcb\x99\x34\xee\x11\x37\x62\x65\xde\xf7\xe4\xba\x57\x8c\xe3\x4f\x83\x9c\x52\xa9\xb5\x5f\x13\xf2\x3e\x49\x46\x6a\xb2\x40\x88\x37\xf5\x18\x58\xfe\x4f\x85\xd0\x74\xaf\xa7\x52\x20\x44\x23\x5d\xd9\x08\x5b\x11\x69\x20\xef\xdc\x3d\x1b\x1a\x00\xc0\x1b\xe6\xbc\xbc\x11\xbe\x33\x2f\xcf\x26\xec\xd2\x4d\x32\x40\x8e\x84\xc6\xc8\x60\xb7\xf2\x15\x3c\x96\x94\x34\x78\xc8\xfe\x64\xb2\x8f\x1b\x4f\x97\xcc\x58\x5e\xd2\x2e\x72\x9f\x3f\x0d\x14\xab\xd7\xbc\x30\x88\xaa\xe2\xb4\x52\x40\x1c\xd2\x80\xd4\x6a\x17\x75\x5f\x40\xa4\xf5\x0e\x79\x8a\x8d\x81\x30\x9d\x07\x78\x88\xa8\x53\xd7\x24\x1b\xac\xf6\xdb\xfb\x41\x60\x21\xe5\x3d\x94\x0a\xbc\x7a\xa9\x16\x04\xb3\x9b\x89\x47\xa5\x4b\x6c\x6e\xab\x41\x92\x32\xd2\xd6\x5a\xcd\x3c\x1f\xab\xca\x80\xd7\x10\x8a\x03\x5e\xfd\xd5\x07\xbc\xfa\x04\x74\xf1\x5a\xdb\xa1\xe1\xa4\xc2\xc3\x68\x56\x93\x1e\x40\xcf\x8b\x70\xc4\x5b\x8d\x1d\x42\x7c\xa7\x1b\xc5\xf8\xd4\xe8\xac\xb2\xf8\xd3\xfa\xcb\xf8\x98\x83\x41\x3d\xf8\x12\x9c\x6d\xe1\xb6\xe8\xd0\x83\xe3\x1e\xcf\x89\x3e\xe7\x1f\x5e\xbd\xc5\xc4\x60\x6d\x90\x9f\xb6\x57\xa1\x37\x9d\xbd\xee\x34\x4c\xae\x13\x15\x43\xdd\x2e\x04\x65\x21\x44\x7a\x9d\x13\x9e\x4e\x24\x80\xd2\xe8\x55\x34\x6c\x3b\x9e\x6e\xc5\x4b\x98\x18\xd9\xdf\x2d\x70\x75\xce\x0e\x42\xbb\xd1\x90\xce\x76\xae\xac\x28\x67\x3c\x11\x87\xb1\xbb\x40\x14\x0b\x91\x8b\x92\x67\x21\x43\xd9\xd7\x29\x2f\xb8\x4a\x33\x2a\xde\x17\x25\x6c\x5c\xf1\xce\x8a\x52\xf1\x0c\x1e\x91\x96\x72\x29\x4a\xc3\x0e\xbe\x14\xce\x96\xc0\x36\xa5\x87\x8f\x30\x8d\x14\x5f\x64\x1b\xce\x0c\x78\xf0\x30\x09\xa0\x30\xd4\xa6\x4e\x89\xf5\x52\x79\xcc\x22\xb7\xac\x26\x76\x03\x4d\xdc\x86\x80\x13\x13\x84\x2e\x74\x04\xc2\x68\xa4\x6f\x80\x07\xc0\xc5\x89\xc5\x81\xb9\xa1\x86\x78\x80\x08\x43\xf2\x9c\xa0\x42\xb6\x56\x0a\xf0\x49\x8a\x2e\xde\x57\x32\x31\x23\x03\x52\x2f\x65\xea\xd5\x20\xc8\x66\xa8\x51\xb7\x0a\x6e\xa2\x4a\x7e\x6e\x8c\xa6\x7e\x9f\xd1\x1a\xa1\x39\x0a\xca\x52\x13\x53\xda\x47\x8a\xe3\x78\x97\x06\x64\xd6\x4e\x0d\x2d\xd8\x20\x07\xa2\x4e\xc5\x65\x35\xcd\xa4\x59\x5c\x0d\x1a\xda\xb8\xd8\x30\x30\x26\x06\xae\x25\x97\xdc\x19\xee\x30\x42\x19\x49\xfd\xc7\x50\xcd\x92\x4e\xcb\xd6\xb0\x0c\xfe\xd7\xf1\xee\xd0\x50\x28\x0e\x5d\xcd\xfc\x57\xd1\x3c\x08\xb9\x03\xdb\xe9\xa4\xe2\x1b\x55\x34\x3e\x4f\x78\x96\x99\x76\x23\x69\x7f\x90\xa1\x66\xea\xd1\x3c\x90\x2b\xa4\x63\x18\x3f\x7b\xc8\x9a\x41\x29\x16\x90\x4d\x37\xbe\x98\x61\xb9\xc6\x8a\x7f\xc5\xb4\xf2\x37\x41\x57\x20\xff\x83\x40\x21\xc4\x1b\x43\xa6\xdb\x22\xa6\xe4\x2e\xa6\xf3\xf8\x62\x3a\x83\x46\x85\xaf\x42\x8b\x06\x0e\x03\x8f\xa1\xb0\xc9\x37\x9a\xe5\xa1\xf0\xbf\x36\x1c\x27\xbf\x14\x3e\xde\x5a\x04\x17\xe7\x77\x6c\x09\x16\x74\x18\xbf\xed\xb7\xad\x41\x41\x15\x73\x96\x37\x08\xa6\x31\xd9\xd6\x49\xb4\x93\xc8\x24\x0e\xdb\x7b\x5d\x9c\xd5\x67\x3a\x1c\xe7\xf8\xe1\xbe\x61\xa9\x4e\x2a\x67\x73\xd5\x64\xaf\x13\x26\xfa\xa1\xbd\x3f\x2d\xf8\xd9\x54\xdf\xaa\x5b\x5e\xa6\xc7\x97\x9d\xaa\x56\x9b\xca\x59\x3d\x56\xac\x7a\xfb\x47\x30\xf7\x39\x9f\xfa\x86\xff\x01\xfc\x69\x17\xb8\x6b\x0f\xf1\x4b\xde\x35\x6a\x03\xfe\x61\x71\x3a\xb6\x0b\xfd\xed\x42\x7f\x4f\x26\xf4\xe7\x46\x6a\x76\x4a\x69\x88\x17\x72\xc8\x3a\x8a\x3f\x89\x18\x52\x24\x52\xf1\xf4\x6c\xd7\xc3\xb6\x74\x7e\xdc\xbc\x35\xd7\x45\x76\x82\x97\xb9\xa0\x8e\x3d\x85\x78\xd3\x03\x88\x17\x01\x2d\x7b\x18\x83\x78\xdd\x55\x2a\x86\x48\xad\x18\x78\x8e\x22\xd8\x85\x4e\x5f\x20\x70\x2a\x74\x4e\xc7\x9e\x1d\x23\xc2\x6d\x1e\x91\xef\x42\x45\xbd\xc2\xb1\x35\xb3\x57\x7f\x06\x89\x09\xf4\x64\x00\x36\x10\x13\x30\x60\x04\xa0\xce\x65\x1f\x6e\x60\x83\x71\x84\xbb\x6a\x43\xa7\xef\x48\x6d\x05\x1a\x47\xf5\x8c\x60\x92\x85\xc8\xb1\x7f\xf8\x4b\x4f\x02\x27\x1b\x9d\xf1\x60\x05\x22\xa4\x89\x32\x37\x4c\xcf\x46\x0d\x08\x85\xbd\xe5\xf3\xbd\x7e\x31\x06\x36\x5c\x38\x92\xf9\x7d\x74\xd9\x3b\xb6\xc3\xda\x04\xbb\x6c\x84\x74\xdc\x1e\x02\x9d\x27\xc3\xd6\xc5\xad\x2c\x0b\x38\x3f\x90\xc2\x0f\x86\x38\x0f\x25\x56\x3b\x0a\x51\x83\x47\xa0\xfc\xed\x62\xb5\x4f\x31\x56\x1b\x1d\x8c\x5e\xd0\x11\x61\xe3\xf8\x6d\x1c\x12\xf0\x41\xdc\xa9\xf0\x46\x0d\xd9\x30\x3e\x82\xeb\xc3\xb7\xba\x6c\xa6\x26\xed\x4f\x26\xfb\xfb\x3e\xa8\x4b\x7c\x5f\xd9\xd9\xf8\x73\x26\x54\xa2\x53\x64\x16\x37\x7e\x69\x2c\xa8\x7b\xb5\x97\x2d\x9e\x4b\xee\x9f\x15\xa7\x37\xc1\xd8\x43\x2c\x75\x6f\xd9\xe2\xd1\xf8\x5e\x7e\x04\x25\xa6\x56\x5d\x02\xe6\x1f\x91\x28\x60\x3a\x93\x0e\xe3\xbf\x37\x2c\x93\xb9\xa4\xfe\x61\x6e\xa3\x0b\x63\x0d\x3b\xc0\x0f\x27\x49\x51\x8d\xe8\x86\x49\x2e\x72\x5d\xae\x46\xe1\x26\xf7\x65\xe3\x57\x74\xc7\x21\xf6\xa1\xa8\xca\x52\x28\x9b\xad\x9e\xb2\x06\xe4\x89\xf8\x40\x14\xa0\xb0\xc6\x7d\x90\x3c\xea\xab\x55\x33\x17\x22\xbe\xe0\x2d\x8f\x30\xf6\x03\x58\xab\x19\x85\x90\x04\x7c\x2a\xd4\x92\x2d\x79\x79\x4f\xf4\xf4\x4d\xd7\x80\x3a\x4f\x2a\x97\xd2\xf4\x6d\xee\xc7\xee\x76\x42\x43\xeb\xae\xca\x16\x95\x25\x89\xee\x77\xa0\x47\xda\x0e\x3b\xaf\xa5\x1c\x3e\xdf\xeb\x3d\xa5\x82\x5b\x2b\x4a\xf5\x82\xfd\xcf\xc1\x0f\xbf\xff\x79\x7c\xf8\xc5\xc1\xc1\xf7\xcf\xc6\x7f\xf9\xf1\xf7\x07\x3f\x4c\xe0\x1f\xbf\x3b\xfc\xe2\xf0\x67\xff\xc7\xef\x0f\x0f\x0f\x0e\xbe\xff\xfa\xf5\x57\xd7\x97\x67\x3f\xca\xc3\x9f\xbf\x57\x55\x7e\x83\x7f\xfd\x7c\xf0\xbd\x38\xfb\xf1\x03\x07\x39\x3c\xfc\xe2\xb7\xbd\xa7\xce\xd5\xea\x4d\x4f\x51\x88\xd7\x78\xc0\x23\xb9\x39\xe2\x20\xec\xd7\x6a\xad\x20\x95\x1d\xeb\x72\x8c\x43\xbf\x60\xb6\xac\xfa\x09\x93\xfa\x78\x19\x7a\xff\xd7\x6a\x40\x0d\x39\xef\x95\xfa\x2d\x6f\x70\x88\x78\x9e\xca\x01\x0a\x83\xcf\x68\xa4\x66\xc5\x8b\x15\x79\xa1\x4b\x5e\xae\x58\x4a\xde\xcc\xd5\x06\xc0\x9f\x08\xf1\xa7\x37\x9a\x2e\xbc\x51\x2a\xcb\x2d\xd4\x06\xf7\x06\xf0\x11\xa9\xac\xf2\x61\x9c\xf0\xdf\x01\xf2\x3c\xa1\xd6\xfb\x04\x22\x7c\x80\x0f\x5f\x4c\x79\x72\x83\xf6\x52\x58\x1b\xd4\x12\x63\x10\xe9\x3d\xca\x7b\xc8\x05\x57\xc1\x8d\x0f\x99\x2c\x3a\x15\x6e\xe1\xfc\xcd\x38\x76\xc3\xe5\x8e\xe1\x74\xca\x12\xac\xdb\x30\xe9\x92\xbd\x06\x75\x67\xab\x6b\xcd\x06\x81\xed\x90\xff\x11\xaf\x9c\x8e\x37\x10\x5c\xbc\x06\x63\x92\x30\xb2\x66\xd0\x48\xaa\x4e\xff\x6a\xa8\x0d\xb0\x6e\x61\xcf\xf9\xe0\xac\x5b\x3d\x37\x27\x54\x3c\xc1\xeb\x9c\x19\xcc\x45\x91\x09\x34\x3a\x02\xc3\x13\xa8\x1f\x56\xec\x3a\x6a\x88\x58\x19\xf7\x24\xad\x9a\xf7\xd4\x0f\xc2\x3e\x50\x53\x64\x01\x6a\x6f\xd8\x32\x97\xdd\x37\x57\x9e\x2e\x91\xb3\x02\xca\x89\xbd\x6d\x69\x2a\xb0\x40\xe8\x29\xa4\x47\xeb\x19\x64\x4b\x44\x0d\x69\x7c\xcf\x95\x35\xbe\x54\x32\x6b\x32\xa6\x6f\xb4\x10\x5e\xbc\x52\x94\x2d\xb8\xc6\x65\x9b\x99\xac\x32\xa2\x1c\xcf\x2b\x99\x0e\xc7\x5e\x8f\x4e\xa7\xe8\xa9\x49\x0c\xa5\x3f\x0c\xa2\x35\x0c\xae\x2b\x84\x7c\xcc\xde\x67\xe5\xde\x59\x48\xed\x6c\x1c\x96\x71\x63\x88\x66\x9a\x27\x0f\x0d\xbf\xbc\x30\xf0\xb9\x04\xd7\xc1\x4f\x44\x87\x68\xb2\x4a\x08\x54\x49\x36\x7a\xd3\xe0\xb0\xb8\x27\xa0\x22\x6a\xec\xfe\xcf\xfb\x93\x7c\x08\x75\x2a\x66\x98\xc5\x84\xbf\x01\x37\x00\xd5\x71\xa5\x22\x13\x16\xca\xb2\x84\xaa\x3b\xde\x19\x56\x8a\x5c\x2f\xdd\x36\xfb\x41\xb1\x6f\x0c\x05\xc3\xe5\xec\x05\xe3\x87\x8d\xc2\x60\x6a\xb3\xab\x84\x48\xb1\xb8\x2b\x6a\x9c\x57\x56\xca\x8c\xd8\xf4\xd0\x27\xab\x1a\xec\xed\x58\x82\xc7\x8c\xda\x57\x81\x93\xaa\x14\x8e\x00\x00\x0f\x55\xea\x9c\x19\xc5\x0b\xb3\xd0\x16\xfc\x21\xbc\xe0\x89\xb4\x2b\x47\x6e\x5b\xf2\xe4\x06\x5a\x44\x97\x82\x9e\x38\x62\xc9\x21\x65\xad\xc7\x14\x6c\x96\x9c\xd9\x45\xa9\xab\xf9\x02\x6a\xa0\xf0\xae\x24\xe3\xc6\x13\x60\xe3\xef\xc9\x46\x37\x2c\x5d\x29\x9e\xcb\x24\xb4\xce\x28\xf5\x52\x1a\xa9\x29\x92\x85\xe3\xba\x3d\xc6\x2e\x43\x8f\x01\x0c\x90\x9d\x64\x5c\xe6\xec\xc0\x08\xc1\x02\x63\xe0\x37\x57\xa8\x2c\xa2\xb3\xb0\x14\xee\xe7\x71\xf4\x8c\x50\x14\x09\x2a\xc0\x7d\x52\xcb\xe0\x90\x90\x80\x4a\x00\x6c\xee\x74\xf3\xa3\x0f\xc3\xd2\x6d\x9e\x99\x2e\x21\xa1\xcd\x77\xbf\x11\x2a\xd5\x51\xea\xcb\xf1\xe5\xb9\x89\x0d\x59\xea\x19\x88\x23\xc1\x17\x99\x56\xf3\x18\x64\xae\xe6\x52\x27\xf0\x15\xf4\x7f\x5c\xca\xb4\xe2\x19\x8a\x7a\x9a\xcc\xc9\xd5\x39\xfe\x5c\xce\x17\x76\x7c\x2b\xc0\xcd\x89\x27\x62\x9d\x1a\xed\x1f\x2a\xd7\x52\x6a\xa5\x81\xa3\xc1\x92\x3b\x0d\x5d\xc6\xd0\x61\x91\xaf\x00\xa1\x96\x92\x37\x1b\x59\x37\x1e\xa9\x1d\x87\x08\x74\x8f\x88\x0e\xd3\x3b\x0e\xdd\x00\x9d\x36\x04\x7e\x60\x47\x65\xe0\xda\xf5\xb9\x41\x6b\xc3\xba\xaf\x44\xf8\xd8\x46\xdd\x45\x41\xf3\xfd\x41\xa1\x47\x17\x82\xc5\xd3\x28\x77\xbb\xee\xda\x48\x48\xd3\x50\xd4\x49\xdb\xf0\x2b\xa1\x44\x29\x93\x16\xeb\x84\x9f\xce\xb9\x85\xcd\x27\x94\xfb\x59\x3a\xe9\x62\x2a\x6f\x59\x2f\x5e\xd6\xcc\x78\x2d\xf2\x22\xe3\x76\x98\x4c\x95\xbd\xef\x22\x6f\x7a\x14\x8b\x76\xbb\x9f\xab\x74\xcc\x33\xc7\xf7\x97\xdf\x9e\x50\x3d\x1c\xee\xe7\x46\x36\xdc\x75\xdd\xf9\x13\xd5\x11\xd4\xcb\x36\x6e\x63\x00\x51\x9b\x8a\x14\xc4\x1f\x3d\x19\x5c\x1e\xb7\x0a\x5b\xc1\xba\x3f\x2e\xbf\x3d\x19\x31\x39\x11\x13\xff\x57\xb8\xd5\xcb\x5f\xab\xe7\x58\x2f\x11\xea\x70\x60\xd7\xc0\x54\x62\x5f\x72\xfc\xdb\x7f\xfd\xd5\x4d\xd2\x7d\xfb\xb7\xf1\x5f\xa3\xce\x41\x7f\xfb\x97\xe3\xa3\xd2\xdd\xd0\xfc\x34\x4e\x57\x07\x49\xeb\xfe\xfa\xd7\xa5\x4e\xaf\x0a\x91\x4c\xf0\xb5\xcc\xbf\xa8\x8f\xba\x50\xd6\x29\xf3\x97\x1a\x12\xd5\x64\x8a\x7b\x09\x9e\x5d\x8a\x7f\xfb\x78\x03\x35\x20\x25\x89\x95\x70\x2b\x14\x1c\x39\xbe\x2e\x59\x69\x8b\x3f\xc7\xd6\xa5\x30\xff\x83\x59\xdc\x4d\xd4\x6a\x0d\xc2\x04\x05\xd6\xb1\x62\xe2\x9d\x34\x80\x42\x83\xef\x0a\xe4\xe0\x94\x0b\xef\x4f\x51\x37\xac\xa3\x70\x40\x1d\x82\x76\xa6\x6e\x6e\xbf\x53\xda\xfe\x2e\x2c\xbf\xcf\x73\x84\xa3\x52\x33\xbe\xd4\x80\x74\x01\x87\x88\x62\x95\x02\x47\x79\xdd\x0d\x70\xba\x62\xb9\x34\x96\xdf\x88\x09\xbb\x72\xa7\x64\x9c\xb0\x80\xd4\x53\x0c\xfa\xb9\x88\x94\x55\xca\xca\x0c\xbe\xad\xc7\x71\x53\x8e\x4f\xcf\xf3\x19\x33\x55\x02\x2d\x6f\x4b\x31\xf6\xe7\x31\xdd\xb5\x26\xc9\xea\x77\x19\x85\xc5\x5e\x70\x34\xd0\x8a\x14\x7e\x8a\x0d\x74\x15\xb1\xd7\x5a\x76\xb6\x9b\xa7\x56\x49\x7d\x06\x03\x31\xa1\x8b\xb2\x3b\x76\x33\x9f\x4f\x84\xb6\x22\xc5\x1f\x94\x48\x84\x31\xbc\x5c\x61\x83\x51\x19\xfa\x20\x52\xe2\x2c\x08\xa5\x9c\xab\x0a\x06\x28\x05\x76\xab\xad\x12\xa0\x0e\x67\xd3\x52\xdf\x08\x15\x2a\x12\x82\xc0\x0b\x69\xd9\x75\x12\x2a\xa4\x03\x68\x96\x2c\xb8\x9a\x8b\xba\xe8\x3c\xe7\x29\xd0\xfe\xeb\xa0\xdb\xf9\xf7\x71\x14\xe0\x33\xa7\x22\x49\x0b\xa4\x98\xba\x83\x30\x44\x51\x7e\x50\xcc\xbb\x61\x46\x75\x98\xc3\xbd\x92\xcc\x3a\xc9\x44\x36\x8c\x5f\xbd\xbf\x47\x7d\x0c\xfa\xcb\x16\x53\xc0\x73\x61\x79\xca\x2d\x1f\x2c\x0d\xfc\x35\x0f\x8d\x34\x29\x47\x04\xd8\x21\xca\x1d\xa1\x93\xdc\x2b\xaf\xba\x90\x31\x0c\x01\x48\x83\x85\x5f\x7d\xec\x41\xef\xf8\x9a\x62\x98\x98\xdd\x0d\xaa\x21\xb5\x57\x87\xe1\xfd\x68\x28\xb2\x44\xca\xd2\x0a\x14\xcd\x5a\xa4\xf5\x89\xb1\x0f\x12\x82\x71\x0b\x3d\x18\x95\xaf\xeb\x54\x82\xa4\x99\xea\xbd\x51\x0d\xc4\xb3\x4e\x28\x2b\xb1\x55\xba\xc7\x8d\x20\xe2\x57\x0a\xb7\x6a\x6b\x19\x60\x9d\xe6\xc2\x9a\x3a\x49\x13\x4f\x13\x27\x22\xe9\x2c\x27\xb7\x05\x1c\x35\xb4\x34\x64\xf9\x6f\xd6\x47\x71\xe1\x8c\xa6\xd3\xc2\x9d\x5f\x5b\x5f\x99\xe1\x62\x51\xd8\x51\xf6\xb5\x4e\xfb\x07\xb5\x5a\xad\x51\xeb\x81\xeb\x9a\x15\xac\x5f\x32\xe0\x56\xc2\x27\x43\x88\xdf\x34\x50\x35\xf0\x08\x58\xf0\x65\x77\xef\x6c\xad\xff\x8e\x43\xdb\x33\x78\xdc\x18\x1e\x37\x7e\xde\xd7\x0f\xde\x3f\x09\xd2\x5f\x3d\x93\x21\x9b\x13\x1a\x20\xf0\xe1\x44\xeb\xd5\x20\x71\x89\x76\x6f\xca\x70\xf2\x52\x8a\x47\x48\xab\xa1\xc2\x5c\x21\x9d\xbc\x7c\xc1\x7e\xd7\xd0\xb5\x48\xa7\x0d\x96\x37\x56\x41\x1d\x78\x53\x7c\x42\x4b\xee\x21\xbe\x9a\xb7\x1f\xb6\x06\x03\x25\x6f\xb3\x55\xea\xab\xad\x82\xe2\xed\x94\x64\xe8\x69\x1f\x8a\x5d\x1d\x1b\x97\x3a\xcb\x7c\x23\x74\x34\xc5\x5b\x49\x52\xd0\xb7\x07\xc3\x2e\xa3\xe0\xf2\x08\x9a\xbe\x12\xb7\x41\xa5\xe3\x06\x91\x4a\x7d\xd0\x1f\xdc\x32\x3e\x73\x6d\xd3\x78\xa1\x22\xec\x58\xad\x70\xea\xa7\x61\xb1\xee\x32\xc0\x46\x3e\x45\xc9\x11\x1e\xe6\xc2\xb3\x5b\xbe\x32\xb0\xbf\x6a\x8b\x30\x3c\x9f\x70\xdb\xeb\x81\xdf\x8a\x59\x8f\xe6\xec\xf1\x35\x58\x5a\xc0\x70\x89\x01\x80\xca\x22\x55\xf7\x6c\xdf\x7a\x98\x0e\xfd\xac\xdb\xd7\x70\xf9\x05\x90\x62\x09\xf9\x55\x43\x04\x6a\x9b\x4d\x87\x2e\xcf\x61\x60\x6f\xb3\xcd\xe1\x0f\x7f\x96\x87\x88\xe3\x54\xb8\xfd\x56\x63\x49\x01\xef\xc6\xbf\xdd\x90\x80\x56\x33\xfd\xd7\xd0\x98\x88\x42\x3b\xbe\xb0\xd8\x1d\x05\xc7\x97\xe7\xf8\xc4\x09\xb4\x9e\xe5\x6a\x45\x5a\x96\x5d\xc8\x32\x1d\x17\xbc\xb4\x2b\x74\x8e\x8c\x1a\x4f\x0b\x45\x95\x03\x90\x63\xd0\x18\x73\x9f\xce\x65\xf1\xd5\x58\x23\x20\x1f\xad\x8f\x0f\xca\xdd\xb9\x32\x0f\x8d\x22\x7d\x4b\x3c\xfd\xd5\xac\x23\x8e\xd0\xc8\xbc\xd7\xe2\x51\x50\x24\x8d\x05\xf1\xb0\x27\x72\x2b\x13\x06\x0f\x56\xd0\x97\xc9\xb7\xa4\xe3\x92\xb3\xa0\x9f\x81\xa1\xef\xa6\x35\x62\x72\xe6\x8e\x34\xad\xc6\x54\xdf\x1e\x5c\xef\xa4\xe3\xf9\x94\x51\x34\xda\xdd\x66\x45\x87\x6a\xfc\xac\x78\x80\xb0\xbb\xd9\x81\xd2\x0a\x77\x3c\xde\x7b\x88\x19\xb3\x77\x78\x8c\xe1\x96\x09\xfb\x6e\x21\x54\x7c\xdc\xc5\xbe\xf6\x51\x38\x76\xa5\x4a\xdd\x72\xc3\x59\x08\xb6\xbf\xa9\x92\x44\x88\xe0\x2d\x8a\x7b\xaf\xd7\x12\x89\xa6\x9c\x73\x9b\x2c\x84\x61\x46\x03\xf8\xa8\xb1\x3c\xcb\x6a\x2f\x0d\x91\x4b\x83\xe6\xe0\x1d\xf4\x91\x42\xd1\x28\x0b\x27\x87\x55\x91\x71\xf2\x8a\xcc\x2a\x95\x60\x4e\x96\xb4\x2b\x3f\x83\xf8\x84\x87\x9f\x81\x69\x6a\xd0\x79\x23\x67\xe8\x0d\x8e\x4c\xcc\x40\x4c\x10\xa9\x2b\x14\xa2\xcd\xb3\x9e\x60\xf7\x9c\xfc\x9c\xf2\xe4\xe6\x96\x97\xa9\x81\x8a\x77\x6e\x25\x36\x15\x1c\x35\x86\x3d\x88\xe6\xe0\x9e\xde\xd0\x0d\x0e\x83\x21\x0b\x0d\xa5\x75\xeb\x31\x8c\x57\x56\xe7\xdc\xca\x04\x5c\x34\x72\x16\xf9\xf6\xf3\xd0\xe7\x21\xc4\x69\x51\x96\xc3\xe9\x40\xaf\x01\xd6\x5a\x89\x15\x1a\xf6\x56\x33\x99\x3b\x9d\x8b\x43\xc3\xe4\x59\xa8\x6f\xf7\x81\x88\xf7\xcd\xd4\x29\x96\xdf\x41\x18\x28\xba\x0b\x9d\x3f\xce\x2c\x37\x30\x7c\x88\x33\x04\x07\x3b\x15\x72\x8f\x5a\x2a\x11\xf3\xbf\x72\x5c\xed\x66\x1b\x31\xeb\xc8\x2d\xd0\xad\x70\xba\x96\x79\x2f\xcb\x9a\xc9\xa6\x39\xc9\xb9\xc2\xaa\x5f\x69\xbc\xc3\x80\xd2\xb8\x0f\xd2\x52\x17\x05\xb9\xfe\xf2\xc3\xf5\x39\x41\x74\xaf\x5c\x0a\x03\x91\x6d\x9f\x1a\xee\x48\x31\x17\x4a\x94\xdc\x42\x7c\x80\xd0\x0a\x61\xf7\xb6\x1f\x02\x59\xc3\x2c\x02\x33\x3f\x38\xce\x8a\x05\x3f\x64\xdf\x50\xd3\xfc\xc0\xbf\x21\xd7\xfc\x83\x34\x52\x74\x26\xfa\xa8\xc0\x4e\x95\x7c\xdf\x30\x3b\x55\x72\xa7\x4a\x76\xb8\x76\xaa\x64\xfb\xda\xa9\x92\xf1\x15\xd2\x99\x87\x55\x23\xdf\x86\xfa\x84\x28\xbb\x24\xce\xd7\xaa\x0b\x18\x3e\xbe\x97\x2f\x3c\xeb\x01\x9d\x30\x43\xca\x62\x4c\x5d\x1b\x9c\xa7\xf7\x5f\x61\x4a\x1c\x7e\x38\xa5\xa5\xf2\x59\x7a\x75\x86\xa0\xd3\x12\x2b\x2b\xa2\x25\x25\xe5\xe1\xde\x6b\xd8\x40\x7d\x39\xc2\xce\xd6\xe3\x30\xec\xb8\x4e\xca\xeb\xdc\x08\x30\xbe\x06\x5c\x4d\x36\x38\x3c\x49\x7c\x3d\xba\x1c\xbe\xe6\x35\x58\x6d\x00\xfb\x28\xf5\x01\x6c\xf8\x1a\x01\xf6\xf1\xeb\x04\x58\xa8\xdb\x1a\x7e\xdf\xbf\xf5\x75\x64\xad\x9d\x4f\xa2\xfb\x7d\x3b\xbf\x81\x53\x16\xc6\x91\x86\xe9\x5c\x5a\x2b\x7c\x5e\x45\xd8\xc9\xe0\x0d\x8f\xeb\x68\x48\xe6\x80\xd9\x8d\xc9\x13\xe2\x5d\xe8\xb4\x14\xe9\x73\xa0\x95\xdd\x4a\x03\x46\x04\x57\xce\x04\x44\xb8\x58\x90\x1d\x63\xca\xbb\xf5\x66\xed\x4e\x0e\xf5\x1f\x77\x27\x87\xe2\x6b\x27\x87\x18\xb4\xac\xca\xa0\x68\x63\x50\xe5\xf1\x18\x13\x2e\xd8\x4f\x95\x28\x57\x4c\x2f\x45\x94\xd7\x09\x4d\xa9\x8c\x4c\x29\x33\x92\xfc\x76\x7d\xad\xae\x07\xaa\xd7\x81\x5f\xf1\xec\x9d\xd3\x9f\x01\x5b\x60\x70\x49\xdf\x7e\x40\x13\x22\x08\x57\xc1\x2f\xb1\x17\xed\x4e\xc6\x9a\x09\x61\x80\xd7\x9f\x80\x2f\xee\xf8\xe2\x74\x48\x13\x78\x88\x48\x3a\x1b\x2e\x9a\xce\xee\x62\xd4\x4d\x24\x42\x52\x86\x6f\xe0\x30\x0b\x19\x0f\xc1\x07\xc7\x6e\xc4\x6a\x44\x89\x45\xd4\x85\xd0\xdf\x8c\x39\x7a\xcd\x56\x29\xfd\x20\xf8\x9a\xd7\xc0\xa7\xce\x90\x3e\x33\xbc\xfa\xb6\xc6\x68\x8e\xe5\x89\x3b\xcc\x41\x38\xf0\xc1\x3a\x40\x0b\x8d\xf8\x6a\x30\x29\xb5\xb4\x81\xa4\x77\xe0\x56\x00\xe5\xf7\xa5\x4a\x81\x41\xa1\x3c\x0b\x24\xec\x30\xec\xc5\x86\x76\xdb\xe0\xe5\x97\xf1\x23\x11\x2b\x6c\xc1\x46\x4d\xcc\x8d\x58\xed\x1b\x42\xa9\xd0\xca\x2c\x64\xe1\x7b\x29\x82\x9c\xa4\x5d\xc9\xbe\x85\x54\x30\x3f\x04\x4a\xc4\x73\x35\x62\x17\xda\xba\xff\x9c\x41\x6e\x2b\x86\x20\xb4\x30\x17\xda\xc2\x27\x0f\x9a\xdc\xf8\x6a\x1f\x89\xd8\x14\xbf\x90\x10\x7d\xc0\x2c\x6e\xa8\x13\xf5\x19\x8f\x40\x54\x4a\x6e\x09\x0b\x23\x0d\x3b\x57\x4c\x97\x9e\xaa\xd6\xb7\x8c\x32\x34\x84\xf7\xea\x46\xc1\xa2\x0d\x63\xd0\x62\xe8\xb2\xb1\x16\xef\x19\x2e\xc4\x9d\xa4\xff\x06\xbc\xbe\x10\xa8\x0b\x69\x9a\xd0\xb6\x88\x5b\x31\x97\x09\xcb\x45\x39\x07\x44\x93\x64\x31\xf4\x12\x0f\x75\x2e\xe2\x35\xe0\xe9\x88\xd7\xa0\x7c\x08\x2a\xca\x2b\x48\xc0\xfd\x38\xea\x0f\x8e\x8d\xc7\x75\xce\x0b\xc7\x82\xff\xd7\x9d\xca\xc0\x05\xff\x0f\xda\xa2\x99\x09\x3b\x66\x46\xaa\x79\x26\x1a\xdf\x51\xe0\x20\x1e\xc6\x8d\xe0\x6c\xd6\x9f\x2a\xb9\xe4\x99\xc0\x84\x79\xae\x42\x2f\x13\x3d\x5b\x53\xba\x46\xd4\x1b\xcd\xc9\xe5\x10\xa2\xde\xbb\x11\xab\xbd\xd1\x1a\xdb\xee\x9d\xab\xbd\x1a\x1c\xa9\xc1\xa8\x41\xb9\x80\xe8\xe5\x1e\x7c\xb7\xf7\x69\xf4\xb4\x47\x60\xba\x0e\xc6\x93\xe4\x66\x3e\xc9\xb8\x31\x43\xe0\xb4\xdc\x8d\x3d\x7e\x15\x3d\xa9\xae\xbb\xa6\xa2\x8b\x04\xd3\xa1\x87\xf3\x91\x43\x8d\xe1\x50\x29\xb0\x03\xd0\x79\x49\x0d\x9d\xfb\x02\xb9\xb5\xcf\x9c\x30\x6c\x28\x43\xbd\x8d\x51\x0a\xea\x6c\x95\x3b\x28\xfe\x2d\xc4\xc3\xf5\x2c\xee\x03\x21\x0d\xb8\x9f\xa4\x2f\x4c\x55\xda\x32\xa9\x92\xac\x4a\xb1\x03\x06\xfc\x14\x9c\x57\xc3\x18\xaa\x83\x91\x77\x70\x06\xfe\x36\x0c\xeb\x75\x4e\x9f\x59\xb3\x56\xfb\xd3\x4e\x81\x80\xb4\x93\x90\x4d\x80\xd4\xde\x26\xb5\x66\x9d\xaa\x1c\x9a\xad\x42\x4e\x9a\x7a\xe4\x4b\x39\x2d\x05\x3b\x59\x70\xa5\x44\x16\xe1\xb0\x90\xa3\x93\x5b\xcb\x93\x05\xa6\x3f\x73\xe6\xf6\x71\x26\xec\xbe\xc1\x16\xf5\x39\x4f\x16\x52\x05\xf0\x02\x15\xf0\x88\xea\x52\xaa\x2d\x34\xd7\xe9\x6b\x08\x0d\xd8\x97\x65\xff\xee\xc6\x2c\x35\xa8\xf7\xac\x75\x4f\x8d\x6e\x4f\xbb\x1c\x68\x8d\x27\x2e\x74\x09\x81\x7b\xdf\xdf\xda\x25\x0f\xee\x69\xa9\x66\xa2\x2c\x71\x4d\xa6\x82\x7e\xc0\x64\xa3\xef\xea\x84\xfa\x3d\x2c\xf4\x2d\x4b\x35\xbb\x85\x0e\xa4\x4b\xa7\x1a\x40\xfe\x8d\xf1\x4a\x45\x34\x53\xc8\x88\x4b\x74\x5e\x94\x3a\x97\xc6\xd7\xf8\x11\x43\x6c\x0d\x76\x24\xab\x3a\xe3\xb4\xde\x05\xae\xf9\xf2\x84\x59\x5e\xce\x85\x75\x83\x33\x55\xe5\x53\xd1\x13\x56\x65\xdb\x10\xde\x83\x76\xca\x88\x28\xf5\x0b\x0d\x30\xd8\x5b\x7a\x2e\x02\x9e\x40\x32\xde\x4c\x97\x94\x52\x18\xbe\x24\x9c\x76\xc7\x72\xdf\xd2\xb9\x58\x29\x6b\x7a\xc2\xa6\xf7\x69\xa0\x81\xcb\xff\xdd\x77\x17\xc3\xe0\x9e\x6f\xe4\xad\x5b\x5d\x66\xe9\xad\x4c\x31\x51\xc3\xb0\x03\xf7\xb8\xc3\x7e\xef\xbc\x45\xe0\xf3\xde\x1b\xf9\xf6\x56\xa6\x1f\x83\xdc\x3e\x33\xd8\x91\x9b\x01\xbd\xa9\x57\xbf\x84\xbe\x70\xf0\xd8\x43\x76\x26\xb1\x8e\xdc\xfd\x85\x88\xa2\xf9\x54\xaa\x1a\x09\x21\x30\x04\x9c\x7c\x4e\x2e\x78\x8b\xdc\x08\x8b\x15\xc0\x50\x44\xab\xed\x82\x19\x99\x57\x99\xe5\x4a\xe8\xca\x64\xab\x9e\x6c\xfc\x58\x97\x74\x96\x89\x77\xb8\x9b\xfb\xeb\x2f\x61\xa8\xa6\x1e\x33\x47\xb4\x07\xbf\xc2\x6b\x8a\x4c\x9d\xdc\x9c\x1e\x05\xa5\x26\x94\xb1\x8b\x77\x22\xa1\x3a\xa7\x22\xab\xe6\xb2\x53\x49\xeb\xae\x29\x60\xa7\x5f\x7f\x58\x53\xc0\xba\xe5\x59\x65\x44\x8d\xf4\xd5\xaf\xe9\xf6\xe3\xe8\xe1\xf7\x51\x55\xc5\xeb\xcd\x8d\xfa\x52\x51\x08\x95\x02\x72\x78\xb4\xe3\x70\xba\x5b\xa3\x36\x21\x76\x0f\x7d\x2e\x9c\xbd\xb3\x25\x77\x42\x3e\x07\x38\x19\x82\x05\x97\x33\xc6\x55\x5f\x81\xfd\x54\x7a\x4b\xb1\x9d\xde\x78\xef\xcb\x0c\xda\x5f\x32\x22\x58\xa3\xbf\xe4\xc0\xdd\x25\xf1\xf4\xa3\x8d\x6e\x9a\x65\x51\x1b\xba\x40\xd2\x53\xe2\xfa\xa5\xbe\xdd\x20\xcd\x86\x26\x71\xad\x59\x6d\x71\x4f\xee\x5a\x43\x3e\xae\xd6\x90\x33\x40\x1a\xea\x0f\xe3\xfb\x12\xc7\x69\xf9\xce\xe8\x43\xd2\x39\x3f\xc4\x57\x46\x3b\x2a\x3a\x5e\xa1\xe7\x0b\x0d\x44\x75\xfb\xcc\xb8\xd5\xa8\x93\xf4\x2b\xa5\xba\x09\xed\x6d\x77\xd0\xe3\x96\x1b\x61\xfb\x78\x74\xd7\x0b\x1a\xbc\x3e\x88\x63\x63\xe3\x49\x28\x34\xf4\x70\x3b\x6c\xfc\x37\xd2\x1c\x55\xe3\x4e\xa7\x33\x7a\x42\x7b\xa4\x5f\x11\x52\xb7\x70\x8c\xd4\x2d\x6f\xc2\x6d\xcf\x5e\xea\x3d\x4e\x59\x9a\xed\x37\xdf\x9c\x9f\x0e\x42\x33\x37\x50\x8b\x66\x93\x80\xa6\x57\x29\xf9\x53\x15\xdb\xc0\x80\x3c\x18\xa8\x44\xf7\x6f\x83\x14\xf3\x44\xd4\xce\xf8\x53\x69\x6e\xfa\x03\x71\x7f\x75\x72\xd6\x1c\xb2\xb9\x99\xbf\x3a\x39\x63\xf4\xe9\x07\xf9\xc0\xef\xe3\x04\xef\x8b\xe7\x3c\x4f\x44\x1d\x1e\x4b\xa5\xb9\xd9\x02\x88\x77\x5f\xf3\xb4\x48\x2f\xba\x55\x0b\x3e\x64\x7f\xbe\xc7\xfe\x8c\x00\x6a\x57\xba\x62\xb7\x84\x4a\x47\x06\xdc\xb5\x2c\x5e\xb0\x33\x65\xaa\x52\xd4\x59\x4e\x6d\x5b\xce\xe9\x50\x1f\x6c\xce\x01\xf0\x9f\x79\x31\x98\xff\x7f\x68\xfe\x7c\x2a\x01\x85\x82\x97\x16\x6c\xb0\x81\x70\xcc\xa1\x4d\x29\x0d\xe9\x89\xf0\x0b\xcc\x73\x3e\xf3\x75\x0a\x23\x42\xa5\x0a\x60\xdf\xfe\x26\xc7\x2e\x11\x4c\x65\xcc\x20\x2f\x03\x00\x2d\x3b\x4a\xc5\xf2\xc8\xa4\xfc\xf9\x08\x1e\xe3\xc1\x8c\x6c\x63\x4e\xdc\xb0\xbd\xe7\x7b\x13\x76\x25\x73\x99\xf1\x32\x5b\x35\x3a\x6e\xd5\xf7\xb9\xc3\xd4\x0f\x08\x49\x20\xcf\xf6\xd8\x81\x2e\x61\xe4\x84\x2b\x96\x09\x5f\xc9\x4f\xdb\x77\x85\xe6\xc3\xe1\xc3\x90\x85\xec\xc1\x44\x63\x50\x2c\x0e\xc3\x5e\xdf\xe0\x71\xde\x00\x3b\x3d\xad\xcf\x33\xa9\xdc\x21\x37\x61\xdf\xd0\xe9\x44\xc7\x3e\xb2\x00\xec\x5a\x7f\xc7\xc3\x5a\xa2\x07\xe3\xb3\xe8\xe7\x89\x58\x77\x74\x3c\x34\x42\x77\xf5\x76\xcc\xa5\x7d\x2b\x0a\x3d\x80\x8a\x86\x03\xb5\x3c\xfb\xd2\xba\x0f\xb4\x91\xd0\x25\x85\x5b\xc6\x51\x10\x25\x55\xc6\x9d\x45\x86\x7e\xfd\x09\x3b\x3d\xbb\x7c\x7b\x76\x72\x7c\x7d\x76\xfa\x82\xf9\x91\x64\xac\xd3\x4f\xd8\x75\x8c\x57\x1c\x95\x7c\x11\x28\x6c\x78\xd6\x88\x04\x2b\x57\x75\x8b\x07\xc0\x6f\xe4\x8a\x9d\x2b\x69\xeb\xce\x55\x98\x44\x9f\x69\x45\x69\xf1\xee\xd7\x14\x57\x98\x4b\x4c\xde\x54\x34\x98\xfb\xba\x39\x1a\xec\x50\xec\xf3\x12\xa6\xd2\xc9\xbb\xb1\x65\xdd\xae\x5e\x9e\x6d\x58\x99\xbe\x49\xcb\x20\x9b\xfc\x1a\x03\xb2\x75\x57\x1e\x3c\x51\x43\xb3\x41\x8f\xbf\xaa\xcb\x46\x2f\xc0\xc9\x64\x7f\xc2\xdc\x59\xbd\x3f\xd9\xf7\xaa\x5c\xb6\xd6\xb0\x32\x0c\x1a\xc3\x5c\x37\xf9\x7b\xc2\xd8\x1b\x5f\x46\x08\xb8\x45\x9b\x7b\x5f\x22\x58\x5f\xd4\xe9\xb0\xb5\x4b\x7c\x4b\xd4\x6a\x1a\x3f\x94\x70\xb1\xe7\x72\x29\x14\xbe\xd8\xf6\x04\xb3\x9f\xea\x20\xab\xf6\xb6\x7e\xf3\x6f\xde\xbe\xda\xde\x4b\xa1\x64\x19\xe4\x95\x4e\x74\x9e\x23\x62\xf3\x22\x20\x8d\xd4\x60\x21\x41\xea\x6d\xc5\x38\x47\x9c\xea\x59\xa7\x0d\xdb\x92\xf8\x7e\xa8\x96\x31\x1e\x3e\xa6\xba\x5e\x55\xdb\x43\xf7\x6f\x93\x45\x40\xe9\xc6\x43\x6f\xd2\xf1\x79\x14\xde\xe3\xe8\xed\xd9\xf1\xe9\xeb\xb3\x49\x9e\x3e\x42\xe1\x2b\x54\x5a\x68\xa9\xac\xe9\x6a\x98\x77\x6b\xb7\xdd\x57\x6c\x87\x69\x0f\xa3\x9b\x9d\xf9\xe1\xe2\x44\x4f\xff\x8c\x08\xf9\x3e\x15\x96\xcb\xcc\x44\x1c\x66\x75\xa1\x33\x3d\xdf\xdc\x75\xeb\x1e\xac\xf3\x1b\xc4\x4e\x1d\xf3\xb1\xe3\xc9\xed\x59\xac\xdd\x5b\xf5\x36\x29\xea\x5b\xf3\x42\x2f\x8d\x40\xad\x60\x09\x42\x47\xdd\x27\x40\xb0\x4f\x68\x22\xac\x51\x11\x7d\x32\x20\xe2\x7c\x63\x82\x1a\xe9\x3f\x6a\xe0\xfd\xa1\xb6\xc3\x76\x88\xdf\xd5\x6c\x70\xd2\xbc\x6b\xa7\xf8\x26\xd5\xff\x4e\x23\x35\x0f\x91\xa2\x14\xe3\x00\xa8\x0c\x1d\xa4\x75\x19\xe9\x60\xf1\x99\xe2\x9d\xb8\xde\xe5\x8b\x77\x65\xab\xb6\x33\xb7\xd6\xd2\x83\x0f\x1d\xf1\xea\xb2\x6c\x55\xb7\xcb\x20\x97\x16\x9f\x23\x50\x72\x49\x91\xb2\xa2\x94\x4b\x99\x89\x39\x34\xdc\x91\x6a\xee\x5b\x8f\x47\x78\xfb\xd0\xfe\x52\xac\xcd\xcb\x2d\xb6\xb1\x71\x03\x38\xe0\xac\x8b\x37\xd7\xd0\xc4\x09\x52\x61\x7a\x1b\x93\xee\x81\xd0\xec\x7a\x3c\x1e\x83\xff\xee\xe0\xdf\xce\xaa\x49\xb3\x43\xf6\x9d\xa0\xe7\x68\x68\x34\x55\x42\x27\xf5\x85\x0e\x9d\x7e\x60\xae\x35\x65\x81\xa1\x31\x39\x8e\xee\x3a\x72\x77\x3a\xf5\x19\x8f\xf3\xc6\xfd\x52\x00\x98\x73\x1d\xf3\x7f\x8c\x16\xd0\x96\x0e\xd1\x81\xa5\xbd\x8f\x13\x6d\xda\x23\x21\xae\x5f\xd0\xb9\xc0\x99\x59\xe5\x99\x54\x37\x35\x7a\xf8\x4c\x3b\x3e\xc6\xba\x5e\xa9\x6e\xfc\xae\x29\x05\xcf\xee\x3e\x31\xba\xf0\xe8\xd6\x4e\x0b\x3b\x58\x28\xe1\x7a\x55\x60\x1e\x5b\x10\x5e\x94\x64\x15\x8b\xfa\xbd\xbd\x47\x4d\x31\x69\x12\x23\xfb\x8b\xf7\xf3\xab\x93\xab\xf3\x86\x6c\x57\x0c\x3f\xfb\x94\x01\xbb\xbb\x0e\x57\x78\xc9\x47\x6d\x41\xc8\x9f\xba\x65\x38\x8d\x59\x56\x75\xfd\x25\x26\x51\x5f\xea\xd2\xf2\x6c\x0b\x82\x33\x59\xf0\xe2\xb8\xb2\x8b\x53\x69\x12\xbd\x14\x03\xb9\x21\x6e\x17\xd8\x81\xcc\x37\x5c\x90\x9e\x49\xf1\x19\xec\xe4\xef\xc7\x97\x8c\x57\x8e\xeb\x2c\x35\x97\xd9\x5a\x7a\x9a\xa7\xc0\x15\x96\xfc\x7e\xc4\xf7\xa7\x27\x3c\xa8\xb7\xdf\x05\x85\x3f\x7a\x50\x18\xe4\xe2\x53\x09\x04\x4b\x25\xad\xe4\x56\x97\x83\x45\xeb\x4e\x2a\x63\x75\x4e\x5b\xe4\xdc\x0f\x0f\x39\x4e\xa0\x6a\x35\x9e\xd8\xec\xc6\x0a\x86\x22\x90\xf7\x5c\x39\xb3\x8e\x27\xa2\x55\x67\x32\x82\xfe\x2d\x38\xb6\x0c\xf7\xfc\x95\xaa\x8d\x00\x98\x3c\xfb\xdb\x8b\x46\x6f\xc3\xb5\x96\xb7\xde\xe9\x58\xb7\x51\xdd\x9a\xb7\x58\xfe\x34\x8c\x7c\x22\xe7\x3e\xd2\xe5\xbf\x2b\x9e\x21\x3d\x2f\xb6\xe9\x09\x6f\xae\xe3\x20\xaf\xe9\x79\xca\xaf\xfb\x45\xf0\x7e\x55\x06\x71\xd5\xf1\x0e\x5b\x72\x65\x1c\x33\x34\xfd\x0b\xfb\x94\x62\xb0\xcf\x0e\x6c\x52\x1c\x6e\x8d\x32\x43\x55\x73\xe2\xcb\xd2\xda\xbf\x0a\x55\x9c\xfd\xde\x6b\xeb\x79\x03\xb0\x87\x87\x71\x9e\x36\x08\x84\x2a\x19\x7b\x25\x8d\xf5\x6d\x5c\xe1\x03\x69\xa8\xef\x15\x68\xdf\x97\x4c\x97\x4c\x16\xff\xe4\x69\x5a\xbe\xc0\xb3\x9e\xac\x43\xf8\xb7\x09\x08\xe5\x5c\x85\x8c\x95\x03\xbb\x2a\xa8\xbd\xc2\xf5\xc9\x25\xc3\xee\xd0\x9f\xff\xf9\x19\x68\xe2\x7f\xf8\xec\xcf\xcf\x7a\xb2\xda\x63\xad\x8e\x63\x43\x7b\x21\x07\xcf\x53\x78\x22\x35\x14\xa0\x80\x62\xf5\x04\x9c\x6e\x24\x05\x91\xef\x1d\x13\x86\x33\x77\x48\x35\x75\x57\x6f\xf0\x2b\xaa\x37\x60\xa1\x60\x1c\xe5\xe8\xc7\x92\xcf\x28\x9a\x2f\x1f\x8b\x68\xee\x48\xcd\xae\x9c\xdb\xe4\x58\x94\x6e\xfb\xfb\x26\xce\xe5\x80\x7a\xca\xd3\x8b\xab\x7f\xbe\x3a\xfe\xf2\xec\x15\xbc\x27\x65\xc3\x3b\x56\x24\xb3\xa4\x4b\xee\xf6\x87\xb3\x76\x77\x4f\x51\x57\x72\x0e\x11\xb1\xbf\x78\x79\xd5\x72\xc5\xb9\x4f\xee\x19\xa6\xef\x6b\x5b\xaa\x59\x0f\xea\x3d\xb6\x20\x01\xb4\xb2\x16\xe5\x76\x8a\xbb\x07\x8e\x30\x44\x00\xea\x0d\xa7\x86\xe3\x21\x7c\xc7\xde\x7e\x87\x8e\xbc\xc1\x1e\x9c\x1a\xf7\xfe\x60\xb2\xa3\x18\x52\x71\xf0\x30\xf2\x27\xa5\x76\x3f\xf5\xb0\x1c\x0a\x79\x60\xff\x0a\xc6\xf2\x09\x0f\x4e\x84\x61\x1e\x75\xe9\x4e\x54\x77\x96\x0a\x13\x9a\xde\x3e\x01\x6e\x2d\x36\x75\x7b\xeb\x7f\x3a\x6c\x6c\x22\x47\xad\x8e\x31\x48\xd3\x08\xd1\x37\xaa\x97\xef\xea\x9a\xe8\x73\x19\x39\xb9\xaa\x4c\xc1\x93\x41\x7b\xf1\xd4\x1f\xe1\x27\x00\xf4\xf6\x18\x0f\x18\x98\xf8\x96\xca\xac\xc2\xb3\x87\xd9\x8e\x27\x7e\xb8\x36\x18\xc8\xbd\xb8\xc4\x77\x89\x2e\xb4\x07\x7b\x89\x51\x43\x1e\x24\x0b\xb1\x07\x77\x0e\x7d\xd7\xd1\x81\xb0\x4d\xe7\x41\xb1\xd0\x56\xab\x81\x4b\x48\x2f\x37\x0c\xda\x94\x67\x78\xc7\x49\xdd\x7e\xbd\xe6\x0b\xac\xb0\x09\xa1\x69\x67\x70\xf8\x13\x5b\x2b\x1f\xa4\x6e\x86\xa8\x1f\x9f\x00\x2a\xd2\xf3\xd3\x2d\xc8\x9e\xc7\x0f\xc3\x73\xdf\xe0\xdc\xd6\xd2\x4b\xd3\x81\xea\xd2\xcf\x4f\xc9\x16\xf0\xb5\xe7\x86\x36\x0f\xbb\x7b\xf7\x6c\x45\x4f\xd2\xa5\xbd\xd5\xe5\x50\xf0\x65\x97\x8d\xe1\x5a\xf9\x8a\xf4\xdd\x1a\x9e\xc4\xd3\x94\x15\xf8\x96\x8f\x5e\x5e\x5c\x41\x22\x57\xab\xa3\x64\x5b\x42\x84\x4a\xdd\x8f\x20\x44\x1e\x8f\xf0\x18\x54\x2b\xf9\xb8\xb0\x51\x5b\x33\x69\xfd\xae\x18\x84\x46\xdf\xd2\x60\xe4\xda\x74\xfc\x51\x8b\x5b\x1e\x84\x11\x3d\x74\x2b\xe2\xb5\xd4\x4e\xfc\x74\x93\x22\xcd\x03\xc5\x8a\xdc\x60\x2b\xbf\x2c\x73\xeb\xa9\x55\xdc\x04\x90\xc0\xa5\x46\x0c\xfb\xe8\xe5\xbc\xa0\x7e\xe3\xa9\xbe\x55\xb7\xbc\x4c\xd9\xf1\xe5\xf9\xa7\x17\xa2\xbd\x8b\x1f\x71\x17\xf4\xc1\xa4\x6f\x50\x11\x50\xe8\xa7\xd2\x1a\xcc\x66\x87\x7c\x74\x1b\xfb\x90\xdc\x01\x14\x32\x44\x9c\x08\x73\xe2\x8a\x66\x11\xe9\x48\x8a\xe9\xc4\x72\xea\xec\x1e\xba\xde\x3f\x7b\xf6\x0c\x43\x0a\xcf\xfe\xeb\xbf\xfe\x8b\x41\xd7\xc5\x54\x24\x32\x5f\xbf\x11\xee\xfa\xd3\xf3\xe7\x13\xf6\x8f\xe3\xd7\xaf\x18\x4f\xc0\x02\x43\x48\x55\x1c\x19\xd6\x2e\xfe\xb1\x19\xb1\xff\x73\xf5\xe6\xa2\x6e\xf7\xde\xfc\x16\x58\x23\xf7\xaf\x37\x61\xa7\x51\xfa\x79\xec\xf2\xe7\x76\x01\x29\xf9\x4a\x5b\xc6\x67\x33\x60\x4e\x14\xc9\xd2\x78\x71\xe1\x71\xd1\xe4\x7c\xe1\xbb\x75\x3b\xb6\xca\x20\x2f\x5e\xba\x29\x42\x88\xc5\x43\x09\x62\x9a\x3f\x8c\x15\x4e\x07\x98\xca\x88\x65\xf2\x46\xb0\x99\x81\x9e\xdd\x75\x13\x8d\x52\x18\x67\x3f\x25\x5c\xb9\xd1\x71\xb0\x30\x75\x37\x89\xc7\x9d\xbb\xd0\xb3\xbb\x73\x83\x61\x7d\x63\x38\x5f\x97\x84\xf2\xc4\x91\xfd\xb1\xe6\x12\x34\xf5\xc5\xf0\x3e\xc8\x45\x04\xc5\x17\xc4\x26\xe3\x99\x56\xf3\x98\xe9\x6a\x3d\xc2\x27\x20\xae\x0a\xd1\x95\x18\x03\x75\x53\x19\xa6\x37\x19\x4a\xee\xd7\xbc\x67\x7f\xff\x66\x68\x35\x82\x42\xe4\x53\x5d\x59\x9f\xf2\x86\x4f\x02\x08\x2c\xc0\x48\x44\x82\xf7\x7a\xf0\x60\x8d\x69\x86\x6b\xf5\x36\x50\x9f\xa5\xe6\x41\xdc\x50\x36\x47\x4c\xf0\x64\xc1\x6e\xc4\x6a\x8c\x22\xbe\xe0\x80\x7e\x00\x74\x3e\x75\xd4\xc5\xfe\x42\xcd\x8c\x82\x44\xa4\xce\x0e\xa4\x45\xf0\x99\x89\x35\xd7\x07\xf4\x04\x6f\x2a\x19\xd2\xa8\xa9\x6f\x91\x8a\x1c\x87\xbe\x51\x61\xa2\x95\xa5\x26\x88\xa1\x51\x11\x64\x5a\xb6\x2a\xec\x9d\x44\x11\xa9\xfb\x99\x79\xdf\x93\xeb\x74\x4c\x77\x64\x90\x32\x51\xa9\xb5\x5f\x03\x12\x38\xe4\xbd\x1a\x41\x78\x3e\xdc\x37\xc0\x8b\x52\x3a\x17\x32\x81\xaa\x1a\x77\x3b\xdd\xeb\xa9\x14\x08\xd1\x40\x00\x30\xc2\x56\x44\x1a\xc8\xa5\x75\xcf\x16\xc6\x30\x09\x6f\x98\xf3\xf2\x46\x78\x30\x5b\x9e\x4d\xd8\xa5\x9b\x64\xc0\x29\xc7\xbe\x71\x4b\x2c\x82\x70\x32\x25\x86\x36\x70\x0f\xd9\x9f\x4c\xf6\xf1\x2c\xdc\x00\x74\xd0\x9b\x5f\x86\x6c\x19\x36\x58\xab\xb0\xa6\x1e\xc4\x0b\x83\xad\xd3\x9c\x75\x00\xed\x09\x35\xe0\x8e\xd8\x85\xd7\x16\x78\x4f\xf0\xe9\xf8\x1a\xb8\x67\xd5\xb0\x6d\x2f\x87\x6b\x7a\xd9\x23\x04\xde\xbc\x86\x6e\x76\x39\x60\xab\xcb\x66\xc2\x31\xc9\x9f\xfa\x04\x19\xaa\xef\xde\xe0\x8d\x15\xf3\x01\xda\x5a\xf9\xeb\x2e\xe4\xe2\xfc\x43\xac\x0b\x50\xb4\x9d\x2c\x7f\x54\xe6\xc4\xf9\x0c\x64\xe8\x66\xb4\x96\xc8\x4a\x0b\x47\x8a\xa3\xc0\xf6\xed\x88\x21\x7a\xc5\xb3\x81\x0c\x8b\xf6\xd5\xdf\xd0\x68\x5f\x7d\x92\x59\xda\xd7\xda\x3e\x0f\x67\x6a\x11\x95\xd2\xc2\x12\x59\x0d\x3d\x18\x6d\x10\x06\x13\xf6\x9a\xce\x5c\x64\x6e\x3e\x35\x3a\xab\x6c\x80\x55\xd8\x70\x20\xc3\xa0\xbe\x63\x23\xc2\x0d\xf9\xdb\xa2\xe3\x19\x14\x13\x3c\xb3\x86\x39\xa9\xf1\x1a\x50\xd8\xf4\x4d\x46\xc5\xeb\x57\x96\x92\x8a\xd7\x80\xab\xe0\xf5\xc2\x81\x57\xe2\x8a\x30\x25\x7d\x1d\x60\x43\x7b\x85\xb4\x54\x6b\x50\x35\xf6\x8a\x28\x36\x3c\xec\x8a\xb6\x5c\x5f\xfd\x1d\xaf\xf4\x3a\xe4\x0d\x3c\xbe\x3c\xff\xe8\x56\x66\xf4\xac\x9d\x9d\xf9\x41\xd7\x06\x87\x2f\x00\x11\x78\x27\xd0\x69\x4d\x51\x0a\xb0\x39\xf9\xfb\x2b\x30\x57\xd6\x5e\xfc\xa5\x3b\x77\xa2\xa0\x54\xab\xe5\x03\x7a\x70\xeb\x13\x2a\x6a\x13\xe1\xd3\x65\x40\x9a\x3d\x7d\xd3\xe6\x81\x1a\x24\x40\xfd\x1e\x75\x2f\xed\xab\x9d\x58\x4a\x44\x64\x57\xd0\x6b\x1f\xbd\x27\x91\x1b\xa6\xd0\xe9\x0b\x6c\xda\xcc\x95\xd2\x16\x7b\xcc\x8f\xb0\x59\xbf\x19\xa1\x7b\xc5\x29\x99\x51\xa2\x55\x19\x85\x30\x07\x56\x2b\x07\x63\x1e\x36\x38\x03\x31\x60\x22\xa0\xdd\xe5\x30\x9c\xc4\x3e\x02\x37\xb9\xab\xd6\x4a\x86\xec\xab\xde\x0c\x37\xe2\xf8\x9e\x89\x4c\xb2\x10\x39\xc7\x06\x17\x9e\x40\x4e\x5e\xdf\x96\xd2\x5a\x81\xf8\xd7\xa2\xcc\x0d\xd3\xb3\x91\x37\x91\x10\xf5\x64\xf9\x7c\x6f\xb8\xfe\xf4\x1f\xc1\x56\x66\x7e\x87\x76\x85\xaf\xba\xeb\x6a\xfa\xfe\x1b\x76\x84\xdb\x9d\x60\x30\x67\xd0\x71\x47\xb5\x9c\x90\x4e\x89\x58\x22\xfd\x1f\x34\xe9\x1e\x9e\x9b\x61\x14\x94\xd1\x9d\x9b\x61\xe7\x66\x18\x62\xc4\x8f\xe6\x66\x88\x0e\x6e\x2f\x4c\x69\x01\x62\xd7\x43\x8c\xff\xee\xfd\x0f\x35\xae\x43\x84\x65\xec\x58\xde\x7b\x1e\x74\xd9\xf4\xff\xef\x4f\x26\xfb\xfb\xde\x1f\x41\xfb\xa3\xb2\xb3\xf1\xe7\x4c\xa8\x44\xa7\xc8\x54\x6e\xfc\xd2\x58\x50\x6a\x6b\x03\x3c\x9e\x4b\xee\x9f\x15\xc7\x10\x60\xec\x61\x59\x62\x40\x09\xe5\x73\x46\x5e\x7e\x54\x15\xac\x56\xbc\x02\x7c\x15\x11\x30\xa0\xfc\x91\x06\x56\xe7\xb0\x64\x32\x97\x84\xab\xe7\xc4\x85\x30\xd6\xb0\x03\xfc\x70\x92\x14\xd5\x88\x6e\x98\xe4\x22\xd7\xe5\x6a\x14\x6e\x72\x5f\x36\x7e\x45\x77\x1c\x82\xd6\x96\x54\x65\x29\x94\xcd\x56\xbf\x5e\xfd\xcd\x93\xf8\x01\xab\x6f\x81\x2b\xfa\x94\x58\x6c\xba\x5a\x65\x17\x01\xd8\x1e\x1c\x75\x81\xda\x70\x0e\x51\xb1\xc3\x28\xb8\x8f\xe0\x53\xa1\x96\x6c\xc9\xcb\xce\xc5\x0e\x9b\xae\x8f\xa2\xb1\xa5\x72\x29\x8d\xee\x5c\x2e\xb6\x71\xc8\x75\xef\x97\xa4\x46\x00\xba\xb2\x45\x65\xe9\x74\xf1\x7b\xdb\x43\xcd\x85\x3d\xdd\x52\x7c\x9f\xef\x0d\x38\xb9\x82\x5b\x2b\x4a\xf5\x82\xfd\xcf\xc1\x0f\xbf\xff\x79\x7c\xf8\xc5\xc1\xc1\xf7\xcf\xc6\x7f\xf9\xf1\xf7\x07\x3f\x4c\xe0\x1f\xbf\x3b\xfc\xe2\xf0\x67\xff\xc7\xef\x0f\x0f\x0f\x0e\xbe\xff\xfa\xf5\x57\xd7\x97\x67\x3f\xca\xc3\x9f\xbf\x57\x55\x7e\x83\x7f\xfd\x7c\xf0\xbd\x38\xfb\xf1\x03\x07\x39\x3c\xfc\xe2\xb7\x03\xbe\x04\x57\xab\x37\x83\x89\x60\xbc\xc6\x1f\x45\x8d\x68\x8e\x3d\x30\xeb\x32\xf6\x6e\x5c\x3b\xaf\xc7\x52\xd9\xb1\x2e\xc7\xf8\x90\x17\xcc\x96\xd5\x50\xa2\xab\x3e\xfe\x3e\x9e\x8c\xa9\x95\x98\x1a\xb9\xd1\x1b\x36\x0f\x50\x88\x60\xe6\xe8\x47\xf7\x06\x53\xbb\xd4\x9d\x23\xf8\x43\xae\x8f\x92\x70\x44\xc8\x30\xbf\xf2\x6c\xa3\x2b\xea\xc8\xbb\x4b\x35\x5a\xbb\x76\xa9\x46\xeb\xd7\x2e\xd5\xe8\x9e\xd7\x2e\xd5\xe8\x01\xfa\x00\x77\xa9\x46\x3b\x1f\xe0\x23\xf1\x01\xee\x52\x8d\x3e\xf4\xda\xa5\x1a\x75\xbe\x1e\x67\xaa\x11\x29\xf0\x75\x9e\xd1\x83\x4d\x33\xa2\x06\xff\xc7\x49\xa2\x2b\x65\xaf\xf5\x8d\xe8\x19\x95\xfd\x20\x03\x73\xed\x99\x0f\xd3\xda\x1c\x4a\xa5\x1c\x40\x05\x1c\x4e\xf9\xe3\x55\x2a\x9d\x99\x39\xf0\x36\x38\xa6\x61\xbd\x9d\xe9\x8e\x45\x95\x8a\x34\x3c\xcf\x0b\x2b\xeb\xd6\x7b\xc2\x8e\x59\x29\x12\x59\x48\x27\xda\x01\x4c\x07\x3e\xc7\x7d\x12\xfa\x01\x4b\x6b\x44\x36\xa3\x9e\xa8\xaa\xae\x19\x2e\x23\x13\x92\xce\x8a\x8d\x8f\x41\xad\x40\xfb\x36\x96\xcc\x2c\x74\x95\xa5\xac\x14\xff\xf6\xea\x04\xcd\xe6\x3a\x1e\x21\x76\x84\xc2\xab\xd4\x8f\xa5\xc1\x79\x21\x09\x75\xeb\x21\x09\x38\xf1\xae\x90\x25\x6c\xb6\x2b\x91\x68\x95\x0e\xed\xde\x38\x6b\x8f\xef\xd7\x9a\xa2\x39\x22\x65\x69\x85\x37\x40\x21\x24\xcf\x64\x2a\xed\x2a\x64\x61\xe0\xb6\x77\x8a\x28\x76\xa1\x25\x46\x30\xf5\x42\x30\x5e\x14\xa5\xe6\xc9\x42\x98\xe8\x6d\x50\xad\x24\xb0\x89\x50\x5f\x99\x55\x73\xa9\x50\xb3\x84\xdf\x38\x35\x24\x5b\xb1\x52\x5b\x9f\x50\x76\xc7\x03\xaf\xa3\xc1\xe0\xe7\xa8\x4b\xd8\x72\x05\x59\x67\x3a\x1e\x02\x67\x25\x67\xf1\x1f\x86\xe9\x2c\xf5\xb8\xa5\x9f\x3f\x73\xaa\x7c\x42\x5c\xec\xa4\x3d\xa0\x4a\x5a\xcd\x32\xa7\x16\xb9\x13\xe0\xee\x1f\x7f\xf6\x47\xb6\xd0\x55\x69\x26\x31\x84\xc0\x73\xf8\x0c\x9d\x14\xde\x14\xb0\x2c\x13\xdc\x58\xf6\xfc\x19\xcb\xa5\xaa\xdc\x59\x3e\x10\xe3\x0d\xa5\xbd\x46\x7a\xeb\x9f\xff\xd8\x73\xb4\x61\x34\xd6\xf5\x0c\x16\xe2\xd6\x02\xfb\xb3\x91\xe2\x4a\x7b\x1c\x41\x31\xb0\x47\x63\x4b\x8d\xa5\x23\x29\x5e\x45\x65\xf5\x96\x77\xfe\x4f\x95\x9e\xae\x6c\x7f\x18\x98\xff\xc6\x71\x9a\xf8\x2f\xfe\xc3\x0f\xc1\x52\xad\xa1\x54\x3b\x4c\x65\xeb\xdd\xa2\xe7\xd2\xd8\x4e\xbd\xa2\x6b\xdc\x98\x0e\x3f\xee\x7b\x98\xcf\x9d\xc5\x3b\x48\xd1\x3a\xd8\xce\xde\x56\xf3\x4e\xe5\x24\x11\x06\x44\x91\x87\x4f\x03\xff\x2c\x3e\xb5\xe3\x43\x1f\x16\x62\xcb\x7b\x11\x59\x3c\xf3\x0f\xd0\x19\xb3\x17\xb1\xfa\xe8\xf6\x9e\xb1\x07\xa2\x16\x0e\xd6\x94\x11\x46\xaa\x39\x36\xb2\xcc\xab\xcc\xca\x22\xab\x29\x17\x7e\x40\x07\x70\xec\xf0\xe7\x91\x87\x99\x23\x70\x14\x42\x83\x43\x70\xe4\x20\x8c\x25\x94\xc5\x7e\x8c\xa5\x3b\xc7\x0b\x5e\xf2\x40\xfe\x44\xe7\x39\x37\x87\x14\x3b\xe0\x90\xbb\x82\x92\xdd\x1d\xc3\x25\xcf\xc2\xeb\xc7\xb9\x02\xdb\x62\x5c\x2b\x14\x57\x9d\x83\x76\x4d\x87\x0b\x0c\xc5\xf4\x6d\x48\x8f\xc7\xfe\xe9\x2d\x8e\x25\x85\xf8\x4b\x9e\xdc\x08\x95\xb2\x6f\x8c\x27\x5c\xba\x52\x3c\x27\x70\xf5\xa2\xd4\xd8\xb7\x5b\xa4\xad\xdf\x9b\x11\x39\x12\x11\x65\xc4\x83\x40\xa1\xbe\xb5\x2d\x2a\x56\x66\x20\x74\xdd\x6f\x8c\x53\xbe\xde\x2f\xef\x0c\x3a\x69\x4b\xb9\x4c\x84\xd7\x1d\xdd\x04\xb6\xf5\xf2\xcb\xce\x88\x6f\x6c\x33\x0e\x13\x35\xcd\xc4\x5d\x08\x47\x7a\x08\x3e\x02\x8e\x3a\xcf\x9c\x88\x5b\x05\x78\x9d\x16\x83\x4d\x57\xdb\x6b\xd9\x5f\x4e\xfb\x03\x34\xed\xbf\xfd\xf2\xb4\x29\xcc\xde\xf2\x54\x1b\xf6\x65\xa6\x93\x1b\x76\x2a\xc0\x68\xf8\x98\xed\xde\xcb\x69\xfa\xb8\xdb\x34\xe6\x7c\xde\x2d\xcf\x63\xcc\x72\xad\xa4\xd5\x65\x17\x79\xfc\x80\xc0\xf6\x76\xad\xf6\x36\x83\x88\x97\xd3\xf4\xc9\x34\xda\x73\x4c\x3e\x50\x87\xdd\x85\x60\x25\x88\x18\x18\xd4\x77\xff\xe8\x28\x30\x7e\xb3\xd0\xb7\x63\xab\xc7\x95\x11\x63\xd9\x39\x4f\xa9\x37\x7d\x6e\xc4\x0a\x92\xbe\x06\xa1\xd0\xd7\x38\x58\xc3\x44\xb7\x1a\x3c\xe7\xf0\xb9\x53\xe4\xde\x7e\x79\xea\x4e\xef\x49\x6c\x96\x1c\x09\x9b\x1c\x25\xa2\x58\x1c\xd1\x74\x1e\x3d\x59\xbd\x7c\x1c\x86\xae\xc7\x2c\xd1\x59\x46\xb8\x5d\x7a\xc6\x4e\x44\xb1\x08\x8f\x78\x18\xb4\x7a\xcc\xcd\xd2\x0a\xad\x87\x69\xac\x14\x89\x08\x37\x26\x49\x88\x88\xd1\xcb\xe9\xfd\x7a\x41\x3f\x44\xd6\xfe\x84\x3d\x49\xba\xf4\x96\x7b\x10\xe4\x7d\x38\x3d\xea\xf6\xaf\xfc\x70\xe0\xff\x89\xc2\xcd\xcd\x96\x74\x3e\x5f\xb4\x21\xa2\xcf\x67\x68\x61\xa6\x22\x65\x7a\x29\xca\x52\xa6\xc2\xb0\x20\xa3\x63\xc7\x92\xcc\x1e\x06\xe5\x77\xdd\xf1\x1e\x57\x7e\xc0\xc3\xf1\x29\x44\xc2\xdb\x8d\xb9\x2e\xbc\x79\x9a\x4b\xf5\x30\xb8\xbc\x23\xbd\x4c\xc2\x33\x71\xfe\xa6\xb7\xe9\x7d\x85\xe3\x34\xad\x6f\xff\x61\x04\xb2\xff\x0b\xc0\xf3\x5f\x07\x9e\x65\x4a\xa7\xdd\xa2\x61\x5b\xb6\xa1\xe7\xdc\x8a\xdb\x8e\x8a\xcf\xb8\x16\xf5\x5d\x7f\x0f\x96\xd7\xe3\xb6\xc1\xb7\xd4\x20\x23\xda\xd7\x88\x7a\xbf\x2d\x75\x8a\x38\x68\x18\xd7\xb2\x27\x45\xab\xbf\x98\xdf\x9a\xc7\x97\xe7\xec\x2b\x7c\xde\xf6\x3a\x7e\x94\xda\xa2\x25\x73\xaa\x73\x2e\x07\x6a\xc4\x1e\x35\x74\x8a\x5f\xf8\x32\x3c\x8c\xe1\xd3\xe2\x2e\xf4\x33\x39\xaf\x4a\x91\x32\xf2\x7e\xec\xda\x18\x3c\xe0\x36\x06\xc3\x2a\xc5\xb5\x4e\x1c\x79\xcc\x7d\x65\x4c\xad\x07\x7b\x2e\x02\x75\x20\xa4\x20\x31\x23\x94\x91\x90\x75\x10\x25\xc6\x81\xb2\x0c\xf9\xdf\xa1\x0c\x06\x15\xe7\x11\x7b\xa5\xe7\x52\x79\xe9\xa4\x29\xd9\x65\xc6\x65\xd6\x8f\x9c\x3b\x4d\xf7\x57\xa6\xe9\x1a\x93\xfd\xff\xd9\x7b\xd7\xee\xc6\x6d\x2c\x5d\xf8\x7b\x7e\x05\x96\xba\xd7\xb2\x9d\x91\xe4\xaa\x74\x26\x3d\xa7\xce\x4c\xcf\x72\x6c\x57\xda\x27\x75\xf1\xb1\x5c\x95\x35\x27\xc9\x3b\x81\x48\x48\x42\x9b\x02\x18\x02\x94\x4b\xdd\xd3\xff\xfd\x5d\xd8\x1b\x00\x41\x8a\x92\x48\x49\xbe\x54\x42\x7e\x48\xca\x22\x09\xe2\xba\xef\xfb\xd9\x97\x82\x8e\x93\xdd\x23\x19\xcb\x8c\x37\xa1\x10\x27\xc5\xa0\xcd\xd3\x98\x2b\xf3\x7f\x32\x1a\xbd\x01\xdf\x6c\x2e\x9c\x66\x08\x5e\x47\xcb\x36\x7c\x7e\x31\x12\x97\xa7\xa3\x07\x48\xb3\x0f\x56\xa7\xe2\x4a\xc4\x66\xb8\x4c\x95\x02\x80\xed\x57\xb0\x0a\x88\xcf\x5e\xc3\xe8\xc3\x31\x23\xb7\x33\x1e\xdd\x5d\x07\x2e\x58\x99\x99\xdf\x44\xf0\x53\x49\xd0\xa8\xde\x7b\x2a\x86\x63\x87\x75\x7d\x28\xb3\xd7\x6d\xc0\x71\x47\x76\xca\x4c\xe3\x84\x2a\x25\x23\x5e\xf8\xfc\xc1\x28\x5c\xb0\xe4\x18\x58\xf2\xd3\x4d\x03\x48\x89\x0f\x22\x7f\xb8\x8d\x63\x85\x56\xaa\x42\x79\x83\x0b\x37\x5b\x4f\x36\x74\xdc\xca\x07\xab\xae\x79\x5b\xaa\xa7\xe9\xb4\xbe\x8a\xfb\xd9\xe5\x83\xda\x8d\xe2\xe4\x79\x5b\xc0\x79\x75\xab\xf8\xba\x9a\xb6\xbe\xc7\x93\x4c\xd6\xee\xc9\xda\x75\x56\xb8\x4a\xec\x0d\xfe\x66\x1d\xd2\x40\x54\x52\x99\xe6\x09\x46\xad\xee\x5f\x56\xd4\x79\xf3\xf0\x3b\x4f\xe0\xa0\x7e\x6e\xc5\x88\xda\xa6\xf3\xfd\x36\xea\x12\x05\x0a\xc1\x8b\x6f\xbe\xfe\xfa\x73\xaf\x54\xb4\x9f\xe1\xec\xa9\x4b\x15\xed\xe5\xea\xea\x50\x0a\x3a\x94\x82\x4d\xd7\x93\x7b\x62\x1f\x1f\x87\xe0\x20\x49\x62\x87\x48\x10\xdb\x17\x69\x60\xcf\xe4\xb2\xc3\x24\x96\xed\x8d\x25\xf0\xa0\x08\x02\x07\xca\xb1\xda\x1f\x2d\xa0\xc3\x08\xf8\x7d\x60\x04\x1c\x2e\xb7\xea\x50\x78\x00\xfb\xe7\x54\xfd\xf6\x73\xff\xf7\x26\x13\xfb\x66\x98\xb7\xcf\x2b\x3f\x54\xfd\x8a\x43\xd9\xd9\x0f\x66\x18\x28\x59\x75\xad\xbe\xeb\x76\x06\x46\x5e\x17\x88\xef\x5a\x1a\xa2\xf1\x84\xda\x2e\xd9\xdb\x58\x80\x5d\x91\x3b\xf1\xe0\xf2\xae\xc1\x96\xde\x8f\x2a\x2e\x76\xff\xf3\xf3\xf7\xac\x77\x2e\xe6\xae\x8c\x7a\xe7\x7f\xf4\xd7\x1a\xff\xa3\x2a\x61\xbc\x3a\x8b\x20\x50\x42\x10\xc1\xe4\x38\xac\xa3\x52\x9c\xff\xb3\xeb\x2b\x12\x65\x0c\x20\x0d\x68\xa2\x86\xa4\x46\x42\x73\x9e\x1a\x2b\xd1\x39\xc9\x8c\x6a\xcd\xe6\xa9\xde\x77\xc3\x75\xee\xc7\xdf\x99\xfb\xf1\xc0\x3e\x83\x8f\xbe\x39\x67\x2d\x9a\xe5\x73\x2a\x06\x86\x5a\x80\x23\xb2\x14\xcf\x51\x61\x7c\x43\xe2\x72\xe0\x70\x36\x69\xc6\x10\xdc\x3c\x17\xfc\xd7\x9c\x15\xf6\x05\x2f\x5e\x3c\x03\x57\x0b\xf4\xe3\xc0\x73\x87\xa2\x53\x85\x8a\x44\x72\x25\x95\xc9\x4e\x88\x9f\x47\x47\x30\x02\xf9\xab\x64\x2b\xd3\x33\x86\x62\xda\x35\x80\x03\x14\x4f\x95\xf5\x3b\x54\xf0\x68\x92\xc8\x7b\xfc\x76\x28\x78\x98\xf5\x33\x7d\xb1\x78\x1c\x63\x46\xe6\x3c\xcb\x64\x66\x5d\x3c\x61\x77\x30\x2c\xc7\xe8\x89\x2c\x43\x85\x2b\xb3\x51\x15\x23\xa6\xc3\xad\xa2\x25\xa1\x02\x13\x17\xcd\xbf\x5d\x50\x32\xd6\x3f\xb3\xf4\x6e\xcc\x66\x74\xc1\x65\x9e\xe1\xdb\x5a\x92\x9e\xbd\x05\x2c\x77\x29\x73\x6f\xe6\xce\x21\x4f\xc9\x8f\x4e\xd5\xcc\xd3\xbb\xe2\x26\x28\xa8\xb1\x74\xf6\xc3\x01\xfb\xc4\x95\x5e\x1d\x8b\x9b\x22\x57\x20\xe1\x29\x76\xde\x42\xa5\x86\xc1\x7e\xdc\x39\xe7\xb4\xbc\xdf\xc2\xd6\xca\x22\xe9\x62\x04\xb7\xb6\x09\xa4\x16\xa9\x05\x53\xc5\x5d\x52\xd8\xe7\x17\xee\x89\xa3\xdc\xb1\x32\x53\x27\x11\x7f\x2e\x12\xb1\x0f\x90\x48\x78\xb4\xbc\xba\x38\x8c\xcc\xe7\x03\x23\x4c\xa3\xe4\x5b\xaa\x58\x4c\xde\x52\x41\xa7\x68\x1c\x39\x1e\x5d\x7f\xfb\xf6\xc4\x6c\x12\x30\xbe\x5c\x5d\xd4\x46\x4f\x8c\xc2\x9e\xbd\x7b\xaa\xf4\x6d\x52\x9d\xa3\x83\x49\x05\x2d\x67\xe9\xc9\x12\xd8\x89\xe7\xec\xfb\x94\xec\x5a\x05\x37\xc2\x70\x08\x87\x54\xa6\xaa\xe4\x75\x31\x8f\xef\x1e\x72\xb8\x81\xad\x7a\xd3\x98\x9a\x39\x9a\x1a\x38\x93\x2a\x6b\x9f\x51\xcd\xa6\xcb\x0b\x96\x26\x72\x69\x96\xfb\x3a\x30\x9d\xe3\xa3\x63\x64\xf5\xd9\x98\x46\x24\xcb\x13\x86\xd5\x6b\xaa\x10\x61\x82\xb1\xb8\xa0\x53\x5c\x28\x4d\x01\x20\x0c\xdb\xdf\xd8\xa3\xc6\x0c\xa6\x29\x2b\x19\x60\x3f\xb7\x3e\x55\x86\x53\x34\x07\x6a\xe3\x2b\xcd\x99\x09\x7c\x7e\xfb\x0e\x6d\xe3\x3c\x6c\xec\x26\x2c\x6f\x70\x38\xd3\x37\x79\x62\x58\x47\x12\x57\x8a\x88\x82\x6c\x65\xd7\x18\x91\x19\x80\x02\x98\xde\xf7\xc9\x38\x37\x82\x17\x53\x25\xfb\xf2\x2a\x2c\xe5\xfd\x0c\xfd\xc6\xe6\x25\x42\xd3\x34\xe1\x18\xd7\x2b\x33\xeb\xfc\x0d\xac\x8d\xab\x8f\x35\x21\x24\x2d\xe5\x8f\x76\xf2\xc6\x80\x2c\x58\x36\x6e\x82\xa9\xd0\x56\x94\xa0\x29\x07\xdf\x49\x63\xc9\xa3\x0c\x0a\x79\x7d\x85\x6f\x3b\x4d\x2d\x54\xcd\xdc\x4d\x5c\x41\xbb\x36\x0e\x50\xd0\x56\xa5\x41\x6d\xc3\xa3\x02\x9d\x5d\x5f\x21\x0c\x95\x05\x06\x2a\x4c\x16\x46\xb6\xa7\x18\x1c\x58\xa0\x11\xd2\xa9\x69\x51\x13\x29\xfc\x47\x99\xc8\xe7\x0c\xc1\x84\x8a\x72\x56\x46\xe1\x13\xcb\xa2\xf5\xc2\xe2\x61\xf4\x93\xe6\xe2\x44\x7b\x37\x7a\x4b\xb7\x79\x6b\xce\x23\xa4\xb8\xb1\xc3\xfc\x70\xf3\x66\xb7\x45\x7c\x57\x6e\xc3\x82\xc7\x30\xc0\xc9\x4b\x69\xa6\x39\x4d\x48\x9e\x25\xce\x0d\x87\x41\xef\x36\x2c\x6d\x46\x17\x01\xc0\xce\x90\x90\x2f\x71\xe5\xec\xc4\xe2\xf9\xc4\xf2\xae\xb8\xf2\x93\x3c\x49\xfa\x64\xc2\x05\x35\x64\x97\xa5\x24\x74\x07\x8d\xb8\x88\x8c\xfa\x65\x74\x7d\x5b\xaf\x05\x7a\xe4\x94\x32\x7f\x48\xc1\xcb\x08\xde\x52\x96\xc4\x00\xba\x08\x9f\x30\x07\x36\x02\x13\x81\xd1\x1a\xcf\x93\x5c\x69\x96\xdd\x48\xc3\x0c\x82\xb8\x16\x80\xa3\xa0\xe1\xed\x6f\xb9\x88\x21\x84\xe9\x06\x18\x47\x44\x05\x61\x1c\x8c\x2f\xa6\x49\xf0\x53\x9b\xbd\x53\x6c\xa8\x63\x95\x47\x33\x33\xa4\x5e\x2a\x63\xd5\x33\x64\xa4\x87\x26\x3a\xd5\x3b\x31\x7f\x55\xc7\x80\x61\x2a\xc1\x7b\xa7\x34\xe5\xbd\x93\x3e\x81\x09\x02\xc7\x99\xd4\xb3\xcf\x77\x1f\xba\xb1\x82\x4e\xbc\xd3\x2e\xbc\x09\x5b\x80\x3d\x28\x8a\xea\x5f\xf7\x33\xae\x99\x2f\xbe\x8d\x96\x1d\x8f\xaf\x52\x25\xd6\x84\x9c\x09\xc2\xe6\xa9\x06\x6b\x31\x99\x33\xea\x5c\xc8\x6c\xc1\xb2\xa5\xd1\xc9\x01\x88\xe2\xb3\x3f\xfc\x7e\x3f\xee\x35\xe1\x95\xca\xe6\xc5\x26\x87\x13\xb6\x32\xb9\x47\x5f\x1e\x95\xf4\xfc\x24\x09\xa8\xf9\x67\x3b\x95\xc0\x5e\x77\x9a\xc6\x8f\xe6\xcd\xf2\x14\xe2\x4f\x48\x2d\x3d\xfd\x78\xf3\xc6\x3a\x32\x70\xae\xbe\xe7\x22\x46\x11\xf5\x4c\xeb\x8c\x8f\x73\xcd\x6e\x98\xe9\x70\x84\x21\x0f\xae\x0a\x9f\x8d\x8e\xb6\x2b\x51\x3b\xfd\xd0\xf7\xcf\x71\xea\x57\x05\xdb\xa6\xc2\xe8\x86\xe6\x9d\x2c\xbf\xae\xa9\x8d\x0d\x58\x85\xe0\xad\x8c\xeb\x0f\x55\x25\x33\xa4\x78\xd8\x8a\x2a\x41\x65\x4b\xd7\x96\x15\x62\x97\x69\xad\xa4\xbf\x79\x39\x36\x4c\xfd\xba\x9e\x14\xb6\x01\xa0\xa0\xc1\x9d\xdb\x65\xca\x2c\xd2\x36\x99\x24\x74\x5a\x6c\x23\xa0\x87\x28\x3e\x9d\x8f\x3e\xba\x21\x28\xc2\xeb\x05\xd9\xad\x92\xee\x36\xd9\x76\x50\xcc\xd2\xda\x27\xcc\x47\x6a\x6f\x6e\x17\x70\x7d\xe3\xeb\x77\x53\x13\xb7\x9f\xde\x68\x52\x5b\x37\xff\xb7\x16\xe1\x8b\x06\x3b\xc1\x01\x88\x39\x75\x13\x22\x91\x40\x42\x19\x7d\x2c\x6d\x93\x2d\xfd\x5d\xb3\x69\xef\xd8\xf2\x5e\x66\xf5\x68\xe0\x3b\xef\xaf\x8d\x5f\xc4\xea\xfc\x5b\x0f\xc8\x5b\x9a\x9a\x61\x17\x71\x9e\x48\xf0\xac\xd7\x11\xb5\x02\x8c\xd0\x72\x51\x71\x32\x9b\x52\xc1\xff\x8e\xc1\xb1\x91\x39\xc7\x32\x33\x7f\x1e\xa3\xe7\x02\x35\xfa\x84\x45\xfa\xc4\xee\xbf\x5a\xba\xb7\x65\x83\xd2\x38\xe6\x28\x57\x5c\x6f\xd9\x4b\x9b\x27\x81\x8b\xbb\x87\x98\xf3\x0d\x07\x6b\xfb\xde\xdf\xec\xfa\x6c\x40\x9b\xf3\x6c\x43\x74\xd3\xc6\xf7\xe7\x94\xdb\x8a\xae\xcf\x6e\x56\xd8\x9c\xf2\x5d\x87\x85\xd7\x1e\xf3\x3a\xa7\x3a\xcf\xb8\xae\x65\x48\x9b\x5f\xe4\xe2\xfb\x7c\xcc\xac\xb7\xb7\xf5\xeb\x02\x82\xf7\xce\xae\xaf\x0e\xbb\x1c\xab\xf0\xd2\xb6\x83\x46\xa2\x21\xb9\xa0\xf3\x31\x9f\xe6\x32\x57\xc9\x32\x34\x57\x52\x70\x56\x1b\x75\x1f\xed\x35\xe2\x48\x13\x2a\xa4\x58\xce\xed\xa3\x22\x4a\xf2\x98\x95\x5a\x04\x9f\xde\x42\xf2\x98\xd0\x5c\xcb\x39\xd5\x3c\x22\x91\xc4\x7b\xe5\x96\x72\xc5\x08\x5d\xf3\x6e\x94\x2b\x2d\xe7\x64\x4e\x33\x35\xa3\x49\xb2\x6e\x8d\x0f\xc0\xd5\x36\x01\x68\x0f\x60\xfc\x6b\x6f\x2e\xb0\xd7\x3b\xee\xef\x2d\x78\xe1\x0d\xf6\xb7\xe9\xdc\x5e\x0d\x2c\xd6\xef\xd2\x06\x6d\xd8\x94\xf8\x5a\xb8\x9e\x2d\x0b\xb3\x6d\x76\x36\x9d\xdc\xad\xe3\xda\x40\x0d\x37\xbe\x0b\xa1\xb3\x2c\xbe\x9a\xd3\x69\x03\x41\xf2\x8d\xd1\x1b\xa8\x58\xba\xd7\x10\x45\x52\xf5\x89\xcc\x6c\x0c\x88\xaf\xc9\x6d\x6f\x79\x00\xd2\x8c\xbc\x07\x37\x9b\xcc\x6c\x30\xb5\xdd\xa5\x10\x5a\xcf\xb2\x89\xcc\xe6\x46\xae\xe3\x19\x99\xe4\x02\x55\x0b\x1b\x7b\x0d\xca\x8a\xb5\xe2\xd0\x44\x49\x7f\x02\xc1\x6f\x27\x5c\x27\x08\x55\xe4\x9e\x25\xc9\x90\x9c\x25\x89\x85\xb7\x0c\xa0\x11\x8a\x94\xe7\x22\x42\x60\xbc\x24\x31\x9f\x32\xa5\xc9\xf1\xe8\xaf\x67\x27\xc0\xb5\xc1\xc2\xb1\x24\x9a\xba\x3c\xb1\xb2\xe5\x06\xf8\x7f\x9c\x83\x9c\x10\x51\x4d\x13\x39\x45\x27\x39\x58\x70\x45\x4c\xd2\x84\x2e\x01\xa4\x3e\xa5\x19\x04\x8a\x46\x68\xbd\x21\x59\x2e\x00\x9e\xf7\x51\x39\xce\x76\x52\xb0\x09\x41\x77\x00\x7b\x72\xc7\xa3\xbe\x05\xb5\xf4\x61\x59\x59\xc6\xd2\x84\xae\xb1\x37\x6c\x48\xfb\x35\x62\x2e\xa8\xb0\x52\x30\xdf\xc6\x90\x8c\x70\xef\xcc\xa9\x8e\xd0\x85\xf9\xcb\x9c\x69\x1a\x53\x4d\x87\x46\x17\xfc\xa5\x9c\x98\x26\x93\xd8\x34\xb4\x7e\xa1\xd7\xf4\x19\xe5\xc5\xfa\x62\xec\xe5\x53\x68\x84\x5a\xff\x38\xc8\xe7\xee\x3c\x6e\x34\x70\xec\x49\x9f\x60\xf8\x97\x9f\x8c\x2a\xb6\xd1\xbb\x56\xea\x6b\xf5\xa5\xb2\xfd\x21\x29\x8f\xc4\xee\xd6\x39\x03\x5c\xc4\x5b\x5b\xcf\xc7\xfd\x02\xc6\xd5\xb3\x77\x17\xeb\x0d\x61\xdb\x4d\x06\x5b\x4c\x04\x65\x97\xc1\x86\xee\x39\xd3\xb3\xbd\x53\xf6\x1b\xb8\xe4\x14\xc8\xdf\xc3\x54\x0f\xea\xc0\x53\xdc\xc3\xb8\x60\xe5\xcc\x43\x7c\x6f\xbd\x7d\xa4\x91\xe3\xa6\x89\xbb\x66\x5b\xa2\xd7\xc0\x77\x76\xed\x43\xcd\xbc\x37\x5b\x93\xb1\x4a\x13\x6e\xb3\x1d\x21\xb9\x12\x66\x1e\x52\x36\x9c\xf1\xd4\x4f\x76\x53\x6f\x57\x43\xfb\x8e\x1b\x6a\x8b\x8e\xfa\xa5\x2c\x85\x11\xdd\xb1\xe5\x91\xb2\xb9\x28\x52\xa8\x19\x4f\x31\x5b\xd0\x3a\x28\xec\xea\x92\x8f\x34\xe1\xb1\x6f\x02\x77\xf5\x95\xe8\x93\x77\x52\x9b\xff\x5d\x7e\xe2\x4a\xa3\xfa\x79\x21\x99\x7a\x27\x35\xfc\x72\x90\xa1\x62\x17\x5a\x0c\xd4\x2a\xc0\x68\xe3\x86\x73\x15\xa8\xc9\x6e\x40\x57\x96\xec\xb9\x49\xe1\x8a\x5c\x09\x23\x11\xd8\x11\xf9\x2c\x5a\x65\x9b\x70\x89\x22\x42\x8a\x01\x58\xbf\x6b\xdb\xb0\x13\x21\xb3\xd2\x3c\x6c\x68\xce\x36\x85\xe1\x7c\x70\x87\x2b\x47\xc4\x3d\xcf\xa6\xce\xec\xc6\x23\x32\x67\xd9\x14\xfc\x39\xd1\x16\x7f\x46\x53\x53\x64\x23\x03\xe4\xd6\xb5\x02\x92\xf9\x66\xad\xe1\x62\x65\x91\x82\xe7\x91\x2c\xcd\xd1\x9a\xf1\x0f\x43\x7d\x60\xa6\xfe\x09\xa9\xd4\x6a\x48\xce\x5c\xb1\x94\xf0\x9e\xf5\x6b\x85\xcd\x98\x16\xb8\x22\x86\x94\x2c\x68\xc2\x10\x39\x9e\x0a\x9f\x05\x25\x27\x2b\x84\xbd\x6f\x53\xaa\xcd\x99\xf5\x22\x53\xef\x8e\x2d\x7b\xfd\x95\xa5\xed\x5d\x89\x5e\x91\x02\x57\x5a\x4c\x4f\x44\x41\xda\xea\xc1\xbd\xde\xee\xbc\x60\x23\xb1\x6c\x6e\x5e\xd9\xba\x6e\xea\x8e\xd7\x3b\xa6\x6b\x85\x8d\x63\x75\x62\xa6\x10\x9c\xc1\x19\x99\xcb\x0c\xcc\x99\xe6\xd7\x10\x48\xc3\x88\xaa\x77\x3c\x4d\x0b\xdc\x91\x3c\x9d\x66\x34\x66\x64\x9a\xd1\x74\xd6\x56\x2c\x41\xd9\xa6\xae\xf9\xcf\x46\xd0\x5d\x33\xf9\x1b\x34\xba\xd2\xf4\x3b\x05\xc4\x29\xde\x70\x58\xee\x33\x9a\xa6\x2c\x23\x34\x93\x39\x18\xed\xe6\x0b\x96\x0d\xdd\x23\x18\x72\xe1\xed\xcc\x91\xcc\x32\x16\x69\xa7\xa2\xdb\xa8\x60\x4c\x58\x15\x31\x64\xa3\xb6\x16\xfb\xee\xd9\x78\x26\xe5\x1d\x64\xcd\xc1\x76\x7c\x40\x2b\xc8\x0f\xf8\xad\x8b\xe2\x37\xa7\xd0\x2a\x12\x33\x4d\x79\x02\xb1\x26\xef\xdf\xbc\xb5\xd1\x28\x4e\x9a\x70\xbd\xac\x0f\xec\x38\x80\x1a\x42\x63\x1b\x25\x75\xc3\x16\x9c\xdd\xdb\xf9\x5f\x17\x47\x32\x20\x53\x26\x20\x78\x62\x43\x90\xd1\x80\x28\x1e\xb3\x4b\x48\xc6\x5d\xdf\xd0\x1e\xe6\xfb\x35\x7d\xde\x46\x42\x36\xf3\x91\xad\x3c\xa4\x01\xaf\xf7\x4a\xf8\xb5\xcc\x36\x00\xff\x34\xcb\x0d\x6e\x96\xf7\x6b\xa3\xd3\x5f\x91\xaf\xbf\xfe\xd3\xda\x87\xe6\xf4\x13\x9f\xe7\xf3\x57\xe4\x9b\x7f\xfd\xd7\x3f\xfd\xeb\xfa\xc7\xb8\xc0\xc7\x5e\xae\x1f\x9f\x3d\xf3\xe7\x37\x17\xcf\x60\xbe\x63\x1f\xed\xb7\xd9\x35\xd8\xa0\xa9\x09\xe5\x49\x9e\xd9\x90\xd4\x86\x8a\xca\xeb\xf0\x1d\x70\xeb\x14\xc9\x14\xd4\xb5\xe8\x82\xd1\x6c\x90\xda\x84\x0b\xa6\xa0\x34\x4a\x2e\x32\x16\xc9\xa9\xe0\x7f\x67\xb1\xab\x8c\x02\x81\x27\x00\xb0\xee\xb6\x38\x61\x22\xc6\x9a\x94\x86\xf3\xce\xa8\x88\x93\x4d\x01\x09\x0d\x46\x1a\x9e\xe0\xbd\xa6\x0c\xf8\x5f\xab\x09\x7b\x5b\xbc\x51\x99\x2e\xa8\xac\x69\x9d\x60\xc8\x57\x71\xda\xf6\x1a\x29\x12\xc6\xd1\x06\xf5\xbe\xa6\x8f\x2b\xda\x27\x2a\xce\xf0\xdb\xaf\x39\xcb\x96\x90\x38\x52\xa8\x17\x41\xa0\xda\x6d\x81\x2b\xe0\x86\x61\xe5\x3a\x44\x72\xa9\x68\xe4\x85\x28\x55\x84\xa3\x54\xbe\x0d\xef\x30\x74\xe2\x3b\x77\x16\x39\x23\x22\x4f\x92\x75\x8f\x0a\xb9\xc9\xf1\x15\xce\xdd\x16\x85\xb6\x99\xa6\xd9\xd4\x38\x51\x33\xd3\x8f\x6a\xa2\x08\x07\x7e\x20\x85\xe2\x79\x1b\x2d\xc2\x01\x37\x8a\x39\x6d\x1e\x6f\xda\x0c\xaf\xa6\x81\x31\x03\xaf\x36\x01\xa9\x0d\x51\x66\x1e\xd2\xbc\x81\x57\xab\xf8\xa1\x66\xa6\x8e\x9a\xae\x3f\x3b\x83\xc7\x0e\x83\x6f\x62\xfc\xa8\x19\x7a\x67\x02\x59\x99\xf0\xa6\x31\x59\x2d\xe2\xb1\x1a\xae\x64\x03\xd3\x08\x5e\x9d\x81\xa4\x15\x27\x6a\x40\x98\xdb\x19\x4b\x1a\xaf\x6a\xc6\xb8\x58\x48\x44\x69\x6e\x25\xc3\xdd\xac\xbc\x58\x11\xe5\xee\x81\xb2\x5a\x59\xce\x0b\xbf\xa1\x48\x6b\x14\x5a\x92\xab\xed\x26\xf7\xcd\x23\xd8\x9c\x9b\x72\x10\x1d\xa4\x3c\xf2\x3c\x61\x3f\x70\x3d\x7b\xef\xd0\xd8\xed\xae\xd6\x79\x9a\xc0\x60\x83\x1b\x66\x0b\xdd\x14\x92\xe1\x15\x56\xf0\x62\x91\x9c\xcf\x99\x88\x31\x94\x69\x4e\xef\x18\x29\x0a\x41\x1a\x19\x0f\xc4\x60\x68\x8e\x7d\x4a\xa9\x28\xe4\xc4\x85\xa1\xe5\x9b\x76\x54\xc3\xfd\xd4\x94\xd7\x36\x4e\xfa\xd8\x9c\xec\x11\x64\x6b\x94\x92\x3a\xc8\x98\x25\x12\x8c\x38\x18\xaf\x8a\xb1\xd6\xf6\x51\x20\xc9\xf6\x57\xcb\xf5\x2c\xf2\x23\x13\xd3\x02\x67\x4a\x25\x50\xa4\xd5\x52\x60\x29\xd8\x90\xdc\x58\x11\xa6\x99\x54\xd4\x84\x9c\x36\x24\xa5\x8d\x19\x62\x81\xcd\xd0\x7a\x66\xdd\x7b\xe1\xdc\x2e\xdc\x6f\x4d\x66\xd7\x3d\xfc\x5b\x9e\x5f\x5f\x29\xa1\xdd\xf4\x96\x8f\x74\xc1\x15\xfc\xdc\x56\x88\x57\x84\x25\x80\xc1\x54\x37\x20\xe7\x37\x97\x67\xb7\x97\x7d\xf2\xe1\xfa\x02\xfe\x7f\x71\xf9\xe6\xd2\xfc\xff\xfc\xfd\xbb\x77\x97\xe7\xb7\x46\x8e\xf8\x12\x71\xe0\x8d\x1a\x67\x66\xd7\xf0\x23\x59\xa6\x16\x54\x2c\xc9\x24\xd7\x86\x1c\x14\x1f\x2b\xf5\x82\xa2\x0d\x80\xc6\xb1\x51\x19\x3f\xbb\x35\xac\x9f\xf0\xaa\xd9\x24\x2c\x76\x81\xd0\xf9\x36\x99\x6b\xbb\x98\xd4\x78\x93\x34\xce\x8a\x28\x75\xb9\xb7\x63\x3a\xc4\x4f\x82\xbc\x96\x19\xb1\x75\xbe\x5e\x91\xa3\x54\xc6\xea\xc8\x26\x9d\x98\x7f\x0f\xf1\xa7\xd3\x44\x4e\x8f\x7c\x2e\x0a\x23\x89\x9c\x12\x95\x8f\x7d\x8e\x10\x70\x53\x78\xfa\x4b\xf7\x58\x29\xb5\xa2\xef\x13\x85\x82\xb7\x7c\xe3\xa5\x77\xc2\x07\xc2\x76\x4f\xa1\xc8\x57\xe9\x49\xf3\x43\xb5\xc1\x2f\x4f\xeb\x7b\xe0\x04\x27\x9e\x55\xde\xf8\x49\x98\xed\x7a\xcf\x93\x38\xa2\x59\xbc\xb2\x67\x81\xb9\xe1\x92\xc3\xec\x21\x6e\x2e\xd6\x48\x2e\x1a\xb7\xe0\x19\x72\xc1\xb2\x84\xa6\x18\xa7\x0e\xc0\xc5\x10\x00\x05\x1f\xb9\x60\x29\x83\x3c\x2d\x57\xb5\x9b\x89\x28\x91\x80\xd3\x81\x9c\xb1\x5f\x1e\x3a\x06\x44\x39\x50\x42\x9b\xec\x53\x9c\x90\xde\xb3\x25\x73\x10\xec\xdc\x6a\xf7\x62\x78\xf4\x5a\xb0\x17\x9f\x3d\x82\x4a\xa3\x97\x7c\x19\xe9\xd9\x2c\xb8\x5e\x9f\xf4\x3c\x9e\x49\x6c\xa5\xe4\xde\x97\xbd\xe2\x81\x30\x8f\x0a\x84\x64\xeb\x98\x1a\xc0\x77\xc2\x6c\x4b\x58\x60\xe7\x3e\xf3\x9f\x2e\x30\x69\x0c\x6b\xb3\x46\x2c\xe8\x43\xb9\xa1\x61\xa9\x23\x2b\x5f\x2d\x52\x00\xb7\x7e\xd1\x74\x3f\x78\x5d\x43\xba\x3c\xa6\x12\xda\xc9\xc9\x82\x8c\x9b\x21\x19\x95\x36\x8f\x77\xff\x85\xa0\x39\x3c\x23\x29\xcd\x8c\x2a\xe2\x9e\x2c\xd7\x0b\xfb\x72\x6b\xb5\xb0\x06\x9b\x20\xf0\xaf\x34\x94\xda\x47\xfe\x8d\xf3\x84\x2a\x55\x63\x79\x05\x42\x60\x1a\x26\x0c\x5b\x26\xd4\x39\x9f\x00\x84\x7a\x46\x17\x1b\xe0\x12\x1a\x74\x5a\xd3\x6c\xca\xf4\x66\xcf\x08\x15\xcb\xf7\x1b\x61\xd2\x06\x8d\x81\x55\x07\xcd\x4e\xd3\xa7\x41\x01\xca\x35\xe0\x42\x0f\x64\x36\xc0\x57\x5e\x11\x9d\xe5\xeb\x7c\x5c\x9a\xcf\x99\xcc\xf5\x88\x45\x52\xd4\xe7\x55\xd8\xe7\x0e\xe6\xea\x69\x91\x6c\x62\xbd\x8d\x67\x4e\x8c\x70\x19\x27\xa1\x91\xbd\x90\x31\x9c\x87\xb1\x0c\xd2\xf2\xfe\xcd\xdb\x7d\x16\x9b\x40\x9a\xf5\xe6\x95\xfc\x68\xc9\xbe\x98\xfa\x9e\xda\x9e\x6f\x7c\xed\x6d\xae\xdb\xbf\x74\xee\x3d\x57\x9b\x9f\xb6\x93\xb1\x19\x98\x63\xed\xf8\x95\xa6\x3a\x5f\xd9\x0d\xa5\xb5\xb1\xc4\x72\x84\x89\x6d\x56\xa6\x1f\xc1\x7b\xa1\x91\x6f\x15\x9f\x00\x71\x6e\xe1\x39\x17\x32\x39\x24\xf6\x45\x73\x3e\x75\x46\x39\x2a\x90\x34\xd2\x39\xe4\x4e\x53\x6d\xc3\x2b\x2d\xbc\xce\x17\x75\xc3\xa8\x55\x19\x37\xa9\x89\x11\xcb\xb4\x7a\x43\x95\xfe\x90\xc6\x74\x4d\x0e\x55\x25\x6c\x52\x69\x38\x30\x28\x58\xdf\x0b\x16\x1b\x0a\x6f\xa7\x00\xdb\x23\xf7\x86\xf4\xe6\xd8\x62\x5b\x4f\x7e\x71\x80\xcc\xeb\x03\xf3\xa9\xfa\x5e\xdf\x48\x33\x27\x67\xb5\x04\xa8\x1c\x30\xb2\xad\xb7\x86\x9d\x64\xd0\x1a\x11\xec\x53\x9d\xc6\xbd\x7f\x8f\x13\x46\x45\x7d\xd0\x7e\x65\x47\xc1\x73\xed\xf7\x90\xfd\x00\xb9\x9f\x71\x23\xb2\x62\xae\x99\x22\x4e\x84\x8a\x59\xc2\xd6\xa4\x9c\xed\x19\xd0\x6a\xbf\x70\x61\x3f\xd0\x28\xd8\xea\xba\xfc\x8e\x37\xe8\x5b\x21\xdc\xa6\x70\x14\xc2\xb2\x95\x1e\xbc\xd6\x54\x1d\x15\x88\x2f\xe3\x44\x46\x77\x08\x32\x06\x78\x03\xfc\xef\x2c\x73\xd1\xef\xdc\x57\xf5\xb2\x95\xa7\xa6\xae\x2a\xa6\x9b\x37\x57\x7e\x08\x5a\x31\x6d\x9b\x09\xf4\xed\xcb\xac\xb0\x2c\xe6\xc2\xe6\xf0\x3d\x4e\x00\xad\x53\x54\x20\x6b\xa0\xe4\x39\x58\xd5\x59\x30\xd0\x06\x30\x10\xad\xca\x48\xe7\x36\xc7\xe6\xf4\xfb\xf5\xf9\x28\x07\x0d\x8a\xdd\x94\x15\x83\x4f\xc0\xf4\x89\x68\x23\x14\xce\xc6\xfc\x99\xa6\x96\xaf\x2d\x79\x32\xa4\xb9\x90\xee\xbb\xdc\xa4\xb5\x83\x86\x38\x1e\xdc\xdb\xb7\x36\x19\xa1\xb8\xda\xf8\xf0\x9a\x82\xaf\xb6\xf2\x32\x89\x36\x20\x99\x65\x70\x13\xaf\x76\xd8\x54\x53\xf4\xc4\x4f\x64\xb6\x56\x81\x39\x5c\xe7\x37\x67\x55\x6d\x6d\xc8\x48\x9f\xeb\x63\xd7\x56\x53\x88\x0c\xf5\xf2\xaf\xf4\x09\x25\x33\xae\xb4\xcc\xac\x6b\x0d\x8a\x87\x65\x14\x2a\x94\xd6\xc7\x80\x1d\x26\x1a\xee\xdc\x77\x81\xd0\x34\x65\xd4\x17\x1b\xb2\xbc\x09\xaa\x05\x65\x2c\x92\x59\x5c\xdb\x31\xa7\xdd\xd7\xca\x52\xb5\x9f\x3f\x40\x86\x68\x42\x95\xbe\xf5\x7d\x30\x02\x42\x43\x6a\x5c\x16\x7f\xec\x10\x8b\xd1\x38\xb8\x19\x29\x8a\x9b\x92\x50\x81\x56\x8d\xfd\x64\xf0\xed\x42\x46\x31\x36\x94\xe6\x76\x1a\xd7\xbd\x97\xdc\x82\x21\x3e\x4e\xcf\xe7\x4c\xa9\x8d\xe9\x4e\x95\x20\x0d\xc0\x09\x26\x1e\x27\xd8\xbe\xee\x98\x3d\x0a\x08\x18\x8e\xe9\x50\xc1\x96\xeb\xb7\x1a\x01\x31\x01\x0d\x0a\xfe\x58\xed\xb5\x64\xe9\x8c\xaa\xa6\x83\xf1\xa7\xc8\x07\x1a\x37\x3e\x0e\x0d\x7b\x93\x31\xaa\x36\x25\x6c\x56\xe6\x76\x9c\x71\x36\x21\xe7\x74\xce\x92\x73\xaa\x0e\x39\xb9\x40\x01\x86\x84\x0d\xa7\x43\x72\x74\x13\x78\x5b\xdf\x49\xfd\x76\x53\xc1\x86\x2d\x18\x05\x4d\x4e\xf4\x83\x9e\xe5\xbd\x95\x84\xed\x27\x77\xcf\x33\xbb\x77\x0f\x37\x9c\xd0\x67\x71\x36\x37\x67\x1d\xaf\x3b\x8f\xe5\x93\x98\x67\x60\xf1\x8b\x76\x3d\x91\x5b\x52\x2a\xd7\x9d\xc2\xe7\x7c\xfe\xb6\x0c\xc9\x37\x31\xaa\x35\x99\xac\x8c\xee\xb6\xa4\xb9\x82\xd9\x3f\x0c\xb0\xc3\xca\xfc\x5c\x19\x15\xec\x90\x62\xcb\xd3\xa6\xfc\xdb\x05\x5c\x7b\x7f\x83\x5c\x3e\xd8\xcc\x85\xf7\x85\x13\x88\xc1\xd1\x62\x76\xc0\x63\x06\x60\x5c\xb8\xaf\x5a\x5b\x87\xb5\x01\xd8\x7d\x31\xb1\x55\xce\xec\x33\xa5\xfd\x71\x0c\x75\xe4\xd8\x02\xab\x36\x42\xc2\x07\x23\x82\x29\x73\x28\x4e\x36\x7c\xbe\xa1\x42\xd5\x4c\x99\xda\xae\xe8\x6e\x55\x62\xc9\xf6\xa5\x75\x0f\x6d\x5a\x60\xbc\x9a\xea\x6c\x0d\x74\xe2\x16\xca\xda\x76\x8d\xa7\x45\x63\x5b\xc5\xbf\x96\xed\xd5\x1b\x70\xab\x57\x05\x79\xd8\xbc\x72\x03\x44\x1a\x1d\xc3\x91\xa1\xc0\x11\xa0\x4f\x23\xed\xb6\xe4\xa9\x6c\xbf\xbd\xa9\xd2\x40\x08\x37\x2c\xef\xf0\x43\x0d\x2b\xcf\xf9\xe1\xe6\x7c\x2b\x8e\x47\xe3\xf6\x9e\x01\x28\xc9\xd6\x0d\xf4\xb0\x70\x09\x78\x6d\xdb\x75\x4f\xbf\xdf\x9a\xc0\x42\x6d\xdc\x63\x0f\x84\x0f\xa3\x58\xb6\x60\x71\xc9\x53\x67\xb1\xe5\xcb\xbf\x05\x7e\xdb\xa2\x7d\x3b\xed\xe4\x1f\xff\xfc\xe2\x8b\xc1\x60\xf0\x45\x11\x9b\xf5\x8a\xd0\x94\xb3\x4f\x9a\x61\x04\xde\xf0\xee\xdf\xa0\x60\xcf\xe2\xe5\x17\xb0\xe1\xc8\x39\x58\x9b\x9d\x99\xf5\xc2\x67\x10\x7e\xe1\xf2\x40\xcd\x47\xa8\x10\x52\x87\xb1\x48\x91\x14\x3a\x93\x49\xc2\xb2\xc1\x94\x89\xe1\x5d\x3e\x66\xe3\x9c\x27\x31\xcb\xa0\x71\xf7\xe9\xc5\x8b\xe1\x37\xc3\xaf\xbe\x20\x3e\xeb\xd3\x48\xf6\x4a\xd3\x79\xfa\x0a\x12\x3f\xbe\xb0\x3b\xce\xe1\xc2\xa5\x09\x15\x6a\xe8\xc3\xbc\x87\x91\xcc\x98\x34\xff\x9b\x7f\xa1\x52\x16\x99\x6f\xe3\x41\x23\xb5\xcf\x58\xd3\x99\xed\xa2\x05\x54\x2b\xa6\x69\x40\x64\x32\x87\x7f\xe3\xd0\x2d\x90\xdd\x75\x62\x51\xf1\x12\xae\xf4\xf7\xd5\x3b\x6f\xb8\x42\x76\x99\x26\x79\x46\x93\x72\x57\xe1\x86\x9a\xc9\x4c\x97\xa0\x60\x07\x84\x23\x6b\x54\x5c\x4c\xf3\x84\x66\xa5\xb7\xbe\x70\x31\x0f\x85\xb9\xce\x70\xc9\x45\x29\x96\x6e\x50\x0a\x96\xe5\x42\xb3\xec\x5c\x26\xf9\x3c\xb4\x8e\x0d\x56\xe5\xca\x09\xcf\x94\xb6\x48\x7b\x65\xa7\x42\x9d\x5c\x0c\xdf\x0f\xf6\xe8\xdf\x94\x14\xe0\x2e\x24\x43\x33\xdd\xc3\xf5\x2f\xfd\xf8\xe2\xe7\xe0\x3d\x5c\xc3\xb2\xbc\x5a\x7b\x4a\x6a\x7a\x4c\xd3\x34\x93\x0b\x8a\x38\x81\x1b\xfa\xe2\x9e\x5b\xf9\xec\xd9\xea\x8d\x35\xdf\xae\x6f\xb2\xe4\xa3\x0b\x9b\x2c\xdd\xd0\x35\x18\x8a\xf8\xf0\xe2\x25\x4d\xd2\x19\x75\x79\x86\x2a\x9a\xb1\x39\x2d\x16\x49\xa6\x4c\x9c\x5d\x5f\x7d\xfc\xd3\xa8\x72\xa3\x1e\x55\xd1\x6c\x39\x9f\x5a\x17\xa0\xf6\x53\xa7\x8b\xf9\xd4\x88\xe2\x04\xac\x74\x73\x45\xc8\xab\x17\xea\x8c\x54\x8e\x67\xbc\xf2\xb3\x99\x9d\xe0\xa7\x75\xc2\x55\x40\x64\x2a\x84\xae\x5c\x53\xac\x08\xf8\x2c\x8d\xcc\x6e\x78\x16\xdb\x39\x2b\xa2\x77\x9c\x9b\xa7\x18\xb4\xb0\x63\x1a\x12\xb3\x19\x59\xe6\xb1\x98\x30\x8d\x53\x93\x20\xff\x10\x5b\x03\x73\x05\xe6\xc9\x68\xa6\x34\xc4\x2d\x64\xc2\x15\xf6\xed\xfb\x82\xe4\x19\x33\xed\x96\x33\x18\x5d\x4a\x46\x4d\xd9\xb3\x29\xd7\x8e\x84\x46\x72\x3e\xcf\x05\xd7\xcb\x53\xa0\x86\x7c\x9c\x9b\xd5\x38\x8d\xd9\x82\x25\xa7\x8a\x4f\x07\x34\x8b\x66\x5c\xb3\x48\xe7\x19\x3b\xa5\x29\x1f\x40\x67\x05\x06\xe0\xcc\xe3\x3f\x78\x3a\x5e\x55\x3a\xd7\x72\x98\x3a\x19\xa1\x3c\xd7\x80\x4b\xc7\x83\x82\xe3\x58\x22\xb9\x84\x7e\x0a\xc8\xbc\x97\xa3\xdb\xc2\xc5\x88\x78\x45\x30\xc3\x81\x93\xad\x98\x6c\x33\x51\x50\xa9\xc6\x02\x91\xbb\xd4\x4e\x9f\xd0\x69\xfe\x88\x12\x6e\x74\x12\x95\x8f\xe7\x5c\x2b\x17\xeb\x88\x81\x83\xe7\xc0\x41\x00\xfc\x12\x2d\x35\x43\x72\x25\x0a\xfd\xfe\xc1\xa7\x1a\xa2\x82\x06\x66\xfa\x9a\x4f\x76\xc8\x00\x57\x5f\xa8\x51\xa4\x1c\x8b\x5a\xbb\x3a\xc1\x19\x1f\xa5\x2c\xf2\xa7\xc1\x9f\xe9\x33\xc4\x74\xb7\xc0\xff\x3e\x16\x53\x62\xd5\x68\x78\x79\x25\xa4\x60\x83\x5e\xb7\x5e\x97\x1b\x90\x1a\x7a\x5a\xbe\x55\x13\xbb\x30\x68\xc6\x46\xc8\x16\x85\xcc\x7d\x7a\xbb\x1d\xc8\xf1\x06\xab\x1d\x03\x16\xbf\x67\x18\x36\x1f\x03\x74\x65\x11\xce\x2d\xe4\x28\x04\x81\xc2\x66\x66\x7b\x67\x0e\x54\x11\xf1\xeb\xdf\x52\x91\xd3\xa4\x36\x80\x6d\xa3\x7c\xe7\xe6\x66\x3d\xbe\xc2\x3a\x9c\xdd\xf5\x53\x77\x50\xac\x86\x8d\xbd\xb7\xf9\xd2\x1b\x01\x36\xd7\x05\x78\xe1\x6e\x5c\xff\xde\x3a\x54\x93\x02\xe7\x7e\x9d\x4b\x73\x9f\x18\xa4\x5e\x78\xa6\x56\xc2\x46\x90\x81\x6e\x0e\x1d\x51\x9a\xa5\xaa\x00\xa9\xd0\x92\x44\x72\x9e\x26\x4c\x97\x79\x2f\x04\xe5\xb6\x8b\x51\xaa\xc6\xdc\xee\x78\x52\x2d\x72\xca\x68\x8d\xbf\x76\x80\x96\xdd\x36\xe7\x4f\x6b\x26\x72\x43\x85\x47\x25\x4c\xf2\x35\x65\x5d\xcb\x47\x72\xfd\xbb\x21\x52\x22\x66\xa3\x96\xab\x11\xb9\x18\x13\x07\x7f\x1c\xdb\xc0\xd4\x38\x48\x5b\x5b\x1f\x5a\xb2\x67\x9c\xce\x7a\x59\xa5\x7e\x98\x45\x42\xca\x4a\x35\xd4\x35\xef\x6f\x55\x0b\x21\x61\x6f\x53\x34\x5e\x99\x93\x5f\xd9\x09\xcd\x2c\x42\x0c\x25\x29\x67\x18\x3b\xef\xc5\x21\x98\x30\x46\x63\xfb\xa3\x61\x78\x19\xf3\xf1\xe1\xd6\xde\x0d\x0d\x14\xe2\x12\xd4\x0c\xa2\x18\xa8\x0e\x68\x33\xa7\xdf\x49\x9b\x4c\x68\x4b\x9b\xc0\x4e\x9e\x43\x48\xbb\xab\xe0\x11\x33\x65\xb6\xe7\x08\x8c\xe7\x73\x2a\xf8\x84\x29\x3d\xf4\x18\x21\xea\xc7\xaf\x7e\x1e\x86\xa9\x01\x7d\x07\xb1\xee\x85\x0a\xbb\x35\x80\x94\x9b\xc1\x14\x20\x9f\xbe\x48\x69\x2a\x5d\xa5\x93\x7b\xe8\xac\xa6\x77\x86\x7e\x63\x67\x73\xa3\xcb\xdc\xb1\x57\xa4\x87\xaa\x89\xff\xf4\x3f\x8c\x18\xfe\xcf\x1e\x39\xbe\x87\x90\xe7\x9e\xf9\xb3\x87\x1f\xf4\x32\x60\x58\xa8\xa7\xf8\x30\x06\x4a\x67\x7c\x3a\x65\x99\xf5\x1d\x81\x59\x15\x6a\x9a\x70\x28\x0b\x5a\x3c\x2c\x6c\x85\xd6\x02\xf9\xb3\xda\x91\x1f\xbf\xfa\xb9\x47\x8e\xcb\xe3\x22\x5c\xc4\xec\x13\xf9\xca\xbb\x1f\x52\x19\x9f\xd8\xa8\x2c\xb5\x14\x9a\x7e\x32\x6d\x46\x33\xa9\x98\xc0\x90\x6f\x2d\xb1\xcc\x8c\x92\xe0\xd9\x4a\x92\x81\xad\x85\x4f\xee\x31\x6d\xd8\x4d\x25\xa6\xe1\x02\x70\x52\x59\x42\xc6\x92\xba\xf0\x35\xb3\x6c\x53\x30\xad\x18\xe9\x0b\xeb\xd0\x60\x62\x43\x88\xd5\xa4\x72\x5c\x24\x43\xfa\x66\x54\x80\x9b\xc5\x96\xaf\x31\xf2\xd4\x70\x9d\x4f\x72\xeb\x8e\xdf\x64\xd2\xaa\x11\x5b\x9b\x94\x1d\x7e\x24\xa1\xb0\xf1\x10\x37\x19\xcc\x9e\xb4\xb2\xf2\x5e\x23\xda\x18\x7d\xb4\x3a\x2c\x0c\x39\x7a\x84\xb1\x41\xfd\xd9\xd3\x9d\x87\xe6\x44\xea\x36\x9c\xe0\x68\x84\x07\x3e\xaa\xbe\x6d\x8e\x0b\x46\x1c\x5a\xa5\x35\xa0\x70\x73\x1a\x23\x09\xa4\x62\xf9\xe0\xdb\xd8\x4c\x20\x78\x6d\xa3\xe5\xc0\xda\xe5\x06\x54\xc4\xe6\xdf\x8a\x2b\x6d\x7e\xdf\x79\xc6\x36\x18\x42\xcb\xb3\xf4\xe1\xea\xe2\x71\x36\x77\xce\x77\x3c\xad\xe3\x5c\xc4\x09\x7b\x23\xe5\xdd\x9a\x54\xe0\xd2\x80\xbe\x0d\x9f\xf6\xde\x39\xd4\xd2\xb8\x18\xf8\x18\xda\x40\xcb\x25\x69\x9e\x20\x79\xcd\x45\x4a\xa3\x3b\x3a\x65\xf6\xa3\xc0\x46\x6c\x82\x3f\x6a\xca\xa0\x0a\x1c\x14\xdd\x6e\x6d\xef\xd1\x1a\x60\xfb\xb9\xa6\x9b\x8e\x2f\x5a\xd8\x01\xea\xfa\xbd\xbd\xbf\x07\xf1\x2b\x97\x24\xdc\x1b\x36\x59\xfb\xa0\x87\xd8\x5f\x97\x7f\x32\x80\xd2\x63\x6b\x6f\x3a\x38\xe6\xda\x07\xb6\xfb\x10\xab\xfd\x6c\x1a\xdd\x54\x79\xcd\xad\x88\x23\x18\x76\x96\x4b\x8f\xc1\x2f\x76\x15\xa0\x5a\xdc\x3d\x55\x40\x81\x92\x85\x8d\xcc\x79\x14\x48\xa4\xed\x62\x73\xcd\x78\x77\x10\x9e\xc3\x8e\x6f\xf5\xdb\x6d\x15\xa4\x6b\xfa\xd4\x89\xd3\x9d\x38\xfd\xcc\xc5\xe9\x56\x67\x60\x7b\xe8\xc1\xe7\x21\x60\xb7\x1a\xf4\xf6\x68\xfb\x67\x29\x72\xb7\x1e\x63\x83\xe0\xff\x67\x2b\x84\xb7\x1a\x6c\x43\x81\xbc\x6e\xc8\xbf\x65\xb1\xbc\xd5\x1c\x6e\x8d\x87\x79\x86\x82\x7a\xe3\x01\x6e\x4e\x0a\xa9\x19\x5f\x90\x8f\x51\xb1\x03\x9b\x4e\x63\xf9\x73\x6f\xa7\x0d\xc5\xe4\x6d\xe2\xd4\x41\x10\x60\x0f\x16\x7d\xd7\x28\x6c\x6e\x2d\x2c\x31\x5e\x4d\x63\xe6\xda\x64\x8b\xe0\xb5\x21\xce\xbc\x88\x2b\xde\x3b\x6d\x04\xaf\x16\x99\x55\x4d\x13\x31\x8a\x61\x37\x49\x24\x69\x31\x64\x23\xc3\xa7\x99\x1c\x37\x45\xac\x79\x80\x51\x35\x8c\x32\xdc\x33\x9c\x1d\xb2\xf3\xfd\xfa\x1e\x6c\xb0\xdb\x92\x38\x6a\xfa\x8e\x98\x76\xa5\x48\x32\xbf\x1e\x47\x0a\x16\xf9\x21\x7a\xba\x73\xf0\x65\x20\x56\x63\x27\xfb\xce\x83\x79\x9b\xe5\xac\x4f\x5e\xd3\x44\xb1\x3e\xf9\x20\xee\x84\xbc\x3f\x5c\x7f\x37\x23\x32\xd4\xf4\xf6\xd6\x62\x2f\x34\xc8\x15\x6a\xdc\x95\x42\xbb\x6f\x48\xec\xaf\xfc\x0b\xce\x42\x63\x35\xf4\x41\x2e\xf8\xaf\x79\x59\x51\xf1\x4e\xa6\xe3\xaa\x0a\x73\x3e\xfa\x08\x9b\x03\xd5\x6d\x55\x02\xb5\x35\x37\xd5\xfa\xb0\xea\x26\x79\x50\x1b\x15\xd5\x72\x62\xb8\x51\xf4\xcb\xaa\x56\x62\xe1\x09\xab\x66\x99\x34\x4f\x92\x21\xb9\xd2\x47\xca\xf4\x81\x47\x34\x49\x96\x46\x6b\xa9\xd4\x2c\xdb\x2f\x83\xab\x01\x83\x58\x39\x6c\x88\xb8\xc2\x17\x2c\x78\xdd\x4d\x34\x1a\x9c\x58\x6c\xc7\xb1\x1f\x64\xe2\x86\xea\x5c\x35\x5d\xbb\xb1\x8f\xbb\x8d\x12\xae\x7f\x31\xab\xb6\x51\xd4\x35\x61\xd3\x08\x46\x26\x50\xd4\x81\x6a\x58\x9e\x1d\xfb\x5c\xf6\xe1\x3e\x9e\xc3\x7f\xb3\xfc\x74\x18\x63\x63\xe0\x81\x2f\xf2\xf8\x36\x08\x5f\x05\x91\x63\x9f\x58\x94\x07\x31\x5e\x61\x0c\xc7\x6e\xb6\xc6\xc3\xe6\xbe\x3e\x49\x62\xea\xe3\xe6\x94\x1e\x3a\x75\xd2\xef\x80\xe6\x51\xdd\xcd\x44\x85\x03\xc4\x9e\x37\x01\x76\x6a\x8e\x4c\x54\xb7\xed\x81\x2b\xe2\x53\x63\xa6\x82\x11\xae\xec\x6f\x43\x4f\x28\x20\xb0\x18\x26\x63\xab\x22\x00\x4e\xd5\x4c\xee\x4c\x19\x9b\xe6\x27\xbe\x75\xf2\x9b\xf9\x20\xc8\x76\x83\x15\xd9\xce\xf2\xbf\x42\xb6\x83\x12\x42\x45\x28\x0d\x30\xc9\x39\x5d\x42\x68\xda\x3c\x95\x99\xa6\xe8\xe0\xc8\x45\xcc\x32\xa5\x29\x62\x94\xb8\xbc\xbc\xd4\x8c\x79\x46\x15\xe1\x5a\x91\xc8\x26\x19\xe2\x82\x3d\x50\x26\x63\x30\xd9\xd7\xe6\x05\x2f\x22\x94\x3e\x8e\x7c\xb5\xb4\x30\x1b\x57\x61\x73\xc7\x12\xba\x21\xb0\x6a\x5f\x3a\x3b\xd2\x2c\xad\xd2\xd5\x60\x10\x02\xc4\xf1\x05\x8f\x31\x18\x89\xa5\x84\x8b\xc3\x10\xd5\xed\x0e\x1c\x74\x4c\xac\x3f\x56\x03\x6f\xa5\x59\xfb\xc0\x06\x8d\x76\x3b\x51\xf7\xdf\xdf\x93\xd0\xad\x8f\x71\xc3\x6b\x65\x3d\x5c\xde\xc4\x86\x75\x09\xa2\x6c\x21\x8e\x53\x67\x56\x06\x5a\x36\x5a\x1d\xf2\xd8\xf8\x34\x5b\x92\xf6\xb6\x42\xa8\x0c\x82\x90\xbf\x86\x8f\x81\x49\x71\xe3\xb3\xdb\x32\x00\x1f\x1b\x11\x67\x4f\xac\x93\xe2\x72\xce\x9f\x83\x34\xb6\xdd\x3e\xde\xb0\xa1\x62\x69\x0e\xdc\x5c\x03\xcb\x76\xc3\x36\x1b\xa5\xee\x1d\x3e\x61\x8d\xa5\xe5\x84\xdd\x3a\x6e\x92\xd2\x4c\xf3\x28\x4f\x68\x56\x9c\x7d\x20\xcf\x2b\x19\x47\xad\xfb\xac\x34\xcd\x74\x23\x78\x84\x91\x7b\xd2\xa3\x25\x02\x54\xc2\x8c\x09\xef\xb6\xc3\x04\x2e\x32\x66\x53\xc3\xf6\xd2\x34\x59\xba\xec\x80\x22\xf6\x3c\xe1\x4a\x17\xc5\x03\x81\x8b\x37\x0d\x62\x68\x0d\xb4\xf0\xbb\xce\x80\x93\xc9\x3c\x92\x62\xc2\xa7\x8f\x97\xff\xf6\xfe\xcd\xdb\x73\xf8\x24\xfc\x56\x64\xbf\xf9\xdf\x57\x72\xdf\x8a\x4e\xc2\xcf\x45\x7a\x9b\xbf\x51\x24\xb7\x59\x24\x86\x9a\xcc\x36\x97\x37\xe5\xd6\x73\xc7\x8c\x29\xdf\x4d\x17\x4f\xe1\x59\xb1\x4a\xa5\x50\xdc\x48\xb3\x80\x7c\x05\x0f\x61\xdd\x92\xf7\x6f\xde\x1e\x36\x5d\xaa\xcb\x8d\xea\x72\xa3\xba\xdc\xa8\x6d\x07\xaa\x41\x6e\x94\x3f\xcd\x90\x19\xe5\x02\xee\xcc\xbf\x6d\x82\x4f\x71\xdc\x3d\x1a\x75\xd3\x8f\x6f\x96\x0f\x27\x8c\x9a\xa9\xd9\x1e\x13\xf8\xda\x3e\x58\xd4\xcf\x29\x65\xd8\x5a\x32\x03\x5a\xf4\xfb\x37\x6f\x7d\xbb\x0f\x90\xcd\x10\x73\x65\x3e\x73\x2e\x53\xce\xe2\xf3\xd1\xc7\x66\x45\x9e\x2f\xaa\x6f\x95\xb2\x31\xf0\xa6\xe9\xf9\x91\x22\x3d\x7c\x88\x9c\x8f\x3e\xf6\xdc\x40\x60\x21\x8a\x12\x5c\x3e\x1f\x8d\x50\x1d\x0a\x04\x48\xff\xfb\x04\xe3\x87\x68\xf9\xe7\xb8\x54\xa2\x48\x0a\x5b\x2f\x66\x46\x15\x19\x33\x26\x82\x46\x51\x79\x75\xe5\x76\x01\xc4\xd3\x46\x18\x01\xf6\x36\xc2\xf5\x17\xf1\x08\x43\xf2\x83\x11\x6d\x32\xc6\x84\x19\x46\xdc\x87\x25\x40\x6c\x5b\x06\xbc\x17\x9d\x71\xc1\xc0\x54\x0f\x46\x04\x00\x3c\x6b\x3a\xb9\x39\xd7\xa3\x2e\xd3\xab\x41\xca\x52\xb1\xd3\xd7\x42\xbf\x3c\xe0\x6e\x7f\x0c\x8b\x70\xaf\xb0\x03\xfb\xa3\xe2\x1c\x84\xb0\x89\x04\x23\xd4\x9c\x6d\xed\xdd\x5d\x81\x18\x5d\xc0\xf8\x9f\x5d\x5f\x79\x00\xd8\x21\x19\x0c\x06\x36\xd2\x4b\x67\x79\xa4\x11\xd4\x49\x63\x09\x22\xd3\x6a\xcc\xa1\xae\x72\xae\x18\xd8\x70\x5c\xa5\x35\xbb\x3b\x31\x3c\x0b\x42\x29\x87\xd6\xee\x54\x4c\xc5\x90\x94\xa3\xed\xcc\x34\x90\xd7\x52\xda\x15\xc2\x0f\xfe\x03\x06\x7a\x7a\x4a\x6e\x2a\xb6\xed\xb1\x11\x5c\x6d\x69\x13\x50\x00\x26\x52\x1e\x95\xad\x5c\x6c\xe8\x5e\xfe\x5e\xc8\x7b\x51\xd7\x05\xf8\x26\xcd\xd8\x2b\xf2\x53\xef\x6c\x41\x79\x62\xf6\xf1\x4f\xbd\x3e\xf9\xa9\x77\x6d\xa3\x8d\xb9\x98\xfe\x64\xab\x15\xfc\xd4\xbb\x60\x50\xc8\x3b\xfe\xa9\xe7\x9a\xfe\x17\xa8\xc1\xf6\x96\x65\x53\xf6\x3d\x5b\xfe\x07\x34\x58\xba\x35\xc2\x9a\x6d\xcb\xff\xc0\x92\x6d\xee\x9e\xa1\x60\xb7\xcb\x94\xfd\xc7\x9c\xa6\xa5\x1f\xdf\xd2\xb4\xd4\x50\x10\x5c\xf1\xe3\xcf\x86\x05\x2c\x5e\x0e\x8b\xa5\xfe\xe5\x6f\x4a\x8a\x57\x3f\xf5\x02\x54\x4e\x39\x37\x5b\x26\xd5\xcb\x9f\x7a\xa4\xd4\x83\x57\x3f\xf5\xa0\x0f\xee\x77\xd7\xe9\x57\x3f\xf5\xcc\xd7\xcc\xcf\x99\xd4\x72\x9c\x4f\x5e\xfd\xd4\x1b\x2f\x35\x53\xfd\x97\xfd\x8c\xa5\x7d\x73\xe2\xff\xa3\xf8\xc2\x4f\xbd\x5f\xc8\x4f\xc2\x75\x1a\x02\x06\x70\xa5\x15\xf9\x67\x7d\xc9\x8b\x03\x58\xbb\x56\x5d\x08\x6b\x1f\xdd\x06\x7b\x85\xe6\xf0\x5d\x8c\x62\x7b\xd6\x9d\xde\x19\x02\x74\xf5\xc5\xa2\x20\xe5\x7e\x81\x1e\xf6\x70\xfb\xca\xf2\x5e\x57\x05\x8b\x32\x2a\xa7\x45\xab\x18\x5a\x19\x0f\x09\x16\x3d\xc4\xd4\x42\x23\x47\x81\x63\x1c\x8a\xb1\x08\x92\x2b\x27\xd3\x95\xb5\x5f\x43\x58\x90\x20\xd8\x66\x40\x2c\x8c\x22\x96\x6a\x73\xea\x1e\x09\xaa\xb4\x1d\xe0\xe7\x7c\xc5\x68\xbf\x7b\x40\x06\x4e\xb5\xb5\xde\x53\x57\xb0\x17\x87\xb5\xe7\xe0\xe7\xf4\xd3\x1b\xa8\xdb\xf4\x8a\xfc\xe9\xab\x3f\x7f\xf3\x6f\x6b\x1e\x44\xa2\xc9\xe2\xef\x36\x66\x24\xd7\x4c\xc3\xea\x8b\x55\xdb\xeb\xd0\x09\xa7\xc3\x22\xdd\xb9\xa8\x91\x5a\x8e\xc6\x51\x4c\x93\x31\x38\xa6\xf2\xd4\xcc\xcb\x6b\x97\x84\x2a\x22\x8c\x14\xac\x6d\x8c\x7b\xe2\x9e\x2c\xc9\xcb\xaf\xb0\x5a\x11\x7c\x7a\x85\xac\xff\xf8\xe9\xe7\x61\x4d\x97\xb9\x22\xff\xab\x5f\xe9\x8f\x11\x88\x72\xe0\x88\x66\xe3\xa0\x0f\xda\xe8\xb2\x36\x96\x78\x0d\x9b\x64\xbe\xbf\xdb\x16\xae\x45\xe5\x8e\x6f\xbe\x5e\xbf\xbe\xae\xb0\xfa\x8b\x43\xb8\x0b\xad\x3b\xd0\x4b\x09\x14\xd1\xe9\xe9\x1c\x52\xf5\x83\x88\x90\x70\x6b\xeb\x76\x31\x3d\xe4\x3a\x93\x71\x1e\x19\x5d\x4d\x4e\x5c\xc0\x79\x14\x12\x28\x28\x19\x63\x4e\x03\xaa\xe0\x84\x7d\x32\x93\xce\x8a\xda\x41\x46\x1f\x66\x54\x70\x31\x55\x05\x3e\x23\x10\x10\xe4\xc6\xf7\x33\x06\xac\x47\x87\x95\x36\xa1\x57\x8a\xc7\x10\x0d\x4f\xc9\x34\xa7\x19\x15\x9a\x61\x0d\x06\xac\xb6\x89\x0a\x68\x41\xf2\x68\x00\x79\x69\x4f\x23\x1e\x55\x24\x56\xa6\x8b\x56\x55\xc4\x2a\xad\x07\x3b\xaa\x2f\x5f\x7c\xb5\x71\xc9\xfd\x73\xeb\x2d\xf0\x54\x6b\x96\x89\x57\xe4\xff\xfb\xf1\x6c\xf0\xff\xe8\xe0\xef\x3f\x1f\xdb\x7f\xbc\x18\xfc\xaf\xff\xee\xbf\xfa\xf9\xcb\xe0\xcf\x9f\x4f\xfe\xf3\x8f\x87\xb0\xc7\xaa\x83\xc6\x4c\x35\x9a\xb4\xed\xb5\x60\x7a\xe6\xab\x9b\xea\x6d\x0d\x48\x0f\xba\xb4\xf9\x19\xdb\xdd\x4d\x1a\x48\xb3\x49\xd2\xd5\x50\x2d\xa3\x5b\x15\xfb\x0c\x28\x9e\x11\x59\x87\x56\xfc\x1d\x46\x72\x7e\x1a\x98\x1f\x8c\xdc\xfd\x96\x8a\x25\x29\xc8\x1a\x0a\xab\xd5\x9d\xae\x20\x7f\x8c\x46\x99\x54\xaa\x64\x42\xbe\x63\xc4\x4b\xb4\x48\x2c\xc7\x2c\xa2\x20\xa8\x67\x63\xae\x33\x9a\x2d\x03\xbd\xc4\x61\xd7\xe7\x8a\x4d\xf2\x84\x1c\x2b\xc6\xc8\x50\xc8\x98\xad\x52\xd7\x13\xa4\xa1\x74\xcc\x13\xae\x21\xd9\x23\x66\x46\x0f\x4f\xb8\xd5\x0f\x9c\x63\xda\x15\xb7\x9d\xb2\x4f\x84\x6b\x5f\x60\x9e\x2b\x72\x1c\x0b\xf5\xf2\xe5\x57\x7f\x1a\xe5\xe3\x58\xce\x29\x17\xaf\xe7\xfa\xf4\xe4\x3f\x8f\x7f\xcd\x69\x02\x89\x29\xef\xe8\x9c\xbd\x9e\xeb\xbd\x62\xc0\xca\x6c\xf1\xe5\x37\x0d\x4e\xd1\xf1\x8f\x78\x56\x7e\x3e\xfe\x71\x60\xff\xf5\xa5\xfb\xe9\xe4\x3f\x8f\x7f\x1a\x6e\xbc\x7f\xf2\xa5\x19\x43\x70\x02\x7f\xfe\x71\x50\x1c\xbf\xe1\xcf\x5f\x9e\xfc\x67\x70\xef\xe4\x8f\x9d\x05\xbe\x30\xa9\x07\x3a\xd9\xa3\x59\xe2\x6d\x1b\x5e\x99\xaa\x5a\xe4\xab\xf7\x57\x2d\xf3\x2b\x9d\x47\x0b\x7d\x0d\x36\x5d\x54\xfa\x48\x60\xc3\xaf\x36\xd1\x10\xa8\xee\x50\xe6\xfc\xea\x18\x51\xd2\xc5\xbd\xe1\xcd\x00\x40\xeb\x0d\xf1\xf9\x65\xe5\xf9\x5f\x6c\xde\x47\x60\xd4\x02\x4b\xe7\xb2\x1c\xb7\x22\xc1\x32\x54\x46\x82\xf1\x69\x80\x35\x76\x9f\xce\x47\xd0\xf9\x08\x3a\x1f\xc1\xf3\xf0\x11\x54\x8f\x3c\xf8\x0a\xa0\xd8\xa9\x0a\x2c\xcd\x34\x9e\x73\xb1\xe6\xf8\x6f\x3e\xf7\x96\x3a\xf4\x49\x2a\x8d\x2c\xc3\x21\xaa\x5a\x2e\x58\x96\x71\x88\x66\xc3\x77\x32\x56\xd4\x16\x0c\x23\xcb\x0f\x64\xa1\x8d\x59\x9a\xc8\xe5\x7c\x1d\x22\xf9\xc3\x04\x0a\xdb\x41\x1e\x38\x36\xb9\xb3\x0a\x77\x56\xe1\xdf\x8b\x55\xb8\x33\xf5\x76\xa6\xde\xce\xd4\x5b\x73\x75\xa6\xde\xce\xd4\xdb\x99\x7a\x3b\x53\xef\xca\xd5\x99\x7a\xed\x33\x9d\xa9\xb7\x33\xf5\x3e\xb6\xa9\xb7\xb8\x54\x09\xc8\xf7\x91\x74\xce\x26\x71\x52\x2b\xda\xbe\x2d\xa9\x6a\xf5\xfd\xb2\xda\x5e\xa3\xeb\x73\xad\x5c\x82\x21\xa8\xf5\xc3\xb0\xf4\xda\xe3\xd6\x99\xef\x82\xae\x3a\xf5\xba\x53\xaf\xbb\xa0\xab\x4e\x13\xef\x34\xf1\x4e\x13\xef\x34\x71\x7f\x75\x9a\x78\xa7\x89\xaf\x5b\xf2\x4e\x13\x77\x57\xa7\x89\x77\x9a\x78\xcd\x52\xfc\x36\x34\xf1\x4d\x41\x57\x13\xb3\x65\xdd\x8f\xdb\xa2\xae\x48\x18\x8e\xf3\x55\x17\x8e\xd3\x85\xe3\x74\xe1\x38\x5d\x38\x8e\xbb\x1e\x3b\x1c\xa7\x6c\x9e\xc3\x98\x99\x92\x39\x0e\xf6\x6c\x9a\xc9\x05\x8f\x99\xaa\x04\xef\x78\x00\xbe\x80\xcb\xcc\xa1\x64\x5f\x11\x90\xc3\x1e\x27\x1c\xa7\xb3\xdd\x75\xb6\xbb\xce\x76\xd7\xd9\xee\x3a\xdb\x5d\x67\xbb\xeb\x6c\x77\x9d\xed\xae\xb8\x3a\xdb\x5d\x67\xbb\x5b\xb7\xe4\x9d\xed\xce\x5d\x9d\xed\xae\xb3\xdd\xd5\x2c\xc5\x6f\xc3\x76\x17\xee\xa0\x2e\x6b\xa3\x53\x4d\x3b\xd5\xf4\x33\x53\x4d\x3b\x7d\xb3\xd3\x37\x3b\x7d\xb3\xe6\xea\xf4\xcd\x4e\xdf\xec\xf4\xcd\x4e\xdf\x5c\xb9\x3a\x7d\xd3\x3e\xd3\xe9\x9b\x9d\xbe\xd9\x65\x6d\xb4\xcc\xda\x78\xff\xe6\x6d\x10\x09\x82\x11\x22\xc1\xce\x82\x5a\xdd\x80\x04\xec\x78\x72\xe7\xc5\xed\x54\xe5\x4e\x55\x7e\x0e\xaa\x72\xe7\xc5\xed\xb4\xea\x4e\xab\x5e\x73\x75\x5a\x75\xa7\x55\x77\x5a\x75\xa7\x55\x77\x5a\xf5\xa6\x47\x3a\xad\xba\xd3\xaa\xeb\xae\x67\x9c\x81\xf1\xbb\x81\xbd\x05\x38\xdb\xc7\x87\xbc\xfd\xce\x17\x24\x5d\x85\xbb\x85\x7b\x6b\xa1\x6e\xb1\xc3\x70\xab\x0e\xe6\x56\xe2\xae\x5c\xc5\xb7\x75\x25\x50\x9f\x00\xdb\x16\xcb\x18\x59\xc5\x21\x17\x1c\xc4\x9e\x79\x9e\x68\xae\x99\xa0\x22\x5a\x02\x9b\x7d\xff\xe6\x2d\x99\x53\x41\xa7\x41\x25\x22\x35\x24\x57\x1a\xe8\x8d\xce\x7c\xe9\x29\x5b\x2d\xc9\xe7\x95\x84\xc5\x99\x00\xfd\xc2\xd7\x47\x02\x85\xc3\x09\x01\x2c\x06\x01\xd0\xb0\x0f\xa8\xa5\x14\x96\x51\xfa\xa2\x7a\xc0\xbb\x4c\x9b\x2e\xd3\xa6\xcb\xb4\x79\x26\x99\x36\x40\x3f\xd6\x16\xc8\x2b\x11\x99\x03\x97\x0d\x53\x2c\x61\x91\x96\xd9\xd6\x22\x79\x23\xfb\xa0\x7d\x03\xbb\x59\xea\xda\x91\xda\x4c\x77\x1a\xf4\x74\x5b\x6f\x61\x15\x8c\xb0\x73\xf9\x29\x05\x0b\xe2\x1a\xbb\xef\x4a\xef\xab\x2f\xe1\x89\x70\x25\xfe\x12\x3a\x66\x89\x9f\x0a\x47\x09\xe7\xb8\xe5\x51\xd2\x2a\x7e\x01\x01\xf1\xec\xdd\xc5\xaa\x09\xbb\x3c\xc0\x75\x56\x67\xb2\xd9\xf2\xbc\xd2\xf5\xb3\x0d\xdd\xb3\x07\xdb\xdd\x01\xab\x80\x57\x3e\x91\x68\xf5\x09\x25\x77\x6c\x89\xf4\xad\x94\xbc\x65\x1e\xce\x18\x50\x43\x58\xcc\x3b\xb6\x84\x87\x2c\xb1\xdb\x22\x20\x1e\xa4\x6a\xf9\x1d\x5b\x37\x43\x78\xdf\x75\x76\xbd\x80\xd9\xa8\x3e\xf8\x1d\x5b\x6e\xba\x5d\x99\x70\x33\x0f\xde\x06\x68\x66\xde\xfc\xe0\x0d\x2e\x7e\xb2\x69\x9a\x26\x9c\x01\x35\xdb\xd8\x76\x23\x79\x9a\xf8\xa1\xb6\xe8\xa8\x5f\xca\xc0\x62\x04\x8b\x7d\xa4\x70\x61\xcd\x4e\x9f\xf1\xd4\x0a\x09\x28\x1a\x38\x56\xf6\x91\x26\x3c\x10\x43\x60\x57\x5f\x89\x3e\x79\x27\xb5\xf9\xdf\xe5\x27\x6e\x48\xb5\xd9\x0f\x17\x92\xa9\x77\x52\xc3\x2f\x07\x19\x2a\x76\xa1\xc5\x40\xad\x66\xc6\x03\x37\x88\x9c\x94\xf8\x99\x11\xa3\x26\xa5\x2c\x41\xf3\xf4\x95\x30\xea\xa0\x1d\x51\xc9\x98\x61\x9a\x98\xe7\x0a\x18\x90\x90\x62\x80\xf6\x87\xba\x36\xec\x44\xc8\xac\x34\x0f\x1b\x9a\xb3\x4d\x81\x9d\x03\xef\xa0\x04\x93\x18\x51\x94\xc4\x58\xaf\x18\xb8\xb1\x91\xa5\x79\x44\xd0\x7b\x01\x7e\x83\x26\xd3\xbb\x89\xae\xe0\xb5\x85\xba\x34\x5c\x2b\x20\x99\x6f\xcc\x01\x68\x41\x62\xf1\x79\x24\x4b\x73\x9a\x9a\x65\xfa\x87\xa1\x3e\x30\x53\xff\x24\x29\xe5\x46\xe2\x3d\x03\xe9\x3d\x61\xa5\x7b\xb6\x14\x79\xd8\x8c\x69\x81\x2b\x62\x48\xc9\x82\x26\x86\xde\x81\x7d\x9d\xb0\x04\xa9\x9f\x11\xb2\x2b\x84\xbd\x4f\xee\x67\x52\x21\x31\x43\x2b\x13\x57\xa4\x77\xc7\x96\xbd\xfe\xca\xd2\xf6\xae\x84\x75\x3f\xad\x2c\xa6\x27\xa2\x52\x24\x4b\xd2\x83\x7b\xbd\xdd\x79\xc1\x46\x62\x49\x63\x54\xff\x69\x72\xdd\x80\x9a\x6d\x5c\xb7\xb2\xf3\x78\x5d\x9d\xff\x0a\x5f\xaf\xbe\xe2\x88\x1f\x66\xec\x86\xba\x05\x3c\x49\x28\x3e\x6a\x9d\xbc\x50\x8a\x15\xcd\x1b\x58\x6f\x16\xe2\xa5\xfd\x3c\x1f\xab\x13\x5c\x59\x23\x4f\xba\xb9\x07\x4d\xad\x75\x81\x79\xa3\x90\xf3\xe8\x1a\x13\x8b\xe3\xb3\xeb\xab\xed\x95\x7d\x47\xf0\x0a\xd1\x2c\x49\xd0\x45\x6d\x64\x4e\x2d\xad\xcc\x59\x2b\xc2\xa4\x41\xfb\x81\x92\xbe\xb6\xb3\x75\xc5\x62\xe1\x2e\x88\x42\x5e\x09\xdd\xde\xd7\xdb\xca\x0b\x96\xdc\xb1\x4f\x69\xc2\x23\xae\x1d\xfd\x2e\x64\x2b\xd0\x67\xe0\x25\x20\x5c\x1c\xa4\x01\xc5\x74\xbf\x90\xd5\xb8\x22\x7c\x2a\x64\x56\xbf\x3f\x1f\x26\x76\x9d\x90\x4f\x83\xbb\x7c\xcc\x32\xc1\x34\x53\x03\x23\x63\x0d\xec\x0b\x4c\xef\x1a\x75\x80\x02\xf2\xa6\xba\xba\xe1\x83\x37\xed\x65\xe4\xf5\xf2\x0a\x3a\x48\x3f\xa0\x96\x72\xb0\xc8\x84\xd2\x28\x03\x47\x74\x85\xc7\xd5\xed\xd0\xc0\xc9\xde\x85\x3c\x74\x21\x0f\x5d\xc8\x43\xf5\xea\x42\x1e\xaa\x57\x17\xf2\xe0\xaf\x2e\xe4\xa1\x0b\x79\xe8\x42\x1e\xba\x90\x87\x2e\xe4\xa1\x7a\x75\x21\x0f\x78\x75\x21\x0f\x5d\xc8\x43\xcd\xf5\x79\x84\x3c\x14\x57\xa0\xb5\x6e\x55\x40\xdf\x14\xcf\xa2\x74\xa2\x5d\x50\x81\x3b\x99\x65\xd1\xb0\xaa\x92\xda\x53\x6c\xf8\xb1\x6d\xa6\xb5\x75\xa7\x89\xd0\x25\x9a\x5b\x53\xca\x76\x14\x34\xdc\xd7\xbb\xc6\x3d\x07\x2a\x0d\xea\x39\xda\x4b\xc8\x8a\x85\xef\x86\x4d\x5a\x1a\xf8\x6e\xd8\x84\x64\x6c\xc2\x32\x26\x22\xe6\x26\xa6\x6c\xd7\xb3\x6e\x5f\x6f\xf8\x7b\x00\x1f\xde\xfa\x40\x81\xda\x21\x18\x61\xdf\x06\x07\xb8\xfd\x68\xc7\xb0\xd6\x21\xb1\xf5\x48\x03\x3f\xbe\xa6\x7a\xd6\xa8\x07\x47\x57\x76\xda\xc0\x7a\x0f\xfe\x94\x94\xb3\x88\x95\x62\x11\x40\x8e\x63\x34\xb6\x3f\x1a\xc1\x27\x63\xf6\x5e\x1f\x25\x0e\xeb\xb3\x28\x62\x15\x8c\xd0\x44\xa8\x21\xc4\x3c\x26\xff\x67\xf4\xfe\xdd\xe9\x77\xd2\xca\x0a\x46\x9b\x51\xb6\xd2\xc9\x9c\x09\xdd\x27\x2a\x8f\x66\x84\x2a\xd3\x35\xa3\xdf\x8e\xc0\x2c\x31\xa7\x82\x4f\x98\xd2\x43\xdb\x1a\xcb\xd4\x8f\x5f\xfd\x3c\x2c\x9b\x43\xb8\x75\x6c\x38\x8f\xbe\xdd\x00\x70\x36\xcc\x60\xfc\xbb\x20\xb4\x42\x97\x52\x19\xdb\x4e\xdf\x43\x67\x35\xbd\x63\x44\xda\xce\xe6\x0c\x98\xc2\x2b\xd2\x33\xdb\x24\xf8\xf4\x3f\xcc\xc1\xfa\x67\x8f\x1c\xdf\xcf\x58\xc6\x48\xcf\xfc\xd9\xc3\x0f\xfa\x00\x0c\xf3\x5b\xc0\xf1\xed\x87\x51\xbe\xcf\xf8\x74\x0a\xe2\x16\x44\x13\x2c\x98\xd0\x27\xc0\xdf\x26\x44\xc8\xe0\x61\x61\xed\xd4\x85\x75\xba\xda\x91\x1f\xbf\xfa\xb9\x47\x8e\xcb\xe3\x32\x22\x28\xfb\x44\xbe\xf2\x16\xe9\x54\xc6\x27\x4e\x6b\x5d\x0a\x4d\x3f\x81\x62\x30\x93\x8a\x09\xb4\xfc\x6b\x89\xa9\x4b\x4a\x1a\xe5\x93\x25\xc9\x00\x05\xcc\x98\xdc\xa3\x81\xce\x4d\x25\x3a\x75\x52\x9a\xe9\x4a\x78\xca\xed\xfb\x8b\xf7\xaf\xf0\x6b\x66\xd9\xa6\xc2\x69\xb9\x13\x2e\x68\x62\xbd\x0f\x5e\x3e\x34\x1d\xc9\x71\x91\xb4\xb4\xaa\xad\xf3\x8c\x4c\x72\x9d\x67\x6c\x58\x0d\x57\x68\xbc\xe3\xeb\x62\x45\xea\x37\x3b\xc4\x8c\x54\x0f\xda\x13\x46\x64\x34\x1e\xa2\x58\xe3\xf1\x58\x1d\xe2\xbb\x60\x0f\x6e\x1c\x62\x41\x9a\xcd\x28\x63\x19\x29\x33\xc0\x88\xa5\x5a\x9d\xca\x85\x21\x9d\xec\xfe\xf4\x5e\x66\x77\x5c\x4c\x07\x66\x93\x0d\x70\xe5\xd5\x29\xb0\x98\xd3\x3f\xc0\xff\xf6\x1a\x11\xf0\xa9\xe6\xc3\xc2\xc0\xb0\x47\x18\x1b\xb0\xcf\xd3\x9d\x87\xe6\xe4\xcb\x36\x9c\xe0\x68\xe4\x94\xbf\xca\xdb\xe6\xb8\xa0\x43\xca\x46\x8c\x05\x14\x6e\x4e\x63\x24\x81\x54\x2c\x1f\x7c\x1b\x9b\x09\x04\x1d\x3f\x5a\x0e\x6c\x48\xe7\x80\x8a\x78\xe0\xe5\xeb\x68\xb9\xf3\x8c\xe5\xbc\xe1\x01\xfe\x70\x75\xf1\x38\x9b\x3b\xe7\xad\x4e\xeb\xa1\x02\x72\x49\x29\x88\x93\x26\xe9\x8c\x1e\x0a\x17\xbd\x0b\xe5\x84\xab\x0b\xe5\xec\x42\x39\xbb\x50\xce\xe2\xea\x42\x39\xbb\x50\xce\xda\xab\x0b\xe5\x24\x5d\x28\x67\xf9\xea\x42\x39\xd7\x0f\xb4\x0b\xe5\x0c\xa6\xb7\x0b\xe5\xec\x42\x39\xbb\x50\xce\x2e\x94\xf3\x39\x86\x72\xfe\xb6\x83\x33\x3b\xe7\xd8\xe7\xe1\x1c\xeb\xdc\x5d\x9d\xbb\xab\x73\x77\x75\xee\xae\x1d\x76\x7c\xe7\xee\xea\xdc\x5d\x9d\xbb\xab\x73\x77\x3d\x53\x77\x57\xab\x0a\xc0\x9f\x35\x00\xcd\xe3\x63\xcf\xc0\x4f\xab\xb0\x33\x6b\x11\x67\x2c\xd8\xcc\x0a\xa2\x4c\x01\x26\x73\x8e\x55\x4c\x1f\x1e\x49\xa6\x6c\x00\x74\xc5\x53\x5b\x14\x4c\xee\x1c\x7a\x9d\x43\xaf\x73\xe8\x6d\x3b\x25\x2d\x1c\x7a\xe0\xcb\x0b\x8f\x82\x55\x47\x8a\x14\x8e\xf7\xf5\xae\x8d\xf5\x9f\x6e\x6e\x5a\xb1\x56\x95\xf0\xf3\x2e\x17\xa5\x54\x51\xdd\x93\x0f\x73\x52\xcc\x82\x46\x72\x9e\x4a\x61\x36\xc6\x61\x9c\x8b\x45\x7b\x0d\xb2\x59\xdd\xa3\xf6\xf7\x31\x0b\x83\xc9\xad\x67\x6b\x9e\x4a\xc5\x4a\x76\xdc\x1d\x14\xef\xcd\xae\xa9\x01\x3a\x7d\x9c\x09\x6d\x07\xc5\xbd\xf4\x7e\x23\x59\xe4\x4d\xf8\x86\x75\x4d\x82\xe7\xe9\xd7\x9c\x65\x58\xe2\xba\x70\xe0\x14\x93\xe2\x4c\xae\xe8\x92\x2a\x4d\xcb\xd1\x86\xc5\x6c\x38\x4d\x4d\x86\x4a\x5a\xf8\x63\x57\x46\xfd\xa8\x3e\x59\xd2\xd8\x7f\xd2\xc0\x7b\xf2\xbc\xfd\xb3\xa4\xa9\x8f\x96\x34\xf4\xd3\x92\x06\xbe\x5a\xd2\xcc\x5f\x4b\x1a\xfb\x6c\x49\x13\xbf\x2d\x79\x60\xdf\x2d\x69\xee\xd4\x24\x8d\x7d\xb8\x2b\x9d\x7e\x76\x7e\xdc\x96\xc3\x6e\xe2\xcf\x5d\x19\x74\xe7\xd3\xad\x4c\xf5\x76\xbf\x2e\x69\xea\xdb\x25\xcd\xd3\x93\xb6\xfa\x78\x49\xe7\xe7\x6d\xc7\x5f\xb6\x12\xdd\x76\xfe\xde\x46\x6b\x99\xb1\x49\x33\x27\xfd\x0d\x9b\xe0\x60\x02\x71\xa2\x70\x74\xc8\xb5\x32\x44\x21\x75\xf4\x2d\x15\x65\x31\x9a\x8b\x4b\xb2\xcb\xe3\x44\x44\xdd\xf0\x68\x76\x13\x1a\xaf\x68\x60\xcb\x02\x1a\xe9\x7a\xdb\x27\x4c\x64\x3c\x9a\xb9\xce\x1a\x21\xd7\x7a\xd6\x36\x03\xa2\x84\xdd\xde\xb2\xa0\xcd\xd8\xd9\x76\x6f\x4e\xcd\x40\x77\xf0\xe9\x84\x1d\xdf\x4a\xbc\x37\xa3\xcd\xac\xe9\x54\x80\x06\x52\xc9\xc0\xb7\x7a\x78\x29\x4b\xdd\xef\xa0\x47\x0c\x6d\xa9\xef\x6e\xd1\xdb\xb0\xb3\xd4\x25\xa8\xae\xe2\xb9\x88\xa2\xf3\xd6\x21\xbb\x21\xd7\x3e\x1c\x46\x03\xb1\xab\xb9\xe0\xb5\x15\x0f\x24\x7c\x70\x2d\x32\x48\x71\x35\x97\xbe\xda\xa1\x85\x14\xd7\x8a\x1f\x7c\x1f\x74\x90\x43\x71\xba\xe2\x6a\x0a\xd3\x51\x9e\x06\x74\xc2\x1f\x74\x0a\xee\x29\x44\x9b\x8c\x57\x62\x10\x9e\x64\x90\x5b\x51\x49\xd6\x8c\xee\x6c\x5f\x50\x92\x43\x0f\x7e\x1b\x10\xc5\x9a\x71\xdc\xb6\x43\x97\x38\x74\xaf\xb7\xe1\x1f\xac\xe9\xf5\xe8\xa0\x48\x08\x3b\xf6\x7d\x33\x28\xc1\x9a\x9e\xdf\x56\xe1\x09\x0e\xd8\xad\xad\x71\x0b\x35\xfd\xe9\xa2\x17\xba\xe8\x85\x67\x1e\xbd\xd0\xea\x0c\x6c\x8a\x64\xa8\xdb\xfe\xcf\x35\x9e\xa1\xd5\xa0\x37\xc5\x36\xd4\x0d\xfa\x99\x44\x38\xb4\x1e\xe3\xc6\x68\x87\x75\x03\x7d\x26\x31\x0f\xad\x06\xdb\x30\xfe\xa1\x6e\xc8\xbf\xe5\x28\x88\x56\x73\xb8\x21\x22\xa2\x6e\xde\x9e\x45\x5c\xc4\xda\x01\xfe\xae\xab\xf3\xa8\x7c\xec\x57\xea\xf1\x02\x24\x46\xc1\x57\x2b\x41\x12\xe1\xad\x95\x40\x89\x52\x6f\x31\x58\xa2\xa6\x32\x8f\xca\xc7\xe1\xbf\xab\x51\x15\xaa\xfc\xf1\x26\x65\x7a\x42\xfb\x1a\xc4\x04\x9c\xcb\x24\x9f\x87\x36\x8e\xc1\xaa\xe8\x9f\xd2\xe8\xce\x68\x2d\xf6\x7b\x63\xf0\xac\x05\x9b\xf3\x6f\x4a\x0a\x90\x28\xc9\x10\xc4\x10\x33\x83\xc1\x6d\x5c\x9f\x6b\x6c\xe4\x8b\x8d\x3b\xb8\xf6\xf3\x11\xd5\x34\x91\x53\x62\xbd\xf5\x4e\x03\x29\x84\x9f\x74\xa5\xe9\x6a\x8f\xf0\xd5\x95\x3e\x8d\xaa\x3f\x37\xee\xd2\x8c\x0a\xc1\x12\x43\x0b\xd0\xa3\x0f\xd2\x9d\x9f\x9f\xcd\xd3\x63\x5f\x5e\xe9\xcd\xf9\xca\xef\x35\xdd\x29\xa5\xe8\xef\x1b\x23\x13\x6e\x51\x72\xc7\x58\xaa\x02\x67\x49\x0e\x3e\x15\xc8\x05\x19\x2f\x8d\x7a\x17\xdd\x01\xdc\x28\x48\x65\x30\xde\x73\x5c\x98\x03\x27\xd0\xc3\x66\x4f\x59\x14\xfc\xd4\x85\xe0\x74\x21\x38\x5d\x08\xce\xb6\x33\xd6\x20\x04\x27\x3c\xf0\xa5\x30\x1c\x2a\xc8\x59\x9a\x26\x60\x94\x72\xd0\xb0\x16\x73\xd0\x02\x6e\xac\x58\xe2\x76\x4c\x2f\xaa\x30\x07\xf7\xf3\x0a\x85\x2e\xdf\xf0\x4c\xad\xf2\xc4\xc6\x08\x1b\xa4\xa7\x75\xf2\xdd\x46\xe9\x30\x92\x62\xc2\xa7\xdb\xf3\x62\x82\xb9\x3c\x87\x57\x0a\x8f\x19\x36\x91\x5b\x64\xdb\x82\x53\x41\xfa\x56\x89\x6f\x3f\x40\x72\x0c\x13\x8b\x46\xfe\xae\x4b\xb1\x28\x87\x95\x30\xb1\xe0\x99\x14\xe0\x56\x5c\xd0\x8c\xd3\x71\x62\x19\x1b\xd3\x4e\x0d\xf7\x26\x85\xba\x23\xf5\x28\x1e\xae\x4b\xb1\xf8\x48\xcb\xf1\x00\xa2\xb6\xeb\xc4\xb9\x34\xc0\xa0\x73\xee\x3b\xbe\x9f\x4b\xab\x59\xf2\x7e\xed\x2e\x77\x57\x33\x37\x43\x4b\x7d\x3d\x54\xd7\xeb\x66\x63\x48\xde\x5a\x87\x3d\x25\xe7\xff\x7d\x75\x71\xf9\xee\xf6\xea\xf5\xd5\xe5\xcd\xe1\xb2\xd6\xdb\x28\x52\x1f\xdd\x1a\x05\x2e\xd6\x3f\x1e\x7f\x3c\xbb\xf9\xef\x77\x67\x6f\x2f\x4f\xc0\x0d\xcb\x3e\xa5\x14\x2a\x19\x14\x90\xe5\x69\xc6\x16\x5c\xe6\x2a\x71\xb8\xc4\xf1\x9a\x4d\x5b\xdd\xad\x36\x82\x68\xe9\x93\xd5\x6a\x5f\x83\x80\x08\x5a\x6c\xa0\xc8\xef\x70\xc3\xa8\x92\x05\x8b\xfb\xa1\xee\x17\x79\xe3\x14\x17\x69\xae\x1d\xc3\xf3\x59\xbf\xc2\x03\xb2\x5f\xc8\xdc\xb4\xf7\xc7\x3f\xc2\xc0\x32\x16\xe7\x11\x86\xa7\x51\x17\x05\xf0\xc7\xbe\x55\xbc\x69\x92\xc8\x7b\x4c\x13\x64\x2a\xa2\xa9\x1b\x7a\x38\x3b\x68\xad\x7b\x45\xf8\x90\x0d\x49\xef\x8f\xc1\xad\x1e\x7e\x3d\x45\x78\x67\x9b\x39\x0a\xbd\x4a\xb8\x66\x19\x4d\x48\x2f\x7c\x7a\x48\x2e\xcd\x37\x58\x1c\xae\x03\xb4\x20\xd8\x82\x65\x10\xde\x61\x57\xa1\x4f\x32\x36\xa5\x59\x9c\x30\x05\x36\xf5\x32\xbe\xb3\x9d\x30\xe6\x83\x47\x84\xd4\x43\x72\xc1\x26\x34\x4f\x80\x03\x93\x5e\xef\x30\xb6\x3b\xd8\x6a\xaf\x33\xb9\x11\x71\xb8\x4a\xaa\xcb\x9a\x43\xdd\xda\x1f\xd9\x98\xb3\x12\x59\x53\x2c\x26\xdc\x86\x13\x39\xc3\xe5\x16\x94\x69\xd2\xc6\xd3\xd9\xdc\xdf\x88\x0c\x05\x8b\x4f\xac\x49\xda\xdc\x34\x7e\x0b\x4b\x03\x81\x53\x58\x8f\xe3\xdc\x35\xd8\x34\x04\xa7\x91\xe3\xb6\x8d\xeb\xb6\x59\xdc\x5c\x3b\xa7\x6c\xc3\xb0\x38\x52\xe7\xe0\x82\x68\x38\x17\x30\xda\xc4\xe1\xd2\xda\xf1\xb8\x9d\xa2\xd7\x76\xee\xb1\x2d\xb1\xd6\x68\x7f\x16\xc7\xb6\x7a\x88\x45\x9d\xc6\x22\x22\xc3\x40\xeb\xea\x83\x3e\xd0\x27\x39\x8f\xff\x73\xf3\xe1\xde\x71\xc6\x64\x8a\xc6\x8a\x1d\x66\x0d\x4d\x9c\xcb\x12\x9d\xf2\x9b\x1e\x9c\x2a\x5a\xc1\x9a\xbb\x38\x36\xcb\x50\x5a\x0c\x63\x1d\xbc\x41\xf9\x82\x69\x6b\x7f\x66\x8f\x8a\x43\x8b\xce\x11\xbb\x01\x52\x19\xbf\x22\x2a\x4f\x53\x99\x69\xe5\x55\x04\xb0\xb9\xf4\xcb\x7f\x82\xbc\xdc\x27\xbf\xf8\x1f\x21\xea\x53\xfd\x78\x74\xf4\xef\xdf\x5f\xfe\xd7\x5f\x8e\x8e\x7e\xfe\x25\xbc\x1b\x58\xe8\xca\x8f\xa0\x4d\x47\xc6\x20\x84\xdb\x3f\x57\xc1\x34\xfa\xd6\x82\x38\x9c\x49\xa5\xaf\xae\xfd\x9f\xa9\x8c\xab\x7f\xa9\x2d\x9c\x80\x3c\x2c\xd1\xf1\x1e\xd0\x03\x93\x9e\xa6\x61\x4c\xee\x2a\x2d\xf7\xc7\x72\x28\x93\x35\x48\x98\x7f\xbe\x76\xdd\x35\x1c\xe8\x3e\xe3\x5a\x33\x80\xab\xd7\x2c\x9b\x1b\x4e\xdc\x37\x3b\xb7\x60\xb3\x8b\x97\xbd\x07\x21\x5e\x0d\xfd\xc6\xb5\x83\x83\xde\xdb\x91\xe1\x66\x2e\x22\xf3\xad\x04\x55\xe8\x48\x41\x60\xd7\xc1\x07\xe2\xec\x0d\xaf\xf7\x3e\x93\xde\x72\x51\xf5\xe4\xbe\x42\xd7\x69\x88\xf5\x0f\xd6\x08\x23\x80\x7a\x8b\xc4\x31\xfe\x38\x8c\xd2\xbc\x6f\x1f\x18\xce\xd9\x5c\x66\x4b\xff\x27\x4b\x67\x6c\x6e\x24\xb6\x81\xb5\xe1\xf7\xfd\xeb\xf8\x9a\xff\x0b\x5f\x2c\x7d\x60\xf5\x6d\x14\xa9\x8b\x12\x2d\x96\x82\xb0\xf8\x69\xcf\xa2\x9b\xa6\x03\x1f\x45\xbf\x1a\xeb\x60\x7e\x56\xaf\xf2\x42\x9f\x97\x7c\xed\xaf\xfc\xa8\x40\x86\x5c\xc8\x24\x9f\x33\xd5\xf7\xec\x09\xa5\x75\xb1\x30\xd2\xe4\x16\xb7\x8d\xbb\x5a\x9e\xbe\x98\x2f\xb8\x6a\x12\x3c\xbf\x32\x14\xeb\xea\x73\xb9\x4e\xb9\x36\x9a\x0a\x86\x40\x79\x75\xf1\x53\x2a\x15\xe8\x00\x3e\x8e\xb5\x44\x52\x5e\x6e\xaa\xca\x51\x5c\x41\xa1\x86\x9f\xfe\xe5\x7f\x06\x50\x6c\xe1\xc5\xe0\x7f\xfd\xfc\x2f\xc7\x3f\x0d\xe1\x1f\x5f\x9e\xfc\xe7\xc9\xff\xb8\x3f\xfe\xe5\xe4\xe4\xf8\xf8\xc7\xef\xdf\x7e\x77\x7b\x7d\xf9\x33\x3f\xf9\x9f\x1f\x45\x3e\xbf\xc3\xbf\xfe\xe7\xf8\x47\x76\xf9\x73\xc3\x46\x4e\xd6\xd7\x4d\x29\x5f\x54\x2c\xdf\x37\x38\xf0\x78\x0d\x1a\x16\x08\xaa\x7f\xab\xf1\xb2\x56\x4a\x15\x70\xa1\x07\x32\x1b\xe0\xeb\x25\x9f\xdd\xa6\xcb\x2d\xdb\x2e\xfb\xfc\xc6\x9d\xd6\xc0\x14\xeb\x48\xf3\xc1\x37\xb2\x62\x51\xc6\xf4\xa1\x34\x18\x6c\xcd\xf1\x8f\x54\xc6\x47\x01\xf6\x6f\xa7\xd4\x14\x4a\x8d\x13\x29\x70\xbe\x0a\xce\x3b\xc9\xe4\x7c\x48\x02\xb3\x10\x86\x61\xd9\xe7\xee\xd8\x16\x2d\xd7\x5d\x9d\x12\xf4\x79\x29\x41\x23\x5c\xdf\x07\xd7\x80\x98\x58\x6c\x32\xd3\x54\x6d\xba\xe6\xd9\xb2\x39\xda\xe7\xb7\x4a\x92\xca\x34\x4f\xa8\x5e\x63\xb6\xab\xb1\x4d\xdb\xbd\xaf\xbc\x99\xd0\x07\xf6\x59\x2a\x37\xaf\x37\x86\x92\xb3\x24\x21\x5c\xe0\x49\x80\x06\x9c\x35\x2f\x63\x28\x2f\xd9\x42\xaa\x10\x9c\x57\x54\x4f\x2c\x0c\x8d\x10\xe6\x48\x33\x0d\x85\xca\x7e\x30\xf7\x91\x66\x59\xd3\x18\x17\x88\x7d\x9e\x26\x8c\x78\x6e\xeb\x53\x6f\x08\x55\x4a\x46\x9c\xfa\x0c\x12\x0f\x86\x66\xbb\x0d\xbd\x81\x58\xc4\x34\x63\x11\x8b\x99\x88\x18\xe4\xb9\xe5\xac\x18\xeb\xd8\x08\x83\x60\xde\x87\x36\x28\x89\x73\x74\xed\x20\x3d\xa8\x6f\xe3\x6a\x3e\xcf\x37\x56\x7a\x3c\xb8\x15\xdf\xac\xb8\xb5\xcc\x55\x92\x25\x0a\xd1\xda\xa7\xe2\x78\xd5\x7d\x7d\xa8\xff\x01\x33\x52\xbc\xb9\x6d\x2b\xa7\x5a\xa1\xb8\x85\x8d\xa1\x4c\x69\x1f\xdb\x62\xd8\x8c\xce\xfe\x26\x69\x6c\xab\xac\xd4\xa6\xb4\xb5\x85\x71\xa9\x2d\x3d\x6d\x6a\x4d\x4a\x33\x36\xe1\x9f\xda\xe4\x48\x89\x42\x45\x09\xea\x46\x1a\x82\x9a\xb1\x94\x09\xd0\xc3\x19\x8d\x66\x98\x1b\x2c\xca\xe3\x78\x50\x8f\x11\x4a\x19\xed\x8f\xd7\xa8\x4e\x8a\xe9\xce\xd6\x6f\xfc\x6c\xd9\x55\x3f\xfc\xc1\x12\x32\x66\xad\xe0\x28\x8e\xde\x05\x6f\x54\x20\x0c\xd0\x81\xe7\x3a\x69\xb4\x37\xef\x72\x4a\x25\x9c\xb5\x09\xd7\x98\x44\x00\xb5\x1b\x0b\x2c\xda\xe0\x4d\x48\xe6\xb5\x4f\x1c\x41\x72\x0d\xa4\x01\x57\x1a\x1a\xa3\x89\x30\xce\x13\x16\x13\x17\xb0\x81\x8d\xb6\xdc\x52\xa5\x50\x85\x53\xaa\x14\x9f\x8a\x41\x2a\xe3\x81\x69\x6d\x0b\x38\xdb\x63\x41\x37\x93\x40\xcb\x6d\x96\xcb\x7b\x74\xe3\xed\x6f\x81\x6c\x11\xc9\x79\x9a\x6b\x16\x18\xe7\xbc\x5d\x67\xbc\xc4\xc8\xa2\x40\x86\x2c\x24\xa2\xfd\xe6\x14\xcb\xda\x0c\xec\xc7\x07\xfe\xe3\x03\xff\xad\x7d\xa6\xb9\x09\xd5\x42\x93\x62\xe3\x2c\xf6\xa3\x37\x68\xb2\x2c\xc0\x66\x30\x29\xfd\x13\x9f\xe7\x73\x42\xe7\x88\xf2\x3a\xa9\x99\x4e\x70\x5e\xb3\xf8\x30\x13\x56\x33\x51\x9b\x23\xe7\x1f\x2c\xc7\xfc\x99\x5a\xb6\x1a\x59\xb4\xda\x59\xb2\x5a\x58\xb0\x76\xb6\x5c\x39\x23\x75\xf3\xfd\x78\xe3\xec\xe6\x95\x1d\x89\x75\xb7\x37\xee\x48\x77\xc0\x21\xb4\xc3\xb7\xc3\x15\x91\x73\xae\xb5\x0f\xc9\xf2\x3b\xac\x4f\xb8\x2e\x59\x3f\xed\x59\xe0\x45\x45\x7d\x87\x3a\x9e\x2c\x0b\xaf\x45\x1f\xb9\xec\x3d\x57\xcc\xe2\x33\xf0\x79\x8a\x08\x0d\xb0\xa7\x7d\xe2\x94\x0d\x32\xe8\xce\x47\x77\x3e\xea\x5e\xda\x54\x72\x88\xac\x2d\x3b\x54\x42\xf5\xf1\xe2\x88\xd9\xd9\xa9\x8c\x95\x95\x17\xdc\x1e\x32\x67\x01\x30\x5d\xb8\x98\x92\x1b\x06\x96\x81\x11\xd3\xca\x82\x86\xc0\x1b\x34\x63\x05\x94\x85\x63\x8d\xce\x12\x02\x7e\x04\x08\x1a\x9d\x4c\xca\x4f\x60\x7d\x83\x39\x48\xb6\x57\x3a\x94\x67\xbc\xe8\xc2\xe6\x69\x42\x35\xf3\x82\xcd\x1e\xb5\x21\x3a\x00\xae\xed\xc3\xe8\x00\xb8\x8a\x67\x3a\x00\xae\x0e\x80\xab\xe1\xa0\x3b\x00\xae\xca\x54\x77\x00\x5c\x1d\x00\xd7\xae\x6b\xa9\x65\xc2\x32\xba\x11\x4a\xa9\x6c\xe6\x2b\x9e\x87\xa1\x15\xee\xdd\xa0\xa5\xc7\xf1\x52\xdc\x3a\xb1\xc5\x9c\xad\xa2\x5f\xb0\xb5\xb4\xa6\x00\x9e\xa5\xa5\xeb\x17\xe4\xd1\x2c\x89\x59\x33\x8d\x74\x1d\x36\x86\xe5\x90\x3a\x03\xa7\xcf\xbf\xfb\xdd\xd6\x67\x20\x3f\xfd\x25\x88\x6f\x87\xe7\xcd\x1f\x7e\x87\xfc\xbb\xfb\xd7\x5f\x1e\x05\x8a\x0b\xbb\xd4\x42\xc0\xb8\x84\x17\x1c\xa0\x8d\x1b\x2a\xcc\x00\xb6\x65\xe6\x07\x86\x35\x24\x97\x86\x50\x91\x39\xa3\x42\x39\x33\x17\x78\xa2\x8a\x87\x95\x75\x99\x05\x7a\x95\x35\x29\x14\x27\x83\x91\x77\x72\x64\x6d\x5f\x7d\x72\x0d\xb6\xd4\xe2\x17\x38\x49\xef\xe4\xe5\x27\x16\xe5\xdb\x30\xa9\x9a\xa2\x45\xb4\xaa\x90\xf8\x7d\xc1\xe4\x71\x64\x25\x26\x5f\xec\xe0\x90\xcd\x6f\x9c\x99\x3b\xb6\x2c\x98\x8d\x15\x21\x80\xe4\xf7\x8b\x5d\xe2\x58\x01\xf2\x8e\xff\xed\x4c\x59\xf3\x31\x17\xf8\x31\x6c\xda\x2d\x05\xb4\xee\x26\xd4\x48\x76\x49\x82\x9f\x39\xc4\x74\xed\x50\xac\xb1\x1e\xab\xbd\x5e\xc6\xf0\x54\xb2\x5e\xba\x08\x44\x8a\xcb\x5f\x73\x9a\x94\x93\x10\xec\x4f\xf6\xa1\x15\xaa\x7e\xcf\x93\x38\xa2\x99\x8d\xf2\xc2\x34\x4d\x25\x71\xf5\x00\x12\x06\x72\xe2\xdc\x69\x2f\xd6\x08\x31\xd1\x00\xff\x84\x47\x79\x42\x33\x97\x39\xde\x28\x51\x60\xeb\x8c\x16\x9b\x66\xc4\x22\x29\xe2\x36\x0a\xc0\x6d\xf5\xdd\xaa\xaf\x35\x65\x19\x97\x18\x5d\xec\x60\xb8\x82\x4d\x7a\x5c\xb6\x69\xcb\x89\x3b\xd5\xfe\x88\x95\x2c\x1f\x25\x28\x17\x5b\x5d\xed\x24\x20\x8f\xfe\x54\x0c\xc9\xb7\x4b\x67\x66\xe9\xdb\xf2\x6c\x42\x6a\x2c\xd1\x66\xbf\x69\xb7\xac\x9d\xec\xe2\x40\x4d\x64\x06\xc9\x29\xc7\xb1\xc4\x8c\x8c\x05\x8f\xf4\xc9\x90\xfc\x3f\x96\x49\x58\x78\xc1\xa6\x54\xf3\x85\xe7\xa6\x5e\x71\xcd\x18\xb5\x1e\xfc\x17\xe4\x18\x5e\x23\x7c\x3e\x67\x31\xa7\x9a\x25\xcb\x13\xd4\x63\x19\x51\x4b\xa5\xd9\xbc\xc9\xd2\x35\x31\x1a\x38\xb8\x31\x2e\xf4\x37\x5f\x6f\x78\xb2\x6d\x0e\xd5\x47\x97\x95\x52\xcc\x0c\xc6\x10\x54\x96\xd0\xf3\x20\xb9\x41\xdc\x0c\x63\x10\x6c\x62\xb3\x93\x2c\xc3\x05\xfe\x9b\xd9\x07\x94\x64\x0c\x10\x08\xec\xce\xdd\x73\x8f\x63\x34\xe5\x5b\x99\xaf\x81\x42\x5f\x19\xf8\x1b\xab\x84\x7f\x0c\x5e\x5c\x9b\xa5\xf8\x28\x62\x42\xd0\x93\xc0\x44\x49\x09\xd8\x25\x81\x9d\x1b\xf2\x80\x4f\x15\x91\x28\x5b\x3b\x79\xd0\x8c\x44\xe8\xcb\x96\xa8\xf7\x83\xe4\x2d\xfa\x0f\xb5\xd8\xcb\x10\x20\x6e\x27\xa6\x92\xb7\xa7\x3d\x20\x0d\xb3\x5b\x25\xd8\xa0\xf0\x2d\x16\xbb\x28\x36\x43\x0d\x1c\xaa\xd8\xd1\xab\xa3\x83\x10\x5f\x1c\x4e\x26\x53\x3a\x85\xf3\xd4\x62\x54\xd5\x57\x49\xcc\x34\xcb\xe6\x90\x70\x3d\x93\xf7\x78\x1f\xd9\x56\x6a\x9f\x72\x80\x8f\x66\xb4\x33\xa9\x10\x07\xab\x94\xc4\x08\xe7\x17\x1c\xa3\xf7\x74\x49\x68\x26\x73\x11\x5b\xa9\xc9\x13\xd0\xb7\x95\x0f\xbf\x93\x02\x28\x45\xae\xcc\x5c\xdd\x96\xa8\xf4\x98\x69\x6a\x8e\xcd\xcb\xe1\xcb\x17\x07\x99\xb0\x96\x79\xab\xd0\x9b\x8a\xa5\xd0\xf9\xca\xdd\x99\x39\x48\xbf\x32\x46\xe3\xf7\x22\x69\x23\xcb\xbd\xc5\xed\x05\xaf\x0e\x40\x09\xe3\x13\xb0\xdd\xf6\xf1\xa7\xfb\x8c\x6b\x16\x90\xc7\x63\xa8\x41\x64\x54\xf7\x5c\x78\x11\xf6\xa4\x2c\x82\xc0\x23\x4d\x06\xb4\x3d\x1e\x44\xe5\xe3\x3d\xcf\x99\x3d\x50\xb0\xe5\x8a\x63\xe6\x37\xdc\x91\xda\x70\xe4\xca\xc9\x9d\xe4\x18\x9f\x34\x12\x9b\x94\xfa\xe4\x30\x41\x22\x38\x40\xa3\x59\xb7\x51\x49\x5c\xde\x70\x7a\xc0\xd1\x7e\xcb\x66\x74\xc1\x14\x51\x7c\xce\x13\x9a\x21\x38\xde\x08\xfb\x47\xc6\xb9\xae\xcf\x40\x6f\x97\xdd\x1c\xf6\x24\x68\x6e\xeb\x54\xbb\x7e\x98\x79\x02\x1a\xe1\xfa\x65\xbe\x33\xcf\x75\x4e\x93\x64\x49\xd8\xa7\x28\xc9\x15\x5f\xec\x7b\x9a\x6c\xf6\xc3\x0e\xac\xba\xca\xa5\x53\x19\x8f\x52\x16\x3d\x26\x8f\x2e\x6b\x18\x86\x54\xc5\x6e\xd1\x1d\xec\xa3\xd3\xdc\x97\x10\xf9\x04\x28\x94\x2e\xa6\x72\x19\xc6\x79\xfa\x31\x7c\x2e\x80\x02\xf4\x5e\x5d\x26\x54\x69\x1e\x7d\x9b\xc8\xe8\x6e\xa4\x65\xd6\x2a\x67\xff\xec\x87\xd1\xca\xfb\x15\x18\x86\xb3\x1f\x46\xe4\x82\xab\xbb\x10\xd8\x05\x9d\xa6\xa1\xb9\x84\x92\xbb\x7c\xcc\x12\xa6\x8f\x8e\x14\x72\xb9\x39\x8d\x66\x5c\x30\xc7\xe0\x84\x4f\x49\xb1\x0a\x9f\x99\xe5\xb6\x3e\x53\x9b\xf8\x74\x6a\xf7\xeb\x1f\xe8\xbd\x62\xd8\xfd\xb1\xe9\xbe\xb9\xcd\x9a\x64\xa4\x1f\xd4\x4f\x81\x9d\xb9\xba\x38\x90\x0f\x62\xa2\x6e\x1b\xe1\xcb\x96\x17\xf2\x35\x4f\x18\xea\x38\x30\x44\x17\x95\x66\xcf\x01\xac\xd8\x52\xe6\xe4\x9e\xa2\x56\x0c\x34\x70\x48\x6e\x79\xfa\x8a\x5c\x0a\x95\x67\xac\xb0\x67\x4c\x2a\x4d\x01\x82\xa7\xcd\x2c\x73\xea\x14\xac\x30\xaa\x1c\x80\xfe\x8a\xda\x15\xb9\x44\x74\x56\xf5\x8a\xf4\xd8\x27\xfd\x75\xaf\x4f\x7a\x9f\x26\xca\xfc\x4f\xe8\x89\xea\x0d\xc9\xd5\xdc\xfb\xd9\x01\xfa\x27\x63\x2e\xf4\x09\x5f\x30\xcc\x38\xe0\xb3\x0f\xb2\x41\x6c\x18\x9d\x91\xd6\x62\x49\xee\x11\x81\xc2\x90\x78\x96\x65\x32\xf3\x91\xe7\xc1\x34\x00\x77\x89\xe4\x3c\xcd\xe4\x9c\x07\x86\x3d\xd8\xe0\x07\x8d\xaf\x03\x73\xc3\x76\x91\x74\x75\xfd\x11\xd3\xcd\xbe\x4c\xca\xcc\x71\xdd\xea\x5f\x4d\x5c\xc4\x44\xdf\xd6\xec\x02\x96\x64\x21\x74\x31\x00\x63\xbc\x74\xad\x18\x6a\x15\xae\xf0\x6b\x9f\x35\x47\x4e\x63\xb6\x38\x55\x31\x7d\xd9\x87\xcf\x28\x1b\xed\xa7\x4b\x7d\xa2\x8a\xf4\x5e\xf6\x86\x64\xe4\xb8\x6d\x3f\xec\x63\xf1\xdc\x44\x66\xbe\x41\x30\xa6\xbf\xe8\x91\x63\x99\x41\xcb\x11\x15\x24\x61\x74\x61\x0d\xc8\x78\xa6\x96\xa8\xd3\x9e\x34\xce\x7a\x6c\x9a\x00\x16\x68\xf9\x7f\xfa\x6a\xcb\xd3\xcd\x24\xd1\xd5\x75\x73\x91\x91\x3d\x23\x82\xf6\x40\x98\x94\x86\xc6\x1a\xaa\x69\xd8\x2a\xc0\x6a\xd9\xb6\x8b\x01\x73\xb1\xa2\x29\x63\x03\x1b\x17\xb5\x07\x72\x6a\xef\x09\xa8\x2e\x69\x99\x5f\xef\x48\x6a\xdb\xd9\xfc\x20\xf8\xaf\x39\x23\x05\xa2\x67\xca\x32\xc4\x16\xd5\x24\x2e\xf1\x30\x8e\x8c\xed\xf8\x6c\x4e\xff\x2e\x05\xb9\xfc\x76\x64\x3f\x7a\xf2\xa4\xd3\xb3\x95\x48\xd0\xbf\xe7\x19\x33\xec\xb8\x4d\xc0\x80\x7b\xa7\xca\xd9\xcd\xef\xe4\x82\x6a\x8a\x0c\xde\x86\x5c\x89\x82\xc2\x9b\x5d\x38\xe6\x22\xb6\xb7\x02\xce\xfd\xd8\x4c\xd6\xac\xde\xbb\x4d\xf2\x52\xf8\xe0\x87\x9b\xab\x03\x31\xe3\x08\x68\xfc\xf4\xad\x8c\x5b\x73\xe4\xbf\x9a\x09\x3c\xc7\xf7\xc9\xdc\x34\x40\x8c\xce\xde\x87\xe3\x4c\xcc\x79\xb6\xff\xfc\xc1\x68\x9c\x8d\x89\x57\x23\x36\xe2\x66\xab\x65\x9f\x6f\x03\x3d\x1d\x68\x87\xd9\x1a\x70\x6e\x2c\x43\x19\x27\x72\xec\xf0\x67\x0f\xdd\xdf\x0f\x37\x57\x3b\x74\xf7\xc3\xcd\xd5\xe3\x76\x75\x27\xf1\xac\x2a\x9d\x15\x3c\xb8\x48\xc7\xa8\x8a\x5d\xcd\x65\xae\xe1\xa1\xa4\xad\x43\xce\xd3\x76\x3c\xf6\x95\x59\x3a\xba\xfc\x94\x62\xf0\x99\x35\xf2\x8f\x66\x14\xf2\x98\x7d\x76\x1d\x2c\xaa\x59\x65\x65\x28\xbb\x5b\x5e\xa3\xd1\x01\x7d\x22\x17\x0c\x5d\x96\xf1\x2b\x17\x08\xe0\xdf\xa8\x7f\xe1\x2d\x84\x5d\xc6\xaf\x90\xae\x12\x8c\xc2\x8c\x83\xdd\x74\x8c\x26\x22\xe1\x6f\xd9\x02\x3a\x3c\xe1\x7a\x69\x38\xf4\xc9\xb0\x14\x5a\xaa\xa0\xcb\x07\x3d\xcc\x3b\x8a\x16\x2b\x06\x2a\x72\x6c\x5a\x3a\x05\x03\xd7\xc9\xb0\x90\x2a\xa0\xac\x01\xf8\x53\x50\xf4\x28\x89\x1c\x8a\x69\xd8\x6d\x15\x89\xa3\xe9\x56\xd9\xce\xee\x61\xe2\xcd\xf9\x68\xcb\xd0\xcc\x3b\xb5\x0c\x0d\x6e\x8c\x2c\x26\xdc\x73\xe6\x69\x98\x2f\xd5\x88\xab\xc1\xb6\xda\xfa\x64\x73\xbe\xf6\xdb\xde\x53\xc4\x27\xa3\xed\xc0\x04\xc3\x7a\x1e\x2e\xbf\xbe\x14\x46\x89\xbb\x6c\x64\x49\x89\x85\x4b\x42\xbe\x69\xf6\xd6\xf7\x0d\xa0\x02\xda\x00\x2c\xb8\x95\x6f\x9b\x72\x35\x83\xb0\x8a\xed\x9b\xab\x79\xf5\x34\x96\xce\xd6\x97\xdd\xab\xe9\xc2\x39\x4b\x67\xaf\x47\x65\xf3\x9c\xf9\x8d\xbc\x1e\xd5\x9c\x4b\x98\x64\x18\xad\x42\xa3\xdd\x91\x22\x09\x9f\xb0\xad\xd5\x9c\x1e\xe0\x64\xce\xa5\xe0\xbe\xe4\xfd\xba\xab\xf9\x69\x73\xcd\xb5\xe5\x87\x05\x92\xc7\x5b\xdb\x02\x06\xc0\x45\x32\x49\x58\xe4\x70\xac\x61\x4a\xdd\x27\xea\x94\x17\x5b\x33\xa7\x40\xf9\x47\x45\xe5\x14\x17\xf4\xf4\xe6\xf2\xec\xe2\xed\xe5\x70\x1e\xff\x61\x26\xef\x07\x5a\x0e\x72\xc5\x06\xbc\x01\x54\xc8\xd3\x85\x11\xe2\x95\x36\x42\xae\x2a\x4f\xe9\x7b\x97\xc0\x48\x3e\x28\x0c\x1b\x00\x53\x8e\x73\x0a\x49\xa9\xfb\x24\xa3\x36\x49\x91\xba\x32\x35\x49\x82\xb3\xac\x33\xc6\xfa\xa1\x4a\xbd\xa5\xea\x47\xcb\x01\xed\x6a\x44\x28\x06\xf5\xb0\x04\xfa\xf1\x37\x57\x1b\x5a\xbf\x5d\x88\xd8\x34\x73\x23\xdf\x86\x8b\xbf\x00\x57\x93\x96\x10\x9f\x05\xf1\xb6\x13\x99\x99\x5d\x93\x95\x77\x00\xd3\x11\x0c\xf6\x34\x57\x2c\x1b\x5a\x8e\xf1\xe8\x13\xd5\x02\xac\x67\x07\x8c\xb4\xea\x34\xdd\xb0\x09\x29\xd5\x92\xb1\x52\x14\xcd\xf5\x8c\x09\xed\x20\xc7\xed\x64\xd4\xce\x9b\x8d\x70\x7e\xf4\x89\x6a\x08\x0f\xd4\x0e\xcc\xa7\x03\xc0\x69\xb3\x0d\xcd\x41\xd9\x8b\x6e\xfb\xec\xa8\x8c\xc6\x12\x42\x20\x10\xd3\xad\xb4\xc1\x68\x3c\xe7\xe2\x19\x1e\xc4\x88\x8b\x78\xdb\xf8\x2b\xc0\x75\xf0\x46\x59\x8e\xc2\x56\x9c\xf5\xdc\x7b\xe2\xa8\xd3\x6b\x30\x85\xdc\xfa\xe4\xca\x1e\xb9\x46\x87\x6e\xbe\x54\xbf\x26\x03\xfc\xca\x20\x8d\x8b\x59\xe9\xdc\x6b\x87\x37\xe0\x3c\x82\xd3\xec\x40\xeb\x4b\x7e\x7f\x02\xcd\xde\x33\xd5\x46\x86\xd9\x8b\x37\x43\xd5\x14\xe5\x92\xb6\x10\x11\x0c\xcb\xaf\x58\xdd\xd5\x4c\x41\x4a\x33\x3a\x67\x9a\x65\x18\x3a\x66\x83\xd1\x84\x8d\xea\x7f\x9f\x32\x31\xd2\x34\xba\x3b\x34\x84\x68\xc7\x4f\x1f\x8e\x9f\xee\xea\x2d\x73\x41\x32\xb1\xdf\x09\x16\x50\x68\x19\x7a\x66\xb9\xb0\xcc\xe6\x99\xd0\x15\x8f\xe3\xd5\xc6\x12\xe1\x71\x9c\xca\x4c\xb4\xc0\xf5\x42\xe3\x03\x84\x88\x79\x60\x3a\x08\x7d\xc7\x59\x38\x0c\xd3\x6b\x7e\x08\xac\x1c\xb3\x8b\xdf\xa9\xa0\x07\x73\x19\x33\x32\xe6\xba\x38\xe9\x8a\x69\x92\xb2\x6c\xce\x6d\x02\xb4\x14\x58\x83\x8f\xc5\xc8\xbd\x0c\xa7\xb2\x9f\x0e\x38\x9b\x20\x32\xd2\xae\xc8\x15\x19\x33\x7d\xcf\x98\x20\x2f\x5e\xbc\x78\x01\xf2\xc6\x8b\x3f\xff\xf9\xcf\x04\x10\x17\x62\x16\xf1\xf9\xea\x83\xf0\xd4\xbf\xbe\x7c\x39\x24\xff\x75\xf6\xf6\x0d\xc4\x5f\xa5\x5a\x91\xb1\xd4\x33\xdb\xb2\x79\xa0\xf4\xb2\xea\x43\xe9\x60\x27\x26\xa8\xca\x5d\x50\x29\xfc\xf0\xca\xc1\x74\x2f\xbe\xf9\xfa\xeb\x21\xb9\xe0\x19\x64\xde\x72\xc8\x15\xf0\xe1\x82\xa9\x0b\xa1\x13\x52\xaf\xe6\xba\x5b\x36\x61\xc3\x69\xe7\x7c\x3a\xd3\x58\x2d\x09\x76\x4a\xc2\x23\x8d\xe8\x7b\x78\xd8\x11\x0b\x49\xd9\x54\x12\x9b\x18\x65\x03\x47\xa0\x73\x7d\xa8\x28\x4c\x26\xea\xbb\x4c\xe6\x69\x91\x10\x98\x31\x65\x64\x54\x5b\x8b\x09\x1b\x2b\xd6\x4a\x31\xfd\xa4\x91\x0c\x0d\x2d\x35\xa5\x4d\x77\x55\x12\x40\xfa\x1e\x7f\x6c\x80\x3b\x21\xa5\xdc\x07\xd7\x81\xbb\xb9\x84\x7e\xef\xb5\xc8\x38\x38\xa7\x2e\xbf\x23\xcd\xe4\xdf\x70\x91\xb8\x70\x99\x42\x56\xe6\x55\x56\xe6\xb2\x89\x99\xae\x80\x72\x98\xb9\x6e\xf8\x9e\xcd\x8a\x0f\x72\x8c\xae\x26\x61\x32\x1a\xa4\x6e\x73\x65\x3e\x51\x02\x87\xac\xf9\x72\x58\x9e\x50\xcf\x14\xae\x68\x2e\x56\xde\xb6\xb5\x46\x2c\xa5\xb1\x15\x68\x6c\x9a\x57\xd1\x06\x86\xab\xda\x24\x99\xa0\xae\x51\x09\xb0\xad\x14\x24\xa3\x98\xce\xed\xd4\x40\xac\x92\xf9\x36\x53\xca\xe6\xda\xcc\x69\x76\x67\xc4\x7e\x7b\xfe\x87\x10\x19\xac\x7c\x9e\x0f\x26\x5d\x2d\x98\x2f\x52\x17\x46\xd6\x9b\x8f\x1c\x0d\x87\x47\x78\x40\x64\x86\x78\x97\xb8\xdb\xcd\xef\x4f\x94\x53\x5c\x8e\xdc\xa6\x69\x50\x82\xce\x96\xf6\xa0\xa5\x88\x60\x6a\x67\xaa\x79\x6d\xf5\x86\xe2\x4b\x3b\xbc\xe0\xa6\x88\xc1\xf8\x64\xda\xa4\x6c\x41\x5b\x09\xaa\x05\xc0\xf0\xfa\xba\x29\xf6\x08\x34\xc3\x0c\x6e\x8d\x81\x4b\x30\x2a\x62\x97\x3e\xb6\x65\x72\x36\x89\xad\x54\x31\xeb\xf9\x73\xb5\xab\x09\xa6\x7f\x94\x69\x95\xa5\x05\x81\x84\x50\x54\xa7\x2a\x72\x41\x9e\x35\xf3\x0a\xb7\x4b\x3b\x34\xf6\x36\x8c\x0c\xaf\x66\x4e\x02\xbc\x56\xce\x81\xa7\x99\x69\xa9\xda\x45\x82\x06\x00\x90\x1b\xdd\x61\x19\x92\xb7\x96\xa6\xe2\xe6\xa2\x63\x25\x93\x5c\xe3\xab\xc5\xcd\x90\xe0\x42\xa3\x0e\x72\x00\xa8\xac\x7f\x2c\x20\xbf\xba\xa8\xf7\xd5\x8c\x12\xe3\xd5\xe2\x30\x76\xd0\x97\x4f\x06\x2b\x5b\x20\x76\xab\x07\x83\x98\x8d\x14\x6f\xa3\x2a\x8d\xae\xc8\x71\x51\x2a\xc3\xb9\xb9\xaf\x84\x66\xd9\x84\x46\xec\x24\x54\xa1\x7c\x49\x12\x1f\x59\xe3\x72\x03\x66\x54\xc4\x09\x8a\xd6\x11\xcb\x60\xcb\xb3\x4f\xb6\x58\xae\xf9\x44\x9c\x71\x28\x02\x7b\xfc\x2d\x33\xf2\x20\xa3\x3a\xcf\x58\xa3\x0c\xa3\xc3\x86\x15\x42\x37\x0e\xa5\xb4\x41\x63\x6d\x43\x2a\xe0\x25\x27\xa1\x8a\xe0\x58\x15\xd3\x84\xb3\x8a\x53\xaa\x42\xb5\x74\x68\xb6\x12\xd0\x63\x20\x15\x4b\x99\x67\xd6\xee\xed\xb0\x45\x23\x99\x19\x45\x08\x1b\xa6\x8a\x64\x6c\x6a\xa4\xd5\x0c\xc4\x5a\x7c\x22\xc9\xcd\x0f\x07\x0d\xfe\x3a\x70\x90\xdc\xa6\x10\xb7\x89\x15\x9f\xe5\x82\xc7\x8e\x45\x82\x6f\xa9\x28\xf1\x97\x52\x15\xe4\x9d\x04\x70\xec\xc1\x0c\xa3\x30\x0e\x8c\xd4\x67\x74\x96\xe2\xa7\x43\xeb\xae\x04\xa0\x87\x06\xb5\x14\xda\x10\x61\x19\xb3\xeb\x7c\x9c\x70\x35\x1b\xed\x68\x0a\x7c\x57\xd3\x04\x06\x0c\xac\x38\xea\xd6\x9a\x07\x15\x13\x8a\x03\xcb\x33\x64\xdc\x30\x5b\xa8\x1d\x2c\x61\x12\xdd\xdb\xe1\xce\x94\x90\x18\x91\x30\x9b\xce\x6f\x6e\x05\xfd\xb0\x19\x5a\x08\xe0\x11\xb3\x0f\x22\x2d\xfd\x1e\xd1\x24\x51\xd5\xec\x55\x47\x68\x51\xe6\x70\x59\x5b\xb8\xa6\xdc\x2c\xb7\x2f\x13\x52\x81\x82\x5c\x3b\x30\x45\xe6\x12\x33\x5c\x04\x91\xc2\x3d\x04\x38\x24\xee\x85\x20\xab\x0f\x72\x77\x61\xcb\x1c\xb8\x8e\x62\x67\x03\x7d\x38\x1b\xe8\x8e\x9e\x86\xa2\x92\x12\x0d\x32\x82\xcb\xa5\x9e\x1d\x29\x75\x24\x77\x8b\x4b\xe2\xa0\x5e\x01\xfc\xe6\x99\xc6\xf2\xe4\xad\x31\xcf\x3e\x56\x5e\x07\x36\x6d\xf4\x0e\x38\xbc\x03\xab\x59\x44\xc1\xce\xb4\x0a\x81\x3f\x02\xab\x47\xbe\xe0\x39\xc0\x6e\xf0\xc7\x23\x45\x62\x19\xe5\x1e\x1b\x15\x26\xad\x70\x80\x35\x41\x10\x24\x6d\x8f\x53\x7b\x58\xab\xf0\x23\x5b\x77\x55\x2c\xef\xc5\x3d\xcd\xe2\xb3\xeb\x2d\x71\xe9\x65\x76\x5e\xbc\x15\x0a\x4a\xae\x31\xa8\x84\x47\xc7\x32\xd7\x05\x7c\xe6\x6f\xdb\xf4\xac\xa5\xa1\x08\x0d\x2d\xcd\xa4\x33\x5e\x77\xc6\xeb\xea\xf5\xe0\xc6\x6b\xf3\x4e\x19\x0b\xb6\x74\x5c\x1d\xc4\x00\x4f\x9a\x86\xd2\x3e\xa4\x15\x34\x20\x30\x48\xdd\xab\x71\xf0\x15\xb9\x0d\x8f\x48\xb1\xb6\x81\xac\xe7\x28\x10\xb0\xea\xa7\xb7\x98\x3e\x90\x1d\xb4\x79\xad\x5e\xbc\xd6\x85\xe0\x6e\xaa\xdd\x0b\x52\x43\x50\x6c\xb7\x6f\x91\x90\xfb\x56\xef\x12\x71\x51\xc6\x0e\x81\x98\x5b\x94\xea\xc4\xab\xe5\xe4\x93\xd6\x0b\x40\x5a\x16\xd2\xc5\xab\xed\x6a\x90\x1d\x8a\xea\xe2\xf5\xc4\xa5\x75\xf1\x6a\x6d\xe2\x26\xed\xcb\xec\xd6\x0c\xf7\x61\x8b\xed\xee\x38\xb4\xc7\xb7\xde\xf7\x8b\x12\x6f\xcf\x9f\xad\x77\xd6\xfb\x95\xeb\x11\xad\xf7\x01\xe1\x76\xc4\xc0\x4e\x40\x68\xd1\x0f\xcd\x6d\xce\xac\x3f\x66\x4e\xac\x1c\x16\x08\x64\x66\xcb\x39\x83\xbe\xcc\xca\x6e\xd3\xa3\xe1\xf0\xe8\xc8\x99\xf9\xed\xfe\xcc\xf5\x64\xf0\x6f\x84\x89\x48\xc6\xb8\xa8\xa6\xfd\x4c\x69\x60\xfa\x85\x76\x1e\xf6\x65\xee\xbe\x15\xba\x5e\xa1\xed\x76\x4b\xd2\xe2\x04\xb7\x2f\x9d\x5d\x37\xd3\x8f\x51\x40\x3b\x2c\x93\x5d\xae\x8a\x8d\x4f\xec\x53\x0a\x3b\x9c\xbc\x07\xe7\xaf\x8d\x8b\x63\xe3\xb5\x0b\x7b\xdd\xa1\x50\x36\x5e\x8f\x5c\x2e\x1b\xaf\x9d\x38\x6a\xab\xd2\xd9\x35\x83\x7b\xbc\x02\xda\x78\x3d\xd3\x62\x2a\xe5\xab\x55\x31\x6d\xbc\x76\x2b\xa9\x5d\x7e\xb7\xe5\xd2\x1f\xa4\xbc\x36\x5e\xed\x8a\x6c\xe3\x75\xe8\x52\xdb\x78\x35\x9c\x09\xb0\x81\x5f\xf0\x56\xc9\x03\x97\xf6\x9d\x72\xe4\xa3\x66\xf3\x54\x66\x34\x5b\x92\xd8\xda\x1a\x96\x35\x09\x98\x41\x06\xe6\xde\xa8\x28\xd0\xf7\x98\x67\x07\xca\x1f\x68\x91\x7c\xc9\x62\x9e\xaf\x2d\x59\xbc\x6e\xda\x7e\x00\x34\x2c\x8b\xa4\xe5\x9c\x9b\xd8\x94\x87\x12\xa4\xd1\x9d\xad\x91\xe3\xe6\x10\x39\x7d\x08\xb9\xd3\xab\x20\x1f\x83\x31\x0c\x3c\x7d\xb6\x16\xa0\x7b\x18\xdb\x2e\x19\xae\xd0\xe5\x61\x7d\xff\xc7\xf6\xc1\x13\x23\x7f\xbc\x05\xa6\xf7\x48\x6b\x42\x5a\x26\x99\xf1\xbf\x33\x28\xb0\xd5\x1a\xc2\x4a\x82\xd8\xed\x0b\x7f\x25\x32\x0a\x1c\xcb\x25\xf6\x03\xb3\xee\x77\xb6\x33\xcc\x9b\xb9\x37\x5f\x47\xe1\x01\x2c\x3a\x89\x42\x5f\x1d\x8f\x00\xbb\x11\x44\x74\x98\x3b\x3f\xdf\xb7\x41\x19\xbc\x5c\x99\x2f\x01\xb4\x7a\xf0\x4c\xf1\xa1\x7b\x07\x21\xa9\x83\x4a\x65\x65\xc5\xc2\xdc\x19\xb9\x19\x08\x94\x32\x48\x4f\x70\x52\xb8\xca\x41\x06\xb4\x5f\xb1\xb2\x90\x9c\x80\x3f\xaa\xa8\xfb\xe5\xd1\x0b\x57\x76\x95\xe0\x49\x79\x5b\x39\xe8\x36\x3f\xf0\x5c\xd8\x28\x82\x95\x3d\x52\xbf\x45\x72\xc5\xb2\xc1\x34\xe7\xf1\x2e\x9b\xe3\x19\x73\xb7\xc6\x3c\xad\x3d\x27\x6b\xc9\xbf\xf6\xe0\x5a\x3e\xca\xa2\x05\xdd\xef\x5d\xfa\xd0\x8c\x12\xe1\x0f\x21\xe1\xca\x61\x1a\xd4\x45\x02\xf8\x23\xe7\xfc\x3d\xb7\x5e\x6f\xb5\x0c\x21\x5a\x46\x36\x4d\x96\x97\xf0\x1c\xb1\x59\xdc\x79\x10\x95\x3a\x30\xff\x71\xfa\xad\x33\xd6\x8f\xd9\x44\x16\x25\x40\x50\xdd\xb1\xb1\xb4\x31\x4b\x18\xd4\x49\x77\x35\xd8\xcd\x03\xe0\xe6\x9d\xcb\x85\xd9\xcc\x3f\x09\xf2\xc1\x81\xd2\xf3\xc9\x2b\x42\x4f\x4a\xa9\x0a\xb6\xac\x8a\x60\x2c\xc6\x00\xdb\xa4\xf8\x4e\x96\x0b\xd5\x27\xe3\x13\x17\x6c\x02\x27\x4e\x18\x99\x2f\x71\xe2\x2c\x2a\xcd\x19\x33\x13\x00\x09\xbf\x99\x9c\x13\x25\x68\xaa\x66\x12\xaa\xeb\x47\x34\xa5\x11\xd7\x4b\x33\xdd\x3a\xa3\xd1\x1d\x94\xe1\xc9\x98\xfd\x62\x9f\x44\x27\x36\x5e\x2b\x9c\xc1\x72\xd8\xaf\x9e\x65\x32\x9f\xce\x20\x92\x15\x9f\x8a\x12\xaa\xdc\x04\xd4\xbe\x6f\xb5\x19\x45\xe2\xa5\xa0\x73\x1e\x79\xd0\xbc\x4c\x2e\xb8\xe2\xd2\x5a\x73\xb1\x5d\xb3\xeb\xc9\xb5\xc7\x3d\x43\x23\xf1\x79\x42\xf9\x9c\x1c\x2b\xc6\x88\xdf\x18\x78\xc7\x56\x6b\x47\xe3\x45\xc6\xcc\xeb\xa1\x05\x59\x7a\xf0\x6e\x61\x11\x07\x0a\x4a\xe7\x5d\x54\xc8\x28\xe1\xb8\xc5\xf5\x9f\x3e\xf1\x4b\x57\xdf\x33\x99\x81\x63\xde\xa1\x56\x32\x11\xcb\xc0\x3d\x79\x76\x7d\xa5\x42\xb5\x03\xf7\x99\xc5\x76\x83\x1b\x89\x14\xd3\x30\x65\xbf\xd8\xa5\x86\xac\x0a\xa8\x65\xb2\xe0\x71\x4e\x13\x24\xa8\xb6\x33\xe7\xa3\x2b\x7c\x9d\x4f\x67\x7a\x70\xcf\xc0\xec\x82\x7c\xa7\x08\x6d\x72\x1f\xe5\x2b\x61\x39\x5c\x01\x01\xd6\xd6\x6c\x80\x26\x2c\xd3\xb5\x7b\xba\x04\x7c\x17\x1b\x42\x52\xf2\x8c\x3a\x6c\x2d\x6c\xc2\xcf\x7b\x30\xe9\xd0\xbd\x33\x5f\x9b\xc2\x48\x0c\x60\x97\x32\xb3\x0c\xbb\x76\xb5\x6f\x66\xe2\x03\xac\x3b\xff\xb3\x2d\x43\x46\xcd\x1a\x81\x14\xf7\x93\x40\x0b\x13\xb8\x3b\xc6\x41\xec\x15\x34\x81\x76\x6c\x44\x38\x82\xc0\x7a\x7b\x0c\xbf\x63\x82\x65\x3c\xaa\x6c\x1d\xff\xea\x94\x6a\x38\x7c\x4c\x98\xd7\xe2\xe1\x66\xd5\xe8\x01\x64\xbc\x45\xb1\x95\x6e\x6d\x35\xc2\x96\xd2\x47\xef\x87\xc0\x0a\x17\xf8\x4d\xcc\x29\xa5\x22\x1e\xd0\xc4\xec\xcf\xeb\x8f\xe7\x36\x2e\x1a\xcf\x5d\x29\x2e\xc0\x15\x16\xe2\xc2\x23\x51\x1b\x29\xa5\xf6\xb8\x41\x02\xfc\x98\xc5\x40\xa6\xc2\x1a\x8c\xf7\x46\xe1\xb6\x5b\xe4\xfa\xe3\x79\x9f\xf0\x21\x1b\xba\xbf\xfc\xa3\x8e\x4e\x6a\x39\xc5\xa8\x42\x1f\x29\x0a\xbb\x1b\xba\x12\xda\xb6\xc2\x77\x7f\xf9\x77\xd3\x49\x73\xf7\x2f\x83\x7f\x0f\xb0\x3d\xff\xf2\x8b\x59\xef\xcc\x3c\x50\xfe\x35\x0c\x4d\xf3\x40\xf6\xbf\x5c\x5b\xa0\x67\x0b\x03\xfd\x8b\xad\x6f\xc5\x84\x36\x82\xe9\xb5\x04\xa7\x3f\x8f\x71\xcf\xc3\xb7\x33\xf6\x37\x67\xa7\x84\x69\xf2\x36\xa2\x88\x6a\x26\x80\x35\xb8\x1c\x0e\x21\x35\xbe\x6e\x4b\xb9\x9a\xfe\x1f\x83\x85\x01\xd3\xcd\xfa\x44\x4b\x09\x87\x1e\x09\xcb\x99\x20\xcc\x95\xbf\xc4\xb1\xc2\x74\x50\x1b\xf7\xe6\xb8\x9d\x69\xd6\xcc\xb0\xcf\xc8\x35\xfd\x80\xbe\x7d\x29\xa4\xfe\xd2\x2f\x7f\xa5\x30\x37\x5d\x48\xee\x30\xbd\xcd\x79\x14\x58\x24\xd1\xa3\x4c\x8f\x97\x64\xce\x95\xa6\x77\x6c\x48\x46\x86\x9b\x85\xce\x35\x9c\x3d\x41\x00\x0b\x92\xc5\x24\x17\x9a\x27\x70\xb7\x68\xc7\x74\x39\xe4\x72\x57\x13\xa2\x72\xa8\x18\x9e\x66\x6c\xe0\xf8\xa6\x7d\x6a\x85\xe2\x14\x63\xe9\xfb\xc5\x9e\x51\x54\x36\xd2\x18\x5e\x85\xf9\xa0\xc2\x6e\xaf\x95\x68\x30\xd3\x4f\x29\xa2\x82\x57\xc2\x64\xaa\x21\x79\x07\xec\x31\x71\x1e\x66\xd4\x7b\xac\x3d\x54\xb0\x88\x29\x45\xb3\x65\x1f\xb0\xd2\xb9\xc7\xd7\xb6\x01\x40\x40\x3c\xe6\x54\x20\x52\x79\xc6\x22\x29\x94\xce\xf2\x48\x63\xe9\xba\x71\x26\xef\x98\xf0\xd1\x87\x9e\x30\xf9\x30\xb0\x22\x1c\x07\xdc\x67\x92\x44\x33\x2a\xa6\x41\xe9\x97\x39\x8d\x61\xee\xbf\xf7\x72\x95\x1b\x8f\x99\x01\x3a\x31\xa2\x0c\xd7\x30\x15\x63\xc3\xb0\xbc\x55\xf7\x27\x41\x9c\xe2\xde\x2f\xcc\xae\x66\x48\x3c\xd9\x42\xbb\x5a\xd1\x2f\xd2\xd2\x46\x38\x00\x29\xe1\xc0\x61\x64\x73\xa6\x69\x4c\x35\xdd\x21\x94\xec\x6d\x51\xaf\xce\x95\xac\xc7\x9a\xa1\xde\xcf\x69\xb9\x9d\x13\xf0\x64\xca\xc3\x74\x29\x38\x89\x33\x37\xf3\x90\x7f\xad\xcd\x9e\xb2\x7e\x07\x8c\x10\x03\xf1\xc9\x15\x04\x33\xcd\xbb\xd6\x90\x5c\x14\xd5\x0e\x0b\x72\xd2\xcc\xab\xd5\xd2\xa0\x6b\xa6\x7e\x87\x39\xba\x2d\x5c\x6f\x51\x39\x5c\xac\x56\xd0\x41\x2e\xc1\x84\xe6\x19\x0b\xb3\xd3\xec\xd4\xe5\x02\x37\x79\x65\x12\x61\x96\xa7\x4c\xab\x22\xe0\x05\xe9\xb0\x21\x2e\x96\xdf\x59\xf5\x17\x88\xb4\x9d\x58\xab\x41\xd6\x4b\x5c\x38\xed\x4a\x5a\x3a\x6b\x28\xff\x83\xcc\xeb\x2e\x36\x6c\x44\xe8\x7f\x2b\xe3\x36\x66\xef\x0a\xb0\x7d\xd1\x44\x11\x05\x8a\xf1\xbc\x0a\xcc\x08\xf8\x0d\x70\x7e\xa9\x52\x8e\x1d\x12\xb9\x19\x5d\xec\x6e\xf3\x2a\x24\xb1\x81\x07\x05\x86\xcf\x0d\xe0\x73\x83\x97\xcd\x6d\x83\x6d\x02\x4a\xdc\xd5\x38\xb0\xa4\xfc\x91\x56\x86\x58\x43\x52\x46\x2d\xad\xa7\x55\xc4\x72\x4f\xed\xad\x3b\xd2\xbb\x80\x6d\xca\x04\xe3\x86\x4e\xbc\x22\x5f\x96\xf8\xbb\x95\xa3\xbc\x56\x86\x91\xbe\xc7\x4e\x4d\x1b\xda\x45\x70\x09\xe9\xe5\xc7\x4f\x2a\x8d\x81\x60\x51\xaf\xb1\xb8\x88\x62\x2f\xec\x19\xc1\x2c\x03\xbb\x9c\x4b\x64\x30\x1b\x2b\x93\x49\xc2\x32\x18\x82\x55\xd3\x2a\xee\x78\xc0\x12\x45\xe3\x70\xdf\xab\xc3\x5e\xba\x14\xec\xde\x8b\x11\x54\x21\x6a\x8b\x73\x9d\x31\x5b\x85\x6e\x6d\x7b\x3e\xea\xf9\x4c\x2c\xb1\xeb\x17\x7e\x59\xd6\x09\xe7\xfd\xb0\xa2\x1b\xf4\x85\x26\xf7\x74\xa9\x60\xc7\x17\xda\x82\xff\xbe\x45\x48\x2b\x1a\xbe\x61\x13\x7c\xbb\xb1\x6b\x6d\x27\xe7\xda\x2e\xee\x35\xc8\xbb\xe4\xa2\x49\x2c\x53\xf1\xc2\xc6\x2a\x1c\xd5\x6b\x17\x7f\x1c\x04\xbc\x80\x1f\xbe\x9d\x73\xa5\x0c\x79\x7a\x7d\x05\x4d\x38\x69\x7c\x0a\x7f\x38\x5e\xe3\xbd\x0f\x63\x66\x76\x75\x91\x51\x0d\x3b\x24\x7c\xb7\x26\x24\xa1\xd8\x5a\xdf\x03\x2c\xaa\x35\x40\xfb\xb2\x5d\x19\x83\x90\x12\xf8\xe2\x10\x60\xff\xa9\x58\x5a\x1e\xae\x67\x3c\x8b\x07\x29\xcd\xf4\x12\xd5\xd3\x7e\xe9\x6b\x3e\x3c\xbf\xd5\xc0\x77\xf4\x0b\x35\x43\x1c\x5e\x3b\xc3\x30\x78\x57\x7a\xcf\x1a\xfe\xd7\xce\xeb\x63\x8c\xa7\x79\x02\x40\xed\x78\xde\x05\xf9\xf0\x4e\x17\x7c\xb2\xf1\xc4\x21\xf9\xd8\x95\x63\x54\xbc\xb6\x48\xf8\xc3\xca\x4f\x32\x0c\xa0\xf6\x1c\x1d\x94\x1f\xd3\x81\xbe\xd1\x39\x69\x51\xaa\x3b\x30\x1b\x5a\xa9\xc0\x85\xdf\xd8\x42\x41\x62\x69\x8d\x41\xe1\xb7\xc2\x06\xfc\xb9\x20\xc7\x42\x0a\x3c\x2b\xf8\xec\x09\x46\x1f\xad\xb1\x76\xc1\x23\xb6\xc2\x5b\xb9\xc0\x66\x70\x36\x1d\x5b\xe0\x22\x36\x8b\x05\xb4\x1a\xf4\x21\x95\x47\x11\x63\x5e\x83\x0e\xeb\xbd\x14\x67\xd9\x76\xd9\x55\x8a\x54\x12\xa0\x5c\x94\xa6\x49\x52\x68\xae\x76\xba\x24\x70\x36\x67\x5c\x0c\x18\x5e\x29\x35\xc7\x2a\xf1\x50\x83\x1c\x23\x66\x72\x11\xa1\xf7\x9f\xeb\xa5\xeb\x41\xc8\x81\xe0\x35\x50\x19\x14\x2a\xb4\x7c\x82\x96\xac\x40\xf4\xf7\x93\x09\xc4\xc8\x56\x40\x2f\xf3\x22\x0b\xdb\x60\x28\xcf\x98\x46\x77\xf7\x34\x8b\xa1\x12\x6e\x4a\x35\x47\x20\xee\x7e\xa9\xd9\xe3\xa0\x0f\x50\x87\x3e\xdc\x7c\x27\x5e\xc1\x80\xf2\x1a\xb2\xf2\x19\x42\x73\x2d\xe7\x54\xf3\x08\xd4\x56\x3e\x09\xec\x92\x73\x8f\x5b\x58\xa9\xda\x07\x74\xd5\xd7\x7f\xbf\x45\x5f\x4f\xc6\x88\xbe\x97\x84\xcf\x8d\x4c\x40\xa1\x00\xc5\xc4\xe7\x18\x39\x23\xea\xa6\x9e\x1a\xc1\xe7\x07\x30\x61\x07\x4f\xa1\x42\x6c\xd4\x25\x05\xcd\x7b\x1b\xa9\x37\x0e\xda\x24\x9d\x7e\x85\x65\x13\xf7\x96\xd9\xd5\xa6\xb7\xc1\x66\xed\x9b\x05\xba\x67\x46\x16\x50\x1b\xb7\xac\x1a\xd6\xf5\x09\x8b\xc2\x2a\x12\x73\x55\xa9\xec\x7c\x1c\x67\x32\x4d\xad\x39\x64\x7e\xb2\xda\x27\xf0\x4c\x64\x0b\xa6\x82\xf2\xc5\x68\x09\x9f\x32\xe1\xeb\x6f\x5b\xb4\x0b\x38\xbd\xd5\x8f\x40\x64\x17\x09\xc0\xcf\x8e\xcf\x92\x74\x46\x4f\xc8\x07\x5b\xa8\xc7\xef\x5f\x1f\xb7\xd7\x48\x62\x42\x03\x8b\xb3\x68\x76\xa2\x4e\xc3\xab\x13\x75\x3a\x51\xe7\xf7\x2d\xea\xf8\x80\xb1\x5d\xc5\x9c\x1b\x1f\x25\x59\x29\xeb\xed\x22\x0e\x8a\x30\xca\x87\xb7\x5b\xf8\x6f\x3d\x30\x05\xdc\x8d\xda\x60\xe8\xc4\x1e\x3b\xe7\xe8\x0d\x06\x5f\x14\x15\x9e\x75\x10\x0f\x52\xc4\xa2\x18\x69\x23\xd7\x2c\x98\x7a\xcb\x84\x5a\xcf\x75\x29\xb7\xf4\x14\xab\x8a\x0c\x7c\xb3\x83\x22\xfc\xa3\x01\xb4\x78\x78\xed\x34\xeb\x64\x8f\x34\xca\xf0\x7a\xc6\x11\x20\x95\xc1\xb6\x8f\x71\x24\x7b\xc6\x39\x92\x7d\x62\x1d\xc9\x21\xe3\x1d\x89\x8f\x9a\xde\xe7\xc4\xdc\xb8\x78\xed\xca\x99\xb1\xc4\x69\xd3\x99\x29\x65\xeb\xfb\x76\xb8\x72\x15\xeb\xac\xb7\xcf\x9f\x01\xb0\x97\x85\x51\xb7\xf6\xb4\x82\xe2\x83\x2e\x3d\xf6\xc9\x63\xe3\x06\xbc\xbe\x28\xdf\xac\x25\xb8\xff\xe7\x29\xc2\xec\xc0\xa9\x1b\xd8\xd8\x28\xa7\x58\x74\x27\xb8\x3b\xc1\x4d\xdf\x7f\xca\x13\x8c\x71\xc5\x6d\xc2\xde\xcb\x72\x35\x3a\xf1\xc8\xaf\x39\xcb\x96\x44\x2e\x58\x10\x4f\x03\x20\xc0\x8a\xc7\x36\x22\xc5\xda\x1c\x9a\xcb\xb2\x8f\xc8\xf3\xc1\xa2\x71\xf9\xc9\x48\x46\x90\x21\xb6\x07\x2d\xab\x36\x55\x4e\x02\xc6\xd9\x72\x93\xee\x88\x97\xa1\x22\x6a\x68\xd1\xc1\x8a\x5f\x40\xdf\x3f\x7b\x77\xb1\x9b\x02\xd0\xce\xbf\x43\x76\xf1\xf1\xac\x0c\xfe\x6c\xc3\x00\x71\x22\xfc\x9d\x72\xfd\x23\xaf\xa5\x93\x3b\xb6\xec\x5b\x97\xb0\xc5\x35\x77\x0f\x63\x64\x43\x19\x8c\xb3\x29\x08\x44\xdd\x04\xed\x40\x15\x77\xd3\xaa\xf1\x6a\x0e\xdf\x58\x7e\xcb\x4d\x42\x5b\xe2\xbb\x33\xd9\x6e\x05\xf3\x18\x5e\xa5\xad\x60\xa1\x49\x21\x70\x0e\xf6\x04\x40\xda\xb9\xa0\x62\xbf\x0d\x20\x90\x1a\xa8\x45\xdb\x45\x24\xbb\xab\x86\x78\xb9\x89\xdd\x7b\xa8\x7e\x9b\x96\xa2\x62\xef\xd8\xf2\x48\xd9\x7c\x3c\x29\xd4\x8c\xa7\x0e\x45\x1d\x28\x81\xdd\xb9\xe4\x23\xb8\xca\x5d\x13\x78\xe6\xaf\x44\x9f\xbc\x93\xda\xfc\xef\x12\xa2\x66\xd0\x90\x27\x99\x7a\x27\x35\xfc\xf2\xe8\x93\x85\xdd\xdd\x7b\xaa\xac\x0d\x8f\x83\x05\x0e\xa3\xbb\x20\x17\xc2\x45\x63\xc0\x94\x58\x07\xa4\x9f\x56\xae\xc8\x95\x20\x32\x73\x73\xa2\x1d\xec\xae\xb2\x4d\x38\x9b\x4b\x60\x30\xad\x69\xc3\x4e\xa5\xcc\x4a\x33\xb9\xa1\x39\x6f\x7b\xe5\xee\x0e\xd8\x64\xc0\x58\xed\x43\x48\x00\x3c\x96\x6a\x36\xe5\x11\x99\xb3\x6c\x0a\x99\x97\xd1\x6c\xf7\x05\x6a\x4f\xb7\xf1\xda\x89\x7a\x87\x1f\x6e\xbd\x33\x80\xd5\xbd\x81\x20\x9e\x7d\x19\x26\xb6\x82\x2c\x62\x4e\x53\xb3\x29\xfe\x61\x38\x01\xac\xcb\x3f\x01\xec\x59\x0d\xc9\x99\xab\xc0\x19\xde\xb3\x86\xb6\xb0\x19\xd3\x82\x91\xe3\x7f\xcd\xf9\x82\x26\x0c\x43\xdb\xa8\xf0\xb8\x98\x72\xb2\xc2\xa6\xfb\x16\xf1\xd9\x50\x29\xef\x38\xe9\xdd\xb1\x65\xaf\xbf\xb2\x91\x7a\x57\xa2\x57\xa4\x3f\x97\xb6\x8e\x67\x68\x60\x53\xef\xc1\xbd\xde\xa1\x39\xfb\x13\x89\xf3\x3b\xec\x12\x6b\x04\x3a\x4f\xa8\x52\xed\x32\x47\xd7\xe3\x8f\x8d\x82\x36\x8b\x0c\x1e\x1b\xb0\x18\x61\x40\xd4\xe1\x6c\x55\x10\x47\xdf\x3e\xb8\xa6\xd5\x2c\x2d\x6c\xf9\x90\xe6\xd0\x07\x55\xaa\xea\x1b\xf0\x89\x12\xf7\x61\xae\x59\xe1\x93\x5c\x33\x5f\x1f\xc1\xeb\x21\x27\x21\x5e\x22\x57\xa0\xe2\x72\x97\x3a\x21\xa4\x26\x5c\x44\x49\x1e\x23\xce\x23\xbc\x0a\x0a\x72\x5b\x91\x7e\x87\xc9\xd9\x63\xf3\x7c\xf4\x0d\x38\x79\xc4\x79\x3f\x57\x62\x56\xab\x6e\x2a\x70\x0d\x7a\x8f\x0f\xce\xd5\xa1\xc7\x3a\xd9\x12\x21\x58\x86\xb3\x3c\x2f\xcb\x18\xaf\xf9\x38\x63\xe4\x7c\x46\x85\x60\x49\x90\x2f\x6a\x0d\x19\xbe\x84\x13\x08\x1e\xb6\x70\xd3\x51\xb9\x72\x93\xa3\x63\xc2\x67\x27\x1f\xbc\x7a\xed\xe7\x5d\x48\xe9\x60\x95\xb0\x2d\xaa\xe1\x4c\xde\x93\x58\x92\x7b\xc0\xf2\x5f\x18\x76\x04\x9e\x48\xe5\x18\x59\xd0\x53\x88\x0d\x88\xe4\x3c\xcd\xe4\x9c\x2b\x17\x01\x6e\x17\xee\xa0\x09\x96\x49\xde\x00\x37\x67\x1d\xe0\xca\xeb\x73\xa2\x69\x36\x65\xda\x34\x43\x44\x3e\x1f\xb3\xc6\xe9\x9f\x0f\x01\xd8\xf5\xdc\x2b\x44\x1d\xb6\xc8\x13\x4e\xfd\x0f\x3f\xbc\x6b\x5d\x0a\xb6\x6e\x05\xef\x65\x96\xc4\xf7\x3c\x46\xa7\x97\x22\xc7\xa6\xe1\x93\xe7\x5f\xb7\xf5\xfe\x9e\xc7\xfb\x4d\x80\x8b\xec\x31\x13\x40\x60\x06\x6c\xe5\x22\x0e\x98\xd2\xf0\x81\x13\x72\xc9\x31\x37\xc6\xfc\x85\xa8\x2d\xf3\x31\x17\x45\x16\x96\x5f\x0c\xa0\xab\xe6\x3c\x38\x6d\x42\x31\x8d\x59\x0d\x90\x18\x20\xf5\x8c\x28\x3e\xcf\x13\x4d\x05\x93\xb9\x4a\x96\x8d\xb7\xc5\xd3\x4c\xf2\x24\x61\x9f\x70\x17\xb7\xe1\x57\xfe\xa5\x32\xdf\x9a\x62\xee\x97\x9b\xf3\x15\xc6\x55\x84\x0b\xc5\xa7\x9e\x89\xf9\x64\x19\xf6\x89\x45\x36\xb2\x35\x4d\xf2\x29\xdf\x12\xbc\xff\x3b\x83\xf8\x2e\x40\x94\x73\xc5\x8a\xcc\xf6\xa6\x45\x4c\x9e\x0e\x91\xfb\x41\x99\xf5\x6d\x3d\xec\x76\xcc\x52\x26\x62\x40\x04\x0b\xf6\x2a\x76\xf7\xa0\x73\x65\xd1\xb5\x76\xa7\x50\x97\x9f\x74\x46\x0d\xb9\x99\x43\x52\xa5\x05\xeb\xe2\x13\x42\x45\x73\xd2\xf1\x3c\x50\x70\xc9\xef\x8e\x47\x3f\x78\x91\xe4\xfd\xb0\xd7\x91\x8a\xda\x6d\xaf\xca\x01\xab\x35\x18\xe9\xf6\x2b\x61\x64\xe9\xbe\x58\xe9\xaa\x06\x1e\xba\xd2\xab\xae\x78\xe4\x67\x01\x9c\x3e\x81\x9c\xd4\x36\x70\x42\xaf\xf1\x8d\x8a\x66\x6b\x7f\xac\x16\x23\xde\xa0\xc9\xda\x7d\x1b\x90\x74\xc0\xee\xb4\x0d\xd9\xbc\x1a\xa2\xcc\x5c\x16\x21\x5c\xb9\x10\xdb\x88\xd5\x43\xe0\x61\x53\x4d\x15\xd3\xcd\xac\x1a\xab\x61\x69\x8e\xd3\x63\x2b\x08\xc0\x0e\x01\xd1\x2e\x31\x93\x0c\xfe\x62\x65\x02\x51\x7a\xd2\x48\x03\x6e\x42\x1c\xe2\x10\xf3\x6e\x5a\x6c\x23\x36\xcb\x10\x51\xdd\xb8\x5a\x4c\x23\x7a\x6f\x7b\xf0\xe1\x43\xeb\x92\xa2\xe6\x95\xca\x88\x87\x1e\x6f\x20\x17\xfc\xd7\x3c\x94\xd4\x01\x9b\xc1\x8f\xd1\x3e\x7f\xa8\x81\x4c\x23\x56\x98\x88\x2e\xb8\xba\x6b\x03\x9a\xf5\xdd\xf9\x65\xf9\xe5\xf2\x86\xff\xee\xfc\x92\xd8\x5f\x1b\x59\x71\xda\x98\x71\xf6\xc5\x74\x9a\x46\xac\x30\x8d\xc6\x5c\xdd\x3d\x7a\xc1\xee\x34\x7e\xb7\x2d\xce\xf8\xb1\xad\x4c\x0e\x57\x24\x00\xbf\x59\xca\x9c\xdc\xdb\x4c\x7a\x2b\xd4\xde\xf2\xf4\x15\xb9\x14\x2a\xcf\x58\xe1\xfd\xac\xca\xb7\x86\x93\x3e\xa7\xc2\xde\x7b\xed\x8d\xe7\x6c\xe6\x4a\x69\xa6\x41\xb2\x6d\x8d\x23\x06\x50\xf9\xf6\x65\x37\x84\x2d\x4b\x7f\x35\x71\x31\x68\x7d\x9b\x25\xec\xc1\xb6\xdc\x43\x66\xb1\x03\x60\x8c\x70\x79\x5f\x7b\x68\x1a\x72\x1a\xb3\xc5\xa9\x8a\xe9\xcb\x3e\x7c\xc6\xa5\xb2\xea\x52\x9f\xa8\x22\xbd\x97\xbd\x21\x19\xf1\x39\x4f\x68\x96\x2c\x4b\xd8\xc0\xc5\x73\x86\x05\xb8\x06\xc1\x99\xf5\xa2\x47\x8e\x65\x06\x2d\x47\x54\x90\x84\xb9\x3c\x19\x7b\xa0\x96\x28\x02\x9e\x3c\x36\x15\x21\x0f\x6a\x23\x44\x82\xd2\x76\x1b\x7c\x40\x76\x53\x82\x41\xb9\x28\x28\x36\x17\x86\x8c\x0f\xc9\x87\xba\xd2\xd7\x70\x36\xdc\x13\x4f\x35\x95\x0f\xaa\x9b\xed\x59\x37\x7f\x45\xa1\x7b\xba\x69\xda\xae\xd5\x4d\xb9\xbe\x61\xa9\x6c\x25\x00\xe0\x2b\x15\x4b\x18\xd7\xe6\x07\xa9\x38\xe0\x65\x52\x0d\xd5\x67\x33\xcd\xa3\x3c\xa1\x46\x26\x46\x3b\xd8\x90\x5c\x5c\x5e\xdf\x5c\x9e\x9f\xdd\x5e\x5e\xbc\x22\xae\x25\x1e\x4a\x6b\x43\x72\x1b\xa2\x08\x05\x21\xaf\x16\xaa\xc5\x7f\xab\x6f\x89\x0f\x15\x05\x0c\x21\x60\x43\x50\x41\xae\x04\xd7\x05\x4a\x2f\x06\x69\x25\x52\xd8\xb0\x2b\xf3\xb6\xb5\xc3\x4d\x39\x86\x4e\x08\xdb\x98\xb9\x5d\x6e\x0d\x4e\x07\x22\x7e\xfa\xae\x6c\xd1\xe2\x1e\x40\x72\x28\x26\xf7\x50\xb2\xbb\x03\xe6\x6c\x79\x3c\x6e\xd1\xc0\x5e\x60\xa3\x22\xc5\xf7\x70\xe0\x0e\x15\xa5\xa6\x50\x32\x31\xbc\xe4\x68\x78\xe4\x04\x85\x64\x05\xfa\xdd\x37\x1a\x02\x3f\x95\xf7\xd6\x90\x90\xf7\x2e\x84\x19\xb2\x56\xeb\x51\xe4\x11\x4a\x20\xc0\x22\xaf\xec\x50\x57\x1a\x20\x1f\x87\x1f\xb5\x48\x51\x53\xbe\x60\x02\x07\x76\x58\x82\xe4\x3e\xdf\x72\xce\x6f\x8a\x7e\x7f\xb8\x79\x73\xd8\x2e\xe1\x39\x6b\xd9\xa1\x73\x39\x9f\x23\x7e\xd0\xcc\x67\x9f\x15\x09\x64\xfe\xb4\x1f\x4c\x61\x41\x24\xa4\xc9\x96\x4d\x5d\xa1\x53\xee\xa5\x8a\x82\xe2\x7f\xb6\xd1\xf8\xa2\x90\x53\xdb\xc3\xfc\x5a\xd0\x2d\xe5\x20\x35\x2c\xc9\x3e\xf5\x3d\x3e\xbd\xb9\x3c\xbb\x78\x7b\x39\x9c\xc7\x8f\x4e\x32\x98\x88\x53\xc9\x85\x56\xdb\xd5\x92\x6d\x45\x4d\x9a\x93\x15\xff\xd1\xb6\x5c\xf7\xd2\xbd\x18\x86\x38\xb8\xd6\x02\xac\xb2\x98\x69\xca\x13\x15\xac\xa3\x96\xa9\x4c\xe4\xb4\x1e\xf3\xb7\xc5\x02\xfd\x01\x91\x47\x06\x74\x60\x56\xfe\xb0\xf2\x7a\x93\x52\x0d\xe5\xf9\x70\xa5\x19\x00\x63\xd0\x8f\xd5\xcb\xc1\x50\x51\xe1\x99\x0e\xf7\x41\x04\xaf\x95\x39\x40\x6d\x10\x0e\xb1\x83\x71\x2b\x70\xd1\x82\x32\x29\x4d\x25\xb2\x87\x9e\xba\xed\xc2\x98\xa1\x41\xdb\x6b\xe1\x94\xe7\xec\xaf\xf6\x9d\x32\x91\x4b\x33\x36\xf0\x40\x3e\x50\xbd\x43\x66\x01\x77\x0d\x69\x9e\x33\xbc\x38\x33\x0d\x3e\x95\x2c\xab\x06\x98\x42\xf6\xf1\x56\x2b\xcc\x43\x4f\x92\x65\x01\x0d\x68\x55\x61\x3a\x45\x80\x9e\xcc\xda\x6f\xd3\x8c\x2f\x78\xc2\xa6\x00\x02\xca\xc5\x34\xa8\xa5\xe8\x32\xd6\x01\x1c\x9e\xad\xf4\xcb\x2c\x95\xd2\x21\xf4\x33\xec\x8b\x77\xef\x6f\x01\x58\x16\x9c\x82\x7b\x0b\xd8\xe6\x83\x50\x68\x64\x30\x18\x80\xde\x7f\xfc\x37\x23\x2b\xc6\xc9\x09\xf9\x81\xd9\xef\x48\x00\xbf\xcd\xa0\xda\xcc\x4c\x7a\xf4\x51\xe8\x6b\x31\xb3\xb0\x1d\xd1\x69\x6e\x9f\x3a\x35\x4f\x1a\xc1\x08\xd9\x4d\xe9\x79\x28\xae\x89\x70\x7e\xe8\xef\x79\x7c\xb9\xf2\x80\xa4\x7f\x67\x2a\xe7\xac\xa2\x75\xfb\xd3\x7b\x64\x52\x4b\x0f\x29\x51\xcb\x79\xc2\xc5\x5d\x81\x18\x35\x91\x66\x0f\x61\x8c\x3e\x17\x77\x6e\xc7\x66\x8c\x26\xeb\x29\xe5\x2e\xfb\xe3\xa0\x54\x52\xef\x60\xbc\xbb\x5d\xa6\xe8\x0b\xf7\xc7\xde\xba\x7a\x43\x12\xd7\xeb\x3d\xbb\xf1\x72\xd5\xae\xd2\xfa\xd1\xd5\xe8\x7c\x54\xaa\x12\x6a\x74\x3a\xf8\xed\x31\x8d\xcb\xeb\x58\x02\x0c\xe7\x09\x25\x3b\xfe\xeb\x36\x4f\xed\x80\x24\xf9\xf6\x67\x30\xcc\xe7\x5a\x66\x9a\x26\x07\x22\x02\xd1\x8c\xa6\x67\xb9\x9e\x5d\x70\x15\xc9\x05\x6b\xad\xea\xdc\xcf\x10\xb5\xd7\x01\xc6\x71\xb7\xe8\xd8\x1a\x39\xff\xeb\xd9\x35\xa1\xb9\x59\x45\x6d\x61\x25\x0f\xea\xe2\x76\xfd\x1f\x61\x40\xfd\x41\x7a\x6f\xdb\x7a\xf0\xbe\x77\x0e\x81\x03\x3a\x04\xe0\x8c\x3f\x67\x27\x00\x17\x5c\x73\xaa\x65\xc3\x5a\x56\x65\xfd\x3d\x57\x5a\xce\xed\xf6\xbc\x72\x0d\x81\x57\x16\x18\x6e\xa9\xed\x32\x46\x3f\x08\xda\x30\x39\x57\xc2\x88\xc5\x34\x62\x95\x08\xc0\x3e\x20\x37\x62\xdb\xdc\x3f\xf3\xef\x36\x32\x13\x20\x9f\x92\xbf\xbc\x2a\x21\x69\xaf\x14\x42\x70\x46\x85\x02\x5c\xff\xa0\x96\x18\xfe\x6b\xdb\x93\x6d\xcd\x5e\x38\xaa\xff\x9b\xd3\x04\x67\xe3\xdd\xa1\x6d\x44\xe5\x99\x6d\xd9\x49\xb7\x9e\x6e\xce\xdf\x79\xad\x39\x57\x88\x16\x85\x4f\xe8\x8c\x0a\x65\x16\xa2\xac\x1b\x1d\x59\xd7\xce\x11\x39\xd6\x51\xda\xb8\x5c\xfb\x03\x45\x66\x63\x57\xed\xbc\xbf\xf1\x11\xd9\x4d\x7b\xf5\x20\xde\x16\xd8\xbb\x6d\x4d\x1b\xa5\x81\x20\xb3\x25\x6f\xb8\xd2\x0e\x16\x1f\x7e\xe0\xca\x62\xba\x82\xa4\x73\x6d\x54\x27\x9e\xfe\x37\x8d\xe3\xec\x15\x72\x12\x57\x52\x37\x03\x79\xc7\xe1\x2e\x51\xe1\xfd\x71\xc7\x7a\x99\x5a\x68\xb6\xdb\xf3\x6b\x82\x55\x31\xfe\xed\x1b\x2c\xe7\xf9\xa7\xaf\xbe\x79\xd1\x78\x41\x9f\x2e\xfc\x79\x47\xcb\xc1\xc1\x3d\x36\xcf\x22\x6a\x0e\xc4\x05\x8c\x97\x03\x7a\x68\xcf\x2e\xee\x23\xb3\xa8\x9e\x4a\xef\x26\x54\x74\x11\x66\x4f\x1a\x61\x46\x7c\xd2\x03\xd2\x84\xfd\xa9\x0a\x12\x94\xeb\xe7\x47\x50\xb6\xce\xc5\xf6\x5d\x53\xde\x2d\x78\x7e\x8d\x7e\x17\x78\x9f\x20\xe6\xfa\xe2\xdd\xe8\xbf\xdf\x9c\x7d\x7b\xf9\x06\x7a\x69\xe3\xaa\xcc\x36\xe0\x62\xe7\x38\xa2\xe6\xdb\xaa\x89\x26\xb8\x7d\x32\xda\xf9\x39\xde\xbd\x1e\x55\x14\x65\xf3\x4b\x4b\xe7\xc6\xbe\xd2\xb2\x98\x34\x1a\xfb\xe3\x9a\xae\xa0\x6c\x04\xcb\x0e\x97\xe2\xb0\xb3\x85\x2b\x80\x64\x2a\x29\x43\x66\xa5\xb0\x87\x7b\xeb\x2b\x5b\x57\x80\x3c\x03\x23\xbe\x19\x2f\xce\xc1\xc1\xcd\xf7\x0f\x34\x57\x4d\x59\x7c\xd6\x3e\xf7\xe5\x68\x04\x6f\x39\x27\x8f\x39\xa4\x18\x91\x93\x19\x7a\x6d\x28\x35\x53\x1e\xe4\xfe\x99\xee\x94\xb4\x0e\x11\xb7\x0d\xf5\xaa\x85\xd4\x2d\xd5\x83\x2a\x39\x36\x4a\x19\x03\xeb\x30\xa4\x9d\x6f\x9f\x5a\xf5\x52\xa5\x34\x3a\x28\xf2\x63\xf1\x13\xfe\x02\x29\xd5\x8f\x4f\x00\xe1\xb3\x07\x0c\x28\xf5\xed\xb5\xdd\xc8\xe7\xee\xc5\x6a\x22\x57\xab\x15\x72\xf5\x14\x52\xe9\x92\xe4\xc2\x8c\xaf\x27\x5e\x3e\xf2\x28\xd4\xf3\x87\x1d\x55\x97\x43\xab\x2d\xe9\x4c\x6a\x29\x76\x0e\x12\xbf\xae\x79\xbd\x7c\x8e\xf1\x89\xf3\xa2\x48\x48\x50\xa1\x0f\x22\x0c\xbd\x41\xdf\x88\x71\x8e\x4b\x48\xe1\x4c\xfb\x65\xc3\xfe\xa3\x4b\x1e\xf1\xd5\xc5\x81\xce\xdc\xe7\x94\x7c\xd8\xd6\x04\x7b\xd0\x10\x8a\xb8\x75\xc6\xc5\xd5\x85\x95\xbb\x5c\x56\x85\xb2\xdb\x8e\xac\xdf\x77\x07\xe3\x8b\x32\xd3\xf7\x32\x6b\x9f\x6a\x7c\x5d\x7a\xb1\xe2\xd5\xb7\xf7\x56\xb2\x89\x9e\xe3\x19\xc1\x3e\x3e\xf1\x39\x19\x81\xc3\xb4\x82\x15\x5d\x3d\x19\x3e\x8a\xfd\x01\x0e\xcf\xd3\x1e\x9a\x1d\xb9\xd0\xc3\xa6\xa4\x1e\x54\xf0\x76\xbb\xac\xe5\x08\x3f\xda\xd7\xac\x81\xc0\xac\x4d\x41\x24\xa8\x3f\x84\xb6\xf9\x83\x11\x85\x4c\x62\xdd\xbe\x16\xf4\xe0\x4a\xb3\x39\x16\xf8\xa5\x49\x62\xe6\x52\x8a\x10\x36\xd8\xa6\x9d\xf6\x09\x22\xef\xce\x69\xea\xaa\x25\xcb\x7b\x71\x4f\xb3\x98\x9c\x5d\x5f\x1d\xe6\xe8\xb7\x08\x2d\xc6\xfd\xd3\x0c\x09\xaa\x5c\x56\x51\xc6\x8c\x8c\xb9\x56\x45\xc1\x33\xa6\x43\x6d\xd0\x90\x37\xef\x23\x32\x87\xd4\x1c\x48\xfb\xbd\x80\xfb\x09\x22\x23\x4d\x93\x4a\x01\xfa\x17\x2f\x5e\xa0\xf1\xea\xc5\x9f\xff\xfc\x67\x2c\x42\x13\xb3\x88\xcf\x57\x1f\x84\xa7\xfe\xf5\xe5\xcb\x21\xf9\xaf\xb3\xb7\x6f\xa0\x20\x5e\xaa\x15\xc2\x5d\x60\xcb\x58\x92\x3b\x78\x59\xf5\xc9\xff\x19\xbd\x7f\x57\x94\xd2\x28\xdf\xb5\xd5\x8c\xed\xf0\x86\xe4\x22\x08\x01\x0a\xcd\x53\x54\xcf\x6c\xed\x17\x4d\xe8\x64\x82\x65\x1e\xc7\xae\xca\x28\x1e\x29\x97\xd9\x0c\x25\x99\xb1\x46\x83\x59\xfe\x04\x62\x93\x8c\x22\x8d\xc6\x3c\x97\x5c\x8f\xa1\x56\xd0\x96\xa7\x7f\xd0\x95\x3e\x16\xf5\x9e\x28\xa8\xd4\x50\x40\xc1\x65\x4c\x19\x99\xd2\x96\x9e\xc3\xc6\x7c\xd7\x4d\x27\x9e\xd2\x07\xd3\xb8\x82\x40\x69\x63\x39\xe0\xda\xa2\x3a\xf8\xdf\xd0\xad\xb8\x2d\x38\xf6\x81\x7c\x22\x65\x9e\xef\x7b\x83\x6b\x65\x53\xd6\x3d\xb9\x20\x34\x91\x50\xe5\xc8\x2f\x6d\xc1\x8f\x82\x2a\xe3\xdb\x87\xd2\x1a\x79\xaf\x2d\xfa\x2a\x52\xa1\xb7\xb4\x71\x8d\x93\xb2\x49\x3b\x48\xed\xa7\x63\x99\x6b\xe7\x02\xc6\x36\xb1\xbc\x1f\xd6\x98\x6e\x81\x1c\xb8\x03\xd8\xe0\x2e\xa0\xb3\xad\x71\x2b\xcb\x64\xbe\x24\x04\xf4\x09\xa3\xd1\x8c\xdc\xb1\xe5\x00\x09\x53\x4a\x21\x1b\xc5\x57\x91\xb2\xd8\x8e\x65\x7f\x49\xc4\x62\x23\xd9\xda\xc9\x72\x1e\xf5\x62\x17\xf9\x6c\x16\x27\x3e\x2a\x2b\xe9\x58\xcc\x48\x11\x28\xf0\x0e\x98\x38\xa8\xc3\xea\x41\x22\xb1\x08\x73\x39\xeb\xc2\x9c\x2f\x16\x9b\xd7\xd4\xa6\x2f\x17\x61\x04\x86\xd0\x59\x56\x95\x8b\x95\xb7\x6d\xd1\x61\x2b\xb6\xc1\x07\xa9\x83\xe2\x0d\x42\x11\xa0\xb4\x99\x2d\x67\x63\x9f\x75\xb3\xe4\x27\xa2\x94\x15\xa2\x98\xce\xed\xd4\x60\xdd\xa4\x5c\x24\x4c\x29\xc2\x61\x84\x73\x9a\xdd\x31\x07\x4a\x42\x93\x21\xb9\x36\x9d\xf4\xc8\x47\x88\x81\xbb\xc0\x30\x32\x73\x46\xc3\x74\x17\xf3\x91\xa3\xe1\xf0\x08\x29\x78\x4d\xf2\x4b\x8b\x9d\xb1\x1b\x80\xea\x0e\xc0\xa9\x95\x92\xc6\xa9\x42\x18\x58\x23\xb5\x01\xcc\xb1\x84\x2c\x2e\x3d\x73\x1c\x8a\x36\x86\xdf\x59\x1d\xce\x0e\x68\x9f\xbb\x82\x54\xef\x02\x51\xdd\xc8\x9d\x50\xbe\x76\x87\xa6\xde\x09\x98\x7a\xa5\xb6\xb2\x5d\x22\x7b\xcc\xda\x23\xf5\xee\x01\xa4\x3c\x6f\x05\xf2\xe9\xae\x75\x98\x30\xf3\x26\x52\x9f\xad\x56\x96\xb0\xcf\x4a\xcc\xbb\x9a\xd4\xd5\xda\x72\xe9\x6e\x85\x9c\xec\x89\xa6\x99\x81\xa7\x97\xef\xda\x55\xe7\x20\xad\x05\xbe\xea\xd5\x46\x00\xac\x5e\xcd\x9c\x72\xd5\x6b\xe5\x34\x79\xea\x9e\x06\x21\xe9\x30\x95\x5a\x02\x12\xb3\xf6\x47\x6e\x08\xe5\xdf\x2d\x8f\xa2\x46\x56\x51\x32\xc9\xb5\x4f\xcb\xa9\x61\x0d\xd0\xa8\xc3\x6d\xc6\x64\x48\xf7\x58\xc0\x28\x80\x45\x22\xfd\x6d\xcb\x33\xf0\xda\xe9\x48\xb7\xad\x30\xf6\x9b\x0d\xdc\xd8\x63\x0e\x9d\xcc\xb0\xf3\x3c\x8e\x2c\x1a\x82\x8b\x20\x2e\xc9\x30\x10\xbc\xa1\x15\x0a\x48\x4e\x1c\xb1\x95\x7a\x5a\x8f\xac\x99\x61\xc5\x76\xd1\x5a\x11\xce\xae\xaf\x0e\x28\xd1\x07\xad\xfe\xa6\x65\x7a\x30\xdd\x94\xea\xa6\x5c\x14\x23\xb7\x06\x5e\x43\x61\x9e\xbd\x68\xb8\xd2\xed\xd7\x86\x2e\x06\x66\xd5\x0a\x28\x9b\x2d\xe1\xee\x29\x68\x00\xe4\xe6\x1c\x7c\x70\x5e\x9f\xbb\x18\xf9\x88\x22\x21\xcc\x47\xab\x02\xd0\xee\x5a\x2d\x41\x06\x83\x25\x23\xa8\x4d\x82\x3a\x5e\xa0\x2c\xa6\x32\x7e\x65\x4b\xe5\x0a\x21\xb1\xea\x97\xea\x63\x71\x13\xd5\x47\x25\xd0\x08\x0a\x81\x5b\x36\x0b\x0c\xe0\x3b\x8b\x06\x3b\x95\xa9\xd9\xa7\x50\x8d\x59\x40\x18\xf9\x75\xdb\x55\x24\x7b\xd6\x9d\x21\x01\x17\xda\xad\x92\x45\xd9\x58\x8d\x2d\xf9\x3a\xd6\xd1\x8c\xcd\x29\x82\xc2\xb9\xe1\x19\x2a\x73\x9f\x71\xad\x19\xa2\xfa\xb0\x6c\xae\x88\x9c\xf4\x4b\x15\xe2\x7a\x8b\x97\xbd\x5d\xea\x79\xec\x59\x72\x85\x14\xab\x70\x80\xc9\xb8\x2e\x49\x67\x66\x5f\x83\xba\x90\x00\x92\xa3\xa8\x18\x19\x0c\x83\x59\xe0\xec\x3d\xfa\xc0\x9f\x52\x45\xea\x7b\x21\xa1\x53\x91\x3a\x15\xe9\x20\x2a\x52\xc0\x58\x1c\xc1\xb1\x13\x15\xaa\x4d\x21\xa2\x94\xd3\x9d\x8a\xac\x9e\x00\x25\xc6\x6c\x4d\xa7\x35\xc9\xac\x6c\x45\x33\xaa\xcf\x91\xd3\xa5\xec\x3e\xce\xf5\x64\xf0\x6f\x84\x89\x48\xc6\xb8\xf8\xa6\xfd\x4c\x69\x10\x6d\x0a\xf5\x23\xec\xcb\xdc\x7d\x2b\xb4\xc4\x41\xdb\xbb\x2e\xdd\x4e\x74\xc0\xf9\xea\x5e\x1f\x88\xc1\x17\x6c\xdd\x27\xc1\xda\xe1\xfb\x1c\x79\xcb\xdf\x0b\x2f\x21\xd6\x02\x86\xcd\xed\xca\x9c\x92\x63\xfc\x71\x18\xa5\x79\xdf\x3e\x30\x9c\xb3\xb9\xcc\x96\x7d\xff\x90\xb9\x59\x7a\xcb\x3e\x71\x02\x32\x41\x94\x67\x46\xd9\x4b\x96\x9f\xab\x74\xe0\x26\xe8\x91\x85\x03\xbf\x4e\xed\xaa\xc1\x84\x57\x25\xfc\xce\x03\x5d\x81\x2a\x5f\x54\xc7\x99\x78\xf0\x3d\xd5\xf7\x2a\x2a\xfc\xca\xc4\x82\x2c\x68\xd6\xa2\x74\x75\x78\xed\x29\x0f\xc4\x7c\xc1\xd5\x6e\x05\xeb\x6a\xb5\x66\x6e\x61\xbd\x64\xae\xd3\x5c\x5b\x4a\xe9\x4e\x85\x4b\xf5\xf6\xa7\xa1\x22\x14\xbd\xec\xed\xd4\x8d\xcf\xa6\x28\x2c\x5e\x3b\x96\x86\xc5\x6b\xdf\x02\xb1\xe5\x56\x76\xde\x36\x07\x2d\xf7\xec\x2e\xb7\x2d\x0e\x71\x0e\x0b\x16\x59\xe0\x13\x38\xe1\xf4\x91\x0e\x1a\xc6\x83\x1c\xd0\x56\x63\x81\xd0\x7f\xcb\x66\x9a\x03\xb9\x5e\x6d\xa6\xde\xef\xdc\xef\x3a\xb2\x98\xf8\x9d\xd3\xb5\xd1\xe6\xeb\x9c\xae\x9d\xd3\xb5\xe9\xd5\x39\x5d\x3b\x8b\x42\xf9\xfa\xac\x2d\x0a\x9d\xd3\xb5\x73\xba\xee\x37\x87\x0f\xe2\x74\xb5\x62\x5c\xe1\x71\x7d\x54\x87\xab\x2d\xeb\x72\x16\x45\x32\x17\xfa\x56\xde\xb1\xc6\x1e\x84\x46\xc2\xfc\x4a\xeb\x8f\x27\xd9\xb7\x17\x2c\x5a\x89\x07\xbb\x08\x06\x34\x8f\xb9\x11\xde\x77\xde\x40\x67\xb6\x01\x27\xa7\x1b\x52\x2c\x62\x16\xfb\x96\xdd\x21\xd5\x66\xae\x87\xe4\x8c\x64\x2c\xe2\x29\xb7\xd5\xbb\x29\xfe\x8e\x3b\xcc\xa3\xec\x73\xad\x58\x32\xb1\x68\xe7\x22\x2c\x0a\x53\x88\xe0\x96\xc2\xd5\x7e\x06\x79\x8e\x74\x20\xd9\xae\x42\x4e\xc6\xfe\xe6\x98\x95\xed\xcd\x6d\xd8\x42\x68\x14\x81\xa1\x94\x6a\xd1\xc0\xc7\x52\x6e\x33\x90\x1f\xfa\x60\xb3\x4f\x29\xcf\x60\xf3\x8e\x58\x24\x45\x93\x8a\x98\x6b\x16\xe8\xb2\xda\x92\x5b\x29\x6b\xd1\xc4\x02\xf8\xbe\xee\xe5\x82\x26\x3c\xe6\x7a\xe9\x7d\x6d\xb6\xca\x12\xc5\x13\xe3\x97\x51\x15\xd3\x48\x68\x9a\x66\x92\x46\x33\xa6\x82\x7e\xa3\xc8\x61\x13\xb1\x7c\xd4\x39\x56\x02\x03\xa9\x03\xde\x31\xac\x2f\x59\x92\x4c\x6a\xe7\x2e\x5f\xf3\xc1\xdb\xa0\x31\x78\x1d\xf9\x97\xce\x96\xe0\x53\x97\x61\x13\xd8\x2b\x3e\x09\xff\x50\x44\x26\xb1\xc3\xf7\xf8\xb7\x17\x46\xcc\x8b\xec\x1e\x34\x54\x0e\x10\x20\xb4\x24\x89\x61\xc5\x86\xf2\xad\x7f\xf9\xab\xaf\xc9\x4c\xe6\x99\x1a\x86\x49\x42\x2f\xe1\x37\x54\xd1\x9c\x98\xa8\x49\xc2\xa8\xd2\xe4\xe5\x0b\x32\xe7\x22\x37\x1c\xa8\xf5\xb6\x69\x2f\xd9\x04\x32\xcd\x37\x5f\x37\x7e\xaf\xad\x34\xb3\xea\x91\xb4\xbb\x2a\x45\x24\x5e\x2b\xd4\xd8\x93\x84\xc9\x65\x88\x63\x5d\x11\x71\x2c\xd1\x0d\x67\x5b\x68\xf9\x00\xe7\xeb\xd7\x5c\x8e\x97\xba\x4d\x22\xe2\xff\xc5\x37\xca\x19\x88\xee\xc7\x26\xe8\x22\x05\xb8\xc8\xc6\x8f\x3e\x48\xad\x84\x29\x57\x7a\x4b\xa5\x84\x22\x47\x71\xe3\x63\xcd\xd9\xca\xd4\xc8\xfb\x2d\xd3\x52\x40\x47\x70\xb2\xae\x33\x0f\x45\x11\xc3\x9a\x86\x17\x45\xa5\x1d\x21\xb1\xfd\xad\xcd\x3f\x31\xd8\x96\xdb\x20\x07\xc0\xe8\x6e\x38\xd4\x66\xd2\x95\xdb\x12\xad\xc7\x8a\xaf\x95\x4f\x81\xe2\x62\x8a\x90\xda\xf3\x3c\xd1\x3c\x4d\x8a\x71\xfb\x17\x2c\x21\x0f\xcd\x66\x34\xb0\xf4\x50\x4c\xce\x45\x28\x26\x30\x31\x1e\xfb\xb6\x98\xd0\x88\x0c\x9d\x19\x7e\x90\xd2\x8c\xfa\xc9\x83\xba\xa9\xea\xc4\x5a\xe0\x28\xf8\x01\x91\xf2\x18\x72\x9e\xd1\xc4\x0f\x34\xf4\xfd\x1c\x72\xd3\x68\x26\xa8\x68\x60\x60\x2e\xab\x7a\xf0\x12\x91\xf7\x3e\x04\x0c\x2b\x6c\x54\x76\x8b\x15\x6a\xbe\xa5\xd1\x1d\x13\x31\x96\x1f\x82\x61\xc7\x4b\x41\xe7\x16\x8a\x2a\xa8\xa9\x5c\x79\x5f\xf5\xad\xa9\x01\x33\xe5\x5c\xaa\x2e\x72\xdd\x43\xce\x41\xae\x5a\x63\xbd\x7c\x50\x58\xcb\x78\xd3\x39\x57\x68\x84\xc9\xf8\x22\x62\x8e\xff\x9b\x4f\x1d\xb2\xeb\x8b\x06\xf9\xe8\x2b\x9d\xb7\xa1\x8a\x3c\xd8\xbf\x40\xee\xbd\xf1\x1b\x50\xa7\x68\x62\x8e\xf6\xd2\xa7\x67\x56\x16\x77\xbc\x3c\x6c\x41\x95\x6c\xdc\x26\x8d\xf6\xe8\xe6\xdb\x8b\xf2\x21\xbe\xa1\xb1\x54\xe4\xdb\x44\x46\x77\xe4\x82\x81\xd0\xf5\x90\x05\x41\xb2\x71\xfc\x94\x80\xd1\x73\x3a\xdd\xe6\x1d\x1b\x90\xb9\x14\x5c\xcb\x6c\x33\xbd\xe8\xea\x13\x3e\x09\x1c\x71\x36\x8e\x9f\x35\x18\xb1\xd9\x60\xbb\x54\x23\xcc\xe0\x18\xc2\xeb\x0e\xcb\x6f\xc7\x43\xf5\x87\x99\xbc\x1f\x68\x39\xc8\x15\x1b\xf0\x06\xfe\xd6\x16\xa3\xbb\x63\x4b\x70\x32\xb7\x1c\xdf\xf7\xf8\x5a\x49\x39\xd0\x12\x6c\x4a\xf0\xbb\x61\xd1\x37\xdf\x5e\x18\xde\x30\x0c\x85\xbd\x53\xa6\xa3\xd3\x88\xa5\xb3\x53\xfb\xe1\x67\x39\x29\x8e\x5a\xb4\x9d\x95\x33\x12\xc9\x24\xb1\xf9\xce\x72\x42\xce\x59\x3a\xf3\x8d\x3d\xf6\x48\x9f\x0e\xea\x36\x95\xb2\x2d\xe4\x67\x70\x60\xcc\xdb\xf6\xbc\x04\x1b\x27\x1b\xb7\xab\x63\xf0\x58\x5b\xe5\x59\x57\x62\x7c\xc0\xc9\x79\xe0\xaa\xfa\xa5\x5a\xfa\x61\xe8\x65\x19\x0e\xd8\xc5\x70\x94\xc8\xcd\xd5\x04\x25\xe9\x98\xc5\x44\x2e\x58\x96\xf1\x98\x29\xe2\xe9\x4d\xa8\x7a\xf2\xe4\xb1\xe7\xad\x43\x26\x7e\x72\x64\xe2\x1d\x74\x9c\x80\x3c\x99\xb7\x57\xc9\x13\x8d\xe7\x5c\x3c\x3b\x02\xa5\x22\x9a\xb0\xab\xf7\x2d\x94\x89\x11\xbe\x51\xd6\x27\xdc\x8f\x01\xa0\xd8\x16\x98\xae\xef\xfd\x7e\x21\x42\xc6\xdb\xec\xa3\x0f\xa0\x15\x4c\xa9\x66\xf7\x5b\xd9\xdf\xa0\x20\x50\xdb\x9f\x04\xb9\xf3\x29\xf5\x87\x27\x82\xc6\x0b\x76\x39\xe2\x7e\x1d\x92\x7d\xda\x75\x6a\x6b\x74\x71\x03\xa9\x20\xc9\xba\x8d\x7a\x76\x7d\x45\xbe\xc3\x96\x0f\x8b\xd4\x97\x49\x8d\xd2\xdd\x85\x9c\x53\xde\xba\xd0\xc6\xac\x5c\x98\xda\x75\xf7\xda\x37\x4b\xb0\xdd\xb0\x46\xc8\x84\x4f\x73\xa3\x81\x59\xad\xa9\x03\x51\x7b\x14\x01\xa4\x90\x3f\x02\x4b\x90\x8b\x38\x2c\x64\x0e\xb7\x82\xc0\x14\xbc\x6b\x92\x28\x26\x14\x07\x3f\x49\xe0\xac\xb6\xe5\xde\xb0\xbe\x20\x86\x17\xa2\x90\xd2\x27\x6f\xe4\x94\x0b\x77\x2a\xa5\x75\xa3\x4d\x28\x4f\x9a\x4e\x46\x27\x55\x3c\xb9\x54\xa1\x54\x72\x29\xe8\x38\x69\x12\x05\x50\x26\xeb\x09\x05\x3f\x27\x83\xb7\x4f\x63\xae\xcc\xff\xc9\x68\xf4\x06\x6c\xe2\xb9\x70\xb2\x2e\xd8\x8b\x2d\x59\xf3\x91\xfe\x78\x00\x0f\x7b\x66\x90\xd2\xec\x80\x71\x77\x25\x62\xd3\x59\xa6\x4a\x61\x27\xb6\x3d\x44\xfa\xf3\x91\xb3\xe8\xb9\x1f\x33\x72\x3b\xe3\xd1\xdd\x75\x60\xfa\x96\x99\xf9\x4d\x04\x3f\x95\x98\x50\xf5\xde\x21\x09\xa2\xed\xea\x75\x7b\x05\xf6\x36\xa0\xe7\x23\x3b\x60\xd3\x0c\xa1\x4a\xc9\x88\x17\x7e\x0e\x30\x97\x14\x04\x3f\x06\x82\x7f\xd8\x41\x00\x4f\xdf\x93\x37\xb9\x45\x73\x55\x4f\x55\xc8\x8b\xb8\x70\x63\x3d\x68\xc7\x71\x6b\xec\x80\xd2\x7d\x5b\xc2\xe5\x76\xb2\x69\xc5\x68\xef\xa2\xb8\xed\x22\x39\x29\xc9\x55\x59\x5c\x59\x26\x8f\xcf\x6d\x71\xf9\x0e\x36\xd4\x26\x89\x0c\x75\xda\x70\xc5\x53\x87\xbf\x59\x33\x3e\x1c\xa6\x54\xa6\x79\x82\xb1\x12\xfb\x83\x8b\x3b\xeb\x2c\x7e\xe7\x40\x66\xfd\xc7\x00\xda\x6c\x1b\x08\xfc\xdb\xc0\xdc\x0c\x44\xb2\x17\xdf\x7c\xfd\xf5\xe7\x8e\xc2\xd9\x54\x05\x7e\x08\x18\xce\x86\x26\xd1\x2e\xd3\xa6\xcb\xb4\x09\xb7\xe2\x43\xc2\xa8\x1e\x38\x97\xa6\x65\x88\x6b\xbb\xf0\xd6\xe6\xd9\x32\x8d\x83\x60\xdb\x06\xc0\xb6\xc8\x87\x39\x50\x16\x4c\xeb\x58\xd0\x36\x19\x2f\x5d\x9e\xcb\x6f\x2d\xcf\x65\x97\x18\xd0\xf6\x39\x2d\x6d\x62\x3f\x7f\x4b\xf9\x2b\x2d\x0e\x63\xf3\x3c\x8b\xf6\xd9\x15\xed\xf1\xec\xda\x5b\xb6\x76\x29\x69\x14\xda\x67\xac\x16\x51\x54\x10\x74\x85\x07\x11\x1f\x4b\x4b\x73\xb0\x1e\x45\x87\x20\x2d\x14\x28\x6c\x5e\xb6\xa9\x25\x68\x75\xf2\xf7\xa3\x8a\x6b\xc3\xff\xfc\x34\x1e\x8d\xdf\xa6\xcb\xa0\x2b\x0c\xf2\xbc\x6d\xda\xaa\x84\x2d\xe2\x2c\x09\x70\xd6\x81\x11\xcb\x71\x88\x69\x58\x9c\x91\xb3\xeb\x2b\xa3\x2e\x43\xfa\x0c\x4d\xd4\x90\xd4\xf0\x69\x67\x97\xb4\x7c\xdd\xf1\x67\xaa\x35\x9b\xa7\xba\xf9\x62\x77\x26\xed\x27\x37\x69\xef\x6c\x8f\xfb\xe8\x5f\xf4\x15\x20\xf3\x39\x15\x03\x73\xa2\xc0\xb8\x5d\xf2\x82\x55\x48\xf0\x90\xb8\xa8\x5c\x9c\x0b\x9a\x31\x04\x7d\x2a\x57\xbc\xa5\x41\xfd\xc3\x87\x31\x42\x42\xdb\x3b\x8f\x1c\x19\x68\xe5\xa4\x45\x72\x25\xec\xd3\x0e\xc7\xcf\x82\x3b\x54\x01\x17\x2e\xe9\xcd\x7a\xc6\x90\x59\x5f\x43\x22\x4a\xf1\x54\x59\x12\x46\x51\x98\x26\x89\xbc\xc7\x6f\x87\x0c\xcc\xcc\xbe\xe9\x8b\xcd\xb0\x1a\x33\x32\xe7\x46\xa9\xb6\xc6\xcf\xb0\x3b\xe8\x8a\x34\x12\x35\xcb\x50\x60\xcd\xac\x37\x6b\xc4\x74\xb8\xd0\x46\x21\x15\x18\x08\x6d\xfe\xed\x02\x6f\x10\x15\xd7\xd2\x84\x31\x9b\xd1\x05\x97\x79\x86\x6f\x6b\x49\x7a\xf6\x16\xb0\x84\xa5\xcc\xbd\x69\x0a\xab\x24\xfa\xd1\xa9\x9a\x79\x7a\x57\xdc\x04\x51\x3e\x96\xce\x96\x30\x60\x9f\xb8\xd2\xab\x63\x71\x53\xe4\x40\xdb\x0e\xb5\x6f\x16\x2a\x35\x6c\xa1\x75\x45\xb4\x8f\xe1\x7b\x65\xc1\x64\x31\x82\x5b\x9f\x51\x3d\xb4\xad\x58\xa4\x9d\xac\x73\x68\x59\xc7\xbb\xab\x12\x1e\x2d\x5b\x57\x0a\x2b\xdc\x54\xe6\x75\xf2\x2d\x55\x2c\x26\x6f\xa9\xa0\x53\x54\xcb\x8e\x47\xd7\xdf\xbe\x3d\x31\xcb\x06\x6a\xdf\xd5\x45\xad\x2f\x6b\x14\xf6\xe1\xdd\x21\xd3\x20\x56\x46\xb8\x03\x27\x6a\x39\xc6\x83\xa6\x71\x10\xcf\x4d\x9a\x01\xc4\xae\xa6\x5e\x56\x6b\x3c\x56\x88\xc2\x62\x1e\xef\x59\xd5\x91\x0b\xa5\x69\x92\x5c\x27\x54\x9c\xa5\x69\x26\x17\xf5\x9a\x70\x39\x31\xdc\x3e\xe8\x58\x3b\xc6\x3e\xb8\x1f\x53\x9c\x68\xf0\xf5\x0a\x72\x55\xb4\x3f\x24\x57\xda\x2b\xc4\x52\x00\x1b\xec\x9d\xe5\x5a\xce\xa9\xe6\x51\xcf\xe8\xcd\xbd\xb7\x54\xe4\x34\xa9\x8d\x30\xda\x38\x8c\x75\x62\xdd\xc6\x97\xd6\x83\xa3\x35\x78\x6d\xa3\x7c\xb0\xf9\x7d\x4d\x33\x43\x5b\xce\x47\x1f\x5b\xbd\xab\x34\xd5\xf9\x0a\xe5\xdc\x40\xcd\xd7\xd3\xef\x01\x49\xa8\xd2\x1f\xd2\xd8\x9c\xe4\xca\xdd\x4d\x44\x3a\xa2\x9a\x26\x72\xfa\x57\x46\x93\xfa\xfd\x5c\xda\x27\xe7\xe1\xd3\xce\xf8\x83\x5b\x66\x94\x8f\xfd\x83\x47\x8a\x18\xa1\xd8\xe5\x6b\x67\x2c\x61\x0b\x2a\xb4\x7b\x1d\x2b\x65\xab\x23\x3b\x7e\xd8\x45\xbc\x30\x78\xc6\x4c\xb3\x6c\xce\x45\xb9\xcd\x11\x3c\x7b\x2e\x45\xcc\xd1\xd4\x07\xc6\x2c\x7c\xa3\xdc\xee\xfa\xad\xb6\xce\x9c\xbf\xc1\x80\x5f\xa6\x3c\x41\x7f\xca\x53\x81\x8f\x8d\xad\x4c\x38\xc3\x1f\xc1\x73\x5d\xea\xdb\xca\x4c\x91\x3b\x61\x84\x39\xc0\xbc\xa8\x27\x52\x5b\x79\xfb\x36\x9e\x3e\x70\x6b\x8c\x5d\x58\x1f\x17\x39\xb0\xfd\x5e\x67\xe8\xdf\xb4\xc5\xf0\xda\x2e\x0d\x54\xbb\xb2\x9e\x82\xd6\xed\x3b\xff\x1a\x26\xf7\x55\xaa\xab\x97\x1e\x5a\x4f\xf1\x1b\x09\x4b\xcd\xe4\x9a\xa6\xb8\xe9\x65\x5a\x5b\xa0\x7c\xaf\xa8\x9f\x0d\xa4\xbc\xad\x2c\xaa\x21\x7c\x79\x59\x19\xbe\xb2\x41\x71\x99\x55\x1f\x28\x49\x39\x43\xa0\x0e\x2a\xec\x64\x01\x67\x61\x34\xb6\x3f\x1a\x0e\x66\xd4\x38\xb8\xd7\xb7\xbe\x66\x34\xec\xda\xd8\x05\x67\x1c\xa6\x08\x54\x01\xce\x82\xd3\xef\xa4\x75\x94\xda\x84\x52\x43\x03\x80\x6f\xf7\x89\xca\xa3\x19\xa1\xca\x74\xcd\x6c\x68\x73\xe2\xd9\x70\x4e\x05\x9f\x30\xa5\x87\x1e\x87\x56\xfd\xf8\xd5\xcf\x43\xf2\x5a\x66\xc4\xc6\x61\xf7\x1d\x02\x84\xed\x67\xb1\x2f\xb8\xc2\xc1\xf8\x77\x0b\x4d\x33\x95\xb1\xed\xf4\x3d\x74\x56\xd3\x3b\xc3\xc3\xb0\xb3\x39\x03\x77\xc1\x2b\xd2\x33\x42\x5e\xf0\xe9\x7f\x18\xb6\xf4\xcf\x1e\x39\xbe\x07\xa6\xdd\x33\x7f\xf6\xf0\x83\x3e\x96\x30\x54\x84\x8b\x0f\x63\x9a\x5f\xc6\xa7\x53\x96\xa1\xca\x47\x20\x1d\xee\xc4\x22\x58\x08\x19\x3c\xec\x3c\xbf\x85\x8a\x58\xed\xc8\x8f\x5f\xfd\xdc\x23\xc7\xe5\x71\x11\x2e\x62\xf6\x89\x7c\x85\xa6\x5f\xae\xcc\x18\x4f\xac\x03\x45\x2d\x85\xa6\x9f\x4c\x9b\xd1\x4c\x2a\x26\x50\xfd\xd6\x92\xcc\xe8\x82\x11\x25\x8d\xd6\xca\x92\x64\x60\xcd\xda\xe4\x9e\x02\xaa\x88\x9b\x4a\x48\x02\x27\x29\xcd\x74\x69\x4b\x0c\xad\x55\x03\xbe\x66\x96\x6d\x2a\x9c\xfb\x77\xc2\x85\xf5\x19\x59\x6f\x95\x59\x73\x48\x69\xc4\x45\xd2\x92\x44\x33\x2a\xa6\x3e\x8f\x7a\x92\xeb\x3c\x63\x5b\xdc\x2d\x0d\xcf\xc0\x1d\x17\xad\xd2\x6d\xbf\xe7\xa2\xea\xb9\xaf\xb7\x05\x4d\xb9\x76\x41\xff\x36\x90\x4f\x2f\x4f\xcd\x2a\x64\x7c\x9c\x6b\x99\xa9\xd3\x98\x2d\x58\x72\xaa\xf8\x74\x40\xb3\x68\xc6\x35\x8b\xcc\xb0\x4e\x69\xca\x07\x91\x14\x66\xc5\x01\x41\x60\x1e\xff\x01\x8a\x60\x0e\x4c\x57\xb7\xe0\x1a\x37\x1c\xf4\x76\x43\xd8\x93\x1a\xc0\x0e\x36\xc6\x06\x36\x9c\xd5\x81\xa2\x3d\xe5\x11\x46\x0b\xc6\x8b\xd3\x83\x0c\xd6\xc1\xf2\xb6\xe7\x31\x47\x16\x69\x3a\xaa\xb6\x61\x8e\x1d\x46\x69\xc0\xa9\x2c\x51\xca\x39\x8d\x91\x94\x52\xb1\x7c\xf0\xcd\x6f\xa6\x14\x00\xd9\xa3\xe5\x20\xc2\xfa\xf6\x03\x2a\x62\xf3\x6f\xcc\x47\x89\x96\x07\x99\xc3\x9c\xb7\x22\x04\x1f\xae\x2e\x1e\xe7\x48\xe4\xfc\x00\xa7\xde\xca\x6b\x0d\x85\x28\x14\x55\x21\x64\x47\x67\x39\x73\x4c\xb3\x2c\xa0\x72\xe5\x5a\xfd\xdf\xd6\x67\xe2\x91\xb9\xb6\x89\x54\x9b\x3d\x1d\x81\xec\xd8\xb0\xbf\x6f\x8a\x37\xaa\x35\xf1\x4d\x63\x16\x06\xca\x65\xcf\x97\x86\xe1\x14\x14\x60\x30\xeb\x7d\xb4\x8d\xf6\x90\xf3\xd1\x9b\x8e\x0c\x6a\xf1\x81\x22\xaf\x94\x6c\x57\xa0\x0a\xfd\xa5\x54\x69\x0b\x07\xa5\x99\xd2\x84\x2e\x28\x4f\xc0\xa2\x2e\xc7\x8a\x65\x0b\x2c\x79\x64\x61\xf1\x68\x55\xcf\xb2\x55\x0d\x50\x8c\x7a\x24\xcd\xc7\x8d\x61\x75\x55\x36\x0d\x00\xb4\xa1\x4a\xef\xd7\xf6\xfa\x20\x7a\x0f\xaa\x97\x6b\x6f\x9b\x2f\xec\xa8\xc6\x98\xfd\xf7\x57\x46\x33\x3d\x66\x54\xdf\xf2\x4d\x7c\x77\x65\x4b\x97\xde\x73\x06\x97\x62\x43\xdf\x33\x32\x95\xda\x88\x58\x39\xec\x7d\x94\x49\x11\x80\xc6\x6f\xb4\x87\xde\xd1\xc5\x28\x6f\x33\x0a\x79\x2f\x52\xb4\x1c\x66\xf9\xc5\xd5\x71\x5a\xe9\xd8\xee\x24\x8d\x4f\x23\x04\x84\x14\xcc\xae\x1d\x7a\x20\x80\x02\x3d\xce\x90\xe7\x4c\xa9\x8d\xd0\x10\xe5\x10\x3e\x7c\x1a\x8f\x72\xc5\x1d\x36\x77\xf7\x30\x7f\xc2\x08\xd0\x31\xd3\x94\x27\xee\x28\xe3\x54\xf8\x59\xda\x46\x5d\x37\x0e\x30\x63\x54\x6d\x12\x10\xaa\x88\x58\x4a\x0a\xec\xb4\x14\x6c\x70\x2f\xb3\x98\x9c\xd3\x39\x4b\xce\xa9\x62\xb6\xad\x30\x5d\x0d\xd7\xe8\x48\x1d\xb4\xcb\xf5\xb6\xaf\x35\x5d\x46\xe3\x8f\xdb\x44\x76\x6f\x14\x2a\x16\x76\xb0\xef\x4c\x90\xb7\x59\xce\xfa\xe4\xb5\xe1\x5e\x7d\xf2\x41\xdc\x09\x79\xbf\x5f\x5f\xf5\x46\xcf\x45\x39\xcc\xca\x22\xb7\x00\x44\x9e\x05\x84\x29\x19\x7c\x7c\x77\x77\xec\x91\x25\xf8\x6b\x4c\x8d\x65\x66\xe3\x1f\x75\x3d\x32\xff\x5c\x31\x41\x19\x45\x31\x93\xd3\x8c\x29\xc4\x5c\xa9\x05\xf4\x6b\x6a\x72\xfe\x8e\x09\x9b\xf1\xb6\xb5\x7b\x57\x75\x6f\xb9\x9e\x3a\xbe\x36\x2d\xee\xd8\xf5\xb6\x1f\x4b\x93\x5a\x51\x63\x73\x14\x5e\xd0\xd1\x35\xc6\xa7\x75\x3d\xac\x37\x3a\x05\x5c\x2f\x78\x16\x85\x92\x4d\xd6\x51\x37\xba\xf3\xd1\xc7\xf5\x93\xbd\x96\xf7\x6d\xe3\x4f\xdb\xcd\x52\xfb\x1a\xa4\xb6\x9e\x99\xad\x46\xa8\xce\xfc\xd4\x99\x9f\x3e\x27\xf3\xd3\xd6\x1d\xbf\xc9\xe4\xf4\x79\x18\x9b\xb6\x0e\x71\x93\x81\xe9\x59\x9a\x96\x1a\x8d\x68\xa3\x39\xe9\xd9\x1a\x92\xb6\x0e\xad\xa1\xf1\xe8\xf7\x63\x36\xda\x3a\x63\x1b\x4c\x45\xcf\xd0\x48\xd4\x44\x20\x63\x71\x13\x31\xf1\x2a\x78\x38\x14\x14\x8b\x82\x89\xbe\x39\x17\x52\x13\x8a\x33\xbb\x4a\x8b\x46\x80\xdb\xda\xb7\x23\xdb\xb9\xe6\xb2\x97\x15\x18\x6d\x39\xc1\x95\xce\x92\x8b\xcb\xeb\x9b\xcb\xf3\xb3\xdb\xcb\x8b\xaa\x7c\x57\x37\xd3\x5b\x24\xb1\xcd\x36\x88\x41\x20\x89\xad\x79\xc0\x10\xe4\x35\xb7\xcc\x1e\x58\x73\x2b\xcf\x79\xdd\x5b\xfb\xcb\x85\x7b\x71\xb9\xbd\xf8\xc7\xf6\xd3\xd9\xf4\x78\x9a\xd3\x09\xbb\x05\x23\xc6\x8c\xdc\x33\x93\x49\xac\x5c\xac\xe9\xd5\x85\xcf\x5e\xe2\x22\x4a\xf2\xd8\x08\x17\x1f\x3e\x5c\x5d\xa8\x21\x21\xdf\xb2\x88\xe6\x0a\xac\x30\xb1\x14\x47\x9a\xbc\x7f\xf7\xe6\xbf\x20\x86\x1a\x9e\xe8\x7b\xb0\x0f\x40\x90\xe5\x14\x41\x70\x35\xa2\x90\x91\x6f\x19\x0a\x2a\xf0\xe5\x88\xa6\x86\x8a\x29\xac\xb2\xa0\x41\x16\x99\xb1\x24\x35\x14\xf3\x8e\x91\x02\xfb\xd3\x34\x5c\xd4\x30\x77\x21\x8f\x53\xa6\x31\xd3\x69\x53\x54\xe3\xc6\x59\xdb\x62\x71\xdd\xc3\xd6\x5a\x52\x1f\xad\x36\x7e\x4f\x95\xb5\x58\xd5\xf6\x76\xcb\xfa\x6e\xb7\xcf\xac\x37\x71\xac\x31\x6e\x20\x79\x86\xbf\x56\xfa\x6c\x3a\x5b\xd8\x31\x30\x88\x84\xeb\xc6\xd6\xd4\xf5\x61\x40\xf5\x98\xf5\x2b\xb6\x0c\x56\x9d\xe4\xd2\x87\x7d\x14\x75\xd0\xe5\x66\x7d\x81\x82\x17\x71\xa9\xba\xa4\x8d\xb6\x2b\xff\x96\x8f\x7d\x7d\xd1\xa2\xbf\xd6\x22\x43\xfe\xf1\xcf\x2f\xbe\xf8\xff\x03\x00\x00\xff\xff\x1d\x2f\x2f\x16\x4f\x7b\x0a\x00") +var _olmManifests0212CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x77\xe3\xb6\xb5\x28\xfe\x7f\x3f\x05\x96\x9b\xf3\xb3\xdd\x48\xf2\x4c\xd2\x93\xdb\xfa\xb6\xcd\x72\x6d\x27\xf1\x2f\x33\x1e\xad\xb1\x93\xde\xde\x99\x39\x29\x44\x6e\x49\xa8\x49\x80\x05\x40\xd9\xea\xc9\xf9\xee\x77\x61\xe3\x41\x52\x6f\x89\xf4\x8c\xec\x21\xba\x56\x33\x16\x49\x10\xdc\xd8\xd8\xef\x47\xb7\xdb\xfd\x0d\xcd\xd8\xcf\x20\x15\x13\xfc\x94\xd0\x8c\xc1\x83\x06\x6e\xfe\x52\xbd\xbb\x3f\xa8\x1e\x13\x27\x93\x97\xbf\xb9\x63\x3c\x3e\x25\xe7\xb9\xd2\x22\x7d\x0b\x4a\xe4\x32\x82\x0b\x18\x32\xce\x34\x13\xfc\x37\x29\x68\x1a\x53\x4d\x4f\x7f\x43\x08\xe5\x5c\x68\x6a\x7e\x56\xe6\x4f\x42\x22\xc1\xb5\x14\x49\x02\xb2\x3b\x02\xde\xbb\xcb\x07\x30\xc8\x59\x12\x83\xc4\xc9\xfd\xab\x27\x2f\x7a\x7f\xe8\xbd\xf8\x0d\x21\x91\x04\x7c\xfc\x96\xa5\xa0\x34\x4d\xb3\x53\xc2\xf3\x24\xf9\x0d\x21\x9c\xa6\x70\x4a\x22\xaa\x69\x22\x46\x76\x11\xaa\x27\x32\x90\x54\x0b\xa9\x7a\x91\x90\x20\xcc\x7f\xd2\xdf\xa8\x0c\x22\xf3\xf6\x91\x14\x79\x76\x4a\x16\xde\x63\xe7\xf3\x8b\xa4\x1a\x46\x42\x32\xff\x37\x21\x5d\x22\x92\x14\xff\xed\x3e\xde\xbe\xf6\x06\x5f\x8b\xbf\x27\x4c\xe9\x1f\xe7\xaf\xbd\x62\x4a\xe3\xf5\x2c\xc9\x25\x4d\x66\x17\x8c\x97\xd4\x58\x48\x7d\x5d\xbc\xde\xbc\x2e\xa2\x5a\xc9\xc8\x5e\x66\x7c\x94\x27\x54\xce\x3c\xfb\x1b\x42\x54\x24\x32\x38\x25\xf8\x68\x46\x23\x88\x7f\x43\x88\x03\xa1\x9b\xaa\x4b\x68\x1c\xe3\xb6\xd0\xa4\x2f\x19\xd7\x20\xcf\x45\x92\xa7\x3c\xbc\xca\xdc\x13\x83\x8a\x24\xcb\x34\x82\xfe\x76\x0c\x24\x93\xa0\xf5\x14\x41\x42\xc4\x90\xe8\x31\xf8\x77\x87\xa7\x08\xf9\xa7\x12\xbc\x4f\xf5\xf8\x94\xf4\x0c\x84\x7b\x31\x53\x59\x42\xa7\x66\x35\xa5\xbb\xec\x36\x5d\xd8\x6b\xa5\xdf\xf5\xd4\x2c\x5d\x69\xc9\xf8\x68\xd5\x52\xcc\x7d\x9b\xaf\xc1\x82\xe6\x76\x9a\xcd\x2f\x61\xe6\xc7\x4d\xdf\x9f\xe5\x83\x84\xa9\x31\xc8\xcd\x17\x11\x1e\x99\x5b\x43\x7f\xc1\x95\x25\x0b\x29\x4d\xea\x0f\x54\x6f\xee\x30\xcc\xbd\xe0\x6c\x34\xff\x8d\x31\xd5\xfe\x47\x7b\xd3\xe4\x25\x4d\xb2\x31\x7d\xe9\x7e\x54\xd1\x18\x52\x5a\xe0\x83\xc8\x80\x9f\xf5\xaf\x7e\xfe\xfa\x66\xe6\x02\xa9\x42\xa7\x82\xe7\x84\x29\x42\x89\x84\x4c\x28\xa6\x85\x9c\x1a\x68\x9d\xdf\xfc\xac\x3a\xe4\xfc\xed\x85\xea\x10\xca\xe3\x70\xf0\x48\x46\xa3\x3b\x3a\x02\xd5\x9b\x5b\xab\x18\xfc\x13\x22\x5d\xfa\x59\xc2\xbf\x72\x26\x21\x2e\xaf\xc2\x80\xc7\xc3\x64\xe6\x67\x03\xff\xd2\x4f\x99\x34\xef\xd4\xa5\x83\x6c\x47\x89\xca\x55\x7e\x9f\xf9\xc2\x43\x03\x06\x7b\x1f\x89\x0d\x81\x03\x85\x28\xe0\xce\x18\xc4\x0e\x76\x16\x35\x98\x32\xdf\x2f\x41\x01\xb7\x24\xcf\xfc\x4c\xb9\xfb\xa6\x1e\xb9\x01\x69\x1e\x34\xc7\x3d\x4f\x62\x43\x09\x27\x20\x35\x91\x10\x89\x11\x67\xff\x0e\xb3\x29\xa2\x05\xbe\x26\xa1\x1a\x94\x26\x78\x6a\x39\x4d\xc8\x84\x26\x39\x58\x50\xa6\x74\x4a\x24\x98\x79\x49\xce\x4b\x33\xe0\x2d\xaa\x47\x5e\x0b\x09\x84\xf1\xa1\x38\x25\x63\xad\x33\x75\x7a\x72\x32\x62\xda\xd3\xf0\x48\xa4\x69\xce\x99\x9e\x9e\x20\x39\x66\x83\xdc\x90\xc3\x93\x18\x26\x90\x9c\x28\x36\xea\x52\x19\x8d\x99\x86\x48\xe7\x12\x4e\x68\xc6\xba\xb8\x58\x8e\x74\xbc\x97\xc6\xbf\x95\x8e\xea\xab\xc3\x19\xf0\x2d\x44\x66\xe2\xc9\xe6\x4a\x58\x1b\xe2\x69\xb1\xc8\x3e\x6e\xbf\xa5\x00\xa9\xf9\xc9\x40\xe5\xed\xe5\xcd\x2d\xf1\x0b\xb0\x60\xb7\x10\x2e\x6e\x55\x05\xb0\x0d\xa0\x18\x1f\x82\xb4\x77\x0e\xa5\x48\x71\x16\xe0\x71\x26\x18\xd7\xf6\x48\x27\x0c\xb8\x26\x2a\x1f\xa4\x4c\x2b\xc4\x39\x50\xda\xec\x43\x8f\x9c\x23\x0b\x23\x03\x20\x79\x66\x4e\x52\xdc\x23\x57\x9c\x9c\xd3\x14\x92\x73\xaa\xe0\xd1\x41\x6d\x20\xaa\xba\x06\x7c\x9b\x03\xbb\xcc\x81\xe7\x1f\x98\x3b\x63\x84\x78\x0e\xb9\xd1\xcd\xcb\x0e\x25\xb1\x27\x70\x11\x05\x26\x2b\xce\xa2\x19\x34\x8e\x25\xa8\x05\x17\xe6\x0e\xa4\xbd\xd1\xe2\xc9\x58\x28\xb3\x7f\x54\x93\x37\xaf\x5e\x93\x88\x72\x92\x2b\x30\x87\x27\x12\x9c\x1b\x84\xd0\x82\x50\xc3\xcb\xba\xf0\xc0\x14\x22\x90\x84\x11\x53\x5a\x4e\x7b\xe4\x3b\x21\x53\xaa\x4f\xc9\x9f\xfc\x4f\x5d\x9c\x4e\x48\xc2\xb2\xbf\x9c\xfe\x29\x13\x52\xff\x85\xbc\xe1\xc9\xd4\x4c\x1a\x93\xfb\x31\x70\x72\x13\xbe\x8d\xfc\xb9\xf4\xc7\xf7\x32\x8b\x7a\xe4\x6a\xc4\x85\xf4\x77\x1a\xac\xba\x4a\xe9\x08\xc8\x90\x41\x82\x78\xad\x40\xf7\x66\x77\x70\xe5\x2e\x12\x2b\x2e\x0d\xd9\xe8\x35\xcd\xd6\x82\xe6\xdc\xdf\x69\xde\x65\x5e\x5f\x66\xde\xc5\x45\x2d\x10\x95\xcd\x27\x99\x7f\xd2\xe8\x8e\x50\xf7\x96\x94\x66\x5d\x85\xc7\xa6\x04\xa6\xcd\x20\x70\xee\x27\x30\xf0\x2b\x7e\xbe\x72\x94\xab\xb7\xed\x67\x97\xbf\x6c\xeb\x67\x0b\x31\x64\x2d\xd0\x5e\x2f\xe2\x22\x1b\xbc\x63\x24\xb3\xa8\x2f\x62\xfb\xd9\x6b\xdf\xf2\x7d\xf9\x6e\x02\x0f\x99\x50\xa0\x48\xcc\x86\x43\x90\x86\xee\x88\x09\x48\xc9\x62\x50\x64\x28\x24\xee\x57\x26\x62\x3c\x93\x61\xff\x2a\xac\xb6\x2f\xe2\x4d\x37\xc6\xbc\x1a\x19\x86\x45\x46\x87\x86\x4b\x3f\x77\xe1\x69\x27\x6b\x0e\xaf\x19\x5c\xc4\x70\x03\x09\x44\x5a\xc8\xc5\x77\xcc\xc0\xe4\xba\xf4\x80\xa3\xfa\xfe\xaf\xfb\x31\x8b\xc6\x24\xcd\x15\x52\x5d\x2d\x73\xa8\xc0\x45\x0b\x32\x64\x9a\x08\x4e\x28\xbe\xd6\xd0\xfa\xf9\x27\x53\xaa\xa3\xb1\xbb\xe3\x50\x91\x84\x0e\x20\x51\xb3\xf3\x0c\x00\x59\x6e\x9c\x27\x10\x9b\x09\x91\x96\xe0\x9c\x4b\x3e\x61\x0d\x94\x88\x25\x65\x41\xde\x5e\x0d\x33\xb2\x0e\xcb\x2c\xe0\x99\x90\x4c\x4f\xcf\x13\xaa\xd4\x32\x9c\x9e\x83\xee\xd5\x10\xd1\x87\x0d\x19\xc4\x1d\xc2\x78\xcc\x8c\x4a\xa3\xfc\xb7\x1f\xaa\x30\x6f\xcf\xdc\x6b\x18\x5c\xe9\x7e\x0f\x21\x7f\x0f\xb9\x67\x49\x62\x80\x15\xc3\x90\xe6\x09\x12\xc9\x7f\x83\x14\x84\x21\x76\x4a\xc4\x2b\x2e\xfc\xe5\xd5\xc0\x5b\xf1\xad\x5a\x24\x46\x40\x2c\xb4\x97\x35\x5f\x79\x5b\xdc\x4f\xa8\x84\xb2\x74\xee\xd8\x90\xf9\x50\xfc\xdc\xd2\xd4\xab\x97\x47\xa5\xac\xa8\x29\xe5\xc1\x34\xa4\x2b\xf6\x72\x5e\x75\x30\x58\x66\xa4\x8e\x62\xa1\x88\xea\x5a\x53\x83\x75\x28\xe6\xd9\x2b\xa0\x08\xe5\x53\xa2\xa9\x95\x48\xa8\xc3\x5f\xb7\x63\x5a\xb2\x2c\x01\xf2\xa7\x3b\x98\x76\xac\x0c\x08\xc3\x21\x44\xfa\x2f\x24\x57\x5e\x2a\xc2\xfb\xcd\x1f\x41\xc8\xfe\x93\xff\xd7\x5f\x96\x7d\xf1\x46\xf8\xbc\xfe\xec\xdb\x61\x97\xb4\xea\x8e\x19\x08\x5d\xe2\x03\x33\xc8\x69\x21\x60\xe7\x32\xf0\xc1\xcf\xea\x91\xcb\x34\xd3\x53\x92\x02\xe5\xca\x9f\xec\x24\xa9\xdc\xac\x7a\xe4\x6f\x86\x0e\x96\xd0\x98\x26\x89\xb8\x0f\x32\x31\x62\xc8\xb5\xb8\x71\xe7\xbd\x43\xfa\x12\x86\x20\x8b\x5f\x90\x4c\x5e\x8b\xcb\x07\x88\x72\xbd\x94\x02\x94\xe1\xb6\x02\x95\xed\xb8\x83\xe9\x16\x00\xf9\x11\xa6\x9e\x77\xdb\x2f\xbb\x83\xa9\x45\x06\xfc\xa9\xc0\x21\x9a\x65\x09\x03\x2b\x9e\xae\x82\xcc\x1d\x4c\x15\x9e\x6f\xf3\xfc\x9d\x9d\x1d\xcc\xfd\x9d\x02\x4b\x3c\x99\xbd\x34\x12\x92\xfa\xdf\x16\x5f\x23\x91\x0e\x18\xb7\x2f\xb3\x53\xfb\xad\xc0\xd9\x3d\x40\x79\x8c\x7f\xe2\x6b\x9a\x00\x97\x5f\xd4\x16\x30\x7b\xe3\xbf\xa3\x90\xfd\x09\x35\x2b\x3a\x34\x62\x7c\x62\x4f\xfc\x98\x65\x5e\xa5\xc2\xa5\xf7\xc8\xcf\x34\x61\x85\x3e\x6a\x71\xc3\x42\x00\xbf\xea\xf2\x5f\x39\x4d\x7a\xe4\xc2\xd2\x33\xfc\x7a\xf7\x93\xbb\xc9\x00\xf2\x5f\x39\x9b\xd0\xc4\xf0\x6f\x2d\x0c\x85\x8c\x23\x2a\x63\xe4\x30\x4e\x4f\x53\xc2\xee\x1e\x45\x42\x60\xc4\x53\x7f\xda\x8b\x3d\x52\xa8\x23\x92\x8c\x4a\xcd\xa2\x3c\xa1\xd2\xdb\x9e\xa6\x8d\x40\xb4\x40\x9a\x1b\x88\x04\x8f\x57\x9e\xe0\xa5\xd4\xd5\x3d\x5b\x86\x31\xb2\x08\x90\x4c\xc4\x28\xa2\xb0\x14\x66\x91\xf4\xa8\xca\xc6\xc5\xd0\x9f\xea\x70\xc4\x3a\x44\x18\xee\x71\xcf\x94\x53\xe3\x82\xa8\xcc\xac\x28\x7d\x5c\x22\x8f\xe1\x54\xf4\xc8\x5f\xa7\x9e\xd3\x74\x08\xd3\x96\xf7\x68\x23\xd7\x74\xbc\x00\xe0\x50\xd6\x01\xbb\x38\x50\x43\x21\xc1\x88\xb7\x47\xb1\xc0\x67\x60\xc2\x22\x7d\xdc\x23\xff\xd7\x30\x33\xb3\xf1\x1c\x46\x54\xb3\x09\x78\x14\xf7\x8c\x4f\x4b\x30\xaa\x1f\xa1\x8a\xbc\x20\x47\xf8\x18\x61\x69\x0a\x31\xa3\x1a\x92\xe9\x31\x19\x4c\xf1\x35\x6a\xaa\x34\xa4\x9b\x6c\x9d\x51\xea\x47\x15\x3b\xd0\xfc\x18\x3a\x15\x85\x71\xfd\xcd\xef\x57\xdc\x89\x8b\xdd\x62\x67\x7f\x46\xc5\xba\x42\x6a\xac\xae\x3d\xb3\x85\x81\x07\x89\x40\x45\x02\xdd\x60\xca\x9d\x85\x4e\x71\xae\xbc\x65\x63\x00\x81\xcc\x84\x0d\xfe\xa7\xc1\x03\x6a\x14\x0b\xc4\x72\x8b\xb9\x35\x70\x9c\x45\xab\x54\x83\xa5\x1c\x6d\xb9\xe6\x4a\x50\x7b\x1d\x50\x05\xdf\xfc\x7e\x89\x4a\x60\xed\x4e\x66\xcf\xe7\xb5\x5b\xb2\x01\xa3\x2c\x26\x5f\xb6\x59\x6b\x8f\x75\x78\xfd\x4e\x33\x30\xa3\x04\xac\x55\x57\x82\xaa\x40\x79\xd8\xef\xae\xd7\x08\xd1\x80\x4f\x19\x07\x69\x67\x33\xc4\x8f\x71\xa5\x29\xd7\x0c\x29\x5b\xd0\x1d\xbd\x2e\x79\xcf\xf4\x78\x1b\x75\x05\x71\xcd\x11\x1a\x8b\x5c\xce\x3a\x30\x47\x1f\xb6\x56\x2b\xbd\x40\xbb\xde\xce\xd0\xf7\xa2\xaf\x7d\x27\x55\x8a\x8d\x8c\x94\x49\xee\x81\x8d\xc6\xda\xb3\x93\xaa\xb4\x69\x7e\x75\xaf\x60\xff\xc6\xd3\x94\x06\x26\xc0\x34\x72\x80\x01\x18\x00\xaa\x3c\x85\xd8\xd3\x8c\x18\x32\xe0\x31\xf0\x68\x8a\x56\xad\x64\x02\xb2\x47\x7e\x52\x66\xa7\xc8\x0f\x6c\x34\x36\x20\xb4\x2f\x2d\x8b\x4a\x28\x15\x18\x56\x5d\x5d\x01\x33\x92\xbd\x91\x6b\xa4\xd1\x68\x0c\xf8\x8d\x0c\xe4\x67\x80\x78\xe6\x7e\x45\xe2\x1c\x6d\x6d\xb3\x8b\xc8\x0d\x1c\x7a\x28\xc5\x4a\xca\x47\xc1\x90\x10\x54\x02\x7b\xe0\xcd\x27\x8d\x84\xb5\xaa\xa1\xe5\xd7\xd0\x4e\x2d\x0a\x3a\xca\xac\x29\x24\xcc\xc1\xb8\xfe\xfa\x2b\x3b\xaf\x57\x26\x1c\xe9\x11\x84\xce\x7e\x8c\xc1\x1c\x92\x73\x0b\x7c\x28\xeb\x23\x9e\xcc\xbc\xb0\x53\x2d\x7a\x0e\xc9\x31\x4d\x67\x97\x5c\xd0\x74\x49\xf9\x1d\xc4\x24\x81\x07\x16\x89\x91\xa4\xd9\x98\x45\x34\x49\xa6\x78\x4c\x51\x1d\x64\x5a\xa1\x15\x65\x85\xd9\x66\x19\x19\x0f\x2e\x80\xad\xcd\x17\x0a\x22\x09\x7a\xbd\x29\xec\xc6\xde\x57\x30\x65\xc3\x01\x0d\x88\xdd\x04\x16\x47\x1c\xce\x79\x7b\x0f\x8d\x22\x73\x90\x10\x75\x05\xd7\xe0\x04\x90\x12\x2a\xf7\xc8\x15\xb2\xd4\x01\x28\xc4\xf2\x3b\x80\xcc\x62\x5a\xc2\x94\x26\x2a\xa5\x49\xd2\x21\x8a\xf1\x08\x08\xd0\x68\x6c\xc1\xc9\x01\xbc\x42\xad\x25\x03\x2b\x06\x19\x56\x3b\x0d\x7b\x03\x5c\x2f\x16\x6a\x56\xeb\x5d\x2b\x74\xae\xd5\x60\x0c\x34\x65\x3d\x24\x0b\x5a\xe4\x79\xa2\xf3\x39\xa9\xc2\xbd\xb7\xc5\xab\xad\x9d\xf8\x46\x1b\xe1\x63\xb4\x9e\xd6\xfc\x54\xb9\x3d\xf8\x19\xc6\xe2\xde\x5b\x9c\xe7\x0e\xb9\x21\xbc\xca\xef\x6d\xcc\x54\x64\x4e\x3a\xc4\xe4\x5c\x70\x85\xf2\xa9\x75\x3c\xa0\xe3\x60\x42\x13\x8b\x0a\x7e\xe2\x4c\x24\x09\x1e\xf9\xdc\xab\x13\x46\x8e\xe7\x04\xd2\x01\xc4\x31\xc4\xe6\xb3\xec\x52\x96\xb0\xb9\x9a\xa6\x22\xcf\x1f\xfa\x22\x49\x56\x73\xb1\x95\x7a\xe9\x26\x5a\xa9\x07\xc0\x2a\xd9\xa8\xca\xfa\x3c\xc4\x98\x0a\x67\x26\x06\x0d\x32\x65\xdc\x89\x47\x46\xd4\x0d\x80\x1d\x80\xbe\x07\xe0\x24\x1a\x43\x74\x17\x8e\x92\xf3\xdb\xcc\xec\x9a\x73\x1a\x55\x29\x56\xe1\x12\x13\x49\x82\x8a\x86\x02\x20\xcc\xe8\x04\x1c\xee\xfd\x33\x33\x67\xb4\x44\xec\xe9\x84\xb2\x84\x0e\x12\x40\xae\x19\xfe\xea\x54\xfc\x47\x9e\x9f\x67\x79\x92\x18\x21\x96\xc7\x64\xf4\xb6\x7f\x4e\xb4\xa4\xc3\x21\x8b\xcc\xa5\x98\x49\x88\xb4\xb3\x49\x2c\xfb\x84\x55\xe2\xda\xd2\x13\xa1\x34\xd5\xf9\xdc\x1e\xad\xd8\xe0\x55\x1b\x6b\xf4\x10\xb6\xd4\x40\x54\xd9\xca\xb7\x55\x65\xc5\x2c\x03\xac\xb2\x55\x31\xa6\xf6\xc8\xb5\x40\x1d\x81\x6a\xf2\x1a\x94\x61\xbb\x08\xa0\xb7\x40\x95\xe0\x25\xea\x8a\xd2\xaf\x64\x23\xc6\x69\xe2\x3e\x0a\xbd\x3e\x46\x44\x67\x82\x07\xdd\x83\x4e\xcd\xa1\x4c\xd9\x48\x52\x1d\x88\x62\xb1\x6e\xc7\x5d\x1c\x5f\x1c\xe6\x3a\x97\xd0\x23\x67\x7c\x8a\xfb\x3d\x04\x6a\x7e\x30\x33\x6b\x29\xe2\x3c\x32\xf2\x92\x21\xb0\xb9\x2a\x4f\xd2\x28\x19\xad\x40\xed\xe0\xdc\xbf\xc4\x0b\x7a\xca\x1c\x00\xca\x9c\xf1\x54\x70\x20\x54\x65\x46\x8f\xf3\x38\x99\x4b\x34\x62\x07\x00\x23\xb3\x38\xeb\x5f\x11\x1f\x1a\xd2\x23\xdd\x6e\x97\xdc\x9a\x9f\x95\x96\x79\x84\xfc\xc5\x1c\x21\x1e\x3b\x4e\x61\xb1\x0f\x3f\x92\xa2\xd8\x89\x9f\x41\x9c\xe5\xc3\x8a\x60\x19\xd5\x63\xd2\xb3\x80\xef\x95\x40\x41\xc8\x77\x86\xd7\x3c\xd0\x34\x43\xbc\x37\xa4\xfb\x3b\x21\x6e\xec\x0e\xd9\x17\xfe\x37\x39\x39\x99\x45\x08\x31\x30\xf2\xa9\xb3\x1e\x22\x5e\x0c\x85\x38\x54\xd5\xef\xe9\x99\x07\x7f\xe4\xe2\x9e\x2f\x7a\x35\xbe\x8b\x4a\x38\x25\xef\x0f\xce\xfc\xd1\x7b\x7f\xd0\x21\xef\x0f\xfa\x52\x8c\x8c\xcc\xca\xf8\xc8\xfc\x60\x30\xea\xfd\xc1\x05\x8c\x24\x8d\x21\x7e\x7f\x60\xa6\xfd\x32\x33\xea\xd5\x6b\x90\x23\xf8\x11\xa6\x7f\xc6\xc9\xc2\xcf\x9e\x1d\xfc\x39\x35\xd7\xf1\x77\xc3\x7f\x0d\x93\xfa\x73\x4a\xb3\xf0\xc3\x6b\x9a\x85\x87\xcf\x0b\x24\x7b\xf7\x21\x05\x4d\x27\x2f\x7b\xc5\x76\xfe\xe3\x9f\x4a\xf0\xd3\xf7\x07\xc5\xfa\x3b\x22\x35\x68\x91\xe9\xe9\xfb\x03\x52\x79\xeb\xe9\xfb\x03\x7c\xaf\xff\xdd\x2f\xf2\xf4\xfd\x81\x79\x93\xf9\x59\x0a\x2d\x06\xf9\xf0\xf4\xfd\xc1\x60\xaa\x41\x75\x5e\x76\x24\x64\x1d\x23\x2d\xfd\xb9\x78\xc3\xfb\x83\x7f\x90\xf7\xdc\x2c\x16\x15\x41\xbb\x93\x8a\xfc\xcf\xc1\x0a\x7e\xbe\x82\xe8\xaf\x56\xde\x8c\x76\x96\x50\xa5\x6f\x25\xe5\x8a\xf9\x30\x89\xa5\xb7\xa6\xf6\xb0\x2f\xbd\x2e\x91\x00\x2c\xbd\x6c\xb1\x61\xe9\xe5\x25\xac\x73\x13\xb6\x35\xff\x0d\x1b\x9a\x9c\xe7\x1f\xf4\xf2\x8c\xb9\x52\x18\x69\xc2\xfe\x18\x06\xe0\xee\x36\x07\xd1\x08\xf1\xe6\x7c\x3b\xe2\x66\xc4\x45\x8e\xfb\xd6\x73\x87\x37\x68\xf7\xc1\xc5\x99\xf3\x18\x64\x32\x35\xe2\x44\x31\x6b\x34\x36\xd2\x7e\xdc\x23\xd6\x68\x40\x83\x89\xe6\xce\x1c\x24\x64\x4d\xbc\x64\xb9\xc6\x75\x85\x19\x0d\xe1\xb0\x07\xde\x4d\x83\x5c\x2e\x8a\x20\xd3\xc8\xe6\x76\xf7\xa4\x90\x92\x45\xc5\x88\x55\x5d\xbd\x1c\x3d\x1c\x72\x6c\x08\x78\x77\xb7\x73\x4a\xe7\x29\x35\x7c\x83\xc6\x66\xbd\xc5\x35\xab\xbb\x59\x5d\xcb\xd2\x53\x3a\x10\xb9\xb3\xed\x86\x7d\x70\xa0\x76\x5c\x04\xa5\xb2\x4c\x4f\xd7\x9a\x4b\x36\xfa\xf8\x94\x3e\xbc\x02\x3e\xd2\xe3\x53\xf2\xf5\x57\xff\xeb\x9b\x3f\x2c\xb9\xd1\x12\x46\x88\xbf\x07\xee\x0c\x41\x1b\x82\x61\xfe\xc1\x59\x8b\x61\x11\xc9\x34\x2a\xee\x09\x16\xee\x02\x83\xee\x29\xfa\x29\x1d\xaf\xcc\x33\x03\x17\x43\xe5\xad\xa1\x21\x82\x8e\x91\x90\x16\x4e\xc6\x02\x01\x4f\xa6\xe4\xe5\x57\x1d\x32\x70\x20\x9e\x27\xdf\xef\x1e\x3e\xf4\x16\x2c\x99\x29\xf2\xc7\xce\xcc\x7a\x98\x22\x66\xab\xc4\x10\x11\xc7\xea\x97\x12\x2c\x1b\xf4\x96\x80\x79\x36\x08\x61\xbd\xeb\x36\x6e\x9d\x31\x70\x33\x43\x60\xca\x38\x4b\xf3\xf4\x94\xbc\x58\x72\x8b\x25\x69\x1b\xee\xa6\xbd\xb9\x90\x02\xa8\x21\x5d\x23\x49\x53\x23\xef\x44\x84\xc5\xc0\x35\x1b\x32\x90\x65\xd4\x46\x5d\xdf\x3e\xe8\x5d\xad\x01\x8a\xe8\x85\x35\x74\xa8\x84\xec\x7d\x2b\xe4\x48\xe4\xc0\xce\x75\x13\x95\x09\xd4\x34\x03\x7b\x1a\xac\xf6\x42\xe0\x21\xb3\x72\x6a\xc9\x07\x91\x02\xe5\x8c\x8f\xbc\x77\xd7\x1b\x92\x2d\xd7\xbd\x1f\x03\xb2\x9e\x60\xa4\xb4\xc6\xfe\xc8\x68\x4a\x31\x2a\x4d\x94\x8c\x72\x2a\x29\xd7\x46\x87\x3d\xeb\x5f\x59\x01\x7d\xd6\xa0\x49\x8b\x90\x1f\x7f\x1a\xed\x51\xb5\xc4\xca\x2c\xd1\x85\x09\xe1\x89\x6d\xee\xa8\xbe\x7c\xf1\xd5\xca\x2d\x0f\xf7\x2d\xf7\xdf\x51\xad\x41\xf2\x53\xf2\x5f\xef\xce\xba\xff\x97\x76\xff\xfd\xe1\xc8\xfd\xe3\x45\xf7\x8f\xbf\x74\x4e\x3f\xfc\xae\xf4\xe7\x87\xe3\x6f\xbf\x58\x32\xd3\x62\x49\x7e\x09\xfa\x38\x26\xe2\x85\x44\xbf\xa3\x1d\xe4\x30\x62\x48\x6e\x65\x0e\x1d\xf2\x1d\x4d\x14\x74\xc8\x4f\x1c\x59\x43\x4d\xa0\x01\xcf\xd3\x55\x9a\x5e\x97\x1c\x98\xb7\x2e\x16\x3e\xc2\x2d\xb8\xa4\xd5\xf7\xb8\xe5\xae\xd2\x5d\x37\x03\x92\xb7\x33\x94\x28\x4d\x29\xb4\x0c\x63\x91\xcc\x41\x12\x3d\x27\xde\xf6\x22\x91\x9e\x94\x42\xcf\x8c\x5c\xfd\x9a\xf2\x29\x29\xc8\x9a\x15\x4a\x67\x31\x5d\x69\x43\x9b\x68\x24\x85\x52\x21\x76\x4e\x91\x84\xdd\x01\x39\x2b\x94\x46\x43\x2c\x07\x10\x51\x14\xc4\xe5\x80\x69\x49\xad\xc5\xd7\xcb\x95\x85\x39\x69\x98\x27\xe4\xc8\xe8\xaa\x3d\x8c\x97\x98\xa3\xae\xc7\xce\x74\x3b\x60\x09\xd3\x53\xab\x47\x47\x82\x0f\x13\xe6\xe4\xff\x34\x13\x52\x53\xae\x9d\x91\x11\x46\xf0\x40\x58\xe1\xf7\x66\x8a\x1c\xc5\x5c\xbd\x7c\xf9\xd5\xd7\x37\xf9\x20\x16\x29\x65\xfc\xbb\x54\x9f\x1c\x7f\x7b\xf4\xaf\x9c\x26\xe8\xe2\xbd\xa6\x29\x7c\x97\xea\xe3\xe6\xd8\xe2\xcb\x6f\x36\x38\x45\x47\xef\xec\x59\xf9\x70\xf4\xae\xeb\xfe\xf5\x3b\xff\xd3\xf1\xb7\x47\xef\x7b\x2b\xaf\x1f\xff\xce\x7c\x43\xe9\x04\x7e\x78\xd7\x2d\x8e\x5f\xef\xc3\xef\x8e\xbf\x2d\x5d\x3b\x5e\x74\x18\x1f\xba\x77\xf9\x00\x24\x07\x0d\xaa\x6b\xb4\x80\x6e\x4a\xb3\xee\x1d\x4c\x97\x1c\xce\xa5\xe2\xe8\xfc\x44\x16\x62\x29\xcd\x16\xa9\xde\x36\x84\xec\x2d\x60\xd8\x52\xb4\x10\xc9\x6b\xba\x5f\x38\x5d\x22\x92\xd9\x4b\x18\xe4\xbe\x83\xc9\xc9\xf0\x1d\x6b\x66\x5b\x25\x4e\x6f\x80\x2d\x9b\xc9\x8f\x7c\x45\x98\xce\xda\x97\x84\xef\xdc\x79\x06\x7f\xbe\x97\x44\x38\x6f\x3c\x4f\xce\x96\x6a\x5a\x55\x03\xe6\xd5\x85\x15\x7d\x91\xf4\xa0\x38\x37\x16\x46\xcf\xcb\x39\xfb\x57\x0e\xe4\xea\xc2\xd1\xa3\x0e\x61\x3c\x4a\xf2\xd8\x48\x0a\x3f\xfd\x74\x75\x61\x94\xf7\xbf\x3a\x72\x73\x0f\x24\x16\xfc\x50\x93\x37\xd7\xaf\xfe\x8e\x96\x00\xbc\xa3\x63\x19\xba\x75\x46\xd1\x84\xd9\xe0\x68\xcf\x80\xc9\x5f\xc1\xcc\xe5\xde\x1c\xd1\x2c\x18\x4f\x90\xdc\xf1\x98\x8c\x21\xc9\x8c\x00\x71\x07\x44\xe5\xd2\xad\xce\x4c\x6c\xdd\xbd\x06\xd6\xc4\x39\x83\x47\xa0\x11\xc9\x13\x0c\xf2\xdd\x05\x68\x2e\xec\x94\x09\x7e\x63\xa4\xc0\x47\x38\x1f\x06\x91\xdf\x38\x99\x15\xdf\xb1\xc3\x61\x58\x11\x6b\xbb\xf6\x0b\x89\x3b\x4c\xe7\xf6\x4b\x1f\xfd\x24\xcd\x7d\xef\x4e\x6f\xb4\xc6\x4c\x74\x6b\xbe\x5d\x63\x7c\x9e\x8b\xe1\xaa\xaa\xce\x33\x29\x0f\x68\x58\x0d\x9e\xd1\x31\x55\x64\x00\xc0\xd1\x96\x6b\x4d\x7f\xc0\x1d\xd6\x41\x61\x85\xcd\xb3\xae\x16\xdd\x78\xf1\xe6\xad\x81\xdc\x7a\xa8\xad\xd0\x5c\x2b\xdf\x76\xb6\xb5\xa2\x7a\x3f\x9e\x2e\x82\x81\xb2\xb6\x4c\x8c\x1a\xf2\x32\xc8\xb6\x1f\xb6\x5c\x31\x99\x31\xe9\xa2\x66\xe1\x8c\x1a\x4e\xcf\x98\x5f\x92\xd1\x1e\x2b\x96\x0d\x2d\xd0\x95\x57\xb5\xec\x6d\xbf\x46\xbb\xcd\x37\x20\x27\x6c\x27\xe6\xb7\xee\x60\x46\x36\xc8\xe4\xec\xf1\x8f\x95\x11\xbd\x76\x7e\x09\x9a\xfe\x22\xb1\xc6\x77\xb3\x62\x02\x65\x21\xb8\x2a\x98\x75\x9b\x39\xb6\x65\x96\x96\x9a\x9c\x62\x60\xb1\xff\x49\x0b\x89\xfe\xf6\xf2\x6f\xf9\x20\x08\xca\xc5\xec\x4e\x07\x22\xff\xfd\x3f\xbf\xf9\xcd\x93\x4c\x97\x4c\x72\xa5\x41\x3a\xf0\xf9\x5c\xc1\x8f\x97\x36\x69\x5f\xef\xce\x90\x83\x1c\x5e\x2f\xa5\x4f\x2e\xba\x67\x3e\x8d\x72\xe1\x87\xe0\x2d\x0b\xd3\x29\xd5\xa4\xfc\x6f\x77\x63\x91\x58\xb9\x68\xb6\xc7\x4c\xb0\xac\x24\x67\xdc\xfc\x5c\xc2\xde\x8f\x93\x55\x39\xe3\x58\x5c\xbd\x84\x49\x69\x9f\xca\xaf\xff\x79\xee\xf7\x4d\x5f\xef\x3f\x9f\x9a\x37\x97\xa2\x59\x04\xc7\x84\xaf\x84\xfa\xd4\xd8\xc5\x0b\x5a\x70\x8b\x5d\xd1\xdb\xf9\x0b\xeb\xd3\x2b\x9d\xee\x9a\x8d\xa9\x9a\x07\x71\x7f\xe6\xd7\x05\xd3\x35\x9b\x54\xb9\x08\xfb\xad\x78\x6d\x29\x48\x70\xab\xe1\xde\x19\xb9\xf7\x1f\x0b\x9f\xb9\xc9\x20\xfa\x47\x9b\x60\xd9\x26\x58\xb6\x09\x96\x7b\x9a\x60\xb9\xfe\xdc\x9b\x33\x4c\x62\x88\x12\xea\xd3\x5c\x34\x24\x09\x66\x3b\x8e\xc5\x7d\x08\xbd\x4c\x92\x72\xa8\x66\x11\xf8\x95\x52\x8e\xe1\x0c\x59\x66\x6d\xe3\x94\x8c\xd8\x04\x78\x88\x44\xd9\x74\xf1\xab\x13\x3e\x17\x33\x28\x7f\xd5\x2d\x70\xe6\xca\xca\x5c\xd0\x59\x19\x68\x05\xd4\xce\x8a\x7b\x9d\x8d\x20\xe7\xd6\xe5\x9f\x4b\x88\x31\xe7\xc1\x22\x79\x4a\x33\x94\xf2\x30\x9e\x42\x8f\x31\x4c\x35\x20\x38\xa6\xdb\xa0\xc3\x0d\x9d\x4e\x53\x62\xc4\x38\x24\x08\x5a\x08\x17\x95\x63\x9e\x45\xc2\x20\x41\x4b\x06\x93\xb2\x81\x34\x38\xa2\xb6\xd7\x09\x36\xcf\x16\x5b\x29\x12\xd3\x8c\x39\xd9\x25\x0e\x82\xe5\x06\xd0\xeb\x5f\x39\x7c\x2b\xc4\x51\xe5\xf0\x0d\x14\x26\x29\x38\xf9\x20\xc8\xb5\xf8\x26\x87\x58\x31\xc1\xbc\x0b\x8b\x19\x06\x6c\x65\x24\x1c\xa0\x65\x46\x52\x6e\x2e\x2c\x44\xee\x47\xc8\x42\x14\xf7\x7c\x79\x74\x40\xb3\xf9\x5d\x65\xd8\x85\x9f\xcd\x02\x27\x98\xc8\xe9\x55\x67\x2d\xf0\xb4\x5a\x0d\x1a\x61\xe7\x6e\x89\xc9\x84\x51\x42\x47\x23\x89\xa1\xb2\x4b\x23\x0d\x36\xcc\xd1\x5a\x17\x1a\x41\xf0\x30\xa2\x24\xbf\xf2\x0e\x43\x06\x57\xde\xb0\xd4\x42\xeb\x6f\x98\x17\x16\xab\x63\xb3\x6c\x32\x8a\x66\x34\x0f\x5a\x21\xd7\x24\xae\xac\xdf\x5b\x3b\xd6\xec\xb0\x1d\xd5\x7d\x9e\x59\x88\xbb\x3a\x30\xe7\xa3\x20\xcd\x86\x1c\x44\x85\x37\xdb\xb9\x49\x32\x90\x46\x1f\xb7\xc1\xc4\x94\x44\x56\x7e\x0b\x84\xc7\x7b\x87\xd7\x2c\x67\xa3\xfd\xb7\x63\x13\x2c\xb0\xa3\x8b\xf1\x54\x6b\x6e\xdb\x6c\xab\xec\x58\x93\xb1\x3d\x3b\x36\xcc\x5f\x72\x73\xaf\xce\xe8\xae\x35\xb7\x01\x43\xe3\x93\x6e\x90\x90\x63\x47\xd5\xbc\x45\xef\x5f\x97\x23\x49\x24\xbd\x27\xc0\x23\x61\x88\xc5\xff\x7f\xf3\xe6\xda\x27\xaf\x5d\x69\xc2\xd2\x2c\x81\x14\xe3\x2a\x5e\x53\xa9\xc6\x34\x01\x89\xdc\xe9\x27\x9e\x56\xfe\x9e\x89\xff\x8e\x21\xa1\x53\x3b\x59\x0c\x91\x40\x4b\xbc\x90\x24\x33\x02\x6e\x9a\xe5\x98\xbf\x81\x57\xf1\xbd\x6b\x33\x74\x76\x00\x4d\x61\xa2\x1a\x4c\x17\x5a\x40\xab\xe3\xa1\x1b\x6f\x4a\x03\xca\x8b\x59\x4f\x09\xec\xd8\x88\x1e\x94\x27\x5e\xfb\x95\x21\x3d\xa6\xbf\xc2\xc6\x56\x9e\x71\xcb\x44\xb0\xaf\xbf\x5a\x71\x67\x0c\x59\x22\xa6\x06\x2f\xd6\x9f\x95\x0d\xbf\x67\xe3\x73\xbd\xe9\x7c\x9b\x9e\xe5\x0d\xe7\xb3\xc6\xa9\x26\x66\x5a\xa4\x40\xed\x34\xd1\x2a\xf7\xdf\x56\x13\x2d\xb0\x3f\x2e\x9f\xed\x51\x98\x5f\xff\xca\x5b\x1b\x82\xd7\xd7\xd2\xa6\x1f\x83\xdf\xb8\x24\x48\x4f\x33\x47\x69\x8c\x2c\x38\xcb\xee\x3e\x0d\x97\x5b\x23\xcf\xf8\xdb\xd6\x48\x35\xfe\xb6\x75\xb2\x8d\x1d\xdb\xb0\xcd\xf5\x48\x67\xc7\x56\x34\x76\x3d\x02\xee\x30\xe9\x64\xb5\x37\x79\x87\x79\x8d\x4e\xbc\x07\x12\xde\x4d\x65\x19\x15\xf9\xce\x25\x1c\x1a\xe1\x0d\xab\xb1\x0c\x12\x11\xdd\x39\xbb\xe5\xdb\x8b\x90\xdb\xe7\xab\x0f\xb9\xcc\x3e\xc2\xd6\x61\x70\x2b\xd2\xb5\x22\x5d\x2b\xd2\x3d\x15\x91\xce\xfa\x07\xf6\x81\x52\xcd\x2c\x64\x29\xad\xb2\xb1\x97\x2d\xb5\x5a\x31\x5a\x6a\x85\xa3\xa5\x56\x6b\xc6\x93\xa3\x56\x1b\xc9\x69\x1b\xc4\x10\xae\x3e\xc8\xad\x31\xb5\x35\xa6\xb6\xc6\x54\x37\x5a\x5e\xe6\x46\xcb\xcb\x5a\x5e\xd6\x1a\x53\x57\x4d\xd9\x1a\x53\xb7\x9c\xa8\x35\xa6\xb6\xc6\xd4\xd6\x98\xda\x1a\x53\xd7\x7d\x4c\x2b\xd2\xb5\x22\x5d\x2b\xd2\x6d\xba\x98\xd6\x98\xda\x1a\x53\x57\x8d\x96\x5a\x95\x46\x4b\xad\x56\x8c\xe7\x4d\xad\xea\x1b\x53\xa3\x04\x28\x5f\xac\x54\xcd\xc4\x7f\xe3\x7d\xa1\x7e\xbd\x2b\xd2\xe9\x7e\x1d\xc0\x98\x4e\x98\xc8\x65\x51\x28\xe9\xfc\xe6\x67\x32\x02\xad\x0c\x16\x80\x86\x45\x82\x79\xcd\x64\x63\xe0\x74\x90\x2c\x9c\x78\x1d\x29\x71\x4f\xae\x36\x1e\x0f\x84\x30\x5f\x37\x0f\x31\x54\x75\xbc\xa6\xb3\x4d\x3c\xf3\xc1\xb2\x1c\xbb\xc5\x41\xcd\xe7\x6f\x2f\x9a\x0a\x65\x26\xef\xb9\xaf\x90\x6d\xb8\x83\xad\xc2\x8b\x65\x03\x5d\xa1\xbf\x37\xf7\x1c\x62\x4c\x72\xf3\x35\xcb\xcd\xa1\x67\x11\xd3\xc9\x34\xbc\xb8\xb7\xa8\xec\xc8\xd3\x09\x89\x3e\x7f\x7b\xb1\xb9\xf9\xde\x6f\xc0\xc7\xb0\xd4\xb7\x76\xf8\xd6\x0e\x1f\x46\x2b\x06\xed\x38\x69\x2b\x06\xad\x18\xcf\x5b\x0c\xda\x77\xbb\x75\x6b\x6d\x26\xad\xb5\x79\xf5\x6d\xad\xb5\xb9\xb5\x36\xb7\xf6\x9b\x25\xa3\x15\x5c\x70\xb4\x82\xcb\x9a\xf1\xe4\x04\x97\xd6\xda\xdc\x52\xab\x96\x5a\xb5\xd4\xea\x69\x50\xab\xa7\x18\xba\xdb\x1a\xfd\x5a\xa3\x5f\x6b\xf4\x6b\xb9\x51\xcb\x8d\xd6\x8c\x27\xc7\x8d\x5a\xa3\xdf\xb6\x13\xb5\x46\xbf\x85\xa3\x35\xfa\xad\x19\xad\xd1\xaf\x35\xfa\x2d\x19\xad\xe0\xb2\xe3\xa4\xad\xe0\xb2\x62\x3c\x6f\xc1\xa5\x35\xfa\xb5\xd4\xaa\xa5\x56\x2d\xb5\x7a\x1a\xd4\xaa\xbe\xd1\x6f\xcd\x49\x5a\xfd\xec\xea\x93\xb2\xf2\x59\x16\xad\x7a\xe1\xce\x0d\xdd\x6b\x35\x80\x1d\x50\x05\xdf\xfc\x7e\xae\x6e\x79\xf9\x96\x14\x62\x46\xf5\xee\xfd\x59\x8b\x57\x2c\xdf\xb3\x0d\xf6\x3e\x2c\x63\xc7\x59\x5c\x61\xe5\xb5\x41\xb1\x66\x6b\xe3\x2b\x7b\x73\x68\x32\x3f\xd3\x97\xb3\xe0\x3c\x7c\x49\x01\xfa\xa0\x34\xde\x8f\xc1\x37\xb4\x71\xa5\xa7\x43\xbb\x78\xa6\x42\xf4\xf2\xc2\xfe\x49\x35\xc3\x91\xfd\x7b\x16\x5c\x5e\xb7\x69\x8b\xaa\x6f\x2f\x04\x96\x07\xd0\x85\xb5\x5e\x5f\x84\x14\xe0\x59\x88\x65\x54\x1a\x0a\xe9\xad\xdc\xc8\xb4\x4b\x77\xcf\xc0\x7b\x75\x37\xa9\x95\x9c\x7a\x3d\x87\xee\x96\x32\x95\x97\x59\xd6\x37\x61\xcc\xae\x07\x46\x1f\x64\xca\x94\x5a\x16\x70\x5d\x5d\xfa\x3a\xb2\xb9\x01\xb9\x5c\x02\x7f\xff\x45\xa5\xe5\x04\xf1\xc9\xb6\xff\x19\xd0\x88\xc8\x3c\x71\x4d\x40\x5d\xf9\x6b\x42\xa3\x48\xe4\x5c\x13\x0e\x10\x5b\xcb\xc6\x22\x5c\xdd\x80\xd8\x6e\x20\x3f\x6d\x2a\x3d\x75\xed\x3a\xd7\xde\xe5\xbe\xe1\xcc\x7e\xc2\xc2\x82\xea\xe5\xb1\xb9\xb4\x85\xaf\x5f\xcf\xb5\xb6\x61\x85\x1b\x33\xc2\xca\xfe\xf6\x45\xc2\xa2\xe9\xdb\x3c\x01\xd7\x22\xae\xd4\x41\xdf\x4a\xbb\x65\x11\x39\xc3\xbb\x71\xf5\xb6\x37\x65\x2c\xc0\x76\x92\x76\x85\x01\x2a\x8f\xfb\x2e\x55\xb6\xb5\x83\x79\x88\xd0\x2c\x4b\x30\x95\x42\x18\xa1\xc5\x36\xe8\x0f\xfd\xf5\x16\xdd\xb6\xb9\xf4\xb2\x91\x78\x4d\xb6\x12\xb1\x89\xb7\x59\x0d\xd6\xa1\x0a\xd9\x52\xd6\x26\xb6\x44\xfc\xf7\x52\xe4\xd9\x86\xb7\xcf\x5b\x16\xed\xd3\xbe\xfb\x56\xb9\x81\x8d\xbf\xe8\x5c\x46\xbe\x63\xb0\x6d\xd2\xe5\x4c\xa2\xb6\x1b\x78\x9a\x27\x9a\x65\x89\x6d\xf3\x3d\xb2\x13\x52\x09\x05\xdf\xe8\x10\xca\xa7\xde\x03\xe5\xda\x44\x40\x4c\xe8\xc8\xcc\xa8\x7d\xf3\x58\xdb\x5f\x22\x4f\xc1\x9c\xe6\xb8\xd4\xd0\xd4\xa8\x53\x7c\x5a\xcc\x4e\xee\x59\x92\x60\xfb\xde\x24\x11\xf7\xcb\xdb\xfa\xcd\x8e\xed\x84\x42\xb2\x9d\x60\x48\xb6\x17\x81\x09\xe1\x82\x7b\xd3\xee\x4f\x6f\x5f\xed\xb6\x89\xd7\xd5\x39\x5c\x2f\x10\xc0\xc6\xd6\x19\x95\x9a\xd1\x84\xe4\x32\x51\x76\x1f\xa9\x51\x02\xa4\x6f\xa6\x32\xa6\xe8\x19\x8c\x40\xd9\xae\x1d\xe4\x77\x76\xe7\x1c\x60\xed\xf9\x14\x3c\x99\x12\x6a\x77\x7e\x98\x27\x49\x87\x0c\x19\xa7\x86\xec\x42\xe6\x33\x61\x8c\xfe\x44\x6e\x18\x8f\xc0\x7c\x53\x37\x08\x16\xb8\x22\x33\xa3\x39\xdf\xe1\x90\xc6\x9d\x52\x47\x67\xec\xc3\x8d\xaf\x30\x07\x36\xc2\xb6\x75\x43\x21\xbd\xc8\xf2\x56\x24\x68\xde\x76\x86\x6f\xd7\xd1\x9e\x96\x2f\xff\x95\x71\x54\x52\xc8\x5b\x64\x1c\x46\xd9\x01\x86\xfd\xa1\xcd\x94\xd8\xa6\xd6\xe0\x4e\x81\x50\x47\x2a\x8f\xc6\xe6\x93\x0e\x32\x11\xab\x03\x43\x46\x0e\x14\x44\x12\xb4\x3a\x38\x36\x7f\xcd\x7e\x03\x7e\x5f\xf9\xb9\x13\x9a\xb1\x83\xe3\x0e\x41\x00\x61\xa3\x13\xa1\xc7\x4f\x17\x0f\xfd\xb7\x56\xfa\x6b\xad\x1b\x33\x5d\xfc\x4a\x33\xb8\xae\x1d\x22\xb3\x4d\x30\x0c\x8d\xd6\x80\x79\x52\x06\x29\x6d\x7f\xce\xd0\x20\x7e\x96\x58\x13\x72\x16\x1a\xe4\x83\xc6\x3e\xe0\xee\x6e\x98\x80\x9c\xea\xb1\xd1\x56\x99\x7a\xfa\x87\x7f\x43\xc7\x52\x31\x16\x02\xdc\x1d\x78\x0f\xdc\x02\xc9\x6d\x67\xa5\x59\xe0\x1e\xfe\xee\xb0\x2c\xf5\x1a\xf1\xa9\xa0\xe6\x4f\x16\x94\xc8\x5e\x77\x02\xe3\xcf\xe6\xc9\x2a\x08\xed\x4f\x96\x5a\x06\xfa\xf1\xea\x95\xed\xa2\xe4\x60\xf5\x23\xe3\xb1\x0a\x95\x8c\xe2\xd0\x2d\xd3\xc0\x7b\x21\x90\x71\x85\x4f\x11\xc0\xf3\xe2\xeb\xa6\x22\xe7\x9a\xe9\x4b\xfa\xcd\x3e\xa8\x24\xd8\x95\xa9\x22\xe5\x18\x3a\xd5\xb1\x2e\x27\xa3\x8b\x24\x74\x00\x89\x6d\xb9\x64\xae\x16\xcb\x27\x67\xaf\x5e\x87\xee\x64\xd8\xed\xf3\x63\x2b\x22\x1b\x38\x4e\xe7\x7a\xbc\xcd\x8f\xcd\x65\x4f\x04\xc5\x76\xc6\x60\x72\x03\xda\x1e\xb3\x94\x66\xe6\x94\xd9\x39\x16\xda\x32\x5f\x21\xa4\xd7\x1f\x96\xad\x64\xf6\xcd\x7b\x32\x2d\x7a\xc9\x46\x47\x65\x33\x8f\xef\x36\x67\x6f\x85\x85\xa3\x18\x15\x30\xcf\x20\xb4\x93\xeb\x9d\x24\x1e\x85\xfe\x7a\x16\x83\x95\x4d\x8c\xb6\x69\xe8\xd2\xff\x5e\x4c\xd1\xf0\x16\x6c\xa3\x34\x19\xbd\x39\x81\x48\x8b\xd5\x65\xdf\xfc\xcd\x1a\xd2\x2c\x59\x77\xf2\xc8\xd6\x0a\x56\xca\xf8\x5b\xa0\xf1\xf4\x06\x22\xc1\xe3\x0d\x09\x6c\x65\x3f\x5e\x33\xce\xd2\x3c\x25\x3c\x4f\x07\x80\x20\x56\x76\x2e\x24\x24\x56\x79\xa5\x84\xc3\x7d\x32\xf5\xad\x82\x49\x26\x62\x4f\x4f\x06\xd8\x11\x39\x9e\x62\x7f\x33\x2c\x90\xca\xa7\x66\x12\xec\x7c\xec\xeb\xe8\x91\x48\x52\x65\xc4\xa2\x0e\x4e\xca\xb4\xe1\x58\x03\x40\xdf\x12\x8b\xc1\xec\x31\x9d\x50\x96\x18\xd1\xba\x47\x2e\x60\x48\xf3\x04\xdb\xf4\x91\x17\xe4\xc8\xbc\xcc\xeb\x53\x8b\x1e\x30\xe2\xae\x12\x46\x13\x57\x2e\xc7\x1d\x17\x74\xbc\x85\xb5\x7c\x93\xfa\x7d\x7e\x6c\x5a\xc7\xcf\x8f\x8c\xe6\x6a\x53\x35\xbc\xb2\x31\x57\xb6\x23\x76\x59\x12\x2d\x91\x74\xa6\xdc\xcc\x9b\xb1\xec\xd5\xb5\x0f\x16\xac\x5a\x8a\x91\x04\xa5\x2e\x80\xc6\x09\xe3\xb0\x3b\x7e\xdd\x8e\x81\xa4\xf4\x01\x71\x0c\x1b\x9a\x33\x5e\xc1\x30\x5a\xfe\x2a\x2d\x6c\xd3\x7c\xff\x7a\x32\x80\x21\xb6\x61\xc4\x0f\x2e\xed\xbe\xc5\x9f\x21\x65\x09\xc4\x3d\x7c\x47\x69\x96\xa2\x7b\xb1\x45\x1c\xf3\x37\xe3\x39\x98\xa7\x32\x29\x50\x99\xb4\x8f\x96\x79\x3c\xf2\x50\x5a\xb4\x13\xf7\x1d\xfb\xfa\x33\xa0\xb8\x7c\x88\xac\x91\xcf\x75\x02\xf7\xb8\xa9\x72\x39\x34\xaa\xa3\xd7\x38\x4b\x0b\x72\xad\x5e\xc9\xb5\xd0\xae\xf1\x5f\xf8\x40\x7c\xda\x35\xa2\x04\xa5\x59\x8a\x07\x2c\xce\xa5\x6f\x8b\x89\x30\xa3\x8b\xb7\xbe\x72\x54\xbe\x79\xf1\x62\x43\xf9\xed\xf1\x91\x5e\x02\x6a\xca\xbb\xe0\xcb\x75\xa0\x43\x9e\xfc\x1b\x15\xd8\xec\x31\x73\x62\x30\xf6\xf7\x04\x89\x7e\x42\xa6\x34\xe3\xa3\x9c\xa9\x31\x19\x80\xbe\x07\xe0\x04\x1e\x6c\x85\x0b\xf2\x6f\x90\x02\x37\xd5\x80\xb7\x70\x11\x54\x80\xf6\x72\x7f\x20\x36\x61\x8a\x09\xfe\x03\x53\x5a\xc8\xe9\x2b\x96\xb2\x35\xa5\x47\xfd\x98\xef\x72\x1c\x20\x28\x92\x18\x7b\x13\xb3\x88\xde\x80\xfd\x60\x09\x68\xc1\xd4\xc2\xaa\xa7\xc4\x9c\x93\x01\x8d\xee\x1e\x0d\xc0\x2f\xf6\x05\xc2\x9e\x5d\xef\x00\x55\x94\xf7\xc2\x04\x48\xb6\x2c\x52\x5e\x3e\x58\xf8\x54\xa0\x7c\x3f\x16\x0a\xf0\x06\x6b\x64\xc4\xc7\xbc\x53\x80\xa9\x40\x30\xcc\xe9\x16\x1c\x14\xa1\xc3\x61\xf5\x8e\xe2\xb0\xa3\xe4\x99\xe6\x4a\x93\x94\xea\x68\x6c\x4d\x59\x22\x0e\xe2\xc4\xa1\x72\x62\xff\x36\x50\xde\xd8\x88\xbc\xbd\xb9\x97\xd8\x75\x5e\x3e\x18\xdd\x72\xad\x37\xa7\x3a\x2a\x20\x9f\x9d\xa6\xaa\x01\x27\xd5\x0d\x71\x72\x5b\x6a\x5b\x04\xdf\xa2\x01\xb8\xf8\x05\x77\xe1\xec\xfa\x62\x73\x53\xcc\x2e\x0a\xee\xd6\x2a\xee\xac\xa9\x7b\xc5\x47\x79\x93\xa9\xbb\x52\xb5\x77\xdb\xd6\xd0\x1d\x42\xc9\x1d\x4c\x6d\x17\xe9\xb9\xb6\xbc\x12\x12\x27\x49\x00\x76\xa7\x35\x37\xb9\x96\xd2\x5b\xac\x77\x6b\xec\xb1\x63\x3b\x57\x84\x1f\x5d\xb3\xd0\x2d\x9f\xf0\x1f\xbd\xc5\x63\xdb\x23\xb8\x1d\x77\x30\xdd\xee\x81\x99\xed\x36\xbb\xe0\x74\x1f\xbb\xef\xe6\x87\x20\xe8\x85\xad\xde\xce\x47\x54\x1e\x5b\x9b\xa8\xfc\xf0\x40\xac\xf5\x79\x01\xfd\xca\x56\x26\xf3\x8d\x87\xca\x22\xa3\x39\xd3\x63\x96\x21\x23\xf2\xce\x00\xdf\xe4\xfc\x67\x9a\xb0\x38\x4c\x61\xcf\xef\x15\xef\x18\xf1\xc9\xfc\x07\x89\xae\x15\xd7\x2e\x04\xa8\x6b\xa1\xf1\x97\x8f\x06\x20\xbb\xcc\x5a\xe0\xb1\x53\x38\x2b\x34\x52\x19\x54\xbc\x4a\xfd\xd1\x55\xcf\x57\xf6\x0a\xa0\x64\x8a\x5c\x71\x22\xa4\x87\x03\x76\xac\xb7\x13\xd9\x29\x90\x4f\x0c\xac\x83\x03\xed\xd3\x0b\xe7\x70\xe0\x13\xb2\x02\xbd\x15\xd3\xb9\xa9\x50\x3e\xb0\x57\x6c\x47\xfc\x04\xa5\x5d\x27\xaa\x52\xef\xe4\x66\x11\x49\x41\x8e\xd0\xe3\x12\x6d\xec\x71\xa8\x6e\xca\x76\x74\xd7\x8e\xad\xa9\x6f\xf9\x85\x5b\x61\x01\xb2\x26\x6b\x02\xaa\xc3\xdc\xec\x0c\x15\x93\xd3\x7f\x1b\x0a\x8e\x7b\xf0\x3f\x24\xa3\x4c\xaa\x1e\x39\x23\x8a\xf1\x51\x02\x95\x6b\x4e\xc3\x28\x4f\x63\x66\x60\x8a\x18\x52\x3b\xa1\x89\xd3\xa5\x28\x27\x60\x6d\x56\x66\xf6\x59\x96\xda\x71\x92\x8a\xa1\x3c\xc1\xd1\x75\x70\x07\xd3\x83\xce\x1c\xd2\x1c\x5c\xf1\x03\xcb\x5b\xe6\xd0\x24\x30\x22\xf4\x91\x1d\xe0\xb5\x83\x26\xb9\xf0\x96\x0c\x67\x57\x3b\x5a\xf5\xa5\x1b\x63\x84\x8f\xed\xd8\x51\x58\xaf\x68\x89\x2e\xa2\x49\x0b\x92\x2b\xb0\xd2\x3a\x9e\x32\x02\x5e\xce\x44\xa9\x12\x15\x53\x0e\xf7\x28\x3d\xee\x8d\xe0\x67\x34\x09\xc6\x47\x3f\x65\x31\xd5\x1b\x05\x95\xda\x51\x81\xc8\xe1\x5b\x3b\x09\xc9\x71\x16\x83\x5b\x43\x36\x22\x19\x95\x34\x55\x3d\xd2\x77\xd5\x0d\x11\xd3\xd8\xb0\x6c\x4b\x74\xb0\xbb\x9d\x66\x40\xfe\x4c\xde\x96\xd7\xd2\x23\xdd\x6e\x97\xdc\xbe\xb9\x78\x73\x4a\xec\x2f\x56\xca\xd6\x82\x0c\x05\x2a\x41\x22\x97\xe6\x55\x13\xe0\xa8\xf8\x1b\xf9\x5e\x70\x78\x33\x34\x27\x84\x6a\x98\x80\x24\xf7\x66\xab\x22\x16\x43\xb0\x5e\xf5\x0e\x1f\x17\x8f\x77\x93\x4c\x52\xfa\x70\x93\xcb\xd1\x16\x1b\x40\xe6\x36\xa1\x6c\xb2\x29\x94\x49\x44\xbd\x72\x76\xae\x8a\xc6\x10\xe7\x09\xc4\x84\x0e\xc4\x04\x2a\x26\xdb\xea\x63\xc8\xd2\x73\xf0\x0f\x1a\x9e\x37\x50\x22\xc9\x75\x50\x56\x8f\xe0\xe1\x94\xfc\x27\xba\xb6\x29\xc9\x40\x46\xc0\x35\x1d\xc1\xac\x19\xc0\xde\xf7\xf2\xc5\x7f\x1c\x3b\x7e\x64\x66\x74\xd6\x93\x17\x06\x23\x5e\xd3\x87\x9f\x78\x61\x1a\x64\x8a\xbc\xe8\x91\xb3\x99\x97\xe1\x73\x49\x94\x27\x68\x6b\x41\x77\x7d\xe9\x95\x83\x29\x91\x22\x47\x87\x3d\xc9\xb3\xaa\x36\xfb\xd5\x7f\xfe\x87\x51\xfa\x68\x9a\x25\x70\xea\x8b\xa2\x5a\xb5\xd9\xc8\x30\x5a\x90\xaf\x5f\xfc\x87\xa5\x9e\xe6\x7c\x16\x5a\x61\x01\x33\x6a\x00\x96\x67\x84\xa5\x36\x14\x13\x92\x69\x51\x5d\x55\x56\xd1\x5f\x69\x2a\xb5\xea\x10\xf4\xea\x07\xe1\x50\x0b\x4d\x93\x19\x2d\x1f\xb5\x70\xb8\xb7\x40\x8a\x05\xc2\x04\xd0\x50\x45\x5e\x7e\xfd\xe2\x3f\xe6\xcd\x29\x6f\x78\x04\xf8\x24\x3e\x81\x61\x16\x03\xa3\xdc\xdf\xb1\x24\x81\xb8\xb3\x76\xf9\xc3\x5c\xea\x31\xc8\x0e\x01\xae\xbc\xb1\xca\xac\x6f\x66\x6d\x38\xbb\xcc\x39\x47\x19\xc1\x5a\x87\xd1\xa2\x55\xb2\x70\xb9\x8f\x35\x8c\x50\x93\x54\x28\xbd\x78\xc9\x9b\x1f\x37\x33\x28\x9f\xbe\x19\x6e\x2b\x0e\x74\x77\x30\x43\xcc\x3f\xbd\x83\x48\xf9\xd0\xbd\x0b\x99\x92\x5d\xc6\x75\x57\xc8\xae\x9d\xe6\x94\x68\x99\xaf\xf7\x1a\x14\x23\xad\x9c\x80\x8f\x40\x06\xf2\xd2\x79\x9b\xdb\xd5\x47\x39\xf9\xbb\x9f\xe7\x58\xdc\xf3\xe5\x94\x03\x09\xa7\xa3\x19\x3b\x9e\xfa\xaa\xc5\x6d\xe6\xd8\x98\xb7\x9b\xbb\xff\xd7\x3c\x76\x6f\x41\x0e\xdc\xd9\x0d\xa7\xdd\xc8\x55\xe8\xf1\xe8\x6c\xf0\xf6\x70\x6c\x2d\xe7\xb3\x36\x27\x73\x83\x7d\xcd\x02\xca\x35\x77\xc2\x17\x50\x20\xbb\x8e\xc2\x21\xa3\x31\xa2\xc0\x9c\x73\xb5\xf4\xa0\x27\x40\x95\x5e\x04\x8a\xf6\xa0\xaf\x1f\xab\x03\xf8\x67\x47\x55\xe8\x34\x12\x12\x82\xbc\xb0\x31\x9e\x5b\x44\x39\x78\x0b\xd6\xc3\x67\x03\xce\x2a\x42\xd4\x41\x38\x12\x66\xff\xaa\xf2\xd5\x63\x85\xcd\x78\x23\xe7\x2e\xa2\xb5\x7b\xb4\x14\xd8\xeb\x4c\xa7\x8e\x78\x05\x8f\xa2\x75\x69\xee\x8d\x14\x9d\x82\xa6\xab\x93\x3c\x66\x47\x95\x68\xdf\x68\xca\x63\x2a\x63\xb7\xca\xc3\x43\x15\xa6\xec\x91\xd7\xe8\x4b\xe3\x43\x71\x4a\xc6\x5a\x67\xea\xf4\xe4\x64\xc4\x74\xef\xee\x0f\xaa\xc7\xc4\x49\x24\xd2\x34\xe7\x4c\x4f\x4f\xd0\x81\xc6\x06\xb9\x16\x52\x9d\xc4\x30\x81\xe4\x44\xb1\x51\x97\xca\x68\xcc\x34\x44\x3a\x97\x70\x42\x33\xd6\x2d\x64\x66\xd5\x4b\xe3\xdf\xfa\x17\x3d\xb2\x60\x5c\x39\x43\x68\x5d\x92\x13\xe8\xe6\xfc\x8e\x8b\x7b\xde\x45\x4d\x56\x6d\x75\x9a\x36\x8b\x62\xf0\x63\x06\xde\xdb\x04\x2e\x64\x22\x7e\xf4\x4d\x30\x1f\xd3\xa5\x3c\xee\x5a\xa7\xe3\x23\xef\xc5\x2e\xb6\xdd\x6e\x11\x18\xb0\x49\xc4\xb9\x1d\xbb\x69\x43\x34\xd2\x6c\x02\x3b\x39\xb1\xfd\xa8\x6c\xf7\x1b\x1f\x30\x1a\xe7\xd2\xee\x78\xc9\x9b\xed\x7d\x33\x29\x9d\xa2\xac\x83\xef\x26\xc2\xb2\x72\x2e\x62\x70\x96\xcf\x09\xaa\xf6\x37\x86\x99\xdf\x1a\x51\xd8\xf9\xb8\xd1\xee\x3b\x55\x1a\x52\x4b\x9c\xec\xf3\xc9\x94\x68\x39\xb5\x8e\x71\x79\x67\x94\x4f\xe7\xb9\x36\x12\xff\x1d\xde\xa7\x94\x88\x18\x8a\x3e\x05\x5c\xbd\xdc\xe5\x6d\x78\x94\x64\x42\x31\x7c\xb7\xe3\x79\xdb\x59\xe6\x76\x67\x97\x25\x37\xdd\x37\xbf\xdf\x66\xeb\x86\xd8\x46\x61\x4b\x2b\x7b\x35\x82\x62\x58\x8e\xf0\x77\xdb\x73\xa8\xbc\xe2\x6a\xc4\x92\x48\x70\xa5\x25\x65\xcb\x73\x98\x16\x8f\x1d\x5d\x21\xbb\xfb\x1b\x08\x62\xd0\xd9\x4e\x40\x21\xf3\x31\x58\x9e\x29\x22\x5a\x7a\x50\x97\x01\x63\x53\x9c\x7c\x2c\xa1\x21\x5c\x3b\x9a\x56\x77\x80\x11\xa9\x05\x27\xfb\x34\x0c\x41\x4a\x88\x2f\x50\xfa\xbc\x09\xdf\x75\x35\xe2\x22\xfc\x7c\xf9\x00\x51\xbe\x69\x26\xf8\xfc\x98\xb3\xe5\x79\x83\x88\x0b\x3b\xb1\x8b\x30\x47\xd7\x5f\x70\xf2\x87\x40\xb0\x3b\x41\x44\x51\xcd\xd4\xd0\xe6\x8b\x85\x8d\x80\x92\xe3\x33\xa0\x70\x70\x0f\x23\x8b\xb3\xa9\x0f\x4c\x23\xb9\x89\xc6\x42\x28\x73\xca\x71\x3f\x71\xde\x09\x13\xd6\xe7\x87\xc9\x2b\x92\xa4\x86\xc6\xf8\x24\x96\x62\x7a\x6b\xa8\x2d\x1e\x63\xca\xaa\xe0\x01\x82\xde\x4b\x65\xa6\x41\xc3\xa3\xf9\x63\x84\x52\x93\xd2\x44\xe5\xa9\x99\xf4\x1e\xd8\x68\xac\x55\x87\xb0\x1e\xf4\x10\x6b\x80\x46\xe3\xd2\xb4\x29\x80\xae\x74\x41\x29\xa3\x5a\xd9\x4a\x7c\x14\xb2\x1a\x5c\x1a\x4e\x27\xf0\x98\xd9\xbd\x5c\x08\xae\x0e\x01\x1d\xf5\x8e\x3b\xa4\x48\x14\x37\x6b\x1c\x4c\x09\xd3\x60\x68\x36\xea\x22\x52\xe4\x23\xfb\x25\xe0\x63\x3a\x71\x5d\x21\xe5\x03\xbd\xa8\x31\xea\x8c\x07\xf6\xe3\x0e\xcc\xbe\xe1\xca\xf3\xd4\xe8\x8b\x81\xa8\xa3\x59\xdd\x37\xce\x11\x52\x82\xca\x84\xd5\x36\x67\x0d\xee\xff\x3b\x3c\x74\xa4\x8e\x0b\x60\x8e\xd9\x68\xec\x61\x49\x1d\x23\xa8\xee\xc1\xf6\x67\x8f\xd4\xf2\xa5\xd8\xb1\xa3\x47\xc5\x8e\xaa\x6f\xdb\xe7\x4b\x14\x58\x55\xda\x7f\x0d\x32\x0d\x50\x44\x14\x41\x92\xe1\xec\xdc\xbe\x61\x8d\xc3\x31\xf2\x82\x1c\x21\x92\x31\x7d\xa8\x10\xe1\xbb\x22\x3b\xee\x91\x33\xc2\xf3\x70\xe6\x56\xbd\x80\x8b\x30\xbf\x9b\xc8\xbc\x54\x89\x62\xae\x1d\xbf\xb8\x16\xb9\xb3\x63\x37\x4f\x79\x79\x74\x1d\x04\x60\x7d\x59\xc4\x55\x93\x58\x58\xef\x38\x41\x3d\xd2\xed\xe7\xf0\x5f\xb1\xfb\x1c\x73\x01\x16\x78\x5c\x8b\x28\x0a\x90\x69\xa7\x2c\x3d\x85\x03\x59\x3d\xc5\x16\x16\xbb\x62\x05\x69\x06\x33\x48\x43\x70\x25\xb5\x22\x74\x16\x8f\xd9\x30\x16\x9f\x45\x55\x81\x76\x85\xc8\x0f\xa6\x78\x75\xcb\xe0\xa5\xe5\xa3\x2e\xa5\x2b\x46\x2d\x9a\x57\x8c\x95\x88\xb7\x7f\x81\x3d\x8b\x47\x43\x68\x6b\x47\x7d\xd2\x56\x8c\xed\x43\x83\x96\xcd\xb3\x43\xc0\xd0\xe2\xd1\xd4\xd9\xb4\x63\x87\xe0\xa2\xc5\x63\x4e\x44\x7d\x9c\x58\xa3\xc5\x63\x67\x23\xe9\xe2\xb1\x6b\x5c\xd2\xe2\x31\x93\xaa\xf8\x48\x41\x4a\x9d\x6a\x84\x12\xf9\x5e\xdb\x73\xfc\xaa\x16\x3f\x29\x46\xc3\x20\xde\x2d\xb2\x69\xf1\x98\x15\x00\x9f\x48\x94\xd3\x82\xa9\xbe\xd7\x66\x9a\x57\x4b\x1f\xb6\x39\xea\x3e\x4e\xc7\x29\x14\x1d\x97\x3a\xe3\xed\xcc\x18\x51\x9d\x49\xc0\xb2\x02\x18\xf6\xe5\xed\x30\x1f\x27\xb0\x6a\xf1\x68\x8e\x71\xda\xd1\x10\xfb\xb4\xa3\x31\xe4\x46\x81\xe7\x3b\x6b\x17\xfe\x84\xb2\x8e\xb5\x4c\xb7\xb2\x4e\x2b\xeb\x6c\x31\x5a\x59\x67\xd3\xd1\xca\x3a\xcb\x46\x2b\xeb\x2c\x18\xad\xac\xd3\xca\x3a\xb5\xc6\xfe\xc9\x3a\xd6\x52\xd5\x98\xc1\xec\x6f\xd6\xe0\x3a\x6b\x21\x43\x69\xca\x87\xf4\x54\x4d\x65\x86\xf7\xdf\x38\x12\x7b\x8b\xe6\x35\x17\xa9\x2e\x29\x1f\x01\x79\xd9\x7d\xf9\x62\xc3\x74\xc0\xc5\xa3\x4e\xd0\x4e\x79\x6c\x9b\x3a\x38\x3b\x96\x79\x24\x1e\xcd\xbb\xe4\x4e\x6a\x70\x78\x54\x24\xcc\x25\x0e\xa2\x50\xd5\x2a\x05\x4d\xa8\xae\x18\xc4\x59\x0a\xc1\x21\x5a\x49\x41\x2e\x62\x7a\x05\x77\xfe\x0e\xb3\xa9\xbd\xdd\x56\x10\x01\xb5\x71\xec\x03\x08\xab\x10\x29\xd8\x04\x53\x7f\xe8\xcd\x12\xc0\xc3\x8a\x1c\x41\x6f\xd4\x23\xb1\x4d\xd6\xa6\xdc\xc5\x8c\x1d\x77\xca\xee\xf1\xd4\x10\x57\x89\xff\x31\xcb\x76\xfe\x71\x98\x00\xd7\x39\x4d\x92\x29\x81\x09\x8b\x74\xf8\x3e\x0c\x08\x64\xda\x3a\x3b\xeb\xb8\x52\x6a\x88\x87\x75\x45\xc2\xee\xdc\xd9\xda\xce\x5f\xed\x47\x7d\xd9\x6d\x6e\x1d\xbb\xd3\x9b\x19\xb9\xc4\x42\xa8\xb7\x54\xad\xd2\xe6\x6d\xd6\x5f\x89\xff\x44\x04\x7f\xf3\x76\x57\xf7\x18\x69\x88\x27\xd4\xe6\x03\xb3\x0a\x54\x9e\x24\x06\xbd\xad\xc7\x6c\x1e\x04\x0b\x3c\x59\x0b\xb2\x6d\xac\x9b\x35\x2d\x65\xdd\xe0\x3d\xb7\x22\x13\x89\x18\x4d\xcb\x3b\x68\x3b\xb2\x94\xca\xdb\x50\xa2\xf2\x81\x13\x01\xcd\x21\xba\x9e\xd9\xf2\xd6\x17\xb2\x74\xb4\xbe\x90\xb9\xd1\xda\x07\x66\x47\x6b\x1f\xd8\x62\xb4\xf6\x81\x05\xa3\xb5\x0f\xcc\x8f\xd6\x3e\xd0\xda\x07\xea\x8c\xe7\x6f\x1f\x20\xad\x2f\x64\xd9\x68\x65\x9d\x62\xb4\xb2\xce\xe6\xa3\x95\x75\xe6\x47\x2b\xeb\xb4\xb2\x4e\x2b\xeb\xb4\xb2\xce\xae\xa3\x06\x72\x67\x22\x6e\x3c\x45\x26\x13\xf1\x8a\x0c\x19\x6b\xaf\x8e\x44\x37\x11\x51\xa8\x2c\x62\x1e\x71\x9e\x0f\x45\x53\x6b\x42\xef\x90\x7f\x0b\x0e\x36\x3d\xc1\x96\xac\x4d\x81\x08\x6c\x02\x91\x89\xf8\x48\x1d\xef\x10\x78\xde\x66\xd8\xb4\x19\x36\x9f\x41\x86\xcd\x98\x2a\x57\xf8\x08\x49\xeb\xf2\x84\x9b\xd2\xf1\xbf\x05\x99\x7e\xb6\xf9\x36\x06\xe1\x1c\xc2\x60\x8f\xb8\x02\x29\x2c\xec\x62\xe7\xdb\x85\xb8\x5f\x85\x98\xd3\xcb\x6c\x8b\x9d\x38\x86\x98\x64\x20\xbb\x16\xc9\x04\x19\x32\x57\xff\x6b\x06\x7f\x1d\x84\x9f\x78\xde\x4c\x15\x12\x4f\x3a\x79\xa6\xfa\x29\x8d\xf9\xa6\xca\x2e\xba\x0a\x57\x7c\x72\xa9\x34\xcd\x68\xa5\x5d\xa2\x9d\x3b\xed\xc7\x5a\x7a\x69\x53\x4a\x24\x2a\x79\x37\x5b\x95\x39\x5e\x3e\x16\x16\xa7\xfd\x57\x0e\x72\x4a\xc4\x04\x64\xa1\x18\x85\xee\x3c\x9d\xd0\x64\x26\xa2\xae\x00\x72\x33\x06\x9e\x46\x4c\x11\x4d\x6a\xea\x4d\x7b\x0d\xc9\x9e\x55\x3f\x5e\x3e\x9a\x55\x1c\x1a\x54\x1b\x9e\x5a\x2d\xe5\xe5\xa3\x51\xf3\x1b\x69\xd8\x04\x47\x1a\x34\xc3\x91\x66\x4d\x71\xa4\x71\x73\x1c\x69\xd2\x24\x47\x3e\x7a\x05\xe8\xe5\xa3\x61\xf3\x11\x69\xdc\x4a\x47\x9e\x60\x3d\xe9\xe5\xe3\x11\xc0\xdd\xa4\xc5\x8e\xb4\xd5\xa9\x6b\x8f\xa6\x0d\x6a\xa4\x69\xa3\x1a\x69\x1a\x0f\x77\xaa\x82\xbd\x7c\xb4\xf5\xb1\x1f\x41\x4e\x6b\x4c\x88\xa8\x5b\x53\x7b\xdd\x42\x1b\xc0\xc9\xd0\xbb\xf7\x63\x29\x40\x96\x4b\x17\x0d\x63\xcd\xbb\x4b\xbd\xba\x30\x54\xb3\xdc\xd8\xd4\xc7\xad\x22\x46\xe3\xef\xb1\x37\x78\xe5\xbc\x54\x3c\xae\x34\xd9\x5c\xeb\x98\xc2\x74\x16\x9a\xc7\x18\xa5\xa0\x68\x3a\x55\x7a\x18\xef\xed\xd9\x70\xd2\x42\x9a\xe0\xf1\x6c\x80\x69\xf1\x04\xea\x17\xb6\x9d\xed\x81\xb7\x63\x1f\xaa\xe2\x8e\x83\x5e\xb9\xf3\xad\x9b\xf1\xe8\xbf\xff\xe7\xb8\x52\xbd\xa5\x98\xd0\x51\xe5\x70\x76\x06\xa0\x69\x37\x81\x09\x24\xb8\x0e\xdf\x56\x79\x2c\xd0\x62\x6c\xcb\x9e\x96\x0c\x52\xd7\xb3\x3b\x4a\x86\x40\x75\x2e\xb1\x82\x28\x70\x3a\x48\xea\x9f\x95\x56\xc1\x6c\x15\xcc\xcd\x46\xab\x60\x2e\x1d\xad\x82\x59\x63\xb4\x0a\xe6\x66\xa3\x55\x30\x97\x8f\x56\xc1\x6c\x15\xcc\x1d\x46\xab\x60\xb6\x0a\xe6\xae\xe3\x33\x56\x30\x9b\x0d\x9c\x2e\xab\x7b\x2e\x0e\x05\xe5\x47\x4d\x35\x8b\x8a\xa0\x6a\x7f\x97\xfd\x57\xb3\x6a\x66\x59\x85\x5c\xac\x64\x96\x15\xd1\x39\x45\xbb\xb7\x46\xa3\x0c\x3a\xe7\xdc\x93\x2b\x95\xcd\xe7\x16\x1b\xde\x18\x22\x96\x9c\xce\x8d\x62\xe2\xad\x0f\x5d\x2b\x5a\xbb\x87\xb8\xb6\x98\x1c\x79\x6f\x3f\xb6\x6a\xe1\x42\x57\x2f\x72\xcd\xba\xc5\x1d\xc1\xff\x8f\x61\x3b\x95\x8a\x01\x15\x27\x75\x88\x92\x0b\x11\x58\x05\xf2\x18\xea\x08\xb2\xb2\x06\x6c\x8d\x3b\x64\xdc\xc6\x52\xfa\xb6\x42\x82\xfb\xb0\x2c\x4b\x4e\x91\x00\x7a\x34\xb7\x92\x2f\xae\x07\xc5\xdf\x02\x76\xa5\x38\x22\x8a\x67\x8c\x72\x97\x6e\x2b\xb8\xef\x7b\x6f\x7b\xd9\x17\xe2\x72\xe8\xd6\x12\xde\xde\x23\x97\x88\xf4\xe5\x89\x99\x42\xf8\x50\xdb\x61\xa5\x19\x13\xc5\x7e\x95\x86\xb8\xdf\xba\x34\xc4\x4c\x4c\x4a\x5b\x19\xa2\xad\x0c\x51\xab\x32\x04\x5e\xb4\x87\xbb\xf1\x12\x11\xe4\x6f\xae\x01\x93\x04\x04\x55\x9a\x27\x9a\x65\x45\x8c\xb7\xb2\xaf\x4a\xac\x22\x31\x74\xb1\xa6\x55\x7c\x37\x6f\xa3\xd1\x78\x16\xef\x71\x3e\x8c\x09\x57\x48\x4e\x5c\x3c\x27\xb6\x4b\xc2\x9a\x06\x5e\xeb\xb0\x41\xab\xec\xe9\xc7\x22\x5e\x20\xc1\x56\x85\xd2\x6c\xbb\x79\x19\x3a\x9f\x18\x94\x30\x14\x7b\x05\x83\x28\xb7\xcc\xc0\xb8\x58\x36\x01\x5e\x70\x89\x23\x75\x7c\xec\x85\xa1\x46\xb9\xd7\xa3\x70\x9f\x3f\x95\xb8\xc4\x5f\x36\xe1\x3f\xf8\x41\x81\x03\x15\xe0\x2b\xf8\xcf\xd3\x0e\xba\xac\x1f\x3f\xd7\x84\x41\xae\xb1\xb8\xb9\x4f\x1e\x33\xf7\x39\x55\xd7\xd8\x4b\x17\xc6\xde\x69\x1d\xcf\xc3\x6d\xd1\xa6\xa4\x6e\x3e\x9e\x42\x4a\xea\x27\x72\x4d\x3c\x9d\xcc\xd4\x27\xeb\x8e\x78\x2a\x99\xa9\xad\x0b\x62\xab\xf1\x5c\x13\x46\xab\xa3\x41\x97\x43\xeb\x6e\x68\x58\xa6\x6a\x84\xf9\x3f\x8e\x9b\xa1\x11\xfc\x6b\x34\x7e\xad\x8d\x5d\x7b\xe6\xb1\x6b\xad\xa2\xd7\x2a\x7a\xd5\xd1\x2a\x7a\x73\xa3\x55\xf4\xb6\x18\xad\xa2\xb7\x7c\xb4\x8a\xde\xfc\x68\x15\xbd\x56\xd1\xdb\x60\xb4\x8a\x5e\xab\xe8\x6d\x3a\x3e\x33\x45\xaf\xb9\xa2\xf1\x6d\x0c\x59\xf3\x31\x64\xcd\x10\xc2\x06\xc8\x5f\x23\x48\xd7\x50\xcc\x58\x1b\x2f\xb6\xdf\xf1\x62\x35\x4b\xe7\x71\xcd\x1e\xa7\x7c\x5e\x79\xb7\x97\xd5\xd0\xa3\x13\xc1\x62\x92\xe5\xda\x55\x10\x6b\xeb\xe8\xed\x73\x1d\xbd\xca\x8e\xb6\xc5\xf4\x36\x2a\xa6\xb7\x0c\x66\x6d\x45\xbd\x25\x63\x7f\xa2\xd8\xda\x8a\x7a\xdb\x8e\xb6\xa2\xde\xe2\xd1\x56\xd4\x5b\x31\xda\x8a\x7a\x6d\x45\xbd\xb6\xe0\x41\x8d\xd1\x16\x3c\x58\x30\xda\x82\x07\xbb\x8f\xb6\xe0\xc1\x46\xa3\x2d\x78\xd0\x16\x3c\xa8\x8e\xd6\x09\x55\x6f\xb4\x05\x0f\x6a\x8e\xd6\x31\xd5\x16\x3c\xa8\x35\x61\x5b\x51\xaf\x8d\x4a\xdc\x7e\xb4\x0a\x66\xab\x60\x6e\x36\x5a\x05\x73\xe9\x68\x15\xcc\x1a\xa3\x55\x30\x37\x1b\xad\x82\xb9\x7c\xb4\x0a\x66\xab\x60\xee\x30\x5a\x05\xb3\x55\x30\x77\x1d\x9f\xb1\x82\xd9\x56\xd4\xdb\xf7\x68\x48\xb2\x8f\x29\x4f\x6d\x45\xbd\x36\x42\x72\xa7\xed\x6e\x2b\xea\xad\x1f\x9f\x7d\x45\xbd\x4a\xb4\xde\xa7\x2b\xab\xb7\xfd\x32\xda\xda\x7a\x6d\x6d\xbd\xb6\xb6\x5e\x5b\x5b\xaf\xad\xad\xd7\xd6\xd6\xdb\x7c\xec\xbf\x33\x63\xef\xf4\x8f\xe7\xe1\xc0\x68\x4b\x2e\x6c\x3e\xda\x92\x0b\x4b\x47\x5b\x72\xa1\x2d\xb9\xd0\x3a\x23\x76\x19\x6d\xc9\x85\x2d\x47\xeb\x78\x68\x4b\x2e\x6c\x35\xda\xda\x7a\x6d\x14\xdb\xe6\xa3\x55\xf4\x5a\x45\xaf\x3a\x5a\x45\x6f\x6e\xb4\x8a\xde\x16\xa3\x55\xf4\x96\x8f\x56\xd1\x9b\x1f\xad\xa2\xd7\x2a\x7a\x1b\x8c\x56\xd1\x6b\x15\xbd\x4d\xc7\x67\xa6\xe8\xb5\xb5\xf5\xf6\x39\x9a\xac\xad\xad\xb7\x60\xb4\x91\x63\xfb\x1d\x39\xb6\x23\xae\xd0\x5c\x8b\x54\xe4\x5c\xdf\x80\x9c\xb0\x08\xce\xa2\xc8\xfc\x75\x2b\xee\x60\xcb\x68\xa5\xaa\x16\xba\x62\x5a\xc2\x78\xcc\x22\xd4\x23\xef\xc7\x80\xa5\xf1\x8c\x78\x8b\xf7\x11\x6a\x6f\x24\x1a\xef\x2c\xd0\x0b\xd7\x69\x68\x1a\x86\xf0\xe0\xd4\xdb\xc2\xcb\x42\x68\x20\x44\x02\x94\x6f\xf1\xa4\x63\x86\x20\xb7\x3c\xcd\x15\x80\xbc\x72\x94\xb8\x98\x8c\x0c\x20\x11\x7c\xe4\x22\x86\xdc\x09\xe8\x91\xf3\xe2\x86\x88\x72\x3c\x3c\xb9\x94\xc0\x75\x32\x45\x38\x60\x91\x2e\x54\x1a\x52\x31\x81\x18\x29\x36\x06\x2a\x59\x31\x92\x6a\x92\x00\x35\xef\xe2\x50\xbc\xcc\x1c\x1e\x4a\xfa\x38\xbf\x9d\x74\x00\x2e\x78\x6a\x27\x20\x6e\x4f\x1b\x77\xa2\x86\x33\x86\x0d\x27\x35\x21\x5b\x8a\x50\x3d\x2a\x7d\x21\x1e\xcd\xa9\xc8\xc9\x3d\xb5\x82\x92\xcc\x39\x1e\x66\xfc\x74\x03\xda\x2d\x5f\x5e\x43\x24\xd9\xdd\xfa\xd0\x45\xaa\xb6\xe5\x63\x75\xac\x01\x54\x8e\x76\x62\x52\x95\xad\x39\x3c\x93\xa3\xdc\x4a\x84\x0e\x95\x81\x6b\x39\xc5\x88\x3e\x2b\x52\xc4\x22\xba\x33\x68\x98\xd2\x11\x1c\x1e\x2a\x72\xfe\xfa\xc2\xd0\xbe\x5c\x19\x52\xed\xca\x04\x3a\x5a\x98\x49\x31\x61\xb1\xc1\xec\x9f\xa9\x64\x74\x90\x18\x99\x73\x08\x12\xb8\x11\x09\xbe\x38\xfa\xf9\xec\xed\x2f\xd7\x67\xaf\x2f\x8f\x51\xfa\x84\x87\x8c\x72\x73\x24\x72\x55\xc4\xa1\x3a\x9c\x30\x2f\x02\x3e\x61\x52\x70\xb3\x38\xd4\xd3\x28\x99\xf8\x59\xa3\x70\x12\x24\x28\x91\x4c\x20\xb6\x32\x72\x78\x9b\x67\x39\x8c\x67\xb9\xf6\x7a\x23\x46\x47\x9a\xd3\xc3\xa3\x31\xe5\x23\xb3\xce\x0b\x91\x9b\xf9\xbe\xf8\x02\x57\x24\x21\xce\x23\x2b\x35\x51\x8f\xb2\x5f\x74\x3c\x9b\x30\x84\x5e\xd9\x9a\x8e\x2a\xa2\x99\x5f\x73\xf9\xb3\xd4\x94\x6b\xfa\x70\x6a\xc3\x03\x0f\xbe\x28\x5d\x3a\xf0\xf5\x30\x85\x79\x85\x65\x36\x76\x55\x09\x96\x62\x4c\xc8\x41\xf9\xee\x1e\xb9\x34\xef\x80\xb8\x0c\x40\x1b\xdd\x09\x13\x90\xa8\x75\x3a\xf0\x75\x88\x84\x11\x95\x71\x02\x0a\xe3\x1a\x3d\x61\xb6\x9a\x81\x03\x18\x04\x9d\x96\x0b\xbd\x88\x92\x90\xd7\x02\x63\x1c\x87\xe2\x94\x8c\xb5\xce\xd4\xe9\xc9\xc9\x5d\x3e\x00\xc9\x41\x83\xea\x31\x71\x12\x8b\x48\x9d\x68\xaa\xee\xd4\x09\xe3\xe6\x64\x75\x63\xaa\x69\xb7\x74\xa4\x4f\x2c\xdb\xee\x46\x22\x4d\x29\x8f\xbb\xd4\xa1\x56\x37\x6c\xeb\xc9\x6f\x1d\x43\xed\xd2\x70\x17\xe3\x5d\xda\x55\x63\x48\x92\xc3\x1d\x90\xb9\x9e\xc0\x57\x43\xd0\xab\x25\xe0\xb9\x6f\xaf\x7f\x7a\x2f\xc3\x61\xb5\x30\xe8\x91\x6b\xa1\x5d\xf8\xad\x8b\xf4\x46\x22\x8a\xf0\x5d\x7c\x9e\x2f\xaf\x6f\xdf\xfe\xbd\xff\xe6\xea\xfa\xb6\x3d\xd6\xed\xb1\x6e\x8f\x75\x8d\x63\x0d\x7c\x52\xfb\x48\x7b\x69\xb3\x74\x4c\xc2\x7e\x23\x8f\x56\xa0\xfd\x31\x08\x1b\x50\x5b\x36\xb4\xe3\x93\x41\xbd\x02\x81\x4b\x3e\xf9\x99\x56\x4d\xeb\x7c\x21\x38\x88\xbb\xc1\x8a\xc8\x41\xfa\xae\x13\x7b\x5f\xc3\x8c\x55\xd7\x6f\xb5\x93\xfc\x68\x47\x7d\x9f\x92\x79\xf5\xee\x26\x86\xca\xf6\x5d\xd3\xb4\xa8\xaf\xbd\x60\xd7\x7a\xe4\xb5\x57\x78\xc8\xf9\x2f\x57\x17\x97\xd7\xb7\x57\xdf\x5d\x5d\xbe\xdd\x5d\x83\x6e\xc0\xd6\x82\xd6\x84\x86\x00\x70\xb8\x23\x97\xcc\x24\x4c\x98\xc8\x55\x32\x0d\xf6\x8f\xc5\x44\x60\xf6\xf4\x3b\x87\xef\x34\x68\xe2\x0b\x1f\x6b\x99\x6d\xb3\xcc\xf6\x02\x86\x34\x4f\xac\xde\x74\x70\xd0\xdb\x85\xcb\xd9\xd1\x14\xfa\x7e\x27\x45\x8d\xfa\xd1\x15\x14\xbe\xb1\x95\xe7\x87\x42\x2e\x3d\xc6\x87\x2e\xec\xa0\xc2\x7a\x9c\xf0\x68\x6d\x73\x4e\x7a\xb4\xde\xb1\x9a\xd0\xa9\xe9\x5e\x68\xc6\xe9\x1e\x09\x3e\x64\xa3\xd7\x34\xfb\x11\xa6\x6f\x61\x58\xcf\x40\x5c\x85\x37\xda\x1d\x9d\x0f\x19\xad\x94\x86\x9d\xd9\x97\xd5\xf3\xcf\x34\xe6\x9d\x69\x2a\x2c\xa3\x7e\x48\x46\x73\x11\x14\x8d\x44\x4f\xcc\x55\xf3\xb7\x16\x68\x67\x4b\x6e\x2a\xb8\xa6\x11\x97\x7d\x3d\x2e\xef\x47\x95\xd9\x95\xd9\xbd\xa3\xb3\x7a\x53\xb5\x23\x12\x3c\x82\x4c\xab\x13\x31\x31\x9c\x0b\xee\x4f\xee\x85\xbc\x33\x7a\x84\x51\x5c\xbb\x16\x6b\xd5\x09\x7a\x0b\x4e\x7e\x6b\xfd\x5f\xb7\x6f\x2e\xde\x9c\x92\xb3\x38\x76\xad\x59\x72\x05\xc3\x3c\x71\xcd\x10\x7a\x84\x66\xec\x67\x90\x8a\x09\xde\x21\x77\x8c\xc7\x1d\x92\xb3\xf8\xdb\xdd\x89\xb3\x1f\x0d\xee\x82\xc8\xac\x8f\xb3\xe1\x9d\xb8\x41\xef\xca\xb4\xc2\xbb\x02\x11\x31\x5c\x8b\x69\x85\xb8\xe9\xed\xcd\x4e\xc8\x68\x08\x34\xdb\x1b\xe7\x67\x07\x6e\x61\xb3\x74\xf5\xb0\x20\xac\xd6\xb7\xe9\x10\x35\x13\xf1\x29\x51\x79\x96\x09\xa9\x15\x49\x41\x53\xa3\xf4\xf6\x0c\x86\x75\xaa\x7f\xa2\x97\xaa\x43\xfe\x11\x7e\x44\x57\x93\x7a\x77\x78\xf8\xa7\x1f\x2f\xff\xfe\x97\xc3\xc3\x0f\xff\x28\x5f\x45\x56\x68\xc3\x7f\xaa\xb7\xa8\x0c\xa2\x1e\x17\x31\x5c\xe3\x3b\xf0\x4f\x55\x71\xb0\xb8\x0b\x9a\xea\x5c\xf5\xc6\x42\xe9\xab\x7e\xf8\x33\x13\xf1\xec\x5f\xaa\x86\xc4\x41\xf6\x93\x31\xe0\x16\xf5\xa9\x1e\xef\x09\x7b\x28\x68\x49\xc3\x47\xd5\xcd\x5a\x6e\x01\x94\x52\xfc\xe7\x77\x1e\x04\x46\x7a\xba\x97\x4c\x6b\x74\xba\xb9\x34\x73\x31\xec\x98\x53\x5b\x88\x9d\x93\x97\x07\x7b\xc5\x60\xc2\x0e\x36\x0c\x30\x84\x88\x83\x96\x3d\xc8\x81\xc1\xce\x3b\x97\xcf\xfa\x57\x64\x62\x21\xbc\x37\xc0\xf1\xa9\xc3\xdf\x3d\x2a\x8d\x0b\x2d\xa3\x1c\xa8\x82\x86\x78\x6a\xa3\x81\x42\x02\x33\x49\x58\xca\x5c\x90\xa1\x6b\x2f\xa5\xc8\x91\xfd\xb1\x17\x65\x79\xc7\xdd\xd0\x4b\x21\x15\x72\x1a\xfe\x84\x6c\x0c\xa9\xd1\xb4\xba\x4a\x0b\x49\x47\xd0\x09\x8f\xdb\xc7\xc2\x5f\xf6\xc1\xca\x0b\xe6\x9f\xb6\xaa\x70\xe1\x24\x75\x14\x19\xe2\xe7\x47\xdb\x3c\xe8\xf7\x84\xb4\x05\xcc\xb8\x7e\x04\x91\x30\x58\xe2\xac\xc0\x19\xa0\x88\xfa\xe4\x44\x24\x79\x0a\xaa\x13\xc4\x20\x6b\x0d\xe0\x13\xa3\x59\xaa\xbd\x12\xd4\x62\x36\x61\xaa\x89\xf8\xe1\x05\x72\x1a\x73\xa1\xf8\x22\xd7\x59\xae\x5d\x2d\x9b\x52\x5b\x3a\xa1\xd0\x6e\x11\x0a\x0e\x54\xc8\xfe\xcb\xba\x05\xb7\x08\xc9\xa8\xd6\x20\xf9\x29\xf9\xaf\xa3\xf7\x5f\xfe\xda\x3d\xfe\xf6\xe8\xe8\xdd\x8b\xee\x1f\x3f\x7c\x79\xf4\xbe\x87\xff\xf8\xdd\xf1\xb7\xc7\xbf\xfa\x3f\xbe\x3c\x3e\x3e\x3a\x7a\xf7\xe3\xeb\xef\x6f\xfb\x97\x1f\xd8\xf1\xaf\xef\x78\x9e\xde\xd9\xbf\x7e\x3d\x7a\x07\x97\x1f\x36\x9c\xe4\xf8\xf8\xdb\x2f\x6a\x2f\x9d\xf2\xe9\x9b\x9a\x04\xd4\x8e\x6e\x63\xa5\x88\x66\x67\x6c\x28\xc0\xfa\xa1\x5b\x28\x4d\x5d\xc6\x75\x57\xc8\xae\x9d\xfa\x94\x68\x99\xd7\x23\x26\x05\x53\x6a\xfa\xfc\xfb\xde\x63\xa7\x05\x43\x0a\xec\x7a\x6f\x0e\xb8\x82\x48\x82\xfe\x18\x96\x1c\xfb\x26\x2f\xa7\xcc\x04\x3b\x3e\x37\x3e\xf7\x39\x18\x77\x42\xb0\x20\xee\x6b\x21\x89\x0e\xa5\x48\x7b\xa4\xe4\xde\x98\x60\xa6\x87\xbb\xef\x0e\x6a\x58\x41\xfd\x68\x8d\x41\xad\x31\x68\xc9\x58\x6b\x0c\xba\xb1\x78\xb8\xb7\x96\x20\xe0\x93\x5d\x5d\x18\x0b\x3d\xe8\x5e\xd7\xd1\x82\x64\x22\xcb\x13\xaa\x97\x78\xc6\x16\xb8\xd3\xdd\x51\x2f\x22\x91\x8b\x48\x1a\xcb\xd0\xd2\xc5\x3e\x4c\x72\x96\x24\x84\x71\x7b\xf0\x71\x02\xef\x30\x93\x60\x55\x1b\x42\xad\x3f\x7b\x62\x96\x70\xef\x4a\xd6\x95\xc3\x3d\x15\x51\x9a\x4a\x8d\x51\xc7\x58\xd2\xce\xb2\x12\xe7\x7d\x62\xbc\x28\x6c\x17\x84\xc3\x90\x04\xb2\xb0\xaf\x67\x42\x95\xf6\xcb\xc6\xd5\x68\x7a\x87\xde\xc6\x08\x62\xe0\x11\x60\x46\x5a\x0e\xc5\xb7\x0e\x8c\xde\x46\x2e\xf9\xc4\xce\x41\x49\x9c\xdb\x60\x10\x4b\xfe\x16\xcf\xf1\xbc\x02\x10\x0c\x22\xde\xf8\xf6\xcb\x21\x0e\x01\xa9\x7e\xd0\xb0\x43\x62\x5f\xb0\xb2\xaa\x4f\x13\x79\x50\x9f\x67\x06\xcf\x56\x2d\x61\x68\x8e\x59\x16\xe6\xe7\x2a\x93\x7c\x0e\xce\xc0\xfa\xec\xf3\xb3\x63\x9d\x0d\xb1\xcd\x66\x58\xe6\x16\xbe\x93\x26\xd9\x64\x13\xce\x92\x4c\xc2\x90\x3d\x34\x74\x4e\xcf\x78\x61\x89\x61\x31\x70\xcd\x86\xcc\x76\xec\xcf\x24\x64\xc0\xe3\x50\x14\x15\xb3\xc2\x79\x15\x36\x7b\x19\xcc\x63\x05\xee\x66\x49\xd9\xcd\x22\x61\xbf\xa5\x63\xa4\xa5\x63\x3b\x8f\x8f\x44\xc7\x1c\xe6\xee\x0f\x11\xc3\xc8\xf3\xfa\xa1\xef\x17\xa5\x38\x76\xc4\xe2\xad\xb1\xac\x48\xe8\x3a\xc1\x59\xd4\x4c\xf5\xa0\x40\x17\xb5\xb0\x91\x6b\x64\xcc\x46\x06\xac\xb6\xa2\x90\x15\x9a\x48\x4a\x39\x1d\xd9\xac\x6e\x2d\xbc\x9d\xd6\x68\x59\x06\x89\x25\x8b\x2b\xc2\xbd\x7d\x0d\xe3\xc4\x20\x76\x22\x68\x8c\x17\xa5\x48\x12\x90\x8a\x24\xec\x0e\xc8\x05\x64\x89\x98\xba\x24\x6d\x1e\x93\x1b\x4d\xb5\x41\xe9\x1b\xd0\xbb\xf9\x7c\x6b\xa1\x2b\xae\xb8\x9f\x27\x49\x5f\x24\x2c\xda\xc9\xa2\x52\xdd\xb6\x2b\xdc\xaf\x2c\x4f\x12\x92\xe1\x94\x3d\xf2\x86\x23\xc5\x38\x4b\xee\xe9\x54\x75\xc8\x35\x4c\x40\x76\xc8\xd5\xf0\x5a\xe8\xbe\x15\xbd\xab\xd1\x76\xf6\x46\xc2\x86\xe4\x14\x6b\xda\x68\xa2\xe9\x08\x15\x27\xef\x03\xec\x18\xf8\x97\x27\xb0\xc4\xe1\x9e\xa9\x85\x9a\x4a\x6d\xc4\xf9\x2d\xce\x64\x08\x95\xfd\xfb\xa3\x6f\x53\xc2\x86\x10\x4d\xa3\xa4\xfe\xb9\x3a\x8b\x30\x7a\xa1\xc8\x33\x2f\xe1\xb7\x2b\xd3\xee\x52\x3b\x51\x05\x64\x9c\xd8\xfa\xe9\xb6\x30\x7c\x81\xea\x61\x45\x56\xd5\x55\x8d\x6a\x88\x3b\x73\xce\xba\x3c\x33\x13\x4a\xdf\x18\xf5\xbc\x91\x2a\xeb\x87\x7d\x3f\x1d\xc1\x5a\xd2\x49\x02\x31\x61\x69\x0a\xb1\x51\xe1\x93\x29\xa1\x43\x8d\x29\xb6\x15\xf3\x40\x24\xc1\x62\xad\xab\x5d\x32\xa6\x3c\x4e\x40\x92\x21\x65\x89\x33\x06\x54\xee\xd7\x20\x53\xc6\xd1\x26\x60\xdd\xb1\x68\x5f\x30\x7f\x45\x91\x90\xbe\xee\x3d\xd3\xca\x5f\x2a\x0e\x26\x32\x91\x12\x02\xcc\xfa\x95\xc9\x20\x11\xd1\x9d\x22\x39\xd7\x2c\xb1\x8b\x11\xe2\x8e\x44\x22\xcd\x12\x3c\x3a\x35\x4e\x56\xf8\x67\x37\xa0\x52\xd7\xcc\xae\x4e\x7e\x5b\x5c\xc2\x1f\x76\xe5\xe6\x0d\x48\x61\x4d\xc8\x60\xf0\x00\x51\x63\xe9\xfd\x97\x0f\x10\x95\xca\x49\x60\xa3\x07\x3c\xd1\x98\xde\x49\xef\xe0\x19\xd5\xaf\xab\x91\x45\x57\x1e\x15\xf8\x9d\xdb\x39\x7d\xf9\x2b\xf7\x0a\x92\x30\x8e\xf4\xcd\x65\xd6\x11\xc6\x95\xe1\xec\x95\xc3\x60\x8f\x9e\x93\x58\x49\xcc\x24\x16\x3f\x98\x86\x28\x6a\x3f\x17\xd6\x15\x10\x42\x93\xa3\xc3\x93\xc3\xe3\x39\xe3\xe3\xa1\x91\x40\x12\xb0\xb4\xd6\x5a\x22\xa3\x62\x51\x8a\xa5\x59\x32\xc5\x75\x1c\xc6\x1d\xc2\xb4\x0f\xb3\x96\x39\xf7\xab\x72\xe9\x7e\x1d\xa2\x04\xd1\x92\xfa\x9a\x2a\xf6\x57\x73\x93\x96\xb9\xa3\xf2\x47\x87\xbf\x1e\x76\x08\xe8\xe8\x98\xdc\x0b\x7e\xa8\x71\xf9\x3d\x72\x2b\x8c\x1c\x5d\x4c\x34\x15\x39\xe1\x60\xa3\xfa\xe1\x21\x4b\x58\xc4\x74\x32\x45\x8a\x45\x44\xae\x6d\xea\x30\xd5\x3e\xcd\xf0\xf2\x81\x69\x17\xac\x66\x48\xc6\x0b\x84\xa6\xa5\x5a\x84\x1a\x31\x67\x02\x27\x63\xa0\x89\x1e\xdb\x08\x11\x2e\x78\xf7\xdf\x20\x05\x26\x20\x72\x77\xe5\xd9\xd5\xfa\x6b\x44\x6d\x30\x44\xf4\x7b\x68\xae\x3b\xd0\x0f\xb7\xb7\xfd\xef\x41\xcf\x90\x0c\xf3\x16\x1f\xb7\x83\xa6\x00\x90\x43\x21\xd3\x3d\xa0\x1d\xcd\x78\x2a\xbb\x24\x13\x72\x1f\x48\xd8\x58\xa8\x5a\x7b\x49\xe6\xf6\x53\x28\x8d\xda\x90\x93\xc6\x38\x44\x66\x07\xab\x01\x24\xbe\x81\xce\x55\xbf\x47\xfe\x2e\x72\xf3\x35\x03\x3a\x48\xa6\xa1\x00\x83\x02\x4d\x0e\xcc\x54\x07\x86\x3c\x19\x6c\xf8\x01\x68\x6c\x54\x14\x43\x3d\x80\xee\x47\xa3\x2c\xe2\xce\x83\x5b\x5b\xb3\x7c\x20\x57\x5a\xa4\x64\xec\x3e\xbb\x9a\x77\xe9\x4e\x46\x0f\x4f\x8f\x4f\x6a\x92\x90\x59\x0a\xe7\x9e\x79\x76\xf4\x6b\x8e\x6e\x58\xb8\xbb\xdf\x07\x58\xbc\x2a\x2a\x83\xcd\x75\x8a\xb2\x59\x41\xdc\x02\xcb\xa0\x1a\xec\xe6\x27\x29\x8f\x3d\xae\x38\xba\x73\x16\xe7\xec\x44\xe8\xd1\xab\x1f\xe8\xd5\x68\xbd\xd1\x66\x82\x06\xc8\x22\x0b\xab\xc3\x19\x6b\x7d\x69\x08\x88\x8f\x53\xf0\xf2\x63\x00\xa0\x99\xcd\x27\x4d\x42\x20\x6b\x20\xae\x7b\x3e\xaa\x5b\x0b\xa3\x87\x62\xde\xa5\x25\xae\x48\x26\x14\xc8\xc9\xae\x99\xdc\xc5\x68\xee\xd3\xc5\xee\x1a\xbf\x1f\x0b\x92\xa4\x25\xe1\x79\x3a\x00\x59\xa4\xa5\x48\x3d\x0f\x90\x52\x58\xc2\xb5\xbd\xdd\xdb\x72\xab\x7d\x19\xcd\x93\xdf\xfc\xe7\x7f\x7e\xfd\x9f\x3d\x3b\x7d\x08\x51\xe0\xe4\xea\xec\xfa\xec\x97\x9b\x9f\xcf\x31\x33\xb6\x2e\x54\x1b\x8a\xbf\x6c\x3a\xfa\xb2\xd1\xd8\xcb\x47\x8d\xbc\xc4\x7c\x8f\xda\x54\xa4\x6a\xf8\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x2b\xd5\x28\x33\xb2\x66\xd5\x90\x6a\x8e\xda\x5e\x9c\x31\x1d\x65\x37\x22\xba\x6b\x50\xaf\xb9\x80\x4c\x42\x64\xed\x64\xb7\xe7\x7d\x3b\xbb\xd1\x2f\xaf\xdf\xdc\x16\x79\x06\x18\x8c\x43\x5e\x79\xfb\xd2\x0f\xce\x92\x66\x74\xd2\x3b\xc8\x74\x50\xdd\x07\x34\xba\xbb\xa7\x32\x46\xcb\x16\xd5\x6c\xc0\x12\x66\x4b\xfe\xfa\x6e\x93\x5c\xd8\x68\x3f\x5b\xdb\x4c\x0c\x67\x0b\x6a\x16\xe6\x50\x34\x59\xd9\x20\x9a\x21\x65\x09\x5a\x50\x73\xae\x59\x0a\x2e\x1c\x28\xca\x82\x49\xaf\x6c\xd3\x6e\x95\x2f\x3f\xf6\x56\xf9\x3a\x7c\xe3\x5d\x7a\x5b\xeb\x61\x75\x83\x12\xf7\x98\xd5\x39\x16\x67\xb3\x41\x5a\x56\xf7\x59\xb0\xba\x4c\xc2\x8d\x16\x59\x43\x5e\x12\x3b\xd9\x12\x1f\xc9\x00\x86\xc2\x10\xe1\xa5\x4e\x0f\xdf\x7c\x98\x63\x66\xa0\xb7\x6a\x89\x8a\x63\xc3\x86\x63\xaa\x3c\x1a\x7b\x03\x25\x07\xa5\x4e\xd0\x1d\x92\x67\x56\x6b\x45\x72\x9d\x4b\xe8\x98\xaf\x83\x14\x57\xd7\x29\x52\x1c\xcc\xeb\x81\xdb\x1f\x41\x47\xd6\x72\x5b\x22\xe4\x58\x0f\xd4\x2d\x7f\xd6\x8d\x12\x49\xaa\xc6\x80\xb5\x45\xe0\x81\xf9\x1e\x28\x7d\x11\x1f\x1e\x16\x9f\x62\x18\xcb\x48\xd2\x08\x48\x06\x92\x09\xc3\x8c\x72\xae\x63\x71\xcf\xc9\x00\x46\x8c\x2b\x0f\x0a\x33\xb7\x87\x19\xfa\x63\x98\x0a\x25\xe1\x7a\xe4\x6d\xa5\xd2\x89\xcb\x41\x8a\x44\x71\x34\xdd\x9a\x67\x3d\x49\xc8\xb1\x4a\xbd\x98\x03\x84\x7d\x6c\xac\xde\x60\xc9\x47\x39\xc7\x37\xc7\x90\xd0\xa9\x0d\x35\x1d\x32\x4e\x13\xf6\x6f\x90\xea\xb8\x01\x8f\x93\x01\x61\x71\x6d\xe9\x3a\xb0\x40\x3f\x8d\xc6\xf5\x9c\xbf\xad\x8b\x6a\xc3\xd1\xba\xa8\xea\x4c\xd2\xba\xa8\x5a\x17\xd5\x9a\xd1\xba\xa8\x5a\x17\xd5\xcc\xd8\x5b\x2d\xa9\x75\x51\xed\x3c\x5a\x17\xd5\xea\xd1\xba\xa8\x36\x18\xad\x8b\x6a\xc3\xd1\xba\xa8\x5a\x17\x55\xeb\xa2\x6a\x5d\x54\x9f\x91\xdd\xce\x8f\xd6\x45\x35\x37\x49\xeb\xa2\x6a\x5d\x54\x1b\x8f\xbd\x55\xbe\x5a\x17\x95\x1d\xad\x8b\xaa\x3a\x3e\x2f\x56\xe7\x1d\x3c\x7d\xa3\xea\xd5\xcf\x69\xeb\xa3\x53\x81\x45\xce\x4f\x54\xee\x15\x17\x5e\x55\x6a\x0f\x57\xaa\x09\xe2\x53\x71\x9c\x47\xa8\xf0\x33\x2d\xcc\x97\xda\xd6\x55\xe1\x93\x0c\xd5\x49\x26\xec\xff\x15\x8e\x8a\x92\x87\xc2\x2a\xbc\xbb\xe7\xac\x7d\xb2\x6c\xac\x3a\x6e\x89\x8f\xe3\x92\xd8\x13\xff\x4d\x03\x6e\x88\xd6\x05\xf1\xec\x5c\x10\xcf\xa7\x59\xae\xf3\xcc\xdf\x8e\x25\xa8\xb1\x48\x76\x46\xf4\x0a\x92\xbf\x66\x9c\xa5\x79\x6a\x70\x4e\x19\x7c\x66\x93\x10\x02\xa0\x02\xba\x5a\x8a\x6d\xad\x88\xe6\x46\x16\x03\x56\x3a\xa5\x2c\x31\xdb\x88\xf9\x9b\x63\x3a\x31\xb8\xae\xf2\x28\x02\xc0\x3e\x6a\x65\x0d\xe7\xeb\x5e\x78\x53\xe8\x9b\xf1\xb2\x1e\xbd\xa9\xc7\xc4\x6d\x2d\x52\x9c\xe5\xeb\xaf\x76\x9a\x63\x24\xb3\x66\xe8\xf2\xf7\x6f\xfb\xe7\xe5\xe6\xd8\xdc\x93\x65\xc6\x27\x22\x99\xd8\xbe\xfa\x78\x93\x11\xd6\x5c\x0b\x7e\x66\x6f\x4c\xb2\x31\x2d\x69\x37\x4e\x31\x50\x04\x38\x1d\x24\xe6\x49\xf3\x5c\xe0\xc9\x7d\xcb\x79\x81\xea\x5c\x02\x19\x51\xfd\x29\x49\x7e\x7d\x25\xa6\x96\x02\xd3\x04\xc7\xa9\x2b\xa3\x57\xad\x70\x46\x12\xaf\xda\xa1\x46\x88\x19\xb6\x80\xfe\xc6\x92\x78\x6d\x5a\x59\x5f\x3a\xae\x7f\xb8\x08\x56\xb8\xc1\x0f\x6f\x0c\xc0\x07\xae\xd7\xb3\x67\xe8\x65\x35\xc8\x37\x95\xd2\x82\x64\x09\x2d\xda\x42\xe1\x0e\xfc\x80\x5c\xe8\x7c\x0c\xd1\xdd\x5b\xe7\x8b\x3d\x52\x00\x41\x3a\x1d\x31\x3d\xce\x07\xbd\x48\xa4\x27\x86\x28\xd8\xff\x1b\x24\x62\x70\x92\x52\xa5\x41\x1a\x81\xd5\x31\xb9\x6e\x64\x66\x61\x7c\xd4\x4b\xe3\xe3\x1e\x79\xcf\x6d\x7e\x7b\xd1\x86\xb2\x54\xdd\xc1\xbc\xdf\x57\xda\x18\x80\xa1\xaf\x42\x96\xfb\x86\x0f\xa6\xb8\xbc\x5e\xfd\x56\xf2\x35\x98\x52\x4d\x3f\xf8\xc7\xf7\x81\xb7\x94\x8b\x34\x60\x72\x79\x6a\xbe\xee\xc6\x62\x3e\x1a\xf0\x71\xef\x91\x7f\x7b\x6f\x84\xe3\x7d\xf1\x69\xef\x61\xb1\xe9\x06\x5c\xb0\x4d\xf8\xb0\x9b\xf3\x5f\x3f\x42\x4d\xe6\xc7\xf1\x5b\x37\x68\xdc\x6b\xc8\x5f\xfd\x31\x7c\xd5\x8d\x7c\x75\x5d\x1f\xf5\xc7\xf3\x4f\x37\xf3\xb9\x4d\x2a\x02\x4f\xd5\x27\xdd\x80\x91\xbe\x49\x03\x7d\x63\xc6\xf9\x47\xf3\x41\xd7\xf7\x3f\xef\x81\xef\xb9\x36\x90\x19\x67\x9a\xd1\xe4\x02\x12\x3a\xbd\x81\x48\xf0\x78\x67\x0e\x33\x53\xa4\x33\x9c\x1f\x65\xa7\x75\x96\xaa\x6a\xaa\xc5\x98\xba\x5a\xe4\x46\xa3\xb2\xa9\x25\xde\x9b\xe1\x04\x0a\xf4\x2b\xdb\x55\xee\xa5\x7f\x82\xec\x8d\x49\xcc\xe6\x9d\x34\xb9\x89\x3f\x88\x7b\x22\x86\x1a\x38\x39\x62\xdc\xef\xe3\x71\x49\x0d\x2c\xec\x93\x01\xad\xcd\xd5\x97\x2f\xfc\xcd\xcf\xcf\xf0\x88\x26\x56\xa5\x1e\xdf\x0e\xec\x5e\xb4\xde\x10\xec\x6e\x1c\xe6\x49\xd5\x18\x6c\x0d\xc4\x55\x7a\xf3\xb2\xa8\xa6\xfc\x12\xe7\x0d\xa7\x8d\xf2\x98\xb8\x5c\xb4\xe7\xb7\x69\xb5\x23\x6b\xaa\xa2\x5f\x88\xa4\x59\x67\x37\xbe\x3d\xef\x5b\xb3\x71\x6b\x2e\xd9\x17\x73\xc9\x27\x8a\x4e\xd9\x43\x41\xf7\x89\x46\xa4\xb4\x82\xee\x16\xa3\x94\x9d\xfa\xbd\xa4\x11\xf4\x1b\x97\x11\xfc\x71\x22\x71\x2e\xa9\x23\x80\x41\xe4\xf3\x87\x87\x03\xc4\xf6\x34\x85\x8c\x5e\xcc\x95\x1d\xe6\x49\x32\x25\x79\x26\x78\x35\xff\xd9\x7a\xdb\x67\xd3\x69\xd1\x24\xbf\xe0\x2d\x85\x60\x99\x49\xe1\x78\xa6\xcc\x39\x37\x34\xb8\x68\x89\x86\x82\x24\x16\x6a\xa6\x95\xa4\x5d\xc5\x46\x66\xf9\x86\xff\x61\x3e\x6f\x11\x82\x58\x99\xd0\x3c\x3d\x14\x32\x62\x83\x64\x4a\xc6\x34\x09\xfd\x6f\x28\xb9\x63\x49\xe2\xa6\xe9\x91\x1b\xd0\xd6\xa5\x60\x79\x67\x22\xf8\x08\x17\x47\xb9\xef\xbb\x08\x91\x79\x36\x4a\x80\xf2\x3c\xb3\xef\x33\x9c\x78\x2a\x72\xe9\xdf\xd7\x0b\x8e\x89\xc0\x81\x39\x4b\x3a\xa5\xee\x6e\x2b\x37\x36\x44\xff\xe4\xca\x08\x00\x6f\x7c\x61\xea\x4e\x79\x4e\x5f\x3b\x5c\x95\x7a\xfb\x64\x52\x4c\x58\x6c\xbd\x1b\x1e\x6c\xd8\x47\xda\xf6\xef\x09\xe7\x99\x0b\xde\xe5\x30\xa2\x28\xa8\xb8\x53\x64\xf7\xcc\xce\x63\x63\x08\x78\x8c\x1d\x7d\x8c\x84\x2f\xb2\x4a\x42\xfd\x84\xd9\x5e\xc4\x25\xc8\x91\x23\x2e\x88\xc0\x88\xd4\x9c\x33\x6d\xfb\xdb\x8f\x73\x4d\x62\x71\xcf\x8f\x4b\x7e\x57\x32\x00\xbd\xda\xeb\x8a\x8e\xd6\xdb\x85\x00\xaa\xba\x5f\x17\xc9\x39\xf6\x7b\x57\x83\x97\x29\x67\xfa\x1c\x92\x9c\x2b\xa8\xc9\xde\x1b\x13\x8e\xbe\xf9\xfd\x6e\x34\x82\xa5\x20\x72\xfd\x51\xb4\xbf\xfb\x31\x8b\xc6\x65\x61\x96\xa5\xa0\x88\xc8\x67\xd4\xe2\x97\xee\xb1\xc5\x3b\xd4\xaa\x80\x8b\xc6\xae\x86\xdd\x05\xd6\xaf\xd9\x82\x08\x45\xe3\x6b\x8c\x14\xbf\xb8\xbe\xf9\xe5\xd5\xd9\x5f\x2f\x5f\xf5\xc8\x25\x8d\xc6\xe5\xaa\x18\x9c\x50\x24\x1a\x48\x28\xc6\x74\x02\x84\x92\x9c\xb3\x7f\xe5\xce\xe1\x7b\x14\x9e\x3d\x6e\xb4\x5a\xfb\x8e\xdc\x17\x9b\xf3\x37\xd6\x0d\xce\xb6\xfa\xb7\x91\x59\x42\x01\xf6\x6f\x99\x15\x9f\x2e\xcd\x25\xab\x1c\xa0\xa8\x85\xa1\xf3\x23\x36\x71\x64\xd8\x95\xbf\xa7\x71\x88\x15\x33\x78\x6e\xd0\xc2\xb0\x2a\x3a\xc0\x18\xaf\x31\x10\x0e\xda\xa0\x75\xb0\x31\x09\xae\x2a\xe5\x49\x72\x05\xaa\x43\x06\x39\x46\xa5\x65\x92\xa5\x54\xb2\x64\x5a\x9e\xcc\xf0\xaa\xeb\xe0\xf2\x9e\xce\x2e\xe9\xe2\xcd\xe5\x0d\x66\x09\x64\xd2\x16\x2e\xc1\xb0\x32\xbc\x8e\x9f\x35\x00\xf3\x84\xeb\x22\xdc\x23\x67\x7c\x6a\x2f\xda\x03\xce\x14\x49\x98\xd2\x80\x2c\xd8\xc9\x90\xde\x99\x7e\xf0\xa2\x87\xff\x3b\x30\x5f\x29\x8d\x90\x19\xa2\xe5\xa2\xb9\xf0\x55\x2b\x86\xb2\x41\x52\x82\xa6\xfb\xf6\x67\xd5\x0f\xae\x08\x12\x32\x40\x2c\xf5\x83\xa3\x61\xab\x11\xbc\xb6\x3f\x20\xe3\xa3\xa4\x8c\x55\xbb\x91\xfd\xba\xba\x65\x5d\xcd\xb2\x5b\x7c\x41\x7f\x57\x05\xb3\x91\xbe\x74\xc5\x1a\x1a\xea\xe6\x54\x70\x3f\xaf\x4e\x39\x8a\x20\xca\x0d\x7a\xaf\xfa\xfe\x04\x38\xe9\x26\x9d\xe9\xea\x9a\x15\x31\x49\x1d\xf2\x82\xfc\x89\x3c\x90\x3f\xa1\x7a\xf5\x4d\xdd\xde\x57\x75\x15\x9f\x26\x42\x8c\x8c\x56\x7f\xd5\x6f\x08\xe2\x7f\x33\xd4\xc9\xcc\x68\xa0\xaa\x05\x19\x30\x27\xce\xc3\x83\x06\x69\xe8\xa8\xdb\x89\x4f\xda\x35\xcc\x2c\xf0\x23\xa2\x99\x75\x37\x5c\x0d\xab\x61\x4d\xdb\x21\x9a\x79\xfc\x07\xa1\xf4\xb5\xa3\x42\xd5\x16\x38\xc5\x6c\x29\xd5\xd1\xb8\x4a\xc6\x8c\xa0\xa6\x74\x71\xc0\x14\x89\x05\x46\x59\xd9\x00\xe6\x31\xab\x11\x3c\xb1\x3f\x68\x5c\xcf\x9f\x5e\xd9\xcf\x55\x3b\x35\x63\x40\x41\xcd\xc7\x09\x56\xa5\xda\x58\x99\x88\x9d\x4c\x66\x96\x15\x97\x78\xc6\x0a\xa1\xcc\xd9\x6a\x82\x95\x19\x71\xc9\x9c\xa7\x88\x72\x9b\x42\x32\x04\x29\x6d\xcc\xf9\x60\xea\x83\xf5\x6a\x6f\x5e\xad\x93\x94\x49\xa1\x45\x24\x6a\x34\x36\xab\xfa\xb8\xdd\x74\x08\x04\x1b\xe7\xeb\xcd\xe4\x3f\x5d\xf4\x3b\xe4\xf6\xbc\x8f\xfd\x9e\x6e\xce\x6f\xfb\x55\x4d\xe5\xe0\xf6\xbc\x7f\xf0\x49\x41\x41\xbc\x64\x85\x86\xe9\x1d\x26\xa9\x18\x9e\x8c\xd8\xd6\x4d\x69\xd6\xbd\x83\xe9\x8e\x3c\xb5\x09\xbe\xde\x0d\x3b\xdc\xc8\x07\x59\x30\xa7\x34\xdb\x7a\x36\x09\x34\x66\x1f\x29\x8f\xcb\x87\xc1\x86\x77\x2e\x4e\xe8\x4a\xc5\x04\x62\x2b\x0e\xfb\x27\x80\xc7\x99\x60\x46\x5e\x6c\xb3\xbc\xb6\x7f\xba\xcd\xf2\xda\x78\xb4\x59\x5e\x6d\x96\xd7\xfc\xd8\x9b\x40\xd6\x36\xcb\xeb\x79\xf9\xed\xdb\x2c\xaf\xcf\xde\xf9\xdf\x66\x79\x2d\x1e\x6d\x96\x57\x9b\xe5\xb5\xd9\x68\xb3\xbc\xb6\x1f\x7b\x17\xb6\xd4\x66\x79\x6d\x35\xda\x2c\xaf\xf9\xd1\x66\x79\x2d\x19\x6d\x96\xd7\x92\xd1\x66\x79\xb5\x59\x5e\x6d\x96\x57\x1b\xfc\xba\x76\xae\xfd\x0c\x7e\x25\x6d\x96\x97\x1b\x6d\x96\xd7\xb3\x08\xf1\x23\x6d\x96\xd7\x46\xa3\xcd\xf2\x6a\xb3\xbc\x76\x19\x6d\x96\xd7\x73\x31\x97\xb4\x59\x5e\x6d\x96\xd7\xe7\x23\xe8\xb6\x59\x5e\x6d\x96\x57\x9b\xe5\xd5\x66\x79\xad\x5c\x45\x9b\xe5\xf5\x1c\x54\x40\xdf\x0b\xb8\x7e\xd6\xd2\xe1\xb9\x48\xb3\x5c\x03\x79\xeb\xa7\x0c\x52\xa4\x25\x0c\x4c\x95\x25\x82\xfa\x41\x84\x91\xe0\x43\x36\x72\x94\xfd\xc4\x36\xe0\xed\x86\xef\xe9\x96\x9a\xde\x3e\xc1\x08\xc2\x84\xa5\x6c\xb7\x54\x32\x32\xb7\x31\xaf\x70\xae\x92\x5f\xc6\x9c\xa4\x94\x3e\xe0\x11\xa1\xa9\xc8\x6d\xd3\xe2\xc8\xed\x5f\x00\xa1\xf5\x5e\xed\xdd\xce\x90\x66\x54\x9c\x22\x27\xae\xdf\x44\x58\x09\xd5\x1a\x24\x3f\x25\xff\x75\xf4\xfe\xcb\x5f\xbb\xc7\xdf\x1e\x1d\xbd\x7b\xd1\xfd\xe3\x87\x2f\x8f\xde\xf7\xf0\x1f\xbf\x3b\xfe\xf6\xf8\x57\xff\xc7\x97\xc7\xc7\x47\x47\xef\x7e\x7c\xfd\xfd\x6d\xff\xf2\x03\x3b\xfe\xf5\x1d\xcf\xd3\x3b\xfb\xd7\xaf\x47\xef\xe0\xf2\xc3\x86\x93\x1c\x1f\x7f\xfb\xc5\xce\x4b\xae\x2d\x12\x37\x27\x10\x37\x24\x0e\x3f\x8a\x30\xec\x1c\xba\x0d\x9d\x45\x17\x8c\x32\x77\x1a\x1d\xc3\x5a\x75\x1a\x3d\x35\x45\x31\x2f\xcc\xc3\x14\x11\x29\xd3\x46\x38\x34\xf2\x20\x2d\x07\xb4\x32\x5d\x51\x4a\x1d\x1d\xc0\x90\x6e\xaa\x6d\x8b\xf5\x10\x0c\x5a\x0a\x62\x11\x5e\xf2\x73\x3d\xe8\x59\x9a\x25\xd8\xda\x1c\xcf\x73\xd7\xc7\xb2\x20\x73\x6d\x69\xc3\xfa\xd1\xd2\x86\xe7\x48\x1b\x14\x44\xb9\x64\x7a\x7a\x2e\xb8\x86\x87\x9d\x2c\x2c\x55\xd2\x70\x53\x9d\xd0\xc5\x8c\xb9\x3c\x6e\x77\x8d\x88\xcc\x46\x7e\xcf\x24\xd4\x8f\x45\x9e\xc4\x98\xce\x91\x73\x54\x30\x6d\x9e\x1e\x68\xab\xfd\xa1\xde\x83\xc1\xdc\xb3\x2f\xf1\xfa\x9c\x55\x33\xff\x95\xb3\x09\x4d\x8c\xb6\x5b\x3c\xd1\x47\x0d\xa6\xfc\xd0\xa6\x67\x5e\x53\x75\x57\x1c\x78\xe8\x1a\x19\x3a\xac\xf9\xc4\x7f\x12\xfe\x04\x0f\xfa\x29\x4a\x69\x28\x20\xf5\x25\x9b\xb0\x04\x46\x70\xa9\x22\x9a\x20\x5d\x6b\x86\x57\x9c\x2d\x99\x1d\x37\x5e\x8a\x44\x91\xfb\x31\x18\x5a\x4d\xa8\x37\x01\x60\x8e\xdd\x88\x32\x4e\x52\xb3\x45\x99\x7f\x58\x59\x5b\x82\x21\xff\x19\x95\x66\x83\x83\xcd\x00\x55\xe4\x81\x10\x89\xcb\x79\x48\xa6\xc5\xfc\x2e\xfb\x87\x8b\x5f\x38\xdc\xff\x62\x66\x53\x64\x98\xd0\x51\x30\x15\x28\xd0\x73\xd6\xbe\x62\xea\xa5\x1f\x80\x09\x05\x39\x10\x9a\xdc\xd3\xa9\x2a\x0c\x27\xa5\xca\x0f\xea\x94\xbc\x3c\x46\x74\xa6\x8a\x84\x39\x62\xf2\xd5\x31\xba\xff\xce\xcf\xfa\xbf\xdc\xfc\xfd\xe6\x97\xb3\x8b\xd7\x57\xd7\xe4\x5a\x68\xb0\x4c\xad\xd4\x20\x30\x0a\x1a\x86\x59\x25\xbe\x03\xb5\x74\xa1\x7a\x68\xbb\x64\x8a\xdc\x33\x1e\x8b\x7b\xb5\xb3\x8d\xd6\xa2\x9f\x01\x1e\x50\xbe\xd3\x1c\x11\xcd\x28\xf6\x3d\xac\xc1\x61\xe6\x22\x4c\xca\x93\x22\x0f\x8f\xe3\x93\x58\x8a\xcc\x02\xc1\x1b\xb9\x0a\x56\x5b\x55\xa3\xcb\x31\xac\xb8\xbf\xc3\xea\x84\x23\x49\xb9\x2e\xac\x3d\xc5\x9e\xb9\x86\x8b\xbd\xda\xdb\xf1\xb4\x73\x9a\x68\xdc\x5c\x3e\xd3\x59\x1c\x43\x5c\x01\xff\xb3\x8b\x1c\x3c\xf7\x1f\x37\x2d\xea\x54\x90\xfe\x9b\x9b\xab\xff\x33\x83\xc7\xd3\xac\x5e\xa0\x54\x33\xb9\xb1\x52\x64\x8d\xed\xee\x5b\x97\x7b\xd9\xee\xef\x5e\xec\x6f\xe0\x96\xcd\xb8\xe7\xdf\xe6\xbc\x5a\xca\xa8\x98\x9f\xa4\x22\x86\x1e\xe9\x07\x3f\x41\xf5\x6a\xa9\xc4\x01\x95\x40\xcc\x2d\x5c\x33\x9a\x24\xd3\xb2\x88\xa6\x85\xcd\x43\xac\x54\x67\x28\x13\xf2\x21\x4d\xd4\xa7\xa6\xc6\x75\x78\xa3\x91\x23\x5e\x1b\x7d\xb8\x91\xed\x08\xb3\x91\x18\xb8\xd0\x4e\xb0\x36\xab\xc4\x8a\x17\x52\x44\xc4\x2a\xdf\xa5\x60\xac\x0a\x7f\x53\xd6\x57\xe1\x59\x23\x53\x1e\xd8\xfd\x30\xb3\x35\x54\xe7\x0a\x66\x05\x74\xdf\x8b\x38\xa8\xe3\x66\x76\x09\x34\x16\x3c\x99\x62\xe4\xa5\x8d\xa5\x48\xa9\xba\x83\xd8\xfe\xe0\x44\xb3\xe0\xa9\x30\x33\x86\x57\xdd\x9a\x75\x7b\xb7\x04\x8a\x64\x36\xc2\x03\xdd\x19\x10\x7f\xe2\x5d\xaf\x71\x08\x0d\x50\xde\xf0\x64\xfa\x56\x08\xfd\x5d\x48\xa4\x6d\x04\x03\xfe\xe6\xa4\xe5\xaa\x29\x1a\xc5\x49\x8a\xef\xed\xe2\x6e\xe0\xa1\x2a\xe7\xf0\x5e\x14\x3b\xfe\xd4\x8f\x94\xcc\xf9\x99\xfa\x5e\x8a\x7c\x67\x26\x36\x27\x6c\x7e\x7f\x75\x81\xa4\x28\x77\xae\x4a\xae\xe5\x14\x8b\x07\xcc\xd7\x7d\x0b\x8a\xc1\x4f\xce\xd9\x5a\x3e\x13\x85\x5f\x8c\xbc\xa6\x53\x42\x13\x25\x3c\x2c\x19\x5f\xa8\x85\x3a\x15\xd7\x5c\x1e\x08\x3d\x9e\xd3\x6d\xcd\x81\x9a\x7f\xae\x53\xf2\x5c\x16\x85\xe8\x18\x9f\x7b\x5c\xd3\x3b\x50\x24\x93\x10\x41\x0c\x3c\xfa\xd4\xdb\xfe\xa9\x1d\x7e\x88\x3a\xd7\x82\x9b\x83\xd9\x08\xf2\x5c\x05\x4f\xaf\x03\x69\x19\x55\xd0\x67\xec\xb4\x3f\x8a\x9e\x63\x3c\x96\xb9\x02\x69\xdd\xdc\x32\x07\xbb\x93\x3f\xe6\x03\x48\x0c\xe4\x8d\x4a\xea\xba\xc5\x5b\x73\x06\x4b\xe9\x08\x08\xd5\x01\xd3\xb4\x20\xc0\x95\xa1\x98\xd6\x00\xaa\x49\x2c\xa0\xc8\xbf\xa7\x8a\xfc\x74\x75\x41\x5e\x90\x23\xf3\xae\x63\xc4\x1f\x6c\x26\xaf\x85\x0d\x72\x9b\xd5\x51\x87\x7e\x0a\x5c\x12\x22\x2f\x11\xd2\x12\x89\x0e\xe1\x82\xa8\x3c\x1a\x97\x3b\xd8\x7b\xb5\xd9\x05\x42\xa2\x6b\x65\x3f\x71\xfd\xd3\x52\xa8\x9f\x14\xc8\xc6\x08\xd4\x4f\x3b\x10\xa8\xb2\x18\x65\x70\xae\x0a\x3d\x8b\x58\x29\x68\x1a\x53\x4d\x1d\xe1\xf2\x37\xec\xed\x96\x7e\xde\xe4\x4b\xc1\x2b\xc6\xf3\x07\x1b\x78\xd4\x9c\xa9\xe5\xe6\x12\xa7\x25\x91\x87\x3a\xee\x3a\xcd\xb2\x84\xd9\x7a\x1b\x33\x81\x70\x57\x15\x5c\xe9\x2c\x11\x13\x91\x4e\xd0\x24\x11\x86\x3e\x1a\xe1\x84\xf2\x58\xa4\x73\x2f\x33\x42\x24\x54\x2a\xa6\xf6\x48\x8b\x7d\xd5\xb1\x27\x46\xa1\x04\x26\x50\xa3\xba\xd8\x6c\x85\x58\x33\x9b\x01\x8e\xc7\x08\x9c\x9e\x24\x74\x00\x89\x85\xb1\xc5\x40\x35\x8f\x81\x9f\x3a\x1a\x55\x8a\xa4\xb9\xf4\x99\xb7\x22\x01\x1b\xde\xe5\x01\x61\xa6\x7f\x12\x70\xc0\x49\x9a\x82\x03\x6a\x83\x15\x38\xa0\x5e\xfb\x14\xe0\x90\xd7\x60\xf5\x64\x16\x0e\x46\x6e\xa8\xc2\x01\x99\xf7\xbe\xc3\x41\x41\x14\x89\x34\xeb\x4b\x61\xd4\xce\xc6\x78\x93\x9b\xb6\xf0\x19\x5a\xc3\xc6\x82\x60\x2c\xe4\x05\xd5\x9b\xa9\x2c\x05\x76\x52\x6d\x99\x84\x8f\xee\xfc\xff\x4a\x3c\x0b\x49\xcf\x2c\x23\xf3\xb3\x54\xdc\x8b\xe6\x49\x77\xe1\x29\xb3\x83\x26\x72\x23\x6a\x18\x3b\x1b\xe1\x46\x22\xa2\x09\x56\x8f\xad\x87\x72\x64\x16\xed\x66\x27\x2e\x85\xf3\xa2\x8f\x12\x7f\xf3\x01\x24\x58\x48\x14\x7f\x71\x26\x4c\x2e\x62\x28\xf9\xb2\x6d\x1c\xf2\xad\x0d\xfb\xc4\xfb\x7c\x24\xb1\x91\x2b\xbc\x5b\x39\xae\x3c\xad\x85\xab\x81\xf6\x3a\xd4\xa4\x35\x0b\x04\x1e\x33\x3e\x42\xbb\x5a\x87\x48\x48\x6c\x0c\xb2\x23\x02\x77\x56\x83\x3c\xc4\x23\xe1\x27\xf5\xe7\xc1\xbf\x1a\x65\x31\x26\xb8\x9b\x19\x2d\x45\x5e\xc2\x1a\x5a\x72\xcb\x14\x39\x78\xe5\x01\x50\xa3\x88\xe7\x3e\x72\x98\x03\xfb\x85\x61\x37\xad\xa5\xf3\x8e\xf1\xd8\x85\xeb\x56\x80\x15\xca\xad\x5b\x39\x18\x03\xc1\x59\x5c\xa6\x2d\xa7\xe4\x3d\x27\x01\x58\xa4\xbb\x33\x7a\xbc\xb5\x22\xb3\xb7\xd1\x75\x57\x1b\x5e\xc3\x4b\x66\xa7\xf9\x89\xe3\xde\x9b\xf7\x76\x8d\xe6\x3e\x7f\x9f\xff\x96\x4f\x5a\xba\xc7\x51\xbf\xa6\xb5\x98\xbf\xd9\x69\xbd\x48\x1f\x19\xb4\xd6\x8c\x8f\x54\x59\x93\xa1\x49\x52\x31\x86\x2f\x52\x65\xfc\x0e\x87\xe2\xfa\xf3\x2a\xc4\x4c\x9a\xc1\x53\x51\x43\x12\x23\x4e\x3c\x71\x25\x64\x94\x2a\x7a\x2e\x0d\x24\x34\xa3\xc9\x4d\xb6\x7b\x91\x52\x32\x57\x10\xef\xf5\xcd\x59\x75\x6a\x64\xd6\xd8\xfb\xc1\xec\x95\xb9\x4e\x68\x9c\x32\xa5\xd0\x10\x06\x83\xb1\x10\x77\xe4\x68\x41\x3d\xae\x52\x9c\x96\x62\x23\x75\xe2\x70\xbe\x6b\x56\x7f\x4c\x18\x4f\x42\x54\x14\xea\xc1\x5c\x2b\x6f\xc8\xc1\x97\x44\x61\x15\xb8\x87\xae\x72\xb5\x0b\x56\x98\x5f\xa6\xad\x55\x6d\xb0\xe0\x93\x13\xec\xf9\xed\xb9\xae\x59\x76\x65\xcd\x16\x5d\x3b\xdc\x9e\xad\xac\xb6\x10\x8e\x56\x7a\xfc\xe4\x40\x72\xc2\x45\x04\xaa\xb9\x82\x4e\x3f\x14\x73\x92\x18\x6c\x16\x0f\x60\xf4\x13\x5d\x1a\x64\x87\x76\xe9\x43\x4c\x06\x75\x8f\x1e\x96\x25\xea\xdb\x82\xb8\x18\x7d\x24\xc9\xc6\xb4\x6b\x95\x74\x43\xd1\x90\x04\x7a\x11\x62\x2c\xb8\x70\x49\x12\x86\x89\x0a\x8e\x28\x8d\x24\xca\x7a\xf3\x70\x4f\x1c\x89\x2e\x2d\xf5\xbc\xf0\x12\x97\x1d\x81\x98\x4c\x66\xeb\x47\x14\x6b\xb8\x67\x7a\xec\x7b\xbd\x54\xbc\x86\xb8\x12\x09\x0a\x1d\x30\x9c\x80\x94\x42\xba\x80\x2c\x6f\xb7\xc6\x99\x90\x92\x63\x44\x97\x41\x12\x6a\xfe\x3a\x54\x65\x47\x75\x51\x0c\x1e\xe3\x15\x0d\x36\xc1\x70\x08\x11\x0a\x5a\x65\x00\x5b\xaa\x7d\x54\x94\xbe\x75\x59\x06\x06\xc1\x5c\x31\xf9\x94\x3d\x98\xb7\x94\x9f\x2a\xbb\xc4\x5d\xc9\xd9\xc5\x97\x8f\x7b\x84\x5c\xf1\x10\xc1\xdb\x31\xbb\x58\xbe\xd3\x87\x9e\x69\xf3\x89\xe5\x4e\x04\xf8\x01\x65\xc3\x99\x91\x0e\x65\xde\x00\xc6\xd7\x31\x87\x93\xb2\x49\xbc\x51\x72\x80\xa6\x71\x37\xa9\xd9\x7a\x2f\x03\xd4\x31\x95\x9b\x5b\x1e\xcb\x5c\xfe\x34\x1c\x20\xa4\x2e\x9d\x73\xd5\x14\x1a\x2a\x0f\x7f\x53\x9a\xad\x24\xbd\x07\x87\x5b\x5f\xc4\xb6\x9a\x4a\xa8\x06\x81\x5d\x9d\xb0\xba\x0b\xfb\xb7\x97\xcf\x0a\x19\x8f\x0b\x9b\x1d\x50\x2e\xb3\xe2\x8a\x6a\xc7\xc4\x88\xda\x89\xb7\x2d\xa4\x59\x02\x98\xc5\x59\x9a\xb9\x48\x50\x2d\xd5\x93\xef\x84\x85\x14\x25\xe9\x5d\x71\x97\x0e\xf9\x27\x1e\xca\x10\x88\xea\xeb\x4e\xf4\xc3\xe3\x56\x43\x64\xca\x37\x97\xc0\x0c\x4b\x2d\xbc\xe9\x82\xc4\x6c\x38\x04\x1f\xf0\x6a\x34\x47\x2a\x69\x6a\x48\xbc\x22\x0e\x04\x03\x18\x31\x1b\x10\x19\x08\xdb\xa1\x11\xf7\x5c\xae\x5f\xc7\x12\x43\xa6\x49\xca\x46\x63\x8b\x28\x84\x62\x86\x2e\xf1\x4e\xc5\x44\xd0\x98\x20\x6e\x0b\x49\xee\xa9\x4c\x0d\xdf\xa0\xd1\x18\x3d\x94\x94\x93\x38\x97\x58\x67\x59\x03\x8d\xa7\x5d\xa5\xa9\x36\x92\x32\x48\xa7\x50\xfa\xf5\xb7\x45\xf5\x57\x8e\xb6\xa8\xfe\x86\xa3\x2d\xaa\xdf\x16\xd5\x9f\x1f\x7b\x13\x1d\xda\x16\xd5\x7f\x5e\x65\x92\xda\xa2\xfa\x9f\xde\x9f\xd0\x16\xd5\x6f\x8b\xea\xaf\x1a\x6d\x51\xfd\x35\xa3\x2d\xaa\xbf\xc3\x78\x06\x94\xab\x2d\xaa\xbf\xc3\x68\x8b\xea\x2f\x1e\x6d\x51\xfd\xf9\xd1\x16\xd5\x5f\x3a\xda\xa2\xfa\x3b\x8f\xb6\xa8\x7e\x5b\x54\xbf\xad\x35\xba\xdd\x5c\xfb\x59\x6b\x94\xb4\x45\xf5\xdd\x68\x8b\xea\x3f\x8b\x8a\x8a\xa4\x2d\xaa\xbf\xd1\x68\x8b\xea\xb7\x45\xf5\x77\x19\x6d\x51\xfd\xe7\x62\x2e\x69\x8b\xea\xb7\x45\xf5\x3f\x1f\x41\xb7\x2d\xaa\xdf\x16\xd5\x6f\x8b\xea\xb7\x45\xf5\x57\xae\xa2\x2d\xaa\xff\x1c\x54\x40\xa5\x63\xb6\x53\x0d\xd0\x4d\xca\x15\xb9\x30\xf4\x52\x75\x80\x41\x3e\x1c\x82\x44\xca\x85\x6f\x9e\x0b\x9f\x2a\x2a\x33\xce\x3a\x59\x41\x77\xb0\xf2\x91\xcb\xd8\x59\xf2\xb8\x2b\x47\x80\xb5\x3a\x8b\x58\xf1\xcb\x37\xdf\x2d\xa8\x8d\xb4\x73\x5c\xe1\xae\x51\xd2\xb8\xe6\x37\x7c\x37\xff\xf8\x12\x80\x2f\xca\x20\x73\x70\x8f\x12\xa1\x5c\x8c\x3b\x02\x2b\x1a\x53\xce\xc1\xeb\x7b\x4c\xa3\x1d\x65\x00\xc0\x89\xc8\xc0\x79\xa7\x29\x51\x8c\x8f\x12\x20\x54\x6b\x1a\x8d\x7b\xe6\x4d\xdc\x03\xbb\x88\x47\x77\xbf\x28\x2d\x81\xa6\x3e\x32\x3f\xa5\xcc\x4e\x45\x68\x24\x85\x52\x24\xcd\x13\xcd\xb2\x30\x19\x51\x80\x29\x35\x96\x51\x05\x60\x60\x5c\x5c\x11\xc4\xde\x29\xde\xe6\x96\x25\xca\xc5\xe9\x50\xdb\xec\x60\x45\xf0\x34\xd3\xd3\x10\xc9\x0b\x64\xc8\xa4\xd2\x24\x4a\x18\x72\x6b\x7c\xa3\xcd\x9e\xc6\xf9\x3a\x9e\x57\x73\xb7\x52\xe5\x96\xca\x63\x14\x5b\x33\xad\x6c\x5c\x6c\x31\xa1\x9b\x2a\x66\xca\x89\xf9\xaa\x43\xa8\xaf\x9c\x66\x01\xed\x57\x8a\xa0\xf6\x9c\xc5\xce\xee\x7e\x2a\x4d\x57\xaa\x18\x5b\x04\x0e\x17\x88\x8e\x49\x0e\x1e\x39\x3b\x95\x7c\x8e\x42\xa0\xc0\x38\xbd\xb9\x63\x80\x1b\xc0\x61\x62\x70\x00\x22\x30\xfc\x95\x2e\xc1\xfa\x8f\x8e\xf4\x25\xa6\xf8\x1a\x94\xa2\x23\xe8\xef\xe8\x68\x58\xa6\x91\xa1\xaf\xa1\xd8\x18\x44\x85\xc4\xe6\xd7\x86\x5f\x8a\xf8\xcc\xaa\x18\x44\x52\xbb\xa6\x20\xfc\xdc\x4b\xa6\x35\xe0\xa6\x62\x8d\x3d\xf4\x55\xce\xa6\xe0\x1f\xce\x44\x79\xbe\xf6\x93\x14\x0f\x1b\xa2\xce\x63\x1b\x73\x39\x00\x32\x90\x0c\x86\x64\xc8\x30\x90\x13\x43\x2b\x3b\xb6\xe4\x12\xb5\x56\x00\xa5\x8c\xbe\x2b\xb8\x97\x65\xfd\xba\x7a\xe4\x6f\x6e\x61\x5a\xe6\x3c\xa2\xa5\x6a\xb6\x98\x63\xca\x86\x64\x84\xa1\x99\x4e\x5a\xfc\xfd\x8b\x3f\x7e\x43\x06\x53\xc3\xd2\x50\xb2\xd2\x42\xd3\x24\x7c\x64\x02\x7c\x64\x60\x65\x8f\x67\x35\x4b\x32\x40\x00\xfb\x79\xd8\x85\xbf\xfc\xea\x6e\x50\xe5\xb1\x27\x31\x4c\x4e\x4a\xf0\xeb\x26\x62\xb4\xa8\x43\xca\xee\x41\xdb\x3b\xaa\x44\x0b\xd0\x4c\x24\x2c\x9a\xd6\x46\x34\x5f\xfb\x8b\x8c\xc5\xbd\x95\xf5\x17\x60\x4f\x91\x70\x95\x89\x2c\x4f\xac\xd1\xf9\xbb\x90\x5f\x9c\x2b\x98\xcf\x02\x5c\x78\x2e\xd0\x4c\xea\xa6\x98\xad\x9c\x6e\x23\x72\xfd\x2b\x85\xcb\x2e\x71\x86\xbc\x50\x02\x0c\x15\xa1\xef\x68\x92\x0c\x68\x74\x77\x2b\x5e\x89\x91\x7a\xc3\x2f\xa5\x14\xb2\xba\x96\x84\x1a\x6a\x39\xce\xf9\x9d\xed\xe1\x10\x8a\x24\x88\x91\x11\xad\xb2\x5c\xfb\x54\x86\x45\x1f\x6c\x33\xe6\x3d\x11\xf6\x6a\x50\x31\x0b\x3c\xb0\x42\xd7\x71\xc9\x5a\x16\x23\xcb\xf3\xab\x32\xb2\x7d\xf5\xe2\xf7\x7f\xb0\xa8\x4b\x84\x24\x7f\x78\x81\x51\xdb\xaa\x63\x0f\x31\xd2\x36\xc3\x28\x52\x9a\x24\x46\x6d\x28\x23\xa5\x01\xf4\x22\x24\xfc\xe8\x38\xa8\xeb\xa3\xdb\xc6\xa2\xd4\xed\xed\xdf\x51\x8e\x62\x5a\x41\x32\xec\xd8\xbc\xa4\xa0\xd6\x1c\x22\x63\x38\x74\xd4\x07\x93\xc3\xf6\x40\x00\x9a\x88\x24\x4f\xe1\x02\x26\xac\x89\x36\x4e\x95\xd9\xbc\xaa\x9f\x30\x85\x29\x60\x83\x44\x44\x77\x24\x76\x17\x4b\x91\x27\xb3\xb5\xc0\x77\x87\xc2\xae\x31\x38\x35\x62\x6f\x96\x7e\x7f\x25\xea\x26\xa5\x59\x16\xb2\x84\x24\xbd\xaf\x00\x03\xcf\x24\x16\x2c\xa8\x59\x51\xa6\xb6\x99\xb9\xae\x91\xb9\xeb\xbe\xc8\xd0\xcd\x9d\xa7\xd8\x39\xea\xa4\xbe\x8d\xba\x58\xfd\xee\x86\xc9\x0a\x42\x14\x13\xfa\xd3\x90\xe1\xbf\x6d\x5e\xc9\x5c\x5e\x64\x48\xad\x0b\x88\x61\x05\x00\x83\x3e\x48\x92\x77\x37\xb8\x36\x60\xdd\xac\x17\x72\x54\x81\x0b\x0f\x56\xe5\x94\x6a\x27\x10\x7a\xf3\x35\x25\x19\x48\xc5\x94\xe1\xcb\x3f\xe3\x81\x3a\x4f\x28\x4b\x4b\x26\xc0\x4f\x03\x04\x7b\xb8\xb1\x80\x72\x7d\x4a\xd9\x17\xb1\x9b\x10\x49\xa1\x2d\x1e\xbd\x40\xac\xad\x4a\xb5\x0d\x32\xd4\x4f\x4d\x2a\x7f\x2e\xa0\x59\xa5\x94\xe6\x97\x40\x2a\xed\x5d\xcf\x89\x40\xe2\xf7\x3d\x55\xfa\x18\x16\xdf\x10\x19\x40\xc2\xe8\x36\xb7\x4a\x09\x2b\xca\xa3\x3d\x28\x25\x91\xde\xe9\x81\x3d\x62\xbd\xe0\xe6\x4c\xb8\x47\xc9\xe1\xe9\xe1\x27\x25\x92\x16\x44\x52\x64\x74\x54\xab\x9b\xcf\x0c\xa4\x66\xa7\x2d\x97\x9a\x30\x6a\x10\x5e\x0f\x85\xd7\xf0\x2e\x88\x8b\x4a\x3a\x58\x27\xc9\x7a\x47\x3d\x80\x9d\x82\x60\x33\xb2\xef\xe9\x94\x50\x29\x72\x1e\x3b\xfb\x52\x30\xf0\xbd\x9e\x79\xf1\xb5\xe0\xe0\x0d\xe7\xb3\x95\x2a\xd0\xa2\xcf\x38\x79\xd9\x7b\xf9\xe2\xb9\x70\x2a\xfc\xc2\x19\x4e\x75\x1d\x38\x95\xa5\x4f\x9f\xf4\x5b\x7d\xcd\xfb\x86\xbe\xf7\xb5\x33\xb1\x14\x25\xed\x99\x2f\x98\x8d\x3f\xdd\x4b\xa6\xa1\xd4\xe5\xef\x08\x15\x17\xa3\x1f\x96\xea\x32\x1c\x2f\xea\x25\x51\x13\x48\xf5\x0a\x61\xa8\x7c\xf0\x88\x74\xcb\x11\x28\x3c\x6e\x8b\x2c\x5c\x6a\x05\x09\x2b\x03\xea\xe0\x80\x1c\xd9\x3b\x0f\x6d\x4a\xf3\xf1\x27\x45\x2d\x07\xb4\xcb\x87\xac\x46\x95\xcd\x99\xec\xf9\x8c\xa2\x0d\x2e\x6b\x10\x82\x7f\x85\x31\x9d\x00\xa6\x72\xb3\x84\xca\x04\x7d\x8e\x37\x76\xed\x64\x90\x6b\x02\x7c\xc2\xa4\xe0\x29\x70\x4d\x26\x54\x32\xac\x8b\x23\x01\x6b\x3b\x18\x5d\xf4\x8b\xa3\x9f\xcf\xde\x62\x40\xc3\xb1\x2b\x4a\xe1\x56\x99\x2b\x5f\xc0\xa6\xbc\x92\xd2\x74\x6b\xb7\xcf\xaf\xc3\xc0\x10\x69\xae\x5f\x97\x79\x4f\x9a\xeb\xdc\x36\x66\x79\x88\x92\x5c\xb1\xc9\xa7\xa2\x24\x2e\xc7\xfe\x82\xed\xb4\xcf\x33\xf9\xfe\x05\xa0\xe6\x52\xf7\xd1\xb4\xbe\x20\x41\x6f\xce\x61\x72\xa8\x42\xd2\x5e\xd9\x07\xee\x4c\x4f\xae\x9a\x86\x0d\x9f\xf3\x35\x17\xe7\x44\x08\xac\x1c\xf3\x69\x8d\x50\x31\x57\xe7\xb8\xc2\xed\xc0\x5a\x0d\x48\xae\xe4\xf1\x5d\x5c\xdf\x94\xcb\x90\x58\x75\x49\xc4\x3d\xd2\x2f\x7e\x2c\x6a\xd5\x60\x05\xb5\xa0\x44\x82\x1c\x15\x65\xc5\x47\xc0\x41\xa2\x90\x60\xa6\xac\x34\x56\x25\x03\xaa\xac\x93\xe7\xe2\xfa\xc6\xda\x6c\xb7\x83\xd9\xce\x62\xf6\xee\x12\xaa\xe1\xf8\x36\x8d\x61\x07\xe1\xb6\xda\x35\x2d\x18\xac\x0c\x60\x50\x29\xb5\x13\x93\xab\x3e\xa1\x71\x2c\xd1\xed\xe3\x44\x9f\x52\xad\xca\xe0\x5b\xc0\xba\x30\x54\x41\x79\x4d\x25\x70\x23\x89\x2b\x00\x4b\x2e\xf2\x2c\x61\xd6\x8d\x50\x7e\xa0\xa8\x67\x83\x6d\xbe\xb6\x47\xda\x3a\x6a\xde\xce\x4a\x5e\x0d\x2a\x24\x76\x2d\x4b\xb9\x62\xf7\x24\x28\x91\x4c\x8a\x92\xc2\x33\xbb\xe6\x4e\x04\x9a\xc4\xc3\xae\xf9\x2a\x94\x1b\xed\x18\x70\x2d\xcd\xd1\x9c\xdd\x2d\xec\x63\x9f\xe4\x78\x9a\xc2\x84\x6c\x02\xe8\x1f\x77\x05\x38\x5d\x21\xb7\xa2\xc8\xb1\xf5\x0d\xdb\x3a\xd3\x40\xa5\xa7\x68\xb8\xaa\x1d\x4f\x22\xf9\x54\x88\x30\x6b\xec\xb8\xb8\xbe\xb1\x94\xd0\x7e\x7c\xe8\x4f\xbb\x68\x97\x0a\xaa\xb6\x33\x06\x7e\xb2\x3a\x43\x75\x34\x8f\x99\xf6\x7e\xae\x61\x77\xad\x40\x96\x1a\xe2\x5f\xad\x64\xbb\x1a\x6f\x57\x40\x65\x34\xde\x05\xfe\x2b\x08\x81\x9d\x94\xc4\xc2\x46\x02\x0c\x85\x44\x95\xb8\x8b\xe4\x3d\x11\xe2\x2e\xcf\x36\xa1\xe8\x6e\x1a\xdb\x72\x6d\x23\x02\x51\x79\xe2\xb3\xa2\xe9\x31\x57\xbb\xf8\x7b\xab\xb2\x0f\x68\x2b\xf1\xe0\x44\x45\x02\x85\x98\xd5\x9b\xce\x93\x5c\x69\x90\xdf\x31\xa9\xf4\x81\xaf\x18\x8d\x18\x6c\x6d\x22\x87\xe5\x1b\xfe\xc6\xf4\xd8\x15\x6f\x3c\xec\x54\x2f\x99\xbf\xdd\xc4\x87\x46\xa7\x3d\xbc\x16\x1c\x0e\x7b\xb3\x62\x57\x20\xe5\x81\xac\x2d\xe5\x29\x6e\xe9\x0a\x12\x1b\x2f\x8a\x17\x4a\xb8\x72\xeb\x0a\x57\x9a\x37\x78\xfa\xa7\x40\x13\x8a\x45\xe2\xf0\xee\x71\x51\x68\xd2\x56\x8e\xb2\x95\x32\x85\x13\xf4\xa6\x65\x10\x95\x8a\x49\x69\xb1\xfc\xb3\x77\x91\xe7\xb6\xc6\x00\x5b\x80\xd4\xd5\x0b\x79\xc5\xf8\xdd\x96\xe8\x57\x8d\x2e\xb9\x9c\x9b\xad\x52\x51\xdc\xfa\x68\x19\xb7\xc1\x77\x86\xc5\xd0\x81\xc8\xb5\xaf\x49\xa2\x4a\x8a\x23\xe3\xff\xb4\x7b\x81\xf6\xf6\xcc\xd6\xec\x5b\xa4\x23\xaa\x8e\x35\xfa\x78\x25\x50\x4d\xb9\xa6\x58\x5d\xf4\x42\x44\x77\x20\x49\x62\x96\xd1\x23\x45\xe0\x4b\xa5\x9e\xa5\xcc\x61\xcb\xa8\x8b\x5d\x2d\x1d\x90\x8d\x21\x05\x49\x93\xa2\xac\x6b\x0d\x50\xbf\x72\x84\x33\xcc\x5a\x8e\x49\xb1\x65\xd1\x5c\x21\x46\x73\x0e\x2f\x17\xdd\x95\xd2\xa9\xaf\x75\xcb\x38\x86\x1b\x3c\x30\x85\x66\xfd\x4c\xc4\xe5\xc4\xb3\x5c\x81\xec\x86\xb4\x40\x97\x7b\xa3\x42\x20\x4e\x0c\x83\x7c\x34\x62\x7c\xe4\xa8\x33\xd2\xf4\x52\xc1\xed\xa0\xe9\x60\xa4\x77\x24\xc1\x96\x9c\x45\xe9\xc1\xc6\x97\xb1\xf2\xfd\xa9\x88\xed\xed\x83\xa9\xd5\x06\xfd\xce\x16\x01\xd2\x57\x9c\x08\xe9\x4a\x23\xd0\x38\xc6\xb5\xcf\x7f\x21\x5e\xad\x7e\x55\x27\xc4\x71\xd8\xc8\xee\xf0\x54\x09\x2c\x2a\x1f\x18\x61\x27\x97\x11\x2c\xb2\x9d\x96\x8a\xfc\xd2\x09\x65\x09\xda\x29\x04\x27\x91\x3d\xc5\x2e\xd6\xcc\x9c\x7e\x7e\x88\x51\x70\xd8\xae\x13\xdf\x79\x39\x8f\x01\x35\x4a\x54\xed\xca\x67\x76\xe2\x31\xd5\xf2\x42\x67\x7c\xc1\xb7\xd8\x80\x71\x0d\x69\x26\x24\x95\xd3\x59\x8f\xa9\xa1\x89\x06\xe3\xcc\x7e\xcd\x6c\x4c\x5f\xc4\xc8\x36\x16\xe0\xd9\xc4\xb6\x0e\x5e\x80\x6a\x0b\x51\x1a\x89\x2e\x17\xc4\x6f\xa0\x61\x0f\x2a\x1a\x43\x9c\x63\xb0\xfa\x28\xa7\xd8\xda\xdc\x10\x0d\x67\x5b\x9f\xba\x28\x40\x8b\x7b\x21\xbe\x30\x64\x25\x4c\x31\x26\x07\xcb\x7e\x9a\x5f\xb0\x7c\xa8\x8d\x44\xb4\x9d\x9d\xb1\xcb\x6b\x08\x4a\xbc\x2d\x9a\x4d\xe0\xc7\xc2\x84\x45\xda\x3f\x34\x5c\x86\xa7\x11\x0d\x0d\x65\xfb\xc2\x95\x1b\x8c\xc0\xd0\x3e\xad\x8a\x4f\x71\x41\x2c\x58\x50\xf4\x3d\x37\x3c\x69\x39\xea\x17\x78\xbe\x06\xc3\x51\x8c\xaf\x6e\xc5\x0a\x6a\x11\xa0\xb4\xe8\xdb\xcd\x9a\x66\xf2\x06\x1c\x6e\x37\x7e\x4e\xb6\xad\x03\x55\x43\xdf\xd8\xdd\x99\xb8\x93\x13\xb0\x8e\x6a\x43\xe5\xa8\xbe\x1a\x78\x78\x26\x47\x79\x6a\x0b\x94\x8b\x99\x1a\xd1\xae\x3d\xb2\x65\xab\x68\xb9\x33\x4c\xf9\xfc\xf5\x45\x39\x49\xa3\x1c\x7d\xee\x53\x5c\x8c\xb0\x57\xd3\xa2\x3b\x6b\xd2\xbd\x32\xea\x67\xb0\x13\x17\xdc\xc3\xe9\xa9\xce\x66\x19\xde\xe6\xf5\x74\xc6\x33\x23\x6f\xa0\x94\x54\x58\x2d\x79\x34\xa6\x7c\x84\x86\x7e\x91\x9b\xf9\xbe\xf8\x02\x57\x24\x21\xce\x23\xd7\x1b\xc3\x47\x78\x7f\xe1\xed\x9b\xae\x48\x11\xb6\xe8\x53\x11\xcd\xfc\x9a\xcb\x9f\x65\x85\x91\x53\xc2\x7a\xd0\x23\x07\x5f\x94\x2e\x1d\xd8\xb7\x67\x52\x98\x57\xb8\xe0\x70\x5c\x55\xc2\x34\x9e\xbd\x83\xf2\xdd\x3d\x72\x69\xde\x81\x3e\x9f\x00\xc0\x52\xfc\xf2\xa0\x00\x5f\x87\x48\x18\x51\x19\x27\x98\x53\x38\x0c\x62\x97\xcd\x3c\x72\x00\xc3\x03\x8f\x11\x83\x5c\xe8\x45\xf6\xd7\x0d\x13\x3f\x34\x55\x77\xea\xc4\x0a\x6b\xdd\x98\x6a\xda\xc5\x7e\x22\x96\x4e\x9d\x58\x03\x42\xd7\x55\x72\xed\x52\x87\x5a\xdd\xb0\xad\x27\xbf\x75\xb9\x63\x5d\x1a\xee\x62\xbc\x4b\xbb\x58\x53\x75\xf7\x68\xd8\x4f\x10\x38\x51\x4b\x97\xaf\x51\xd0\x77\x56\x00\x0f\x05\xdd\x11\x06\xd8\x0e\xa5\x28\xe0\x1d\x62\x34\x5c\xcd\xda\x45\xe7\xf9\xf2\xfa\xf6\xed\xdf\xfb\x6f\xae\xae\x6f\xdb\x63\xdd\x1e\xeb\xf6\x58\xd7\x38\xd6\xc0\x27\xb5\x8f\x74\x50\xf4\x16\xe9\xbe\x33\x55\xf4\x4a\xa9\xe3\xcf\x28\x0a\xed\x92\x4f\x7e\xa6\x46\xd4\xcc\x24\x28\x94\x4c\x8c\xc4\xba\xc8\x5d\xec\x6e\xb0\x8d\xc5\xce\x9f\x7c\x18\xda\x27\x0c\x22\x6b\x30\x38\xe7\xba\x54\xf1\x60\xd1\xae\x95\x3b\xf9\x9d\xff\x72\x75\x71\x79\x7d\x7b\xf5\xdd\xd5\xe5\xdb\x4f\x1a\x55\x51\xb3\x8a\x5d\x95\x29\xef\xc8\x25\x33\x09\x13\x26\x72\x95\x4c\x43\x21\xdc\xc5\x44\x60\x3e\x30\x8f\x1b\xc5\x70\x1a\x6a\xfd\x2e\x7c\xac\x65\xb6\xcd\x32\xdb\x6a\x90\x49\x8d\x02\x26\x4d\xa1\xef\x77\x52\xa4\x0d\xa1\xf0\x8d\x35\x16\x78\xdb\xfe\x22\x7c\x3a\x74\xb5\x0e\x2a\xac\xc7\x09\x8f\x45\x61\x05\x23\x8c\xa6\x99\xae\xd1\xe7\xa0\x91\xba\xa5\xcd\x94\xf8\xb4\x01\x19\xaf\x69\xf6\x23\x4c\xdf\x42\xcd\x3a\x29\x33\x3e\x95\x04\x22\xc3\xe8\xc8\x1d\x4c\xad\xab\xf5\xdc\xbf\xac\x4e\x3d\x97\xbd\x2c\xfb\x7a\x07\x75\x4a\xf2\x36\x59\xaf\xf5\x0e\x6a\x44\x68\xfa\x31\x57\xb9\xd4\x6c\x21\xca\x69\x66\x4f\xeb\xed\x1e\x69\xb6\x56\xeb\x23\xd4\xa7\x3d\x2c\xb3\x7b\x47\x67\xf5\xd6\x65\x24\xc4\xc4\x70\x2e\xb8\x3f\x71\xd1\x69\x5d\xa3\xb8\x76\x2d\xd6\xaa\x13\x0c\xc1\x39\xf9\x2d\xfe\x87\xdc\xbe\xb9\x78\x73\x4a\xce\xe2\xd8\x45\x49\xe7\x0a\x86\x79\x62\x6d\xf6\xaa\x47\x68\xc6\x7e\x06\xa9\xb0\x51\xdc\x1d\xe3\x71\x87\xe4\x2c\xfe\xb6\x4e\x75\x29\x3b\x1a\xdc\x05\xe1\x3d\x53\xcd\xee\xc4\x8d\x73\x3c\x96\x79\x57\x20\x22\xc4\xa6\x40\x22\x6e\xfa\x42\x33\x4e\xc8\x68\x08\x34\x75\x7b\xe2\x11\xbb\x85\xcd\xd2\xd5\xc3\x82\xb0\x5a\xa7\x4e\xa8\xc4\x15\x9f\x12\x95\x63\x45\x1c\x15\x1a\xd9\x61\x6b\xd8\x4e\xf5\x4f\x95\xd1\x08\x3a\xe4\x1f\xe1\x47\x6c\x3d\xaf\xde\x1d\x1e\xfe\xe9\xc7\xcb\xbf\xff\xe5\xf0\xf0\xc3\x3f\xca\x57\x91\x15\xa2\xd6\x3c\x73\x0b\x3a\xb2\xb8\x88\xe1\x1a\xdf\x81\x7f\x3a\x71\xed\x2c\x8a\x44\xce\xb5\xbb\x80\xe9\xcb\xbd\xb1\x50\xfa\xaa\x1f\xfe\xcc\x44\x3c\xfb\x97\xaa\x55\x32\x6d\x2f\x19\x03\x6e\x51\x8d\x34\x1c\x3b\x9a\x63\x0f\x05\x2d\x69\xf8\xa8\xba\x59\x43\x8b\x8e\x68\x0c\xa9\x2d\xda\xf4\x9d\x07\x01\x36\xdb\xf5\x75\x12\x38\x26\x97\x1b\xc9\xb4\x5a\x3f\xef\x60\xf2\xb2\x56\x57\x72\x3b\x1a\x24\x6d\x61\x07\x1b\x06\x18\x42\xc4\x41\xcb\x1e\xe4\xc0\x60\xbd\x96\x52\xb8\x9d\xcf\xfa\x57\x64\x62\x21\xbc\x37\xc0\xf1\xfe\xb7\xef\x1e\x95\xc6\x95\xbd\x7c\x15\x0d\xf1\xd4\xf6\xa6\xf5\xd7\x5d\x41\x01\x15\x6a\x7c\x81\x51\x6c\x8e\xec\x8f\xbd\x28\xcb\x3b\xee\x86\x5e\x0a\xa9\x90\xd3\xf0\x67\xf0\x2e\x76\x95\x16\x92\x8e\x30\x01\xc5\x3e\x6e\x1f\x0b\x7f\xd9\x07\x2b\x2f\x98\x7f\xda\xaa\xc2\x51\x2e\x8d\xd0\x90\x4c\x3d\x45\xde\xb1\x30\x46\x31\xf6\x90\xb6\x79\xd0\xef\x09\x69\x0b\x98\x51\xb7\x03\xad\x1d\x55\x84\x2c\x42\x04\x50\xe0\x0c\x50\x44\x7d\xd2\x25\xd8\x76\x82\x18\x64\xad\x01\x7c\x62\x34\xcb\x9d\x4b\x84\x15\xa3\x41\x6a\x16\xb3\x09\x53\xa2\x46\x9a\x4d\x98\x68\x79\xee\x80\xab\xf1\x61\x23\xa4\x82\xd9\xec\x21\xc3\xaa\x48\xe1\xbc\xce\x90\xfd\x97\x75\x1a\x23\xd9\x91\x51\xad\x41\xf2\x53\xf2\x5f\x47\xef\xbf\xfc\xb5\x7b\xfc\xed\xd1\xd1\xbb\x17\xdd\x3f\x7e\xf8\xf2\xe8\x7d\x0f\xff\xf1\xbb\xe3\x6f\x8f\x7f\xf5\x7f\x7c\x79\x7c\x7c\x74\xf4\xee\xc7\xd7\xdf\xdf\xf6\x2f\x3f\xb0\xe3\x5f\xdf\xf1\x3c\xbd\xb3\x7f\xfd\x7a\xf4\x0e\x2e\x3f\x6c\x38\xc9\xf1\xf1\xb7\x5f\xd4\x5e\x7a\x03\x45\x4a\xed\x68\xb2\x54\x69\x75\xc6\x46\xd0\xef\x11\xeb\xf3\xdb\xe1\xd1\xab\xe9\xf3\xef\xc3\xa4\x4f\x0b\x86\x14\xd8\xf5\xde\x1c\x70\x05\x91\x04\xfd\x31\x2c\x39\xf6\x4d\xa5\x52\x09\x87\x8a\x04\xd5\xe2\xb9\xf1\xb9\xcf\xc1\xb8\x13\x3a\xeb\xe1\xbe\x16\x92\xe8\x50\x8a\xd4\xa7\xbf\xa3\x7b\x03\x1b\xee\xfb\xfb\xee\xa0\x56\xb7\x57\x3b\x5a\x63\x50\x6b\x0c\x5a\x32\xd6\x1a\x83\x6e\x2c\x1e\xee\xad\x25\x08\xf8\x64\x57\x17\xc6\x42\x0f\xba\xd7\x75\xca\xb5\xe2\x36\x73\xa8\xf5\xfc\x51\x2f\x5a\x52\x16\x91\x34\x96\xa1\xa5\x8b\x7d\x98\xe4\x0c\x9b\x4f\xdb\x83\x8f\x13\x14\xf9\x25\x56\xb5\x71\xa5\x0c\x61\x62\x96\x10\x6a\x61\x57\xaa\x5e\x62\x88\x25\x06\xbd\xfe\xcd\xc6\xa0\xde\xd9\xb0\x54\xa3\xa4\x31\x5e\xd4\x0b\x0d\xc2\x61\x51\x64\x9a\x2a\x25\x22\x1b\x4e\x1b\xb2\x1d\xb0\x84\x9d\x5b\x36\xae\x06\x3b\xde\x67\x12\x22\x88\x81\x47\xe0\x0a\x50\x57\xda\x6f\x52\x4e\x2e\xf9\xc4\x17\xe1\x8e\x7d\xee\x0c\xae\x64\xf1\x1c\xcf\x2b\x00\xc1\x20\xa2\x73\x82\x95\xe2\x10\x90\xea\x17\x71\xb4\x18\x8a\x21\x86\x85\x95\x75\xb7\x0e\x7d\xb5\xb9\x78\x7d\x9e\x19\x3c\x5b\xb5\x84\xa1\x39\x66\x59\x98\x9f\xab\x4c\xf2\x39\x38\x03\xeb\xb3\xcf\xcf\x8e\x75\x36\xc4\x36\x9b\x61\x99\x5b\xf8\x4e\x9a\x64\x93\x4d\x38\x4b\x32\x09\x43\xf6\xd0\xd0\x39\x3d\xe3\x85\x25\x86\xc5\xc0\x35\x1b\x32\x9b\x4b\x93\x49\xc8\x80\xdb\xfc\x04\x1a\x8d\x91\xf6\x3b\x4e\x59\x38\xa7\xf7\x31\x98\xc7\x0a\xdc\xcd\x92\xb2\x9b\x45\xc2\x7e\x4b\xc7\x48\x4b\xc7\x76\x1e\x1f\x89\x8e\x39\xcc\xdd\x1f\x22\x86\x91\xe7\xf5\x43\xdf\x2f\x4a\x71\xec\x88\xc5\x5b\x63\x59\x91\xed\x74\x82\xb3\xec\x64\x7d\xae\x85\x0c\xf8\xda\x7e\x9e\x24\x0d\x55\xe1\x3e\xbc\x42\x68\x64\x79\x92\xb8\xe4\xe3\x1e\x79\xc3\xf1\x3c\x9e\x61\xb7\x87\x0e\xb9\x86\x09\xc8\x0e\xb9\x1a\x5e\x0b\xdd\xb7\x82\x6d\x35\x96\xcd\xde\x48\xd8\x90\x9c\x1a\x95\x49\x69\xa2\x6d\xc5\xfd\x52\x7d\x20\x21\x2b\x13\x14\xa5\xc7\x6a\xc4\xa0\x2f\xdf\x96\xdf\xfa\xb4\xd0\xee\x27\xda\xa6\xd0\xd2\xa4\x01\xdd\xd4\xcd\xe4\xa3\xe3\x30\x22\xd2\xb9\x46\x16\xe5\xf6\x3e\xc1\x72\x1b\x99\x50\xfa\xc6\xa8\xb0\xcd\xb4\xbb\xe9\xfb\xe9\xb0\x83\x04\x4d\x12\x88\x2b\xfd\x8e\x6c\x9f\x0e\x5a\x55\xa1\x31\xeb\x38\xb4\x8d\x00\x32\xa6\x3c\x4e\x40\x62\xe9\x77\x35\x5b\xdf\x8a\x15\xbd\x0e\x42\x77\x0a\x9f\x17\x4a\xa3\x48\xc8\xd8\xf5\x99\x75\xf9\x99\xb8\x98\x70\xbc\x90\xd0\xa6\x94\xd3\x11\xa0\x59\x61\xae\x80\x30\x96\x95\x56\xa5\x16\x17\x63\x21\xee\x48\x24\xd2\x2c\xc1\x03\x50\xe3\x7c\x14\x1d\x76\x02\x8a\x76\xcd\xec\xea\xa4\xd4\x7c\x07\x7f\xa8\xd7\x7b\xa7\x96\xa4\xd2\x84\x9c\x02\x0f\x10\x35\xd6\x9d\xef\xf2\x01\xa2\x52\x7b\x49\xb3\x25\xae\xbf\xa4\x16\x68\xd8\xa8\xdf\x35\xb8\xb6\x4d\xbe\x29\x3b\x78\x8d\x4c\xb3\xf2\x98\x29\x27\x87\x73\xfa\xea\xd9\xee\x15\xd8\x88\xc0\x26\x33\x63\xf6\x99\x2f\xa8\x5d\x39\x0c\xf6\xe8\xcd\xd5\xa0\x0b\x91\xc6\x7e\x2e\x4c\xb9\x16\x42\x93\xa3\xc3\x93\xc3\xe3\x39\x03\xdd\x4c\x09\xe6\xdb\xd2\x93\x0c\x6b\x0e\x66\x58\xc0\x0f\xa2\xc3\xb8\x43\x98\xf6\xc4\xd6\x96\x3e\xc0\x55\xb9\x94\xb8\x0e\x51\x82\x68\x49\x63\xe6\x54\x20\xfc\xd5\xdc\xa4\x65\xee\xea\x1e\x1c\x1d\xfe\x7a\xd8\x21\xa0\xa3\x63\x72\x2f\xf8\xa1\xc6\xe5\x63\x91\x90\x5c\x95\x26\x9a\x8a\x1c\x7b\xf1\x59\x10\x84\x8a\x1f\x86\x62\x11\x91\xdb\xc6\x3d\x63\xaa\x7d\x2a\xde\xe5\x03\xd3\xbe\x59\x85\x18\x92\x17\xb6\x6f\x10\x50\x67\x22\x4c\xd8\x04\x4e\xc6\x40\x13\x3d\xb6\x51\x14\x5c\xf0\xae\x6d\xfd\x66\x48\x89\xbb\x52\xd7\xa1\x50\xcf\xde\x56\x1e\x35\x6c\x6f\xf3\x0b\xaa\x29\x5a\x1b\x22\xfa\xfd\xee\xfd\x68\xc9\x5c\xab\xe6\xdb\xdb\xfe\xf7\x95\x8e\xb4\x48\xc5\xb5\xce\x7c\x6c\x4b\xa9\x7a\xc6\x1e\xd0\x8e\x66\xbc\x79\xb5\x5a\xd3\x92\x06\x49\x58\xdd\x16\xb5\x64\xbe\xf5\xf6\x76\xbd\x69\xc9\xdf\x45\x8e\x3d\xf5\xe8\x20\x99\x92\x7b\xca\xb5\xcf\xc3\x3b\x30\x53\x1d\x18\xf2\x64\xb0\xe1\x07\xa0\x31\x48\x85\xd4\x03\xe8\xce\x55\xc2\xfc\x68\xcc\xcb\x54\x5a\x5b\xb3\x7c\x20\x57\x5a\xa4\x64\xec\x3e\xbb\x9a\x9b\xe8\x4e\x46\x0f\x4f\x8f\x4f\xfc\x91\x90\x59\x0a\xe7\x9e\x79\x76\xf4\x6b\x8e\x6e\x58\xb8\x57\xaa\xe9\x47\x65\xb0\x95\x7b\xae\x30\x6e\x81\x65\xbb\x25\x36\x44\x4b\x1b\x88\x0e\x20\x0d\x46\x08\x90\x7a\x99\x8e\xb3\x13\xa1\xd7\xab\x7e\x30\x54\x63\x41\x07\xa4\x31\xc7\x3a\x59\x64\x85\x74\x38\x63\x43\x60\x1b\x02\x62\xa3\xee\x6c\x52\x3f\x97\xb2\x3c\x56\x03\xa0\x99\xcd\x27\x4d\x42\x20\x6b\x20\xf6\x79\x3e\xf2\x79\xae\x67\x38\x92\x09\x5b\x95\x76\x6f\xb8\x4c\xdd\x06\xea\x64\x71\x22\xb1\x24\x3c\xf4\xbb\xd5\x4f\xa2\x89\x3a\x69\x2e\x46\xb1\xe9\x08\xc5\x46\xe3\x13\x1f\x35\x3a\x11\x73\x22\x6a\x53\x91\xaa\x71\x1c\xa7\x34\x18\x60\xf4\x36\xa3\x71\x3a\xd9\xcf\x59\x77\x7c\x4f\x8e\xaa\x39\xd4\x1c\xb5\xbd\x38\x63\x3a\xca\x6e\x44\x74\xd7\xa0\x5e\x73\x01\x99\x84\xc8\xda\xc9\x6e\xcf\xfb\x76\x76\xa3\x5f\x5e\xbf\xb9\x2d\x62\xf1\x31\x60\xa5\x30\x5c\xfe\xe0\x2c\x69\x46\x27\xbd\x83\x4c\x07\xd5\x7d\x40\xa3\xbb\x7b\x2a\x63\xb4\x6c\x51\xcd\x06\x2c\x61\x7a\x8a\xca\xb9\x04\x0c\xf4\xe7\xc2\x46\xc4\xd9\x52\x90\xc2\x37\x74\x0d\xdd\xc6\x83\x0d\x0b\x2d\x64\x2e\x74\x66\x48\x99\xd1\xc7\x43\xd7\x5e\x1b\x32\x13\x65\xc1\xa4\x57\xb6\x4c\xb7\xca\x97\x1f\x7b\xab\x7c\x95\x3a\xd2\x6e\xab\x87\xd5\x0d\xdc\xdb\x63\x56\xe7\x58\x9c\x0c\x0d\xd7\x5a\x56\xd7\xd0\x7c\xfb\xcb\xea\x32\x09\x37\x5a\x64\x0d\x79\x49\xec\x64\x4b\x7c\x24\x03\x18\x0a\x43\x84\x97\x3a\x3d\xe2\x1c\x5c\x95\xce\xb3\xfe\x55\xb0\x6a\x89\x8a\x63\xc3\x86\x2c\xfa\xd2\x9c\x09\x9b\x00\x07\xa5\x4e\xd0\x1d\x92\x67\x56\x6b\xf5\xbd\x75\x3b\xe6\xeb\x20\xc5\xd5\x75\x8a\x34\x00\xd7\xd9\x17\x7f\x04\x1d\x59\xcb\x6d\x89\x90\x63\xd3\x30\xb7\xfc\x59\x37\x4a\x24\xa9\x1a\xdb\xae\xb7\xf0\xc0\xb4\xeb\xdc\xdc\xb7\x95\x82\xcb\xcd\x77\x47\x92\x46\x40\x32\x90\x4c\x18\x66\x94\x73\x1d\x8b\x7b\x4e\x06\x30\x62\x5c\x79\x50\x60\xf1\x4d\x07\x33\xf4\xc7\x30\x15\xca\xa6\xf5\xc8\xdb\x4a\x35\x10\x97\xa7\x13\x89\xe2\x68\xba\x35\xcf\x7a\x92\x90\x63\x21\x9c\x6c\x0f\x99\x00\xe1\x72\x5b\x9d\x75\x4b\x3e\xca\x39\xbe\x39\x86\x84\x4e\x6d\x38\x26\x76\xc4\x66\xff\x06\xa9\x8e\x1b\xf0\x38\xd9\xc6\x50\xfe\xda\xd2\x75\x60\xd5\x53\x1a\x8d\xeb\xb9\x70\x5b\x17\xd5\x86\xa3\x75\x51\xd5\x99\xa4\x75\x51\xb5\x2e\xaa\x35\xa3\x75\x51\xb5\x2e\xaa\x99\xb1\xb7\x5a\x52\xeb\xa2\xda\x79\xb4\x2e\xaa\xd5\xa3\x75\x51\x6d\x30\x5a\x17\xd5\x86\xa3\x75\x51\xb5\x2e\xaa\xd6\x45\xd5\xba\xa8\x3e\x23\xbb\x9d\x1f\xad\x8b\x6a\x6e\x92\xd6\x45\xd5\xba\xa8\x36\x1e\x7b\xab\x7c\xb5\x2e\x2a\x3b\x5a\x17\x55\x75\x7c\x5e\xac\xce\x3b\x78\xfa\x46\xd5\xab\xdf\x6e\x18\x15\x46\x47\x63\x9f\x65\xda\x53\x1d\xfb\xff\xc7\xb1\xfd\xef\x89\xa3\xa4\x01\x7b\x7f\x6b\xeb\x7f\x76\xb6\xfe\x66\xec\x64\x0d\xd8\xc8\x6a\xd3\x64\xe7\x02\xbf\x1d\x4b\x50\x63\x91\xec\x8c\xe8\x15\x24\x7f\xcd\x38\x4b\xf3\xd4\xe0\x9c\x32\xf8\xcc\x26\xc1\xd7\xae\x8a\x1e\xcc\xe8\x82\xb7\xe6\x3a\x73\x23\x8b\x01\xcb\x6e\x52\x96\x98\x6d\xc4\x44\xc9\x31\x9d\x18\x5c\x57\x79\x14\x01\x60\x53\xaf\xb2\x2a\xf1\x75\x2f\xbc\x29\x34\x71\x78\x59\x8f\xde\xd4\xe3\x96\xb6\x30\x26\xce\xf2\xf5\x57\x3b\xcd\x31\x92\x59\x33\x74\xf9\xfb\xb7\xfd\xf3\x12\x5d\xa6\xdc\x93\x65\xc6\x27\x22\x99\xd8\x1e\xb7\x78\x93\x91\x8a\x7a\x45\x77\x4c\x4e\x68\x92\x8d\x69\x49\x8d\x70\x12\xb8\xb2\xed\x98\xcd\x93\xe6\xb9\x50\x37\xb5\x6f\x43\x29\x76\x6e\x15\x5b\x8c\x06\x48\x7e\x7d\x6d\xa1\x96\xa6\xd0\x04\xc7\xa9\x2b\x0c\x57\x25\x19\x23\xf2\x56\x0d\x3e\x23\xc4\x0c\x5b\xcd\x7d\x63\x91\xb7\x36\xad\xac\x2f\x86\xd6\x3f\x5c\x04\xcb\xad\xe0\x87\x37\x06\xe0\x03\xd7\x4f\xdc\x33\xf4\xb2\xbe\xe1\x3b\x1c\x69\x41\xb2\x84\x16\x3d\x8a\x70\x07\x7e\x40\x2e\x74\x3e\x86\xe8\xee\xad\x73\x7a\x1e\x29\x80\x10\xb1\x32\x62\x7a\x9c\x0f\x7a\x91\x48\x4f\x0c\x51\xb0\xff\x37\x48\xc4\xe0\x24\xa5\x4a\x83\x3c\x89\x45\xe4\x98\x5c\x37\x32\xb3\x30\x3e\xea\xa5\xf1\x31\xf6\xba\xbd\xaa\xf6\x44\x2c\x15\x43\x30\xef\x77\xea\x20\x19\x80\xa1\xaf\x02\x55\xfe\x52\x39\x35\xb3\xbc\xad\xbb\xd8\x96\x47\x6d\xa6\x54\xd3\xe1\xfc\xf1\x9d\xcd\x2d\xe5\x22\x0d\xd8\x36\x9e\x9a\x53\xb9\xb1\xe0\x8a\x06\x9c\xc9\x7b\xe4\x48\xde\x1b\xe1\x78\x5f\x9c\xc7\x7b\x58\xf9\xb8\x01\x5f\x67\x13\xce\xe2\xe6\x1c\xc5\x8f\x50\x20\xf8\x71\x1c\xc4\x0d\x5a\xd1\x1a\x72\x0c\x7f\x0c\xa7\x70\x23\x5f\x5d\xd7\x19\xfc\xf1\x1c\xc1\xcd\x7c\x6e\x93\x8a\xc0\x53\x75\xfe\x36\x60\x0d\x6f\xd2\x12\xde\x98\x15\xfc\xd1\x9c\xbd\xf5\x1d\xbd\x7b\xe0\xe4\xad\x0d\x64\xc6\x99\x66\x34\xb9\x80\x84\x4e\x6f\x20\x12\x3c\xde\x99\xc3\xcc\x54\x8c\x0c\xe7\x47\xd9\x69\x9d\xa5\xaa\x9a\xd3\x30\xa6\xae\x30\xb6\xd1\xa8\x6c\x0e\x87\xf7\x50\x38\x81\x02\x9d\x0b\x76\x95\xbb\x94\x9d\xbb\x17\xf2\x2e\x11\x34\x56\x27\x99\xb0\xff\x57\x64\x2c\x94\x52\x15\xec\xbb\xea\xe5\x2a\x7c\x6a\x93\x98\x4d\xf0\x68\x72\x13\x7f\x10\xf7\x44\x0c\x35\x70\x72\xc4\xb8\xdf\xc7\xe3\x92\x1a\x58\xd8\x27\x03\x5a\x9b\xab\x2f\x5f\xf8\x9b\x9f\x9f\xe1\x11\x4d\xac\x4a\x3d\xbe\x1d\xd8\xbd\x68\xbd\x21\xd8\xdd\x38\xcc\x93\xaa\x31\xd8\x1a\x88\xab\xf4\xe6\x65\x51\xda\xf7\x25\xce\x1b\x4e\x1b\xe5\x31\x71\x49\x5f\xcf\x6f\xd3\x6a\x87\xb0\x54\x45\xbf\x10\xb2\xb2\xce\x6e\x7c\x7b\xde\xb7\x66\xe3\xd6\x5c\xb2\x2f\xe6\x92\x4f\x14\x06\xb2\x87\x82\xee\x13\x0d\xfd\x68\x05\xdd\x2d\x46\x29\x0d\xf4\x7b\x49\x23\xe8\x37\x2e\x23\xf8\xe3\x44\xe2\x5c\x52\x47\x00\x83\xc8\xe7\x0f\x0f\x07\x88\xed\x69\x0a\xa9\xb3\x98\x94\x3a\xcc\x93\x64\x4a\xf2\x4c\xf0\x6a\xa2\xb1\xf5\xb6\xcf\xe6\xad\xa2\x49\x7e\xc1\x5b\x0a\xc1\x32\x93\xc2\xf1\x4c\x99\x73\x6e\x68\x70\xd1\x9f\x0b\x05\x49\xac\x6b\x4c\x2b\xd9\xb1\x8a\x8d\xcc\xf2\x0d\xff\xc3\xc4\xd9\x22\xd6\xaf\x32\xa1\x79\x7a\x28\x64\xc4\x06\xc9\x94\x8c\x69\x12\x9a\xb1\x50\x72\xc7\x92\xc4\x4d\xd3\x23\x37\xa0\xad\x4b\xc1\xf2\xce\x44\xf0\x11\x2e\x8e\x72\xdf\x04\x10\x22\xf3\x6c\x94\x00\xe5\x79\x66\xdf\x67\x38\xf1\x54\xe4\xd2\xbf\xaf\x17\x1c\x13\x45\xd3\x7d\x96\x74\x4a\xad\xc6\x56\x6e\x6c\x68\x4f\x93\x2b\x23\x00\xbc\xf1\x75\x9c\x3b\xe5\x39\xc5\x04\xa4\x64\xb1\xb3\xf3\xdb\xdf\x32\x29\x26\x2c\xb6\xde\x0d\x0f\x36\x6c\x6a\x6c\x9b\xc9\x84\xf3\xcc\x05\xef\x72\x18\x51\x14\x54\xdc\x29\xb2\x7b\x66\xe7\xb1\x31\x04\x3c\xc6\xf6\x32\x46\xc2\x17\x59\x25\x73\x7d\xc2\x6c\x63\xdc\x12\xe4\xc8\x11\x17\x44\x60\xe8\x67\xce\x99\xb6\xcd\xd6\xc7\xb9\x26\xb1\xb8\xe7\xc7\x25\xbf\x2b\x19\x80\x5e\xed\x75\x45\x47\xeb\xed\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x7e\x37\x1a\xc1\x52\x10\xb9\xfe\x28\xda\xdf\xfd\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x4b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x57\xc3\xee\x02\xeb\x97\xeb\x57\x3a\x1f\xc1\x57\xea\xc7\x8c\xc1\xd9\x17\xd7\x37\xbf\xbc\x3a\xfb\xeb\xe5\x2b\x77\x3e\x79\x99\xe9\xe7\x9c\xfd\x2b\x07\x42\x53\x61\x64\xe1\xa4\x1c\x08\xd8\x41\x8d\xbe\xf4\x03\x9e\xe4\x66\x43\x06\x77\x64\xc8\xd8\x3c\xbe\x7e\x60\x24\xb6\xa0\x7f\xfc\xb8\xc8\x4f\xdd\x54\xab\x08\x6e\x31\x72\x63\xa9\xa9\x16\x25\x1c\xb4\x39\x79\x56\xa2\xb4\x4d\xd6\x18\x1f\x25\x65\x61\x72\x37\x72\x55\x57\x27\xaa\xab\x11\x75\x8b\x2f\xe8\xef\xaa\x18\x35\xd2\xdc\xab\x58\x43\x43\x2d\x71\x0a\xaa\xed\xd5\x00\xdb\xb3\xd8\xab\x01\x56\xf4\xb8\xea\x13\x1a\xc7\x12\xc5\x14\x3c\xf5\xe9\x4c\x6b\xcc\xac\x88\xa5\xe9\x90\x17\xe4\x4f\xe4\x81\xfc\x09\xd5\x82\x6f\xea\x36\x10\xaa\x2b\xb0\x37\x11\x1a\x63\xb4\xd1\xab\x7e\x43\x10\xff\xdb\x98\x6a\x9c\xd1\x40\x55\x0b\x32\x60\x4e\x0c\x85\x07\x0d\xd2\x88\x45\x6e\x27\x3e\x69\xeb\x25\xb3\xc0\x8f\x88\x66\xd6\x4c\x7e\x35\xac\x86\xe3\x6c\x87\x68\xe6\x71\xa3\xdf\x5f\x3b\x2a\x54\xed\x74\x52\xcc\x96\x52\x1d\x8d\xab\x64\xcc\x08\x18\xaa\xc2\x9c\x62\x81\x64\xdc\x06\xde\x8e\x59\x0d\xa7\xff\xfe\xa0\x71\x3d\x3f\x70\x65\x3f\x57\xed\xd4\x8c\xe2\x8f\x7c\xde\x09\x06\xa5\xe2\x49\x99\x88\x7b\xe4\x92\x46\x63\x5c\x56\x5c\xe2\x19\x46\x03\xc1\xc9\xc6\x74\x62\x36\xde\x3d\x6b\x3b\x03\xa1\xb4\x12\xac\xa3\x88\x4b\xe6\x3c\x45\x94\xdb\xde\x9c\x43\x90\xd2\xc6\x4a\x0f\xa6\x3e\xc8\xac\xf6\xe6\xd5\x3a\x49\x99\x14\x5a\x44\xa2\x46\x77\xa8\xd9\xfc\x0b\x9c\x0e\x81\x60\xe3\x53\xbd\x79\xf7\xa7\x8b\x7e\x87\xdc\x9e\xf7\xb1\xad\xcf\xcd\xf9\x6d\xbf\x2a\x61\x1f\xdc\x9e\xf7\x0f\x3e\x29\x28\x88\x37\xb3\xa1\x41\x75\x87\x49\x2a\x06\x93\x84\x29\xdd\x4d\x69\xd6\xbd\x83\xe9\x8e\x3c\xb5\x09\xbe\xde\x0d\x3b\xdc\xc8\x07\x59\x30\xa7\x34\xdb\x7a\x36\x09\x34\x66\x6d\xa2\xcf\xe6\xa3\x4d\xf4\xd9\x70\xb4\x89\x3e\x6d\xa2\xcf\xfc\xd8\x9b\x58\xc6\x36\xd1\xe7\x79\xb9\x6e\xdb\x44\x9f\xcf\xde\xff\xdb\x26\xfa\x2c\x1e\x6d\xa2\x4f\x9b\xe8\xb3\xd9\x68\x13\x7d\xb6\x1f\x7b\x17\xb9\xd2\x26\xfa\x6c\x35\xda\x44\x9f\xf9\xd1\x26\xfa\x2c\x19\x6d\xa2\xcf\x92\xd1\x26\xfa\xb4\x89\x3e\x6d\xa2\x4f\x1b\xff\xb8\x76\xae\xfd\x8c\x7f\x24\x6d\xa2\x8f\x1b\x6d\xa2\xcf\xb3\x88\xf2\x22\x6d\xa2\xcf\x46\xa3\x4d\xf4\x69\x13\x7d\x76\x19\x6d\xa2\xcf\x73\x31\x97\xb4\x89\x3e\x6d\xa2\xcf\xe7\x23\xe8\xb6\x89\x3e\x6d\xa2\x4f\x9b\xe8\xd3\x26\xfa\xac\x5c\x45\x9b\xe8\xf3\x1c\x54\x40\xdf\x77\xb5\x7e\x96\xca\x5b\x3f\xd3\xe6\x81\x7d\xe4\x72\xc1\xaf\x68\x09\x51\x99\x99\x44\x16\x53\x26\x12\x68\x3c\xc5\x29\xb1\xd7\x43\x49\xc8\x7a\x82\xf1\x81\x09\x4b\xd9\x6e\x89\x41\x64\xee\xd0\xbc\xc2\xb9\x4a\x5e\x17\x03\x96\x94\x3e\xe0\x01\xa0\xa9\xc8\x6d\xfb\xd7\x48\xa4\x59\xae\xab\x30\xc5\xed\xd9\xa5\x73\xeb\x90\x8d\x1c\x47\x3d\xb1\x4d\x66\xbb\x61\xda\x6e\xa9\xb1\xeb\x27\x6c\xd7\x4a\x63\x1f\x37\xd7\x6f\x22\x68\x84\x6a\x0d\x92\x9f\x92\xff\x3a\x7a\xff\xe5\xaf\xdd\xe3\x6f\x8f\x8e\xde\xbd\xe8\xfe\xf1\xc3\x97\x47\xef\x7b\xf8\x8f\xdf\x1d\x7f\x7b\xfc\xab\xff\xe3\xcb\xe3\xe3\xa3\xa3\x77\x3f\xbe\xfe\xfe\xb6\x7f\xf9\x81\x1d\xff\xfa\x8e\xe7\xe9\x9d\xfd\xeb\xd7\xa3\x77\x70\xf9\x61\xc3\x49\x8e\x8f\xbf\xfd\x62\xe7\x25\xd7\x16\x78\x9b\x13\x77\x1b\x12\x76\x1f\x45\xd4\x75\xee\xda\x86\xce\xa2\x0b\x35\x99\x3b\x8d\x8e\x1d\xad\x3a\x8d\x5e\xe3\x46\x21\x2e\xcc\xc3\x14\x11\x29\xd3\xda\x51\x51\x5a\x0e\x57\x65\xba\xa2\x72\x3a\x3a\x80\x4d\xb1\xa9\xb6\xcd\xaa\x43\xa8\x67\x29\x44\x45\x78\xb9\xce\x75\xf3\x66\x69\x96\x60\x93\x68\x3c\xcf\x5d\x1f\xa9\x82\xac\xb3\xa5\x0d\xeb\x47\x4b\x1b\x9e\x23\x6d\x50\x10\xe5\x92\xe9\xe9\xb9\xe0\x1a\x1e\x76\xb2\x9f\x2c\x33\x20\xdd\x54\xa7\x76\xb1\x61\xca\xc5\xb4\xd9\x6b\x44\x64\x36\xc2\x7b\x69\xee\xf4\x58\xe4\x49\x8c\x99\x49\x39\x47\x95\xd2\x26\xb9\x81\xb6\xfa\x1e\x6a\x3a\x18\xbe\x3d\xfb\x3a\xaf\xc1\xd9\xa9\xff\x95\xb3\x09\x4d\x8c\x7e\x5b\x3c\xd1\x47\x9d\xa5\xfc\xd0\x4e\x46\xac\x4f\x2c\x63\xa1\x78\xd3\x97\x6c\xc2\x12\x18\xc1\xa5\x8a\x68\x82\x54\xa9\x19\x4a\x7f\xb6\x64\x76\xdc\x22\x29\x12\x45\xee\xc7\x80\x5d\xf8\xa9\x57\xcf\x31\x95\x6c\x44\x19\x27\xa9\x21\xaa\x99\x7f\x58\x59\x3d\xdf\x10\x6f\x23\xf5\x72\x5d\xe8\xf3\xa8\xbe\x0e\x84\x48\x5c\x3e\x42\x32\x2d\xe6\x67\xd6\xf4\xc6\xc5\x2f\x1c\xee\x7f\x31\xb3\x29\x32\x4c\xe8\x28\xa8\xf1\x0a\xf4\x9c\x25\xae\x98\x7a\xe9\x07\x60\xb0\x7f\x0e\x84\x26\xf7\x74\xaa\x0a\xa3\x46\x31\x07\x53\xa7\xe4\xe5\x31\x22\x1e\x55\x24\xcc\x11\x93\xaf\x8e\xd1\x35\x77\x7e\xd6\xff\xe5\xe6\xef\x37\xbf\x9c\x5d\xbc\xbe\xba\x26\xd7\x42\x83\x65\x49\xa5\x46\x69\x11\xe5\x46\x43\x70\xab\xc4\x77\xa0\x06\x2d\x54\x0f\xed\x8a\x4c\x91\x7b\xc6\x63\x71\xaf\x76\xb6\x9f\x5a\xf4\x33\xc0\x03\xca\x77\x9a\x23\xa2\x19\xc5\xfe\x6f\x35\xf8\xc3\x5c\xf4\x47\x79\x52\xe4\xc0\x71\x7c\x12\x4b\x91\x59\x20\x78\x03\x54\x59\x49\xba\x98\xb1\x2b\xfb\xf8\x52\xdc\xdf\x61\x75\xc2\x91\xa4\x5c\x17\x96\x98\x62\xcf\x5c\xe3\xb9\x5e\xed\xed\x78\xda\xf9\x46\x34\x6e\x2e\xd7\xe8\x2c\x8e\x21\xae\x80\xff\xd9\x45\xf5\x9d\xfb\x8f\x9b\x16\xe5\x18\x48\xff\xcd\xcd\xd5\xff\x99\xc1\xe3\x69\x56\x2f\x88\xa9\x99\x14\x50\x29\xb2\xc6\x76\xf7\x2d\xa4\x62\xd2\xee\xef\xbe\xec\x6f\xe0\x96\xcd\xb8\xce\xdf\xe6\xbc\xcc\xd0\x78\x69\x7e\x92\x8a\x18\x7a\xa4\x1f\x6c\xf8\xd5\xab\xe5\x32\x33\x12\x88\xb9\x85\x6b\x46\x93\x64\x5a\x16\xa6\xb4\xb0\x39\x82\x95\x22\x04\x65\x42\x3e\xa4\x89\xfa\xd4\xd4\xb8\x0e\x6f\x34\x72\xc4\x6b\xa3\xcd\x36\xb2\x1d\x61\x36\x12\x03\x17\xda\x09\xc3\x66\x95\x58\xd8\x41\x8a\x88\x58\xd5\xb9\x14\x28\x55\xe1\x6f\xca\xfa\x11\x3c\x6b\x64\xca\x03\xbb\x1f\x66\xb6\x46\xe4\x5c\xfd\x3f\xf6\xde\xc7\xbb\x6d\x1b\xf9\x17\xfd\x57\x70\xbc\x7b\xae\xed\xad\x24\x27\xdd\x1f\xdf\x6e\x6e\xdf\xf6\x78\x6d\xa7\xf5\x6d\xe2\xf8\xc6\x4e\xfb\xf6\x35\xfd\xee\x42\x24\x24\x61\x4d\x02\x2c\x01\xda\xd1\xde\xde\xff\xfd\x1d\xcc\x0c\x40\x90\x92\x13\x9b\x64\x22\x3b\x15\xf7\x9c\x6d\x2c\x51\x20\x38\x18\x0c\xe6\xe7\x67\x84\x59\x7f\x34\xd6\xc6\xb4\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\x56\x24\xe6\x39\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x11\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x64\x00\x2a\x19\x66\x5f\x40\xa8\xc1\x59\xf8\x1b\x5d\xf5\x1e\x9b\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x91\xeb\x20\x1c\xf0\x23\x69\xcb\x40\x90\x66\xa6\x17\x87\xe7\x8e\x61\x35\x60\x53\xc5\xf5\xb5\xc7\xf5\x8a\x3f\xf6\x2d\x55\x56\xea\xd0\x7c\x5b\xea\xaa\xf3\x21\xb6\xa2\x6c\x7e\x7b\x7a\x0c\xa2\xa8\xa2\x30\xa2\xb2\xe5\xb2\xd0\x12\x7d\x50\xb7\x18\x06\x6f\x28\x10\x1a\xef\x89\x3a\x66\xc5\x5e\xf2\x25\xe3\x99\xd1\x9e\x96\x52\xad\xb3\x17\x19\x19\xa3\xee\xeb\xa9\xb6\x8b\x15\x2b\xd4\x6d\xa8\xd5\xdf\x8d\xa2\xa8\x62\x8d\x0e\x26\xd5\xca\xcf\x2d\xbf\x12\x86\x15\xa5\x48\x44\x2a\x54\xb2\xe9\x65\xdf\x74\x30\x0e\x58\xe7\x4c\x2b\xb7\x31\x07\x61\x9e\xd3\x10\x85\x25\x92\xc6\xac\x02\xf1\x5c\xb2\xfe\x38\x44\x75\x61\x5b\x56\x46\x94\x18\x82\x2e\x2b\x81\x2b\xf9\x7d\x35\x15\x99\xa3\xbc\x33\x49\xa9\x6b\x36\x3a\x1e\x64\xce\xe7\x82\x71\x1b\x38\xcd\x6a\x26\x94\x71\x12\x13\xdd\x97\x96\xa5\x5a\xd4\xb5\xf1\xdc\xb0\x37\xa7\xc7\xec\x09\xdb\x73\xcf\xda\x07\xfe\x81\xa6\xda\x56\x63\x02\x5a\xdb\x46\x9d\xf9\x21\x60\x4a\xc0\xbc\x4c\x97\x28\x24\x46\x4c\x69\x66\xaa\x64\x11\x77\xf2\xf6\x66\x33\x25\x29\x42\x60\xe4\x61\xf2\xfa\x66\x25\xd4\x1b\x23\xca\xc1\x04\xd4\x9b\x0e\x02\x2a\x56\xa3\x1c\xcf\x35\xa9\x87\x8c\x95\x0b\xcb\x53\x6e\x39\x09\xae\xd0\x59\xfd\xa1\x2e\xe9\x6f\x5b\x7c\x19\xf1\x42\xaa\xea\x1d\xba\x48\x87\x73\xb5\x5c\x9c\xc0\xb0\xc0\x43\x40\x75\x58\x75\x5e\x14\x99\xac\x03\xc8\x51\x92\xda\x69\x83\x57\x46\xb7\xa8\x89\x20\x27\x7c\x1c\xda\x29\x27\x5c\xa5\x3a\x5f\x79\x18\x04\xbd\x79\xb2\x88\x1f\xb0\xe5\xbe\xe6\xf5\x40\x9c\x42\x99\xb8\x16\x3d\x40\xb4\x5a\x9c\xf7\xc2\x8d\xe6\x88\xe3\x39\x02\x86\x67\x19\x9f\x8a\x0c\x69\x8c\x1c\x68\x56\x39\x70\xd3\x99\xa2\xa5\xce\x86\x2b\x6d\x79\xad\x33\x81\xa9\x57\x9e\x10\x6e\xf8\x47\x41\x07\x18\x64\x28\x3a\x80\x35\xd8\xa0\x03\xd8\xb5\x8f\x81\x0e\x55\x8f\xa3\x9e\xb5\xe9\xe0\xf4\x86\x26\x1d\xe0\xf0\x7e\xe8\x74\x30\x22\x49\x74\x5e\x9c\x97\xda\x99\x9d\x83\x9d\x4d\x34\x6c\x1d\xe7\x43\xc7\x06\xf8\xed\x63\x0b\x98\xa2\x7a\xcd\x9b\x79\x19\x25\x5d\x72\x8b\x87\x84\xcf\xbc\xfc\x1f\xd1\x99\x05\xa2\xa7\x7d\x90\xf9\x51\x1a\x81\x40\xf7\x4b\xfa\xe2\x31\x1f\x07\x43\xd4\x2d\xf4\x70\x76\x0e\x72\x1a\xe9\x84\x67\x00\x92\xda\x8f\xe5\x58\x9b\xed\xda\x03\x47\xa9\xb6\x10\xa3\x84\xcf\x7c\xfa\x07\xe0\x65\xc2\x27\xe4\xc2\x54\x3a\x15\x51\xd4\x19\x73\x84\x2f\x31\x25\x13\xee\xf3\x59\xbe\x4e\xaf\xa0\x2c\x10\x91\x36\x7e\x6d\x35\xe1\x93\xbd\x0c\xd0\xab\x6e\x82\x42\xa5\x52\xcd\xc1\xaf\x36\x62\xa5\xc8\x30\x3f\x98\x84\xc0\x15\x5a\x90\xbb\xb0\x25\xfc\xa0\x7e\x3f\xf8\x47\x83\x2e\x26\xb5\xa2\x91\xc1\x53\xe4\x35\xac\x19\x8a\x5b\x69\xd8\xce\x0b\x4f\x80\x1e\x58\x95\x0f\xf1\x84\xd9\xc1\x37\x0c\xab\x89\x9e\xce\x2b\xa9\x52\x4a\xa5\x6d\x10\xcb\xdb\xb9\xa4\x07\x43\x92\xb6\x4c\x63\xd9\xf2\x8c\xbd\x55\x2c\x10\x8b\x8d\x3b\xb3\xc7\x6b\x54\x99\xbd\x8f\x6e\xfc\x7e\xc7\x6b\x78\x48\x7b\x98\x37\x0a\xd6\xde\x3d\x77\xec\x2c\xf7\xd5\xfb\xfc\xbb\x6c\x14\x56\x87\xa4\xdf\xd0\x56\xcc\x8f\x38\xac\x57\xe9\x13\xc7\xd6\x56\xaa\xb9\x89\x2d\x99\x26\x22\xfe\x7a\x53\xc6\xaf\xf0\xac\xd4\x58\x82\xb9\x6a\x42\xb4\x4a\x00\x1e\x8b\x19\x92\x39\x75\xe2\x91\x1b\x21\xf3\xdc\xf0\xa3\xd2\x51\xc2\x4a\x9e\x5d\x14\xdd\x01\x44\xd9\x0a\x58\xdd\xcb\x8b\xc3\xe6\xd0\x70\x58\x2f\x44\x89\x67\xbf\xfb\x9e\xf1\x34\x97\xc6\x80\x23\x4c\x4c\x17\x5a\x5f\xb1\xbd\x35\x58\x59\x51\x96\x95\x91\x73\x73\x40\x3c\x3f\x76\xb3\xdf\x67\x52\x65\x21\x93\x09\xec\x60\x65\x8d\x77\xe4\xc0\x43\x92\x30\x0b\x58\x43\x02\x68\xa6\x64\x85\xd5\x69\x22\x24\xb3\xe3\x82\x8d\x0b\xec\xd5\xe5\x39\xeb\x09\x89\xf2\x81\x25\x3a\x23\xde\x6e\xa3\x9e\xad\xa5\x23\x6a\x8f\x1b\x27\x12\x29\x17\x89\x30\xc3\x81\x2d\x7d\x57\x8f\xc9\x52\x81\x15\x36\x02\xb2\x9f\xf8\xad\xe9\x70\xe0\x97\xde\x85\x42\x4d\xfa\xe9\x6e\xac\x51\x5f\xd6\xc2\xc5\xd9\x23\x59\xb1\xe0\x63\x34\xd2\x9d\x44\x03\x11\xe8\x55\x88\x85\x56\xba\x44\x16\x75\x87\xa8\x56\xc0\xd2\x20\xa2\x30\x9a\x07\x6b\x42\x22\x3a\x9a\xea\x51\x1d\x25\x8e\x03\x81\x50\xe8\x85\xd8\x0e\xf5\x1c\x6e\xa4\x5d\x00\x0a\xeb\xa2\x15\x35\x84\x99\x94\xc2\x40\x00\x46\x31\x51\x96\xba\xa4\x84\x2c\xef\xb7\x86\x91\x40\x92\x43\x46\x97\x63\x12\xee\xfe\xda\x35\x71\xa0\xba\xc6\x3c\x87\x1c\x43\xc7\x4d\x62\x36\x13\x09\x28\x5a\x31\x81\x51\x6a\xef\xd5\xb0\xb4\xbe\x84\xc3\x6a\x8f\x99\x9e\xcb\x77\xee\x29\xf1\xaf\x5a\x9d\x57\x94\x56\xe3\xf5\x5f\xef\x4f\x18\x3b\x55\x21\xff\x76\xe4\x56\x31\xbe\xd3\xa7\x9e\x59\xf7\x8a\x31\xe0\x3e\xbc\x40\xec\x38\x73\xda\x61\x59\x0d\xc0\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\x2a\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\x95\x73\x84\x74\xb0\x45\x41\xbf\xdb\xb5\x45\x41\xbf\xe3\xb5\x45\x41\xdf\xa2\xa0\xaf\x5e\x0f\x26\x65\x70\x8b\x82\xfe\x79\xe1\xda\x6c\x51\xd0\x37\xef\x64\xde\xa2\xa0\x6f\x51\xd0\xdf\x77\x6d\x51\xd0\x3f\x70\x6d\x51\xd0\x3b\x5c\x9f\x81\xe4\xda\xa2\xa0\x77\xb8\xb6\x28\xe8\xeb\xaf\x2d\x0a\xfa\xea\xb5\x45\x41\xbf\xf5\xda\xa2\xa0\x77\xbe\xb6\x28\xe8\x5b\x14\xf4\x2d\x38\xe4\xfd\xc6\x7a\x98\xe0\x90\x6c\x8b\x82\x4e\xd7\x16\x05\xfd\xb3\x80\xc0\x63\x5b\x14\xf4\x3b\x5d\x5b\x14\xf4\x2d\x0a\x7a\x97\x6b\x8b\x82\xfe\xb9\xb8\x4b\xb6\x28\xe8\x5b\x14\xf4\xdf\x8e\xa2\xbb\x45\x41\xdf\xa2\xa0\x6f\x51\xd0\xb7\x28\xe8\xef\x9d\xc5\x16\x05\xfd\x73\x30\x01\x8d\x4d\x65\x27\x60\xc8\xbb\x60\xd8\x50\x6e\x72\x54\x32\x3e\xad\x66\x33\x51\x82\xe4\x82\x27\xaf\xa4\x4f\xd5\x70\x7d\xed\x20\xab\xb0\x23\x80\xc3\xa1\x32\x8e\x5b\x7e\x4e\x35\xea\x00\xe0\x58\x27\x10\x9f\xbc\x7a\xbe\x06\x30\xa7\x73\x5e\x61\xd7\xd4\x59\x98\xf3\x2b\xd5\x2d\x3e\x7e\x0b\xc1\xd7\x95\x15\x11\xdd\x93\x4c\x1b\x4a\x7c\x06\x62\x25\x0b\xae\x94\xf0\xf6\x9e\xb4\xe0\x47\x99\x0a\xa1\x98\x2e\x04\x45\xa7\x39\x33\x52\xcd\x33\xc1\xb8\xb5\x3c\x59\x4c\xdc\x93\x94\x27\x76\x9d\xa4\x4c\x9f\x18\x5b\x0a\x9e\xfb\x74\xed\x9c\x4b\x1c\x8a\xf1\xa4\xd4\xc6\xb0\xbc\xca\xac\x2c\xc2\x60\xcc\x08\xa8\xb3\xc0\x83\x2a\x10\x03\xf2\xe2\xea\xcc\xe6\x51\xfd\x34\x9a\x96\x8e\x11\xcb\xc0\xda\x1c\x01\xc8\x73\x5e\xd8\x25\x73\xaf\x9c\x11\xf0\x6b\x69\x2c\x4b\x32\x09\xa7\x35\x3c\x11\x4b\x6a\x61\xbc\x91\x3f\xab\x15\xcd\xd4\xd0\x54\x55\x0a\x6a\x6b\x61\x0d\x83\x44\xe0\x7a\x40\x1a\x2a\x95\x86\xd4\x7c\x33\x62\xdc\xc3\x69\x21\xa1\xfd\x4c\x81\xd4\xfe\x64\xc1\xd1\xe9\xa3\x68\xb8\x08\x46\xd4\xf1\x26\x3a\xb0\x6a\x46\x87\xcc\x77\xcf\x9c\xa3\x46\x92\x7f\xad\x50\x40\x9e\xde\xca\x36\x80\x05\x50\xe2\xda\xf1\x80\x48\x84\x3b\x5f\xf9\x2d\x5c\xff\xc9\x99\xde\xf2\x72\x2e\x6c\xc8\x67\xea\x9a\x2d\xde\x4c\x0b\x89\x01\x7f\x63\x43\xa4\x26\x19\x50\xe7\x5c\xa7\x50\xf4\x53\x57\x56\xad\x43\x14\xc6\x19\x12\x90\xda\xba\x1b\xbc\x62\x84\x49\x9a\xe1\xa1\xa6\xe0\x89\x30\x6c\xef\xf4\xfc\x68\xc4\xce\x4f\x8f\x29\x13\x53\xcf\xd6\x55\x32\x93\x0c\x43\x0e\xbc\x0d\xdb\x38\x60\xb4\x45\xc3\x47\xd5\x9f\xf4\xec\xf3\xa0\x5f\xbd\x55\x94\x60\xda\x96\x00\xa0\x72\x05\x7c\x73\x66\x2a\x50\x91\xc8\x27\x24\x43\x69\x06\x31\x9f\xa8\x0b\x12\x3d\xf2\x90\xff\x45\x98\x08\x51\x89\xea\x2e\x7c\xac\x1b\x04\x2c\x9c\xd7\x2b\xc5\x1d\x90\x0c\x4a\x79\x2f\x9d\xf2\x5d\x7a\x59\x48\x91\x2a\xf6\x52\x18\xc3\xe7\xe2\xbc\x63\x78\xeb\x36\x3f\x00\x44\xb8\x6a\x71\x00\x02\x28\xc3\x52\xdf\xf0\x49\x9d\x15\xdc\x54\xbe\x59\x8e\x73\x0a\x9c\x75\x53\x4a\x6b\x05\x88\x12\x80\xfb\x83\xc5\x6e\xa3\x01\xec\xb6\x72\x8b\x5f\xfa\x41\xea\x1f\x3b\x55\x42\xa5\x98\xe9\x3b\x15\x6c\x5a\x4a\x31\x63\x33\x09\xe9\xc3\x90\xd0\x3b\x42\xf4\x27\x8e\xbe\x27\x63\x44\x09\xf3\x21\x0b\xca\xcf\x6b\xc2\x7e\xa4\x89\xd9\xb2\x52\xd8\x76\x84\x94\x7b\x28\x77\x95\x33\x36\x87\x84\x60\xb2\x51\xfe\xf4\xe4\xaf\x7f\x61\xd3\xa5\x53\xa4\x80\x21\xad\xb6\x3c\x0b\x2f\x99\x09\x35\x77\xb4\xc2\x43\xa1\x59\xb0\x19\x28\x00\x8d\x41\x70\xe2\x4f\xbf\xbc\x9a\x36\x35\xbb\x83\x54\x5c\x1f\x44\xf4\x1b\x67\x7a\x3e\x61\x47\xa1\x3e\xb2\x2a\x52\xf0\xf3\x77\x07\xeb\x1e\x8e\xcd\x74\x26\x93\x65\x6f\x46\xf3\x30\x64\x6c\xa1\x6f\xd0\xc2\x5c\xc3\x3d\x75\xed\x57\xa1\x8b\x2a\xc3\x50\xc7\xf3\x50\xea\x5c\x19\xb1\x5a\x90\xb8\x76\x5f\x80\x73\x9e\x86\x68\xc9\x51\xca\x03\xf7\x8f\xd4\x54\xe8\x42\xee\xe3\x80\x46\x06\xc2\xe4\x39\xcf\xb2\x29\x4f\xae\x2e\xf5\x0b\x3d\x37\xaf\xd4\x49\x59\xea\xb2\x39\x97\x8c\xbb\x33\x7a\x51\xa9\x2b\x6c\x06\x11\xf0\x1a\xf4\xdc\x29\xf4\x45\x65\x3d\xbc\xf7\xba\x17\xc6\xe2\x7d\x7f\xf4\x7b\xe3\xbb\x1e\x45\xbc\x93\xb5\x85\x4d\x75\x63\xc8\x91\xf1\xf8\x26\x66\xb6\x2f\x9f\xfc\xe9\x2b\x64\x5d\xa6\x4b\xf6\xd5\x13\xa8\x15\x30\x23\xdc\xc4\x70\xa2\x3a\xf5\x24\xe7\x59\xe6\x04\x79\xcc\x94\x8e\xd0\xeb\x98\xf0\x93\xf3\xa0\xed\xcf\x6e\x77\x56\xe0\x2f\x2f\xff\x01\xa7\x88\xb4\x46\x64\xb3\x11\x96\x48\x05\x63\x7a\x17\xd4\x91\x5d\x92\x3e\x50\xa7\xf6\x00\xd4\xee\x6b\x9d\x55\xb9\x38\x16\xd7\x72\x88\x6e\x4f\x8d\xd1\xbc\x83\x29\x93\x06\xce\xc1\x69\xa6\x93\x2b\x96\xd2\x97\x51\xbe\x53\x1b\x96\xbc\x3b\x15\xba\x66\x7e\xf5\xc8\xf8\xba\xf5\xfd\x1b\xb9\x5e\x39\x2f\x0a\xa7\x03\x40\x25\x66\xc9\x6f\x1a\xc4\x80\x3d\x09\xd8\x09\x3d\xc1\x6d\x7a\x07\x37\xfa\x86\x36\xc6\xf4\x46\x4e\x6e\x76\x1e\xa2\x73\xae\x53\xff\xc8\x48\x3d\xfb\xee\xee\xf0\x06\x43\xd4\x03\xfa\xdd\x50\xc0\xbf\xb1\x9a\x69\x45\x31\x0f\xb0\x9a\x81\x31\x50\x01\x70\xec\x03\x22\xb9\xbb\x9b\x7f\x00\x9f\x7a\xbf\x44\xb7\x06\x5d\x54\x88\x65\xe4\xdc\x92\x42\xe8\x6d\x15\xce\x0a\x51\x1a\x69\xdc\xb9\xfc\x03\x6c\xa8\xa3\x8c\xcb\x3c\x72\x3c\x6f\x86\x08\xb8\xb9\x01\xcb\xb9\xbf\xa4\x74\x76\x0a\x0e\x08\xa2\x10\x71\xac\xd7\xa8\xb5\x4d\xad\xf6\xa2\x9a\x02\xff\xc0\xed\xf7\x69\xa9\x37\xe0\x49\xbc\x69\x19\xfb\x43\xbd\x0c\x4d\x11\xeb\x3e\x09\x32\x16\xef\xfa\x9c\x24\x2b\xbc\xdf\x63\x15\xac\x61\xf2\x03\xc9\x0f\x90\xa8\xb4\xb8\x4d\x11\xda\xb0\x3a\x71\x87\x45\xb6\x00\x19\x90\x13\x86\x49\x1b\x6e\x4f\xd0\x4f\xd9\xee\xb3\xdd\x8d\x4a\x57\x24\x51\xa9\x0b\x3e\xef\xd5\x91\xa8\x45\xa9\xf6\xb0\x31\x5c\x86\xb3\x9f\x22\x51\x52\xd0\x5d\x4e\x92\x78\x34\x20\xc0\x7a\xc2\x60\xbe\x27\x30\x59\x16\xd0\x31\x8e\xdd\xf0\x25\xe3\xa5\xae\x54\x4a\xee\xd0\xe0\x8f\x7e\xd9\x7a\xf0\x99\x56\xc2\xc7\x79\xda\x68\x1b\x10\x80\x92\x8a\x3d\x9d\x3c\x7d\xf2\xb9\x1c\x71\xf0\x86\xad\x23\xee\x2c\x1c\x71\x28\x9f\x36\xfa\xae\x1e\xb7\x7f\xa0\xf7\x7d\x49\xbe\x99\x1a\x96\x5f\x7a\xd0\x6f\xf8\xe8\xa6\x94\x56\x44\x7d\x06\xf7\xc0\xe2\x71\x86\x65\x84\x2d\xb1\xbf\xae\x1f\x46\x4f\x22\xf5\x03\xf3\x30\xd5\xf4\x23\xca\x2d\x12\x50\xb0\xdd\xd6\xb9\xc6\xcc\x7b\x44\x58\x4c\xa8\x9d\x1d\xb6\x87\x77\xee\x62\x05\xfe\xfe\x46\x59\x8b\x88\x76\xf2\xae\xe8\x81\x14\xda\x02\x7b\x28\x38\x38\xef\x8a\x01\x29\xf8\x77\xb1\xe0\xd7\x02\x90\x07\x64\xc6\xcb\x0c\x42\xe4\x17\x38\x77\x36\xad\x2c\x13\xea\x5a\x96\x5a\x81\x9f\xf8\x9a\x97\x12\xb0\x7d\x4a\x31\x13\xa5\x50\xce\x88\xfd\xfd\xde\x0f\x87\xaf\x21\xff\x66\x1f\xfb\xbe\xf8\x59\x56\xc6\x83\xf0\xc4\x33\x89\x86\xfb\xe0\xf2\xf9\x79\x38\x1a\x82\xcc\xf5\xf3\x72\xcf\xc9\x2b\x5b\x61\x73\x99\x77\x49\x56\x19\x79\xbd\x29\x49\x42\x90\x10\xc7\xb2\xd3\x3a\xb7\xe0\x29\x6a\x42\xad\x20\x4d\xd4\x61\x82\x0f\x00\x71\xef\x9a\x50\x63\x1a\xa7\x6c\x90\xcf\x8a\xe5\x72\xbe\xb0\x94\xed\xd9\x8a\x1c\x44\x21\xa8\x1c\xdc\xbc\x9b\xf4\x5e\xb9\x63\xf7\x30\x93\xdc\xdc\x57\xe5\x5a\x29\x64\xa4\x51\xa8\xc0\x5e\xfb\xdc\x22\xef\x94\x71\x0f\x42\x4f\xe5\xe9\x39\x45\xd0\x3c\xdd\xa4\xfa\x37\x26\xd6\x04\xb3\x04\x13\x65\xf0\x27\xe8\x6e\x9c\xb1\x08\x16\xc8\x27\x94\x80\xf0\x07\x2c\x2a\xb0\x48\x94\x56\xe3\x45\x04\xdb\x54\xe8\xf4\x9e\x45\x7e\x5d\x0d\x8f\x4e\x26\xc7\x7a\x0a\xb2\x85\xce\x52\xdf\x45\x1b\x7d\x39\x53\x61\x6f\x84\x50\xec\xf4\x1c\xe8\xe7\x5e\x11\x22\x42\xb7\x50\x11\xc3\x0a\x00\xd0\x14\x99\xb2\x0d\x7a\xde\x97\xc1\x7a\x58\x25\x7d\x54\xfa\xf0\xa6\xbd\xf7\xfc\x77\x81\x66\x3e\x23\x9b\x4f\xf5\xb5\x00\x92\xa6\x69\x29\x4c\x0f\x80\xa3\x0d\xd8\xa9\xbd\x44\xa9\xec\xd4\xe0\xa7\x19\x18\x09\x64\xf3\xae\x25\x50\xdf\x61\xab\x02\xe3\x7d\x62\x09\x76\x7a\x7e\xd4\x43\x7a\xed\xbe\xa1\xb8\x88\x1b\x6a\x77\xd7\x30\x59\x24\x75\xcc\x75\xc2\xea\x70\x63\x54\x28\x81\x1a\xe3\xfd\x62\x5d\x5d\xd5\xc4\x48\xa8\xf5\x14\xd2\x4c\xe1\x30\x4e\xac\x50\x91\x34\xb9\x73\x20\xe8\x50\xe8\x14\x3a\x30\xd5\xd4\x30\xfe\x17\x31\x41\x7c\xb2\x04\x0a\x79\x4a\x1d\x19\x85\x24\xe4\x96\x60\x02\xd7\xbb\x4f\x3f\x8c\xa4\xf8\x0a\x31\x3f\x19\x2d\xcf\x4f\x8f\x87\x64\x97\x42\xa6\x0f\x8e\x5d\xee\x6f\x5f\x36\x4b\xe2\x9a\x48\x12\x34\xa0\xdf\xec\xe7\x3a\xbd\x45\x4d\xaa\x0f\x1a\xb8\x3f\xee\x05\x6c\x35\xe3\x0c\xfd\x8b\xad\x2e\xef\x1d\x88\x72\x6f\x29\x01\xaa\xd6\x79\x95\x65\x17\x22\x29\xc5\x7d\xfd\xaa\xcd\xf5\x3f\x6d\x8d\x75\x9b\xca\x13\xe9\xef\x00\x4f\x40\x37\xab\x1a\x06\x33\x4a\xec\xa8\x8b\x0f\x8b\x2a\x83\x5c\x58\xae\x96\x9e\xe0\x30\x7b\x13\x05\xb1\xa4\xf1\x69\x35\x98\xc6\xd5\x58\x05\x23\xc2\xc3\x42\x57\x29\x6e\x0c\x86\x5a\xa5\x4a\xe5\xb5\x4c\x2b\x9e\xc1\x83\x40\x0b\x8d\x3b\xf0\x87\x13\x32\xf7\xb0\xae\xec\xb9\x2e\x99\x78\xc7\xdd\x6d\xa3\xa0\xc4\x72\x03\xec\x90\xea\xe4\x4a\x94\x23\x54\xc5\x8e\xe1\x8f\x23\xd0\x78\x11\xf7\xdc\xcf\xc3\xd9\x12\x04\x66\xda\xa5\xa9\xbf\xef\xda\x8f\x74\xf8\x1d\xbe\xee\x52\xaa\xf9\x18\x3e\x71\x2f\x42\x4f\x1a\x6b\x35\xe6\x63\xc7\x86\x8f\x44\xf1\x03\xa0\xf3\x57\xa0\x59\xbd\xf6\xfc\xe2\x4d\x04\x67\xc8\xe9\x6a\xbe\x00\x62\x95\x39\xf7\x98\x83\x99\xb0\x00\x27\x47\x01\x61\xcc\x02\xa2\xdf\xa6\xa4\xa6\xc5\xf0\x7a\x4d\x5e\x7b\x24\xca\x5f\x57\x0f\x59\x2b\x9b\x39\x12\x5b\x44\x23\x7b\x6f\x0e\xd4\xd7\xa2\xbc\x96\xe2\xe6\x80\x8e\xce\xf1\x8d\xb4\x8b\x31\x52\xc4\x1c\x00\x61\x0f\x7e\x87\xea\xe5\xe5\xab\xe3\x57\xd0\x9b\x99\xdc\x96\x95\x11\xb3\x2a\xa3\xee\xf6\x13\xc6\x0b\xf9\x83\x28\x0d\xa0\xcf\x5e\x49\x95\x8e\x58\x25\xd3\x6f\x3e\x61\xc6\x8c\x54\xb2\x4e\x03\xec\x25\x05\x5f\x90\x94\xa3\x32\x64\xf9\x9f\xba\x01\x3d\x65\x15\x4d\x45\xa6\xd5\x3c\x2a\xa2\x06\xf5\xe2\x54\x49\xbb\xd2\xc6\x16\x21\x21\xc1\x44\xd6\x65\x0a\xc9\x96\x52\x97\x0d\x7f\xb0\x1b\x0f\x80\xf2\xa2\x94\x4d\x27\x22\x65\x63\x3c\xc8\x83\x31\xe1\x30\x62\x98\x49\xe1\xeb\x2d\x3d\x8e\xb0\x07\xe0\x43\x3c\xc8\x05\x57\x29\xfc\x99\x24\xba\x4c\x69\xbe\xd2\x86\xfc\x50\xcc\x26\xc2\x14\x16\x38\xd6\x9c\x84\xe4\xaa\xfd\x64\xb0\x40\xcb\xbc\x91\x4b\xe8\xd5\x9e\x4a\xc9\x5f\x2a\xc1\x78\xae\x9d\x60\x6f\xa3\xe5\xb7\x28\x92\xf3\x25\x9c\xad\x30\xd5\x17\x3e\xdf\x9d\x8a\x14\xcd\x88\xbd\x16\x3c\x95\x51\x9d\xf5\x88\xbd\x68\x16\x5e\x8f\xdc\x5c\x2e\xb0\x22\x94\x3e\xc2\xd9\x97\xc2\xe8\xaa\x4c\xc4\x6b\x0c\x12\xe5\x3e\x21\x69\xf5\x65\xdc\xaa\x58\x7e\x25\x14\x1a\xe5\x8e\x34\x10\x07\xab\x4a\x58\x83\x64\x21\xd2\x0a\x4e\xa9\xe9\x92\xcd\x24\xb6\xd0\x00\x55\x41\xce\x17\xc2\x58\xaf\x5c\x1e\x40\x92\x4f\xdd\x8d\xcc\x4f\x00\xd8\x37\xca\x06\xae\xdd\x58\x39\x07\x80\x67\xd8\xb2\xdc\xfa\x82\x17\xb4\xd9\x4c\x95\xfb\xbd\xdc\xa6\xb4\x99\xb0\x17\xee\x51\xc8\x4f\x51\x6b\x02\xd9\x22\x2e\x04\xe9\xc8\x0f\xc7\x66\xdc\x2c\xa0\x71\x47\x7b\x09\x08\xf5\x3f\xa9\x4a\x27\x30\x10\x8c\x9b\x43\xc3\x75\x68\xce\x0b\xbd\xb9\xd7\x39\x6e\x7a\x16\x38\xb8\xc9\x8e\xa3\xf3\xee\xb1\x1c\x62\x87\x21\x61\xdd\x11\x3e\x69\x49\x02\x5c\x49\x77\x60\x79\xc8\xaa\xb2\x52\x75\xc4\xd4\x49\x85\x4f\x77\x24\x75\x8f\x8f\x76\x8a\x6b\xf6\x39\x01\x79\x39\xef\xef\xf9\xd8\x3d\x2c\xe7\x15\x6e\x74\x92\xc2\x35\x74\x37\x75\xad\x06\xad\x0d\x75\x4c\x67\xce\x1c\xbd\x3c\x8e\xcb\xa4\xe2\xfa\x0f\x5f\x64\x36\x61\x3f\xf4\x75\x52\xb7\xbd\xd4\x4e\x9a\xd7\xae\xef\xba\xeb\x86\x93\x18\xd9\xb5\xb7\x2f\xc2\xd3\xbc\x1e\x2a\x55\x51\x59\x3a\x06\x6b\x8b\x53\x25\x0b\xae\xe6\x60\x64\xea\xca\x8d\xf7\xfb\xdf\xc3\x8c\x4a\x91\x56\x09\xb5\x2c\xf1\x2c\xfb\x7b\xef\xb2\x25\x98\x30\x90\x55\x26\xe1\x85\x9f\x73\xfc\x5a\x66\xa9\x2c\x7f\xf7\x8c\xc9\x89\x98\xb0\x9d\xdf\x47\x5f\xed\xe0\xd3\x8b\x52\xbb\x47\x50\x79\x06\xcc\x2a\x93\x16\xd2\x24\x76\xe2\xbb\x27\xec\xc4\x3d\x03\xc2\x58\x81\x80\x51\x05\xc1\xb4\x26\xdf\x88\x95\x62\xce\xcb\x34\x23\x77\xcb\x4d\x54\x76\x12\x08\x26\xde\x49\x63\x0d\x9e\x41\xb6\x87\x64\xb2\xdc\x5c\x39\x39\xe4\x76\xd6\x38\xe5\x96\x8f\xa3\x2d\x7d\x80\x76\xdb\x98\xb0\x94\xc7\x9c\x58\xab\x16\x59\x07\xbf\xa3\xea\xcd\x31\x0f\x77\x49\xa7\x91\x03\xaa\x71\x77\x3d\xe7\xb1\xf9\xd8\x7a\x40\x6a\x37\x77\xef\x49\x8d\xb3\x0f\x34\x80\x2e\x35\xb5\xbe\x14\x84\x28\xa1\x46\xaf\xdb\xcf\x27\x67\x97\xaf\xff\x71\xfe\xea\xf4\xec\x72\xbb\xad\xb7\xdb\x7a\xbb\xad\x7b\x6c\x6b\xa1\xae\x7b\x6f\x69\x6f\x37\xad\x0b\xf9\xb6\x71\x2c\xa3\xea\xa5\xcf\x28\xb1\xee\x44\x5d\xff\xc0\x9d\x1a\x5d\x94\xc2\x80\x66\x02\xf1\xaa\x35\x11\x70\xba\x01\x95\xf6\xa3\x47\x9f\x59\xb7\xc1\xbc\xb8\x01\xf3\x8d\x62\x97\xca\xba\x55\x8b\x1b\x2c\x1e\xfd\xf3\xf4\xf8\xe4\xec\xf2\xf4\xf9\xe9\xc9\xeb\x8d\x26\x8a\xf4\xc4\x91\x6c\x1e\xca\x1d\x4f\xc9\xa2\x14\xd7\x52\x57\x26\x5b\x06\x28\xea\xf5\x42\x60\x35\xd7\x50\xa5\xe0\xeb\xf0\x68\xdb\x6b\x7f\xb6\x3d\x6c\x87\x3d\x6c\x9b\x79\x33\x3d\x20\x84\x86\x62\xdf\xe7\xa5\xce\x07\x62\xe1\x0b\xf4\xc2\xf8\x60\xf8\x3a\x7e\xda\x25\xb4\x91\xc6\xd1\x43\xca\x63\x0d\x6d\xe2\x94\xd1\xbc\xb0\x3d\x3a\x8d\x0c\x82\x1c\x3c\x0c\xc8\x2e\xe6\xea\xbc\xe4\xc5\xf7\x62\xf9\x5a\xf4\x44\x2a\x6a\xd2\x5b\x64\x22\x71\x07\x1d\xbb\x12\x4b\x4c\xcc\x3c\xf2\x0f\xeb\x83\xa8\xf4\x20\x81\x97\xaf\x44\x1f\x50\xec\x21\x11\x93\xaf\x44\x8f\xa4\x53\x7f\xad\x60\x07\xbb\x25\x04\x3d\xcd\xad\x69\xbf\xd5\x63\xc3\xa2\x25\x7f\x04\x84\xe8\xcf\x37\x82\xd2\xbc\x06\x5c\x05\x1f\x08\x1e\x78\x25\x30\x26\xbf\x6c\x9c\x5d\x41\x88\x30\x2c\x07\x05\xde\xf4\x41\x07\x52\x32\x06\x22\x4d\xdf\x56\x85\x0c\x97\x70\x58\xb9\xba\x5b\x0b\x56\xcc\xf1\x0f\x58\x78\xe9\x33\x0f\x9f\x60\x42\x7f\x41\xe8\xd8\x3b\x6a\xfe\x09\x21\xd1\x11\xfb\x57\xf8\x30\xe3\x53\x91\x99\x9f\x76\x77\xbf\xfe\xfe\xe4\x1f\x7f\xdb\xdd\xfd\xf9\x5f\xf1\xb7\x70\x14\x62\xa0\xbc\x79\x0b\x60\x41\x28\x9d\x8a\x33\x78\x06\xfc\x49\xea\xda\x21\x06\x4f\xe8\x0b\x28\xe5\x9e\x60\xd6\x52\xf8\xb3\xd0\x69\xfb\x2f\xd3\x0b\xb4\xf0\x41\x1e\x0c\xb0\x44\x3d\x2a\x8b\xf0\x1a\xee\x78\xa8\x65\xc9\xc0\x5b\x95\x46\x0d\x4d\x72\x92\x85\xc8\x11\x36\xed\xb9\x27\x01\xf4\x40\xf6\x98\x11\x0a\x0a\xed\x9d\x66\xda\x44\xb0\xdc\xb9\x7e\xda\xab\x59\x3c\x5e\x03\x8a\xb6\xb0\x82\x03\x13\x0c\x28\x42\xd4\xc2\x8d\x1c\x0e\xd8\x90\x30\x13\x7a\x74\x1e\x9e\x9f\xb2\x6b\xa4\xf0\x83\x21\x8e\x0f\x6c\x3e\xff\xa8\x32\x2e\x84\x4f\xdb\x05\xbd\xcf\x30\x01\xc7\x7f\x4f\xe0\x0a\x26\xa0\xec\x09\x67\xd8\xec\xe1\x87\x93\xa4\xa8\x46\x74\xc3\x24\x17\xb9\x2e\x97\xe1\xcf\x50\xd4\x39\x36\x56\x97\x7c\x0e\x35\x35\xf8\x73\xfc\x59\xf8\x0b\x7f\xd8\x78\xc0\xea\xaf\xd1\x14\xae\xa3\xa8\x24\x91\x3b\x82\x84\xd4\xd7\x03\x94\x6d\x9e\xf4\x0f\x44\xb4\x25\x7d\xa1\x9e\x9a\x57\x93\x21\x83\x27\x0e\x15\xce\x40\x45\xb0\x27\xa9\xd8\x78\x54\xe7\xc3\x81\x37\x40\x5d\x3b\xcb\xb2\x33\x48\x5f\x7d\x0d\x28\xcd\x52\x79\x2d\x8d\xee\x51\x39\x14\x06\xba\x3d\x77\x92\xf0\x4e\x30\x7f\x2b\xb8\xcd\xde\x15\x80\x4b\x16\xf6\x6b\x4b\xec\x3f\xed\xd3\x9a\x0c\xaf\x82\x5b\x2b\x4a\xf5\x8c\xfd\xf7\xde\xdb\x2f\x7e\x1d\xef\x7f\xb3\xb7\xf7\xd3\x93\xf1\x5f\x7f\xfe\x62\xef\xed\x04\xfe\xf1\x87\xfd\x6f\xf6\x7f\xf5\x7f\x7c\xb1\xbf\xbf\xb7\xf7\xd3\xf7\x2f\xbf\xbd\x3c\x3f\xf9\x59\xee\xff\xfa\x93\xaa\xf2\x2b\xfc\xeb\xd7\xbd\x9f\xc4\xc9\xcf\x77\x1c\x64\x7f\xff\x9b\xdf\xf7\x9e\xfa\x00\x30\xc1\x78\x0d\x09\x16\xdc\x1c\x71\x10\xf6\xfb\x88\x1d\x32\xf0\xf2\xec\x35\xf4\xfe\x7f\xed\xa5\x66\x94\xcf\xe3\x8f\xeb\x07\xb3\xc1\x31\x21\xf4\x53\x78\x72\xf0\x49\xcd\x5a\x9b\x60\x5a\x7c\x6e\xe7\xdc\x6f\xc1\xb9\x13\x7a\x5b\xc2\xba\xd6\x9a\xe8\xac\xd4\xb9\xaf\xe8\x87\xf0\x06\xd6\x9e\xd1\x7d\x57\xa2\x57\xbf\x65\xbc\xb6\xce\xa0\xad\x33\xe8\x96\xeb\x83\xce\x20\x2c\x47\x78\xb8\x9e\x20\xa1\xae\xbb\x86\x30\xd6\x46\xd0\xbd\xad\x13\xe3\xe6\xdd\x2d\xa0\x36\xf1\x5b\xbd\x6e\x0a\x5b\x67\xd2\xe0\x81\x96\xaf\x8f\x61\xb2\x43\x68\xff\x8e\x1b\x1f\x06\x08\xb8\xa4\x02\x4d\x1b\x5f\x7f\x79\xed\xa6\x10\xd0\xe8\x1b\xb8\xb3\x90\x55\x2c\xd5\x9c\x90\x2c\xf0\x28\xa1\xe8\x93\x54\x35\x62\x6f\x50\x0e\x6b\x98\x77\x6e\x8c\x4e\xa0\x9f\x12\x02\xec\x05\x38\x3f\x9a\x36\xcc\xc6\xf2\x2b\x88\x36\x26\x22\x15\x2a\x11\x04\x01\xdf\x68\x80\xcb\x15\x3b\x51\xd7\x1e\x06\x3f\xad\x30\x19\x04\xc5\xdf\xfa\x31\x3e\xaf\x04\x04\xc7\x88\x14\x04\x8b\xf2\x10\x40\xea\x07\x0b\x9b\x43\x2a\x86\x9e\xd5\x5e\xd6\x6e\x3d\x32\x7b\x9f\xe2\xfd\xcf\xcc\x10\xd9\xea\xa5\x0c\xad\x1c\x96\xb5\xfb\xb9\x79\x48\x7e\x0e\xc1\xc0\xfe\xc7\xe7\x6f\xee\xe8\x1c\xe8\xd8\x1c\xe6\xc8\xbc\x47\xec\x64\xc8\x63\x72\x88\x60\x49\x51\x8a\x99\x7c\x37\xd0\x3e\x3d\x8c\x2a\x13\x65\x2a\x94\x95\x33\x89\x6d\x80\x8b\x52\x14\x42\x81\xab\x15\x8a\x33\x9c\xec\xa7\x93\xb2\x0e\x4e\x3f\xc4\x64\x1e\x54\xb8\x87\x15\x65\x17\xeb\x94\xfd\xad\x1c\x63\x5b\x39\xd6\xf9\xfa\x44\x72\x8c\x38\xf7\xe1\x08\x31\xc8\x3c\xef\x9f\xfa\x7e\x1c\xe5\xb1\x03\x17\xf7\xaf\x1c\x6e\xa1\xc1\x05\xb9\x68\x35\x66\xae\x61\xf9\x5a\xc9\x32\x71\x2d\x32\x52\x9a\x58\xce\x15\x9f\x23\x84\xbf\xd5\x01\xf4\x47\x97\xa1\x0d\x53\x1b\xd1\x07\x94\x78\x5f\xd9\x05\x5f\x96\x3a\xcb\x44\x69\x58\x26\xaf\x04\x3b\x16\x45\xa6\x97\x39\x25\xbe\xa6\xec\xc2\x72\xeb\x58\xfa\x42\xd8\x6e\x31\xdf\x7e\x68\x20\xbe\x98\x7d\x20\xcc\x74\xac\x8e\x87\xda\x72\x56\x50\xe1\xe4\x2b\x05\x12\xe3\x10\x3a\xc2\x8c\xd8\x99\xb8\x16\xe5\x88\x9d\xce\xce\xb4\x3d\x47\xd5\xbb\x99\x6d\x87\x37\x32\x39\x63\xcf\x9c\x51\x67\x2c\xb3\xd8\x95\x23\xaa\x73\xd7\x65\x63\x80\x1a\xef\x6d\x88\xb2\xbc\xd5\x92\x73\x18\x29\x14\x9c\x77\x0a\x63\xf4\x5a\xa6\xd0\xf6\xa8\xf7\x02\x1d\x62\x19\x69\x0d\x01\x1c\xf1\x37\xc2\x33\x78\x04\x33\x30\x01\xa5\x62\xa5\x30\x85\x56\x46\x34\xe1\x19\xc3\x8c\xd0\xd4\x1d\x16\xfb\xb5\xf3\xc9\xd9\xf7\xcc\x2c\xb4\xb1\x50\x39\x3b\x4c\x33\xad\x73\x3f\x1c\x14\x22\xf3\x2c\x13\x69\xa3\x9b\x1a\x76\x01\xe2\x4d\xf7\x40\x02\x5d\x1d\xd2\xd0\x17\x04\xeb\x93\x1b\xa5\xcd\x8d\xfb\x43\x67\x3e\xdf\xfb\xc6\xb7\x65\xbe\xad\xa0\xb9\xde\x98\x70\x88\x44\x0c\xb0\x02\x14\x0d\xf0\xe1\x26\x6a\xa0\xb3\xd0\xfa\x8a\x25\x3a\x2f\x32\xd8\x3a\x3d\x76\x56\xdd\xbf\x2b\xb0\xd2\xd8\x8d\x6e\x0e\xa2\xd6\x5e\xf0\x41\xbf\xce\x5e\xbd\xb4\xb0\x21\x74\x30\xf1\x4e\x24\x83\xf5\xfe\x3c\x79\x27\x92\xa8\x79\x2d\x40\x59\x25\x1e\x18\xc2\xed\xd8\xfe\x3d\xc9\x7b\xc7\x1b\x86\xf2\xf1\xf7\xa8\xa2\x8b\xaf\x16\xfa\x1f\x8c\xe9\x51\xd2\xe9\x11\xd0\x70\x02\x0c\x21\xac\xac\x8b\xd1\x33\x02\x33\xe2\xd6\x5b\x81\x0c\x0c\x59\xd4\x7e\x2c\x68\x2d\xa5\xb5\x65\x7b\xbb\x07\xbb\xfb\x2b\xce\xc7\x16\xd4\xf6\x65\xf4\x4b\x09\x10\x91\x05\xe0\x2d\x8a\x64\x37\x1d\x31\x69\x7d\x9a\x35\xf6\x3d\x82\x59\x51\xb9\xdf\x88\x19\xcd\x6c\xc9\x53\x49\x6a\x0c\x7c\xea\x6e\xb2\x65\x45\x52\x7e\x6f\xf7\xd7\x5d\x6a\x89\x74\xa3\xd5\xae\x85\xe9\x4f\xd8\x25\xc2\xcd\x84\x81\x96\xba\x82\x4e\x9f\x48\x82\x22\x93\x89\xb4\xd9\x12\x24\x16\xd3\x15\xb6\x05\x73\xe7\x05\x95\x19\x9e\xbc\x93\xd6\x37\x25\xd1\x33\xf6\x04\xbb\x92\x09\x4e\xee\xcf\x4c\x5e\x8b\x83\x85\xe0\x99\x5d\x60\x86\x88\xd2\x6a\x8c\x8d\x25\x9d\x28\xa1\x6f\xfa\x06\x4b\xfa\xf9\x12\xe3\xab\x87\x5f\x71\x75\x42\x3d\xcd\x06\x27\x44\xbf\xed\xde\xed\x9a\xad\xa0\x7e\x5d\x5e\x9e\x7f\xdb\xe8\x77\x0d\x52\xdc\xda\xc2\xe7\xed\x44\x4d\xe1\x1f\x80\xec\x18\x26\x52\xd9\xab\xf1\x35\x1b\x50\x84\xf5\x6d\x80\xcd\xd6\xa3\xb8\xdd\xbd\xf3\x35\xfb\x87\xae\x00\x03\x84\x4f\xb3\x65\x00\x60\x30\xc2\xb2\x1d\x37\xd4\x8e\x13\x4f\x8e\x1b\xbe\x13\x3c\x45\x7c\x0c\x63\x05\xef\xa4\xba\xc5\xd7\x60\x11\xb4\x68\x6e\xc3\x9e\x03\x95\xb1\x3a\x67\x0b\x7a\xed\x66\xdd\x25\xed\x8c\x09\xec\x1e\x5f\xd4\x54\x8a\x02\x25\x1c\xfd\xe6\xb3\x93\x5f\x2b\x72\x03\xe9\xde\x68\x7e\x90\xc4\x64\x8b\x7b\xeb\x48\x85\xc4\x42\xb8\x99\x81\x64\xe9\x00\x99\x0f\x6c\xc0\xec\x07\xd6\xaf\x8a\xb3\x3d\x10\x44\xf4\xfa\x27\x7a\x0d\x96\x50\xc1\x06\x4b\x1a\x60\xeb\x3c\xac\xc4\x33\xe8\x7d\x19\x88\x88\x83\x86\xea\x59\xff\x3a\xd1\xf8\x7a\x3f\x01\x86\x59\x7c\x36\x24\x05\x8a\x01\xf2\xba\x57\xb3\xba\x11\x3d\x0a\xea\x2e\x51\xb8\x82\x98\x30\xa2\xbc\xee\x5a\xc9\x5d\x5f\xc3\xbd\xba\xee\x6e\xf1\xfb\x6b\x4d\x91\x74\xc9\x54\xe8\xa6\xed\xd1\x51\x57\x09\x12\xa5\x25\x50\xf3\x6d\xef\xcb\xf5\xc7\x11\x57\x73\xc1\x9e\xba\x5f\xfe\xe5\xcf\x7f\xfe\xe3\x9f\x27\x38\x7c\x48\x51\x50\xec\xf4\xf0\xec\xf0\x9f\x17\x3f\x1c\x41\x65\x6c\x5f\xaa\x0e\x94\x7f\x39\x74\xf6\xe5\xa0\xb9\x97\x1f\x35\xf3\x12\xea\x3d\x7a\x4b\x91\xa6\xe3\x1f\x86\x8c\x61\x42\x49\xf7\x8b\xe0\xf5\x9c\xae\xd9\x74\xa4\xba\xad\xf6\x20\xf6\x98\x4d\x8a\x0b\x9d\x5c\x0d\x68\xd7\x1c\x8b\xa2\x14\x09\xfa\xc9\x2e\x8f\xce\x71\x74\x67\x5f\x9e\xbd\xba\xac\xeb\x0c\x20\x19\xa7\xc6\xd0\xfb\x8e\x3c\x69\xce\x26\xbd\x12\x85\x0d\xa6\xfb\x94\x27\x57\x37\xbc\x4c\xc1\xb3\xc5\xad\x9c\xca\x4c\x5a\x84\xfc\x2b\x05\xb5\xbf\xc2\x6c\x3f\xc4\x36\xf3\xed\x85\x51\x96\xa3\x03\xc1\xbb\x43\xc1\x65\x85\x49\x34\x33\x2e\x33\xf0\xa0\x52\x67\x5f\x4c\x07\x4a\x8a\xe0\xd2\x8b\x7d\xda\x5b\xe3\xcb\x5f\x0f\xd6\xf8\x8a\x3a\x0f\xdf\xd7\x0e\xeb\x9b\x94\xf8\x80\x8f\x3a\x3a\xe2\xca\x46\x13\xf0\xed\x51\x37\xc0\x78\x0f\xf7\xa8\x2b\x4a\x71\x61\x75\xa7\x4e\x02\x6c\x35\x4a\x82\x83\xdd\x12\x23\x99\x8a\x99\x76\x42\xf8\xd6\xa0\x47\x5a\xc1\x26\xe4\x0a\x2a\x03\xbd\x57\x4b\x37\x02\x1b\x98\x8e\xe9\xdb\x6e\x67\x84\x97\x7a\x60\x62\x90\x54\xdf\x43\x79\xe4\xde\x4e\xe4\x30\xbb\x51\x5d\xe2\x40\x1d\x9c\xe1\x43\x61\x13\xf4\xdc\x46\x82\x1c\x00\x43\x69\xfa\xed\x30\x4a\x52\x72\xb3\xc0\xee\xc6\xe2\x9d\xf4\x6d\xee\xcf\x75\xda\xee\x49\x3e\x2f\x79\x22\x58\x21\x4a\xa9\xdd\x61\x54\x29\x9b\xea\x1b\xc5\xa6\x62\x2e\x95\xf1\xa4\x00\x0c\x76\xa2\x19\xc4\x63\xa4\x09\x90\x70\x13\xf6\xba\x81\x74\x42\x35\x48\x89\xae\xb7\x26\xcd\xb9\x1d\x49\x82\x13\x0b\xe8\x84\x2d\x7f\x02\x85\xe3\x2e\x48\x1f\x9a\xf2\x5e\xa5\xe0\xc9\xa9\xc8\xf8\x12\x53\x4d\xa1\xf3\xb9\xfc\x8f\x28\xcd\xfe\x00\x11\x27\xec\xe3\xe5\xbf\xbb\x75\x1e\xd2\xb0\x52\xf0\x64\xd1\x2f\xf8\xbb\x0d\x51\xdd\xf1\xda\x86\xa8\xfa\x0c\xb2\x0d\x51\x6d\x43\x54\x1f\xb8\xb6\x21\xaa\x6d\x88\xaa\x75\x3d\x58\x2b\x69\x1b\xa2\xea\x7c\x6d\x43\x54\xef\xbf\xb6\x21\xaa\x3b\x5c\xdb\x10\xd5\x1d\xaf\x6d\x88\x6a\x1b\xa2\xda\x86\xa8\xb6\x21\xaa\xdf\x90\xdf\xce\x5f\xdb\x10\xd5\xca\x20\xdb\x10\xd5\x36\x44\x75\xe7\xeb\xc1\x1a\x5f\xdb\x10\x15\x5e\xdb\x10\x55\xf3\xfa\x6d\x1d\x75\x3e\xc0\x73\xee\x4c\xbd\xfe\x35\x6d\xe7\x10\x54\x90\x09\xc5\x89\xf4\xac\x51\x07\x85\x8f\x9a\xd4\x0d\x2a\x22\x4c\x10\x5f\x8a\x43\x11\xa1\x3a\xce\xb4\xb6\x5e\xaa\x67\xfb\xb8\x42\xa7\x75\xa0\x22\x8a\x50\xa0\xc1\xdb\xbd\x66\x6d\x63\xd5\x58\x7d\xc2\x12\x9f\x26\x24\xf1\x40\xe2\x37\x03\x84\x21\xb6\x21\x88\xcf\x2e\x04\x31\x8c\xfb\x6e\x00\xd7\x5d\xef\xa3\x82\x22\xf3\x97\x8b\x52\x98\x85\xce\x3a\x33\x7a\x83\xc9\x5f\x4a\x25\xf3\x2a\x87\x06\xb1\x8e\x9f\xe5\x75\x48\x01\x08\x5d\xb0\x49\x62\xa3\x17\x31\xea\x24\xeb\x3b\xc8\x42\xfd\xe6\x82\x5f\x43\x57\xd4\x2a\x49\x84\x48\xa3\xde\xf6\xa0\x61\xfd\x71\x12\x9e\x14\xfa\x66\x3c\xed\x27\x6f\xfa\x1d\xe2\x88\x45\x0a\xa3\xfc\xf1\xcb\x4e\x63\xcc\xcb\x62\x18\xb9\xfc\xed\xeb\xf3\xa3\x48\x2e\x73\xe5\xc5\xb2\x54\xd7\x3a\x03\xaa\x72\xbc\xc9\x29\x6b\x13\xac\xdf\xc7\x76\xeb\x3c\x2b\x16\x3c\xb2\x6e\xc8\x30\x30\x4c\x28\x3e\x85\xd6\xb4\xee\x77\xe1\x4c\x3e\xc7\x93\x57\x70\x5b\x95\x82\xcd\xb9\xdd\xa4\xc8\xef\x6f\xc4\xf4\x32\x60\x86\x38\x71\xfa\xea\xe8\x4d\x2f\x9c\xd3\xc4\x9b\x7e\xa8\x39\x70\x06\x02\xe8\xdf\x59\x13\xef\x2d\x2b\xfb\x6b\xc7\xfd\x37\x17\x03\x84\x1b\x78\xf1\xc1\x08\xbc\x73\x41\x9d\xa3\xe8\x40\x8f\xcd\x20\xdf\x54\xca\x6a\x56\x64\xbc\x6e\x0b\x05\x2b\xf0\x1d\x9c\x42\x47\x0b\x91\x5c\xbd\xa6\x58\xec\x9e\x11\x22\x68\xa7\x73\x69\x17\xd5\x74\x92\xe8\xfc\xc0\x09\x05\xfc\xbf\x69\xa6\xa7\x07\x39\x37\x56\x94\x4e\x61\xa5\x43\x6e\x9c\xb8\x51\xa4\x9a\x4f\xf2\x74\x7f\xc2\xde\x2a\xac\x6f\xaf\xdb\x50\x46\xe8\x0e\xee\xf9\x1e\x69\x63\x2a\x9c\x7c\xd5\xe0\x89\x88\x10\xec\xdc\xf4\x26\x7d\x70\x92\x7b\x1f\x4a\x3d\xe3\xe0\x9f\x3e\x06\xbe\x95\x5c\x6c\x00\x97\xcb\x63\x8b\x75\x0f\x96\xf3\x31\x40\x8c\xfb\x01\xc5\xb7\x1f\x8c\x72\xfc\x50\x62\xda\x0f\x10\x6c\x7a\x80\x10\xec\x10\x31\xec\xe1\xe2\xd7\x1f\x01\x93\xf9\xe3\xc4\xad\x07\x74\xee\x0d\x14\xaf\xfe\x14\xb1\xea\x41\xde\xba\x6f\x8c\xfa\xd3\xc5\xa7\x87\x79\xdd\x21\x0d\x81\xc7\x1a\x93\x1e\xc0\x49\x3f\xa4\x83\x7e\x30\xe7\xfc\x47\x8b\x41\xf7\x8f\x3f\x3f\x80\xd8\x73\x6f\x22\x4b\x25\xad\xe4\xd9\xb1\xc8\xf8\xf2\x42\x24\x5a\xa5\x9d\x4f\x98\x16\x48\x67\xd8\x3f\x06\x87\x25\x4f\x55\xb3\xd4\x62\xc1\x09\x8b\xdc\x59\x54\x58\x5a\xe2\xa3\x19\xa4\x50\x40\x5c\x19\x67\xf9\x20\xe3\x13\xec\xc1\xb8\xc4\xb0\xee\x64\xc8\x45\xfc\x4e\xdf\x30\x3d\xb3\x42\xb1\x3d\xa9\xfc\x3a\xee\x47\x66\x60\xed\x9f\x0c\x6c\xed\xbe\x7d\xfa\xc4\xdf\xfc\xf9\x39\x1e\xc1\xc5\x6a\xcc\xc7\xf7\x03\xd3\x83\x3e\xec\x08\xa6\x1b\x67\x55\xd6\x74\x06\xa3\x83\xb8\x29\x6f\x9e\xd6\x68\xca\x4f\x61\xdc\xb0\xdb\xb8\x4a\x19\xd5\xa2\x7d\x7e\x8b\xd6\x3b\xb3\xa6\xa9\xfa\x85\x4c\x9a\x0f\xf9\x8d\x2f\x8f\xce\xd1\x6d\xbc\x75\x97\x3c\x14\x77\xc9\x86\xb2\x53\x1e\xa0\xa2\xfb\x48\x33\x52\xb6\x8a\xee\x3d\xae\xa8\x3a\xf5\xdb\x92\x27\xe2\x7c\x70\x1d\xc1\x6f\x27\x96\x56\x25\x27\x01\x18\x54\x3e\xbf\x79\x94\x10\x29\xee\xa6\x50\xd1\x0b\xb5\xb2\xb3\x2a\xcb\x96\xac\x2a\xb4\x6a\xd6\x3f\x63\xb4\xbd\x5d\x4e\x0b\x2e\xf9\x35\x4f\xa9\x15\xcb\xa2\xd4\x74\x66\x96\x95\x52\x4e\x06\xd7\x2d\xd1\x40\x91\x04\xa0\x66\xde\x28\xda\x35\x72\xee\xa6\xef\xce\x3f\xa8\xe7\xad\x53\x10\x1b\x03\xba\x5f\xcf\x74\x99\xc8\x69\xb6\x64\x0b\x9e\x85\xfe\x37\x9c\x5d\xc9\x2c\xa3\x61\x26\xec\x42\x58\x0c\x29\xe0\xd9\x99\x69\x35\x87\xc9\x71\xe5\xfb\x2e\x8a\xc4\xfd\x36\xc9\x04\x57\x55\x81\xcf\x73\x27\xf1\x52\x57\xa5\x7f\xde\x24\x04\x26\xc2\x09\xac\x64\x36\x8a\xba\xbb\xbd\x77\x61\x43\xf6\x4f\x65\x9c\x02\xf0\xca\x03\x53\x8f\xe2\x31\x3d\x76\xb8\x89\x7a\xfb\x14\xa5\xbe\x96\x29\x46\x37\x3c\xd9\xa0\x8f\x34\xf6\xef\x09\xfb\x59\x69\x35\x56\x62\xce\x41\x51\xa1\x5d\x84\x6b\x86\xe3\x60\x0e\x81\x4a\xa1\xa3\x8f\xd3\xf0\x75\xd1\x28\xa8\xbf\x96\xd8\x8b\x38\xa2\x1c\xdb\x53\x9a\x69\xc8\x48\xad\x94\xb4\xd8\xdf\x7e\x51\x59\x96\xea\x1b\xb5\x1f\xc5\x5d\xd9\x54\xd8\xf7\x47\x5d\x21\xd0\x7a\xb9\x96\x40\xcd\xf0\xeb\x3a\x3d\x07\xdf\xf7\xfd\xe4\x95\x86\x5c\x9f\x33\x56\x29\x23\x7a\x1e\xef\x83\x29\x47\x7f\xf9\x53\x37\x19\x21\x73\xa1\x2b\xfb\x49\xac\xbf\x9b\x85\x4c\x16\xb1\x32\x2b\x73\x61\x98\xae\x5a\x66\xf1\x53\xfa\xd9\xfa\x15\xda\x9a\x80\xeb\xae\xae\x8e\xdd\x35\xde\xaf\x36\x20\x42\xdd\xf8\x1a\x32\xc5\x8f\xcf\x2e\xfe\xf9\xe2\xf0\xef\x27\x2f\x26\xec\x84\x27\x8b\x18\x15\x43\x31\x0e\x42\x03\x04\xc5\x82\x5f\x0b\xc6\x59\xa5\xe4\x2f\x15\x05\x7c\xf7\xc2\x6f\xf7\x07\x45\x6b\xef\x78\xfa\x42\x73\xfe\xc1\xba\xc1\x61\xab\x7f\xcc\xcc\xd2\x46\x40\xff\x96\xb6\xfa\x74\xe2\xbe\x42\xe3\x00\x54\x2d\x48\x9d\x9f\xcb\x6b\x12\xc3\x04\x7f\xcf\xd3\x90\x2b\xe6\xf8\xdc\xb1\x85\x3b\xaa\xf8\x14\x72\xbc\x16\x82\x29\x61\x1d\x5b\x07\x1f\x93\x56\xa6\x01\x4f\x52\x19\x61\x46\x6c\x5a\x41\x56\x5a\x51\xca\x9c\x97\x32\x5b\xc6\x83\xb9\xb3\xea\x2c\x84\xbc\x97\xed\x29\x1d\xbf\x3a\xb9\x80\x2a\x81\xa2\x44\xe0\x12\x48\x2b\x83\xef\xe1\xb5\xa6\xc2\xfd\x82\xba\x08\x4f\xd8\xa1\x5a\xe2\x97\xb8\xc1\xa5\x61\x99\x34\x56\xc0\x11\x4c\x3a\xa4\x0f\xa6\xef\x3c\x99\xc0\xff\x76\xdc\x5b\x96\x4e\xc9\x0c\xd9\x72\xc9\x4a\xfa\x2a\xaa\xa1\x72\x9a\x45\xd4\xa4\x77\xff\xac\xfa\xc1\xd5\x49\x42\x8e\x88\x51\x3f\x38\x1e\x96\x1a\xc8\x8b\xfd\x01\xa5\x9a\x67\x31\x57\x75\x13\xfb\x7d\x6d\xcb\xbe\x96\xe5\xb8\x7e\x83\xf3\xae\x06\xe6\x20\x7d\xe9\xea\x39\x0c\xd4\xcd\xa9\x3e\xfd\xbc\x39\x45\x12\x41\xc7\x0d\x7a\x4f\xcf\xfd\x0e\x20\xed\x26\x6f\x75\x75\x2d\xea\x9c\xa4\x11\x7b\xc2\xbe\x66\xef\xd8\xd7\x60\x5e\xfd\xa5\x6f\xef\xab\xbe\x86\xcf\x10\x29\x46\xce\xaa\x3f\x3d\x1f\x88\xe2\x3f\x3a\xe9\xe4\x46\x74\x54\xb5\x9a\x4d\x25\xa9\xf3\xe2\x9d\x15\xa5\x93\xa3\xb4\x12\x1b\xed\x1a\xe6\x26\xf8\x09\xd9\x0c\xc3\x0d\xa7\xb3\x66\x5a\xd3\xfd\x18\xcd\xfd\xfc\x3b\x6d\xec\x19\x49\xa1\x66\x0b\x9c\x7a\xb4\x9c\xdb\x64\xd1\x14\x63\x4e\x51\x33\xb6\xde\x60\x86\xa5\x1a\xb2\xac\x30\x81\x79\x21\x7b\x24\x4f\x3c\x1c\x36\xee\x17\x4f\x6f\xac\xe7\xfb\x56\xaa\xe5\x40\x01\xcb\x87\x14\xab\x08\x1b\xab\xd0\x29\xe9\x64\x6e\x5a\x69\x74\x66\xbc\x47\x29\x23\x5f\x4d\xf0\x32\x03\x2f\xb9\xfd\x94\x70\x85\x25\x24\x33\x51\x96\x98\x73\x3e\x5d\xfa\x64\xbd\xde\x8b\xd7\x6b\x27\x15\xa5\xb6\x3a\xd1\x3d\x1a\x9b\x35\x63\xdc\x34\x1c\x10\x01\xf3\x7c\xbd\x9b\xfc\xcd\xf1\xf9\x88\x5d\x1e\x9d\x43\xbf\xa7\x8b\xa3\xcb\xf3\xa6\xa5\xb2\x73\x79\x74\xbe\xb3\x51\x52\x30\xaf\x59\x81\x63\xba\xc3\x20\x0d\xc7\x93\x53\xdb\xc6\x39\x2f\xc6\x57\x62\xd9\xf1\x4c\x1d\xe2\x5c\x1f\x87\x15\x1e\xe4\x85\x90\xcc\x39\x2f\xee\x3d\x5a\x29\x78\x2a\x3f\x51\x1d\x97\x4f\x83\x0d\xcf\x5c\x5f\xd0\x95\xeb\x6b\x91\xa2\x3a\xec\x7f\x21\x54\x5a\x68\xe9\xf4\xc5\x6d\x95\xd7\xfd\x7f\xbd\xad\xf2\xba\xf3\xb5\xad\xf2\xda\x56\x79\xad\x5e\x0f\x26\x91\x75\x5b\xe5\xf5\x79\xc5\xed\xb7\x55\x5e\xbf\xf9\xe0\xff\xb6\xca\x6b\xfd\xb5\xad\xf2\xda\x56\x79\xdd\xed\xda\x56\x79\xdd\xff\x7a\x70\x69\x4b\xdb\x2a\xaf\x7b\x5d\xdb\x2a\xaf\xd5\x6b\x5b\xe5\x75\xcb\xb5\xad\xf2\xba\xe5\xda\x56\x79\x6d\xab\xbc\xb6\x55\x5e\xdb\xe4\xd7\x0f\x8e\xf5\x30\x93\x5f\xd9\xb6\xca\x8b\xae\x6d\x95\xd7\x67\x91\xe2\xc7\xb6\x55\x5e\x77\xba\xb6\x55\x5e\xdb\x2a\xaf\x2e\xd7\xb6\xca\xeb\x73\x71\x97\x6c\xab\xbc\xb6\x55\x5e\xbf\x1d\x45\x77\x5b\xe5\xb5\xad\xf2\xda\x56\x79\x6d\xab\xbc\xde\x3b\x8b\x6d\x95\xd7\xe7\x60\x02\xfa\x5e\xc0\xfd\xab\x96\x76\x8f\x74\x5e\x54\x56\xb0\xd7\x7e\xc8\xa0\x45\xa2\x60\x90\x26\xd6\x08\xfa\x27\x11\x26\x5a\xcd\xe4\x9c\x24\xfb\x01\x36\xe0\x1d\x87\xf7\x19\x47\x4d\x6f\x1f\x61\x06\x61\x26\x73\xd9\xad\x94\x8c\xad\x2c\xcc\x0b\x18\x2b\x8a\xcb\xb8\x9d\x94\xf3\x77\xb0\x45\x78\xae\x2b\x6c\x5a\x9c\xd0\xfa\x05\x12\x62\xf4\xea\xc1\xad\x0c\x1b\xc6\xc4\xa9\x6b\xe2\xce\x87\x48\x2b\xe1\xd6\x8a\x52\x3d\x63\xff\xbd\xf7\xf6\x8b\x5f\xc7\xfb\xdf\xec\xed\xfd\xf4\x64\xfc\xd7\x9f\xbf\xd8\x7b\x3b\x81\x7f\xfc\x61\xff\x9b\xfd\x5f\xfd\x1f\x5f\xec\xef\xef\xed\xfd\xf4\xfd\xcb\x6f\x2f\xcf\x4f\x7e\x96\xfb\xbf\xfe\xa4\xaa\xfc\x0a\xff\xfa\x75\xef\x27\x71\xf2\xf3\x1d\x07\xd9\xdf\xff\xe6\xf7\x9d\xa7\xdc\x5b\x25\x1e\x4e\x21\x1e\x48\x1d\xfe\x28\xca\x30\x05\x74\x07\xda\x8b\x94\x8c\xb2\xb2\x1b\xe9\xc0\x7a\xdf\x6e\xf4\xd2\x14\xd4\xbc\x30\x8e\x34\x4c\xe7\xd2\x3a\xe5\xd0\xe9\x83\x3c\x4e\x68\x95\xb6\x61\x94\x92\x1c\x80\x94\x6e\x6e\xb1\xc5\x7a\x48\x06\x8d\x92\x58\xb4\xd7\xfc\xa8\x07\xbd\xcc\x8b\x0c\x5a\x9b\xc3\x7e\x1e\xfb\x5c\x16\x38\x5c\xb7\xb2\xe1\xc3\xd7\x56\x36\x7c\x8e\xb2\xc1\x88\xa4\x2a\xa5\x5d\x1e\x69\x65\xc5\xbb\x4e\x1e\x96\xa6\x68\xb8\x68\x0e\x48\x39\x63\x54\xc7\x4d\xdf\x31\x5d\x60\xe6\x77\xab\xa0\x7e\xa1\xab\x2c\x85\x72\x8e\x4a\x81\x81\x89\x75\x7a\xc2\xa2\xf5\x07\x76\x0f\x24\x73\xb7\x1f\xe2\xed\x39\x34\x33\x7f\xa9\xe4\x35\xcf\x9c\xb5\x5b\xff\xe2\x1c\x2c\x98\xf8\x47\x77\xdd\xf3\x96\x9b\xab\x7a\xc3\x8b\xb1\xd3\xa1\xc3\x9c\x0f\xfc\x2b\xc1\x47\xe2\x9d\x7d\x8c\x5a\x1a\x28\x48\xe7\xa5\xbc\x96\x99\x98\x8b\x13\x93\xf0\x0c\xe4\xda\x30\x67\xc5\xe1\x2d\xa3\xc3\xc2\x97\x3a\x33\xec\x66\x21\x9c\xac\x66\xdc\xbb\x00\xa0\xc6\x6e\xce\xa5\x62\xb9\x5b\xa2\xc2\xff\xd8\xa0\x2f\xc1\x89\xff\x82\x97\x6e\x81\x83\xcf\x00\x4c\xe4\xa9\xd6\x19\xd5\x3c\x64\xcb\x7a\x7c\xaa\xfe\x51\xfa\x9f\x4a\xdc\xfc\xd3\x8d\x66\xd8\x2c\xe3\xf3\xe0\x2a\x30\xc2\xae\x78\xfb\xea\xa1\x6f\x7d\x01\x28\x28\xa8\x04\xe3\xd9\x0d\x5f\x9a\xda\x71\x12\x21\x3f\x98\x67\xec\xe9\x3e\xb0\x33\x37\x2c\x8c\x91\xb2\x2f\xf7\x21\xfc\x77\x74\x78\xfe\xcf\x8b\x7f\x5c\xfc\xf3\xf0\xf8\xe5\xe9\x19\x3b\xd3\x56\xe0\xa1\x16\x35\x08\x4c\x82\x85\xe1\x66\x09\xcf\x00\x2b\x5d\x9b\x09\xf8\x2e\xa5\x61\x37\x52\xa5\xfa\xc6\x74\xf6\xd1\x22\xfb\x39\xe2\x09\xae\x3a\x8d\x91\xf0\x82\x43\xdf\xc3\x1e\x27\xcc\x4a\x86\x49\x3c\x28\x9c\xe1\x69\x7a\x90\x96\xba\x40\x22\x78\x27\x57\x7d\xd4\x36\xcd\xe8\x38\x87\x15\xd6\x77\xd6\x1c\x70\x5e\x72\x65\x6b\x6f\x4f\xbd\x66\xd4\x70\x71\xd2\x7b\x39\x1e\x77\x4d\x13\x4f\x87\xab\x67\x3a\x4c\x53\x91\x36\xc8\xff\xd9\x65\x0e\x1e\xf9\x97\x5b\xd6\x38\x15\xec\xfc\xd5\xc5\xe9\xff\xdb\xe2\xe3\x65\xd1\x2f\x51\x6a\x98\xda\xd8\x52\x17\x83\xad\xee\x6b\xaa\xbd\xdc\xae\xef\x83\x58\xdf\x70\x5a\x0e\x13\x9e\x7f\x5d\xa9\x26\x94\x51\x3d\x3e\xcb\x75\x2a\x26\xec\x3c\xc4\x09\x9a\xdf\x46\x10\x07\xbc\x14\xcc\xdd\xa2\xac\xe4\x59\xb6\x8c\x55\x34\xab\xb1\x0e\xb1\x81\xce\x10\x0b\xf2\x19\xcf\xcc\xa6\xa5\x71\x9f\xb3\xd1\xe9\x11\x2f\x9d\x3d\x3c\xc8\x72\x84\xd1\x58\x2a\x94\xb6\xa4\x58\xbb\x59\x02\xe2\x45\xa9\x13\x86\xc6\x77\x94\x8c\xd5\x38\xdf\x0c\xc6\x2a\xfc\xd1\x28\x8d\x27\xf6\x79\x18\x19\x1d\xd5\x95\x11\x6d\x05\xdd\xf7\x22\x0e\xe6\xb8\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\xe6\x25\xe6\x52\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x2a\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x2c\x01\x2a\x19\x66\x78\x40\x38\x43\xa4\x1b\x5e\xf5\x1e\x9b\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x21\xed\x20\x1c\xf0\x23\x69\xcb\x4d\x57\x34\xa8\x93\x1c\x9e\x3b\x86\xd5\x80\x4d\x15\xd7\xf0\x1e\xd7\x2b\xfe\xd8\xb7\x54\x59\xa9\x43\xf3\x6d\xa9\xab\xce\x87\xd8\x8a\xb2\xf9\xed\xe9\x31\x88\xa2\x8a\x42\x95\xca\x96\x4b\x00\x0f\x58\xc5\x7d\x0b\x86\xc1\x1b\x0a\xb6\xc6\x7b\xa2\x8e\x8b\xb1\x97\x7c\xc9\x78\x66\xb4\xa7\xa5\x54\x6b\xad\x50\x32\x71\xdd\xd7\x53\x6d\x17\x2b\xb6\xad\xdb\x50\xab\xbf\x1b\x45\x91\xcb\x1a\x88\x4e\xaa\x95\x9f\x5b\x7e\x25\x0c\x2b\x4a\x91\x88\x54\xa8\x64\xd3\xcb\xbe\xe9\x80\x1f\xb0\xce\x99\x56\x6e\x63\x0e\xc2\x3c\xa7\x21\xd2\x4b\x24\x8d\x59\x05\x62\xc6\x64\xfd\x71\x88\x1c\xc3\xb6\xac\x8c\x28\x31\xcc\x5d\x56\x02\x57\xf2\xfb\x6a\x2a\x32\x47\x79\x67\x92\x52\xb7\x78\x74\x67\xc8\x9c\xcf\x05\xe3\x36\x70\x9a\xd5\x4c\x28\xe3\x24\x26\x3a\x40\x2d\x4b\xb5\xa8\xeb\xef\xb9\x61\x6f\x4e\x8f\xd9\x13\xb6\xe7\x9e\xb5\x0f\xfc\x03\xcd\xe4\xad\xc6\x24\xb7\xb6\x8d\x3a\xf3\x43\xc0\x94\x80\x79\x99\x2e\x51\x48\x8c\x98\xd2\xcc\x54\xc9\x22\xee\x60\xef\xcd\x66\x4a\x84\x84\xd0\xca\xc3\xe4\xf5\xcd\x4a\xa8\x37\x46\x94\x83\x09\xa8\x37\x1d\x04\x54\xac\x46\x39\x9e\x6b\x52\x0f\x19\x2b\x17\x96\xa7\xdc\x72\x12\x5c\xfe\x86\x07\xbb\xa4\xbf\x6d\xf1\x65\xc4\x0b\xa9\xaa\x77\x98\x78\x34\x9c\xab\xe5\xe2\x04\x86\x65\x89\xa7\x3a\xac\x3a\x2f\x8a\x4c\x22\xde\x46\x2b\x11\xee\xb4\xc1\x2b\xa3\x5b\xd4\x44\x90\x13\x3c\xcb\xb4\x93\x8f\x4e\x39\xe1\x2a\xd5\xf9\xca\xc3\x9c\x12\x29\x1a\x88\xa9\x13\xb6\xe5\xbe\xe6\xf5\x40\x9c\x42\x99\xb8\x16\x3d\xd0\xc5\xda\x08\xb1\x6e\x34\x47\x1c\xcf\x11\x30\x3c\xcb\xf8\x54\x64\x48\x63\xe4\x40\xb3\xca\x81\x9b\xce\x46\x2d\x75\x36\x5c\xf9\xcc\x6b\x9d\x09\x4c\xef\xf2\x84\x70\xc3\x3f\x0a\x3a\xc0\x20\x43\xd1\x01\xac\xc1\x06\x1d\xc0\xae\x7d\x0c\x74\xa8\x7a\x1c\xf5\xac\x4d\x07\xa7\x37\x34\xe9\x00\x87\xf7\x43\xa7\x83\x11\x49\xa2\xf3\xe2\xbc\xd4\xce\xec\x1c\xec\x6c\xa2\x61\xeb\x98\x21\x3a\x36\xd6\x24\x63\xc1\x59\xd0\xbc\x99\x97\x51\x62\x27\xb7\x78\x48\xf8\xec\xce\xff\x11\x9d\x59\x20\x7a\xda\x07\x99\x1f\xa5\x11\x5e\x74\xbf\xa4\x2f\x1e\xf3\x71\x30\x44\x6d\x44\x0f\x67\xe7\x20\xa7\x91\x4e\x78\x06\xe8\xb1\xfd\x58\x8e\xb5\xd9\xae\x3d\x70\x94\xce\x0b\x31\x4a\xf8\xcc\x27\x90\x00\x90\x28\x7c\x42\x2e\x4c\xa5\x53\x11\xc5\xb2\x31\x0f\xf9\x12\xd3\x3e\xe1\x3e\x9f\x49\xec\xf4\x0a\x1f\x56\x4e\x1b\xbf\xb6\x9a\x30\xd0\x5e\x06\x4c\x5a\x37\x41\xa1\x52\xa9\xe6\xe0\x57\x1b\xb1\x52\x64\x98\x83\x4c\x42\xe0\x0a\x2d\xc8\x5d\xd8\x12\x7e\x50\xbf\x1f\xfc\xa3\x41\x17\x93\x5a\xd1\xc8\xe0\x29\xf2\x1a\xd6\x0c\xc5\xad\x34\x6c\xe7\x85\x27\x40\x0f\x10\xcf\x87\x78\xc2\xec\xe0\x1b\x86\xd5\x44\x4f\xe7\x95\x54\x29\xa5\xeb\x36\x88\x15\xe0\xd6\x51\x0f\x86\x44\x70\x99\xc6\xb2\xe5\x19\x7b\xab\x58\x20\x16\x1b\x77\x66\x8f\xd7\xa8\x32\x7b\x1f\xdd\xf8\xfd\x8e\xd7\xf0\x90\xf6\x30\x6f\x14\xac\xbd\x7b\xee\xd8\x59\xee\xab\xf7\xf9\x77\xd9\x28\x74\x0f\x49\xbf\xa1\xad\x98\x1f\x71\x58\xaf\xd2\x27\x8e\xad\xad\x54\x73\x13\x5b\x32\x3c\xcb\x1a\xce\xf0\x75\xa6\x8c\x5f\xe1\x00\xae\xbf\x6a\x42\xb4\xca\x0c\x1e\x8b\x19\x92\x39\x75\xe2\x91\x1b\x21\xf3\xdc\xf0\xa3\xd2\x51\xc2\x4a\x9e\x5d\x14\xdd\x41\x4a\xd9\x0a\x20\xde\xcb\x8b\xc3\xe6\xd0\x70\x58\x43\xef\x07\xb7\x56\xee\x7b\xc6\xd3\x5c\x1a\x03\x8e\x30\x31\x5d\x68\x7d\xc5\xf6\xd6\xe0\x71\x45\x79\x5a\x46\xce\xcd\x01\xf1\xfc\xd8\xcd\x7e\x9f\x49\x95\x85\xac\x28\xb0\x83\x95\x35\xde\x91\x03\x0f\x49\xc2\x2c\x60\x0d\x09\xb9\x9a\x92\x15\x56\xa7\x89\x58\xd5\x8e\x0b\x36\x2e\xb0\x57\x97\xe7\xac\x27\xec\xca\x07\x96\xe8\x8c\x78\xbb\x8d\xac\xb6\x96\x8e\xa8\x3d\x6e\x9c\x48\xa4\x5c\x24\xc2\x0c\x07\xe8\xf4\x5d\x3d\x26\x4b\x05\x56\xf1\x08\xc8\x7e\xe2\xb7\x26\xd9\x81\x5f\x7a\x17\x8a\x41\xe9\xa7\xbb\xb1\x46\x7d\x59\x0b\x17\x67\x8f\x64\xc5\x82\x8f\xd1\x48\x77\x12\x0d\x44\xa0\x57\x21\x16\x5a\x69\x2a\x92\x70\x87\xa8\x56\xc0\xd2\x20\xa2\x30\x9a\x07\x6b\x42\x22\x3a\x9a\xea\x51\x1d\x25\x8e\x03\x81\x50\x4c\x86\xf8\x11\xf5\x1c\x6e\xa4\x5d\xf8\x5e\x2f\x8d\xa8\x21\xcc\xa4\x14\x06\x02\x30\x8a\x89\xb2\xd4\x25\x25\x64\x79\xbf\x35\x8c\x04\x92\x1c\x32\xba\x1c\x93\x70\xf7\xd7\xae\x89\x03\xd5\x35\x18\x3c\xe4\x2b\x3a\x6e\x12\xb3\x99\x48\x40\xd1\x8a\x09\x8c\x52\x7b\xaf\x86\xbe\xa5\x2a\x03\xc7\x60\x04\x26\x9f\xcb\x77\xee\x29\xf1\xaf\xe2\x90\x38\x41\xce\xae\xff\x7a\x7f\xc2\xd8\xa9\x0a\x19\xbc\x23\xb7\x8a\xf1\x9d\x3e\xf5\xcc\xba\x57\x8c\x3b\x11\xc0\x0b\xc4\x8e\x33\xa7\x1d\x96\xd5\x00\x1c\xdf\xc7\x1d\xce\x62\x97\xf8\xa0\xe2\x00\x5c\xe3\x34\xa8\x5b\x7a\xaf\x03\xf4\x71\x95\xbb\x5b\x3e\x96\xbb\xfc\x71\x04\x40\x58\x5f\x39\x47\x68\x0a\x03\xc1\xc3\x5f\x44\xa3\x45\xda\x7b\x08\xb8\x9d\xeb\x14\xd1\x54\x02\x1a\x04\x74\x75\x02\x74\x17\xf9\x1f\xaf\x9f\xd5\x3a\x9e\xd2\x58\x1d\x10\xc3\xac\x10\xa8\x76\xca\x9c\xaa\x9d\x79\xdf\x42\x5e\x64\x02\xaa\x38\xa3\x91\xeb\x02\xd5\x08\x4f\x7e\x14\x26\x52\x43\xd2\x13\xb8\xcb\x88\xfd\x1b\x36\x65\x48\x44\xf5\xb8\x13\xe7\xe1\xe7\x68\x21\x4a\xe3\x9b\x4b\x40\x85\xa5\xd5\xde\x75\xc1\x52\x39\x9b\x09\x9f\xf0\xea\x2c\x47\x5e\xf2\xdc\x89\x78\xc3\x88\x04\x53\x31\x97\x98\x10\x19\x04\xdb\xae\x53\xf7\xa8\xd6\x6f\x84\xc2\x50\x5a\x96\xcb\xf9\x02\x19\x85\x71\xa8\xd0\x65\x3e\xa8\x98\x69\x9e\x32\xe0\x6d\x5d\xb2\x1b\x5e\xe6\xee\xdc\xe0\xc9\x02\x22\x94\x5c\xb1\xb4\x2a\x01\x67\xd9\x0a\x9e\x2e\xc7\xc6\x72\xeb\x34\x65\x51\x92\x41\xe9\xe7\xbf\x05\xd5\x7f\xef\xb5\x05\xd5\xbf\xe3\xb5\x05\xd5\xdf\x82\xea\xaf\x5e\x0f\x26\x3b\x74\x0b\xaa\xff\x79\xc1\x24\x6d\x41\xf5\x37\x1f\x4f\xd8\x82\xea\x6f\x41\xf5\xdf\x77\x6d\x41\xf5\x3f\x70\x6d\x41\xf5\x3b\x5c\x9f\x81\xe4\xda\x82\xea\x77\xb8\xb6\xa0\xfa\xeb\xaf\x2d\xa8\xfe\xea\xb5\x05\xd5\xbf\xf5\xda\x82\xea\x77\xbe\xb6\xa0\xfa\x5b\x50\xfd\x2d\xd6\xe8\xfd\xc6\x7a\x98\x58\xa3\x6c\x0b\xaa\x4f\xd7\x16\x54\xff\xb3\x40\x54\x64\x5b\x50\xfd\x3b\x5d\x5b\x50\xfd\x2d\xa8\x7e\x97\x6b\x0b\xaa\xff\xb9\xb8\x4b\xb6\xa0\xfa\x5b\x50\xfd\xdf\x8e\xa2\xbb\x05\xd5\xdf\x82\xea\x6f\x41\xf5\xb7\xa0\xfa\xef\x9d\xc5\x16\x54\xff\x73\x30\x01\x8d\x4d\x65\x27\x0c\xd0\xbb\xc0\x15\x51\x1a\x7a\x84\x0e\x30\xad\x66\x33\x51\x82\xe4\x82\x27\xaf\xa4\x4f\xd5\xc8\x8c\xed\x20\xab\xb0\x23\x40\x3e\xa2\x8a\x9d\x5b\x7e\x4e\x70\x04\x80\xd5\x59\xe7\x8a\x9f\xbc\x7a\xbe\x06\x1b\xa9\x73\x5e\x61\xd7\x2c\x69\x98\xf3\x2b\xd5\x2d\x3e\x7e\x0b\xc1\xd7\x55\x90\x11\xdd\x93\x4c\x1b\xca\x71\x07\x62\x25\x0b\xae\x94\xf0\xf6\x9e\xb4\xe0\x47\x99\x0a\xa1\x98\x2e\x04\x45\xa7\x39\x33\x52\xcd\x33\xc1\xb8\xb5\x3c\x59\x4c\xdc\x93\x94\x27\x76\x9d\x8f\x4e\x9f\x18\x5b\x0a\x9e\xfb\xcc\xfc\x9c\x4b\x1c\x8a\xf1\xa4\xd4\xc6\xb0\xbc\xca\xac\x2c\xc2\x60\xcc\x08\x28\xa9\xc1\x83\x2a\x10\x03\xf2\xe2\xea\x24\xf6\x51\xfd\x34\x9a\x96\x8e\xc1\xe9\xc0\xda\x1c\x01\x22\x78\x5e\xd8\x65\xc8\xe4\x15\x6c\x26\x4b\x63\x59\x92\x49\x38\xad\xe1\x89\x58\x3d\x0d\xe3\x8d\xfc\x59\xad\x68\xa6\x86\xa6\xaa\x52\x50\x5b\x0b\x6b\x30\x2f\xb6\x1e\x90\x86\x4a\xa5\x21\x35\xdf\x8c\x18\xf7\xc8\x69\x48\x68\x3f\x53\x20\xb5\x3f\x59\x70\x74\xfa\x28\x1a\x2e\x42\x8c\xad\x13\x87\x6b\x46\x87\x22\x07\xcf\x9c\xa3\x46\x3d\x47\xad\x50\x40\x9e\xde\xca\x36\x80\x05\x50\xe2\xda\xf1\x80\x48\x84\x3b\x5f\xf9\x2d\x5c\xff\xc9\x99\x3e\x3a\x14\x5f\x0a\x63\xf8\x5c\x9c\x77\x0c\x34\xdc\x66\x91\x41\xac\xa1\x5e\x18\x60\x85\x0c\xeb\x6b\xc3\x27\x75\x7e\x66\x53\x0d\x62\x39\xce\x29\x28\x3f\x37\xa5\xb4\x56\xc0\xa2\x02\xc6\x1e\xc4\x2a\xdb\x25\xf8\xbb\xad\x2c\xcf\x97\x7e\x90\xfa\xc7\x4e\xa8\xab\x14\x73\x2e\xa7\x82\x4d\x4b\x29\x66\x6c\x26\x21\x91\x13\x52\x2b\x47\x08\xb9\xc4\xd1\x0b\x60\x8c\xb3\x77\xb5\xf2\xba\xac\x9f\xd7\x84\xfd\x48\x13\xb3\x65\xa5\x12\x1e\xa1\xd9\x42\x8d\xa9\x9c\xb1\x39\xa4\x66\x92\xb6\xf8\xa7\x27\x7f\xfd\x0b\x9b\x2e\xdd\x91\x06\x9a\x95\xd5\x96\x67\xe1\x25\x33\xa1\xe6\x8e\x56\xb8\x3d\x9b\x55\x92\x81\x02\xd0\xcf\x03\x27\xfe\xf4\xcb\xab\x69\xf3\x8c\x3d\x48\xc5\xf5\x41\x44\xbf\x71\xa6\xe7\xeb\x3a\xa4\x74\x4f\xda\xee\x68\x12\xad\x61\x33\x9d\xc9\x64\xd9\x9b\xd1\x3c\xf6\x17\x5b\xe8\x1b\xd4\xf5\xd7\x70\x4f\x5d\x70\x55\xe8\xa2\xca\xd0\xe9\xfc\x3c\xd4\x17\x57\x46\xac\x56\x01\xae\xdd\x17\xe0\x26\xa5\x21\xda\xc8\xe9\x98\x91\xeb\x1f\xa9\xa9\xba\x84\x1c\x79\x01\x02\x0c\x0c\xa1\xe7\x3c\xcb\xa6\x3c\xb9\xba\xd4\x2f\xf4\xdc\xbc\x52\x27\x65\xa9\xcb\xe6\x5c\x32\xee\xa4\xe5\xa2\x52\x57\xd8\xc3\x21\x80\x24\xe8\xb9\x53\xad\x8a\xca\xfa\x52\x86\x75\x2f\x8c\x15\xf3\x5e\x08\x7b\x33\xa8\x1e\x45\xbc\x93\xb5\xad\x43\xc5\x5a\xc8\x91\xf1\xf8\x26\x66\xb6\x2f\x9f\xfc\xe9\x2b\x64\x5d\xa6\x4b\xf6\xd5\x13\xc8\xda\x36\x23\xdc\xc4\x20\xdb\xdc\x41\x91\xf3\x2c\x73\x66\x43\xcc\x94\x8e\xd0\xeb\x98\xf0\x93\xf3\xa0\xed\xcf\x6e\x77\x56\xa5\x2e\x2f\xff\x01\x7a\x94\xb4\x46\x64\xb3\x11\xd6\x25\x05\xb3\x66\x17\x0e\x86\x5d\x92\x3e\x50\x1c\xf6\x00\x14\xa0\x6b\x9d\x55\xb9\x38\x16\xd7\x72\x88\x36\x4e\x8d\xd1\xbc\xa9\x9f\x49\x03\x25\x60\xd3\x4c\x27\x57\x2c\xa5\x2f\xa3\xcc\x93\x36\x16\x78\x77\x2a\x74\xcd\xc1\xe9\x91\x7b\x73\xeb\xfb\x37\xb2\x6e\x72\x5e\x14\xa1\x4a\xa8\xe4\x37\x0d\x62\xc0\x9e\x04\xc0\x82\x9e\x88\x32\xbd\xdd\xcc\x7d\x9d\xcc\x63\x7a\x23\x27\x37\x3b\x0f\xd1\x39\xeb\xa4\xbf\x8f\xba\x9e\x7d\x77\xc7\x64\x83\x21\xea\x01\xfd\x6e\x28\xe0\xdf\x58\x57\xb2\x52\x17\x19\x4a\xeb\x02\x63\xa0\x02\xe0\xd8\x07\x44\x72\x77\x87\xeb\x00\xde\xcd\x7e\x29\x47\x0d\xba\xa8\xe0\x55\xce\xb9\x25\x85\xd0\xbb\xaf\x39\x2b\x44\x69\xa4\x71\xe7\xf2\x0f\xb0\xa1\x8e\x32\x2e\xf3\xc8\x05\xb8\x19\x22\xe0\xe6\x06\x00\xe5\xfe\x92\xf2\x5c\xa7\x34\x20\x88\x42\x04\x8f\x5e\xa3\xd6\x36\xb5\xda\x01\x0f\xd4\x4d\x8b\xca\x1f\x6a\x6a\x36\x25\xa5\xfb\x24\x88\x4a\xbc\xeb\x73\x12\x90\xf0\x7e\x8f\x55\x3e\x86\xc9\x0f\x24\x06\x40\x30\xd2\xe2\x36\x25\x61\xc3\x78\xc4\x8d\x12\xa9\xf4\x64\x07\x4e\x18\x46\xc1\xdd\x9e\xa0\x9f\xb2\xdd\x67\xbb\x1b\x15\x92\x48\xa2\x52\x17\x7c\xde\xab\x9b\x4f\x8b\x52\xed\x61\x63\xa8\x09\x67\x06\xc1\xf7\x01\x78\x0d\xee\x12\x69\x8d\xa4\x03\x38\x49\x18\x1d\xf5\x04\x26\x03\x01\x2b\xb2\x6f\xf8\x92\xf1\x52\x57\x2a\x25\xff\x52\x70\xf0\xbd\x6c\x3d\xf8\x4c\x2b\xe1\x1d\xe7\x6d\xa4\x0a\xf0\xe8\x4b\xc5\x9e\x4e\x9e\x3e\xf9\x5c\x4e\x2a\x78\xc3\xd6\x49\x75\x16\x4e\x2a\x94\x4f\x1b\x7d\x57\x8f\x79\x3f\xd0\xfb\xbe\x24\x17\x4b\x0d\x69\x2f\x3d\x60\x36\x7c\x74\x53\x4a\x2b\xa2\x2e\x7f\x7b\x60\xb8\x38\xfb\x30\xc2\x65\xd8\x5f\xd7\x4b\xa2\x27\x91\xfa\x01\x61\x98\x6a\xfa\x11\xe5\x16\x09\x28\xd8\x6e\xeb\x3c\x5c\xe6\x3d\x22\x2c\x26\xd4\xce\x0e\xdb\xc3\x3b\x77\xb1\xa4\x79\x7f\xa3\xac\x45\x44\x3b\x79\x57\xf4\x40\xd9\x6c\x55\xcf\x17\x1c\x7c\x70\xc5\x80\x14\xfc\xbb\x58\xf0\x6b\x01\xa5\xdc\x32\xe3\x65\x06\x31\xc7\x0b\x9c\x3b\x9b\x56\x96\x09\x75\x2d\x4b\xad\x72\xa1\x2c\xbb\xe6\xa5\x04\x5c\x9c\x52\x00\xb6\x83\xb3\x45\x7f\xbf\xf7\xc3\xe1\x6b\x48\x68\xd8\x27\x50\x0a\x9a\x65\x65\x3c\x80\x4d\x3c\x93\x68\xb8\x0f\x2e\x9f\x9f\x87\xa3\x21\xc8\x5c\x3f\x2f\xf7\x9c\xbc\xb2\x15\x36\x66\x79\x97\x64\x95\x91\xd7\x9b\x92\x24\x54\x63\x7f\x2c\x3b\xad\x73\xab\xde\xbf\x26\xd4\x4a\xe9\x3e\xb8\xd6\xd7\x14\xe8\xad\x04\x4c\x76\x4d\x28\xda\x8b\x63\xe0\xe4\x7a\x22\x34\x0d\x4c\x9f\xf3\x98\x8b\x2b\x2a\x04\x20\xc7\x6c\xd6\x09\xa5\x74\x2a\xee\x8f\xbb\xd3\x4c\xef\xa1\x21\x30\x66\x1e\x55\xf0\x99\x64\x21\xd2\x0a\x00\x9e\xa4\x41\x78\x54\x67\x3e\xf0\x1a\x87\x4f\x41\x9f\xa0\xd3\x59\x00\x35\x50\x63\x70\x0e\x22\xcd\xfd\xef\x4b\x0f\x81\xe0\x3f\x30\xad\x11\xc1\x28\x75\x63\x8d\x18\x37\xa6\xca\x71\x4b\x60\x0b\x84\x99\xb4\x26\x74\x99\xf5\xda\xb1\xdb\x18\xf7\x2c\xa8\xea\x41\xdf\x0b\x91\x01\x73\xf5\xa0\xf1\xee\x59\x34\x0e\x12\xda\xf8\xbf\x88\xe1\x28\x61\x02\xa2\x6d\x21\x8f\x53\x83\x97\x74\x26\xa1\x8d\x12\x27\x7a\x5f\xac\xf9\x25\xaa\x0e\x78\x07\x00\xc4\xf0\xa9\xc8\x4c\x7b\xa0\x69\xbd\x28\x84\x4b\x4a\x84\xef\xd9\x27\x97\x1b\x23\xe7\x0a\x3a\x68\xba\xd1\xee\xd9\x2b\xb3\xb3\xcd\x34\x44\x1f\xdc\xce\x52\xad\x91\x85\x95\xf3\x62\x4c\x56\xaf\xd5\xb9\x4c\xee\x31\x92\xbe\xe7\x94\x5b\xb5\xd2\x8d\x1a\xdc\x57\x17\x2b\x1e\x1f\x13\x79\x35\x26\xec\x42\xe7\x94\xe2\xa4\xa2\x3e\x5e\xbe\x9d\xaa\x3b\x31\x4a\xe1\x68\x01\x89\x47\xb2\x8e\xc6\x43\xdf\x1b\x5f\x05\x0d\xcf\x09\x2a\x39\x85\x71\x01\x80\x92\xda\xb9\xea\x2c\xd3\x37\x90\x58\x8c\xe3\x7a\xde\x86\x14\x98\x67\x6c\xdc\xea\x4d\x3b\x69\xc2\x86\xbe\xff\x39\x74\xef\xe8\xc3\x4f\xc1\xfc\x1c\x00\xe4\x3b\x3d\x8e\xff\x3c\x3d\x3f\xf2\x7f\xb6\x67\xd2\x6c\xc3\x70\xfb\x5d\x31\x20\xf6\x6d\x77\xcd\xb0\x93\xd1\x07\xbe\x3e\x5a\x70\xe5\xe3\x56\xb7\x3e\x6f\x69\x12\x9b\xd5\xd3\x59\xf0\x52\x10\x60\x9c\x13\xdc\xa6\xe0\xc9\xad\xb3\x08\xe8\x6c\xef\xbd\xe1\xbd\x33\x35\x55\xe1\x3b\x6c\x67\x70\x63\x98\x49\xcd\x65\x3f\xfd\xe1\xe7\x3b\x12\xf3\x43\xbf\x59\x47\xda\xf7\xff\xa6\xd1\xa7\xef\x4e\xbf\x58\xdf\xc5\xeb\x6e\xbf\x8d\x1a\xe1\xdd\xe9\xfe\xdb\x9a\xf0\xde\xf5\x69\xbe\x79\xdb\xdd\x5e\xac\xbd\xda\x77\xb8\x1d\xd7\xfe\x2e\x68\x25\x6e\x4b\x9e\x02\xea\xe6\x6c\x79\xae\x53\xb7\x3b\x31\x49\xee\x7e\xd0\x06\x9d\xe5\x7d\x57\xdf\x58\x07\x8f\x56\x77\x4f\x56\x37\xcf\x40\x4b\x5b\xb8\x05\xf9\x94\x50\xd9\xd4\x9c\x35\xb0\xa6\xaa\xb2\x14\x0a\xba\xe4\x57\x90\x16\xe9\xbb\xdf\xa3\x44\x07\xc9\x4c\xb8\x9e\x08\x4e\xcf\x0e\xc3\xc1\x49\xe9\x72\x39\x07\xac\xcf\x08\xdb\x7a\x56\x41\xf6\x23\x9c\x13\x88\x5d\xa7\x95\x9b\xc7\xb3\x75\x70\x1a\xba\x10\x2a\x6a\x8d\x4f\x2a\xf6\xd8\x71\x60\x03\x60\x03\xb5\x86\x49\x9e\xfe\xae\xc8\xb8\x9d\xe9\x32\x1f\x7b\x5d\x72\xdc\xd0\x28\xd8\x11\xe4\xe1\x18\x6f\x8c\x61\x32\x2c\x62\x70\xaa\x34\x13\xd1\xd1\x1f\x5e\x55\xa5\x88\x58\xc5\x2a\x55\x8a\x44\xcf\x95\xfc\x4f\x4d\x08\x38\x04\x83\x27\x89\x1b\x77\xec\x32\x55\x65\xd9\xfd\x93\x16\x3a\x6a\x0c\xfa\x5a\x94\x0b\xc1\xef\xc9\xbc\xad\xfc\x17\x1a\xa3\x6e\x55\x6a\x08\x80\x80\xf4\x63\xff\x10\xa7\x47\xeb\x04\x0a\xe1\x30\x1e\xef\xb3\x9c\x39\x9c\xfe\x4e\x2d\xe4\x6c\x2e\xaf\x85\xf2\x08\xe5\x47\x19\x0f\xed\xb6\x3d\x28\x2b\xa1\xa4\x57\x56\x87\x0c\x07\xc6\x6d\x84\x93\x0c\x09\x51\x14\x5c\x8d\xc7\x89\x6e\xa1\x66\xdd\x99\x6f\x8c\x76\x97\x3b\x21\xc9\x00\x3b\x45\x8e\xea\x57\xca\xbd\x23\xb6\x01\xc4\xc9\x12\x48\x85\xf1\x76\x0b\xa5\xc0\x7c\xf8\x11\x94\xbf\xe6\x64\xd0\xba\x61\x48\xb7\x0e\x88\xb1\x35\x61\x33\x77\x78\x2c\x51\x23\x3a\x9d\x35\x9f\x24\x1b\x18\xfd\x50\x28\x05\xba\x7a\x6d\x3c\x9e\xeb\xd4\xa9\x6c\x23\x16\x96\x32\xee\x55\x4e\xc1\x19\xdc\x93\xd1\x66\x44\x8d\xae\x2c\x85\x29\x34\xb6\x0a\x88\x1f\x3b\x8a\x9c\x65\xd2\x36\x32\xf3\xb0\xe9\x5b\xd8\x1a\x08\xe6\xf6\x1f\x51\xea\xb5\x0a\xff\x5c\xda\xc9\xd5\x57\xa0\xed\x0b\xb5\xe0\x2a\x41\x43\xeb\xe0\x4a\x14\xe6\xc0\xc8\x39\x2a\xf7\x7f\xf9\xea\x2b\xd0\xf4\x3d\x49\x0e\x5e\x9f\x1c\x1e\xbf\x3c\x99\xe4\xe9\x1a\x67\xad\x47\x15\x86\xf4\x97\xef\x83\xc2\xcc\xae\x9f\x4e\x9e\x7e\x85\xf9\x79\xd2\x20\xd6\x70\x04\x34\x8c\xe5\xe2\xab\x28\xc3\xee\xd0\xf1\x74\xa3\xa3\xe7\x9e\x59\x47\x1b\xb5\x35\x0a\x6e\xad\x28\xd5\x33\xf6\xdf\x7b\x6f\xbf\xf8\x75\xbc\xff\xcd\xde\xde\x4f\x4f\xc6\x7f\xfd\xf9\x8b\xbd\xb7\x13\xf8\xc7\x1f\xf6\xbf\xd9\xff\xd5\xff\xf1\xc5\xfe\xfe\xde\xde\x4f\xdf\xbf\xfc\xf6\xf2\xfc\xe4\x67\xb9\xff\xeb\x4f\xaa\xca\xaf\xf0\xaf\x5f\xf7\x7e\x12\x27\x3f\xdf\x71\x90\xfd\xfd\x6f\x7e\x7f\xcf\x89\x76\xac\x9c\xe9\x5b\x2d\xd3\xab\x42\x66\xc0\xaa\x98\xa2\x14\x22\x07\x99\xdb\x25\x9f\xac\xe9\xc7\x6d\x0d\xe5\x4f\x75\xfa\xcb\x09\x62\xff\x34\x35\x77\xb2\xd9\xa0\xbc\xce\xf4\x0d\xe4\x80\x4a\xed\xf4\xb5\x09\x7b\x05\x87\x2f\x3b\x13\xd7\xa2\x1c\xf9\x51\x5f\xb8\x9b\xce\xc3\x3d\xb1\xa3\x70\xdd\x1d\x51\x0b\xd3\xdb\x36\xea\x88\xcd\xe3\x74\xc3\x33\xad\xce\xc3\xec\xc2\x30\xb4\xf3\xc6\xf7\x07\xa6\xeb\xb8\xbc\x9e\x0c\x3d\xd6\x01\xdb\xb4\xd0\x0b\x80\x7c\x9d\xb0\x1f\x78\x29\x75\x65\x48\x97\x8a\xd1\xcd\x31\x5f\x2e\x90\x08\x5c\x30\x14\xcd\x0a\x83\x84\x32\x38\x1f\xd0\x0a\xf4\x39\x0c\xe7\xcd\xd1\xfa\x23\x4d\x5a\xb7\xe8\xd7\xfe\x51\xa5\xcf\xeb\x5d\x01\x46\xc7\xc3\x6c\xed\xf9\xe5\x4f\x64\x13\x4f\x14\x86\xf1\xf3\x80\xb3\xc1\x69\x92\x38\xca\x42\xce\x7d\xf6\x38\xbc\x3f\xda\xea\xd1\xa7\x81\xd9\x3a\x2c\x69\x97\x1d\xdf\xb5\x88\xa1\x68\xbf\x5f\x0f\xb6\x68\xc2\x47\xc7\x08\xd4\xbe\x7c\xaa\xde\x82\x3b\xc8\x27\x70\x08\x8e\x93\x52\x5a\x99\xf0\x6c\x07\x8e\x30\xff\x55\x92\x55\x4e\xcf\x8d\xbf\x2d\x05\xb3\x37\x1a\x9f\xc2\x33\x76\x25\x96\x37\xba\x4c\xbd\x7e\xe1\x9f\x58\xaf\x85\xb1\xfe\x91\xce\x9a\x05\x59\x80\x3e\x95\x32\x17\x25\x9b\x0a\x1f\x2e\x68\xdd\xbc\x9c\xb0\x43\xb5\xa4\x58\xab\x8a\x2b\x2a\x23\x18\x3a\xd0\x71\x50\x0b\x6c\x30\x09\x9d\x87\xfe\x69\x1c\x6b\x5d\x6f\x73\xa5\x3b\x05\x32\xec\x02\xaf\xbd\x78\x5f\xba\x2e\xa9\xa4\x0b\x76\x47\x89\x05\x69\xda\x7f\xfd\x49\xa4\x85\xd3\xcf\xa4\x12\xc6\x7c\xeb\x96\xb2\x8f\xba\xdd\xe4\x0e\x0e\x6a\x15\x8d\x0d\x72\xb2\xce\x9f\x16\x6e\x4b\x61\x40\xdc\x49\x74\x9d\xd6\x77\x4e\xd8\x21\x7c\x00\x05\x00\x4e\x73\x84\x92\x41\x37\x98\xb4\xa6\xdd\x4b\x1f\xef\x38\x3c\x3b\xf6\x89\xda\xa8\x74\x98\x26\x3a\x3c\xaa\xfc\xcd\x99\x80\xa6\x4a\xe9\xc2\xe2\x97\x8a\x43\x5b\xe0\x9d\xcb\xb2\x12\x3b\xdd\x54\x3d\xec\x3b\x70\xf0\xe7\xaf\x9e\x80\xb6\x17\x9e\x07\x62\xff\x9e\xd5\x4f\x5d\x13\x82\x3a\xa5\x02\xb5\xb3\xa0\x5e\xc7\xfc\xe0\x09\xee\xed\x26\x8a\xd0\x41\x21\x33\x2c\x53\xa0\x79\x27\x3f\x72\xa7\xc4\x9f\xee\x29\x3f\xe3\x7a\xba\x97\xf7\x6f\xd9\xd6\x27\x5b\xa7\xf1\xdc\x21\x42\x7a\xf5\x68\xb8\x2a\x06\x97\x24\x3c\x27\x72\x63\x63\x67\x0f\xfa\x18\x72\x7f\x41\x70\x41\x08\x04\xc4\xe3\xb2\xe8\x91\xe7\xdc\x41\xde\x40\x59\x4f\x6f\x55\x71\xf7\x35\x0e\xc4\x8a\x5a\x37\x5c\x29\xd7\x08\xe1\x6c\xd0\x3b\x48\x2b\x3c\x84\xda\xb7\x11\x7b\xa5\x9e\x63\x31\xc0\x08\x15\xc5\x06\xd4\x0a\xde\x34\x68\x4d\xe4\xc1\xef\xe8\xdd\xc7\x38\xe5\x2e\x42\xe1\xfe\xe4\x8e\x2c\xdf\x9e\xa7\xff\xee\xeb\xd6\x58\x0d\xd6\x6b\x58\xf6\x74\x42\xca\xba\xd5\x1b\x89\x4f\x36\x2f\x75\x55\xf8\xb0\x71\xb3\x6f\x5b\xdd\xac\x04\xa3\x9d\xd8\xd6\x58\xe9\xe6\xd0\xc1\x79\x03\x0c\x2c\x6a\xaf\x5f\xca\x12\x34\xef\xfd\xa9\x8b\x25\x5f\xe8\x01\x29\x2b\xd5\x6c\xeb\x1e\x05\x5e\x77\x32\x31\xe7\xc9\x72\xa7\xf9\x9c\x75\x61\x6e\x74\xf8\xca\x1c\xf1\xe1\xf1\x79\x75\x01\x07\xd4\x79\x80\xfe\x80\x7b\x0d\x54\x83\xca\xd0\x14\xfd\x91\xef\x2b\x10\xd1\x33\x57\xf6\xf0\x2c\xfc\xf9\xab\x3f\x8f\xbd\xef\x10\xa7\xd2\xae\xe5\xa6\x9a\xec\xb5\xee\x84\x3f\x75\x72\x05\xdc\x9b\xff\x42\x54\x7b\x50\xd5\xb3\xb1\xc4\x4e\x9f\x92\xa6\x00\x76\x40\x7f\x48\x38\xfd\xc3\xd3\xdf\xa7\x9d\xad\x1f\xc4\xaf\x57\x3d\xc4\x27\x21\x57\x33\xe4\xd0\x67\xb7\xb6\x9b\xe2\x2c\x74\x96\xc2\xbe\x22\x27\x93\x7f\x14\xe3\xd6\x96\x72\x5a\x59\xf2\x0a\x27\x3a\xcf\x9b\xf5\xa4\xd4\x3e\x70\xc2\xea\x82\xc2\xd8\x78\x06\xc6\x9f\x30\x76\x21\x04\xb6\xce\x8c\xe6\x01\x62\xd9\x93\x92\x9c\xcb\x7a\x86\x7d\xce\xd1\x66\xfb\x44\x0e\xa9\xee\xa7\x37\x45\x1e\x7b\x06\x29\x76\x0e\x83\x51\x13\x07\x08\x51\x1e\xae\x74\x33\x6e\x1d\x64\x90\x6a\x5d\x47\xa4\x29\xf3\xca\xd1\xc2\x20\x7e\x2e\xf0\xf2\xf7\xd8\xf9\x14\xd2\x4a\x21\x4c\x8a\xae\xd8\x1b\x37\xc4\x42\x16\x68\x82\x73\x1b\x7e\x0e\x09\x0e\xee\xeb\x18\x96\x02\x5a\x79\x3e\x45\x1b\x58\xdf\x80\x13\xfc\xdb\xd3\xe3\xb0\x47\xdc\x5d\xcf\x2f\x30\x06\xf6\xe5\x84\x1a\x13\xdb\xb9\x4c\xd9\x14\x93\x5a\x9c\x78\xdd\x53\xe2\x06\xd3\xe4\xc9\x4f\x1c\xd4\xf0\x6b\x9f\x3e\x8e\xa3\x85\x87\xd3\x90\xfb\xec\x8f\xd4\x22\x56\x94\xde\x88\x9f\x4a\x4a\xa3\x7d\xf5\x7a\xd7\x7b\xe7\x6f\xc6\xe5\xcd\x78\x3c\x1e\x53\xec\x1b\x84\xfa\xa8\x41\x83\x20\xfb\x73\x9d\xca\xd9\xb2\x45\x09\xc7\xe6\xf5\x23\x80\x23\xb9\x5a\xd2\xec\xfa\x77\x33\xbe\x3f\x74\x79\x3f\x47\x60\x1f\xa8\x8a\x35\x71\xf5\xbe\xe1\xb8\x75\xa1\x7a\x34\xab\x4d\x8d\xf8\xae\x67\xc8\xa4\x50\x59\x70\xcb\xc2\x78\xa7\x11\x71\x0d\xe1\x18\xa2\x51\x2f\xde\x15\x1a\x51\x92\xa1\x72\x07\xfa\xd9\xb5\xa3\x31\xe0\x27\x77\xbb\x0a\x12\x10\x1b\xbb\x86\xf4\x0f\x0c\x00\x7a\x22\xb0\x29\x77\x43\x86\xe9\xec\xb5\xf8\x64\x7f\xc2\x4e\x89\xb5\xc0\x7e\x54\x9a\xba\xe2\x31\xad\x98\x28\x16\x22\x17\x25\xcf\x9a\x0f\xa2\x0a\xe6\x67\x4e\xdc\x96\x8e\x4b\x31\xe2\x91\xf3\x02\xa5\x2d\x08\xcf\x54\x96\xbe\xab\x6e\x14\x89\xdc\x79\xa5\x5e\x6b\x6d\x5f\x4a\x03\xaa\x0e\xf9\x4e\x50\x31\xdd\x59\x77\xa0\xf9\xef\xea\x74\xf0\xbe\x9c\xfc\xc9\xc2\x7d\xcc\x77\xc6\x1b\x42\xd6\x3a\x09\xe2\x84\xd6\x7d\x9b\xdf\xbd\x21\x80\xa3\x46\x8f\xe1\xda\x0b\xbc\xa6\xb5\xdd\x4a\x5f\xbb\x4f\xdc\xd8\x8e\x32\xd6\xb8\x6d\x20\x89\x7d\xea\x66\xec\x9b\x93\x5e\xc0\x32\x67\x1a\xf6\x49\x4f\xa6\x39\x5d\xed\xa7\x57\xb3\x08\x78\x07\x43\xa3\x50\xa5\xd5\x18\xfa\x5b\x55\xc6\xc7\x69\x4b\xef\x21\x6e\x1c\x40\xd4\x74\x13\x8f\x4d\x6c\x9c\xc8\x6b\x0b\xc0\xa9\x4e\xca\x54\xa5\x08\xd9\x9b\xa9\x16\x75\xaf\x2b\x6e\xd8\x9b\xd3\x63\xf6\x84\xed\x41\xe6\x72\xa8\x5e\x47\xbc\x0e\x67\xf9\xb6\xd2\x6b\x67\x7e\x88\xa6\xa5\x43\x60\x19\x4a\xa3\x2c\xf2\x8d\x40\xb5\x0a\xc7\x30\x81\x8e\xde\xd2\xbe\x71\xd3\x3c\xde\x95\x1f\xbb\xd5\x27\x84\x94\xa0\x01\x64\xd0\x9b\x0e\x32\x28\x56\xac\x87\x68\xbe\xb9\xe9\xd5\xfb\xad\x4b\xa8\x66\x56\xdf\x00\x4c\x75\x71\x02\x03\x22\x50\xc6\x3b\x4b\x6a\xfc\x3d\x3b\xbb\xaf\x02\x22\x11\x2a\x54\xc0\x4e\x28\xb9\x4a\x75\xbe\xf2\x34\xb7\x9a\x60\xbc\x45\xab\xb9\x65\xbb\xdb\xae\x5e\xe5\xad\xfd\xaa\x43\xc1\xc6\x1f\xa0\x2c\xf8\x05\xf8\x0a\xa4\x09\x9c\x80\xce\x03\x48\x98\x5f\x31\x5b\x7b\xa3\x46\xf4\xae\x92\x2a\x75\xd6\xb1\xd0\xb0\xf1\xd6\xaf\x75\x46\x05\x1e\xfe\xb5\xdd\xc0\x0f\xf6\xad\x6d\xc7\xa8\x42\x5b\xbc\x2c\x8b\xd6\x5b\x83\x3b\xe7\xa1\xbe\x75\xd5\xe9\x94\x66\xed\xb7\x86\xfc\xdf\xc6\x5b\xc3\xb9\xfb\x10\xdf\xba\x99\xee\x3d\xc0\x61\x42\x03\x32\x4d\x49\xe7\xd4\x65\xa1\x0d\x00\x53\x27\x84\x82\x13\xea\x71\xc9\xd1\x3e\x10\x01\x98\x62\xf5\xa9\x45\xb7\x4e\x78\xb6\xc0\x2e\xf7\xdd\xd6\x99\xb5\xd7\xba\x3d\x64\x94\xbb\xc1\xdd\x6c\xe1\xb3\x28\x83\x92\x23\x7a\x95\xae\xe3\x37\xad\x58\x0d\xb9\xe9\xe8\x97\x3e\x79\xc2\x9d\xbf\x75\x42\x67\xfc\x6b\xab\xa9\xf1\xae\x47\xc9\xe7\x30\x41\x81\xe9\x99\x05\xb7\x8b\x11\x2b\x45\x86\xc0\xb7\xb4\xcf\xae\xd0\x94\xda\x6d\x64\x89\x7a\x8e\xf5\x8f\x06\x85\x05\x1a\x6f\xc3\xc8\xe0\xf2\xf1\x6a\xc8\x0c\xe5\x97\x34\x6c\xe7\x85\x27\xc0\xce\x63\x16\xd0\x3b\xf8\x3e\x61\xed\xd0\x8b\x75\x25\x55\x4a\x88\xb0\x0d\xd2\x84\x8c\x64\xd4\x0d\xbd\x87\xc9\xef\x75\x5e\x0a\x70\xf6\x06\xd2\xb0\x71\x67\x66\xa0\xc8\x99\x8f\x9f\x8e\x6f\x51\x32\xbd\x4f\xc5\x3f\xa4\x3d\xcc\x1b\x05\x2b\xad\xa0\x58\x44\xe9\x35\xf7\xf9\x77\xe9\xd6\x1d\xb2\x8f\xe8\x5d\xa9\xea\xe9\x29\x7e\x0f\x03\x0e\xd7\x1c\x8b\x84\x22\x15\xbe\xc6\xea\x24\xbb\x90\x9a\x5f\xb7\x54\xef\x11\xac\x0e\x65\xda\xae\x9c\x4e\x98\x8d\x95\xf3\x72\xc9\xbe\x3d\x3d\x46\x0d\xbc\x61\x08\x28\xed\x1f\x1d\x38\x25\x25\x38\x46\xae\x96\x0f\x40\x71\xee\x06\x89\xd3\x19\x10\xa7\x2f\xd4\x70\x2f\x33\x11\x6b\xd6\x7a\xf2\xd4\x05\x55\xbe\x2d\x74\x96\x32\x1e\x18\x4c\xf9\xaa\xb7\xd4\x3f\x07\xe3\xed\x51\xb9\xeb\xc4\x19\x5f\x14\xcb\xae\x54\x5d\x18\xe3\xef\xdf\x6b\xab\x04\x7e\x4f\xef\x53\xed\xb7\xf7\x4c\x65\xbc\x52\xc9\xe2\xb7\xc2\x32\x6b\xa8\x1f\x42\x1d\x9c\x5d\x89\x52\x89\x8c\x15\xbc\xe4\xb9\xb0\xa1\xbb\xa3\x11\x5d\xb0\x8e\x7a\x42\x25\xf5\x03\x4a\xea\x01\x72\xd4\xbd\x4b\x63\x5f\x78\xa4\x3e\xa0\x33\x6b\x5a\xd7\xcd\xf0\x74\x74\x53\x5a\x52\x47\xd3\x8e\x83\xf7\x46\x02\xe9\xd5\x77\xb1\x89\xfa\x85\x2d\x0b\x1e\xc4\xbb\x35\xeb\x9a\x07\xb0\x6e\x7e\xc4\x01\x6b\x00\x06\x9f\xc9\x70\x5f\x77\x99\x57\x99\x56\x61\xcf\x76\xcd\x8a\x2b\xaa\xd9\x23\xe2\x13\xfb\xca\x3b\xcb\x5d\x28\x7b\x7c\x54\x1e\xae\x79\x6e\xf8\x51\x29\xa0\xc0\x96\x67\x17\x85\x48\x06\xd0\xb0\xbf\x7d\x79\x71\xd8\x1c\x14\x0e\x25\xc8\xcd\x76\x6b\xe2\xbe\x8f\x2a\x0c\x6e\xc4\x74\xa1\xf5\x15\xdb\x5b\x53\xe5\x19\xd5\xd7\x18\x39\x37\x07\xc4\xde\x63\x37\xef\x7d\x26\x15\x60\xf7\xae\x62\x1e\xfb\x87\x24\x61\x16\xb0\x56\x94\xe2\x46\xc7\xf0\xea\x34\x41\x46\x61\x46\xcd\x26\x0c\x9c\xd5\xc5\xb8\x7f\xbe\x97\xbf\x3e\xb0\x20\xb7\x55\xfb\xae\xa5\x1a\x3a\x34\x36\x42\x12\x32\xb7\x9d\xfa\x3e\x00\x1d\xbe\xab\x47\x8b\xa1\xe6\xe4\xac\x81\x82\x5f\x1b\x4a\x21\x58\xb9\x0b\xdd\xb8\xe8\xa7\xbb\xb1\x56\xdf\xac\x6a\x82\x32\x76\x5f\x7f\xa8\xe2\x0c\x8a\xa9\x88\x8b\x0d\xa3\xba\x9f\x76\xbd\x21\xc9\xdb\x68\xaa\x47\xb5\x07\xc9\x27\x23\xce\x32\x3e\x87\x6e\x3e\xad\xe2\x1d\x10\xae\xba\xc2\xa8\x66\x7c\xb3\xaf\xd0\xf4\x9d\x2a\x00\x28\xdb\xa0\x14\xf3\xc1\x4c\xaa\xf2\x80\x2c\x90\x43\x37\x6f\x47\x96\x73\x9f\xfb\xec\xa7\x00\x6e\x8a\x50\xa3\x6a\x1c\xef\x60\xfe\x86\xbc\x16\x0d\x02\xa3\xe4\xdd\xf3\x30\x3d\x16\x93\xac\xf0\xbc\x80\xdf\x73\x96\xcb\x77\xee\x29\xf1\xaf\xe2\xe2\x04\x95\x42\x94\x78\xfd\xd7\xfb\xce\x18\xab\x2d\xb7\x91\x5b\xc5\xf8\xce\xa8\x8b\x84\x82\x2f\xce\xb0\xba\x00\x5f\x20\x8e\xb4\x50\x43\x88\x3e\xfc\xdd\x1d\xc6\x2d\x84\x4a\x07\xda\xea\x10\x32\xa5\xe1\xdc\x42\xfb\xe3\xbb\x4f\x08\xd5\xdd\x32\x44\x18\x75\xf5\x8c\xfe\xe4\x47\xfb\xa7\x94\x61\x46\x94\xd7\x32\x11\x87\x49\xa2\x2b\xd5\x2b\x0b\xf5\x58\xb8\x57\xe0\x56\xa4\x17\x8d\x31\xd1\xe3\x9e\xc2\xb7\x58\x78\xcf\x33\xc9\x11\x82\xa9\x79\x27\xd6\xe4\xd5\xe3\x80\xc7\xbe\x35\x43\x62\x19\x63\x05\xef\x96\x51\xda\x93\x42\x7d\x33\xeb\x57\xdf\x78\xdd\x09\xd7\xa2\x20\x39\xeb\x57\xb2\xe6\xef\x56\xb2\x60\xb9\xb9\xaa\x81\xa9\x04\x54\x2d\x85\xcd\x14\x7d\x4e\x2f\x3a\xe6\xf8\xd4\x4e\x60\x55\x1d\xa8\x6b\x9d\xdc\x73\x2f\x7f\x68\x9e\xff\xef\xe3\xb3\x7e\x99\xe3\xa1\x27\x0f\x96\xc3\x2c\x68\xe8\xa0\xaa\xc7\x28\x04\x71\x35\xa3\x7b\xf2\x88\x95\x9c\xda\x0d\x50\xab\xb9\x4c\x70\xf4\xa9\xb0\xbd\x28\xb1\x7f\x7f\xe2\x64\x7a\x1d\x2d\x47\x51\x4f\x9d\xe1\x72\xc1\x95\x89\x2a\x56\x05\x0c\xed\xb3\x62\xc3\x7c\xf0\x20\xa4\xd5\x26\xef\xc1\x9e\x77\xba\x36\xef\x30\xb6\xac\x12\xcb\x2a\x6b\xdc\xe7\xf8\x70\x2f\x30\xef\xf0\xf8\x52\xcc\xa5\xb1\xe5\xd2\xf7\xac\x9b\x45\x93\x20\xaf\x50\xb8\xe5\x4a\x2c\xd9\x77\xdf\x9f\xfc\xe3\x9f\x2f\x5e\x1d\x1d\xbe\xf8\xe7\xcb\xc3\xa3\xef\x4e\xcf\x4e\xde\xbe\xbd\xf8\xc7\xc5\xe5\xc9\xcb\xb7\x6f\x8f\x10\x50\x85\xaa\x77\x2f\x84\x7d\xfb\x96\x38\xd5\xbc\x7d\x7b\x99\x14\xb2\x78\xfb\xf6\xdc\xfb\x40\xb0\x1b\xc5\xff\x3e\x3e\x03\xf9\x89\x45\x64\x21\xed\x09\xce\x56\x24\x3a\xcc\x7b\xc1\x4d\x9d\x64\xd9\x28\xcf\xe9\x80\x60\xda\xf5\xb8\x5b\x8b\x1f\xd5\x6b\xb3\xbb\x01\xeb\x36\x52\xde\xc5\x1b\xbc\x74\x6c\x2a\xec\x8d\xa0\xaa\xc7\xb5\x00\x65\x3c\xaa\xa3\x8e\x30\xc7\xd6\xb5\xaa\x41\xe5\x4c\xb3\x6b\x29\x6e\x10\x62\x03\xbb\x02\xd6\xfd\x92\xa0\x0a\x1a\x2b\x61\x57\x61\xd0\x40\x49\x2a\x74\x1a\x7a\x43\xb5\xfc\xd2\x2b\x3e\xe9\x46\xd5\x0d\x02\xdd\x89\x94\x9d\x9f\x1e\xb3\xa7\x13\x54\x72\x4e\x8f\x11\x77\x73\x2d\x2c\x97\xb7\x54\xdd\x81\x8a\xa7\xef\x9a\xaa\x83\x9a\x01\xba\x08\xa3\x0e\x1c\x50\x4d\x53\x9d\xf3\xfb\x76\x81\xfb\x40\xfd\x0a\xf6\xe8\xfc\xa5\xe2\x19\xea\x00\xe7\x3a\x5d\x95\x4c\x3b\x5f\xfb\x8f\xfe\x36\xf9\x3a\xcc\xe3\x6f\x93\xaf\xa1\xfb\xa7\x27\xdb\xdf\x26\xe6\x3a\x99\x7c\x4d\xf5\xd4\x8c\x6e\x5a\x9b\x23\xbc\x52\x1c\x45\xfa\x2c\xfe\x06\x9e\xcd\x41\xdf\xfd\x24\xe5\x2e\x03\xb6\x51\x1d\xb8\x79\x2a\x6a\x81\x50\xaa\x9d\x94\x82\x63\xaa\x39\x4b\x45\x26\x6a\xd8\x9b\x07\xd0\xbd\xf3\xf6\x76\xa6\x3e\xd6\xd6\x68\xf6\x1a\xfb\xa6\x82\xbe\xf4\x9b\xef\x09\x1b\x1b\x0c\x7f\xac\x5b\xec\x77\xd8\x00\x3d\x81\x1d\xee\x15\x36\xb2\x3a\x13\xb8\x3e\x7d\x76\xca\xda\xba\xba\x5d\x13\x8f\xde\x85\x10\x9b\x28\x5e\xbf\xf4\xc8\xad\x8e\x23\x2e\xc3\xfc\xc1\xd2\xc0\x5e\x87\x18\x5c\xc5\x6f\xa0\xda\x6d\xc9\xdc\xa9\x65\xd1\x93\x11\x17\x94\xda\x12\xba\x32\x7e\x7d\x25\x96\x23\xc4\xff\x40\x25\xe4\x6f\x11\x04\x75\xa8\xa0\x46\x9c\x39\x5d\xb2\xaf\xfd\xbf\xfe\x76\x5f\x6b\xad\x87\x1f\xb5\x8f\x17\x15\x5f\xaa\x77\xe4\xeb\x04\xab\x60\x9a\x80\x20\x48\x59\x2a\x90\xb1\x1a\xc9\x35\x61\x27\x50\x26\x8b\x1a\x29\xc1\xf0\x66\x59\xe3\x66\xe3\x5b\x6a\x36\xc0\x24\xc0\xff\x12\x55\xc7\x9c\xe9\x0b\xaa\xcc\x04\x80\x9f\x99\x28\xeb\x4f\x40\xc0\x9c\xe9\x93\x77\x22\xa9\xee\x0b\xba\x83\x57\x2f\xdf\xdf\x95\xe8\xdf\xe4\xec\x7b\x11\xc0\x8f\x90\x36\x4e\x0b\x0f\x95\x09\xf5\xee\x8c\x92\xd3\xde\x4f\xdb\x2b\xb1\x34\x01\x53\xee\x0a\x47\xa7\x22\xe8\xc0\xbf\xfe\x20\x3b\x79\x27\x8d\x35\xff\xd3\x77\x58\xcb\xa7\x75\x6f\x3b\x8e\x59\x62\xf5\xe8\x11\x9e\xa0\xfb\x13\x1e\xf3\xa9\x09\xee\x5f\xa0\x37\xd5\x5f\x79\x4a\x44\x88\x81\xdc\xbd\xd3\xae\xa1\xf4\x24\xad\xa0\x50\x2d\x86\x9e\xab\x13\x6b\xf0\xc7\xc8\x9f\x48\x43\xa0\xcb\x89\x53\xf2\x9a\xc7\x0c\x7d\x44\x37\x49\x00\x21\x91\xd7\x3c\x13\x8a\x60\x7b\xb3\x34\xe1\x25\x86\xe8\x09\x7f\xc8\x10\xf2\x37\x01\x6f\xb8\x33\x8e\x24\x59\xbd\xca\x86\x42\x79\xbc\xb4\x32\xa9\x32\x5e\x32\xb7\x1f\xe7\xba\xbc\x27\x4c\x11\x5e\xfd\x3a\xfd\x05\x16\xed\xd1\x00\xbb\x29\xdf\xdb\x23\xb6\x71\x1d\x49\x7b\x71\x26\x13\xd4\xd7\x34\x37\xca\x5e\x13\x39\x5c\xcf\xbc\x6c\x0a\x82\x22\x46\x06\xb4\x0d\xe7\xb8\x9c\x83\xff\x7b\x3f\x3a\x3c\xc2\xce\x9c\xb0\xbf\x87\x6a\xf1\x11\xab\x7d\xc6\x50\x93\x4a\xcf\xa4\x6d\x43\xcb\x55\x6f\xea\x99\x2e\xa1\x6d\xe3\x5e\xaa\xe1\x37\xe2\x5a\x26\x76\x7f\xc2\xfe\x3f\xa7\x29\x82\x13\xd9\xab\x93\xb4\xcd\x42\x1d\x6e\x8d\x4f\xf8\x84\xed\xc1\xcf\x62\x55\x72\xdf\x07\x8a\x08\xf8\xf4\x91\x65\xc3\xf4\x88\x70\xaf\x89\x6e\x37\xc4\x28\x6a\x8a\x2d\xd6\x08\x27\xbf\x0e\x12\x32\xc8\x44\x69\x68\x97\x36\x3c\xb7\x21\xce\xe2\x45\x68\x60\x9c\x7f\x83\x8f\x9e\x95\x62\x0e\xfb\x0f\x77\xcf\x27\xdc\x7d\x56\x17\x3a\xd3\xf3\xe5\x45\x51\x0a\x9e\x1e\x69\x65\x6c\x09\xa2\xa1\x0f\x1c\xdc\x6d\x63\x46\x9d\xc2\x16\xfa\x86\x71\x2a\x67\xd7\x33\xc4\xe6\xd3\xd5\x7c\x81\xbd\x11\xe0\x87\xbe\xab\xae\x9f\x22\x19\x9d\x66\xc2\x2e\x42\xef\x03\x60\xf0\xd0\x4a\x01\x46\x01\x87\xc7\x0d\x5f\xd2\x66\xe2\x53\x99\x0a\x13\xe5\x28\xfb\xc9\x60\xe8\xe7\xd6\xf7\x07\xa9\x7c\x78\x76\x7c\xdf\x86\x13\x1b\x54\x68\x6f\x79\x95\xa0\x19\x21\xd5\x6b\xfa\x06\x8d\x14\xe8\xc6\x73\x4d\x9a\x2a\x42\xd7\x7a\xca\x7c\x42\xdd\xb4\x0f\x56\x53\xce\xdf\x5d\x5c\x89\x9b\x0e\xbf\xf4\x2f\xfa\xbd\xb8\x7f\x2a\xd8\x18\xec\xd1\x37\xca\x70\x2b\xcd\x0c\x3a\xd3\x7c\x42\x7d\x1c\x8a\x0e\xba\x35\xd0\xc0\xab\x59\xbb\x13\x8f\xe6\x8b\xc2\x03\x3c\x63\x83\x59\x28\xff\xaf\xb6\x83\xf0\x00\xc4\x22\x88\xd0\x7b\xc3\xed\xa0\x84\xfa\x51\x59\x5d\xc7\xa1\x31\x52\x51\xe5\x53\x51\x86\xbd\x8f\xce\x00\x59\xb6\x90\x78\x5b\x7b\xbf\xbb\x60\xec\x9c\x09\xd7\x37\xad\x0c\xc8\x73\xf2\xce\x69\x1e\xa6\x5b\xa2\x12\x5e\xcd\x76\x72\xad\x41\x31\x3c\xe6\x13\x38\x5b\xcb\xd0\x68\xeb\x02\x66\x6f\xfc\x49\x57\x39\x57\x5f\xfd\x1a\x52\xb2\x7e\x4d\x29\xd9\x9a\x44\xe9\x5b\x5f\xbf\xd5\x1b\x26\x2e\xf8\x23\xa7\x90\x19\xa1\x02\x8f\x0e\x6c\xae\xea\x83\x1d\x6e\x06\xa5\x9e\xb4\x39\x67\x14\xb9\x9b\xf0\x77\x7d\x3b\x3f\xf5\x68\x6a\xc9\x06\x68\x6c\xc9\x40\x96\x5d\x75\x90\x80\xf1\xef\x3d\xb1\x3a\x0f\xd2\xbf\xc5\x25\xeb\x6e\x50\xd7\x57\x83\xa1\xae\x6a\xd3\x1a\x39\xab\x61\x5a\xd7\xc2\xae\x36\xac\x7b\x3d\x7b\x80\xbe\x6f\xac\xa7\x8d\x5b\x5f\x0d\x42\xe8\x7b\x58\xbb\x1c\x02\x4c\x7a\xe6\x77\xc7\x5a\x9b\xf7\x54\x8d\xd8\x99\xb6\xee\x3f\x91\xf9\x7b\xac\x85\x39\xd3\x16\x3e\x79\x10\xa4\xc4\x57\x18\x90\x90\xbe\x6b\x02\xf6\x03\x71\x72\x93\x42\xb4\xee\xc4\xf3\x04\x5b\x63\x58\x9c\x2a\xa6\x4b\x4f\xb1\x60\x5d\x18\x1a\x22\x0e\x2b\x10\xc6\xd6\xad\xc6\x89\x1b\x27\xa6\xf3\x7b\x86\xa3\xa1\x20\xfb\x0b\xbf\x01\xac\xd5\x22\x83\x02\x81\xb4\x2a\x11\xf2\xd6\xe9\x9a\x56\xcc\x65\xc2\x72\x51\xce\xa1\x4f\x76\xb2\x18\x62\xf9\xfa\x9c\x2b\x78\xf5\x3c\x5d\xe2\xc9\xf4\xe0\x25\x38\xb2\x41\xc5\x1a\x50\x05\xc0\xf1\xf0\x58\xcb\x39\x58\x52\xff\x27\xf8\xa0\xff\x2f\x2b\xb8\x2c\x01\x22\x97\x62\xc7\xf1\x77\x14\x7d\x89\x87\x71\x23\xac\xf8\x96\xb8\x62\x02\x2b\x99\xdc\xe8\x6d\xc5\x63\xc4\x6e\x16\xda\xe0\x61\x18\xdc\x1f\x3b\x57\x62\xb9\x33\x5a\x61\xbd\x9d\x53\xb5\x53\x07\x86\x1b\xcc\x16\x0e\x61\xc8\x20\xdc\x81\xef\x76\x3e\x9e\xae\xd2\xeb\xb0\x1d\xa2\x57\x41\x7b\x42\x1d\xf9\x8a\x6c\x9e\xde\x9a\xff\xee\x4b\x1c\x28\xb2\xcf\x31\x26\x38\x2f\x05\x16\x63\x82\x29\x0d\x8a\x3a\x35\xb3\xa9\x94\xb8\x16\x6e\xb1\x52\x69\x08\x0f\xd0\xa7\x18\xfc\x6b\xc5\x24\xfa\x7f\x8e\xf5\x99\xb6\xde\x6a\xff\x97\x77\x7b\x21\xff\xbd\x93\x79\x95\x23\x6e\x96\x75\x96\x42\x2a\x67\x1e\x37\xd8\x67\x36\x34\xed\x85\xa6\xd9\x4a\x7c\x6c\x79\x39\x87\x0c\x47\xb2\x17\x3c\x9b\xcd\x33\x3d\xe5\x19\xcb\xa5\x72\x8f\x99\xb0\xe7\xba\x64\xe2\x1d\xcf\x8b\x4c\x60\x3d\x1c\xfb\xe3\xf8\x3f\x5a\x09\x46\xd1\xf0\x11\xf3\xb4\xa8\xbb\xa2\x3d\x45\xae\xad\xfb\x07\x84\x54\x87\x86\x01\x16\xdc\x16\x86\x3d\x3d\x78\x7a\xf0\xe4\x19\xfb\x95\xb9\xa1\x9f\xd2\x7f\xbf\xa4\xff\xfe\x91\xfd\xca\x7e\x65\x8c\x9d\x33\xd6\xf8\x2f\x83\xff\x8e\x99\x9c\xc5\x73\x78\xea\xa6\x99\xe8\x9c\x5e\x18\x3c\xb9\xa1\x6c\x35\xb4\x1b\xb4\x9a\x86\x86\x9a\xa1\x44\xe7\x02\xe6\xf0\xf4\x7f\xfa\x7b\x20\xe0\x6a\xb1\x23\x24\x4c\x6a\x0f\xa6\xb4\xcf\x6e\xc0\x35\x95\xf3\x2b\x34\xcb\x0e\x13\x5b\xf1\xcc\x3d\x7c\xef\xcb\xf1\x93\x7d\xa6\x55\xf3\xf6\x6b\xa9\x9d\x0a\xec\x67\xb8\xf7\x74\x7f\xb2\x32\xe5\x2f\xd7\x4c\xb9\xd5\x1c\x91\x8a\x06\xdd\xa0\xb7\x73\x8d\x67\x98\x43\xb5\xbc\xe1\xcb\xc0\x36\xde\x2c\x9d\xcb\xeb\x00\xb1\x1f\x41\x79\x40\xcc\x0e\xb8\x40\x7a\x74\x26\x1c\x74\xc9\xa4\x9d\xb0\x53\xbb\xbb\xeb\x5b\x71\x3a\x8d\xd9\xf7\x02\x38\x8e\x51\x27\x81\xf0\xb0\xe8\x4f\x5a\x39\xbd\x1d\x30\xce\x06\x75\x8e\xde\x0b\xcc\x9f\x9e\x5e\xfb\x37\x06\x70\xaa\x87\xb1\xfc\x0e\x76\xa2\x5f\xcf\xb0\xd0\x17\x1b\x63\x4e\xa0\xeb\x29\xd1\x9e\x12\x46\x50\x75\xa6\xdd\x23\x4d\xb0\x9e\x24\xe4\xdf\x27\x51\xa7\xa9\x12\xbd\x74\x32\x15\xa5\xf0\x7d\x35\xe3\xf4\xa2\xe0\x97\x62\x3f\xd6\x77\x62\x5a\x11\xc4\x5f\x71\xa0\xbf\x61\x3a\xfb\xce\xb4\x4a\xae\x84\xf5\xe7\x4e\x09\x19\x11\x45\x65\xd9\x94\x67\x5c\x39\x0d\x66\xc5\x0f\x61\x35\x0e\x86\xbf\x04\x86\x59\xc3\x2f\x9f\x3a\x3e\xb2\xb2\x3b\xfa\x0b\xfd\x1f\xdb\x43\x46\x11\x59\x72\x14\xa6\x82\x67\x3e\x95\x02\x60\xf6\x03\x68\x98\xda\xdd\xad\xf7\x15\xac\x0d\x0a\xbf\xda\xc1\xea\xe4\x42\x43\xee\xb3\x3d\x9f\xfb\xc8\xac\xc8\x32\xe4\x9e\xba\x8d\xad\xdb\x64\x71\x5f\x5c\x09\x23\x34\x65\xc0\xda\x1f\x36\x9b\xe9\x62\x50\xdf\x49\x76\xb5\x0c\xe5\xfe\x23\xe8\x23\x3d\x97\xd7\x4e\x24\xdd\x49\x64\xa0\x58\x5c\x88\xac\x60\xa5\x48\xab\x84\x8a\x00\xae\xc4\x8d\xd3\xa7\xea\xb7\xa4\xae\x54\x9e\x5d\x77\x1a\x04\xdd\x41\x98\x71\xd5\x14\x87\x72\x06\xcc\xe8\x9b\xb3\x8b\x6b\x51\x2e\x59\xa1\x8d\x91\x6e\x0d\x60\x1f\x61\x26\x1c\x28\x5d\x01\x99\x08\xd2\xb0\x60\x56\x5e\x06\xef\x90\xcc\xdd\x71\x52\xda\xe8\xc6\xde\xf8\x34\xe7\xdc\x1f\xdd\x19\xf3\xfe\x73\xee\x1c\xfe\xb7\x7a\xde\x9d\xce\xd8\x1a\x06\x0c\x73\x69\x70\xce\x7d\x8e\xc0\x2f\xe1\xa4\xfa\xe3\x7e\x74\x12\xfe\xf1\xe0\xcb\x83\xa7\x7b\x6e\xae\x5f\xee\xbb\x59\x37\xce\xb8\xa7\xe1\x8c\x0b\xbf\xa4\x19\x09\xd3\x38\xe5\x9c\xf5\x05\x69\x8f\xd0\x62\x84\x80\xb1\x28\x85\xce\xcd\xc8\x58\x0a\xb6\xc9\xdc\x0b\x17\x64\xbb\x9a\x53\x6f\x34\x6c\x1b\x38\x6c\xa5\x65\x7f\xc8\x75\x29\xfe\x10\xdd\x7f\xeb\xe9\xd4\xfd\xd0\xe9\xdb\x7b\x37\x93\xc6\x42\x03\xde\x2b\xb1\xbc\xb7\x9a\xdb\xc7\xb7\xde\xd7\xb3\xbe\xfa\x16\x48\x90\x9c\x17\xf7\x18\x07\xc1\x59\x7b\xf5\x39\x79\x41\x5e\x59\x1a\x8a\xbc\x8e\xa8\x12\x51\x0f\x7c\x2c\x94\x0a\xc9\xb4\x53\x91\x69\x84\xba\xa5\xbc\x81\x7b\xe4\xe9\x87\xd6\x02\xc6\xea\x92\xcf\xc5\x01\x3d\xf6\xb1\xb4\x14\xf9\x01\xd1\x70\x1b\x2e\x26\xac\x65\x24\x9c\x5c\x9f\xcf\xec\x83\x0f\x20\x05\x78\x02\xa9\x80\x40\xc8\x06\x18\x45\xdc\x9f\xf9\x71\xc4\xb1\x3a\x54\xce\xf7\xf1\x9a\xf2\x1b\x73\x92\x71\x63\x65\xf2\xf7\x4c\x27\x57\x17\x56\x97\x03\xa8\x16\x87\x3f\x5e\xac\x8c\xda\x58\x53\xc5\x0e\x7f\xbc\x60\xc7\xd2\x5c\xd5\x1d\x1a\x10\xd6\xb4\x99\x7d\xc7\x03\xac\x0f\x15\x62\xb0\x9c\x3b\xe3\x4f\x78\x03\x4f\x05\x68\xe7\xe1\xf6\xca\xef\xf8\x8d\x11\x38\xfd\xa9\x9b\xbe\xfb\x5a\x74\x17\xc1\x1b\x03\x61\xc0\xd7\x39\x3d\xde\x40\xd4\x6b\x66\xba\xb6\xae\x61\x2b\xcc\x14\xf5\x90\x06\x40\xa3\x26\xcc\x37\x70\xcd\x52\x57\xec\x86\xa3\xc3\x0a\x64\xea\x84\x5d\xca\xe2\x19\x3b\x89\x00\x73\xb1\x1a\xa1\x39\x94\xd3\x37\x02\x78\x09\xa5\x08\x00\x97\xad\xf6\x02\x3e\x41\x65\xca\x3c\x63\x3b\xe2\x9d\xfd\xd3\xce\x88\xed\xbc\x9b\x19\xf7\x1f\x65\x67\x00\xb0\x4d\x7d\x3e\x9c\x56\xa7\x66\xa2\xac\xad\x17\xfc\xc1\x6a\xdd\xe0\xf0\x4c\xca\x2e\x5f\x1d\xbf\x7a\x06\xda\x7b\xaa\xd9\x8d\xf0\x9d\xf0\x7c\x15\x2c\x49\xc3\x88\x0c\x50\xce\x91\xe8\xbc\x28\x75\x2e\xa3\x5c\x55\xd8\x64\x5d\x78\x9e\x0d\xe1\x2c\x85\x8c\x34\x58\xfe\x41\x38\x08\x52\x7d\xfd\x90\xad\xe6\x02\xb7\xf1\xcf\xe9\x8c\x69\xf4\x48\x35\x13\xe4\xa5\x09\x37\x39\x8e\xa1\x51\xb0\xa5\x5b\xcd\x23\x4e\xfd\xa6\xaf\x0e\x52\x71\x7d\x60\x52\xfe\x74\x04\x8f\x41\x06\xa0\x06\x0a\x61\x4e\xdc\xb0\x9d\xa7\x3b\x13\x76\x21\x73\x99\xf1\x32\xa3\x5e\x33\x34\x44\x7d\x9f\xb3\x06\xfc\x80\xe0\x53\x7d\xb2\xc3\xf6\x30\x43\x1d\x74\x8a\x4c\xf8\x7a\xe5\x80\xcf\x01\x0e\xfc\xfd\x4e\x2a\x24\x1b\xc0\x77\xc1\x7a\xfb\x2f\x18\xb5\x9d\x7b\xa5\xb2\xce\x71\xbd\x56\x49\x15\xad\xc1\x8e\x85\x0e\x6e\x56\x43\xf9\x80\xa0\x9e\xc2\x28\x2a\x5e\xd3\x13\x6b\x42\x4a\x45\xda\x09\xb4\x8c\x07\x36\xc0\x01\xde\xcb\x2c\x3b\x50\x7a\xb4\xf3\x60\xce\x24\x36\x40\x29\x37\x0b\x47\xcb\x30\xeb\xf1\x46\xc9\x5f\x2a\xc1\x4e\x8f\x43\xdf\x4f\x51\x1a\x69\xac\x93\x5c\x69\x43\x47\x90\xa8\x38\xec\x1d\xe6\xfc\x3f\x5a\xb1\x93\xbf\x5f\xd0\x54\xf6\x1f\x20\x81\x3b\x0a\x40\xfe\x9f\xaa\x14\x4e\x35\xea\xad\x87\x1d\xfa\x91\xda\xba\x97\xfb\x9c\x1d\x73\xcb\x51\x05\x43\x69\xa6\xeb\xf2\x52\xd8\x09\x53\x48\xfb\xf1\xb5\xc3\x1d\xb5\x68\xb6\x79\x35\xc8\x71\xd0\x59\x77\x3c\x2a\xf7\xf3\x37\xaf\x4f\x37\xa0\x44\x25\x70\x0a\xcf\x5f\xea\x74\x20\x4d\x0a\xb0\x3d\x8e\x70\x54\x96\xbb\x61\xd9\x99\x56\x62\x04\xc2\x8e\x39\x69\x47\xff\xfc\xb1\x94\xf6\xbe\xe5\x92\xf5\xd5\xfb\xf8\xf7\x2b\x36\xc8\x5b\xbb\xc3\xff\x2c\x2a\x8b\x07\x0c\x07\x90\x2a\xa4\x08\x4c\x33\x3d\x65\x24\x0d\x36\xf9\xc6\x6f\x5e\x9f\x0e\xf6\xc2\x6f\x5e\x9f\x3e\xdc\x97\x1d\xd0\x38\x68\xdb\x06\xb5\xfe\x56\x23\xc7\xb6\x95\xfe\xbb\x6b\xfc\x93\xa1\x74\xfd\x4d\x51\xfa\x4a\xaa\xce\x29\x61\x4d\xd1\x71\xe2\x8b\x23\x29\x4c\x03\xf5\xd8\xe9\x33\x96\x57\x99\x85\xda\x37\x60\x2c\xc7\x69\xc6\x9d\xde\x9e\xc5\x18\xe1\x40\x30\x76\x2c\x30\xb6\x90\x3e\xf3\xd9\x08\xe1\x17\xeb\x7f\xf0\x92\x2b\x3e\x77\xb7\xc3\x79\xc8\x72\xfc\x33\xe2\xe8\x3d\xf4\xa0\xab\xf0\x15\xbf\xe6\x32\xe3\x53\x99\x49\xbb\x74\x7a\xdc\xfe\xc4\x2b\x62\x06\x0b\x61\xdd\x94\x37\x26\xd4\x06\x55\x61\xe3\xe2\x20\x50\x30\xd9\x9e\x1b\xff\xe0\xc6\x09\xee\xfd\x49\xad\xbd\x02\x14\x19\x64\xc9\xa3\x8a\xdb\x50\x6d\x3d\xc4\x43\x4b\xb3\xed\xc7\xae\x5d\xd5\x4a\x58\xe6\xe7\x1d\x01\xac\x57\xd5\x1e\x37\xd2\x5a\xb5\x07\xbe\x20\xc4\x89\xcf\x5c\xf3\xc1\x26\x62\x3d\x74\x1f\xd8\x32\x1d\x7f\xdf\x57\xfb\xd9\xee\x97\x0f\x5f\xf5\x02\x0f\x42\xa5\x18\x41\x08\x87\x6e\xe5\x48\xe3\x0e\xba\x20\x51\xed\x91\x85\x40\xbb\x72\xfb\xa6\x4b\x05\x05\x5e\xbd\xa5\x6b\xe0\xd4\x41\x08\x81\x98\x2b\x9d\x37\x4e\xcf\xf7\x49\x44\xb1\x98\xf5\x2f\x80\x3c\x12\xc5\xe2\xf9\x45\x33\x94\xe2\x3e\x63\xcf\x2f\xd6\xc8\x3d\x4c\x94\x71\xef\x6d\x30\xc0\xb2\x6b\x58\x26\x67\xc2\xca\x4e\x44\xd8\xb0\xe4\xcb\xb5\x92\x56\x97\x66\x13\x05\x1f\xf4\xe8\x61\xf4\xae\xd7\x9e\x10\xec\x25\x8d\x8b\xd9\x9e\x89\xce\x32\x91\x58\x6a\x7b\x09\xcb\xea\x1f\xbc\xce\x11\x42\xa9\x00\xc6\xf7\x89\x26\xa7\xc7\x01\xb2\xda\xc1\xeb\x93\xc3\xe3\x97\x27\x93\x3c\xfd\xdd\x42\xdf\x8c\xad\x1e\x57\x46\x8c\xa5\xed\xa7\x2b\x6d\xb0\x22\x64\x00\x07\xb4\x5d\x0c\xb3\x80\x35\x1c\xd1\x1b\x53\x03\x86\xf9\xc0\x6f\xa9\xb5\x5d\x85\x0c\x9b\x55\x59\x86\x6b\x6a\x4b\x21\x46\xb1\x3b\xf1\x9e\x80\x6a\xf5\xf5\xb0\xf4\xd7\xdd\xf5\xbd\xa1\x87\x3f\x9a\x1f\xca\x66\xe8\x7f\xca\x77\x55\x8d\xd9\x7b\x68\x7f\x11\x46\xf6\xd9\x7c\x8e\xf1\xdd\x4a\x5c\x89\x25\x83\xd4\xfe\x99\x2e\x01\x66\xb3\xc9\x85\xc2\x26\x40\xae\x03\xe8\x69\x49\xba\xc2\x03\x21\x75\x1f\x2d\x02\x5e\xe4\xb5\x98\x7d\x1c\x42\xbf\x16\x33\xac\x9e\xf0\x09\xce\x64\x5d\xf0\xca\x2e\x30\x0d\x12\x61\x8f\x90\x9c\x6b\x29\x4f\xe5\x18\x0f\x84\xd4\xbd\x12\xe9\x87\x28\xf6\xea\x03\xda\xcf\x56\xd6\x2b\x76\x13\xd2\x22\xd9\x7b\xc7\x15\xf4\xb5\xb3\x2d\xc5\xcd\xc1\x8d\x2e\xaf\xa4\x9a\x8f\x6f\xa4\x5d\x8c\x91\x52\xe6\x00\x40\xd8\x0e\x7e\x07\xff\xa1\x68\xed\x61\x9a\x52\x66\x59\x65\xc4\xac\xca\x30\xe7\xcb\x4c\x18\x2f\xe4\x0f\xa2\x34\x90\xbf\x78\x25\x55\x3a\x62\x95\x4c\xbf\xe9\xba\x62\x6c\x88\x0d\xd2\xbd\x89\xda\x7b\xcf\xc5\xd2\x8b\x9f\x92\xa7\xda\x20\x04\xaf\x23\x51\x83\xf5\x79\x9a\x4b\xf5\x50\x38\xbf\xab\x6a\x2f\x55\xda\x8d\x82\x4d\xea\x1d\xc1\x38\x4d\xdd\x1e\xc7\xf6\x31\xe3\x90\x45\xc3\xbd\x2f\x03\x7b\x6c\x51\x3e\x4d\x33\x9b\xe6\x4e\x02\x25\x5f\x9a\x5f\xb2\x31\x3e\x65\x5c\xa4\x35\x5d\xb7\xa9\x31\xf7\xb9\x3e\x66\x6a\xcc\xb0\xee\xef\x4f\x90\xf0\xf2\x51\x79\x8c\x6d\xd5\xde\x0d\xd0\xba\xbf\xa6\xfb\x11\xf4\x2f\x00\x81\x37\xbe\x32\x19\xd4\x2b\x94\x3d\xde\xb7\x85\x7d\x05\x03\xea\xb0\xaf\x31\x4a\xb4\x52\x04\x48\xf7\xaa\x10\xea\xc2\xf2\xe4\xaa\x67\x5c\x74\xab\x33\xfd\xc6\x74\xa6\x61\x73\x65\x7c\x1a\x74\x1a\x78\x14\x4b\xa8\x28\xa5\xac\xce\x92\xc6\x8d\xfd\x08\xa5\x2e\xc2\xab\xbf\xe4\x45\x7f\x0f\xa8\x1f\xa9\xa5\x28\x85\x8f\xc9\xe9\x09\x55\x35\x85\x2e\xaa\x0c\xf1\xd6\xa4\x21\x3a\x7e\x7a\xc5\xa6\xef\x06\x27\x7d\x79\xb8\x9c\x91\x5a\x86\xe6\x3a\x15\x6c\x2a\x6d\x2d\x1d\x8d\xb0\x58\xb8\x4b\x28\x34\x5a\xb1\x84\x90\xe6\x40\xeb\x70\x1a\x06\x4d\x28\xd2\x48\x14\xd3\x89\xf5\x05\x7f\xa1\xc6\xf7\xc9\x93\x27\x4f\xb0\xe2\xf2\xbf\xfe\xeb\xbf\x98\x2e\xa1\xdd\x43\x22\xf3\xd5\x1b\xe1\xae\x3f\x3f\x7d\x3a\x61\xff\x38\x7c\xf9\x02\x72\xff\x0b\x6b\x10\x04\x1c\x47\x76\x37\x34\x7e\x6c\x46\xec\x7f\x5d\xbc\x3a\xf3\x6a\xa3\x69\x7d\x0b\xa6\x76\x78\xbd\x26\xf4\xe2\x93\xbf\xfc\xe9\x4f\x13\x76\x2c\x4b\xa8\x7d\x92\x22\xb4\xf5\x0a\xde\x12\x5e\x0a\xac\x10\x05\x7c\x40\xaf\x57\xc9\x80\xa0\x4f\xe0\x09\xd8\xf8\x10\x8b\x19\x1d\x07\x66\x32\xb1\x58\x66\x85\x82\x2c\x34\x55\x06\xd4\x46\xc2\x41\xa5\x64\x5d\x98\xdc\x88\x65\xf2\x4a\xb0\x99\x81\x86\xa2\x75\x25\x3d\xf5\xba\xa1\x92\x12\x1c\xac\x5e\x2b\x23\xec\x23\xcf\xfd\xec\xe5\x0b\x6e\xa3\x17\x37\x9a\xb5\x41\x9d\xe7\x95\x58\x8e\x91\xc3\x0a\x2e\x43\xc1\x08\x24\xc7\x35\x1a\x2c\x04\xaf\x4d\x1a\xc9\x15\x0f\xb0\x58\x94\xfa\xdf\xb8\xf8\x50\x40\x1a\x49\x62\x28\x43\xc5\x06\xbb\x80\x94\xa0\xa2\x6e\x1d\xbe\x08\x96\x3a\x7a\xf9\x8f\x09\x26\x74\x15\x6b\x39\x93\xc6\x3d\xe2\x4a\x2c\xcd\xfb\x9e\x5c\x37\x8a\x71\xfc\x69\x90\x53\x2a\xb5\xf2\x6b\x82\xdd\x27\xc9\x48\x1d\x16\x08\xee\xa6\x1e\x03\x6b\xff\xa9\x0a\x9a\xee\xf5\x54\x0a\x84\x68\xa4\x2b\x1b\x61\x2b\x22\x0d\xe4\x9d\xbb\x67\x03\xfa\x3f\xbc\x61\xce\xcb\x2b\xe1\xfb\x0a\xf3\x6c\xc2\xce\xdd\x24\x03\xde\x48\x68\xeb\x0c\x76\x2b\x5f\xc2\x63\x49\x49\x83\x87\xec\x4e\x26\xbb\xb8\xf1\x74\xc9\x8c\xe5\x25\xed\x22\xf7\xf9\xe7\x01\x61\xf5\x92\x17\x06\x21\x55\x9c\x56\x0a\x70\x43\x1a\x60\x5a\xed\xa2\xee\x29\x88\xb4\xde\xc2\x4e\xb1\x31\x10\xa6\xf3\x00\x0f\x11\x72\xea\x92\x64\x83\xd5\x7e\x7b\x3f\x08\x20\xa4\xbc\x87\x52\x81\x57\x2f\xd5\x82\x30\x76\x33\xf1\xa8\x74\x89\xf5\x3d\x35\x48\x52\x46\xda\x5a\xab\x11\xe8\x63\x55\x19\xf0\x1a\x42\x71\xc0\xab\xbf\xfa\x80\x57\x9f\x80\x2e\x5e\x2b\x3b\x34\x9c\x54\x78\x18\xcd\x6a\xd2\x03\xe2\x79\x11\x8e\x78\xab\xb1\x3d\x88\x6f\x73\xa3\x18\x9f\x1a\x9d\x55\x16\x7f\x5a\x7f\x19\x1f\x73\x30\xa8\x47\x5e\x82\xb3\x2d\xdc\x16\x1d\x7a\x70\xdc\xe3\x39\xd1\xe7\xfc\xc3\xab\xb7\x98\x18\xac\x85\xf2\xe7\xed\x55\xe8\x4d\x67\xaf\x3b\x0d\x93\xeb\x44\xc5\x50\x37\x0b\x41\x59\x08\x91\x5e\xe7\x84\xa7\x13\x09\xa0\x34\x7a\x15\x0d\x5b\x96\xa7\x1b\xf1\x12\x26\x46\xf6\x77\x0b\x5c\x9c\xb2\xbd\xd0\x6b\x34\xa4\xb3\x9d\x2a\x2b\xca\x19\x4f\xc4\x7e\xec\x2e\x10\xc5\x42\xe4\xa2\xe4\x59\xc8\x50\xf6\x75\xca\x0b\xae\xd2\x8c\x8a\xf7\x45\x09\x1b\x57\xbc\xb3\xa2\x54\x3c\x83\x47\xa4\xa5\xbc\x16\xa5\x61\x7b\x7f\x17\xce\x96\xc0\x1e\xa5\xfb\x8f\x30\x8d\x14\x5f\x64\x13\xce\x0c\x78\xf0\x30\x09\xa0\x30\xd4\xba\x36\x89\xf5\x52\x79\xc0\x22\xb7\xac\x26\x76\x03\x4d\xdc\x86\x80\x13\x13\x84\x2e\xb4\x03\xc2\x68\xa4\xef\x7e\x07\xa8\xc5\x89\xc5\x81\xb9\xa1\x6e\x78\x00\x09\x43\xf2\x9c\xa0\x42\x36\x56\x0a\xf0\x49\x8a\x2e\xde\x57\x32\x31\x23\x03\x52\x5f\xcb\xd4\xab\x41\x90\xcd\x50\x43\x6e\x15\xdc\x44\x95\xfc\xdc\x18\x4d\xcd\x3e\xa3\x35\x42\x73\x14\x94\xa5\x26\xa0\xb4\x8f\x14\xc7\xf1\x2e\x0d\xb0\xac\x9d\xba\x59\xb0\x41\x0e\x44\x9d\x8a\xf3\x6a\x9a\x49\xb3\xb8\x18\x34\xb4\x71\xb6\x66\x60\x4c\x0c\x5c\x49\x2e\xb9\x35\xdc\x61\x84\x32\x92\x9a\x8f\xa1\x9a\x25\x9d\x96\xad\x61\x19\xfc\xaf\xe3\xdd\xa1\xa1\x50\x1c\x5a\x9a\xf9\xaf\xa2\x79\x10\x72\x07\xf6\xd2\x49\xc5\x1b\x55\x34\x3e\x4f\x78\x96\x99\x76\x17\x69\x7f\x90\xa1\x66\xea\xd1\x3c\x90\x2b\xa4\x63\x18\x3f\x7b\xc8\x9a\x41\x29\x16\x60\x4d\xd7\xbe\x98\x61\xb9\xc6\x8a\x7f\xc5\xb4\xf2\x37\x41\x4b\x20\xff\x83\x40\x21\x04\x1b\x43\xa6\xdb\x20\xa0\xe4\x36\xa6\xf3\xf8\x62\x3a\x83\x46\x85\x2f\x42\x7f\x06\x0e\x03\x8f\xa1\xb0\xc9\x77\x99\xe5\xa1\xf0\xbf\x36\x1c\x27\x1f\x0a\x1f\x6f\x2c\x82\x8b\xf3\x3b\xb4\x84\x09\x3a\x8c\xdf\xf6\x87\xd6\xa0\xa0\x8a\x39\xcb\x1b\x04\xd3\x98\x6c\xeb\x24\xda\x49\x64\x12\x87\xed\xbd\x2a\xce\xea\x33\x1d\x8e\x73\xfc\x70\xd7\xb0\x54\x27\x95\xb3\xb9\x6a\xb2\xd7\x09\x13\xfd\xa0\xde\x3f\x2f\xec\xd9\x54\xdf\xa8\x1b\x5e\xa6\x87\xe7\x9d\xaa\x56\x9b\xca\x59\x3d\x56\xac\x7a\xfb\x47\x30\xf7\x39\x9f\xfa\x6e\xff\x01\xfc\x69\x1b\xb8\x6b\x0f\xf1\x21\xef\x1a\xf5\x00\xbf\x5b\x9c\x8e\x6d\x43\x7f\xdb\xd0\xdf\x67\x13\xfa\x73\x23\x35\xdb\xa4\x34\xc4\x0b\x39\x64\x1d\xc5\x3f\x8b\x18\x52\x24\x52\xf1\xf4\x6c\xd7\xc3\xb6\x74\x7e\xdc\xbc\x35\xd7\x45\x76\x82\x97\xb9\xa0\x8e\x7d\x0e\xf1\xa6\x07\x10\x2f\x02\x5a\xf6\x30\x06\xf1\xba\xad\x54\x0c\x91\x5a\x31\xf0\x1c\x45\xb0\x0b\x9d\x3e\x43\xe0\x54\x68\x9b\x8e\x0d\x3b\x46\x04\xda\x3c\x22\xdf\x85\x8a\x1a\x85\x63\x5f\x66\xaf\xfe\x0c\x12\x13\xe8\xc9\x00\x6c\x20\x26\x60\xc0\x08\x40\x9d\xf3\x3e\xdc\xc0\x06\xe3\x08\x77\xd5\x86\x4e\xdf\x91\xda\x0a\x34\x8e\xea\x19\xc1\x24\x0b\x91\x63\xf3\xf0\xe7\x9e\x04\x4e\x36\x3a\xe3\xc1\x0a\x44\x48\x13\x65\x6e\x98\x9e\x8d\x1a\x10\x0a\x3b\xd7\x4f\x77\xfa\xc5\x18\xd8\x70\xe1\x48\xe6\xf7\xd1\x79\xef\xd8\x0e\x6b\x13\xec\xbc\x11\xd2\x71\x7b\x08\x74\x9e\x0c\xfb\x16\xb7\xb2\x2c\xe0\xfc\x40\x0a\x3f\x18\xe2\x3c\x94\x58\xed\x28\x44\x0d\x1e\x81\xf2\xb7\x8d\xd5\x7e\x8e\xb1\xda\xe8\x60\xf4\x82\x8e\x08\x1b\xc7\x6f\xe3\x90\x80\x0f\xe2\x4e\x85\x37\x6a\xc8\x86\xf1\x11\x5c\x1f\xbe\xd5\x65\x33\x35\x69\x77\x32\xd9\xdd\xf5\x41\x5d\xe2\xfb\xca\xce\xc6\x5f\x31\xa1\x12\x9d\x22\xb3\xb8\xf1\x4b\x63\x41\xdd\xab\xbd\x6c\xf1\x5c\x72\xff\xac\x38\xbd\x09\xc6\x1e\x62\xa9\x7b\xcb\x16\x8f\xc6\xf7\xfc\x23\x28\x31\xb5\xea\x12\x30\xff\x88\x44\x01\xd3\x99\x74\x18\xff\xbd\x61\x99\xcc\x25\x35\x0f\x73\x1b\x5d\x18\x6b\xd8\x1e\x7e\x38\x49\x8a\x6a\x44\x37\x4c\x72\x91\xeb\x72\x39\x0a\x37\xb9\x2f\x1b\xbf\xa2\x3b\xf6\xb1\x09\x45\x55\x96\x42\xd9\x6c\xf9\x39\x6b\x40\x9e\x88\x0f\x44\x01\x0a\x6b\xdc\x07\xc9\xa3\xbe\x5a\x35\x73\x21\xe2\x0b\xde\xf2\x08\x63\x3f\x80\xb5\x9a\x51\x08\x49\xc0\xa7\x42\x5d\xb3\x6b\x5e\xde\x13\x3d\x7d\xdd\x35\xa0\xce\x93\xca\x6b\x69\xfa\x76\xf6\x63\xb7\x3b\xa1\xa1\x6f\x57\x65\x8b\xca\x92\x44\xf7\x3b\xd0\x23\x6d\x87\x9d\xd7\x52\x0e\x9f\xee\xf4\x9e\x52\xc1\xad\x15\xa5\x7a\xc6\xfe\x7b\xef\xed\x17\xbf\x8e\xf7\xbf\xd9\xdb\xfb\xe9\xc9\xf8\xaf\x3f\x7f\xb1\xf7\x76\x02\xff\xf8\xc3\xfe\x37\xfb\xbf\xfa\x3f\xbe\xd8\xdf\xdf\xdb\xfb\xe9\xfb\x97\xdf\x5e\x9e\x9f\xfc\x2c\xf7\x7f\xfd\x49\x55\xf9\x15\xfe\xf5\xeb\xde\x4f\xe2\xe4\xe7\x3b\x0e\xb2\xbf\xff\xcd\xef\x7b\x4f\x9d\xab\xe5\xab\x9e\xa2\x10\xaf\xf1\x80\x47\x72\x73\xc4\x41\xd8\xaf\xd5\x5a\x41\x2a\x3b\xd6\xe5\x18\x87\x7e\xc6\x6c\x59\xf5\x13\x26\xf5\xf1\x32\xf4\xfe\xaf\xd5\x80\x1a\x72\xde\x2b\xf5\x1b\xde\xe0\x10\xf1\x3c\x96\x03\x14\x06\x9f\xd0\x48\xcd\x8a\x17\x2b\xf2\x42\x97\xbc\x5c\xb2\x94\xbc\x99\xcb\x35\x80\x3f\x11\xe2\x4f\x6f\x34\x5d\x78\xa3\x54\x96\x1b\xa8\x0d\xee\x0d\xe0\x23\x52\x59\xe5\xc3\x38\xe1\x7f\x04\xe4\x79\x42\xad\xf7\x09\x44\xf8\x00\x1f\xbe\x98\xf2\xe4\x0a\xed\xa5\xb0\x36\xa8\x25\xc6\x20\xd2\x3b\x94\xf7\x90\x0b\xae\x82\x1b\x1f\x32\x59\x74\x2a\xdc\xc2\xf9\x9b\x71\xec\x86\xcb\x1d\xc3\xe9\x94\x25\x58\xf7\x60\xd2\x25\x7b\x09\xea\xce\x46\xd7\x9a\x0d\x02\xdb\x21\xff\x23\x5e\x38\x1d\x6f\x20\xb8\x78\x0d\xc6\x24\x61\x64\xcd\xa0\x8b\x54\x9d\xfe\xd5\x50\x1b\x60\xdd\xc2\x9e\xf3\xc1\x59\xb7\x7a\x6e\x4e\xa8\x78\x82\xd7\x39\x33\x98\x8b\x22\x13\x68\x74\x04\x86\x27\x50\x3f\xac\xd8\x65\xd4\x0d\xb1\x32\xee\x49\x5a\x35\xef\xa9\x1f\x84\x7d\xa0\xa6\xc8\x02\xd4\xdb\xb0\x65\x2e\xbb\x6f\x2e\x3c\x5d\x22\x67\x05\x94\x13\x7b\xdb\xd2\x54\x60\x81\xd0\x53\x48\x8f\xd6\x33\xc8\x96\x88\x1a\xd2\xf8\x9e\x2b\x2b\x7c\xa9\x64\xd6\x64\x4c\xdf\x68\x21\xbc\x78\xa5\x28\x5b\x70\x85\xcb\xd6\x33\x59\x65\x44\x39\x9e\x57\x32\x1d\x8e\xbd\x1e\x9d\x4e\xd1\x53\x93\x18\x4a\x7f\x18\x44\x6b\x18\x5c\x57\x08\xf9\x98\xbd\xcf\xca\x9d\x93\x90\xda\xd9\x38\x2c\xe3\xc6\x10\xcd\x34\x4f\x1e\x1a\x7e\x79\x61\xe0\x73\x09\x2e\x83\x9f\x88\x0e\xd1\x64\x99\x10\xa8\x92\x6c\xf4\xa6\xc1\x61\x71\x4f\x40\x45\xd4\xd8\xfd\x9f\xf7\x27\xf9\x10\xea\x54\xcc\x30\x8b\x09\x7f\x03\x6e\x00\xaa\xe3\x4a\x45\x26\x2c\x94\x65\x09\x55\xb7\xbb\x33\xac\x14\xb9\xbe\x76\xdb\xec\xad\x62\x6f\x0c\x05\xc3\xe5\xec\x19\xe3\xfb\x8d\xc2\x60\xea\xb1\xab\x84\x48\xb1\xb8\x2b\xea\x9a\x57\x56\xca\x8c\xd8\x74\xdf\x27\xab\x1a\x6c\xec\x58\x82\xc7\x8c\xda\x57\x81\x93\xaa\x14\x8e\x00\x00\x0f\x55\xea\x9c\x19\xc5\x0b\xb3\xd0\x16\xfc\x21\xbc\xe0\x89\xb4\x4b\x66\x4b\x9e\x5c\x41\x73\xe8\x52\xd0\xe3\x46\x2c\xd9\xa7\x94\xf5\x98\x7c\xcd\x7a\x33\xbb\x28\x75\x35\x5f\x40\x01\x14\xde\x95\x64\xdc\xf8\xb7\x5f\xfb\x7b\x32\xd0\x0d\x4b\x97\x8a\xe7\x32\x09\x7d\x33\x4a\x7d\x2d\x8d\xd4\x14\xc6\xf2\xe3\x9e\x87\xee\x02\x18\x1a\x3b\xca\xb8\xcc\xd9\x9e\x11\x82\x05\x96\xc0\x6f\x2e\x50\x4d\x44\x37\x61\xd9\x4c\x94\x23\xf0\x44\x42\x08\x70\x9f\xd4\xa2\x37\xe4\x21\xe0\xd9\xef\x66\xbe\xf6\xa1\xfb\x61\xb9\xd6\xcf\x49\x97\x90\xc4\xe6\x3b\xde\x08\x95\xea\x28\xdd\xe5\xf0\xfc\xd4\xc4\xc6\x2b\xf5\x09\xc4\x91\xe0\x8b\x4c\xab\x79\x0c\x2c\x57\x73\xa6\x13\xf2\x0a\x1a\x3e\x5e\xcb\xb4\xe2\x19\x8a\x77\x9a\xcc\xd1\xc5\x29\xfe\x5c\xce\x17\x76\x7c\x23\xc0\xb5\x89\xa7\x60\x9d\x0e\xed\x1f\x2a\x57\xd2\x68\xa5\x81\xe3\xc0\x92\x0b\x0d\xdd\xc4\xd0\x54\x91\x2f\x01\x95\x96\x12\x36\x1b\x99\x36\x1e\x9d\x1d\x87\x58\x47\x71\x98\xde\x61\xe8\x00\xe8\x34\x20\xf0\xfd\x3a\x12\x03\xa7\xae\xce\x0d\xda\x19\xd6\xbd\x24\xc2\xc7\x36\x6a\x27\xea\xb4\xdd\x2e\x86\xeb\x86\xb5\xd4\xeb\x9a\x4d\x2e\x45\x5e\x64\xdc\x0e\x93\x37\xb2\xf3\x63\xe4\xdb\x8e\x22\xc3\x6e\x3b\x72\x95\x8e\x79\xe6\x38\xf2\xfc\x87\x23\xaa\x4e\xc3\x0d\xd6\xc8\x4d\xbb\xac\x9b\x70\xa2\x72\x80\x5a\xd2\xda\xad\x05\x90\x66\x53\x91\x82\x30\xa2\x27\x83\x03\xe2\x46\x61\x57\x56\xf7\xc7\xf9\x0f\x47\x23\x26\x27\x62\xe2\xff\x0a\xb7\x7a\x69\x68\xf5\x1c\xab\x17\x42\x55\x0c\xf0\x33\x4c\x25\xf6\xec\xc6\xbf\xfd\xd7\xd7\x6e\x92\xee\xdb\xbf\x8d\xbf\x8e\xfa\xf8\xfc\xed\x5f\x4e\xb8\x96\xee\x86\xe6\xa7\x71\xf2\x38\xc8\x3d\xf7\xd7\xbf\xce\x75\x7a\x51\x88\x64\x82\xaf\x65\xfe\x45\x2d\xcd\x85\xb2\x4e\xb5\x3e\xd7\x90\x36\x26\x53\xe4\x72\x78\x76\x29\xfe\xed\xbd\xff\xd4\x0f\x94\x04\x49\xc2\xad\x50\x70\x00\xf8\x2a\x61\xa5\x2d\xfe\x1c\x3b\x89\xc2\xfc\xf7\x66\x71\x6f\x4f\xab\x35\x6c\x73\x14\x25\x87\x8a\x89\x77\xd2\x00\x26\x0c\xbe\x2b\x90\x83\x53\x66\xba\x3f\xd3\xdc\xb0\x8e\xc2\x01\x03\x08\x9a\x8b\xba\xb9\xfd\x41\x69\xfb\x87\xb0\xfc\x3e\xeb\x10\x0e\x2e\xcd\xf8\xb5\x06\xdc\x09\x90\xea\x8a\x55\x0a\xdc\xd6\x75\x6f\xbe\xe9\x92\xe5\xd2\x58\x7e\x25\x26\xec\xc2\x9d\x59\x71\xfa\x00\x52\x4f\x31\xe8\xae\x22\x52\x56\x29\x2b\x33\xf8\xb6\x1e\xc7\x4d\x39\x3e\xcb\x4e\x67\xcc\x54\x09\x74\x9f\x2d\xc5\xd8\x9f\x8e\x74\xd7\x8a\x8c\xa9\xdf\x65\x14\x16\x7b\xc1\xd1\x5c\x2a\x52\xf8\x29\xf6\xb2\x55\xc4\x5e\x2b\xb9\xd2\x6e\x9e\x5a\x25\xf5\x89\x08\xc4\x84\x86\xc6\xee\x10\xcc\x7c\x76\x0f\x5a\x6e\x14\x0d\x50\x22\x11\xc6\xf0\x72\x89\xed\x3e\x65\xe8\x4a\x48\x69\xac\x70\x52\xe7\x5c\x55\x30\x40\x29\xb0\x79\x6c\x95\x00\x75\x38\x9b\x96\xfa\x4a\xa8\x50\x1f\xe0\x56\xb1\x99\x24\x5d\xa7\x84\x42\x70\x5e\xb3\x64\xc1\xd5\x5c\xd4\x25\xe0\x39\x4f\x81\xf6\xdf\x07\x4d\xcb\xbf\x8f\xa3\x00\x9f\x39\x85\x45\x5a\x20\xc5\xd4\x9d\x4f\x21\xa6\xf1\x56\x31\xef\x14\x19\xd5\x41\x07\xf7\x4a\x32\xeb\x24\x13\xd9\x30\x5e\xee\xfe\xfe\xed\x31\x28\x14\x1b\x4c\xc8\xce\x85\xe5\x29\xb7\x7c\xb0\xa4\xec\x97\x3c\xb4\xb5\xa4\x8c\x0d\x60\x87\x28\x93\x83\xce\x58\xaf\x4a\xea\x42\xc6\xa0\x00\x20\x0d\x16\x7e\xf5\xb1\x1d\xbc\xe3\x6b\x8a\x28\x62\xae\x35\xe8\x6a\xd4\xe9\x1c\x86\xf7\xa3\xa1\xc8\x12\x29\x4b\x2b\x50\xfb\x6a\x91\xd6\x27\xe2\x3d\x48\x40\xc4\x2d\xf4\x60\x54\xbe\xac\x03\xfb\x49\x33\xf1\x7a\xad\x82\x86\x67\x9d\x50\x56\x62\xd7\x72\x8f\xe2\x40\xc4\xaf\x14\x6e\xd5\xd6\x32\xc0\x3a\xcd\x85\x35\x75\xca\x24\x9e\x26\x4e\x44\xd2\x59\x4e\x4e\x04\x38\x6a\x68\x69\xc8\x0e\x5f\xaf\x29\xe2\xc2\x19\x4d\xa7\x85\x3b\xbf\x36\xbe\x32\xc3\x45\x86\xb0\xbf\xeb\x4b\x9d\xf6\x0f\x31\xb5\x1a\x95\xd6\x03\xd7\x15\x24\x58\x4d\x64\xc0\xc9\x83\x4f\x86\x80\xbb\x69\x60\x5c\xe0\x11\xb0\xe0\xd7\xdd\x7d\xa5\xb5\x66\x3a\x0e\x4d\xc8\xe0\x71\x63\x78\xdc\xf8\x69\x5f\xaf\x74\xff\x94\x44\x7f\xf5\x4c\x4d\x6c\x4e\x68\x80\x30\x84\x13\xad\x17\x83\x44\x09\xda\x9d\x22\xc3\xc9\x4b\x09\x17\x21\xc9\x85\xca\x64\x85\x74\xf2\xf2\x19\xfb\x43\x43\xd7\x22\x9d\x36\xd8\xc1\x58\x93\xb4\xe7\x0d\xe3\x09\x2d\xb9\x07\xdc\x6a\xde\xbe\xdf\x1a\x0c\x94\xbc\xf5\xf6\xa2\xaf\x7d\x0a\x8a\xb7\x53\x92\xa1\xc5\x7c\x28\x3d\x75\x6c\x5c\xea\x2c\xf3\x6d\xc9\xd1\x36\x6e\xa5\x2c\x41\x17\x1d\x0c\x82\x8c\x82\x03\x22\x68\xfa\x4a\xdc\x04\x95\x8e\x1b\xc4\x0d\xf5\x21\x78\x70\x92\xf8\x3c\xb2\x75\xe3\x85\xfa\xac\x43\xb5\xc4\xa9\x1f\x87\xc5\xf2\x8e\x05\x36\x77\x0f\x72\xba\xbf\xe2\xd3\x0c\x13\x6d\x02\xe1\x61\x2e\x3c\xbb\xe1\x4b\x03\xfb\xab\xb6\xd5\xc2\xf3\x09\x45\xbd\x1e\xf8\xb5\x98\xf5\x68\x95\x1e\x5f\x83\x05\xe9\x87\x0b\xd3\x03\x46\x8a\x54\xdd\x73\x6f\xeb\x61\x3a\x74\x97\x6e\x5f\xc3\x45\xfb\x21\xe1\x11\xb2\x9d\x86\x08\x9b\x36\x5b\x00\x9d\x9f\xc2\xc0\xde\x66\x9b\xc3\x1f\xfe\x2c\x0f\xf1\xbf\xa9\x70\xfb\xad\x46\x76\x02\xde\x8d\x7f\xbb\x26\x1d\xac\x66\xfa\xef\xa1\x4d\x10\x05\x5a\x7c\x99\xaf\x3b\x0a\x0e\xcf\x4f\xf1\x89\x13\x68\x04\xcb\xd5\x92\xb4\x2c\xbb\x90\x65\x3a\x2e\x78\x69\x97\xe8\xb6\x18\x35\x9e\x16\x4a\x1c\x07\x20\xc7\xa0\x11\xdf\x3e\x7d\xc4\xe2\xab\xb1\x46\x40\x3e\x5a\x1f\x1f\x22\xbb\x75\x65\x1e\x1a\x45\xfa\x16\x5c\xfa\xab\x59\xd5\x1b\x61\x83\x79\xaf\xc5\xa3\xa0\x48\x1a\x0b\xe2\x61\x4f\xe4\x56\x5e\x0a\x1e\xac\xa0\x2f\x93\x6f\x49\xc7\x05\x60\x41\x3f\x03\x43\xdf\x4d\x6b\xc4\xe4\xcc\x1d\x69\x5a\x8d\xa9\xda\x3c\x38\xc2\x49\xc7\xf3\x09\x9c\x68\xb4\xbb\xcd\x8a\xae\xce\xf8\x59\xf1\x00\x61\x77\xb3\x3d\xa5\x15\xee\x78\xbc\x77\x1f\xf3\x57\x6f\xf1\xe5\xc2\x2d\x13\xf6\xe3\x42\xa8\xf8\xb8\x8b\x9d\xdf\xa3\x70\xec\x4a\x95\xba\xe5\x86\xb3\x10\x6c\x7f\x53\x25\x89\x10\xc1\x5b\x14\x77\x42\xaf\x25\x12\x4d\x39\xe7\x36\x59\x08\xc3\x8c\x06\x28\x50\x63\x79\x96\xd5\x5e\x1a\x22\x97\x06\xcd\xc1\x7b\xcc\x23\x85\xa2\x51\xa4\x4d\x0e\xab\x22\xe3\xe4\x15\x99\x55\x2a\xc1\x0c\x29\x69\x97\x7e\x06\xf1\x09\x0f\x3f\x03\xd3\xd4\xa0\xf3\x46\xce\xd0\x4f\x1b\x99\x98\x81\x98\x20\x52\x97\x28\x44\x9b\x67\x3d\x81\xe0\x39\xf9\x39\xe5\xc9\xd5\x0d\x2f\x53\x03\xf5\xe7\xdc\x4a\x6c\xf1\x37\x6a\x0c\xbb\x17\xcd\xc1\x3d\xbd\xa1\x1b\xec\x07\x43\x16\xda\x3b\xeb\xd6\x63\x18\xaf\xac\xce\xb9\x95\x09\xb8\x68\xe4\x2c\xf2\xba\xe7\xa1\xeb\x42\x88\x9a\xa2\x2c\x87\xd3\x81\x5e\x03\xac\xb5\x12\xeb\x25\xec\x8d\x66\x32\x77\x3a\x17\x87\xf6\xc5\xb3\x50\x6d\xee\xe3\x03\xef\x9b\xa9\x53\x2c\x7f\x84\xa0\x4c\x74\x17\x3a\x7f\x9c\x59\x6e\x60\xf8\x10\x01\x08\xae\x6f\x2a\xab\x1e\xb5\x54\x22\xfa\x8d\xe3\x69\x37\xd7\x88\x55\x47\x6e\x79\x6e\x84\xd3\xb4\xcc\x7b\x19\xd6\x4c\xd6\xcd\x48\xce\x15\x56\xe0\x4a\xe3\xdd\x05\x94\x52\xbd\x97\x96\xba\x28\xc8\xf1\x97\xef\xb7\x67\x04\x71\xb6\xf2\x5a\x18\x88\x31\xfb\x24\x6d\x47\x86\xb9\x50\xa2\xe4\x16\xbc\xf6\x84\x1b\x08\x3b\xb7\xfd\x88\xc6\x86\x99\xb0\xbd\xc3\xac\x58\xf0\x7d\xf6\x86\x9a\xd7\x07\xce\x0d\x39\xdf\x77\xd2\x45\xd1\x8d\x48\xea\xe8\x56\x89\x7c\xef\x30\x5b\x25\x72\xab\x44\x76\xb8\xb6\x4a\x64\xfb\xda\x2a\x91\xf1\x15\xd2\x8a\x87\x55\x20\x5f\x87\x3a\x81\x28\xcb\x23\xce\x9b\xaa\x0b\x09\x6e\xf3\xef\x9d\xce\xd8\x6b\x91\xe8\x6b\x51\xe2\x21\x72\xf2\xae\xe0\xca\x29\x4b\xcf\xb9\xcc\xdc\x11\xe2\x8f\x92\xda\xa3\x01\x3d\x6c\x9a\xfe\xf4\xc8\x89\x14\xd6\x83\x36\x6b\x4e\x93\x22\xcc\x0a\x77\x3f\x45\xed\x8b\x52\x5c\x4b\x5d\x19\x9f\xdd\x55\x59\x14\x16\xc6\x92\x42\xb3\x90\xf3\xd0\x3b\x2e\xe4\x5e\x94\x22\xd1\x65\x5a\x83\x4f\x19\xcb\x6d\x65\x9a\xd5\xa0\x09\x3a\xb0\x87\xf3\x5d\x06\x3a\x3e\xa0\xd3\x73\xc8\x73\x06\xd3\xe3\x06\xdf\xaf\xbb\x2f\x30\xed\x0e\x3f\x9c\x12\x1b\xfa\x4c\xc0\x3a\x0b\xd1\xe9\xbe\x95\x15\x11\xbb\x12\x63\xdd\x7b\x0d\x1b\xc8\x32\x07\xd8\x3d\x7b\x1c\x86\x1d\xd7\x89\x7f\x9d\x9b\x0d\xc6\xd7\x80\xab\xc9\x06\x87\x40\x89\xaf\x47\x97\x27\xd8\xbc\x06\xab\x3f\x60\x1f\xa5\x06\x81\x0d\x5f\x87\xc0\x3e\x7e\x2d\x02\x0b\xb5\x61\xc3\xef\xfb\xd7\xbe\x56\xad\xb5\xf3\xe9\x58\x7a\xdf\xce\x6f\x60\xa1\x85\x71\xa4\x61\x3a\x97\xd6\x0a\x9f\x2d\x12\x76\x32\xf8\xf8\xe3\x5a\x1d\x92\x39\xe0\x4c\xc0\x94\x10\xf1\x2e\x74\x73\x8a\x74\x55\xd0\x38\x6f\xa4\x01\x03\x89\x2b\x67\xd8\x22\x24\x2d\xc8\x8e\x31\xe5\xf6\x7a\x63\x7d\x2b\x87\xfa\x8f\xbb\x95\x43\xf1\xb5\x95\x43\x0c\xda\x62\x65\x50\x18\x32\xa8\x62\x7c\x88\x69\x24\xec\x97\x4a\x94\x4b\xe6\x94\xdb\x3a\x8f\x14\x1a\x5f\x19\x99\x52\x26\x26\x79\x23\xfb\x5a\x94\x0f\x54\xaf\x03\x6f\xe9\xc9\x3b\x67\x1b\x00\x7e\xc1\xe0\x92\xbe\xfd\x80\x26\x0c\x11\xae\x82\x5f\xe2\x86\x45\x30\x21\x9c\xf1\xc8\x46\x70\xe6\xc1\xe1\xd9\xf1\x90\xe6\xfd\x10\xf9\x01\x6c\xb8\x1c\x01\x76\x1b\xa3\xae\x23\x11\x92\x32\x7c\x03\x87\x59\xc8\xe3\x08\xde\x45\x76\x25\x96\x23\x4a\x97\xa2\x4e\x87\xfe\x66\xcc\x3c\x6c\xb6\x63\xe9\x07\xf3\xd7\xbc\x06\x3e\x75\x86\xf4\x07\xe2\xd5\xb7\xfd\x46\x73\x2c\x4f\xdc\x61\x0e\xc2\x81\x0f\xd6\x01\xda\x74\xc4\x57\x83\x49\xa9\x6d\x0e\x24\xd9\x03\xb7\x02\xf0\xbf\x2f\x87\x0a\x0c\x0a\x25\x60\x20\x61\x87\x61\x2f\x36\xb4\x4b\x0a\x2f\xbf\x8c\x1f\x89\x58\x61\x0b\x36\xea\x6e\xae\xc4\x72\xd7\x10\x12\x86\x56\x66\x21\x0b\xdf\xaf\x11\xe4\x24\xed\x4a\xf6\x03\x24\xb8\xf9\x21\x50\x22\x9e\xaa\x11\x3b\xd3\xd6\xfd\xe7\x04\x32\x76\x31\xb0\xa2\x85\x39\xd3\x16\x3e\x79\xd0\xe4\xc6\x57\xfb\x48\xc4\xa6\xb8\x8c\x84\xb8\x0a\xe6\xa6\x43\x2d\xaa\xcf\xe3\x04\xa2\x52\xca\x4e\x58\x18\x69\xd8\xa9\x62\xba\xf4\x54\xb5\xbe\x2d\x95\xa1\x21\xbc\xc7\x3a\x0a\x81\xad\x19\x83\x16\x43\x97\x8d\xb5\x78\xcf\x70\x21\x9a\x26\xfd\x37\xe0\xd1\x86\xf0\x63\x48\x3e\x85\xd6\x48\xdc\x8a\xb9\x4c\x58\x2e\xca\x39\xa0\xa6\x24\x8b\xa1\x97\x78\xa8\x73\x11\xaf\x01\x4f\x47\xbc\x06\xe5\x43\x50\x51\x5e\x40\x5a\xf1\xc7\x51\x7f\x70\x6c\x3c\xae\x73\x5e\x38\x16\xfc\x3f\xee\x54\x06\x2e\xf8\xbf\xd0\x7a\xcd\x4c\xd8\x21\x33\x52\xcd\x33\xd1\xf8\x8e\x7c\x98\xf1\x30\x6e\x04\x67\xb3\xfe\x52\xc9\x6b\x9e\x09\x2c\x03\xe0\x2a\xf4\x4b\xd1\xb3\x15\xa5\x6b\x44\xfd\xd7\x9c\x5c\x0e\x81\xf7\x9d\x2b\xb1\xdc\x19\xad\xb0\xed\xce\xa9\xda\xa9\x01\x98\x1a\x8c\x1a\x94\x0b\x88\xc9\xee\xc0\x77\x3b\x9f\x46\x4f\x7b\x04\xa6\xeb\x60\x3c\x49\x6e\xe6\xa3\x8c\x1b\x33\x04\x16\xcc\xed\xf8\xe6\x17\xd1\x93\xea\xda\x6e\x2a\x25\x19\xdc\x47\x0e\xa5\x8c\x43\x25\xf6\x0e\x40\xe7\x6b\x6a\x1a\xdd\x17\x2c\xae\x7d\xe6\x84\x61\x43\xa9\xeb\x4d\x8c\x84\x50\xe7\xe0\xdc\x42\xf1\x1f\x20\xda\xa1\x67\x71\xaf\x09\x69\xc0\xfd\x24\x7d\xf1\xab\xd2\x96\x49\x95\x64\x15\x05\x3a\xe0\xa7\xe0\xbc\x1a\xc6\x50\x1d\x8c\xbc\x83\x33\xf0\x0f\x61\x58\xaf\x73\xfa\x7c\xa1\x95\x8a\xa6\x76\x6a\x07\x24\xd3\x84\x4c\x09\xa4\xf6\x26\xa9\x35\xeb\x54\xbb\xd1\x6c\x47\x72\xd4\xd4\x23\x9f\xcb\x69\x29\xd8\xd1\x82\x2b\x25\xb2\x08\xeb\x85\x1c\x9d\xdc\x5a\x9e\x2c\x30\x1e\xc7\x99\xdb\xc7\x99\xb0\xbb\x06\xdb\xe0\xe7\x3c\x59\x48\x15\x00\x12\x54\xc0\x3c\xaa\x0b\xc4\x36\xd0\xc0\xa7\xaf\x21\x34\x60\xef\x97\xdd\xdb\x9b\xbf\xd4\xc0\xe1\xb3\xd6\x3d\x35\x82\x3e\xed\x72\xa0\x35\x9e\xb8\xd0\x89\x04\xee\x7d\x7f\xfb\x98\x3c\xb8\xa7\xa5\x9a\x89\xb2\xc4\x35\x99\x0a\xfa\x01\x93\x8d\xde\xae\x13\xea\x29\xb1\xd0\x37\x2c\xd5\xec\x06\xba\x9c\x5e\x3b\xd5\x00\x32\x8b\x8c\x57\x2a\xa2\x99\x42\x9e\x5f\xa2\xf3\xa2\xd4\xb9\x34\xbe\x72\x91\x18\x62\x63\xd0\x26\x59\xd5\x19\x0b\xf6\x36\x00\xcf\xe7\x47\xcc\xf2\x72\x2e\xac\x1b\x9c\xa9\x2a\x9f\x8a\x9e\xd0\x2d\x9b\x86\x09\x1f\xb4\x1b\x47\x44\xa9\x0f\x34\xd9\x60\xaf\xe9\xb9\x08\xaa\x02\x29\x86\x33\x5d\x52\xa2\x64\xf8\x92\xb0\xe0\x1d\xcb\xfd\x40\xe7\x62\xa5\xac\xe9\x09\xcd\xde\xa7\x49\x07\x2e\xff\x8f\x3f\x9e\x0d\x83\xad\xbe\x96\xb7\x6e\x74\x99\xa5\x37\x32\xc5\x24\x14\xc3\xf6\xdc\xe3\xf6\xfb\xbd\xf3\x06\xc1\xd5\x7b\x6f\xe4\x9b\x1b\x99\x7e\x0c\x72\xfb\x7c\x67\x47\x6e\x06\xf4\x96\xa9\x50\xd6\x49\xc1\xd2\xb0\x3d\x78\xec\x3e\x3b\x91\x58\x1d\xef\xfe\x42\xd4\xd2\x7c\x2a\x55\x8d\xbc\x10\x18\x02\x4e\x3e\x27\x17\xbc\x45\x6e\x84\xc5\xba\x66\x28\x0d\xd6\x76\xc1\x8c\xcc\xab\xcc\x72\x25\x74\x65\xb2\x65\x4f\x36\x7e\xac\x4b\x3a\xcb\xc4\x3b\xdc\xcd\xfd\xf5\x97\x30\x54\x53\x8f\x81\x84\xd8\x1a\xcc\x64\x45\x91\xa9\x53\xb6\xd3\x83\xa0\xd4\x84\xe2\x7c\xf1\x4e\x24\x54\xbd\x55\x64\xd5\x5c\x76\x2a\xd4\xdd\x36\x1e\xec\xf4\xeb\xbb\x35\x1e\xac\xdb\xaa\x55\x46\xd4\x68\x62\xfd\x1a\x7b\x3f\x8e\x3e\x81\x1f\x55\x55\xbc\x5c\xdf\x0c\x30\x15\x85\x50\x29\xa0\x93\x47\x3b\x0e\xa7\xbb\x31\x6a\x13\x2a\xf8\xd0\xe7\xc2\xc9\x3b\x5b\x72\x27\xe4\x73\x27\xce\x3d\xf4\xb8\x9c\x31\xae\xfa\x0a\xec\xcf\xa5\x7f\x15\xdb\xea\x8d\xf7\xbe\xcc\xa0\x3d\x2c\x23\x82\x35\x7a\x58\x0e\xdc\xc1\x12\x4f\x3f\xda\xe8\xa6\x59\xec\xb5\xa6\xd3\x24\x3d\xa5\x59\x64\xd2\xaf\xe3\xa4\x59\xd3\x88\xae\x35\xab\x0d\xee\xc9\x6d\xfb\xc9\xc7\xd5\x7e\x72\x06\xf8\x49\xfd\xa1\x82\x9f\xe3\x38\x2d\xdf\x19\x7d\x48\x3a\xe7\x5d\x7c\x65\xb4\xa3\xa2\xe3\x15\xfa\xca\xd0\x40\x84\x46\xc0\x8c\x5b\x8d\xba\x00\xa1\x52\xaa\x9b\xd0\xde\x74\x97\x3e\x6e\xb9\x11\xb6\x8f\x47\x77\xb5\x58\xc3\xeb\x83\x38\x36\x36\xb7\x84\xf2\x49\x0f\x22\xc4\xc6\x7f\x23\xcd\x51\x35\xee\x74\x3a\xa3\x27\xb4\x47\x13\x16\x21\x75\x0b\xc7\x48\xdd\xf2\x26\xdc\xf6\xec\xd7\xde\xe3\x94\xa5\xd9\xbe\x79\x73\x7a\x3c\x08\xcd\xdc\x40\x2d\x9a\x11\x0f\x02\xde\xac\xfc\xa5\x8a\x6d\x60\x40\x3a\x0c\x54\xa2\xfb\x37\x41\x8a\x79\x22\x6a\x67\xfc\xb1\x34\x57\xfd\xc1\xbe\xbf\x3d\x3a\x69\x0e\xd9\xdc\xcc\xdf\x1e\x9d\x30\xfa\xf4\x4e\x3e\xf0\xfb\x38\xc1\xfb\x62\x46\xcf\x13\x51\x87\xc7\x52\x69\xae\x36\x00\x14\xde\xd7\x3c\x2d\xd2\xb3\x6e\x95\x90\x0f\xd9\x9f\xef\xb1\x46\x23\x10\xdc\xa5\xae\xd8\x0d\x61\xed\x91\x01\x77\x29\x8b\x67\xec\x44\x99\xaa\x14\x75\x96\x53\xdb\x96\x73\x3a\xd4\x9d\xcd\x39\x80\x33\x34\xcf\x06\xf3\xff\x0f\xcd\x9f\x9f\x4b\x40\xa1\xe0\xa5\x05\x1b\x6c\x20\xac\x74\x68\x85\x4a\x43\x7a\x22\x7c\x80\x79\x4e\x67\xbe\x4e\x61\x44\x58\x5b\x01\x50\xdc\xdf\xe4\xd8\x25\x02\xdf\x8c\x19\xe4\x79\x00\xbc\x65\x07\xa9\xb8\x3e\x30\x29\x7f\x3a\x82\xc7\xf8\xea\x3a\xdb\x98\x13\x37\x6c\xe7\xe9\xce\x84\x5d\xc8\x5c\x66\xbc\xcc\x96\x8d\xae\x5e\xf5\x7d\xee\x30\xf5\x03\x42\x12\xc8\x93\x1d\xb6\xa7\x4b\x18\x39\xe1\x8a\x65\xc2\xe3\x13\xd0\xf6\x5d\xa2\xf9\xb0\xff\x30\x64\x21\x7b\x30\xd1\x18\x14\x8b\xc3\xb0\xd7\x1b\x3c\xce\x1b\x10\xae\xc7\xf5\x79\x26\x95\x3b\xe4\x26\xec\x0d\x9d\x4e\x74\xec\x23\x0b\xc0\xae\xf5\x77\x3c\xac\x25\x7a\x30\x3e\x8b\x7e\x9e\x88\x55\x47\xc7\x43\x23\x74\x57\x6f\xc7\x5c\xda\xd7\xa2\xd0\x03\xa8\x68\x38\x50\xcb\xb3\x2f\xad\xfb\x40\x1b\x09\x9d\x58\xb8\x65\x1c\x05\x51\x52\x65\xdc\x59\x64\xe8\xd7\x9f\xb0\xe3\x93\xf3\xd7\x27\x47\x87\x97\x27\xc7\xcf\x98\x1f\x49\xc6\x3a\xfd\x84\x5d\xc6\x28\xcc\x51\xc9\x17\x41\xdd\x86\x67\x8d\x48\xb0\x72\x55\xb7\x91\x00\x54\x4a\xae\xd8\xa9\x92\xb6\xee\x8e\x85\x49\xf4\x99\x56\x94\x16\xef\x7e\x4d\x71\x85\xb9\xc4\xe4\x4d\x45\x83\xb9\xaf\x9b\xa3\xc1\x0e\xc5\x5e\x32\x61\x2a\x9d\xbc\x1b\x1b\xd6\xed\xea\xe5\xd9\x84\x95\xe9\x1b\xc1\x0c\xb2\xc9\x2f\x31\x20\x5b\x77\xfe\xc1\x13\x35\x34\x34\xf4\xa8\xb2\xba\x6c\xf4\x1b\x9c\x4c\x76\x27\xcc\x9d\xd5\xbb\x93\x5d\xaf\xca\x65\x2b\x4d\x31\xc3\xa0\x31\x78\x77\x93\xbf\x27\x8c\xbd\xf2\x65\x84\x80\xc6\xb4\xbe\xbf\x26\x42\x10\x46\xdd\x14\x5b\xbb\xc4\x97\xb2\x57\xd3\xf8\xa1\x84\xf6\x3d\x97\xd7\x42\xe1\x8b\x6d\x4e\x30\xfb\xa9\x0e\xb2\x6a\xaf\xeb\x37\x7f\xf3\xfa\xc5\xe6\x5e\x0a\x25\xcb\x20\xaf\x74\xa4\xf3\x1c\x71\xa8\x17\x01\x45\xa5\x06\x42\x09\x52\x6f\x23\xc6\x39\xa2\x6f\xcf\x3a\x6d\xd8\x96\xc4\xf7\x43\xb5\x8c\xf1\xf0\x31\xd5\xf5\xaa\xda\x1e\xba\x7f\x2b\x2e\x82\x7f\x37\x1e\x50\x94\x8e\xcf\x83\xf0\x1e\x07\xaf\x4f\x0e\x8f\x5f\x9e\x4c\xf2\xf4\x11\x0a\x5f\xa1\xd2\x42\x4b\x65\x4d\x57\xc3\xbc\x5b\x4b\xef\xbe\x62\x3b\x4c\x7b\x18\xdd\xec\xc4\x0f\x17\x27\x7a\xfa\x67\x44\x78\xfe\xa9\xb0\x5c\x66\x26\xe2\x30\xab\x0b\x9d\xe9\xf9\xfa\xce\x5e\xf7\x60\x9d\xdf\x21\x22\xec\x98\x8f\x1d\x4f\x6e\xce\x62\xed\xde\x0e\xb8\x49\x51\xdf\xfe\xd7\x11\xb2\xa6\x56\xb0\x04\xa1\x6b\xef\x67\x40\xb0\x4f\x68\x22\xac\x50\x11\x7d\x32\x20\xe2\x7c\xbb\x85\xba\x7f\x41\xd4\x24\xfc\xae\xb6\xc3\x66\x88\xdf\xd5\x6c\x70\xd2\xbc\x6b\x37\xfa\x26\xd5\xbf\xa3\x91\x9a\x87\x48\x51\x8a\x71\x80\x89\x86\x2e\xd5\xba\x8c\x74\xb0\xf8\x4c\xf1\x4e\x5c\xef\xf2\xc5\xbb\xb2\x65\xdb\x99\x5b\x6b\xe9\xc1\x87\x8e\x48\x7c\x59\xb6\xac\x9b\x80\x90\x4b\x8b\xcf\x11\xfe\xb9\xa4\x48\x59\x51\xca\x6b\x99\x89\x39\x34\xf8\x91\x6a\x1e\x61\x18\xc5\xa8\x47\xd4\xf0\xa7\x19\x35\x7a\xe9\xfe\x8a\x9a\xcc\x01\x67\x9d\xbd\xba\x84\x5e\x51\x90\x0a\xd3\xdb\x98\x74\x0f\x84\x86\xda\xe3\xf1\x18\xfc\x77\x7b\xff\x76\x56\x4d\x9a\xed\xb3\x1f\x05\x3d\x47\x43\x33\xab\x12\xba\xb5\x2f\x74\xe8\x2c\x04\x73\xad\x29\x0b\x0c\x8d\xc9\x71\x74\xd7\x81\xbb\xd3\xa9\xcf\x78\x9c\x37\xee\x97\x02\x20\xaa\xeb\x98\xff\x63\xb4\x80\x36\x74\x88\x0e\x2c\xed\x7d\x9c\x68\xdd\x1e\x09\x71\xfd\x82\xce\x05\xce\xcc\x32\xcf\xa4\xba\xaa\x31\xd1\x67\xda\xf1\x31\xd6\xf5\x4a\x75\xe5\x77\x4d\x29\x78\x76\xfb\x89\xd1\x85\x47\x37\x76\x5a\xd8\xc1\x42\x09\x97\xcb\x02\xf3\xd8\x82\xf0\xa2\x24\xab\x58\xd4\xef\xec\x3c\x6a\x8a\x49\x93\x18\xd9\x5f\xbc\x9f\x5e\x1c\x5d\x9c\x36\x64\xbb\x62\xf8\xd9\xa7\x0c\xd8\xdd\x76\xb8\xc2\x4b\x3e\x6a\x0b\x42\xfe\xd2\x2d\xc3\x69\xcc\xb2\xaa\xeb\x2f\x31\x89\xfa\x5c\x97\x96\x67\x1b\x10\x9c\xc9\x82\x17\x87\x95\x5d\x1c\x4b\x03\x50\x85\xc3\xa8\x7f\x37\x0b\xec\xab\xe6\xdb\x48\x48\xcf\xa4\xf8\x0c\x76\xf4\xdd\xe1\x39\xe3\x95\xe3\x3a\x4b\x2d\x73\x36\x96\x9e\xe6\x29\x70\x81\x25\xbf\x1f\xf1\xfd\xe9\x09\x0f\xea\xed\xb7\x41\xe1\x8f\x1e\x14\x06\xb9\xf8\xb9\x04\x82\xa5\x92\x56\x72\xab\xcb\xc1\xa2\x75\x47\x95\xb1\x3a\xa7\x2d\x72\xea\x87\x87\x1c\x27\x50\xb5\x1a\x4f\x6c\x36\x7d\x05\x43\x11\xc8\x7b\xaa\x9c\x59\xc7\x13\xd1\xaa\x33\x19\x41\x57\x1a\x1c\x5b\x86\x7b\xbe\xa6\x6a\x23\x80\x5b\xcf\xfe\xf6\xac\xd1\xb1\x71\xa5\xad\xae\x77\x3a\xd6\x3d\x5b\x37\xe6\x2d\x96\xbf\x0c\x23\x9f\xc8\xb9\x8f\x74\xf9\xdf\x15\xcf\x90\x9e\x67\x9b\xf4\x84\x37\xd7\x71\x90\xd7\xf4\x3c\xe5\xd7\xfd\x2c\x78\xbf\x2a\x83\x88\xf1\x78\x87\x2d\xb9\x32\x8e\x19\x9a\xfe\x85\x5d\x4a\x31\xd8\x65\x7b\x36\x29\xf6\x37\x46\x99\xa1\xaa\x39\xf1\x65\x69\xed\x5f\x84\x2a\xce\x7e\xef\xb5\xf1\xbc\x01\xd8\xc3\xc3\x38\x4f\x1b\x04\x42\x95\x8c\xbd\x90\xc6\xfa\xe6\xb4\xf0\x81\x34\xd4\xcd\x0b\xb4\xef\x73\xa6\x4b\x26\x8b\x7f\xf2\x34\x2d\x9f\xe1\x59\x4f\xd6\x21\xfc\xdb\x04\xf4\x75\xae\x42\xc6\xca\x9e\x5d\x16\xd4\x34\xe2\xf2\xe8\x9c\x61\x13\xea\xaf\xfe\xf2\x04\x34\xf1\x3f\x7e\xf9\x97\x27\x3d\x59\xed\xb1\x56\xc7\xb1\xa1\xbd\x90\x83\xe7\x29\x7c\x26\x35\x14\xa0\x80\x62\xf5\x04\x9c\x6e\x24\x05\x91\xef\x1d\x13\x86\x33\x77\x48\x35\x75\x5b\x6f\xf0\x1b\xaa\x37\x60\xa1\x60\x1c\xe5\xe8\xc7\x92\xcf\x28\x9a\xcf\x1f\x8b\x68\xee\x48\xcd\xae\x9c\xdb\xe4\x58\x94\x6e\xbb\xbb\x26\xce\xe5\x80\x7a\xca\xe3\xb3\x8b\x7f\xbe\x38\xfc\xfb\xc9\x0b\x78\x4f\xca\x86\x77\xac\x48\x66\x49\x97\xdc\xed\xbb\xb3\x76\x77\x4f\x51\x57\x72\x0e\x11\xb1\x3f\x7b\x7e\xd1\x72\xc5\xb9\x4f\xee\x19\xa6\xef\x6b\x5b\xaa\x59\x0f\xea\x3d\xb6\x20\x01\x34\xe8\x16\xe5\x66\x8a\xbb\x07\x8e\x30\x44\x00\xea\x0d\xa7\x86\xe3\x21\x7c\xc7\xde\x7e\x87\x8e\xbc\xc1\x1e\x9c\x1a\xf7\xfe\x60\xb2\xa3\x18\x52\x71\xf0\x30\xf2\x27\xa5\x76\x3f\xf5\xb0\x1c\x0a\x79\x60\xf7\x02\xc6\xf2\x09\x0f\x4e\x84\x61\x1e\x75\xe9\x4e\x54\x77\x96\x0a\x13\x5a\xf9\x7e\x06\xdc\x5a\xac\xeb\x62\xd7\xff\x74\x58\xdb\x1c\x8f\x1a\x38\xfb\x26\x3e\x51\x88\xbe\x51\xbd\x7c\x5b\x2f\x48\x9f\xcb\xc8\xc9\x55\x65\x0a\x9e\x0c\xda\x47\xbc\xfe\x08\x3f\x01\xa0\xb7\xc7\x78\xc0\xc0\xc4\x37\x54\x66\x15\x9e\x3d\xcc\x76\x3c\xf2\xc3\xb5\xc1\x40\xee\xc5\x25\xbe\xf7\x75\xa1\x3d\xd8\x4b\x8c\x1a\xf2\x20\x59\x88\x3d\xb8\x73\xe8\xc7\x8e\x0e\x84\x4d\x3a\x0f\x8a\x85\xb6\x5a\x0d\x5c\x42\x7a\xbe\x66\xd0\xa6\x3c\xc3\x3b\x8e\xea\xa6\xf2\x35\x5f\x60\x85\x4d\x08\x4d\x3b\x83\xc3\x9f\xd8\x5a\xf9\x20\x75\x33\x44\xfd\xf8\x04\x50\x91\x9e\x1e\x6f\x40\xf6\x3c\x7e\x18\x9e\xfb\x06\xe7\x36\x96\x5e\x9a\x0e\x54\x97\x7e\x7a\x4c\xb6\x80\xaf\x3d\x37\xb4\x79\xd8\xed\xbb\x67\x23\x7a\x92\x2e\xed\x8d\x2e\x87\x82\x2f\x3b\x6f\x0c\xd7\xca\x57\xa4\xef\x56\xf0\x24\x3e\x4f\x59\x81\x6f\xf9\xe8\xe5\xc5\x05\x24\x72\xb5\xba\x65\xb6\x25\x44\xa8\xd4\xfd\x08\x42\xe4\xf1\x08\x8f\x41\xb5\x92\x8f\x0b\x1b\xb5\x31\x93\xd6\xef\x8a\x41\x68\xf4\x03\x0d\x46\xae\x4d\xc7\x1f\xb5\xb8\xe5\x41\x18\xd1\x43\x37\x22\x5e\x4b\xed\xc4\x4f\x37\x29\xd2\x3c\x50\xac\xc8\x0d\xb6\xf2\xcb\x32\xb7\x9e\x5a\xc5\x4d\x00\x09\x5c\x6a\xc4\xb0\x8f\x5e\xce\x0b\xea\xa4\x9e\xea\x1b\x75\xc3\xcb\x94\x1d\x9e\x9f\x7e\x7a\x21\xda\xbb\xf8\x11\x77\x41\x1f\x4c\xfa\x06\x15\x01\x85\x7e\x2a\xad\xc1\x6c\x76\xc8\x47\xb7\xb1\x0f\xc9\x1d\x40\x21\x43\xc4\x89\x30\x27\xae\x68\x16\x91\x8e\xa4\x98\x4e\x2c\xcf\x7c\x23\x5e\xea\xe5\xff\xe4\xc9\x13\x0c\x29\x3c\xf9\xaf\xff\xfa\x2f\x06\x5d\x17\x53\x91\xc8\x7c\xf5\x46\xb8\xeb\xcf\x4f\x9f\x4e\xd8\x3f\x0e\x5f\xbe\x60\x3c\x01\x0b\x0c\x21\x55\x71\x64\x58\xbb\xf8\xc7\x66\xc4\xfe\xd7\xc5\xab\xb3\xba\x95\x7d\xf3\x5b\x60\x8d\xdc\xbf\xde\x84\x1d\x47\xe9\xe7\xb1\xcb\x9f\xdb\x05\xa4\xe4\x2b\x6d\x19\x9f\xcd\x80\x39\x51\x24\x4b\xe3\xc5\x85\xc7\x45\x93\xf3\x85\xef\x44\xee\xd8\x2a\x83\xbc\x78\xe9\xa6\x08\x21\x16\x0f\x25\x88\x69\xfe\x30\x56\x38\x1d\x60\x2a\x23\x96\xc9\x2b\xc1\x66\x06\xfa\x91\xd7\x4d\x34\x4a\x61\x9c\xfd\x94\x70\xe5\x46\xc7\xc1\xc2\xd4\xdd\x24\x1e\x77\xee\x42\xcf\xce\xd5\x0d\x86\xf5\x8d\xe1\x7c\x5d\x12\xca\x13\x47\xf6\xc7\x9a\x4b\xd0\xd4\x17\xc3\xfb\x20\x17\x11\x14\x5f\x10\x9b\x8c\x67\x5a\xcd\x63\xa6\xab\xf5\x08\x9f\x80\xb8\x2c\x44\x57\x62\x0c\xd4\x4d\x65\x98\xde\x64\x28\xb9\x5f\xf2\xa2\x5f\x7b\x88\x66\x68\x35\x82\x42\xe4\x53\x5d\x59\x9f\xf2\x86\x4f\x02\x08\x2c\xc0\x48\x44\x82\xf7\x7a\xf0\x60\x8d\x69\x86\x6b\xf5\x36\x50\x9f\xa5\xe6\x41\xdc\x50\x36\x47\x4c\xf0\x64\xc1\xae\xc4\x72\x8c\x22\xbe\xe0\x80\x7e\x00\x74\x3e\x76\xd4\x6d\xf4\x59\xaf\x9b\xed\x3b\x3b\x90\x16\xc1\x67\x26\xd6\x5c\x1f\xd0\x13\xbc\xa9\x64\x48\xa3\xa6\xbe\x45\x2a\x72\x1c\xfa\x46\x85\x89\x56\x96\x9a\x20\x86\x46\x45\x90\x69\xd9\xaa\xb0\x77\x12\x45\xa4\xee\x67\xe6\x7d\x4f\xae\xd3\x31\xdd\x91\x41\xca\x44\xa5\x56\x7e\x0d\x48\xe0\x90\xf7\x6a\x04\xe1\xf9\x70\xdf\x00\x2f\x4a\xe9\x5c\xc8\x04\xaa\x6a\xdc\xed\x74\xaf\xa7\x52\x20\x44\x03\x01\xc0\x08\x5b\x11\x69\x20\x97\xd6\x3d\x5b\x18\xc3\x24\xbc\x61\xce\xcb\x2b\xe1\xc1\x6c\x79\x36\x61\xe7\x6e\x92\x01\xa7\x1c\xfb\xc6\x5d\x63\x11\x84\x93\x29\x31\xb4\x81\x7b\xc8\xee\x64\xb2\x8b\x67\xe1\x1a\xa0\x83\xde\xfc\x32\x64\xcb\xb0\xc1\x5a\x85\x35\xf5\x20\x5e\x18\x6c\x9d\xe6\xac\x03\x68\x4f\xa8\x01\x77\xc4\x2e\xbc\xb6\xc0\x7b\x82\x4f\xc7\xd7\xc0\x3d\xab\x86\x6d\x7b\x39\x5c\xd3\xcb\x1e\x21\xf0\xe6\x35\x74\xb3\xcb\x01\x5b\x5d\x36\x13\x8e\x49\xfe\xd4\x27\xc8\x50\x7d\xf7\x06\x6f\xac\x98\x0f\xd0\xd6\xca\x5f\xb7\x21\x17\xe7\x77\xb1\x2e\x40\xd1\x76\xb2\xfc\x51\x99\x13\xa7\x33\x90\xa1\xeb\xd1\x5a\x22\x2b\x2d\x1c\x29\x8e\x02\x9b\xb7\x23\x86\xe8\x15\xcf\x06\x32\x2c\xda\x57\x7f\x43\xa3\x7d\xf5\x49\x66\x69\x5f\x2b\xfb\x3c\x9c\xa9\x45\x54\x4a\x0b\x4b\x64\x35\xf4\x60\xb4\x41\x18\x4c\xd8\x4b\x3a\x73\x91\xb9\xf9\xd4\xe8\xac\xb2\x01\x56\x61\xcd\x81\x0c\x83\xfa\x8e\x8d\x08\x37\xe4\x6f\x8b\x8e\x67\x50\x4c\xf0\xcc\x1a\xe6\xa4\xc6\x6b\x40\x61\xd3\x37\x19\x15\xaf\xdf\x58\x4a\x2a\x5e\x03\xae\x82\xd7\x0b\x07\x5e\x89\x0b\xc2\x94\xf4\x75\x80\x0d\xed\x15\xd2\x52\xad\x41\xd5\xd8\x2b\xa2\xd8\xf0\xb0\x2b\xda\x72\x7d\xf5\x77\xbc\xd2\xeb\x90\x37\xf0\xf0\xfc\xf4\xa3\x5b\x99\xd1\xb3\xb6\x76\xe6\x9d\xae\x35\x0e\x5f\x00\x22\xf0\x4e\xa0\xe3\x9a\xa2\x14\x60\x73\xf2\xf7\x37\x60\xae\xac\xbc\xf8\x73\x77\xee\x44\x41\xa9\x56\xcb\x07\xf4\xe0\xd6\x27\x54\xd4\x26\xc2\xa7\xcb\x80\x34\xfb\xfc\x4d\x9b\x07\x6a\x90\x00\xf5\x7b\xd4\xbd\xb4\xaf\x76\x62\x29\x11\x91\x5d\x40\xaf\x7d\xf4\x9e\x44\x6e\x98\x42\xa7\xcf\xb0\x69\x33\x57\x4a\x5b\xec\x31\x3f\xc2\x66\xfd\x66\x84\xee\x15\xa7\x64\x46\x89\x56\x65\x14\xc2\x1c\x58\xad\x1c\x8c\x79\xd8\xe0\x0c\xc4\x80\x89\x80\x76\xe7\xc3\x70\x12\xfb\x08\xdc\xe4\xae\x5a\x2b\x19\xb2\xaf\x7a\x33\xdc\x88\xe3\x7b\x26\x32\xc9\x42\xe4\x1c\x1b\x5c\x78\x02\x39\x79\x7d\x53\x4a\x6b\x05\xe2\x5f\x8b\x32\x37\x4c\xcf\x46\xde\x44\x42\xd4\x93\xeb\xa7\x3b\xc3\xf5\xa7\xff\x08\xb6\x32\xf3\x3b\xb4\x2b\x7c\xd5\x6d\x57\xd3\xf7\xdf\xb0\x23\xdc\xee\x04\x83\x39\x83\x8e\x3b\xaa\xe5\x84\x74\x4a\xc4\x35\xd2\xff\x41\x93\xee\xe1\xb9\x19\x46\x41\x19\xdd\xba\x19\xb6\x6e\x86\x21\x46\xfc\x68\x6e\x86\xe8\xe0\xf6\xc2\xf4\xff\x67\xef\xdd\xbf\x1b\xb7\xad\x7d\xf1\xdf\xfb\x57\x60\xa9\x5d\xcb\x76\x2a\xc9\x33\x69\x4e\xdb\x33\xdf\x73\xda\xe5\xd8\x9e\xd4\x37\xf3\xf0\xb5\x3c\x93\x75\x6f\x26\xf7\x14\x22\x21\x09\x35\x05\x30\x04\x28\x8f\xfa\xf8\xdf\xbf\x0b\x7b\x03\x20\x48\xbd\x48\x89\x7e\x4c\x4a\xfe\x90\x8c\x29\x12\xc4\x73\xbf\xf7\x67\xdb\x05\x08\x4d\x0f\x21\xfe\xbb\xb3\x3f\x14\xb8\x0e\x01\x96\xb1\xd9\xf2\xce\xf2\x20\xb3\xb2\xfd\xff\x68\x38\x3c\x3a\x72\xf6\x08\x7b\x3e\x72\x3d\x19\xfc\x91\x30\x11\xc9\x18\x37\x95\x69\x3f\x53\x1a\x84\xda\x42\x01\x0f\xfb\x32\x77\xdf\x0a\x7d\x08\xd0\x76\xbb\x5b\xa2\x45\x0a\xe5\x62\x46\x5e\x3f\xa8\x08\x56\x08\x5e\x1e\xbe\xca\x4e\xa0\x47\xf9\xb3\x12\x58\x11\xc3\x92\xf0\x39\xb7\xb8\x7a\x86\x5c\x30\xa5\x15\x39\xc6\x9b\xc3\x28\xcd\xfb\xf6\x81\xe1\x9c\xcd\x65\xb6\xec\xfb\x87\xcc\x8f\xa5\xb7\xec\x13\x27\x20\xb5\x45\x79\x96\x31\xa1\x93\xe5\xbf\xaf\xfc\xe6\xa6\xf8\x19\x8b\x6f\x7e\x57\x1c\x92\x62\xb1\xee\xaa\xa4\x5d\x78\x60\x7b\x30\xd4\xf9\xd9\x06\x3e\x64\x93\x1d\xfa\xde\x7c\x04\x77\x99\x58\x90\x05\xcd\xf6\x4e\x76\x58\x77\x3d\x88\xc4\x16\xf3\x05\x57\x72\xef\x74\xb1\xb5\x4d\xae\x5a\xbf\xb8\x2d\x04\x20\x73\x9d\xe6\xda\x72\x17\x77\xb6\x1d\xd4\x9c\x3f\xd3\x15\xc1\xf7\x65\xaf\xc5\xce\xa5\x54\x6b\x96\x89\x57\xe4\xff\x1d\x7f\xfa\xed\x3f\x07\x27\x7f\x3e\x3e\xfe\xf1\xc5\xe0\x3f\x7f\xfa\xed\xf1\xa7\x21\xfc\xe3\xab\x93\x3f\x9f\xfc\xd3\xfd\xf1\xdb\x93\x93\xe3\xe3\x1f\xbf\x7f\xfb\xdd\xed\xf5\xe5\x4f\xfc\xe4\x9f\x3f\x8a\x7c\x7e\x87\x7f\xfd\xf3\xf8\x47\x76\xf9\x53\xcd\x46\x4e\x4e\xfe\xfc\x9b\x16\x07\x41\xc5\xf2\x7d\x6b\x24\x18\xaf\xc1\x83\x88\x11\xe5\xb6\x5b\xde\xba\x84\x7c\x1e\x14\xc6\xeb\x01\x17\x7a\x20\xb3\x01\x7e\xe4\x15\xd1\x59\xde\x16\xe9\x2a\xd8\xdf\xc3\xd1\x98\x42\x88\x29\x90\x1b\x9d\x62\xf3\x0c\x89\x08\x46\x8e\x3e\xb8\x35\xd8\x96\x4b\xed\x0c\xc1\x75\xae\x07\x09\x38\xb2\xc8\x30\xff\xe6\xd1\x46\x23\x5b\x91\xb7\x0b\x35\x5a\xb9\xba\x50\xa3\xd5\xab\x0b\x35\x6a\x78\x75\xa1\x46\xcf\xd0\x06\xd8\x85\x1a\x75\x36\xc0\x2f\xc4\x06\xd8\x85\x1a\xd5\xbd\xba\x50\xa3\xbd\xaf\x2f\x33\xd4\xc8\x0a\xf0\x45\x9c\xd1\xb3\x0d\x33\xb2\x05\xfe\xcf\xa2\x48\xe6\x42\xdf\xca\x3b\x76\xa0\x57\xb6\x96\x82\xb9\xf2\xcd\xe7\xa9\x6d\xb6\x25\x52\xb6\x20\x02\xb6\x27\xfc\xd1\x3c\xe6\x46\xcd\x6c\xf9\x18\x9c\xd9\x66\x9d\x9e\x69\xd8\xa2\x88\x59\xec\xbf\xe7\x88\x95\x36\xeb\x3d\x24\x67\x24\x63\x11\x4f\xb9\x21\xed\x00\xa6\x03\xf7\xf1\x9c\xf8\x7a\xc0\x5c\x2b\x96\x4c\x6c\x4d\x54\x51\xe4\x0c\x67\x81\x0a\x69\x79\xc5\xda\xcf\xa0\x54\x20\x5d\x19\x4b\xa2\x66\x32\x4f\x62\x92\xb1\xbf\x39\x71\xc2\xf6\xe6\x36\x6c\x21\x34\x84\xc2\x50\x8a\xcf\xda\xc6\x69\xca\x2d\xea\xd6\x73\x22\x70\xec\x73\xca\x33\x38\x6c\x23\x16\x49\x11\xb7\x6d\xde\xb8\xac\xb6\xef\xd6\xda\x7a\x73\x58\x4c\xe2\x1c\x1f\x80\x44\x48\x9a\xf0\x98\xeb\xa5\x8f\xc2\xc0\x63\x6f\x04\x51\xac\x42\x6b\x37\x82\x2a\x16\x82\xd0\x34\xcd\x24\x8d\x66\x4c\x05\xa3\x41\xb1\xd2\x82\x4d\xf8\xfc\xca\x24\x9f\x72\x81\x92\x25\xbc\x63\xc4\x90\x64\x49\x32\xa9\x5d\x40\xd9\x86\x0f\xde\x06\x8d\xc1\xeb\x28\x4b\xe8\x6c\x09\x51\x67\x32\x6c\x02\x7b\xc5\x27\xe1\x1f\x8a\xc8\x24\x76\xb8\xa5\x7f\x7c\x61\x44\xf9\xc8\xee\x62\x43\xed\x01\x55\x52\x4b\x92\x18\xb1\xc8\x70\x80\xcd\x2f\x7f\xfd\x0d\x99\xc9\x3c\x53\xc3\x10\x42\xe0\x25\xdc\x43\x23\x85\x53\x05\x34\x49\x18\x55\x9a\xbc\x7c\x41\xe6\x5c\xe4\x86\x97\xb7\xb4\xf1\xda\x92\x5e\x03\xb9\xf5\xf7\xdf\x1c\xd8\x5a\x3b\x12\xeb\x6a\x04\x8b\xdd\xad\x29\xd6\x67\xb3\x82\xab\x3d\xe3\x08\x8a\x81\x35\x1a\x2b\x62\xac\x65\x49\xe1\x2a\x0a\x2d\x9f\xf8\xe4\xff\x9c\xcb\xf1\x52\x1f\x0e\x03\xf3\xbf\xb1\x9d\x32\xfe\x8b\xbb\x59\x07\x4b\xb5\x80\x52\xdd\xa3\x2b\x4f\x5e\x2d\x7a\xca\x95\xde\xab\x56\x74\x81\x1b\xb3\xc7\xcb\x87\x32\xf3\xa9\xd1\x78\x5b\x49\x5a\x07\xdd\xd9\xe9\x6a\xce\xa8\x1c\x45\x4c\x01\x29\x72\xf0\x69\x60\x9f\xc5\xaf\xee\xf9\xd1\xe7\x85\xd8\xb2\x15\x91\xc5\x6d\xfe\x16\x2a\x63\x1e\x34\x59\x87\xc8\xf6\x6e\x63\xb7\x34\x5b\xd8\x58\x99\x46\x28\x2e\xa6\x58\xc8\x72\x9e\x27\x9a\xa7\x49\x31\x73\xfe\x05\xcb\x80\x43\x83\x3f\x0d\x2c\xcc\x14\x81\xa3\x10\x1a\x1c\x9c\x23\xc7\xbe\x2d\x26\x34\xd6\x63\xcc\x0c\x1f\x4f\x69\x46\xfd\xf4\x47\x72\x3e\xa7\xea\xc4\xfa\x0e\x28\xc4\xae\x20\x65\x37\x6c\x38\xa3\x89\x1f\x7e\x18\x2b\xf0\x54\x1b\x57\x33\x41\xc5\xde\x4e\xbb\xb2\xc1\x05\x9a\x22\xf2\xde\x87\xc7\x63\xfd\xf4\xca\x8e\xb5\x02\xf1\xb7\x34\xba\x63\x22\x26\x1f\x94\x9b\xb8\x78\x29\xe8\xdc\x82\xab\xa7\x99\xc4\xba\xdd\x2c\xae\xbc\xaf\xfa\xd6\x90\x88\x28\x23\x0e\x04\x0a\xe5\xad\xa7\x9a\xc5\x5c\xb5\x84\xae\xfb\x41\x19\xe1\x6b\x3b\xbd\x53\x68\xa4\xcd\xf8\x22\x62\x4e\x76\x34\x1d\x78\xaa\xc1\x2f\xf6\x46\x7c\x23\xeb\x71\x98\x6c\xd1\x4c\x3c\x85\xc0\xd2\xbd\xf3\x11\x70\xd4\x69\x62\x48\xdc\xd2\xc3\xeb\x54\x36\xd8\x78\xf9\x74\x25\xfb\xb3\xf1\xe1\x00\x4d\x47\x37\xdf\x5e\x94\x89\xd9\x0d\x8d\xa5\x22\xdf\x26\x32\xba\x23\x17\x0c\x94\x86\x87\x2c\xf7\x9e\x8d\xe3\x2f\xbb\x4c\xe3\x9c\x4e\xf7\x8b\xf3\x18\x90\xb9\x14\x5c\xcb\x6c\x1f\x7a\xfc\x8c\xc0\xf6\xba\x52\x7b\xeb\x41\xc4\xb3\x71\xfc\x8b\x29\xb4\x67\x36\x79\x4b\x15\x76\x67\x8c\x64\x40\x62\xa0\x51\x57\xfd\x63\x4f\x82\xf1\xeb\x99\xbc\x1f\x68\x39\xc8\x15\x1b\xf0\xbd\xe3\x94\x0e\x9e\x9f\x3b\xb6\x84\xa0\xaf\x56\x66\xe8\x7b\x6c\xac\xa4\xa2\x6b\x09\x96\x73\xb8\x6f\x04\xb9\x9b\x6f\x2f\x0c\xf7\x1e\x86\x6a\xc9\x29\xd3\xd1\x69\xc4\xd2\xd9\xa9\xed\xce\x17\x3f\xad\x8e\x3e\xb6\x33\xaf\x67\x24\x92\x49\x62\x71\xbb\xe4\x84\x9c\xb3\x74\xe6\x3f\xf1\x3c\xe6\xea\x4b\x2e\x96\x96\x4a\xd9\x4e\x61\xa5\x80\x44\x98\x36\x2d\x85\x08\x36\x7a\x36\x6e\x56\x0b\xfa\x39\x6e\xed\x47\xac\x49\xb2\x4f\x6d\xb9\x67\x31\xbd\xcf\xa7\x46\xdd\xd1\xc8\x35\x07\xf6\x9f\xc0\xdd\x5c\x2e\x49\xe7\xe2\x45\x4b\x24\xfa\x6a\x82\x1a\x66\xcc\x62\x22\x17\x2c\xcb\x78\xcc\x14\xf1\x34\x3a\x34\x2c\xf1\xe4\x79\xcc\x7c\x57\x1d\xef\xcb\x8a\x0f\x78\x3e\x36\x85\x80\x78\x9b\x36\x57\x89\x37\x8d\xe7\x5c\x3c\x8f\x5d\xbe\xe7\x7c\xa9\x88\x26\xec\xea\xfd\xc1\xaa\xf7\x08\xdb\x29\x6b\xdf\xee\x66\x00\xb2\xbf\x03\x78\xfe\x7b\xbf\x67\x89\x90\xf1\x7e\xde\xb0\x27\xd6\xa1\xa7\x54\xb3\xfb\x3d\x05\x9f\x41\x41\xea\xf7\x7d\x1f\x34\xaf\x2f\x5b\x07\x7f\xa2\x02\x19\xc1\xb9\x46\xd4\xfb\xa7\x12\xa7\xec\x0e\x6a\xc7\xb4\xec\xa6\xa2\x52\x5f\xcc\x1d\xcd\xb3\xeb\x2b\xf2\x1d\x7e\xef\xe9\x2a\x7e\x64\x52\xa3\x26\x73\x21\xe7\x94\xb7\x54\x88\x3d\x28\xe8\x14\x0e\xf8\xda\x7f\x8c\xe0\xd7\xc2\x2a\xf4\x13\x3e\xcd\x33\x16\x13\x6b\xfd\xe8\xca\x18\x3c\xe3\x32\x06\xed\x0a\xc5\x85\x4c\x1c\x58\xcc\x5d\x66\x4c\x21\x07\xbb\x5d\x04\xe2\x80\x0f\x41\x22\x8a\x09\xc5\x21\xea\x20\x08\x8c\x03\x61\x19\xe2\xbf\x7d\x1a\x0c\x0a\xce\x7d\xf2\x46\x4e\xb9\x70\xd4\x49\xda\x60\x97\x09\xe5\xc9\x61\xd3\xd9\x49\xba\xff\x66\x92\xae\x52\xc9\xa5\xa0\xe3\x64\xff\x48\xc6\x32\xe3\x4d\x28\xc4\x49\x31\x68\xf3\x34\xe6\xca\xfc\x9f\x8c\x46\x6f\xc0\x37\x9b\x0b\xa7\x19\x82\xd7\xd1\xb2\x0d\x9f\x5f\x8c\xc4\xe5\xe9\xe8\x01\xd2\xec\xd6\xea\x54\x5c\x89\xd8\x0c\x97\xa9\x52\x00\xb0\xfd\x0a\x56\x01\xf1\xd9\x6b\x18\x7d\x38\x66\xe4\x76\xc6\xa3\xbb\xeb\xc0\x05\x2b\x33\x73\x4f\x04\xb7\x4a\x82\x46\xf5\xb7\xa7\x62\x38\x76\x58\xd7\x6d\x99\xbd\x6e\x03\x8e\x3b\xb2\x53\x66\x1a\x27\x54\x29\x19\xf1\xc2\xe7\x0f\x46\xe1\x82\x25\xc7\xc0\x92\x9f\x6e\x1a\x40\x4a\x7c\x10\xf9\xc3\x6d\x1c\x2b\xb4\x52\x15\xca\x1b\x5c\xb8\xd9\x7a\xb2\xa1\xe3\x56\x6e\xad\xba\xe6\x6d\xa9\x9e\xa6\xd3\xfa\x2a\xee\x67\x97\x0f\x6a\x37\x8a\x93\xe7\x6d\x01\xe7\xd5\xad\xe2\xeb\x6a\xda\xfa\x1e\x4f\x32\x59\xfb\x27\x6b\xaf\xb3\xc2\x55\x62\x6f\xf0\x9e\x75\x48\x03\x51\x49\x65\x9a\x27\x18\xb5\x7a\x78\x59\x51\xe7\xcd\xc3\xef\x3c\x81\x83\xfa\xb9\x15\x23\x6a\x9a\xce\xf7\xcb\xa8\x4b\x14\x28\x04\x2f\x7e\xff\xcd\x37\x5f\x7a\xa5\xa2\xc3\x0c\x67\x4f\x5d\xaa\xe8\x20\x57\x57\x87\x52\xd0\xa1\x14\x6c\xbb\x9e\xdc\x13\xfb\xf8\x38\x04\xad\x24\x89\xb5\x91\x20\x76\x28\xd2\xc0\x81\xc9\x65\xed\x24\x96\x1d\x8c\x25\xf0\xa0\x08\x02\x2d\xe5\x58\x1d\x8e\x16\xd0\x61\x04\xfc\x7b\x60\x04\xb4\x97\x5b\xd5\x16\x1e\xc0\xe1\x39\x55\xbf\xfc\xdc\xff\x83\xc9\xc4\xa1\x19\xe6\xcd\xf3\xca\xdb\xaa\x5f\xd1\x96\x9d\xbd\x35\xc3\x40\xc9\xaa\x6b\xf5\x5d\xb7\x33\x30\xf2\xba\x40\x7c\xd7\xd2\x10\x8d\x27\xd4\x76\xc9\xc1\xc6\x02\xec\x8a\xdc\x8b\x07\x97\x77\x0d\xb6\xf4\x7e\x54\x71\xb1\xfb\xdb\xcf\xdf\xb3\xde\xb9\x98\xbb\x32\xea\x9d\xff\xd1\x5f\x1b\xfc\x8f\xaa\x84\xf1\xea\x2c\x82\x40\x09\x41\x04\x93\xe3\xb0\x8e\x4a\x71\xfe\xcf\xae\xaf\x48\x94\x31\x80\x34\xa0\x89\x1a\x92\x35\x12\x9a\xf3\xd4\x58\x89\xce\x49\x66\x54\x6b\x36\x4f\xf5\xa1\x1b\xae\x73\x3f\xfe\x9b\xb9\x1f\x5b\xf6\x19\x7c\xf4\xcd\x39\x6b\xd1\x2c\x9f\x53\x31\x30\xd4\x02\x1c\x91\xa5\x78\x8e\x0a\xe3\x1b\x12\x97\x03\x87\xb3\x49\x33\x86\xe0\xe6\xb9\xe0\x3f\xe7\xac\xb0\x2f\x78\xf1\xe2\x19\xb8\x5a\xa0\x1f\x2d\xcf\x1d\x8a\x4e\x15\x2a\x12\xc9\x95\x54\x26\x3b\x21\x7e\x1e\x1d\xc1\x08\xe4\xaf\x92\xad\x4c\xcf\x18\x8a\x69\xd7\x00\x0e\x50\x3c\x55\xd6\xef\x50\xc1\xa3\x49\x22\xef\xf1\xdb\xa1\xe0\x61\xd6\xcf\xf4\xc5\xe2\x71\x8c\x19\x99\xf3\x2c\x93\x99\x75\xf1\x84\xdd\xc1\xb0\x1c\xa3\x27\xb2\x0c\x15\xae\xcc\x46\x55\x8c\x98\x0e\xb7\x8a\x96\x84\x0a\x4c\x5c\x34\xff\x76\x41\xc9\x58\xff\xcc\xd2\xbb\x31\x9b\xd1\x05\x97\x79\x86\x6f\x6b\x49\x7a\xf6\x27\x60\xb9\x4b\x99\x7b\x33\x77\x0e\x79\x4a\x7e\x74\x6a\xcd\x3c\xbd\x2b\x7e\x04\x05\x35\x96\xce\x7e\x38\x60\x9f\xb9\xd2\xab\x63\x71\x53\xe4\x0a\x24\x3c\xc5\xce\x5b\xa8\xd4\x30\xd8\x8f\x7b\xe7\x9c\x96\xf7\x5b\xd8\x5a\x59\x24\x5d\x8c\xe0\xa7\x5d\x02\xa9\x45\x6a\xc1\x54\x71\x97\x14\xf6\xe5\x85\x7b\xe2\x28\xf7\xac\xcc\xd4\x49\xc4\x5f\x8a\x44\xec\x03\x24\x12\x1e\x2d\xaf\x2e\xda\x91\xf9\x7c\x60\x84\x69\x94\x7c\x4b\x15\x8b\xc9\x5b\x2a\xe8\x14\x8d\x23\xc7\xa3\xeb\x6f\xdf\x9e\x98\x4d\x02\xc6\x97\xab\x8b\xb5\xd1\x13\xa3\xb0\x67\xef\x9e\x2a\x7d\x9b\x54\xe7\xa8\x35\xa9\xa0\xe1\x2c\x3d\x59\x02\x3b\xf1\x9c\xfd\x90\x92\x5d\xab\xe0\x46\x18\x0e\xe1\x90\xca\x54\x95\xbc\x2e\xe6\xf1\xdd\x43\x0e\x37\xb0\x55\x6f\x1b\x53\x3d\x47\x53\x0d\x67\x52\x65\xed\x33\xaa\xd9\x74\x79\xc1\xd2\x44\x2e\xcd\x72\x5f\x07\xa6\x73\x7c\x74\x8c\xac\x3e\x1b\xd3\x88\x64\x79\xc2\xb0\x7a\x4d\x15\x22\x4c\x30\x16\x17\x74\x8a\x0b\xa5\x29\x00\x84\x61\xfb\x5b\x7b\x54\x9b\xc1\xd4\x65\x25\x03\xec\xe7\xce\xa7\xca\x70\x8a\xe6\x40\x6d\x7d\xa5\x3e\x33\x81\xcf\xef\xde\xa1\x4d\x9c\x87\xb5\xdd\x84\xe5\x0d\x0e\x67\xfa\x26\x4f\x0c\xeb\x48\xe2\x4a\x11\x51\x90\xad\xec\x1a\x23\x32\x03\x50\x00\xd3\xfb\x3e\x19\xe7\x46\xf0\x62\xaa\x64\x5f\x5e\x85\xa5\xbc\x9f\xa1\xdf\xd8\xbc\x44\x68\x9a\x26\x1c\xe3\x7a\x65\x66\x9d\xbf\x81\xb5\x71\xf5\xb1\x3a\x84\xa4\xa1\xfc\xd1\x4c\xde\x18\x90\x05\xcb\xc6\x75\x30\x15\x9a\x8a\x12\x34\xe5\xe0\x3b\xa9\x2d\x79\x94\x41\x21\xaf\xaf\xf0\x6d\xa7\xa9\x85\xaa\x99\xfb\x11\x57\xd0\xae\x8d\x03\x14\xb4\x55\x69\x50\xdb\xf0\xa8\x40\x67\xd7\x57\x08\x43\x65\x81\x81\x0a\x93\x85\x91\xed\x29\x06\x07\x16\x68\x84\x74\x6a\x5a\xd4\x44\x0a\xff\x51\x26\xf2\x39\x43\x30\xa1\xa2\x9c\x95\x51\xf8\xc4\xb2\x68\xbd\xb0\x78\x18\xfd\xa4\xbe\x38\xd1\xdc\x8d\xde\xd0\x6d\xde\x98\xf3\x08\x29\x6e\xec\x30\x3f\xdc\xbc\xd9\x6f\x11\xdf\x95\xdb\xb0\xe0\x31\x0c\x70\xf2\x52\x9a\x69\x4e\x13\x92\x67\x89\x73\xc3\x61\xd0\xbb\x0d\x4b\x9b\xd1\x45\x00\xb0\x33\x24\xe4\x2b\x5c\x39\x3b\xb1\x78\x3e\xb1\xbc\x2b\xae\xfc\x24\x4f\x92\x3e\x99\x70\x41\x0d\xd9\x65\x29\x09\xdd\x41\x23\x2e\x22\xa3\x7e\x19\x5d\xdf\xd6\x6b\x81\x1e\x39\xa5\xcc\x1f\x52\xf0\x32\x82\xb7\x94\x25\x31\x80\x2e\xc2\x27\xcc\x81\x8d\xc0\x44\x60\xb4\xc6\xf3\x24\x57\x9a\x65\x37\xd2\x30\x83\x20\xae\x05\xe0\x28\x68\xf8\xf3\xb7\x5c\xc4\x10\xc2\x74\x03\x8c\x23\xa2\x82\x30\x0e\xc6\x17\xd3\x24\xf8\xa9\xcd\xde\x29\x36\xd4\xb1\xca\xa3\x99\x19\x52\x2f\x95\xb1\xea\x19\x32\xd2\x43\x13\x9d\xea\x9d\x98\xbf\xaa\x63\xc0\x30\x95\xe0\xbd\x53\x9a\xf2\xde\x49\x9f\xc0\x04\x81\xe3\x4c\xea\xd9\x97\xbb\x0f\xdd\x58\x41\x27\xde\x6b\x17\xde\x84\x2d\xc0\x1e\x14\x45\xf5\xaf\xfb\x19\xd7\xcc\x17\xdf\x46\xcb\x8e\xc7\x57\xa9\x12\x6b\x42\xce\x04\x61\xf3\x54\x83\xb5\x98\xcc\x19\x75\x2e\x64\xb6\x60\xd9\xd2\xe8\xe4\x00\x44\xf1\xc5\x1f\x7e\xbf\x1f\x0f\x9a\xf0\x4a\x65\xf3\x62\x93\xc3\x09\x5b\x99\xdc\xa3\xaf\x8e\x4a\x7a\x7e\x92\x04\xd4\xfc\x8b\x9d\x4a\x60\xaf\x7b\x4d\xe3\x47\xf3\x66\x79\x0a\xf1\x16\x52\x4b\x4f\x3f\xde\xbc\xb1\x8e\x0c\x9c\xab\xef\xb9\x88\x95\xaf\xb5\x67\x63\xa0\xed\x7c\xaf\x9d\x64\xe8\xe1\x97\x38\xc1\xab\xe2\x6b\x5d\x91\x73\x4b\xf3\x4e\x62\xdf\xd4\xd4\xd6\x06\xac\xd8\xff\x56\xc6\xeb\x8f\x4e\x25\xff\xa3\x78\xd8\x0a\x24\x41\xfd\x4a\xd7\x96\x15\x55\x97\xe9\x5a\x79\x7e\xfb\x72\x6c\x99\xfa\x4d\x3d\x29\x2c\x00\x40\x27\x83\x5f\x6e\x97\x29\xb3\x78\xda\x64\x92\xd0\x69\xb1\x8d\x80\xea\xa1\x90\x74\x3e\xfa\xe8\x86\xa0\x08\x5f\x2f\xae\xee\x94\x67\x77\x49\xb0\x83\x62\x96\x36\x3e\x61\x3e\xb2\xf6\xc7\xdd\x62\xac\x6f\x7c\xf3\x6e\xaa\xe3\xdc\xd3\x5b\x0d\x67\x9b\xe6\xff\xd6\xe2\x78\xd1\x60\x27\x38\x98\x30\xa7\x54\x42\xbc\x11\xc8\x21\xa3\x8f\xa5\x6d\xb2\xa3\xbf\x1b\x36\xed\x1d\x5b\xde\xcb\x6c\x3d\xe6\xf7\xde\xfb\x6b\xeb\x17\xb1\x06\xff\xce\x03\xf2\x96\xa6\x66\xd8\x45\x34\x27\x6a\xde\xd6\xb7\x88\xb2\x3f\xc6\x61\xb9\xd8\x37\x99\x4d\xa9\xe0\x7f\xc7\x10\xd8\xc8\x9c\x63\x99\x99\x3f\x8f\xd1\x3f\x81\x7a\x7b\xc2\x22\x7d\x62\xf7\xdf\x5a\xba\xb7\x63\x83\xd2\x38\xe6\x28\x3d\x5c\xef\xd8\x4b\xdb\x27\x81\x8b\xbb\x87\x98\xf3\x2d\x07\x6b\xf7\xde\xdf\xee\xe0\xac\x41\x9b\xf3\x6c\x4b\x0c\xd3\xd6\xf7\xe7\x94\xdb\xba\xad\xcf\x6e\x56\xd8\x9c\xf2\x7d\x87\x85\xd7\x01\xf3\x3a\xa7\x3a\xcf\xb8\x5e\xcb\x90\xb6\xbf\xc8\xc5\xf7\xf9\x98\x59\x9f\x6e\xe3\xd7\x05\x84\xe8\x9d\x5d\x5f\xb5\xbb\x1c\xab\x20\xd2\xb6\x83\x46\x6e\x21\xb9\xa0\xf3\x31\x9f\xe6\x32\x57\xc9\x32\x34\x4a\x52\x70\x49\x1b\xa5\x1e\xad\x32\xe2\x48\x13\x2a\xa4\x58\xce\xed\xa3\x22\x4a\xf2\x98\x95\x5a\x04\xcf\xdd\x42\xf2\x98\xd0\x5c\xcb\x39\xd5\x3c\x22\x91\x64\x59\x04\x5e\xbe\xb0\xa5\x5c\x31\x42\x37\xbc\x1b\xe5\x4a\xcb\x39\x99\xd3\x4c\xcd\x68\x92\x6c\x5a\xe3\x16\xb8\xda\x36\x98\xec\x01\x8c\x7f\xe3\x8f\x0b\xec\xf5\x9e\xfb\x7b\x07\x2a\x78\x8d\xfd\x6d\x3a\x77\x50\x03\x8b\xcd\xbb\xb4\x46\x1b\x36\xf1\x7d\x2d\x28\xcf\x8e\x85\xd9\x35\x3b\xdb\x4e\xee\xce\x71\x6d\xa1\x86\x5b\xdf\x85\x00\x59\x16\x5f\xcd\xe9\xb4\x86\x20\xf9\xc6\x68\x07\x54\x2c\xdd\x6b\x88\x15\xa9\xfa\x44\x66\x36\xd2\xc3\x57\xde\xb6\x3f\x79\x98\xd1\x8c\xbc\x07\x67\x9a\xcc\x6c\xc8\xb4\xdd\xa5\x10\x40\xcf\xb2\x89\xcc\xe6\x46\xae\xe3\x19\x99\xe4\x02\x8c\x64\xca\x46\x58\x83\x4a\x62\x6d\x35\x34\x51\xd2\x9f\x40\xf0\xce\x09\xd7\x09\x42\x15\xb9\x67\x49\x32\x24\x67\x49\x62\x41\x2c\x03\x00\x84\x22\xb1\xb9\x88\x03\x18\x2f\x49\xcc\xa7\x4c\x69\x72\x3c\xfa\xcb\xd9\x09\x70\x6d\xb0\x63\x2c\x89\xa6\x2e\x1b\xac\x6c\x9f\x01\xfe\x1f\xe7\x20\x27\x44\x54\xd3\x44\x4e\xd1\x15\x0e\x76\x5a\x11\x93\x34\xa1\x4b\x80\xa2\x4f\x69\x06\xe1\xa0\x11\xda\x68\x48\x96\x0b\x00\xe1\x7d\x54\x8e\xb3\x9b\x14\x6c\xc3\xc9\x1d\xc0\x9e\xdc\xf3\xa8\xef\xc0\x26\x7d\x58\x56\x96\xb1\x34\xa1\x1b\xac\x0a\x5b\x92\x7b\x8d\x98\x0b\x2a\xac\x14\xcc\xb7\x31\x24\x23\xdc\x3b\x73\xaa\x23\x74\x54\xfe\x75\xce\x34\x8d\xa9\xa6\x43\xa3\x0b\xfe\xb5\x9c\x7e\x26\x93\xd8\x34\xb4\x79\xa1\x37\xf4\x19\xe5\xc5\xf5\x25\xd7\xcb\xa7\xd0\x08\xb5\xfe\x71\x90\xcf\xdd\x79\xdc\x6a\xc6\x38\x90\x3e\xc1\xf0\x2f\x3f\x1b\x55\x6c\xab\x0f\xad\xd4\xd7\xea\x4b\x65\x2b\x43\x52\x1e\x89\xdd\xad\x73\x06\xe8\x87\xb7\xb6\x6a\x8f\xbb\x03\x26\xd4\xb3\x77\x17\x9b\xcd\x5d\xbb\x4d\x06\x3b\x4c\x04\x65\xc7\xc0\x96\xee\x39\x03\xb3\xfd\xa5\xec\x1d\x70\x29\x28\x90\xa5\x87\x09\x1d\xd4\x41\xa4\xb8\x87\x71\xc1\xca\xf9\x85\xf8\xde\x66\xfb\x48\x2d\xf7\x4c\x1d\xa7\xcc\xae\x74\xae\x81\xef\xec\xc6\x87\xea\xf9\x68\x76\xa6\x5c\x95\x26\xdc\xe6\x34\x42\x0a\x25\xcc\x3c\x24\x66\x38\x13\xa9\x9f\xec\xba\x3e\xad\x9a\xf6\x1d\x37\xd4\x06\x1d\xf5\x4b\x59\x0a\x16\xba\x63\xcb\x23\x65\x33\x4e\xa4\x50\x33\x9e\x62\x4e\xa0\x75\x43\xd8\xd5\x25\x1f\x69\xc2\x63\xdf\x04\xee\xea\x2b\xd1\x27\xef\xa4\x36\xff\xbb\xfc\xcc\x95\x46\xf5\xf3\x42\x32\xf5\x4e\x6a\xb8\xd3\xca\x50\xb1\x0b\x0d\x06\x6a\x15\x60\xb4\x64\xc3\xb9\x0a\xd4\x64\x37\xa0\x2b\x4b\xf6\xdc\xa4\x70\x45\xae\x84\x91\x08\xec\x88\x7c\xae\xac\xb2\x4d\xb8\x74\x10\x21\xc5\x00\x6c\xdc\x6b\xdb\xb0\x13\x21\xb3\xd2\x3c\x6c\x69\xce\x36\x85\x41\x7b\xf0\x0b\x57\x8e\x88\x7b\x9e\x4d\x9d\xd9\x8d\x47\x64\xce\xb2\x29\x78\x6d\xa2\x1d\x5e\x8b\xba\xa6\xc8\x5a\x06\xc8\x9d\x6b\x05\x24\xf3\xcd\x46\xc3\xc5\xca\x22\x05\xcf\x23\x59\x9a\xa3\x35\xe3\x1f\x86\xfa\xc0\x4c\xfd\x0b\x12\xa6\xd5\x90\x9c\xb9\x92\x28\xe1\x6f\xd6\x7b\x15\x36\x63\x5a\xe0\x8a\x18\x52\xb2\xa0\x09\x43\x7c\x78\x2a\x7c\xae\x93\x9c\xac\x10\xf6\xbe\x4d\x9c\x36\x67\xd6\x8b\x4c\xbd\x3b\xb6\xec\xf5\x57\x96\xb6\x77\x25\x7a\x45\xa2\x5b\x69\x31\x3d\x11\x05\x69\xab\x07\xbf\xf5\xf6\xe7\x05\x5b\x89\x65\x7d\xf3\xca\xce\x75\x53\x77\x7c\xbd\xfb\x79\xad\xb0\x71\xac\x4e\xcc\x14\x82\xcb\x37\x23\x73\x99\x81\x39\xd3\xdc\x0d\xe1\x32\x8c\xa8\x7a\xc7\xd3\xb4\x40\x17\xc9\xd3\x69\x46\x63\x46\xa6\x19\x4d\x67\x4d\xc5\x12\x94\x6d\xd6\x35\xff\xc5\x08\xba\x1b\x26\x7f\x8b\x46\xb7\xf5\xbd\x7b\x36\x9e\x49\x79\x07\x59\x69\xb0\x11\x1e\xd0\xfe\xf0\x03\x7e\xeb\xa2\xb8\xe7\x54\x49\x45\x62\xa6\x29\x4f\x20\x96\xe3\xfd\x9b\xb7\x36\xda\xc3\xf1\x71\xd7\xcb\xf5\x81\x13\x2d\x28\x00\x34\xb6\x51\x48\x37\x6c\xc1\xd9\xbd\xb5\x4a\x6c\x8a\xd3\x18\x90\x29\x13\x10\x9c\xb0\x25\x88\x67\x40\x14\x8f\xd9\x25\x24\xbb\x6e\x6e\xe8\x00\xc3\xf9\x86\x3e\xef\x3a\xbc\xdb\x29\xf8\x4e\xea\x5d\x83\xcb\x7a\xf5\xf7\x5a\x66\x5b\x80\x75\xea\xe5\xde\xd6\xcb\xab\xb5\xd1\xdf\xaf\xc8\x37\xdf\xfc\x6e\xe3\x43\x73\xfa\x99\xcf\xf3\xf9\x2b\xf2\xfb\xff\xf8\x8f\xdf\xfd\xc7\xe6\xc7\xb8\xc0\xc7\x5e\x6e\x1e\x9f\x3d\x6d\xe7\x37\x17\xcf\x60\xbe\x63\x1f\x4d\xb7\xdd\x29\x57\xa3\xa9\x09\xe5\x49\x9e\xd9\x90\xcf\x9a\x2a\xc2\xeb\xf0\x1d\x70\xa8\x14\xc9\x0a\xd4\xb5\xe8\x82\xbd\x6c\x10\xd8\x84\x0b\xa6\xa0\xf4\x48\x2e\x32\x16\xc9\xa9\xe0\x7f\x67\xb1\xab\x3c\x02\x81\x1d\x00\x60\xee\xb6\x38\x61\x22\xc6\x9a\x8f\x86\xe7\xcd\xa8\x88\x93\x6d\x0e\xff\x1a\x23\x0d\x4f\xf0\x41\x53\x06\x9c\xa7\xd1\x84\xbd\x2d\xde\xa8\x4c\x17\x54\xae\xb4\xee\x27\xe4\x68\x38\x6d\x07\x8d\x14\x09\xe3\x68\x8b\x62\xbd\xa6\x8f\x2b\x7a\x1f\xaa\xac\x70\xef\xe7\x9c\x65\x4b\x48\xcc\x28\x04\xfb\x20\x10\xec\xb6\xc8\xdb\x77\xc3\xb0\x12\x15\x22\xa5\x54\x74\xe1\x42\x88\x29\xc2\x3d\x2a\xdf\x86\x77\x18\xba\xcf\x9d\x23\x89\x9c\x11\x91\x27\xc9\xa6\x47\x85\xdc\xe6\x72\x0a\xe7\x6e\x87\x2a\x59\x4f\xc7\xab\x6b\x16\x58\x33\xd3\x8f\x6a\x1c\x08\x07\xde\x92\x28\xff\xbc\xcd\x05\xe1\x80\x6b\xc5\x74\xd6\x8f\xe7\xac\x87\x07\x53\xc3\x8c\x80\x57\x93\x80\xcf\x9a\x28\x2e\x0f\x69\x58\xc0\xab\x51\x7c\x4e\x3d\x23\xc3\x9a\xae\x3f\x3b\x53\xc3\x1e\x83\xaf\x63\x76\x58\x33\xf4\xce\xf8\xb0\x32\xe1\x75\xa3\xa1\x1a\x44\x42\xd5\x5c\xc9\x1a\x46\x09\xbc\x3a\xd3\x44\x23\x4e\x54\x83\x30\x37\x33\x53\xd4\x5e\xd5\x8c\x71\xb1\x90\x88\x82\xdc\x48\x86\xbb\x59\x79\xb1\x22\xca\xdd\x03\x65\xb5\xb2\x9c\x17\x7e\x43\x91\xd6\x28\xb4\x24\x57\xbb\x8d\xdd\xdb\x47\xb0\x3d\xf7\xa3\x15\x1d\xa4\x3c\xf2\x3c\x61\x3f\x70\x3d\x7b\xef\xd0\xce\xed\xae\xd6\x79\x9a\xc0\x60\x83\x1f\xcc\x16\xba\x29\x24\xc3\x2b\xac\x90\xc5\x22\x39\x9f\x33\x11\x63\x10\xd1\x9c\xde\x31\x52\x14\x5a\x34\x32\x1e\x88\xc1\xd0\x1c\xfb\x9c\x52\x51\xc8\x89\x0b\x43\xcb\xb7\xed\xa8\x9a\xfb\xa9\x2e\xaf\xad\x9d\x54\xb1\x3d\x99\x22\xc8\x86\x28\x25\x4d\x90\x31\x4b\x24\xa4\x4e\x63\xa4\x28\xc6\x32\xdb\x47\x81\x24\xdb\xbb\x96\xeb\x59\x64\x45\x26\xa6\x05\x8e\x93\x4a\xa0\x08\xaa\xa5\xc0\x52\xb0\x21\xb9\xb1\x22\x4c\x3d\xa9\xa8\x0e\x39\xad\x49\x4a\x6b\x33\xc4\x02\xfb\xa0\xf1\xcc\xba\xf7\xc2\xb9\x5d\xb8\x7b\x75\x66\xd7\x3d\xfc\x4b\x9e\x5f\x5f\x89\xa0\xd9\xf4\x96\x8f\x74\xc1\x15\xfc\xdc\x56\x88\x57\x84\x25\x76\xc1\x54\x37\x20\xe7\x37\x97\x67\xb7\x97\x7d\xf2\xe1\xfa\x02\xfe\x7f\x71\xf9\xe6\xd2\xfc\xff\xfc\xfd\xbb\x77\x97\xe7\xb7\x46\x8e\xf8\x0a\x71\xd6\x8d\x1a\x67\x66\xd7\xf0\x23\x59\xa6\x16\x54\x2c\xc9\x24\xd7\x86\x1c\x14\x1f\x2b\xf5\x82\xa2\x0d\x80\xc6\xb1\x51\x19\xbf\xb8\x35\x5c\x3f\xe1\x55\xb3\x49\x58\x4c\x02\xa1\xe9\x6d\xb2\xd4\x6e\x31\xa9\xf6\x26\xa9\x9d\x75\x50\xea\x72\x6f\xcf\x74\x83\x4f\x82\xbc\x96\x19\xb1\x75\xb4\x5e\x91\xa3\x54\xc6\xea\xc8\x26\x75\x98\x7f\x0f\xf1\xd6\x69\x22\xa7\x47\x3e\xd7\x83\x91\x44\x4e\x89\xca\xc7\x3e\x07\x07\xb8\x29\x3c\xfd\x95\x7b\xac\x94\xba\xd0\xf7\x89\x38\xc1\x5b\xbe\xf1\xd2\x3b\xe1\x03\x61\xbb\xa7\x50\x44\xab\xf4\xa4\xb9\x51\x6d\xf0\xab\xd3\xf5\x3d\x70\x82\x13\xcf\x2a\x6f\x7c\x12\x66\xbb\xde\xf3\x24\x8e\x68\x16\xaf\xec\x59\x60\x6e\xb8\xe4\x30\x7b\x88\x4b\x8b\x35\x88\x8b\xc6\x2d\x38\x85\x5c\xb0\x2c\xa1\x29\x46\x88\x03\x30\x30\x84\x1e\xc1\x47\x2e\x58\xca\x20\x0f\xca\x55\xc5\x66\x22\x4a\x24\xe0\x60\x20\x67\xec\x97\x87\x8e\xa1\x48\x0e\xf4\xcf\x26\xd3\x14\x27\xa4\xf7\x6c\xc9\x1c\x84\x19\x37\xda\xbd\x18\x98\xbc\x11\x4c\xc5\xe7\x6d\xa0\xd2\xe8\x25\x5f\x46\x7a\x36\xcb\xac\xd7\x27\x3d\x8f\x17\x12\x5b\x29\xb9\xf7\x55\xaf\x78\x20\xcc\x53\x02\x21\xd9\xba\x84\x06\xf0\x9d\x30\x9b\x11\x16\xd8\x39\xae\xfc\xa7\x0b\xcc\x17\xc3\xda\xac\x11\x0b\xfa\x50\x6e\x68\x58\xea\xc8\xca\x57\x8b\x14\xbb\x9d\x5f\x34\xdd\x0f\x5e\xd7\x90\x8e\x8e\xa9\x7a\x76\x72\x32\x66\x56\xc3\x05\xa4\x8d\x4a\x9b\xc7\x3b\xde\x42\x50\x1a\x9e\x91\x94\x66\x46\x15\x71\x4f\x96\xeb\x71\x7d\xb5\xb3\x1a\x57\x8d\x4d\x10\xf8\x57\x6a\x4a\xed\x23\xff\xc6\x79\x42\x95\x5a\x63\x79\x05\x42\x60\x1a\x26\x0c\x5b\x26\xd4\x39\x9f\x00\xe4\x79\x46\x17\x5b\xe0\x08\x6a\x74\x5a\xd3\x6c\xca\xf4\x76\xcf\x08\x15\xcb\xf7\x5b\x61\xc8\x06\xb5\x81\x4b\x07\xf5\x4e\xd3\xe7\x41\x01\x7a\x35\xe0\x42\x0f\x64\x36\xc0\x57\x5e\x11\x9d\xe5\x9b\x7c\x5c\x9a\xcf\x99\xcc\xf5\x88\x45\x52\xac\xcf\x68\xb0\xcf\xb5\xe6\xea\x69\x90\xe6\x61\xbd\x8d\x67\x4e\x8c\x70\xb9\x1e\xa1\x91\xbd\x90\x31\x9c\x87\xb1\x0c\x82\xf2\xfe\xcd\xdb\x43\x16\x9b\x40\x1a\xf3\xf6\x95\xfc\x68\xc9\xbe\x98\xfa\x9e\xda\x9e\x6f\x7d\xed\x6d\xae\x9b\xbf\x74\xee\x3d\x57\xdb\x9f\xb6\x93\xb1\x1d\xf8\x62\xe3\xf8\x95\xa6\x3a\x5f\xd9\x0d\xa5\xb5\xb1\xc4\x72\x84\x29\x65\x56\xa6\x1f\xc1\x7b\xa1\x91\x6f\x35\xff\x1f\x71\x64\xe1\x39\x17\xac\x38\x24\xf6\x45\x73\x3e\x75\x46\x39\x2a\x90\x34\xd2\x39\xe4\x26\x53\x6d\x03\x1b\x2d\x7c\xcd\xaf\xd6\x0d\x63\xad\xca\xb8\x4d\x4d\x8c\x58\xa6\xd5\x1b\xaa\xf4\x87\x34\xa6\x1b\xb2\x97\x2a\x01\x8b\x4a\xc3\x81\x41\xc1\xfa\x5e\xb0\xd8\x50\x78\x3b\x05\xd8\x1e\xb9\x37\xa4\x37\xc7\x16\x9b\x7a\xf2\x8b\x03\x64\x5e\x1f\x98\x4f\xad\xef\xf5\x8d\x34\x73\x72\xb6\x96\x00\x95\x43\x35\x76\xf5\xd6\xb0\x93\x0c\x5a\x23\x82\x7d\x5e\xa7\x71\x1f\xde\xe3\x84\x51\xb1\x3e\x5c\xbe\xb2\xa3\xe0\xb9\xe6\x7b\xc8\x7e\x80\xdc\xcf\xb8\x11\x59\x31\xcb\x4b\x11\x27\x42\xc5\x2c\x61\x1b\x92\xbd\x0e\x0c\x25\xb5\x5f\xb8\xb0\x1f\xa8\x15\xe6\x74\x5d\x7e\xc7\x1b\xf4\xad\x10\x6e\x93\x27\x0a\x61\xd9\x4a\x0f\x5e\x6b\xaa\x8e\x0a\xc4\x97\x71\x22\xa3\x3b\x04\xf1\x82\x7c\x7e\xfe\x77\x96\xb9\xb8\x73\xee\xab\x66\xd9\xca\x4e\x53\x57\x75\xd2\xcd\x9b\x2b\xef\x03\xad\x98\xb6\xcd\x04\xfa\xf6\x65\x56\x58\x16\x73\x61\xb3\xe7\x1e\x27\x74\xd5\x29\x2a\x10\xaf\x5f\xf2\x1c\xac\xea\x2c\x88\x1d\x02\x18\x83\x56\x65\xa4\x73\x9b\xdd\x72\xfa\xfd\xe6\x4c\x90\x56\xc3\x51\xb7\xe5\xa3\xe0\x13\x30\x7d\x22\xda\x0a\x35\xb3\x35\x73\xa5\xae\xe5\x6b\x47\x86\x0a\xa9\x2f\xa4\xfb\x2e\xd7\x69\xad\xd5\xe0\xc2\xd6\xbd\x7d\x1b\xd3\x00\x8a\xab\x89\x0f\xaf\x2e\xb8\x69\x23\x2f\x93\x68\x02\x42\x59\x06\x0f\xf1\x6a\x87\x4d\xf2\x44\x4f\xfc\x44\x66\x1b\x15\x98\xf6\x3a\xbf\x3d\x9f\x69\x67\x43\x46\xfa\xdc\x1c\xbb\xb6\x9a\xbc\x63\xa8\x97\x7f\xa5\x4f\x28\x99\x71\xa5\x65\x66\x5d\x6b\x50\x9c\x2b\xa3\x50\x01\x74\x7d\x0c\x58\x3b\xd1\x70\xe7\xbe\x0b\x84\xa6\x29\xa3\xbe\x98\x8f\xe5\x4d\x50\x8d\x27\x63\x91\xcc\xe2\xb5\x1d\x73\xda\xfd\x5a\x59\x6a\xed\xe7\x5b\xc8\xcd\x4c\xa8\xd2\xb7\xbe\x0f\x46\x40\xa8\x49\x8d\xcb\xe2\x8f\x1d\x62\x31\x1a\x07\xe7\x22\x45\xf1\xa3\x24\x54\xa0\x55\xe3\x30\x19\x7c\xb7\x90\x51\x8c\x0d\xa5\xb9\xbd\xc6\x75\xef\x25\xb7\x60\x88\x8f\xd3\xf3\x39\x53\x6a\x6b\xa2\x51\x25\x48\x03\x70\x78\x89\xc7\xe1\xb5\xaf\x3b\x66\x8f\x02\x02\x86\x63\x3a\xd4\xad\xe5\xe6\xad\x46\x40\x4c\x40\x83\x82\x3f\x56\x07\x2d\x59\x3a\xa3\xaa\xee\x60\xfc\x29\xf2\x21\xbe\xb5\x8f\x43\xcd\xde\x64\x8c\xaa\x6d\xa9\x92\x95\xb9\x1d\x67\x9c\x4d\xc8\x39\x9d\xb3\xe4\x9c\xaa\x36\x27\x17\x28\xc0\x90\xb0\xe1\x74\x48\x8e\x6e\x02\x6f\xeb\x3b\xa9\xdf\x6e\x2b\x88\xb0\x03\x1d\xa0\xce\x89\x7e\xd0\xb3\x7c\xb0\x92\xb0\xfb\xe4\x1e\x78\x66\x0f\xee\xe1\x96\x13\xfa\x2c\xce\xe6\xf6\x7c\xdf\x4d\xe7\xb1\x7c\x12\xf3\x0c\x2c\x7e\xd1\xbe\x27\x72\x47\x32\xe3\xa6\x53\xf8\x9c\xcf\xdf\x8e\x21\xf9\x26\x46\x6b\x4d\x26\x2b\xa3\xbb\x2d\x69\xae\x60\xf6\x0f\x03\xec\xb0\xf2\x3d\x57\x46\x05\x6b\x53\x6c\x79\xda\x64\x7b\xbb\x80\x1b\x7f\xdf\x22\x97\x0f\xb6\x73\xe1\x43\x13\xf9\x63\x70\xb4\x98\x1d\xf0\x98\x01\x18\x17\xee\xab\xd6\xd6\x61\x6d\x00\x76\x5f\x4c\x6c\x15\x31\xfb\x4c\x69\x7f\x1c\x43\x9d\x36\xb6\xc0\xaa\x88\x90\xf0\xc1\x88\x60\xca\x1c\x8a\x93\x2d\x9f\xaf\xa9\x50\xd5\x53\xa6\x76\x2b\xba\x3b\x95\x58\xb2\x7b\x69\xdd\x43\xdb\x16\x18\xaf\xba\x3a\x5b\x0d\x9d\xb8\x81\xb2\xb6\x5b\xe3\x69\xd0\xd8\x4e\xf1\xaf\x61\x7b\xeb\x0d\xb8\xd5\xab\x82\xec\x6b\x5e\xb9\x01\x22\x8d\x8e\xe1\xc8\x50\xe0\x08\xd0\x9d\x91\x76\x5b\xf2\x54\xb6\xdf\xde\x54\x69\x20\x84\x1b\x96\x77\x78\x5b\xc3\xca\x73\xde\xde\x9c\xef\x44\xd0\xa8\xdd\xde\x33\x80\x03\xd9\xb9\x81\x1e\x16\xa8\x00\xaf\x5d\xbb\xee\xe9\xf7\x5b\x1d\x40\xa6\xad\x7b\xec\x81\x90\x59\x14\xcb\x16\x2c\x2e\x79\xea\x2c\x76\x7b\xf9\x5e\xe0\xb7\x2d\xda\xb7\xd3\x4e\xfe\xf1\xaf\x5f\xfd\x6a\x30\x18\xfc\xaa\x88\xcd\x7a\x45\x68\xca\xd9\x67\xcd\x30\x02\x6f\x78\xf7\x47\x28\x88\xb3\x78\xf9\x2b\xd8\x70\xe4\x1c\xac\xcd\xce\xcc\x7a\xe1\x33\x08\x7f\xe5\x32\x30\xcd\x47\xa8\x10\x52\x87\xb1\x48\x91\x14\x3a\x93\x49\xc2\xb2\xc1\x94\x89\xe1\x5d\x3e\x66\xe3\x9c\x27\x31\xcb\xa0\x71\xf7\xe9\xc5\x8b\xe1\x1f\x87\x2f\x7e\x45\x7c\xbe\xa5\x91\xec\x95\xa6\xf3\xf4\x15\x24\x7e\xfc\xca\xee\x38\x87\xc8\x96\x26\x54\xa8\xa1\x0f\xf3\x1e\x46\x32\x63\xd2\xfc\x6f\xfe\x2b\x95\xb2\xc8\x7c\x1b\x0f\x1a\x59\xfb\x8c\x35\x9d\xd9\x2e\x5a\x28\xb3\x62\x9a\x06\x44\x26\x73\xf8\x37\x0e\xdd\x42\xc8\x5d\x27\x16\x8f\x2e\xe1\x4a\x7f\x5f\xfd\xe5\x0d\x57\xc8\x2e\xd3\x24\xcf\x68\x52\xee\x2a\xfc\xa0\x66\x32\xd3\x25\xa8\xd5\x01\xe1\xc8\x1a\x15\x17\xd3\x3c\xa1\x59\xe9\xad\x5f\xb9\x98\x87\xc2\x5c\x67\xb8\xe4\xa2\x14\x4b\x37\x28\x05\xcb\x72\xa1\x59\x76\x2e\x93\x7c\x1e\x5a\xc7\x06\xab\x72\xe5\x84\x67\x4a\x5b\x8c\xbb\xb2\x53\x61\x9d\x5c\x0c\xdf\x0f\xf6\xe8\xdf\x94\x14\xe0\x2e\x24\x43\x33\xdd\xc3\xcd\x2f\xfd\xf8\xe2\xa7\xe0\x3d\x5c\xc3\xb2\xbc\xba\xf6\x94\xac\xe9\x31\x4d\xd3\x4c\x2e\x28\x22\xf4\x6d\xe9\x8b\x7b\x6e\xe5\xb3\x67\xab\x3f\x6c\xf8\xf6\xfa\x26\x4b\x3e\xba\xb0\xc9\xd2\x0f\x7a\x0d\x7a\x21\x3e\xbc\x78\x49\x93\x74\x46\x5d\x9e\xa1\x8a\x66\x6c\x4e\x8b\x45\x92\x29\x13\x67\xd7\x57\x1f\x7f\x37\xaa\xfc\xb0\x1e\xcf\xd0\x6c\x39\x9f\x5a\x17\xa0\xe2\x53\xa7\x8b\xf9\xd4\x88\xe2\x04\xac\x74\x73\x45\xc8\x5b\x2f\xd4\x19\xa9\x1c\xcf\x78\xe5\xb6\x99\x9d\xe0\xd6\x26\xe1\x2a\x20\x32\x15\x42\x57\xae\xd9\x55\x04\x7c\x96\x46\x66\x37\x3c\x8b\xed\x9c\x15\xd1\x3b\xce\xcd\x53\x0c\x5a\xd8\x31\x0d\x89\xd9\x8c\x2c\xf3\x28\x48\x98\xc6\xa9\x49\x90\x7f\x88\xad\x81\xb9\x02\xf3\x64\x34\x53\x1a\xe2\x16\x32\xe1\x0a\xe7\xf6\x7d\xc1\xef\x8c\x99\x76\xcb\x19\x8c\x2e\x25\x63\x4d\x59\xb1\x29\xd7\x8e\x84\x46\x72\x3e\xcf\x05\xd7\xcb\x53\xa0\x86\x7c\x9c\x9b\xd5\x38\x8d\xd9\x82\x25\xa7\x8a\x4f\x07\x34\x8b\x66\x5c\xb3\x48\xe7\x19\x3b\xa5\x29\x1f\x40\x67\x05\x06\xe0\xcc\xe3\x5f\x7b\x3a\x5e\x55\x3a\x37\x72\x98\x75\x32\x42\x79\xae\x01\x11\x8e\x07\x05\xbd\xb1\x04\x71\x09\x77\x14\x90\x6f\x2f\x47\xb7\x85\x8b\x11\x91\x82\x60\x86\x03\x27\x5b\x31\xd9\x66\xa2\xa0\x12\x8c\x05\xfa\x76\xa9\x9d\x3e\xa1\xd3\xfc\x11\x25\xdc\xe8\x24\x2a\x1f\xcf\xb9\x56\x2e\xd6\x11\x03\x07\xcf\x81\x83\x00\xec\x24\x5a\x6a\x86\xe4\x4a\x14\xfa\xfd\x83\x4f\x35\x44\x05\x0d\xcc\xf4\xd5\x9f\xec\x90\x01\xae\xbe\xb0\x46\x91\x72\x2c\x6a\xe3\xea\x04\x67\x7c\x94\xb2\xc8\x9f\x06\x7f\xa6\xcf\x10\x33\xdd\x02\xeb\xfb\x58\x4c\x89\x55\x99\xe1\xe5\x95\x90\x82\x2d\x7a\xdd\x66\x5d\x6e\x40\xd6\xd0\xd3\xf2\x4f\x6b\x62\x17\x06\xf5\xd8\x08\xd9\xa1\x90\xb9\x4f\xef\xb6\x03\x39\xde\x60\xb5\x63\xc0\xba\xf7\x0c\xc3\xe6\x63\x80\xae\x2c\xc2\xb9\x85\x1c\x85\x20\x50\xd8\xcc\x6c\xef\xcc\xc1\x19\x22\x3e\xfc\x5b\x2a\x72\x9a\xac\x0d\x60\xdb\x2a\xdf\xb9\xb9\xd9\x8c\xaf\xb0\x09\xe1\x76\xf3\xd4\xb5\x8a\xd5\xb0\xb5\xf7\x36\x5f\x7a\x2b\xc4\xc4\xa6\x00\x2f\xdc\x8d\x8d\xa1\x29\x02\x1c\xf9\x4d\x2e\xcd\x43\x62\x90\x7a\xe1\x99\x5a\x09\x1b\x41\x06\xba\x3d\x74\x44\x69\x96\xaa\x02\xa4\x42\x4b\x12\xc9\x79\x9a\x30\x5d\xe6\xbd\x10\x94\xdb\x2c\x46\xa9\x1a\x73\xbb\xe7\x49\xb5\x98\x25\xa3\x0d\xfe\xda\x01\x5a\x76\x9b\x9c\x3f\xad\x99\xc8\x0d\x15\x1e\x95\xd0\xc0\x37\x94\x4d\x2d\x1f\xc9\xcd\xef\x86\x18\x85\x98\x8d\x5a\xae\xf6\xe3\x62\x4c\x1c\xf0\x70\x6c\x03\x53\xe3\x20\x6d\x6d\x73\x68\xc9\x81\x71\x3a\x9b\x65\x95\xf5\xc3\x2c\x12\x52\x56\xaa\x8d\x6e\x78\x7f\xa7\x5a\x08\x09\x7b\xdb\xa2\xf1\xca\x9c\xfc\xca\x4e\x68\x66\xeb\x32\x52\x92\x72\x86\xb1\xf3\x5e\x1c\x82\x09\x63\x34\xb6\x37\x0d\xc3\xcb\x98\x8f\x0f\xb7\xf6\x6e\x68\xa0\x10\x97\xa0\x26\x0f\xc5\x40\x75\xf2\xbf\x46\xef\xdf\x9d\x7e\x27\x6d\x32\xa1\x2d\x1d\x02\x3b\x79\x0e\x21\xed\xae\x42\x46\xcc\x94\xd9\x9e\x23\x30\x9e\xcf\xa9\xe0\x13\xa6\xf4\xd0\x63\x84\xa8\x1f\xbf\xfe\x69\x18\xa6\x06\xf4\x1d\xb8\xb9\x17\x2a\xec\xd6\x00\x52\x6e\x06\x53\xc0\x6b\xfa\x22\xa0\xa9\x74\x95\x44\xee\xa1\xb3\x9a\xde\x19\xfa\x8d\x9d\xcd\x8d\x2e\x73\xc7\x5e\x91\x1e\xaa\x26\xfe\xd3\xff\x30\x62\xf8\xbf\x7a\xe4\xf8\x1e\x42\x9e\x7b\xe6\xcf\x1e\x7e\xd0\xcb\x80\x61\x21\x9c\xe2\xc3\x18\x28\x9d\xf1\xe9\x94\x65\xd6\x77\x04\x66\x55\xa8\x19\xc2\xa1\xec\x66\xf1\xb0\xb0\x15\x50\x0b\xcc\xcd\x6a\x47\x7e\xfc\xfa\xa7\x1e\x39\x2e\x8f\x8b\x70\x11\xb3\xcf\xe4\x6b\xef\x7e\x48\x65\x7c\x62\xa3\xb2\xd4\x52\x68\xfa\xd9\xb4\x19\xcd\xa4\x62\x02\x43\xbe\xb5\xc4\x32\x2e\x4a\x82\x67\x2b\x49\x06\xb6\xd6\x3c\xb9\xc7\xb4\x61\x37\x95\x98\x86\x0b\x90\x45\x65\x09\x19\x4b\xd6\xc2\xd7\xcc\xb2\x4d\xc1\xb4\x62\xa4\x2f\xac\xf3\x82\x89\x0d\x21\x4a\x92\xca\x71\x91\x0c\xe9\x9b\x51\x01\x6e\x16\x5b\x1e\xc6\xc8\x53\xc3\x4d\x3e\xc9\x9d\x3b\x7e\x9b\x49\x6b\x8d\xd8\x5a\xa7\xac\xef\x23\x09\x85\xb5\x87\xb8\xcd\x60\xf6\xa4\x95\x8b\x0f\x1a\xd1\xd6\xe8\xa3\xd5\x61\x61\xc8\xd1\x23\x8c\x0d\xea\xbb\x9e\xee\x3d\x34\x27\x52\x37\xe1\x04\x47\x23\x3c\xf0\x51\xf5\x6d\x73\x5c\x30\xe2\xd0\x2a\xad\x01\x85\x9b\xd3\x18\x49\x20\x15\xcb\x07\xdf\xc6\x66\x02\xc1\x6b\x1b\x2d\x07\xd6\x2e\x37\xa0\x22\x36\xff\x56\x5c\x69\x73\x7f\xef\x19\xdb\x62\x08\x2d\xcf\xd2\x87\xab\x8b\xc7\xd9\xdc\x39\xdf\xf3\xb4\x8e\x73\x11\x27\xec\x8d\x94\x77\x1b\x52\x81\x4b\x03\xfa\x36\x7c\xda\x7b\xe7\x50\x4b\xe3\x62\xe0\x63\x68\x03\x2d\x97\xa4\x79\x82\xe4\x35\x17\x29\x8d\xee\xe8\x94\xd9\x8f\x02\x1b\xb1\x09\xfe\xa8\x29\x83\x2a\xd0\x2a\xae\xdc\xc6\xde\xa3\x35\xc0\xf6\x73\x43\x37\x1d\x5f\xb4\xb0\x03\xd4\xf5\x7b\x77\x7f\x5b\xf1\x2b\x97\x24\xdc\x1b\x36\xd9\xf8\xa0\x07\xb7\xdf\x94\x7f\x32\x80\xd2\x5e\x1b\x7f\x74\x40\xc8\x6b\x1f\xd8\xed\x43\xac\xf6\xb3\x6e\x74\x53\xe5\x35\xb7\x22\x8e\x60\xd8\x59\x2e\x3d\x06\x77\xec\x2a\x40\x35\xb6\x7b\xaa\x80\x02\x25\x0b\x1b\x99\xf3\x28\x90\x48\xbb\xc5\xe6\x35\xe3\xdd\x43\x78\x0e\x3b\xbe\xd3\x6f\xb7\x53\x90\x5e\xd3\xa7\x4e\x9c\xee\xc4\xe9\x67\x2e\x4e\x37\x3a\x03\xbb\x43\x0f\xbe\x0c\x01\xbb\xd1\xa0\x77\x47\xdb\x3f\x4b\x91\xbb\xf1\x18\x6b\x04\xff\x3f\x5b\x21\xbc\xd1\x60\x6b\x0a\xe4\xeb\x86\xfc\x4b\x16\xcb\x1b\xcd\xe1\xce\x78\x98\x67\x28\xa8\xd7\x1e\xe0\xf6\xa4\x90\x35\xe3\x0b\xf2\x31\x2a\x76\x60\xd3\x69\x2c\x2f\xee\xed\xb4\xa1\x98\xbc\x4b\x9c\x6a\x05\x01\xb6\xb5\xe8\xbb\x5a\x61\x73\x1b\x61\x89\xf1\xaa\x1b\x33\xd7\x24\x5b\x04\xaf\x2d\x71\xe6\x45\x5c\xf1\xc1\x69\x23\x78\x35\xc8\xac\xaa\x9b\x88\x51\x0c\xbb\x4e\x22\x49\x83\x21\x1b\x19\x3e\xcd\xe4\xb8\x2e\x62\xcd\x03\x8c\xaa\x66\x94\xe1\x81\xe1\xec\x90\x9d\xef\xd7\xb7\xb5\xc1\xee\x4a\xe2\x58\xd3\x77\xc4\xb4\x2b\x45\x92\xf9\xf5\x38\x52\xb0\xc8\x0f\xd1\xd3\xbd\x83\x2f\x03\xb1\x1a\x3b\xd9\x77\x1e\xcc\xdb\x2c\x67\x7d\xf2\x9a\x26\x8a\xf5\xc9\x07\x71\x27\xe4\x7d\x7b\xfd\xdd\x8e\xc8\xb0\xa6\xb7\xb7\x16\x7b\xa1\x46\xae\x50\xed\xae\x14\xda\x7d\x4d\x62\x7f\xe5\x5f\x70\x16\x1a\xab\xa1\x0f\x72\xc1\x7f\xce\xcb\x8a\x8a\x77\x32\x1d\x57\x55\x98\xf3\xd1\x47\xd8\x1c\xa8\x6e\xab\x12\xa8\xad\xf9\x51\x6d\x0e\xab\xae\x93\x07\xb5\x55\x51\x2d\x27\x86\x1b\x45\xbf\xac\x6a\x25\x16\x9e\xb0\x6a\x96\x49\xf3\x24\x19\x92\x2b\x7d\xa4\x4c\x1f\x78\x44\x93\x64\x69\xb4\x96\x4a\xb5\xb0\xc3\x32\xb8\x6a\x30\x88\x95\xc3\x86\x88\x2b\x7c\xc1\x82\xd7\xdd\x44\xa3\xc1\x89\xc5\x76\x1c\x87\x41\x26\x6e\xa9\x8b\xb5\xa6\x6b\x37\xf6\x71\xb7\x51\xc2\xf5\x2f\x66\xd5\x36\x8a\xba\x26\x6c\x1a\xc1\xc8\x44\xe6\x22\x26\x54\xc3\xf2\xec\xd9\xe7\xb2\x0f\xf7\xf1\x1c\xfe\xdb\xe5\xa7\x76\x8c\x8d\x81\x07\xbe\xc8\xe3\xdb\x22\x7c\x15\x44\x8e\x7d\x66\x51\x1e\xc4\x78\x85\x31\x1c\xfb\xd9\x1a\xdb\xcd\x7d\x7d\x92\xc4\xd4\xc7\xcd\x29\x6d\x3b\x75\xd2\xef\x80\xfa\x51\xdd\xf5\x44\x85\x16\x62\xcf\xeb\x00\x3b\xd5\x47\x26\x5a\xb7\xed\x81\x2b\xe2\x53\x63\xa6\x82\x11\xae\xec\x6f\x43\x4f\x28\x20\xb0\x18\x26\x63\xab\x22\x00\x4e\xd5\x4c\xee\x4d\x19\xeb\xe6\x27\xbe\x75\xf2\x9b\xf9\x20\xc8\x76\x83\x15\xd9\xce\xf2\xbf\x42\xb6\x83\xe2\x3d\x45\x28\x0d\x30\xc9\x39\x5d\x42\x68\xda\x3c\x95\x99\xa6\xe8\xe0\xc8\x45\xcc\x32\xa5\x29\x62\x94\xb8\xbc\xbc\xd4\x8c\x79\x46\x15\xe1\x5a\x91\xc8\x26\x19\xe2\x82\x3d\x50\x26\x63\x30\xd9\xd7\xe6\x05\x2f\x22\x94\x3e\x8e\x7c\xb5\xb4\x30\x5b\x57\x61\x7b\xc7\x12\xba\x25\xb0\xea\x50\x3a\x3b\xd2\x2c\xad\xd2\xd5\x60\x10\x02\xc4\xf1\x05\x8f\x31\x18\x89\xa5\x84\x8b\x76\x88\xea\x6e\x07\x0e\x3a\x26\x36\x1f\xab\x81\xb7\xd2\x6c\x7c\x60\x8b\x46\xbb\x9b\xa8\xcb\x14\x23\xe5\x77\x9d\xfd\xed\xd5\xe7\xfd\x28\x0e\x24\x97\x9b\x23\xe5\xf0\x5a\x59\x55\x97\x7d\xb1\x65\x75\x83\x58\x5d\x88\x06\xd5\x99\x95\xa4\x96\xb5\xd6\x98\x3c\x36\xca\xcd\x8e\xd4\xbf\x9d\x40\x2c\x83\x20\x70\xb0\xe6\x63\x60\x98\xdc\xfa\xec\xae\x3c\xc2\xc7\xc6\xd5\x39\x10\x31\xa5\xb8\x9c\x0b\xa9\x95\xc6\x76\x5b\xd9\x6b\x36\x54\x2c\x4d\xcb\xcd\xd5\xb0\x8f\xd7\x6c\xb3\x56\x02\x60\xfb\x69\x6f\x2c\x2d\xa7\xfd\xae\xe3\x49\x29\xcd\x34\x8f\xf2\x84\x66\xc5\xd9\x07\x22\xbf\x92\xb7\xd4\xb8\xcf\x4a\xd3\x4c\xd7\x02\x59\x18\xb9\x27\x3d\xe6\x22\x00\x2e\xcc\x98\xf0\xce\x3f\x4c\x03\x23\x63\x36\x35\xcc\x33\x4d\x93\xa5\xcb\x31\x28\x22\xd8\x13\xae\x74\x51\xfc\x0f\x64\x81\xba\xa1\x10\x8d\xe1\x1a\xfe\xad\xf3\xe8\x64\x32\x8f\xa4\x98\xf0\xe9\xe3\x65\xd1\xbd\x7f\xf3\xf6\x1c\x3e\x09\xf7\x8a\x1c\x3a\x7f\x7f\x25\x83\xae\xe8\x24\xdc\x2e\x92\xe4\xfc\x0f\x45\x8a\x9c\xc5\x73\x58\x93\x1f\xe7\xb2\xaf\xdc\x7a\xee\x99\x77\xe5\xbb\xe9\xa2\x32\x3c\x2b\x56\xa9\x14\x8a\x1b\x99\x18\xf0\xb3\xe0\x21\xac\x7e\xf2\xfe\xcd\xdb\x76\x93\xae\xba\x0c\xab\x2e\xc3\xaa\xcb\xb0\xda\x75\xa0\x6a\x64\x58\xf9\xd3\x0c\xf9\x55\x2e\x6c\xcf\xfc\xdb\xa6\x09\x15\xc7\xdd\x63\x5a\xd7\xfd\xf8\x76\xf9\x70\xc2\xa8\x99\x9a\xdd\x91\x85\xaf\xed\x83\x45\x15\x9e\x52\x9e\xae\x25\x33\xa0\x8b\xbf\x7f\xf3\xd6\xb7\xfb\x00\x39\x11\x31\x57\xe6\x33\xe7\x32\xe5\x2c\x3e\x1f\x7d\xac\x57\xa4\xf9\xa2\xfa\x56\x29\xa7\x03\x7f\x34\x3d\x3f\x52\xa4\x87\x0f\x91\xf3\xd1\xc7\x9e\x1b\x08\x2c\x44\x51\xc8\xcb\x67\xb5\x11\xaa\x43\x81\x00\xe9\x7f\x9f\x60\x14\x12\x2d\xdf\x8e\x4b\x85\x8e\xa4\xb0\x55\x67\x66\x54\x91\x31\x63\x22\x68\x14\x55\xe0\xf7\xf6\x69\x80\x02\xb5\x71\x4a\x80\xe0\x8d\xa0\xff\x45\x54\xc3\x90\xfc\x60\x44\x9b\x8c\x31\x61\x86\x11\xf7\x61\x09\x10\x21\x97\x01\xef\x45\x97\x5e\x30\x30\xd5\x83\x11\x01\x8c\xcf\x86\x4e\x6e\xcf\x18\x59\xa7\x93\xd6\x48\x7c\x2a\x76\xfa\x46\x00\x99\x07\xdc\xed\x8f\x61\x57\xee\x15\xd6\x64\x7f\x54\x9c\x9b\x11\x36\x91\x60\x84\x9a\xb3\xad\xbd\xd3\x2c\x10\xa3\x8b\x62\x00\x67\xd7\x57\x1e\x46\x76\x48\x06\x83\x81\x8d\x17\xd3\x59\x1e\x69\x84\x86\xd2\x58\xc8\xc8\xb4\x1a\xf3\x0c\xb8\x95\x62\x60\x09\x72\xf5\xda\xec\xee\xc4\x20\x2f\x08\xc8\x1c\x5a\xeb\x55\x31\x15\x43\x52\x8e\xd9\x33\xd3\x40\x5e\x4b\x69\x57\x08\x3f\xf8\x0f\x72\x7a\x4a\x6e\x2a\xd6\xf1\xb1\x11\x5a\x6d\x71\x14\x10\xfe\x27\x52\x1e\x95\xed\x64\x6c\x68\x5e\xfc\x5e\xc8\x7b\xb1\xee\xd3\xf0\x2d\x9a\xb1\x57\xe4\x53\xef\x6c\x41\x79\x62\xf6\xef\xa7\x5e\x9f\x7c\xea\x5d\xdb\x58\x65\x2e\xa6\x9f\x6c\xad\x83\x4f\xbd\x0b\x06\x05\xb8\xe3\x4f\x3d\xd3\xec\x6f\xa1\x7a\xdb\x5b\x96\x4d\xd9\xf7\x6c\xf9\xdf\xd0\x98\xbf\x3d\xc2\x4a\x6f\xcb\xff\xc6\x42\x6f\xe6\xbe\xa1\x56\xb7\xcb\x94\xfd\xf7\x9c\xa6\xfe\xc6\x5b\x9a\xfa\x97\x83\x30\x8c\x1f\x7f\x32\x64\x7e\xf1\x72\x58\x2c\xe7\x5f\xff\xa6\xa4\x78\xf5\xa9\x17\xe0\x77\xca\xb9\xd9\x16\xa9\x5e\x7e\xea\x91\xd2\x57\x5f\x7d\xea\xc1\x77\xdd\x7d\xd7\xc9\x57\x9f\x7a\xe6\x4b\xe6\x76\x26\xb5\x1c\xe7\x93\x57\x9f\x7a\xe3\xa5\x66\xaa\xff\xb2\x9f\xb1\xb4\x6f\x4e\xf5\x7f\x17\x5f\xf8\xd4\xfb\x2b\xf9\x24\x4c\x67\x21\xac\x00\x57\x52\x91\x7f\xad\x2f\x8c\xd1\x82\x4d\x6c\xd5\xd1\xb0\xf1\xd1\x5d\xe0\x58\x68\x34\xdf\xc7\x74\x76\x60\x75\xea\xbd\x81\x42\x57\x5f\x2c\xca\x56\x1e\x16\x0e\x62\x0f\xaf\xaf\xfc\xee\x75\x51\xb0\x3b\xa3\xf2\x59\xb4\x8a\x01\x98\xf1\x90\x60\x69\x44\x4c\x40\x34\x72\x12\xb8\xcf\xa1\x64\x8b\x20\xb9\x72\x32\x5b\x59\xbb\x35\x84\x03\x0f\xbc\x6d\x06\xc4\xbe\x28\x62\xa9\x36\xa7\xeb\x91\x00\x4d\x9b\xc1\x82\xce\x57\x4c\xfb\xfb\x87\x6d\xe0\x54\x5b\x1b\x3f\x75\x65\x7d\x71\x58\x07\x0e\x7e\x4e\x3f\xbf\x81\xea\x4e\xaf\xc8\xef\xbe\xfe\xc3\xef\xff\xb8\xc9\xae\x3b\x46\x6d\xfe\xbb\xad\x79\xcb\x6b\xa6\x61\xf5\xc5\xaa\x6d\x75\xe8\x84\xcf\x61\x91\x14\x5d\x54\x52\x2d\xc7\xec\x28\xa6\xc9\x18\xdc\x57\x79\x6a\xe6\xe5\xb5\x4b\x55\x15\x11\xc6\x13\xae\x6d\x8c\x7b\x02\x9e\x2c\xc9\xcb\xaf\xb1\xa6\x11\x7c\x7a\x85\x7c\xff\xf8\xf9\xa7\xe1\x9a\x2e\x73\x45\xfe\xb3\x5f\xe9\x8f\x11\x78\x72\xe0\x78\x66\xe3\xa0\xa7\xda\xe8\xaa\x36\xe2\x78\x03\x1b\x64\xbe\xbf\xbb\x16\xae\x41\x7d\x8f\xdf\x7f\xb3\x79\x7d\x5d\xf9\xf5\x17\x6d\x38\x15\xad\xd3\xd0\x4b\x01\x14\x31\xec\xe9\x1c\x12\xfa\x83\xb8\x91\x70\x6b\xeb\x66\x91\x3f\xe4\x3a\x93\x71\x1e\x19\x5d\x4c\x4e\x5c\x58\x7a\x14\x12\x28\x28\x2c\x63\x4e\x03\xaa\xd8\x84\x7d\x36\x93\xce\x8a\x0a\x43\x46\xdf\x65\x54\x70\x31\x55\x05\x8a\x23\x10\x10\xe4\xba\xf7\x33\x06\xac\x47\x87\xf5\x38\xa1\x57\x8a\xc7\x10\x33\x4f\xc9\x34\xa7\x19\x15\x9a\x61\xa5\x06\xac\xc9\x89\x0a\x66\x41\xf2\x68\x00\x8c\x69\x4f\x23\x1e\x55\x24\x56\xa6\x8b\x56\x15\xc4\x5a\xae\xad\x1d\xd5\x97\x2f\xbe\xde\xba\xe4\xfe\xb9\xcd\x16\x76\xaa\x35\xcb\xc4\x2b\xf2\xff\x7e\x3c\x1b\xfc\x5f\x3a\xf8\xfb\x4f\xc7\xf6\x1f\x2f\x06\xff\xf9\x3f\xfd\x57\x3f\x7d\x15\xfc\xf9\xd3\xc9\x9f\x7f\xd3\x86\xbd\x55\xb5\x1a\x59\x55\x6b\xd2\x76\x57\x8c\xe9\x99\xaf\x6e\xab\xca\x35\x20\x3d\xe8\xd2\xf6\x67\x6c\x77\xb7\x69\x18\xf5\x26\x49\x57\x03\xba\x8c\xee\x54\xec\x33\xa0\x78\x46\x2c\x1d\x5a\xf1\x76\x18\xc9\xf9\x69\x60\x5e\x30\x72\xf5\x5b\x2a\x96\xa4\x20\x6b\x28\x94\x56\x77\xba\x82\x2c\x33\x1a\x65\x52\xa9\x92\x89\xf8\x8e\x11\x2f\xb9\x22\xb1\x1c\xb3\x88\x82\x20\x9e\x8d\xb9\xce\x68\xb6\x0c\xf4\x0e\x87\x70\x9f\x2b\x36\xc9\x13\x72\xac\x18\x23\x43\x21\x63\xb6\x4a\x5d\x4f\x90\x86\xd2\x31\x4f\xb8\x86\x94\x90\x98\x19\x3d\x3b\xe1\x56\xfe\x77\xee\x6b\x57\x02\x77\xca\x3e\x13\xae\x7d\x19\x7a\xae\xc8\x71\x2c\xd4\xcb\x97\x5f\xff\x6e\x94\x8f\x63\x39\xa7\x5c\xbc\x9e\xeb\xd3\x93\x3f\x1f\xff\x9c\xd3\x04\xd2\x57\xde\xd1\x39\x7b\x3d\xd7\x07\x45\x8a\x95\xd9\xe2\xcb\xdf\xd7\x38\x45\xc7\x3f\xe2\x59\xf9\xe9\xf8\xc7\x81\xfd\xd7\x57\xee\xd6\xc9\x9f\x8f\x3f\x0d\xb7\xfe\x7e\xf2\x95\x19\x43\x70\x02\x7f\xfa\x71\x50\x1c\xbf\xe1\x4f\x5f\x9d\xfc\x39\xf8\xed\xe4\x37\x9d\x85\xbd\x30\x99\x07\xba\xd7\xa3\x59\xda\x6d\x1b\x5e\x91\xaa\x5a\xdc\xab\xbf\xaf\x5a\xde\x57\x3a\x8f\x16\xf8\x35\x08\x76\x51\xe9\x23\x81\x8d\xbe\xda\x44\x4d\x38\xbb\xb6\xcc\xf5\xd5\x31\xa2\xa4\x8b\x7b\xc3\xab\xf9\x40\xeb\x0d\xf1\xf9\xeb\xca\xf3\x7f\xb5\xd9\x21\x81\xd1\x0a\x2c\x99\xcb\x72\x74\x8b\x04\xcb\x4f\x19\x2f\xc6\x27\x0b\xae\xb1\xeb\x74\x3e\x80\xce\x07\xd0\xf9\x00\x9e\x87\x0f\xa0\x7a\xe4\xc1\x17\x00\x25\x51\x55\x60\x49\xa6\xf1\x9c\x8b\x0d\xc7\x7f\xfb\xb9\xb7\xd4\xa1\x4f\x52\x69\x64\x19\x0e\xb1\xd7\x72\xc1\xb2\x8c\x43\xcc\x1b\xbe\x93\xb1\xa2\x02\x61\x18\x7f\xde\x92\x05\x36\x66\x69\x22\x97\xf3\x4d\xb8\xe5\x0f\x13\x4e\x6c\x07\xd9\x72\x04\x73\x67\xf5\xed\xac\xbe\xbf\x14\xab\x6f\x67\xca\xed\x4c\xb9\x9d\x29\x77\xcd\xd5\x99\x72\x3b\x53\x6e\x67\xca\xed\x4c\xb9\x2b\x57\x67\xca\xb5\xcf\x74\xa6\xdc\xce\x94\xfb\xd8\xa6\xdc\xe2\x52\x25\x38\xdf\x47\xd2\x29\xeb\xc4\x39\xad\x68\xf3\xb6\xb0\xaa\xd5\xe7\xcb\x6a\xf9\x1a\x5d\x9e\x6b\xe5\xd2\x0c\x41\x6d\x1f\x86\x05\xd8\x1e\xb7\xda\x7c\x17\x34\xd5\xa9\xcf\x9d\xfa\xdc\x05\x4d\x15\x57\xa7\x69\xfb\xab\xd3\xb4\x3b\x4d\xbb\xd3\xb4\x3b\x4d\xbb\xd3\xb4\xab\x57\xa7\x69\xe3\xd5\x69\xda\x9d\xa6\xbd\xe6\xfa\x32\x34\xed\x6d\x41\x53\x13\xb3\x65\xdd\xcd\x5d\x51\x53\x24\x0c\xa7\xf9\xba\x0b\xa7\xe9\xc2\x69\xba\x70\x9a\x2e\x9c\xc6\x5d\x8f\x1d\x4e\x53\x36\xbf\x61\xcc\x4b\xc9\xdc\x06\x7b\x36\xcd\xe4\x82\xc7\x4c\x55\x82\x6f\x3c\xcc\x5e\xc0\x65\xe6\x50\x98\xaf\x08\xa8\x61\x8f\x13\x4e\xd3\xd9\xe6\x3a\xdb\x5c\x67\x9b\xeb\x6c\x73\xc1\xd5\xd9\xe6\xfc\xd5\xd9\xe6\x3a\xdb\x5c\x67\x9b\xeb\x6c\x73\x9d\x6d\xae\x7a\x75\xb6\x39\xbc\x3a\xdb\x5c\x67\x9b\x5b\x73\x7d\x19\xb6\xb9\x70\x07\x75\x59\x15\x9d\xea\xd9\xa9\x9e\xcf\x4c\xf5\xec\xf4\xc9\x4e\x9f\xec\xf4\xc9\x35\x57\xa7\x4f\x76\xfa\x64\xa7\x4f\x76\xfa\xe4\xca\xd5\xe9\x93\xf6\x99\x4e\x9f\xec\xf4\xc9\x2e\xab\xa2\x61\x56\xc5\xfb\x37\x6f\x83\x48\x0e\x8c\xf0\x08\x76\x16\x54\xd4\x06\xa4\x5d\xc7\x93\x3b\x2f\x6c\xa7\x0a\x77\xaa\x70\xe7\x85\x25\x9d\xd6\xdc\x69\xcd\x9d\xd6\xdc\x69\xcd\xd5\x85\xeb\xb4\xe6\x4e\x6b\x2e\x2f\x65\xa7\x35\x37\x9f\xb4\x4e\x6b\xee\xb4\xe6\x35\x4b\xf1\xcb\xd0\x9a\x3b\x58\x59\x2d\x33\x80\x8b\x7d\x7c\x48\xd9\xef\x7c\x41\xcf\x55\x38\x59\xf8\x6d\x23\x94\x2c\x76\x18\x7e\x5a\x07\x23\x2b\x71\x57\xae\xe2\xc7\xba\x12\xa2\x4f\x80\x1d\x8b\x65\x80\xac\xe2\x90\x0b\x0e\x62\xcf\x3c\x4f\x34\xd7\x4c\x50\x11\x2d\x81\xcd\xbe\x7f\xf3\x96\xcc\xa9\xa0\xd3\xa0\x92\x8f\x1a\x92\x2b\x0d\xf4\x46\x67\xbe\x74\x93\xad\x36\xe4\xf3\x3e\xc2\xe2\x46\x80\x3e\xe1\xeb\x0b\x81\xc2\xe1\x84\x00\x16\x83\x00\x68\xd8\x07\xd4\x22\x0a\xcb\x10\xfd\xaa\x7a\xc0\xbb\x4c\x98\x2e\x13\xa6\xcb\x84\x79\x26\x99\x30\x40\x3f\x36\x16\x98\x2b\x11\x99\x3d\xca\x6e\xc5\x6c\x42\xf3\x64\x4d\x29\xdf\x3c\x05\xdb\x9a\xb7\x60\x91\x0b\x7c\xb2\x81\x7d\x55\xb1\x84\x45\x5a\x66\x3b\x8b\xd4\x8d\xec\x83\xf6\x0d\x1c\x66\x69\x68\x47\x6a\x3b\xdd\xaa\x31\xd2\x5d\xbd\x25\x20\xba\xe8\x68\x76\xf9\x39\x05\x4b\xe3\x06\xbb\xf0\x4a\xef\xab\x2f\xe1\x89\x72\x25\xf6\x12\x3a\x66\x89\x9f\x0a\x47\x49\xe7\x78\x64\x50\x52\x2b\xee\x80\x80\x79\xf6\xee\x62\xd5\xc4\x5d\x1e\xe0\x26\xab\x34\xd9\x6e\x99\x5e\xe9\xfa\xd9\x96\xee\x59\xc2\xe0\x7e\x01\xab\x82\x57\x5e\x91\xe8\xf5\x09\x25\x77\x6c\x89\xf4\xb1\x94\x9c\x65\x1e\xce\x18\x50\x53\x58\xcc\x3b\xb6\x84\x87\x2c\xb1\xdc\x21\x60\xb6\x52\x35\xfc\x8e\x6d\x9a\x21\xfc\xdd\x75\x76\xb3\x80\x5a\xab\x3e\xf7\x1d\x5b\x6e\xfb\xb9\x32\xe1\x66\x1e\xbc\x0d\xd1\xcc\xbc\xb9\xe1\x0d\x36\x7e\xb2\x69\x9a\x26\x9c\x01\x35\xdc\xda\x76\x2d\x79\x9c\xf8\xa1\x36\xe8\xa8\x5f\xca\xc0\xe2\x04\x8b\x7d\xa4\x70\x61\xcd\x4e\x9f\xf1\xd4\x0a\x19\x28\x5a\x38\x56\xf8\x91\x26\x3c\x10\x63\x60\x57\x5f\x89\x3e\x79\x27\xb5\xf9\xdf\xe5\x67\x6e\x48\xbd\xd9\x0f\x17\x92\xa9\x77\x52\xc3\x9d\x56\x86\x8a\x5d\x68\x30\x50\xab\xd9\xf1\xc0\x4d\x22\x27\x25\x7e\x68\xc4\xb0\x49\x29\x0b\xd0\x3c\x7d\x25\x8c\x3a\x69\x47\x54\x32\x86\x98\x26\xe6\xb9\x02\x06\x26\xa4\x18\xa0\xfd\x62\x5d\x1b\x76\x22\x64\x56\x9a\x87\x2d\xcd\xd9\xa6\xc0\x4e\x82\xbf\xa0\x04\x94\x18\x51\x96\xc4\x58\x2f\x18\xb8\xb9\x21\xda\x3c\x22\xe8\xed\x00\x9f\x43\x9d\xe9\xdd\x46\x57\xf0\xda\x41\x5d\x6a\xae\x15\x90\xcc\x37\xe6\x00\x34\x20\xb1\xf8\x3c\x92\xa5\x39\x4d\xcd\x32\xfd\xc3\x50\x1f\x98\xa9\x7f\x91\x94\x72\x23\x31\x9f\x81\xf4\x9f\xb0\xd2\x6f\xb6\x14\x78\xd8\x8c\x69\x81\x2b\x62\x48\xc9\x82\x26\x86\xde\x81\x7d\x9e\xb0\x04\xa9\x9f\x11\xd2\x2b\x84\xbd\x4f\xee\x67\x52\x21\x31\x43\x2b\x15\x57\xa4\x77\xc7\x96\xbd\xfe\xca\xd2\xf6\xae\x84\x75\x53\xad\x2c\xa6\x27\xa2\x52\x24\x4b\xd2\x83\xdf\x7a\xfb\xf3\x82\xad\xc4\x92\xc6\x68\x3e\xa0\xc9\x75\x0d\x6a\xb6\x75\xdd\xca\xce\xe5\x4d\x75\xf6\x2b\x7c\xbd\xfa\x8a\x23\x7e\x98\x91\x1b\xea\x26\xf0\x24\xa1\xf8\xa8\x75\x02\x43\x29\x54\x34\x8f\x60\xbd\x57\x88\x97\xf6\xf3\x7c\xac\x4e\x70\x65\x8d\x3c\xea\xe6\x1e\x34\xbd\xc6\x05\xde\x8d\x42\xcf\xa3\x6b\x4c\x1c\x8e\xcf\xae\xaf\x76\x57\xd6\x1d\xc1\x2b\x44\xb3\x24\x41\x17\xb6\x91\x59\xb5\xb4\x32\xeb\x5a\x11\x26\x0d\xda\x0f\x94\xfc\x8d\x9d\x5d\x57\xac\x15\x7e\x05\x51\xc8\x2b\xb1\xbb\xfb\x7a\x5b\x79\xc1\x92\x3b\xf6\x39\x4d\x78\xc4\xb5\xa3\xdf\x85\x6c\x05\xfa\x10\xbc\x04\x84\x8b\x83\x34\xa0\x98\xee\x17\xb2\x1a\x57\x84\x4f\x85\xcc\xd6\xef\xcf\x87\x89\x5d\x27\xe4\xf3\xe0\x2e\x1f\xb3\x4c\x30\xcd\xd4\xc0\xc8\x58\x03\xfb\x02\x5b\x3d\x02\x55\x11\x76\xd7\x2c\xf5\x3e\x94\x5f\x28\x29\xa0\xb6\x31\x47\x5b\x97\x2b\x95\x85\xe1\x29\x3f\x83\x70\x9e\x33\x86\x16\x43\xef\x40\xd1\xf7\x92\xa8\x3c\xb5\xb9\xe5\x95\x26\xcd\xd1\x24\x9f\x84\x13\xb4\x5f\x15\xd5\x80\x81\x50\x40\xb0\x84\x4b\x69\xb7\x27\xcb\x6a\xca\xb0\x5c\x73\xb9\x60\x4e\x8d\x45\x96\x60\x98\x41\x3a\xa3\x8a\x15\x3a\x98\xca\xa3\x88\xb1\x98\xc5\xf8\x83\x65\x25\x6c\x32\x61\x91\xe6\x0b\x96\x2c\xc1\xf8\xaf\x50\x24\xf1\xdf\x37\x3b\x1b\x3f\x5f\x0c\xb8\xf2\x45\xc1\x3e\x6b\xa7\xa4\x13\x0e\x4a\x78\xd9\x52\x91\xf9\xe1\xce\xa8\x22\x13\xca\x13\xa3\xd7\x7d\x12\xe4\x96\x45\xb3\xeb\x8c\x2d\x38\xbb\xff\x20\x14\x9d\xb0\xd7\x94\x27\xaf\x65\x76\x4f\xb3\x38\x98\x83\x87\x18\xbe\xe9\x95\xff\x0d\xbb\xe4\xe6\xe5\xcc\x13\xce\x64\x19\xd4\x65\xb6\x9e\x31\x33\xde\x7b\x37\xc0\xeb\xc4\xcc\x18\x38\x5c\xa9\x51\x68\xfd\x8e\x22\x19\x9b\xb0\x8c\x09\x73\x9e\xa8\x6b\x3f\x78\xc9\xb3\x87\x88\x6a\x9a\xc8\x69\x51\x52\xda\xea\xbd\xe8\x18\xa3\xf0\x31\x37\x7b\xce\x0d\xc4\x8c\xa8\x00\xf5\x3f\xf0\xec\x06\x46\xa3\x4f\x82\xfc\x70\x76\xf3\xee\xea\xdd\x77\xaf\x80\xab\x6c\x9b\xe1\xd5\x7d\xcd\x15\xc9\xe1\xa9\xc0\xea\xa1\xf2\x44\x9b\x2d\x9e\x0b\xef\x2f\x1a\xb3\x19\x5d\x70\x73\x06\x32\x6b\x0f\x59\x30\xac\x23\x6e\xd4\x60\x92\x48\x65\xda\x49\x98\x52\x64\x29\x73\x0c\xe2\x89\x19\x4b\xd1\xc5\xad\x34\x15\x50\xbd\xc4\xfa\x33\xaa\x83\x20\x63\x66\x7e\x75\x16\xb1\x95\xd3\xb5\xce\x9f\xb0\x83\x72\x38\x4d\x77\x83\x22\x4b\xb6\x3a\x3c\x06\x5b\xde\x32\xbf\x6e\x9b\xe2\xb2\xda\x5f\x3f\x5a\x0a\x15\xff\x6d\xf5\xb6\xc3\x07\x6f\x9a\xeb\xfe\x9b\xf5\x28\x0c\xfc\xf8\x80\xbb\xb0\x81\xc6\xbf\x3d\xa2\xaa\x34\xca\x20\xb8\xa6\x22\x7b\xaf\xe3\x9c\x41\x90\x50\x9b\xcc\xa6\x0b\xd5\xea\x42\xb5\xba\x50\xad\x95\xdf\xbb\x50\xad\x2e\x54\xab\x0b\xd5\xea\x42\xb5\xba\x50\xad\x2e\x54\xab\x0b\xd5\x22\x5d\xa8\x56\xf1\x4c\x17\xaa\xd5\x85\x6a\x3d\x5d\x82\x53\xa0\x95\xee\x54\x30\xdf\x14\xcf\xa2\x74\xa2\x5d\x30\x94\x3b\x99\x65\xd1\xb0\xaa\x72\xda\x53\x6c\xf8\xb1\x6d\xa6\xb1\x55\xb9\x8e\xd0\x25\xea\x5b\x71\xcb\xf6\xdb\xc0\x6c\xb2\xe2\x1a\xf7\x1c\xa8\x34\xa8\xe7\x6a\xa7\x2d\x7b\x16\x6e\xd8\xa4\xa1\x63\xe1\x86\x4d\x42\x53\x1b\x4e\x4c\xd9\x9f\x60\xc3\x55\xbc\xc3\xe1\x01\x62\x07\x36\x07\x38\xad\x1d\x82\x11\xf6\x9d\xbd\xd4\xee\x47\x3b\x86\x8d\x8e\xd0\x9d\x47\x1a\xf8\xf1\x35\xd5\xb3\x5a\x3d\x38\xba\xb2\xd3\x06\x5e\x43\xf0\xe3\xa6\x9c\x45\xac\x14\x43\x05\x72\x1c\xa3\xb1\xbd\x69\x04\x9f\x8c\xd9\xdf\xfa\x28\x71\x58\x5f\x69\x11\x63\x65\x84\x26\x42\x0d\x21\xe6\x31\xf9\x5f\xa3\xf7\xef\x4e\xbf\x93\x56\x56\x30\xda\x8c\xb2\x15\x92\xe6\x4c\xe8\x3e\x51\x79\x34\x23\x54\x99\xae\x19\xfd\x76\x04\xa6\x87\x39\x15\x7c\xc2\x94\x1e\xda\xd6\x58\xa6\x7e\xfc\xfa\xa7\x61\xd9\xdc\xc1\xad\x43\xd5\x45\x22\xd9\x0d\x00\x67\xc3\x0c\xc6\xbf\x0b\x42\x2b\x74\x29\x95\xb1\xed\xf4\x3d\x74\x56\xd3\x3b\x46\xa4\xed\x6c\xce\x80\x29\xbc\x22\x3d\xb3\x4d\x82\x4f\xff\xc3\x1c\xac\x7f\xf5\xc8\xf1\x3d\x98\xf4\x7b\xe6\xcf\x1e\x7e\xd0\x07\x8e\x99\x7b\x01\xc7\xb7\x1f\x46\xf9\x3e\xe3\xd3\x29\x88\x5b\x60\xb7\x5d\x30\xa1\x4f\x80\xbf\x4d\x88\x90\xc1\xc3\xc2\xfa\xc7\x0a\xaf\x58\xb5\x23\x3f\x7e\xfd\x53\x8f\x1c\x97\xc7\x65\x44\x50\xf6\x99\x7c\xed\x3d\x61\xa9\x8c\x4f\x9c\xd6\xba\x14\x9a\x7e\x06\xc5\x60\x26\x15\x13\xe8\x48\xd0\x12\xad\xb1\x4a\x1a\xe5\x93\x25\xc9\x00\x05\xcc\x98\xdc\xa3\x01\xce\x4d\x25\x3a\x93\x53\x9a\xe9\x4a\x58\xdd\xed\xfb\x8b\xf7\xaf\xf0\x6b\x66\xd9\xa6\xc2\x69\xb9\x13\x2e\x68\x62\xcd\xda\x5e\x3e\x34\x1d\xc9\x71\x91\xb4\xb4\xaa\xad\xb3\xe8\x4e\x72\x9d\x67\x6c\x58\x0d\xb3\xaa\xbd\xe3\xd7\xc5\xb8\xad\xdf\xec\x10\xeb\x56\x3d\x68\x4f\x18\x49\x56\x7b\x88\x62\x83\xa7\x75\x75\x88\xef\x82\x3d\xb8\x75\x88\x05\x69\x36\xa3\x8c\x65\xa4\xcc\x00\x23\x96\x6a\x75\x2a\x17\x86\x74\xb2\xfb\xd3\x7b\x99\xdd\x71\x31\x1d\x98\x4d\x36\xc0\x95\x57\xa7\xc0\x62\x4e\x7f\x0d\xff\x3b\x68\x44\xc0\xa7\xea\x0f\x0b\x03\x5a\x1f\x61\x6c\xc0\x3e\x4f\xf7\x1e\x9a\x93\x2f\x9b\x70\x82\xa3\x91\x53\xfe\x2a\x6f\x9b\xe3\x82\x8e\x70\x1b\xe9\x1a\x50\xb8\x39\x8d\x91\x04\x52\xb1\x7c\xf0\x6d\x6c\x26\x10\x74\xfc\x68\x39\xb0\xa1\xe8\x03\x2a\xe2\x81\x97\xaf\xa3\xe5\xde\x33\x96\xf3\x9a\x07\xf8\xc3\xd5\xc5\xe3\x6c\xee\x9c\x37\x3a\xad\x6d\x25\x12\x90\x52\xf0\x39\x4d\xd2\x19\x6d\xab\xde\x42\x17\x82\x0e\x57\x17\x82\xde\x85\xa0\x77\x21\xe8\xc5\xf5\x4c\x42\xd0\xbb\x10\xf2\x2e\x84\xbc\x0b\x21\xdf\xfc\x73\x17\x42\xde\x85\x90\x77\x21\xe4\xd5\xab\x0b\x21\xef\x42\xc8\xbb\x10\xf2\x2e\x84\x7c\xcd\xd5\x06\x54\xdd\x17\x18\x7c\xd9\x39\xc7\xbe\x0c\xe7\x58\xe7\xee\xea\xdc\x5d\x9d\xbb\xab\x73\x77\xed\xb1\xe3\x3b\x77\x57\xe7\xee\xea\xdc\x5d\x9d\xbb\xeb\x99\xba\xbb\x1a\x55\x16\xff\xa2\x81\xb3\x1e\x1f\x33\x0b\x6e\xad\xc2\x65\x6d\x44\xca\xb2\x20\x59\x2b\x48\x58\x05\x08\xd6\x39\xe6\x52\x3e\x3c\x02\x56\xd9\x00\xe8\x8a\x32\x37\x28\xc4\xde\x39\xf4\x3a\x87\x5e\xe7\xd0\xdb\x75\x4a\x1a\x38\xf4\xc0\x97\x17\x1e\x05\xab\x8e\x14\x29\x1c\xef\xd7\xbb\x36\x36\x7f\xba\xbe\x69\xc5\x5a\x55\xc2\xcf\xbb\x5c\x94\xe2\xfb\x81\x85\x05\x4e\x8a\x59\xd0\x48\xce\x53\x29\xcc\xc6\x68\xc7\xb9\x58\xb4\x57\x23\x5b\xd5\x3d\x6a\xef\x8f\x59\x18\x4c\x6e\x3d\x5b\xf3\x54\x2a\x56\xb2\xe3\xee\xa1\x78\x6f\x77\x4d\x0d\xd0\xe9\xe3\x4c\x68\x7b\x28\xee\xa5\xf7\x6b\xc9\x22\x6f\xc2\x37\xac\x6b\x12\x3c\x4f\x3f\xe7\x2c\xc3\xd2\xf9\x85\x03\xa7\x98\x14\x67\x72\x45\x97\x54\x69\x5a\x8e\xb6\x2c\x66\xcd\x69\xaa\x33\x54\xd2\xc0\x1f\xbb\x32\xea\x47\xf5\xc9\x92\xda\xfe\x93\x1a\xde\x93\xe7\xed\x9f\x25\x75\x7d\xb4\xa4\xa6\x9f\x96\xd4\xf0\xd5\x92\x7a\xfe\x5a\x52\xdb\x67\x4b\xea\xf8\x6d\xc9\x03\xfb\x6e\x49\x7d\xa7\x26\xa9\xed\xc3\x5d\xe9\xf4\xb3\xf3\xe3\x36\x1c\x76\x1d\x7f\xee\xca\xa0\x3b\x9f\x6e\x65\xaa\x77\xfb\x75\x49\x5d\xdf\x2e\xa9\x9f\x9e\xb4\xd3\xc7\x4b\x3a\x3f\x6f\x33\xfe\xb2\x93\xe8\x36\xf3\xf7\xd6\x5a\xcb\x8c\x4d\xea\x39\xe9\x6f\xd8\x04\x07\x13\x88\x13\x85\xa3\x43\x6e\x94\x21\x0a\xa9\xa3\x6f\xa9\xa8\x03\xcf\x29\xc9\x2e\x8f\x13\x11\x75\xc3\xa3\xd9\x4d\x68\xbc\xa2\x81\x2d\x0b\x68\xa4\xeb\x6d\x9f\x30\x91\xf1\x68\xe6\x3a\x6b\x84\x5c\xeb\x59\xdb\x0e\x78\x12\x76\x7b\xc7\x82\xd6\x63\x67\xbb\xbd\x39\x6b\x06\xba\x87\x4f\x27\xec\xf8\x4e\xe2\xbd\x1d\x4d\x66\x43\xa7\x02\x24\x90\x4a\x06\xbe\xd5\xc3\x4b\x59\xea\x7e\x07\x3d\x62\x68\xcb\xfa\xee\x16\xbd\x0d\x3b\x4b\x5d\x82\xea\x2a\x66\x8b\x28\x3a\x6f\x1d\xb2\x5b\x72\xed\xc3\x61\xd4\x10\xbb\xea\x0b\x5e\x3b\xf1\x40\xc2\x07\x37\x22\x83\x14\x57\x7d\xe9\xab\x19\x5a\x48\x71\xad\xf8\xc1\x0f\x41\x07\x69\x8b\xd3\x15\x57\x5d\x98\x8e\xf2\x34\xa0\x13\xbe\xd5\x29\xb8\xa7\x10\x6d\x32\x5e\x89\x41\x78\x92\x41\xee\x44\x25\xd9\x30\xba\xb3\x43\x41\x49\xda\x1e\xfc\x2e\x20\x8a\x0d\xe3\xb8\x6d\x86\x2e\xd1\x76\xaf\x77\xe1\x1f\x6c\xe8\xf5\xa8\x55\x24\x84\x3d\xfb\xbe\x1d\x94\x60\x43\xcf\x6f\xab\xf0\x04\x2d\x76\x6b\x67\xdc\xc2\x9a\xfe\x74\xd1\x0b\x5d\xf4\xc2\x33\x8f\x5e\x68\x74\x06\xb6\x45\x32\xac\xdb\xfe\xcf\x35\x9e\xa1\xd1\xa0\xb7\xc5\x36\xac\x1b\xf4\x33\x89\x70\x68\x3c\xc6\xad\xd1\x0e\x9b\x06\xfa\x4c\x62\x1e\x1a\x0d\xb6\x66\xfc\xc3\xba\x21\xff\x92\xa3\x20\x1a\xcd\xe1\x96\x88\x88\x75\xf3\xf6\x2c\xe2\x22\x36\x0e\xf0\xdf\xba\xaa\x58\x88\x7d\xfc\x78\x01\x12\xa3\xe0\xab\x95\x20\x89\xf0\xa7\x95\x40\x89\x52\x6f\x31\x58\x62\x4d\x45\x31\x95\x8f\xc3\x7f\x57\xa3\x2a\x54\xf9\xe3\x75\xca\x8b\x85\xf6\x35\x88\x09\x38\x97\x49\x3e\x0f\x6d\x1c\x83\x55\xd1\x3f\xa5\xd1\x9d\xd1\x5a\xec\xf7\xc6\xe0\x59\x0b\x36\xe7\xdf\x94\x14\x20\x51\x92\x21\x88\x21\x66\x06\x83\x9f\x71\x7d\xae\xb1\x91\x5f\x6d\xdd\xc1\x6b\x3f\xef\x00\xaa\xad\xb7\xde\x69\x20\x85\xf0\x93\xae\x34\x5d\xed\x11\xbe\xba\xd2\xa7\x51\xf5\x76\xed\x2e\xcd\xa8\x10\x2c\x31\xb4\x00\x3d\xfa\x20\xdd\xf9\xf9\xd9\x3e\x3d\xf6\xe5\x95\xde\x9c\xaf\xdc\x5f\xd3\x9d\x52\x8a\xfe\xa1\x31\x32\xe1\x16\x25\x77\x8c\xa5\x2a\x70\x96\xe4\xe0\x53\x81\x5c\x90\xf1\xd2\xa8\x77\xd1\x1d\xc0\x8d\x82\x54\x06\xe3\x3d\xc7\x85\x69\x39\x81\x1e\x36\x7b\xca\xa2\xe0\x56\x17\x82\xd3\x85\xe0\x74\x21\x38\xbb\xce\x58\x8d\x10\x9c\xf0\xc0\x97\xc2\x70\xa8\x20\x67\x69\x9a\x80\x51\xca\x41\xc3\x5a\xcc\x41\x0b\xb8\xb1\x62\x89\xdb\x33\xbd\xa8\xc2\x1c\xdc\xed\x15\x0a\x5d\xfe\xc1\x33\xb5\xca\x13\x5b\x23\x6c\x90\x9e\xae\x93\xef\xb6\x4a\x87\x91\x14\x13\x3e\xdd\x9d\x17\x13\xcc\xe5\x39\xbc\x52\x78\xcc\xb0\x89\xdc\x22\xdb\x16\x9c\x0a\xd2\xb7\x4a\x7c\xfb\x01\x92\x63\x98\x58\xd4\xf2\x77\x5d\x8a\x45\x39\xac\x84\x89\x05\xcf\xa4\x00\xb7\xe2\x82\x66\x9c\x8e\x13\xcb\xd8\x98\x76\x6a\xb8\x37\x29\xac\x3b\x52\x8f\xe2\xe1\xba\x14\x8b\x8f\xb4\x1c\x0f\x20\xd6\x76\x9d\x38\x97\x06\x18\x74\xce\x7d\xc7\x0f\x73\x69\xd5\x4b\xde\x5f\xbb\xcb\xdd\x55\xcf\xcd\xd0\x50\x5f\x0f\xd5\xf5\x75\xb3\x31\x24\x6f\xad\xc3\x9e\x92\xf3\xff\xb9\xba\xb8\x7c\x77\x7b\xf5\xfa\xea\xf2\xa6\xbd\xac\xf5\x26\x8a\xd4\x47\xb7\x46\x81\x8b\xf5\x37\xc7\x1f\xcf\x6e\xfe\xe7\xdd\xd9\xdb\xcb\x13\x70\xc3\xb2\xcf\x29\x85\x4a\x05\x05\x64\x79\x9a\xb1\x05\x97\xb9\x4a\x1c\x2e\x71\xbc\x61\xd3\x56\x77\xab\x8d\x20\x5a\xfa\x64\xb5\xb5\xaf\x41\x40\x04\x2d\x36\x50\xe4\x77\xb8\x61\x54\xc9\x82\xc5\xfd\x50\xf7\x8b\xbc\x71\x8a\x8b\x34\xd7\x8e\xe1\xf9\xac\x5f\xe1\x01\xd9\x2f\x64\x6e\xda\xfb\xcd\x6f\x60\x60\x19\x8b\xf3\x08\xc3\xd3\xa8\x8b\x02\xf8\x4d\xdf\x2a\xde\x50\x6a\x06\xd3\x04\x99\x8a\x68\xea\x86\x1e\xce\x0e\x5a\xeb\x5e\x11\x3e\x64\x43\xd2\xfb\x4d\xf0\x53\x0f\xbf\x9e\x22\xbc\xb3\xcd\x1c\x85\x5e\x25\x5c\xb3\x8c\x26\xa4\x17\x3e\x3d\x24\x97\xe6\x1b\x2c\x0e\xd7\x01\xab\xee\xb0\x05\xcb\x20\xbc\xc3\xae\x42\x9f\x64\x6c\x4a\xb3\x18\x8a\xaa\xc8\x49\x05\xdf\xd9\x4e\x18\xf3\xc1\x23\x42\xea\xa1\x2b\x5b\x02\x34\xa4\xd7\x6b\xc7\x76\x07\x5b\xed\x75\x26\xb7\x22\x0e\x57\x49\x75\x59\x73\x58\xb7\xf6\x47\x36\xe6\xac\x44\xd6\x14\x8b\x09\xb7\xe1\x44\xce\x70\xb9\x03\x65\x9a\x34\xf1\x74\xd6\xf7\x37\x22\x43\xc1\xa2\x13\x1b\x92\x36\xb7\x8d\xdf\xc2\xd2\x40\xe0\x14\xd6\xdc\x38\x77\x0d\xd6\x0d\xc1\xa9\xe5\xb8\x6d\xe2\xba\xad\x17\x37\xd7\xcc\x29\x5b\x33\x2c\x8e\xac\x73\x70\x41\x34\x9c\x0b\x18\xad\xe3\x70\x69\xec\x78\xdc\x4d\xd1\xd7\x76\xee\xb1\x2d\xb1\xd6\x68\x7f\x16\xc7\xb6\x7a\x88\x45\x9d\xc6\x22\x22\xc3\x40\xeb\xea\x83\x3e\xd0\x27\x39\x8f\xff\xbc\xfd\x70\xef\x39\x63\x32\x45\x63\xc5\x1e\xb3\x86\x26\xce\x65\x89\x4e\xf9\x4d\x0f\x4e\x15\xad\x60\xcd\x5d\x1c\x9b\x65\x28\x0d\x86\xb1\x09\xde\xa0\x7c\xc1\xb4\x35\x3f\xb3\x47\xc5\xa1\x45\xe7\x88\xdd\x00\xa9\x8c\x5f\xb9\x32\x6e\xca\xab\x08\x60\x73\xe9\x97\xff\x04\x79\xb9\x4f\xfe\xea\x6f\x42\xd4\xa7\xfa\xf1\xe8\xe8\xbf\xbe\xbf\xfc\x3f\x7f\x3a\x3a\xfa\xe9\xaf\xe1\xaf\x81\x85\xae\xfc\x08\xda\x74\x64\x0c\x42\xb8\xfd\x73\x15\x4c\xa3\x6f\x2d\x88\xc3\x99\x54\xfa\xea\xda\xff\x99\xca\xb8\xfa\x97\xda\xc1\x09\xc8\xc3\x12\x1d\xef\x01\x6d\x99\xf4\xd4\x0d\x63\x72\x57\x69\xb9\x3f\x96\x43\x99\xac\x41\xc2\xfc\xf3\xb5\xeb\xae\xe1\x40\xf7\x19\xd7\x9a\x01\x5c\xbd\x66\xd9\xdc\x70\xe2\xbe\x2b\x2e\x86\x6c\x76\xf1\xb2\xf7\x20\xc4\xab\xa6\xdf\x78\xed\xe0\xa0\xf7\x76\x64\xb8\x99\x8b\xc8\x7c\x2b\x41\x15\x3a\x52\x10\xd8\xd5\xfa\x40\x9c\xbd\xe1\xf5\xc1\x67\xd2\x5b\x2e\xaa\x9e\xdc\x57\xe8\x3a\x0d\xb1\xfe\xc1\x1a\x61\x04\x50\x6f\x91\x38\xc6\x9b\xc3\x28\xcd\xfb\xf6\x81\xe1\x9c\xcd\x65\xb6\xf4\x7f\xb2\x74\xc6\xe6\x46\x62\x1b\x58\x1b\x7e\xdf\xbf\x8e\xaf\xf9\xbf\xf0\xc5\xd2\x07\x56\xdf\x3e\xa9\x14\x83\xf4\x85\x20\x9f\xf6\x2c\xba\x69\x6a\xf9\x28\xfa\xd5\xd8\x04\xf3\xb3\x7a\x95\x17\xfa\xbc\xe4\x6b\x7f\xe5\x47\x05\x32\xe4\x42\x26\xf9\x9c\xa9\xbe\x67\x4f\x28\xad\x8b\x85\x91\x26\x77\xb8\x6d\xdc\xd5\xf0\xf4\xc5\x7c\xc1\x55\x9d\xe0\xf9\x95\xa1\x58\x57\x9f\xcb\x75\xca\xb5\xd1\x54\x30\x04\xca\xab\x8b\x9f\x53\xa9\x40\x07\xf0\x71\xac\x25\x92\xf2\x72\x5b\x55\x8e\xe2\x0a\x0a\x35\x7c\xfa\xed\x3f\x07\x50\x6c\xe1\xc5\xe0\x3f\x7f\xfa\xed\xf1\xa7\x21\xfc\xe3\xab\x93\x3f\x9f\xfc\xd3\xfd\xf1\xdb\x93\x93\xe3\xe3\x1f\xbf\x7f\xfb\xdd\xed\xf5\xe5\x4f\xfc\xe4\x9f\x3f\x8a\x7c\x7e\x87\x7f\xfd\xf3\xf8\x47\x76\xf9\x53\xcd\x46\x4e\x36\xd7\x4d\x29\x5f\x54\x2c\xdf\xd7\x38\xf0\x78\x0d\x6a\x16\x08\x5a\xff\x56\xed\x65\xad\x94\x2a\xe0\x42\x0f\x64\x36\xc0\xd7\x4b\x3e\xbb\x6d\x97\x5b\xb6\x7d\xf6\xf9\x8d\x3b\xad\x81\x29\xd6\x91\xe6\xd6\x37\xb2\x62\x51\xc6\x74\x5b\x1a\x0c\xb6\xe6\xf8\x47\x2a\xe3\xa3\x00\xfb\xb7\x53\x6a\x0a\xa5\xc6\x57\x39\x85\xf9\x2a\x38\xef\x24\x93\xf3\x21\x09\xcc\x42\x18\x86\x65\x9f\xbb\x63\x3b\xb4\x5c\x77\x75\x4a\xd0\x97\xa5\x04\x8d\x70\x7d\x1f\x5c\x03\x62\x62\xb1\xcd\x4c\x53\xb5\xe9\x9a\x67\xcb\xe6\x68\x9f\xdf\x2a\x49\x2a\xd3\x3c\xa1\x7a\x83\xd9\x6e\x8d\x6d\xda\xee\x7d\xe5\xcd\x84\x3e\xb0\xcf\x52\xb9\xf9\x7a\x63\x28\x39\x4b\x12\xc2\x05\x9e\x04\x68\xc0\x59\xf3\x32\x66\x0b\x67\x63\xa1\x54\x08\xce\x2b\xaa\x27\x16\x86\x46\x08\x73\xa4\x99\x86\x42\x65\x3f\x60\x5d\x66\x33\xc9\xd6\x34\xc6\x05\x62\x9f\xa7\x09\x23\x9e\xdb\xfa\xd4\x1b\x42\x95\x92\x11\x2f\xca\x2f\x7b\x30\x34\xdb\x6d\xe8\x0d\xc4\x22\xa6\x19\x8b\x58\xcc\x44\xc4\x20\xcf\x2d\x67\xc5\x58\xc7\x46\x18\x04\xf3\xbe\x2d\xe1\x1c\xe7\xe8\xda\x41\x7a\xb0\xbe\x8d\xab\xf9\x3c\xdf\x5a\xe9\xb1\x75\x2b\xbe\x59\x71\x6b\x99\xab\x24\x4b\x14\xa2\xb5\x4f\xc5\xf1\xaa\xfb\xe6\x50\xff\x16\x33\x52\xbc\xb9\x6d\x27\xa7\x5a\xa1\xb8\x85\x8d\xa1\x4c\x69\x1f\xdb\x62\x58\x8f\xce\xfe\x22\x69\x6c\xa3\xac\xd4\xba\xb4\xb5\x81\x71\xa9\x29\x3d\xad\x6b\x4d\x4a\x33\x36\xe1\x9f\x9b\xe4\x48\x89\x42\x45\x09\xea\x46\x1a\x82\x9a\xb1\x94\x09\xd0\xc3\x19\x8d\x66\x98\x1b\x2c\xca\xe3\x78\x50\x8f\x11\x4a\x19\xcd\x8f\xd7\x68\x9d\x14\xd3\x9d\xad\x5f\xf8\xd9\xb2\xab\xde\xfe\xc1\x12\x32\x66\x8d\xe0\x28\x8e\xde\x05\x6f\x54\x20\x0c\xd0\x81\xe7\x3a\x69\xb4\x37\xef\x72\x4a\x25\x9c\xb5\x09\xd7\x98\x44\x00\xb5\x1b\x0b\x2c\xda\xe0\x4d\x48\xe6\xb5\x4f\x1c\x41\x72\x0d\xa4\x01\x57\x1a\x1a\xa3\x89\x30\xce\x13\x16\x13\x17\xb0\x81\x8d\x36\xdc\x52\xa5\x50\x85\x53\xaa\x14\x9f\x8a\x41\x2a\xe3\x81\x69\x6d\x07\x38\xdb\x63\x41\x37\x93\x40\xcb\xad\x97\xcb\x7b\x74\xe3\xed\x6f\x81\x6c\x11\xc9\x79\x9a\x6b\x16\x18\xe7\xbc\x5d\x67\xbc\xc4\xc8\xa2\x40\x86\x2c\x24\xa2\xc3\xe6\x14\xcb\xda\x0c\xec\xc7\x07\xfe\xe3\x03\xff\xad\x43\xa6\xb9\x0e\xd5\x42\x93\x62\xed\x2c\xf6\xa3\x37\x68\xb2\x2c\xc0\x66\x30\x29\xfd\x33\x9f\xe7\x73\x42\xe7\x88\xf2\x3a\x59\x33\x9d\xe0\xbc\x66\x71\x3b\x13\xb6\x66\xa2\xb6\x47\xce\x3f\x58\x8e\xf9\x33\xb5\x6c\xd5\xb2\x68\x35\xb3\x64\x35\xb0\x60\xed\x6d\xb9\x72\x46\xea\xfa\xfb\xf1\xc6\xd9\xcd\x2b\x3b\x12\xeb\x6e\x6f\xdd\x91\xee\x80\x43\x68\x87\x6f\x87\x2b\x22\xe7\x5c\x6b\x1f\x92\xe5\x77\x58\x9f\x70\x5d\xb2\x7e\xda\xb3\xc0\x8b\x8a\xfa\x0e\x75\x3c\x59\x16\x5e\x8b\x3e\x72\xd9\x7b\xae\x98\xc5\x67\xe0\xf3\x14\x11\x1a\x60\x4f\xfb\xc4\x29\x1b\x64\xd0\x9d\x8f\xee\x7c\xac\x7b\x69\x5b\xc9\x21\xb2\xb1\xec\x50\x09\xd5\xc7\x8b\x23\x66\x67\xa7\x32\x56\x56\x5e\x70\x7b\xc8\x9c\x05\xc0\x74\xe1\x62\x4a\x6e\x18\x58\x06\x46\x4c\x2b\x0b\x1a\x02\x6f\xd0\x8c\x15\x50\x16\x8e\x35\x3a\x4b\x08\xf8\x11\x20\x68\x74\x32\x29\x3f\x81\xf5\x0d\xe6\x20\xd9\x5e\xe9\x50\x9e\xf1\xa2\x0b\x9b\xa7\x09\xd5\xcc\x0b\x36\x07\xd4\x86\xe8\x00\xb8\x76\x0f\xa3\x03\xe0\x2a\x9e\xe9\x00\xb8\x3a\x00\xae\x9a\x83\xee\x00\xb8\x2a\x53\xdd\x01\x70\x75\x00\x5c\xfb\xae\xa5\x96\x09\xcb\xe8\x56\x28\xa5\xb2\x99\xaf\x78\x1e\x86\x56\xb8\x77\x83\x96\x1e\xc7\x4b\x71\xeb\xc4\x16\x73\xb6\x8a\x7e\xc1\xd6\xd2\x9a\x02\x78\x96\x96\xae\x5f\x90\x47\xb3\x24\x66\xcd\x34\xd2\x75\xd8\x18\x96\x43\xea\x0c\x9c\x3e\xff\xe5\x77\x5b\x9f\x81\xfc\xf4\xa7\x20\xbe\x1d\x9e\x37\x7f\xf8\x1d\xf2\x5f\xee\x5f\x7f\x7a\x14\x28\x2e\xec\x52\x03\x01\xe3\x12\x5e\x70\x80\x36\x6e\xa8\x30\x03\xd8\x96\x99\x1f\x18\xd6\x90\x5c\x1a\x42\x45\xe6\x8c\x0a\xe5\xcc\x5c\xe0\x89\x2a\x1e\x56\xd6\x65\x16\xe8\x55\xd6\xa4\x50\x9c\x0c\x46\xde\xc9\x91\xb5\x7d\xf5\xc9\x35\xd8\x52\x8b\x3b\x70\x92\xde\xc9\xcb\xcf\x2c\xca\x77\x61\x52\xd5\x45\x8b\x68\x54\x21\xf1\xfb\x82\xc9\xe3\xc8\x4a\x4c\xbe\xd8\xc1\x21\x9b\xdf\x3a\x33\x77\x6c\x59\x30\x1b\x2b\x42\x00\xc9\xef\x17\xbb\xc4\xb1\x02\xe4\x1d\xff\x9f\x33\x65\xcd\xc7\x5c\xe0\xc7\xb0\x69\xb7\x14\xd0\xba\x9b\x50\x23\xd9\x25\x09\x7e\xa6\x8d\xe9\xda\xa3\x58\xe3\x7a\xac\xf6\xf5\x32\x86\xa7\x92\xeb\xa5\x8b\x40\xa4\xb8\xfc\x39\xa7\x49\x39\x09\xc1\xde\xb2\x0f\xad\x50\xf5\x7b\x9e\xc4\x11\xcd\x6c\x94\x17\xa6\x69\x2a\x89\xab\x07\x90\x30\x90\x13\xe7\x4e\x7b\xb1\x46\x88\x89\x06\xf8\x27\x3c\xca\x13\x9a\xb9\xcc\xf1\x5a\x89\x02\x3b\x67\xb4\xd8\x34\x23\x16\x49\x11\x37\x51\x00\x6e\xab\xef\x56\x7d\xad\x29\xcb\xb8\xc4\xe8\x62\x07\xc3\x15\x6c\xd2\xe3\xb2\x4d\x5b\x4e\xdc\xa9\xf6\x47\xac\x64\xf9\x28\x41\xb9\xd8\xea\x6a\x27\x01\x79\xf4\xa7\x62\x48\xbe\x5d\x3a\x33\x4b\xdf\x96\x67\x13\x52\x63\x89\x36\xfb\x4d\xbb\x65\xed\x64\x17\x07\x6a\x22\x33\x48\x4e\x39\x8e\x25\x66\x64\x2c\x78\xa4\x4f\x86\xe4\xff\xb2\x4c\xc2\xc2\x0b\x36\xa5\x9a\x2f\x3c\x37\xf5\x8a\x6b\xc6\xa8\xf5\xe0\xbf\x20\xc7\xf0\x1a\xe1\xf3\x39\x8b\x39\xd5\x2c\x59\x9e\xa0\x1e\xcb\x88\x5a\x2a\xcd\xe6\x75\x96\xae\x8e\xd1\xc0\xc1\x8d\x71\xa1\x7f\xff\xcd\x96\x27\x9b\xe6\x50\x7d\x74\x59\x29\xc5\xcc\x60\x0c\x41\x65\x09\x3d\x0f\x92\x5b\xc4\xcd\x30\x06\xc1\x26\x36\x3b\xc9\x32\x5c\xe0\xbf\x99\x7d\x40\x49\xc6\x00\x81\xc0\xee\xdc\x03\xf7\x38\x46\x53\xbe\x95\xf9\x06\x28\xf4\x95\x81\xbf\xb1\x4a\xf8\xc7\xe0\xc5\x8d\x59\x8a\x8f\x22\x26\x04\x3d\x09\x4c\x94\x94\x80\x5d\x12\xd8\xb9\x21\x0f\xf8\x54\x11\x89\xb2\xb3\x93\xad\x66\x24\x42\x5f\x76\x44\xbd\xb7\x92\xb7\xe8\x3f\xd4\x60\x2f\x43\x80\xb8\x9d\x98\x4a\xde\x9e\xf6\x80\x34\xcc\x6e\x95\x60\x83\xc2\xb7\x58\xec\xa2\xd8\x0c\x35\x70\xa8\x62\x47\xaf\x8e\x5a\x21\xbe\x38\x9c\x4c\xa6\x74\x0a\xe7\xa9\xc1\xa8\xaa\xaf\x92\x98\x69\x96\xcd\x21\xe1\x7a\x26\xef\xf1\x77\x64\x5b\xa9\x7d\xca\x01\x3e\x9a\xd1\xce\xa4\x42\x1c\xac\x52\x12\x23\x9c\x5f\x70\x8c\xde\xd3\x25\xa1\x99\xcc\x45\x6c\xa5\x26\x4f\x40\xdf\x56\x3e\xfc\x4e\x0a\xa0\x14\xb9\x32\x73\x75\x5b\xa2\xd2\x63\xa6\xa9\x39\x36\x2f\x87\x2f\x5f\xb4\x32\x61\x0d\xf3\x56\xa1\x37\x15\x4b\xa1\xf3\x95\xbb\x33\xd3\x4a\xbf\x32\x46\xe3\xf7\x22\x69\x22\xcb\xbd\xc5\xed\x05\xaf\x0e\x40\x09\xe3\x13\xb0\xdd\xf6\xf1\xd6\x7d\xc6\x35\x0b\xc8\xe3\x31\xd4\x20\x32\xaa\x7b\x2e\xbc\x08\x7b\x52\x16\x41\xe0\x91\x3a\x03\xda\x1d\x0f\xa2\xf2\xf1\x81\xe7\xcc\x1e\x28\xd8\x72\xc5\x31\xf3\x1b\xee\x48\x6d\x39\x72\xe5\xe4\x4e\x72\x8c\x4f\x1a\x89\x4d\x4a\x7d\xd2\x4e\x90\x08\x0e\xd0\x68\xd6\x4d\x54\x12\x97\x37\x9c\xb6\x38\xda\x6f\xd9\x8c\x2e\x98\x22\x8a\xcf\x79\x42\x33\x04\xc7\x1b\x61\xff\xc8\x38\xd7\xeb\x33\xd0\x9b\x65\x37\x87\x3d\x09\x9a\xdb\x39\xd5\xae\x1f\x66\x9e\x80\x46\xb8\x7e\x99\xef\xcc\x73\x9d\xd3\x24\x59\x12\xf6\x39\x4a\x72\xc5\x17\x87\x9e\x26\x9b\xfd\xb0\x07\xab\xae\x72\xe9\x54\xc6\xa3\x94\x45\x8f\xc9\xa3\xcb\x1a\x86\x21\x55\xb1\x5b\x74\x07\xfb\xe8\x34\xf7\x25\x44\x3e\x01\x0a\xa5\x8b\xa9\x5c\x86\x71\x9e\x7e\x0c\x5f\x0a\xa0\x00\xbd\x57\x97\x09\x55\x9a\x47\xdf\x26\x32\xba\x1b\x69\x99\x35\xca\xd9\x3f\xfb\x61\xb4\xf2\x7e\x05\x86\xe1\xec\x87\x11\xb9\xe0\xea\x2e\x04\x76\x41\xa7\x69\x68\x2e\xa1\xe4\x2e\x1f\xb3\x84\xe9\xa3\x23\x85\x5c\x6e\x4e\xa3\x19\x17\xcc\x31\x38\xe1\x53\x52\xac\xc2\x67\x66\xb9\xa9\xcf\xd4\x26\x3e\x9d\xda\xfd\xfa\x6b\x7a\xaf\x18\x76\x7f\x6c\xba\x6f\x7e\x66\x75\x32\xd2\x5b\xf5\x53\x60\x67\xae\x2e\x5a\xf2\x41\x4c\xd4\x6d\x2d\x7c\xd9\xf2\x42\xbe\xe6\x09\x43\x1d\x07\x86\xe8\xa2\xd2\xec\x39\x80\x15\x5b\xca\x9c\xdc\x53\xd4\x8a\x81\x06\x0e\xc9\x2d\x4f\x5f\x91\x4b\xa1\xf2\x8c\x15\xf6\x8c\x49\xa5\x29\x40\xf0\xb4\x99\x65\x4e\x9d\x82\x15\x46\x95\x03\xd0\x5f\x51\xbb\x22\x97\x88\xce\xaa\x5e\x91\x1e\xfb\xac\xbf\xe9\xf5\x49\xef\xf3\x44\x99\xff\x09\x3d\x51\xbd\x21\xb9\x9a\x7b\x3f\x3b\x40\xff\x64\xcc\x85\x3e\xe1\x0b\x86\x19\x07\x7c\xf6\x41\x36\x88\x0d\xa3\x33\xd2\x5a\x2c\xc9\x3d\x22\x50\x18\x12\xcf\xb2\x4c\x66\x3e\xf2\x3c\x98\x06\xe0\x2e\x91\x9c\xa7\x99\x9c\xf3\xc0\xb0\x07\x1b\xbc\xd5\xf8\x3a\x30\x37\xec\x16\x49\x57\xd7\x1f\x31\xdd\xec\xcb\xa4\xcc\x1c\x37\xad\xfe\xd5\xc4\x45\x4c\xf4\x6d\xcd\x2e\x60\x49\x16\x42\x17\x03\x30\xc6\x4b\xd7\x8a\xa1\x56\xe1\x0a\xbf\xf6\x59\x73\xe4\x34\x66\x8b\x53\x15\xd3\x97\x7d\xf8\x8c\xb2\xd1\x7e\xba\xd4\x27\xaa\x48\xef\x65\x6f\x48\x46\x8e\xdb\xf6\xc3\x3e\x16\xcf\x4d\x64\xe6\x1b\x04\x63\xfa\x8b\x1e\x39\x96\x19\xb4\x1c\x51\x41\x12\x46\x17\xd6\x80\x8c\x67\x6a\x89\x3a\xed\x49\xed\xac\xc7\xba\x09\x60\x81\x96\xff\xbb\xaf\x77\x3c\x5d\x4f\x12\x5d\x5d\x37\x17\x19\xd9\x33\x22\x68\x0f\x84\x49\x69\x68\xac\xa1\x9a\x86\xad\x02\xac\x96\x6d\xbb\x18\x30\x17\x2b\x9a\x32\x36\xb0\x75\x51\x7b\x20\xa7\xf6\x9e\x80\xea\x92\x86\xf9\xf5\x8e\xa4\x36\x9d\xcd\x0f\x82\xff\x9c\x33\x52\x20\x7a\xa6\x2c\x43\x6c\x51\x4d\xe2\x12\x0f\xe3\xc8\xd8\x8e\xcf\xe6\xf4\xef\x52\x90\xcb\x6f\x47\xf6\xa3\x27\x4f\x3a\x3d\x3b\x89\x04\xfd\x7b\x9e\x31\xc3\x8e\x9b\x04\x0c\xb8\x77\xaa\x9c\xdd\xdc\x27\x17\x54\x53\x64\xf0\x36\xe4\x4a\x14\x14\xde\xec\xc2\x31\x17\xb1\xfd\x29\xe0\xdc\x8f\xcd\x64\xcd\xea\xbd\xdb\x26\x2f\x85\x0f\x7e\xb8\xb9\x6a\x89\x19\x47\x40\xe3\xa7\x6f\x65\xdc\x98\x23\xff\xc5\x4c\xe0\x39\xbe\x4f\xe6\xa6\x01\x62\x74\xf6\x3e\x1c\x67\x62\xce\xb3\xfd\xe7\x0f\x46\xe3\xac\x4d\xbc\x6a\xb1\x11\x37\x5b\x0d\xfb\x7c\x1b\xe8\xe9\x40\x3b\xcc\xd6\x80\x73\x63\x19\xca\x38\x91\x63\x87\x3f\xdb\x76\x7f\x3f\xdc\x5c\xed\xd1\xdd\x0f\x37\x57\x8f\xdb\xd5\xbd\xc4\xb3\xaa\x74\x56\xf0\xe0\x22\x1d\xa3\x2a\x76\xd5\x97\xb9\x86\x6d\x49\x5b\x6d\xce\xd3\x6e\x3c\xf6\x95\x59\x3a\xba\xfc\x9c\x62\xf0\x99\x35\xf2\x8f\x66\x14\xf2\x98\x7d\x76\x1d\x2c\xaa\x59\x65\x65\x28\xbb\x5b\x5e\xa3\xd1\x01\x7d\x22\x17\x0c\x5d\x96\xf1\x2b\x17\x08\xe0\xdf\x58\xff\xc2\x5b\x08\xbb\x8c\x5f\x21\x5d\x25\x18\x85\x19\x07\xbb\xe9\x18\x4d\x44\xc2\xff\x64\x0b\xe8\xf0\x84\xeb\xa5\xe1\xd0\x27\xc3\x52\x68\xa9\x82\x2e\xb7\x7a\x98\xf7\x14\x2d\x56\x0c\x54\xe4\xd8\xb4\x74\x0a\x06\xae\x93\x61\x21\x55\x40\x59\x03\xf0\xa7\xa0\xe8\x51\x12\x39\x14\xd3\xb0\xdb\x2a\x12\x47\xdd\xad\xb2\x9b\xdd\xc3\xc4\x9b\xf3\xd1\x94\xa1\x99\x77\xd6\x32\x34\xf8\x61\x64\x31\xe1\x9e\x33\x4f\xc3\x7c\xa9\x5a\x5c\x0d\xb6\xd5\xce\x27\xeb\xf3\xb5\x5f\xf6\x9e\x22\x3e\x19\x6d\x0f\x26\x18\xd6\xf3\x70\xf9\xf5\xa5\x30\x4a\xdc\x65\x23\x4b\x4a\x2c\x5c\x12\xf2\x4d\xb3\xb7\xbe\xaf\x01\x15\xd0\x04\x60\xc1\xad\x7c\xd3\x94\xab\x19\x84\x55\xec\xde\x5c\xf5\xab\xa7\xb1\x74\xb6\xb9\xec\xde\x9a\x2e\x9c\xb3\x74\xf6\x7a\x54\x36\xcf\x99\x7b\xe4\xf5\x68\xcd\xb9\x84\x49\x86\xd1\x2a\x34\xda\x1d\x29\x92\xf0\x09\xdb\x59\xcd\xe9\x01\x4e\xe6\x5c\x0a\xee\x4b\xde\x6f\xba\xea\x9f\x36\xd7\x5c\x53\x7e\x58\x20\x79\xbc\xb5\x2d\x60\x00\x5c\x24\x93\x84\x45\x0e\xc7\x1a\xa6\xd4\x7d\x62\x9d\xf2\x62\x6b\xe6\x14\x28\xff\xa8\xa8\x9c\xe2\x82\x9e\xde\x5c\x9e\x5d\xbc\xbd\x1c\xce\xe3\x5f\xcf\xe4\xfd\x40\xcb\x41\xae\xd8\x80\xd7\x80\x0a\x79\xba\x30\x42\xbc\xd2\x5a\xc8\x55\xe5\x29\x7d\xef\x12\x18\xc9\x07\x85\x61\x03\x60\xca\x71\x4e\x21\x29\x75\x9f\x64\xd4\x26\x29\x52\x57\xa6\x26\x49\x70\x96\x75\xc6\x58\x3f\x54\xa9\x77\x54\xfd\x68\x38\xa0\x7d\x8d\x08\xc5\xa0\x1e\x96\x40\x3f\xfe\xe6\x6a\x42\xeb\x77\x0b\x11\xdb\x66\x6e\xe4\xdb\x70\xf1\x17\xe0\x6a\xd2\x12\xe2\xb3\x20\xde\x76\x22\x33\xb3\x6b\xb2\xf2\x0e\x60\x3a\x82\xc1\x9e\xe6\x8a\x65\x43\xcb\x31\x1e\x7d\xa2\x1a\x80\xf5\xec\x81\x91\x56\x9d\xa6\x1b\x36\x21\xa5\x5a\x32\x56\x8a\xa2\xb9\x9e\x31\xa1\x1d\xe4\xb8\x9d\x8c\xb5\xf3\x66\x23\x9c\x1f\x7d\xa2\x6a\xc2\x03\x35\x03\xf3\xe9\x00\x70\x9a\x6c\x43\x73\x50\x0e\xa2\xdb\x3e\x3b\x2a\xa3\xb1\x84\x10\x08\xc4\x74\x2b\x6d\x30\x1a\xcf\xb9\x78\x86\x07\x31\xe2\x22\xde\x35\xfe\x0a\x70\x1d\xbc\x51\x96\xa3\xb0\x15\x67\x3d\xf7\x9e\x38\xea\xf4\x1a\x4c\x21\xb7\x3e\xb9\xb2\x47\xae\xd6\xa1\x9b\x2f\xd5\xcf\xc9\x00\xbf\x32\x48\xe3\x62\x56\x3a\xf7\x5a\xfb\x06\x9c\x47\x70\x9a\xb5\xb4\xbe\xe4\xdf\x4f\xa0\x39\x78\xa6\x9a\xc8\x30\x07\xf1\x66\xa8\x9a\xa2\x5c\xd2\x16\x22\x82\x61\xf9\x15\xab\xbb\x9a\x29\x48\x69\x46\xe7\x4c\xb3\x0c\x43\xc7\x6c\x30\x9a\xb0\x51\xfd\xef\x53\x26\x46\x9a\x46\x77\x6d\x43\x88\x76\xfc\xf4\xe1\xf8\xe9\xbe\xde\x32\x17\x24\x13\xfb\x9d\x60\x01\x85\x96\xa1\x67\x96\x0b\xcb\x6c\x9e\x09\x5d\xf1\x38\x5e\x4d\x2c\x11\x1e\xc7\xa9\xcc\x44\x0b\x5c\x2f\x34\x3e\x40\x88\x98\x07\xa6\x83\xd0\x77\x9c\x85\x76\x98\x5e\xfd\x43\x60\xe5\x98\x7d\xfc\x4e\x05\x3d\x98\xcb\x98\x91\x31\xd7\xc5\x49\x57\x4c\x93\x94\x65\x73\x6e\x13\xa0\xa5\xc0\x1a\x7c\x2c\x46\xee\x65\x38\x95\xfd\x74\xc0\xd9\x04\x91\x91\x76\x45\xae\xc8\x98\xe9\x7b\xc6\x04\x79\xf1\xe2\xc5\x0b\x90\x37\x5e\xfc\xe1\x0f\x7f\x20\x80\xb8\x10\xb3\x88\xcf\x57\x1f\x84\xa7\xfe\xe3\xe5\xcb\x21\xf9\x3f\x67\x6f\xdf\x40\xfc\x55\xaa\x15\x19\x4b\x3d\xb3\x2d\x9b\x07\x4a\x2f\xab\x3e\x94\x0e\x76\x62\x82\xaa\xfc\x0a\x2a\x85\x1f\x5e\x39\x98\xee\xc5\xef\xbf\xf9\x66\x48\x2e\x78\x06\x99\xb7\x1c\x72\x05\x7c\xb8\x60\xea\x42\xe8\x84\xd4\xab\xb9\xee\x96\x4d\xd8\x70\xda\x39\x9f\xce\x34\x56\x4b\x82\x9d\x92\xf0\x48\x23\xfa\x1e\x1e\x76\xc4\x42\x52\x36\x95\xc4\x26\x46\xd9\xc0\x11\xe8\x5c\x1f\x2a\x0a\x93\x89\xfa\x2e\x93\x79\x5a\x24\x04\x66\x4c\x19\x19\xd5\xd6\x62\xc2\xc6\x8a\xb5\x52\x4c\x3f\x69\x24\x43\x4d\x4b\x4d\x69\xd3\x5d\x95\x04\x90\xbe\xc7\x1f\x1b\xe0\x4e\x48\x29\xf7\xc1\x75\xe0\x6e\x2e\xa1\xdf\x7b\x2d\x32\x0e\xce\xa9\xcb\xef\x48\x33\xf9\x37\x5c\x24\x2e\x5c\xa6\x90\x95\x79\x95\x95\xb9\x6c\x62\xa6\x2b\xa0\x1c\x66\xae\x1b\xbe\x67\xb3\xe2\x83\x1c\xa3\xab\x49\x98\x8c\x06\xa9\xdb\x5c\x99\x4f\x94\xc0\x21\xd7\x7c\x39\x2c\x4f\xa8\x67\x0a\x57\x34\x17\x2b\x6f\xdb\x5a\x23\x96\xd2\xd8\x0a\x34\x36\xcd\xab\x68\x03\xc3\x55\x6d\x92\x4c\x50\xd7\xa8\x04\xd8\x56\x0a\x92\x51\x4c\xe7\x76\x6a\x20\x56\xc9\x7c\x9b\x29\x65\x73\x6d\xe6\x34\xbb\x33\x62\xbf\x3d\xff\x43\x88\x0c\x56\x3e\xcf\x07\x93\xae\x16\xcc\x17\xa9\x0b\x23\xeb\xcd\x47\x8e\x86\xc3\x23\x3c\x20\x32\x43\xbc\x4b\xdc\xed\xe6\xfe\x13\xe5\x14\x97\x23\xb7\x69\x1a\x94\xa0\xb3\xa5\x3d\x68\x29\x22\x98\xda\x99\xaa\x5f\x5b\xbd\xa6\xf8\xd2\x0c\x2f\xb8\x2e\x62\x30\x3e\x99\xd6\x29\x5b\xd0\x54\x82\x6a\x00\x30\xbc\xb9\x6e\x8a\x3d\x02\xf5\x30\x83\x1b\x63\xe0\x12\x8c\x8a\xd8\xa7\x8f\x4d\x99\x9c\x4d\x62\x2b\x55\xcc\x7a\xfe\x5c\xed\x6a\x82\xe9\x1f\x65\x5a\x65\x69\x41\x20\x21\x14\xd5\xa9\x8a\x5c\x90\x67\xcd\xbc\xc2\xed\xd2\x0c\x8d\xbd\x09\x23\xc3\xab\x9e\x93\x00\xaf\x95\x73\xe0\x69\x66\x5a\xaa\x76\x91\xa0\x01\x00\xe4\x46\x77\x58\x86\xe4\xad\xa5\xa9\xb8\xb9\xe8\x58\xc9\x24\xd7\xf8\x6a\xf1\x63\x48\x70\xa1\x51\x07\x39\x00\x54\xd6\x3f\x16\x90\x5f\x5d\xd4\xfb\xaa\x47\x89\xf1\x6a\x70\x18\x3b\xe8\xcb\x27\x83\x95\x2d\x10\xbb\xd5\x83\x41\xcc\x46\x8a\x37\x51\x95\x46\x57\xe4\xb8\x28\x95\xe1\xdc\xdc\x57\x42\xb3\x6c\x42\x23\x76\x12\xaa\x50\xbe\x24\x89\x8f\xac\x71\xb9\x01\x33\x2a\xe2\x04\x45\xeb\x88\x65\xb0\xe5\xd9\x67\x5b\x2c\xd7\x7c\x22\xce\x38\x14\x81\x3d\xfe\x96\x19\x79\x90\x51\x9d\x67\xac\x56\x86\x51\xbb\x61\x85\xd0\x8d\xb6\x94\x36\x68\xac\x69\x48\x05\xbc\xe4\x24\x54\x11\x1c\xab\x62\x9a\x70\x56\x71\x4a\x55\xa8\x96\x0e\xcd\x56\x02\x7a\x0c\xa4\x62\x29\xf3\xcc\xda\xbd\x1d\xb6\x68\x24\x33\xa3\x08\x61\xc3\x54\x91\x8c\x4d\x8d\xb4\x9a\x81\x58\x8b\x4f\x24\xb9\xb9\xd1\x6a\xf0\x57\xcb\x41\x72\xdb\x42\xdc\x26\x56\x7c\x96\x0b\x1e\x3b\x16\x09\xbe\xa5\xa2\xc4\x5f\x4a\x55\x90\x77\x12\xc0\xb1\x07\x33\x8c\xc2\x38\x30\x52\x9f\xd1\x59\x8a\x9f\x0e\xad\xbb\x12\x80\x1e\x6a\xd4\x52\x68\x42\x84\x65\xcc\xae\xf3\x71\xc2\xd5\x6c\xb4\xa7\x29\xf0\xdd\x9a\x26\x30\x60\x60\xc5\x51\xb7\xd1\x3c\xa8\x98\x50\x1c\x58\x9e\x21\xe3\x86\xd9\x42\xed\x60\x09\x93\xe8\xde\x0e\x77\xa6\x84\xc4\x88\x84\xd9\x74\x7e\xf3\x53\xd0\x0f\x9b\xa1\x85\x00\x1e\x31\xfb\x20\xd2\xd2\xfd\x88\x26\x89\xaa\x66\xaf\x3a\x42\x8b\x32\x87\xcb\xda\xc2\x35\xe5\x66\xb9\x7d\x99\x90\x0a\x14\xe4\xc6\x81\x29\x32\x97\x98\xe1\x22\x88\x14\xee\x21\xc0\x21\x71\x2f\x04\x59\x7d\x90\xbb\x0b\x5b\xa6\xe5\x3a\x8a\x9d\x0d\xf4\xe1\x6c\xa0\x7b\x7a\x1a\x8a\x4a\x4a\x34\xc8\x08\x2e\x97\x7a\x76\xa4\xd4\x91\xdc\x1d\x2e\x89\x56\xbd\x02\xf8\xcd\x33\x8d\xe5\xc9\x1b\x63\x9e\x7d\xac\xbc\x0e\x6c\xda\xe8\x1d\x70\x78\x07\x56\xb3\x88\x82\x9d\x69\x15\x02\x7f\x04\x56\x8f\x7c\xc1\x73\x80\xdd\xe0\xcd\x23\x45\x62\x19\xe5\x1e\x1b\x15\x26\xad\x70\x80\xd5\x41\x10\x24\x4d\x8f\x53\x73\x58\xab\xf0\x23\x3b\x77\x55\x2c\xef\xc5\x3d\xcd\xe2\xb3\xeb\x1d\x71\xe9\x65\x76\x5e\xbc\x15\x0a\x4a\xae\x31\xa8\x84\x47\xc7\x32\xd7\x05\x7c\xe6\x2f\xdb\xf4\xac\xa5\xa1\x08\x35\x2d\xcd\xa4\x33\x5e\x77\xc6\xeb\xea\xf5\xe0\xc6\x6b\xf3\x4e\x19\x0b\xb6\x74\x5c\x1d\xc4\x00\x4f\xea\x86\xd2\x3e\xa4\x15\x34\x20\x30\x48\xdd\xab\x71\xf0\x15\xb9\x0d\x8f\x48\xb1\xb6\x81\xac\xe7\x28\x10\xb0\xea\xa7\xb7\x98\x3e\x90\x1d\xb4\x7e\xad\x5e\xbc\x36\x85\xe0\x6e\xab\xdd\x0b\x52\x43\x50\x6c\xb7\x6f\x91\x90\xfb\x56\xef\x12\x71\x51\xc6\x0e\x81\x98\x1b\x94\xea\xc4\xab\xe1\xe4\x93\xc6\x0b\x40\x1a\x16\xd2\xc5\xab\xe9\x6a\x90\x3d\x8a\xea\xe2\xf5\xc4\xa5\x75\xf1\x6a\x6c\xe2\x26\xcd\xcb\xec\xae\x19\xee\xc3\x16\xdb\xdd\x73\x68\x8f\x6f\xbd\xef\x17\x25\xde\x9e\x3f\x5b\xef\xac\xf7\x2b\xd7\x23\x5a\xef\x03\xc2\xed\x88\x81\x9d\x80\xd0\xa2\x1f\x9a\xdb\x9c\x59\x7f\xcc\x9c\x58\x39\x2c\x10\xc8\xcc\x96\x73\x06\x7d\x99\x95\xdd\xa6\x47\xc3\xe1\xd1\x91\x33\xf3\xdb\xfd\x99\xeb\xc9\xe0\x8f\x84\x89\x48\xc6\xb8\xa8\xa6\xfd\x4c\x69\x60\xfa\x85\x76\x1e\xf6\x65\xee\xbe\x15\xba\x5e\xa1\xed\x66\x4b\xd2\xe0\x04\x37\x2f\x9d\xbd\x6e\xa6\x1f\xa3\x80\x76\x58\x26\xbb\x5c\x15\x1b\x9f\x38\xa4\x14\x76\x38\x79\x0f\xce\x5f\x6b\x17\xc7\xc6\x6b\x1f\xf6\xba\x47\xa1\x6c\xbc\x1e\xb9\x5c\x36\x5e\x7b\x71\xd4\x46\xa5\xb3\xd7\x0c\xee\xf1\x0a\x68\xe3\xf5\x4c\x8b\xa9\x94\xaf\x46\xc5\xb4\xf1\xda\xaf\xa4\x76\xf9\xdd\x86\x4b\xdf\x4a\x79\x6d\xbc\x9a\x15\xd9\xc6\xab\xed\x52\xdb\x78\xd5\x9c\x09\xb0\x81\x5f\xf0\x46\xc9\x03\x97\xf6\x9d\x72\xe4\xa3\x66\xf3\x54\x66\x34\x5b\x92\xd8\xda\x1a\x96\x6b\x12\x30\x83\x0c\xcc\x83\x51\x51\xa0\xef\x31\xcf\x5a\xca\x1f\x68\x90\x7c\xc9\x62\x9e\x6f\x2c\x59\xbc\x69\xda\x7e\x00\x34\x2c\x8b\xa4\xe5\x9c\x9b\xd8\x94\x87\x12\xa4\xd1\x9d\xad\x91\xe3\xe6\x10\x39\x7d\x08\xb9\xd3\xab\x20\x1f\x83\x31\x0c\x3c\x7d\xb6\x16\xa0\x7b\x18\xdb\x2e\x19\xae\xd0\xe5\x61\x7d\xff\xc7\xf6\xc1\x13\x23\x7f\xbc\x05\xa6\xf7\x48\x6b\x42\x1a\x26\x99\xf1\xbf\x33\x28\xb0\xd5\x18\xc2\x4a\x82\xd8\xed\x0b\x7f\x25\x32\x0a\x1c\xcb\x25\xf6\x03\xb3\xee\x77\xb6\x33\xcc\x9b\xb9\x37\x5f\x47\xe1\x01\x2c\x3a\x89\x42\x5f\x1d\x8f\x00\xbb\x11\x44\x74\x98\x3b\x3f\xdf\xb7\x41\x19\xbc\x5c\x99\x2f\x01\xb4\x7a\xf0\x4c\xf1\xa1\x7b\x07\x21\xa9\x83\x4a\x65\x65\xc5\xc2\xfc\x32\x72\x33\x10\x28\x65\x90\x9e\xe0\xa4\x70\x95\x83\x0c\x68\xbf\x62\x65\x21\x39\x01\x7f\x54\x51\xf7\xcb\xa3\x17\xae\xec\x2a\xc1\x93\xf2\xb6\x72\xd0\x6d\x7e\xe0\xb9\xb0\x51\x04\x2b\x7b\x64\xfd\x16\xc9\x15\xcb\x06\xd3\x9c\xc7\xfb\x6c\x8e\x67\xcc\xdd\x6a\xf3\xb4\xe6\x9c\xac\x21\xff\x3a\x80\x6b\xf9\x28\x8b\x06\x74\xbf\x77\xe9\x43\x33\x4a\x84\x3f\x84\x84\x2b\x87\x69\x50\x17\x09\xe0\x8f\x9c\xf3\xf7\xdc\x7a\xbd\xd5\x32\x84\x68\x19\xd9\x34\x59\x5e\xc2\x73\xc4\x66\x71\xe7\x41\x54\xea\xc0\xfc\xc7\xe9\xb7\xce\x58\x3f\x66\x13\x59\x94\x00\x41\x75\xc7\xc6\xd2\xc6\x2c\x61\x50\x27\xdd\xd5\x60\x37\x0f\x80\x9b\x77\x2e\x17\x66\x33\x7f\x12\xe4\x83\x03\xa5\xe7\x93\x57\x84\x9e\x94\x52\x15\x6c\x59\x15\xc1\x58\x8c\x01\xb6\x49\xf1\x9d\x2c\x17\xaa\x4f\xc6\x27\x2e\xd8\x04\x4e\x9c\x30\x32\x5f\xe2\xc4\x59\x54\x9a\x33\x66\x26\x00\x12\x7e\x33\x39\x27\x4a\xd0\x54\xcd\x24\x54\xd7\x8f\x68\x4a\x23\xae\x97\x44\x67\x34\xba\x83\x1a\x3c\x19\xb3\x9f\xeb\x93\xe8\xc4\x06\x6b\x85\xd3\x57\x8e\xf9\xd5\xb3\x4c\xe6\xd3\x19\x84\xb1\xe2\x53\x51\x42\x95\x1b\xfd\xda\xf7\xad\x2a\xa3\x48\xbc\x14\x74\xce\x23\x8f\x98\x97\xc9\x05\x57\x5c\x5a\x53\xae\x6b\xf7\xda\x23\x9e\xa1\x79\xf8\x3c\xa1\x7c\x4e\x8e\x15\x63\xc4\x6f\x09\xfc\xc5\xd6\x69\x47\xb3\x45\x56\x76\xf8\x4b\x8f\xd9\x2d\x2c\xd0\x40\x41\xe0\xbc\x67\x0a\xf9\xa3\xe9\xf9\xda\x8f\x9e\xf8\xe5\x5a\xdf\x27\x99\x81\x33\xde\x21\x55\x32\x11\xcb\xc0\x25\x79\x76\x7d\xa5\x42\x55\x03\xf7\x96\xc5\x73\x83\x1f\x12\x29\xa6\x61\x9a\x7e\xb1\x33\x0d\x29\x15\x50\xbf\x64\xc1\xe3\x9c\x26\x48\x44\x6d\x67\xce\x47\x57\xf8\x3a\x9f\xce\xf4\xe0\x9e\x81\xa9\x05\x79\x4d\x11\xce\xe4\x3e\xca\x57\x42\x71\xb8\x02\xa2\xab\xad\xa9\x00\xcd\x56\xa6\x6b\xf7\x74\x09\x98\x2e\x36\x6c\xa4\xe4\x0d\x75\x78\x5a\xd8\xc4\xba\x19\x87\xee\x9d\xf9\x7a\x14\x46\x4a\x00\x5b\x94\x99\x62\xd8\xa9\xab\x7d\x33\x13\x1f\xe0\xdb\xf9\xdb\xb6\xf4\x18\x35\x0b\x64\x24\xb7\xed\x8a\xca\x03\x48\x5c\x8b\x62\x91\x6f\x6d\x6d\xc0\x86\xb2\x40\xef\x87\xc0\x26\x16\x78\x31\xcc\xb1\xa1\x22\x1e\xd0\xc4\xec\x9c\xeb\x8f\xe7\x36\x4a\x19\x0f\x42\xc9\x4b\xef\xca\xfc\x70\xe1\x71\xa1\x8d\xcc\xb0\xf6\x08\x40\x3a\xfa\x98\xc5\x40\x34\xc2\x8a\x88\xf7\x46\xfd\xb5\x8b\x77\xfd\xf1\xbc\x4f\xf8\x90\x0d\xdd\x5f\xfe\x51\x47\xb5\xb4\x9c\x62\x8c\x9f\x8f\xdb\x84\x7d\x07\x5d\x09\x2d\x4d\xe1\xbb\x7f\xfd\x2f\xd3\x49\xf3\xeb\x9f\x06\xff\x15\x20\x6d\xfe\xe9\xaf\x86\x08\x66\xe6\x81\xf2\xdd\x30\x50\xcc\xc3\xca\xff\xf5\xda\xc2\x2e\x5b\x50\xe6\xbf\xda\x6a\x53\x4c\x68\x23\x26\x5e\x4b\x70\xc1\xf3\x18\x77\x23\x7c\x3b\x63\x7f\x73\x56\x43\x98\x26\x6f\xb1\x89\xa8\x66\x02\x08\xb5\xcb\xa8\x10\x52\xe3\xeb\xb6\xb0\xaa\xe9\xff\x31\xe8\xfb\x98\xfc\xd5\x27\x5a\x4a\x38\x8e\x78\xe4\xcf\x04\x61\xae\x18\x25\x8e\x15\xa6\x83\xda\x28\x34\xc7\x7b\x4c\xb3\x66\x86\x7d\x7e\xac\xe9\x07\xf4\xed\x2b\x21\xf5\x57\x7e\xf9\x2b\x65\xb2\xe9\x42\x72\x87\xb0\x6d\x4e\x8a\xc0\x92\x85\x1e\xf3\x79\xbc\x24\x73\xae\x34\xbd\x63\x43\x32\x32\xbc\x25\x74\x75\xe1\xec\x09\x02\xc8\x8c\x2c\x26\xb9\xd0\x3c\x81\x5f\x8b\x76\x4c\x97\x43\x9e\x73\x35\x21\x2a\x87\xfa\xdd\x69\xc6\x06\x8e\x8b\xd9\xa7\x56\x68\x41\x31\x96\xbe\x5f\xec\x19\x45\xd1\x3f\x8d\xe1\x55\x98\x0f\x2a\xec\xf6\x5a\x89\xcd\x32\xfd\x94\x22\x2a\x38\x17\x4c\xa6\x1a\x92\x77\xc0\xac\x12\xe7\xef\x45\x2d\xc4\x5a\x27\x05\x8b\x98\x52\x34\x5b\xf6\x01\xb9\x9c\x7b\xb4\x6b\x1b\x8e\x03\x1c\x75\x4e\x05\xe2\x86\x67\x2c\x92\x42\xe9\x2c\x8f\x34\x16\x92\x1b\x67\xf2\x8e\x09\x1f\x0b\x68\x56\xb1\x1c\x94\x55\x04\xc7\x80\x33\x4b\x92\x68\x46\xc5\x34\x28\xc4\x32\xa7\x31\xcc\xfd\xf7\x5e\xca\x71\xe3\x31\x33\x40\x27\x46\xb0\xe0\x1a\xa6\x62\x6c\xf8\x88\xb7\xb1\x7e\x12\xc4\xa9\xd1\xfd\xc2\x08\x6a\x86\xc4\x93\x1d\xb4\xab\x11\xfd\x22\x0d\x2d\x76\x03\x60\xdb\x2d\x07\x75\xcd\x99\xa6\x31\xd5\x74\x8f\xc0\xae\xb7\x45\xf5\x38\x57\x40\x1e\x2b\x78\x7a\xaf\xa3\xe5\x43\x4e\xdc\x92\x29\x0f\x93\x97\xe0\x24\xce\xdc\xcc\x43\x36\xb4\x36\x7b\xca\x7a\x01\x30\x5e\x0b\xe4\x19\x57\x9e\xcb\x34\xef\x5a\x43\x72\x51\xd4\x1e\x2c\xc8\x49\x3d\x1f\x53\x43\xf3\xaa\x99\xfa\x3d\xe6\xe8\xb6\x70\x84\x45\xe5\xe0\xad\xb5\x22\x08\x72\x09\x26\x34\xcf\x58\x98\x2b\x66\xa7\x2e\x17\xb8\xc9\x2b\x93\x08\xb3\x3c\x65\x5a\x15\xe1\x27\x48\x87\x0d\x71\xb1\xfc\xce\x2a\xa3\x40\xa4\xed\xc4\x5a\x7d\x6e\xbd\x2c\x84\xd3\xae\xa4\xa5\xb3\x86\xf2\x3f\xc8\xbc\xee\x63\x51\x46\xbc\xfc\xb7\x32\x6e\x62\x84\xae\xc0\xcc\x17\x4d\x14\x31\x99\x18\x5d\xab\x40\xa9\xc7\x6f\x80\x2b\x4a\x95\x32\xde\x90\xc8\xcd\xe8\x62\x7f\x0b\x54\x21\x23\x0d\x3c\x44\x2f\x7c\x6e\x00\x9f\x1b\xbc\xac\x6f\xa9\x6b\x12\xde\xe1\xae\xda\x61\x1e\xe5\x8f\x34\x32\x8b\x1a\x92\x32\x6a\x68\xcb\xac\xe2\x87\x7b\x6a\x6f\x9d\x83\xde\x21\x6b\x13\x18\x18\x37\x74\xe2\x15\xf9\xaa\xc4\xdf\xad\x1c\xe5\x75\x24\x8c\xbb\x3d\x76\x4a\xd3\xd0\x2e\x82\x4b\x0f\x2f\x3f\x7e\x52\x69\x0c\x04\x8b\xf5\xba\x84\x8b\xef\xf5\xc2\x9e\x11\xcc\x32\xb0\x92\xb9\xb4\x02\xb3\xb1\x32\x99\x24\x2c\x83\x21\x58\xbd\xa9\xe2\x1c\x07\x64\x4f\x34\xd5\xf6\xbd\x72\xea\xa5\x4b\xc1\xee\xbd\x18\x41\x15\x62\xa8\x38\x47\x16\xb3\x35\xe1\x36\xb6\xe7\x63\x90\xcf\xc4\x12\xbb\x7e\xe1\x97\xc5\x29\x9d\x64\x6a\x3e\x64\xe4\x4d\x41\xc7\x09\x3a\x85\xfd\xc4\x43\x5f\x68\x72\x4f\x97\x0a\x76\x7c\x21\xc7\xfb\xef\x5b\xbc\xb2\xa2\xe1\x1b\x36\xc1\xb7\x6b\x3b\xba\xf6\x72\x75\xed\xe3\xec\x82\x2c\x48\x2e\xea\x44\x16\x15\x2f\x6c\xad\x89\x51\xbd\xf6\xf1\x8e\x41\xf8\x09\x78\xc5\x9b\xb9\x3a\xca\x00\xa4\xd7\x57\xd0\x84\x93\xc6\xa7\xf0\x87\xe3\x35\xde\x17\x30\x66\x66\x57\x17\xf9\xcd\xb0\x43\xc2\x77\xd7\x04\x08\x14\x5b\xeb\x7b\x00\x29\xb5\xe6\x60\x5f\x44\x2b\x63\x10\xe0\x01\x5f\x1c\x02\x08\x3f\x15\x4b\xcb\xc3\xf5\x8c\x67\xf1\x20\xa5\x99\x5e\xa2\xe2\xd8\x2f\x7d\xcd\x07\xcb\x37\x1a\xf8\x9e\x5e\x9a\x7a\xf8\xbf\x1b\x67\x18\x06\xef\x0a\xe1\x59\x33\xfc\xc6\x79\x7d\x8c\xf1\xd4\x0f\xc7\x5f\x3b\x9e\x77\x41\x76\xba\xd3\x05\x9f\x6c\x3c\x71\x48\x3e\xf6\xe5\x18\x15\x1f\x2a\x12\xfe\xb0\x0e\x93\x0c\xc3\x99\x3d\x47\x07\xe5\xc7\x74\xa0\x6f\x74\x4e\x5a\x14\xce\x0e\x8c\x78\x56\x2a\x70\xc1\x30\xb6\x6c\x8f\x58\x5a\x33\x4d\xf8\xad\xb0\x01\x7f\x2e\xc8\xb1\x90\x02\xcf\x0a\x3e\x7b\x82\xb1\x40\x1b\xec\x50\xf0\x88\xad\xb7\x56\x2e\x77\x19\x9c\x4d\xc7\x16\xb8\x88\xcd\x62\x01\xad\x06\x7d\x48\xe5\x51\xc4\x98\xd7\xa0\xc3\xea\x2b\xc5\x59\xb6\x5d\x76\x75\x1b\x95\x04\x60\x15\xa5\x69\x92\x14\x9a\xab\x9d\x2e\x09\x9c\xcd\x59\xfb\x02\x86\x57\x4a\x94\xb1\x4a\x3c\x54\x04\xb7\x28\x95\x22\x42\x5f\x3c\xd7\x4b\xd7\x83\x90\x03\xc1\x6b\xa0\x32\x28\x54\x68\xf9\x04\x6d\x4c\x81\xe8\xef\x27\x13\x88\x91\xad\x47\x5e\xe6\x45\x16\x44\xc1\x50\x9e\x31\x8d\xee\xee\x69\x16\x43\x5d\xda\x94\x6a\x8e\xb0\xd8\xfd\x52\xb3\xc7\x41\x1f\xa0\x2a\x7c\xb8\xf9\x4e\xbc\x82\x01\xc5\x2e\x64\xe5\x33\x84\xe6\x5a\xce\xa9\xe6\x11\xa8\xad\x7c\x12\x58\x0c\xe7\x1e\x45\xb0\x52\x43\x0f\xe8\xaa\xaf\xc6\x7e\x8b\x9e\x97\x8c\x11\x7d\x2f\x09\x9f\x1b\x99\x80\x42\x39\x88\x89\xcf\xf8\x71\xb6\xcd\x6d\x3d\x35\x82\xcf\x0f\x60\x50\x0e\x9e\x42\x85\xd8\xa8\x4b\x0a\x9a\xf7\xd6\x4b\x6f\xb6\xb3\x29\x33\xfd\x0a\xcb\xb6\xef\x98\x3d\x6d\xfa\x1a\x6c\xd5\xbe\x59\x9e\x7b\x66\x24\x01\xb5\x75\xc3\xaa\xe1\xba\x1e\x61\x81\x56\x45\x62\xae\x2a\x55\x96\x8f\xe3\x4c\xa6\xa9\x35\x86\xcc\x4f\xaa\x3d\x02\x1f\x41\xb6\x60\x2a\x28\x24\x8c\x66\xe9\x29\x13\xbe\x12\xb6\xc5\x9d\x80\x93\x5b\xfd\x44\xe9\xc0\x0c\xc9\xf1\x59\x92\xce\xe8\x09\xf9\x60\x0b\xe6\xf8\x9d\xeb\xe3\xe7\x6a\xc9\x4a\x68\x5a\xb1\xe2\x52\x27\xe4\xd4\xbd\x3a\x21\xa7\x13\x72\xfe\xbd\x85\x1c\x1f\xb8\xb5\xaf\x80\x73\xe3\xa3\x15\x2b\xe5\xb5\x9d\xe7\xbf\x08\x67\xdc\x64\xb1\xb8\x9a\x90\x1b\x16\xc9\x05\xcb\x90\xc8\x41\x19\x4b\xc3\xcc\x5f\x53\x9e\x18\x12\xe7\x48\x5d\xa1\x11\x02\x9a\x69\xd9\x0e\x17\x28\xe1\x7e\x36\xed\x36\x9f\xdb\x4e\xd9\x9c\x3d\xf3\xbc\xf5\x88\xa5\x19\x5b\x70\x99\x2b\x17\x9f\x90\x6b\x3c\x66\x4a\x5b\x86\x3b\xe3\x53\x8f\x72\xed\xfd\x9a\x19\x8b\x64\x16\x17\xc9\xe1\x4a\x53\x9d\xab\x72\xc6\x43\x84\xa6\xb3\xf6\xac\x31\x7e\x1e\x1f\x98\xba\xef\x47\x49\x31\x3c\xe3\x80\x53\x71\xf4\x06\x03\x3c\x8a\x2a\xd2\x3a\x88\x39\x29\xe2\x5d\x8c\x0c\x95\x6b\x16\x6c\x2b\xbb\x01\x1a\xcf\x75\x29\x7f\xf5\x14\x2b\x97\x0c\x7c\xb3\x83\x22\xc4\xa4\x06\x7c\x79\x78\xed\x35\xeb\xe4\x80\x54\xcd\xf0\x7a\xc6\x51\x26\x95\xc1\x36\x8f\xa3\x24\x07\xc6\x52\x92\x43\xe2\x29\x49\x9b\x31\x95\xc4\x47\x66\x1f\x72\x62\x6e\x5c\x4c\x78\xe5\xcc\x58\xc2\xbb\xed\xcc\x94\x10\x01\x7c\x3b\x5c\xb9\xaa\x78\xd6\x87\xe9\xcf\x00\x58\x01\xc3\xc8\x5e\x7b\x5a\x41\x9d\x43\x47\x25\xfb\xec\xf1\x77\x03\x39\xa6\x28\x11\xad\x25\x84\x1b\xcc\x53\x84\xf2\x81\x53\x37\xb0\xf1\x57\x4e\x5d\xea\x4e\x70\x77\x82\xeb\xbe\xff\x94\x27\x18\x63\x97\x9b\x84\xd6\x97\x75\x06\x74\x4d\x92\x9f\x73\x96\x2d\x89\x11\x7c\x8a\xf8\x1d\x00\x1a\x56\x3c\xb6\x11\x30\xd6\x92\x52\x5f\x4e\x7f\x44\x9e\x0f\x76\x9a\xcb\xcf\x46\xea\x83\x2c\xb4\x03\x68\x59\xb5\xa9\x72\xa2\x31\xce\x96\x9b\xf4\x92\x54\x37\xb4\x08\x64\x81\x9c\x67\x44\xbc\xb3\x77\x17\xfb\x29\x37\xcd\xbc\x56\x64\x1f\xcf\xd5\xca\xe0\xcf\xb6\x0c\x10\x27\xc2\xff\x52\xae\xb1\xe4\xed\x0f\xe4\x8e\x2d\xfb\xd6\xd1\x6d\xb1\xd3\xdd\xc3\x18\xaf\x51\x06\xfc\xac\x0b\x34\xb1\x6e\x82\xf6\xa0\x8a\xfb\x59\x0c\xf0\xaa\x0f\x11\x59\x7e\xcb\x4d\x42\x53\xe2\xbb\x37\xd9\x6e\x04\x25\x19\x5e\xa5\xad\x60\xe1\x4f\x21\x50\x0f\xf6\x04\xc0\xe6\xb9\xc0\x65\xbf\x0d\x20\x58\x1b\xa8\x45\xd3\x45\x24\xfb\xab\xbd\x78\xb9\x89\x3d\x78\xa8\x7e\x9b\x96\x22\x6f\xef\xd8\xf2\x48\xd9\x9c\x3f\x29\xd4\x8c\xa7\x0e\xa9\x1d\x28\x81\xdd\xb9\xe4\x23\x04\x00\xb8\x26\xf0\xcc\x5f\x89\x3e\x79\x27\xb5\xf9\xdf\x25\xc4\x02\xa1\x79\x52\x32\xf5\x4e\x6a\xb8\xf3\xe8\x93\x85\xdd\x3d\x78\xaa\xac\x6d\x92\x83\x6d\x11\x63\xd6\x20\xdf\xc2\xc5\x98\xc0\x94\x58\xb7\xaa\x9f\x56\xae\xc8\x95\x20\x32\x73\x73\xa2\x1d\xb4\xaf\xb2\x4d\x38\x7b\x52\x60\x06\x5e\xd3\x86\x9d\x4a\x99\x95\x66\x72\x4b\x73\xde\xa2\xcc\xdd\x2f\x60\x6f\x02\x13\xbc\x0f\x8c\x01\x80\x5a\xaa\xd9\x94\x47\x64\xce\xb2\x29\x64\x77\x46\xb3\xfd\x17\xa8\x39\xdd\xc6\x6b\x2f\xea\x1d\x7e\xb8\xf1\xce\x00\x56\xf7\x06\x42\x93\x0e\x65\x98\xd8\x0a\xb2\x88\x39\x4d\xcd\xa6\xf8\x87\xe1\x04\xb0\x2e\xff\x02\x40\x69\x35\x24\x67\xae\xca\x67\xf8\x9b\xb5\x5c\x84\xcd\x98\x16\x8c\x1c\xff\x73\xce\x17\x34\x61\x18\xb0\x47\x85\xc7\xde\x94\x93\x15\x36\xdd\xb7\xa8\xd2\x86\x4a\x79\x77\x50\xef\x8e\x2d\x7b\xfd\x95\x8d\xd4\xbb\x12\xbd\x22\xc5\xba\xb4\x75\x3c\x43\x03\x4f\x41\x0f\x7e\xeb\xb5\xcd\xd9\x9f\x48\x9c\xdf\x63\x97\x58\x23\xd0\x79\x42\x95\x6a\x96\x9d\xba\x19\xe3\x6c\x14\xb4\x59\x64\x09\xd9\x30\xcc\xd6\x6d\x55\x10\xae\xdf\x3c\x64\xa8\xd1\x2c\x2d\x6c\x89\x92\xfa\xf0\x0a\x55\xaa\xea\x1b\xf0\xc9\x18\xf7\x61\x3e\x5b\xe1\x69\xdd\x30\x5f\x1f\xc1\x66\x28\x27\x21\x26\x23\x57\xa0\xe2\x72\x97\x9e\x21\xa4\x26\x5c\x44\x49\x6e\xcd\x85\xf0\x2a\x28\xc8\x4d\x45\xfa\x3d\x26\xe7\x80\xcd\xf3\xd1\x37\xe0\xe4\x11\xe7\xd3\x5d\x89\xc4\xad\xba\xdf\xc0\xe1\xe9\xbd\x59\x38\x57\x6d\x8f\x75\xb2\x23\xee\xb1\x0c\x99\x79\x5e\x96\x31\x5e\xf3\x71\xc6\xc8\xf9\x8c\x0a\xc1\x92\x20\x27\xd5\x1a\x32\x7c\x99\x28\x10\x3c\x6c\x71\xa8\xa3\x72\x75\x28\x47\xc7\x84\xcf\x80\x6e\xbd\x42\xee\x97\x5d\xac\xa9\xb5\x6a\xdb\x16\x39\x71\x26\xef\x49\x2c\xc9\x3d\xd4\x0b\x58\x18\x76\x04\x3e\x56\xe5\x18\x59\xd0\x53\x88\x78\x88\xe4\x3c\xcd\xe4\x9c\x2b\x17\xd7\x6e\x17\xae\xd5\x24\xce\x24\xaf\x81\xcd\xb3\x09\xd4\xe5\xf5\x39\xd1\x34\x9b\x32\x6d\x9a\x21\x22\x9f\x8f\x59\xed\x14\xd3\x87\x00\x05\x7b\xee\x55\xa8\xda\x2d\x24\x85\x53\xff\xc3\x0f\xef\x1a\x97\x9b\x5d\xb7\x82\xf7\x32\x4b\xe2\x7b\x1e\xa3\x43\x4f\x91\x63\xd3\xf0\xc9\xf3\xaf\x0d\x7b\x7f\xcf\xe3\xc3\x26\xc0\xc5\x2b\x99\x09\x20\x30\x03\xb6\x3a\x12\x07\xdc\x6a\xf8\xc0\x09\xb9\xe4\x98\xf1\x63\xfe\x42\x64\x98\xf9\x98\x8b\x22\xeb\xcb\x2f\x06\xd0\x55\x73\x1e\x9c\x36\xa1\x98\xc6\x5c\x0d\x48\x77\x90\x7a\x46\x14\x9f\xe7\x89\xa6\x82\xc9\x5c\x25\xcb\xda\xdb\xe2\x69\x26\x79\x92\xb0\xcf\xb8\x8b\x9b\xf0\x2b\xff\x52\x99\x6f\x41\x88\x49\x91\xda\xb8\xc2\xb8\x8a\x20\xa8\xf8\xd4\x33\x31\x9f\x02\xc4\x3e\xb3\xc8\xc6\xeb\xa6\x49\x3e\xe5\x3b\x52\x12\xfe\xcd\x60\xc4\x0b\xa0\xe6\x5c\xb1\x22\x7b\xbe\x6e\xa1\x94\xa7\x43\xfd\x7e\x50\x66\x7d\xbb\x1e\xda\x3b\x66\x29\x13\x31\xa0\x8e\x05\x7b\x15\xbb\xdb\xea\x5c\x59\x04\xaf\xfd\x29\xd4\xe5\x67\x9d\x51\x43\x6e\xe6\x86\xb0\x38\x40\x30\x3e\x21\x54\xd4\x27\x1d\xcf\x03\x69\x97\xfc\xdb\xf1\xe8\x07\x2f\xc4\x7c\x18\xbe\x3b\x52\x51\xbb\xed\x55\x39\x0c\x77\x0d\x0e\xbb\xfd\x4a\x39\xfc\xef\x30\x3c\x76\xb5\x06\x82\xba\xd2\xab\xae\x40\xe5\x17\x01\xce\x3e\x81\x4c\xdb\x26\x90\x45\xaf\xf1\x8d\x8a\x66\x6b\x6f\x56\x0b\x1e\x6f\xd1\x64\xed\xbe\x0d\x48\x3a\xe0\x83\xda\x86\x6c\xb6\x10\x51\x66\x2e\x8b\xf0\xb4\x5c\x88\x5d\xc4\xea\x21\x30\xb7\xa9\xa6\x8a\xe9\x7a\x56\x8d\xd5\x90\x3b\xc7\xe9\xb1\x15\x04\x79\x87\x30\x6f\x97\x6e\x4a\x06\x7f\xb2\x32\x81\x28\x3d\x69\xa4\x01\x37\x21\x0e\xd5\x88\x79\x37\x2d\xb6\x11\x9b\x65\x88\xa8\xae\x5d\x91\xa6\x16\xbd\xb7\x3d\xf8\xf0\xa1\x71\xd9\x52\xf3\x4a\x65\xc4\x76\xa5\x01\xf7\x86\xff\x9c\x87\x92\x3a\x60\x41\xf8\x31\xda\xe7\xdb\x1a\xc8\x34\x62\x85\x89\xe8\x82\xab\xbb\x26\xc0\x5c\xdf\x9d\x5f\x96\x5f\x2e\x6f\xf8\xef\xce\x2f\x89\xbd\x5b\xcb\x8a\xd3\xc4\x8c\x73\x28\x6e\xd4\x34\x62\x85\x69\x34\xe6\xea\xee\xd1\x8b\x82\xa7\xf1\xbb\x5d\x31\xd4\x8f\x6d\x65\x72\x38\x26\x01\xc0\xce\x52\xe6\xe4\xde\xe2\x03\x58\xa1\xf6\x96\xa7\xaf\xc8\xa5\x50\x79\xc6\x0a\xef\x67\x55\xbe\x35\x9c\xf4\x39\x15\x0f\x3f\x68\x6f\x3c\x67\x33\x57\x4a\x33\x0d\x92\x6d\x63\xac\x32\x80\xe3\xb7\x2f\xbb\x21\xec\x58\xfa\xab\x89\x8b\x41\xeb\xdb\xdc\x67\x0f\xe8\xe5\x1e\x32\x8b\x1d\xc0\x7d\x84\xcb\xfb\xda\x43\xe1\x90\xd3\x98\x2d\x4e\x55\x4c\x5f\xf6\xe1\x33\x2e\x36\x58\x97\xfa\x44\x15\xe9\xbd\xec\x0d\xc9\x88\xcf\x79\x42\xb3\x64\x59\xc2\x1f\x2e\x9e\x33\x2c\xc0\x35\x08\xce\xac\x17\x3d\x72\x2c\x33\x68\x39\xa2\x82\x24\xcc\x65\xff\xd8\x03\xb5\x44\x11\xf0\xe4\xb1\xa9\x08\x79\x50\x1b\x21\x12\x94\xa6\xdb\xe0\x03\xb2\x9b\x12\xb8\xcb\x45\x41\xb1\xb9\x30\x64\x7c\x48\x3e\xac\x2b\xaf\x0d\x67\xc3\x3d\xf1\x54\x53\xf9\xa0\xba\xd9\x81\xb5\xf9\x57\x14\xba\xa7\x9b\xa6\xdd\x5a\xdd\x94\xeb\x1b\x96\xca\x46\x02\x00\xbe\x52\xb1\x84\x71\x6d\x6e\x48\xc5\x01\x93\x93\x6a\xa8\x70\x9b\x69\x1e\xe5\x09\x35\x32\x31\xda\xc1\x86\xe4\xe2\xf2\xfa\xe6\xf2\xfc\xec\xf6\xf2\xe2\x15\x71\x2d\xf1\x50\x5a\x1b\x92\xdb\x10\x1b\x29\x08\x79\xb5\x00\x34\xfe\x5b\x7d\x4b\x7c\xa8\x28\xa0\x0e\x01\xf1\x82\x0a\x72\x25\xb8\x2e\x90\x80\x31\x48\x2b\x91\xc2\x86\x5d\x99\xb7\xad\x1d\x6e\xca\x31\x74\x42\xd8\xc6\xcc\xcf\xe5\xd6\xe0\x74\x20\xaa\xa8\xef\xca\x0e\x2d\xee\x01\x24\x87\x62\x72\xdb\x92\xdd\x1d\xf8\x67\xc3\xe3\x71\x8b\x06\xf6\x02\x7f\x15\x29\xbe\x87\x1c\x77\x58\x2f\x6b\x8a\x31\x13\xc3\x4b\x8e\x86\x47\x4e\x50\x48\x56\xe0\xe5\x7d\xa3\x21\x9c\x55\x79\x6f\x0d\x09\x79\xef\x42\x98\x21\x17\x77\x3d\x52\x3d\x02\x24\x04\x78\xe7\x95\x1d\xea\x12\x45\xf2\x71\xf8\x51\x8b\x7f\x35\xe5\x0b\x26\x70\x60\xed\x12\x24\xf7\xf9\x86\x73\x7e\x53\xf4\xfb\xc3\xcd\x9b\x76\xbb\x84\xe7\xac\x61\x87\xce\xe5\x7c\x8e\xa8\x48\x33\x9f\x59\x57\x24\xc7\xf9\xd3\xde\x9a\xc2\x82\xf8\x4e\x93\x1d\x9b\xba\x42\xa7\xdc\x4b\x15\x05\xc5\xdf\xb6\xd1\xf8\xa2\x90\x53\x9b\x43\x09\x5b\x28\x31\xe5\x80\x42\x2c\xc9\x3e\xf5\x3d\x3e\xbd\xb9\x3c\xbb\x78\x7b\x39\x9c\xc7\x8f\x4e\x32\x98\x88\x53\xc9\x85\x56\xbb\xd5\x92\x5d\x85\x53\xea\x93\x15\xff\xd1\xa6\x5c\xf7\xd2\xbd\x18\x86\x38\xb8\xd6\x02\x04\xb6\x98\x69\xca\x13\x15\xac\xa3\x96\xa9\x4c\xe4\x74\x3d\xae\x70\x83\x05\xfa\x35\xe2\xa9\x0c\xe8\xc0\xac\x7c\xbb\xf2\x7a\x9d\x72\x10\xe5\xf9\x70\xe5\x1f\xcc\x34\x14\x63\xf5\x72\x30\x54\x6d\x78\xa6\xc3\x7d\x10\xc1\x6b\x65\x0e\x50\x1b\x84\x43\xec\xc0\xe9\x0a\xb4\xb7\xa0\x14\x4b\x5d\x89\xec\xa1\xa7\x6e\xb7\x30\x66\x68\xd0\xee\x7a\x3b\xe5\x39\xfb\x8b\x7d\xa7\x4c\xe4\xd2\x8c\x0d\x3c\x3c\x11\x54\x08\x91\x59\xc0\x5d\x43\x9a\xe7\x0c\x2f\xce\x4c\x83\x4f\x25\xcb\xaa\x01\xa6\x90\x7d\xbc\xd5\x0a\x33\xec\x93\x64\x59\x00\x1e\x5a\x55\x98\x4e\x11\x76\x28\xb3\xf6\xdb\x34\xe3\x0b\x9e\xb0\x29\x80\x8e\x72\x31\x0d\x72\x3f\xc3\x6c\x51\x0b\x42\x5a\xb6\x86\xbe\x35\x7f\x05\xf0\xd2\xb0\x2f\xde\xbd\xbf\x05\xfc\x5a\x70\x0a\x1e\x2c\x60\x9b\x0f\x42\x31\x93\xc1\x60\x00\x7a\xff\xf1\xdf\x8c\xac\x18\x27\x27\xe4\x07\x66\xbf\x23\x01\x60\x37\x83\x8a\x36\x33\xe9\xd1\x4e\xa1\xaf\xc5\xcc\xc2\x76\x44\xa7\xb9\x7d\xea\xd4\x3c\x69\x04\x23\x64\x37\xa5\xe7\xa1\x80\x27\x82\x14\xa2\xbf\xe7\xf1\xe5\xca\x16\x49\xff\xde\x54\xce\x59\x45\xd7\xed\x4f\xef\x91\x49\x2d\x3d\xa4\x44\x2d\xe7\x09\x17\x77\x05\x0e\xd6\x44\x9a\x3d\x84\x31\xfa\x5c\xdc\xb9\x1d\x9b\x31\x9a\x6c\xa6\x94\xfb\xec\x8f\x56\xa9\xa4\xde\xc3\x78\x77\xbb\x4c\xd1\x17\xee\x8f\xbd\x75\xf5\x86\x24\xae\xd7\x7b\x76\xe3\xe5\xaa\x59\x35\xf7\xa3\xab\xd1\xf9\xa8\x54\x89\xd4\xe8\x74\x70\xef\x31\x8d\xcb\x9b\x58\x02\x0c\xe7\x09\x25\x3b\xfe\xf3\x2e\x4f\xed\x80\x24\xf9\xee\x67\x30\xcc\xe7\x5a\x66\x9a\x26\x2d\x11\x81\x68\x46\xd3\xb3\x5c\xcf\x2e\xb8\x02\x00\x81\xa6\x42\xc0\xfd\x0c\xb1\x88\x1d\x0c\x1e\x77\x8b\x8e\xad\x91\xf3\xbf\x9c\x5d\x13\x9a\x9b\x55\xd4\x16\x2c\xb3\x55\x17\xb7\xeb\xff\x08\x03\xea\x5b\xe9\xbd\x6d\xeb\xc1\xfb\xde\x39\x04\x5a\x74\x08\xc0\x19\x7f\xce\x4e\x00\x2e\xb8\xe6\x54\xcb\x9a\xf5\xb2\xca\xfa\x7b\xae\xb4\x9c\xdb\xed\x79\xe5\x1a\x02\xaf\x2c\x30\xdc\x52\xdb\xe5\x52\x00\x20\x68\xc3\xe4\x5c\x09\x23\x16\xd3\x88\x55\x22\x00\xfb\x80\x47\x89\x6d\x73\xff\xcc\x7f\xd9\xc8\x4c\x00\xb2\x4a\xfe\xf4\xaa\x84\x0f\xbe\x52\x6c\xc1\x19\x15\x0a\x24\xff\x56\x2d\x31\xfc\xe7\xa6\x27\xdb\x9a\xbd\x70\x54\xff\x3b\xa7\x09\xce\xc6\xbb\xb6\x6d\x44\xe5\x99\x6d\xd8\x49\xb7\x9e\x6e\xce\xdf\x79\xad\x39\x57\x88\x83\x85\x4f\xe8\x8c\x0a\x65\x16\xa2\xac\x1b\x1d\x59\xd7\xce\x11\x39\xd6\x51\x5a\xbb\x24\xfc\x03\x45\x66\x63\x57\xed\xbc\xbf\xf1\x11\xd9\x75\x7b\xf5\x20\xde\x16\xd8\xbb\x4d\x4d\x1b\xa5\x81\x20\xb3\x25\x6f\xb8\xd2\x0e\xec\x1f\x6e\x70\x65\x91\x6a\x41\xd2\xb9\x36\xaa\x13\x4f\xff\x87\xc6\x71\xf6\x0a\x39\x89\x2b\xdb\x9b\x81\xbc\xe3\x30\xa5\xa8\xf0\xfe\xb8\x63\xbd\x4c\x2d\xe0\xdc\xed\xf9\x35\xc1\xe2\x1b\x7f\xfc\x3d\x96\x0c\xfd\xdd\xd7\xbf\x7f\x51\x7b\x41\x9f\x2e\xfc\x79\x4f\xcb\x41\xeb\x1e\x9b\x67\x11\x35\x07\xe2\x02\xc6\xcb\x01\x3d\xb4\x67\x17\xf7\x91\x59\x54\x4f\xa5\xf7\x13\x2a\xba\x08\xb3\x27\x8d\x30\x23\x3e\xe9\x01\x69\xc2\xe1\x54\x05\x09\xca\xf5\xf3\x23\x28\x3b\xe7\x62\xf7\xae\x29\xef\x16\x3c\xbf\x46\xbf\x0b\xbc\x4f\x10\x73\x7d\xf1\x6e\xf4\x3f\x6f\xce\xbe\xbd\x7c\x03\xbd\xb4\x71\x55\x66\x1b\x70\xb1\x77\x1c\x51\xfd\x6d\x55\x47\x13\xdc\x3d\x19\xcd\xfc\x1c\xef\x5e\x8f\x2a\x8a\xb2\xb9\xd3\xd0\xb9\x71\xa8\xb4\x2c\x26\xb5\xc6\xfe\xb8\xa6\x2b\x28\x86\xc1\xb2\xf6\x52\x1c\xf6\xb6\x70\x05\x90\x4c\x25\x65\xc8\xac\x14\xf6\xf0\x60\x7d\x65\xe7\x0a\x90\x67\x60\xc4\x37\xe3\xc5\x39\x68\xdd\x7c\xff\x40\x73\x55\x97\xc5\x67\xcd\x73\x5f\x8e\x46\xf0\x96\x73\xf2\x98\x43\x8a\x11\x39\x99\xa1\xd7\x86\x52\x33\xe5\xa1\xfb\x9f\xe9\x4e\x49\xd7\x21\xfd\x36\xa1\x5e\x6b\xa1\x82\x4b\x55\xae\x4a\x8e\x8d\x52\xc6\xc0\x26\x64\x6c\xe7\xdb\xa7\x56\xbd\x54\x29\x8d\x5a\xad\xc3\x51\xdc\xc2\x3b\x90\x52\xfd\xf8\x04\x10\x3e\xdb\x62\x40\xa9\x6f\xaf\xe9\x46\x3e\x77\x2f\x56\x13\xb9\x1a\xad\x90\xab\x12\x91\x4a\x97\x24\x17\x66\x7c\x3d\xf1\xf2\x91\x47\xa1\x9e\x3f\xec\xa9\xba\xb4\xad\xb6\xa4\x33\xa9\xa5\xd8\x3b\x48\xfc\x7a\xcd\xeb\xe5\x73\x8c\x4f\x9c\x17\xa5\x4f\x82\x8a\x80\x10\x61\xe8\x0d\xfa\x46\x8c\x73\x5c\x42\x0a\x67\xda\x2f\x1b\xf6\x1f\x5d\xf2\x88\xaf\x2e\x5a\x3a\x73\x5f\x52\xf2\x61\x53\x13\x6c\xab\x21\x14\x71\xe3\x8c\x8b\xab\x0b\x2b\x77\xb9\xac\x0a\x65\xb7\x1d\xd9\xbc\xef\x5a\xe3\x8b\x32\xd3\xf7\x32\x6b\x9e\x6a\x7c\x5d\x7a\xb1\xe2\xd5\xb7\xbf\xad\x64\x13\x3d\xc7\x33\x82\x7d\x7c\xe2\x73\x32\x02\x87\x69\x05\x07\xbb\x7a\x32\x7c\x14\xfb\x03\x1c\x9e\xa7\x3d\x34\x7b\x72\xa1\x87\x4d\x49\x6d\x55\xf0\x76\xbb\xac\xe1\x08\x3f\xda\xd7\xac\x81\xc0\xac\x4d\x41\x24\xa8\x3f\x84\xb6\xf9\xd6\x88\x42\x26\xb1\x1a\x61\x03\x7a\x70\xa5\xd9\x1c\x0b\x0a\xd3\x24\x31\x73\x29\x45\x08\x1b\x6c\xd3\x4e\xfb\x04\x91\x77\xe7\x34\x75\x45\x99\xe5\xbd\xb8\xa7\x59\x4c\xce\xae\xaf\xda\x39\xfa\x0d\x42\x8b\x71\xff\xd4\x43\x82\x2a\x17\x8b\x94\x31\x23\x63\xae\x55\x51\xc6\x8d\xe9\x50\x1b\x34\xe4\xcd\xfb\x88\xcc\x21\x35\x07\xd2\x7e\x2f\xe0\x7e\x82\xc8\x48\xd3\xa4\x52\xe4\xfe\xc5\x8b\x17\x68\xbc\x7a\xf1\x87\x3f\xfc\x01\x4b\xeb\xc4\x2c\xe2\xf3\xd5\x07\xe1\xa9\xff\x78\xf9\x72\x48\xfe\xcf\xd9\xdb\x37\x50\xe6\x2f\xd5\x0a\xe1\x2e\xb0\x65\x2c\xfb\x1d\xbc\xac\xfa\xe4\x7f\x8d\xde\xbf\x2b\xca\x84\x94\x7f\xb5\xd5\x93\xed\xf0\x86\xe4\x22\x08\x01\x0a\xcd\x53\x54\xcf\x6c\x45\x1b\x4d\xe8\x64\x82\xc5\x2b\xc7\xae\x76\x2a\x1e\x29\x97\xd9\x0c\x25\xa0\xb1\xfe\x84\x59\xfe\x04\x62\x93\x8c\x22\x8d\xc6\x3c\x97\x5c\x8f\xa1\x56\xd0\x96\xa7\x7f\xd0\x95\x3e\x16\x0e\x9f\x28\xa8\x42\x51\x40\xc1\x65\x4c\x19\x99\xd2\x16\xd4\xc3\xc6\x7c\xd7\x4d\x27\x9e\xd2\x07\x53\xbb\x3a\x42\x69\x63\x39\xe0\xda\xa2\x08\xf9\xdf\xd0\xad\xb8\x2b\x38\xf6\x81\x7c\x22\x65\x9e\xef\x7b\x83\x6b\x65\x53\xd6\x3d\xb9\x20\x34\x91\x50\xbb\xc9\x2f\x6d\xc1\x8f\x82\x92\xe6\xbb\x87\xd2\x18\x79\xaf\x29\xfa\x2a\x52\xa1\xb7\xb4\x76\xfd\x96\xb2\x49\x3b\x48\xed\xa7\x63\x99\x6b\xe7\x02\xc6\x36\xb1\x68\x21\x56\xce\x6e\x80\x1c\xb8\x07\xd8\xe0\x3e\xa0\xb3\x8d\x71\x2b\xcb\x64\xbe\x24\x04\xf4\x09\xa3\xd1\x8c\xdc\xb1\xe5\x00\x09\x53\x4a\x21\x1b\xc5\xd7\xc6\x2a\x57\xb6\x28\x8a\x93\x18\xc9\xd6\x4e\x96\xf3\xa8\x17\xbb\xc8\x67\xb3\x38\xf1\x51\x59\x49\xc7\x62\x46\x8a\x40\x81\x77\xc0\xc4\x41\x75\x59\x0f\x12\x89\xa5\xa5\xcb\x59\x17\xe6\x7c\xb1\xd8\xbc\xa6\xb6\x7d\xb9\x08\x23\x30\x84\xce\xb2\xaa\x5c\xac\xbc\x6d\x4b\x29\x5b\xb1\x0d\x3e\x48\x1d\x14\x6f\x10\x8a\x00\x05\xdb\x6c\xa9\x1e\xfb\xac\x9b\x25\x3f\x11\xa5\xac\x10\xc5\x74\x6e\xa7\x06\x2b\x42\xe5\x22\x61\x4a\x11\x0e\x23\x9c\xd3\xec\x8e\x39\x50\x12\x9a\x0c\xc9\xb5\xe9\xa4\x47\x3e\x42\x0c\xdc\x05\x86\x91\x99\x33\x1a\xa6\xbb\x98\x8f\x1c\x0d\x87\x47\x48\xc1\xd7\x24\xbf\x34\xd8\x19\xfb\x01\xa8\xee\x01\x9c\x5a\x29\xd4\x9c\x2a\x84\x81\x35\x52\x1b\xc0\x1c\x4b\xc8\xe2\xd2\x33\xc7\xa1\x68\x6d\xf8\x9d\xd5\xe1\xec\x81\xf6\xb9\x2f\x48\xf5\x3e\x10\xd5\xb5\xdc\x09\xe5\x6b\x7f\x68\xea\xbd\x80\xa9\x57\x2a\x46\xdb\x25\xb2\xc7\xac\x39\x52\xef\x01\x40\xca\xf3\x46\x20\x9f\xee\xda\x84\x09\x33\xaf\x23\xf5\xd9\x4a\x6c\x09\xfb\xa2\xc4\xbc\xab\xc9\xba\x3a\x62\x2e\xdd\xad\x90\x93\x3d\xd1\x34\x33\xf0\xf4\xf2\x5d\xb3\xea\x1c\xa4\xb1\xc0\x57\xbd\x9a\x08\x80\xd5\xab\x9e\x53\xae\x7a\xad\x9c\x26\x4f\xdd\xd3\x20\x24\x1d\xa6\x52\x4b\x40\x62\xd6\xfe\xc8\x0d\xa1\xa8\xbd\xe5\x51\xd4\xc8\x2a\x4a\x26\xb9\xf6\x69\x39\x6b\x58\x03\x34\xea\x70\x9b\x31\x19\xd2\x3d\x16\x30\x0a\x2c\x5d\x05\xf4\xb7\x29\xcf\xc0\x6b\xaf\x23\xdd\xb4\x7a\xda\x2f\x36\x70\xe3\x80\x39\x74\x32\xc3\xde\xf3\x38\xb2\x68\x08\x2e\x82\xb8\x24\xc3\x40\xf0\x86\x56\x28\x20\x39\x71\xc4\x56\xea\x69\x3c\xb2\x7a\x86\x15\xdb\x45\x6b\x45\x38\xbb\xbe\x6a\x51\xa2\x0f\x5a\xfd\x45\xcb\xf4\x60\xba\x29\xd5\x4d\xb9\x28\x46\x6e\x0d\xbc\x86\xc2\x3c\x7b\xd1\x70\xa5\xdb\xaf\x0d\x5d\x0c\xcc\xaa\x15\x50\x36\x5b\x98\xde\x53\xd0\x00\xc8\xcd\x39\xf8\xe0\xbc\x3e\x77\x31\xf2\x11\x45\x42\x98\x8f\x46\x65\xad\xdd\xb5\x5a\x82\x0c\x06\x4b\x46\x50\x9b\x04\x75\xbc\x40\x59\x4c\x65\xfc\xca\x16\x00\x16\x42\x62\xd5\x2f\xd5\xc7\xe2\x26\xaa\x8f\x4a\xa0\x11\x14\x02\xb7\x6c\x16\x18\xc0\xf7\x16\x0d\xf6\x2a\x53\x73\x48\xa1\x1a\xb3\x80\x30\xf2\xeb\xa6\xab\x48\x0e\xac\x3b\x43\x02\x2e\xb4\x5f\x25\x8b\xb2\xb1\x1a\x5b\xf2\xd5\xb9\xa3\x19\x9b\x53\x04\x85\x73\xc3\x33\x54\xe6\x3e\xe3\x5a\x33\x44\xf5\x61\xd9\x5c\x11\x39\xe9\x97\x2a\xc4\xf5\x16\x2f\x7b\xfb\xd4\xf3\x38\xb0\xe4\x0a\x29\x56\xa1\x85\xc9\xb8\x2e\x49\x67\x66\x5f\x83\xba\x90\x00\x92\xa3\xa8\x18\x19\x0c\x83\x59\xe0\xec\x3d\xfa\xc0\x9f\x52\x45\xea\x7b\x21\xa1\x53\x91\x3a\x15\xa9\x15\x15\x29\x60\x2c\x8e\xe0\xd8\x89\x0a\xd5\xa6\x10\x51\xca\xe9\x4e\x45\x56\x4f\x80\x12\x63\xb6\xa6\xd3\x9a\x64\x56\xb6\xa2\x19\xd5\xe7\xc8\xe9\x52\x76\x1f\xe7\x7a\x32\xf8\x23\x61\x22\x92\x31\x2e\xbe\x69\x3f\x53\x1a\x44\x9b\x42\xfd\x08\xfb\x32\x77\xdf\x0a\x2d\x71\xd0\xf6\xbe\x4b\xb7\x17\x1d\x70\xbe\xba\xd7\x2d\x31\xf8\x82\xad\xfb\x24\x58\x57\xe0\xd8\xe5\xc8\x5b\xfe\x5e\x78\x09\xb1\x16\x30\x6c\x6e\x57\xe6\x94\x1c\xe3\xcd\x61\x94\xe6\x7d\xfb\xc0\x70\xce\xe6\x32\x5b\xf6\xfd\x43\xe6\xc7\xd2\x5b\xf6\x89\x13\x90\x09\xa2\x3c\x33\xca\x5e\xb2\xfc\x52\xa5\x03\x37\x41\x8f\x2c\x1c\xf8\x75\x6a\x56\x0d\x26\xbc\x2a\xe1\x77\x1e\xe8\x0a\x54\xf9\xa2\x3a\xce\xc4\x83\xef\xa9\xbe\x57\x51\xe1\x2e\x13\x0b\xb2\xa0\x59\x83\xd2\xd5\xe1\x75\xa0\x3c\x10\xf3\x05\x57\xfb\x15\xac\x5b\xab\x35\x73\x0b\xeb\x25\x73\x9d\xe6\xda\x52\x4a\x77\x2a\x5c\xaa\xb7\x3f\x0d\x15\xa1\xe8\x65\x6f\xaf\x6e\x7c\x31\x45\x61\xf1\xda\xb3\x34\x2c\x5e\x87\x16\x88\x2d\xb7\xb2\xf7\xb6\x69\xb5\xdc\xb3\xbb\xdc\xb6\x68\xe3\x1c\x16\x2c\xb2\xc0\x27\x70\xc2\xe9\x23\x1d\x34\x8c\x07\x69\xd1\x56\x63\x81\xd0\x7f\xc9\x66\x9a\x96\x5c\xaf\x36\x53\xef\xdf\xdc\xef\x3a\xb2\x98\xf8\x9d\xd3\xb5\xd6\xe6\xeb\x9c\xae\x9d\xd3\xb5\xee\xd5\x39\x5d\x3b\x8b\x42\xf9\xfa\xa2\x2d\x0a\x9d\xd3\xb5\x73\xba\x1e\x36\x87\x0f\xe2\x74\xb5\x62\x5c\xe1\x71\x7d\x54\x87\xab\x2d\xeb\x72\x16\x45\x32\x17\xfa\x56\xde\xb1\xda\x1e\x84\x5a\xc2\xfc\x4a\xeb\x8f\x27\xd9\x37\x17\x2c\x1a\x89\x07\xfb\x08\x06\x34\x8f\xb9\x11\xde\xf7\xde\x40\x67\xb6\x01\x27\xa7\x1b\x52\x2c\x62\x16\xfb\x96\xdd\x21\xd5\x66\xae\x87\xe4\x8c\x64\x2c\xe2\x29\xb7\xd5\xbb\x29\xde\xc7\x1d\xe6\x51\xf6\xb9\x56\x2c\x99\x58\xb4\x73\x11\x16\x85\x29\x44\x70\x4b\xe1\xd6\x7e\x06\x79\x8e\x74\x20\xd9\xae\x42\x4e\xc6\xfe\xe6\x98\x95\xed\xcd\x6d\xd8\x42\x68\x14\x81\xa1\x94\x6a\xd1\xc0\xc7\x52\x6e\x33\x90\x1f\xfa\x60\xb3\xcf\x29\xcf\x60\xf3\x8e\x58\x24\x45\x9d\x8a\x98\x1b\x16\xe8\xb2\xda\x92\x5b\x29\x6b\xd1\xc4\x02\xf8\xbe\xee\xe5\x82\x26\x3c\xe6\x7a\xe9\x7d\x6d\xb6\xca\x12\xc5\x13\xe3\x97\x51\x15\xd3\x48\x68\x9a\x66\x92\x46\x33\xa6\x82\x7e\xa3\xc8\x61\x13\xb1\x7c\xd4\x39\x56\x02\x03\xa9\x03\xde\x31\xac\x2f\x59\x92\x4c\x6a\xe7\x2e\xdf\xf0\xc1\xdb\xa0\x31\x78\x1d\xf9\x97\xce\x96\xe0\x53\x97\x61\x13\xd8\x2b\x3e\x09\xff\x50\x44\x26\xb1\xc3\xf7\xf8\xe3\x0b\x23\xe6\x45\x76\x0f\x1a\x2a\x07\x08\x10\x5a\x92\xc4\xb0\x62\x43\xf9\x36\xbf\xfc\xf5\x37\x64\x26\xf3\x4c\x0d\xc3\x24\xa1\x97\x70\x0f\x55\x34\x27\x26\x6a\x92\x30\xaa\x34\x79\xf9\x82\xcc\xb9\xc8\x0d\x07\x6a\xbc\x6d\x9a\x4b\x36\x81\x4c\xf3\xfb\x6f\x6a\xbf\xd7\x54\x9a\x59\xf5\x48\xda\x5d\x95\x22\x12\xaf\x15\x6a\xec\x49\xc2\xe4\x32\xc4\xb1\xae\x88\x38\x96\xe8\x86\xb3\x2d\xb4\x7c\x80\xf3\xf5\x73\x2e\xc7\x4b\xdd\x24\x11\xf1\x7f\xe3\x1b\xe5\x0c\x44\x77\xb3\x0e\xba\x48\x01\x2e\xb2\xf5\xa3\x0f\x52\x2b\x61\xca\x95\xde\x51\x29\xa1\xc8\x51\xdc\xfa\x58\x7d\xb6\x32\x35\xf2\x7e\xc3\xb4\x14\xd0\x11\x9c\xac\xeb\xcc\x43\x51\xc4\xb0\xa6\xe1\x45\x51\x69\x47\x48\x6c\x7f\x67\xf3\x4f\x0c\xb6\xe5\x36\x48\x0b\x18\xdd\x35\x87\x5a\x4f\xba\x72\x5b\xa2\xf1\x58\xf1\xb5\xf2\x29\x50\x5c\x4c\x11\x52\x7b\x9e\x27\x9a\xa7\x49\x31\x6e\xff\x82\x25\xe4\xa1\xd9\x8c\x06\x96\x1e\x8a\xc9\xb9\x08\xc5\x04\x26\xc6\x63\xdf\x16\x13\x1a\x91\xa1\x33\xc3\x0f\x52\x9a\x51\x3f\x79\x50\x37\x55\x9d\x58\x0b\x1c\x05\x3f\x20\x52\x1e\x43\xce\x33\x9a\xf8\x81\x86\xbe\x9f\x36\x37\x8d\x66\x82\x8a\x1a\x06\xe6\xb2\xaa\x07\x2f\x11\x79\xef\x43\xc0\xb0\xc2\x46\x65\xb7\x58\xa1\xe6\x5b\x1a\xdd\x31\x11\x63\xf9\x21\x18\x76\xbc\x14\x74\x6e\xa1\xa8\x82\x9a\xca\x95\xf7\x55\xdf\x9a\x1a\x30\x53\xce\xa5\xea\x22\xd7\x6d\x73\x0e\x72\xd5\x18\xeb\xe5\x83\xc2\x5a\xc6\xdb\xce\xb9\x42\x23\x4c\xc6\x17\x11\x73\xfc\xdf\x7c\xaa\xcd\xae\x2f\x6a\xe4\xa3\xaf\x74\xde\x86\x2a\xf2\x60\xff\x02\xb9\xf7\xc6\x6f\x40\x9d\xa2\x89\x39\xda\x4b\x9f\x9e\x59\x59\xdc\xf1\xb2\xdd\x82\x2a\xd9\xb8\x49\x1a\xed\xd1\xcd\xb7\x17\xe5\x43\x7c\x43\x63\xa9\xc8\xb7\x89\x8c\xee\xc8\x05\x03\xa1\xeb\x21\x0b\x82\x64\xe3\xf8\x29\x01\xa3\xe7\x74\xba\xcb\x3b\x36\x20\x73\x29\xb8\x96\xd9\x76\x7a\xd1\xd5\x27\x7c\x12\x38\xe2\x6c\x1c\x3f\x6b\x30\x62\xb3\xc1\xf6\xa9\x46\x98\xc1\x31\x84\xd7\x1d\x96\xdf\x9e\x87\xea\xd7\x33\x79\x3f\xd0\x72\x90\x2b\x36\xe0\x35\xfc\xad\x0d\x46\x77\xc7\x96\xe0\x64\x6e\x38\xbe\xef\xf1\xb5\x92\x72\xa0\x25\xd8\x94\xe0\xbe\x61\xd1\x37\xdf\x5e\x18\xde\x30\x0c\x85\xbd\x53\xa6\xa3\xd3\x88\xa5\xb3\x53\xfb\xe1\x67\x39\x29\x8e\x5a\x34\x9d\x95\x33\x12\xc9\x24\xb1\xf9\xce\x72\x42\xce\x59\x3a\xf3\x8d\x3d\xf6\x48\x9f\x0e\xea\x36\x95\xb2\x29\xe4\x67\x70\x60\xcc\xdb\xf6\xbc\x04\x1b\x27\x1b\x37\xab\x63\xf0\x58\x5b\xe5\x59\x57\x62\x7c\xc0\xc9\x79\xe0\xaa\xfa\xa5\x5a\xfa\x61\xe8\x65\x19\x0e\xd8\xc5\x70\x94\xc8\xcd\xd5\x04\x25\xe9\x98\xc5\x44\x2e\x58\x96\xf1\x98\x29\xe2\xe9\x4d\xa8\x7a\xf2\xe4\xb1\xe7\xad\x43\x26\x7e\x72\x64\xe2\x3d\x74\x9c\x80\x3c\x99\xb7\x57\xc9\x13\x8d\xe7\x5c\x3c\x3b\x02\xa5\x22\x9a\xb0\xab\xf7\x0d\x94\x89\x11\xbe\x51\xd6\x27\xdc\xcd\x00\x50\x6c\x07\x4c\xd7\xf7\x7e\xbf\x10\x21\xe3\x5d\xf6\xd1\x07\xd0\x0a\xa6\x54\xb3\xfb\x9d\xec\x6f\x50\x10\xa8\xdd\x4f\x82\xdc\xf9\x94\xfa\xc3\x13\x41\xe3\x05\xbb\x1c\x71\xbf\xda\x64\x9f\x76\x9d\x9a\x1a\x5d\xdc\x40\x2a\x48\xb2\x6e\xa3\x9e\x5d\x5f\x91\xef\xb0\xe5\x76\x91\xfa\x32\xa9\x51\xba\xbb\x90\x73\xca\x1b\x17\xda\x98\x95\x0b\x53\xbb\xee\x5e\xfb\x66\x09\xb6\x1b\xd6\x08\x99\xf0\x69\x6e\x34\x30\xab\x35\x75\x20\x6a\x8f\x22\x80\x14\xf2\x47\x60\x09\x72\x11\x87\x85\xcc\xe1\x56\x10\x98\x82\x77\x4d\x12\xc5\x84\xe2\xe0\x27\x09\x9c\xd5\xb6\xdc\x1b\xd6\x17\xc4\xf0\x42\x14\x52\xfa\xe4\x8d\x9c\x72\xe1\x4e\xa5\xb4\x6e\xb4\x09\xe5\x49\xdd\xc9\xe8\xa4\x8a\x27\x97\x2a\x94\x4a\x2e\x05\x1d\x27\x75\xa2\x00\xca\x64\x3d\xa1\xe0\xe7\x64\xf0\xf6\x69\xcc\x95\xf9\x3f\x19\x8d\xde\x80\x4d\x3c\x17\x4e\xd6\x05\x7b\xb1\x25\x6b\x3e\xd2\x1f\x0f\x60\xbb\x67\x06\x29\xcd\x1e\x18\x77\x57\x22\x36\x9d\x65\xaa\x14\x76\x62\xdb\x43\xa4\x3f\x1f\x39\x8b\x9e\xfb\x31\x23\xb7\x33\x1e\xdd\x5d\x07\xa6\x6f\x99\x99\x7b\x22\xb8\x55\x62\x42\xd5\xdf\xda\x24\x88\xb6\xab\xd7\xcd\x15\xd8\xdb\x80\x9e\x8f\xec\x80\x4d\x33\x84\x2a\x25\x23\x5e\xf8\x39\xc0\x5c\x52\x10\xfc\x18\x08\x7e\xbb\x83\x00\x9e\x7e\x20\x6f\x72\x8b\xe6\xaa\x9e\xaa\x90\x17\x71\xe1\xc6\xda\x6a\xc7\x71\x6b\xec\x81\xd2\x7d\x5b\xc2\xe5\x76\xb2\x69\xc5\x68\xef\xa2\xb8\xed\x22\x39\x29\xc9\x55\x59\x5c\x59\x26\x8f\xcf\x6d\x71\xf9\x5a\x1b\x6a\x9d\x44\x86\x75\xda\x70\xc5\x53\x87\xf7\xac\x19\x1f\x0e\x53\x2a\xd3\x3c\xc1\x58\x89\xc3\xc1\xc5\x9d\x75\x16\xbf\xd3\x92\x59\xff\x31\x80\x36\x9b\x06\x02\xff\x32\x30\x37\x03\x91\xec\xc5\xef\xbf\xf9\xe6\x4b\x47\xe1\xac\xab\x02\x3f\x04\x0c\x67\x4d\x93\x68\x97\x69\xd3\x65\xda\x84\x5b\xf1\x21\x61\x54\x5b\xce\xa5\x69\x18\xe2\xda\x2c\xbc\xb5\x7e\xb6\x4c\xed\x20\xd8\xa6\x01\xb0\x0d\xf2\x61\x5a\xca\x82\x69\x1c\x0b\xda\x24\xe3\xa5\xcb\x73\xf9\xa5\xe5\xb9\xec\x13\x03\xda\x3c\xa7\xa5\x49\xec\xe7\x2f\x29\x7f\xa5\xc1\x61\xac\x9f\x67\xd1\x3c\xbb\xa2\x39\x9e\x5d\x73\xcb\xd6\x3e\x25\x8d\x42\xfb\x8c\xd5\x22\x8a\x0a\x82\xae\xf0\x20\xe2\x63\x69\x69\x0e\xd6\xa3\xe8\x10\xa4\x81\x02\x85\xcd\xcb\x26\xb5\x04\xad\x4e\xfe\x7e\x54\x71\x6d\xf8\xdb\x4f\xe3\xd1\xf8\x65\xba\x0c\xba\xc2\x20\xcf\xdb\xa6\xad\x4a\xd8\x22\xce\x92\x00\x67\x1d\x18\xb1\x1c\x87\x98\x86\xc5\x19\x39\xbb\xbe\x32\xea\x32\xa4\xcf\xd0\x44\x0d\xc9\x1a\x3e\xed\xec\x92\x96\xaf\x3b\xfe\x4c\xb5\x66\xf3\x54\xd7\x5f\xec\xce\xa4\xfd\xe4\x26\xed\xbd\xed\x71\x1f\xfd\x8b\xbe\x02\x64\x3e\xa7\x62\x60\x4e\x14\x18\xb7\x4b\x5e\xb0\x0a\x09\x1e\x12\x17\x95\x8b\x73\x41\x33\x86\xa0\x4f\xe5\x8a\xb7\x34\xa8\x7f\xf8\x30\x46\x48\x68\x7b\xef\x91\x23\x03\xad\x9c\xb4\x48\xae\x84\x7d\xda\xe1\xf8\x59\x70\x87\x2a\xe0\xc2\x25\xbd\x59\xcf\x18\x32\xeb\x6b\x48\x44\x29\x9e\x2a\x4b\xc2\x28\x0a\xd3\x24\x91\xf7\xf8\xed\x90\x81\x99\xd9\x37\x7d\xb1\x19\x56\x63\x46\xe6\xdc\x28\xd5\xd6\xf8\x19\x76\x07\x5d\x91\x46\xa2\x66\x19\x0a\xac\x99\xf5\x66\x8d\x98\x0e\x17\xda\x28\xa4\x02\x03\xa1\xcd\xbf\x5d\xe0\x0d\xa2\xe2\x5a\x9a\x30\x66\x33\xba\xe0\x32\xcf\xf0\x6d\x2d\x49\xcf\xfe\x04\x2c\x61\x29\x73\x6f\x9a\xc2\x2a\x89\x7e\x74\x6a\xcd\x3c\xbd\x2b\x7e\x04\x51\x3e\x96\xce\x96\x30\x60\x9f\xb9\xd2\xab\x63\x71\x53\xe4\x40\xdb\xda\xda\x37\x0b\x95\x1a\xb6\xd0\xb8\x22\xda\xc7\xf0\xbd\xb2\x60\xb2\x18\xc1\x4f\x5f\x50\x3d\xb4\x9d\x58\xa4\x9d\xac\xd3\xb6\xac\xe3\xdd\x55\x09\x8f\x96\x8d\x2b\x85\x15\x6e\x2a\xf3\x3a\xf9\x96\x2a\x16\x93\xb7\x54\xd0\x29\xaa\x65\xc7\xa3\xeb\x6f\xdf\x9e\x98\x65\x03\xb5\xef\xea\x62\xad\x2f\x6b\x14\xf6\xe1\x5d\x9b\x69\x10\x2b\x23\xdc\x83\x13\x35\x1c\x63\xab\x69\x1c\xc4\x73\x93\x7a\x00\xb1\xab\xa9\x97\xd5\x1a\x8f\x15\xa2\xb0\x98\xc7\x07\x56\x75\xe4\x42\x69\x9a\x24\xd7\x09\x15\x67\x69\x9a\xc9\xc5\x7a\x4d\xb8\x9c\x18\x6e\x1f\x74\xac\x1d\x63\x1f\xdc\xcd\x14\x27\x1a\x7c\xbd\x82\x5c\x15\xed\x0f\xc9\x95\xf6\x0a\xb1\x14\xc0\x06\x7b\x67\xb9\x96\x73\xaa\x79\xd4\x33\x7a\x73\xef\x2d\x15\x39\x4d\xd6\x46\x18\x6d\x1d\xc6\x26\xb1\x6e\xeb\x4b\x9b\xc1\xd1\x6a\xbc\xb6\x55\x3e\xd8\xfe\xbe\xa6\x99\xa1\x2d\xe7\xa3\x8f\x8d\xde\x55\x9a\xea\x7c\x85\x72\x6e\xa1\xe6\x9b\xe9\xf7\x80\x24\x54\xe9\x0f\x69\x6c\x4e\x72\xe5\xd7\x6d\x44\x3a\xa2\x9a\x26\x72\xfa\x17\x46\x93\xf5\xfb\xb9\xb4\x4f\xce\xc3\xa7\x9d\xf1\x07\xb7\xcc\x28\x1f\xfb\x07\x8f\x14\x31\x42\xb1\xcb\xd7\xce\x58\xc2\x16\x54\x68\xf7\x3a\x56\xca\x56\x47\x76\xfc\xb0\x8b\x78\x61\xf0\x8c\x99\x66\xd9\x9c\x8b\x72\x9b\x23\x78\xf6\x5c\x8a\x98\xa3\xa9\x0f\x8c\x59\xf8\x46\xb9\xdd\xcd\x5b\x6d\x93\x39\x7f\x8b\x01\xbf\x4c\x79\x82\xfe\x94\xa7\x02\x1f\x1b\x5b\x99\x70\x86\x37\xc1\x73\x5d\xea\xdb\xca\x4c\x91\x3b\x61\x84\x39\xc0\xbc\x58\x4f\xa4\x76\xf2\xf6\x5d\x3c\x7d\xe0\xd6\x18\xbb\xb0\x39\x2e\x72\x60\xfb\xbd\xc9\xd0\xbf\x6d\x8b\xe1\xb5\x5b\x1a\xa8\x76\x65\x33\x05\x5d\xb7\xef\xfc\x6b\x98\xdc\x57\xa9\xae\x5e\x7a\x68\x33\xc5\xaf\x25\x2c\xd5\x93\x6b\xea\xe2\xa6\x97\x69\x6d\x81\xf2\xbd\xa2\x7e\xd6\x90\xf2\x76\xb2\xa8\x9a\xf0\xe5\x65\x65\xf8\xca\x06\xc5\x65\x56\x7d\xa0\x24\xe5\x0c\x81\x3a\xa8\xb0\x93\x05\x9c\x85\xd1\xd8\xde\x34\x1c\xcc\xa8\x71\xf0\x5b\xdf\xfa\x9a\xd1\xb0\x6b\x63\x17\x9c\x71\x98\x22\x50\x05\x38\x0b\x4e\xbf\x93\xd6\x51\x6a\x13\x4a\x0d\x0d\x00\xbe\xdd\x27\x2a\x8f\x66\x84\x2a\xd3\x35\xb3\xa1\xcd\x89\x67\xc3\x39\x15\x7c\xc2\x94\x1e\x7a\x1c\x5a\xf5\xe3\xd7\x3f\x0d\xc9\x6b\x99\x11\x1b\x87\xdd\x77\x08\x10\xb6\x9f\xc5\xbe\xe0\x0a\x07\xe3\xdf\x2d\x34\xcd\x54\xc6\xb6\xd3\xf7\xd0\x59\x4d\xef\x0c\x0f\xc3\xce\xe6\x0c\xdc\x05\xaf\x48\xcf\x08\x79\xc1\xa7\xff\x61\xd8\xd2\xbf\x7a\xe4\xf8\x1e\x98\x76\xcf\xfc\xd9\xc3\x0f\xfa\x58\xc2\x50\x11\x2e\x3e\x8c\x69\x7e\x19\x9f\x4e\x59\x86\x2a\x1f\x81\x74\xb8\x13\x8b\x60\x21\x64\xf0\xb0\xf3\xfc\x16\x2a\x62\xb5\x23\x3f\x7e\xfd\x53\x8f\x1c\x97\xc7\x45\xb8\x88\xd9\x67\xf2\x35\x9a\x7e\xb9\x32\x63\x3c\xb1\x0e\x14\xb5\x14\x9a\x7e\x36\x6d\x46\x33\xa9\x98\x40\xf5\x5b\x4b\x32\xa3\x0b\x46\x94\x34\x5a\x2b\x4b\x92\x81\x35\x6b\x93\x7b\x0a\xa8\x22\x6e\x2a\x21\x09\x9c\xa4\x34\xd3\xa5\x2d\x31\xb4\x56\x0d\xf8\x9a\x59\xb6\xa9\x70\xee\xdf\x09\x17\xd6\x67\x64\xbd\x55\x66\xcd\x21\xa5\x11\x17\x49\x4b\x12\xcd\xa8\x98\xfa\x3c\xea\x49\xae\xf3\x8c\xed\x70\xb7\xd4\x3c\x03\x77\x5c\x34\x4a\xb7\xfd\x9e\x8b\xaa\xe7\x7e\xbd\x2d\x68\xca\xb5\x0b\xfa\xb7\x81\x7c\x7a\x79\x6a\x56\x21\xe3\xe3\x5c\xcb\x4c\x9d\xc6\x6c\xc1\x92\x53\xc5\xa7\x03\x9a\x45\x33\xae\x59\x64\x86\x75\x4a\x53\x3e\x88\xa4\x30\x2b\x0e\x08\x02\xf3\xf8\xd7\x50\x04\x73\x60\xba\xba\x03\xd7\xb8\xe6\xa0\x77\x1b\xc2\x9e\xd4\x00\xd6\xda\x18\x6b\xd8\x70\x56\x07\x8a\xf6\x94\x47\x18\x2d\x18\x2f\x4e\x5b\x19\xac\x83\xe5\x6d\xce\x63\x8e\x2c\xd2\x74\x54\x6d\xc3\x1c\x3b\x8c\xd2\x80\x53\x59\xa2\x94\x73\x1a\x23\x29\xa5\x62\xf9\xe0\x9b\xdf\x4c\x29\x00\xb2\x47\xcb\x41\x84\xf5\xed\x07\x54\xc4\xe6\xdf\x98\x8f\x12\x2d\x5b\x99\xc3\x9c\x37\x22\x04\x1f\xae\x2e\x1e\xe7\x48\xe4\xbc\x85\x53\x6f\xe5\xb5\x9a\x42\x14\x8a\xaa\x10\xb2\xa3\xb3\x9c\x39\xa6\x59\x16\x50\xb9\x72\xad\xfe\x7f\xd6\x67\xe2\x91\xb9\x76\x89\x54\xdb\x3d\x1d\x81\xec\x58\xb3\xbf\x6f\x8a\x37\xaa\x35\xf1\x4d\x63\x16\x06\xca\x65\xcf\x97\x86\xe1\x14\x14\x60\x30\x9b\x7d\xb4\xb5\xf6\x90\xf3\xd1\x9b\x8e\x0c\xd6\xe2\x03\x45\x5e\x29\xd9\xad\x40\x15\xfa\x4b\xa9\xd2\x16\x0e\x4a\x33\xa5\x09\x5d\x50\x9e\x80\x45\x5d\x8e\x15\xcb\x16\x58\xf2\xc8\xc2\xe2\xd1\xaa\x9e\x65\xab\x1a\xa0\x18\xf5\x48\x9a\x8f\x1b\xc3\xea\xaa\x6c\x1b\x00\x68\x43\x95\xde\x6f\xec\x75\x2b\x7a\x0f\xaa\x97\x1b\x7f\x36\x5f\xd8\x53\x8d\x31\xfb\xef\x2f\x8c\x66\x7a\xcc\xe8\xff\xcf\xde\xf9\xec\x38\xed\x03\x71\xfc\xbe\x4f\xe1\x5b\x2f\xdd\xdf\x3b\xfc\xb6\x2d\xa8\x12\x02\x04\x2d\x12\xc7\xd0\x8c\xba\xd1\xa6\x71\x15\x3b\xea\x01\xf1\xee\xc8\x9e\x71\x6c\x37\xfe\xc7\x06\x50\x57\xec\x6d\xb7\x71\x92\xb1\x33\xb6\xbf\xf9\x64\x3c\x96\xbb\x26\x35\xef\x4e\x5c\xda\x3b\xcf\x00\x17\xeb\xd0\x17\x60\x47\x2e\x95\xc4\x1a\xb4\xef\xa3\x26\xc5\x04\x34\xa3\xa3\xfd\x69\x8f\xb6\xb5\xdc\xf5\x95\x5e\xf7\xc2\xbb\x5f\xac\xa6\x7f\xe2\xb4\x9e\xa4\x8e\xc9\x93\x24\x96\xc6\x14\x10\xbc\x03\x7a\x76\xf8\x05\x42\x8f\x40\x7f\xa7\xca\x27\x10\x22\x99\x1a\xc2\x0f\xe1\xc3\xd2\xd8\x95\xaf\x3e\x87\x9d\xcc\x31\x5c\x3f\xa1\x04\x74\x0d\xb2\x6a\x5a\xd3\x95\xb1\x29\xc6\x56\xca\x8d\xae\xc9\x0a\xf6\x50\x89\x94\x40\xb8\xce\x88\x25\x78\x87\x46\xf3\x0e\xee\x2f\xbc\xaf\xd9\xaa\x3a\x41\xbb\xaa\x04\xd0\xb5\xdc\xe5\x6a\xf8\x8c\x16\xe2\xb7\x9a\x1c\x66\x5f\x11\x93\x11\xfe\x18\x27\x22\xdf\xb0\xaf\x58\x68\xe0\xd2\x20\xc8\x5d\x3f\xc0\x92\xbd\x51\xb3\xd7\x92\xed\xbb\xa7\x8e\x5f\xe6\xd9\x2a\x93\x5f\x2e\xfc\x30\x2b\xca\xdc\xa2\x53\xe4\x51\x42\x18\x0f\xf8\x8c\xe6\x3e\xd3\x22\x1a\xf0\x23\xa8\xd1\x9f\x6c\xc6\xa2\xc6\x22\xf5\xe7\x04\x41\xa9\x17\xc5\x9e\x1f\x7b\x10\x98\x73\x25\x98\xd0\xaf\x14\x39\xbf\x85\x8e\x56\xbc\x65\xcd\xdb\x86\xce\x32\x96\x9a\x79\xed\x68\x8f\xd0\xf3\xa6\x9b\x9d\xdb\xa0\xd4\x48\x47\xe1\x39\x86\x46\xe0\x53\xcc\xc2\x30\x74\x72\x66\x3d\xa7\x2c\x8a\x92\x14\x1d\x35\xb5\x5b\x7d\xfe\x12\x6f\xec\xe8\xdc\x97\x9b\x9f\xf2\x58\x6a\x2e\x90\xca\xf6\x99\x2c\x84\x7a\xc5\x4f\xaf\xf8\xe9\x25\xe1\xa7\xac\xc7\xa7\x90\xd3\xcb\x80\x4d\xd9\x2a\xa6\x00\xd3\x4d\xa2\xa5\xa2\x1a\x25\x71\xd2\xcd\x82\xa4\x6c\xd5\x0a\xe1\xd1\xbf\x83\x8d\xb2\x2d\x96\x40\x45\x37\x08\x89\x4a\x04\x19\xd4\x25\x32\x71\xeb\x14\x76\x85\xa2\xdd\x30\x71\xbc\x9c\x09\xa9\x71\xe5\xcc\x73\xd5\xa2\x12\x70\x59\xdb\x16\x64\x5c\xb9\xf6\x22\xc1\x48\xdb\x09\x4e\x8c\x65\xeb\xcd\xc7\x4f\x9b\xd5\xff\xbb\xcd\xfa\x5a\xdf\x85\x5a\x3a\xa3\xc4\xd2\x0c\xe2\xde\x51\x62\x91\x02\x6a\x40\x8e\x1c\x52\x3e\x10\x39\x34\x0c\x4d\xe8\xac\xf9\xba\x70\xd6\x2c\x37\x6b\xfe\xc8\xf7\xce\xd2\xee\xa9\x7a\xa7\xf6\x16\x8c\x18\x53\xba\xe7\x91\xb7\xb5\x30\xb1\xa6\xdb\xf5\xb8\x7a\xa9\xe9\x0e\xed\x50\x2b\x71\xb1\xdf\x6f\xd7\xe2\x3f\xc6\x1e\xe0\x50\x0d\x42\x53\x98\x9a\x77\x0b\xc9\x3e\xbc\x7f\xf7\x55\xc7\x50\xeb\x12\xcb\x31\xd9\x87\xce\x20\xdb\x54\x98\x04\x57\x62\x16\x32\xf6\x00\x28\x54\xf4\x9d\x0f\xd5\x59\x8d\x62\x02\x77\x59\x90\x5a\x8b\x3c\x42\x7b\x56\x23\xe6\x13\x30\x9b\xfb\x53\x5d\xd8\xee\x61\x6e\x42\x1e\x8f\x20\x71\xa5\x53\x2a\xaa\x31\xd9\x6a\x19\xe2\x3a\x83\xb5\x7a\xaf\x8f\xf4\x36\x7e\xa9\x04\x11\xab\xa0\xb5\x99\xe7\x9b\xe7\x33\x71\xc4\x11\x81\x1b\x38\x3c\xeb\xff\x26\x36\x2b\x63\x2d\xc7\xc0\x20\x92\x46\x16\xd3\xd4\x78\x18\x50\x38\x67\xfd\x84\x65\xc0\x75\x23\x7b\x37\x1e\xa3\xa8\x1d\x93\xcb\x6c\xd1\x1b\x5e\xd4\xde\xee\x92\x14\x6d\xe7\xff\x36\x7c\x1b\xf7\x17\xb5\xf6\x12\x91\x61\xdf\x7f\xdc\xdd\xfd\x0c\x00\x00\xff\xff\x4b\x58\xaa\x42\xfc\xbb\x0a\x00") -func olmManifests0200CrdsYamlBytes() ([]byte, error) { +func olmManifests0212CrdsYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0200CrdsYaml, - "olm-manifests/0.20.0-crds.yaml", + _olmManifests0212CrdsYaml, + "olm-manifests/0.21.2-crds.yaml", ) } -func olmManifests0200CrdsYaml() (*asset, error) { - bytes, err := olmManifests0200CrdsYamlBytes() +func olmManifests0212CrdsYaml() (*asset, error) { + bytes, err := olmManifests0212CrdsYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.20.0-crds.yaml", size: 686927, mode: os.FileMode(420), modTime: time.Unix(1655230541, 0)} + info := bindataFileInfo{name: "olm-manifests/0.21.2-crds.yaml", size: 703484, mode: os.FileMode(420), modTime: time.Unix(1661216762, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0200OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xeb\x6f\xe3\xb8\x11\xff\xee\xbf\x62\x60\x14\x48\x5b\x9c\xfc\xc8\x6b\x13\x01\x07\x5c\x9a\xdb\xbb\x3d\x74\x93\x18\x71\xb6\x5f\x8a\xa2\xa0\xa4\xb1\xcc\x86\x0f\x1d\x49\xd9\xeb\x2b\xfa\xbf\x17\x14\xf5\x16\xed\x3c\x36\xdb\xed\x87\xe3\x17\xdb\xe4\x0c\x67\x38\x1c\xcd\xe3\x27\x07\x41\x30\x22\x19\xfd\x1b\x2a\x4d\xa5\x08\x61\x33\x1f\x3d\x52\x91\x84\x70\x4b\x38\xea\x8c\xc4\x38\xe2\x68\x48\x42\x0c\x09\x47\x00\x82\x70\x0c\x41\x32\x3e\x7a\x1d\x63\x86\x8a\x18\xa9\x74\xc1\xee\xe8\x97\xa8\x36\x34\xc6\xab\x38\x96\xb9\x30\xfd\x3d\xbd\xc2\x83\x6a\x9f\x40\x3b\x66\x52\x32\x3b\x9a\x42\xba\x5f\x4b\x15\x91\x78\x42\x72\xb3\x96\x8a\xfe\x46\x0c\x95\x62\xf2\x78\xa1\x27\x54\x4e\x6b\xfd\xaf\x59\xae\x0d\xaa\x7b\xc9\x7c\x27\xd0\x3b\x6d\x90\x87\xb1\x14\x46\x49\xc6\x50\x85\xb5\x2e\x8c\xae\x30\xde\xc5\x0c\x03\x4e\x04\x49\x51\x8d\x54\xce\x50\x87\xa3\x00\x48\x46\x7f\x56\x32\xcf\x74\x08\x7f\x1f\xff\x79\xfc\x8f\x11\x80\x42\x2d\x73\x15\x63\x6b\x6a\x83\x2a\xaa\x7f\x06\x20\xa4\xb8\x2f\x89\x3e\xdd\x7f\xdc\x4b\xf7\x45\x27\xfc\x0b\x15\x09\x15\xe9\x53\x66\x8e\x1c\x59\x60\x4d\xaa\x24\xc3\x7b\x5c\x59\xca\xea\x58\x07\xa4\x8e\x00\x86\x66\x7d\x95\x31\x75\x1e\xfd\x0b\x63\x53\xd8\xd3\xeb\x39\x6f\xe2\x20\xb5\x87\x4e\x62\xa9\x50\xda\x0f\xde\x58\xee\xee\xe3\xcd\xb5\x14\x2b\xea\x33\x58\xec\x0e\x38\xd8\x91\x64\x99\x6e\x76\xf8\x11\x33\x26\x77\x1c\x85\x79\xc2\xe6\x43\x55\x01\x18\x89\x90\x69\x4b\x6f\x6d\x9f\xf5\x18\x74\x86\xb1\x5d\xd3\x46\x11\x83\xe9\xce\xd1\x99\x5d\x86\x21\xdc\x4b\xc6\xa8\x48\x3f\x65\x09\x31\x58\x78\x5f\xc6\x68\x4c\x74\x08\x73\xcb\x81\x0c\x63\x23\x95\xe3\xe0\xc4\xc4\xeb\x8f\x2d\x51\x3e\x61\x00\x06\x79\xc6\x88\xc1\x92\xa9\x75\x18\x3b\x58\x87\xdf\xbf\x03\x40\xa5\x72\xf1\xbd\x73\x9b\xb7\xcf\xb8\x4a\x3b\xac\xef\x10\x2a\x50\xb5\x64\x05\x7e\x73\x56\x23\x96\x9c\x13\x91\x84\xad\xa9\x00\xa6\x11\x15\x53\x67\xe5\x5a\x65\x95\xea\x2e\x51\x10\xd4\x57\xd2\x99\xff\xc3\x1f\xef\x16\xef\xef\xaf\x1e\xee\xee\xff\x79\x7b\x75\xf3\x7e\xb9\xb8\xba\x7e\xff\xa7\x1e\xe7\x56\x51\x83\x4b\x43\x4c\xae\xed\xd9\x3a\xab\xe3\x71\xeb\x27\xe5\x24\xc5\x10\x7e\xcd\xc9\xce\x3e\xb5\xf5\xf1\x57\x8a\x70\xdc\x4a\xf5\x68\xd5\xfc\x41\xaf\xc9\xf1\xd9\x79\x38\x3b\x7b\x97\x90\xd3\xe4\xe4\xec\xe4\x74\x75\x39\xbf\xbc\xc0\xcb\x24\x79\x17\xcf\x30\x3e\xbb\x9c\xcf\x4f\x66\xe7\xc7\xa7\x31\x9e\x9c\x1d\x47\xd1\xfc\x1d\x39\xbe\x8c\x92\x79\x74\x71\x3c\x5f\x45\xe7\xd1\xec\xf8\xf8\x34\x8a\xce\xfa\x72\x17\x39\x63\x0b\xc9\x68\xbc\x0b\xe1\x97\xd5\xad\x34\x0b\x85\x1a\x6b\x6b\xdb\x91\x49\x65\x3a\x76\xb1\x27\xa8\xaf\x61\x21\x95\x09\xe1\x62\x76\x31\xeb\x50\x54\x1e\xce\xd1\x28\x1a\xeb\xd6\x1a\xa3\x1b\x14\xa8\xf5\x42\xc9\x08\xbb\xdb\xae\x8d\xc9\x7e\x46\x13\xf6\x76\xca\x88\x59\x87\x30\x5d\x23\x61\x66\xfd\x5b\x7f\x71\x9f\x7c\x1d\xaf\xd1\x6a\xf0\xe1\xe1\x61\xd1\x5a\x52\x48\x12\xfa\x0d\xe5\x1b\x54\x9c\x8a\x22\x62\xde\xa0\xd6\xf6\x0a\x4a\xf3\xff\x44\x18\x8b\x48\xfc\xf8\x20\x3f\xca\x54\xdf\x89\xf7\x4a\x75\xdc\x18\xc5\xa6\xeb\x9d\xce\xc2\x43\x4f\xec\x28\xb2\x21\x2c\xc7\x9f\x94\xe4\xfd\x53\xad\x28\xb2\xa4\x8c\xeb\x9e\x95\x45\x71\xe8\xea\x29\x9f\xf8\x9f\x03\x8f\x06\x43\xe1\x7b\x9f\xcb\x26\x23\x76\x98\x14\xfe\x9a\xa3\xee\xbb\x1c\x40\x9c\xe5\x21\xcc\x67\xbc\x37\xcd\x91\x4b\xb5\x0b\x61\x7e\x3e\xbb\xa1\xe5\x9a\x90\x09\x2e\x3b\x31\xce\x8e\xc7\x3c\x42\x25\xd0\x60\x91\x1d\xa5\x0e\x81\x51\x91\x7f\xfe\x92\x00\x1e\x13\x43\x98\x4c\x5f\x16\xc4\x07\x4c\x5f\x3b\x90\x7b\xb4\x7c\x45\x30\xf7\xec\xf2\xb5\x03\xba\x57\x64\xc5\xb6\x2f\xa8\x97\x4c\x07\x03\xfb\x51\x13\xd8\x8f\x3a\x0b\xdd\x8c\x10\x40\x10\x17\xe9\x9f\x93\xcc\x16\x1f\xa8\x7e\xb1\x41\xf3\xfb\x03\xb1\xba\xa6\x6f\x8e\xad\x30\xa5\xda\xa8\x5d\x68\x0d\xae\x4d\x77\xff\xdc\x50\x16\x14\xa1\xb8\x33\xff\x8d\xd2\xc1\xef\x69\xe8\xf7\x34\xf4\x44\x1a\x7a\xdb\xa8\x7d\xf1\x25\x41\x7b\xd8\x68\x3c\xbb\x31\x1a\x86\x72\x92\xa6\x0a\x53\x62\xd0\x36\x3d\x01\x26\xd4\xf4\x62\xf7\xfe\xfd\x1a\x56\x23\x03\x92\x70\x2a\x42\x18\x1b\x95\xe3\xf8\x25\x8c\x56\x64\xcd\xe7\xef\x24\x7d\xcd\xca\xb0\xb9\xd4\x79\xa4\x63\x45\x33\x2b\x49\x77\x1b\xc8\x58\x21\x31\x38\xfe\x0e\xc6\x79\x91\x50\xec\xb7\xcc\x66\x0d\xfb\x25\x41\x86\x06\x8b\x56\xf4\x15\x52\xcb\x76\xa8\x8c\xf1\x1b\x77\x0b\xda\xee\x5b\x06\xe4\x92\xd6\xce\x50\xa1\x0d\x61\x2c\x63\xc4\x51\x1c\xd0\xb8\x51\xea\xeb\x5e\xf8\x86\xe2\xf6\x5b\x5e\xf8\x0b\xf8\xac\xaa\x6f\xe2\x28\x6f\x77\x65\xdf\x41\x2d\x32\x2d\x94\xe8\x5e\x62\x8a\xc6\x92\x30\xaa\x8b\xcf\x6d\xe1\x71\x03\x3f\xcb\x48\xfc\x48\x52\xd4\x93\xe7\x69\x5f\x92\x73\x22\xe8\xca\x46\x1e\xe7\xcb\xdd\xb9\x29\x8d\xa5\x78\x9e\x2e\x2f\xc3\x05\xca\xd5\x42\x79\x8f\x6f\xa5\x4c\x46\x84\x05\x0d\xfc\xd5\xad\x0b\x3b\xa8\xd8\xdb\x49\x6d\x17\x5b\x7d\x91\x8c\xd7\x65\xa6\x21\x2a\x45\x53\xc3\x76\xa5\xb7\x07\x2f\x81\x47\x08\xcb\xd6\xa4\x07\x2f\x95\xe8\x4c\xc9\xea\x51\xaf\xba\xdf\xa2\x90\x7a\xaa\x52\x96\x8c\x4f\x36\x35\x2e\x38\x9b\x1c\xcf\x26\xb3\xfa\x04\x09\xd5\x19\x23\x3b\x57\x62\x2e\xdc\xb6\xb0\xac\xf6\x4d\xb0\xf6\xcc\x10\xee\x31\x73\xa5\x84\x06\x22\x6a\x0b\x56\xba\x80\x59\x13\x03\x54\x03\xd9\x10\xca\x48\xc4\x10\x56\x4a\x72\x20\x90\xda\xfa\x00\xae\xdd\x73\xb0\x2c\xbc\x0e\xb6\x6b\x1a\xaf\x61\x4b\x19\x2b\x3c\x91\x6d\x10\x8c\x04\xe2\x37\xc0\x64\x04\xc0\xa9\xf8\x6b\x1e\x61\x6d\xcd\xf9\x64\x3e\x9f\xd8\x0c\xfd\x88\xbb\xad\x54\x89\x75\xc8\xa3\xbe\xcf\x1e\x7d\x07\x47\x92\x71\xfb\x51\x59\xec\xc8\x7a\x30\x27\xb4\x5d\x29\x57\x35\xf2\x3d\x26\xf0\x81\xb8\x4a\x09\x39\xa1\xac\xb8\x34\xa1\xd7\x74\x65\x1a\x6f\xf8\x41\x61\xb2\x26\xc6\x5e\xdf\x08\x20\x53\x72\x43\x13\x2c\xd3\x6c\x7f\x1f\x46\xc5\x63\x47\xc4\xc0\xc2\x00\xb9\x62\x61\x51\xa8\xe8\x70\x3a\x4d\xa9\x59\xe7\x51\xe1\x1a\xbe\xb2\x71\x2f\xc4\x37\x35\x0a\x71\xca\x89\x35\xde\x34\x7b\x4c\xa7\xe5\x79\x83\xda\x45\xca\xa8\x73\x23\x13\x2c\x35\x72\x5d\xd1\xdd\x56\xdc\x76\x3a\x52\x9d\x67\xb6\x04\xc2\x24\x04\x1b\x17\x5b\xa4\x4b\x2a\x52\x86\xcf\xa5\xbe\xc9\x99\xa1\xcf\x25\xbe\x62\xac\x79\x8a\xf6\xd0\x96\x27\x70\x96\xae\x1b\x3c\x48\x9a\xae\x12\x7a\x6d\x54\x19\x95\x17\xb6\x42\xd3\x45\x44\xae\x56\x82\x57\xb6\x58\x00\x65\x96\xa8\x7e\xb6\x03\x6f\xaf\xa2\xde\x83\xe9\x3e\x51\xfd\x05\x50\xa2\xb5\x24\x8e\x51\x6b\x85\x36\x47\xb5\xcb\x6d\x17\x7e\xfb\xd5\x7b\x51\x8d\xf4\x26\x53\x34\x4f\xe9\xd9\x03\xd0\xbc\x3a\x15\xbd\x81\xeb\xc4\x0e\xea\xd1\x15\x68\x7f\xdb\xcc\xd0\x99\x28\x52\xc4\x33\x74\xf2\xa6\xad\x67\xe8\xd9\xc9\xb5\xff\x23\x5d\x0f\xe7\xda\xa7\x95\xee\x07\xad\x57\xab\xdd\x3c\x08\x2d\x37\xf7\xe7\x0b\x37\xda\x8f\x0a\x40\x1f\x34\xa9\x86\x1f\x3c\x69\x1d\xab\xbd\xd2\xef\x59\x38\xf9\xfc\x49\xd4\x19\xc1\x21\x2d\xbd\xf5\x65\xae\xd2\xde\x4a\x83\xcc\x1c\xb7\xd5\x1b\x74\x34\xe0\x47\x6a\xaa\x51\x60\x2d\xfe\xa3\xf7\x61\x9b\x7a\xb7\x1e\x7c\x53\x8d\x3e\x8c\xf3\x2c\x11\x43\x0b\xc3\xab\xb1\x9d\x6a\xf8\x5b\xbb\x6a\xec\x6b\xf1\xba\x54\x3e\x9c\xc8\x8d\xc3\xfe\xd2\xf0\x0f\x00\xa3\x8a\xbd\x80\x8d\x06\xb9\xa7\x4f\x15\x6c\xbe\x3f\xf5\x4d\x07\x1a\xe3\x5c\x61\x60\x03\xbf\x67\x7d\x7c\x76\x7a\x7a\x32\xf6\x32\x96\x55\xa2\x0f\x5b\xad\x88\xba\x78\x94\x1b\xdf\x0a\xa9\x69\x49\x6f\xe3\x35\x57\x6c\x4b\x76\x7a\x40\xe7\xc1\x6b\xc0\x87\xd9\x58\xf3\x0c\xa8\x0e\xa0\x33\x6e\xec\xc1\x48\xdc\x68\x63\x1e\x4b\x2f\xc5\x41\x2c\xa5\xd1\x7f\x8f\x76\x87\xc0\x9b\xff\x03\xf5\x5e\x8f\xed\x54\xc7\xf3\xe6\xf8\x6a\xd1\x8f\xf3\xb8\xb1\x07\xed\x71\xa3\xc2\x7c\xce\x1a\xcc\xa7\x65\x14\xfb\x10\x51\xb3\xbb\x96\xc2\xe0\x67\xaf\xe5\x54\x2e\xae\xf4\x27\x8d\xca\x8a\x98\xf5\x81\x2e\x80\x8d\x64\x39\xc7\x1b\x1b\x7f\xbc\x8e\xe7\xa2\x84\xe1\xd9\x6a\xe8\xad\x00\xdc\xf2\xb9\xb7\x1e\x53\xc3\xb3\x91\x6f\xef\xbd\xa1\xc7\xbf\x29\xf2\xcc\xec\x7e\xa4\x2a\x84\x7f\xff\xa7\x28\xe0\x4d\x71\xc4\x10\x8a\xf6\xc9\x35\xa5\xdd\x06\xa7\x78\xc5\x5e\x86\xd2\x04\x57\x54\x50\xd3\x14\x80\x72\x2b\x30\xa9\x9a\xb5\xd4\xbd\x87\x3f\x98\xc7\x4b\x85\x36\xad\xbf\x57\xb8\x19\xd7\xb7\x95\x65\xfd\x4d\x99\xc3\x2b\x18\xae\x1d\x4b\xfb\xf9\xdd\xd7\x78\xf5\xf8\x3b\xdd\xd7\x55\x9f\xa8\xe8\xb5\x6a\x0f\x83\x14\x85\x55\x1b\x13\xd7\x76\xe1\x67\xaa\x0d\x15\x69\xb7\xef\xb2\x9d\x5b\x02\x66\x8d\x54\x81\x7b\x1b\x7f\xd3\x14\x75\x4d\xfd\x70\xbb\x37\x09\xf8\x22\xce\xab\x1a\xdd\xb6\x56\x07\xfe\xed\xb2\xce\x23\x2a\x83\xe6\x3d\xc4\x9e\x3e\xdc\xd9\xe0\xa1\xa8\x54\x52\x95\xc5\xa3\xbd\xa1\xbd\xd8\xb0\x7a\xb1\xd1\xbc\x46\xe8\xdc\xc6\xb5\xe4\x3c\x17\xd4\xec\xea\x26\xd7\x9a\x28\xcb\x23\x46\xf5\xda\x3e\x33\xd5\xf4\x87\x3c\x72\x35\xbd\x83\x00\x97\x9d\xfa\xa9\x7a\x57\xb1\x90\x55\xcf\x62\x5b\x18\x83\x6a\x43\x58\x08\xe7\x33\x3e\xfa\x6f\x00\x00\x00\xff\xff\xef\xf0\x09\xa9\x41\x24\x00\x00") +var _olmManifests0212OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdd\x6f\xe3\xb8\x11\x7f\xf7\x5f\x31\x30\x0a\xa4\x2d\x56\xfe\xdc\x64\x53\x01\x07\x5c\x9a\xdb\xbb\x3d\x74\x93\x18\x71\xb6\x2f\x45\x51\x50\xd2\x58\x66\xc3\x0f\x1d\x49\xd9\xeb\x2b\xfa\xbf\x17\x14\xf5\x6d\xda\x49\xbc\xd9\xee\x3d\x1c\x5f\x6c\x93\x33\x9c\xe1\x70\x34\x1f\x3f\x39\x08\x82\x01\xc9\xe8\xdf\x51\x69\x2a\x45\x08\x9b\xe9\xe0\x91\x8a\x24\x84\x5b\xc2\x51\x67\x24\xc6\x01\x47\x43\x12\x62\x48\x38\x00\x10\x84\x63\x08\x92\xf1\xc1\x69\x8c\x19\x2a\x62\xa4\xd2\x05\xbb\xa3\x5f\xa2\xda\xd0\x18\xaf\xe2\x58\xe6\xc2\xf4\xf7\xf4\x0a\x0f\xaa\x7d\x02\xed\x98\x49\xc9\xec\x68\x0a\xe9\x7e\x2d\x55\x44\xe2\x11\xc9\xcd\x5a\x2a\xfa\x2b\x31\x54\x8a\xd1\xe3\xa5\x1e\x51\x39\xae\xf5\xbf\x66\xb9\x36\xa8\xee\x25\xf3\x9d\x40\xef\xb4\x41\x1e\xc6\x52\x18\x25\x19\x43\x15\xd6\xba\x30\xba\xc2\x78\x17\x33\x0c\x38\x11\x24\x45\x35\x50\x39\x43\x1d\x0e\x02\x20\x19\xfd\x49\xc9\x3c\xd3\x21\xfc\x63\xf8\xe7\xe1\x3f\x07\x00\x0a\xb5\xcc\x55\x8c\xad\xa9\x0d\xaa\xa8\xfe\x19\x80\x90\xe2\xbe\x24\xfa\x74\xff\xf1\x20\xdd\x17\x9d\xf0\xaf\x54\x24\x54\xa4\x4f\x99\x39\x72\x64\x81\x35\xa9\x92\x0c\xef\x71\x65\x29\xab\x63\x1d\x91\x3a\x00\xd8\x37\xeb\x49\xc6\xd4\x79\xf4\x6f\x8c\x4d\x61\x4f\xaf\xe7\xbc\x8a\x83\xd4\x1e\x3a\x8a\xa5\x42\x69\x3f\x78\x63\xb9\xbb\x8f\x37\xd7\x52\xac\xa8\xcf\x60\xb1\x3b\xe0\xde\x8e\x24\xcb\x74\xb3\xc3\x0f\x98\x31\xb9\xe3\x28\xcc\x13\x36\xdf\x57\x15\x80\x91\x08\x99\xb6\xf4\xd6\xf6\x59\x8f\x41\x67\x18\xdb\x35\x6d\x14\x31\x98\xee\x1c\x9d\xd9\x65\x18\xc2\xbd\x64\x8c\x8a\xf4\x53\x96\x10\x83\x85\xf7\x65\x8c\xc6\x44\x87\x30\xb5\x1c\xc8\x30\x36\x52\x39\x0e\x4e\x4c\xbc\xfe\xd8\x12\xe5\x13\x06\x60\x90\x67\x8c\x18\x2c\x99\x5a\x87\xb1\x83\x75\xf8\xfd\x3b\x00\x54\x2a\x17\xdf\x3b\xb7\x79\xfb\x8c\xab\xb4\xc3\xfa\x0e\xa1\x02\x55\x4b\x56\xe0\x37\x67\x35\x62\xc9\x39\x11\x49\xd8\x9a\x0a\x60\x1c\x51\x31\x76\x56\xae\x55\x56\xa9\xee\x12\x05\x41\x7d\x25\x9d\xf9\x3f\xfc\xf1\x6e\xf1\xfe\xfe\xea\xe1\xee\xfe\x5f\xb7\x57\x37\xef\x97\x8b\xab\xeb\xf7\x7f\xea\x71\x6e\x15\x35\xb8\x34\xc4\xe4\xda\x9e\xad\xb3\x3a\x1c\xb6\x7e\x52\x4e\x52\x0c\xe1\x97\x9c\xec\xec\x53\x5b\x1f\x7f\xa5\x08\xc7\xad\x54\x8f\x56\xcd\xef\xf5\x9a\xcc\xce\x2f\xc2\xf9\x2c\x89\xde\xcd\x67\xef\xde\x5e\x5e\xcc\xa3\xc9\x65\x8c\xab\xd9\xfc\x5d\x32\x99\xcd\xa7\x6f\xc9\x5f\x92\xcb\xf8\x72\xf6\x0e\x93\xd9\x6a\x3e\x5f\x4d\xa2\xc9\x64\x7a\x71\x91\x24\xf3\x68\x72\x7e\x4e\x56\x17\xf3\x28\x9a\x4f\xfb\x72\x17\x39\x63\x0b\xc9\x68\xbc\x0b\xe1\xe7\xd5\xad\x34\x0b\x85\x1a\x6b\x6b\xdb\x91\x49\x65\x3a\x76\xb1\x27\xa8\xaf\x61\x21\x95\x09\xe1\x72\x72\x39\xe9\x50\x54\x1e\xce\xd1\x28\x1a\xeb\xd6\x1a\xa3\x1b\x14\xa8\xf5\x42\xc9\x08\xbb\xdb\xae\x8d\xc9\x7e\x42\x13\xf6\x76\xca\x88\x59\x87\x30\x5e\x23\x61\x66\xfd\x6b\x7f\xf1\x90\x7c\x1d\xaf\xd1\x6a\xf0\xe1\xe1\x61\xd1\x5a\x52\x48\x12\xfa\x0d\xe5\x1b\x54\x9c\x8a\x22\x62\xde\xa0\xd6\xf6\x0a\x4a\xf3\xff\x48\x18\x8b\x48\xfc\xf8\x20\x3f\xca\x54\xdf\x89\xf7\x4a\x75\xdc\x18\xc5\xa6\xeb\x9d\xce\xc2\xfb\x9e\xd8\x51\x64\x43\x58\x8e\x3f\x2a\xc9\xfb\xa7\x5a\x51\x64\x49\x19\xd7\x3d\x2b\x8b\xe2\xd0\xd5\x53\x3e\xf2\x3f\x07\x1e\x0d\xf6\x85\x1f\x7c\x2e\x9b\x8c\xd8\x61\x52\xf8\x4b\x8e\xba\xef\x72\x00\x71\x96\x87\x30\x9d\xf0\xde\x34\x47\x2e\xd5\x2e\x84\xe9\xc5\xe4\x86\x96\x6b\x42\x26\xb8\xec\xc4\x38\x3b\x1e\xf3\x08\x95\x40\x83\x45\x76\x94\x3a\x04\x46\x45\xfe\xf9\x4b\x02\x78\x4c\x0c\x61\x32\x7d\x59\x10\xdf\x63\xfa\xda\x81\xdc\xa3\xe5\x09\xc1\xdc\xb3\xcb\xd7\x0e\xe8\x5e\x91\x15\xdb\xa1\xa0\x5e\x32\x1d\x0d\xec\x67\xad\xc8\x7e\xd6\x59\xe9\xa6\x04\x1b\xc8\xe3\xa2\x00\xe0\x24\xb3\xe5\x07\xaa\x9f\x6d\xd8\xfc\xee\x48\xb4\xae\xe9\x9b\x83\x2b\x4c\xa9\x36\x6a\x17\x5a\x93\x6b\xd3\x13\x90\x1b\xca\x82\x22\x1a\x77\x16\xbe\x51\x46\xf8\x3d\x13\xfd\x9e\x89\x9e\xc8\x44\xaf\x1b\xb8\x2f\xbf\x24\x6e\xef\xf7\x1a\xcf\xee\x8d\xf6\xa3\x39\x49\x53\x85\x29\x31\x68\xfb\x9e\x00\x13\x6a\x7a\xe1\xfb\xf0\x7e\x0d\xab\x91\x01\x49\x38\x15\x21\x0c\x8d\xca\x71\xf8\x12\x46\x2b\xb2\xe6\xf3\x37\x93\xbe\x7e\x65\xbf\xbf\xd4\x79\xa4\x63\x45\x33\x2b\x49\x77\x7b\xc8\x58\x21\x31\x38\x7c\x03\xc3\xbc\xc8\x29\xf6\x5b\x66\x13\x87\xfd\x92\x20\x43\x83\x45\x37\x7a\x82\xd4\xb2\x23\x2a\xc3\xfc\xc6\xdd\x82\xb6\xfb\x96\x31\xb9\xa4\xb5\x33\x54\x68\x43\x18\xcb\x18\x71\x14\x47\x34\x6e\x94\xfa\xba\x17\xbe\xa1\xb8\xfd\x96\x17\xfe\x02\x3e\xab\xea\xab\x38\xca\xeb\x5d\xd9\x1b\xa8\x45\xa6\x85\x12\xdd\x4b\x4c\xd1\x58\x12\x46\x75\xf1\xb9\x2d\x3c\x6e\xcf\xcf\x32\x12\x3f\x92\x14\xf5\xe8\x79\xda\x97\xe4\x9c\x08\xba\xb2\x91\xc7\xf9\x72\x77\x6e\x4c\x63\x29\x9e\xa7\xcb\xcb\xa0\x81\x72\xb5\x50\xde\xe3\x5b\x29\x93\x11\x61\x41\x83\x80\x75\x4b\xc3\x0e\x30\xf6\x7a\x52\xdb\xf5\x56\x5f\x24\xe3\x75\xa5\x69\x88\x4a\xd1\xd4\xc8\x5d\xe9\xed\xc1\x4b\x10\x12\xc2\xb2\x35\xe9\x21\x4c\x25\x40\x53\xb2\x7a\xd4\xab\xee\xb7\xa8\xa4\x9e\x2a\x96\x25\xe3\xa3\x4d\x0d\x0d\x4e\x46\xb3\xe9\x68\x56\x9f\x20\xa1\x3a\x63\x64\xe7\xaa\xcc\x85\xdb\x16\x96\xd5\xbe\x09\xd6\x9e\x19\xc2\x3d\x66\xae\x94\xd0\x40\x44\x6d\xc1\x4a\x17\x30\x6b\x62\x80\x6a\x20\x1b\x42\x19\x89\x18\xc2\x4a\x49\x0e\x04\x52\x5b\x1f\xc0\xb5\x7b\x0e\x96\x85\xd7\xc1\x76\x4d\xe3\x35\x6c\x29\x63\x85\x27\xb2\x0d\x82\x91\x40\xfc\x06\x18\x0d\x00\x38\x15\x7f\xcb\x23\xac\xad\x39\x1d\x4d\xa7\x23\x9b\xa1\x1f\x71\xb7\x95\x2a\xb1\x0e\x79\xd6\xf7\xd9\xb3\x37\x70\x26\x19\xb7\x1f\x95\xc5\xce\xac\x07\x73\x42\xdb\xc5\x72\x55\x26\xdf\x63\x02\x1f\x88\xab\x94\x90\x13\xca\x8a\x4b\x13\x7a\x4d\x57\xa6\xf1\x86\xef\x15\x26\x6b\x62\xec\xf5\x0d\x00\x32\x25\x37\x34\xc1\x32\xcd\xf6\xf7\x61\x54\x3c\x76\x44\xec\x59\x18\x20\x57\x2c\x2c\x0a\x15\x1d\x8e\xc7\x29\x35\xeb\x3c\x2a\x5c\xc3\x57\x36\x1e\x44\xf9\xc6\x46\x21\x8e\x39\xb1\xc6\x1b\x67\x8f\xe9\xb8\x3c\x6f\x50\xbb\x48\x19\x75\x6e\x64\x82\xa5\x46\xae\x31\xba\xdb\x8a\xdb\x4e\x53\xaa\xf3\xcc\x96\x40\x98\x84\x60\xe3\x62\x8b\x74\x49\x45\xca\xf0\xb9\xd4\x37\x39\x33\xf4\xb9\xc4\x57\x8c\x35\x4f\xd1\x01\xda\xf2\x04\xce\xd2\x75\x8f\x07\x49\xd3\x58\x42\xaf\x93\x2a\xa3\xf2\xc2\x56\x68\xba\x88\xc8\xd5\x4a\x70\x62\x97\x05\x50\x66\x89\xea\x67\x3b\xf0\xf6\x2a\xea\x03\xb0\xee\x13\xd5\x5f\x00\x25\x60\x4b\xe2\x18\xb5\x56\x68\x73\x54\xbb\xdc\x76\xe1\xb7\x5f\xbd\x17\xd5\x48\x6f\x32\x45\xf3\x94\x9e\x3d\x0c\xcd\xab\x53\xd1\x1b\xb8\x56\xec\xa8\x1e\x5d\x81\xf6\xb7\xcd\x0c\x9d\x89\x22\x45\x3c\x43\x27\x6f\xda\x7a\x86\x9e\x9d\x5c\xfb\x7f\xd2\xf5\x78\xae\x7d\x5a\xe9\x7e\xd0\x3a\x59\xed\xe6\x41\x68\xb9\xb9\x3f\x5f\xb8\xd1\x7e\x54\x00\xfa\xb8\x49\x35\xfc\xf8\x49\xeb\x58\xed\x95\x7e\xcf\xc2\xc9\xe7\x4f\xa2\xce\x08\x0e\x6c\xe9\xad\x2f\x73\x95\xf6\x56\x1a\x70\x66\xd6\x56\x6f\xaf\xa3\x01\x3f\x58\x53\x8d\x02\x6e\xf1\x1f\xbd\x8f\xdc\xd4\xbb\xf5\x10\x9c\x6a\xf4\x91\x9c\x67\x89\xd8\xb7\x30\x9c\x0c\xef\x54\xc3\xdf\xda\x55\xe3\x50\x8b\xd7\xa5\xf2\x41\x45\x6e\x1c\xf7\x97\x86\x7f\x0f\x33\xaa\xd8\x0b\xe4\x68\x2f\xf7\xf4\xa9\x82\xcd\x77\x6f\x7d\xd3\x81\xc6\x38\x57\x18\xd8\xc0\xef\x59\x1f\x9e\xbf\x7d\x3b\x1f\x7a\x19\xcb\x2a\xd1\x07\xaf\x56\x44\x5d\x44\xca\x8d\x6f\x85\xd4\xb4\xa4\xb7\xf1\x9a\x2b\xb6\x25\x3b\xbd\x47\xe7\xc1\x6b\xc0\x87\xd9\x58\xf3\xec\x51\x1d\x41\x67\xdc\x38\x80\x91\xb8\xd1\xc6\x3c\x96\x5e\x8a\xa3\x58\x4a\xa3\xff\x01\xed\x8e\x81\x37\xbf\x01\xf5\x4e\xc7\x76\xaa\xe3\x79\x73\x7c\xb5\xe8\xc7\x79\xdc\x38\x80\xf6\xb8\x51\x61\x3e\xe7\x0d\xe6\xd3\x32\x8a\x7d\x88\xa8\xd9\x5d\x4b\x61\xf0\xb3\xd7\x72\x2a\x17\x57\xfa\x93\x46\x65\x45\x4c\xfa\x40\x17\xc0\x46\xb2\x9c\xe3\x8d\x8d\x3f\x5e\xc7\x73\x51\xc2\xf0\x6c\xb5\xef\xad\x00\xdc\xf2\xb9\x17\x1f\x63\xc3\xb3\x81\x6f\xef\x83\xa1\xc7\xbf\x29\xf2\xcc\xec\x7e\xa0\x2a\x84\xff\xfc\xb7\x28\xe0\x4d\x71\xc4\x10\x8a\xf6\xc9\x35\xa5\xdd\x06\xa7\x78\xcb\x5e\x86\xd2\x04\x57\x54\x50\xd3\x14\x80\x72\x2b\x30\xa9\x9a\xb5\xd4\xbd\x8a\x3f\x9a\xc7\x4b\x85\x36\xad\x7f\x58\xb8\x19\xd7\xb7\x95\x65\xfd\x4d\x99\xc3\x2b\x18\xae\x1d\x4b\xfb\xf9\xdd\xd7\x78\xf5\xf8\x3b\xdd\xd7\x55\x9f\xa8\xe8\xb5\x6a\x0f\x83\x14\x85\x55\x1b\x13\xd7\x76\xe1\x67\xaa\x0d\x15\x69\xb7\xef\xb2\x9d\x5b\x02\x66\x8d\x54\x81\x7b\x21\x7f\xd3\x14\x75\x4d\xfd\x70\x7b\x30\x09\xf8\x22\xce\x49\x8d\x6e\x5b\xab\x23\x7f\x78\x59\xe7\x11\x95\x41\xf3\x2a\xe2\x40\x1f\xee\x6c\xf0\x50\x54\x2a\xa9\xca\xe2\xc1\xc1\xd0\x5e\x6c\x58\xbd\xdb\x68\xde\x23\x74\x6e\xe3\x5a\x72\x9e\x0b\x6a\x76\x75\x93\x6b\x4d\x94\xe5\x11\xa3\x7a\x6d\x9f\x99\x6a\xfa\x43\x1e\xb9\x9a\xde\x41\x80\xcb\x4e\xfd\x54\xbd\xac\x58\xc8\xaa\x67\xb1\x2d\x8c\x41\xb5\x21\x2c\x84\x8b\x09\x1f\xfc\x2f\x00\x00\xff\xff\x9e\x71\xcf\x50\x44\x24\x00\x00") -func olmManifests0200OlmYamlBytes() ([]byte, error) { +func olmManifests0212OlmYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0200OlmYaml, - "olm-manifests/0.20.0-olm.yaml", + _olmManifests0212OlmYaml, + "olm-manifests/0.21.2-olm.yaml", ) } -func olmManifests0200OlmYaml() (*asset, error) { - bytes, err := olmManifests0200OlmYamlBytes() +func olmManifests0212OlmYaml() (*asset, error) { + bytes, err := olmManifests0212OlmYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.20.0-olm.yaml", size: 9281, mode: os.FileMode(420), modTime: time.Unix(1655230540, 0)} + info := bindataFileInfo{name: "olm-manifests/0.21.2-olm.yaml", size: 9284, mode: os.FileMode(420), modTime: time.Unix(1661216762, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0212CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x77\xe3\xb6\xb5\x28\xfe\x7f\x3f\x05\x96\x9b\xf3\xb3\xdd\x48\xf2\x4c\xd2\x93\xdb\xfa\xb6\xcd\x72\x6d\x27\xf1\x2f\x33\x1e\xad\xb1\x93\xde\xde\x99\x39\x29\x44\x6e\x49\xa8\x49\x80\x05\x40\xd9\xea\xc9\xf9\xee\x77\x61\xe3\x41\x52\x6f\x89\xf4\x8c\xec\x21\xba\x56\x33\x16\x49\x10\xdc\xd8\xd8\xef\x47\xb7\xdb\xfd\x0d\xcd\xd8\xcf\x20\x15\x13\xfc\x94\xd0\x8c\xc1\x83\x06\x6e\xfe\x52\xbd\xbb\x3f\xa8\x1e\x13\x27\x93\x97\xbf\xb9\x63\x3c\x3e\x25\xe7\xb9\xd2\x22\x7d\x0b\x4a\xe4\x32\x82\x0b\x18\x32\xce\x34\x13\xfc\x37\x29\x68\x1a\x53\x4d\x4f\x7f\x43\x08\xe5\x5c\x68\x6a\x7e\x56\xe6\x4f\x42\x22\xc1\xb5\x14\x49\x02\xb2\x3b\x02\xde\xbb\xcb\x07\x30\xc8\x59\x12\x83\xc4\xc9\xfd\xab\x27\x2f\x7a\x7f\xe8\xbd\xf8\x0d\x21\x91\x04\x7c\xfc\x96\xa5\xa0\x34\x4d\xb3\x53\xc2\xf3\x24\xf9\x0d\x21\x9c\xa6\x70\x4a\x22\xaa\x69\x22\x46\x76\x11\xaa\x27\x32\x90\x54\x0b\xa9\x7a\x91\x90\x20\xcc\x7f\xd2\xdf\xa8\x0c\x22\xf3\xf6\x91\x14\x79\x76\x4a\x16\xde\x63\xe7\xf3\x8b\xa4\x1a\x46\x42\x32\xff\x37\x21\x5d\x22\x92\x14\xff\xed\x3e\xde\xbe\xf6\x06\x5f\x8b\xbf\x27\x4c\xe9\x1f\xe7\xaf\xbd\x62\x4a\xe3\xf5\x2c\xc9\x25\x4d\x66\x17\x8c\x97\xd4\x58\x48\x7d\x5d\xbc\xde\xbc\x2e\xa2\x5a\xc9\xc8\x5e\x66\x7c\x94\x27\x54\xce\x3c\xfb\x1b\x42\x54\x24\x32\x38\x25\xf8\x68\x46\x23\x88\x7f\x43\x88\x03\xa1\x9b\xaa\x4b\x68\x1c\xe3\xb6\xd0\xa4\x2f\x19\xd7\x20\xcf\x45\x92\xa7\x3c\xbc\xca\xdc\x13\x83\x8a\x24\xcb\x34\x82\xfe\x76\x0c\x24\x93\xa0\xf5\x14\x41\x42\xc4\x90\xe8\x31\xf8\x77\x87\xa7\x08\xf9\xa7\x12\xbc\x4f\xf5\xf8\x94\xf4\x0c\x84\x7b\x31\x53\x59\x42\xa7\x66\x35\xa5\xbb\xec\x36\x5d\xd8\x6b\xa5\xdf\xf5\xd4\x2c\x5d\x69\xc9\xf8\x68\xd5\x52\xcc\x7d\x9b\xaf\xc1\x82\xe6\x76\x9a\xcd\x2f\x61\xe6\xc7\x4d\xdf\x9f\xe5\x83\x84\xa9\x31\xc8\xcd\x17\x11\x1e\x99\x5b\x43\x7f\xc1\x95\x25\x0b\x29\x4d\xea\x0f\x54\x6f\xee\x30\xcc\xbd\xe0\x6c\x34\xff\x8d\x31\xd5\xfe\x47\x7b\xd3\xe4\x25\x4d\xb2\x31\x7d\xe9\x7e\x54\xd1\x18\x52\x5a\xe0\x83\xc8\x80\x9f\xf5\xaf\x7e\xfe\xfa\x66\xe6\x02\xa9\x42\xa7\x82\xe7\x84\x29\x42\x89\x84\x4c\x28\xa6\x85\x9c\x1a\x68\x9d\xdf\xfc\xac\x3a\xe4\xfc\xed\x85\xea\x10\xca\xe3\x70\xf0\x48\x46\xa3\x3b\x3a\x02\xd5\x9b\x5b\xab\x18\xfc\x13\x22\x5d\xfa\x59\xc2\xbf\x72\x26\x21\x2e\xaf\xc2\x80\xc7\xc3\x64\xe6\x67\x03\xff\xd2\x4f\x99\x34\xef\xd4\xa5\x83\x6c\x47\x89\xca\x55\x7e\x9f\xf9\xc2\x43\x03\x06\x7b\x1f\x89\x0d\x81\x03\x85\x28\xe0\xce\x18\xc4\x0e\x76\x16\x35\x98\x32\xdf\x2f\x41\x01\xb7\x24\xcf\xfc\x4c\xb9\xfb\xa6\x1e\xb9\x01\x69\x1e\x34\xc7\x3d\x4f\x62\x43\x09\x27\x20\x35\x91\x10\x89\x11\x67\xff\x0e\xb3\x29\xa2\x05\xbe\x26\xa1\x1a\x94\x26\x78\x6a\x39\x4d\xc8\x84\x26\x39\x58\x50\xa6\x74\x4a\x24\x98\x79\x49\xce\x4b\x33\xe0\x2d\xaa\x47\x5e\x0b\x09\x84\xf1\xa1\x38\x25\x63\xad\x33\x75\x7a\x72\x32\x62\xda\xd3\xf0\x48\xa4\x69\xce\x99\x9e\x9e\x20\x39\x66\x83\xdc\x90\xc3\x93\x18\x26\x90\x9c\x28\x36\xea\x52\x19\x8d\x99\x86\x48\xe7\x12\x4e\x68\xc6\xba\xb8\x58\x8e\x74\xbc\x97\xc6\xbf\x95\x8e\xea\xab\xc3\x19\xf0\x2d\x44\x66\xe2\xc9\xe6\x4a\x58\x1b\xe2\x69\xb1\xc8\x3e\x6e\xbf\xa5\x00\xa9\xf9\xc9\x40\xe5\xed\xe5\xcd\x2d\xf1\x0b\xb0\x60\xb7\x10\x2e\x6e\x55\x05\xb0\x0d\xa0\x18\x1f\x82\xb4\x77\x0e\xa5\x48\x71\x16\xe0\x71\x26\x18\xd7\xf6\x48\x27\x0c\xb8\x26\x2a\x1f\xa4\x4c\x2b\xc4\x39\x50\xda\xec\x43\x8f\x9c\x23\x0b\x23\x03\x20\x79\x66\x4e\x52\xdc\x23\x57\x9c\x9c\xd3\x14\x92\x73\xaa\xe0\xd1\x41\x6d\x20\xaa\xba\x06\x7c\x9b\x03\xbb\xcc\x81\xe7\x1f\x98\x3b\x63\x84\x78\x0e\xb9\xd1\xcd\xcb\x0e\x25\xb1\x27\x70\x11\x05\x26\x2b\xce\xa2\x19\x34\x8e\x25\xa8\x05\x17\xe6\x0e\xa4\xbd\xd1\xe2\xc9\x58\x28\xb3\x7f\x54\x93\x37\xaf\x5e\x93\x88\x72\x92\x2b\x30\x87\x27\x12\x9c\x1b\x84\xd0\x82\x50\xc3\xcb\xba\xf0\xc0\x14\x22\x90\x84\x11\x53\x5a\x4e\x7b\xe4\x3b\x21\x53\xaa\x4f\xc9\x9f\xfc\x4f\x5d\x9c\x4e\x48\xc2\xb2\xbf\x9c\xfe\x29\x13\x52\xff\x85\xbc\xe1\xc9\xd4\x4c\x1a\x93\xfb\x31\x70\x72\x13\xbe\x8d\xfc\xb9\xf4\xc7\xf7\x32\x8b\x7a\xe4\x6a\xc4\x85\xf4\x77\x1a\xac\xba\x4a\xe9\x08\xc8\x90\x41\x82\x78\xad\x40\xf7\x66\x77\x70\xe5\x2e\x12\x2b\x2e\x0d\xd9\xe8\x35\xcd\xd6\x82\xe6\xdc\xdf\x69\xde\x65\x5e\x5f\x66\xde\xc5\x45\x2d\x10\x95\xcd\x27\x99\x7f\xd2\xe8\x8e\x50\xf7\x96\x94\x66\x5d\x85\xc7\xa6\x04\xa6\xcd\x20\x70\xee\x27\x30\xf0\x2b\x7e\xbe\x72\x94\xab\xb7\xed\x67\x97\xbf\x6c\xeb\x67\x0b\x31\x64\x2d\xd0\x5e\x2f\xe2\x22\x1b\xbc\x63\x24\xb3\xa8\x2f\x62\xfb\xd9\x6b\xdf\xf2\x7d\xf9\x6e\x02\x0f\x99\x50\xa0\x48\xcc\x86\x43\x90\x86\xee\x88\x09\x48\xc9\x62\x50\x64\x28\x24\xee\x57\x26\x62\x3c\x93\x61\xff\x2a\xac\xb6\x2f\xe2\x4d\x37\xc6\xbc\x1a\x19\x86\x45\x46\x87\x86\x4b\x3f\x77\xe1\x69\x27\x6b\x0e\xaf\x19\x5c\xc4\x70\x03\x09\x44\x5a\xc8\xc5\x77\xcc\xc0\xe4\xba\xf4\x80\xa3\xfa\xfe\xaf\xfb\x31\x8b\xc6\x24\xcd\x15\x52\x5d\x2d\x73\xa8\xc0\x45\x0b\x32\x64\x9a\x08\x4e\x28\xbe\xd6\xd0\xfa\xf9\x27\x53\xaa\xa3\xb1\xbb\xe3\x50\x91\x84\x0e\x20\x51\xb3\xf3\x0c\x00\x59\x6e\x9c\x27\x10\x9b\x09\x91\x96\xe0\x9c\x4b\x3e\x61\x0d\x94\x88\x25\x65\x41\xde\x5e\x0d\x33\xb2\x0e\xcb\x2c\xe0\x99\x90\x4c\x4f\xcf\x13\xaa\xd4\x32\x9c\x9e\x83\xee\xd5\x10\xd1\x87\x0d\x19\xc4\x1d\xc2\x78\xcc\x8c\x4a\xa3\xfc\xb7\x1f\xaa\x30\x6f\xcf\xdc\x6b\x18\x5c\xe9\x7e\x0f\x21\x7f\x0f\xb9\x67\x49\x62\x80\x15\xc3\x90\xe6\x09\x12\xc9\x7f\x83\x14\x84\x21\x76\x4a\xc4\x2b\x2e\xfc\xe5\xd5\xc0\x5b\xf1\xad\x5a\x24\x46\x40\x2c\xb4\x97\x35\x5f\x79\x5b\xdc\x4f\xa8\x84\xb2\x74\xee\xd8\x90\xf9\x50\xfc\xdc\xd2\xd4\xab\x97\x47\xa5\xac\xa8\x29\xe5\xc1\x34\xa4\x2b\xf6\x72\x5e\x75\x30\x58\x66\xa4\x8e\x62\xa1\x88\xea\x5a\x53\x83\x75\x28\xe6\xd9\x2b\xa0\x08\xe5\x53\xa2\xa9\x95\x48\xa8\xc3\x5f\xb7\x63\x5a\xb2\x2c\x01\xf2\xa7\x3b\x98\x76\xac\x0c\x08\xc3\x21\x44\xfa\x2f\x24\x57\x5e\x2a\xc2\xfb\xcd\x1f\x41\xc8\xfe\x93\xff\xd7\x5f\x96\x7d\xf1\x46\xf8\xbc\xfe\xec\xdb\x61\x97\xb4\xea\x8e\x19\x08\x5d\xe2\x03\x33\xc8\x69\x21\x60\xe7\x32\xf0\xc1\xcf\xea\x91\xcb\x34\xd3\x53\x92\x02\xe5\xca\x9f\xec\x24\xa9\xdc\xac\x7a\xe4\x6f\x86\x0e\x96\xd0\x98\x26\x89\xb8\x0f\x32\x31\x62\xc8\xb5\xb8\x71\xe7\xbd\x43\xfa\x12\x86\x20\x8b\x5f\x90\x4c\x5e\x8b\xcb\x07\x88\x72\xbd\x94\x02\x94\xe1\xb6\x02\x95\xed\xb8\x83\xe9\x16\x00\xf9\x11\xa6\x9e\x77\xdb\x2f\xbb\x83\xa9\x45\x06\xfc\xa9\xc0\x21\x9a\x65\x09\x03\x2b\x9e\xae\x82\xcc\x1d\x4c\x15\x9e\x6f\xf3\xfc\x9d\x9d\x1d\xcc\xfd\x9d\x02\x4b\x3c\x99\xbd\x34\x12\x92\xfa\xdf\x16\x5f\x23\x91\x0e\x18\xb7\x2f\xb3\x53\xfb\xad\xc0\xd9\x3d\x40\x79\x8c\x7f\xe2\x6b\x9a\x00\x97\x5f\xd4\x16\x30\x7b\xe3\xbf\xa3\x90\xfd\x09\x35\x2b\x3a\x34\x62\x7c\x62\x4f\xfc\x98\x65\x5e\xa5\xc2\xa5\xf7\xc8\xcf\x34\x61\x85\x3e\x6a\x71\xc3\x42\x00\xbf\xea\xf2\x5f\x39\x4d\x7a\xe4\xc2\xd2\x33\xfc\x7a\xf7\x93\xbb\xc9\x00\xf2\x5f\x39\x9b\xd0\xc4\xf0\x6f\x2d\x0c\x85\x8c\x23\x2a\x63\xe4\x30\x4e\x4f\x53\xc2\xee\x1e\x45\x42\x60\xc4\x53\x7f\xda\x8b\x3d\x52\xa8\x23\x92\x8c\x4a\xcd\xa2\x3c\xa1\xd2\xdb\x9e\xa6\x8d\x40\xb4\x40\x9a\x1b\x88\x04\x8f\x57\x9e\xe0\xa5\xd4\xd5\x3d\x5b\x86\x31\xb2\x08\x90\x4c\xc4\x28\xa2\xb0\x14\x66\x91\xf4\xa8\xca\xc6\xc5\xd0\x9f\xea\x70\xc4\x3a\x44\x18\xee\x71\xcf\x94\x53\xe3\x82\xa8\xcc\xac\x28\x7d\x5c\x22\x8f\xe1\x54\xf4\xc8\x5f\xa7\x9e\xd3\x74\x08\xd3\x96\xf7\x68\x23\xd7\x74\xbc\x00\xe0\x50\xd6\x01\xbb\x38\x50\x43\x21\xc1\x88\xb7\x47\xb1\xc0\x67\x60\xc2\x22\x7d\xdc\x23\xff\xd7\x30\x33\xb3\xf1\x1c\x46\x54\xb3\x09\x78\x14\xf7\x8c\x4f\x4b\x30\xaa\x1f\xa1\x8a\xbc\x20\x47\xf8\x18\x61\x69\x0a\x31\xa3\x1a\x92\xe9\x31\x19\x4c\xf1\x35\x6a\xaa\x34\xa4\x9b\x6c\x9d\x51\xea\x47\x15\x3b\xd0\xfc\x18\x3a\x15\x85\x71\xfd\xcd\xef\x57\xdc\x89\x8b\xdd\x62\x67\x7f\x46\xc5\xba\x42\x6a\xac\xae\x3d\xb3\x85\x81\x07\x89\x40\x45\x02\xdd\x60\xca\x9d\x85\x4e\x71\xae\xbc\x65\x63\x00\x81\xcc\x84\x0d\xfe\xa7\xc1\x03\x6a\x14\x0b\xc4\x72\x8b\xb9\x35\x70\x9c\x45\xab\x54\x83\xa5\x1c\x6d\xb9\xe6\x4a\x50\x7b\x1d\x50\x05\xdf\xfc\x7e\x89\x4a\x60\xed\x4e\x66\xcf\xe7\xb5\x5b\xb2\x01\xa3\x2c\x26\x5f\xb6\x59\x6b\x8f\x75\x78\xfd\x4e\x33\x30\xa3\x04\xac\x55\x57\x82\xaa\x40\x79\xd8\xef\xae\xd7\x08\xd1\x80\x4f\x19\x07\x69\x67\x33\xc4\x8f\x71\xa5\x29\xd7\x0c\x29\x5b\xd0\x1d\xbd\x2e\x79\xcf\xf4\x78\x1b\x75\x05\x71\xcd\x11\x1a\x8b\x5c\xce\x3a\x30\x47\x1f\xb6\x56\x2b\xbd\x40\xbb\xde\xce\xd0\xf7\xa2\xaf\x7d\x27\x55\x8a\x8d\x8c\x94\x49\xee\x81\x8d\xc6\xda\xb3\x93\xaa\xb4\x69\x7e\x75\xaf\x60\xff\xc6\xd3\x94\x06\x26\xc0\x34\x72\x80\x01\x18\x00\xaa\x3c\x85\xd8\xd3\x8c\x18\x32\xe0\x31\xf0\x68\x8a\x56\xad\x64\x02\xb2\x47\x7e\x52\x66\xa7\xc8\x0f\x6c\x34\x36\x20\xb4\x2f\x2d\x8b\x4a\x28\x15\x18\x56\x5d\x5d\x01\x33\x92\xbd\x91\x6b\xa4\xd1\x68\x0c\xf8\x8d\x0c\xe4\x67\x80\x78\xe6\x7e\x45\xe2\x1c\x6d\x6d\xb3\x8b\xc8\x0d\x1c\x7a\x28\xc5\x4a\xca\x47\xc1\x90\x10\x54\x02\x7b\xe0\xcd\x27\x8d\x84\xb5\xaa\xa1\xe5\xd7\xd0\x4e\x2d\x0a\x3a\xca\xac\x29\x24\xcc\xc1\xb8\xfe\xfa\x2b\x3b\xaf\x57\x26\x1c\xe9\x11\x84\xce\x7e\x8c\xc1\x1c\x92\x73\x0b\x7c\x28\xeb\x23\x9e\xcc\xbc\xb0\x53\x2d\x7a\x0e\xc9\x31\x4d\x67\x97\x5c\xd0\x74\x49\xf9\x1d\xc4\x24\x81\x07\x16\x89\x91\xa4\xd9\x98\x45\x34\x49\xa6\x78\x4c\x51\x1d\x64\x5a\xa1\x15\x65\x85\xd9\x66\x19\x19\x0f\x2e\x80\xad\xcd\x17\x0a\x22\x09\x7a\xbd\x29\xec\xc6\xde\x57\x30\x65\xc3\x01\x0d\x88\xdd\x04\x16\x47\x1c\xce\x79\x7b\x0f\x8d\x22\x73\x90\x10\x75\x05\xd7\xe0\x04\x90\x12\x2a\xf7\xc8\x15\xb2\xd4\x01\x28\xc4\xf2\x3b\x80\xcc\x62\x5a\xc2\x94\x26\x2a\xa5\x49\xd2\x21\x8a\xf1\x08\x08\xd0\x68\x6c\xc1\xc9\x01\xbc\x42\xad\x25\x03\x2b\x06\x19\x56\x3b\x0d\x7b\x03\x5c\x2f\x16\x6a\x56\xeb\x5d\x2b\x74\xae\xd5\x60\x0c\x34\x65\x3d\x24\x0b\x5a\xe4\x79\xa2\xf3\x39\xa9\xc2\xbd\xb7\xc5\xab\xad\x9d\xf8\x46\x1b\xe1\x63\xb4\x9e\xd6\xfc\x54\xb9\x3d\xf8\x19\xc6\xe2\xde\x5b\x9c\xe7\x0e\xb9\x21\xbc\xca\xef\x6d\xcc\x54\x64\x4e\x3a\xc4\xe4\x5c\x70\x85\xf2\xa9\x75\x3c\xa0\xe3\x60\x42\x13\x8b\x0a\x7e\xe2\x4c\x24\x09\x1e\xf9\xdc\xab\x13\x46\x8e\xe7\x04\xd2\x01\xc4\x31\xc4\xe6\xb3\xec\x52\x96\xb0\xb9\x9a\xa6\x22\xcf\x1f\xfa\x22\x49\x56\x73\xb1\x95\x7a\xe9\x26\x5a\xa9\x07\xc0\x2a\xd9\xa8\xca\xfa\x3c\xc4\x98\x0a\x67\x26\x06\x0d\x32\x65\xdc\x89\x47\x46\xd4\x0d\x80\x1d\x80\xbe\x07\xe0\x24\x1a\x43\x74\x17\x8e\x92\xf3\xdb\xcc\xec\x9a\x73\x1a\x55\x29\x56\xe1\x12\x13\x49\x82\x8a\x86\x02\x20\xcc\xe8\x04\x1c\xee\xfd\x33\x33\x67\xb4\x44\xec\xe9\x84\xb2\x84\x0e\x12\x40\xae\x19\xfe\xea\x54\xfc\x47\x9e\x9f\x67\x79\x92\x18\x21\x96\xc7\x64\xf4\xb6\x7f\x4e\xb4\xa4\xc3\x21\x8b\xcc\xa5\x98\x49\x88\xb4\xb3\x49\x2c\xfb\x84\x55\xe2\xda\xd2\x13\xa1\x34\xd5\xf9\xdc\x1e\xad\xd8\xe0\x55\x1b\x6b\xf4\x10\xb6\xd4\x40\x54\xd9\xca\xb7\x55\x65\xc5\x2c\x03\xac\xb2\x55\x31\xa6\xf6\xc8\xb5\x40\x1d\x81\x6a\xf2\x1a\x94\x61\xbb\x08\xa0\xb7\x40\x95\xe0\x25\xea\x8a\xd2\xaf\x64\x23\xc6\x69\xe2\x3e\x0a\xbd\x3e\x46\x44\x67\x82\x07\xdd\x83\x4e\xcd\xa1\x4c\xd9\x48\x52\x1d\x88\x62\xb1\x6e\xc7\x5d\x1c\x5f\x1c\xe6\x3a\x97\xd0\x23\x67\x7c\x8a\xfb\x3d\x04\x6a\x7e\x30\x33\x6b\x29\xe2\x3c\x32\xf2\x92\x21\xb0\xb9\x2a\x4f\xd2\x28\x19\xad\x40\xed\xe0\xdc\xbf\xc4\x0b\x7a\xca\x1c\x00\xca\x9c\xf1\x54\x70\x20\x54\x65\x46\x8f\xf3\x38\x99\x4b\x34\x62\x07\x00\x23\xb3\x38\xeb\x5f\x11\x1f\x1a\xd2\x23\xdd\x6e\x97\xdc\x9a\x9f\x95\x96\x79\x84\xfc\xc5\x1c\x21\x1e\x3b\x4e\x61\xb1\x0f\x3f\x92\xa2\xd8\x89\x9f\x41\x9c\xe5\xc3\x8a\x60\x19\xd5\x63\xd2\xb3\x80\xef\x95\x40\x41\xc8\x77\x86\xd7\x3c\xd0\x34\x43\xbc\x37\xa4\xfb\x3b\x21\x6e\xec\x0e\xd9\x17\xfe\x37\x39\x39\x99\x45\x08\x31\x30\xf2\xa9\xb3\x1e\x22\x5e\x0c\x85\x38\x54\xd5\xef\xe9\x99\x07\x7f\xe4\xe2\x9e\x2f\x7a\x35\xbe\x8b\x4a\x38\x25\xef\x0f\xce\xfc\xd1\x7b\x7f\xd0\x21\xef\x0f\xfa\x52\x8c\x8c\xcc\xca\xf8\xc8\xfc\x60\x30\xea\xfd\xc1\x05\x8c\x24\x8d\x21\x7e\x7f\x60\xa6\xfd\x32\x33\xea\xd5\x6b\x90\x23\xf8\x11\xa6\x7f\xc6\xc9\xc2\xcf\x9e\x1d\xfc\x39\x35\xd7\xf1\x77\xc3\x7f\x0d\x93\xfa\x73\x4a\xb3\xf0\xc3\x6b\x9a\x85\x87\xcf\x0b\x24\x7b\xf7\x21\x05\x4d\x27\x2f\x7b\xc5\x76\xfe\xe3\x9f\x4a\xf0\xd3\xf7\x07\xc5\xfa\x3b\x22\x35\x68\x91\xe9\xe9\xfb\x03\x52\x79\xeb\xe9\xfb\x03\x7c\xaf\xff\xdd\x2f\xf2\xf4\xfd\x81\x79\x93\xf9\x59\x0a\x2d\x06\xf9\xf0\xf4\xfd\xc1\x60\xaa\x41\x75\x5e\x76\x24\x64\x1d\x23\x2d\xfd\xb9\x78\xc3\xfb\x83\x7f\x90\xf7\xdc\x2c\x16\x15\x41\xbb\x93\x8a\xfc\xcf\xc1\x0a\x7e\xbe\x82\xe8\xaf\x56\xde\x8c\x76\x96\x50\xa5\x6f\x25\xe5\x8a\xf9\x30\x89\xa5\xb7\xa6\xf6\xb0\x2f\xbd\x2e\x91\x00\x2c\xbd\x6c\xb1\x61\xe9\xe5\x25\xac\x73\x13\xb6\x35\xff\x0d\x1b\x9a\x9c\xe7\x1f\xf4\xf2\x8c\xb9\x52\x18\x69\xc2\xfe\x18\x06\xe0\xee\x36\x07\xd1\x08\xf1\xe6\x7c\x3b\xe2\x66\xc4\x45\x8e\xfb\xd6\x73\x87\x37\x68\xf7\xc1\xc5\x99\xf3\x18\x64\x32\x35\xe2\x44\x31\x6b\x34\x36\xd2\x7e\xdc\x23\xd6\x68\x40\x83\x89\xe6\xce\x1c\x24\x64\x4d\xbc\x64\xb9\xc6\x75\x85\x19\x0d\xe1\xb0\x07\xde\x4d\x83\x5c\x2e\x8a\x20\xd3\xc8\xe6\x76\xf7\xa4\x90\x92\x45\xc5\x88\x55\x5d\xbd\x1c\x3d\x1c\x72\x6c\x08\x78\x77\xb7\x73\x4a\xe7\x29\x35\x7c\x83\xc6\x66\xbd\xc5\x35\xab\xbb\x59\x5d\xcb\xd2\x53\x3a\x10\xb9\xb3\xed\x86\x7d\x70\xa0\x76\x5c\x04\xa5\xb2\x4c\x4f\xd7\x9a\x4b\x36\xfa\xf8\x94\x3e\xbc\x02\x3e\xd2\xe3\x53\xf2\xf5\x57\xff\xeb\x9b\x3f\x2c\xb9\xd1\x12\x46\x88\xbf\x07\xee\x0c\x41\x1b\x82\x61\xfe\xc1\x59\x8b\x61\x11\xc9\x34\x2a\xee\x09\x16\xee\x02\x83\xee\x29\xfa\x29\x1d\xaf\xcc\x33\x03\x17\x43\xe5\xad\xa1\x21\x82\x8e\x91\x90\x16\x4e\xc6\x02\x01\x4f\xa6\xe4\xe5\x57\x1d\x32\x70\x20\x9e\x27\xdf\xef\x1e\x3e\xf4\x16\x2c\x99\x29\xf2\xc7\xce\xcc\x7a\x98\x22\x66\xab\xc4\x10\x11\xc7\xea\x97\x12\x2c\x1b\xf4\x96\x80\x79\x36\x08\x61\xbd\xeb\x36\x6e\x9d\x31\x70\x33\x43\x60\xca\x38\x4b\xf3\xf4\x94\xbc\x58\x72\x8b\x25\x69\x1b\xee\xa6\xbd\xb9\x90\x02\xa8\x21\x5d\x23\x49\x53\x23\xef\x44\x84\xc5\xc0\x35\x1b\x32\x90\x65\xd4\x46\x5d\xdf\x3e\xe8\x5d\xad\x01\x8a\xe8\x85\x35\x74\xa8\x84\xec\x7d\x2b\xe4\x48\xe4\xc0\xce\x75\x13\x95\x09\xd4\x34\x03\x7b\x1a\xac\xf6\x42\xe0\x21\xb3\x72\x6a\xc9\x07\x91\x02\xe5\x8c\x8f\xbc\x77\xd7\x1b\x92\x2d\xd7\xbd\x1f\x03\xb2\x9e\x60\xa4\xb4\xc6\xfe\xc8\x68\x4a\x31\x2a\x4d\x94\x8c\x72\x2a\x29\xd7\x46\x87\x3d\xeb\x5f\x59\x01\x7d\xd6\xa0\x49\x8b\x90\x1f\x7f\x1a\xed\x51\xb5\xc4\xca\x2c\xd1\x85\x09\xe1\x89\x6d\xee\xa8\xbe\x7c\xf1\xd5\xca\x2d\x0f\xf7\x2d\xf7\xdf\x51\xad\x41\xf2\x53\xf2\x5f\xef\xce\xba\xff\x97\x76\xff\xfd\xe1\xc8\xfd\xe3\x45\xf7\x8f\xbf\x74\x4e\x3f\xfc\xae\xf4\xe7\x87\xe3\x6f\xbf\x58\x32\xd3\x62\x49\x7e\x09\xfa\x38\x26\xe2\x85\x44\xbf\xa3\x1d\xe4\x30\x62\x48\x6e\x65\x0e\x1d\xf2\x1d\x4d\x14\x74\xc8\x4f\x1c\x59\x43\x4d\xa0\x01\xcf\xd3\x55\x9a\x5e\x97\x1c\x98\xb7\x2e\x16\x3e\xc2\x2d\xb8\xa4\xd5\xf7\xb8\xe5\xae\xd2\x5d\x37\x03\x92\xb7\x33\x94\x28\x4d\x29\xb4\x0c\x63\x91\xcc\x41\x12\x3d\x27\xde\xf6\x22\x91\x9e\x94\x42\xcf\x8c\x5c\xfd\x9a\xf2\x29\x29\xc8\x9a\x15\x4a\x67\x31\x5d\x69\x43\x9b\x68\x24\x85\x52\x21\x76\x4e\x91\x84\xdd\x01\x39\x2b\x94\x46\x43\x2c\x07\x10\x51\x14\xc4\xe5\x80\x69\x49\xad\xc5\xd7\xcb\x95\x85\x39\x69\x98\x27\xe4\xc8\xe8\xaa\x3d\x8c\x97\x98\xa3\xae\xc7\xce\x74\x3b\x60\x09\xd3\x53\xab\x47\x47\x82\x0f\x13\xe6\xe4\xff\x34\x13\x52\x53\xae\x9d\x91\x11\x46\xf0\x40\x58\xe1\xf7\x66\x8a\x1c\xc5\x5c\xbd\x7c\xf9\xd5\xd7\x37\xf9\x20\x16\x29\x65\xfc\xbb\x54\x9f\x1c\x7f\x7b\xf4\xaf\x9c\x26\xe8\xe2\xbd\xa6\x29\x7c\x97\xea\xe3\xe6\xd8\xe2\xcb\x6f\x36\x38\x45\x47\xef\xec\x59\xf9\x70\xf4\xae\xeb\xfe\xf5\x3b\xff\xd3\xf1\xb7\x47\xef\x7b\x2b\xaf\x1f\xff\xce\x7c\x43\xe9\x04\x7e\x78\xd7\x2d\x8e\x5f\xef\xc3\xef\x8e\xbf\x2d\x5d\x3b\x5e\x74\x18\x1f\xba\x77\xf9\x00\x24\x07\x0d\xaa\x6b\xb4\x80\x6e\x4a\xb3\xee\x1d\x4c\x97\x1c\xce\xa5\xe2\xe8\xfc\x44\x16\x62\x29\xcd\x16\xa9\xde\x36\x84\xec\x2d\x60\xd8\x52\xb4\x10\xc9\x6b\xba\x5f\x38\x5d\x22\x92\xd9\x4b\x18\xe4\xbe\x83\xc9\xc9\xf0\x1d\x6b\x66\x5b\x25\x4e\x6f\x80\x2d\x9b\xc9\x8f\x7c\x45\x98\xce\xda\x97\x84\xef\xdc\x79\x06\x7f\xbe\x97\x44\x38\x6f\x3c\x4f\xce\x96\x6a\x5a\x55\x03\xe6\xd5\x85\x15\x7d\x91\xf4\xa0\x38\x37\x16\x46\xcf\xcb\x39\xfb\x57\x0e\xe4\xea\xc2\xd1\xa3\x0e\x61\x3c\x4a\xf2\xd8\x48\x0a\x3f\xfd\x74\x75\x61\x94\xf7\xbf\x3a\x72\x73\x0f\x24\x16\xfc\x50\x93\x37\xd7\xaf\xfe\x8e\x96\x00\xbc\xa3\x63\x19\xba\x75\x46\xd1\x84\xd9\xe0\x68\xcf\x80\xc9\x5f\xc1\xcc\xe5\xde\x1c\xd1\x2c\x18\x4f\x90\xdc\xf1\x98\x8c\x21\xc9\x8c\x00\x71\x07\x44\xe5\xd2\xad\xce\x4c\x6c\xdd\xbd\x06\xd6\xc4\x39\x83\x47\xa0\x11\xc9\x13\x0c\xf2\xdd\x05\x68\x2e\xec\x94\x09\x7e\x63\xa4\xc0\x47\x38\x1f\x06\x91\xdf\x38\x99\x15\xdf\xb1\xc3\x61\x58\x11\x6b\xbb\xf6\x0b\x89\x3b\x4c\xe7\xf6\x4b\x1f\xfd\x24\xcd\x7d\xef\x4e\x6f\xb4\xc6\x4c\x74\x6b\xbe\x5d\x63\x7c\x9e\x8b\xe1\xaa\xaa\xce\x33\x29\x0f\x68\x58\x0d\x9e\xd1\x31\x55\x64\x00\xc0\xd1\x96\x6b\x4d\x7f\xc0\x1d\xd6\x41\x61\x85\xcd\xb3\xae\x16\xdd\x78\xf1\xe6\xad\x81\xdc\x7a\xa8\xad\xd0\x5c\x2b\xdf\x76\xb6\xb5\xa2\x7a\x3f\x9e\x2e\x82\x81\xb2\xb6\x4c\x8c\x1a\xf2\x32\xc8\xb6\x1f\xb6\x5c\x31\x99\x31\xe9\xa2\x66\xe1\x8c\x1a\x4e\xcf\x98\x5f\x92\xd1\x1e\x2b\x96\x0d\x2d\xd0\x95\x57\xb5\xec\x6d\xbf\x46\xbb\xcd\x37\x20\x27\x6c\x27\xe6\xb7\xee\x60\x46\x36\xc8\xe4\xec\xf1\x8f\x95\x11\xbd\x76\x7e\x09\x9a\xfe\x22\xb1\xc6\x77\xb3\x62\x02\x65\x21\xb8\x2a\x98\x75\x9b\x39\xb6\x65\x96\x96\x9a\x9c\x62\x60\xb1\xff\x49\x0b\x89\xfe\xf6\xf2\x6f\xf9\x20\x08\xca\xc5\xec\x4e\x07\x22\xff\xfd\x3f\xbf\xf9\xcd\x93\x4c\x97\x4c\x72\xa5\x41\x3a\xf0\xf9\x5c\xc1\x8f\x97\x36\x69\x5f\xef\xce\x90\x83\x1c\x5e\x2f\xa5\x4f\x2e\xba\x67\x3e\x8d\x72\xe1\x87\xe0\x2d\x0b\xd3\x29\xd5\xa4\xfc\x6f\x77\x63\x91\x58\xb9\x68\xb6\xc7\x4c\xb0\xac\x24\x67\xdc\xfc\x5c\xc2\xde\x8f\x93\x55\x39\xe3\x58\x5c\xbd\x84\x49\x69\x9f\xca\xaf\xff\x79\xee\xf7\x4d\x5f\xef\x3f\x9f\x9a\x37\x97\xa2\x59\x04\xc7\x84\xaf\x84\xfa\xd4\xd8\xc5\x0b\x5a\x70\x8b\x5d\xd1\xdb\xf9\x0b\xeb\xd3\x2b\x9d\xee\x9a\x8d\xa9\x9a\x07\x71\x7f\xe6\xd7\x05\xd3\x35\x9b\x54\xb9\x08\xfb\xad\x78\x6d\x29\x48\x70\xab\xe1\xde\x19\xb9\xf7\x1f\x0b\x9f\xb9\xc9\x20\xfa\x47\x9b\x60\xd9\x26\x58\xb6\x09\x96\x7b\x9a\x60\xb9\xfe\xdc\x9b\x33\x4c\x62\x88\x12\xea\xd3\x5c\x34\x24\x09\x66\x3b\x8e\xc5\x7d\x08\xbd\x4c\x92\x72\xa8\x66\x11\xf8\x95\x52\x8e\xe1\x0c\x59\x66\x6d\xe3\x94\x8c\xd8\x04\x78\x88\x44\xd9\x74\xf1\xab\x13\x3e\x17\x33\x28\x7f\xd5\x2d\x70\xe6\xca\xca\x5c\xd0\x59\x19\x68\x05\xd4\xce\x8a\x7b\x9d\x8d\x20\xe7\xd6\xe5\x9f\x4b\x88\x31\xe7\xc1\x22\x79\x4a\x33\x94\xf2\x30\x9e\x42\x8f\x31\x4c\x35\x20\x38\xa6\xdb\xa0\xc3\x0d\x9d\x4e\x53\x62\xc4\x38\x24\x08\x5a\x08\x17\x95\x63\x9e\x45\xc2\x20\x41\x4b\x06\x93\xb2\x81\x34\x38\xa2\xb6\xd7\x09\x36\xcf\x16\x5b\x29\x12\xd3\x8c\x39\xd9\x25\x0e\x82\xe5\x06\xd0\xeb\x5f\x39\x7c\x2b\xc4\x51\xe5\xf0\x0d\x14\x26\x29\x38\xf9\x20\xc8\xb5\xf8\x26\x87\x58\x31\xc1\xbc\x0b\x8b\x19\x06\x6c\x65\x24\x1c\xa0\x65\x46\x52\x6e\x2e\x2c\x44\xee\x47\xc8\x42\x14\xf7\x7c\x79\x74\x40\xb3\xf9\x5d\x65\xd8\x85\x9f\xcd\x02\x27\x98\xc8\xe9\x55\x67\x2d\xf0\xb4\x5a\x0d\x1a\x61\xe7\x6e\x89\xc9\x84\x51\x42\x47\x23\x89\xa1\xb2\x4b\x23\x0d\x36\xcc\xd1\x5a\x17\x1a\x41\xf0\x30\xa2\x24\xbf\xf2\x0e\x43\x06\x57\xde\xb0\xd4\x42\xeb\x6f\x98\x17\x16\xab\x63\xb3\x6c\x32\x8a\x66\x34\x0f\x5a\x21\xd7\x24\xae\xac\xdf\x5b\x3b\xd6\xec\xb0\x1d\xd5\x7d\x9e\x59\x88\xbb\x3a\x30\xe7\xa3\x20\xcd\x86\x1c\x44\x85\x37\xdb\xb9\x49\x32\x90\x46\x1f\xb7\xc1\xc4\x94\x44\x56\x7e\x0b\x84\xc7\x7b\x87\xd7\x2c\x67\xa3\xfd\xb7\x63\x13\x2c\xb0\xa3\x8b\xf1\x54\x6b\x6e\xdb\x6c\xab\xec\x58\x93\xb1\x3d\x3b\x36\xcc\x5f\x72\x73\xaf\xce\xe8\xae\x35\xb7\x01\x43\xe3\x93\x6e\x90\x90\x63\x47\xd5\xbc\x45\xef\x5f\x97\x23\x49\x24\xbd\x27\xc0\x23\x61\x88\xc5\xff\x7f\xf3\xe6\xda\x27\xaf\x5d\x69\xc2\xd2\x2c\x81\x14\xe3\x2a\x5e\x53\xa9\xc6\x34\x01\x89\xdc\xe9\x27\x9e\x56\xfe\x9e\x89\xff\x8e\x21\xa1\x53\x3b\x59\x0c\x91\x40\x4b\xbc\x90\x24\x33\x02\x6e\x9a\xe5\x98\xbf\x81\x57\xf1\xbd\x6b\x33\x74\x76\x00\x4d\x61\xa2\x1a\x4c\x17\x5a\x40\xab\xe3\xa1\x1b\x6f\x4a\x03\xca\x8b\x59\x4f\x09\xec\xd8\x88\x1e\x94\x27\x5e\xfb\x95\x21\x3d\xa6\xbf\xc2\xc6\x56\x9e\x71\xcb\x44\xb0\xaf\xbf\x5a\x71\x67\x0c\x59\x22\xa6\x06\x2f\xd6\x9f\x95\x0d\xbf\x67\xe3\x73\xbd\xe9\x7c\x9b\x9e\xe5\x0d\xe7\xb3\xc6\xa9\x26\x66\x5a\xa4\x40\xed\x34\xd1\x2a\xf7\xdf\x56\x13\x2d\xb0\x3f\x2e\x9f\xed\x51\x98\x5f\xff\xca\x5b\x1b\x82\xd7\xd7\xd2\xa6\x1f\x83\xdf\xb8\x24\x48\x4f\x33\x47\x69\x8c\x2c\x38\xcb\xee\x3e\x0d\x97\x5b\x23\xcf\xf8\xdb\xd6\x48\x35\xfe\xb6\x75\xb2\x8d\x1d\xdb\xb0\xcd\xf5\x48\x67\xc7\x56\x34\x76\x3d\x02\xee\x30\xe9\x64\xb5\x37\x79\x87\x79\x8d\x4e\xbc\x07\x12\xde\x4d\x65\x19\x15\xf9\xce\x25\x1c\x1a\xe1\x0d\xab\xb1\x0c\x12\x11\xdd\x39\xbb\xe5\xdb\x8b\x90\xdb\xe7\xab\x0f\xb9\xcc\x3e\xc2\xd6\x61\x70\x2b\xd2\xb5\x22\x5d\x2b\xd2\x3d\x15\x91\xce\xfa\x07\xf6\x81\x52\xcd\x2c\x64\x29\xad\xb2\xb1\x97\x2d\xb5\x5a\x31\x5a\x6a\x85\xa3\xa5\x56\x6b\xc6\x93\xa3\x56\x1b\xc9\x69\x1b\xc4\x10\xae\x3e\xc8\xad\x31\xb5\x35\xa6\xb6\xc6\x54\x37\x5a\x5e\xe6\x46\xcb\xcb\x5a\x5e\xd6\x1a\x53\x57\x4d\xd9\x1a\x53\xb7\x9c\xa8\x35\xa6\xb6\xc6\xd4\xd6\x98\xda\x1a\x53\xd7\x7d\x4c\x2b\xd2\xb5\x22\x5d\x2b\xd2\x6d\xba\x98\xd6\x98\xda\x1a\x53\x57\x8d\x96\x5a\x95\x46\x4b\xad\x56\x8c\xe7\x4d\xad\xea\x1b\x53\xa3\x04\x28\x5f\xac\x54\xcd\xc4\x7f\xe3\x7d\xa1\x7e\xbd\x2b\xd2\xe9\x7e\x1d\xc0\x98\x4e\x98\xc8\x65\x51\x28\xe9\xfc\xe6\x67\x32\x02\xad\x0c\x16\x80\x86\x45\x82\x79\xcd\x64\x63\xe0\x74\x90\x2c\x9c\x78\x1d\x29\x71\x4f\xae\x36\x1e\x0f\x84\x30\x5f\x37\x0f\x31\x54\x75\xbc\xa6\xb3\x4d\x3c\xf3\xc1\xb2\x1c\xbb\xc5\x41\xcd\xe7\x6f\x2f\x9a\x0a\x65\x26\xef\xb9\xaf\x90\x6d\xb8\x83\xad\xc2\x8b\x65\x03\x5d\xa1\xbf\x37\xf7\x1c\x62\x4c\x72\xf3\x35\xcb\xcd\xa1\x67\x11\xd3\xc9\x34\xbc\xb8\xb7\xa8\xec\xc8\xd3\x09\x89\x3e\x7f\x7b\xb1\xb9\xf9\xde\x6f\xc0\xc7\xb0\xd4\xb7\x76\xf8\xd6\x0e\x1f\x46\x2b\x06\xed\x38\x69\x2b\x06\xad\x18\xcf\x5b\x0c\xda\x77\xbb\x75\x6b\x6d\x26\xad\xb5\x79\xf5\x6d\xad\xb5\xb9\xb5\x36\xb7\xf6\x9b\x25\xa3\x15\x5c\x70\xb4\x82\xcb\x9a\xf1\xe4\x04\x97\xd6\xda\xdc\x52\xab\x96\x5a\xb5\xd4\xea\x69\x50\xab\xa7\x18\xba\xdb\x1a\xfd\x5a\xa3\x5f\x6b\xf4\x6b\xb9\x51\xcb\x8d\xd6\x8c\x27\xc7\x8d\x5a\xa3\xdf\xb6\x13\xb5\x46\xbf\x85\xa3\x35\xfa\xad\x19\xad\xd1\xaf\x35\xfa\x2d\x19\xad\xe0\xb2\xe3\xa4\xad\xe0\xb2\x62\x3c\x6f\xc1\xa5\x35\xfa\xb5\xd4\xaa\xa5\x56\x2d\xb5\x7a\x1a\xd4\xaa\xbe\xd1\x6f\xcd\x49\x5a\xfd\xec\xea\x93\xb2\xf2\x59\x16\xad\x7a\xe1\xce\x0d\xdd\x6b\x35\x80\x1d\x50\x05\xdf\xfc\x7e\xae\x6e\x79\xf9\x96\x14\x62\x46\xf5\xee\xfd\x59\x8b\x57\x2c\xdf\xb3\x0d\xf6\x3e\x2c\x63\xc7\x59\x5c\x61\xe5\xb5\x41\xb1\x66\x6b\xe3\x2b\x7b\x73\x68\x32\x3f\xd3\x97\xb3\xe0\x3c\x7c\x49\x01\xfa\xa0\x34\xde\x8f\xc1\x37\xb4\x71\xa5\xa7\x43\xbb\x78\xa6\x42\xf4\xf2\xc2\xfe\x49\x35\xc3\x91\xfd\x7b\x16\x5c\x5e\xb7\x69\x8b\xaa\x6f\x2f\x04\x96\x07\xd0\x85\xb5\x5e\x5f\x84\x14\xe0\x59\x88\x65\x54\x1a\x0a\xe9\xad\xdc\xc8\xb4\x4b\x77\xcf\xc0\x7b\x75\x37\xa9\x95\x9c\x7a\x3d\x87\xee\x96\x32\x95\x97\x59\xd6\x37\x61\xcc\xae\x07\x46\x1f\x64\xca\x94\x5a\x16\x70\x5d\x5d\xfa\x3a\xb2\xb9\x01\xb9\x5c\x02\x7f\xff\x45\xa5\xe5\x04\xf1\xc9\xb6\xff\x19\xd0\x88\xc8\x3c\x71\x4d\x40\x5d\xf9\x6b\x42\xa3\x48\xe4\x5c\x13\x0e\x10\x5b\xcb\xc6\x22\x5c\xdd\x80\xd8\x6e\x20\x3f\x6d\x2a\x3d\x75\xed\x3a\xd7\xde\xe5\xbe\xe1\xcc\x7e\xc2\xc2\x82\xea\xe5\xb1\xb9\xb4\x85\xaf\x5f\xcf\xb5\xb6\x61\x85\x1b\x33\xc2\xca\xfe\xf6\x45\xc2\xa2\xe9\xdb\x3c\x01\xd7\x22\xae\xd4\x41\xdf\x4a\xbb\x65\x11\x39\xc3\xbb\x71\xf5\xb6\x37\x65\x2c\xc0\x76\x92\x76\x85\x01\x2a\x8f\xfb\x2e\x55\xb6\xb5\x83\x79\x88\xd0\x2c\x4b\x30\x95\x42\x18\xa1\xc5\x36\xe8\x0f\xfd\xf5\x16\xdd\xb6\xb9\xf4\xb2\x91\x78\x4d\xb6\x12\xb1\x89\xb7\x59\x0d\xd6\xa1\x0a\xd9\x52\xd6\x26\xb6\x44\xfc\xf7\x52\xe4\xd9\x86\xb7\xcf\x5b\x16\xed\xd3\xbe\xfb\x56\xb9\x81\x8d\xbf\xe8\x5c\x46\xbe\x63\xb0\x6d\xd2\xe5\x4c\xa2\xb6\x1b\x78\x9a\x27\x9a\x65\x89\x6d\xf3\x3d\xb2\x13\x52\x09\x05\xdf\xe8\x10\xca\xa7\xde\x03\xe5\xda\x44\x40\x4c\xe8\xc8\xcc\xa8\x7d\xf3\x58\xdb\x5f\x22\x4f\xc1\x9c\xe6\xb8\xd4\xd0\xd4\xa8\x53\x7c\x5a\xcc\x4e\xee\x59\x92\x60\xfb\xde\x24\x11\xf7\xcb\xdb\xfa\xcd\x8e\xed\x84\x42\xb2\x9d\x60\x48\xb6\x17\x81\x09\xe1\x82\x7b\xd3\xee\x4f\x6f\x5f\xed\xb6\x89\xd7\xd5\x39\x5c\x2f\x10\xc0\xc6\xd6\x19\x95\x9a\xd1\x84\xe4\x32\x51\x76\x1f\xa9\x51\x02\xa4\x6f\xa6\x32\xa6\xe8\x19\x8c\x40\xd9\xae\x1d\xe4\x77\x76\xe7\x1c\x60\xed\xf9\x14\x3c\x99\x12\x6a\x77\x7e\x98\x27\x49\x87\x0c\x19\xa7\x86\xec\x42\xe6\x33\x61\x8c\xfe\x44\x6e\x18\x8f\xc0\x7c\x53\x37\x08\x16\xb8\x22\x33\xa3\x39\xdf\xe1\x90\xc6\x9d\x52\x47\x67\xec\xc3\x8d\xaf\x30\x07\x36\xc2\xb6\x75\x43\x21\xbd\xc8\xf2\x56\x24\x68\xde\x76\x86\x6f\xd7\xd1\x9e\x96\x2f\xff\x95\x71\x54\x52\xc8\x5b\x64\x1c\x46\xd9\x01\x86\xfd\xa1\xcd\x94\xd8\xa6\xd6\xe0\x4e\x81\x50\x47\x2a\x8f\xc6\xe6\x93\x0e\x32\x11\xab\x03\x43\x46\x0e\x14\x44\x12\xb4\x3a\x38\x36\x7f\xcd\x7e\x03\x7e\x5f\xf9\xb9\x13\x9a\xb1\x83\xe3\x0e\x41\x00\x61\xa3\x13\xa1\xc7\x4f\x17\x0f\xfd\xb7\x56\xfa\x6b\xad\x1b\x33\x5d\xfc\x4a\x33\xb8\xae\x1d\x22\xb3\x4d\x30\x0c\x8d\xd6\x80\x79\x52\x06\x29\x6d\x7f\xce\xd0\x20\x7e\x96\x58\x13\x72\x16\x1a\xe4\x83\xc6\x3e\xe0\xee\x6e\x98\x80\x9c\xea\xb1\xd1\x56\x99\x7a\xfa\x87\x7f\x43\xc7\x52\x31\x16\x02\xdc\x1d\x78\x0f\xdc\x02\xc9\x6d\x67\xa5\x59\xe0\x1e\xfe\xee\xb0\x2c\xf5\x1a\xf1\xa9\xa0\xe6\x4f\x16\x94\xc8\x5e\x77\x02\xe3\xcf\xe6\xc9\x2a\x08\xed\x4f\x96\x5a\x06\xfa\xf1\xea\x95\xed\xa2\xe4\x60\xf5\x23\xe3\xb1\x0a\x95\x8c\xe2\xd0\x2d\xd3\xc0\x7b\x21\x90\x71\x85\x4f\x11\xc0\xf3\xe2\xeb\xa6\x22\xe7\x9a\xe9\x4b\xfa\xcd\x3e\xa8\x24\xd8\x95\xa9\x22\xe5\x18\x3a\xd5\xb1\x2e\x27\xa3\x8b\x24\x74\x00\x89\x6d\xb9\x64\xae\x16\xcb\x27\x67\xaf\x5e\x87\xee\x64\xd8\xed\xf3\x63\x2b\x22\x1b\x38\x4e\xe7\x7a\xbc\xcd\x8f\xcd\x65\x4f\x04\xc5\x76\xc6\x60\x72\x03\xda\x1e\xb3\x94\x66\xe6\x94\xd9\x39\x16\xda\x32\x5f\x21\xa4\xd7\x1f\x96\xad\x64\xf6\xcd\x7b\x32\x2d\x7a\xc9\x46\x47\x65\x33\x8f\xef\x36\x67\x6f\x85\x85\xa3\x18\x15\x30\xcf\x20\xb4\x93\xeb\x9d\x24\x1e\x85\xfe\x7a\x16\x83\x95\x4d\x8c\xb6\x69\xe8\xd2\xff\x5e\x4c\xd1\xf0\x16\x6c\xa3\x34\x19\xbd\x39\x81\x48\x8b\xd5\x65\xdf\xfc\xcd\x1a\xd2\x2c\x59\x77\xf2\xc8\xd6\x0a\x56\xca\xf8\x5b\xa0\xf1\xf4\x06\x22\xc1\xe3\x0d\x09\x6c\x65\x3f\x5e\x33\xce\xd2\x3c\x25\x3c\x4f\x07\x80\x20\x56\x76\x2e\x24\x24\x56\x79\xa5\x84\xc3\x7d\x32\xf5\xad\x82\x49\x26\x62\x4f\x4f\x06\xd8\x11\x39\x9e\x62\x7f\x33\x2c\x90\xca\xa7\x66\x12\xec\x7c\xec\xeb\xe8\x91\x48\x52\x65\xc4\xa2\x0e\x4e\xca\xb4\xe1\x58\x03\x40\xdf\x12\x8b\xc1\xec\x31\x9d\x50\x96\x18\xd1\xba\x47\x2e\x60\x48\xf3\x04\xdb\xf4\x91\x17\xe4\xc8\xbc\xcc\xeb\x53\x8b\x1e\x30\xe2\xae\x12\x46\x13\x57\x2e\xc7\x1d\x17\x74\xbc\x85\xb5\x7c\x93\xfa\x7d\x7e\x6c\x5a\xc7\xcf\x8f\x8c\xe6\x6a\x53\x35\xbc\xb2\x31\x57\xb6\x23\x76\x59\x12\x2d\x91\x74\xa6\xdc\xcc\x9b\xb1\xec\xd5\xb5\x0f\x16\xac\x5a\x8a\x91\x04\xa5\x2e\x80\xc6\x09\xe3\xb0\x3b\x7e\xdd\x8e\x81\xa4\xf4\x01\x71\x0c\x1b\x9a\x33\x5e\xc1\x30\x5a\xfe\x2a\x2d\x6c\xd3\x7c\xff\x7a\x32\x80\x21\xb6\x61\xc4\x0f\x2e\xed\xbe\xc5\x9f\x21\x65\x09\xc4\x3d\x7c\x47\x69\x96\xa2\x7b\xb1\x45\x1c\xf3\x37\xe3\x39\x98\xa7\x32\x29\x50\x99\xb4\x8f\x96\x79\x3c\xf2\x50\x5a\xb4\x13\xf7\x1d\xfb\xfa\x33\xa0\xb8\x7c\x88\xac\x91\xcf\x75\x02\xf7\xb8\xa9\x72\x39\x34\xaa\xa3\xd7\x38\x4b\x0b\x72\xad\x5e\xc9\xb5\xd0\xae\xf1\x5f\xf8\x40\x7c\xda\x35\xa2\x04\xa5\x59\x8a\x07\x2c\xce\xa5\x6f\x8b\x89\x30\xa3\x8b\xb7\xbe\x72\x54\xbe\x79\xf1\x62\x43\xf9\xed\xf1\x91\x5e\x02\x6a\xca\xbb\xe0\xcb\x75\xa0\x43\x9e\xfc\x1b\x15\xd8\xec\x31\x73\x62\x30\xf6\xf7\x04\x89\x7e\x42\xa6\x34\xe3\xa3\x9c\xa9\x31\x19\x80\xbe\x07\xe0\x04\x1e\x6c\x85\x0b\xf2\x6f\x90\x02\x37\xd5\x80\xb7\x70\x11\x54\x80\xf6\x72\x7f\x20\x36\x61\x8a\x09\xfe\x03\x53\x5a\xc8\xe9\x2b\x96\xb2\x35\xa5\x47\xfd\x98\xef\x72\x1c\x20\x28\x92\x18\x7b\x13\xb3\x88\xde\x80\xfd\x60\x09\x68\xc1\xd4\xc2\xaa\xa7\xc4\x9c\x93\x01\x8d\xee\x1e\x0d\xc0\x2f\xf6\x05\xc2\x9e\x5d\xef\x00\x55\x94\xf7\xc2\x04\x48\xb6\x2c\x52\x5e\x3e\x58\xf8\x54\xa0\x7c\x3f\x16\x0a\xf0\x06\x6b\x64\xc4\xc7\xbc\x53\x80\xa9\x40\x30\xcc\xe9\x16\x1c\x14\xa1\xc3\x61\xf5\x8e\xe2\xb0\xa3\xe4\x99\xe6\x4a\x93\x94\xea\x68\x6c\x4d\x59\x22\x0e\xe2\xc4\xa1\x72\x62\xff\x36\x50\xde\xd8\x88\xbc\xbd\xb9\x97\xd8\x75\x5e\x3e\x18\xdd\x72\xad\x37\xa7\x3a\x2a\x20\x9f\x9d\xa6\xaa\x01\x27\xd5\x0d\x71\x72\x5b\x6a\x5b\x04\xdf\xa2\x01\xb8\xf8\x05\x77\xe1\xec\xfa\x62\x73\x53\xcc\x2e\x0a\xee\xd6\x2a\xee\xac\xa9\x7b\xc5\x47\x79\x93\xa9\xbb\x52\xb5\x77\xdb\xd6\xd0\x1d\x42\xc9\x1d\x4c\x6d\x17\xe9\xb9\xb6\xbc\x12\x12\x27\x49\x00\x76\xa7\x35\x37\xb9\x96\xd2\x5b\xac\x77\x6b\xec\xb1\x63\x3b\x57\x84\x1f\x5d\xb3\xd0\x2d\x9f\xf0\x1f\xbd\xc5\x63\xdb\x23\xb8\x1d\x77\x30\xdd\xee\x81\x99\xed\x36\xbb\xe0\x74\x1f\xbb\xef\xe6\x87\x20\xe8\x85\xad\xde\xce\x47\x54\x1e\x5b\x9b\xa8\xfc\xf0\x40\xac\xf5\x79\x01\xfd\xca\x56\x26\xf3\x8d\x87\xca\x22\xa3\x39\xd3\x63\x96\x21\x23\xf2\xce\x00\xdf\xe4\xfc\x67\x9a\xb0\x38\x4c\x61\xcf\xef\x15\xef\x18\xf1\xc9\xfc\x07\x89\xae\x15\xd7\x2e\x04\xa8\x6b\xa1\xf1\x97\x8f\x06\x20\xbb\xcc\x5a\xe0\xb1\x53\x38\x2b\x34\x52\x19\x54\xbc\x4a\xfd\xd1\x55\xcf\x57\xf6\x0a\xa0\x64\x8a\x5c\x71\x22\xa4\x87\x03\x76\xac\xb7\x13\xd9\x29\x90\x4f\x0c\xac\x83\x03\xed\xd3\x0b\xe7\x70\xe0\x13\xb2\x02\xbd\x15\xd3\xb9\xa9\x50\x3e\xb0\x57\x6c\x47\xfc\x04\xa5\x5d\x27\xaa\x52\xef\xe4\x66\x11\x49\x41\x8e\xd0\xe3\x12\x6d\xec\x71\xa8\x6e\xca\x76\x74\xd7\x8e\xad\xa9\x6f\xf9\x85\x5b\x61\x01\xb2\x26\x6b\x02\xaa\xc3\xdc\xec\x0c\x15\x93\xd3\x7f\x1b\x0a\x8e\x7b\xf0\x3f\x24\xa3\x4c\xaa\x1e\x39\x23\x8a\xf1\x51\x02\x95\x6b\x4e\xc3\x28\x4f\x63\x66\x60\x8a\x18\x52\x3b\xa1\x89\xd3\xa5\x28\x27\x60\x6d\x56\x66\xf6\x59\x96\xda\x71\x92\x8a\xa1\x3c\xc1\xd1\x75\x70\x07\xd3\x83\xce\x1c\xd2\x1c\x5c\xf1\x03\xcb\x5b\xe6\xd0\x24\x30\x22\xf4\x91\x1d\xe0\xb5\x83\x26\xb9\xf0\x96\x0c\x67\x57\x3b\x5a\xf5\xa5\x1b\x63\x84\x8f\xed\xd8\x51\x58\xaf\x68\x89\x2e\xa2\x49\x0b\x92\x2b\xb0\xd2\x3a\x9e\x32\x02\x5e\xce\x44\xa9\x12\x15\x53\x0e\xf7\x28\x3d\xee\x8d\xe0\x67\x34\x09\xc6\x47\x3f\x65\x31\xd5\x1b\x05\x95\xda\x51\x81\xc8\xe1\x5b\x3b\x09\xc9\x71\x16\x83\x5b\x43\x36\x22\x19\x95\x34\x55\x3d\xd2\x77\xd5\x0d\x11\xd3\xd8\xb0\x6c\x4b\x74\xb0\xbb\x9d\x66\x40\xfe\x4c\xde\x96\xd7\xd2\x23\xdd\x6e\x97\xdc\xbe\xb9\x78\x73\x4a\xec\x2f\x56\xca\xd6\x82\x0c\x05\x2a\x41\x22\x97\xe6\x55\x13\xe0\xa8\xf8\x1b\xf9\x5e\x70\x78\x33\x34\x27\x84\x6a\x98\x80\x24\xf7\x66\xab\x22\x16\x43\xb0\x5e\xf5\x0e\x1f\x17\x8f\x77\x93\x4c\x52\xfa\x70\x93\xcb\xd1\x16\x1b\x40\xe6\x36\xa1\x6c\xb2\x29\x94\x49\x44\xbd\x72\x76\xae\x8a\xc6\x10\xe7\x09\xc4\x84\x0e\xc4\x04\x2a\x26\xdb\xea\x63\xc8\xd2\x73\xf0\x0f\x1a\x9e\x37\x50\x22\xc9\x75\x50\x56\x8f\xe0\xe1\x94\xfc\x27\xba\xb6\x29\xc9\x40\x46\xc0\x35\x1d\xc1\xac\x19\xc0\xde\xf7\xf2\xc5\x7f\x1c\x3b\x7e\x64\x66\x74\xd6\x93\x17\x06\x23\x5e\xd3\x87\x9f\x78\x61\x1a\x64\x8a\xbc\xe8\x91\xb3\x99\x97\xe1\x73\x49\x94\x27\x68\x6b\x41\x77\x7d\xe9\x95\x83\x29\x91\x22\x47\x87\x3d\xc9\xb3\xaa\x36\xfb\xd5\x7f\xfe\x87\x51\xfa\x68\x9a\x25\x70\xea\x8b\xa2\x5a\xb5\xd9\xc8\x30\x5a\x90\xaf\x5f\xfc\x87\xa5\x9e\xe6\x7c\x16\x5a\x61\x01\x33\x6a\x00\x96\x67\x84\xa5\x36\x14\x13\x92\x69\x51\x5d\x55\x56\xd1\x5f\x69\x2a\xb5\xea\x10\xf4\xea\x07\xe1\x50\x0b\x4d\x93\x19\x2d\x1f\xb5\x70\xb8\xb7\x40\x8a\x05\xc2\x04\xd0\x50\x45\x5e\x7e\xfd\xe2\x3f\xe6\xcd\x29\x6f\x78\x04\xf8\x24\x3e\x81\x61\x16\x03\xa3\xdc\xdf\xb1\x24\x81\xb8\xb3\x76\xf9\xc3\x5c\xea\x31\xc8\x0e\x01\xae\xbc\xb1\xca\xac\x6f\x66\x6d\x38\xbb\xcc\x39\x47\x19\xc1\x5a\x87\xd1\xa2\x55\xb2\x70\xb9\x8f\x35\x8c\x50\x93\x54\x28\xbd\x78\xc9\x9b\x1f\x37\x33\x28\x9f\xbe\x19\x6e\x2b\x0e\x74\x77\x30\x43\xcc\x3f\xbd\x83\x48\xf9\xd0\xbd\x0b\x99\x92\x5d\xc6\x75\x57\xc8\xae\x9d\xe6\x94\x68\x99\xaf\xf7\x1a\x14\x23\xad\x9c\x80\x8f\x40\x06\xf2\xd2\x79\x9b\xdb\xd5\x47\x39\xf9\xbb\x9f\xe7\x58\xdc\xf3\xe5\x94\x03\x09\xa7\xa3\x19\x3b\x9e\xfa\xaa\xc5\x6d\xe6\xd8\x98\xb7\x9b\xbb\xff\xd7\x3c\x76\x6f\x41\x0e\xdc\xd9\x0d\xa7\xdd\xc8\x55\xe8\xf1\xe8\x6c\xf0\xf6\x70\x6c\x2d\xe7\xb3\x36\x27\x73\x83\x7d\xcd\x02\xca\x35\x77\xc2\x17\x50\x20\xbb\x8e\xc2\x21\xa3\x31\xa2\xc0\x9c\x73\xb5\xf4\xa0\x27\x40\x95\x5e\x04\x8a\xf6\xa0\xaf\x1f\xab\x03\xf8\x67\x47\x55\xe8\x34\x12\x12\x82\xbc\xb0\x31\x9e\x5b\x44\x39\x78\x0b\xd6\xc3\x67\x03\xce\x2a\x42\xd4\x41\x38\x12\x66\xff\xaa\xf2\xd5\x63\x85\xcd\x78\x23\xe7\x2e\xa2\xb5\x7b\xb4\x14\xd8\xeb\x4c\xa7\x8e\x78\x05\x8f\xa2\x75\x69\xee\x8d\x14\x9d\x82\xa6\xab\x93\x3c\x66\x47\x95\x68\xdf\x68\xca\x63\x2a\x63\xb7\xca\xc3\x43\x15\xa6\xec\x91\xd7\xe8\x4b\xe3\x43\x71\x4a\xc6\x5a\x67\xea\xf4\xe4\x64\xc4\x74\xef\xee\x0f\xaa\xc7\xc4\x49\x24\xd2\x34\xe7\x4c\x4f\x4f\xd0\x81\xc6\x06\xb9\x16\x52\x9d\xc4\x30\x81\xe4\x44\xb1\x51\x97\xca\x68\xcc\x34\x44\x3a\x97\x70\x42\x33\xd6\x2d\x64\x66\xd5\x4b\xe3\xdf\xfa\x17\x3d\xb2\x60\x5c\x39\x43\x68\x5d\x92\x13\xe8\xe6\xfc\x8e\x8b\x7b\xde\x45\x4d\x56\x6d\x75\x9a\x36\x8b\x62\xf0\x63\x06\xde\xdb\x04\x2e\x64\x22\x7e\xf4\x4d\x30\x1f\xd3\xa5\x3c\xee\x5a\xa7\xe3\x23\xef\xc5\x2e\xb6\xdd\x6e\x11\x18\xb0\x49\xc4\xb9\x1d\xbb\x69\x43\x34\xd2\x6c\x02\x3b\x39\xb1\xfd\xa8\x6c\xf7\x1b\x1f\x30\x1a\xe7\xd2\xee\x78\xc9\x9b\xed\x7d\x33\x29\x9d\xa2\xac\x83\xef\x26\xc2\xb2\x72\x2e\x62\x70\x96\xcf\x09\xaa\xf6\x37\x86\x99\xdf\x1a\x51\xd8\xf9\xb8\xd1\xee\x3b\x55\x1a\x52\x4b\x9c\xec\xf3\xc9\x94\x68\x39\xb5\x8e\x71\x79\x67\x94\x4f\xe7\xb9\x36\x12\xff\x1d\xde\xa7\x94\x88\x18\x8a\x3e\x05\x5c\xbd\xdc\xe5\x6d\x78\x94\x64\x42\x31\x7c\xb7\xe3\x79\xdb\x59\xe6\x76\x67\x97\x25\x37\xdd\x37\xbf\xdf\x66\xeb\x86\xd8\x46\x61\x4b\x2b\x7b\x35\x82\x62\x58\x8e\xf0\x77\xdb\x73\xa8\xbc\xe2\x6a\xc4\x92\x48\x70\xa5\x25\x65\xcb\x73\x98\x16\x8f\x1d\x5d\x21\xbb\xfb\x1b\x08\x62\xd0\xd9\x4e\x40\x21\xf3\x31\x58\x9e\x29\x22\x5a\x7a\x50\x97\x01\x63\x53\x9c\x7c\x2c\xa1\x21\x5c\x3b\x9a\x56\x77\x80\x11\xa9\x05\x27\xfb\x34\x0c\x41\x4a\x88\x2f\x50\xfa\xbc\x09\xdf\x75\x35\xe2\x22\xfc\x7c\xf9\x00\x51\xbe\x69\x26\xf8\xfc\x98\xb3\xe5\x79\x83\x88\x0b\x3b\xb1\x8b\x30\x47\xd7\x5f\x70\xf2\x87\x40\xb0\x3b\x41\x44\x51\xcd\xd4\xd0\xe6\x8b\x85\x8d\x80\x92\xe3\x33\xa0\x70\x70\x0f\x23\x8b\xb3\xa9\x0f\x4c\x23\xb9\x89\xc6\x42\x28\x73\xca\x71\x3f\x71\xde\x09\x13\xd6\xe7\x87\xc9\x2b\x92\xa4\x86\xc6\xf8\x24\x96\x62\x7a\x6b\xa8\x2d\x1e\x63\xca\xaa\xe0\x01\x82\xde\x4b\x65\xa6\x41\xc3\xa3\xf9\x63\x84\x52\x93\xd2\x44\xe5\xa9\x99\xf4\x1e\xd8\x68\xac\x55\x87\xb0\x1e\xf4\x10\x6b\x80\x46\xe3\xd2\xb4\x29\x80\xae\x74\x41\x29\xa3\x5a\xd9\x4a\x7c\x14\xb2\x1a\x5c\x1a\x4e\x27\xf0\x98\xd9\xbd\x5c\x08\xae\x0e\x01\x1d\xf5\x8e\x3b\xa4\x48\x14\x37\x6b\x1c\x4c\x09\xd3\x60\x68\x36\xea\x22\x52\xe4\x23\xfb\x25\xe0\x63\x3a\x71\x5d\x21\xe5\x03\xbd\xa8\x31\xea\x8c\x07\xf6\xe3\x0e\xcc\xbe\xe1\xca\xf3\xd4\xe8\x8b\x81\xa8\xa3\x59\xdd\x37\xce\x11\x52\x82\xca\x84\xd5\x36\x67\x0d\xee\xff\x3b\x3c\x74\xa4\x8e\x0b\x60\x8e\xd9\x68\xec\x61\x49\x1d\x23\xa8\xee\xc1\xf6\x67\x8f\xd4\xf2\xa5\xd8\xb1\xa3\x47\xc5\x8e\xaa\x6f\xdb\xe7\x4b\x14\x58\x55\xda\x7f\x0d\x32\x0d\x50\x44\x14\x41\x92\xe1\xec\xdc\xbe\x61\x8d\xc3\x31\xf2\x82\x1c\x21\x92\x31\x7d\xa8\x10\xe1\xbb\x22\x3b\xee\x91\x33\xc2\xf3\x70\xe6\x56\xbd\x80\x8b\x30\xbf\x9b\xc8\xbc\x54\x89\x62\xae\x1d\xbf\xb8\x16\xb9\xb3\x63\x37\x4f\x79\x79\x74\x1d\x04\x60\x7d\x59\xc4\x55\x93\x58\x58\xef\x38\x41\x3d\xd2\xed\xe7\xf0\x5f\xb1\xfb\x1c\x73\x01\x16\x78\x5c\x8b\x28\x0a\x90\x69\xa7\x2c\x3d\x85\x03\x59\x3d\xc5\x16\x16\xbb\x62\x05\x69\x06\x33\x48\x43\x70\x25\xb5\x22\x74\x16\x8f\xd9\x30\x16\x9f\x45\x55\x81\x76\x85\xc8\x0f\xa6\x78\x75\xcb\xe0\xa5\xe5\xa3\x2e\xa5\x2b\x46\x2d\x9a\x57\x8c\x95\x88\xb7\x7f\x81\x3d\x8b\x47\x43\x68\x6b\x47\x7d\xd2\x56\x8c\xed\x43\x83\x96\xcd\xb3\x43\xc0\xd0\xe2\xd1\xd4\xd9\xb4\x63\x87\xe0\xa2\xc5\x63\x4e\x44\x7d\x9c\x58\xa3\xc5\x63\x67\x23\xe9\xe2\xb1\x6b\x5c\xd2\xe2\x31\x93\xaa\xf8\x48\x41\x4a\x9d\x6a\x84\x12\xf9\x5e\xdb\x73\xfc\xaa\x16\x3f\x29\x46\xc3\x20\xde\x2d\xb2\x69\xf1\x98\x15\x00\x9f\x48\x94\xd3\x82\xa9\xbe\xd7\x66\x9a\x57\x4b\x1f\xb6\x39\xea\x3e\x4e\xc7\x29\x14\x1d\x97\x3a\xe3\xed\xcc\x18\x51\x9d\x49\xc0\xb2\x02\x18\xf6\xe5\xed\x30\x1f\x27\xb0\x6a\xf1\x68\x8e\x71\xda\xd1\x10\xfb\xb4\xa3\x31\xe4\x46\x81\xe7\x3b\x6b\x17\xfe\x84\xb2\x8e\xb5\x4c\xb7\xb2\x4e\x2b\xeb\x6c\x31\x5a\x59\x67\xd3\xd1\xca\x3a\xcb\x46\x2b\xeb\x2c\x18\xad\xac\xd3\xca\x3a\xb5\xc6\xfe\xc9\x3a\xd6\x52\xd5\x98\xc1\xec\x6f\xd6\xe0\x3a\x6b\x21\x43\x69\xca\x87\xf4\x54\x4d\x65\x86\xf7\xdf\x38\x12\x7b\x8b\xe6\x35\x17\xa9\x2e\x29\x1f\x01\x79\xd9\x7d\xf9\x62\xc3\x74\xc0\xc5\xa3\x4e\xd0\x4e\x79\x6c\x9b\x3a\x38\x3b\x96\x79\x24\x1e\xcd\xbb\xe4\x4e\x6a\x70\x78\x54\x24\xcc\x25\x0e\xa2\x50\xd5\x2a\x05\x4d\xa8\xae\x18\xc4\x59\x0a\xc1\x21\x5a\x49\x41\x2e\x62\x7a\x05\x77\xfe\x0e\xb3\xa9\xbd\xdd\x56\x10\x01\xb5\x71\xec\x03\x08\xab\x10\x29\xd8\x04\x53\x7f\xe8\xcd\x12\xc0\xc3\x8a\x1c\x41\x6f\xd4\x23\xb1\x4d\xd6\xa6\xdc\xc5\x8c\x1d\x77\xca\xee\xf1\xd4\x10\x57\x89\xff\x31\xcb\x76\xfe\x71\x98\x00\xd7\x39\x4d\x92\x29\x81\x09\x8b\x74\xf8\x3e\x0c\x08\x64\xda\x3a\x3b\xeb\xb8\x52\x6a\x88\x87\x75\x45\xc2\xee\xdc\xd9\xda\xce\x5f\xed\x47\x7d\xd9\x6d\x6e\x1d\xbb\xd3\x9b\x19\xb9\xc4\x42\xa8\xb7\x54\xad\xd2\xe6\x6d\xd6\x5f\x89\xff\x44\x04\x7f\xf3\x76\x57\xf7\x18\x69\x88\x27\xd4\xe6\x03\xb3\x0a\x54\x9e\x24\x06\xbd\xad\xc7\x6c\x1e\x04\x0b\x3c\x59\x0b\xb2\x6d\xac\x9b\x35\x2d\x65\xdd\xe0\x3d\xb7\x22\x13\x89\x18\x4d\xcb\x3b\x68\x3b\xb2\x94\xca\xdb\x50\xa2\xf2\x81\x13\x01\xcd\x21\xba\x9e\xd9\xf2\xd6\x17\xb2\x74\xb4\xbe\x90\xb9\xd1\xda\x07\x66\x47\x6b\x1f\xd8\x62\xb4\xf6\x81\x05\xa3\xb5\x0f\xcc\x8f\xd6\x3e\xd0\xda\x07\xea\x8c\xe7\x6f\x1f\x20\xad\x2f\x64\xd9\x68\x65\x9d\x62\xb4\xb2\xce\xe6\xa3\x95\x75\xe6\x47\x2b\xeb\xb4\xb2\x4e\x2b\xeb\xb4\xb2\xce\xae\xa3\x06\x72\x67\x22\x6e\x3c\x45\x26\x13\xf1\x8a\x0c\x19\x6b\xaf\x8e\x44\x37\x11\x51\xa8\x2c\x62\x1e\x71\x9e\x0f\x45\x53\x6b\x42\xef\x90\x7f\x0b\x0e\x36\x3d\xc1\x96\xac\x4d\x81\x08\x6c\x02\x91\x89\xf8\x48\x1d\xef\x10\x78\xde\x66\xd8\xb4\x19\x36\x9f\x41\x86\xcd\x98\x2a\x57\xf8\x08\x49\xeb\xf2\x84\x9b\xd2\xf1\xbf\x05\x99\x7e\xb6\xf9\x36\x06\xe1\x1c\xc2\x60\x8f\xb8\x02\x29\x2c\xec\x62\xe7\xdb\x85\xb8\x5f\x85\x98\xd3\xcb\x6c\x8b\x9d\x38\x86\x98\x64\x20\xbb\x16\xc9\x04\x19\x32\x57\xff\x6b\x06\x7f\x1d\x84\x9f\x78\xde\x4c\x15\x12\x4f\x3a\x79\xa6\xfa\x29\x8d\xf9\xa6\xca\x2e\xba\x0a\x57\x7c\x72\xa9\x34\xcd\x68\xa5\x5d\xa2\x9d\x3b\xed\xc7\x5a\x7a\x69\x53\x4a\x24\x2a\x79\x37\x5b\x95\x39\x5e\x3e\x16\x16\xa7\xfd\x57\x0e\x72\x4a\xc4\x04\x64\xa1\x18\x85\xee\x3c\x9d\xd0\x64\x26\xa2\xae\x00\x72\x33\x06\x9e\x46\x4c\x11\x4d\x6a\xea\x4d\x7b\x0d\xc9\x9e\x55\x3f\x5e\x3e\x9a\x55\x1c\x1a\x54\x1b\x9e\x5a\x2d\xe5\xe5\xa3\x51\xf3\x1b\x69\xd8\x04\x47\x1a\x34\xc3\x91\x66\x4d\x71\xa4\x71\x73\x1c\x69\xd2\x24\x47\x3e\x7a\x05\xe8\xe5\xa3\x61\xf3\x11\x69\xdc\x4a\x47\x9e\x60\x3d\xe9\xe5\xe3\x11\xc0\xdd\xa4\xc5\x8e\xb4\xd5\xa9\x6b\x8f\xa6\x0d\x6a\xa4\x69\xa3\x1a\x69\x1a\x0f\x77\xaa\x82\xbd\x7c\xb4\xf5\xb1\x1f\x41\x4e\x6b\x4c\x88\xa8\x5b\x53\x7b\xdd\x42\x1b\xc0\xc9\xd0\xbb\xf7\x63\x29\x40\x96\x4b\x17\x0d\x63\xcd\xbb\x4b\xbd\xba\x30\x54\xb3\xdc\xd8\xd4\xc7\xad\x22\x46\xe3\xef\xb1\x37\x78\xe5\xbc\x54\x3c\xae\x34\xd9\x5c\xeb\x98\xc2\x74\x16\x9a\xc7\x18\xa5\xa0\x68\x3a\x55\x7a\x18\xef\xed\xd9\x70\xd2\x42\x9a\xe0\xf1\x6c\x80\x69\xf1\x04\xea\x17\xb6\x9d\xed\x81\xb7\x63\x1f\xaa\xe2\x8e\x83\x5e\xb9\xf3\xad\x9b\xf1\xe8\xbf\xff\xe7\xb8\x52\xbd\xa5\x98\xd0\x51\xe5\x70\x76\x06\xa0\x69\x37\x81\x09\x24\xb8\x0e\xdf\x56\x79\x2c\xd0\x62\x6c\xcb\x9e\x96\x0c\x52\xd7\xb3\x3b\x4a\x86\x40\x75\x2e\xb1\x82\x28\x70\x3a\x48\xea\x9f\x95\x56\xc1\x6c\x15\xcc\xcd\x46\xab\x60\x2e\x1d\xad\x82\x59\x63\xb4\x0a\xe6\x66\xa3\x55\x30\x97\x8f\x56\xc1\x6c\x15\xcc\x1d\x46\xab\x60\xb6\x0a\xe6\xae\xe3\x33\x56\x30\x9b\x0d\x9c\x2e\xab\x7b\x2e\x0e\x05\xe5\x47\x4d\x35\x8b\x8a\xa0\x6a\x7f\x97\xfd\x57\xb3\x6a\x66\x59\x85\x5c\xac\x64\x96\x15\xd1\x39\x45\xbb\xb7\x46\xa3\x0c\x3a\xe7\xdc\x93\x2b\x95\xcd\xe7\x16\x1b\xde\x18\x22\x96\x9c\xce\x8d\x62\xe2\xad\x0f\x5d\x2b\x5a\xbb\x87\xb8\xb6\x98\x1c\x79\x6f\x3f\xb6\x6a\xe1\x42\x57\x2f\x72\xcd\xba\xc5\x1d\xc1\xff\x8f\x61\x3b\x95\x8a\x01\x15\x27\x75\x88\x92\x0b\x11\x58\x05\xf2\x18\xea\x08\xb2\xb2\x06\x6c\x8d\x3b\x64\xdc\xc6\x52\xfa\xb6\x42\x82\xfb\xb0\x2c\x4b\x4e\x91\x00\x7a\x34\xb7\x92\x2f\xae\x07\xc5\xdf\x02\x76\xa5\x38\x22\x8a\x67\x8c\x72\x97\x6e\x2b\xb8\xef\x7b\x6f\x7b\xd9\x17\xe2\x72\xe8\xd6\x12\xde\xde\x23\x97\x88\xf4\xe5\x89\x99\x42\xf8\x50\xdb\x61\xa5\x19\x13\xc5\x7e\x95\x86\xb8\xdf\xba\x34\xc4\x4c\x4c\x4a\x5b\x19\xa2\xad\x0c\x51\xab\x32\x04\x5e\xb4\x87\xbb\xf1\x12\x11\xe4\x6f\xae\x01\x93\x04\x04\x55\x9a\x27\x9a\x65\x45\x8c\xb7\xb2\xaf\x4a\xac\x22\x31\x74\xb1\xa6\x55\x7c\x37\x6f\xa3\xd1\x78\x16\xef\x71\x3e\x8c\x09\x57\x48\x4e\x5c\x3c\x27\xb6\x4b\xc2\x9a\x06\x5e\xeb\xb0\x41\xab\xec\xe9\xc7\x22\x5e\x20\xc1\x56\x85\xd2\x6c\xbb\x79\x19\x3a\x9f\x18\x94\x30\x14\x7b\x05\x83\x28\xb7\xcc\xc0\xb8\x58\x36\x01\x5e\x70\x89\x23\x75\x7c\xec\x85\xa1\x46\xb9\xd7\xa3\x70\x9f\x3f\x95\xb8\xc4\x5f\x36\xe1\x3f\xf8\x41\x81\x03\x15\xe0\x2b\xf8\xcf\xd3\x0e\xba\xac\x1f\x3f\xd7\x84\x41\xae\xb1\xb8\xb9\x4f\x1e\x33\xf7\x39\x55\xd7\xd8\x4b\x17\xc6\xde\x69\x1d\xcf\xc3\x6d\xd1\xa6\xa4\x6e\x3e\x9e\x42\x4a\xea\x27\x72\x4d\x3c\x9d\xcc\xd4\x27\xeb\x8e\x78\x2a\x99\xa9\xad\x0b\x62\xab\xf1\x5c\x13\x46\xab\xa3\x41\x97\x43\xeb\x6e\x68\x58\xa6\x6a\x84\xf9\x3f\x8e\x9b\xa1\x11\xfc\x6b\x34\x7e\xad\x8d\x5d\x7b\xe6\xb1\x6b\xad\xa2\xd7\x2a\x7a\xd5\xd1\x2a\x7a\x73\xa3\x55\xf4\xb6\x18\xad\xa2\xb7\x7c\xb4\x8a\xde\xfc\x68\x15\xbd\x56\xd1\xdb\x60\xb4\x8a\x5e\xab\xe8\x6d\x3a\x3e\x33\x45\xaf\xb9\xa2\xf1\x6d\x0c\x59\xf3\x31\x64\xcd\x10\xc2\x06\xc8\x5f\x23\x48\xd7\x50\xcc\x58\x1b\x2f\xb6\xdf\xf1\x62\x35\x4b\xe7\x71\xcd\x1e\xa7\x7c\x5e\x79\xb7\x97\xd5\xd0\xa3\x13\xc1\x62\x92\xe5\xda\x55\x10\x6b\xeb\xe8\xed\x73\x1d\xbd\xca\x8e\xb6\xc5\xf4\x36\x2a\xa6\xb7\x0c\x66\x6d\x45\xbd\x25\x63\x7f\xa2\xd8\xda\x8a\x7a\xdb\x8e\xb6\xa2\xde\xe2\xd1\x56\xd4\x5b\x31\xda\x8a\x7a\x6d\x45\xbd\xb6\xe0\x41\x8d\xd1\x16\x3c\x58\x30\xda\x82\x07\xbb\x8f\xb6\xe0\xc1\x46\xa3\x2d\x78\xd0\x16\x3c\xa8\x8e\xd6\x09\x55\x6f\xb4\x05\x0f\x6a\x8e\xd6\x31\xd5\x16\x3c\xa8\x35\x61\x5b\x51\xaf\x8d\x4a\xdc\x7e\xb4\x0a\x66\xab\x60\x6e\x36\x5a\x05\x73\xe9\x68\x15\xcc\x1a\xa3\x55\x30\x37\x1b\xad\x82\xb9\x7c\xb4\x0a\x66\xab\x60\xee\x30\x5a\x05\xb3\x55\x30\x77\x1d\x9f\xb1\x82\xd9\x56\xd4\xdb\xf7\x68\x48\xb2\x8f\x29\x4f\x6d\x45\xbd\x36\x42\x72\xa7\xed\x6e\x2b\xea\xad\x1f\x9f\x7d\x45\xbd\x4a\xb4\xde\xa7\x2b\xab\xb7\xfd\x32\xda\xda\x7a\x6d\x6d\xbd\xb6\xb6\x5e\x5b\x5b\xaf\xad\xad\xd7\xd6\xd6\xdb\x7c\xec\xbf\x33\x63\xef\xf4\x8f\xe7\xe1\xc0\x68\x4b\x2e\x6c\x3e\xda\x92\x0b\x4b\x47\x5b\x72\xa1\x2d\xb9\xd0\x3a\x23\x76\x19\x6d\xc9\x85\x2d\x47\xeb\x78\x68\x4b\x2e\x6c\x35\xda\xda\x7a\x6d\x14\xdb\xe6\xa3\x55\xf4\x5a\x45\xaf\x3a\x5a\x45\x6f\x6e\xb4\x8a\xde\x16\xa3\x55\xf4\x96\x8f\x56\xd1\x9b\x1f\xad\xa2\xd7\x2a\x7a\x1b\x8c\x56\xd1\x6b\x15\xbd\x4d\xc7\x67\xa6\xe8\xb5\xb5\xf5\xf6\x39\x9a\xac\xad\xad\xb7\x60\xb4\x91\x63\xfb\x1d\x39\xb6\x23\xae\xd0\x5c\x8b\x54\xe4\x5c\xdf\x80\x9c\xb0\x08\xce\xa2\xc8\xfc\x75\x2b\xee\x60\xcb\x68\xa5\xaa\x16\xba\x62\x5a\xc2\x78\xcc\x22\xd4\x23\xef\xc7\x80\xa5\xf1\x8c\x78\x8b\xf7\x11\x6a\x6f\x24\x1a\xef\x2c\xd0\x0b\xd7\x69\x68\x1a\x86\xf0\xe0\xd4\xdb\xc2\xcb\x42\x68\x20\x44\x02\x94\x6f\xf1\xa4\x63\x86\x20\xb7\x3c\xcd\x15\x80\xbc\x72\x94\xb8\x98\x8c\x0c\x20\x11\x7c\xe4\x22\x86\xdc\x09\xe8\x91\xf3\xe2\x86\x88\x72\x3c\x3c\xb9\x94\xc0\x75\x32\x45\x38\x60\x91\x2e\x54\x1a\x52\x31\x81\x18\x29\x36\x06\x2a\x59\x31\x92\x6a\x92\x00\x35\xef\xe2\x50\xbc\xcc\x1c\x1e\x4a\xfa\x38\xbf\x9d\x74\x00\x2e\x78\x6a\x27\x20\x6e\x4f\x1b\x77\xa2\x86\x33\x86\x0d\x27\x35\x21\x5b\x8a\x50\x3d\x2a\x7d\x21\x1e\xcd\xa9\xc8\xc9\x3d\xb5\x82\x92\xcc\x39\x1e\x66\xfc\x74\x03\xda\x2d\x5f\x5e\x43\x24\xd9\xdd\xfa\xd0\x45\xaa\xb6\xe5\x63\x75\xac\x01\x54\x8e\x76\x62\x52\x95\xad\x39\x3c\x93\xa3\xdc\x4a\x84\x0e\x95\x81\x6b\x39\xc5\x88\x3e\x2b\x52\xc4\x22\xba\x33\x68\x98\xd2\x11\x1c\x1e\x2a\x72\xfe\xfa\xc2\xd0\xbe\x5c\x19\x52\xed\xca\x04\x3a\x5a\x98\x49\x31\x61\xb1\xc1\xec\x9f\xa9\x64\x74\x90\x18\x99\x73\x08\x12\xb8\x11\x09\xbe\x38\xfa\xf9\xec\xed\x2f\xd7\x67\xaf\x2f\x8f\x51\xfa\x84\x87\x8c\x72\x73\x24\x72\x55\xc4\xa1\x3a\x9c\x30\x2f\x02\x3e\x61\x52\x70\xb3\x38\xd4\xd3\x28\x99\xf8\x59\xa3\x70\x12\x24\x28\x91\x4c\x20\xb6\x32\x72\x78\x9b\x67\x39\x8c\x67\xb9\xf6\x7a\x23\x46\x47\x9a\xd3\xc3\xa3\x31\xe5\x23\xb3\xce\x0b\x91\x9b\xf9\xbe\xf8\x02\x57\x24\x21\xce\x23\x2b\x35\x51\x8f\xb2\x5f\x74\x3c\x9b\x30\x84\x5e\xd9\x9a\x8e\x2a\xa2\x99\x5f\x73\xf9\xb3\xd4\x94\x6b\xfa\x70\x6a\xc3\x03\x0f\xbe\x28\x5d\x3a\xf0\xf5\x30\x85\x79\x85\x65\x36\x76\x55\x09\x96\x62\x4c\xc8\x41\xf9\xee\x1e\xb9\x34\xef\x80\xb8\x0c\x40\x1b\xdd\x09\x13\x90\xa8\x75\x3a\xf0\x75\x88\x84\x11\x95\x71\x02\x0a\xe3\x1a\x3d\x61\xb6\x9a\x81\x03\x18\x04\x9d\x96\x0b\xbd\x88\x92\x90\xd7\x02\x63\x1c\x87\xe2\x94\x8c\xb5\xce\xd4\xe9\xc9\xc9\x5d\x3e\x00\xc9\x41\x83\xea\x31\x71\x12\x8b\x48\x9d\x68\xaa\xee\xd4\x09\xe3\xe6\x64\x75\x63\xaa\x69\xb7\x74\xa4\x4f\x2c\xdb\xee\x46\x22\x4d\x29\x8f\xbb\xd4\xa1\x56\x37\x6c\xeb\xc9\x6f\x1d\x43\xed\xd2\x70\x17\xe3\x5d\xda\x55\x63\x48\x92\xc3\x1d\x90\xb9\x9e\xc0\x57\x43\xd0\xab\x25\xe0\xb9\x6f\xaf\x7f\x7a\x2f\xc3\x61\xb5\x30\xe8\x91\x6b\xa1\x5d\xf8\xad\x8b\xf4\x46\x22\x8a\xf0\x5d\x7c\x9e\x2f\xaf\x6f\xdf\xfe\xbd\xff\xe6\xea\xfa\xb6\x3d\xd6\xed\xb1\x6e\x8f\x75\x8d\x63\x0d\x7c\x52\xfb\x48\x7b\x69\xb3\x74\x4c\xc2\x7e\x23\x8f\x56\xa0\xfd\x31\x08\x1b\x50\x5b\x36\xb4\xe3\x93\x41\xbd\x02\x81\x4b\x3e\xf9\x99\x56\x4d\xeb\x7c\x21\x38\x88\xbb\xc1\x8a\xc8\x41\xfa\xae\x13\x7b\x5f\xc3\x8c\x55\xd7\x6f\xb5\x93\xfc\x68\x47\x7d\x9f\x92\x79\xf5\xee\x26\x86\xca\xf6\x5d\xd3\xb4\xa8\xaf\xbd\x60\xd7\x7a\xe4\xb5\x57\x78\xc8\xf9\x2f\x57\x17\x97\xd7\xb7\x57\xdf\x5d\x5d\xbe\xdd\x5d\x83\x6e\xc0\xd6\x82\xd6\x84\x86\x00\x70\xb8\x23\x97\xcc\x24\x4c\x98\xc8\x55\x32\x0d\xf6\x8f\xc5\x44\x60\xf6\xf4\x3b\x87\xef\x34\x68\xe2\x0b\x1f\x6b\x99\x6d\xb3\xcc\xf6\x02\x86\x34\x4f\xac\xde\x74\x70\xd0\xdb\x85\xcb\xd9\xd1\x14\xfa\x7e\x27\x45\x8d\xfa\xd1\x15\x14\xbe\xb1\x95\xe7\x87\x42\x2e\x3d\xc6\x87\x2e\xec\xa0\xc2\x7a\x9c\xf0\x68\x6d\x73\x4e\x7a\xb4\xde\xb1\x9a\xd0\xa9\xe9\x5e\x68\xc6\xe9\x1e\x09\x3e\x64\xa3\xd7\x34\xfb\x11\xa6\x6f\x61\x58\xcf\x40\x5c\x85\x37\xda\x1d\x9d\x0f\x19\xad\x94\x86\x9d\xd9\x97\xd5\xf3\xcf\x34\xe6\x9d\x69\x2a\x2c\xa3\x7e\x48\x46\x73\x11\x14\x8d\x44\x4f\xcc\x55\xf3\xb7\x16\x68\x67\x4b\x6e\x2a\xb8\xa6\x11\x97\x7d\x3d\x2e\xef\x47\x95\xd9\x95\xd9\xbd\xa3\xb3\x7a\x53\xb5\x23\x12\x3c\x82\x4c\xab\x13\x31\x31\x9c\x0b\xee\x4f\xee\x85\xbc\x33\x7a\x84\x51\x5c\xbb\x16\x6b\xd5\x09\x7a\x0b\x4e\x7e\x6b\xfd\x5f\xb7\x6f\x2e\xde\x9c\x92\xb3\x38\x76\xad\x59\x72\x05\xc3\x3c\x71\xcd\x10\x7a\x84\x66\xec\x67\x90\x8a\x09\xde\x21\x77\x8c\xc7\x1d\x92\xb3\xf8\xdb\xdd\x89\xb3\x1f\x0d\xee\x82\xc8\xac\x8f\xb3\xe1\x9d\xb8\x41\xef\xca\xb4\xc2\xbb\x02\x11\x31\x5c\x8b\x69\x85\xb8\xe9\xed\xcd\x4e\xc8\x68\x08\x34\xdb\x1b\xe7\x67\x07\x6e\x61\xb3\x74\xf5\xb0\x20\xac\xd6\xb7\xe9\x10\x35\x13\xf1\x29\x51\x79\x96\x09\xa9\x15\x49\x41\x53\xa3\xf4\xf6\x0c\x86\x75\xaa\x7f\xa2\x97\xaa\x43\xfe\x11\x7e\x44\x57\x93\x7a\x77\x78\xf8\xa7\x1f\x2f\xff\xfe\x97\xc3\xc3\x0f\xff\x28\x5f\x45\x56\x68\xc3\x7f\xaa\xb7\xa8\x0c\xa2\x1e\x17\x31\x5c\xe3\x3b\xf0\x4f\x55\x71\xb0\xb8\x0b\x9a\xea\x5c\xf5\xc6\x42\xe9\xab\x7e\xf8\x33\x13\xf1\xec\x5f\xaa\x86\xc4\x41\xf6\x93\x31\xe0\x16\xf5\xa9\x1e\xef\x09\x7b\x28\x68\x49\xc3\x47\xd5\xcd\x5a\x6e\x01\x94\x52\xfc\xe7\x77\x1e\x04\x46\x7a\xba\x97\x4c\x6b\x74\xba\xb9\x34\x73\x31\xec\x98\x53\x5b\x88\x9d\x93\x97\x07\x7b\xc5\x60\xc2\x0e\x36\x0c\x30\x84\x88\x83\x96\x3d\xc8\x81\xc1\xce\x3b\x97\xcf\xfa\x57\x64\x62\x21\xbc\x37\xc0\xf1\xa9\xc3\xdf\x3d\x2a\x8d\x0b\x2d\xa3\x1c\xa8\x82\x86\x78\x6a\xa3\x81\x42\x02\x33\x49\x58\xca\x5c\x90\xa1\x6b\x2f\xa5\xc8\x91\xfd\xb1\x17\x65\x79\xc7\xdd\xd0\x4b\x21\x15\x72\x1a\xfe\x84\x6c\x0c\xa9\xd1\xb4\xba\x4a\x0b\x49\x47\xd0\x09\x8f\xdb\xc7\xc2\x5f\xf6\xc1\xca\x0b\xe6\x9f\xb6\xaa\x70\xe1\x24\x75\x14\x19\xe2\xe7\x47\xdb\x3c\xe8\xf7\x84\xb4\x05\xcc\xb8\x7e\x04\x91\x30\x58\xe2\xac\xc0\x19\xa0\x88\xfa\xe4\x44\x24\x79\x0a\xaa\x13\xc4\x20\x6b\x0d\xe0\x13\xa3\x59\xaa\xbd\x12\xd4\x62\x36\x61\xaa\x89\xf8\xe1\x05\x72\x1a\x73\xa1\xf8\x22\xd7\x59\xae\x5d\x2d\x9b\x52\x5b\x3a\xa1\xd0\x6e\x11\x0a\x0e\x54\xc8\xfe\xcb\xba\x05\xb7\x08\xc9\xa8\xd6\x20\xf9\x29\xf9\xaf\xa3\xf7\x5f\xfe\xda\x3d\xfe\xf6\xe8\xe8\xdd\x8b\xee\x1f\x3f\x7c\x79\xf4\xbe\x87\xff\xf8\xdd\xf1\xb7\xc7\xbf\xfa\x3f\xbe\x3c\x3e\x3e\x3a\x7a\xf7\xe3\xeb\xef\x6f\xfb\x97\x1f\xd8\xf1\xaf\xef\x78\x9e\xde\xd9\xbf\x7e\x3d\x7a\x07\x97\x1f\x36\x9c\xe4\xf8\xf8\xdb\x2f\x6a\x2f\x9d\xf2\xe9\x9b\x9a\x04\xd4\x8e\x6e\x63\xa5\x88\x66\x67\x6c\x28\xc0\xfa\xa1\x5b\x28\x4d\x5d\xc6\x75\x57\xc8\xae\x9d\xfa\x94\x68\x99\xd7\x23\x26\x05\x53\x6a\xfa\xfc\xfb\xde\x63\xa7\x05\x43\x0a\xec\x7a\x6f\x0e\xb8\x82\x48\x82\xfe\x18\x96\x1c\xfb\x26\x2f\xa7\xcc\x04\x3b\x3e\x37\x3e\xf7\x39\x18\x77\x42\xb0\x20\xee\x6b\x21\x89\x0e\xa5\x48\x7b\xa4\xe4\xde\x98\x60\xa6\x87\xbb\xef\x0e\x6a\x58\x41\xfd\x68\x8d\x41\xad\x31\x68\xc9\x58\x6b\x0c\xba\xb1\x78\xb8\xb7\x96\x20\xe0\x93\x5d\x5d\x18\x0b\x3d\xe8\x5e\xd7\xd1\x82\x64\x22\xcb\x13\xaa\x97\x78\xc6\x16\xb8\xd3\xdd\x51\x2f\x22\x91\x8b\x48\x1a\xcb\xd0\xd2\xc5\x3e\x4c\x72\x96\x24\x84\x71\x7b\xf0\x71\x02\xef\x30\x93\x60\x55\x1b\x42\xad\x3f\x7b\x62\x96\x70\xef\x4a\xd6\x95\xc3\x3d\x15\x51\x9a\x4a\x8d\x51\xc7\x58\xd2\xce\xb2\x12\xe7\x7d\x62\xbc\x28\x6c\x17\x84\xc3\x90\x04\xb2\xb0\xaf\x67\x42\x95\xf6\xcb\xc6\xd5\x68\x7a\x87\xde\xc6\x08\x62\xe0\x11\x60\x46\x5a\x0e\xc5\xb7\x0e\x8c\xde\x46\x2e\xf9\xc4\xce\x41\x49\x9c\xdb\x60\x10\x4b\xfe\x16\xcf\xf1\xbc\x02\x10\x0c\x22\xde\xf8\xf6\xcb\x21\x0e\x01\xa9\x7e\xd0\xb0\x43\x62\x5f\xb0\xb2\xaa\x4f\x13\x79\x50\x9f\x67\x06\xcf\x56\x2d\x61\x68\x8e\x59\x16\xe6\xe7\x2a\x93\x7c\x0e\xce\xc0\xfa\xec\xf3\xb3\x63\x9d\x0d\xb1\xcd\x66\x58\xe6\x16\xbe\x93\x26\xd9\x64\x13\xce\x92\x4c\xc2\x90\x3d\x34\x74\x4e\xcf\x78\x61\x89\x61\x31\x70\xcd\x86\xcc\x76\xec\xcf\x24\x64\xc0\xe3\x50\x14\x15\xb3\xc2\x79\x15\x36\x7b\x19\xcc\x63\x05\xee\x66\x49\xd9\xcd\x22\x61\xbf\xa5\x63\xa4\xa5\x63\x3b\x8f\x8f\x44\xc7\x1c\xe6\xee\x0f\x11\xc3\xc8\xf3\xfa\xa1\xef\x17\xa5\x38\x76\xc4\xe2\xad\xb1\xac\x48\xe8\x3a\xc1\x59\xd4\x4c\xf5\xa0\x40\x17\xb5\xb0\x91\x6b\x64\xcc\x46\x06\xac\xb6\xa2\x90\x15\x9a\x48\x4a\x39\x1d\xd9\xac\x6e\x2d\xbc\x9d\xd6\x68\x59\x06\x89\x25\x8b\x2b\xc2\xbd\x7d\x0d\xe3\xc4\x20\x76\x22\x68\x8c\x17\xa5\x48\x12\x90\x8a\x24\xec\x0e\xc8\x05\x64\x89\x98\xba\x24\x6d\x1e\x93\x1b\x4d\xb5\x41\xe9\x1b\xd0\xbb\xf9\x7c\x6b\xa1\x2b\xae\xb8\x9f\x27\x49\x5f\x24\x2c\xda\xc9\xa2\x52\xdd\xb6\x2b\xdc\xaf\x2c\x4f\x12\x92\xe1\x94\x3d\xf2\x86\x23\xc5\x38\x4b\xee\xe9\x54\x75\xc8\x35\x4c\x40\x76\xc8\xd5\xf0\x5a\xe8\xbe\x15\xbd\xab\xd1\x76\xf6\x46\xc2\x86\xe4\x14\x6b\xda\x68\xa2\xe9\x08\x15\x27\xef\x03\xec\x18\xf8\x97\x27\xb0\xc4\xe1\x9e\xa9\x85\x9a\x4a\x6d\xc4\xf9\x2d\xce\x64\x08\x95\xfd\xfb\xa3\x6f\x53\xc2\x86\x10\x4d\xa3\xa4\xfe\xb9\x3a\x8b\x30\x7a\xa1\xc8\x33\x2f\xe1\xb7\x2b\xd3\xee\x52\x3b\x51\x05\x64\x9c\xd8\xfa\xe9\xb6\x30\x7c\x81\xea\x61\x45\x56\xd5\x55\x8d\x6a\x88\x3b\x73\xce\xba\x3c\x33\x13\x4a\xdf\x18\xf5\xbc\x91\x2a\xeb\x87\x7d\x3f\x1d\xc1\x5a\xd2\x49\x02\x31\x61\x69\x0a\xb1\x51\xe1\x93\x29\xa1\x43\x8d\x29\xb6\x15\xf3\x40\x24\xc1\x62\xad\xab\x5d\x32\xa6\x3c\x4e\x40\x92\x21\x65\x89\x33\x06\x54\xee\xd7\x20\x53\xc6\xd1\x26\x60\xdd\xb1\x68\x5f\x30\x7f\x45\x91\x90\xbe\xee\x3d\xd3\xca\x5f\x2a\x0e\x26\x32\x91\x12\x02\xcc\xfa\x95\xc9\x20\x11\xd1\x9d\x22\x39\xd7\x2c\xb1\x8b\x11\xe2\x8e\x44\x22\xcd\x12\x3c\x3a\x35\x4e\x56\xf8\x67\x37\xa0\x52\xd7\xcc\xae\x4e\x7e\x5b\x5c\xc2\x1f\x76\xe5\xe6\x0d\x48\x61\x4d\xc8\x60\xf0\x00\x51\x63\xe9\xfd\x97\x0f\x10\x95\xca\x49\x60\xa3\x07\x3c\xd1\x98\xde\x49\xef\xe0\x19\xd5\xaf\xab\x91\x45\x57\x1e\x15\xf8\x9d\xdb\x39\x7d\xf9\x2b\xf7\x0a\x92\x30\x8e\xf4\xcd\x65\xd6\x11\xc6\x95\xe1\xec\x95\xc3\x60\x8f\x9e\x93\x58\x49\xcc\x24\x16\x3f\x98\x86\x28\x6a\x3f\x17\xd6\x15\x10\x42\x93\xa3\xc3\x93\xc3\xe3\x39\xe3\xe3\xa1\x91\x40\x12\xb0\xb4\xd6\x5a\x22\xa3\x62\x51\x8a\xa5\x59\x32\xc5\x75\x1c\xc6\x1d\xc2\xb4\x0f\xb3\x96\x39\xf7\xab\x72\xe9\x7e\x1d\xa2\x04\xd1\x92\xfa\x9a\x2a\xf6\x57\x73\x93\x96\xb9\xa3\xf2\x47\x87\xbf\x1e\x76\x08\xe8\xe8\x98\xdc\x0b\x7e\xa8\x71\xf9\x3d\x72\x2b\x8c\x1c\x5d\x4c\x34\x15\x39\xe1\x60\xa3\xfa\xe1\x21\x4b\x58\xc4\x74\x32\x45\x8a\x45\x44\xae\x6d\xea\x30\xd5\x3e\xcd\xf0\xf2\x81\x69\x17\xac\x66\x48\xc6\x0b\x84\xa6\xa5\x5a\x84\x1a\x31\x67\x02\x27\x63\xa0\x89\x1e\xdb\x08\x11\x2e\x78\xf7\xdf\x20\x05\x26\x20\x72\x77\xe5\xd9\xd5\xfa\x6b\x44\x6d\x30\x44\xf4\x7b\x68\xae\x3b\xd0\x0f\xb7\xb7\xfd\xef\x41\xcf\x90\x0c\xf3\x16\x1f\xb7\x83\xa6\x00\x90\x43\x21\xd3\x3d\xa0\x1d\xcd\x78\x2a\xbb\x24\x13\x72\x1f\x48\xd8\x58\xa8\x5a\x7b\x49\xe6\xf6\x53\x28\x8d\xda\x90\x93\xc6\x38\x44\x66\x07\xab\x01\x24\xbe\x81\xce\x55\xbf\x47\xfe\x2e\x72\xf3\x35\x03\x3a\x48\xa6\xa1\x00\x83\x02\x4d\x0e\xcc\x54\x07\x86\x3c\x19\x6c\xf8\x01\x68\x6c\x54\x14\x43\x3d\x80\xee\x47\xa3\x2c\xe2\xce\x83\x5b\x5b\xb3\x7c\x20\x57\x5a\xa4\x64\xec\x3e\xbb\x9a\x77\xe9\x4e\x46\x0f\x4f\x8f\x4f\x6a\x92\x90\x59\x0a\xe7\x9e\x79\x76\xf4\x6b\x8e\x6e\x58\xb8\xbb\xdf\x07\x58\xbc\x2a\x2a\x83\xcd\x75\x8a\xb2\x59\x41\xdc\x02\xcb\xa0\x1a\xec\xe6\x27\x29\x8f\x3d\xae\x38\xba\x73\x16\xe7\xec\x44\xe8\xd1\xab\x1f\xe8\xd5\x68\xbd\xd1\x66\x82\x06\xc8\x22\x0b\xab\xc3\x19\x6b\x7d\x69\x08\x88\x8f\x53\xf0\xf2\x63\x00\xa0\x99\xcd\x27\x4d\x42\x20\x6b\x20\xae\x7b\x3e\xaa\x5b\x0b\xa3\x87\x62\xde\xa5\x25\xae\x48\x26\x14\xc8\xc9\xae\x99\xdc\xc5\x68\xee\xd3\xc5\xee\x1a\xbf\x1f\x0b\x92\xa4\x25\xe1\x79\x3a\x00\x59\xa4\xa5\x48\x3d\x0f\x90\x52\x58\xc2\xb5\xbd\xdd\xdb\x72\xab\x7d\x19\xcd\x93\xdf\xfc\xe7\x7f\x7e\xfd\x9f\x3d\x3b\x7d\x08\x51\xe0\xe4\xea\xec\xfa\xec\x97\x9b\x9f\xcf\x31\x33\xb6\x2e\x54\x1b\x8a\xbf\x6c\x3a\xfa\xb2\xd1\xd8\xcb\x47\x8d\xbc\xc4\x7c\x8f\xda\x54\xa4\x6a\xf8\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x2b\xd5\x28\x33\xb2\x66\xd5\x90\x6a\x8e\xda\x5e\x9c\x31\x1d\x65\x37\x22\xba\x6b\x50\xaf\xb9\x80\x4c\x42\x64\xed\x64\xb7\xe7\x7d\x3b\xbb\xd1\x2f\xaf\xdf\xdc\x16\x79\x06\x18\x8c\x43\x5e\x79\xfb\xd2\x0f\xce\x92\x66\x74\xd2\x3b\xc8\x74\x50\xdd\x07\x34\xba\xbb\xa7\x32\x46\xcb\x16\xd5\x6c\xc0\x12\x66\x4b\xfe\xfa\x6e\x93\x5c\xd8\x68\x3f\x5b\xdb\x4c\x0c\x67\x0b\x6a\x16\xe6\x50\x34\x59\xd9\x20\x9a\x21\x65\x09\x5a\x50\x73\xae\x59\x0a\x2e\x1c\x28\xca\x82\x49\xaf\x6c\xd3\x6e\x95\x2f\x3f\xf6\x56\xf9\x3a\x7c\xe3\x5d\x7a\x5b\xeb\x61\x75\x83\x12\xf7\x98\xd5\x39\x16\x67\xb3\x41\x5a\x56\xf7\x59\xb0\xba\x4c\xc2\x8d\x16\x59\x43\x5e\x12\x3b\xd9\x12\x1f\xc9\x00\x86\xc2\x10\xe1\xa5\x4e\x0f\xdf\x7c\x98\x63\x66\xa0\xb7\x6a\x89\x8a\x63\xc3\x86\x63\xaa\x3c\x1a\x7b\x03\x25\x07\xa5\x4e\xd0\x1d\x92\x67\x56\x6b\x45\x72\x9d\x4b\xe8\x98\xaf\x83\x14\x57\xd7\x29\x52\x1c\xcc\xeb\x81\xdb\x1f\x41\x47\xd6\x72\x5b\x22\xe4\x58\x0f\xd4\x2d\x7f\xd6\x8d\x12\x49\xaa\xc6\x80\xb5\x45\xe0\x81\xf9\x1e\x28\x7d\x11\x1f\x1e\x16\x9f\x62\x18\xcb\x48\xd2\x08\x48\x06\x92\x09\xc3\x8c\x72\xae\x63\x71\xcf\xc9\x00\x46\x8c\x2b\x0f\x0a\x33\xb7\x87\x19\xfa\x63\x98\x0a\x25\xe1\x7a\xe4\x6d\xa5\xd2\x89\xcb\x41\x8a\x44\x71\x34\xdd\x9a\x67\x3d\x49\xc8\xb1\x4a\xbd\x98\x03\x84\x7d\x6c\xac\xde\x60\xc9\x47\x39\xc7\x37\xc7\x90\xd0\xa9\x0d\x35\x1d\x32\x4e\x13\xf6\x6f\x90\xea\xb8\x01\x8f\x93\x01\x61\x71\x6d\xe9\x3a\xb0\x40\x3f\x8d\xc6\xf5\x9c\xbf\xad\x8b\x6a\xc3\xd1\xba\xa8\xea\x4c\xd2\xba\xa8\x5a\x17\xd5\x9a\xd1\xba\xa8\x5a\x17\xd5\xcc\xd8\x5b\x2d\xa9\x75\x51\xed\x3c\x5a\x17\xd5\xea\xd1\xba\xa8\x36\x18\xad\x8b\x6a\xc3\xd1\xba\xa8\x5a\x17\x55\xeb\xa2\x6a\x5d\x54\x9f\x91\xdd\xce\x8f\xd6\x45\x35\x37\x49\xeb\xa2\x6a\x5d\x54\x1b\x8f\xbd\x55\xbe\x5a\x17\x95\x1d\xad\x8b\xaa\x3a\x3e\x2f\x56\xe7\x1d\x3c\x7d\xa3\xea\xd5\xcf\x69\xeb\xa3\x53\x81\x45\xce\x4f\x54\xee\x15\x17\x5e\x55\x6a\x0f\x57\xaa\x09\xe2\x53\x71\x9c\x47\xa8\xf0\x33\x2d\xcc\x97\xda\xd6\x55\xe1\x93\x0c\xd5\x49\x26\xec\xff\x15\x8e\x8a\x92\x87\xc2\x2a\xbc\xbb\xe7\xac\x7d\xb2\x6c\xac\x3a\x6e\x89\x8f\xe3\x92\xd8\x13\xff\x4d\x03\x6e\x88\xd6\x05\xf1\xec\x5c\x10\xcf\xa7\x59\xae\xf3\xcc\xdf\x8e\x25\xa8\xb1\x48\x76\x46\xf4\x0a\x92\xbf\x66\x9c\xa5\x79\x6a\x70\x4e\x19\x7c\x66\x93\x10\x02\xa0\x02\xba\x5a\x8a\x6d\xad\x88\xe6\x46\x16\x03\x56\x3a\xa5\x2c\x31\xdb\x88\xf9\x9b\x63\x3a\x31\xb8\xae\xf2\x28\x02\xc0\x3e\x6a\x65\x0d\xe7\xeb\x5e\x78\x53\xe8\x9b\xf1\xb2\x1e\xbd\xa9\xc7\xc4\x6d\x2d\x52\x9c\xe5\xeb\xaf\x76\x9a\x63\x24\xb3\x66\xe8\xf2\xf7\x6f\xfb\xe7\xe5\xe6\xd8\xdc\x93\x65\xc6\x27\x22\x99\xd8\xbe\xfa\x78\x93\x11\xd6\x5c\x0b\x7e\x66\x6f\x4c\xb2\x31\x2d\x69\x37\x4e\x31\x50\x04\x38\x1d\x24\xe6\x49\xf3\x5c\xe0\xc9\x7d\xcb\x79\x81\xea\x5c\x02\x19\x51\xfd\x29\x49\x7e\x7d\x25\xa6\x96\x02\xd3\x04\xc7\xa9\x2b\xa3\x57\xad\x70\x46\x12\xaf\xda\xa1\x46\x88\x19\xb6\x80\xfe\xc6\x92\x78\x6d\x5a\x59\x5f\x3a\xae\x7f\xb8\x08\x56\xb8\xc1\x0f\x6f\x0c\xc0\x07\xae\xd7\xb3\x67\xe8\x65\x35\xc8\x37\x95\xd2\x82\x64\x09\x2d\xda\x42\xe1\x0e\xfc\x80\x5c\xe8\x7c\x0c\xd1\xdd\x5b\xe7\x8b\x3d\x52\x00\x41\x3a\x1d\x31\x3d\xce\x07\xbd\x48\xa4\x27\x86\x28\xd8\xff\x1b\x24\x62\x70\x92\x52\xa5\x41\x1a\x81\xd5\x31\xb9\x6e\x64\x66\x61\x7c\xd4\x4b\xe3\xe3\x1e\x79\xcf\x6d\x7e\x7b\xd1\x86\xb2\x54\xdd\xc1\xbc\xdf\x57\xda\x18\x80\xa1\xaf\x42\x96\xfb\x86\x0f\xa6\xb8\xbc\x5e\xfd\x56\xf2\x35\x98\x52\x4d\x3f\xf8\xc7\xf7\x81\xb7\x94\x8b\x34\x60\x72\x79\x6a\xbe\xee\xc6\x62\x3e\x1a\xf0\x71\xef\x91\x7f\x7b\x6f\x84\xe3\x7d\xf1\x69\xef\x61\xb1\xe9\x06\x5c\xb0\x4d\xf8\xb0\x9b\xf3\x5f\x3f\x42\x4d\xe6\xc7\xf1\x5b\x37\x68\xdc\x6b\xc8\x5f\xfd\x31\x7c\xd5\x8d\x7c\x75\x5d\x1f\xf5\xc7\xf3\x4f\x37\xf3\xb9\x4d\x2a\x02\x4f\xd5\x27\xdd\x80\x91\xbe\x49\x03\x7d\x63\xc6\xf9\x47\xf3\x41\xd7\xf7\x3f\xef\x81\xef\xb9\x36\x90\x19\x67\x9a\xd1\xe4\x02\x12\x3a\xbd\x81\x48\xf0\x78\x67\x0e\x33\x53\xa4\x33\x9c\x1f\x65\xa7\x75\x96\xaa\x6a\xaa\xc5\x98\xba\x5a\xe4\x46\xa3\xb2\xa9\x25\xde\x9b\xe1\x04\x0a\xf4\x2b\xdb\x55\xee\xa5\x7f\x82\xec\x8d\x49\xcc\xe6\x9d\x34\xb9\x89\x3f\x88\x7b\x22\x86\x1a\x38\x39\x62\xdc\xef\xe3\x71\x49\x0d\x2c\xec\x93\x01\xad\xcd\xd5\x97\x2f\xfc\xcd\xcf\xcf\xf0\x88\x26\x56\xa5\x1e\xdf\x0e\xec\x5e\xb4\xde\x10\xec\x6e\x1c\xe6\x49\xd5\x18\x6c\x0d\xc4\x55\x7a\xf3\xb2\xa8\xa6\xfc\x12\xe7\x0d\xa7\x8d\xf2\x98\xb8\x5c\xb4\xe7\xb7\x69\xb5\x23\x6b\xaa\xa2\x5f\x88\xa4\x59\x67\x37\xbe\x3d\xef\x5b\xb3\x71\x6b\x2e\xd9\x17\x73\xc9\x27\x8a\x4e\xd9\x43\x41\xf7\x89\x46\xa4\xb4\x82\xee\x16\xa3\x94\x9d\xfa\xbd\xa4\x11\xf4\x1b\x97\x11\xfc\x71\x22\x71\x2e\xa9\x23\x80\x41\xe4\xf3\x87\x87\x03\xc4\xf6\x34\x85\x8c\x5e\xcc\x95\x1d\xe6\x49\x32\x25\x79\x26\x78\x35\xff\xd9\x7a\xdb\x67\xd3\x69\xd1\x24\xbf\xe0\x2d\x85\x60\x99\x49\xe1\x78\xa6\xcc\x39\x37\x34\xb8\x68\x89\x86\x82\x24\x16\x6a\xa6\x95\xa4\x5d\xc5\x46\x66\xf9\x86\xff\x61\x3e\x6f\x11\x82\x58\x99\xd0\x3c\x3d\x14\x32\x62\x83\x64\x4a\xc6\x34\x09\xfd\x6f\x28\xb9\x63\x49\xe2\xa6\xe9\x91\x1b\xd0\xd6\xa5\x60\x79\x67\x22\xf8\x08\x17\x47\xb9\xef\xbb\x08\x91\x79\x36\x4a\x80\xf2\x3c\xb3\xef\x33\x9c\x78\x2a\x72\xe9\xdf\xd7\x0b\x8e\x89\xc0\x81\x39\x4b\x3a\xa5\xee\x6e\x2b\x37\x36\x44\xff\xe4\xca\x08\x00\x6f\x7c\x61\xea\x4e\x79\x4e\x5f\x3b\x5c\x95\x7a\xfb\x64\x52\x4c\x58\x6c\xbd\x1b\x1e\x6c\xd8\x47\xda\xf6\xef\x09\xe7\x99\x0b\xde\xe5\x30\xa2\x28\xa8\xb8\x53\x64\xf7\xcc\xce\x63\x63\x08\x78\x8c\x1d\x7d\x8c\x84\x2f\xb2\x4a\x42\xfd\x84\xd9\x5e\xc4\x25\xc8\x91\x23\x2e\x88\xc0\x88\xd4\x9c\x33\x6d\xfb\xdb\x8f\x73\x4d\x62\x71\xcf\x8f\x4b\x7e\x57\x32\x00\xbd\xda\xeb\x8a\x8e\xd6\xdb\x85\x00\xaa\xba\x5f\x17\xc9\x39\xf6\x7b\x57\x83\x97\x29\x67\xfa\x1c\x92\x9c\x2b\xa8\xc9\xde\x1b\x13\x8e\xbe\xf9\xfd\x6e\x34\x82\xa5\x20\x72\xfd\x51\xb4\xbf\xfb\x31\x8b\xc6\x65\x61\x96\xa5\xa0\x88\xc8\x67\xd4\xe2\x97\xee\xb1\xc5\x3b\xd4\xaa\x80\x8b\xc6\xae\x86\xdd\x05\xd6\xaf\xd9\x82\x08\x45\xe3\x6b\x8c\x14\xbf\xb8\xbe\xf9\xe5\xd5\xd9\x5f\x2f\x5f\xf5\xc8\x25\x8d\xc6\xe5\xaa\x18\x9c\x50\x24\x1a\x48\x28\xc6\x74\x02\x84\x92\x9c\xb3\x7f\xe5\xce\xe1\x7b\x14\x9e\x3d\x6e\xb4\x5a\xfb\x8e\xdc\x17\x9b\xf3\x37\xd6\x0d\xce\xb6\xfa\xb7\x91\x59\x42\x01\xf6\x6f\x99\x15\x9f\x2e\xcd\x25\xab\x1c\xa0\xa8\x85\xa1\xf3\x23\x36\x71\x64\xd8\x95\xbf\xa7\x71\x88\x15\x33\x78\x6e\xd0\xc2\xb0\x2a\x3a\xc0\x18\xaf\x31\x10\x0e\xda\xa0\x75\xb0\x31\x09\xae\x2a\xe5\x49\x72\x05\xaa\x43\x06\x39\x46\xa5\x65\x92\xa5\x54\xb2\x64\x5a\x9e\xcc\xf0\xaa\xeb\xe0\xf2\x9e\xce\x2e\xe9\xe2\xcd\xe5\x0d\x66\x09\x64\xd2\x16\x2e\xc1\xb0\x32\xbc\x8e\x9f\x35\x00\xf3\x84\xeb\x22\xdc\x23\x67\x7c\x6a\x2f\xda\x03\xce\x14\x49\x98\xd2\x80\x2c\xd8\xc9\x90\xde\x99\x7e\xf0\xa2\x87\xff\x3b\x30\x5f\x29\x8d\x90\x19\xa2\xe5\xa2\xb9\xf0\x55\x2b\x86\xb2\x41\x52\x82\xa6\xfb\xf6\x67\xd5\x0f\xae\x08\x12\x32\x40\x2c\xf5\x83\xa3\x61\xab\x11\xbc\xb6\x3f\x20\xe3\xa3\xa4\x8c\x55\xbb\x91\xfd\xba\xba\x65\x5d\xcd\xb2\x5b\x7c\x41\x7f\x57\x05\xb3\x91\xbe\x74\xc5\x1a\x1a\xea\xe6\x54\x70\x3f\xaf\x4e\x39\x8a\x20\xca\x0d\x7a\xaf\xfa\xfe\x04\x38\xe9\x26\x9d\xe9\xea\x9a\x15\x31\x49\x1d\xf2\x82\xfc\x89\x3c\x90\x3f\xa1\x7a\xf5\x4d\xdd\xde\x57\x75\x15\x9f\x26\x42\x8c\x8c\x56\x7f\xd5\x6f\x08\xe2\x7f\x33\xd4\xc9\xcc\x68\xa0\xaa\x05\x19\x30\x27\xce\xc3\x83\x06\x69\xe8\xa8\xdb\x89\x4f\xda\x35\xcc\x2c\xf0\x23\xa2\x99\x75\x37\x5c\x0d\xab\x61\x4d\xdb\x21\x9a\x79\xfc\x07\xa1\xf4\xb5\xa3\x42\xd5\x16\x38\xc5\x6c\x29\xd5\xd1\xb8\x4a\xc6\x8c\xa0\xa6\x74\x71\xc0\x14\x89\x05\x46\x59\xd9\x00\xe6\x31\xab\x11\x3c\xb1\x3f\x68\x5c\xcf\x9f\x5e\xd9\xcf\x55\x3b\x35\x63\x40\x41\xcd\xc7\x09\x56\xa5\xda\x58\x99\x88\x9d\x4c\x66\x96\x15\x97\x78\xc6\x0a\xa1\xcc\xd9\x6a\x82\x95\x19\x71\xc9\x9c\xa7\x88\x72\x9b\x42\x32\x04\x29\x6d\xcc\xf9\x60\xea\x83\xf5\x6a\x6f\x5e\xad\x93\x94\x49\xa1\x45\x24\x6a\x34\x36\xab\xfa\xb8\xdd\x74\x08\x04\x1b\xe7\xeb\xcd\xe4\x3f\x5d\xf4\x3b\xe4\xf6\xbc\x8f\xfd\x9e\x6e\xce\x6f\xfb\x55\x4d\xe5\xe0\xf6\xbc\x7f\xf0\x49\x41\x41\xbc\x64\x85\x86\xe9\x1d\x26\xa9\x18\x9e\x8c\xd8\xd6\x4d\x69\xd6\xbd\x83\xe9\x8e\x3c\xb5\x09\xbe\xde\x0d\x3b\xdc\xc8\x07\x59\x30\xa7\x34\xdb\x7a\x36\x09\x34\x66\x1f\x29\x8f\xcb\x87\xc1\x86\x77\x2e\x4e\xe8\x4a\xc5\x04\x62\x2b\x0e\xfb\x27\x80\xc7\x99\x60\x46\x5e\x6c\xb3\xbc\xb6\x7f\xba\xcd\xf2\xda\x78\xb4\x59\x5e\x6d\x96\xd7\xfc\xd8\x9b\x40\xd6\x36\xcb\xeb\x79\xf9\xed\xdb\x2c\xaf\xcf\xde\xf9\xdf\x66\x79\x2d\x1e\x6d\x96\x57\x9b\xe5\xb5\xd9\x68\xb3\xbc\xb6\x1f\x7b\x17\xb6\xd4\x66\x79\x6d\x35\xda\x2c\xaf\xf9\xd1\x66\x79\x2d\x19\x6d\x96\xd7\x92\xd1\x66\x79\xb5\x59\x5e\x6d\x96\x57\x1b\xfc\xba\x76\xae\xfd\x0c\x7e\x25\x6d\x96\x97\x1b\x6d\x96\xd7\xb3\x08\xf1\x23\x6d\x96\xd7\x46\xa3\xcd\xf2\x6a\xb3\xbc\x76\x19\x6d\x96\xd7\x73\x31\x97\xb4\x59\x5e\x6d\x96\xd7\xe7\x23\xe8\xb6\x59\x5e\x6d\x96\x57\x9b\xe5\xd5\x66\x79\xad\x5c\x45\x9b\xe5\xf5\x1c\x54\x40\xdf\x0b\xb8\x7e\xd6\xd2\xe1\xb9\x48\xb3\x5c\x03\x79\xeb\xa7\x0c\x52\xa4\x25\x0c\x4c\x95\x25\x82\xfa\x41\x84\x91\xe0\x43\x36\x72\x94\xfd\xc4\x36\xe0\xed\x86\xef\xe9\x96\x9a\xde\x3e\xc1\x08\xc2\x84\xa5\x6c\xb7\x54\x32\x32\xb7\x31\xaf\x70\xae\x92\x5f\xc6\x9c\xa4\x94\x3e\xe0\x11\xa1\xa9\xc8\x6d\xd3\xe2\xc8\xed\x5f\x00\xa1\xf5\x5e\xed\xdd\xce\x90\x66\x54\x9c\x22\x27\xae\xdf\x44\x58\x09\xd5\x1a\x24\x3f\x25\xff\x75\xf4\xfe\xcb\x5f\xbb\xc7\xdf\x1e\x1d\xbd\x7b\xd1\xfd\xe3\x87\x2f\x8f\xde\xf7\xf0\x1f\xbf\x3b\xfe\xf6\xf8\x57\xff\xc7\x97\xc7\xc7\x47\x47\xef\x7e\x7c\xfd\xfd\x6d\xff\xf2\x03\x3b\xfe\xf5\x1d\xcf\xd3\x3b\xfb\xd7\xaf\x47\xef\xe0\xf2\xc3\x86\x93\x1c\x1f\x7f\xfb\xc5\xce\x4b\xae\x2d\x12\x37\x27\x10\x37\x24\x0e\x3f\x8a\x30\xec\x1c\xba\x0d\x9d\x45\x17\x8c\x32\x77\x1a\x1d\xc3\x5a\x75\x1a\x3d\x35\x45\x31\x2f\xcc\xc3\x14\x11\x29\xd3\x46\x38\x34\xf2\x20\x2d\x07\xb4\x32\x5d\x51\x4a\x1d\x1d\xc0\x90\x6e\xaa\x6d\x8b\xf5\x10\x0c\x5a\x0a\x62\x11\x5e\xf2\x73\x3d\xe8\x59\x9a\x25\xd8\xda\x1c\xcf\x73\xd7\xc7\xb2\x20\x73\x6d\x69\xc3\xfa\xd1\xd2\x86\xe7\x48\x1b\x14\x44\xb9\x64\x7a\x7a\x2e\xb8\x86\x87\x9d\x2c\x2c\x55\xd2\x70\x53\x9d\xd0\xc5\x8c\xb9\x3c\x6e\x77\x8d\x88\xcc\x46\x7e\xcf\x24\xd4\x8f\x45\x9e\xc4\x98\xce\x91\x73\x54\x30\x6d\x9e\x1e\x68\xab\xfd\xa1\xde\x83\xc1\xdc\xb3\x2f\xf1\xfa\x9c\x55\x33\xff\x95\xb3\x09\x4d\x8c\xb6\x5b\x3c\xd1\x47\x0d\xa6\xfc\xd0\xa6\x67\x5e\x53\x75\x57\x1c\x78\xe8\x1a\x19\x3a\xac\xf9\xc4\x7f\x12\xfe\x04\x0f\xfa\x29\x4a\x69\x28\x20\xf5\x25\x9b\xb0\x04\x46\x70\xa9\x22\x9a\x20\x5d\x6b\x86\x57\x9c\x2d\x99\x1d\x37\x5e\x8a\x44\x91\xfb\x31\x18\x5a\x4d\xa8\x37\x01\x60\x8e\xdd\x88\x32\x4e\x52\xb3\x45\x99\x7f\x58\x59\x5b\x82\x21\xff\x19\x95\x66\x83\x83\xcd\x00\x55\xe4\x81\x10\x89\xcb\x79\x48\xa6\xc5\xfc\x2e\xfb\x87\x8b\x5f\x38\xdc\xff\x62\x66\x53\x64\x98\xd0\x51\x30\x15\x28\xd0\x73\xd6\xbe\x62\xea\xa5\x1f\x80\x09\x05\x39\x10\x9a\xdc\xd3\xa9\x2a\x0c\x27\xa5\xca\x0f\xea\x94\xbc\x3c\x46\x74\xa6\x8a\x84\x39\x62\xf2\xd5\x31\xba\xff\xce\xcf\xfa\xbf\xdc\xfc\xfd\xe6\x97\xb3\x8b\xd7\x57\xd7\xe4\x5a\x68\xb0\x4c\xad\xd4\x20\x30\x0a\x1a\x86\x59\x25\xbe\x03\xb5\x74\xa1\x7a\x68\xbb\x64\x8a\xdc\x33\x1e\x8b\x7b\xb5\xb3\x8d\xd6\xa2\x9f\x01\x1e\x50\xbe\xd3\x1c\x11\xcd\x28\xf6\x3d\xac\xc1\x61\xe6\x22\x4c\xca\x93\x22\x0f\x8f\xe3\x93\x58\x8a\xcc\x02\xc1\x1b\xb9\x0a\x56\x5b\x55\xa3\xcb\x31\xac\xb8\xbf\xc3\xea\x84\x23\x49\xb9\x2e\xac\x3d\xc5\x9e\xb9\x86\x8b\xbd\xda\xdb\xf1\xb4\x73\x9a\x68\xdc\x5c\x3e\xd3\x59\x1c\x43\x5c\x01\xff\xb3\x8b\x1c\x3c\xf7\x1f\x37\x2d\xea\x54\x90\xfe\x9b\x9b\xab\xff\x33\x83\xc7\xd3\xac\x5e\xa0\x54\x33\xb9\xb1\x52\x64\x8d\xed\xee\x5b\x97\x7b\xd9\xee\xef\x5e\xec\x6f\xe0\x96\xcd\xb8\xe7\xdf\xe6\xbc\x5a\xca\xa8\x98\x9f\xa4\x22\x86\x1e\xe9\x07\x3f\x41\xf5\x6a\xa9\xc4\x01\x95\x40\xcc\x2d\x5c\x33\x9a\x24\xd3\xb2\x88\xa6\x85\xcd\x43\xac\x54\x67\x28\x13\xf2\x21\x4d\xd4\xa7\xa6\xc6\x75\x78\xa3\x91\x23\x5e\x1b\x7d\xb8\x91\xed\x08\xb3\x91\x18\xb8\xd0\x4e\xb0\x36\xab\xc4\x8a\x17\x52\x44\xc4\x2a\xdf\xa5\x60\xac\x0a\x7f\x53\xd6\x57\xe1\x59\x23\x53\x1e\xd8\xfd\x30\xb3\x35\x54\xe7\x0a\x66\x05\x74\xdf\x8b\x38\xa8\xe3\x66\x76\x09\x34\x16\x3c\x99\x62\xe4\xa5\x8d\xa5\x48\xa9\xba\x83\xd8\xfe\xe0\x44\xb3\xe0\xa9\x30\x33\x86\x57\xdd\x9a\x75\x7b\xb7\x04\x8a\x64\x36\xc2\x03\xdd\x19\x10\x7f\xe2\x5d\xaf\x71\x08\x0d\x50\xde\xf0\x64\xfa\x56\x08\xfd\x5d\x48\xa4\x6d\x04\x03\xfe\xe6\xa4\xe5\xaa\x29\x1a\xc5\x49\x8a\xef\xed\xe2\x6e\xe0\xa1\x2a\xe7\xf0\x5e\x14\x3b\xfe\xd4\x8f\x94\xcc\xf9\x99\xfa\x5e\x8a\x7c\x67\x26\x36\x27\x6c\x7e\x7f\x75\x81\xa4\x28\x77\xae\x4a\xae\xe5\x14\x8b\x07\xcc\xd7\x7d\x0b\x8a\xc1\x4f\xce\xd9\x5a\x3e\x13\x85\x5f\x8c\xbc\xa6\x53\x42\x13\x25\x3c\x2c\x19\x5f\xa8\x85\x3a\x15\xd7\x5c\x1e\x08\x3d\x9e\xd3\x6d\xcd\x81\x9a\x7f\xae\x53\xf2\x5c\x16\x85\xe8\x18\x9f\x7b\x5c\xd3\x3b\x50\x24\x93\x10\x41\x0c\x3c\xfa\xd4\xdb\xfe\xa9\x1d\x7e\x88\x3a\xd7\x82\x9b\x83\xd9\x08\xf2\x5c\x05\x4f\xaf\x03\x69\x19\x55\xd0\x67\xec\xb4\x3f\x8a\x9e\x63\x3c\x96\xb9\x02\x69\xdd\xdc\x32\x07\xbb\x93\x3f\xe6\x03\x48\x0c\xe4\x8d\x4a\xea\xba\xc5\x5b\x73\x06\x4b\xe9\x08\x08\xd5\x01\xd3\xb4\x20\xc0\x95\xa1\x98\xd6\x00\xaa\x49\x2c\xa0\xc8\xbf\xa7\x8a\xfc\x74\x75\x41\x5e\x90\x23\xf3\xae\x63\xc4\x1f\x6c\x26\xaf\x85\x0d\x72\x9b\xd5\x51\x87\x7e\x0a\x5c\x12\x22\x2f\x11\xd2\x12\x89\x0e\xe1\x82\xa8\x3c\x1a\x97\x3b\xd8\x7b\xb5\xd9\x05\x42\xa2\x6b\x65\x3f\x71\xfd\xd3\x52\xa8\x9f\x14\xc8\xc6\x08\xd4\x4f\x3b\x10\xa8\xb2\x18\x65\x70\xae\x0a\x3d\x8b\x58\x29\x68\x1a\x53\x4d\x1d\xe1\xf2\x37\xec\xed\x96\x7e\xde\xe4\x4b\xc1\x2b\xc6\xf3\x07\x1b\x78\xd4\x9c\xa9\xe5\xe6\x12\xa7\x25\x91\x87\x3a\xee\x3a\xcd\xb2\x84\xd9\x7a\x1b\x33\x81\x70\x57\x15\x5c\xe9\x2c\x11\x13\x91\x4e\xd0\x24\x11\x86\x3e\x1a\xe1\x84\xf2\x58\xa4\x73\x2f\x33\x42\x24\x54\x2a\xa6\xf6\x48\x8b\x7d\xd5\xb1\x27\x46\xa1\x04\x26\x50\xa3\xba\xd8\x6c\x85\x58\x33\x9b\x01\x8e\xc7\x08\x9c\x9e\x24\x74\x00\x89\x85\xb1\xc5\x40\x35\x8f\x81\x9f\x3a\x1a\x55\x8a\xa4\xb9\xf4\x99\xb7\x22\x01\x1b\xde\xe5\x01\x61\xa6\x7f\x12\x70\xc0\x49\x9a\x82\x03\x6a\x83\x15\x38\xa0\x5e\xfb\x14\xe0\x90\xd7\x60\xf5\x64\x16\x0e\x46\x6e\xa8\xc2\x01\x99\xf7\xbe\xc3\x41\x41\x14\x89\x34\xeb\x4b\x61\xd4\xce\xc6\x78\x93\x9b\xb6\xf0\x19\x5a\xc3\xc6\x82\x60\x2c\xe4\x05\xd5\x9b\xa9\x2c\x05\x76\x52\x6d\x99\x84\x8f\xee\xfc\xff\x4a\x3c\x0b\x49\xcf\x2c\x23\xf3\xb3\x54\xdc\x8b\xe6\x49\x77\xe1\x29\xb3\x83\x26\x72\x23\x6a\x18\x3b\x1b\xe1\x46\x22\xa2\x09\x56\x8f\xad\x87\x72\x64\x16\xed\x66\x27\x2e\x85\xf3\xa2\x8f\x12\x7f\xf3\x01\x24\x58\x48\x14\x7f\x71\x26\x4c\x2e\x62\x28\xf9\xb2\x6d\x1c\xf2\xad\x0d\xfb\xc4\xfb\x7c\x24\xb1\x91\x2b\xbc\x5b\x39\xae\x3c\xad\x85\xab\x81\xf6\x3a\xd4\xa4\x35\x0b\x04\x1e\x33\x3e\x42\xbb\x5a\x87\x48\x48\x6c\x0c\xb2\x23\x02\x77\x56\x83\x3c\xc4\x23\xe1\x27\xf5\xe7\xc1\xbf\x1a\x65\x31\x26\xb8\x9b\x19\x2d\x45\x5e\xc2\x1a\x5a\x72\xcb\x14\x39\x78\xe5\x01\x50\xa3\x88\xe7\x3e\x72\x98\x03\xfb\x85\x61\x37\xad\xa5\xf3\x8e\xf1\xd8\x85\xeb\x56\x80\x15\xca\xad\x5b\x39\x18\x03\xc1\x59\x5c\xa6\x2d\xa7\xe4\x3d\x27\x01\x58\xa4\xbb\x33\x7a\xbc\xb5\x22\xb3\xb7\xd1\x75\x57\x1b\x5e\xc3\x4b\x66\xa7\xf9\x89\xe3\xde\x9b\xf7\x76\x8d\xe6\x3e\x7f\x9f\xff\x96\x4f\x5a\xba\xc7\x51\xbf\xa6\xb5\x98\xbf\xd9\x69\xbd\x48\x1f\x19\xb4\xd6\x8c\x8f\x54\x59\x93\xa1\x49\x52\x31\x86\x2f\x52\x65\xfc\x0e\x87\xe2\xfa\xf3\x2a\xc4\x4c\x9a\xc1\x53\x51\x43\x12\x23\x4e\x3c\x71\x25\x64\x94\x2a\x7a\x2e\x0d\x24\x34\xa3\xc9\x4d\xb6\x7b\x91\x52\x32\x57\x10\xef\xf5\xcd\x59\x75\x6a\x64\xd6\xd8\xfb\xc1\xec\x95\xb9\x4e\x68\x9c\x32\xa5\xd0\x10\x06\x83\xb1\x10\x77\xe4\x68\x41\x3d\xae\x52\x9c\x96\x62\x23\x75\xe2\x70\xbe\x6b\x56\x7f\x4c\x18\x4f\x42\x54\x14\xea\xc1\x5c\x2b\x6f\xc8\xc1\x97\x44\x61\x15\xb8\x87\xae\x72\xb5\x0b\x56\x98\x5f\xa6\xad\x55\x6d\xb0\xe0\x93\x13\xec\xf9\xed\xb9\xae\x59\x76\x65\xcd\x16\x5d\x3b\xdc\x9e\xad\xac\xb6\x10\x8e\x56\x7a\xfc\xe4\x40\x72\xc2\x45\x04\xaa\xb9\x82\x4e\x3f\x14\x73\x92\x18\x6c\x16\x0f\x60\xf4\x13\x5d\x1a\x64\x87\x76\xe9\x43\x4c\x06\x75\x8f\x1e\x96\x25\xea\xdb\x82\xb8\x18\x7d\x24\xc9\xc6\xb4\x6b\x95\x74\x43\xd1\x90\x04\x7a\x11\x62\x2c\xb8\x70\x49\x12\x86\x89\x0a\x8e\x28\x8d\x24\xca\x7a\xf3\x70\x4f\x1c\x89\x2e\x2d\xf5\xbc\xf0\x12\x97\x1d\x81\x98\x4c\x66\xeb\x47\x14\x6b\xb8\x67\x7a\xec\x7b\xbd\x54\xbc\x86\xb8\x12\x09\x0a\x1d\x30\x9c\x80\x94\x42\xba\x80\x2c\x6f\xb7\xc6\x99\x90\x92\x63\x44\x97\x41\x12\x6a\xfe\x3a\x54\x65\x47\x75\x51\x0c\x1e\xe3\x15\x0d\x36\xc1\x70\x08\x11\x0a\x5a\x65\x00\x5b\xaa\x7d\x54\x94\xbe\x75\x59\x06\x06\xc1\x5c\x31\xf9\x94\x3d\x98\xb7\x94\x9f\x2a\xbb\xc4\x5d\xc9\xd9\xc5\x97\x8f\x7b\x84\x5c\xf1\x10\xc1\xdb\x31\xbb\x58\xbe\xd3\x87\x9e\x69\xf3\x89\xe5\x4e\x04\xf8\x01\x65\xc3\x99\x91\x0e\x65\xde\x00\xc6\xd7\x31\x87\x93\xb2\x49\xbc\x51\x72\x80\xa6\x71\x37\xa9\xd9\x7a\x2f\x03\xd4\x31\x95\x9b\x5b\x1e\xcb\x5c\xfe\x34\x1c\x20\xa4\x2e\x9d\x73\xd5\x14\x1a\x2a\x0f\x7f\x53\x9a\xad\x24\xbd\x07\x87\x5b\x5f\xc4\xb6\x9a\x4a\xa8\x06\x81\x5d\x9d\xb0\xba\x0b\xfb\xb7\x97\xcf\x0a\x19\x8f\x0b\x9b\x1d\x50\x2e\xb3\xe2\x8a\x6a\xc7\xc4\x88\xda\x89\xb7\x2d\xa4\x59\x02\x98\xc5\x59\x9a\xb9\x48\x50\x2d\xd5\x93\xef\x84\x85\x14\x25\xe9\x5d\x71\x97\x0e\xf9\x27\x1e\xca\x10\x88\xea\xeb\x4e\xf4\xc3\xe3\x56\x43\x64\xca\x37\x97\xc0\x0c\x4b\x2d\xbc\xe9\x82\xc4\x6c\x38\x04\x1f\xf0\x6a\x34\x47\x2a\x69\x6a\x48\xbc\x22\x0e\x04\x03\x18\x31\x1b\x10\x19\x08\xdb\xa1\x11\xf7\x5c\xae\x5f\xc7\x12\x43\xa6\x49\xca\x46\x63\x8b\x28\x84\x62\x86\x2e\xf1\x4e\xc5\x44\xd0\x98\x20\x6e\x0b\x49\xee\xa9\x4c\x0d\xdf\xa0\xd1\x18\x3d\x94\x94\x93\x38\x97\x58\x67\x59\x03\x8d\xa7\x5d\xa5\xa9\x36\x92\x32\x48\xa7\x50\xfa\xf5\xb7\x45\xf5\x57\x8e\xb6\xa8\xfe\x86\xa3\x2d\xaa\xdf\x16\xd5\x9f\x1f\x7b\x13\x1d\xda\x16\xd5\x7f\x5e\x65\x92\xda\xa2\xfa\x9f\xde\x9f\xd0\x16\xd5\x6f\x8b\xea\xaf\x1a\x6d\x51\xfd\x35\xa3\x2d\xaa\xbf\xc3\x78\x06\x94\xab\x2d\xaa\xbf\xc3\x68\x8b\xea\x2f\x1e\x6d\x51\xfd\xf9\xd1\x16\xd5\x5f\x3a\xda\xa2\xfa\x3b\x8f\xb6\xa8\x7e\x5b\x54\xbf\xad\x35\xba\xdd\x5c\xfb\x59\x6b\x94\xb4\x45\xf5\xdd\x68\x8b\xea\x3f\x8b\x8a\x8a\xa4\x2d\xaa\xbf\xd1\x68\x8b\xea\xb7\x45\xf5\x77\x19\x6d\x51\xfd\xe7\x62\x2e\x69\x8b\xea\xb7\x45\xf5\x3f\x1f\x41\xb7\x2d\xaa\xdf\x16\xd5\x6f\x8b\xea\xb7\x45\xf5\x57\xae\xa2\x2d\xaa\xff\x1c\x54\x40\xa5\x63\xb6\x53\x0d\xd0\x4d\xca\x15\xb9\x30\xf4\x52\x75\x80\x41\x3e\x1c\x82\x44\xca\x85\x6f\x9e\x0b\x9f\x2a\x2a\x33\xce\x3a\x59\x41\x77\xb0\xf2\x91\xcb\xd8\x59\xf2\xb8\x2b\x47\x80\xb5\x3a\x8b\x58\xf1\xcb\x37\xdf\x2d\xa8\x8d\xb4\x73\x5c\xe1\xae\x51\xd2\xb8\xe6\x37\x7c\x37\xff\xf8\x12\x80\x2f\xca\x20\x73\x70\x8f\x12\xa1\x5c\x8c\x3b\x02\x2b\x1a\x53\xce\xc1\xeb\x7b\x4c\xa3\x1d\x65\x00\xc0\x89\xc8\xc0\x79\xa7\x29\x51\x8c\x8f\x12\x20\x54\x6b\x1a\x8d\x7b\xe6\x4d\xdc\x03\xbb\x88\x47\x77\xbf\x28\x2d\x81\xa6\x3e\x32\x3f\xa5\xcc\x4e\x45\x68\x24\x85\x52\x24\xcd\x13\xcd\xb2\x30\x19\x51\x80\x29\x35\x96\x51\x05\x60\x60\x5c\x5c\x11\xc4\xde\x29\xde\xe6\x96\x25\xca\xc5\xe9\x50\xdb\xec\x60\x45\xf0\x34\xd3\xd3\x10\xc9\x0b\x64\xc8\xa4\xd2\x24\x4a\x18\x72\x6b\x7c\xa3\xcd\x9e\xc6\xf9\x3a\x9e\x57\x73\xb7\x52\xe5\x96\xca\x63\x14\x5b\x33\xad\x6c\x5c\x6c\x31\xa1\x9b\x2a\x66\xca\x89\xf9\xaa\x43\xa8\xaf\x9c\x66\x01\xed\x57\x8a\xa0\xf6\x9c\xc5\xce\xee\x7e\x2a\x4d\x57\xaa\x18\x5b\x04\x0e\x17\x88\x8e\x49\x0e\x1e\x39\x3b\x95\x7c\x8e\x42\xa0\xc0\x38\xbd\xb9\x63\x80\x1b\xc0\x61\x62\x70\x00\x22\x30\xfc\x95\x2e\xc1\xfa\x8f\x8e\xf4\x25\xa6\xf8\x1a\x94\xa2\x23\xe8\xef\xe8\x68\x58\xa6\x91\xa1\xaf\xa1\xd8\x18\x44\x85\xc4\xe6\xd7\x86\x5f\x8a\xf8\xcc\xaa\x18\x44\x52\xbb\xa6\x20\xfc\xdc\x4b\xa6\x35\xe0\xa6\x62\x8d\x3d\xf4\x55\xce\xa6\xe0\x1f\xce\x44\x79\xbe\xf6\x93\x14\x0f\x1b\xa2\xce\x63\x1b\x73\x39\x00\x32\x90\x0c\x86\x64\xc8\x30\x90\x13\x43\x2b\x3b\xb6\xe4\x12\xb5\x56\x00\xa5\x8c\xbe\x2b\xb8\x97\x65\xfd\xba\x7a\xe4\x6f\x6e\x61\x5a\xe6\x3c\xa2\xa5\x6a\xb6\x98\x63\xca\x86\x64\x84\xa1\x99\x4e\x5a\xfc\xfd\x8b\x3f\x7e\x43\x06\x53\xc3\xd2\x50\xb2\xd2\x42\xd3\x24\x7c\x64\x02\x7c\x64\x60\x65\x8f\x67\x35\x4b\x32\x40\x00\xfb\x79\xd8\x85\xbf\xfc\xea\x6e\x50\xe5\xb1\x27\x31\x4c\x4e\x4a\xf0\xeb\x26\x62\xb4\xa8\x43\xca\xee\x41\xdb\x3b\xaa\x44\x0b\xd0\x4c\x24\x2c\x9a\xd6\x46\x34\x5f\xfb\x8b\x8c\xc5\xbd\x95\xf5\x17\x60\x4f\x91\x70\x95\x89\x2c\x4f\xac\xd1\xf9\xbb\x90\x5f\x9c\x2b\x98\xcf\x02\x5c\x78\x2e\xd0\x4c\xea\xa6\x98\xad\x9c\x6e\x23\x72\xfd\x2b\x85\xcb\x2e\x71\x86\xbc\x50\x02\x0c\x15\xa1\xef\x68\x92\x0c\x68\x74\x77\x2b\x5e\x89\x91\x7a\xc3\x2f\xa5\x14\xb2\xba\x96\x84\x1a\x6a\x39\xce\xf9\x9d\xed\xe1\x10\x8a\x24\x88\x91\x11\xad\xb2\x5c\xfb\x54\x86\x45\x1f\x6c\x33\xe6\x3d\x11\xf6\x6a\x50\x31\x0b\x3c\xb0\x42\xd7\x71\xc9\x5a\x16\x23\xcb\xf3\xab\x32\xb2\x7d\xf5\xe2\xf7\x7f\xb0\xa8\x4b\x84\x24\x7f\x78\x81\x51\xdb\xaa\x63\x0f\x31\xd2\x36\xc3\x28\x52\x9a\x24\x46\x6d\x28\x23\xa5\x01\xf4\x22\x24\xfc\xe8\x38\xa8\xeb\xa3\xdb\xc6\xa2\xd4\xed\xed\xdf\x51\x8e\x62\x5a\x41\x32\xec\xd8\xbc\xa4\xa0\xd6\x1c\x22\x63\x38\x74\xd4\x07\x93\xc3\xf6\x40\x00\x9a\x88\x24\x4f\xe1\x02\x26\xac\x89\x36\x4e\x95\xd9\xbc\xaa\x9f\x30\x85\x29\x60\x83\x44\x44\x77\x24\x76\x17\x4b\x91\x27\xb3\xb5\xc0\x77\x87\xc2\xae\x31\x38\x35\x62\x6f\x96\x7e\x7f\x25\xea\x26\xa5\x59\x16\xb2\x84\x24\xbd\xaf\x00\x03\xcf\x24\x16\x2c\xa8\x59\x51\xa6\xb6\x99\xb9\xae\x91\xb9\xeb\xbe\xc8\xd0\xcd\x9d\xa7\xd8\x39\xea\xa4\xbe\x8d\xba\x58\xfd\xee\x86\xc9\x0a\x42\x14\x13\xfa\xd3\x90\xe1\xbf\x6d\x5e\xc9\x5c\x5e\x64\x48\xad\x0b\x88\x61\x05\x00\x83\x3e\x48\x92\x77\x37\xb8\x36\x60\xdd\xac\x17\x72\x54\x81\x0b\x0f\x56\xe5\x94\x6a\x27\x10\x7a\xf3\x35\x25\x19\x48\xc5\x94\xe1\xcb\x3f\xe3\x81\x3a\x4f\x28\x4b\x4b\x26\xc0\x4f\x03\x04\x7b\xb8\xb1\x80\x72\x7d\x4a\xd9\x17\xb1\x9b\x10\x49\xa1\x2d\x1e\xbd\x40\xac\xad\x4a\xb5\x0d\x32\xd4\x4f\x4d\x2a\x7f\x2e\xa0\x59\xa5\x94\xe6\x97\x40\x2a\xed\x5d\xcf\x89\x40\xe2\xf7\x3d\x55\xfa\x18\x16\xdf\x10\x19\x40\xc2\xe8\x36\xb7\x4a\x09\x2b\xca\xa3\x3d\x28\x25\x91\xde\xe9\x81\x3d\x62\xbd\xe0\xe6\x4c\xb8\x47\xc9\xe1\xe9\xe1\x27\x25\x92\x16\x44\x52\x64\x74\x54\xab\x9b\xcf\x0c\xa4\x66\xa7\x2d\x97\x9a\x30\x6a\x10\x5e\x0f\x85\xd7\xf0\x2e\x88\x8b\x4a\x3a\x58\x27\xc9\x7a\x47\x3d\x80\x9d\x82\x60\x33\xb2\xef\xe9\x94\x50\x29\x72\x1e\x3b\xfb\x52\x30\xf0\xbd\x9e\x79\xf1\xb5\xe0\xe0\x0d\xe7\xb3\x95\x2a\xd0\xa2\xcf\x38\x79\xd9\x7b\xf9\xe2\xb9\x70\x2a\xfc\xc2\x19\x4e\x75\x1d\x38\x95\xa5\x4f\x9f\xf4\x5b\x7d\xcd\xfb\x86\xbe\xf7\xb5\x33\xb1\x14\x25\xed\x99\x2f\x98\x8d\x3f\xdd\x4b\xa6\xa1\xd4\xe5\xef\x08\x15\x17\xa3\x1f\x96\xea\x32\x1c\x2f\xea\x25\x51\x13\x48\xf5\x0a\x61\xa8\x7c\xf0\x88\x74\xcb\x11\x28\x3c\x6e\x8b\x2c\x5c\x6a\x05\x09\x2b\x03\xea\xe0\x80\x1c\xd9\x3b\x0f\x6d\x4a\xf3\xf1\x27\x45\x2d\x07\xb4\xcb\x87\xac\x46\x95\xcd\x99\xec\xf9\x8c\xa2\x0d\x2e\x6b\x10\x82\x7f\x85\x31\x9d\x00\xa6\x72\xb3\x84\xca\x04\x7d\x8e\x37\x76\xed\x64\x90\x6b\x02\x7c\xc2\xa4\xe0\x29\x70\x4d\x26\x54\x32\xac\x8b\x23\x01\x6b\x3b\x18\x5d\xf4\x8b\xa3\x9f\xcf\xde\x62\x40\xc3\xb1\x2b\x4a\xe1\x56\x99\x2b\x5f\xc0\xa6\xbc\x92\xd2\x74\x6b\xb7\xcf\xaf\xc3\xc0\x10\x69\xae\x5f\x97\x79\x4f\x9a\xeb\xdc\x36\x66\x79\x88\x92\x5c\xb1\xc9\xa7\xa2\x24\x2e\xc7\xfe\x82\xed\xb4\xcf\x33\xf9\xfe\x05\xa0\xe6\x52\xf7\xd1\xb4\xbe\x20\x41\x6f\xce\x61\x72\xa8\x42\xd2\x5e\xd9\x07\xee\x4c\x4f\xae\x9a\x86\x0d\x9f\xf3\x35\x17\xe7\x44\x08\xac\x1c\xf3\x69\x8d\x50\x31\x57\xe7\xb8\xc2\xed\xc0\x5a\x0d\x48\xae\xe4\xf1\x5d\x5c\xdf\x94\xcb\x90\x58\x75\x49\xc4\x3d\xd2\x2f\x7e\x2c\x6a\xd5\x60\x05\xb5\xa0\x44\x82\x1c\x15\x65\xc5\x47\xc0\x41\xa2\x90\x60\xa6\xac\x34\x56\x25\x03\xaa\xac\x93\xe7\xe2\xfa\xc6\xda\x6c\xb7\x83\xd9\xce\x62\xf6\xee\x12\xaa\xe1\xf8\x36\x8d\x61\x07\xe1\xb6\xda\x35\x2d\x18\xac\x0c\x60\x50\x29\xb5\x13\x93\xab\x3e\xa1\x71\x2c\xd1\xed\xe3\x44\x9f\x52\xad\xca\xe0\x5b\xc0\xba\x30\x54\x41\x79\x4d\x25\x70\x23\x89\x2b\x00\x4b\x2e\xf2\x2c\x61\xd6\x8d\x50\x7e\xa0\xa8\x67\x83\x6d\xbe\xb6\x47\xda\x3a\x6a\xde\xce\x4a\x5e\x0d\x2a\x24\x76\x2d\x4b\xb9\x62\xf7\x24\x28\x91\x4c\x8a\x92\xc2\x33\xbb\xe6\x4e\x04\x9a\xc4\xc3\xae\xf9\x2a\x94\x1b\xed\x18\x70\x2d\xcd\xd1\x9c\xdd\x2d\xec\x63\x9f\xe4\x78\x9a\xc2\x84\x6c\x02\xe8\x1f\x77\x05\x38\x5d\x21\xb7\xa2\xc8\xb1\xf5\x0d\xdb\x3a\xd3\x40\xa5\xa7\x68\xb8\xaa\x1d\x4f\x22\xf9\x54\x88\x30\x6b\xec\xb8\xb8\xbe\xb1\x94\xd0\x7e\x7c\xe8\x4f\xbb\x68\x97\x0a\xaa\xb6\x33\x06\x7e\xb2\x3a\x43\x75\x34\x8f\x99\xf6\x7e\xae\x61\x77\xad\x40\x96\x1a\xe2\x5f\xad\x64\xbb\x1a\x6f\x57\x40\x65\x34\xde\x05\xfe\x2b\x08\x81\x9d\x94\xc4\xc2\x46\x02\x0c\x85\x44\x95\xb8\x8b\xe4\x3d\x11\xe2\x2e\xcf\x36\xa1\xe8\x6e\x1a\xdb\x72\x6d\x23\x02\x51\x79\xe2\xb3\xa2\xe9\x31\x57\xbb\xf8\x7b\xab\xb2\x0f\x68\x2b\xf1\xe0\x44\x45\x02\x85\x98\xd5\x9b\xce\x93\x5c\x69\x90\xdf\x31\xa9\xf4\x81\xaf\x18\x8d\x18\x6c\x6d\x22\x87\xe5\x1b\xfe\xc6\xf4\xd8\x15\x6f\x3c\xec\x54\x2f\x99\xbf\xdd\xc4\x87\x46\xa7\x3d\xbc\x16\x1c\x0e\x7b\xb3\x62\x57\x20\xe5\x81\xac\x2d\xe5\x29\x6e\xe9\x0a\x12\x1b\x2f\x8a\x17\x4a\xb8\x72\xeb\x0a\x57\x9a\x37\x78\xfa\xa7\x40\x13\x8a\x45\xe2\xf0\xee\x71\x51\x68\xd2\x56\x8e\xb2\x95\x32\x85\x13\xf4\xa6\x65\x10\x95\x8a\x49\x69\xb1\xfc\xb3\x77\x91\xe7\xb6\xc6\x00\x5b\x80\xd4\xd5\x0b\x79\xc5\xf8\xdd\x96\xe8\x57\x8d\x2e\xb9\x9c\x9b\xad\x52\x51\xdc\xfa\x68\x19\xb7\xc1\x77\x86\xc5\xd0\x81\xc8\xb5\xaf\x49\xa2\x4a\x8a\x23\xe3\xff\xb4\x7b\x81\xf6\xf6\xcc\xd6\xec\x5b\xa4\x23\xaa\x8e\x35\xfa\x78\x25\x50\x4d\xb9\xa6\x58\x5d\xf4\x42\x44\x77\x20\x49\x62\x96\xd1\x23\x45\xe0\x4b\xa5\x9e\xa5\xcc\x61\xcb\xa8\x8b\x5d\x2d\x1d\x90\x8d\x21\x05\x49\x93\xa2\xac\x6b\x0d\x50\xbf\x72\x84\x33\xcc\x5a\x8e\x49\xb1\x65\xd1\x5c\x21\x46\x73\x0e\x2f\x17\xdd\x95\xd2\xa9\xaf\x75\xcb\x38\x86\x1b\x3c\x30\x85\x66\xfd\x4c\xc4\xe5\xc4\xb3\x5c\x81\xec\x86\xb4\x40\x97\x7b\xa3\x42\x20\x4e\x0c\x83\x7c\x34\x62\x7c\xe4\xa8\x33\xd2\xf4\x52\xc1\xed\xa0\xe9\x60\xa4\x77\x24\xc1\x96\x9c\x45\xe9\xc1\xc6\x97\xb1\xf2\xfd\xa9\x88\xed\xed\x83\xa9\xd5\x06\xfd\xce\x16\x01\xd2\x57\x9c\x08\xe9\x4a\x23\xd0\x38\xc6\xb5\xcf\x7f\x21\x5e\xad\x7e\x55\x27\xc4\x71\xd8\xc8\xee\xf0\x54\x09\x2c\x2a\x1f\x18\x61\x27\x97\x11\x2c\xb2\x9d\x96\x8a\xfc\xd2\x09\x65\x09\xda\x29\x04\x27\x91\x3d\xc5\x2e\xd6\xcc\x9c\x7e\x7e\x88\x51\x70\xd8\xae\x13\xdf\x79\x39\x8f\x01\x35\x4a\x54\xed\xca\x67\x76\xe2\x31\xd5\xf2\x42\x67\x7c\xc1\xb7\xd8\x80\x71\x0d\x69\x26\x24\x95\xd3\x59\x8f\xa9\xa1\x89\x06\xe3\xcc\x7e\xcd\x6c\x4c\x5f\xc4\xc8\x36\x16\xe0\xd9\xc4\xb6\x0e\x5e\x80\x6a\x0b\x51\x1a\x89\x2e\x17\xc4\x6f\xa0\x61\x0f\x2a\x1a\x43\x9c\x63\xb0\xfa\x28\xa7\xd8\xda\xdc\x10\x0d\x67\x5b\x9f\xba\x28\x40\x8b\x7b\x21\xbe\x30\x64\x25\x4c\x31\x26\x07\xcb\x7e\x9a\x5f\xb0\x7c\xa8\x8d\x44\xb4\x9d\x9d\xb1\xcb\x6b\x08\x4a\xbc\x2d\x9a\x4d\xe0\xc7\xc2\x84\x45\xda\x3f\x34\x5c\x86\xa7\x11\x0d\x0d\x65\xfb\xc2\x95\x1b\x8c\xc0\xd0\x3e\xad\x8a\x4f\x71\x41\x2c\x58\x50\xf4\x3d\x37\x3c\x69\x39\xea\x17\x78\xbe\x06\xc3\x51\x8c\xaf\x6e\xc5\x0a\x6a\x11\xa0\xb4\xe8\xdb\xcd\x9a\x66\xf2\x06\x1c\x6e\x37\x7e\x4e\xb6\xad\x03\x55\x43\xdf\xd8\xdd\x99\xb8\x93\x13\xb0\x8e\x6a\x43\xe5\xa8\xbe\x1a\x78\x78\x26\x47\x79\x6a\x0b\x94\x8b\x99\x1a\xd1\xae\x3d\xb2\x65\xab\x68\xb9\x33\x4c\xf9\xfc\xf5\x45\x39\x49\xa3\x1c\x7d\xee\x53\x5c\x8c\xb0\x57\xd3\xa2\x3b\x6b\xd2\xbd\x32\xea\x67\xb0\x13\x17\xdc\xc3\xe9\xa9\xce\x66\x19\xde\xe6\xf5\x74\xc6\x33\x23\x6f\xa0\x94\x54\x58\x2d\x79\x34\xa6\x7c\x84\x86\x7e\x91\x9b\xf9\xbe\xf8\x02\x57\x24\x21\xce\x23\xd7\x1b\xc3\x47\x78\x7f\xe1\xed\x9b\xae\x48\x11\xb6\xe8\x53\x11\xcd\xfc\x9a\xcb\x9f\x65\x85\x91\x53\xc2\x7a\xd0\x23\x07\x5f\x94\x2e\x1d\xd8\xb7\x67\x52\x98\x57\xb8\xe0\x70\x5c\x55\xc2\x34\x9e\xbd\x83\xf2\xdd\x3d\x72\x69\xde\x81\x3e\x9f\x00\xc0\x52\xfc\xf2\xa0\x00\x5f\x87\x48\x18\x51\x19\x27\x98\x53\x38\x0c\x62\x97\xcd\x3c\x72\x00\xc3\x03\x8f\x11\x83\x5c\xe8\x45\xf6\xd7\x0d\x13\x3f\x34\x55\x77\xea\xc4\x0a\x6b\xdd\x98\x6a\xda\xc5\x7e\x22\x96\x4e\x9d\x58\x03\x42\xd7\x55\x72\xed\x52\x87\x5a\xdd\xb0\xad\x27\xbf\x75\xb9\x63\x5d\x1a\xee\x62\xbc\x4b\xbb\x58\x53\x75\xf7\x68\xd8\x4f\x10\x38\x51\x4b\x97\xaf\x51\xd0\x77\x56\x00\x0f\x05\xdd\x11\x06\xd8\x0e\xa5\x28\xe0\x1d\x62\x34\x5c\xcd\xda\x45\xe7\xf9\xf2\xfa\xf6\xed\xdf\xfb\x6f\xae\xae\x6f\xdb\x63\xdd\x1e\xeb\xf6\x58\xd7\x38\xd6\xc0\x27\xb5\x8f\x74\x50\xf4\x16\xe9\xbe\x33\x55\xf4\x4a\xa9\xe3\xcf\x28\x0a\xed\x92\x4f\x7e\xa6\x46\xd4\xcc\x24\x28\x94\x4c\x8c\xc4\xba\xc8\x5d\xec\x6e\xb0\x8d\xc5\xce\x9f\x7c\x18\xda\x27\x0c\x22\x6b\x30\x38\xe7\xba\x54\xf1\x60\xd1\xae\x95\x3b\xf9\x9d\xff\x72\x75\x71\x79\x7d\x7b\xf5\xdd\xd5\xe5\xdb\x4f\x1a\x55\x51\xb3\x8a\x5d\x95\x29\xef\xc8\x25\x33\x09\x13\x26\x72\x95\x4c\x43\x21\xdc\xc5\x44\x60\x3e\x30\x8f\x1b\xc5\x70\x1a\x6a\xfd\x2e\x7c\xac\x65\xb6\xcd\x32\xdb\x6a\x90\x49\x8d\x02\x26\x4d\xa1\xef\x77\x52\xa4\x0d\xa1\xf0\x8d\x35\x16\x78\xdb\xfe\x22\x7c\x3a\x74\xb5\x0e\x2a\xac\xc7\x09\x8f\x45\x61\x05\x23\x8c\xa6\x99\xae\xd1\xe7\xa0\x91\xba\xa5\xcd\x94\xf8\xb4\x01\x19\xaf\x69\xf6\x23\x4c\xdf\x42\xcd\x3a\x29\x33\x3e\x95\x04\x22\xc3\xe8\xc8\x1d\x4c\xad\xab\xf5\xdc\xbf\xac\x4e\x3d\x97\xbd\x2c\xfb\x7a\x07\x75\x4a\xf2\x36\x59\xaf\xf5\x0e\x6a\x44\x68\xfa\x31\x57\xb9\xd4\x6c\x21\xca\x69\x66\x4f\xeb\xed\x1e\x69\xb6\x56\xeb\x23\xd4\xa7\x3d\x2c\xb3\x7b\x47\x67\xf5\xd6\x65\x24\xc4\xc4\x70\x2e\xb8\x3f\x71\xd1\x69\x5d\xa3\xb8\x76\x2d\xd6\xaa\x13\x0c\xc1\x39\xf9\x2d\xfe\x87\xdc\xbe\xb9\x78\x73\x4a\xce\xe2\xd8\x45\x49\xe7\x0a\x86\x79\x62\x6d\xf6\xaa\x47\x68\xc6\x7e\x06\xa9\xb0\x51\xdc\x1d\xe3\x71\x87\xe4\x2c\xfe\xb6\x4e\x75\x29\x3b\x1a\xdc\x05\xe1\x3d\x53\xcd\xee\xc4\x8d\x73\x3c\x96\x79\x57\x20\x22\xc4\xa6\x40\x22\x6e\xfa\x42\x33\x4e\xc8\x68\x08\x34\x75\x7b\xe2\x11\xbb\x85\xcd\xd2\xd5\xc3\x82\xb0\x5a\xa7\x4e\xa8\xc4\x15\x9f\x12\x95\x63\x45\x1c\x15\x1a\xd9\x61\x6b\xd8\x4e\xf5\x4f\x95\xd1\x08\x3a\xe4\x1f\xe1\x47\x6c\x3d\xaf\xde\x1d\x1e\xfe\xe9\xc7\xcb\xbf\xff\xe5\xf0\xf0\xc3\x3f\xca\x57\x91\x15\xa2\xd6\x3c\x73\x0b\x3a\xb2\xb8\x88\xe1\x1a\xdf\x81\x7f\x3a\x71\xed\x2c\x8a\x44\xce\xb5\xbb\x80\xe9\xcb\xbd\xb1\x50\xfa\xaa\x1f\xfe\xcc\x44\x3c\xfb\x97\xaa\x55\x32\x6d\x2f\x19\x03\x6e\x51\x8d\x34\x1c\x3b\x9a\x63\x0f\x05\x2d\x69\xf8\xa8\xba\x59\x43\x8b\x8e\x68\x0c\xa9\x2d\xda\xf4\x9d\x07\x01\x36\xdb\xf5\x75\x12\x38\x26\x97\x1b\xc9\xb4\x5a\x3f\xef\x60\xf2\xb2\x56\x57\x72\x3b\x1a\x24\x6d\x61\x07\x1b\x06\x18\x42\xc4\x41\xcb\x1e\xe4\xc0\x60\xbd\x96\x52\xb8\x9d\xcf\xfa\x57\x64\x62\x21\xbc\x37\xc0\xf1\xfe\xb7\xef\x1e\x95\xc6\x95\xbd\x7c\x15\x0d\xf1\xd4\xf6\xa6\xf5\xd7\x5d\x41\x01\x15\x6a\x7c\x81\x51\x6c\x8e\xec\x8f\xbd\x28\xcb\x3b\xee\x86\x5e\x0a\xa9\x90\xd3\xf0\x67\xf0\x2e\x76\x95\x16\x92\x8e\x30\x01\xc5\x3e\x6e\x1f\x0b\x7f\xd9\x07\x2b\x2f\x98\x7f\xda\xaa\xc2\x51\x2e\x8d\xd0\x90\x4c\x3d\x45\xde\xb1\x30\x46\x31\xf6\x90\xb6\x79\xd0\xef\x09\x69\x0b\x98\x51\xb7\x03\xad\x1d\x55\x84\x2c\x42\x04\x50\xe0\x0c\x50\x44\x7d\xd2\x25\xd8\x76\x82\x18\x64\xad\x01\x7c\x62\x34\xcb\x9d\x4b\x84\x15\xa3\x41\x6a\x16\xb3\x09\x53\xa2\x46\x9a\x4d\x98\x68\x79\xee\x80\xab\xf1\x61\x23\xa4\x82\xd9\xec\x21\xc3\xaa\x48\xe1\xbc\xce\x90\xfd\x97\x75\x1a\x23\xd9\x91\x51\xad\x41\xf2\x53\xf2\x5f\x47\xef\xbf\xfc\xb5\x7b\xfc\xed\xd1\xd1\xbb\x17\xdd\x3f\x7e\xf8\xf2\xe8\x7d\x0f\xff\xf1\xbb\xe3\x6f\x8f\x7f\xf5\x7f\x7c\x79\x7c\x7c\x74\xf4\xee\xc7\xd7\xdf\xdf\xf6\x2f\x3f\xb0\xe3\x5f\xdf\xf1\x3c\xbd\xb3\x7f\xfd\x7a\xf4\x0e\x2e\x3f\x6c\x38\xc9\xf1\xf1\xb7\x5f\xd4\x5e\x7a\x03\x45\x4a\xed\x68\xb2\x54\x69\x75\xc6\x46\xd0\xef\x11\xeb\xf3\xdb\xe1\xd1\xab\xe9\xf3\xef\xc3\xa4\x4f\x0b\x86\x14\xd8\xf5\xde\x1c\x70\x05\x91\x04\xfd\x31\x2c\x39\xf6\x4d\xa5\x52\x09\x87\x8a\x04\xd5\xe2\xb9\xf1\xb9\xcf\xc1\xb8\x13\x3a\xeb\xe1\xbe\x16\x92\xe8\x50\x8a\xd4\xa7\xbf\xa3\x7b\x03\x1b\xee\xfb\xfb\xee\xa0\x56\xb7\x57\x3b\x5a\x63\x50\x6b\x0c\x5a\x32\xd6\x1a\x83\x6e\x2c\x1e\xee\xad\x25\x08\xf8\x64\x57\x17\xc6\x42\x0f\xba\xd7\x75\xca\xb5\xe2\x36\x73\xa8\xf5\xfc\x51\x2f\x5a\x52\x16\x91\x34\x96\xa1\xa5\x8b\x7d\x98\xe4\x0c\x9b\x4f\xdb\x83\x8f\x13\x14\xf9\x25\x56\xb5\x71\xa5\x0c\x61\x62\x96\x10\x6a\x61\x57\xaa\x5e\x62\x88\x25\x06\xbd\xfe\xcd\xc6\xa0\xde\xd9\xb0\x54\xa3\xa4\x31\x5e\xd4\x0b\x0d\xc2\x61\x51\x64\x9a\x2a\x25\x22\x1b\x4e\x1b\xb2\x1d\xb0\x84\x9d\x5b\x36\xae\x06\x3b\xde\x67\x12\x22\x88\x81\x47\xe0\x0a\x50\x57\xda\x6f\x52\x4e\x2e\xf9\xc4\x17\xe1\x8e\x7d\xee\x0c\xae\x64\xf1\x1c\xcf\x2b\x00\xc1\x20\xa2\x73\x82\x95\xe2\x10\x90\xea\x17\x71\xb4\x18\x8a\x21\x86\x85\x95\x75\xb7\x0e\x7d\xb5\xb9\x78\x7d\x9e\x19\x3c\x5b\xb5\x84\xa1\x39\x66\x59\x98\x9f\xab\x4c\xf2\x39\x38\x03\xeb\xb3\xcf\xcf\x8e\x75\x36\xc4\x36\x9b\x61\x99\x5b\xf8\x4e\x9a\x64\x93\x4d\x38\x4b\x32\x09\x43\xf6\xd0\xd0\x39\x3d\xe3\x85\x25\x86\xc5\xc0\x35\x1b\x32\x9b\x4b\x93\x49\xc8\x80\xdb\xfc\x04\x1a\x8d\x91\xf6\x3b\x4e\x59\x38\xa7\xf7\x31\x98\xc7\x0a\xdc\xcd\x92\xb2\x9b\x45\xc2\x7e\x4b\xc7\x48\x4b\xc7\x76\x1e\x1f\x89\x8e\x39\xcc\xdd\x1f\x22\x86\x91\xe7\xf5\x43\xdf\x2f\x4a\x71\xec\x88\xc5\x5b\x63\x59\x91\xed\x74\x82\xb3\xec\x64\x7d\xae\x85\x0c\xf8\xda\x7e\x9e\x24\x0d\x55\xe1\x3e\xbc\x42\x68\x64\x79\x92\xb8\xe4\xe3\x1e\x79\xc3\xf1\x3c\x9e\x61\xb7\x87\x0e\xb9\x86\x09\xc8\x0e\xb9\x1a\x5e\x0b\xdd\xb7\x82\x6d\x35\x96\xcd\xde\x48\xd8\x90\x9c\x1a\x95\x49\x69\xa2\x6d\xc5\xfd\x52\x7d\x20\x21\x2b\x13\x14\xa5\xc7\x6a\xc4\xa0\x2f\xdf\x96\xdf\xfa\xb4\xd0\xee\x27\xda\xa6\xd0\xd2\xa4\x01\xdd\xd4\xcd\xe4\xa3\xe3\x30\x22\xd2\xb9\x46\x16\xe5\xf6\x3e\xc1\x72\x1b\x99\x50\xfa\xc6\xa8\xb0\xcd\xb4\xbb\xe9\xfb\xe9\xb0\x83\x04\x4d\x12\x88\x2b\xfd\x8e\x6c\x9f\x0e\x5a\x55\xa1\x31\xeb\x38\xb4\x8d\x00\x32\xa6\x3c\x4e\x40\x62\xe9\x77\x35\x5b\xdf\x8a\x15\xbd\x0e\x42\x77\x0a\x9f\x17\x4a\xa3\x48\xc8\xd8\xf5\x99\x75\xf9\x99\xb8\x98\x70\xbc\x90\xd0\xa6\x94\xd3\x11\xa0\x59\x61\xae\x80\x30\x96\x95\x56\xa5\x16\x17\x63\x21\xee\x48\x24\xd2\x2c\xc1\x03\x50\xe3\x7c\x14\x1d\x76\x02\x8a\x76\xcd\xec\xea\xa4\xd4\x7c\x07\x7f\xa8\xd7\x7b\xa7\x96\xa4\xd2\x84\x9c\x02\x0f\x10\x35\xd6\x9d\xef\xf2\x01\xa2\x52\x7b\x49\xb3\x25\xae\xbf\xa4\x16\x68\xd8\xa8\xdf\x35\xb8\xb6\x4d\xbe\x29\x3b\x78\x8d\x4c\xb3\xf2\x98\x29\x27\x87\x73\xfa\xea\xd9\xee\x15\xd8\x88\xc0\x26\x33\x63\xf6\x99\x2f\xa8\x5d\x39\x0c\xf6\xe8\xcd\xd5\xa0\x0b\x91\xc6\x7e\x2e\x4c\xb9\x16\x42\x93\xa3\xc3\x93\xc3\xe3\x39\x03\xdd\x4c\x09\xe6\xdb\xd2\x93\x0c\x6b\x0e\x66\x58\xc0\x0f\xa2\xc3\xb8\x43\x98\xf6\xc4\xd6\x96\x3e\xc0\x55\xb9\x94\xb8\x0e\x51\x82\x68\x49\x63\xe6\x54\x20\xfc\xd5\xdc\xa4\x65\xee\xea\x1e\x1c\x1d\xfe\x7a\xd8\x21\xa0\xa3\x63\x72\x2f\xf8\xa1\xc6\xe5\x63\x91\x90\x5c\x95\x26\x9a\x8a\x1c\x7b\xf1\x59\x10\x84\x8a\x1f\x86\x62\x11\x91\xdb\xc6\x3d\x63\xaa\x7d\x2a\xde\xe5\x03\xd3\xbe\x59\x85\x18\x92\x17\xb6\x6f\x10\x50\x67\x22\x4c\xd8\x04\x4e\xc6\x40\x13\x3d\xb6\x51\x14\x5c\xf0\xae\x6d\xfd\x66\x48\x89\xbb\x52\xd7\xa1\x50\xcf\xde\x56\x1e\x35\x6c\x6f\xf3\x0b\xaa\x29\x5a\x1b\x22\xfa\xfd\xee\xfd\x68\xc9\x5c\xab\xe6\xdb\xdb\xfe\xf7\x95\x8e\xb4\x48\xc5\xb5\xce\x7c\x6c\x4b\xa9\x7a\xc6\x1e\xd0\x8e\x66\xbc\x79\xb5\x5a\xd3\x92\x06\x49\x58\xdd\x16\xb5\x64\xbe\xf5\xf6\x76\xbd\x69\xc9\xdf\x45\x8e\x3d\xf5\xe8\x20\x99\x92\x7b\xca\xb5\xcf\xc3\x3b\x30\x53\x1d\x18\xf2\x64\xb0\xe1\x07\xa0\x31\x48\x85\xd4\x03\xe8\xce\x55\xc2\xfc\x68\xcc\xcb\x54\x5a\x5b\xb3\x7c\x20\x57\x5a\xa4\x64\xec\x3e\xbb\x9a\x9b\xe8\x4e\x46\x0f\x4f\x8f\x4f\xfc\x91\x90\x59\x0a\xe7\x9e\x79\x76\xf4\x6b\x8e\x6e\x58\xb8\x57\xaa\xe9\x47\x65\xb0\x95\x7b\xae\x30\x6e\x81\x65\xbb\x25\x36\x44\x4b\x1b\x88\x0e\x20\x0d\x46\x08\x90\x7a\x99\x8e\xb3\x13\xa1\xd7\xab\x7e\x30\x54\x63\x41\x07\xa4\x31\xc7\x3a\x59\x64\x85\x74\x38\x63\x43\x60\x1b\x02\x62\xa3\xee\x6c\x52\x3f\x97\xb2\x3c\x56\x03\xa0\x99\xcd\x27\x4d\x42\x20\x6b\x20\xf6\x79\x3e\xf2\x79\xae\x67\x38\x92\x09\x5b\x95\x76\x6f\xb8\x4c\xdd\x06\xea\x64\x71\x22\xb1\x24\x3c\xf4\xbb\xd5\x4f\xa2\x89\x3a\x69\x2e\x46\xb1\xe9\x08\xc5\x46\xe3\x13\x1f\x35\x3a\x11\x73\x22\x6a\x53\x91\xaa\x71\x1c\xa7\x34\x18\x60\xf4\x36\xa3\x71\x3a\xd9\xcf\x59\x77\x7c\x4f\x8e\xaa\x39\xd4\x1c\xb5\xbd\x38\x63\x3a\xca\x6e\x44\x74\xd7\xa0\x5e\x73\x01\x99\x84\xc8\xda\xc9\x6e\xcf\xfb\x76\x76\xa3\x5f\x5e\xbf\xb9\x2d\x62\xf1\x31\x60\xa5\x30\x5c\xfe\xe0\x2c\x69\x46\x27\xbd\x83\x4c\x07\xd5\x7d\x40\xa3\xbb\x7b\x2a\x63\xb4\x6c\x51\xcd\x06\x2c\x61\x7a\x8a\xca\xb9\x04\x0c\xf4\xe7\xc2\x46\xc4\xd9\x52\x90\xc2\x37\x74\x0d\xdd\xc6\x83\x0d\x0b\x2d\x64\x2e\x74\x66\x48\x99\xd1\xc7\x43\xd7\x5e\x1b\x32\x13\x65\xc1\xa4\x57\xb6\x4c\xb7\xca\x97\x1f\x7b\xab\x7c\x95\x3a\xd2\x6e\xab\x87\xd5\x0d\xdc\xdb\x63\x56\xe7\x58\x9c\x0c\x0d\xd7\x5a\x56\xd7\xd0\x7c\xfb\xcb\xea\x32\x09\x37\x5a\x64\x0d\x79\x49\xec\x64\x4b\x7c\x24\x03\x18\x0a\x43\x84\x97\x3a\x3d\xe2\x1c\x5c\x95\xce\xb3\xfe\x55\xb0\x6a\x89\x8a\x63\xc3\x86\x2c\xfa\xd2\x9c\x09\x9b\x00\x07\xa5\x4e\xd0\x1d\x92\x67\x56\x6b\xf5\xbd\x75\x3b\xe6\xeb\x20\xc5\xd5\x75\x8a\x34\x00\xd7\xd9\x17\x7f\x04\x1d\x59\xcb\x6d\x89\x90\x63\xd3\x30\xb7\xfc\x59\x37\x4a\x24\xa9\x1a\xdb\xae\xb7\xf0\xc0\xb4\xeb\xdc\xdc\xb7\x95\x82\xcb\xcd\x77\x47\x92\x46\x40\x32\x90\x4c\x18\x66\x94\x73\x1d\x8b\x7b\x4e\x06\x30\x62\x5c\x79\x50\x60\xf1\x4d\x07\x33\xf4\xc7\x30\x15\xca\xa6\xf5\xc8\xdb\x4a\x35\x10\x97\xa7\x13\x89\xe2\x68\xba\x35\xcf\x7a\x92\x90\x63\x21\x9c\x6c\x0f\x99\x00\xe1\x72\x5b\x9d\x75\x4b\x3e\xca\x39\xbe\x39\x86\x84\x4e\x6d\x38\x26\x76\xc4\x66\xff\x06\xa9\x8e\x1b\xf0\x38\xd9\xc6\x50\xfe\xda\xd2\x75\x60\xd5\x53\x1a\x8d\xeb\xb9\x70\x5b\x17\xd5\x86\xa3\x75\x51\xd5\x99\xa4\x75\x51\xb5\x2e\xaa\x35\xa3\x75\x51\xb5\x2e\xaa\x99\xb1\xb7\x5a\x52\xeb\xa2\xda\x79\xb4\x2e\xaa\xd5\xa3\x75\x51\x6d\x30\x5a\x17\xd5\x86\xa3\x75\x51\xb5\x2e\xaa\xd6\x45\xd5\xba\xa8\x3e\x23\xbb\x9d\x1f\xad\x8b\x6a\x6e\x92\xd6\x45\xd5\xba\xa8\x36\x1e\x7b\xab\x7c\xb5\x2e\x2a\x3b\x5a\x17\x55\x75\x7c\x5e\xac\xce\x3b\x78\xfa\x46\xd5\xab\xdf\x6e\x18\x15\x46\x47\x63\x9f\x65\xda\x53\x1d\xfb\xff\xc7\xb1\xfd\xef\x89\xa3\xa4\x01\x7b\x7f\x6b\xeb\x7f\x76\xb6\xfe\x66\xec\x64\x0d\xd8\xc8\x6a\xd3\x64\xe7\x02\xbf\x1d\x4b\x50\x63\x91\xec\x8c\xe8\x15\x24\x7f\xcd\x38\x4b\xf3\xd4\xe0\x9c\x32\xf8\xcc\x26\xc1\xd7\xae\x8a\x1e\xcc\xe8\x82\xb7\xe6\x3a\x73\x23\x8b\x01\xcb\x6e\x52\x96\x98\x6d\xc4\x44\xc9\x31\x9d\x18\x5c\x57\x79\x14\x01\x60\x53\xaf\xb2\x2a\xf1\x75\x2f\xbc\x29\x34\x71\x78\x59\x8f\xde\xd4\xe3\x96\xb6\x30\x26\xce\xf2\xf5\x57\x3b\xcd\x31\x92\x59\x33\x74\xf9\xfb\xb7\xfd\xf3\x12\x5d\xa6\xdc\x93\x65\xc6\x27\x22\x99\xd8\x1e\xb7\x78\x93\x91\x8a\x7a\x45\x77\x4c\x4e\x68\x92\x8d\x69\x49\x8d\x70\x12\xb8\xb2\xed\x98\xcd\x93\xe6\xb9\x50\x37\xb5\x6f\x43\x29\x76\x6e\x15\x5b\x8c\x06\x48\x7e\x7d\x6d\xa1\x96\xa6\xd0\x04\xc7\xa9\x2b\x0c\x57\x25\x19\x23\xf2\x56\x0d\x3e\x23\xc4\x0c\x5b\xcd\x7d\x63\x91\xb7\x36\xad\xac\x2f\x86\xd6\x3f\x5c\x04\xcb\xad\xe0\x87\x37\x06\xe0\x03\xd7\x4f\xdc\x33\xf4\xb2\xbe\xe1\x3b\x1c\x69\x41\xb2\x84\x16\x3d\x8a\x70\x07\x7e\x40\x2e\x74\x3e\x86\xe8\xee\xad\x73\x7a\x1e\x29\x80\x10\xb1\x32\x62\x7a\x9c\x0f\x7a\x91\x48\x4f\x0c\x51\xb0\xff\x37\x48\xc4\xe0\x24\xa5\x4a\x83\x3c\x89\x45\xe4\x98\x5c\x37\x32\xb3\x30\x3e\xea\xa5\xf1\x31\xf6\xba\xbd\xaa\xf6\x44\x2c\x15\x43\x30\xef\x77\xea\x20\x19\x80\xa1\xaf\x02\x55\xfe\x52\x39\x35\xb3\xbc\xad\xbb\xd8\x96\x47\x6d\xa6\x54\xd3\xe1\xfc\xf1\x9d\xcd\x2d\xe5\x22\x0d\xd8\x36\x9e\x9a\x53\xb9\xb1\xe0\x8a\x06\x9c\xc9\x7b\xe4\x48\xde\x1b\xe1\x78\x5f\x9c\xc7\x7b\x58\xf9\xb8\x01\x5f\x67\x13\xce\xe2\xe6\x1c\xc5\x8f\x50\x20\xf8\x71\x1c\xc4\x0d\x5a\xd1\x1a\x72\x0c\x7f\x0c\xa7\x70\x23\x5f\x5d\xd7\x19\xfc\xf1\x1c\xc1\xcd\x7c\x6e\x93\x8a\xc0\x53\x75\xfe\x36\x60\x0d\x6f\xd2\x12\xde\x98\x15\xfc\xd1\x9c\xbd\xf5\x1d\xbd\x7b\xe0\xe4\xad\x0d\x64\xc6\x99\x66\x34\xb9\x80\x84\x4e\x6f\x20\x12\x3c\xde\x99\xc3\xcc\x54\x8c\x0c\xe7\x47\xd9\x69\x9d\xa5\xaa\x9a\xd3\x30\xa6\xae\x30\xb6\xd1\xa8\x6c\x0e\x87\xf7\x50\x38\x81\x02\x9d\x0b\x76\x95\xbb\x94\x9d\xbb\x17\xf2\x2e\x11\x34\x56\x27\x99\xb0\xff\x57\x64\x2c\x94\x52\x15\xec\xbb\xea\xe5\x2a\x7c\x6a\x93\x98\x4d\xf0\x68\x72\x13\x7f\x10\xf7\x44\x0c\x35\x70\x72\xc4\xb8\xdf\xc7\xe3\x92\x1a\x58\xd8\x27\x03\x5a\x9b\xab\x2f\x5f\xf8\x9b\x9f\x9f\xe1\x11\x4d\xac\x4a\x3d\xbe\x1d\xd8\xbd\x68\xbd\x21\xd8\xdd\x38\xcc\x93\xaa\x31\xd8\x1a\x88\xab\xf4\xe6\x65\x51\xda\xf7\x25\xce\x1b\x4e\x1b\xe5\x31\x71\x49\x5f\xcf\x6f\xd3\x6a\x87\xb0\x54\x45\xbf\x10\xb2\xb2\xce\x6e\x7c\x7b\xde\xb7\x66\xe3\xd6\x5c\xb2\x2f\xe6\x92\x4f\x14\x06\xb2\x87\x82\xee\x13\x0d\xfd\x68\x05\xdd\x2d\x46\x29\x0d\xf4\x7b\x49\x23\xe8\x37\x2e\x23\xf8\xe3\x44\xe2\x5c\x52\x47\x00\x83\xc8\xe7\x0f\x0f\x07\x88\xed\x69\x0a\xa9\xb3\x98\x94\x3a\xcc\x93\x64\x4a\xf2\x4c\xf0\x6a\xa2\xb1\xf5\xb6\xcf\xe6\xad\xa2\x49\x7e\xc1\x5b\x0a\xc1\x32\x93\xc2\xf1\x4c\x99\x73\x6e\x68\x70\xd1\x9f\x0b\x05\x49\xac\x6b\x4c\x2b\xd9\xb1\x8a\x8d\xcc\xf2\x0d\xff\xc3\xc4\xd9\x22\xd6\xaf\x32\xa1\x79\x7a\x28\x64\xc4\x06\xc9\x94\x8c\x69\x12\x9a\xb1\x50\x72\xc7\x92\xc4\x4d\xd3\x23\x37\xa0\xad\x4b\xc1\xf2\xce\x44\xf0\x11\x2e\x8e\x72\xdf\x04\x10\x22\xf3\x6c\x94\x00\xe5\x79\x66\xdf\x67\x38\xf1\x54\xe4\xd2\xbf\xaf\x17\x1c\x13\x45\xd3\x7d\x96\x74\x4a\xad\xc6\x56\x6e\x6c\x68\x4f\x93\x2b\x23\x00\xbc\xf1\x75\x9c\x3b\xe5\x39\xc5\x04\xa4\x64\xb1\xb3\xf3\xdb\xdf\x32\x29\x26\x2c\xb6\xde\x0d\x0f\x36\x6c\x6a\x6c\x9b\xc9\x84\xf3\xcc\x05\xef\x72\x18\x51\x14\x54\xdc\x29\xb2\x7b\x66\xe7\xb1\x31\x04\x3c\xc6\xf6\x32\x46\xc2\x17\x59\x25\x73\x7d\xc2\x6c\x63\xdc\x12\xe4\xc8\x11\x17\x44\x60\xe8\x67\xce\x99\xb6\xcd\xd6\xc7\xb9\x26\xb1\xb8\xe7\xc7\x25\xbf\x2b\x19\x80\x5e\xed\x75\x45\x47\xeb\xed\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x7e\x37\x1a\xc1\x52\x10\xb9\xfe\x28\xda\xdf\xfd\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x4b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x57\xc3\xee\x02\xeb\x97\xeb\x57\x3a\x1f\xc1\x57\xea\xc7\x8c\xc1\xd9\x17\xd7\x37\xbf\xbc\x3a\xfb\xeb\xe5\x2b\x77\x3e\x79\x99\xe9\xe7\x9c\xfd\x2b\x07\x42\x53\x61\x64\xe1\xa4\x1c\x08\xd8\x41\x8d\xbe\xf4\x03\x9e\xe4\x66\x43\x06\x77\x64\xc8\xd8\x3c\xbe\x7e\x60\x24\xb6\xa0\x7f\xfc\xb8\xc8\x4f\xdd\x54\xab\x08\x6e\x31\x72\x63\xa9\xa9\x16\x25\x1c\xb4\x39\x79\x56\xa2\xb4\x4d\xd6\x18\x1f\x25\x65\x61\x72\x37\x72\x55\x57\x27\xaa\xab\x11\x75\x8b\x2f\xe8\xef\xaa\x18\x35\xd2\xdc\xab\x58\x43\x43\x2d\x71\x0a\xaa\xed\xd5\x00\xdb\xb3\xd8\xab\x01\x56\xf4\xb8\xea\x13\x1a\xc7\x12\xc5\x14\x3c\xf5\xe9\x4c\x6b\xcc\xac\x88\xa5\xe9\x90\x17\xe4\x4f\xe4\x81\xfc\x09\xd5\x82\x6f\xea\x36\x10\xaa\x2b\xb0\x37\x11\x1a\x63\xb4\xd1\xab\x7e\x43\x10\xff\xdb\x98\x6a\x9c\xd1\x40\x55\x0b\x32\x60\x4e\x0c\x85\x07\x0d\xd2\x88\x45\x6e\x27\x3e\x69\xeb\x25\xb3\xc0\x8f\x88\x66\xd6\x4c\x7e\x35\xac\x86\xe3\x6c\x87\x68\xe6\x71\xa3\xdf\x5f\x3b\x2a\x54\xed\x74\x52\xcc\x96\x52\x1d\x8d\xab\x64\xcc\x08\x18\xaa\xc2\x9c\x62\x81\x64\xdc\x06\xde\x8e\x59\x0d\xa7\xff\xfe\xa0\x71\x3d\x3f\x70\x65\x3f\x57\xed\xd4\x8c\xe2\x8f\x7c\xde\x09\x06\xa5\xe2\x49\x99\x88\x7b\xe4\x92\x46\x63\x5c\x56\x5c\xe2\x19\x46\x03\xc1\xc9\xc6\x74\x62\x36\xde\x3d\x6b\x3b\x03\xa1\xb4\x12\xac\xa3\x88\x4b\xe6\x3c\x45\x94\xdb\xde\x9c\x43\x90\xd2\xc6\x4a\x0f\xa6\x3e\xc8\xac\xf6\xe6\xd5\x3a\x49\x99\x14\x5a\x44\xa2\x46\x77\xa8\xd9\xfc\x0b\x9c\x0e\x81\x60\xe3\x53\xbd\x79\xf7\xa7\x8b\x7e\x87\xdc\x9e\xf7\xb1\xad\xcf\xcd\xf9\x6d\xbf\x2a\x61\x1f\xdc\x9e\xf7\x0f\x3e\x29\x28\x88\x37\xb3\xa1\x41\x75\x87\x49\x2a\x06\x93\x84\x29\xdd\x4d\x69\xd6\xbd\x83\xe9\x8e\x3c\xb5\x09\xbe\xde\x0d\x3b\xdc\xc8\x07\x59\x30\xa7\x34\xdb\x7a\x36\x09\x34\x66\x6d\xa2\xcf\xe6\xa3\x4d\xf4\xd9\x70\xb4\x89\x3e\x6d\xa2\xcf\xfc\xd8\x9b\x58\xc6\x36\xd1\xe7\x79\xb9\x6e\xdb\x44\x9f\xcf\xde\xff\xdb\x26\xfa\x2c\x1e\x6d\xa2\x4f\x9b\xe8\xb3\xd9\x68\x13\x7d\xb6\x1f\x7b\x17\xb9\xd2\x26\xfa\x6c\x35\xda\x44\x9f\xf9\xd1\x26\xfa\x2c\x19\x6d\xa2\xcf\x92\xd1\x26\xfa\xb4\x89\x3e\x6d\xa2\x4f\x1b\xff\xb8\x76\xae\xfd\x8c\x7f\x24\x6d\xa2\x8f\x1b\x6d\xa2\xcf\xb3\x88\xf2\x22\x6d\xa2\xcf\x46\xa3\x4d\xf4\x69\x13\x7d\x76\x19\x6d\xa2\xcf\x73\x31\x97\xb4\x89\x3e\x6d\xa2\xcf\xe7\x23\xe8\xb6\x89\x3e\x6d\xa2\x4f\x9b\xe8\xd3\x26\xfa\xac\x5c\x45\x9b\xe8\xf3\x1c\x54\x40\xdf\x77\xb5\x7e\x96\xca\x5b\x3f\xd3\xe6\x81\x7d\xe4\x72\xc1\xaf\x68\x09\x51\x99\x99\x44\x16\x53\x26\x12\x68\x3c\xc5\x29\xb1\xd7\x43\x49\xc8\x7a\x82\xf1\x81\x09\x4b\xd9\x6e\x89\x41\x64\xee\xd0\xbc\xc2\xb9\x4a\x5e\x17\x03\x96\x94\x3e\xe0\x01\xa0\xa9\xc8\x6d\xfb\xd7\x48\xa4\x59\xae\xab\x30\xc5\xed\xd9\xa5\x73\xeb\x90\x8d\x1c\x47\x3d\xb1\x4d\x66\xbb\x61\xda\x6e\xa9\xb1\xeb\x27\x6c\xd7\x4a\x63\x1f\x37\xd7\x6f\x22\x68\x84\x6a\x0d\x92\x9f\x92\xff\x3a\x7a\xff\xe5\xaf\xdd\xe3\x6f\x8f\x8e\xde\xbd\xe8\xfe\xf1\xc3\x97\x47\xef\x7b\xf8\x8f\xdf\x1d\x7f\x7b\xfc\xab\xff\xe3\xcb\xe3\xe3\xa3\xa3\x77\x3f\xbe\xfe\xfe\xb6\x7f\xf9\x81\x1d\xff\xfa\x8e\xe7\xe9\x9d\xfd\xeb\xd7\xa3\x77\x70\xf9\x61\xc3\x49\x8e\x8f\xbf\xfd\x62\xe7\x25\xd7\x16\x78\x9b\x13\x77\x1b\x12\x76\x1f\x45\xd4\x75\xee\xda\x86\xce\xa2\x0b\x35\x99\x3b\x8d\x8e\x1d\xad\x3a\x8d\x5e\xe3\x46\x21\x2e\xcc\xc3\x14\x11\x29\xd3\xda\x51\x51\x5a\x0e\x57\x65\xba\xa2\x72\x3a\x3a\x80\x4d\xb1\xa9\xb6\xcd\xaa\x43\xa8\x67\x29\x44\x45\x78\xb9\xce\x75\xf3\x66\x69\x96\x60\x93\x68\x3c\xcf\x5d\x1f\xa9\x82\xac\xb3\xa5\x0d\xeb\x47\x4b\x1b\x9e\x23\x6d\x50\x10\xe5\x92\xe9\xe9\xb9\xe0\x1a\x1e\x76\xb2\x9f\x2c\x33\x20\xdd\x54\xa7\x76\xb1\x61\xca\xc5\xb4\xd9\x6b\x44\x64\x36\xc2\x7b\x69\xee\xf4\x58\xe4\x49\x8c\x99\x49\x39\x47\x95\xd2\x26\xb9\x81\xb6\xfa\x1e\x6a\x3a\x18\xbe\x3d\xfb\x3a\xaf\xc1\xd9\xa9\xff\x95\xb3\x09\x4d\x8c\x7e\x5b\x3c\xd1\x47\x9d\xa5\xfc\xd0\x4e\x46\xac\x4f\x2c\x63\xa1\x78\xd3\x97\x6c\xc2\x12\x18\xc1\xa5\x8a\x68\x82\x54\xa9\x19\x4a\x7f\xb6\x64\x76\xdc\x22\x29\x12\x45\xee\xc7\x80\x5d\xf8\xa9\x57\xcf\x31\x95\x6c\x44\x19\x27\xa9\x21\xaa\x99\x7f\x58\x59\x3d\xdf\x10\x6f\x23\xf5\x72\x5d\xe8\xf3\xa8\xbe\x0e\x84\x48\x5c\x3e\x42\x32\x2d\xe6\x67\xd6\xf4\xc6\xc5\x2f\x1c\xee\x7f\x31\xb3\x29\x32\x4c\xe8\x28\xa8\xf1\x0a\xf4\x9c\x25\xae\x98\x7a\xe9\x07\x60\xb0\x7f\x0e\x84\x26\xf7\x74\xaa\x0a\xa3\x46\x31\x07\x53\xa7\xe4\xe5\x31\x22\x1e\x55\x24\xcc\x11\x93\xaf\x8e\xd1\x35\x77\x7e\xd6\xff\xe5\xe6\xef\x37\xbf\x9c\x5d\xbc\xbe\xba\x26\xd7\x42\x83\x65\x49\xa5\x46\x69\x11\xe5\x46\x43\x70\xab\xc4\x77\xa0\x06\x2d\x54\x0f\xed\x8a\x4c\x91\x7b\xc6\x63\x71\xaf\x76\xb6\x9f\x5a\xf4\x33\xc0\x03\xca\x77\x9a\x23\xa2\x19\xc5\xfe\x6f\x35\xf8\xc3\x5c\xf4\x47\x79\x52\xe4\xc0\x71\x7c\x12\x4b\x91\x59\x20\x78\x03\x54\x59\x49\xba\x98\xb1\x2b\xfb\xf8\x52\xdc\xdf\x61\x75\xc2\x91\xa4\x5c\x17\x96\x98\x62\xcf\x5c\xe3\xb9\x5e\xed\xed\x78\xda\xf9\x46\x34\x6e\x2e\xd7\xe8\x2c\x8e\x21\xae\x80\xff\xd9\x45\xf5\x9d\xfb\x8f\x9b\x16\xe5\x18\x48\xff\xcd\xcd\xd5\xff\x99\xc1\xe3\x69\x56\x2f\x88\xa9\x99\x14\x50\x29\xb2\xc6\x76\xf7\x2d\xa4\x62\xd2\xee\xef\xbe\xec\x6f\xe0\x96\xcd\xb8\xce\xdf\xe6\xbc\xcc\xd0\x78\x69\x7e\x92\x8a\x18\x7a\xa4\x1f\x6c\xf8\xd5\xab\xe5\x32\x33\x12\x88\xb9\x85\x6b\x46\x93\x64\x5a\x16\xa6\xb4\xb0\x39\x82\x95\x22\x04\x65\x42\x3e\xa4\x89\xfa\xd4\xd4\xb8\x0e\x6f\x34\x72\xc4\x6b\xa3\xcd\x36\xb2\x1d\x61\x36\x12\x03\x17\xda\x09\xc3\x66\x95\x58\xd8\x41\x8a\x88\x58\xd5\xb9\x14\x28\x55\xe1\x6f\xca\xfa\x11\x3c\x6b\x64\xca\x03\xbb\x1f\x66\xb6\x46\xe4\x5c\xfd\x3f\xf6\xde\xc7\xbb\x6d\x1b\xf9\x17\xfd\x57\x70\xbc\x7b\xae\xed\xad\x24\x27\xdd\x1f\xdf\x6e\x6e\xdf\xf6\x78\x6d\xa7\xf5\x6d\xe2\xf8\xc6\x4e\xfb\xf6\x35\xfd\xee\x42\x24\x24\x61\x4d\x02\x2c\x01\xda\xd1\xde\xde\xff\xfd\x1d\xcc\x0c\x40\x90\x92\x13\x9b\x64\x22\x3b\x15\xf7\x9c\x6d\x2c\x51\x20\x38\x18\x0c\xe6\xe7\x67\x84\x59\x7f\x34\xd6\xc6\xb4\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\x56\x24\xe6\x39\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x11\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x64\x00\x2a\x19\x66\x5f\x40\xa8\xc1\x59\xf8\x1b\x5d\xf5\x1e\x9b\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x91\xeb\x20\x1c\xf0\x23\x69\xcb\x40\x90\x66\xa6\x17\x87\xe7\x8e\x61\x35\x60\x53\xc5\xf5\xb5\xc7\xf5\x8a\x3f\xf6\x2d\x55\x56\xea\xd0\x7c\x5b\xea\xaa\xf3\x21\xb6\xa2\x6c\x7e\x7b\x7a\x0c\xa2\xa8\xa2\x30\xa2\xb2\xe5\xb2\xd0\x12\x7d\x50\xb7\x18\x06\x6f\x28\x10\x1a\xef\x89\x3a\x66\xc5\x5e\xf2\x25\xe3\x99\xd1\x9e\x96\x52\xad\xb3\x17\x19\x19\xa3\xee\xeb\xa9\xb6\x8b\x15\x2b\xd4\x6d\xa8\xd5\xdf\x8d\xa2\xa8\x62\x8d\x0e\x26\xd5\xca\xcf\x2d\xbf\x12\x86\x15\xa5\x48\x44\x2a\x54\xb2\xe9\x65\xdf\x74\x30\x0e\x58\xe7\x4c\x2b\xb7\x31\x07\x61\x9e\xd3\x10\x85\x25\x92\xc6\xac\x02\xf1\x5c\xb2\xfe\x38\x44\x75\x61\x5b\x56\x46\x94\x18\x82\x2e\x2b\x81\x2b\xf9\x7d\x35\x15\x99\xa3\xbc\x33\x49\xa9\x6b\x36\x3a\x1e\x64\xce\xe7\x82\x71\x1b\x38\xcd\x6a\x26\x94\x71\x12\x13\xdd\x97\x96\xa5\x5a\xd4\xb5\xf1\xdc\xb0\x37\xa7\xc7\xec\x09\xdb\x73\xcf\xda\x07\xfe\x81\xa6\xda\x56\x63\x02\x5a\xdb\x46\x9d\xf9\x21\x60\x4a\xc0\xbc\x4c\x97\x28\x24\x46\x4c\x69\x66\xaa\x64\x11\x77\xf2\xf6\x66\x33\x25\x29\x42\x60\xe4\x61\xf2\xfa\x66\x25\xd4\x1b\x23\xca\xc1\x04\xd4\x9b\x0e\x02\x2a\x56\xa3\x1c\xcf\x35\xa9\x87\x8c\x95\x0b\xcb\x53\x6e\x39\x09\xae\xd0\x59\xfd\xa1\x2e\xe9\x6f\x5b\x7c\x19\xf1\x42\xaa\xea\x1d\xba\x48\x87\x73\xb5\x5c\x9c\xc0\xb0\xc0\x43\x40\x75\x58\x75\x5e\x14\x99\xac\x03\xc8\x51\x92\xda\x69\x83\x57\x46\xb7\xa8\x89\x20\x27\x7c\x1c\xda\x29\x27\x5c\xa5\x3a\x5f\x79\x18\x04\xbd\x79\xb2\x88\x1f\xb0\xe5\xbe\xe6\xf5\x40\x9c\x42\x99\xb8\x16\x3d\x40\xb4\x5a\x9c\xf7\xc2\x8d\xe6\x88\xe3\x39\x02\x86\x67\x19\x9f\x8a\x0c\x69\x8c\x1c\x68\x56\x39\x70\xd3\x99\xa2\xa5\xce\x86\x2b\x6d\x79\xad\x33\x81\xa9\x57\x9e\x10\x6e\xf8\x47\x41\x07\x18\x64\x28\x3a\x80\x35\xd8\xa0\x03\xd8\xb5\x8f\x81\x0e\x55\x8f\xa3\x9e\xb5\xe9\xe0\xf4\x86\x26\x1d\xe0\xf0\x7e\xe8\x74\x30\x22\x49\x74\x5e\x9c\x97\xda\x99\x9d\x83\x9d\x4d\x34\x6c\x1d\xe7\x43\xc7\x06\xf8\xed\x63\x0b\x98\xa2\x7a\xcd\x9b\x79\x19\x25\x5d\x72\x8b\x87\x84\xcf\xbc\xfc\x1f\xd1\x99\x05\xa2\xa7\x7d\x90\xf9\x51\x1a\x81\x40\xf7\x4b\xfa\xe2\x31\x1f\x07\x43\xd4\x2d\xf4\x70\x76\x0e\x72\x1a\xe9\x84\x67\x00\x92\xda\x8f\xe5\x58\x9b\xed\xda\x03\x47\xa9\xb6\x10\xa3\x84\xcf\x7c\xfa\x07\xe0\x65\xc2\x27\xe4\xc2\x54\x3a\x15\x51\xd4\x19\x73\x84\x2f\x31\x25\x13\xee\xf3\x59\xbe\x4e\xaf\xa0\x2c\x10\x91\x36\x7e\x6d\x35\xe1\x93\xbd\x0c\xd0\xab\x6e\x82\x42\xa5\x52\xcd\xc1\xaf\x36\x62\xa5\xc8\x30\x3f\x98\x84\xc0\x15\x5a\x90\xbb\xb0\x25\xfc\xa0\x7e\x3f\xf8\x47\x83\x2e\x26\xb5\xa2\x91\xc1\x53\xe4\x35\xac\x19\x8a\x5b\x69\xd8\xce\x0b\x4f\x80\x1e\x58\x95\x0f\xf1\x84\xd9\xc1\x37\x0c\xab\x89\x9e\xce\x2b\xa9\x52\x4a\xa5\x6d\x10\xcb\xdb\xb9\xa4\x07\x43\x92\xb6\x4c\x63\xd9\xf2\x8c\xbd\x55\x2c\x10\x8b\x8d\x3b\xb3\xc7\x6b\x54\x99\xbd\x8f\x6e\xfc\x7e\xc7\x6b\x78\x48\x7b\x98\x37\x0a\xd6\xde\x3d\x77\xec\x2c\xf7\xd5\xfb\xfc\xbb\x6c\x14\x56\x87\xa4\xdf\xd0\x56\xcc\x8f\x38\xac\x57\xe9\x13\xc7\xd6\x56\xaa\xb9\x89\x2d\x99\x26\x22\xfe\x7a\x53\xc6\xaf\xf0\xac\xd4\x58\x82\xb9\x6a\x42\xb4\x4a\x00\x1e\x8b\x19\x92\x39\x75\xe2\x91\x1b\x21\xf3\xdc\xf0\xa3\xd2\x51\xc2\x4a\x9e\x5d\x14\xdd\x01\x44\xd9\x0a\x58\xdd\xcb\x8b\xc3\xe6\xd0\x70\x58\x2f\x44\x89\x67\xbf\xfb\x9e\xf1\x34\x97\xc6\x80\x23\x4c\x4c\x17\x5a\x5f\xb1\xbd\x35\x58\x59\x51\x96\x95\x91\x73\x73\x40\x3c\x3f\x76\xb3\xdf\x67\x52\x65\x21\x93\x09\xec\x60\x65\x8d\x77\xe4\xc0\x43\x92\x30\x0b\x58\x43\x02\x68\xa6\x64\x85\xd5\x69\x22\x24\xb3\xe3\x82\x8d\x0b\xec\xd5\xe5\x39\xeb\x09\x89\xf2\x81\x25\x3a\x23\xde\x6e\xa3\x9e\xad\xa5\x23\x6a\x8f\x1b\x27\x12\x29\x17\x89\x30\xc3\x81\x2d\x7d\x57\x8f\xc9\x52\x81\x15\x36\x02\xb2\x9f\xf8\xad\xe9\x70\xe0\x97\xde\x85\x42\x4d\xfa\xe9\x6e\xac\x51\x5f\xd6\xc2\xc5\xd9\x23\x59\xb1\xe0\x63\x34\xd2\x9d\x44\x03\x11\xe8\x55\x88\x85\x56\xba\x44\x16\x75\x87\xa8\x56\xc0\xd2\x20\xa2\x30\x9a\x07\x6b\x42\x22\x3a\x9a\xea\x51\x1d\x25\x8e\x03\x81\x50\xe8\x85\xd8\x0e\xf5\x1c\x6e\xa4\x5d\x00\x0a\xeb\xa2\x15\x35\x84\x99\x94\xc2\x40\x00\x46\x31\x51\x96\xba\xa4\x84\x2c\xef\xb7\x86\x91\x40\x92\x43\x46\x97\x63\x12\xee\xfe\xda\x35\x71\xa0\xba\xc6\x3c\x87\x1c\x43\xc7\x4d\x62\x36\x13\x09\x28\x5a\x31\x81\x51\x6a\xef\xd5\xb0\xb4\xbe\x84\xc3\x6a\x8f\x99\x9e\xcb\x77\xee\x29\xf1\xaf\x5a\x9d\x57\x94\x56\xe3\xf5\x5f\xef\x4f\x18\x3b\x55\x21\xff\x76\xe4\x56\x31\xbe\xd3\xa7\x9e\x59\xf7\x8a\x31\xe0\x3e\xbc\x40\xec\x38\x73\xda\x61\x59\x0d\xc0\xf1\x7d\xdc\xe1\x2c\x76\x89\x0f\x2a\x0e\xc0\x35\x4e\x83\xba\xa5\xf7\x3a\x40\x1f\x57\xb9\xbb\xe5\x63\xb9\xcb\x1f\x47\x00\x84\xf5\x95\x73\x84\x74\xb0\x45\x41\xbf\xdb\xb5\x45\x41\xbf\xe3\xb5\x45\x41\xdf\xa2\xa0\xaf\x5e\x0f\x26\x65\x70\x8b\x82\xfe\x79\xe1\xda\x6c\x51\xd0\x37\xef\x64\xde\xa2\xa0\x6f\x51\xd0\xdf\x77\x6d\x51\xd0\x3f\x70\x6d\x51\xd0\x3b\x5c\x9f\x81\xe4\xda\xa2\xa0\x77\xb8\xb6\x28\xe8\xeb\xaf\x2d\x0a\xfa\xea\xb5\x45\x41\xbf\xf5\xda\xa2\xa0\x77\xbe\xb6\x28\xe8\x5b\x14\xf4\x2d\x38\xe4\xfd\xc6\x7a\x98\xe0\x90\x6c\x8b\x82\x4e\xd7\x16\x05\xfd\xb3\x80\xc0\x63\x5b\x14\xf4\x3b\x5d\x5b\x14\xf4\x2d\x0a\x7a\x97\x6b\x8b\x82\xfe\xb9\xb8\x4b\xb6\x28\xe8\x5b\x14\xf4\xdf\x8e\xa2\xbb\x45\x41\xdf\xa2\xa0\x6f\x51\xd0\xb7\x28\xe8\xef\x9d\xc5\x16\x05\xfd\x73\x30\x01\x8d\x4d\x65\x27\x60\xc8\xbb\x60\xd8\x50\x6e\x72\x54\x32\x3e\xad\x66\x33\x51\x82\xe4\x82\x27\xaf\xa4\x4f\xd5\x70\x7d\xed\x20\xab\xb0\x23\x80\xc3\xa1\x32\x8e\x5b\x7e\x4e\x35\xea\x00\xe0\x58\x27\x10\x9f\xbc\x7a\xbe\x06\x30\xa7\x73\x5e\x61\xd7\xd4\x59\x98\xf3\x2b\xd5\x2d\x3e\x7e\x0b\xc1\xd7\x95\x15\x11\xdd\x93\x4c\x1b\x4a\x7c\x06\x62\x25\x0b\xae\x94\xf0\xf6\x9e\xb4\xe0\x47\x99\x0a\xa1\x98\x2e\x04\x45\xa7\x39\x33\x52\xcd\x33\xc1\xb8\xb5\x3c\x59\x4c\xdc\x93\x94\x27\x76\x9d\xa4\x4c\x9f\x18\x5b\x0a\x9e\xfb\x74\xed\x9c\x4b\x1c\x8a\xf1\xa4\xd4\xc6\xb0\xbc\xca\xac\x2c\xc2\x60\xcc\x08\xa8\xb3\xc0\x83\x2a\x10\x03\xf2\xe2\xea\xcc\xe6\x51\xfd\x34\x9a\x96\x8e\x11\xcb\xc0\xda\x1c\x01\xc8\x73\x5e\xd8\x25\x73\xaf\x9c\x11\xf0\x6b\x69\x2c\x4b\x32\x09\xa7\x35\x3c\x11\x4b\x6a\x61\xbc\x91\x3f\xab\x15\xcd\xd4\xd0\x54\x55\x0a\x6a\x6b\x61\x0d\x83\x44\xe0\x7a\x40\x1a\x2a\x95\x86\xd4\x7c\x33\x62\xdc\xc3\x69\x21\xa1\xfd\x4c\x81\xd4\xfe\x64\xc1\xd1\xe9\xa3\x68\xb8\x08\x46\xd4\xf1\x26\x3a\xb0\x6a\x46\x87\xcc\x77\xcf\x9c\xa3\x46\x92\x7f\xad\x50\x40\x9e\xde\xca\x36\x80\x05\x50\xe2\xda\xf1\x80\x48\x84\x3b\x5f\xf9\x2d\x5c\xff\xc9\x99\xde\xf2\x72\x2e\x6c\xc8\x67\xea\x9a\x2d\xde\x4c\x0b\x89\x01\x7f\x63\x43\xa4\x26\x19\x50\xe7\x5c\xa7\x50\xf4\x53\x57\x56\xad\x43\x14\xc6\x19\x12\x90\xda\xba\x1b\xbc\x62\x84\x49\x9a\xe1\xa1\xa6\xe0\x89\x30\x6c\xef\xf4\xfc\x68\xc4\xce\x4f\x8f\x29\x13\x53\xcf\xd6\x55\x32\x93\x0c\x43\x0e\xbc\x0d\xdb\x38\x60\xb4\x45\xc3\x47\xd5\x9f\xf4\xec\xf3\xa0\x5f\xbd\x55\x94\x60\xda\x96\x00\xa0\x72\x05\x7c\x73\x66\x2a\x50\x91\xc8\x27\x24\x43\x69\x06\x31\x9f\xa8\x0b\x12\x3d\xf2\x90\xff\x45\x98\x08\x51\x89\xea\x2e\x7c\xac\x1b\x04\x2c\x9c\xd7\x2b\xc5\x1d\x90\x0c\x4a\x79\x2f\x9d\xf2\x5d\x7a\x59\x48\x91\x2a\xf6\x52\x18\xc3\xe7\xe2\xbc\x63\x78\xeb\x36\x3f\x00\x44\xb8\x6a\x71\x00\x02\x28\xc3\x52\xdf\xf0\x49\x9d\x15\xdc\x54\xbe\x59\x8e\x73\x0a\x9c\x75\x53\x4a\x6b\x05\x88\x12\x80\xfb\x83\xc5\x6e\xa3\x01\xec\xb6\x72\x8b\x5f\xfa\x41\xea\x1f\x3b\x55\x42\xa5\x98\xe9\x3b\x15\x6c\x5a\x4a\x31\x63\x33\x09\xe9\xc3\x90\xd0\x3b\x42\xf4\x27\x8e\xbe\x27\x63\x44\x09\xf3\x21\x0b\xca\xcf\x6b\xc2\x7e\xa4\x89\xd9\xb2\x52\xd8\x76\x84\x94\x7b\x28\x77\x95\x33\x36\x87\x84\x60\xb2\x51\xfe\xf4\xe4\xaf\x7f\x61\xd3\xa5\x53\xa4\x80\x21\xad\xb6\x3c\x0b\x2f\x99\x09\x35\x77\xb4\xc2\x43\xa1\x59\xb0\x19\x28\x00\x8d\x41\x70\xe2\x4f\xbf\xbc\x9a\x36\x35\xbb\x83\x54\x5c\x1f\x44\xf4\x1b\x67\x7a\x3e\x61\x47\xa1\x3e\xb2\x2a\x52\xf0\xf3\x77\x07\xeb\x1e\x8e\xcd\x74\x26\x93\x65\x6f\x46\xf3\x30\x64\x6c\xa1\x6f\xd0\xc2\x5c\xc3\x3d\x75\xed\x57\xa1\x8b\x2a\xc3\x50\xc7\xf3\x50\xea\x5c\x19\xb1\x5a\x90\xb8\x76\x5f\x80\x73\x9e\x86\x68\xc9\x51\xca\x03\xf7\x8f\xd4\x54\xe8\x42\xee\xe3\x80\x46\x06\xc2\xe4\x39\xcf\xb2\x29\x4f\xae\x2e\xf5\x0b\x3d\x37\xaf\xd4\x49\x59\xea\xb2\x39\x97\x8c\xbb\x33\x7a\x51\xa9\x2b\x6c\x06\x11\xf0\x1a\xf4\xdc\x29\xf4\x45\x65\x3d\xbc\xf7\xba\x17\xc6\xe2\x7d\x7f\xf4\x7b\xe3\xbb\x1e\x45\xbc\x93\xb5\x85\x4d\x75\x63\xc8\x91\xf1\xf8\x26\x66\xb6\x2f\x9f\xfc\xe9\x2b\x64\x5d\xa6\x4b\xf6\xd5\x13\xa8\x15\x30\x23\xdc\xc4\x70\xa2\x3a\xf5\x24\xe7\x59\xe6\x04\x79\xcc\x94\x8e\xd0\xeb\x98\xf0\x93\xf3\xa0\xed\xcf\x6e\x77\x56\xe0\x2f\x2f\xff\x01\xa7\x88\xb4\x46\x64\xb3\x11\x96\x48\x05\x63\x7a\x17\xd4\x91\x5d\x92\x3e\x50\xa7\xf6\x00\xd4\xee\x6b\x9d\x55\xb9\x38\x16\xd7\x72\x88\x6e\x4f\x8d\xd1\xbc\x83\x29\x93\x06\xce\xc1\x69\xa6\x93\x2b\x96\xd2\x97\x51\xbe\x53\x1b\x96\xbc\x3b\x15\xba\x66\x7e\xf5\xc8\xf8\xba\xf5\xfd\x1b\xb9\x5e\x39\x2f\x0a\xa7\x03\x40\x25\x66\xc9\x6f\x1a\xc4\x80\x3d\x09\xd8\x09\x3d\xc1\x6d\x7a\x07\x37\xfa\x86\x36\xc6\xf4\x46\x4e\x6e\x76\x1e\xa2\x73\xae\x53\xff\xc8\x48\x3d\xfb\xee\xee\xf0\x06\x43\xd4\x03\xfa\xdd\x50\xc0\xbf\xb1\x9a\x69\x45\x31\x0f\xb0\x9a\x81\x31\x50\x01\x70\xec\x03\x22\xb9\xbb\x9b\x7f\x00\x9f\x7a\xbf\x44\xb7\x06\x5d\x54\x88\x65\xe4\xdc\x92\x42\xe8\x6d\x15\xce\x0a\x51\x1a\x69\xdc\xb9\xfc\x03\x6c\xa8\xa3\x8c\xcb\x3c\x72\x3c\x6f\x86\x08\xb8\xb9\x01\xcb\xb9\xbf\xa4\x74\x76\x0a\x0e\x08\xa2\x10\x71\xac\xd7\xa8\xb5\x4d\xad\xf6\xa2\x9a\x02\xff\xc0\xed\xf7\x69\xa9\x37\xe0\x49\xbc\x69\x19\xfb\x43\xbd\x0c\x4d\x11\xeb\x3e\x09\x32\x16\xef\xfa\x9c\x24\x2b\xbc\xdf\x63\x15\xac\x61\xf2\x03\xc9\x0f\x90\xa8\xb4\xb8\x4d\x11\xda\xb0\x3a\x71\x87\x45\xb6\x00\x19\x90\x13\x86\x49\x1b\x6e\x4f\xd0\x4f\xd9\xee\xb3\xdd\x8d\x4a\x57\x24\x51\xa9\x0b\x3e\xef\xd5\x91\xa8\x45\xa9\xf6\xb0\x31\x5c\x86\xb3\x9f\x22\x51\x52\xd0\x5d\x4e\x92\x78\x34\x20\xc0\x7a\xc2\x60\xbe\x27\x30\x59\x16\xd0\x31\x8e\xdd\xf0\x25\xe3\xa5\xae\x54\x4a\xee\xd0\xe0\x8f\x7e\xd9\x7a\xf0\x99\x56\xc2\xc7\x79\xda\x68\x1b\x10\x80\x92\x8a\x3d\x9d\x3c\x7d\xf2\xb9\x1c\x71\xf0\x86\xad\x23\xee\x2c\x1c\x71\x28\x9f\x36\xfa\xae\x1e\xb7\x7f\xa0\xf7\x7d\x49\xbe\x99\x1a\x96\x5f\x7a\xd0\x6f\xf8\xe8\xa6\x94\x56\x44\x7d\x06\xf7\xc0\xe2\x71\x86\x65\x84\x2d\xb1\xbf\xae\x1f\x46\x4f\x22\xf5\x03\xf3\x30\xd5\xf4\x23\xca\x2d\x12\x50\xb0\xdd\xd6\xb9\xc6\xcc\x7b\x44\x58\x4c\xa8\x9d\x1d\xb6\x87\x77\xee\x62\x05\xfe\xfe\x46\x59\x8b\x88\x76\xf2\xae\xe8\x81\x14\xda\x02\x7b\x28\x38\x38\xef\x8a\x01\x29\xf8\x77\xb1\xe0\xd7\x02\x90\x07\x64\xc6\xcb\x0c\x42\xe4\x17\x38\x77\x36\xad\x2c\x13\xea\x5a\x96\x5a\x81\x9f\xf8\x9a\x97\x12\xb0\x7d\x4a\x31\x13\xa5\x50\xce\x88\xfd\xfd\xde\x0f\x87\xaf\x21\xff\x66\x1f\xfb\xbe\xf8\x59\x56\xc6\x83\xf0\xc4\x33\x89\x86\xfb\xe0\xf2\xf9\x79\x38\x1a\x82\xcc\xf5\xf3\x72\xcf\xc9\x2b\x5b\x61\x73\x99\x77\x49\x56\x19\x79\xbd\x29\x49\x42\x90\x10\xc7\xb2\xd3\x3a\xb7\xe0\x29\x6a\x42\xad\x20\x4d\xd4\x61\x82\x0f\x00\x71\xef\x9a\x50\x63\x1a\xa7\x6c\x90\xcf\x8a\xe5\x72\xbe\xb0\x94\xed\xd9\x8a\x1c\x44\x21\xa8\x1c\xdc\xbc\x9b\xf4\x5e\xb9\x63\xf7\x30\x93\xdc\xdc\x57\xe5\x5a\x29\x64\xa4\x51\xa8\xc0\x5e\xfb\xdc\x22\xef\x94\x71\x0f\x42\x4f\xe5\xe9\x39\x45\xd0\x3c\xdd\xa4\xfa\x37\x26\xd6\x04\xb3\x04\x13\x65\xf0\x27\xe8\x6e\x9c\xb1\x08\x16\xc8\x27\x94\x80\xf0\x07\x2c\x2a\xb0\x48\x94\x56\xe3\x45\x04\xdb\x54\xe8\xf4\x9e\x45\x7e\x5d\x0d\x8f\x4e\x26\xc7\x7a\x0a\xb2\x85\xce\x52\xdf\x45\x1b\x7d\x39\x53\x61\x6f\x84\x50\xec\xf4\x1c\xe8\xe7\x5e\x11\x22\x42\xb7\x50\x11\xc3\x0a\x00\xd0\x14\x99\xb2\x0d\x7a\xde\x97\xc1\x7a\x58\x25\x7d\x54\xfa\xf0\xa6\xbd\xf7\xfc\x77\x81\x66\x3e\x23\x9b\x4f\xf5\xb5\x00\x92\xa6\x69\x29\x4c\x0f\x80\xa3\x0d\xd8\xa9\xbd\x44\xa9\xec\xd4\xe0\xa7\x19\x18\x09\x64\xf3\xae\x25\x50\xdf\x61\xab\x02\xe3\x7d\x62\x09\x76\x7a\x7e\xd4\x43\x7a\xed\xbe\xa1\xb8\x88\x1b\x6a\x77\xd7\x30\x59\x24\x75\xcc\x75\xc2\xea\x70\x63\x54\x28\x81\x1a\xe3\xfd\x62\x5d\x5d\xd5\xc4\x48\xa8\xf5\x14\xd2\x4c\xe1\x30\x4e\xac\x50\x91\x34\xb9\x73\x20\xe8\x50\xe8\x14\x3a\x30\xd5\xd4\x30\xfe\x17\x31\x41\x7c\xb2\x04\x0a\x79\x4a\x1d\x19\x85\x24\xe4\x96\x60\x02\xd7\xbb\x4f\x3f\x8c\xa4\xf8\x0a\x31\x3f\x19\x2d\xcf\x4f\x8f\x87\x64\x97\x42\xa6\x0f\x8e\x5d\xee\x6f\x5f\x36\x4b\xe2\x9a\x48\x12\x34\xa0\xdf\xec\xe7\x3a\xbd\x45\x4d\xaa\x0f\x1a\xb8\x3f\xee\x05\x6c\x35\xe3\x0c\xfd\x8b\xad\x2e\xef\x1d\x88\x72\x6f\x29\x01\xaa\xd6\x79\x95\x65\x17\x22\x29\xc5\x7d\xfd\xaa\xcd\xf5\x3f\x6d\x8d\x75\x9b\xca\x13\xe9\xef\x00\x4f\x40\x37\xab\x1a\x06\x33\x4a\xec\xa8\x8b\x0f\x8b\x2a\x83\x5c\x58\xae\x96\x9e\xe0\x30\x7b\x13\x05\xb1\xa4\xf1\x69\x35\x98\xc6\xd5\x58\x05\x23\xc2\xc3\x42\x57\x29\x6e\x0c\x86\x5a\xa5\x4a\xe5\xb5\x4c\x2b\x9e\xc1\x83\x40\x0b\x8d\x3b\xf0\x87\x13\x32\xf7\xb0\xae\xec\xb9\x2e\x99\x78\xc7\xdd\x6d\xa3\xa0\xc4\x72\x03\xec\x90\xea\xe4\x4a\x94\x23\x54\xc5\x8e\xe1\x8f\x23\xd0\x78\x11\xf7\xdc\xcf\xc3\xd9\x12\x04\x66\xda\xa5\xa9\xbf\xef\xda\x8f\x74\xf8\x1d\xbe\xee\x52\xaa\xf9\x18\x3e\x71\x2f\x42\x4f\x1a\x6b\x35\xe6\x63\xc7\x86\x8f\x44\xf1\x03\xa0\xf3\x57\xa0\x59\xbd\xf6\xfc\xe2\x4d\x04\x67\xc8\xe9\x6a\xbe\x00\x62\x95\x39\xf7\x98\x83\x99\xb0\x00\x27\x47\x01\x61\xcc\x02\xa2\xdf\xa6\xa4\xa6\xc5\xf0\x7a\x4d\x5e\x7b\x24\xca\x5f\x57\x0f\x59\x2b\x9b\x39\x12\x5b\x44\x23\x7b\x6f\x0e\xd4\xd7\xa2\xbc\x96\xe2\xe6\x80\x8e\xce\xf1\x8d\xb4\x8b\x31\x52\xc4\x1c\x00\x61\x0f\x7e\x87\xea\xe5\xe5\xab\xe3\x57\xd0\x9b\x99\xdc\x96\x95\x11\xb3\x2a\xa3\xee\xf6\x13\xc6\x0b\xf9\x83\x28\x0d\xa0\xcf\x5e\x49\x95\x8e\x58\x25\xd3\x6f\x3e\x61\xc6\x8c\x54\xb2\x4e\x03\xec\x25\x05\x5f\x90\x94\xa3\x32\x64\xf9\x9f\xba\x01\x3d\x65\x15\x4d\x45\xa6\xd5\x3c\x2a\xa2\x06\xf5\xe2\x54\x49\xbb\xd2\xc6\x16\x21\x21\xc1\x44\xd6\x65\x0a\xc9\x96\x52\x97\x0d\x7f\xb0\x1b\x0f\x80\xf2\xa2\x94\x4d\x27\x22\x65\x63\x3c\xc8\x83\x31\xe1\x30\x62\x98\x49\xe1\xeb\x2d\x3d\x8e\xb0\x07\xe0\x43\x3c\xc8\x05\x57\x29\xfc\x99\x24\xba\x4c\x69\xbe\xd2\x86\xfc\x50\xcc\x26\xc2\x14\x16\x38\xd6\x9c\x84\xe4\xaa\xfd\x64\xb0\x40\xcb\xbc\x91\x4b\xe8\xd5\x9e\x4a\xc9\x5f\x2a\xc1\x78\xae\x9d\x60\x6f\xa3\xe5\xb7\x28\x92\xf3\x25\x9c\xad\x30\xd5\x17\x3e\xdf\x9d\x8a\x14\xcd\x88\xbd\x16\x3c\x95\x51\x9d\xf5\x88\xbd\x68\x16\x5e\x8f\xdc\x5c\x2e\xb0\x22\x94\x3e\xc2\xd9\x97\xc2\xe8\xaa\x4c\xc4\x6b\x0c\x12\xe5\x3e\x21\x69\xf5\x65\xdc\xaa\x58\x7e\x25\x14\x1a\xe5\x8e\x34\x10\x07\xab\x4a\x58\x83\x64\x21\xd2\x0a\x4e\xa9\xe9\x92\xcd\x24\xb6\xd0\x00\x55\x41\xce\x17\xc2\x58\xaf\x5c\x1e\x40\x92\x4f\xdd\x8d\xcc\x4f\x00\xd8\x37\xca\x06\xae\xdd\x58\x39\x07\x80\x67\xd8\xb2\xdc\xfa\x82\x17\xb4\xd9\x4c\x95\xfb\xbd\xdc\xa6\xb4\x99\xb0\x17\xee\x51\xc8\x4f\x51\x6b\x02\xd9\x22\x2e\x04\xe9\xc8\x0f\xc7\x66\xdc\x2c\xa0\x71\x47\x7b\x09\x08\xf5\x3f\xa9\x4a\x27\x30\x10\x8c\x9b\x43\xc3\x75\x68\xce\x0b\xbd\xb9\xd7\x39\x6e\x7a\x16\x38\xb8\xc9\x8e\xa3\xf3\xee\xb1\x1c\x62\x87\x21\x61\xdd\x11\x3e\x69\x49\x02\x5c\x49\x77\x60\x79\xc8\xaa\xb2\x52\x75\xc4\xd4\x49\x85\x4f\x77\x24\x75\x8f\x8f\x76\x8a\x6b\xf6\x39\x01\x79\x39\xef\xef\xf9\xd8\x3d\x2c\xe7\x15\x6e\x74\x92\xc2\x35\x74\x37\x75\xad\x06\xad\x0d\x75\x4c\x67\xce\x1c\xbd\x3c\x8e\xcb\xa4\xe2\xfa\x0f\x5f\x64\x36\x61\x3f\xf4\x75\x52\xb7\xbd\xd4\x4e\x9a\xd7\xae\xef\xba\xeb\x86\x93\x18\xd9\xb5\xb7\x2f\xc2\xd3\xbc\x1e\x2a\x55\x51\x59\x3a\x06\x6b\x8b\x53\x25\x0b\xae\xe6\x60\x64\xea\xca\x8d\xf7\xfb\xdf\xc3\x8c\x4a\x91\x56\x09\xb5\x2c\xf1\x2c\xfb\x7b\xef\xb2\x25\x98\x30\x90\x55\x26\xe1\x85\x9f\x73\xfc\x5a\x66\xa9\x2c\x7f\xf7\x8c\xc9\x89\x98\xb0\x9d\xdf\x47\x5f\xed\xe0\xd3\x8b\x52\xbb\x47\x50\x79\x06\xcc\x2a\x93\x16\xd2\x24\x76\xe2\xbb\x27\xec\xc4\x3d\x03\xc2\x58\x81\x80\x51\x05\xc1\xb4\x26\xdf\x88\x95\x62\xce\xcb\x34\x23\x77\xcb\x4d\x54\x76\x12\x08\x26\xde\x49\x63\x0d\x9e\x41\xb6\x87\x64\xb2\xdc\x5c\x39\x39\xe4\x76\xd6\x38\xe5\x96\x8f\xa3\x2d\x7d\x80\x76\xdb\x98\xb0\x94\xc7\x9c\x58\xab\x16\x59\x07\xbf\xa3\xea\xcd\x31\x0f\x77\x49\xa7\x91\x03\xaa\x71\x77\x3d\xe7\xb1\xf9\xd8\x7a\x40\x6a\x37\x77\xef\x49\x8d\xb3\x0f\x34\x80\x2e\x35\xb5\xbe\x14\x84\x28\xa1\x46\xaf\xdb\xcf\x27\x67\x97\xaf\xff\x71\xfe\xea\xf4\xec\x72\xbb\xad\xb7\xdb\x7a\xbb\xad\x7b\x6c\x6b\xa1\xae\x7b\x6f\x69\x6f\x37\xad\x0b\xf9\xb6\x71\x2c\xa3\xea\xa5\xcf\x28\xb1\xee\x44\x5d\xff\xc0\x9d\x1a\x5d\x94\xc2\x80\x66\x02\xf1\xaa\x35\x11\x70\xba\x01\x95\xf6\xa3\x47\x9f\x59\xb7\xc1\xbc\xb8\x01\xf3\x8d\x62\x97\xca\xba\x55\x8b\x1b\x2c\x1e\xfd\xf3\xf4\xf8\xe4\xec\xf2\xf4\xf9\xe9\xc9\xeb\x8d\x26\x8a\xf4\xc4\x91\x6c\x1e\xca\x1d\x4f\xc9\xa2\x14\xd7\x52\x57\x26\x5b\x06\x28\xea\xf5\x42\x60\x35\xd7\x50\xa5\xe0\xeb\xf0\x68\xdb\x6b\x7f\xb6\x3d\x6c\x87\x3d\x6c\x9b\x79\x33\x3d\x20\x84\x86\x62\xdf\xe7\xa5\xce\x07\x62\xe1\x0b\xf4\xc2\xf8\x60\xf8\x3a\x7e\xda\x25\xb4\x91\xc6\xd1\x43\xca\x63\x0d\x6d\xe2\x94\xd1\xbc\xb0\x3d\x3a\x8d\x0c\x82\x1c\x3c\x0c\xc8\x2e\xe6\xea\xbc\xe4\xc5\xf7\x62\xf9\x5a\xf4\x44\x2a\x6a\xd2\x5b\x64\x22\x71\x07\x1d\xbb\x12\x4b\x4c\xcc\x3c\xf2\x0f\xeb\x83\xa8\xf4\x20\x81\x97\xaf\x44\x1f\x50\xec\x21\x11\x93\xaf\x44\x8f\xa4\x53\x7f\xad\x60\x07\xbb\x25\x04\x3d\xcd\xad\x69\xbf\xd5\x63\xc3\xa2\x25\x7f\x04\x84\xe8\xcf\x37\x82\xd2\xbc\x06\x5c\x05\x1f\x08\x1e\x78\x25\x30\x26\xbf\x6c\x9c\x5d\x41\x88\x30\x2c\x07\x05\xde\xf4\x41\x07\x52\x32\x06\x22\x4d\xdf\x56\x85\x0c\x97\x70\x58\xb9\xba\x5b\x0b\x56\xcc\xf1\x0f\x58\x78\xe9\x33\x0f\x9f\x60\x42\x7f\x41\xe8\xd8\x3b\x6a\xfe\x09\x21\xd1\x11\xfb\x57\xf8\x30\xe3\x53\x91\x99\x9f\x76\x77\xbf\xfe\xfe\xe4\x1f\x7f\xdb\xdd\xfd\xf9\x5f\xf1\xb7\x70\x14\x62\xa0\xbc\x79\x0b\x60\x41\x28\x9d\x8a\x33\x78\x06\xfc\x49\xea\xda\x21\x06\x4f\xe8\x0b\x28\xe5\x9e\x60\xd6\x52\xf8\xb3\xd0\x69\xfb\x2f\xd3\x0b\xb4\xf0\x41\x1e\x0c\xb0\x44\x3d\x2a\x8b\xf0\x1a\xee\x78\xa8\x65\xc9\xc0\x5b\x95\x46\x0d\x4d\x72\x92\x85\xc8\x11\x36\xed\xb9\x27\x01\xf4\x40\xf6\x98\x11\x0a\x0a\xed\x9d\x66\xda\x44\xb0\xdc\xb9\x7e\xda\xab\x59\x3c\x5e\x03\x8a\xb6\xb0\x82\x03\x13\x0c\x28\x42\xd4\xc2\x8d\x1c\x0e\xd8\x90\x30\x13\x7a\x74\x1e\x9e\x9f\xb2\x6b\xa4\xf0\x83\x21\x8e\x0f\x6c\x3e\xff\xa8\x32\x2e\x84\x4f\xdb\x05\xbd\xcf\x30\x01\xc7\x7f\x4f\xe0\x0a\x26\xa0\xec\x09\x67\xd8\xec\xe1\x87\x93\xa4\xa8\x46\x74\xc3\x24\x17\xb9\x2e\x97\xe1\xcf\x50\xd4\x39\x36\x56\x97\x7c\x0e\x35\x35\xf8\x73\xfc\x59\xf8\x0b\x7f\xd8\x78\xc0\xea\xaf\xd1\x14\xae\xa3\xa8\x24\x91\x3b\x82\x84\xd4\xd7\x03\x94\x6d\x9e\xf4\x0f\x44\xb4\x25\x7d\xa1\x9e\x9a\x57\x93\x21\x83\x27\x0e\x15\xce\x40\x45\xb0\x27\xa9\xd8\x78\x54\xe7\xc3\x81\x37\x40\x5d\x3b\xcb\xb2\x33\x48\x5f\x7d\x0d\x28\xcd\x52\x79\x2d\x8d\xee\x51\x39\x14\x06\xba\x3d\x77\x92\xf0\x4e\x30\x7f\x2b\xb8\xcd\xde\x15\x80\x4b\x16\xf6\x6b\x4b\xec\x3f\xed\xd3\x9a\x0c\xaf\x82\x5b\x2b\x4a\xf5\x8c\xfd\xf7\xde\xdb\x2f\x7e\x1d\xef\x7f\xb3\xb7\xf7\xd3\x93\xf1\x5f\x7f\xfe\x62\xef\xed\x04\xfe\xf1\x87\xfd\x6f\xf6\x7f\xf5\x7f\x7c\xb1\xbf\xbf\xb7\xf7\xd3\xf7\x2f\xbf\xbd\x3c\x3f\xf9\x59\xee\xff\xfa\x93\xaa\xf2\x2b\xfc\xeb\xd7\xbd\x9f\xc4\xc9\xcf\x77\x1c\x64\x7f\xff\x9b\xdf\xf7\x9e\xfa\x00\x30\xc1\x78\x0d\x09\x16\xdc\x1c\x71\x10\xf6\xfb\x88\x1d\x32\xf0\xf2\xec\x35\xf4\xfe\x7f\xed\xa5\x66\x94\xcf\xe3\x8f\xeb\x07\xb3\xc1\x31\x21\xf4\x53\x78\x72\xf0\x49\xcd\x5a\x9b\x60\x5a\x7c\x6e\xe7\xdc\x6f\xc1\xb9\x13\x7a\x5b\xc2\xba\xd6\x9a\xe8\xac\xd4\xb9\xaf\xe8\x87\xf0\x06\xd6\x9e\xd1\x7d\x57\xa2\x57\xbf\x65\xbc\xb6\xce\xa0\xad\x33\xe8\x96\xeb\x83\xce\x20\x2c\x47\x78\xb8\x9e\x20\xa1\xae\xbb\x86\x30\xd6\x46\xd0\xbd\xad\x13\xe3\xe6\xdd\x2d\xa0\x36\xf1\x5b\xbd\x6e\x0a\x5b\x67\xd2\xe0\x81\x96\xaf\x8f\x61\xb2\x43\x68\xff\x8e\x1b\x1f\x06\x08\xb8\xa4\x02\x4d\x1b\x5f\x7f\x79\xed\xa6\x10\xd0\xe8\x1b\xb8\xb3\x90\x55\x2c\xd5\x9c\x90\x2c\xf0\x28\xa1\xe8\x93\x54\x35\x62\x6f\x50\x0e\x6b\x98\x77\x6e\x8c\x4e\xa0\x9f\x12\x02\xec\x05\x38\x3f\x9a\x36\xcc\xc6\xf2\x2b\x88\x36\x26\x22\x15\x2a\x11\x04\x01\xdf\x68\x80\xcb\x15\x3b\x51\xd7\x1e\x06\x3f\xad\x30\x19\x04\xc5\xdf\xfa\x31\x3e\xaf\x04\x04\xc7\x88\x14\x04\x8b\xf2\x10\x40\xea\x07\x0b\x9b\x43\x2a\x86\x9e\xd5\x5e\xd6\x6e\x3d\x32\x7b\x9f\xe2\xfd\xcf\xcc\x10\xd9\xea\xa5\x0c\xad\x1c\x96\xb5\xfb\xb9\x79\x48\x7e\x0e\xc1\xc0\xfe\xc7\xe7\x6f\xee\xe8\x1c\xe8\xd8\x1c\xe6\xc8\xbc\x47\xec\x64\xc8\x63\x72\x88\x60\x49\x51\x8a\x99\x7c\x37\xd0\x3e\x3d\x8c\x2a\x13\x65\x2a\x94\x95\x33\x89\x6d\x80\x8b\x52\x14\x42\x81\xab\x15\x8a\x33\x9c\xec\xa7\x93\xb2\x0e\x4e\x3f\xc4\x64\x1e\x54\xb8\x87\x15\x65\x17\xeb\x94\xfd\xad\x1c\x63\x5b\x39\xd6\xf9\xfa\x44\x72\x8c\x38\xf7\xe1\x08\x31\xc8\x3c\xef\x9f\xfa\x7e\x1c\xe5\xb1\x03\x17\xf7\xaf\x1c\x6e\xa1\xc1\x05\xb9\x68\x35\x66\xae\x61\xf9\x5a\xc9\x32\x71\x2d\x32\x52\x9a\x58\xce\x15\x9f\x23\x84\xbf\xd5\x01\xf4\x47\x97\xa1\x0d\x53\x1b\xd1\x07\x94\x78\x5f\xd9\x05\x5f\x96\x3a\xcb\x44\x69\x58\x26\xaf\x04\x3b\x16\x45\xa6\x97\x39\x25\xbe\xa6\xec\xc2\x72\xeb\x58\xfa\x42\xd8\x6e\x31\xdf\x7e\x68\x20\xbe\x98\x7d\x20\xcc\x74\xac\x8e\x87\xda\x72\x56\x50\xe1\xe4\x2b\x05\x12\xe3\x10\x3a\xc2\x8c\xd8\x99\xb8\x16\xe5\x88\x9d\xce\xce\xb4\x3d\x47\xd5\xbb\x99\x6d\x87\x37\x32\x39\x63\xcf\x9c\x51\x67\x2c\xb3\xd8\x95\x23\xaa\x73\xd7\x65\x63\x80\x1a\xef\x6d\x88\xb2\xbc\xd5\x92\x73\x18\x29\x14\x9c\x77\x0a\x63\xf4\x5a\xa6\xd0\xf6\xa8\xf7\x02\x1d\x62\x19\x69\x0d\x01\x1c\xf1\x37\xc2\x33\x78\x04\x33\x30\x01\xa5\x62\xa5\x30\x85\x56\x46\x34\xe1\x19\xc3\x8c\xd0\xd4\x1d\x16\xfb\xb5\xf3\xc9\xd9\xf7\xcc\x2c\xb4\xb1\x50\x39\x3b\x4c\x33\xad\x73\x3f\x1c\x14\x22\xf3\x2c\x13\x69\xa3\x9b\x1a\x76\x01\xe2\x4d\xf7\x40\x02\x5d\x1d\xd2\xd0\x17\x04\xeb\x93\x1b\xa5\xcd\x8d\xfb\x43\x67\x3e\xdf\xfb\xc6\xb7\x65\xbe\xad\xa0\xb9\xde\x98\x70\x88\x44\x0c\xb0\x02\x14\x0d\xf0\xe1\x26\x6a\xa0\xb3\xd0\xfa\x8a\x25\x3a\x2f\x32\xd8\x3a\x3d\x76\x56\xdd\xbf\x2b\xb0\xd2\xd8\x8d\x6e\x0e\xa2\xd6\x5e\xf0\x41\xbf\xce\x5e\xbd\xb4\xb0\x21\x74\x30\xf1\x4e\x24\x83\xf5\xfe\x3c\x79\x27\x92\xa8\x79\x2d\x40\x59\x25\x1e\x18\xc2\xed\xd8\xfe\x3d\xc9\x7b\xc7\x1b\x86\xf2\xf1\xf7\xa8\xa2\x8b\xaf\x16\xfa\x1f\x8c\xe9\x51\xd2\xe9\x11\xd0\x70\x02\x0c\x21\xac\xac\x8b\xd1\x33\x02\x33\xe2\xd6\x5b\x81\x0c\x0c\x59\xd4\x7e\x2c\x68\x2d\xa5\xb5\x65\x7b\xbb\x07\xbb\xfb\x2b\xce\xc7\x16\xd4\xf6\x65\xf4\x4b\x09\x10\x91\x05\xe0\x2d\x8a\x64\x37\x1d\x31\x69\x7d\x9a\x35\xf6\x3d\x82\x59\x51\xb9\xdf\x88\x19\xcd\x6c\xc9\x53\x49\x6a\x0c\x7c\xea\x6e\xb2\x65\x45\x52\x7e\x6f\xf7\xd7\x5d\x6a\x89\x74\xa3\xd5\xae\x85\xe9\x4f\xd8\x25\xc2\xcd\x84\x81\x96\xba\x82\x4e\x9f\x48\x82\x22\x93\x89\xb4\xd9\x12\x24\x16\xd3\x15\xb6\x05\x73\xe7\x05\x95\x19\x9e\xbc\x93\xd6\x37\x25\xd1\x33\xf6\x04\xbb\x92\x09\x4e\xee\xcf\x4c\x5e\x8b\x83\x85\xe0\x99\x5d\x60\x86\x88\xd2\x6a\x8c\x8d\x25\x9d\x28\xa1\x6f\xfa\x06\x4b\xfa\xf9\x12\xe3\xab\x87\x5f\x71\x75\x42\x3d\xcd\x06\x27\x44\xbf\xed\xde\xed\x9a\xad\xa0\x7e\x5d\x5e\x9e\x7f\xdb\xe8\x77\x0d\x52\xdc\xda\xc2\xe7\xed\x44\x4d\xe1\x1f\x80\xec\x18\x26\x52\xd9\xab\xf1\x35\x1b\x50\x84\xf5\x6d\x80\xcd\xd6\xa3\xb8\xdd\xbd\xf3\x35\xfb\x87\xae\x00\x03\x84\x4f\xb3\x65\x00\x60\x30\xc2\xb2\x1d\x37\xd4\x8e\x13\x4f\x8e\x1b\xbe\x13\x3c\x45\x7c\x0c\x63\x05\xef\xa4\xba\xc5\xd7\x60\x11\xb4\x68\x6e\xc3\x9e\x03\x95\xb1\x3a\x67\x0b\x7a\xed\x66\xdd\x25\xed\x8c\x09\xec\x1e\x5f\xd4\x54\x8a\x02\x25\x1c\xfd\xe6\xb3\x93\x5f\x2b\x72\x03\xe9\xde\x68\x7e\x90\xc4\x64\x8b\x7b\xeb\x48\x85\xc4\x42\xb8\x99\x81\x64\xe9\x00\x99\x0f\x6c\xc0\xec\x07\xd6\xaf\x8a\xb3\x3d\x10\x44\xf4\xfa\x27\x7a\x0d\x96\x50\xc1\x06\x4b\x1a\x60\xeb\x3c\xac\xc4\x33\xe8\x7d\x19\x88\x88\x83\x86\xea\x59\xff\x3a\xd1\xf8\x7a\x3f\x01\x86\x59\x7c\x36\x24\x05\x8a\x01\xf2\xba\x57\xb3\xba\x11\x3d\x0a\xea\x2e\x51\xb8\x82\x98\x30\xa2\xbc\xee\x5a\xc9\x5d\x5f\xc3\xbd\xba\xee\x6e\xf1\xfb\x6b\x4d\x91\x74\xc9\x54\xe8\xa6\xed\xd1\x51\x57\x09\x12\xa5\x25\x50\xf3\x6d\xef\xcb\xf5\xc7\x11\x57\x73\xc1\x9e\xba\x5f\xfe\xe5\xcf\x7f\xfe\xe3\x9f\x27\x38\x7c\x48\x51\x50\xec\xf4\xf0\xec\xf0\x9f\x17\x3f\x1c\x41\x65\x6c\x5f\xaa\x0e\x94\x7f\x39\x74\xf6\xe5\xa0\xb9\x97\x1f\x35\xf3\x12\xea\x3d\x7a\x4b\x91\xa6\xe3\x1f\x86\x8c\x61\x42\x49\xf7\x8b\xe0\xf5\x9c\xae\xd9\x74\xa4\xba\xad\xf6\x20\xf6\x98\x4d\x8a\x0b\x9d\x5c\x0d\x68\xd7\x1c\x8b\xa2\x14\x09\xfa\xc9\x2e\x8f\xce\x71\x74\x67\x5f\x9e\xbd\xba\xac\xeb\x0c\x20\x19\xa7\xc6\xd0\xfb\x8e\x3c\x69\xce\x26\xbd\x12\x85\x0d\xa6\xfb\x94\x27\x57\x37\xbc\x4c\xc1\xb3\xc5\xad\x9c\xca\x4c\x5a\x84\xfc\x2b\x05\xb5\xbf\xc2\x6c\x3f\xc4\x36\xf3\xed\x85\x51\x96\xa3\x03\xc1\xbb\x43\xc1\x65\x85\x49\x34\x33\x2e\x33\xf0\xa0\x52\x67\x5f\x4c\x07\x4a\x8a\xe0\xd2\x8b\x7d\xda\x5b\xe3\xcb\x5f\x0f\xd6\xf8\x8a\x3a\x0f\xdf\xd7\x0e\xeb\x9b\x94\xf8\x80\x8f\x3a\x3a\xe2\xca\x46\x13\xf0\xed\x51\x37\xc0\x78\x0f\xf7\xa8\x2b\x4a\x71\x61\x75\xa7\x4e\x02\x6c\x35\x4a\x82\x83\xdd\x12\x23\x99\x8a\x99\x76\x42\xf8\xd6\xa0\x47\x5a\xc1\x26\xe4\x0a\x2a\x03\xbd\x57\x4b\x37\x02\x1b\x98\x8e\xe9\xdb\x6e\x67\x84\x97\x7a\x60\x62\x90\x54\xdf\x43\x79\xe4\xde\x4e\xe4\x30\xbb\x51\x5d\xe2\x40\x1d\x9c\xe1\x43\x61\x13\xf4\xdc\x46\x82\x1c\x00\x43\x69\xfa\xed\x30\x4a\x52\x72\xb3\xc0\xee\xc6\xe2\x9d\xf4\x6d\xee\xcf\x75\xda\xee\x49\x3e\x2f\x79\x22\x58\x21\x4a\xa9\xdd\x61\x54\x29\x9b\xea\x1b\xc5\xa6\x62\x2e\x95\xf1\xa4\x00\x0c\x76\xa2\x19\xc4\x63\xa4\x09\x90\x70\x13\xf6\xba\x81\x74\x42\x35\x48\x89\xae\xb7\x26\xcd\xb9\x1d\x49\x82\x13\x0b\xe8\x84\x2d\x7f\x02\x85\xe3\x2e\x48\x1f\x9a\xf2\x5e\xa5\xe0\xc9\xa9\xc8\xf8\x12\x53\x4d\xa1\xf3\xb9\xfc\x8f\x28\xcd\xfe\x00\x11\x27\xec\xe3\xe5\xbf\xbb\x75\x1e\xd2\xb0\x52\xf0\x64\xd1\x2f\xf8\xbb\x0d\x51\xdd\xf1\xda\x86\xa8\xfa\x0c\xb2\x0d\x51\x6d\x43\x54\x1f\xb8\xb6\x21\xaa\x6d\x88\xaa\x75\x3d\x58\x2b\x69\x1b\xa2\xea\x7c\x6d\x43\x54\xef\xbf\xb6\x21\xaa\x3b\x5c\xdb\x10\xd5\x1d\xaf\x6d\x88\x6a\x1b\xa2\xda\x86\xa8\xb6\x21\xaa\xdf\x90\xdf\xce\x5f\xdb\x10\xd5\xca\x20\xdb\x10\xd5\x36\x44\x75\xe7\xeb\xc1\x1a\x5f\xdb\x10\x15\x5e\xdb\x10\x55\xf3\xfa\x6d\x1d\x75\x3e\xc0\x73\xee\x4c\xbd\xfe\x35\x6d\xe7\x10\x54\x90\x09\xc5\x89\xf4\xac\x51\x07\x85\x8f\x9a\xd4\x0d\x2a\x22\x4c\x10\x5f\x8a\x43\x11\xa1\x3a\xce\xb4\xb6\x5e\xaa\x67\xfb\xb8\x42\xa7\x75\xa0\x22\x8a\x50\xa0\xc1\xdb\xbd\x66\x6d\x63\xd5\x58\x7d\xc2\x12\x9f\x26\x24\xf1\x40\xe2\x37\x03\x84\x21\xb6\x21\x88\xcf\x2e\x04\x31\x8c\xfb\x6e\x00\xd7\x5d\xef\xa3\x82\x22\xf3\x97\x8b\x52\x98\x85\xce\x3a\x33\x7a\x83\xc9\x5f\x4a\x25\xf3\x2a\x87\x06\xb1\x8e\x9f\xe5\x75\x48\x01\x08\x5d\xb0\x49\x62\xa3\x17\x31\xea\x24\xeb\x3b\xc8\x42\xfd\xe6\x82\x5f\x43\x57\xd4\x2a\x49\x84\x48\xa3\xde\xf6\xa0\x61\xfd\x71\x12\x9e\x14\xfa\x66\x3c\xed\x27\x6f\xfa\x1d\xe2\x88\x45\x0a\xa3\xfc\xf1\xcb\x4e\x63\xcc\xcb\x62\x18\xb9\xfc\xed\xeb\xf3\xa3\x48\x2e\x73\xe5\xc5\xb2\x54\xd7\x3a\x03\xaa\x72\xbc\xc9\x29\x6b\x13\xac\xdf\xc7\x76\xeb\x3c\x2b\x16\x3c\xb2\x6e\xc8\x30\x30\x4c\x28\x3e\x85\xd6\xb4\xee\x77\xe1\x4c\x3e\xc7\x93\x57\x70\x5b\x95\x82\xcd\xb9\xdd\xa4\xc8\xef\x6f\xc4\xf4\x32\x60\x86\x38\x71\xfa\xea\xe8\x4d\x2f\x9c\xd3\xc4\x9b\x7e\xa8\x39\x70\x06\x02\xe8\xdf\x59\x13\xef\x2d\x2b\xfb\x6b\xc7\xfd\x37\x17\x03\x84\x1b\x78\xf1\xc1\x08\xbc\x73\x41\x9d\xa3\xe8\x40\x8f\xcd\x20\xdf\x54\xca\x6a\x56\x64\xbc\x6e\x0b\x05\x2b\xf0\x1d\x9c\x42\x47\x0b\x91\x5c\xbd\xa6\x58\xec\x9e\x11\x22\x68\xa7\x73\x69\x17\xd5\x74\x92\xe8\xfc\xc0\x09\x05\xfc\xbf\x69\xa6\xa7\x07\x39\x37\x56\x94\x4e\x61\xa5\x43\x6e\x9c\xb8\x51\xa4\x9a\x4f\xf2\x74\x7f\xc2\xde\x2a\xac\x6f\xaf\xdb\x50\x46\xe8\x0e\xee\xf9\x1e\x69\x63\x2a\x9c\x7c\xd5\xe0\x89\x88\x10\xec\xdc\xf4\x26\x7d\x70\x92\x7b\x1f\x4a\x3d\xe3\xe0\x9f\x3e\x06\xbe\x95\x5c\x6c\x00\x97\xcb\x63\x8b\x75\x0f\x96\xf3\x31\x40\x8c\xfb\x01\xc5\xb7\x1f\x8c\x72\xfc\x50\x62\xda\x0f\x10\x6c\x7a\x80\x10\xec\x10\x31\xec\xe1\xe2\xd7\x1f\x01\x93\xf9\xe3\xc4\xad\x07\x74\xee\x0d\x14\xaf\xfe\x14\xb1\xea\x41\xde\xba\x6f\x8c\xfa\xd3\xc5\xa7\x87\x79\xdd\x21\x0d\x81\xc7\x1a\x93\x1e\xc0\x49\x3f\xa4\x83\x7e\x30\xe7\xfc\x47\x8b\x41\xf7\x8f\x3f\x3f\x80\xd8\x73\x6f\x22\x4b\x25\xad\xe4\xd9\xb1\xc8\xf8\xf2\x42\x24\x5a\xa5\x9d\x4f\x98\x16\x48\x67\xd8\x3f\x06\x87\x25\x4f\x55\xb3\xd4\x62\xc1\x09\x8b\xdc\x59\x54\x58\x5a\xe2\xa3\x19\xa4\x50\x40\x5c\x19\x67\xf9\x20\xe3\x13\xec\xc1\xb8\xc4\xb0\xee\x64\xc8\x45\xfc\x4e\xdf\x30\x3d\xb3\x42\xb1\x3d\xa9\xfc\x3a\xee\x47\x66\x60\xed\x9f\x0c\x6c\xed\xbe\x7d\xfa\xc4\xdf\xfc\xf9\x39\x1e\xc1\xc5\x6a\xcc\xc7\xf7\x03\xd3\x83\x3e\xec\x08\xa6\x1b\x67\x55\xd6\x74\x06\xa3\x83\xb8\x29\x6f\x9e\xd6\x68\xca\x4f\x61\xdc\xb0\xdb\xb8\x4a\x19\xd5\xa2\x7d\x7e\x8b\xd6\x3b\xb3\xa6\xa9\xfa\x85\x4c\x9a\x0f\xf9\x8d\x2f\x8f\xce\xd1\x6d\xbc\x75\x97\x3c\x14\x77\xc9\x86\xb2\x53\x1e\xa0\xa2\xfb\x48\x33\x52\xb6\x8a\xee\x3d\xae\xa8\x3a\xf5\xdb\x92\x27\xe2\x7c\x70\x1d\xc1\x6f\x27\x96\x56\x25\x27\x01\x18\x54\x3e\xbf\x79\x94\x10\x29\xee\xa6\x50\xd1\x0b\xb5\xb2\xb3\x2a\xcb\x96\xac\x2a\xb4\x6a\xd6\x3f\x63\xb4\xbd\x5d\x4e\x0b\x2e\xf9\x35\x4f\xa9\x15\xcb\xa2\xd4\x74\x66\x96\x95\x52\x4e\x06\xd7\x2d\xd1\x40\x91\x04\xa0\x66\xde\x28\xda\x35\x72\xee\xa6\xef\xce\x3f\xa8\xe7\xad\x53\x10\x1b\x03\xba\x5f\xcf\x74\x99\xc8\x69\xb6\x64\x0b\x9e\x85\xfe\x37\x9c\x5d\xc9\x2c\xa3\x61\x26\xec\x42\x58\x0c\x29\xe0\xd9\x99\x69\x35\x87\xc9\x71\xe5\xfb\x2e\x8a\xc4\xfd\x36\xc9\x04\x57\x55\x81\xcf\x73\x27\xf1\x52\x57\xa5\x7f\xde\x24\x04\x26\xc2\x09\xac\x64\x36\x8a\xba\xbb\xbd\x77\x61\x43\xf6\x4f\x65\x9c\x02\xf0\xca\x03\x53\x8f\xe2\x31\x3d\x76\xb8\x89\x7a\xfb\x14\xa5\xbe\x96\x29\x46\x37\x3c\xd9\xa0\x8f\x34\xf6\xef\x09\xfb\x59\x69\x35\x56\x62\xce\x41\x51\xa1\x5d\x84\x6b\x86\xe3\x60\x0e\x81\x4a\xa1\xa3\x8f\xd3\xf0\x75\xd1\x28\xa8\xbf\x96\xd8\x8b\x38\xa2\x1c\xdb\x53\x9a\x69\xc8\x48\xad\x94\xb4\xd8\xdf\x7e\x51\x59\x96\xea\x1b\xb5\x1f\xc5\x5d\xd9\x54\xd8\xf7\x47\x5d\x21\xd0\x7a\xb9\x96\x40\xcd\xf0\xeb\x3a\x3d\x07\xdf\xf7\xfd\xe4\x95\x86\x5c\x9f\x33\x56\x29\x23\x7a\x1e\xef\x83\x29\x47\x7f\xf9\x53\x37\x19\x21\x73\xa1\x2b\xfb\x49\xac\xbf\x9b\x85\x4c\x16\xb1\x32\x2b\x73\x61\x98\xae\x5a\x66\xf1\x53\xfa\xd9\xfa\x15\xda\x9a\x80\xeb\xae\xae\x8e\xdd\x35\xde\xaf\x36\x20\x42\xdd\xf8\x1a\x32\xc5\x8f\xcf\x2e\xfe\xf9\xe2\xf0\xef\x27\x2f\x26\xec\x84\x27\x8b\x18\x15\x43\x31\x0e\x42\x03\x04\xc5\x82\x5f\x0b\xc6\x59\xa5\xe4\x2f\x15\x05\x7c\xf7\xc2\x6f\xf7\x07\x45\x6b\xef\x78\xfa\x42\x73\xfe\xc1\xba\xc1\x61\xab\x7f\xcc\xcc\xd2\x46\x40\xff\x96\xb6\xfa\x74\xe2\xbe\x42\xe3\x00\x54\x2d\x48\x9d\x9f\xcb\x6b\x12\xc3\x04\x7f\xcf\xd3\x90\x2b\xe6\xf8\xdc\xb1\x85\x3b\xaa\xf8\x14\x72\xbc\x16\x82\x29\x61\x1d\x5b\x07\x1f\x93\x56\xa6\x01\x4f\x52\x19\x61\x46\x6c\x5a\x41\x56\x5a\x51\xca\x9c\x97\x32\x5b\xc6\x83\xb9\xb3\xea\x2c\x84\xbc\x97\xed\x29\x1d\xbf\x3a\xb9\x80\x2a\x81\xa2\x44\xe0\x12\x48\x2b\x83\xef\xe1\xb5\xa6\xc2\xfd\x82\xba\x08\x4f\xd8\xa1\x5a\xe2\x97\xb8\xc1\xa5\x61\x99\x34\x56\xc0\x11\x4c\x3a\xa4\x0f\xa6\xef\x3c\x99\xc0\xff\x76\xdc\x5b\x96\x4e\xc9\x0c\xd9\x72\xc9\x4a\xfa\x2a\xaa\xa1\x72\x9a\x45\xd4\xa4\x77\xff\xac\xfa\xc1\xd5\x49\x42\x8e\x88\x51\x3f\x38\x1e\x96\x1a\xc8\x8b\xfd\x01\xa5\x9a\x67\x31\x57\x75\x13\xfb\x7d\x6d\xcb\xbe\x96\xe5\xb8\x7e\x83\xf3\xae\x06\xe6\x20\x7d\xe9\xea\x39\x0c\xd4\xcd\xa9\x3e\xfd\xbc\x39\x45\x12\x41\xc7\x0d\x7a\x4f\xcf\xfd\x0e\x20\xed\x26\x6f\x75\x75\x2d\xea\x9c\xa4\x11\x7b\xc2\xbe\x66\xef\xd8\xd7\x60\x5e\xfd\xa5\x6f\xef\xab\xbe\x86\xcf\x10\x29\x46\xce\xaa\x3f\x3d\x1f\x88\xe2\x3f\x3a\xe9\xe4\x46\x74\x54\xb5\x9a\x4d\x25\xa9\xf3\xe2\x9d\x15\xa5\x93\xa3\xb4\x12\x1b\xed\x1a\xe6\x26\xf8\x09\xd9\x0c\xc3\x0d\xa7\xb3\x66\x5a\xd3\xfd\x18\xcd\xfd\xfc\x3b\x6d\xec\x19\x49\xa1\x66\x0b\x9c\x7a\xb4\x9c\xdb\x64\xd1\x14\x63\x4e\x51\x33\xb6\xde\x60\x86\xa5\x1a\xb2\xac\x30\x81\x79\x21\x7b\x24\x4f\x3c\x1c\x36\xee\x17\x4f\x6f\xac\xe7\xfb\x56\xaa\xe5\x40\x01\xcb\x87\x14\xab\x08\x1b\xab\xd0\x29\xe9\x64\x6e\x5a\x69\x74\x66\xbc\x47\x29\x23\x5f\x4d\xf0\x32\x03\x2f\xb9\xfd\x94\x70\x85\x25\x24\x33\x51\x96\x98\x73\x3e\x5d\xfa\x64\xbd\xde\x8b\xd7\x6b\x27\x15\xa5\xb6\x3a\xd1\x3d\x1a\x9b\x35\x63\xdc\x34\x1c\x10\x01\xf3\x7c\xbd\x9b\xfc\xcd\xf1\xf9\x88\x5d\x1e\x9d\x43\xbf\xa7\x8b\xa3\xcb\xf3\xa6\xa5\xb2\x73\x79\x74\xbe\xb3\x51\x52\x30\xaf\x59\x81\x63\xba\xc3\x20\x0d\xc7\x93\x53\xdb\xc6\x39\x2f\xc6\x57\x62\xd9\xf1\x4c\x1d\xe2\x5c\x1f\x87\x15\x1e\xe4\x85\x90\xcc\x39\x2f\xee\x3d\x5a\x29\x78\x2a\x3f\x51\x1d\x97\x4f\x83\x0d\xcf\x5c\x5f\xd0\x95\xeb\x6b\x91\xa2\x3a\xec\x7f\x21\x54\x5a\x68\xe9\xf4\xc5\x6d\x95\xd7\xfd\x7f\xbd\xad\xf2\xba\xf3\xb5\xad\xf2\xda\x56\x79\xad\x5e\x0f\x26\x91\x75\x5b\xe5\xf5\x79\xc5\xed\xb7\x55\x5e\xbf\xf9\xe0\xff\xb6\xca\x6b\xfd\xb5\xad\xf2\xda\x56\x79\xdd\xed\xda\x56\x79\xdd\xff\x7a\x70\x69\x4b\xdb\x2a\xaf\x7b\x5d\xdb\x2a\xaf\xd5\x6b\x5b\xe5\x75\xcb\xb5\xad\xf2\xba\xe5\xda\x56\x79\x6d\xab\xbc\xb6\x55\x5e\xdb\xe4\xd7\x0f\x8e\xf5\x30\x93\x5f\xd9\xb6\xca\x8b\xae\x6d\x95\xd7\x67\x91\xe2\xc7\xb6\x55\x5e\x77\xba\xb6\x55\x5e\xdb\x2a\xaf\x2e\xd7\xb6\xca\xeb\x73\x71\x97\x6c\xab\xbc\xb6\x55\x5e\xbf\x1d\x45\x77\x5b\xe5\xb5\xad\xf2\xda\x56\x79\x6d\xab\xbc\xde\x3b\x8b\x6d\x95\xd7\xe7\x60\x02\xfa\x5e\xc0\xfd\xab\x96\x76\x8f\x74\x5e\x54\x56\xb0\xd7\x7e\xc8\xa0\x45\xa2\x60\x90\x26\xd6\x08\xfa\x27\x11\x26\x5a\xcd\xe4\x9c\x24\xfb\x01\x36\xe0\x1d\x87\xf7\x19\x47\x4d\x6f\x1f\x61\x06\x61\x26\x73\xd9\xad\x94\x8c\xad\x2c\xcc\x0b\x18\x2b\x8a\xcb\xb8\x9d\x94\xf3\x77\xb0\x45\x78\xae\x2b\x6c\x5a\x9c\xd0\xfa\x05\x12\x62\xf4\xea\xc1\xad\x0c\x1b\xc6\xc4\xa9\x6b\xe2\xce\x87\x48\x2b\xe1\xd6\x8a\x52\x3d\x63\xff\xbd\xf7\xf6\x8b\x5f\xc7\xfb\xdf\xec\xed\xfd\xf4\x64\xfc\xd7\x9f\xbf\xd8\x7b\x3b\x81\x7f\xfc\x61\xff\x9b\xfd\x5f\xfd\x1f\x5f\xec\xef\xef\xed\xfd\xf4\xfd\xcb\x6f\x2f\xcf\x4f\x7e\x96\xfb\xbf\xfe\xa4\xaa\xfc\x0a\xff\xfa\x75\xef\x27\x71\xf2\xf3\x1d\x07\xd9\xdf\xff\xe6\xf7\x9d\xa7\xdc\x5b\x25\x1e\x4e\x21\x1e\x48\x1d\xfe\x28\xca\x30\x05\x74\x07\xda\x8b\x94\x8c\xb2\xb2\x1b\xe9\xc0\x7a\xdf\x6e\xf4\xd2\x14\xd4\xbc\x30\x8e\x34\x4c\xe7\xd2\x3a\xe5\xd0\xe9\x83\x3c\x4e\x68\x95\xb6\x61\x94\x92\x1c\x80\x94\x6e\x6e\xb1\xc5\x7a\x48\x06\x8d\x92\x58\xb4\xd7\xfc\xa8\x07\xbd\xcc\x8b\x0c\x5a\x9b\xc3\x7e\x1e\xfb\x5c\x16\x38\x5c\xb7\xb2\xe1\xc3\xd7\x56\x36\x7c\x8e\xb2\xc1\x88\xa4\x2a\xa5\x5d\x1e\x69\x65\xc5\xbb\x4e\x1e\x96\xa6\x68\xb8\x68\x0e\x48\x39\x63\x54\xc7\x4d\xdf\x31\x5d\x60\xe6\x77\xab\xa0\x7e\xa1\xab\x2c\x85\x72\x8e\x4a\x81\x81\x89\x75\x7a\xc2\xa2\xf5\x07\x76\x0f\x24\x73\xb7\x1f\xe2\xed\x39\x34\x33\x7f\xa9\xe4\x35\xcf\x9c\xb5\x5b\xff\xe2\x1c\x2c\x98\xf8\x47\x77\xdd\xf3\x96\x9b\xab\x7a\xc3\x8b\xb1\xd3\xa1\xc3\x9c\x0f\xfc\x2b\xc1\x47\xe2\x9d\x7d\x8c\x5a\x1a\x28\x48\xe7\xa5\xbc\x96\x99\x98\x8b\x13\x93\xf0\x0c\xe4\xda\x30\x67\xc5\xe1\x2d\xa3\xc3\xc2\x97\x3a\x33\xec\x66\x21\x9c\xac\x66\xdc\xbb\x00\xa0\xc6\x6e\xce\xa5\x62\xb9\x5b\xa2\xc2\xff\xd8\xa0\x2f\xc1\x89\xff\x82\x97\x6e\x81\x83\xcf\x00\x4c\xe4\xa9\xd6\x19\xd5\x3c\x64\xcb\x7a\x7c\xaa\xfe\x51\xfa\x9f\x4a\xdc\xfc\xd3\x8d\x66\xd8\x2c\xe3\xf3\xe0\x2a\x30\xc2\xae\x78\xfb\xea\xa1\x6f\x7d\x01\x28\x28\xa8\x04\xe3\xd9\x0d\x5f\x9a\xda\x71\x12\x21\x3f\x98\x67\xec\xe9\x3e\xb0\x33\x37\x2c\x8c\x91\xb2\x2f\xf7\x21\xfc\x77\x74\x78\xfe\xcf\x8b\x7f\x5c\xfc\xf3\xf0\xf8\xe5\xe9\x19\x3b\xd3\x56\xe0\xa1\x16\x35\x08\x4c\x82\x85\xe1\x66\x09\xcf\x00\x2b\x5d\x9b\x09\xf8\x2e\xa5\x61\x37\x52\xa5\xfa\xc6\x74\xf6\xd1\x22\xfb\x39\xe2\x09\xae\x3a\x8d\x91\xf0\x82\x43\xdf\xc3\x1e\x27\xcc\x4a\x86\x49\x3c\x28\x9c\xe1\x69\x7a\x90\x96\xba\x40\x22\x78\x27\x57\x7d\xd4\x36\xcd\xe8\x38\x87\x15\xd6\x77\xd6\x1c\x70\x5e\x72\x65\x6b\x6f\x4f\xbd\x66\xd4\x70\x71\xd2\x7b\x39\x1e\x77\x4d\x13\x4f\x87\xab\x67\x3a\x4c\x53\x91\x36\xc8\xff\xd9\x65\x0e\x1e\xf9\x97\x5b\xd6\x38\x15\xec\xfc\xd5\xc5\xe9\xff\xdb\xe2\xe3\x65\xd1\x2f\x51\x6a\x98\xda\xd8\x52\x17\x83\xad\xee\x6b\xaa\xbd\xdc\xae\xef\x83\x58\xdf\x70\x5a\x0e\x13\x9e\x7f\x5d\xa9\x26\x94\x51\x3d\x3e\xcb\x75\x2a\x26\xec\x3c\xc4\x09\x9a\xdf\x46\x10\x07\xbc\x14\xcc\xdd\xa2\xac\xe4\x59\xb6\x8c\x55\x34\xab\xb1\x0e\xb1\x81\xce\x10\x0b\xf2\x19\xcf\xcc\xa6\xa5\x71\x9f\xb3\xd1\xe9\x11\x2f\x9d\x3d\x3c\xc8\x72\x84\xd1\x58\x2a\x94\xb6\xa4\x58\xbb\x59\x02\xe2\x45\xa9\x13\x86\xc6\x77\x94\x8c\xd5\x38\xdf\x0c\xc6\x2a\xfc\xd1\x28\x8d\x27\xf6\x79\x18\x19\x1d\xd5\x95\x11\x6d\x05\xdd\xf7\x22\x0e\xe6\xb8\x1b\xbd\x14\x3c\xd5\x2a\x5b\x42\xe6\x25\xe6\x52\xe4\xdc\x5c\x89\x14\x3f\x20\xd5\x2c\x44\x2a\xdc\x88\xe1\x51\x97\x6e\xde\x3e\x2c\x01\x2a\x19\x66\x78\x40\x38\x43\xa4\x1b\x5e\xf5\x1e\x9b\xd0\x11\xe5\x95\xca\x96\xaf\xb5\xb6\xcf\x43\x21\xed\x20\x1c\xf0\x23\x69\xcb\x4d\x57\x34\xa8\x93\x1c\x9e\x3b\x86\xd5\x80\x4d\x15\xd7\xf0\x1e\xd7\x2b\xfe\xd8\xb7\x54\x59\xa9\x43\xf3\x6d\xa9\xab\xce\x87\xd8\x8a\xb2\xf9\xed\xe9\x31\x88\xa2\x8a\x42\x95\xca\x96\x4b\x00\x0f\x58\xc5\x7d\x0b\x86\xc1\x1b\x0a\xb6\xc6\x7b\xa2\x8e\x8b\xb1\x97\x7c\xc9\x78\x66\xb4\xa7\xa5\x54\x6b\xad\x50\x32\x71\xdd\xd7\x53\x6d\x17\x2b\xb6\xad\xdb\x50\xab\xbf\x1b\x45\x91\xcb\x1a\x88\x4e\xaa\x95\x9f\x5b\x7e\x25\x0c\x2b\x4a\x91\x88\x54\xa8\x64\xd3\xcb\xbe\xe9\x80\x1f\xb0\xce\x99\x56\x6e\x63\x0e\xc2\x3c\xa7\x21\xd2\x4b\x24\x8d\x59\x05\x62\xc6\x64\xfd\x71\x88\x1c\xc3\xb6\xac\x8c\x28\x31\xcc\x5d\x56\x02\x57\xf2\xfb\x6a\x2a\x32\x47\x79\x67\x92\x52\xb7\x78\x74\x67\xc8\x9c\xcf\x05\xe3\x36\x70\x9a\xd5\x4c\x28\xe3\x24\x26\x3a\x40\x2d\x4b\xb5\xa8\xeb\xef\xb9\x61\x6f\x4e\x8f\xd9\x13\xb6\xe7\x9e\xb5\x0f\xfc\x03\xcd\xe4\xad\xc6\x24\xb7\xb6\x8d\x3a\xf3\x43\xc0\x94\x80\x79\x99\x2e\x51\x48\x8c\x98\xd2\xcc\x54\xc9\x22\xee\x60\xef\xcd\x66\x4a\x84\x84\xd0\xca\xc3\xe4\xf5\xcd\x4a\xa8\x37\x46\x94\x83\x09\xa8\x37\x1d\x04\x54\xac\x46\x39\x9e\x6b\x52\x0f\x19\x2b\x17\x96\xa7\xdc\x72\x12\x5c\xfe\x86\x07\xbb\xa4\xbf\x6d\xf1\x65\xc4\x0b\xa9\xaa\x77\x98\x78\x34\x9c\xab\xe5\xe2\x04\x86\x65\x89\xa7\x3a\xac\x3a\x2f\x8a\x4c\x22\xde\x46\x2b\x11\xee\xb4\xc1\x2b\xa3\x5b\xd4\x44\x90\x13\x3c\xcb\xb4\x93\x8f\x4e\x39\xe1\x2a\xd5\xf9\xca\xc3\x9c\x12\x29\x1a\x88\xa9\x13\xb6\xe5\xbe\xe6\xf5\x40\x9c\x42\x99\xb8\x16\x3d\xd0\xc5\xda\x08\xb1\x6e\x34\x47\x1c\xcf\x11\x30\x3c\xcb\xf8\x54\x64\x48\x63\xe4\x40\xb3\xca\x81\x9b\xce\x46\x2d\x75\x36\x5c\xf9\xcc\x6b\x9d\x09\x4c\xef\xf2\x84\x70\xc3\x3f\x0a\x3a\xc0\x20\x43\xd1\x01\xac\xc1\x06\x1d\xc0\xae\x7d\x0c\x74\xa8\x7a\x1c\xf5\xac\x4d\x07\xa7\x37\x34\xe9\x00\x87\xf7\x43\xa7\x83\x11\x49\xa2\xf3\xe2\xbc\xd4\xce\xec\x1c\xec\x6c\xa2\x61\xeb\x98\x21\x3a\x36\xd6\x24\x63\xc1\x59\xd0\xbc\x99\x97\x51\x62\x27\xb7\x78\x48\xf8\xec\xce\xff\x11\x9d\x59\x20\x7a\xda\x07\x99\x1f\xa5\x11\x5e\x74\xbf\xa4\x2f\x1e\xf3\x71\x30\x44\x6d\x44\x0f\x67\xe7\x20\xa7\x91\x4e\x78\x06\xe8\xb1\xfd\x58\x8e\xb5\xd9\xae\x3d\x70\x94\xce\x0b\x31\x4a\xf8\xcc\x27\x90\x00\x90\x28\x7c\x42\x2e\x4c\xa5\x53\x11\xc5\xb2\x31\x0f\xf9\x12\xd3\x3e\xe1\x3e\x9f\x49\xec\xf4\x0a\x1f\x56\x4e\x1b\xbf\xb6\x9a\x30\xd0\x5e\x06\x4c\x5a\x37\x41\xa1\x52\xa9\xe6\xe0\x57\x1b\xb1\x52\x64\x98\x83\x4c\x42\xe0\x0a\x2d\xc8\x5d\xd8\x12\x7e\x50\xbf\x1f\xfc\xa3\x41\x17\x93\x5a\xd1\xc8\xe0\x29\xf2\x1a\xd6\x0c\xc5\xad\x34\x6c\xe7\x85\x27\x40\x0f\x10\xcf\x87\x78\xc2\xec\xe0\x1b\x86\xd5\x44\x4f\xe7\x95\x54\x29\xa5\xeb\x36\x88\x15\xe0\xd6\x51\x0f\x86\x44\x70\x99\xc6\xb2\xe5\x19\x7b\xab\x58\x20\x16\x1b\x77\x66\x8f\xd7\xa8\x32\x7b\x1f\xdd\xf8\xfd\x8e\xd7\xf0\x90\xf6\x30\x6f\x14\xac\xbd\x7b\xee\xd8\x59\xee\xab\xf7\xf9\x77\xd9\x28\x74\x0f\x49\xbf\xa1\xad\x98\x1f\x71\x58\xaf\xd2\x27\x8e\xad\xad\x54\x73\x13\x5b\x32\x3c\xcb\x1a\xce\xf0\x75\xa6\x8c\x5f\xe1\x00\xae\xbf\x6a\x42\xb4\xca\x0c\x1e\x8b\x19\x92\x39\x75\xe2\x91\x1b\x21\xf3\xdc\xf0\xa3\xd2\x51\xc2\x4a\x9e\x5d\x14\xdd\x41\x4a\xd9\x0a\x20\xde\xcb\x8b\xc3\xe6\xd0\x70\x58\x43\xef\x07\xb7\x56\xee\x7b\xc6\xd3\x5c\x1a\x03\x8e\x30\x31\x5d\x68\x7d\xc5\xf6\xd6\xe0\x71\x45\x79\x5a\x46\xce\xcd\x01\xf1\xfc\xd8\xcd\x7e\x9f\x49\x95\x85\xac\x28\xb0\x83\x95\x35\xde\x91\x03\x0f\x49\xc2\x2c\x60\x0d\x09\xb9\x9a\x92\x15\x56\xa7\x89\x58\xd5\x8e\x0b\x36\x2e\xb0\x57\x97\xe7\xac\x27\xec\xca\x07\x96\xe8\x8c\x78\xbb\x8d\xac\xb6\x96\x8e\xa8\x3d\x6e\x9c\x48\xa4\x5c\x24\xc2\x0c\x07\xe8\xf4\x5d\x3d\x26\x4b\x05\x56\xf1\x08\xc8\x7e\xe2\xb7\x26\xd9\x81\x5f\x7a\x17\x8a\x41\xe9\xa7\xbb\xb1\x46\x7d\x59\x0b\x17\x67\x8f\x64\xc5\x82\x8f\xd1\x48\x77\x12\x0d\x44\xa0\x57\x21\x16\x5a\x69\x2a\x92\x70\x87\xa8\x56\xc0\xd2\x20\xa2\x30\x9a\x07\x6b\x42\x22\x3a\x9a\xea\x51\x1d\x25\x8e\x03\x81\x50\x4c\x86\xf8\x11\xf5\x1c\x6e\xa4\x5d\xf8\x5e\x2f\x8d\xa8\x21\xcc\xa4\x14\x06\x02\x30\x8a\x89\xb2\xd4\x25\x25\x64\x79\xbf\x35\x8c\x04\x92\x1c\x32\xba\x1c\x93\x70\xf7\xd7\xae\x89\x03\xd5\x35\x18\x3c\xe4\x2b\x3a\x6e\x12\xb3\x99\x48\x40\xd1\x8a\x09\x8c\x52\x7b\xaf\x86\xbe\xa5\x2a\x03\xc7\x60\x04\x26\x9f\xcb\x77\xee\x29\xf1\xaf\xe2\x90\x38\x41\xce\xae\xff\x7a\x7f\xc2\xd8\xa9\x0a\x19\xbc\x23\xb7\x8a\xf1\x9d\x3e\xf5\xcc\xba\x57\x8c\x3b\x11\xc0\x0b\xc4\x8e\x33\xa7\x1d\x96\xd5\x00\x1c\xdf\xc7\x1d\xce\x62\x97\xf8\xa0\xe2\x00\x5c\xe3\x34\xa8\x5b\x7a\xaf\x03\xf4\x71\x95\xbb\x5b\x3e\x96\xbb\xfc\x71\x04\x40\x58\x5f\x39\x47\x68\x0a\x03\xc1\xc3\x5f\x44\xa3\x45\xda\x7b\x08\xb8\x9d\xeb\x14\xd1\x54\x02\x1a\x04\x74\x75\x02\x74\x17\xf9\x1f\xaf\x9f\xd5\x3a\x9e\xd2\x58\x1d\x10\xc3\xac\x10\xa8\x76\xca\x9c\xaa\x9d\x79\xdf\x42\x5e\x64\x02\xaa\x38\xa3\x91\xeb\x02\xd5\x08\x4f\x7e\x14\x26\x52\x43\xd2\x13\xb8\xcb\x88\xfd\x1b\x36\x65\x48\x44\xf5\xb8\x13\xe7\xe1\xe7\x68\x21\x4a\xe3\x9b\x4b\x40\x85\xa5\xd5\xde\x75\xc1\x52\x39\x9b\x09\x9f\xf0\xea\x2c\x47\x5e\xf2\xdc\x89\x78\xc3\x88\x04\x53\x31\x97\x98\x10\x19\x04\xdb\xae\x53\xf7\xa8\xd6\x6f\x84\xc2\x50\x5a\x96\xcb\xf9\x02\x19\x85\x71\xa8\xd0\x65\x3e\xa8\x98\x69\x9e\x32\xe0\x6d\x5d\xb2\x1b\x5e\xe6\xee\xdc\xe0\xc9\x02\x22\x94\x5c\xb1\xb4\x2a\x01\x67\xd9\x0a\x9e\x2e\xc7\xc6\x72\xeb\x34\x65\x51\x92\x41\xe9\xe7\xbf\x05\xd5\x7f\xef\xb5\x05\xd5\xbf\xe3\xb5\x05\xd5\xdf\x82\xea\xaf\x5e\x0f\x26\x3b\x74\x0b\xaa\xff\x79\xc1\x24\x6d\x41\xf5\x37\x1f\x4f\xd8\x82\xea\x6f\x41\xf5\xdf\x77\x6d\x41\xf5\x3f\x70\x6d\x41\xf5\x3b\x5c\x9f\x81\xe4\xda\x82\xea\x77\xb8\xb6\xa0\xfa\xeb\xaf\x2d\xa8\xfe\xea\xb5\x05\xd5\xbf\xf5\xda\x82\xea\x77\xbe\xb6\xa0\xfa\x5b\x50\xfd\x2d\xd6\xe8\xfd\xc6\x7a\x98\x58\xa3\x6c\x0b\xaa\x4f\xd7\x16\x54\xff\xb3\x40\x54\x64\x5b\x50\xfd\x3b\x5d\x5b\x50\xfd\x2d\xa8\x7e\x97\x6b\x0b\xaa\xff\xb9\xb8\x4b\xb6\xa0\xfa\x5b\x50\xfd\xdf\x8e\xa2\xbb\x05\xd5\xdf\x82\xea\x6f\x41\xf5\xb7\xa0\xfa\xef\x9d\xc5\x16\x54\xff\x73\x30\x01\x8d\x4d\x65\x27\x0c\xd0\xbb\xc0\x15\x51\x1a\x7a\x84\x0e\x30\xad\x66\x33\x51\x82\xe4\x82\x27\xaf\xa4\x4f\xd5\xc8\x8c\xed\x20\xab\xb0\x23\x40\x3e\xa2\x8a\x9d\x5b\x7e\x4e\x70\x04\x80\xd5\x59\xe7\x8a\x9f\xbc\x7a\xbe\x06\x1b\xa9\x73\x5e\x61\xd7\x2c\x69\x98\xf3\x2b\xd5\x2d\x3e\x7e\x0b\xc1\xd7\x55\x90\x11\xdd\x93\x4c\x1b\xca\x71\x07\x62\x25\x0b\xae\x94\xf0\xf6\x9e\xb4\xe0\x47\x99\x0a\xa1\x98\x2e\x04\x45\xa7\x39\x33\x52\xcd\x33\xc1\xb8\xb5\x3c\x59\x4c\xdc\x93\x94\x27\x76\x9d\x8f\x4e\x9f\x18\x5b\x0a\x9e\xfb\xcc\xfc\x9c\x4b\x1c\x8a\xf1\xa4\xd4\xc6\xb0\xbc\xca\xac\x2c\xc2\x60\xcc\x08\x28\xa9\xc1\x83\x2a\x10\x03\xf2\xe2\xea\x24\xf6\x51\xfd\x34\x9a\x96\x8e\xc1\xe9\xc0\xda\x1c\x01\x22\x78\x5e\xd8\x65\xc8\xe4\x15\x6c\x26\x4b\x63\x59\x92\x49\x38\xad\xe1\x89\x58\x3d\x0d\xe3\x8d\xfc\x59\xad\x68\xa6\x86\xa6\xaa\x52\x50\x5b\x0b\x6b\x30\x2f\xb6\x1e\x90\x86\x4a\xa5\x21\x35\xdf\x8c\x18\xf7\xc8\x69\x48\x68\x3f\x53\x20\xb5\x3f\x59\x70\x74\xfa\x28\x1a\x2e\x42\x8c\xad\x13\x87\x6b\x46\x87\x22\x07\xcf\x9c\xa3\x46\x3d\x47\xad\x50\x40\x9e\xde\xca\x36\x80\x05\x50\xe2\xda\xf1\x80\x48\x84\x3b\x5f\xf9\x2d\x5c\xff\xc9\x99\x3e\x3a\x14\x5f\x0a\x63\xf8\x5c\x9c\x77\x0c\x34\xdc\x66\x91\x41\xac\xa1\x5e\x18\x60\x85\x0c\xeb\x6b\xc3\x27\x75\x7e\x66\x53\x0d\x62\x39\xce\x29\x28\x3f\x37\xa5\xb4\x56\xc0\xa2\x02\xc6\x1e\xc4\x2a\xdb\x25\xf8\xbb\xad\x2c\xcf\x97\x7e\x90\xfa\xc7\x4e\xa8\xab\x14\x73\x2e\xa7\x82\x4d\x4b\x29\x66\x6c\x26\x21\x91\x13\x52\x2b\x47\x08\xb9\xc4\xd1\x0b\x60\x8c\xb3\x77\xb5\xf2\xba\xac\x9f\xd7\x84\xfd\x48\x13\xb3\x65\xa5\x12\x1e\xa1\xd9\x42\x8d\xa9\x9c\xb1\x39\xa4\x66\x92\xb6\xf8\xa7\x27\x7f\xfd\x0b\x9b\x2e\xdd\x91\x06\x9a\x95\xd5\x96\x67\xe1\x25\x33\xa1\xe6\x8e\x56\xb8\x3d\x9b\x55\x92\x81\x02\xd0\xcf\x03\x27\xfe\xf4\xcb\xab\x69\xf3\x8c\x3d\x48\xc5\xf5\x41\x44\xbf\x71\xa6\xe7\xeb\x3a\xa4\x74\x4f\xda\xee\x68\x12\xad\x61\x33\x9d\xc9\x64\xd9\x9b\xd1\x3c\xf6\x17\x5b\xe8\x1b\xd4\xf5\xd7\x70\x4f\x5d\x70\x55\xe8\xa2\xca\xd0\xe9\xfc\x3c\xd4\x17\x57\x46\xac\x56\x01\xae\xdd\x17\xe0\x26\xa5\x21\xda\xc8\xe9\x98\x91\xeb\x1f\xa9\xa9\xba\x84\x1c\x79\x01\x02\x0c\x0c\xa1\xe7\x3c\xcb\xa6\x3c\xb9\xba\xd4\x2f\xf4\xdc\xbc\x52\x27\x65\xa9\xcb\xe6\x5c\x32\xee\xa4\xe5\xa2\x52\x57\xd8\xc3\x21\x80\x24\xe8\xb9\x53\xad\x8a\xca\xfa\x52\x86\x75\x2f\x8c\x15\xf3\x5e\x08\x7b\x33\xa8\x1e\x45\xbc\x93\xb5\xad\x43\xc5\x5a\xc8\x91\xf1\xf8\x26\x66\xb6\x2f\x9f\xfc\xe9\x2b\x64\x5d\xa6\x4b\xf6\xd5\x13\xc8\xda\x36\x23\xdc\xc4\x20\xdb\xdc\x41\x91\xf3\x2c\x73\x66\x43\xcc\x94\x8e\xd0\xeb\x98\xf0\x93\xf3\xa0\xed\xcf\x6e\x77\x56\xa5\x2e\x2f\xff\x01\x7a\x94\xb4\x46\x64\xb3\x11\xd6\x25\x05\xb3\x66\x17\x0e\x86\x5d\x92\x3e\x50\x1c\xf6\x00\x14\xa0\x6b\x9d\x55\xb9\x38\x16\xd7\x72\x88\x36\x4e\x8d\xd1\xbc\xa9\x9f\x49\x03\x25\x60\xd3\x4c\x27\x57\x2c\xa5\x2f\xa3\xcc\x93\x36\x16\x78\x77\x2a\x74\xcd\xc1\xe9\x91\x7b\x73\xeb\xfb\x37\xb2\x6e\x72\x5e\x14\xa1\x4a\xa8\xe4\x37\x0d\x62\xc0\x9e\x04\xc0\x82\x9e\x88\x32\xbd\xdd\xcc\x7d\x9d\xcc\x63\x7a\x23\x27\x37\x3b\x0f\xd1\x39\xeb\xa4\xbf\x8f\xba\x9e\x7d\x77\xc7\x64\x83\x21\xea\x01\xfd\x6e\x28\xe0\xdf\x58\x57\xb2\x52\x17\x19\x4a\xeb\x02\x63\xa0\x02\xe0\xd8\x07\x44\x72\x77\x87\xeb\x00\xde\xcd\x7e\x29\x47\x0d\xba\xa8\xe0\x55\xce\xb9\x25\x85\xd0\xbb\xaf\x39\x2b\x44\x69\xa4\x71\xe7\xf2\x0f\xb0\xa1\x8e\x32\x2e\xf3\xc8\x05\xb8\x19\x22\xe0\xe6\x06\x00\xe5\xfe\x92\xf2\x5c\xa7\x34\x20\x88\x42\x04\x8f\x5e\xa3\xd6\x36\xb5\xda\x01\x0f\xd4\x4d\x8b\xca\x1f\x6a\x6a\x36\x25\xa5\xfb\x24\x88\x4a\xbc\xeb\x73\x12\x90\xf0\x7e\x8f\x55\x3e\x86\xc9\x0f\x24\x06\x40\x30\xd2\xe2\x36\x25\x61\xc3\x78\xc4\x8d\x12\xa9\xf4\x64\x07\x4e\x18\x46\xc1\xdd\x9e\xa0\x9f\xb2\xdd\x67\xbb\x1b\x15\x92\x48\xa2\x52\x17\x7c\xde\xab\x9b\x4f\x8b\x52\xed\x61\x63\xa8\x09\x67\x06\xc1\xf7\x01\x78\x0d\xee\x12\x69\x8d\xa4\x03\x38\x49\x18\x1d\xf5\x04\x26\x03\x01\x2b\xb2\x6f\xf8\x92\xf1\x52\x57\x2a\x25\xff\x52\x70\xf0\xbd\x6c\x3d\xf8\x4c\x2b\xe1\x1d\xe7\x6d\xa4\x0a\xf0\xe8\x4b\xc5\x9e\x4e\x9e\x3e\xf9\x5c\x4e\x2a\x78\xc3\xd6\x49\x75\x16\x4e\x2a\x94\x4f\x1b\x7d\x57\x8f\x79\x3f\xd0\xfb\xbe\x24\x17\x4b\x0d\x69\x2f\x3d\x60\x36\x7c\x74\x53\x4a\x2b\xa2\x2e\x7f\x7b\x60\xb8\x38\xfb\x30\xc2\x65\xd8\x5f\xd7\x4b\xa2\x27\x91\xfa\x01\x61\x98\x6a\xfa\x11\xe5\x16\x09\x28\xd8\x6e\xeb\x3c\x5c\xe6\x3d\x22\x2c\x26\xd4\xce\x0e\xdb\xc3\x3b\x77\xb1\xa4\x79\x7f\xa3\xac\x45\x44\x3b\x79\x57\xf4\x40\xd9\x6c\x55\xcf\x17\x1c\x7c\x70\xc5\x80\x14\xfc\xbb\x58\xf0\x6b\x01\xa5\xdc\x32\xe3\x65\x06\x31\xc7\x0b\x9c\x3b\x9b\x56\x96\x09\x75\x2d\x4b\xad\x72\xa1\x2c\xbb\xe6\xa5\x04\x5c\x9c\x52\x00\xb6\x83\xb3\x45\x7f\xbf\xf7\xc3\xe1\x6b\x48\x68\xd8\x27\x50\x0a\x9a\x65\x65\x3c\x80\x4d\x3c\x93\x68\xb8\x0f\x2e\x9f\x9f\x87\xa3\x21\xc8\x5c\x3f\x2f\xf7\x9c\xbc\xb2\x15\x36\x66\x79\x97\x64\x95\x91\xd7\x9b\x92\x24\x54\x63\x7f\x2c\x3b\xad\x73\xab\xde\xbf\x26\xd4\x4a\xe9\x3e\xb8\xd6\xd7\x14\xe8\xad\x04\x4c\x76\x4d\x28\xda\x8b\x63\xe0\xe4\x7a\x22\x34\x0d\x4c\x9f\xf3\x98\x8b\x2b\x2a\x04\x20\xc7\x6c\xd6\x09\xa5\x74\x2a\xee\x8f\xbb\xd3\x4c\xef\xa1\x21\x30\x66\x1e\x55\xf0\x99\x64\x21\xd2\x0a\x00\x9e\xa4\x41\x78\x54\x67\x3e\xf0\x1a\x87\x4f\x41\x9f\xa0\xd3\x59\x00\x35\x50\x63\x70\x0e\x22\xcd\xfd\xef\x4b\x0f\x81\xe0\x3f\x30\xad\x11\xc1\x28\x75\x63\x8d\x18\x37\xa6\xca\x71\x4b\x60\x0b\x84\x99\xb4\x26\x74\x99\xf5\xda\xb1\xdb\x18\xf7\x2c\xa8\xea\x41\xdf\x0b\x91\x01\x73\xf5\xa0\xf1\xee\x59\x34\x0e\x12\xda\xf8\xbf\x88\xe1\x28\x61\x02\xa2\x6d\x21\x8f\x53\x83\x97\x74\x26\xa1\x8d\x12\x27\x7a\x5f\xac\xf9\x25\xaa\x0e\x78\x07\x00\xc4\xf0\xa9\xc8\x4c\x7b\xa0\x69\xbd\x28\x84\x4b\x4a\x84\xef\xd9\x27\x97\x1b\x23\xe7\x0a\x3a\x68\xba\xd1\xee\xd9\x2b\xb3\xb3\xcd\x34\x44\x1f\xdc\xce\x52\xad\x91\x85\x95\xf3\x62\x4c\x56\xaf\xd5\xb9\x4c\xee\x31\x92\xbe\xe7\x94\x5b\xb5\xd2\x8d\x1a\xdc\x57\x17\x2b\x1e\x1f\x13\x79\x35\x26\xec\x42\xe7\x94\xe2\xa4\xa2\x3e\x5e\xbe\x9d\xaa\x3b\x31\x4a\xe1\x68\x01\x89\x47\xb2\x8e\xc6\x43\xdf\x1b\x5f\x05\x0d\xcf\x09\x2a\x39\x85\x71\x01\x80\x92\xda\xb9\xea\x2c\xd3\x37\x90\x58\x8c\xe3\x7a\xde\x86\x14\x98\x67\x6c\xdc\xea\x4d\x3b\x69\xc2\x86\xbe\xff\x39\x74\xef\xe8\xc3\x4f\xc1\xfc\x1c\x00\xe4\x3b\x3d\x8e\xff\x3c\x3d\x3f\xf2\x7f\xb6\x67\xd2\x6c\xc3\x70\xfb\x5d\x31\x20\xf6\x6d\x77\xcd\xb0\x93\xd1\x07\xbe\x3e\x5a\x70\xe5\xe3\x56\xb7\x3e\x6f\x69\x12\x9b\xd5\xd3\x59\xf0\x52\x10\x60\x9c\x13\xdc\xa6\xe0\xc9\xad\xb3\x08\xe8\x6c\xef\xbd\xe1\xbd\x33\x35\x55\xe1\x3b\x6c\x67\x70\x63\x98\x49\xcd\x65\x3f\xfd\xe1\xe7\x3b\x12\xf3\x43\xbf\x59\x47\xda\xf7\xff\xa6\xd1\xa7\xef\x4e\xbf\x58\xdf\xc5\xeb\x6e\xbf\x8d\x1a\xe1\xdd\xe9\xfe\xdb\x9a\xf0\xde\xf5\x69\xbe\x79\xdb\xdd\x5e\xac\xbd\xda\x77\xb8\x1d\xd7\xfe\x2e\x68\x25\x6e\x4b\x9e\x02\xea\xe6\x6c\x79\xae\x53\xb7\x3b\x31\x49\xee\x7e\xd0\x06\x9d\xe5\x7d\x57\xdf\x58\x07\x8f\x56\x77\x4f\x56\x37\xcf\x40\x4b\x5b\xb8\x05\xf9\x94\x50\xd9\xd4\x9c\x35\xb0\xa6\xaa\xb2\x14\x0a\xba\xe4\x57\x90\x16\xe9\xbb\xdf\xa3\x44\x07\xc9\x4c\xb8\x9e\x08\x4e\xcf\x0e\xc3\xc1\x49\xe9\x72\x39\x07\xac\xcf\x08\xdb\x7a\x56\x41\xf6\x23\x9c\x13\x88\x5d\xa7\x95\x9b\xc7\xb3\x75\x70\x1a\xba\x10\x2a\x6a\x8d\x4f\x2a\xf6\xd8\x71\x60\x03\x60\x03\xb5\x86\x49\x9e\xfe\xae\xc8\xb8\x9d\xe9\x32\x1f\x7b\x5d\x72\xdc\xd0\x28\xd8\x11\xe4\xe1\x18\x6f\x8c\x61\x32\x2c\x62\x70\xaa\x34\x13\xd1\xd1\x1f\x5e\x55\xa5\x88\x58\xc5\x2a\x55\x8a\x44\xcf\x95\xfc\x4f\x4d\x08\x38\x04\x83\x27\x89\x1b\x77\xec\x32\x55\x65\xd9\xfd\x93\x16\x3a\x6a\x0c\xfa\x5a\x94\x0b\xc1\xef\xc9\xbc\xad\xfc\x17\x1a\xa3\x6e\x55\x6a\x08\x80\x80\xf4\x63\xff\x10\xa7\x47\xeb\x04\x0a\xe1\x30\x1e\xef\xb3\x9c\x39\x9c\xfe\x4e\x2d\xe4\x6c\x2e\xaf\x85\xf2\x08\xe5\x47\x19\x0f\xed\xb6\x3d\x28\x2b\xa1\xa4\x57\x56\x87\x0c\x07\xc6\x6d\x84\x93\x0c\x09\x51\x14\x5c\x8d\xc7\x89\x6e\xa1\x66\xdd\x99\x6f\x8c\x76\x97\x3b\x21\xc9\x00\x3b\x45\x8e\xea\x57\xca\xbd\x23\xb6\x01\xc4\xc9\x12\x48\x85\xf1\x76\x0b\xa5\xc0\x7c\xf8\x11\x94\xbf\xe6\x64\xd0\xba\x61\x48\xb7\x0e\x88\xb1\x35\x61\x33\x77\x78\x2c\x51\x23\x3a\x9d\x35\x9f\x24\x1b\x18\xfd\x50\x28\x05\xba\x7a\x6d\x3c\x9e\xeb\xd4\xa9\x6c\x23\x16\x96\x32\xee\x55\x4e\xc1\x19\xdc\x93\xd1\x66\x44\x8d\xae\x2c\x85\x29\x34\xb6\x0a\x88\x1f\x3b\x8a\x9c\x65\xd2\x36\x32\xf3\xb0\xe9\x5b\xd8\x1a\x08\xe6\xf6\x1f\x51\xea\xb5\x0a\xff\x5c\xda\xc9\xd5\x57\xa0\xed\x0b\xb5\xe0\x2a\x41\x43\xeb\xe0\x4a\x14\xe6\xc0\xc8\x39\x2a\xf7\x7f\xf9\xea\x2b\xd0\xf4\x3d\x49\x0e\x5e\x9f\x1c\x1e\xbf\x3c\x99\xe4\xe9\x1a\x67\xad\x47\x15\x86\xf4\x97\xef\x83\xc2\xcc\xae\x9f\x4e\x9e\x7e\x85\xf9\x79\xd2\x20\xd6\x70\x04\x34\x8c\xe5\xe2\xab\x28\xc3\xee\xd0\xf1\x74\xa3\xa3\xe7\x9e\x59\x47\x1b\xb5\x35\x0a\x6e\xad\x28\xd5\x33\xf6\xdf\x7b\x6f\xbf\xf8\x75\xbc\xff\xcd\xde\xde\x4f\x4f\xc6\x7f\xfd\xf9\x8b\xbd\xb7\x13\xf8\xc7\x1f\xf6\xbf\xd9\xff\xd5\xff\xf1\xc5\xfe\xfe\xde\xde\x4f\xdf\xbf\xfc\xf6\xf2\xfc\xe4\x67\xb9\xff\xeb\x4f\xaa\xca\xaf\xf0\xaf\x5f\xf7\x7e\x12\x27\x3f\xdf\x71\x90\xfd\xfd\x6f\x7e\x7f\xcf\x89\x76\xac\x9c\xe9\x5b\x2d\xd3\xab\x42\x66\xc0\xaa\x98\xa2\x14\x22\x07\x99\xdb\x25\x9f\xac\xe9\xc7\x6d\x0d\xe5\x4f\x75\xfa\xcb\x09\x62\xff\x34\x35\x77\xb2\xd9\xa0\xbc\xce\xf4\x0d\xe4\x80\x4a\xed\xf4\xb5\x09\x7b\x05\x87\x2f\x3b\x13\xd7\xa2\x1c\xf9\x51\x5f\xb8\x9b\xce\xc3\x3d\xb1\xa3\x70\xdd\x1d\x51\x0b\xd3\xdb\x36\xea\x88\xcd\xe3\x74\xc3\x33\xad\xce\xc3\xec\xc2\x30\xb4\xf3\xc6\xf7\x07\xa6\xeb\xb8\xbc\x9e\x0c\x3d\xd6\x01\xdb\xb4\xd0\x0b\x80\x7c\x9d\xb0\x1f\x78\x29\x75\x65\x48\x97\x8a\xd1\xcd\x31\x5f\x2e\x90\x08\x5c\x30\x14\xcd\x0a\x83\x84\x32\x38\x1f\xd0\x0a\xf4\x39\x0c\xe7\xcd\xd1\xfa\x23\x4d\x5a\xb7\xe8\xd7\xfe\x51\xa5\xcf\xeb\x5d\x01\x46\xc7\xc3\x6c\xed\xf9\xe5\x4f\x64\x13\x4f\x14\x86\xf1\xf3\x80\xb3\xc1\x69\x92\x38\xca\x42\xce\x7d\xf6\x38\xbc\x3f\xda\xea\xd1\xa7\x81\xd9\x3a\x2c\x69\x97\x1d\xdf\xb5\x88\xa1\x68\xbf\x5f\x0f\xb6\x68\xc2\x47\xc7\x08\xd4\xbe\x7c\xaa\xde\x82\x3b\xc8\x27\x70\x08\x8e\x93\x52\x5a\x99\xf0\x6c\x07\x8e\x30\xff\x55\x92\x55\x4e\xcf\x8d\xbf\x2d\x05\xb3\x37\x1a\x9f\xc2\x33\x76\x25\x96\x37\xba\x4c\xbd\x7e\xe1\x9f\x58\xaf\x85\xb1\xfe\x91\xce\x9a\x05\x59\x80\x3e\x95\x32\x17\x25\x9b\x0a\x1f\x2e\x68\xdd\xbc\x9c\xb0\x43\xb5\xa4\x58\xab\x8a\x2b\x2a\x23\x18\x3a\xd0\x71\x50\x0b\x6c\x30\x09\x9d\x87\xfe\x69\x1c\x6b\x5d\x6f\x73\xa5\x3b\x05\x32\xec\x02\xaf\xbd\x78\x5f\xba\x2e\xa9\xa4\x0b\x76\x47\x89\x05\x69\xda\x7f\xfd\x49\xa4\x85\xd3\xcf\xa4\x12\xc6\x7c\xeb\x96\xb2\x8f\xba\xdd\xe4\x0e\x0e\x6a\x15\x8d\x0d\x72\xb2\xce\x9f\x16\x6e\x4b\x61\x40\xdc\x49\x74\x9d\xd6\x77\x4e\xd8\x21\x7c\x00\x05\x00\x4e\x73\x84\x92\x41\x37\x98\xb4\xa6\xdd\x4b\x1f\xef\x38\x3c\x3b\xf6\x89\xda\xa8\x74\x98\x26\x3a\x3c\xaa\xfc\xcd\x99\x80\xa6\x4a\xe9\xc2\xe2\x97\x8a\x43\x5b\xe0\x9d\xcb\xb2\x12\x3b\xdd\x54\x3d\xec\x3b\x70\xf0\xe7\xaf\x9e\x80\xb6\x17\x9e\x07\x62\xff\x9e\xd5\x4f\x5d\x13\x82\x3a\xa5\x02\xb5\xb3\xa0\x5e\xc7\xfc\xe0\x09\xee\xed\x26\x8a\xd0\x41\x21\x33\x2c\x53\xa0\x79\x27\x3f\x72\xa7\xc4\x9f\xee\x29\x3f\xe3\x7a\xba\x97\xf7\x6f\xd9\xd6\x27\x5b\xa7\xf1\xdc\x21\x42\x7a\xf5\x68\xb8\x2a\x06\x97\x24\x3c\x27\x72\x63\x63\x67\x0f\xfa\x18\x72\x7f\x41\x70\x41\x08\x04\xc4\xe3\xb2\xe8\x91\xe7\xdc\x41\xde\x40\x59\x4f\x6f\x55\x71\xf7\x35\x0e\xc4\x8a\x5a\x37\x5c\x29\xd7\x08\xe1\x6c\xd0\x3b\x48\x2b\x3c\x84\xda\xb7\x11\x7b\xa5\x9e\x63\x31\xc0\x08\x15\xc5\x06\xd4\x0a\xde\x34\x68\x4d\xe4\xc1\xef\xe8\xdd\xc7\x38\xe5\x2e\x42\xe1\xfe\xe4\x8e\x2c\xdf\x9e\xa7\xff\xee\xeb\xd6\x58\x0d\xd6\x6b\x58\xf6\x74\x42\xca\xba\xd5\x1b\x89\x4f\x36\x2f\x75\x55\xf8\xb0\x71\xb3\x6f\x5b\xdd\xac\x04\xa3\x9d\xd8\xd6\x58\xe9\xe6\xd0\xc1\x79\x03\x0c\x2c\x6a\xaf\x5f\xca\x12\x34\xef\xfd\xa9\x8b\x25\x5f\xe8\x01\x29\x2b\xd5\x6c\xeb\x1e\x05\x5e\x77\x32\x31\xe7\xc9\x72\xa7\xf9\x9c\x75\x61\x6e\x74\xf8\xca\x1c\xf1\xe1\xf1\x79\x75\x01\x07\xd4\x79\x80\xfe\x80\x7b\x0d\x54\x83\xca\xd0\x14\xfd\x91\xef\x2b\x10\xd1\x33\x57\xf6\xf0\x2c\xfc\xf9\xab\x3f\x8f\xbd\xef\x10\xa7\xd2\xae\xe5\xa6\x9a\xec\xb5\xee\x84\x3f\x75\x72\x05\xdc\x9b\xff\x42\x54\x7b\x50\xd5\xb3\xb1\xc4\x4e\x9f\x92\xa6\x00\x76\x40\x7f\x48\x38\xfd\xc3\xd3\xdf\xa7\x9d\xad\x1f\xc4\xaf\x57\x3d\xc4\x27\x21\x57\x33\xe4\xd0\x67\xb7\xb6\x9b\xe2\x2c\x74\x96\xc2\xbe\x22\x27\x93\x7f\x14\xe3\xd6\x96\x72\x5a\x59\xf2\x0a\x27\x3a\xcf\x9b\xf5\xa4\xd4\x3e\x70\xc2\xea\x82\xc2\xd8\x78\x06\xc6\x9f\x30\x76\x21\x04\xb6\xce\x8c\xe6\x01\x62\xd9\x93\x92\x9c\xcb\x7a\x86\x7d\xce\xd1\x66\xfb\x44\x0e\xa9\xee\xa7\x37\x45\x1e\x7b\x06\x29\x76\x0e\x83\x51\x13\x07\x08\x51\x1e\xae\x74\x33\x6e\x1d\x64\x90\x6a\x5d\x47\xa4\x29\xf3\xca\xd1\xc2\x20\x7e\x2e\xf0\xf2\xf7\xd8\xf9\x14\xd2\x4a\x21\x4c\x8a\xae\xd8\x1b\x37\xc4\x42\x16\x68\x82\x73\x1b\x7e\x0e\x09\x0e\xee\xeb\x18\x96\x02\x5a\x79\x3e\x45\x1b\x58\xdf\x80\x13\xfc\xdb\xd3\xe3\xb0\x47\xdc\x5d\xcf\x2f\x30\x06\xf6\xe5\x84\x1a\x13\xdb\xb9\x4c\xd9\x14\x93\x5a\x9c\x78\xdd\x53\xe2\x06\xd3\xe4\xc9\x4f\x1c\xd4\xf0\x6b\x9f\x3e\x8e\xa3\x85\x87\xd3\x90\xfb\xec\x8f\xd4\x22\x56\x94\xde\x88\x9f\x4a\x4a\xa3\x7d\xf5\x7a\xd7\x7b\xe7\x6f\xc6\xe5\xcd\x78\x3c\x1e\x53\xec\x1b\x84\xfa\xa8\x41\x83\x20\xfb\x73\x9d\xca\xd9\xb2\x45\x09\xc7\xe6\xf5\x23\x80\x23\xb9\x5a\xd2\xec\xfa\x77\x33\xbe\x3f\x74\x79\x3f\x47\x60\x1f\xa8\x8a\x35\x71\xf5\xbe\xe1\xb8\x75\xa1\x7a\x34\xab\x4d\x8d\xf8\xae\x67\xc8\xa4\x50\x59\x70\xcb\xc2\x78\xa7\x11\x71\x0d\xe1\x18\xa2\x51\x2f\xde\x15\x1a\x51\x92\xa1\x72\x07\xfa\xd9\xb5\xa3\x31\xe0\x27\x77\xbb\x0a\x12\x10\x1b\xbb\x86\xf4\x0f\x0c\x00\x7a\x22\xb0\x29\x77\x43\x86\xe9\xec\xb5\xf8\x64\x7f\xc2\x4e\x89\xb5\xc0\x7e\x54\x9a\xba\xe2\x31\xad\x98\x28\x16\x22\x17\x25\xcf\x9a\x0f\xa2\x0a\xe6\x67\x4e\xdc\x96\x8e\x4b\x31\xe2\x91\xf3\x02\xa5\x2d\x08\xcf\x54\x96\xbe\xab\x6e\x14\x89\xdc\x79\xa5\x5e\x6b\x6d\x5f\x4a\x03\xaa\x0e\xf9\x4e\x50\x31\xdd\x59\x77\xa0\xf9\xef\xea\x74\xf0\xbe\x9c\xfc\xc9\xc2\x7d\xcc\x77\xc6\x1b\x42\xd6\x3a\x09\xe2\x84\xd6\x7d\x9b\xdf\xbd\x21\x80\xa3\x46\x8f\xe1\xda\x0b\xbc\xa6\xb5\xdd\x4a\x5f\xbb\x4f\xdc\xd8\x8e\x32\xd6\xb8\x6d\x20\x89\x7d\xea\x66\xec\x9b\x93\x5e\xc0\x32\x67\x1a\xf6\x49\x4f\xa6\x39\x5d\xed\xa7\x57\xb3\x08\x78\x07\x43\xa3\x50\xa5\xd5\x18\xfa\x5b\x55\xc6\xc7\x69\x4b\xef\x21\x6e\x1c\x40\xd4\x74\x13\x8f\x4d\x6c\x9c\xc8\x6b\x0b\xc0\xa9\x4e\xca\x54\xa5\x08\xd9\x9b\xa9\x16\x75\xaf\x2b\x6e\xd8\x9b\xd3\x63\xf6\x84\xed\x41\xe6\x72\xa8\x5e\x47\xbc\x0e\x67\xf9\xb6\xd2\x6b\x67\x7e\x88\xa6\xa5\x43\x60\x19\x4a\xa3\x2c\xf2\x8d\x40\xb5\x0a\xc7\x30\x81\x8e\xde\xd2\xbe\x71\xd3\x3c\xde\x95\x1f\xbb\xd5\x27\x84\x94\xa0\x01\x64\xd0\x9b\x0e\x32\x28\x56\xac\x87\x68\xbe\xb9\xe9\xd5\xfb\xad\x4b\xa8\x66\x56\xdf\x00\x4c\x75\x71\x02\x03\x22\x50\xc6\x3b\x4b\x6a\xfc\x3d\x3b\xbb\xaf\x02\x22\x11\x2a\x54\xc0\x4e\x28\xb9\x4a\x75\xbe\xf2\x34\xb7\x9a\x60\xbc\x45\xab\xb9\x65\xbb\xdb\xae\x5e\xe5\xad\xfd\xaa\x43\xc1\xc6\x1f\xa0\x2c\xf8\x05\xf8\x0a\xa4\x09\x9c\x80\xce\x03\x48\x98\x5f\x31\x5b\x7b\xa3\x46\xf4\xae\x92\x2a\x75\xd6\xb1\xd0\xb0\xf1\xd6\xaf\x75\x46\x05\x1e\xfe\xb5\xdd\xc0\x0f\xf6\xad\x6d\xc7\xa8\x42\x5b\xbc\x2c\x8b\xd6\x5b\x83\x3b\xe7\xa1\xbe\x75\xd5\xe9\x94\x66\xed\xb7\x86\xfc\xdf\xc6\x5b\xc3\xb9\xfb\x10\xdf\xba\x99\xee\x3d\xc0\x61\x42\x03\x32\x4d\x49\xe7\xd4\x65\xa1\x0d\x00\x53\x27\x84\x82\x13\xea\x71\xc9\xd1\x3e\x10\x01\x98\x62\xf5\xa9\x45\xb7\x4e\x78\xb6\xc0\x2e\xf7\xdd\xd6\x99\xb5\xd7\xba\x3d\x64\x94\xbb\xc1\xdd\x6c\xe1\xb3\x28\x83\x92\x23\x7a\x95\xae\xe3\x37\xad\x58\x0d\xb9\xe9\xe8\x97\x3e\x79\xc2\x9d\xbf\x75\x42\x67\xfc\x6b\xab\xa9\xf1\xae\x47\xc9\xe7\x30\x41\x81\xe9\x99\x05\xb7\x8b\x11\x2b\x45\x86\xc0\xb7\xb4\xcf\xae\xd0\x94\xda\x6d\x64\x89\x7a\x8e\xf5\x8f\x06\x85\x05\x1a\x6f\xc3\xc8\xe0\xf2\xf1\x6a\xc8\x0c\xe5\x97\x34\x6c\xe7\x85\x27\xc0\xce\x63\x16\xd0\x3b\xf8\x3e\x61\xed\xd0\x8b\x75\x25\x55\x4a\x88\xb0\x0d\xd2\x84\x8c\x64\xd4\x0d\xbd\x87\xc9\xef\x75\x5e\x0a\x70\xf6\x06\xd2\xb0\x71\x67\x66\xa0\xc8\x99\x8f\x9f\x8e\x6f\x51\x32\xbd\x4f\xc5\x3f\xa4\x3d\xcc\x1b\x05\x2b\xad\xa0\x58\x44\xe9\x35\xf7\xf9\x77\xe9\xd6\x1d\xb2\x8f\xe8\x5d\xa9\xea\xe9\x29\x7e\x0f\x03\x0e\xd7\x1c\x8b\x84\x22\x15\xbe\xc6\xea\x24\xbb\x90\x9a\x5f\xb7\x54\xef\x11\xac\x0e\x65\xda\xae\x9c\x4e\x98\x8d\x95\xf3\x72\xc9\xbe\x3d\x3d\x46\x0d\xbc\x61\x08\x28\xed\x1f\x1d\x38\x25\x25\x38\x46\xae\x96\x0f\x40\x71\xee\x06\x89\xd3\x19\x10\xa7\x2f\xd4\x70\x2f\x33\x11\x6b\xd6\x7a\xf2\xd4\x05\x55\xbe\x2d\x74\x96\x32\x1e\x18\x4c\xf9\xaa\xb7\xd4\x3f\x07\xe3\xed\x51\xb9\xeb\xc4\x19\x5f\x14\xcb\xae\x54\x5d\x18\xe3\xef\xdf\x6b\xab\x04\x7e\x4f\xef\x53\xed\xb7\xf7\x4c\x65\xbc\x52\xc9\xe2\xb7\xc2\x32\x6b\xa8\x1f\x42\x1d\x9c\x5d\x89\x52\x89\x8c\x15\xbc\xe4\xb9\xb0\xa1\xbb\xa3\x11\x5d\xb0\x8e\x7a\x42\x25\xf5\x03\x4a\xea\x01\x72\xd4\xbd\x4b\x63\x5f\x78\xa4\x3e\xa0\x33\x6b\x5a\xd7\xcd\xf0\x74\x74\x53\x5a\x52\x47\xd3\x8e\x83\xf7\x46\x02\xe9\xd5\x77\xb1\x89\xfa\x85\x2d\x0b\x1e\xc4\xbb\x35\xeb\x9a\x07\xb0\x6e\x7e\xc4\x01\x6b\x00\x06\x9f\xc9\x70\x5f\x77\x99\x57\x99\x56\x61\xcf\x76\xcd\x8a\x2b\xaa\xd9\x23\xe2\x13\xfb\xca\x3b\xcb\x5d\x28\x7b\x7c\x54\x1e\xae\x79\x6e\xf8\x51\x29\xa0\xc0\x96\x67\x17\x85\x48\x06\xd0\xb0\xbf\x7d\x79\x71\xd8\x1c\x14\x0e\x25\xc8\xcd\x76\x6b\xe2\xbe\x8f\x2a\x0c\x6e\xc4\x74\xa1\xf5\x15\xdb\x5b\x53\xe5\x19\xd5\xd7\x18\x39\x37\x07\xc4\xde\x63\x37\xef\x7d\x26\x15\x60\xf7\xae\x62\x1e\xfb\x87\x24\x61\x16\xb0\x56\x94\xe2\x46\xc7\xf0\xea\x34\x41\x46\x61\x46\xcd\x26\x0c\x9c\xd5\xc5\xb8\x7f\xbe\x97\xbf\x3e\xb0\x20\xb7\x55\xfb\xae\xa5\x1a\x3a\x34\x36\x42\x12\x32\xb7\x9d\xfa\x3e\x00\x1d\xbe\xab\x47\x8b\xa1\xe6\xe4\xac\x81\x82\x5f\x1b\x4a\x21\x58\xb9\x0b\xdd\xb8\xe8\xa7\xbb\xb1\x56\xdf\xac\x6a\x82\x32\x76\x5f\x7f\xa8\xe2\x0c\x8a\xa9\x88\x8b\x0d\xa3\xba\x9f\x76\xbd\x21\xc9\xdb\x68\xaa\x47\xb5\x07\xc9\x27\x23\xce\x32\x3e\x87\x6e\x3e\xad\xe2\x1d\x10\xae\xba\xc2\xa8\x66\x7c\xb3\xaf\xd0\xf4\x9d\x2a\x00\x28\xdb\xa0\x14\xf3\xc1\x4c\xaa\xf2\x80\x2c\x90\x43\x37\x6f\x47\x96\x73\x9f\xfb\xec\xa7\x00\x6e\x8a\x50\xa3\x6a\x1c\xef\x60\xfe\x86\xbc\x16\x0d\x02\xa3\xe4\xdd\xf3\x30\x3d\x16\x93\xac\xf0\xbc\x80\xdf\x73\x96\xcb\x77\xee\x29\xf1\xaf\xe2\xe2\x04\x95\x42\x94\x78\xfd\xd7\xfb\xce\x18\xab\x2d\xb7\x91\x5b\xc5\xf8\xce\xa8\x8b\x84\x82\x2f\xce\xb0\xba\x00\x5f\x20\x8e\xb4\x50\x43\x88\x3e\xfc\xdd\x1d\xc6\x2d\x84\x4a\x07\xda\xea\x10\x32\xa5\xe1\xdc\x42\xfb\xe3\xbb\x4f\x08\xd5\xdd\x32\x44\x18\x75\xf5\x8c\xfe\xe4\x47\xfb\xa7\x94\x61\x46\x94\xd7\x32\x11\x87\x49\xa2\x2b\xd5\x2b\x0b\xf5\x58\xb8\x57\xe0\x56\xa4\x17\x8d\x31\xd1\xe3\x9e\xc2\xb7\x58\x78\xcf\x33\xc9\x11\x82\xa9\x79\x27\xd6\xe4\xd5\xe3\x80\xc7\xbe\x35\x43\x62\x19\x63\x05\xef\x96\x51\xda\x93\x42\x7d\x33\xeb\x57\xdf\x78\xdd\x09\xd7\xa2\x20\x39\xeb\x57\xb2\xe6\xef\x56\xb2\x60\xb9\xb9\xaa\x81\xa9\x04\x54\x2d\x85\xcd\x14\x7d\x4e\x2f\x3a\xe6\xf8\xd4\x4e\x60\x55\x1d\xa8\x6b\x9d\xdc\x73\x2f\x7f\x68\x9e\xff\xef\xe3\xb3\x7e\x99\xe3\xa1\x27\x0f\x96\xc3\x2c\x68\xe8\xa0\xaa\xc7\x28\x04\x71\x35\xa3\x7b\xf2\x88\x95\x9c\xda\x0d\x50\xab\xb9\x4c\x70\xf4\xa9\xb0\xbd\x28\xb1\x7f\x7f\xe2\x64\x7a\x1d\x2d\x47\x51\x4f\x9d\xe1\x72\xc1\x95\x89\x2a\x56\x05\x0c\xed\xb3\x62\xc3\x7c\xf0\x20\xa4\xd5\x26\xef\xc1\x9e\x77\xba\x36\xef\x30\xb6\xac\x12\xcb\x2a\x6b\xdc\xe7\xf8\x70\x2f\x30\xef\xf0\xf8\x52\xcc\xa5\xb1\xe5\xd2\xf7\xac\x9b\x45\x93\x20\xaf\x50\xb8\xe5\x4a\x2c\xd9\x77\xdf\x9f\xfc\xe3\x9f\x2f\x5e\x1d\x1d\xbe\xf8\xe7\xcb\xc3\xa3\xef\x4e\xcf\x4e\xde\xbe\xbd\xf8\xc7\xc5\xe5\xc9\xcb\xb7\x6f\x8f\x10\x50\x85\xaa\x77\x2f\x84\x7d\xfb\x96\x38\xd5\xbc\x7d\x7b\x99\x14\xb2\x78\xfb\xf6\xdc\xfb\x40\xb0\x1b\xc5\xff\x3e\x3e\x03\xf9\x89\x45\x64\x21\xed\x09\xce\x56\x24\x3a\xcc\x7b\xc1\x4d\x9d\x64\xd9\x28\xcf\xe9\x80\x60\xda\xf5\xb8\x5b\x8b\x1f\xd5\x6b\xb3\xbb\x01\xeb\x36\x52\xde\xc5\x1b\xbc\x74\x6c\x2a\xec\x8d\xa0\xaa\xc7\xb5\x00\x65\x3c\xaa\xa3\x8e\x30\xc7\xd6\xb5\xaa\x41\xe5\x4c\xb3\x6b\x29\x6e\x10\x62\x03\xbb\x02\xd6\xfd\x92\xa0\x0a\x1a\x2b\x61\x57\x61\xd0\x40\x49\x2a\x74\x1a\x7a\x43\xb5\xfc\xd2\x2b\x3e\xe9\x46\xd5\x0d\x02\xdd\x89\x94\x9d\x9f\x1e\xb3\xa7\x13\x54\x72\x4e\x8f\x11\x77\x73\x2d\x2c\x97\xb7\x54\xdd\x81\x8a\xa7\xef\x9a\xaa\x83\x9a\x01\xba\x08\xa3\x0e\x1c\x50\x4d\x53\x9d\xf3\xfb\x76\x81\xfb\x40\xfd\x0a\xf6\xe8\xfc\xa5\xe2\x19\xea\x00\xe7\x3a\x5d\x95\x4c\x3b\x5f\xfb\x8f\xfe\x36\xf9\x3a\xcc\xe3\x6f\x93\xaf\xa1\xfb\xa7\x27\xdb\xdf\x26\xe6\x3a\x99\x7c\x4d\xf5\xd4\x8c\x6e\x5a\x9b\x23\xbc\x52\x1c\x45\xfa\x2c\xfe\x06\x9e\xcd\x41\xdf\xfd\x24\xe5\x2e\x03\xb6\x51\x1d\xb8\x79\x2a\x6a\x81\x50\xaa\x9d\x94\x82\x63\xaa\x39\x4b\x45\x26\x6a\xd8\x9b\x07\xd0\xbd\xf3\xf6\x76\xa6\x3e\xd6\xd6\x68\xf6\x1a\xfb\xa6\x82\xbe\xf4\x9b\xef\x09\x1b\x1b\x0c\x7f\xac\x5b\xec\x77\xd8\x00\x3d\x81\x1d\xee\x15\x36\xb2\x3a\x13\xb8\x3e\x7d\x76\xca\xda\xba\xba\x5d\x13\x8f\xde\x85\x10\x9b\x28\x5e\xbf\xf4\xc8\xad\x8e\x23\x2e\xc3\xfc\xc1\xd2\xc0\x5e\x87\x18\x5c\xc5\x6f\xa0\xda\x6d\xc9\xdc\xa9\x65\xd1\x93\x11\x17\x94\xda\x12\xba\x32\x7e\x7d\x25\x96\x23\xc4\xff\x40\x25\xe4\x6f\x11\x04\x75\xa8\xa0\x46\x9c\x39\x5d\xb2\xaf\xfd\xbf\xfe\x76\x5f\x6b\xad\x87\x1f\xb5\x8f\x17\x15\x5f\xaa\x77\xe4\xeb\x04\xab\x60\x9a\x80\x20\x48\x59\x2a\x90\xb1\x1a\xc9\x35\x61\x27\x50\x26\x8b\x1a\x29\xc1\xf0\x66\x59\xe3\x66\xe3\x5b\x6a\x36\xc0\x24\xc0\xff\x12\x55\xc7\x9c\xe9\x0b\xaa\xcc\x04\x80\x9f\x99\x28\xeb\x4f\x40\xc0\x9c\xe9\x93\x77\x22\xa9\xee\x0b\xba\x83\x57\x2f\xdf\xdf\x95\xe8\xdf\xe4\xec\x7b\x11\xc0\x8f\x90\x36\x4e\x0b\x0f\x95\x09\xf5\xee\x8c\x92\xd3\xde\x4f\xdb\x2b\xb1\x34\x01\x53\xee\x0a\x47\xa7\x22\xe8\xc0\xbf\xfe\x20\x3b\x79\x27\x8d\x35\xff\xd3\x77\x58\xcb\xa7\x75\x6f\x3b\x8e\x59\x62\xf5\xe8\x11\x9e\xa0\xfb\x13\x1e\xf3\xa9\x09\xee\x5f\xa0\x37\xd5\x5f\x79\x4a\x44\x88\x81\xdc\xbd\xd3\xae\xa1\xf4\x24\xad\xa0\x50\x2d\x86\x9e\xab\x13\x6b\xf0\xc7\xc8\x9f\x48\x43\xa0\xcb\x89\x53\xf2\x9a\xc7\x0c\x7d\x44\x37\x49\x00\x21\x91\xd7\x3c\x13\x8a\x60\x7b\xb3\x34\xe1\x25\x86\xe8\x09\x7f\xc8\x10\xf2\x37\x01\x6f\xb8\x33\x8e\x24\x59\xbd\xca\x86\x42\x79\xbc\xb4\x32\xa9\x32\x5e\x32\xb7\x1f\xe7\xba\xbc\x27\x4c\x11\x5e\xfd\x3a\xfd\x05\x16\xed\xd1\x00\xbb\x29\xdf\xdb\x23\xb6\x71\x1d\x49\x7b\x71\x26\x13\xd4\xd7\x34\x37\xca\x5e\x13\x39\x5c\xcf\xbc\x6c\x0a\x82\x22\x46\x06\xb4\x0d\xe7\xb8\x9c\x83\xff\x7b\x3f\x3a\x3c\xc2\xce\x9c\xb0\xbf\x87\x6a\xf1\x11\xab\x7d\xc6\x50\x93\x4a\xcf\xa4\x6d\x43\xcb\x55\x6f\xea\x99\x2e\xa1\x6d\xe3\x5e\xaa\xe1\x37\xe2\x5a\x26\x76\x7f\xc2\xfe\x3f\xa7\x29\x82\x13\xd9\xab\x93\xb4\xcd\x42\x1d\x6e\x8d\x4f\xf8\x84\xed\xc1\xcf\x62\x55\x72\xdf\x07\x8a\x08\xf8\xf4\x91\x65\xc3\xf4\x88\x70\xaf\x89\x6e\x37\xc4\x28\x6a\x8a\x2d\xd6\x08\x27\xbf\x0e\x12\x32\xc8\x44\x69\x68\x97\x36\x3c\xb7\x21\xce\xe2\x45\x68\x60\x9c\x7f\x83\x8f\x9e\x95\x62\x0e\xfb\x0f\x77\xcf\x27\xdc\x7d\x56\x17\x3a\xd3\xf3\xe5\x45\x51\x0a\x9e\x1e\x69\x65\x6c\x09\xa2\xa1\x0f\x1c\xdc\x6d\x63\x46\x9d\xc2\x16\xfa\x86\x71\x2a\x67\xd7\x33\xc4\xe6\xd3\xd5\x7c\x81\xbd\x11\xe0\x87\xbe\xab\xae\x9f\x22\x19\x9d\x66\xc2\x2e\x42\xef\x03\x60\xf0\xd0\x4a\x01\x46\x01\x87\xc7\x0d\x5f\xd2\x66\xe2\x53\x99\x0a\x13\xe5\x28\xfb\xc9\x60\xe8\xe7\xd6\xf7\x07\xa9\x7c\x78\x76\x7c\xdf\x86\x13\x1b\x54\x68\x6f\x79\x95\xa0\x19\x21\xd5\x6b\xfa\x06\x8d\x14\xe8\xc6\x73\x4d\x9a\x2a\x42\xd7\x7a\xca\x7c\x42\xdd\xb4\x0f\x56\x53\xce\xdf\x5d\x5c\x89\x9b\x0e\xbf\xf4\x2f\xfa\xbd\xb8\x7f\x2a\xd8\x18\xec\xd1\x37\xca\x70\x2b\xcd\x0c\x3a\xd3\x7c\x42\x7d\x1c\x8a\x0e\xba\x35\xd0\xc0\xab\x59\xbb\x13\x8f\xe6\x8b\xc2\x03\x3c\x63\x83\x59\x28\xff\xaf\xb6\x83\xf0\x00\xc4\x22\x88\xd0\x7b\xc3\xed\xa0\x84\xfa\x51\x59\x5d\xc7\xa1\x31\x52\x51\xe5\x53\x51\x86\xbd\x8f\xce\x00\x59\xb6\x90\x78\x5b\x7b\xbf\xbb\x60\xec\x9c\x09\xd7\x37\xad\x0c\xc8\x73\xf2\xce\x69\x1e\xa6\x5b\xa2\x12\x5e\xcd\x76\x72\xad\x41\x31\x3c\xe6\x13\x38\x5b\xcb\xd0\x68\xeb\x02\x66\x6f\xfc\x49\x57\x39\x57\x5f\xfd\x1a\x52\xb2\x7e\x4d\x29\xd9\x9a\x44\xe9\x5b\x5f\xbf\xd5\x1b\x26\x2e\xf8\x23\xa7\x90\x19\xa1\x02\x8f\x0e\x6c\xae\xea\x83\x1d\x6e\x06\xa5\x9e\xb4\x39\x67\x14\xb9\x9b\xf0\x77\x7d\x3b\x3f\xf5\x68\x6a\xc9\x06\x68\x6c\xc9\x40\x96\x5d\x75\x90\x80\xf1\xef\x3d\xb1\x3a\x0f\xd2\xbf\xc5\x25\xeb\x6e\x50\xd7\x57\x83\xa1\xae\x6a\xd3\x1a\x39\xab\x61\x5a\xd7\xc2\xae\x36\xac\x7b\x3d\x7b\x80\xbe\x6f\xac\xa7\x8d\x5b\x5f\x0d\x42\xe8\x7b\x58\xbb\x1c\x02\x4c\x7a\xe6\x77\xc7\x5a\x9b\xf7\x54\x8d\xd8\x99\xb6\xee\x3f\x91\xf9\x7b\xac\x85\x39\xd3\x16\x3e\x79\x10\xa4\xc4\x57\x18\x90\x90\xbe\x6b\x02\xf6\x03\x71\x72\x93\x42\xb4\xee\xc4\xf3\x04\x5b\x63\x58\x9c\x2a\xa6\x4b\x4f\xb1\x60\x5d\x18\x1a\x22\x0e\x2b\x10\xc6\xd6\xad\xc6\x89\x1b\x27\xa6\xf3\x7b\x86\xa3\xa1\x20\xfb\x0b\xbf\x01\xac\xd5\x22\x83\x02\x81\xb4\x2a\x11\xf2\xd6\xe9\x9a\x56\xcc\x65\xc2\x72\x51\xce\xa1\x4f\x76\xb2\x18\x62\xf9\xfa\x9c\x2b\x78\xf5\x3c\x5d\xe2\xc9\xf4\xe0\x25\x38\xb2\x41\xc5\x1a\x50\x05\xc0\xf1\xf0\x58\xcb\x39\x58\x52\xff\x27\xf8\xa0\xff\x2f\x2b\xb8\x2c\x01\x22\x97\x62\xc7\xf1\x77\x14\x7d\x89\x87\x71\x23\xac\xf8\x96\xb8\x62\x02\x2b\x99\xdc\xe8\x6d\xc5\x63\xc4\x6e\x16\xda\xe0\x61\x18\xdc\x1f\x3b\x57\x62\xb9\x33\x5a\x61\xbd\x9d\x53\xb5\x53\x07\x86\x1b\xcc\x16\x0e\x61\xc8\x20\xdc\x81\xef\x76\x3e\x9e\xae\xd2\xeb\xb0\x1d\xa2\x57\x41\x7b\x42\x1d\xf9\x8a\x6c\x9e\xde\x9a\xff\xee\x4b\x1c\x28\xb2\xcf\x31\x26\x38\x2f\x05\x16\x63\x82\x29\x0d\x8a\x3a\x35\xb3\xa9\x94\xb8\x16\x6e\xb1\x52\x69\x08\x0f\xd0\xa7\x18\xfc\x6b\xc5\x24\xfa\x7f\x8e\xf5\x99\xb6\xde\x6a\xff\x97\x77\x7b\x21\xff\xbd\x93\x79\x95\x23\x6e\x96\x75\x96\x42\x2a\x67\x1e\x37\xd8\x67\x36\x34\xed\x85\xa6\xd9\x4a\x7c\x6c\x79\x39\x87\x0c\x47\xb2\x17\x3c\x9b\xcd\x33\x3d\xe5\x19\xcb\xa5\x72\x8f\x99\xb0\xe7\xba\x64\xe2\x1d\xcf\x8b\x4c\x60\x3d\x1c\xfb\xe3\xf8\x3f\x5a\x09\x46\xd1\xf0\x11\xf3\xb4\xa8\xbb\xa2\x3d\x45\xae\xad\xfb\x07\x84\x54\x87\x86\x01\x16\xdc\x16\x86\x3d\x3d\x78\x7a\xf0\xe4\x19\xfb\x95\xb9\xa1\x9f\xd2\x7f\xbf\xa4\xff\xfe\x91\xfd\xca\x7e\x65\x8c\x9d\x33\xd6\xf8\x2f\x83\xff\x8e\x99\x9c\xc5\x73\x78\xea\xa6\x99\xe8\x9c\x5e\x18\x3c\xb9\xa1\x6c\x35\xb4\x1b\xb4\x9a\x86\x86\x9a\xa1\x44\xe7\x02\xe6\xf0\xf4\x7f\xfa\x7b\x20\xe0\x6a\xb1\x23\x24\x4c\x6a\x0f\xa6\xb4\xcf\x6e\xc0\x35\x95\xf3\x2b\x34\xcb\x0e\x13\x5b\xf1\xcc\x3d\x7c\xef\xcb\xf1\x93\x7d\xa6\x55\xf3\xf6\x6b\xa9\x9d\x0a\xec\x67\xb8\xf7\x74\x7f\xb2\x32\xe5\x2f\xd7\x4c\xb9\xd5\x1c\x91\x8a\x06\xdd\xa0\xb7\x73\x8d\x67\x98\x43\xb5\xbc\xe1\xcb\xc0\x36\xde\x2c\x9d\xcb\xeb\x00\xb1\x1f\x41\x79\x40\xcc\x0e\xb8\x40\x7a\x74\x26\x1c\x74\xc9\xa4\x9d\xb0\x53\xbb\xbb\xeb\x5b\x71\x3a\x8d\xd9\xf7\x02\x38\x8e\x51\x27\x81\xf0\xb0\xe8\x4f\x5a\x39\xbd\x1d\x30\xce\x06\x75\x8e\xde\x0b\xcc\x9f\x9e\x5e\xfb\x37\x06\x70\xaa\x87\xb1\xfc\x0e\x76\xa2\x5f\xcf\xb0\xd0\x17\x1b\x63\x4e\xa0\xeb\x29\xd1\x9e\x12\x46\x50\x75\xa6\xdd\x23\x4d\xb0\x9e\x24\xe4\xdf\x27\x51\xa7\xa9\x12\xbd\x74\x32\x15\xa5\xf0\x7d\x35\xe3\xf4\xa2\xe0\x97\x62\x3f\xd6\x77\x62\x5a\x11\xc4\x5f\x71\xa0\xbf\x61\x3a\xfb\xce\xb4\x4a\xae\x84\xf5\xe7\x4e\x09\x19\x11\x45\x65\xd9\x94\x67\x5c\x39\x0d\x66\xc5\x0f\x61\x35\x0e\x86\xbf\x04\x86\x59\xc3\x2f\x9f\x3a\x3e\xb2\xb2\x3b\xfa\x0b\xfd\x1f\xdb\x43\x46\x11\x59\x72\x14\xa6\x82\x67\x3e\x95\x02\x60\xf6\x03\x68\x98\xda\xdd\xad\xf7\x15\xac\x0d\x0a\xbf\xda\xc1\xea\xe4\x42\x43\xee\xb3\x3d\x9f\xfb\xc8\xac\xc8\x32\xe4\x9e\xba\x8d\xad\xdb\x64\x71\x5f\x5c\x09\x23\x34\x65\xc0\xda\x1f\x36\x9b\xe9\x62\x50\xdf\x49\x76\xb5\x0c\xe5\xfe\x23\xe8\x23\x3d\x97\xd7\x4e\x24\xdd\x49\x64\xa0\x58\x5c\x88\xac\x60\xa5\x48\xab\x84\x8a\x00\xae\xc4\x8d\xd3\xa7\xea\xb7\xa4\xae\x54\x9e\x5d\x77\x1a\x04\xdd\x41\x98\x71\xd5\x14\x87\x72\x06\xcc\xe8\x9b\xb3\x8b\x6b\x51\x2e\x59\xa1\x8d\x91\x6e\x0d\x60\x1f\x61\x26\x1c\x28\x5d\x01\x99\x08\xd2\xb0\x60\x56\x5e\x06\xef\x90\xcc\xdd\x71\x52\xda\xe8\xc6\xde\xf8\x34\xe7\xdc\x1f\xdd\x19\xf3\xfe\x73\xee\x1c\xfe\xb7\x7a\xde\x9d\xce\xd8\x1a\x06\x0c\x73\x69\x70\xce\x7d\x8e\xc0\x2f\xe1\xa4\xfa\xe3\x7e\x74\x12\xfe\xf1\xe0\xcb\x83\xa7\x7b\x6e\xae\x5f\xee\xbb\x59\x37\xce\xb8\xa7\xe1\x8c\x0b\xbf\xa4\x19\x09\xd3\x38\xe5\x9c\xf5\x05\x69\x8f\xd0\x62\x84\x80\xb1\x28\x85\xce\xcd\xc8\x58\x0a\xb6\xc9\xdc\x0b\x17\x64\xbb\x9a\x53\x6f\x34\x6c\x1b\x38\x6c\xa5\x65\x7f\xc8\x75\x29\xfe\x10\xdd\x7f\xeb\xe9\xd4\xfd\xd0\xe9\xdb\x7b\x37\x93\xc6\x42\x03\xde\x2b\xb1\xbc\xb7\x9a\xdb\xc7\xb7\xde\xd7\xb3\xbe\xfa\x16\x48\x90\x9c\x17\xf7\x18\x07\xc1\x59\x7b\xf5\x39\x79\x41\x5e\x59\x1a\x8a\xbc\x8e\xa8\x12\x51\x0f\x7c\x2c\x94\x0a\xc9\xb4\x53\x91\x69\x84\xba\xa5\xbc\x81\x7b\xe4\xe9\x87\xd6\x02\xc6\xea\x92\xcf\xc5\x01\x3d\xf6\xb1\xb4\x14\xf9\x01\xd1\x70\x1b\x2e\x26\xac\x65\x24\x9c\x5c\x9f\xcf\xec\x83\x0f\x20\x05\x78\x02\xa9\x80\x40\xc8\x06\x18\x45\xdc\x9f\xf9\x71\xc4\xb1\x3a\x54\xce\xf7\xf1\x9a\xf2\x1b\x73\x92\x71\x63\x65\xf2\xf7\x4c\x27\x57\x17\x56\x97\x03\xa8\x16\x87\x3f\x5e\xac\x8c\xda\x58\x53\xc5\x0e\x7f\xbc\x60\xc7\xd2\x5c\xd5\x1d\x1a\x10\xd6\xb4\x99\x7d\xc7\x03\xac\x0f\x15\x62\xb0\x9c\x3b\xe3\x4f\x78\x03\x4f\x05\x68\xe7\xe1\xf6\xca\xef\xf8\x8d\x11\x38\xfd\xa9\x9b\xbe\xfb\x5a\x74\x17\xc1\x1b\x03\x61\xc0\xd7\x39\x3d\xde\x40\xd4\x6b\x66\xba\xb6\xae\x61\x2b\xcc\x14\xf5\x90\x06\x40\xa3\x26\xcc\x37\x70\xcd\x52\x57\xec\x86\xa3\xc3\x0a\x64\xea\x84\x5d\xca\xe2\x19\x3b\x89\x00\x73\xb1\x1a\xa1\x39\x94\xd3\x37\x02\x78\x09\xa5\x08\x00\x97\xad\xf6\x02\x3e\x41\x65\xca\x3c\x63\x3b\xe2\x9d\xfd\xd3\xce\x88\xed\xbc\x9b\x19\xf7\x1f\x65\x67\x00\xb0\x4d\x7d\x3e\x9c\x56\xa7\x66\xa2\xac\xad\x17\xfc\xc1\x6a\xdd\xe0\xf0\x4c\xca\x2e\x5f\x1d\xbf\x7a\x06\xda\x7b\xaa\xd9\x8d\xf0\x9d\xf0\x7c\x15\x2c\x49\xc3\x88\x0c\x50\xce\x91\xe8\xbc\x28\x75\x2e\xa3\x5c\x55\xd8\x64\x5d\x78\x9e\x0d\xe1\x2c\x85\x8c\x34\x58\xfe\x41\x38\x08\x52\x7d\xfd\x90\xad\xe6\x02\xb7\xf1\xcf\xe9\x8c\x69\xf4\x48\x35\x13\xe4\xa5\x09\x37\x39\x8e\xa1\x51\xb0\xa5\x5b\xcd\x23\x4e\xfd\xa6\xaf\x0e\x52\x71\x7d\x60\x52\xfe\x74\x04\x8f\x41\x06\xa0\x06\x0a\x61\x4e\xdc\xb0\x9d\xa7\x3b\x13\x76\x21\x73\x99\xf1\x32\xa3\x5e\x33\x34\x44\x7d\x9f\xb3\x06\xfc\x80\xe0\x53\x7d\xb2\xc3\xf6\x30\x43\x1d\x74\x8a\x4c\xf8\x7a\xe5\x80\xcf\x01\x0e\xfc\xfd\x4e\x2a\x24\x1b\xc0\x77\xc1\x7a\xfb\x2f\x18\xb5\x9d\x7b\xa5\xb2\xce\x71\xbd\x56\x49\x15\xad\xc1\x8e\x85\x0e\x6e\x56\x43\xf9\x80\xa0\x9e\xc2\x28\x2a\x5e\xd3\x13\x6b\x42\x4a\x45\xda\x09\xb4\x8c\x07\x36\xc0\x01\xde\xcb\x2c\x3b\x50\x7a\xb4\xf3\x60\xce\x24\x36\x40\x29\x37\x0b\x47\xcb\x30\xeb\xf1\x46\xc9\x5f\x2a\xc1\x4e\x8f\x43\xdf\x4f\x51\x1a\x69\xac\x93\x5c\x69\x43\x47\x90\xa8\x38\xec\x1d\xe6\xfc\x3f\x5a\xb1\x93\xbf\x5f\xd0\x54\xf6\x1f\x20\x81\x3b\x0a\x40\xfe\x9f\xaa\x14\x4e\x35\xea\xad\x87\x1d\xfa\x91\xda\xba\x97\xfb\x9c\x1d\x73\xcb\x51\x05\x43\x69\xa6\xeb\xf2\x52\xd8\x09\x53\x48\xfb\xf1\xb5\xc3\x1d\xb5\x68\xb6\x79\x35\xc8\x71\xd0\x59\x77\x3c\x2a\xf7\xf3\x37\xaf\x4f\x37\xa0\x44\x25\x70\x0a\xcf\x5f\xea\x74\x20\x4d\x0a\xb0\x3d\x8e\x70\x54\x96\xbb\x61\xd9\x99\x56\x62\x04\xc2\x8e\x39\x69\x47\xff\xfc\xb1\x94\xf6\xbe\xe5\x92\xf5\xd5\xfb\xf8\xf7\x2b\x36\xc8\x5b\xbb\xc3\xff\x2c\x2a\x8b\x07\x0c\x07\x90\x2a\xa4\x08\x4c\x33\x3d\x65\x24\x0d\x36\xf9\xc6\x6f\x5e\x9f\x0e\xf6\xc2\x6f\x5e\x9f\x3e\xdc\x97\x1d\xd0\x38\x68\xdb\x06\xb5\xfe\x56\x23\xc7\xb6\x95\xfe\xbb\x6b\xfc\x93\xa1\x74\xfd\x4d\x51\xfa\x4a\xaa\xce\x29\x61\x4d\xd1\x71\xe2\x8b\x23\x29\x4c\x03\xf5\xd8\xe9\x33\x96\x57\x99\x85\xda\x37\x60\x2c\xc7\x69\xc6\x9d\xde\x9e\xc5\x18\xe1\x40\x30\x76\x2c\x30\xb6\x90\x3e\xf3\xd9\x08\xe1\x17\xeb\x7f\xf0\x92\x2b\x3e\x77\xb7\xc3\x79\xc8\x72\xfc\x33\xe2\xe8\x3d\xf4\xa0\xab\xf0\x15\xbf\xe6\x32\xe3\x53\x99\x49\xbb\x74\x7a\xdc\xfe\xc4\x2b\x62\x06\x0b\x61\xdd\x94\x37\x26\xd4\x06\x55\x61\xe3\xe2\x20\x50\x30\xd9\x9e\x1b\xff\xe0\xc6\x09\xee\xfd\x49\xad\xbd\x02\x14\x19\x64\xc9\xa3\x8a\xdb\x50\x6d\x3d\xc4\x43\x4b\xb3\xed\xc7\xae\x5d\xd5\x4a\x58\xe6\xe7\x1d\x01\xac\x57\xd5\x1e\x37\xd2\x5a\xb5\x07\xbe\x20\xc4\x89\xcf\x5c\xf3\xc1\x26\x62\x3d\x74\x1f\xd8\x32\x1d\x7f\xdf\x57\xfb\xd9\xee\x97\x0f\x5f\xf5\x02\x0f\x42\xa5\x18\x41\x08\x87\x6e\xe5\x48\xe3\x0e\xba\x20\x51\xed\x91\x85\x40\xbb\x72\xfb\xa6\x4b\x05\x05\x5e\xbd\xa5\x6b\xe0\xd4\x41\x08\x81\x98\x2b\x9d\x37\x4e\xcf\xf7\x49\x44\xb1\x98\xf5\x2f\x80\x3c\x12\xc5\xe2\xf9\x45\x33\x94\xe2\x3e\x63\xcf\x2f\xd6\xc8\x3d\x4c\x94\x71\xef\x6d\x30\xc0\xb2\x6b\x58\x26\x67\xc2\xca\x4e\x44\xd8\xb0\xe4\xcb\xb5\x92\x56\x97\x66\x13\x05\x1f\xf4\xe8\x61\xf4\xae\xd7\x9e\x10\xec\x25\x8d\x8b\xd9\x9e\x89\xce\x32\x91\x58\x6a\x7b\x09\xcb\xea\x1f\xbc\xce\x11\x42\xa9\x00\xc6\xf7\x89\x26\xa7\xc7\x01\xb2\xda\xc1\xeb\x93\xc3\xe3\x97\x27\x93\x3c\xfd\xdd\x42\xdf\x8c\xad\x1e\x57\x46\x8c\xa5\xed\xa7\x2b\x6d\xb0\x22\x64\x00\x07\xb4\x5d\x0c\xb3\x80\x35\x1c\xd1\x1b\x53\x03\x86\xf9\xc0\x6f\xa9\xb5\x5d\x85\x0c\x9b\x55\x59\x86\x6b\x6a\x4b\x21\x46\xb1\x3b\xf1\x9e\x80\x6a\xf5\xf5\xb0\xf4\xd7\xdd\xf5\xbd\xa1\x87\x3f\x9a\x1f\xca\x66\xe8\x7f\xca\x77\x55\x8d\xd9\x7b\x68\x7f\x11\x46\xf6\xd9\x7c\x8e\xf1\xdd\x4a\x5c\x89\x25\x83\xd4\xfe\x99\x2e\x01\x66\xb3\xc9\x85\xc2\x26\x40\xae\x03\xe8\x69\x49\xba\xc2\x03\x21\x75\x1f\x2d\x02\x5e\xe4\xb5\x98\x7d\x1c\x42\xbf\x16\x33\xac\x9e\xf0\x09\xce\x64\x5d\xf0\xca\x2e\x30\x0d\x12\x61\x8f\x90\x9c\x6b\x29\x4f\xe5\x18\x0f\x84\xd4\xbd\x12\xe9\x87\x28\xf6\xea\x03\xda\xcf\x56\xd6\x2b\x76\x13\xd2\x22\xd9\x7b\xc7\x15\xf4\xb5\xb3\x2d\xc5\xcd\xc1\x8d\x2e\xaf\xa4\x9a\x8f\x6f\xa4\x5d\x8c\x91\x52\xe6\x00\x40\xd8\x0e\x7e\x07\xff\xa1\x68\xed\x61\x9a\x52\x66\x59\x65\xc4\xac\xca\x30\xe7\xcb\x4c\x18\x2f\xe4\x0f\xa2\x34\x90\xbf\x78\x25\x55\x3a\x62\x95\x4c\xbf\xe9\xba\x62\x6c\x88\x0d\xd2\xbd\x89\xda\x7b\xcf\xc5\xd2\x8b\x9f\x92\xa7\xda\x20\x04\xaf\x23\x51\x83\xf5\x79\x9a\x4b\xf5\x50\x38\xbf\xab\x6a\x2f\x55\xda\x8d\x82\x4d\xea\x1d\xc1\x38\x4d\xdd\x1e\xc7\xf6\x31\xe3\x90\x45\xc3\xbd\x2f\x03\x7b\x6c\x51\x3e\x4d\x33\x9b\xe6\x4e\x02\x25\x5f\x9a\x5f\xb2\x31\x3e\x65\x5c\xa4\x35\x5d\xb7\xa9\x31\xf7\xb9\x3e\x66\x6a\xcc\xb0\xee\xef\x4f\x90\xf0\xf2\x51\x79\x8c\x6d\xd5\xde\x0d\xd0\xba\xbf\xa6\xfb\x11\xf4\x2f\x00\x81\x37\xbe\x32\x19\xd4\x2b\x94\x3d\xde\xb7\x85\x7d\x05\x03\xea\xb0\xaf\x31\x4a\xb4\x52\x04\x48\xf7\xaa\x10\xea\xc2\xf2\xe4\xaa\x67\x5c\x74\xab\x33\xfd\xc6\x74\xa6\x61\x73\x65\x7c\x1a\x74\x1a\x78\x14\x4b\xa8\x28\xa5\xac\xce\x92\xc6\x8d\xfd\x08\xa5\x2e\xc2\xab\xbf\xe4\x45\x7f\x0f\xa8\x1f\xa9\xa5\x28\x85\x8f\xc9\xe9\x09\x55\x35\x85\x2e\xaa\x0c\xf1\xd6\xa4\x21\x3a\x7e\x7a\xc5\xa6\xef\x06\x27\x7d\x79\xb8\x9c\x91\x5a\x86\xe6\x3a\x15\x6c\x2a\x6d\x2d\x1d\x8d\xb0\x58\xb8\x4b\x28\x34\x5a\xb1\x84\x90\xe6\x40\xeb\x70\x1a\x06\x4d\x28\xd2\x48\x14\xd3\x89\xf5\x05\x7f\xa1\xc6\xf7\xc9\x93\x27\x4f\xb0\xe2\xf2\xbf\xfe\xeb\xbf\x98\x2e\xa1\xdd\x43\x22\xf3\xd5\x1b\xe1\xae\x3f\x3f\x7d\x3a\x61\xff\x38\x7c\xf9\x02\x72\xff\x0b\x6b\x10\x04\x1c\x47\x76\x37\x34\x7e\x6c\x46\xec\x7f\x5d\xbc\x3a\xf3\x6a\xa3\x69\x7d\x0b\xa6\x76\x78\xbd\x26\xf4\xe2\x93\xbf\xfc\xe9\x4f\x13\x76\x2c\x4b\xa8\x7d\x92\x22\xb4\xf5\x0a\xde\x12\x5e\x0a\xac\x10\x05\x7c\x40\xaf\x57\xc9\x80\xa0\x4f\xe0\x09\xd8\xf8\x10\x8b\x19\x1d\x07\x66\x32\xb1\x58\x66\x85\x82\x2c\x34\x55\x06\xd4\x46\xc2\x41\xa5\x64\x5d\x98\xdc\x88\x65\xf2\x4a\xb0\x99\x81\x86\xa2\x75\x25\x3d\xf5\xba\xa1\x92\x12\x1c\xac\x5e\x2b\x23\xec\x23\xcf\xfd\xec\xe5\x0b\x6e\xa3\x17\x37\x9a\xb5\x41\x9d\xe7\x95\x58\x8e\x91\xc3\x0a\x2e\x43\xc1\x08\x24\xc7\x35\x1a\x2c\x04\xaf\x4d\x1a\xc9\x15\x0f\xb0\x58\x94\xfa\xdf\xb8\xf8\x50\x40\x1a\x49\x62\x28\x43\xc5\x06\xbb\x80\x94\xa0\xa2\x6e\x1d\xbe\x08\x96\x3a\x7a\xf9\x8f\x09\x26\x74\x15\x6b\x39\x93\xc6\x3d\xe2\x4a\x2c\xcd\xfb\x9e\x5c\x37\x8a\x71\xfc\x69\x90\x53\x2a\xb5\xf2\x6b\x82\xdd\x27\xc9\x48\x1d\x16\x08\xee\xa6\x1e\x03\x6b\xff\xa9\x0a\x9a\xee\xf5\x54\x0a\x84\x68\xa4\x2b\x1b\x61\x2b\x22\x0d\xe4\x9d\xbb\x67\x03\xfa\x3f\xbc\x61\xce\xcb\x2b\xe1\xfb\x0a\xf3\x6c\xc2\xce\xdd\x24\x03\xde\x48\x68\xeb\x0c\x76\x2b\x5f\xc2\x63\x49\x49\x83\x87\xec\x4e\x26\xbb\xb8\xf1\x74\xc9\x8c\xe5\x25\xed\x22\xf7\xf9\xe7\x01\x61\xf5\x92\x17\x06\x21\x55\x9c\x56\x0a\x70\x43\x1a\x60\x5a\xed\xa2\xee\x29\x88\xb4\xde\xc2\x4e\xb1\x31\x10\xa6\xf3\x00\x0f\x11\x72\xea\x92\x64\x83\xd5\x7e\x7b\x3f\x08\x20\xa4\xbc\x87\x52\x81\x57\x2f\xd5\x82\x30\x76\x33\xf1\xa8\x74\x89\xf5\x3d\x35\x48\x52\x46\xda\x5a\xab\x11\xe8\x63\x55\x19\xf0\x1a\x42\x71\xc0\xab\xbf\xfa\x80\x57\x9f\x80\x2e\x5e\x2b\x3b\x34\x9c\x54\x78\x18\xcd\x6a\xd2\x03\xe2\x79\x11\x8e\x78\xab\xb1\x3d\x88\x6f\x73\xa3\x18\x9f\x1a\x9d\x55\x16\x7f\x5a\x7f\x19\x1f\x73\x30\xa8\x47\x5e\x82\xb3\x2d\xdc\x16\x1d\x7a\x70\xdc\xe3\x39\xd1\xe7\xfc\xc3\xab\xb7\x98\x18\xac\x85\xf2\xe7\xed\x55\xe8\x4d\x67\xaf\x3b\x0d\x93\xeb\x44\xc5\x50\x37\x0b\x41\x59\x08\x91\x5e\xe7\x84\xa7\x13\x09\xa0\x34\x7a\x15\x0d\x5b\x96\xa7\x1b\xf1\x12\x26\x46\xf6\x77\x0b\x5c\x9c\xb2\xbd\xd0\x6b\x34\xa4\xb3\x9d\x2a\x2b\xca\x19\x4f\xc4\x7e\xec\x2e\x10\xc5\x42\xe4\xa2\xe4\x59\xc8\x50\xf6\x75\xca\x0b\xae\xd2\x8c\x8a\xf7\x45\x09\x1b\x57\xbc\xb3\xa2\x54\x3c\x83\x47\xa4\xa5\xbc\x16\xa5\x61\x7b\x7f\x17\xce\x96\xc0\x1e\xa5\xfb\x8f\x30\x8d\x14\x5f\x64\x13\xce\x0c\x78\xf0\x30\x09\xa0\x30\xd4\xba\x36\x89\xf5\x52\x79\xc0\x22\xb7\xac\x26\x76\x03\x4d\xdc\x86\x80\x13\x13\x84\x2e\xb4\x03\xc2\x68\xa4\xef\x7e\x07\xa8\xc5\x89\xc5\x81\xb9\xa1\x6e\x78\x00\x09\x43\xf2\x9c\xa0\x42\x36\x56\x0a\xf0\x49\x8a\x2e\xde\x57\x32\x31\x23\x03\x52\x5f\xcb\xd4\xab\x41\x90\xcd\x50\x43\x6e\x15\xdc\x44\x95\xfc\xdc\x18\x4d\xcd\x3e\xa3\x35\x42\x73\x14\x94\xa5\x26\xa0\xb4\x8f\x14\xc7\xf1\x2e\x0d\xb0\xac\x9d\xba\x59\xb0\x41\x0e\x44\x9d\x8a\xf3\x6a\x9a\x49\xb3\xb8\x18\x34\xb4\x71\xb6\x66\x60\x4c\x0c\x5c\x49\x2e\xb9\x35\xdc\x61\x84\x32\x92\x9a\x8f\xa1\x9a\x25\x9d\x96\xad\x61\x19\xfc\xaf\xe3\xdd\xa1\xa1\x50\x1c\x5a\x9a\xf9\xaf\xa2\x79\x10\x72\x07\xf6\xd2\x49\xc5\x1b\x55\x34\x3e\x4f\x78\x96\x99\x76\x17\x69\x7f\x90\xa1\x66\xea\xd1\x3c\x90\x2b\xa4\x63\x18\x3f\x7b\xc8\x9a\x41\x29\x16\x60\x4d\xd7\xbe\x98\x61\xb9\xc6\x8a\x7f\xc5\xb4\xf2\x37\x41\x4b\x20\xff\x83\x40\x21\x04\x1b\x43\xa6\xdb\x20\xa0\xe4\x36\xa6\xf3\xf8\x62\x3a\x83\x46\x85\x2f\x42\x7f\x06\x0e\x03\x8f\xa1\xb0\xc9\x77\x99\xe5\xa1\xf0\xbf\x36\x1c\x27\x1f\x0a\x1f\x6f\x2c\x82\x8b\xf3\x3b\xb4\x84\x09\x3a\x8c\xdf\xf6\x87\xd6\xa0\xa0\x8a\x39\xcb\x1b\x04\xd3\x98\x6c\xeb\x24\xda\x49\x64\x12\x87\xed\xbd\x2a\xce\xea\x33\x1d\x8e\x73\xfc\x70\xd7\xb0\x54\x27\x95\xb3\xb9\x6a\xb2\xd7\x09\x13\xfd\xa0\xde\x3f\x2f\xec\xd9\x54\xdf\xa8\x1b\x5e\xa6\x87\xe7\x9d\xaa\x56\x9b\xca\x59\x3d\x56\xac\x7a\xfb\x47\x30\xf7\x39\x9f\xfa\x6e\xff\x01\xfc\x69\x1b\xb8\x6b\x0f\xf1\x21\xef\x1a\xf5\x00\xbf\x5b\x9c\x8e\x6d\x43\x7f\xdb\xd0\xdf\x67\x13\xfa\x73\x23\x35\xdb\xa4\x34\xc4\x0b\x39\x64\x1d\xc5\x3f\x8b\x18\x52\x24\x52\xf1\xf4\x6c\xd7\xc3\xb6\x74\x7e\xdc\xbc\x35\xd7\x45\x76\x82\x97\xb9\xa0\x8e\x7d\x0e\xf1\xa6\x07\x10\x2f\x02\x5a\xf6\x30\x06\xf1\xba\xad\x54\x0c\x91\x5a\x31\xf0\x1c\x45\xb0\x0b\x9d\x3e\x43\xe0\x54\x68\x9b\x8e\x0d\x3b\x46\x04\xda\x3c\x22\xdf\x85\x8a\x1a\x85\x63\x5f\x66\xaf\xfe\x0c\x12\x13\xe8\xc9\x00\x6c\x20\x26\x60\xc0\x08\x40\x9d\xf3\x3e\xdc\xc0\x06\xe3\x08\x77\xd5\x86\x4e\xdf\x91\xda\x0a\x34\x8e\xea\x19\xc1\x24\x0b\x91\x63\xf3\xf0\xe7\x9e\x04\x4e\x36\x3a\xe3\xc1\x0a\x44\x48\x13\x65\x6e\x98\x9e\x8d\x1a\x10\x0a\x3b\xd7\x4f\x77\xfa\xc5\x18\xd8\x70\xe1\x48\xe6\xf7\xd1\x79\xef\xd8\x0e\x6b\x13\xec\xbc\x11\xd2\x71\x7b\x08\x74\x9e\x0c\xfb\x16\xb7\xb2\x2c\xe0\xfc\x40\x0a\x3f\x18\xe2\x3c\x94\x58\xed\x28\x44\x0d\x1e\x81\xf2\xb7\x8d\xd5\x7e\x8e\xb1\xda\xe8\x60\xf4\x82\x8e\x08\x1b\xc7\x6f\xe3\x90\x80\x0f\xe2\x4e\x85\x37\x6a\xc8\x86\xf1\x11\x5c\x1f\xbe\xd5\x65\x33\x35\x69\x77\x32\xd9\xdd\xf5\x41\x5d\xe2\xfb\xca\xce\xc6\x5f\x31\xa1\x12\x9d\x22\xb3\xb8\xf1\x4b\x63\x41\xdd\xab\xbd\x6c\xf1\x5c\x72\xff\xac\x38\xbd\x09\xc6\x1e\x62\xa9\x7b\xcb\x16\x8f\xc6\xf7\xfc\x23\x28\x31\xb5\xea\x12\x30\xff\x88\x44\x01\xd3\x99\x74\x18\xff\xbd\x61\x99\xcc\x25\x35\x0f\x73\x1b\x5d\x18\x6b\xd8\x1e\x7e\x38\x49\x8a\x6a\x44\x37\x4c\x72\x91\xeb\x72\x39\x0a\x37\xb9\x2f\x1b\xbf\xa2\x3b\xf6\xb1\x09\x45\x55\x96\x42\xd9\x6c\xf9\x39\x6b\x40\x9e\x88\x0f\x44\x01\x0a\x6b\xdc\x07\xc9\xa3\xbe\x5a\x35\x73\x21\xe2\x0b\xde\xf2\x08\x63\x3f\x80\xb5\x9a\x51\x08\x49\xc0\xa7\x42\x5d\xb3\x6b\x5e\xde\x13\x3d\x7d\xdd\x35\xa0\xce\x93\xca\x6b\x69\xfa\x76\xf6\x63\xb7\x3b\xa1\xa1\x6f\x57\x65\x8b\xca\x92\x44\xf7\x3b\xd0\x23\x6d\x87\x9d\xd7\x52\x0e\x9f\xee\xf4\x9e\x52\xc1\xad\x15\xa5\x7a\xc6\xfe\x7b\xef\xed\x17\xbf\x8e\xf7\xbf\xd9\xdb\xfb\xe9\xc9\xf8\xaf\x3f\x7f\xb1\xf7\x76\x02\xff\xf8\xc3\xfe\x37\xfb\xbf\xfa\x3f\xbe\xd8\xdf\xdf\xdb\xfb\xe9\xfb\x97\xdf\x5e\x9e\x9f\xfc\x2c\xf7\x7f\xfd\x49\x55\xf9\x15\xfe\xf5\xeb\xde\x4f\xe2\xe4\xe7\x3b\x0e\xb2\xbf\xff\xcd\xef\x7b\x4f\x9d\xab\xe5\xab\x9e\xa2\x10\xaf\xf1\x80\x47\x72\x73\xc4\x41\xd8\xaf\xd5\x5a\x41\x2a\x3b\xd6\xe5\x18\x87\x7e\xc6\x6c\x59\xf5\x13\x26\xf5\xf1\x32\xf4\xfe\xaf\xd5\x80\x1a\x72\xde\x2b\xf5\x1b\xde\xe0\x10\xf1\x3c\x96\x03\x14\x06\x9f\xd0\x48\xcd\x8a\x17\x2b\xf2\x42\x97\xbc\x5c\xb2\x94\xbc\x99\xcb\x35\x80\x3f\x11\xe2\x4f\x6f\x34\x5d\x78\xa3\x54\x96\x1b\xa8\x0d\xee\x0d\xe0\x23\x52\x59\xe5\xc3\x38\xe1\x7f\x04\xe4\x79\x42\xad\xf7\x09\x44\xf8\x00\x1f\xbe\x98\xf2\xe4\x0a\xed\xa5\xb0\x36\xa8\x25\xc6\x20\xd2\x3b\x94\xf7\x90\x0b\xae\x82\x1b\x1f\x32\x59\x74\x2a\xdc\xc2\xf9\x9b\x71\xec\x86\xcb\x1d\xc3\xe9\x94\x25\x58\xf7\x60\xd2\x25\x7b\x09\xea\xce\x46\xd7\x9a\x0d\x02\xdb\x21\xff\x23\x5e\x38\x1d\x6f\x20\xb8\x78\x0d\xc6\x24\x61\x64\xcd\xa0\x8b\x54\x9d\xfe\xd5\x50\x1b\x60\xdd\xc2\x9e\xf3\xc1\x59\xb7\x7a\x6e\x4e\xa8\x78\x82\xd7\x39\x33\x98\x8b\x22\x13\x68\x74\x04\x86\x27\x50\x3f\xac\xd8\x65\xd4\x0d\xb1\x32\xee\x49\x5a\x35\xef\xa9\x1f\x84\x7d\xa0\xa6\xc8\x02\xd4\xdb\xb0\x65\x2e\xbb\x6f\x2e\x3c\x5d\x22\x67\x05\x94\x13\x7b\xdb\xd2\x54\x60\x81\xd0\x53\x48\x8f\xd6\x33\xc8\x96\x88\x1a\xd2\xf8\x9e\x2b\x2b\x7c\xa9\x64\xd6\x64\x4c\xdf\x68\x21\xbc\x78\xa5\x28\x5b\x70\x85\xcb\xd6\x33\x59\x65\x44\x39\x9e\x57\x32\x1d\x8e\xbd\x1e\x9d\x4e\xd1\x53\x93\x18\x4a\x7f\x18\x44\x6b\x18\x5c\x57\x08\xf9\x98\xbd\xcf\xca\x9d\x93\x90\xda\xd9\x38\x2c\xe3\xc6\x10\xcd\x34\x4f\x1e\x1a\x7e\x79\x61\xe0\x73\x09\x2e\x83\x9f\x88\x0e\xd1\x64\x99\x10\xa8\x92\x6c\xf4\xa6\xc1\x61\x71\x4f\x40\x45\xd4\xd8\xfd\x9f\xf7\x27\xf9\x10\xea\x54\xcc\x30\x8b\x09\x7f\x03\x6e\x00\xaa\xe3\x4a\x45\x26\x2c\x94\x65\x09\x55\xb7\xbb\x33\xac\x14\xb9\xbe\x76\xdb\xec\xad\x62\x6f\x0c\x05\xc3\xe5\xec\x19\xe3\xfb\x8d\xc2\x60\xea\xb1\xab\x84\x48\xb1\xb8\x2b\xea\x9a\x57\x56\xca\x8c\xd8\x74\xdf\x27\xab\x1a\x6c\xec\x58\x82\xc7\x8c\xda\x57\x81\x93\xaa\x14\x8e\x00\x00\x0f\x55\xea\x9c\x19\xc5\x0b\xb3\xd0\x16\xfc\x21\xbc\xe0\x89\xb4\x4b\x66\x4b\x9e\x5c\x41\x73\xe8\x52\xd0\xe3\x46\x2c\xd9\xa7\x94\xf5\x98\x7c\xcd\x7a\x33\xbb\x28\x75\x35\x5f\x40\x01\x14\xde\x95\x64\xdc\xf8\xb7\x5f\xfb\x7b\x32\xd0\x0d\x4b\x97\x8a\xe7\x32\x09\x7d\x33\x4a\x7d\x2d\x8d\xd4\x14\xc6\xf2\xe3\x9e\x87\xee\x02\x18\x1a\x3b\xca\xb8\xcc\xd9\x9e\x11\x82\x05\x96\xc0\x6f\x2e\x50\x4d\x44\x37\x61\xd9\x4c\x94\x23\xf0\x44\x42\x08\x70\x9f\xd4\xa2\x37\xe4\x21\xe0\xd9\xef\x66\xbe\xf6\xa1\xfb\x61\xb9\xd6\xcf\x49\x97\x90\xc4\xe6\x3b\xde\x08\x95\xea\x28\xdd\xe5\xf0\xfc\xd4\xc4\xc6\x2b\xf5\x09\xc4\x91\xe0\x8b\x4c\xab\x79\x0c\x2c\x57\x73\xa6\x13\xf2\x0a\x1a\x3e\x5e\xcb\xb4\xe2\x19\x8a\x77\x9a\xcc\xd1\xc5\x29\xfe\x5c\xce\x17\x76\x7c\x23\xc0\xb5\x89\xa7\x60\x9d\x0e\xed\x1f\x2a\x57\xd2\x68\xa5\x81\xe3\xc0\x92\x0b\x0d\xdd\xc4\xd0\x54\x91\x2f\x01\x95\x96\x12\x36\x1b\x99\x36\x1e\x9d\x1d\x87\x58\x47\x71\x98\xde\x61\xe8\x00\xe8\x34\x20\xf0\xfd\x3a\x12\x03\xa7\xae\xce\x0d\xda\x19\xd6\xbd\x24\xc2\xc7\x36\x6a\x27\xea\xb4\xdd\x2e\x86\xeb\x86\xb5\xd4\xeb\x9a\x4d\x2e\x45\x5e\x64\xdc\x0e\x93\x37\xb2\xf3\x63\xe4\xdb\x8e\x22\xc3\x6e\x3b\x72\x95\x8e\x79\xe6\x38\xf2\xfc\x87\x23\xaa\x4e\xc3\x0d\xd6\xc8\x4d\xbb\xac\x9b\x70\xa2\x72\x80\x5a\xd2\xda\xad\x05\x90\x66\x53\x91\x82\x30\xa2\x27\x83\x03\xe2\x46\x61\x57\x56\xf7\xc7\xf9\x0f\x47\x23\x26\x27\x62\xe2\xff\x0a\xb7\x7a\x69\x68\xf5\x1c\xab\x17\x42\x55\x0c\xf0\x33\x4c\x25\xf6\xec\xc6\xbf\xfd\xd7\xd7\x6e\x92\xee\xdb\xbf\x8d\xbf\x8e\xfa\xf8\xfc\xed\x5f\x4e\xb8\x96\xee\x86\xe6\xa7\x71\xf2\x38\xc8\x3d\xf7\xd7\xbf\xce\x75\x7a\x51\x88\x64\x82\xaf\x65\xfe\x45\x2d\xcd\x85\xb2\x4e\xb5\x3e\xd7\x90\x36\x26\x53\xe4\x72\x78\x76\x29\xfe\xed\xbd\xff\xd4\x0f\x94\x04\x49\xc2\xad\x50\x70\x00\xf8\x2a\x61\xa5\x2d\xfe\x1c\x3b\x89\xc2\xfc\xf7\x66\x71\x6f\x4f\xab\x35\x6c\x73\x14\x25\x87\x8a\x89\x77\xd2\x00\x26\x0c\xbe\x2b\x90\x83\x53\x66\xba\x3f\xd3\xdc\xb0\x8e\xc2\x01\x03\x08\x9a\x8b\xba\xb9\xfd\x41\x69\xfb\x87\xb0\xfc\x3e\xeb\x10\x0e\x2e\xcd\xf8\xb5\x06\xdc\x09\x90\xea\x8a\x55\x0a\xdc\xd6\x75\x6f\xbe\xe9\x92\xe5\xd2\x58\x7e\x25\x26\xec\xc2\x9d\x59\x71\xfa\x00\x52\x4f\x31\xe8\xae\x22\x52\x56\x29\x2b\x33\xf8\xb6\x1e\xc7\x4d\x39\x3e\xcb\x4e\x67\xcc\x54\x09\x74\x9f\x2d\xc5\xd8\x9f\x8e\x74\xd7\x8a\x8c\xa9\xdf\x65\x14\x16\x7b\xc1\xd1\x5c\x2a\x52\xf8\x29\xf6\xb2\x55\xc4\x5e\x2b\xb9\xd2\x6e\x9e\x5a\x25\xf5\x89\x08\xc4\x84\x86\xc6\xee\x10\xcc\x7c\x76\x0f\x5a\x6e\x14\x0d\x50\x22\x11\xc6\xf0\x72\x89\xed\x3e\x65\xe8\x4a\x48\x69\xac\x70\x52\xe7\x5c\x55\x30\x40\x29\xb0\x79\x6c\x95\x00\x75\x38\x9b\x96\xfa\x4a\xa8\x50\x1f\xe0\x56\xb1\x99\x24\x5d\xa7\x84\x42\x70\x5e\xb3\x64\xc1\xd5\x5c\xd4\x25\xe0\x39\x4f\x81\xf6\xdf\x07\x4d\xcb\xbf\x8f\xa3\x00\x9f\x39\x85\x45\x5a\x20\xc5\xd4\x9d\x4f\x21\xa6\xf1\x56\x31\xef\x14\x19\xd5\x41\x07\xf7\x4a\x32\xeb\x24\x13\xd9\x30\x5e\xee\xfe\xfe\xed\x31\x28\x14\x1b\x4c\xc8\xce\x85\xe5\x29\xb7\x7c\xb0\xa4\xec\x97\x3c\xb4\xb5\xa4\x8c\x0d\x60\x87\x28\x93\x83\xce\x58\xaf\x4a\xea\x42\xc6\xa0\x00\x20\x0d\x16\x7e\xf5\xb1\x1d\xbc\xe3\x6b\x8a\x28\x62\xae\x35\xe8\x6a\xd4\xe9\x1c\x86\xf7\xa3\xa1\xc8\x12\x29\x4b\x2b\x50\xfb\x6a\x91\xd6\x27\xe2\x3d\x48\x40\xc4\x2d\xf4\x60\x54\xbe\xac\x03\xfb\x49\x33\xf1\x7a\xad\x82\x86\x67\x9d\x50\x56\x62\xd7\x72\x8f\xe2\x40\xc4\xaf\x14\x6e\xd5\xd6\x32\xc0\x3a\xcd\x85\x35\x75\xca\x24\x9e\x26\x4e\x44\xd2\x59\x4e\x4e\x04\x38\x6a\x68\x69\xc8\x0e\x5f\xaf\x29\xe2\xc2\x19\x4d\xa7\x85\x3b\xbf\x36\xbe\x32\xc3\x45\x86\xb0\xbf\xeb\x4b\x9d\xf6\x0f\x31\xb5\x1a\x95\xd6\x03\xd7\x15\x24\x58\x4d\x64\xc0\xc9\x83\x4f\x86\x80\xbb\x69\x60\x5c\xe0\x11\xb0\xe0\xd7\xdd\x7d\xa5\xb5\x66\x3a\x0e\x4d\xc8\xe0\x71\x63\x78\xdc\xf8\x69\x5f\xaf\x74\xff\x94\x44\x7f\xf5\x4c\x4d\x6c\x4e\x68\x80\x30\x84\x13\xad\x17\x83\x44\x09\xda\x9d\x22\xc3\xc9\x4b\x09\x17\x21\xc9\x85\xca\x64\x85\x74\xf2\xf2\x19\xfb\x43\x43\xd7\x22\x9d\x36\xd8\xc1\x58\x93\xb4\xe7\x0d\xe3\x09\x2d\xb9\x07\xdc\x6a\xde\xbe\xdf\x1a\x0c\x94\xbc\xf5\xf6\xa2\xaf\x7d\x0a\x8a\xb7\x53\x92\xa1\xc5\x7c\x28\x3d\x75\x6c\x5c\xea\x2c\xf3\x6d\xc9\xd1\x36\x6e\xa5\x2c\x41\x17\x1d\x0c\x82\x8c\x82\x03\x22\x68\xfa\x4a\xdc\x04\x95\x8e\x1b\xc4\x0d\xf5\x21\x78\x70\x92\xf8\x3c\xb2\x75\xe3\x85\xfa\xac\x43\xb5\xc4\xa9\x1f\x87\xc5\xf2\x8e\x05\x36\x77\x0f\x72\xba\xbf\xe2\xd3\x0c\x13\x6d\x02\xe1\x61\x2e\x3c\xbb\xe1\x4b\x03\xfb\xab\xb6\xd5\xc2\xf3\x09\x45\xbd\x1e\xf8\xb5\x98\xf5\x68\x95\x1e\x5f\x83\x05\xe9\x87\x0b\xd3\x03\x46\x8a\x54\xdd\x73\x6f\xeb\x61\x3a\x74\x97\x6e\x5f\xc3\x45\xfb\x21\xe1\x11\xb2\x9d\x86\x08\x9b\x36\x5b\x00\x9d\x9f\xc2\xc0\xde\x66\x9b\xc3\x1f\xfe\x2c\x0f\xf1\xbf\xa9\x70\xfb\xad\x46\x76\x02\xde\x8d\x7f\xbb\x26\x1d\xac\x66\xfa\xef\xa1\x4d\x10\x05\x5a\x7c\x99\xaf\x3b\x0a\x0e\xcf\x4f\xf1\x89\x13\x68\x04\xcb\xd5\x92\xb4\x2c\xbb\x90\x65\x3a\x2e\x78\x69\x97\xe8\xb6\x18\x35\x9e\x16\x4a\x1c\x07\x20\xc7\xa0\x11\xdf\x3e\x7d\xc4\xe2\xab\xb1\x46\x40\x3e\x5a\x1f\x1f\x22\xbb\x75\x65\x1e\x1a\x45\xfa\x16\x5c\xfa\xab\x59\xd5\x1b\x61\x83\x79\xaf\xc5\xa3\xa0\x48\x1a\x0b\xe2\x61\x4f\xe4\x56\x5e\x0a\x1e\xac\xa0\x2f\x93\x6f\x49\xc7\x05\x60\x41\x3f\x03\x43\xdf\x4d\x6b\xc4\xe4\xcc\x1d\x69\x5a\x8d\xa9\xda\x3c\x38\xc2\x49\xc7\xf3\x09\x9c\x68\xb4\xbb\xcd\x8a\xae\xce\xf8\x59\xf1\x00\x61\x77\xb3\x3d\xa5\x15\xee\x78\xbc\x77\x1f\xf3\x57\x6f\xf1\xe5\xc2\x2d\x13\xf6\xe3\x42\xa8\xf8\xb8\x8b\x9d\xdf\xa3\x70\xec\x4a\x95\xba\xe5\x86\xb3\x10\x6c\x7f\x53\x25\x89\x10\xc1\x5b\x14\x77\x42\xaf\x25\x12\x4d\x39\xe7\x36\x59\x08\xc3\x8c\x06\x28\x50\x63\x79\x96\xd5\x5e\x1a\x22\x97\x06\xcd\xc1\x7b\xcc\x23\x85\xa2\x51\xa4\x4d\x0e\xab\x22\xe3\xe4\x15\x99\x55\x2a\xc1\x0c\x29\x69\x97\x7e\x06\xf1\x09\x0f\x3f\x03\xd3\xd4\xa0\xf3\x46\xce\xd0\x4f\x1b\x99\x98\x81\x98\x20\x52\x97\x28\x44\x9b\x67\x3d\x81\xe0\x39\xf9\x39\xe5\xc9\xd5\x0d\x2f\x53\x03\xf5\xe7\xdc\x4a\x6c\xf1\x37\x6a\x0c\xbb\x17\xcd\xc1\x3d\xbd\xa1\x1b\xec\x07\x43\x16\xda\x3b\xeb\xd6\x63\x18\xaf\xac\xce\xb9\x95\x09\xb8\x68\xe4\x2c\xf2\xba\xe7\xa1\xeb\x42\x88\x9a\xa2\x2c\x87\xd3\x81\x5e\x03\xac\xb5\x12\xeb\x25\xec\x8d\x66\x32\x77\x3a\x17\x87\xf6\xc5\xb3\x50\x6d\xee\xe3\x03\xef\x9b\xa9\x53\x2c\x7f\x84\xa0\x4c\x74\x17\x3a\x7f\x9c\x59\x6e\x60\xf8\x10\x01\x08\xae\x6f\x2a\xab\x1e\xb5\x54\x22\xfa\x8d\xe3\x69\x37\xd7\x88\x55\x47\x6e\x79\x6e\x84\xd3\xb4\xcc\x7b\x19\xd6\x4c\xd6\xcd\x48\xce\x15\x56\xe0\x4a\xe3\xdd\x05\x94\x52\xbd\x97\x96\xba\x28\xc8\xf1\x97\xef\xb7\x67\x04\x71\xb6\xf2\x5a\x18\x88\x31\xfb\x24\x6d\x47\x86\xb9\x50\xa2\xe4\x16\xbc\xf6\x84\x1b\x08\x3b\xb7\xfd\x88\xc6\x86\x99\xb0\xbd\xc3\xac\x58\xf0\x7d\xf6\x86\x9a\xd7\x07\xce\x0d\x39\xdf\x77\xd2\x45\xd1\x8d\x48\xea\xe8\x56\x89\x7c\xef\x30\x5b\x25\x72\xab\x44\x76\xb8\xb6\x4a\x64\xfb\xda\x2a\x91\xf1\x15\xd2\x8a\x87\x55\x20\x5f\x87\x3a\x81\x28\xcb\x23\xce\x9b\xaa\x0b\x09\x6e\xf3\xef\x9d\xce\xd8\x6b\x91\xe8\x6b\x51\xe2\x21\x72\xf2\xae\xe0\xca\x29\x4b\xcf\xb9\xcc\xdc\x11\xe2\x8f\x92\xda\xa3\x01\x3d\x6c\x9a\xfe\xf4\xc8\x89\x14\xd6\x83\x36\x6b\x4e\x93\x22\xcc\x0a\x77\x3f\x45\xed\x8b\x52\x5c\x4b\x5d\x19\x9f\xdd\x55\x59\x14\x16\xc6\x92\x42\xb3\x90\xf3\xd0\x3b\x2e\xe4\x5e\x94\x22\xd1\x65\x5a\x83\x4f\x19\xcb\x6d\x65\x9a\xd5\xa0\x09\x3a\xb0\x87\xf3\x5d\x06\x3a\x3e\xa0\xd3\x73\xc8\x73\x06\xd3\xe3\x06\xdf\xaf\xbb\x2f\x30\xed\x0e\x3f\x9c\x12\x1b\xfa\x4c\xc0\x3a\x0b\xd1\xe9\xbe\x95\x15\x11\xbb\x12\x63\xdd\x7b\x0d\x1b\xc8\x32\x07\xd8\x3d\x7b\x1c\x86\x1d\xd7\x89\x7f\x9d\x9b\x0d\xc6\xd7\x80\xab\xc9\x06\x87\x40\x89\xaf\x47\x97\x27\xd8\xbc\x06\xab\x3f\x60\x1f\xa5\x06\x81\x0d\x5f\x87\xc0\x3e\x7e\x2d\x02\x0b\xb5\x61\xc3\xef\xfb\xd7\xbe\x56\xad\xb5\xf3\xe9\x58\x7a\xdf\xce\x6f\x60\xa1\x85\x71\xa4\x61\x3a\x97\xd6\x0a\x9f\x2d\x12\x76\x32\xf8\xf8\xe3\x5a\x1d\x92\x39\xe0\x4c\xc0\x94\x10\xf1\x2e\x74\x73\x8a\x74\x55\xd0\x38\x6f\xa4\x01\x03\x89\x2b\x67\xd8\x22\x24\x2d\xc8\x8e\x31\xe5\xf6\x7a\x63\x7d\x2b\x87\xfa\x8f\xbb\x95\x43\xf1\xb5\x95\x43\x0c\xda\x62\x65\x50\x18\x32\xa8\x62\x7c\x88\x69\x24\xec\x97\x4a\x94\x4b\xe6\x94\xdb\x3a\x8f\x14\x1a\x5f\x19\x99\x52\x26\x26\x79\x23\xfb\x5a\x94\x0f\x54\xaf\x03\x6f\xe9\xc9\x3b\x67\x1b\x00\x7e\xc1\xe0\x92\xbe\xfd\x80\x26\x0c\x11\xae\x82\x5f\xe2\x86\x45\x30\x21\x9c\xf1\xc8\x46\x70\xe6\xc1\xe1\xd9\xf1\x90\xe6\xfd\x10\xf9\x01\x6c\xb8\x1c\x01\x76\x1b\xa3\xae\x23\x11\x92\x32\x7c\x03\x87\x59\xc8\xe3\x08\xde\x45\x76\x25\x96\x23\x4a\x97\xa2\x4e\x87\xfe\x66\xcc\x3c\x6c\xb6\x63\xe9\x07\xf3\xd7\xbc\x06\x3e\x75\x86\xf4\x07\xe2\xd5\xb7\xfd\x46\x73\x2c\x4f\xdc\x61\x0e\xc2\x81\x0f\xd6\x01\xda\x74\xc4\x57\x83\x49\xa9\x6d\x0e\x24\xd9\x03\xb7\x02\xf0\xbf\x2f\x87\x0a\x0c\x0a\x25\x60\x20\x61\x87\x61\x2f\x36\xb4\x4b\x0a\x2f\xbf\x8c\x1f\x89\x58\x61\x0b\x36\xea\x6e\xae\xc4\x72\xd7\x10\x12\x86\x56\x66\x21\x0b\xdf\xaf\x11\xe4\x24\xed\x4a\xf6\x03\x24\xb8\xf9\x21\x50\x22\x9e\xaa\x11\x3b\xd3\xd6\xfd\xe7\x04\x32\x76\x31\xb0\xa2\x85\x39\xd3\x16\x3e\x79\xd0\xe4\xc6\x57\xfb\x48\xc4\xa6\xb8\x8c\x84\xb8\x0a\xe6\xa6\x43\x2d\xaa\xcf\xe3\x04\xa2\x52\xca\x4e\x58\x18\x69\xd8\xa9\x62\xba\xf4\x54\xb5\xbe\x2d\x95\xa1\x21\xbc\xc7\x3a\x0a\x81\xad\x19\x83\x16\x43\x97\x8d\xb5\x78\xcf\x70\x21\x9a\x26\xfd\x37\xe0\xd1\x86\xf0\x63\x48\x3e\x85\xd6\x48\xdc\x8a\xb9\x4c\x58\x2e\xca\x39\xa0\xa6\x24\x8b\xa1\x97\x78\xa8\x73\x11\xaf\x01\x4f\x47\xbc\x06\xe5\x43\x50\x51\x5e\x40\x5a\xf1\xc7\x51\x7f\x70\x6c\x3c\xae\x73\x5e\x38\x16\xfc\x3f\xee\x54\x06\x2e\xf8\xbf\xd0\x7a\xcd\x4c\xd8\x21\x33\x52\xcd\x33\xd1\xf8\x8e\x7c\x98\xf1\x30\x6e\x04\x67\xb3\xfe\x52\xc9\x6b\x9e\x09\x2c\x03\xe0\x2a\xf4\x4b\xd1\xb3\x15\xa5\x6b\x44\xfd\xd7\x9c\x5c\x0e\x81\xf7\x9d\x2b\xb1\xdc\x19\xad\xb0\xed\xce\xa9\xda\xa9\x01\x98\x1a\x8c\x1a\x94\x0b\x88\xc9\xee\xc0\x77\x3b\x9f\x46\x4f\x7b\x04\xa6\xeb\x60\x3c\x49\x6e\xe6\xa3\x8c\x1b\x33\x04\x16\xcc\xed\xf8\xe6\x17\xd1\x93\xea\xda\x6e\x2a\x25\x19\xdc\x47\x0e\xa5\x8c\x43\x25\xf6\x0e\x40\xe7\x6b\x6a\x1a\xdd\x17\x2c\xae\x7d\xe6\x84\x61\x43\xa9\xeb\x4d\x8c\x84\x50\xe7\xe0\xdc\x42\xf1\x1f\x20\xda\xa1\x67\x71\xaf\x09\x69\xc0\xfd\x24\x7d\xf1\xab\xd2\x96\x49\x95\x64\x15\x05\x3a\xe0\xa7\xe0\xbc\x1a\xc6\x50\x1d\x8c\xbc\x83\x33\xf0\x0f\x61\x58\xaf\x73\xfa\x7c\xa1\x95\x8a\xa6\x76\x6a\x07\x24\xd3\x84\x4c\x09\xa4\xf6\x26\xa9\x35\xeb\x54\xbb\xd1\x6c\x47\x72\xd4\xd4\x23\x9f\xcb\x69\x29\xd8\xd1\x82\x2b\x25\xb2\x08\xeb\x85\x1c\x9d\xdc\x5a\x9e\x2c\x30\x1e\xc7\x99\xdb\xc7\x99\xb0\xbb\x06\xdb\xe0\xe7\x3c\x59\x48\x15\x00\x12\x54\xc0\x3c\xaa\x0b\xc4\x36\xd0\xc0\xa7\xaf\x21\x34\x60\xef\x97\xdd\xdb\x9b\xbf\xd4\xc0\xe1\xb3\xd6\x3d\x35\x82\x3e\xed\x72\xa0\x35\x9e\xb8\xd0\x89\x04\xee\x7d\x7f\xfb\x98\x3c\xb8\xa7\xa5\x9a\x89\xb2\xc4\x35\x99\x0a\xfa\x01\x93\x8d\xde\xae\x13\xea\x29\xb1\xd0\x37\x2c\xd5\xec\x06\xba\x9c\x5e\x3b\xd5\x00\x32\x8b\x8c\x57\x2a\xa2\x99\x42\x9e\x5f\xa2\xf3\xa2\xd4\xb9\x34\xbe\x72\x91\x18\x62\x63\xd0\x26\x59\xd5\x19\x0b\xf6\x36\x00\xcf\xe7\x47\xcc\xf2\x72\x2e\xac\x1b\x9c\xa9\x2a\x9f\x8a\x9e\xd0\x2d\x9b\x86\x09\x1f\xb4\x1b\x47\x44\xa9\x0f\x34\xd9\x60\xaf\xe9\xb9\x08\xaa\x02\x29\x86\x33\x5d\x52\xa2\x64\xf8\x92\xb0\xe0\x1d\xcb\xfd\x40\xe7\x62\xa5\xac\xe9\x09\xcd\xde\xa7\x49\x07\x2e\xff\x8f\x3f\x9e\x0d\x83\xad\xbe\x96\xb7\x6e\x74\x99\xa5\x37\x32\xc5\x24\x14\xc3\xf6\xdc\xe3\xf6\xfb\xbd\xf3\x06\xc1\xd5\x7b\x6f\xe4\x9b\x1b\x99\x7e\x0c\x72\xfb\x7c\x67\x47\x6e\x06\xf4\x96\xa9\x50\xd6\x49\xc1\xd2\xb0\x3d\x78\xec\x3e\x3b\x91\x58\x1d\xef\xfe\x42\xd4\xd2\x7c\x2a\x55\x8d\xbc\x10\x18\x02\x4e\x3e\x27\x17\xbc\x45\x6e\x84\xc5\xba\x66\x28\x0d\xd6\x76\xc1\x8c\xcc\xab\xcc\x72\x25\x74\x65\xb2\x65\x4f\x36\x7e\xac\x4b\x3a\xcb\xc4\x3b\xdc\xcd\xfd\xf5\x97\x30\x54\x53\x8f\x81\x84\xd8\x1a\xcc\x64\x45\x91\xa9\x53\xb6\xd3\x83\xa0\xd4\x84\xe2\x7c\xf1\x4e\x24\x54\xbd\x55\x64\xd5\x5c\x76\x2a\xd4\xdd\x36\x1e\xec\xf4\xeb\xbb\x35\x1e\xac\xdb\xaa\x55\x46\xd4\x68\x62\xfd\x1a\x7b\x3f\x8e\x3e\x81\x1f\x55\x55\xbc\x5c\xdf\x0c\x30\x15\x85\x50\x29\xa0\x93\x47\x3b\x0e\xa7\xbb\x31\x6a\x13\x2a\xf8\xd0\xe7\xc2\xc9\x3b\x5b\x72\x27\xe4\x73\x27\xce\x3d\xf4\xb8\x9c\x31\xae\xfa\x0a\xec\xcf\xa5\x7f\x15\xdb\xea\x8d\xf7\xbe\xcc\xa0\x3d\x2c\x23\x82\x35\x7a\x58\x0e\xdc\xc1\x12\x4f\x3f\xda\xe8\xa6\x59\xec\xb5\xa6\xd3\x24\x3d\xa5\x59\x64\xd2\xaf\xe3\xa4\x59\xd3\x88\xae\x35\xab\x0d\xee\xc9\x6d\xfb\xc9\xc7\xd5\x7e\x72\x06\xf8\x49\xfd\xa1\x82\x9f\xe3\x38\x2d\xdf\x19\x7d\x48\x3a\xe7\x5d\x7c\x65\xb4\xa3\xa2\xe3\x15\xfa\xca\xd0\x40\x84\x46\xc0\x8c\x5b\x8d\xba\x00\xa1\x52\xaa\x9b\xd0\xde\x74\x97\x3e\x6e\xb9\x11\xb6\x8f\x47\x77\xb5\x58\xc3\xeb\x83\x38\x36\x36\xb7\x84\xf2\x49\x0f\x22\xc4\xc6\x7f\x23\xcd\x51\x35\xee\x74\x3a\xa3\x27\xb4\x47\x13\x16\x21\x75\x0b\xc7\x48\xdd\xf2\x26\xdc\xf6\xec\xd7\xde\xe3\x94\xa5\xd9\xbe\x79\x73\x7a\x3c\x08\xcd\xdc\x40\x2d\x9a\x11\x0f\x02\xde\xac\xfc\xa5\x8a\x6d\x60\x40\x3a\x0c\x54\xa2\xfb\x37\x41\x8a\x79\x22\x6a\x67\xfc\xb1\x34\x57\xfd\xc1\xbe\xbf\x3d\x3a\x69\x0e\xd9\xdc\xcc\xdf\x1e\x9d\x30\xfa\xf4\x4e\x3e\xf0\xfb\x38\xc1\xfb\x62\x46\xcf\x13\x51\x87\xc7\x52\x69\xae\x36\x00\x14\xde\xd7\x3c\x2d\xd2\xb3\x6e\x95\x90\x0f\xd9\x9f\xef\xb1\x46\x23\x10\xdc\xa5\xae\xd8\x0d\x61\xed\x91\x01\x77\x29\x8b\x67\xec\x44\x99\xaa\x14\x75\x96\x53\xdb\x96\x73\x3a\xd4\x9d\xcd\x39\x80\x33\x34\xcf\x06\xf3\xff\x0f\xcd\x9f\x9f\x4b\x40\xa1\xe0\xa5\x05\x1b\x6c\x20\xac\x74\x68\x85\x4a\x43\x7a\x22\x7c\x80\x79\x4e\x67\xbe\x4e\x61\x44\x58\x5b\x01\x50\xdc\xdf\xe4\xd8\x25\x02\xdf\x8c\x19\xe4\x79\x00\xbc\x65\x07\xa9\xb8\x3e\x30\x29\x7f\x3a\x82\xc7\xf8\xea\x3a\xdb\x98\x13\x37\x6c\xe7\xe9\xce\x84\x5d\xc8\x5c\x66\xbc\xcc\x96\x8d\xae\x5e\xf5\x7d\xee\x30\xf5\x03\x42\x12\xc8\x93\x1d\xb6\xa7\x4b\x18\x39\xe1\x8a\x65\xc2\xe3\x13\xd0\xf6\x5d\xa2\xf9\xb0\xff\x30\x64\x21\x7b\x30\xd1\x18\x14\x8b\xc3\xb0\xd7\x1b\x3c\xce\x1b\x10\xae\xc7\xf5\x79\x26\x95\x3b\xe4\x26\xec\x0d\x9d\x4e\x74\xec\x23\x0b\xc0\xae\xf5\x77\x3c\xac\x25\x7a\x30\x3e\x8b\x7e\x9e\x88\x55\x47\xc7\x43\x23\x74\x57\x6f\xc7\x5c\xda\xd7\xa2\xd0\x03\xa8\x68\x38\x50\xcb\xb3\x2f\xad\xfb\x40\x1b\x09\x9d\x58\xb8\x65\x1c\x05\x51\x52\x65\xdc\x59\x64\xe8\xd7\x9f\xb0\xe3\x93\xf3\xd7\x27\x47\x87\x97\x27\xc7\xcf\x98\x1f\x49\xc6\x3a\xfd\x84\x5d\xc6\x28\xcc\x51\xc9\x17\x41\xdd\x86\x67\x8d\x48\xb0\x72\x55\xb7\x91\x00\x54\x4a\xae\xd8\xa9\x92\xb6\xee\x8e\x85\x49\xf4\x99\x56\x94\x16\xef\x7e\x4d\x71\x85\xb9\xc4\xe4\x4d\x45\x83\xb9\xaf\x9b\xa3\xc1\x0e\xc5\x5e\x32\x61\x2a\x9d\xbc\x1b\x1b\xd6\xed\xea\xe5\xd9\x84\x95\xe9\x1b\xc1\x0c\xb2\xc9\x2f\x31\x20\x5b\x77\xfe\xc1\x13\x35\x34\x34\xf4\xa8\xb2\xba\x6c\xf4\x1b\x9c\x4c\x76\x27\xcc\x9d\xd5\xbb\x93\x5d\xaf\xca\x65\x2b\x4d\x31\xc3\xa0\x31\x78\x77\x93\xbf\x27\x8c\xbd\xf2\x65\x84\x80\xc6\xb4\xbe\xbf\x26\x42\x10\x46\xdd\x14\x5b\xbb\xc4\x97\xb2\x57\xd3\xf8\xa1\x84\xf6\x3d\x97\xd7\x42\xe1\x8b\x6d\x4e\x30\xfb\xa9\x0e\xb2\x6a\xaf\xeb\x37\x7f\xf3\xfa\xc5\xe6\x5e\x0a\x25\xcb\x20\xaf\x74\xa4\xf3\x1c\x71\xa8\x17\x01\x45\xa5\x06\x42\x09\x52\x6f\x23\xc6\x39\xa2\x6f\xcf\x3a\x6d\xd8\x96\xc4\xf7\x43\xb5\x8c\xf1\xf0\x31\xd5\xf5\xaa\xda\x1e\xba\x7f\x2b\x2e\x82\x7f\x37\x1e\x50\x94\x8e\xcf\x83\xf0\x1e\x07\xaf\x4f\x0e\x8f\x5f\x9e\x4c\xf2\xf4\x11\x0a\x5f\xa1\xd2\x42\x4b\x65\x4d\x57\xc3\xbc\x5b\x4b\xef\xbe\x62\x3b\x4c\x7b\x18\xdd\xec\xc4\x0f\x17\x27\x7a\xfa\x67\x44\x78\xfe\xa9\xb0\x5c\x66\x26\xe2\x30\xab\x0b\x9d\xe9\xf9\xfa\xce\x5e\xf7\x60\x9d\xdf\x21\x22\xec\x98\x8f\x1d\x4f\x6e\xce\x62\xed\xde\x0e\xb8\x49\x51\xdf\xfe\xd7\x11\xb2\xa6\x56\xb0\x04\xa1\x6b\xef\x67\x40\xb0\x4f\x68\x22\xac\x50\x11\x7d\x32\x20\xe2\x7c\xbb\x85\xba\x7f\x41\xd4\x24\xfc\xae\xb6\xc3\x66\x88\xdf\xd5\x6c\x70\xd2\xbc\x6b\x37\xfa\x26\xd5\xbf\xa3\x91\x9a\x87\x48\x51\x8a\x71\x80\x89\x86\x2e\xd5\xba\x8c\x74\xb0\xf8\x4c\xf1\x4e\x5c\xef\xf2\xc5\xbb\xb2\x65\xdb\x99\x5b\x6b\xe9\xc1\x87\x8e\x48\x7c\x59\xb6\xac\x9b\x80\x90\x4b\x8b\xcf\x11\xfe\xb9\xa4\x48\x59\x51\xca\x6b\x99\x89\x39\x34\xf8\x91\x6a\x1e\x61\x18\xc5\xa8\x47\xd4\xf0\xa7\x19\x35\x7a\xe9\xfe\x8a\x9a\xcc\x01\x67\x9d\xbd\xba\x84\x5e\x51\x90\x0a\xd3\xdb\x98\x74\x0f\x84\x86\xda\xe3\xf1\x18\xfc\x77\x7b\xff\x76\x56\x4d\x9a\xed\xb3\x1f\x05\x3d\x47\x43\x33\xab\x12\xba\xb5\x2f\x74\xe8\x2c\x04\x73\xad\x29\x0b\x0c\x8d\xc9\x71\x74\xd7\x81\xbb\xd3\xa9\xcf\x78\x9c\x37\xee\x97\x02\x20\xaa\xeb\x98\xff\x63\xb4\x80\x36\x74\x88\x0e\x2c\xed\x7d\x9c\x68\xdd\x1e\x09\x71\xfd\x82\xce\x05\xce\xcc\x32\xcf\xa4\xba\xaa\x31\xd1\x67\xda\xf1\x31\xd6\xf5\x4a\x75\xe5\x77\x4d\x29\x78\x76\xfb\x89\xd1\x85\x47\x37\x76\x5a\xd8\xc1\x42\x09\x97\xcb\x02\xf3\xd8\x82\xf0\xa2\x24\xab\x58\xd4\xef\xec\x3c\x6a\x8a\x49\x93\x18\xd9\x5f\xbc\x9f\x5e\x1c\x5d\x9c\x36\x64\xbb\x62\xf8\xd9\xa7\x0c\xd8\xdd\x76\xb8\xc2\x4b\x3e\x6a\x0b\x42\xfe\xd2\x2d\xc3\x69\xcc\xb2\xaa\xeb\x2f\x31\x89\xfa\x5c\x97\x96\x67\x1b\x10\x9c\xc9\x82\x17\x87\x95\x5d\x1c\x4b\x03\x50\x85\xc3\xa8\x7f\x37\x0b\xec\xab\xe6\xdb\x48\x48\xcf\xa4\xf8\x0c\x76\xf4\xdd\xe1\x39\xe3\x95\xe3\x3a\x4b\x2d\x73\x36\x96\x9e\xe6\x29\x70\x81\x25\xbf\x1f\xf1\xfd\xe9\x09\x0f\xea\xed\xb7\x41\xe1\x8f\x1e\x14\x06\xb9\xf8\xb9\x04\x82\xa5\x92\x56\x72\xab\xcb\xc1\xa2\x75\x47\x95\xb1\x3a\xa7\x2d\x72\xea\x87\x87\x1c\x27\x50\xb5\x1a\x4f\x6c\x36\x7d\x05\x43\x11\xc8\x7b\xaa\x9c\x59\xc7\x13\xd1\xaa\x33\x19\x41\x57\x1a\x1c\x5b\x86\x7b\xbe\xa6\x6a\x23\x80\x5b\xcf\xfe\xf6\xac\xd1\xb1\x71\xa5\xad\xae\x77\x3a\xd6\x3d\x5b\x37\xe6\x2d\x96\xbf\x0c\x23\x9f\xc8\xb9\x8f\x74\xf9\xdf\x15\xcf\x90\x9e\x67\x9b\xf4\x84\x37\xd7\x71\x90\xd7\xf4\x3c\xe5\xd7\xfd\x2c\x78\xbf\x2a\x83\x88\xf1\x78\x87\x2d\xb9\x32\x8e\x19\x9a\xfe\x85\x5d\x4a\x31\xd8\x65\x7b\x36\x29\xf6\x37\x46\x99\xa1\xaa\x39\xf1\x65\x69\xed\x5f\x84\x2a\xce\x7e\xef\xb5\xf1\xbc\x01\xd8\xc3\xc3\x38\x4f\x1b\x04\x42\x95\x8c\xbd\x90\xc6\xfa\xe6\xb4\xf0\x81\x34\xd4\xcd\x0b\xb4\xef\x73\xa6\x4b\x26\x8b\x7f\xf2\x34\x2d\x9f\xe1\x59\x4f\xd6\x21\xfc\xdb\x04\xf4\x75\xae\x42\xc6\xca\x9e\x5d\x16\xd4\x34\xe2\xf2\xe8\x9c\x61\x13\xea\xaf\xfe\xf2\x04\x34\xf1\x3f\x7e\xf9\x97\x27\x3d\x59\xed\xb1\x56\xc7\xb1\xa1\xbd\x90\x83\xe7\x29\x7c\x26\x35\x14\xa0\x80\x62\xf5\x04\x9c\x6e\x24\x05\x91\xef\x1d\x13\x86\x33\x77\x48\x35\x75\x5b\x6f\xf0\x1b\xaa\x37\x60\xa1\x60\x1c\xe5\xe8\xc7\x92\xcf\x28\x9a\xcf\x1f\x8b\x68\xee\x48\xcd\xae\x9c\xdb\xe4\x58\x94\x6e\xbb\xbb\x26\xce\xe5\x80\x7a\xca\xe3\xb3\x8b\x7f\xbe\x38\xfc\xfb\xc9\x0b\x78\x4f\xca\x86\x77\xac\x48\x66\x49\x97\xdc\xed\xbb\xb3\x76\x77\x4f\x51\x57\x72\x0e\x11\xb1\x3f\x7b\x7e\xd1\x72\xc5\xb9\x4f\xee\x19\xa6\xef\x6b\x5b\xaa\x59\x0f\xea\x3d\xb6\x20\x01\x34\xe8\x16\xe5\x66\x8a\xbb\x07\x8e\x30\x44\x00\xea\x0d\xa7\x86\xe3\x21\x7c\xc7\xde\x7e\x87\x8e\xbc\xc1\x1e\x9c\x1a\xf7\xfe\x60\xb2\xa3\x18\x52\x71\xf0\x30\xf2\x27\xa5\x76\x3f\xf5\xb0\x1c\x0a\x79\x60\xf7\x02\xc6\xf2\x09\x0f\x4e\x84\x61\x1e\x75\xe9\x4e\x54\x77\x96\x0a\x13\x5a\xf9\x7e\x06\xdc\x5a\xac\xeb\x62\xd7\xff\x74\x58\xdb\x1c\x8f\x1a\x38\xfb\x26\x3e\x51\x88\xbe\x51\xbd\x7c\x5b\x2f\x48\x9f\xcb\xc8\xc9\x55\x65\x0a\x9e\x0c\xda\x47\xbc\xfe\x08\x3f\x01\xa0\xb7\xc7\x78\xc0\xc0\xc4\x37\x54\x66\x15\x9e\x3d\xcc\x76\x3c\xf2\xc3\xb5\xc1\x40\xee\xc5\x25\xbe\xf7\x75\xa1\x3d\xd8\x4b\x8c\x1a\xf2\x20\x59\x88\x3d\xb8\x73\xe8\xc7\x8e\x0e\x84\x4d\x3a\x0f\x8a\x85\xb6\x5a\x0d\x5c\x42\x7a\xbe\x66\xd0\xa6\x3c\xc3\x3b\x8e\xea\xa6\xf2\x35\x5f\x60\x85\x4d\x08\x4d\x3b\x83\xc3\x9f\xd8\x5a\xf9\x20\x75\x33\x44\xfd\xf8\x04\x50\x91\x9e\x1e\x6f\x40\xf6\x3c\x7e\x18\x9e\xfb\x06\xe7\x36\x96\x5e\x9a\x0e\x54\x97\x7e\x7a\x4c\xb6\x80\xaf\x3d\x37\xb4\x79\xd8\xed\xbb\x67\x23\x7a\x92\x2e\xed\x8d\x2e\x87\x82\x2f\x3b\x6f\x0c\xd7\xca\x57\xa4\xef\x56\xf0\x24\x3e\x4f\x59\x81\x6f\xf9\xe8\xe5\xc5\x05\x24\x72\xb5\xba\x65\xb6\x25\x44\xa8\xd4\xfd\x08\x42\xe4\xf1\x08\x8f\x41\xb5\x92\x8f\x0b\x1b\xb5\x31\x93\xd6\xef\x8a\x41\x68\xf4\x03\x0d\x46\xae\x4d\xc7\x1f\xb5\xb8\xe5\x41\x18\xd1\x43\x37\x22\x5e\x4b\xed\xc4\x4f\x37\x29\xd2\x3c\x50\xac\xc8\x0d\xb6\xf2\xcb\x32\xb7\x9e\x5a\xc5\x4d\x00\x09\x5c\x6a\xc4\xb0\x8f\x5e\xce\x0b\xea\xa4\x9e\xea\x1b\x75\xc3\xcb\x94\x1d\x9e\x9f\x7e\x7a\x21\xda\xbb\xf8\x11\x77\x41\x1f\x4c\xfa\x06\x15\x01\x85\x7e\x2a\xad\xc1\x6c\x76\xc8\x47\xb7\xb1\x0f\xc9\x1d\x40\x21\x43\xc4\x89\x30\x27\xae\x68\x16\x91\x8e\xa4\x98\x4e\x2c\xcf\x7c\x23\x5e\xea\xe5\xff\xe4\xc9\x13\x0c\x29\x3c\xf9\xaf\xff\xfa\x2f\x06\x5d\x17\x53\x91\xc8\x7c\xf5\x46\xb8\xeb\xcf\x4f\x9f\x4e\xd8\x3f\x0e\x5f\xbe\x60\x3c\x01\x0b\x0c\x21\x55\x71\x64\x58\xbb\xf8\xc7\x66\xc4\xfe\xd7\xc5\xab\xb3\xba\x95\x7d\xf3\x5b\x60\x8d\xdc\xbf\xde\x84\x1d\x47\xe9\xe7\xb1\xcb\x9f\xdb\x05\xa4\xe4\x2b\x6d\x19\x9f\xcd\x80\x39\x51\x24\x4b\xe3\xc5\x85\xc7\x45\x93\xf3\x85\xef\x44\xee\xd8\x2a\x83\xbc\x78\xe9\xa6\x08\x21\x16\x0f\x25\x88\x69\xfe\x30\x56\x38\x1d\x60\x2a\x23\x96\xc9\x2b\xc1\x66\x06\xfa\x91\xd7\x4d\x34\x4a\x61\x9c\xfd\x94\x70\xe5\x46\xc7\xc1\xc2\xd4\xdd\x24\x1e\x77\xee\x42\xcf\xce\xd5\x0d\x86\xf5\x8d\xe1\x7c\x5d\x12\xca\x13\x47\xf6\xc7\x9a\x4b\xd0\xd4\x17\xc3\xfb\x20\x17\x11\x14\x5f\x10\x9b\x8c\x67\x5a\xcd\x63\xa6\xab\xf5\x08\x9f\x80\xb8\x2c\x44\x57\x62\x0c\xd4\x4d\x65\x98\xde\x64\x28\xb9\x5f\xf2\xa2\x5f\x7b\x88\x66\x68\x35\x82\x42\xe4\x53\x5d\x59\x9f\xf2\x86\x4f\x02\x08\x2c\xc0\x48\x44\x82\xf7\x7a\xf0\x60\x8d\x69\x86\x6b\xf5\x36\x50\x9f\xa5\xe6\x41\xdc\x50\x36\x47\x4c\xf0\x64\xc1\xae\xc4\x72\x8c\x22\xbe\xe0\x80\x7e\x00\x74\x3e\x76\xd4\x6d\xf4\x59\xaf\x9b\xed\x3b\x3b\x90\x16\xc1\x67\x26\xd6\x5c\x1f\xd0\x13\xbc\xa9\x64\x48\xa3\xa6\xbe\x45\x2a\x72\x1c\xfa\x46\x85\x89\x56\x96\x9a\x20\x86\x46\x45\x90\x69\xd9\xaa\xb0\x77\x12\x45\xa4\xee\x67\xe6\x7d\x4f\xae\xd3\x31\xdd\x91\x41\xca\x44\xa5\x56\x7e\x0d\x48\xe0\x90\xf7\x6a\x04\xe1\xf9\x70\xdf\x00\x2f\x4a\xe9\x5c\xc8\x04\xaa\x6a\xdc\xed\x74\xaf\xa7\x52\x20\x44\x03\x01\xc0\x08\x5b\x11\x69\x20\x97\xd6\x3d\x5b\x18\xc3\x24\xbc\x61\xce\xcb\x2b\xe1\xc1\x6c\x79\x36\x61\xe7\x6e\x92\x01\xa7\x1c\xfb\xc6\x5d\x63\x11\x84\x93\x29\x31\xb4\x81\x7b\xc8\xee\x64\xb2\x8b\x67\xe1\x1a\xa0\x83\xde\xfc\x32\x64\xcb\xb0\xc1\x5a\x85\x35\xf5\x20\x5e\x18\x6c\x9d\xe6\xac\x03\x68\x4f\xa8\x01\x77\xc4\x2e\xbc\xb6\xc0\x7b\x82\x4f\xc7\xd7\xc0\x3d\xab\x86\x6d\x7b\x39\x5c\xd3\xcb\x1e\x21\xf0\xe6\x35\x74\xb3\xcb\x01\x5b\x5d\x36\x13\x8e\x49\xfe\xd4\x27\xc8\x50\x7d\xf7\x06\x6f\xac\x98\x0f\xd0\xd6\xca\x5f\xb7\x21\x17\xe7\x77\xb1\x2e\x40\xd1\x76\xb2\xfc\x51\x99\x13\xa7\x33\x90\xa1\xeb\xd1\x5a\x22\x2b\x2d\x1c\x29\x8e\x02\x9b\xb7\x23\x86\xe8\x15\xcf\x06\x32\x2c\xda\x57\x7f\x43\xa3\x7d\xf5\x49\x66\x69\x5f\x2b\xfb\x3c\x9c\xa9\x45\x54\x4a\x0b\x4b\x64\x35\xf4\x60\xb4\x41\x18\x4c\xd8\x4b\x3a\x73\x91\xb9\xf9\xd4\xe8\xac\xb2\x01\x56\x61\xcd\x81\x0c\x83\xfa\x8e\x8d\x08\x37\xe4\x6f\x8b\x8e\x67\x50\x4c\xf0\xcc\x1a\xe6\xa4\xc6\x6b\x40\x61\xd3\x37\x19\x15\xaf\xdf\x58\x4a\x2a\x5e\x03\xae\x82\xd7\x0b\x07\x5e\x89\x0b\xc2\x94\xf4\x75\x80\x0d\xed\x15\xd2\x52\xad\x41\xd5\xd8\x2b\xa2\xd8\xf0\xb0\x2b\xda\x72\x7d\xf5\x77\xbc\xd2\xeb\x90\x37\xf0\xf0\xfc\xf4\xa3\x5b\x99\xd1\xb3\xb6\x76\xe6\x9d\xae\x35\x0e\x5f\x00\x22\xf0\x4e\xa0\xe3\x9a\xa2\x14\x60\x73\xf2\xf7\x37\x60\xae\xac\xbc\xf8\x73\x77\xee\x44\x41\xa9\x56\xcb\x07\xf4\xe0\xd6\x27\x54\xd4\x26\xc2\xa7\xcb\x80\x34\xfb\xfc\x4d\x9b\x07\x6a\x90\x00\xf5\x7b\xd4\xbd\xb4\xaf\x76\x62\x29\x11\x91\x5d\x40\xaf\x7d\xf4\x9e\x44\x6e\x98\x42\xa7\xcf\xb0\x69\x33\x57\x4a\x5b\xec\x31\x3f\xc2\x66\xfd\x66\x84\xee\x15\xa7\x64\x46\x89\x56\x65\x14\xc2\x1c\x58\xad\x1c\x8c\x79\xd8\xe0\x0c\xc4\x80\x89\x80\x76\xe7\xc3\x70\x12\xfb\x08\xdc\xe4\xae\x5a\x2b\x19\xb2\xaf\x7a\x33\xdc\x88\xe3\x7b\x26\x32\xc9\x42\xe4\x1c\x1b\x5c\x78\x02\x39\x79\x7d\x53\x4a\x6b\x05\xe2\x5f\x8b\x32\x37\x4c\xcf\x46\xde\x44\x42\xd4\x93\xeb\xa7\x3b\xc3\xf5\xa7\xff\x08\xb6\x32\xf3\x3b\xb4\x2b\x7c\xd5\x6d\x57\xd3\xf7\xdf\xb0\x23\xdc\xee\x04\x83\x39\x83\x8e\x3b\xaa\xe5\x84\x74\x4a\xc4\x35\xd2\xff\x41\x93\xee\xe1\xb9\x19\x46\x41\x19\xdd\xba\x19\xb6\x6e\x86\x21\x46\xfc\x68\x6e\x86\xe8\xe0\xf6\xc2\xf4\xff\x67\xef\xdd\xbf\x1b\xb7\xad\x7d\xf1\xdf\xfb\x57\x60\xa9\x5d\xcb\x76\x2a\xc9\x33\x69\x4e\xdb\x33\xdf\x73\xda\xe5\xd8\x9e\xd4\x37\xf3\xf0\xb5\x3c\x93\x75\x6f\x26\xf7\x14\x22\x21\x09\x35\x05\x30\x04\x28\x8f\xfa\xf8\xdf\xbf\x0b\x7b\x03\x20\x48\xbd\x48\x89\x7e\x4c\x4a\xfe\x90\x8c\x29\x12\xc4\x73\xbf\xf7\x67\xdb\x05\x08\x4d\x0f\x21\xfe\xbb\xb3\x3f\x14\xb8\x0e\x01\x96\xb1\xd9\xf2\xce\xf2\x20\xb3\xb2\xfd\xff\x68\x38\x3c\x3a\x72\xf6\x08\x7b\x3e\x72\x3d\x19\xfc\x91\x30\x11\xc9\x18\x37\x95\x69\x3f\x53\x1a\x84\xda\x42\x01\x0f\xfb\x32\x77\xdf\x0a\x7d\x08\xd0\x76\xbb\x5b\xa2\x45\x0a\xe5\x62\x46\x5e\x3f\xa8\x08\x56\x08\x5e\x1e\xbe\xca\x4e\xa0\x47\xf9\xb3\x12\x58\x11\xc3\x92\xf0\x39\xb7\xb8\x7a\x86\x5c\x30\xa5\x15\x39\xc6\x9b\xc3\x28\xcd\xfb\xf6\x81\xe1\x9c\xcd\x65\xb6\xec\xfb\x87\xcc\x8f\xa5\xb7\xec\x13\x27\x20\xb5\x45\x79\x96\x31\xa1\x93\xe5\xbf\xaf\xfc\xe6\xa6\xf8\x19\x8b\x6f\x7e\x57\x1c\x92\x62\xb1\xee\xaa\xa4\x5d\x78\x60\x7b\x30\xd4\xf9\xd9\x06\x3e\x64\x93\x1d\xfa\xde\x7c\x04\x77\x99\x58\x90\x05\xcd\xf6\x4e\x76\x58\x77\x3d\x88\xc4\x16\xf3\x05\x57\x72\xef\x74\xb1\xb5\x4d\xae\x5a\xbf\xb8\x2d\x04\x20\x73\x9d\xe6\xda\x72\x17\x77\xb6\x1d\xd4\x9c\x3f\xd3\x15\xc1\xf7\x65\xaf\xc5\xce\xa5\x54\x6b\x96\x89\x57\xe4\xff\x1d\x7f\xfa\xed\x3f\x07\x27\x7f\x3e\x3e\xfe\xf1\xc5\xe0\x3f\x7f\xfa\xed\xf1\xa7\x21\xfc\xe3\xab\x93\x3f\x9f\xfc\xd3\xfd\xf1\xdb\x93\x93\xe3\xe3\x1f\xbf\x7f\xfb\xdd\xed\xf5\xe5\x4f\xfc\xe4\x9f\x3f\x8a\x7c\x7e\x87\x7f\xfd\xf3\xf8\x47\x76\xf9\x53\xcd\x46\x4e\x4e\xfe\xfc\x9b\x16\x07\x41\xc5\xf2\x7d\x6b\x24\x18\xaf\xc1\x83\x88\x11\xe5\xb6\x5b\xde\xba\x84\x7c\x1e\x14\xc6\xeb\x01\x17\x7a\x20\xb3\x01\x7e\xe4\x15\xd1\x59\xde\x16\xe9\x2a\xd8\xdf\xc3\xd1\x98\x42\x88\x29\x90\x1b\x9d\x62\xf3\x0c\x89\x08\x46\x8e\x3e\xb8\x35\xd8\x96\x4b\xed\x0c\xc1\x75\xae\x07\x09\x38\xb2\xc8\x30\xff\xe6\xd1\x46\x23\x5b\x91\xb7\x0b\x35\x5a\xb9\xba\x50\xa3\xd5\xab\x0b\x35\x6a\x78\x75\xa1\x46\xcf\xd0\x06\xd8\x85\x1a\x75\x36\xc0\x2f\xc4\x06\xd8\x85\x1a\xd5\xbd\xba\x50\xa3\xbd\xaf\x2f\x33\xd4\xc8\x0a\xf0\x45\x9c\xd1\xb3\x0d\x33\xb2\x05\xfe\xcf\xa2\x48\xe6\x42\xdf\xca\x3b\x76\xa0\x57\xb6\x96\x82\xb9\xf2\xcd\xe7\xa9\x6d\xb6\x25\x52\xb6\x20\x02\xb6\x27\xfc\xd1\x3c\xe6\x46\xcd\x6c\xf9\x18\x9c\xd9\x66\x9d\x9e\x69\xd8\xa2\x88\x59\xec\xbf\xe7\x88\x95\x36\xeb\x3d\x24\x67\x24\x63\x11\x4f\xb9\x21\xed\x00\xa6\x03\xf7\xf1\x9c\xf8\x7a\xc0\x5c\x2b\x96\x4c\x6c\x4d\x54\x51\xe4\x0c\x67\x81\x0a\x69\x79\xc5\xda\xcf\xa0\x54\x20\x5d\x19\x4b\xa2\x66\x32\x4f\x62\x92\xb1\xbf\x39\x71\xc2\xf6\xe6\x36\x6c\x21\x34\x84\xc2\x50\x8a\xcf\xda\xc6\x69\xca\x2d\xea\xd6\x73\x22\x70\xec\x73\xca\x33\x38\x6c\x23\x16\x49\x11\xb7\x6d\xde\xb8\xac\xb6\xef\xd6\xda\x7a\x73\x58\x4c\xe2\x1c\x1f\x80\x44\x48\x9a\xf0\x98\xeb\xa5\x8f\xc2\xc0\x63\x6f\x04\x51\xac\x42\x6b\x37\x82\x2a\x16\x82\xd0\x34\xcd\x24\x8d\x66\x4c\x05\xa3\x41\xb1\xd2\x82\x4d\xf8\xfc\xca\x24\x9f\x72\x81\x92\x25\xbc\x63\xc4\x90\x64\x49\x32\xa9\x5d\x40\xd9\x86\x0f\xde\x06\x8d\xc1\xeb\x28\x4b\xe8\x6c\x09\x51\x67\x32\x6c\x02\x7b\xc5\x27\xe1\x1f\x8a\xc8\x24\x76\xb8\xa5\x7f\x7c\x61\x44\xf9\xc8\xee\x62\x43\xed\x01\x55\x52\x4b\x92\x18\xb1\xc8\x70\x80\xcd\x2f\x7f\xfd\x0d\x99\xc9\x3c\x53\xc3\x10\x42\xe0\x25\xdc\x43\x23\x85\x53\x05\x34\x49\x18\x55\x9a\xbc\x7c\x41\xe6\x5c\xe4\x86\x97\xb7\xb4\xf1\xda\x92\x5e\x03\xb9\xf5\xf7\xdf\x1c\xd8\x5a\x3b\x12\xeb\x6a\x04\x8b\xdd\xad\x29\xd6\x67\xb3\x82\xab\x3d\xe3\x08\x8a\x81\x35\x1a\x2b\x62\xac\x65\x49\xe1\x2a\x0a\x2d\x9f\xf8\xe4\xff\x9c\xcb\xf1\x52\x1f\x0e\x03\xf3\xbf\xb1\x9d\x32\xfe\x8b\xbb\x59\x07\x4b\xb5\x80\x52\xdd\xa3\x2b\x4f\x5e\x2d\x7a\xca\x95\xde\xab\x56\x74\x81\x1b\xb3\xc7\xcb\x87\x32\xf3\xa9\xd1\x78\x5b\x49\x5a\x07\xdd\xd9\xe9\x6a\xce\xa8\x1c\x45\x4c\x01\x29\x72\xf0\x69\x60\x9f\xc5\xaf\xee\xf9\xd1\xe7\x85\xd8\xb2\x15\x91\xc5\x6d\xfe\x16\x2a\x63\x1e\x34\x59\x87\xc8\xf6\x6e\x63\xb7\x34\x5b\xd8\x58\x99\x46\x28\x2e\xa6\x58\xc8\x72\x9e\x27\x9a\xa7\x49\x31\x73\xfe\x05\xcb\x80\x43\x83\x3f\x0d\x2c\xcc\x14\x81\xa3\x10\x1a\x1c\x9c\x23\xc7\xbe\x2d\x26\x34\xd6\x63\xcc\x0c\x1f\x4f\x69\x46\xfd\xf4\x47\x72\x3e\xa7\xea\xc4\xfa\x0e\x28\xc4\xae\x20\x65\x37\x6c\x38\xa3\x89\x1f\x7e\x18\x2b\xf0\x54\x1b\x57\x33\x41\xc5\xde\x4e\xbb\xb2\xc1\x05\x9a\x22\xf2\xde\x87\xc7\x63\xfd\xf4\xca\x8e\xb5\x02\xf1\xb7\x34\xba\x63\x22\x26\x1f\x94\x9b\xb8\x78\x29\xe8\xdc\x82\xab\xa7\x99\xc4\xba\xdd\x2c\xae\xbc\xaf\xfa\xd6\x90\x88\x28\x23\x0e\x04\x0a\xe5\xad\xa7\x9a\xc5\x5c\xb5\x84\xae\xfb\x41\x19\xe1\x6b\x3b\xbd\x53\x68\xa4\xcd\xf8\x22\x62\x4e\x76\x34\x1d\x78\xaa\xc1\x2f\xf6\x46\x7c\x23\xeb\x71\x98\x6c\xd1\x4c\x3c\x85\xc0\xd2\xbd\xf3\x11\x70\xd4\x69\x62\x48\xdc\xd2\xc3\xeb\x54\x36\xd8\x78\xf9\x74\x25\xfb\xb3\xf1\xe1\x00\x4d\x47\x37\xdf\x5e\x94\x89\xd9\x0d\x8d\xa5\x22\xdf\x26\x32\xba\x23\x17\x0c\x94\x86\x87\x2c\xf7\x9e\x8d\xe3\x2f\xbb\x4c\xe3\x9c\x4e\xf7\x8b\xf3\x18\x90\xb9\x14\x5c\xcb\x6c\x1f\x7a\xfc\x8c\xc0\xf6\xba\x52\x7b\xeb\x41\xc4\xb3\x71\xfc\x8b\x29\xb4\x67\x36\x79\x4b\x15\x76\x67\x8c\x64\x40\x62\xa0\x51\x57\xfd\x63\x4f\x82\xf1\xeb\x99\xbc\x1f\x68\x39\xc8\x15\x1b\xf0\xbd\xe3\x94\x0e\x9e\x9f\x3b\xb6\x84\xa0\xaf\x56\x66\xe8\x7b\x6c\xac\xa4\xa2\x6b\x09\x96\x73\xb8\x6f\x04\xb9\x9b\x6f\x2f\x0c\xf7\x1e\x86\x6a\xc9\x29\xd3\xd1\x69\xc4\xd2\xd9\xa9\xed\xce\x17\x3f\xad\x8e\x3e\xb6\x33\xaf\x67\x24\x92\x49\x62\x71\xbb\xe4\x84\x9c\xb3\x74\xe6\x3f\xf1\x3c\xe6\xea\x4b\x2e\x96\x96\x4a\xd9\x4e\x61\xa5\x80\x44\x98\x36\x2d\x85\x08\x36\x7a\x36\x6e\x56\x0b\xfa\x39\x6e\xed\x47\xac\x49\xb2\x4f\x6d\xb9\x67\x31\xbd\xcf\xa7\x46\xdd\xd1\xc8\x35\x07\xf6\x9f\xc0\xdd\x5c\x2e\x49\xe7\xe2\x45\x4b\x24\xfa\x6a\x82\x1a\x66\xcc\x62\x22\x17\x2c\xcb\x78\xcc\x14\xf1\x34\x3a\x34\x2c\xf1\xe4\x79\xcc\x7c\x57\x1d\xef\xcb\x8a\x0f\x78\x3e\x36\x85\x80\x78\x9b\x36\x57\x89\x37\x8d\xe7\x5c\x3c\x8f\x5d\xbe\xe7\x7c\xa9\x88\x26\xec\xea\xfd\xc1\xaa\xf7\x08\xdb\x29\x6b\xdf\xee\x66\x00\xb2\xbf\x03\x78\xfe\x7b\xbf\x67\x89\x90\xf1\x7e\xde\xb0\x27\xd6\xa1\xa7\x54\xb3\xfb\x3d\x05\x9f\x41\x41\xea\xf7\x7d\x1f\x34\xaf\x2f\x5b\x07\x7f\xa2\x02\x19\xc1\xb9\x46\xd4\xfb\xa7\x12\xa7\xec\x0e\x6a\xc7\xb4\xec\xa6\xa2\x52\x5f\xcc\x1d\xcd\xb3\xeb\x2b\xf2\x1d\x7e\xef\xe9\x2a\x7e\x64\x52\xa3\x26\x73\x21\xe7\x94\xb7\x54\x88\x3d\x28\xe8\x14\x0e\xf8\xda\x7f\x8c\xe0\xd7\xc2\x2a\xf4\x13\x3e\xcd\x33\x16\x13\x6b\xfd\xe8\xca\x18\x3c\xe3\x32\x06\xed\x0a\xc5\x85\x4c\x1c\x58\xcc\x5d\x66\x4c\x21\x07\xbb\x5d\x04\xe2\x80\x0f\x41\x22\x8a\x09\xc5\x21\xea\x20\x08\x8c\x03\x61\x19\xe2\xbf\x7d\x1a\x0c\x0a\xce\x7d\xf2\x46\x4e\xb9\x70\xd4\x49\xda\x60\x97\x09\xe5\xc9\x61\xd3\xd9\x49\xba\xff\x66\x92\xae\x52\xc9\xa5\xa0\xe3\x64\xff\x48\xc6\x32\xe3\x4d\x28\xc4\x49\x31\x68\xf3\x34\xe6\xca\xfc\x9f\x8c\x46\x6f\xc0\x37\x9b\x0b\xa7\x19\x82\xd7\xd1\xb2\x0d\x9f\x5f\x8c\xc4\xe5\xe9\xe8\x01\xd2\xec\xd6\xea\x54\x5c\x89\xd8\x0c\x97\xa9\x52\x00\xb0\xfd\x0a\x56\x01\xf1\xd9\x6b\x18\x7d\x38\x66\xe4\x76\xc6\xa3\xbb\xeb\xc0\x05\x2b\x33\x73\x4f\x04\xb7\x4a\x82\x46\xf5\xb7\xa7\x62\x38\x76\x58\xd7\x6d\x99\xbd\x6e\x03\x8e\x3b\xb2\x53\x66\x1a\x27\x54\x29\x19\xf1\xc2\xe7\x0f\x46\xe1\x82\x25\xc7\xc0\x92\x9f\x6e\x1a\x40\x4a\x7c\x10\xf9\xc3\x6d\x1c\x2b\xb4\x52\x15\xca\x1b\x5c\xb8\xd9\x7a\xb2\xa1\xe3\x56\x6e\xad\xba\xe6\x6d\xa9\x9e\xa6\xd3\xfa\x2a\xee\x67\x97\x0f\x6a\x37\x8a\x93\xe7\x6d\x01\xe7\xd5\xad\xe2\xeb\x6a\xda\xfa\x1e\x4f\x32\x59\xfb\x27\x6b\xaf\xb3\xc2\x55\x62\x6f\xf0\x9e\x75\x48\x03\x51\x49\x65\x9a\x27\x18\xb5\x7a\x78\x59\x51\xe7\xcd\xc3\xef\x3c\x81\x83\xfa\xb9\x15\x23\x6a\x9a\xce\xf7\xcb\xa8\x4b\x14\x28\x04\x2f\x7e\xff\xcd\x37\x5f\x7a\xa5\xa2\xc3\x0c\x67\x4f\x5d\xaa\xe8\x20\x57\x57\x87\x52\xd0\xa1\x14\x6c\xbb\x9e\xdc\x13\xfb\xf8\x38\x04\xad\x24\x89\xb5\x91\x20\x76\x28\xd2\xc0\x81\xc9\x65\xed\x24\x96\x1d\x8c\x25\xf0\xa0\x08\x02\x2d\xe5\x58\x1d\x8e\x16\xd0\x61\x04\xfc\x7b\x60\x04\xb4\x97\x5b\xd5\x16\x1e\xc0\xe1\x39\x55\xbf\xfc\xdc\xff\x83\xc9\xc4\xa1\x19\xe6\xcd\xf3\xca\xdb\xaa\x5f\xd1\x96\x9d\xbd\x35\xc3\x40\xc9\xaa\x6b\xf5\x5d\xb7\x33\x30\xf2\xba\x40\x7c\xd7\xd2\x10\x8d\x27\xd4\x76\xc9\xc1\xc6\x02\xec\x8a\xdc\x8b\x07\x97\x77\x0d\xb6\xf4\x7e\x54\x71\xb1\xfb\xdb\xcf\xdf\xb3\xde\xb9\x98\xbb\x32\xea\x9d\xff\xd1\x5f\x1b\xfc\x8f\xaa\x84\xf1\xea\x2c\x82\x40\x09\x41\x04\x93\xe3\xb0\x8e\x4a\x71\xfe\xcf\xae\xaf\x48\x94\x31\x80\x34\xa0\x89\x1a\x92\x35\x12\x9a\xf3\xd4\x58\x89\xce\x49\x66\x54\x6b\x36\x4f\xf5\xa1\x1b\xae\x73\x3f\xfe\x9b\xb9\x1f\x5b\xf6\x19\x7c\xf4\xcd\x39\x6b\xd1\x2c\x9f\x53\x31\x30\xd4\x02\x1c\x91\xa5\x78\x8e\x0a\xe3\x1b\x12\x97\x03\x87\xb3\x49\x33\x86\xe0\xe6\xb9\xe0\x3f\xe7\xac\xb0\x2f\x78\xf1\xe2\x19\xb8\x5a\xa0\x1f\x2d\xcf\x1d\x8a\x4e\x15\x2a\x12\xc9\x95\x54\x26\x3b\x21\x7e\x1e\x1d\xc1\x08\xe4\xaf\x92\xad\x4c\xcf\x18\x8a\x69\xd7\x00\x0e\x50\x3c\x55\xd6\xef\x50\xc1\xa3\x49\x22\xef\xf1\xdb\xa1\xe0\x61\xd6\xcf\xf4\xc5\xe2\x71\x8c\x19\x99\xf3\x2c\x93\x99\x75\xf1\x84\xdd\xc1\xb0\x1c\xa3\x27\xb2\x0c\x15\xae\xcc\x46\x55\x8c\x98\x0e\xb7\x8a\x96\x84\x0a\x4c\x5c\x34\xff\x76\x41\xc9\x58\xff\xcc\xd2\xbb\x31\x9b\xd1\x05\x97\x79\x86\x6f\x6b\x49\x7a\xf6\x27\x60\xb9\x4b\x99\x7b\x33\x77\x0e\x79\x4a\x7e\x74\x6a\xcd\x3c\xbd\x2b\x7e\x04\x05\x35\x96\xce\x7e\x38\x60\x9f\xb9\xd2\xab\x63\x71\x53\xe4\x0a\x24\x3c\xc5\xce\x5b\xa8\xd4\x30\xd8\x8f\x7b\xe7\x9c\x96\xf7\x5b\xd8\x5a\x59\x24\x5d\x8c\xe0\xa7\x5d\x02\xa9\x45\x6a\xc1\x54\x71\x97\x14\xf6\xe5\x85\x7b\xe2\x28\xf7\xac\xcc\xd4\x49\xc4\x5f\x8a\x44\xec\x03\x24\x12\x1e\x2d\xaf\x2e\xda\x91\xf9\x7c\x60\x84\x69\x94\x7c\x4b\x15\x8b\xc9\x5b\x2a\xe8\x14\x8d\x23\xc7\xa3\xeb\x6f\xdf\x9e\x98\x4d\x02\xc6\x97\xab\x8b\xb5\xd1\x13\xa3\xb0\x67\xef\x9e\x2a\x7d\x9b\x54\xe7\xa8\x35\xa9\xa0\xe1\x2c\x3d\x59\x02\x3b\xf1\x9c\xfd\x90\x92\x5d\xab\xe0\x46\x18\x0e\xe1\x90\xca\x54\x95\xbc\x2e\xe6\xf1\xdd\x43\x0e\x37\xb0\x55\x6f\x1b\x53\x3d\x47\x53\x0d\x67\x52\x65\xed\x33\xaa\xd9\x74\x79\xc1\xd2\x44\x2e\xcd\x72\x5f\x07\xa6\x73\x7c\x74\x8c\xac\x3e\x1b\xd3\x88\x64\x79\xc2\xb0\x7a\x4d\x15\x22\x4c\x30\x16\x17\x74\x8a\x0b\xa5\x29\x00\x84\x61\xfb\x5b\x7b\x54\x9b\xc1\xd4\x65\x25\x03\xec\xe7\xce\xa7\xca\x70\x8a\xe6\x40\x6d\x7d\xa5\x3e\x33\x81\xcf\xef\xde\xa1\x4d\x9c\x87\xb5\xdd\x84\xe5\x0d\x0e\x67\xfa\x26\x4f\x0c\xeb\x48\xe2\x4a\x11\x51\x90\xad\xec\x1a\x23\x32\x03\x50\x00\xd3\xfb\x3e\x19\xe7\x46\xf0\x62\xaa\x64\x5f\x5e\x85\xa5\xbc\x9f\xa1\xdf\xd8\xbc\x44\x68\x9a\x26\x1c\xe3\x7a\x65\x66\x9d\xbf\x81\xb5\x71\xf5\xb1\x3a\x84\xa4\xa1\xfc\xd1\x4c\xde\x18\x90\x05\xcb\xc6\x75\x30\x15\x9a\x8a\x12\x34\xe5\xe0\x3b\xa9\x2d\x79\x94\x41\x21\xaf\xaf\xf0\x6d\xa7\xa9\x85\xaa\x99\xfb\x11\x57\xd0\xae\x8d\x03\x14\xb4\x55\x69\x50\xdb\xf0\xa8\x40\x67\xd7\x57\x08\x43\x65\x81\x81\x0a\x93\x85\x91\xed\x29\x06\x07\x16\x68\x84\x74\x6a\x5a\xd4\x44\x0a\xff\x51\x26\xf2\x39\x43\x30\xa1\xa2\x9c\x95\x51\xf8\xc4\xb2\x68\xbd\xb0\x78\x18\xfd\xa4\xbe\x38\xd1\xdc\x8d\xde\xd0\x6d\xde\x98\xf3\x08\x29\x6e\xec\x30\x3f\xdc\xbc\xd9\x6f\x11\xdf\x95\xdb\xb0\xe0\x31\x0c\x70\xf2\x52\x9a\x69\x4e\x13\x92\x67\x89\x73\xc3\x61\xd0\xbb\x0d\x4b\x9b\xd1\x45\x00\xb0\x33\x24\xe4\x2b\x5c\x39\x3b\xb1\x78\x3e\xb1\xbc\x2b\xae\xfc\x24\x4f\x92\x3e\x99\x70\x41\x0d\xd9\x65\x29\x09\xdd\x41\x23\x2e\x22\xa3\x7e\x19\x5d\xdf\xd6\x6b\x81\x1e\x39\xa5\xcc\x1f\x52\xf0\x32\x82\xb7\x94\x25\x31\x80\x2e\xc2\x27\xcc\x81\x8d\xc0\x44\x60\xb4\xc6\xf3\x24\x57\x9a\x65\x37\xd2\x30\x83\x20\xae\x05\xe0\x28\x68\xf8\xf3\xb7\x5c\xc4\x10\xc2\x74\x03\x8c\x23\xa2\x82\x30\x0e\xc6\x17\xd3\x24\xf8\xa9\xcd\xde\x29\x36\xd4\xb1\xca\xa3\x99\x19\x52\x2f\x95\xb1\xea\x19\x32\xd2\x43\x13\x9d\xea\x9d\x98\xbf\xaa\x63\xc0\x30\x95\xe0\xbd\x53\x9a\xf2\xde\x49\x9f\xc0\x04\x81\xe3\x4c\xea\xd9\x97\xbb\x0f\xdd\x58\x41\x27\xde\x6b\x17\xde\x84\x2d\xc0\x1e\x14\x45\xf5\xaf\xfb\x19\xd7\xcc\x17\xdf\x46\xcb\x8e\xc7\x57\xa9\x12\x6b\x42\xce\x04\x61\xf3\x54\x83\xb5\x98\xcc\x19\x75\x2e\x64\xb6\x60\xd9\xd2\xe8\xe4\x00\x44\xf1\xc5\x1f\x7e\xbf\x1f\x0f\x9a\xf0\x4a\x65\xf3\x62\x93\xc3\x09\x5b\x99\xdc\xa3\xaf\x8e\x4a\x7a\x7e\x92\x04\xd4\xfc\x8b\x9d\x4a\x60\xaf\x7b\x4d\xe3\x47\xf3\x66\x79\x0a\xf1\x16\x52\x4b\x4f\x3f\xde\xbc\xb1\x8e\x0c\x9c\xab\xef\xb9\x88\x95\xaf\xb5\x67\x63\xa0\xed\x7c\xaf\x9d\x64\xe8\xe1\x97\x38\xc1\xab\xe2\x6b\x5d\x91\x73\x4b\xf3\x4e\x62\xdf\xd4\xd4\xd6\x06\xac\xd8\xff\x56\xc6\xeb\x8f\x4e\x25\xff\xa3\x78\xd8\x0a\x24\x41\xfd\x4a\xd7\x96\x15\x55\x97\xe9\x5a\x79\x7e\xfb\x72\x6c\x99\xfa\x4d\x3d\x29\x2c\x00\x40\x27\x83\x5f\x6e\x97\x29\xb3\x78\xda\x64\x92\xd0\x69\xb1\x8d\x80\xea\xa1\x90\x74\x3e\xfa\xe8\x86\xa0\x08\x5f\x2f\xae\xee\x94\x67\x77\x49\xb0\x83\x62\x96\x36\x3e\x61\x3e\xb2\xf6\xc7\xdd\x62\xac\x6f\x7c\xf3\x6e\xaa\xe3\xdc\xd3\x5b\x0d\x67\x9b\xe6\xff\xd6\xe2\x78\xd1\x60\x27\x38\x98\x30\xa7\x54\x42\xbc\x11\xc8\x21\xa3\x8f\xa5\x6d\xb2\xa3\xbf\x1b\x36\xed\x1d\x5b\xde\xcb\x6c\x3d\xe6\xf7\xde\xfb\x6b\xeb\x17\xb1\x06\xff\xce\x03\xf2\x96\xa6\x66\xd8\x45\x34\x27\x6a\xde\xd6\xb7\x88\xb2\x3f\xc6\x61\xb9\xd8\x37\x99\x4d\xa9\xe0\x7f\xc7\x10\xd8\xc8\x9c\x63\x99\x99\x3f\x8f\xd1\x3f\x81\x7a\x7b\xc2\x22\x7d\x62\xf7\xdf\x5a\xba\xb7\x63\x83\xd2\x38\xe6\x28\x3d\x5c\xef\xd8\x4b\xdb\x27\x81\x8b\xbb\x87\x98\xf3\x2d\x07\x6b\xf7\xde\xdf\xee\xe0\xac\x41\x9b\xf3\x6c\x4b\x0c\xd3\xd6\xf7\xe7\x94\xdb\xba\xad\xcf\x6e\x56\xd8\x9c\xf2\x7d\x87\x85\xd7\x01\xf3\x3a\xa7\x3a\xcf\xb8\x5e\xcb\x90\xb6\xbf\xc8\xc5\xf7\xf9\x98\x59\x9f\x6e\xe3\xd7\x05\x84\xe8\x9d\x5d\x5f\xb5\xbb\x1c\xab\x20\xd2\xb6\x83\x46\x6e\x21\xb9\xa0\xf3\x31\x9f\xe6\x32\x57\xc9\x32\x34\x4a\x52\x70\x49\x1b\xa5\x1e\xad\x32\xe2\x48\x13\x2a\xa4\x58\xce\xed\xa3\x22\x4a\xf2\x98\x95\x5a\x04\xcf\xdd\x42\xf2\x98\xd0\x5c\xcb\x39\xd5\x3c\x22\x91\x64\x59\x04\x5e\xbe\xb0\xa5\x5c\x31\x42\x37\xbc\x1b\xe5\x4a\xcb\x39\x99\xd3\x4c\xcd\x68\x92\x6c\x5a\xe3\x16\xb8\xda\x36\x98\xec\x01\x8c\x7f\xe3\x8f\x0b\xec\xf5\x9e\xfb\x7b\x07\x2a\x78\x8d\xfd\x6d\x3a\x77\x50\x03\x8b\xcd\xbb\xb4\x46\x1b\x36\xf1\x7d\x2d\x28\xcf\x8e\x85\xd9\x35\x3b\xdb\x4e\xee\xce\x71\x6d\xa1\x86\x5b\xdf\x85\x00\x59\x16\x5f\xcd\xe9\xb4\x86\x20\xf9\xc6\x68\x07\x54\x2c\xdd\x6b\x88\x15\xa9\xfa\x44\x66\x36\xd2\xc3\x57\xde\xb6\x3f\x79\x98\xd1\x8c\xbc\x07\x67\x9a\xcc\x6c\xc8\xb4\xdd\xa5\x10\x40\xcf\xb2\x89\xcc\xe6\x46\xae\xe3\x19\x99\xe4\x02\x8c\x64\xca\x46\x58\x83\x4a\x62\x6d\x35\x34\x51\xd2\x9f\x40\xf0\xce\x09\xd7\x09\x42\x15\xb9\x67\x49\x32\x24\x67\x49\x62\x41\x2c\x03\x00\x84\x22\xb1\xb9\x88\x03\x18\x2f\x49\xcc\xa7\x4c\x69\x72\x3c\xfa\xcb\xd9\x09\x70\x6d\xb0\x63\x2c\x89\xa6\x2e\x1b\xac\x6c\x9f\x01\xfe\x1f\xe7\x20\x27\x44\x54\xd3\x44\x4e\xd1\x15\x0e\x76\x5a\x11\x93\x34\xa1\x4b\x80\xa2\x4f\x69\x06\xe1\xa0\x11\xda\x68\x48\x96\x0b\x00\xe1\x7d\x54\x8e\xb3\x9b\x14\x6c\xc3\xc9\x1d\xc0\x9e\xdc\xf3\xa8\xef\xc0\x26\x7d\x58\x56\x96\xb1\x34\xa1\x1b\xac\x0a\x5b\x92\x7b\x8d\x98\x0b\x2a\xac\x14\xcc\xb7\x31\x24\x23\xdc\x3b\x73\xaa\x23\x74\x54\xfe\x75\xce\x34\x8d\xa9\xa6\x43\xa3\x0b\xfe\xb5\x9c\x7e\x26\x93\xd8\x34\xb4\x79\xa1\x37\xf4\x19\xe5\xc5\xf5\x25\xd7\xcb\xa7\xd0\x08\xb5\xfe\x71\x90\xcf\xdd\x79\xdc\x6a\xc6\x38\x90\x3e\xc1\xf0\x2f\x3f\x1b\x55\x6c\xab\x0f\xad\xd4\xd7\xea\x4b\x65\x2b\x43\x52\x1e\x89\xdd\xad\x73\x06\xe8\x87\xb7\xb6\x6a\x8f\xbb\x03\x26\xd4\xb3\x77\x17\x9b\xcd\x5d\xbb\x4d\x06\x3b\x4c\x04\x65\xc7\xc0\x96\xee\x39\x03\xb3\xfd\xa5\xec\x1d\x70\x29\x28\x90\xa5\x87\x09\x1d\xd4\x41\xa4\xb8\x87\x71\xc1\xca\xf9\x85\xf8\xde\x66\xfb\x48\x2d\xf7\x4c\x1d\xa7\xcc\xae\x74\xae\x81\xef\xec\xc6\x87\xea\xf9\x68\x76\xa6\x5c\x95\x26\xdc\xe6\x34\x42\x0a\x25\xcc\x3c\x24\x66\x38\x13\xa9\x9f\xec\xba\x3e\xad\x9a\xf6\x1d\x37\xd4\x06\x1d\xf5\x4b\x59\x0a\x16\xba\x63\xcb\x23\x65\x33\x4e\xa4\x50\x33\x9e\x62\x4e\xa0\x75\x43\xd8\xd5\x25\x1f\x69\xc2\x63\xdf\x04\xee\xea\x2b\xd1\x27\xef\xa4\x36\xff\xbb\xfc\xcc\x95\x46\xf5\xf3\x42\x32\xf5\x4e\x6a\xb8\xd3\xca\x50\xb1\x0b\x0d\x06\x6a\x15\x60\xb4\x64\xc3\xb9\x0a\xd4\x64\x37\xa0\x2b\x4b\xf6\xdc\xa4\x70\x45\xae\x84\x91\x08\xec\x88\x7c\xae\xac\xb2\x4d\xb8\x74\x10\x21\xc5\x00\x6c\xdc\x6b\xdb\xb0\x13\x21\xb3\xd2\x3c\x6c\x69\xce\x36\x85\x41\x7b\xf0\x0b\x57\x8e\x88\x7b\x9e\x4d\x9d\xd9\x8d\x47\x64\xce\xb2\x29\x78\x6d\xa2\x1d\x5e\x8b\xba\xa6\xc8\x5a\x06\xc8\x9d\x6b\x05\x24\xf3\xcd\x46\xc3\xc5\xca\x22\x05\xcf\x23\x59\x9a\xa3\x35\xe3\x1f\x86\xfa\xc0\x4c\xfd\x0b\x12\xa6\xd5\x90\x9c\xb9\x92\x28\xe1\x6f\xd6\x7b\x15\x36\x63\x5a\xe0\x8a\x18\x52\xb2\xa0\x09\x43\x7c\x78\x2a\x7c\xae\x93\x9c\xac\x10\xf6\xbe\x4d\x9c\x36\x67\xd6\x8b\x4c\xbd\x3b\xb6\xec\xf5\x57\x96\xb6\x77\x25\x7a\x45\xa2\x5b\x69\x31\x3d\x11\x05\x69\xab\x07\xbf\xf5\xf6\xe7\x05\x5b\x89\x65\x7d\xf3\xca\xce\x75\x53\x77\x7c\xbd\xfb\x79\xad\xb0\x71\xac\x4e\xcc\x14\x82\xcb\x37\x23\x73\x99\x81\x39\xd3\xdc\x0d\xe1\x32\x8c\xa8\x7a\xc7\xd3\xb4\x40\x17\xc9\xd3\x69\x46\x63\x46\xa6\x19\x4d\x67\x4d\xc5\x12\x94\x6d\xd6\x35\xff\xc5\x08\xba\x1b\x26\x7f\x8b\x46\xb7\xf5\xbd\x7b\x36\x9e\x49\x79\x07\x59\x69\xb0\x11\x1e\xd0\xfe\xf0\x03\x7e\xeb\xa2\xb8\xe7\x54\x49\x45\x62\xa6\x29\x4f\x20\x96\xe3\xfd\x9b\xb7\x36\xda\xc3\xf1\x71\xd7\xcb\xf5\x81\x13\x2d\x28\x00\x34\xb6\x51\x48\x37\x6c\xc1\xd9\xbd\xb5\x4a\x6c\x8a\xd3\x18\x90\x29\x13\x10\x9c\xb0\x25\x88\x67\x40\x14\x8f\xd9\x25\x24\xbb\x6e\x6e\xe8\x00\xc3\xf9\x86\x3e\xef\x3a\xbc\xdb\x29\xf8\x4e\xea\x5d\x83\xcb\x7a\xf5\xf7\x5a\x66\x5b\x80\x75\xea\xe5\xde\xd6\xcb\xab\xb5\xd1\xdf\xaf\xc8\x37\xdf\xfc\x6e\xe3\x43\x73\xfa\x99\xcf\xf3\xf9\x2b\xf2\xfb\xff\xf8\x8f\xdf\xfd\xc7\xe6\xc7\xb8\xc0\xc7\x5e\x6e\x1e\x9f\x3d\x6d\xe7\x37\x17\xcf\x60\xbe\x63\x1f\x4d\xb7\xdd\x29\x57\xa3\xa9\x09\xe5\x49\x9e\xd9\x90\xcf\x9a\x2a\xc2\xeb\xf0\x1d\x70\xa8\x14\xc9\x0a\xd4\xb5\xe8\x82\xbd\x6c\x10\xd8\x84\x0b\xa6\xa0\xf4\x48\x2e\x32\x16\xc9\xa9\xe0\x7f\x67\xb1\xab\x3c\x02\x81\x1d\x00\x60\xee\xb6\x38\x61\x22\xc6\x9a\x8f\x86\xe7\xcd\xa8\x88\x93\x6d\x0e\xff\x1a\x23\x0d\x4f\xf0\x41\x53\x06\x9c\xa7\xd1\x84\xbd\x2d\xde\xa8\x4c\x17\x54\xae\xb4\xee\x27\xe4\x68\x38\x6d\x07\x8d\x14\x09\xe3\x68\x8b\x62\xbd\xa6\x8f\x2b\x7a\x1f\xaa\xac\x70\xef\xe7\x9c\x65\x4b\x48\xcc\x28\x04\xfb\x20\x10\xec\xb6\xc8\xdb\x77\xc3\xb0\x12\x15\x22\xa5\x54\x74\xe1\x42\x88\x29\xc2\x3d\x2a\xdf\x86\x77\x18\xba\xcf\x9d\x23\x89\x9c\x11\x91\x27\xc9\xa6\x47\x85\xdc\xe6\x72\x0a\xe7\x6e\x87\x2a\x59\x4f\xc7\xab\x6b\x16\x58\x33\xd3\x8f\x6a\x1c\x08\x07\xde\x92\x28\xff\xbc\xcd\x05\xe1\x80\x6b\xc5\x74\xd6\x8f\xe7\xac\x87\x07\x53\xc3\x8c\x80\x57\x93\x80\xcf\x9a\x28\x2e\x0f\x69\x58\xc0\xab\x51\x7c\x4e\x3d\x23\xc3\x9a\xae\x3f\x3b\x53\xc3\x1e\x83\xaf\x63\x76\x58\x33\xf4\xce\xf8\xb0\x32\xe1\x75\xa3\xa1\x1a\x44\x42\xd5\x5c\xc9\x1a\x46\x09\xbc\x3a\xd3\x44\x23\x4e\x54\x83\x30\x37\x33\x53\xd4\x5e\xd5\x8c\x71\xb1\x90\x88\x82\xdc\x48\x86\xbb\x59\x79\xb1\x22\xca\xdd\x03\x65\xb5\xb2\x9c\x17\x7e\x43\x91\xd6\x28\xb4\x24\x57\xbb\x8d\xdd\xdb\x47\xb0\x3d\xf7\xa3\x15\x1d\xa4\x3c\xf2\x3c\x61\x3f\x70\x3d\x7b\xef\xd0\xce\xed\xae\xd6\x79\x9a\xc0\x60\x83\x1f\xcc\x16\xba\x29\x24\xc3\x2b\xac\x90\xc5\x22\x39\x9f\x33\x11\x63\x10\xd1\x9c\xde\x31\x52\x14\x5a\x34\x32\x1e\x88\xc1\xd0\x1c\xfb\x9c\x52\x51\xc8\x89\x0b\x43\xcb\xb7\xed\xa8\x9a\xfb\xa9\x2e\xaf\xad\x9d\x54\xb1\x3d\x99\x22\xc8\x86\x28\x25\x4d\x90\x31\x4b\x24\xa4\x4e\x63\xa4\x28\xc6\x32\xdb\x47\x81\x24\xdb\xbb\x96\xeb\x59\x64\x45\x26\xa6\x05\x8e\x93\x4a\xa0\x08\xaa\xa5\xc0\x52\xb0\x21\xb9\xb1\x22\x4c\x3d\xa9\xa8\x0e\x39\xad\x49\x4a\x6b\x33\xc4\x02\xfb\xa0\xf1\xcc\xba\xf7\xc2\xb9\x5d\xb8\x7b\x75\x66\xd7\x3d\xfc\x4b\x9e\x5f\x5f\x89\xa0\xd9\xf4\x96\x8f\x74\xc1\x15\xfc\xdc\x56\x88\x57\x84\x25\x76\xc1\x54\x37\x20\xe7\x37\x97\x67\xb7\x97\x7d\xf2\xe1\xfa\x02\xfe\x7f\x71\xf9\xe6\xd2\xfc\xff\xfc\xfd\xbb\x77\x97\xe7\xb7\x46\x8e\xf8\x0a\x71\xd6\x8d\x1a\x67\x66\xd7\xf0\x23\x59\xa6\x16\x54\x2c\xc9\x24\xd7\x86\x1c\x14\x1f\x2b\xf5\x82\xa2\x0d\x80\xc6\xb1\x51\x19\xbf\xb8\x35\x5c\x3f\xe1\x55\xb3\x49\x58\x4c\x02\xa1\xe9\x6d\xb2\xd4\x6e\x31\xa9\xf6\x26\xa9\x9d\x75\x50\xea\x72\x6f\xcf\x74\x83\x4f\x82\xbc\x96\x19\xb1\x75\xb4\x5e\x91\xa3\x54\xc6\xea\xc8\x26\x75\x98\x7f\x0f\xf1\xd6\x69\x22\xa7\x47\x3e\xd7\x83\x91\x44\x4e\x89\xca\xc7\x3e\x07\x07\xb8\x29\x3c\xfd\x95\x7b\xac\x94\xba\xd0\xf7\x89\x38\xc1\x5b\xbe\xf1\xd2\x3b\xe1\x03\x61\xbb\xa7\x50\x44\xab\xf4\xa4\xb9\x51\x6d\xf0\xab\xd3\xf5\x3d\x70\x82\x13\xcf\x2a\x6f\x7c\x12\x66\xbb\xde\xf3\x24\x8e\x68\x16\xaf\xec\x59\x60\x6e\xb8\xe4\x30\x7b\x88\x4b\x8b\x35\x88\x8b\xc6\x2d\x38\x85\x5c\xb0\x2c\xa1\x29\x46\x88\x03\x30\x30\x84\x1e\xc1\x47\x2e\x58\xca\x20\x0f\xca\x55\xc5\x66\x22\x4a\x24\xe0\x60\x20\x67\xec\x97\x87\x8e\xa1\x48\x0e\xf4\xcf\x26\xd3\x14\x27\xa4\xf7\x6c\xc9\x1c\x84\x19\x37\xda\xbd\x18\x98\xbc\x11\x4c\xc5\xe7\x6d\xa0\xd2\xe8\x25\x5f\x46\x7a\x36\xcb\xac\xd7\x27\x3d\x8f\x17\x12\x5b\x29\xb9\xf7\x55\xaf\x78\x20\xcc\x53\x02\x21\xd9\xba\x84\x06\xf0\x9d\x30\x9b\x11\x16\xd8\x39\xae\xfc\xa7\x0b\xcc\x17\xc3\xda\xac\x11\x0b\xfa\x50\x6e\x68\x58\xea\xc8\xca\x57\x8b\x14\xbb\x9d\x5f\x34\xdd\x0f\x5e\xd7\x90\x8e\x8e\xa9\x7a\x76\x72\x32\x66\x56\xc3\x05\xa4\x8d\x4a\x9b\xc7\x3b\xde\x42\x50\x1a\x9e\x91\x94\x66\x46\x15\x71\x4f\x96\xeb\x71\x7d\xb5\xb3\x1a\x57\x8d\x4d\x10\xf8\x57\x6a\x4a\xed\x23\xff\xc6\x79\x42\x95\x5a\x63\x79\x05\x42\x60\x1a\x26\x0c\x5b\x26\xd4\x39\x9f\x00\xe4\x79\x46\x17\x5b\xe0\x08\x6a\x74\x5a\xd3\x6c\xca\xf4\x76\xcf\x08\x15\xcb\xf7\x5b\x61\xc8\x06\xb5\x81\x4b\x07\xf5\x4e\xd3\xe7\x41\x01\x7a\x35\xe0\x42\x0f\x64\x36\xc0\x57\x5e\x11\x9d\xe5\x9b\x7c\x5c\x9a\xcf\x99\xcc\xf5\x88\x45\x52\xac\xcf\x68\xb0\xcf\xb5\xe6\xea\x69\x90\xe6\x61\xbd\x8d\x67\x4e\x8c\x70\xb9\x1e\xa1\x91\xbd\x90\x31\x9c\x87\xb1\x0c\x82\xf2\xfe\xcd\xdb\x43\x16\x9b\x40\x1a\xf3\xf6\x95\xfc\x68\xc9\xbe\x98\xfa\x9e\xda\x9e\x6f\x7d\xed\x6d\xae\x9b\xbf\x74\xee\x3d\x57\xdb\x9f\xb6\x93\xb1\x1d\xf8\x62\xe3\xf8\x95\xa6\x3a\x5f\xd9\x0d\xa5\xb5\xb1\xc4\x72\x84\x29\x65\x56\xa6\x1f\xc1\x7b\xa1\x91\x6f\x35\xff\x1f\x71\x64\xe1\x39\x17\xac\x38\x24\xf6\x45\x73\x3e\x75\x46\x39\x2a\x90\x34\xd2\x39\xe4\x26\x53\x6d\x03\x1b\x2d\x7c\xcd\xaf\xd6\x0d\x63\xad\xca\xb8\x4d\x4d\x8c\x58\xa6\xd5\x1b\xaa\xf4\x87\x34\xa6\x1b\xb2\x97\x2a\x01\x8b\x4a\xc3\x81\x41\xc1\xfa\x5e\xb0\xd8\x50\x78\x3b\x05\xd8\x1e\xb9\x37\xa4\x37\xc7\x16\x9b\x7a\xf2\x8b\x03\x64\x5e\x1f\x98\x4f\xad\xef\xf5\x8d\x34\x73\x72\xb6\x96\x00\x95\x43\x35\x76\xf5\xd6\xb0\x93\x0c\x5a\x23\x82\x7d\x5e\xa7\x71\x1f\xde\xe3\x84\x51\xb1\x3e\x5c\xbe\xb2\xa3\xe0\xb9\xe6\x7b\xc8\x7e\x80\xdc\xcf\xb8\x11\x59\x31\xcb\x4b\x11\x27\x42\xc5\x2c\x61\x1b\x92\xbd\x0e\x0c\x25\xb5\x5f\xb8\xb0\x1f\xa8\x15\xe6\x74\x5d\x7e\xc7\x1b\xf4\xad\x10\x6e\x93\x27\x0a\x61\xd9\x4a\x0f\x5e\x6b\xaa\x8e\x0a\xc4\x97\x71\x22\xa3\x3b\x04\xf1\x82\x7c\x7e\xfe\x77\x96\xb9\xb8\x73\xee\xab\x66\xd9\xca\x4e\x53\x57\x75\xd2\xcd\x9b\x2b\xef\x03\xad\x98\xb6\xcd\x04\xfa\xf6\x65\x56\x58\x16\x73\x61\xb3\xe7\x1e\x27\x74\xd5\x29\x2a\x10\xaf\x5f\xf2\x1c\xac\xea\x2c\x88\x1d\x02\x18\x83\x56\x65\xa4\x73\x9b\xdd\x72\xfa\xfd\xe6\x4c\x90\x56\xc3\x51\xb7\xe5\xa3\xe0\x13\x30\x7d\x22\xda\x0a\x35\xb3\x35\x73\xa5\xae\xe5\x6b\x47\x86\x0a\xa9\x2f\xa4\xfb\x2e\xd7\x69\xad\xd5\xe0\xc2\xd6\xbd\x7d\x1b\xd3\x00\x8a\xab\x89\x0f\xaf\x2e\xb8\x69\x23\x2f\x93\x68\x02\x42\x59\x06\x0f\xf1\x6a\x87\x4d\xf2\x44\x4f\xfc\x44\x66\x1b\x15\x98\xf6\x3a\xbf\x3d\x9f\x69\x67\x43\x46\xfa\xdc\x1c\xbb\xb6\x9a\xbc\x63\xa8\x97\x7f\xa5\x4f\x28\x99\x71\xa5\x65\x66\x5d\x6b\x50\x9c\x2b\xa3\x50\x01\x74\x7d\x0c\x58\x3b\xd1\x70\xe7\xbe\x0b\x84\xa6\x29\xa3\xbe\x98\x8f\xe5\x4d\x50\x8d\x27\x63\x91\xcc\xe2\xb5\x1d\x73\xda\xfd\x5a\x59\x6a\xed\xe7\x5b\xc8\xcd\x4c\xa8\xd2\xb7\xbe\x0f\x46\x40\xa8\x49\x8d\xcb\xe2\x8f\x1d\x62\x31\x1a\x07\xe7\x22\x45\xf1\xa3\x24\x54\xa0\x55\xe3\x30\x19\x7c\xb7\x90\x51\x8c\x0d\xa5\xb9\xbd\xc6\x75\xef\x25\xb7\x60\x88\x8f\xd3\xf3\x39\x53\x6a\x6b\xa2\x51\x25\x48\x03\x70\x78\x89\xc7\xe1\xb5\xaf\x3b\x66\x8f\x02\x02\x86\x63\x3a\xd4\xad\xe5\xe6\xad\x46\x40\x4c\x40\x83\x82\x3f\x56\x07\x2d\x59\x3a\xa3\xaa\xee\x60\xfc\x29\xf2\x21\xbe\xb5\x8f\x43\xcd\xde\x64\x8c\xaa\x6d\xa9\x92\x95\xb9\x1d\x67\x9c\x4d\xc8\x39\x9d\xb3\xe4\x9c\xaa\x36\x27\x17\x28\xc0\x90\xb0\xe1\x74\x48\x8e\x6e\x02\x6f\xeb\x3b\xa9\xdf\x6e\x2b\x88\xb0\x03\x1d\xa0\xce\x89\x7e\xd0\xb3\x7c\xb0\x92\xb0\xfb\xe4\x1e\x78\x66\x0f\xee\xe1\x96\x13\xfa\x2c\xce\xe6\xf6\x7c\xdf\x4d\xe7\xb1\x7c\x12\xf3\x0c\x2c\x7e\xd1\xbe\x27\x72\x47\x32\xe3\xa6\x53\xf8\x9c\xcf\xdf\x8e\x21\xf9\x26\x46\x6b\x4d\x26\x2b\xa3\xbb\x2d\x69\xae\x60\xf6\x0f\x03\xec\xb0\xf2\x3d\x57\x46\x05\x6b\x53\x6c\x79\xda\x64\x7b\xbb\x80\x1b\x7f\xdf\x22\x97\x0f\xb6\x73\xe1\x43\x13\xf9\x63\x70\xb4\x98\x1d\xf0\x98\x01\x18\x17\xee\xab\xd6\xd6\x61\x6d\x00\x76\x5f\x4c\x6c\x15\x31\xfb\x4c\x69\x7f\x1c\x43\x9d\x36\xb6\xc0\xaa\x88\x90\xf0\xc1\x88\x60\xca\x1c\x8a\x93\x2d\x9f\xaf\xa9\x50\xd5\x53\xa6\x76\x2b\xba\x3b\x95\x58\xb2\x7b\x69\xdd\x43\xdb\x16\x18\xaf\xba\x3a\x5b\x0d\x9d\xb8\x81\xb2\xb6\x5b\xe3\x69\xd0\xd8\x4e\xf1\xaf\x61\x7b\xeb\x0d\xb8\xd5\xab\x82\xec\x6b\x5e\xb9\x01\x22\x8d\x8e\xe1\xc8\x50\xe0\x08\xd0\x9d\x91\x76\x5b\xf2\x54\xb6\xdf\xde\x54\x69\x20\x84\x1b\x96\x77\x78\x5b\xc3\xca\x73\xde\xde\x9c\xef\x44\xd0\xa8\xdd\xde\x33\x80\x03\xd9\xb9\x81\x1e\x16\xa8\x00\xaf\x5d\xbb\xee\xe9\xf7\x5b\x1d\x40\xa6\xad\x7b\xec\x81\x90\x59\x14\xcb\x16\x2c\x2e\x79\xea\x2c\x76\x7b\xf9\x5e\xe0\xb7\x2d\xda\xb7\xd3\x4e\xfe\xf1\xaf\x5f\xfd\x6a\x30\x18\xfc\xaa\x88\xcd\x7a\x45\x68\xca\xd9\x67\xcd\x30\x02\x6f\x78\xf7\x47\x28\x88\xb3\x78\xf9\x2b\xd8\x70\xe4\x1c\xac\xcd\xce\xcc\x7a\xe1\x33\x08\x7f\xe5\x32\x30\xcd\x47\xa8\x10\x52\x87\xb1\x48\x91\x14\x3a\x93\x49\xc2\xb2\xc1\x94\x89\xe1\x5d\x3e\x66\xe3\x9c\x27\x31\xcb\xa0\x71\xf7\xe9\xc5\x8b\xe1\x1f\x87\x2f\x7e\x45\x7c\xbe\xa5\x91\xec\x95\xa6\xf3\xf4\x15\x24\x7e\xfc\xca\xee\x38\x87\xc8\x96\x26\x54\xa8\xa1\x0f\xf3\x1e\x46\x32\x63\xd2\xfc\x6f\xfe\x2b\x95\xb2\xc8\x7c\x1b\x0f\x1a\x59\xfb\x8c\x35\x9d\xd9\x2e\x5a\x28\xb3\x62\x9a\x06\x44\x26\x73\xf8\x37\x0e\xdd\x42\xc8\x5d\x27\x16\x8f\x2e\xe1\x4a\x7f\x5f\xfd\xe5\x0d\x57\xc8\x2e\xd3\x24\xcf\x68\x52\xee\x2a\xfc\xa0\x66\x32\xd3\x25\xa8\xd5\x01\xe1\xc8\x1a\x15\x17\xd3\x3c\xa1\x59\xe9\xad\x5f\xb9\x98\x87\xc2\x5c\x67\xb8\xe4\xa2\x14\x4b\x37\x28\x05\xcb\x72\xa1\x59\x76\x2e\x93\x7c\x1e\x5a\xc7\x06\xab\x72\xe5\x84\x67\x4a\x5b\x8c\xbb\xb2\x53\x61\x9d\x5c\x0c\xdf\x0f\xf6\xe8\xdf\x94\x14\xe0\x2e\x24\x43\x33\xdd\xc3\xcd\x2f\xfd\xf8\xe2\xa7\xe0\x3d\x5c\xc3\xb2\xbc\xba\xf6\x94\xac\xe9\x31\x4d\xd3\x4c\x2e\x28\x22\xf4\x6d\xe9\x8b\x7b\x6e\xe5\xb3\x67\xab\x3f\x6c\xf8\xf6\xfa\x26\x4b\x3e\xba\xb0\xc9\xd2\x0f\x7a\x0d\x7a\x21\x3e\xbc\x78\x49\x93\x74\x46\x5d\x9e\xa1\x8a\x66\x6c\x4e\x8b\x45\x92\x29\x13\x67\xd7\x57\x1f\x7f\x37\xaa\xfc\xb0\x1e\xcf\xd0\x6c\x39\x9f\x5a\x17\xa0\xe2\x53\xa7\x8b\xf9\xd4\x88\xe2\x04\xac\x74\x73\x45\xc8\x5b\x2f\xd4\x19\xa9\x1c\xcf\x78\xe5\xb6\x99\x9d\xe0\xd6\x26\xe1\x2a\x20\x32\x15\x42\x57\xae\xd9\x55\x04\x7c\x96\x46\x66\x37\x3c\x8b\xed\x9c\x15\xd1\x3b\xce\xcd\x53\x0c\x5a\xd8\x31\x0d\x89\xd9\x8c\x2c\xf3\x28\x48\x98\xc6\xa9\x49\x90\x7f\x88\xad\x81\xb9\x02\xf3\x64\x34\x53\x1a\xe2\x16\x32\xe1\x0a\xe7\xf6\x7d\xc1\xef\x8c\x99\x76\xcb\x19\x8c\x2e\x25\x63\x4d\x59\xb1\x29\xd7\x8e\x84\x46\x72\x3e\xcf\x05\xd7\xcb\x53\xa0\x86\x7c\x9c\x9b\xd5\x38\x8d\xd9\x82\x25\xa7\x8a\x4f\x07\x34\x8b\x66\x5c\xb3\x48\xe7\x19\x3b\xa5\x29\x1f\x40\x67\x05\x06\xe0\xcc\xe3\x5f\x7b\x3a\x5e\x55\x3a\x37\x72\x98\x75\x32\x42\x79\xae\x01\x11\x8e\x07\x05\xbd\xb1\x04\x71\x09\x77\x14\x90\x6f\x2f\x47\xb7\x85\x8b\x11\x91\x82\x60\x86\x03\x27\x5b\x31\xd9\x66\xa2\xa0\x12\x8c\x05\xfa\x76\xa9\x9d\x3e\xa1\xd3\xfc\x11\x25\xdc\xe8\x24\x2a\x1f\xcf\xb9\x56\x2e\xd6\x11\x03\x07\xcf\x81\x83\x00\xec\x24\x5a\x6a\x86\xe4\x4a\x14\xfa\xfd\x83\x4f\x35\x44\x05\x0d\xcc\xf4\xd5\x9f\xec\x90\x01\xae\xbe\xb0\x46\x91\x72\x2c\x6a\xe3\xea\x04\x67\x7c\x94\xb2\xc8\x9f\x06\x7f\xa6\xcf\x10\x33\xdd\x02\xeb\xfb\x58\x4c\x89\x55\x99\xe1\xe5\x95\x90\x82\x2d\x7a\xdd\x66\x5d\x6e\x40\xd6\xd0\xd3\xf2\x4f\x6b\x62\x17\x06\xf5\xd8\x08\xd9\xa1\x90\xb9\x4f\xef\xb6\x03\x39\xde\x60\xb5\x63\xc0\xba\xf7\x0c\xc3\xe6\x63\x80\xae\x2c\xc2\xb9\x85\x1c\x85\x20\x50\xd8\xcc\x6c\xef\xcc\xc1\x19\x22\x3e\xfc\x5b\x2a\x72\x9a\xac\x0d\x60\xdb\x2a\xdf\xb9\xb9\xd9\x8c\xaf\xb0\x09\xe1\x76\xf3\xd4\xb5\x8a\xd5\xb0\xb5\xf7\x36\x5f\x7a\x2b\xc4\xc4\xa6\x00\x2f\xdc\x8d\x8d\xa1\x29\x02\x1c\xf9\x4d\x2e\xcd\x43\x62\x90\x7a\xe1\x99\x5a\x09\x1b\x41\x06\xba\x3d\x74\x44\x69\x96\xaa\x02\xa4\x42\x4b\x12\xc9\x79\x9a\x30\x5d\xe6\xbd\x10\x94\xdb\x2c\x46\xa9\x1a\x73\xbb\xe7\x49\xb5\x98\x25\xa3\x0d\xfe\xda\x01\x5a\x76\x9b\x9c\x3f\xad\x99\xc8\x0d\x15\x1e\x95\xd0\xc0\x37\x94\x4d\x2d\x1f\xc9\xcd\xef\x86\x18\x85\x98\x8d\x5a\xae\xf6\xe3\x62\x4c\x1c\xf0\x70\x6c\x03\x53\xe3\x20\x6d\x6d\x73\x68\xc9\x81\x71\x3a\x9b\x65\x95\xf5\xc3\x2c\x12\x52\x56\xaa\x8d\x6e\x78\x7f\xa7\x5a\x08\x09\x7b\xdb\xa2\xf1\xca\x9c\xfc\xca\x4e\x68\x66\xeb\x32\x52\x92\x72\x86\xb1\xf3\x5e\x1c\x82\x09\x63\x34\xb6\x37\x0d\xc3\xcb\x98\x8f\x0f\xb7\xf6\x6e\x68\xa0\x10\x97\xa0\x26\x0f\xc5\x40\x75\xf2\xbf\x46\xef\xdf\x9d\x7e\x27\x6d\x32\xa1\x2d\x1d\x02\x3b\x79\x0e\x21\xed\xae\x42\x46\xcc\x94\xd9\x9e\x23\x30\x9e\xcf\xa9\xe0\x13\xa6\xf4\xd0\x63\x84\xa8\x1f\xbf\xfe\x69\x18\xa6\x06\xf4\x1d\xb8\xb9\x17\x2a\xec\xd6\x00\x52\x6e\x06\x53\xc0\x6b\xfa\x22\xa0\xa9\x74\x95\x44\xee\xa1\xb3\x9a\xde\x19\xfa\x8d\x9d\xcd\x8d\x2e\x73\xc7\x5e\x91\x1e\xaa\x26\xfe\xd3\xff\x30\x62\xf8\xbf\x7a\xe4\xf8\x1e\x42\x9e\x7b\xe6\xcf\x1e\x7e\xd0\xcb\x80\x61\x21\x9c\xe2\xc3\x18\x28\x9d\xf1\xe9\x94\x65\xd6\x77\x04\x66\x55\xa8\x19\xc2\xa1\xec\x66\xf1\xb0\xb0\x15\x50\x0b\xcc\xcd\x6a\x47\x7e\xfc\xfa\xa7\x1e\x39\x2e\x8f\x8b\x70\x11\xb3\xcf\xe4\x6b\xef\x7e\x48\x65\x7c\x62\xa3\xb2\xd4\x52\x68\xfa\xd9\xb4\x19\xcd\xa4\x62\x02\x43\xbe\xb5\xc4\x32\x2e\x4a\x82\x67\x2b\x49\x06\xb6\xd6\x3c\xb9\xc7\xb4\x61\x37\x95\x98\x86\x0b\x90\x45\x65\x09\x19\x4b\xd6\xc2\xd7\xcc\xb2\x4d\xc1\xb4\x62\xa4\x2f\xac\xf3\x82\x89\x0d\x21\x4a\x92\xca\x71\x91\x0c\xe9\x9b\x51\x01\x6e\x16\x5b\x1e\xc6\xc8\x53\xc3\x4d\x3e\xc9\x9d\x3b\x7e\x9b\x49\x6b\x8d\xd8\x5a\xa7\xac\xef\x23\x09\x85\xb5\x87\xb8\xcd\x60\xf6\xa4\x95\x8b\x0f\x1a\xd1\xd6\xe8\xa3\xd5\x61\x61\xc8\xd1\x23\x8c\x0d\xea\xbb\x9e\xee\x3d\x34\x27\x52\x37\xe1\x04\x47\x23\x3c\xf0\x51\xf5\x6d\x73\x5c\x30\xe2\xd0\x2a\xad\x01\x85\x9b\xd3\x18\x49\x20\x15\xcb\x07\xdf\xc6\x66\x02\xc1\x6b\x1b\x2d\x07\xd6\x2e\x37\xa0\x22\x36\xff\x56\x5c\x69\x73\x7f\xef\x19\xdb\x62\x08\x2d\xcf\xd2\x87\xab\x8b\xc7\xd9\xdc\x39\xdf\xf3\xb4\x8e\x73\x11\x27\xec\x8d\x94\x77\x1b\x52\x81\x4b\x03\xfa\x36\x7c\xda\x7b\xe7\x50\x4b\xe3\x62\xe0\x63\x68\x03\x2d\x97\xa4\x79\x82\xe4\x35\x17\x29\x8d\xee\xe8\x94\xd9\x8f\x02\x1b\xb1\x09\xfe\xa8\x29\x83\x2a\xd0\x2a\xae\xdc\xc6\xde\xa3\x35\xc0\xf6\x73\x43\x37\x1d\x5f\xb4\xb0\x03\xd4\xf5\x7b\x77\x7f\x5b\xf1\x2b\x97\x24\xdc\x1b\x36\xd9\xf8\xa0\x07\xb7\xdf\x94\x7f\x32\x80\xd2\x5e\x1b\x7f\x74\x40\xc8\x6b\x1f\xd8\xed\x43\xac\xf6\xb3\x6e\x74\x53\xe5\x35\xb7\x22\x8e\x60\xd8\x59\x2e\x3d\x06\x77\xec\x2a\x40\x35\xb6\x7b\xaa\x80\x02\x25\x0b\x1b\x99\xf3\x28\x90\x48\xbb\xc5\xe6\x35\xe3\xdd\x43\x78\x0e\x3b\xbe\xd3\x6f\xb7\x53\x90\x5e\xd3\xa7\x4e\x9c\xee\xc4\xe9\x67\x2e\x4e\x37\x3a\x03\xbb\x43\x0f\xbe\x0c\x01\xbb\xd1\xa0\x77\x47\xdb\x3f\x4b\x91\xbb\xf1\x18\x6b\x04\xff\x3f\x5b\x21\xbc\xd1\x60\x6b\x0a\xe4\xeb\x86\xfc\x4b\x16\xcb\x1b\xcd\xe1\xce\x78\x98\x67\x28\xa8\xd7\x1e\xe0\xf6\xa4\x90\x35\xe3\x0b\xf2\x31\x2a\x76\x60\xd3\x69\x2c\x2f\xee\xed\xb4\xa1\x98\xbc\x4b\x9c\x6a\x05\x01\xb6\xb5\xe8\xbb\x5a\x61\x73\x1b\x61\x89\xf1\xaa\x1b\x33\xd7\x24\x5b\x04\xaf\x2d\x71\xe6\x45\x5c\xf1\xc1\x69\x23\x78\x35\xc8\xac\xaa\x9b\x88\x51\x0c\xbb\x4e\x22\x49\x83\x21\x1b\x19\x3e\xcd\xe4\xb8\x2e\x62\xcd\x03\x8c\xaa\x66\x94\xe1\x81\xe1\xec\x90\x9d\xef\xd7\xb7\xb5\xc1\xee\x4a\xe2\x58\xd3\x77\xc4\xb4\x2b\x45\x92\xf9\xf5\x38\x52\xb0\xc8\x0f\xd1\xd3\xbd\x83\x2f\x03\xb1\x1a\x3b\xd9\x77\x1e\xcc\xdb\x2c\x67\x7d\xf2\x9a\x26\x8a\xf5\xc9\x07\x71\x27\xe4\x7d\x7b\xfd\xdd\x8e\xc8\xb0\xa6\xb7\xb7\x16\x7b\xa1\x46\xae\x50\xed\xae\x14\xda\x7d\x4d\x62\x7f\xe5\x5f\x70\x16\x1a\xab\xa1\x0f\x72\xc1\x7f\xce\xcb\x8a\x8a\x77\x32\x1d\x57\x55\x98\xf3\xd1\x47\xd8\x1c\xa8\x6e\xab\x12\xa8\xad\xf9\x51\x6d\x0e\xab\xae\x93\x07\xb5\x55\x51\x2d\x27\x86\x1b\x45\xbf\xac\x6a\x25\x16\x9e\xb0\x6a\x96\x49\xf3\x24\x19\x92\x2b\x7d\xa4\x4c\x1f\x78\x44\x93\x64\x69\xb4\x96\x4a\xb5\xb0\xc3\x32\xb8\x6a\x30\x88\x95\xc3\x86\x88\x2b\x7c\xc1\x82\xd7\xdd\x44\xa3\xc1\x89\xc5\x76\x1c\x87\x41\x26\x6e\xa9\x8b\xb5\xa6\x6b\x37\xf6\x71\xb7\x51\xc2\xf5\x2f\x66\xd5\x36\x8a\xba\x26\x6c\x1a\xc1\xc8\x44\xe6\x22\x26\x54\xc3\xf2\xec\xd9\xe7\xb2\x0f\xf7\xf1\x1c\xfe\xdb\xe5\xa7\x76\x8c\x8d\x81\x07\xbe\xc8\xe3\xdb\x22\x7c\x15\x44\x8e\x7d\x66\x51\x1e\xc4\x78\x85\x31\x1c\xfb\xd9\x1a\xdb\xcd\x7d\x7d\x92\xc4\xd4\xc7\xcd\x29\x6d\x3b\x75\xd2\xef\x80\xfa\x51\xdd\xf5\x44\x85\x16\x62\xcf\xeb\x00\x3b\xd5\x47\x26\x5a\xb7\xed\x81\x2b\xe2\x53\x63\xa6\x82\x11\xae\xec\x6f\x43\x4f\x28\x20\xb0\x18\x26\x63\xab\x22\x00\x4e\xd5\x4c\xee\x4d\x19\xeb\xe6\x27\xbe\x75\xf2\x9b\xf9\x20\xc8\x76\x83\x15\xd9\xce\xf2\xbf\x42\xb6\x83\xe2\x3d\x45\x28\x0d\x30\xc9\x39\x5d\x42\x68\xda\x3c\x95\x99\xa6\xe8\xe0\xc8\x45\xcc\x32\xa5\x29\x62\x94\xb8\xbc\xbc\xd4\x8c\x79\x46\x15\xe1\x5a\x91\xc8\x26\x19\xe2\x82\x3d\x50\x26\x63\x30\xd9\xd7\xe6\x05\x2f\x22\x94\x3e\x8e\x7c\xb5\xb4\x30\x5b\x57\x61\x7b\xc7\x12\xba\x25\xb0\xea\x50\x3a\x3b\xd2\x2c\xad\xd2\xd5\x60\x10\x02\xc4\xf1\x05\x8f\x31\x18\x89\xa5\x84\x8b\x76\x88\xea\x6e\x07\x0e\x3a\x26\x36\x1f\xab\x81\xb7\xd2\x6c\x7c\x60\x8b\x46\xbb\x9b\xa8\xcb\x14\x23\xe5\x77\x9d\xfd\xed\xd5\xe7\xfd\x28\x0e\x24\x97\x9b\x23\xe5\xf0\x5a\x59\x55\x97\x7d\xb1\x65\x75\x83\x58\x5d\x88\x06\xd5\x99\x95\xa4\x96\xb5\xd6\x98\x3c\x36\xca\xcd\x8e\xd4\xbf\x9d\x40\x2c\x83\x20\x70\xb0\xe6\x63\x60\x98\xdc\xfa\xec\xae\x3c\xc2\xc7\xc6\xd5\x39\x10\x31\xa5\xb8\x9c\x0b\xa9\x95\xc6\x76\x5b\xd9\x6b\x36\x54\x2c\x4d\xcb\xcd\xd5\xb0\x8f\xd7\x6c\xb3\x56\x02\x60\xfb\x69\x6f\x2c\x2d\xa7\xfd\xae\xe3\x49\x29\xcd\x34\x8f\xf2\x84\x66\xc5\xd9\x07\x22\xbf\x92\xb7\xd4\xb8\xcf\x4a\xd3\x4c\xd7\x02\x59\x18\xb9\x27\x3d\xe6\x22\x00\x2e\xcc\x98\xf0\xce\x3f\x4c\x03\x23\x63\x36\x35\xcc\x33\x4d\x93\xa5\xcb\x31\x28\x22\xd8\x13\xae\x74\x51\xfc\x0f\x64\x81\xba\xa1\x10\x8d\xe1\x1a\xfe\xad\xf3\xe8\x64\x32\x8f\xa4\x98\xf0\xe9\xe3\x65\xd1\xbd\x7f\xf3\xf6\x1c\x3e\x09\xf7\x8a\x1c\x3a\x7f\x7f\x25\x83\xae\xe8\x24\xdc\x2e\x92\xe4\xfc\x0f\x45\x8a\x9c\xc5\x73\x58\x93\x1f\xe7\xb2\xaf\xdc\x7a\xee\x99\x77\xe5\xbb\xe9\xa2\x32\x3c\x2b\x56\xa9\x14\x8a\x1b\x99\x18\xf0\xb3\xe0\x21\xac\x7e\xf2\xfe\xcd\xdb\x76\x93\xae\xba\x0c\xab\x2e\xc3\xaa\xcb\xb0\xda\x75\xa0\x6a\x64\x58\xf9\xd3\x0c\xf9\x55\x2e\x6c\xcf\xfc\xdb\xa6\x09\x15\xc7\xdd\x63\x5a\xd7\xfd\xf8\x76\xf9\x70\xc2\xa8\x99\x9a\xdd\x91\x85\xaf\xed\x83\x45\x15\x9e\x52\x9e\xae\x25\x33\xa0\x8b\xbf\x7f\xf3\xd6\xb7\xfb\x00\x39\x11\x31\x57\xe6\x33\xe7\x32\xe5\x2c\x3e\x1f\x7d\xac\x57\xa4\xf9\xa2\xfa\x56\x29\xa7\x03\x7f\x34\x3d\x3f\x52\xa4\x87\x0f\x91\xf3\xd1\xc7\x9e\x1b\x08\x2c\x44\x51\xc8\xcb\x67\xb5\x11\xaa\x43\x81\x00\xe9\x7f\x9f\x60\x14\x12\x2d\xdf\x8e\x4b\x85\x8e\xa4\xb0\x55\x67\x66\x54\x91\x31\x63\x22\x68\x14\x55\xe0\xf7\xf6\x69\x80\x02\xb5\x71\x4a\x80\xe0\x8d\xa0\xff\x45\x54\xc3\x90\xfc\x60\x44\x9b\x8c\x31\x61\x86\x11\xf7\x61\x09\x10\x21\x97\x01\xef\x45\x97\x5e\x30\x30\xd5\x83\x11\x01\x8c\xcf\x86\x4e\x6e\xcf\x18\x59\xa7\x93\xd6\x48\x7c\x2a\x76\xfa\x46\x00\x99\x07\xdc\xed\x8f\x61\x57\xee\x15\xd6\x64\x7f\x54\x9c\x9b\x11\x36\x91\x60\x84\x9a\xb3\xad\xbd\xd3\x2c\x10\xa3\x8b\x62\x00\x67\xd7\x57\x1e\x46\x76\x48\x06\x83\x81\x8d\x17\xd3\x59\x1e\x69\x84\x86\xd2\x58\xc8\xc8\xb4\x1a\xf3\x0c\xb8\x95\x62\x60\x09\x72\xf5\xda\xec\xee\xc4\x20\x2f\x08\xc8\x1c\x5a\xeb\x55\x31\x15\x43\x52\x8e\xd9\x33\xd3\x40\x5e\x4b\x69\x57\x08\x3f\xf8\x0f\x72\x7a\x4a\x6e\x2a\xd6\xf1\xb1\x11\x5a\x6d\x71\x14\x10\xfe\x27\x52\x1e\x95\xed\x64\x6c\x68\x5e\xfc\x5e\xc8\x7b\xb1\xee\xd3\xf0\x2d\x9a\xb1\x57\xe4\x53\xef\x6c\x41\x79\x62\xf6\xef\xa7\x5e\x9f\x7c\xea\x5d\xdb\x58\x65\x2e\xa6\x9f\x6c\xad\x83\x4f\xbd\x0b\x06\x05\xb8\xe3\x4f\x3d\xd3\xec\x6f\xa1\x7a\xdb\x5b\x96\x4d\xd9\xf7\x6c\xf9\xdf\xd0\x98\xbf\x3d\xc2\x4a\x6f\xcb\xff\xc6\x42\x6f\xe6\xbe\xa1\x56\xb7\xcb\x94\xfd\xf7\x9c\xa6\xfe\xc6\x5b\x9a\xfa\x97\x83\x30\x8c\x1f\x7f\x32\x64\x7e\xf1\x72\x58\x2c\xe7\x5f\xff\xa6\xa4\x78\xf5\xa9\x17\xe0\x77\xca\xb9\xd9\x16\xa9\x5e\x7e\xea\x91\xd2\x57\x5f\x7d\xea\xc1\x77\xdd\x7d\xd7\xc9\x57\x9f\x7a\xe6\x4b\xe6\x76\x26\xb5\x1c\xe7\x93\x57\x9f\x7a\xe3\xa5\x66\xaa\xff\xb2\x9f\xb1\xb4\x6f\x4e\xf5\x7f\x17\x5f\xf8\xd4\xfb\x2b\xf9\x24\x4c\x67\x21\xac\x00\x57\x52\x91\x7f\xad\x2f\x8c\xd1\x82\x4d\x6c\xd5\xd1\xb0\xf1\xd1\x5d\xe0\x58\x68\x34\xdf\xc7\x74\x76\x60\x75\xea\xbd\x81\x42\x57\x5f\x2c\xca\x56\x1e\x16\x0e\x62\x0f\xaf\xaf\xfc\xee\x75\x51\xb0\x3b\xa3\xf2\x59\xb4\x8a\x01\x98\xf1\x90\x60\x69\x44\x4c\x40\x34\x72\x12\xb8\xcf\xa1\x64\x8b\x20\xb9\x72\x32\x5b\x59\xbb\x35\x84\x03\x0f\xbc\x6d\x06\xc4\xbe\x28\x62\xa9\x36\xa7\xeb\x91\x00\x4d\x9b\xc1\x82\xce\x57\x4c\xfb\xfb\x87\x6d\xe0\x54\x5b\x1b\x3f\x75\x65\x7d\x71\x58\x07\x0e\x7e\x4e\x3f\xbf\x81\xea\x4e\xaf\xc8\xef\xbe\xfe\xc3\xef\xff\xb8\xc9\xae\x3b\x46\x6d\xfe\xbb\xad\x79\xcb\x6b\xa6\x61\xf5\xc5\xaa\x6d\x75\xe8\x84\xcf\x61\x91\x14\x5d\x54\x52\x2d\xc7\xec\x28\xa6\xc9\x18\xdc\x57\x79\x6a\xe6\xe5\xb5\x4b\x55\x15\x11\xc6\x13\xae\x6d\x8c\x7b\x02\x9e\x2c\xc9\xcb\xaf\xb1\xa6\x11\x7c\x7a\x85\x7c\xff\xf8\xf9\xa7\xe1\x9a\x2e\x73\x45\xfe\xb3\x5f\xe9\x8f\x11\x78\x72\xe0\x78\x66\xe3\xa0\xa7\xda\xe8\xaa\x36\xe2\x78\x03\x1b\x64\xbe\xbf\xbb\x16\xae\x41\x7d\x8f\xdf\x7f\xb3\x79\x7d\x5d\xf9\xf5\x17\x6d\x38\x15\xad\xd3\xd0\x4b\x01\x14\x31\xec\xe9\x1c\x12\xfa\x83\xb8\x91\x70\x6b\xeb\x66\x91\x3f\xe4\x3a\x93\x71\x1e\x19\x5d\x4c\x4e\x5c\x58\x7a\x14\x12\x28\x28\x2c\x63\x4e\x03\xaa\xd8\x84\x7d\x36\x93\xce\x8a\x0a\x43\x46\xdf\x65\x54\x70\x31\x55\x05\x8a\x23\x10\x10\xe4\xba\xf7\x33\x06\xac\x47\x87\xf5\x38\xa1\x57\x8a\xc7\x10\x33\x4f\xc9\x34\xa7\x19\x15\x9a\x61\xa5\x06\xac\xc9\x89\x0a\x66\x41\xf2\x68\x00\x8c\x69\x4f\x23\x1e\x55\x24\x56\xa6\x8b\x56\x15\xc4\x5a\xae\xad\x1d\xd5\x97\x2f\xbe\xde\xba\xe4\xfe\xb9\xcd\x16\x76\xaa\x35\xcb\xc4\x2b\xf2\xff\x7e\x3c\x1b\xfc\x5f\x3a\xf8\xfb\x4f\xc7\xf6\x1f\x2f\x06\xff\xf9\x3f\xfd\x57\x3f\x7d\x15\xfc\xf9\xd3\xc9\x9f\x7f\xd3\x86\xbd\x55\xb5\x1a\x59\x55\x6b\xd2\x76\x57\x8c\xe9\x99\xaf\x6e\xab\xca\x35\x20\x3d\xe8\xd2\xf6\x67\x6c\x77\xb7\x69\x18\xf5\x26\x49\x57\x03\xba\x8c\xee\x54\xec\x33\xa0\x78\x46\x2c\x1d\x5a\xf1\x76\x18\xc9\xf9\x69\x60\x5e\x30\x72\xf5\x5b\x2a\x96\xa4\x20\x6b\x28\x94\x56\x77\xba\x82\x2c\x33\x1a\x65\x52\xa9\x92\x89\xf8\x8e\x11\x2f\xb9\x22\xb1\x1c\xb3\x88\x82\x20\x9e\x8d\xb9\xce\x68\xb6\x0c\xf4\x0e\x87\x70\x9f\x2b\x36\xc9\x13\x72\xac\x18\x23\x43\x21\x63\xb6\x4a\x5d\x4f\x90\x86\xd2\x31\x4f\xb8\x86\x94\x90\x98\x19\x3d\x3b\xe1\x56\xfe\x77\xee\x6b\x57\x02\x77\xca\x3e\x13\xae\x7d\x19\x7a\xae\xc8\x71\x2c\xd4\xcb\x97\x5f\xff\x6e\x94\x8f\x63\x39\xa7\x5c\xbc\x9e\xeb\xd3\x93\x3f\x1f\xff\x9c\xd3\x04\xd2\x57\xde\xd1\x39\x7b\x3d\xd7\x07\x45\x8a\x95\xd9\xe2\xcb\xdf\xd7\x38\x45\xc7\x3f\xe2\x59\xf9\xe9\xf8\xc7\x81\xfd\xd7\x57\xee\xd6\xc9\x9f\x8f\x3f\x0d\xb7\xfe\x7e\xf2\x95\x19\x43\x70\x02\x7f\xfa\x71\x50\x1c\xbf\xe1\x4f\x5f\x9d\xfc\x39\xf8\xed\xe4\x37\x9d\x85\xbd\x30\x99\x07\xba\xd7\xa3\x59\xda\x6d\x1b\x5e\x91\xaa\x5a\xdc\xab\xbf\xaf\x5a\xde\x57\x3a\x8f\x16\xf8\x35\x08\x76\x51\xe9\x23\x81\x8d\xbe\xda\x44\x4d\x38\xbb\xb6\xcc\xf5\xd5\x31\xa2\xa4\x8b\x7b\xc3\xab\xf9\x40\xeb\x0d\xf1\xf9\xeb\xca\xf3\x7f\xb5\xd9\x21\x81\xd1\x0a\x2c\x99\xcb\x72\x74\x8b\x04\xcb\x4f\x19\x2f\xc6\x27\x0b\xae\xb1\xeb\x74\x3e\x80\xce\x07\xd0\xf9\x00\x9e\x87\x0f\xa0\x7a\xe4\xc1\x17\x00\x25\x51\x55\x60\x49\xa6\xf1\x9c\x8b\x0d\xc7\x7f\xfb\xb9\xb7\xd4\xa1\x4f\x52\x69\x64\x19\x0e\xb1\xd7\x72\xc1\xb2\x8c\x43\xcc\x1b\xbe\x93\xb1\xa2\x02\x61\x18\x7f\xde\x92\x05\x36\x66\x69\x22\x97\xf3\x4d\xb8\xe5\x0f\x13\x4e\x6c\x07\xd9\x72\x04\x73\x67\xf5\xed\xac\xbe\xbf\x14\xab\x6f\x67\xca\xed\x4c\xb9\x9d\x29\x77\xcd\xd5\x99\x72\x3b\x53\x6e\x67\xca\xed\x4c\xb9\x2b\x57\x67\xca\xb5\xcf\x74\xa6\xdc\xce\x94\xfb\xd8\xa6\xdc\xe2\x52\x25\x38\xdf\x47\xd2\x29\xeb\xc4\x39\xad\x68\xf3\xb6\xb0\xaa\xd5\xe7\xcb\x6a\xf9\x1a\x5d\x9e\x6b\xe5\xd2\x0c\x41\x6d\x1f\x86\x05\xd8\x1e\xb7\xda\x7c\x17\x34\xd5\xa9\xcf\x9d\xfa\xdc\x05\x4d\x15\x57\xa7\x69\xfb\xab\xd3\xb4\x3b\x4d\xbb\xd3\xb4\x3b\x4d\xbb\xd3\xb4\xab\x57\xa7\x69\xe3\xd5\x69\xda\x9d\xa6\xbd\xe6\xfa\x32\x34\xed\x6d\x41\x53\x13\xb3\x65\xdd\xcd\x5d\x51\x53\x24\x0c\xa7\xf9\xba\x0b\xa7\xe9\xc2\x69\xba\x70\x9a\x2e\x9c\xc6\x5d\x8f\x1d\x4e\x53\x36\xbf\x61\xcc\x4b\xc9\xdc\x06\x7b\x36\xcd\xe4\x82\xc7\x4c\x55\x82\x6f\x3c\xcc\x5e\xc0\x65\xe6\x50\x98\xaf\x08\xa8\x61\x8f\x13\x4e\xd3\xd9\xe6\x3a\xdb\x5c\x67\x9b\xeb\x6c\x73\xc1\xd5\xd9\xe6\xfc\xd5\xd9\xe6\x3a\xdb\x5c\x67\x9b\xeb\x6c\x73\x9d\x6d\xae\x7a\x75\xb6\x39\xbc\x3a\xdb\x5c\x67\x9b\x5b\x73\x7d\x19\xb6\xb9\x70\x07\x75\x59\x15\x9d\xea\xd9\xa9\x9e\xcf\x4c\xf5\xec\xf4\xc9\x4e\x9f\xec\xf4\xc9\x35\x57\xa7\x4f\x76\xfa\x64\xa7\x4f\x76\xfa\xe4\xca\xd5\xe9\x93\xf6\x99\x4e\x9f\xec\xf4\xc9\x2e\xab\xa2\x61\x56\xc5\xfb\x37\x6f\x83\x48\x0e\x8c\xf0\x08\x76\x16\x54\xd4\x06\xa4\x5d\xc7\x93\x3b\x2f\x6c\xa7\x0a\x77\xaa\x70\xe7\x85\x25\x9d\xd6\xdc\x69\xcd\x9d\xd6\xdc\x69\xcd\xd5\x85\xeb\xb4\xe6\x4e\x6b\x2e\x2f\x65\xa7\x35\x37\x9f\xb4\x4e\x6b\xee\xb4\xe6\x35\x4b\xf1\xcb\xd0\x9a\x3b\x58\x59\x2d\x33\x80\x8b\x7d\x7c\x48\xd9\xef\x7c\x41\xcf\x55\x38\x59\xf8\x6d\x23\x94\x2c\x76\x18\x7e\x5a\x07\x23\x2b\x71\x57\xae\xe2\xc7\xba\x12\xa2\x4f\x80\x1d\x8b\x65\x80\xac\xe2\x90\x0b\x0e\x62\xcf\x3c\x4f\x34\xd7\x4c\x50\x11\x2d\x81\xcd\xbe\x7f\xf3\x96\xcc\xa9\xa0\xd3\xa0\x92\x8f\x1a\x92\x2b\x0d\xf4\x46\x67\xbe\x74\x93\xad\x36\xe4\xf3\x3e\xc2\xe2\x46\x80\x3e\xe1\xeb\x0b\x81\xc2\xe1\x84\x00\x16\x83\x00\x68\xd8\x07\xd4\x22\x0a\xcb\x10\xfd\xaa\x7a\xc0\xbb\x4c\x98\x2e\x13\xa6\xcb\x84\x79\x26\x99\x30\x40\x3f\x36\x16\x98\x2b\x11\x99\x3d\xca\x6e\xc5\x6c\x42\xf3\x64\x4d\x29\xdf\x3c\x05\xdb\x9a\xb7\x60\x91\x0b\x7c\xb2\x81\x7d\x55\xb1\x84\x45\x5a\x66\x3b\x8b\xd4\x8d\xec\x83\xf6\x0d\x1c\x66\x69\x68\x47\x6a\x3b\xdd\xaa\x31\xd2\x5d\xbd\x25\x20\xba\xe8\x68\x76\xf9\x39\x05\x4b\xe3\x06\xbb\xf0\x4a\xef\xab\x2f\xe1\x89\x72\x25\xf6\x12\x3a\x66\x89\x9f\x0a\x47\x49\xe7\x78\x64\x50\x52\x2b\xee\x80\x80\x79\xf6\xee\x62\xd5\xc4\x5d\x1e\xe0\x26\xab\x34\xd9\x6e\x99\x5e\xe9\xfa\xd9\x96\xee\x59\xc2\xe0\x7e\x01\xab\x82\x57\x5e\x91\xe8\xf5\x09\x25\x77\x6c\x89\xf4\xb1\x94\x9c\x65\x1e\xce\x18\x50\x53\x58\xcc\x3b\xb6\x84\x87\x2c\xb1\xdc\x21\x60\xb6\x52\x35\xfc\x8e\x6d\x9a\x21\xfc\xdd\x75\x76\xb3\x80\x5a\xab\x3e\xf7\x1d\x5b\x6e\xfb\xb9\x32\xe1\x66\x1e\xbc\x0d\xd1\xcc\xbc\xb9\xe1\x0d\x36\x7e\xb2\x69\x9a\x26\x9c\x01\x35\xdc\xda\x76\x2d\x79\x9c\xf8\xa1\x36\xe8\xa8\x5f\xca\xc0\xe2\x04\x8b\x7d\xa4\x70\x61\xcd\x4e\x9f\xf1\xd4\x0a\x19\x28\x5a\x38\x56\xf8\x91\x26\x3c\x10\x63\x60\x57\x5f\x89\x3e\x79\x27\xb5\xf9\xdf\xe5\x67\x6e\x48\xbd\xd9\x0f\x17\x92\xa9\x77\x52\xc3\x9d\x56\x86\x8a\x5d\x68\x30\x50\xab\xd9\xf1\xc0\x4d\x22\x27\x25\x7e\x68\xc4\xb0\x49\x29\x0b\xd0\x3c\x7d\x25\x8c\x3a\x69\x47\x54\x32\x86\x98\x26\xe6\xb9\x02\x06\x26\xa4\x18\xa0\xfd\x62\x5d\x1b\x76\x22\x64\x56\x9a\x87\x2d\xcd\xd9\xa6\xc0\x4e\x82\xbf\xa0\x04\x94\x18\x51\x96\xc4\x58\x2f\x18\xb8\xb9\x21\xda\x3c\x22\xe8\xed\x00\x9f\x43\x9d\xe9\xdd\x46\x57\xf0\xda\x41\x5d\x6a\xae\x15\x90\xcc\x37\xe6\x00\x34\x20\xb1\xf8\x3c\x92\xa5\x39\x4d\xcd\x32\xfd\xc3\x50\x1f\x98\xa9\x7f\x91\x94\x72\x23\x31\x9f\x81\xf4\x9f\xb0\xd2\x6f\xb6\x14\x78\xd8\x8c\x69\x81\x2b\x62\x48\xc9\x82\x26\x86\xde\x81\x7d\x9e\xb0\x04\xa9\x9f\x11\xd2\x2b\x84\xbd\x4f\xee\x67\x52\x21\x31\x43\x2b\x15\x57\xa4\x77\xc7\x96\xbd\xfe\xca\xd2\xf6\xae\x84\x75\x53\xad\x2c\xa6\x27\xa2\x52\x24\x4b\xd2\x83\xdf\x7a\xfb\xf3\x82\xad\xc4\x92\xc6\x68\x3e\xa0\xc9\x75\x0d\x6a\xb6\x75\xdd\xca\xce\xe5\x4d\x75\xf6\x2b\x7c\xbd\xfa\x8a\x23\x7e\x98\x91\x1b\xea\x26\xf0\x24\xa1\xf8\xa8\x75\x02\x43\x29\x54\x34\x8f\x60\xbd\x57\x88\x97\xf6\xf3\x7c\xac\x4e\x70\x65\x8d\x3c\xea\xe6\x1e\x34\xbd\xc6\x05\xde\x8d\x42\xcf\xa3\x6b\x4c\x1c\x8e\xcf\xae\xaf\x76\x57\xd6\x1d\xc1\x2b\x44\xb3\x24\x41\x17\xb6\x91\x59\xb5\xb4\x32\xeb\x5a\x11\x26\x0d\xda\x0f\x94\xfc\x8d\x9d\x5d\x57\xac\x15\x7e\x05\x51\xc8\x2b\xb1\xbb\xfb\x7a\x5b\x79\xc1\x92\x3b\xf6\x39\x4d\x78\xc4\xb5\xa3\xdf\x85\x6c\x05\xfa\x10\xbc\x04\x84\x8b\x83\x34\xa0\x98\xee\x17\xb2\x1a\x57\x84\x4f\x85\xcc\xd6\xef\xcf\x87\x89\x5d\x27\xe4\xf3\xe0\x2e\x1f\xb3\x4c\x30\xcd\xd4\xc0\xc8\x58\x03\xfb\x02\x5b\x3d\x02\x55\x11\x76\xd7\x2c\xf5\x3e\x94\x5f\x28\x29\xa0\xb6\x31\x47\x5b\x97\x2b\x95\x85\xe1\x29\x3f\x83\x70\x9e\x33\x86\x16\x43\xef\x40\xd1\xf7\x92\xa8\x3c\xb5\xb9\xe5\x95\x26\xcd\xd1\x24\x9f\x84\x13\xb4\x5f\x15\xd5\x80\x81\x50\x40\xb0\x84\x4b\x69\xb7\x27\xcb\x6a\xca\xb0\x5c\x73\xb9\x60\x4e\x8d\x45\x96\x60\x98\x41\x3a\xa3\x8a\x15\x3a\x98\xca\xa3\x88\xb1\x98\xc5\xf8\x83\x65\x25\x6c\x32\x61\x91\xe6\x0b\x96\x2c\xc1\xf8\xaf\x50\x24\xf1\xdf\x37\x3b\x1b\x3f\x5f\x0c\xb8\xf2\x45\xc1\x3e\x6b\xa7\xa4\x13\x0e\x4a\x78\xd9\x52\x91\xf9\xe1\xce\xa8\x22\x13\xca\x13\xa3\xd7\x7d\x12\xe4\x96\x45\xb3\xeb\x8c\x2d\x38\xbb\xff\x20\x14\x9d\xb0\xd7\x94\x27\xaf\x65\x76\x4f\xb3\x38\x98\x83\x87\x18\xbe\xe9\x95\xff\x0d\xbb\xe4\xe6\xe5\xcc\x13\xce\x64\x19\xd4\x65\xb6\x9e\x31\x33\xde\x7b\x37\xc0\xeb\xc4\xcc\x18\x38\x5c\xa9\x51\x68\xfd\x8e\x22\x19\x9b\xb0\x8c\x09\x73\x9e\xa8\x6b\x3f\x78\xc9\xb3\x87\x88\x6a\x9a\xc8\x69\x51\x52\xda\xea\xbd\xe8\x18\xa3\xf0\x31\x37\x7b\xce\x0d\xc4\x8c\xa8\x00\xf5\x3f\xf0\xec\x06\x46\xa3\x4f\x82\xfc\x70\x76\xf3\xee\xea\xdd\x77\xaf\x80\xab\x6c\x9b\xe1\xd5\x7d\xcd\x15\xc9\xe1\xa9\xc0\xea\xa1\xf2\x44\x9b\x2d\x9e\x0b\xef\x2f\x1a\xb3\x19\x5d\x70\x73\x06\x32\x6b\x0f\x59\x30\xac\x23\x6e\xd4\x60\x92\x48\x65\xda\x49\x98\x52\x64\x29\x73\x0c\xe2\x89\x19\x4b\xd1\xc5\xad\x34\x15\x50\xbd\xc4\xfa\x33\xaa\x83\x20\x63\x66\x7e\x75\x16\xb1\x95\xd3\xb5\xce\x9f\xb0\x83\x72\x38\x4d\x77\x83\x22\x4b\xb6\x3a\x3c\x06\x5b\xde\x32\xbf\x6e\x9b\xe2\xb2\xda\x5f\x3f\x5a\x0a\x15\xff\x6d\xf5\xb6\xc3\x07\x6f\x9a\xeb\xfe\x9b\xf5\x28\x0c\xfc\xf8\x80\xbb\xb0\x81\xc6\xbf\x3d\xa2\xaa\x34\xca\x20\xb8\xa6\x22\x7b\xaf\xe3\x9c\x41\x90\x50\x9b\xcc\xa6\x0b\xd5\xea\x42\xb5\xba\x50\xad\x95\xdf\xbb\x50\xad\x2e\x54\xab\x0b\xd5\xea\x42\xb5\xba\x50\xad\x2e\x54\xab\x0b\xd5\x22\x5d\xa8\x56\xf1\x4c\x17\xaa\xd5\x85\x6a\x3d\x5d\x82\x53\xa0\x95\xee\x54\x30\xdf\x14\xcf\xa2\x74\xa2\x5d\x30\x94\x3b\x99\x65\xd1\xb0\xaa\x72\xda\x53\x6c\xf8\xb1\x6d\xa6\xb1\x55\xb9\x8e\xd0\x25\xea\x5b\x71\xcb\xf6\xdb\xc0\x6c\xb2\xe2\x1a\xf7\x1c\xa8\x34\xa8\xe7\x6a\xa7\x2d\x7b\x16\x6e\xd8\xa4\xa1\x63\xe1\x86\x4d\x42\x53\x1b\x4e\x4c\xd9\x9f\x60\xc3\x55\xbc\xc3\xe1\x01\x62\x07\x36\x07\x38\xad\x1d\x82\x11\xf6\x9d\xbd\xd4\xee\x47\x3b\x86\x8d\x8e\xd0\x9d\x47\x1a\xf8\xf1\x35\xd5\xb3\x5a\x3d\x38\xba\xb2\xd3\x06\x5e\x43\xf0\xe3\xa6\x9c\x45\xac\x14\x43\x05\x72\x1c\xa3\xb1\xbd\x69\x04\x9f\x8c\xd9\xdf\xfa\x28\x71\x58\x5f\x69\x11\x63\x65\x84\x26\x42\x0d\x21\xe6\x31\xf9\x5f\xa3\xf7\xef\x4e\xbf\x93\x56\x56\x30\xda\x8c\xb2\x15\x92\xe6\x4c\xe8\x3e\x51\x79\x34\x23\x54\x99\xae\x19\xfd\x76\x04\xa6\x87\x39\x15\x7c\xc2\x94\x1e\xda\xd6\x58\xa6\x7e\xfc\xfa\xa7\x61\xd9\xdc\xc1\xad\x43\xd5\x45\x22\xd9\x0d\x00\x67\xc3\x0c\xc6\xbf\x0b\x42\x2b\x74\x29\x95\xb1\xed\xf4\x3d\x74\x56\xd3\x3b\x46\xa4\xed\x6c\xce\x80\x29\xbc\x22\x3d\xb3\x4d\x82\x4f\xff\xc3\x1c\xac\x7f\xf5\xc8\xf1\x3d\x98\xf4\x7b\xe6\xcf\x1e\x7e\xd0\x07\x8e\x99\x7b\x01\xc7\xb7\x1f\x46\xf9\x3e\xe3\xd3\x29\x88\x5b\x60\xb7\x5d\x30\xa1\x4f\x80\xbf\x4d\x88\x90\xc1\xc3\xc2\xfa\xc7\x0a\xaf\x58\xb5\x23\x3f\x7e\xfd\x53\x8f\x1c\x97\xc7\x65\x44\x50\xf6\x99\x7c\xed\x3d\x61\xa9\x8c\x4f\x9c\xd6\xba\x14\x9a\x7e\x06\xc5\x60\x26\x15\x13\xe8\x48\xd0\x12\xad\xb1\x4a\x1a\xe5\x93\x25\xc9\x00\x05\xcc\x98\xdc\xa3\x01\xce\x4d\x25\x3a\x93\x53\x9a\xe9\x4a\x58\xdd\xed\xfb\x8b\xf7\xaf\xf0\x6b\x66\xd9\xa6\xc2\x69\xb9\x13\x2e\x68\x62\xcd\xda\x5e\x3e\x34\x1d\xc9\x71\x91\xb4\xb4\xaa\xad\xb3\xe8\x4e\x72\x9d\x67\x6c\x58\x0d\xb3\xaa\xbd\xe3\xd7\xc5\xb8\xad\xdf\xec\x10\xeb\x56\x3d\x68\x4f\x18\x49\x56\x7b\x88\x62\x83\xa7\x75\x75\x88\xef\x82\x3d\xb8\x75\x88\x05\x69\x36\xa3\x8c\x65\xa4\xcc\x00\x23\x96\x6a\x75\x2a\x17\x86\x74\xb2\xfb\xd3\x7b\x99\xdd\x71\x31\x1d\x98\x4d\x36\xc0\x95\x57\xa7\xc0\x62\x4e\x7f\x0d\xff\x3b\x68\x44\xc0\xa7\xea\x0f\x0b\x03\x5a\x1f\x61\x6c\xc0\x3e\x4f\xf7\x1e\x9a\x93\x2f\x9b\x70\x82\xa3\x91\x53\xfe\x2a\x6f\x9b\xe3\x82\x8e\x70\x1b\xe9\x1a\x50\xb8\x39\x8d\x91\x04\x52\xb1\x7c\xf0\x6d\x6c\x26\x10\x74\xfc\x68\x39\xb0\xa1\xe8\x03\x2a\xe2\x81\x97\xaf\xa3\xe5\xde\x33\x96\xf3\x9a\x07\xf8\xc3\xd5\xc5\xe3\x6c\xee\x9c\x37\x3a\xad\x6d\x25\x12\x90\x52\xf0\x39\x4d\xd2\x19\x6d\xab\xde\x42\x17\x82\x0e\x57\x17\x82\xde\x85\xa0\x77\x21\xe8\xc5\xf5\x4c\x42\xd0\xbb\x10\xf2\x2e\x84\xbc\x0b\x21\xdf\xfc\x73\x17\x42\xde\x85\x90\x77\x21\xe4\xd5\xab\x0b\x21\xef\x42\xc8\xbb\x10\xf2\x2e\x84\x7c\xcd\xd5\x06\x54\xdd\x17\x18\x7c\xd9\x39\xc7\xbe\x0c\xe7\x58\xe7\xee\xea\xdc\x5d\x9d\xbb\xab\x73\x77\xed\xb1\xe3\x3b\x77\x57\xe7\xee\xea\xdc\x5d\x9d\xbb\xeb\x99\xba\xbb\x1a\x55\x16\xff\xa2\x81\xb3\x1e\x1f\x33\x0b\x6e\xad\xc2\x65\x6d\x44\xca\xb2\x20\x59\x2b\x48\x58\x05\x08\xd6\x39\xe6\x52\x3e\x3c\x02\x56\xd9\x00\xe8\x8a\x32\x37\x28\xc4\xde\x39\xf4\x3a\x87\x5e\xe7\xd0\xdb\x75\x4a\x1a\x38\xf4\xc0\x97\x17\x1e\x05\xab\x8e\x14\x29\x1c\xef\xd7\xbb\x36\x36\x7f\xba\xbe\x69\xc5\x5a\x55\xc2\xcf\xbb\x5c\x94\xe2\xfb\x81\x85\x05\x4e\x8a\x59\xd0\x48\xce\x53\x29\xcc\xc6\x68\xc7\xb9\x58\xb4\x57\x23\x5b\xd5\x3d\x6a\xef\x8f\x59\x18\x4c\x6e\x3d\x5b\xf3\x54\x2a\x56\xb2\xe3\xee\xa1\x78\x6f\x77\x4d\x0d\xd0\xe9\xe3\x4c\x68\x7b\x28\xee\xa5\xf7\x6b\xc9\x22\x6f\xc2\x37\xac\x6b\x12\x3c\x4f\x3f\xe7\x2c\xc3\xd2\xf9\x85\x03\xa7\x98\x14\x67\x72\x45\x97\x54\x69\x5a\x8e\xb6\x2c\x66\xcd\x69\xaa\x33\x54\xd2\xc0\x1f\xbb\x32\xea\x47\xf5\xc9\x92\xda\xfe\x93\x1a\xde\x93\xe7\xed\x9f\x25\x75\x7d\xb4\xa4\xa6\x9f\x96\xd4\xf0\xd5\x92\x7a\xfe\x5a\x52\xdb\x67\x4b\xea\xf8\x6d\xc9\x03\xfb\x6e\x49\x7d\xa7\x26\xa9\xed\xc3\x5d\xe9\xf4\xb3\xf3\xe3\x36\x1c\x76\x1d\x7f\xee\xca\xa0\x3b\x9f\x6e\x65\xaa\x77\xfb\x75\x49\x5d\xdf\x2e\xa9\x9f\x9e\xb4\xd3\xc7\x4b\x3a\x3f\x6f\x33\xfe\xb2\x93\xe8\x36\xf3\xf7\xd6\x5a\xcb\x8c\x4d\xea\x39\xe9\x6f\xd8\x04\x07\x13\x88\x13\x85\xa3\x43\x6e\x94\x21\x0a\xa9\xa3\x6f\xa9\xa8\x03\xcf\x29\xc9\x2e\x8f\x13\x11\x75\xc3\xa3\xd9\x4d\x68\xbc\xa2\x81\x2d\x0b\x68\xa4\xeb\x6d\x9f\x30\x91\xf1\x68\xe6\x3a\x6b\x84\x5c\xeb\x59\xdb\x0e\x78\x12\x76\x7b\xc7\x82\xd6\x63\x67\xbb\xbd\x39\x6b\x06\xba\x87\x4f\x27\xec\xf8\x4e\xe2\xbd\x1d\x4d\x66\x43\xa7\x02\x24\x90\x4a\x06\xbe\xd5\xc3\x4b\x59\xea\x7e\x07\x3d\x62\x68\xcb\xfa\xee\x16\xbd\x0d\x3b\x4b\x5d\x82\xea\x2a\x66\x8b\x28\x3a\x6f\x1d\xb2\x5b\x72\xed\xc3\x61\xd4\x10\xbb\xea\x0b\x5e\x3b\xf1\x40\xc2\x07\x37\x22\x83\x14\x57\x7d\xe9\xab\x19\x5a\x48\x71\xad\xf8\xc1\x0f\x41\x07\x69\x8b\xd3\x15\x57\x5d\x98\x8e\xf2\x34\xa0\x13\xbe\xd5\x29\xb8\xa7\x10\x6d\x32\x5e\x89\x41\x78\x92\x41\xee\x44\x25\xd9\x30\xba\xb3\x43\x41\x49\xda\x1e\xfc\x2e\x20\x8a\x0d\xe3\xb8\x6d\x86\x2e\xd1\x76\xaf\x77\xe1\x1f\x6c\xe8\xf5\xa8\x55\x24\x84\x3d\xfb\xbe\x1d\x94\x60\x43\xcf\x6f\xab\xf0\x04\x2d\x76\x6b\x67\xdc\xc2\x9a\xfe\x74\xd1\x0b\x5d\xf4\xc2\x33\x8f\x5e\x68\x74\x06\xb6\x45\x32\xac\xdb\xfe\xcf\x35\x9e\xa1\xd1\xa0\xb7\xc5\x36\xac\x1b\xf4\x33\x89\x70\x68\x3c\xc6\xad\xd1\x0e\x9b\x06\xfa\x4c\x62\x1e\x1a\x0d\xb6\x66\xfc\xc3\xba\x21\xff\x92\xa3\x20\x1a\xcd\xe1\x96\x88\x88\x75\xf3\xf6\x2c\xe2\x22\x36\x0e\xf0\xdf\xba\xaa\x58\x88\x7d\xfc\x78\x01\x12\xa3\xe0\xab\x95\x20\x89\xf0\xa7\x95\x40\x89\x52\x6f\x31\x58\x62\x4d\x45\x31\x95\x8f\xc3\x7f\x57\xa3\x2a\x54\xf9\xe3\x75\xca\x8b\x85\xf6\x35\x88\x09\x38\x97\x49\x3e\x0f\x6d\x1c\x83\x55\xd1\x3f\xa5\xd1\x9d\xd1\x5a\xec\xf7\xc6\xe0\x59\x0b\x36\xe7\xdf\x94\x14\x20\x51\x92\x21\x88\x21\x66\x06\x83\x9f\x71\x7d\xae\xb1\x91\x5f\x6d\xdd\xc1\x6b\x3f\xef\x00\xaa\xad\xb7\xde\x69\x20\x85\xf0\x93\xae\x34\x5d\xed\x11\xbe\xba\xd2\xa7\x51\xf5\x76\xed\x2e\xcd\xa8\x10\x2c\x31\xb4\x00\x3d\xfa\x20\xdd\xf9\xf9\xd9\x3e\x3d\xf6\xe5\x95\xde\x9c\xaf\xdc\x5f\xd3\x9d\x52\x8a\xfe\xa1\x31\x32\xe1\x16\x25\x77\x8c\xa5\x2a\x70\x96\xe4\xe0\x53\x81\x5c\x90\xf1\xd2\xa8\x77\xd1\x1d\xc0\x8d\x82\x54\x06\xe3\x3d\xc7\x85\x69\x39\x81\x1e\x36\x7b\xca\xa2\xe0\x56\x17\x82\xd3\x85\xe0\x74\x21\x38\xbb\xce\x58\x8d\x10\x9c\xf0\xc0\x97\xc2\x70\xa8\x20\x67\x69\x9a\x80\x51\xca\x41\xc3\x5a\xcc\x41\x0b\xb8\xb1\x62\x89\xdb\x33\xbd\xa8\xc2\x1c\xdc\xed\x15\x0a\x5d\xfe\xc1\x33\xb5\xca\x13\x5b\x23\x6c\x90\x9e\xae\x93\xef\xb6\x4a\x87\x91\x14\x13\x3e\xdd\x9d\x17\x13\xcc\xe5\x39\xbc\x52\x78\xcc\xb0\x89\xdc\x22\xdb\x16\x9c\x0a\xd2\xb7\x4a\x7c\xfb\x01\x92\x63\x98\x58\xd4\xf2\x77\x5d\x8a\x45\x39\xac\x84\x89\x05\xcf\xa4\x00\xb7\xe2\x82\x66\x9c\x8e\x13\xcb\xd8\x98\x76\x6a\xb8\x37\x29\xac\x3b\x52\x8f\xe2\xe1\xba\x14\x8b\x8f\xb4\x1c\x0f\x20\xd6\x76\x9d\x38\x97\x06\x18\x74\xce\x7d\xc7\x0f\x73\x69\xd5\x4b\xde\x5f\xbb\xcb\xdd\x55\xcf\xcd\xd0\x50\x5f\x0f\xd5\xf5\x75\xb3\x31\x24\x6f\xad\xc3\x9e\x92\xf3\xff\xb9\xba\xb8\x7c\x77\x7b\xf5\xfa\xea\xf2\xa6\xbd\xac\xf5\x26\x8a\xd4\x47\xb7\x46\x81\x8b\xf5\x37\xc7\x1f\xcf\x6e\xfe\xe7\xdd\xd9\xdb\xcb\x13\x70\xc3\xb2\xcf\x29\x85\x4a\x05\x05\x64\x79\x9a\xb1\x05\x97\xb9\x4a\x1c\x2e\x71\xbc\x61\xd3\x56\x77\xab\x8d\x20\x5a\xfa\x64\xb5\xb5\xaf\x41\x40\x04\x2d\x36\x50\xe4\x77\xb8\x61\x54\xc9\x82\xc5\xfd\x50\xf7\x8b\xbc\x71\x8a\x8b\x34\xd7\x8e\xe1\xf9\xac\x5f\xe1\x01\xd9\x2f\x64\x6e\xda\xfb\xcd\x6f\x60\x60\x19\x8b\xf3\x08\xc3\xd3\xa8\x8b\x02\xf8\x4d\xdf\x2a\xde\x50\x6a\x06\xd3\x04\x99\x8a\x68\xea\x86\x1e\xce\x0e\x5a\xeb\x5e\x11\x3e\x64\x43\xd2\xfb\x4d\xf0\x53\x0f\xbf\x9e\x22\xbc\xb3\xcd\x1c\x85\x5e\x25\x5c\xb3\x8c\x26\xa4\x17\x3e\x3d\x24\x97\xe6\x1b\x2c\x0e\xd7\x01\xab\xee\xb0\x05\xcb\x20\xbc\xc3\xae\x42\x9f\x64\x6c\x4a\xb3\x18\x8a\xaa\xc8\x49\x05\xdf\xd9\x4e\x18\xf3\xc1\x23\x42\xea\xa1\x2b\x5b\x02\x34\xa4\xd7\x6b\xc7\x76\x07\x5b\xed\x75\x26\xb7\x22\x0e\x57\x49\x75\x59\x73\x58\xb7\xf6\x47\x36\xe6\xac\x44\xd6\x14\x8b\x09\xb7\xe1\x44\xce\x70\xb9\x03\x65\x9a\x34\xf1\x74\xd6\xf7\x37\x22\x43\xc1\xa2\x13\x1b\x92\x36\xb7\x8d\xdf\xc2\xd2\x40\xe0\x14\xd6\xdc\x38\x77\x0d\xd6\x0d\xc1\xa9\xe5\xb8\x6d\xe2\xba\xad\x17\x37\xd7\xcc\x29\x5b\x33\x2c\x8e\xac\x73\x70\x41\x34\x9c\x0b\x18\xad\xe3\x70\x69\xec\x78\xdc\x4d\xd1\xd7\x76\xee\xb1\x2d\xb1\xd6\x68\x7f\x16\xc7\xb6\x7a\x88\x45\x9d\xc6\x22\x22\xc3\x40\xeb\xea\x83\x3e\xd0\x27\x39\x8f\xff\xbc\xfd\x70\xef\x39\x63\x32\x45\x63\xc5\x1e\xb3\x86\x26\xce\x65\x89\x4e\xf9\x4d\x0f\x4e\x15\xad\x60\xcd\x5d\x1c\x9b\x65\x28\x0d\x86\xb1\x09\xde\xa0\x7c\xc1\xb4\x35\x3f\xb3\x47\xc5\xa1\x45\xe7\x88\xdd\x00\xa9\x8c\x5f\xb9\x32\x6e\xca\xab\x08\x60\x73\xe9\x97\xff\x04\x79\xb9\x4f\xfe\xea\x6f\x42\xd4\xa7\xfa\xf1\xe8\xe8\xbf\xbe\xbf\xfc\x3f\x7f\x3a\x3a\xfa\xe9\xaf\xe1\xaf\x81\x85\xae\xfc\x08\xda\x74\x64\x0c\x42\xb8\xfd\x73\x15\x4c\xa3\x6f\x2d\x88\xc3\x99\x54\xfa\xea\xda\xff\x99\xca\xb8\xfa\x97\xda\xc1\x09\xc8\xc3\x12\x1d\xef\x01\x6d\x99\xf4\xd4\x0d\x63\x72\x57\x69\xb9\x3f\x96\x43\x99\xac\x41\xc2\xfc\xf3\xb5\xeb\xae\xe1\x40\xf7\x19\xd7\x9a\x01\x5c\xbd\x66\xd9\xdc\x70\xe2\xbe\x2b\x2e\x86\x6c\x76\xf1\xb2\xf7\x20\xc4\xab\xa6\xdf\x78\xed\xe0\xa0\xf7\x76\x64\xb8\x99\x8b\xc8\x7c\x2b\x41\x15\x3a\x52\x10\xd8\xd5\xfa\x40\x9c\xbd\xe1\xf5\xc1\x67\xd2\x5b\x2e\xaa\x9e\xdc\x57\xe8\x3a\x0d\xb1\xfe\xc1\x1a\x61\x04\x50\x6f\x91\x38\xc6\x9b\xc3\x28\xcd\xfb\xf6\x81\xe1\x9c\xcd\x65\xb6\xf4\x7f\xb2\x74\xc6\xe6\x46\x62\x1b\x58\x1b\x7e\xdf\xbf\x8e\xaf\xf9\xbf\xf0\xc5\xd2\x07\x56\xdf\x3e\xa9\x14\x83\xf4\x85\x20\x9f\xf6\x2c\xba\x69\x6a\xf9\x28\xfa\xd5\xd8\x04\xf3\xb3\x7a\x95\x17\xfa\xbc\xe4\x6b\x7f\xe5\x47\x05\x32\xe4\x42\x26\xf9\x9c\xa9\xbe\x67\x4f\x28\xad\x8b\x85\x91\x26\x77\xb8\x6d\xdc\xd5\xf0\xf4\xc5\x7c\xc1\x55\x9d\xe0\xf9\x95\xa1\x58\x57\x9f\xcb\x75\xca\xb5\xd1\x54\x30\x04\xca\xab\x8b\x9f\x53\xa9\x40\x07\xf0\x71\xac\x25\x92\xf2\x72\x5b\x55\x8e\xe2\x0a\x0a\x35\x7c\xfa\xed\x3f\x07\x50\x6c\xe1\xc5\xe0\x3f\x7f\xfa\xed\xf1\xa7\x21\xfc\xe3\xab\x93\x3f\x9f\xfc\xd3\xfd\xf1\xdb\x93\x93\xe3\xe3\x1f\xbf\x7f\xfb\xdd\xed\xf5\xe5\x4f\xfc\xe4\x9f\x3f\x8a\x7c\x7e\x87\x7f\xfd\xf3\xf8\x47\x76\xf9\x53\xcd\x46\x4e\x36\xd7\x4d\x29\x5f\x54\x2c\xdf\xd7\x38\xf0\x78\x0d\x6a\x16\x08\x5a\xff\x56\xed\x65\xad\x94\x2a\xe0\x42\x0f\x64\x36\xc0\xd7\x4b\x3e\xbb\x6d\x97\x5b\xb6\x7d\xf6\xf9\x8d\x3b\xad\x81\x29\xd6\x91\xe6\xd6\x37\xb2\x62\x51\xc6\x74\x5b\x1a\x0c\xb6\xe6\xf8\x47\x2a\xe3\xa3\x00\xfb\xb7\x53\x6a\x0a\xa5\xc6\x57\x39\x85\xf9\x2a\x38\xef\x24\x93\xf3\x21\x09\xcc\x42\x18\x86\x65\x9f\xbb\x63\x3b\xb4\x5c\x77\x75\x4a\xd0\x97\xa5\x04\x8d\x70\x7d\x1f\x5c\x03\x62\x62\xb1\xcd\x4c\x53\xb5\xe9\x9a\x67\xcb\xe6\x68\x9f\xdf\x2a\x49\x2a\xd3\x3c\xa1\x7a\x83\xd9\x6e\x8d\x6d\xda\xee\x7d\xe5\xcd\x84\x3e\xb0\xcf\x52\xb9\xf9\x7a\x63\x28\x39\x4b\x12\xc2\x05\x9e\x04\x68\xc0\x59\xf3\x32\x66\x0b\x67\x63\xa1\x54\x08\xce\x2b\xaa\x27\x16\x86\x46\x08\x73\xa4\x99\x86\x42\x65\x3f\x60\x5d\x66\x33\xc9\xd6\x34\xc6\x05\x62\x9f\xa7\x09\x23\x9e\xdb\xfa\xd4\x1b\x42\x95\x92\x11\x2f\xca\x2f\x7b\x30\x34\xdb\x6d\xe8\x0d\xc4\x22\xa6\x19\x8b\x58\xcc\x44\xc4\x20\xcf\x2d\x67\xc5\x58\xc7\x46\x18\x04\xf3\xbe\x2d\xe1\x1c\xe7\xe8\xda\x41\x7a\xb0\xbe\x8d\xab\xf9\x3c\xdf\x5a\xe9\xb1\x75\x2b\xbe\x59\x71\x6b\x99\xab\x24\x4b\x14\xa2\xb5\x4f\xc5\xf1\xaa\xfb\xe6\x50\xff\x16\x33\x52\xbc\xb9\x6d\x27\xa7\x5a\xa1\xb8\x85\x8d\xa1\x4c\x69\x1f\xdb\x62\x58\x8f\xce\xfe\x22\x69\x6c\xa3\xac\xd4\xba\xb4\xb5\x81\x71\xa9\x29\x3d\xad\x6b\x4d\x4a\x33\x36\xe1\x9f\x9b\xe4\x48\x89\x42\x45\x09\xea\x46\x1a\x82\x9a\xb1\x94\x09\xd0\xc3\x19\x8d\x66\x98\x1b\x2c\xca\xe3\x78\x50\x8f\x11\x4a\x19\xcd\x8f\xd7\x68\x9d\x14\xd3\x9d\xad\x5f\xf8\xd9\xb2\xab\xde\xfe\xc1\x12\x32\x66\x8d\xe0\x28\x8e\xde\x05\x6f\x54\x20\x0c\xd0\x81\xe7\x3a\x69\xb4\x37\xef\x72\x4a\x25\x9c\xb5\x09\xd7\x98\x44\x00\xb5\x1b\x0b\x2c\xda\xe0\x4d\x48\xe6\xb5\x4f\x1c\x41\x72\x0d\xa4\x01\x57\x1a\x1a\xa3\x89\x30\xce\x13\x16\x13\x17\xb0\x81\x8d\x36\xdc\x52\xa5\x50\x85\x53\xaa\x14\x9f\x8a\x41\x2a\xe3\x81\x69\x6d\x07\x38\xdb\x63\x41\x37\x93\x40\xcb\xad\x97\xcb\x7b\x74\xe3\xed\x6f\x81\x6c\x11\xc9\x79\x9a\x6b\x16\x18\xe7\xbc\x5d\x67\xbc\xc4\xc8\xa2\x40\x86\x2c\x24\xa2\xc3\xe6\x14\xcb\xda\x0c\xec\xc7\x07\xfe\xe3\x03\xff\xad\x43\xa6\xb9\x0e\xd5\x42\x93\x62\xed\x2c\xf6\xa3\x37\x68\xb2\x2c\xc0\x66\x30\x29\xfd\x33\x9f\xe7\x73\x42\xe7\x88\xf2\x3a\x59\x33\x9d\xe0\xbc\x66\x71\x3b\x13\xb6\x66\xa2\xb6\x47\xce\x3f\x58\x8e\xf9\x33\xb5\x6c\xd5\xb2\x68\x35\xb3\x64\x35\xb0\x60\xed\x6d\xb9\x72\x46\xea\xfa\xfb\xf1\xc6\xd9\xcd\x2b\x3b\x12\xeb\x6e\x6f\xdd\x91\xee\x80\x43\x68\x87\x6f\x87\x2b\x22\xe7\x5c\x6b\x1f\x92\xe5\x77\x58\x9f\x70\x5d\xb2\x7e\xda\xb3\xc0\x8b\x8a\xfa\x0e\x75\x3c\x59\x16\x5e\x8b\x3e\x72\xd9\x7b\xae\x98\xc5\x67\xe0\xf3\x14\x11\x1a\x60\x4f\xfb\xc4\x29\x1b\x64\xd0\x9d\x8f\xee\x7c\xac\x7b\x69\x5b\xc9\x21\xb2\xb1\xec\x50\x09\xd5\xc7\x8b\x23\x66\x67\xa7\x32\x56\x56\x5e\x70\x7b\xc8\x9c\x05\xc0\x74\xe1\x62\x4a\x6e\x18\x58\x06\x46\x4c\x2b\x0b\x1a\x02\x6f\xd0\x8c\x15\x50\x16\x8e\x35\x3a\x4b\x08\xf8\x11\x20\x68\x74\x32\x29\x3f\x81\xf5\x0d\xe6\x20\xd9\x5e\xe9\x50\x9e\xf1\xa2\x0b\x9b\xa7\x09\xd5\xcc\x0b\x36\x07\xd4\x86\xe8\x00\xb8\x76\x0f\xa3\x03\xe0\x2a\x9e\xe9\x00\xb8\x3a\x00\xae\x9a\x83\xee\x00\xb8\x2a\x53\xdd\x01\x70\x75\x00\x5c\xfb\xae\xa5\x96\x09\xcb\xe8\x56\x28\xa5\xb2\x99\xaf\x78\x1e\x86\x56\xb8\x77\x83\x96\x1e\xc7\x4b\x71\xeb\xc4\x16\x73\xb6\x8a\x7e\xc1\xd6\xd2\x9a\x02\x78\x96\x96\xae\x5f\x90\x47\xb3\x24\x66\xcd\x34\xd2\x75\xd8\x18\x96\x43\xea\x0c\x9c\x3e\xff\xe5\x77\x5b\x9f\x81\xfc\xf4\xa7\x20\xbe\x1d\x9e\x37\x7f\xf8\x1d\xf2\x5f\xee\x5f\x7f\x7a\x14\x28\x2e\xec\x52\x03\x01\xe3\x12\x5e\x70\x80\x36\x6e\xa8\x30\x03\xd8\x96\x99\x1f\x18\xd6\x90\x5c\x1a\x42\x45\xe6\x8c\x0a\xe5\xcc\x5c\xe0\x89\x2a\x1e\x56\xd6\x65\x16\xe8\x55\xd6\xa4\x50\x9c\x0c\x46\xde\xc9\x91\xb5\x7d\xf5\xc9\x35\xd8\x52\x8b\x3b\x70\x92\xde\xc9\xcb\xcf\x2c\xca\x77\x61\x52\xd5\x45\x8b\x68\x54\x21\xf1\xfb\x82\xc9\xe3\xc8\x4a\x4c\xbe\xd8\xc1\x21\x9b\xdf\x3a\x33\x77\x6c\x59\x30\x1b\x2b\x42\x00\xc9\xef\x17\xbb\xc4\xb1\x02\xe4\x1d\xff\x9f\x33\x65\xcd\xc7\x5c\xe0\xc7\xb0\x69\xb7\x14\xd0\xba\x9b\x50\x23\xd9\x25\x09\x7e\xa6\x8d\xe9\xda\xa3\x58\xe3\x7a\xac\xf6\xf5\x32\x86\xa7\x92\xeb\xa5\x8b\x40\xa4\xb8\xfc\x39\xa7\x49\x39\x09\xc1\xde\xb2\x0f\xad\x50\xf5\x7b\x9e\xc4\x11\xcd\x6c\x94\x17\xa6\x69\x2a\x89\xab\x07\x90\x30\x90\x13\xe7\x4e\x7b\xb1\x46\x88\x89\x06\xf8\x27\x3c\xca\x13\x9a\xb9\xcc\xf1\x5a\x89\x02\x3b\x67\xb4\xd8\x34\x23\x16\x49\x11\x37\x51\x00\x6e\xab\xef\x56\x7d\xad\x29\xcb\xb8\xc4\xe8\x62\x07\xc3\x15\x6c\xd2\xe3\xb2\x4d\x5b\x4e\xdc\xa9\xf6\x47\xac\x64\xf9\x28\x41\xb9\xd8\xea\x6a\x27\x01\x79\xf4\xa7\x62\x48\xbe\x5d\x3a\x33\x4b\xdf\x96\x67\x13\x52\x63\x89\x36\xfb\x4d\xbb\x65\xed\x64\x17\x07\x6a\x22\x33\x48\x4e\x39\x8e\x25\x66\x64\x2c\x78\xa4\x4f\x86\xe4\xff\xb2\x4c\xc2\xc2\x0b\x36\xa5\x9a\x2f\x3c\x37\xf5\x8a\x6b\xc6\xa8\xf5\xe0\xbf\x20\xc7\xf0\x1a\xe1\xf3\x39\x8b\x39\xd5\x2c\x59\x9e\xa0\x1e\xcb\x88\x5a\x2a\xcd\xe6\x75\x96\xae\x8e\xd1\xc0\xc1\x8d\x71\xa1\x7f\xff\xcd\x96\x27\x9b\xe6\x50\x7d\x74\x59\x29\xc5\xcc\x60\x0c\x41\x65\x09\x3d\x0f\x92\x5b\xc4\xcd\x30\x06\xc1\x26\x36\x3b\xc9\x32\x5c\xe0\xbf\x99\x7d\x40\x49\xc6\x00\x81\xc0\xee\xdc\x03\xf7\x38\x46\x53\xbe\x95\xf9\x06\x28\xf4\x95\x81\xbf\xb1\x4a\xf8\xc7\xe0\xc5\x8d\x59\x8a\x8f\x22\x26\x04\x3d\x09\x4c\x94\x94\x80\x5d\x12\xd8\xb9\x21\x0f\xf8\x54\x11\x89\xb2\xb3\x93\xad\x66\x24\x42\x5f\x76\x44\xbd\xb7\x92\xb7\xe8\x3f\xd4\x60\x2f\x43\x80\xb8\x9d\x98\x4a\xde\x9e\xf6\x80\x34\xcc\x6e\x95\x60\x83\xc2\xb7\x58\xec\xa2\xd8\x0c\x35\x70\xa8\x62\x47\xaf\x8e\x5a\x21\xbe\x38\x9c\x4c\xa6\x74\x0a\xe7\xa9\xc1\xa8\xaa\xaf\x92\x98\x69\x96\xcd\x21\xe1\x7a\x26\xef\xf1\x77\x64\x5b\xa9\x7d\xca\x01\x3e\x9a\xd1\xce\xa4\x42\x1c\xac\x52\x12\x23\x9c\x5f\x70\x8c\xde\xd3\x25\xa1\x99\xcc\x45\x6c\xa5\x26\x4f\x40\xdf\x56\x3e\xfc\x4e\x0a\xa0\x14\xb9\x32\x73\x75\x5b\xa2\xd2\x63\xa6\xa9\x39\x36\x2f\x87\x2f\x5f\xb4\x32\x61\x0d\xf3\x56\xa1\x37\x15\x4b\xa1\xf3\x95\xbb\x33\xd3\x4a\xbf\x32\x46\xe3\xf7\x22\x69\x22\xcb\xbd\xc5\xed\x05\xaf\x0e\x40\x09\xe3\x13\xb0\xdd\xf6\xf1\xd6\x7d\xc6\x35\x0b\xc8\xe3\x31\xd4\x20\x32\xaa\x7b\x2e\xbc\x08\x7b\x52\x16\x41\xe0\x91\x3a\x03\xda\x1d\x0f\xa2\xf2\xf1\x81\xe7\xcc\x1e\x28\xd8\x72\xc5\x31\xf3\x1b\xee\x48\x6d\x39\x72\xe5\xe4\x4e\x72\x8c\x4f\x1a\x89\x4d\x4a\x7d\xd2\x4e\x90\x08\x0e\xd0\x68\xd6\x4d\x54\x12\x97\x37\x9c\xb6\x38\xda\x6f\xd9\x8c\x2e\x98\x22\x8a\xcf\x79\x42\x33\x04\xc7\x1b\x61\xff\xc8\x38\xd7\xeb\x33\xd0\x9b\x65\x37\x87\x3d\x09\x9a\xdb\x39\xd5\xae\x1f\x66\x9e\x80\x46\xb8\x7e\x99\xef\xcc\x73\x9d\xd3\x24\x59\x12\xf6\x39\x4a\x72\xc5\x17\x87\x9e\x26\x9b\xfd\xb0\x07\xab\xae\x72\xe9\x54\xc6\xa3\x94\x45\x8f\xc9\xa3\xcb\x1a\x86\x21\x55\xb1\x5b\x74\x07\xfb\xe8\x34\xf7\x25\x44\x3e\x01\x0a\xa5\x8b\xa9\x5c\x86\x71\x9e\x7e\x0c\x5f\x0a\xa0\x00\xbd\x57\x97\x09\x55\x9a\x47\xdf\x26\x32\xba\x1b\x69\x99\x35\xca\xd9\x3f\xfb\x61\xb4\xf2\x7e\x05\x86\xe1\xec\x87\x11\xb9\xe0\xea\x2e\x04\x76\x41\xa7\x69\x68\x2e\xa1\xe4\x2e\x1f\xb3\x84\xe9\xa3\x23\x85\x5c\x6e\x4e\xa3\x19\x17\xcc\x31\x38\xe1\x53\x52\xac\xc2\x67\x66\xb9\xa9\xcf\xd4\x26\x3e\x9d\xda\xfd\xfa\x6b\x7a\xaf\x18\x76\x7f\x6c\xba\x6f\x7e\x66\x75\x32\xd2\x5b\xf5\x53\x60\x67\xae\x2e\x5a\xf2\x41\x4c\xd4\x6d\x2d\x7c\xd9\xf2\x42\xbe\xe6\x09\x43\x1d\x07\x86\xe8\xa2\xd2\xec\x39\x80\x15\x5b\xca\x9c\xdc\x53\xd4\x8a\x81\x06\x0e\xc9\x2d\x4f\x5f\x91\x4b\xa1\xf2\x8c\x15\xf6\x8c\x49\xa5\x29\x40\xf0\xb4\x99\x65\x4e\x9d\x82\x15\x46\x95\x03\xd0\x5f\x51\xbb\x22\x97\x88\xce\xaa\x5e\x91\x1e\xfb\xac\xbf\xe9\xf5\x49\xef\xf3\x44\x99\xff\x09\x3d\x51\xbd\x21\xb9\x9a\x7b\x3f\x3b\x40\xff\x64\xcc\x85\x3e\xe1\x0b\x86\x19\x07\x7c\xf6\x41\x36\x88\x0d\xa3\x33\xd2\x5a\x2c\xc9\x3d\x22\x50\x18\x12\xcf\xb2\x4c\x66\x3e\xf2\x3c\x98\x06\xe0\x2e\x91\x9c\xa7\x99\x9c\xf3\xc0\xb0\x07\x1b\xbc\xd5\xf8\x3a\x30\x37\xec\x16\x49\x57\xd7\x1f\x31\xdd\xec\xcb\xa4\xcc\x1c\x37\xad\xfe\xd5\xc4\x45\x4c\xf4\x6d\xcd\x2e\x60\x49\x16\x42\x17\x03\x30\xc6\x4b\xd7\x8a\xa1\x56\xe1\x0a\xbf\xf6\x59\x73\xe4\x34\x66\x8b\x53\x15\xd3\x97\x7d\xf8\x8c\xb2\xd1\x7e\xba\xd4\x27\xaa\x48\xef\x65\x6f\x48\x46\x8e\xdb\xf6\xc3\x3e\x16\xcf\x4d\x64\xe6\x1b\x04\x63\xfa\x8b\x1e\x39\x96\x19\xb4\x1c\x51\x41\x12\x46\x17\xd6\x80\x8c\x67\x6a\x89\x3a\xed\x49\xed\xac\xc7\xba\x09\x60\x81\x96\xff\xbb\xaf\x77\x3c\x5d\x4f\x12\x5d\x5d\x37\x17\x19\xd9\x33\x22\x68\x0f\x84\x49\x69\x68\xac\xa1\x9a\x86\xad\x02\xac\x96\x6d\xbb\x18\x30\x17\x2b\x9a\x32\x36\xb0\x75\x51\x7b\x20\xa7\xf6\x9e\x80\xea\x92\x86\xf9\xf5\x8e\xa4\x36\x9d\xcd\x0f\x82\xff\x9c\x33\x52\x20\x7a\xa6\x2c\x43\x6c\x51\x4d\xe2\x12\x0f\xe3\xc8\xd8\x8e\xcf\xe6\xf4\xef\x52\x90\xcb\x6f\x47\xf6\xa3\x27\x4f\x3a\x3d\x3b\x89\x04\xfd\x7b\x9e\x31\xc3\x8e\x9b\x04\x0c\xb8\x77\xaa\x9c\xdd\xdc\x27\x17\x54\x53\x64\xf0\x36\xe4\x4a\x14\x14\xde\xec\xc2\x31\x17\xb1\xfd\x29\xe0\xdc\x8f\xcd\x64\xcd\xea\xbd\xdb\x26\x2f\x85\x0f\x7e\xb8\xb9\x6a\x89\x19\x47\x40\xe3\xa7\x6f\x65\xdc\x98\x23\xff\xc5\x4c\xe0\x39\xbe\x4f\xe6\xa6\x01\x62\x74\xf6\x3e\x1c\x67\x62\xce\xb3\xfd\xe7\x0f\x46\xe3\xac\x4d\xbc\x6a\xb1\x11\x37\x5b\x0d\xfb\x7c\x1b\xe8\xe9\x40\x3b\xcc\xd6\x80\x73\x63\x19\xca\x38\x91\x63\x87\x3f\xdb\x76\x7f\x3f\xdc\x5c\xed\xd1\xdd\x0f\x37\x57\x8f\xdb\xd5\xbd\xc4\xb3\xaa\x74\x56\xf0\xe0\x22\x1d\xa3\x2a\x76\xd5\x97\xb9\x86\x6d\x49\x5b\x6d\xce\xd3\x6e\x3c\xf6\x95\x59\x3a\xba\xfc\x9c\x62\xf0\x99\x35\xf2\x8f\x66\x14\xf2\x98\x7d\x76\x1d\x2c\xaa\x59\x65\x65\x28\xbb\x5b\x5e\xa3\xd1\x01\x7d\x22\x17\x0c\x5d\x96\xf1\x2b\x17\x08\xe0\xdf\x58\xff\xc2\x5b\x08\xbb\x8c\x5f\x21\x5d\x25\x18\x85\x19\x07\xbb\xe9\x18\x4d\x44\xc2\xff\x64\x0b\xe8\xf0\x84\xeb\xa5\xe1\xd0\x27\xc3\x52\x68\xa9\x82\x2e\xb7\x7a\x98\xf7\x14\x2d\x56\x0c\x54\xe4\xd8\xb4\x74\x0a\x06\xae\x93\x61\x21\x55\x40\x59\x03\xf0\xa7\xa0\xe8\x51\x12\x39\x14\xd3\xb0\xdb\x2a\x12\x47\xdd\xad\xb2\x9b\xdd\xc3\xc4\x9b\xf3\xd1\x94\xa1\x99\x77\xd6\x32\x34\xf8\x61\x64\x31\xe1\x9e\x33\x4f\xc3\x7c\xa9\x5a\x5c\x0d\xb6\xd5\xce\x27\xeb\xf3\xb5\x5f\xf6\x9e\x22\x3e\x19\x6d\x0f\x26\x18\xd6\xf3\x70\xf9\xf5\xa5\x30\x4a\xdc\x65\x23\x4b\x4a\x2c\x5c\x12\xf2\x4d\xb3\xb7\xbe\xaf\x01\x15\xd0\x04\x60\xc1\xad\x7c\xd3\x94\xab\x19\x84\x55\xec\xde\x5c\xf5\xab\xa7\xb1\x74\xb6\xb9\xec\xde\x9a\x2e\x9c\xb3\x74\xf6\x7a\x54\x36\xcf\x99\x7b\xe4\xf5\x68\xcd\xb9\x84\x49\x86\xd1\x2a\x34\xda\x1d\x29\x92\xf0\x09\xdb\x59\xcd\xe9\x01\x4e\xe6\x5c\x0a\xee\x4b\xde\x6f\xba\xea\x9f\x36\xd7\x5c\x53\x7e\x58\x20\x79\xbc\xb5\x2d\x60\x00\x5c\x24\x93\x84\x45\x0e\xc7\x1a\xa6\xd4\x7d\x62\x9d\xf2\x62\x6b\xe6\x14\x28\xff\xa8\xa8\x9c\xe2\x82\x9e\xde\x5c\x9e\x5d\xbc\xbd\x1c\xce\xe3\x5f\xcf\xe4\xfd\x40\xcb\x41\xae\xd8\x80\xd7\x80\x0a\x79\xba\x30\x42\xbc\xd2\x5a\xc8\x55\xe5\x29\x7d\xef\x12\x18\xc9\x07\x85\x61\x03\x60\xca\x71\x4e\x21\x29\x75\x9f\x64\xd4\x26\x29\x52\x57\xa6\x26\x49\x70\x96\x75\xc6\x58\x3f\x54\xa9\x77\x54\xfd\x68\x38\xa0\x7d\x8d\x08\xc5\xa0\x1e\x96\x40\x3f\xfe\xe6\x6a\x42\xeb\x77\x0b\x11\xdb\x66\x6e\xe4\xdb\x70\xf1\x17\xe0\x6a\xd2\x12\xe2\xb3\x20\xde\x76\x22\x33\xb3\x6b\xb2\xf2\x0e\x60\x3a\x82\xc1\x9e\xe6\x8a\x65\x43\xcb\x31\x1e\x7d\xa2\x1a\x80\xf5\xec\x81\x91\x56\x9d\xa6\x1b\x36\x21\xa5\x5a\x32\x56\x8a\xa2\xb9\x9e\x31\xa1\x1d\xe4\xb8\x9d\x8c\xb5\xf3\x66\x23\x9c\x1f\x7d\xa2\x6a\xc2\x03\x35\x03\xf3\xe9\x00\x70\x9a\x6c\x43\x73\x50\x0e\xa2\xdb\x3e\x3b\x2a\xa3\xb1\x84\x10\x08\xc4\x74\x2b\x6d\x30\x1a\xcf\xb9\x78\x86\x07\x31\xe2\x22\xde\x35\xfe\x0a\x70\x1d\xbc\x51\x96\xa3\xb0\x15\x67\x3d\xf7\x9e\x38\xea\xf4\x1a\x4c\x21\xb7\x3e\xb9\xb2\x47\xae\xd6\xa1\x9b\x2f\xd5\xcf\xc9\x00\xbf\x32\x48\xe3\x62\x56\x3a\xf7\x5a\xfb\x06\x9c\x47\x70\x9a\xb5\xb4\xbe\xe4\xdf\x4f\xa0\x39\x78\xa6\x9a\xc8\x30\x07\xf1\x66\xa8\x9a\xa2\x5c\xd2\x16\x22\x82\x61\xf9\x15\xab\xbb\x9a\x29\x48\x69\x46\xe7\x4c\xb3\x0c\x43\xc7\x6c\x30\x9a\xb0\x51\xfd\xef\x53\x26\x46\x9a\x46\x77\x6d\x43\x88\x76\xfc\xf4\xe1\xf8\xe9\xbe\xde\x32\x17\x24\x13\xfb\x9d\x60\x01\x85\x96\xa1\x67\x96\x0b\xcb\x6c\x9e\x09\x5d\xf1\x38\x5e\x4d\x2c\x11\x1e\xc7\xa9\xcc\x44\x0b\x5c\x2f\x34\x3e\x40\x88\x98\x07\xa6\x83\xd0\x77\x9c\x85\x76\x98\x5e\xfd\x43\x60\xe5\x98\x7d\xfc\x4e\x05\x3d\x98\xcb\x98\x91\x31\xd7\xc5\x49\x57\x4c\x93\x94\x65\x73\x6e\x13\xa0\xa5\xc0\x1a\x7c\x2c\x46\xee\x65\x38\x95\xfd\x74\xc0\xd9\x04\x91\x91\x76\x45\xae\xc8\x98\xe9\x7b\xc6\x04\x79\xf1\xe2\xc5\x0b\x90\x37\x5e\xfc\xe1\x0f\x7f\x20\x80\xb8\x10\xb3\x88\xcf\x57\x1f\x84\xa7\xfe\xe3\xe5\xcb\x21\xf9\x3f\x67\x6f\xdf\x40\xfc\x55\xaa\x15\x19\x4b\x3d\xb3\x2d\x9b\x07\x4a\x2f\xab\x3e\x94\x0e\x76\x62\x82\xaa\xfc\x0a\x2a\x85\x1f\x5e\x39\x98\xee\xc5\xef\xbf\xf9\x66\x48\x2e\x78\x06\x99\xb7\x1c\x72\x05\x7c\xb8\x60\xea\x42\xe8\x84\xd4\xab\xb9\xee\x96\x4d\xd8\x70\xda\x39\x9f\xce\x34\x56\x4b\x82\x9d\x92\xf0\x48\x23\xfa\x1e\x1e\x76\xc4\x42\x52\x36\x95\xc4\x26\x46\xd9\xc0\x11\xe8\x5c\x1f\x2a\x0a\x93\x89\xfa\x2e\x93\x79\x5a\x24\x04\x66\x4c\x19\x19\xd5\xd6\x62\xc2\xc6\x8a\xb5\x52\x4c\x3f\x69\x24\x43\x4d\x4b\x4d\x69\xd3\x5d\x95\x04\x90\xbe\xc7\x1f\x1b\xe0\x4e\x48\x29\xf7\xc1\x75\xe0\x6e\x2e\xa1\xdf\x7b\x2d\x32\x0e\xce\xa9\xcb\xef\x48\x33\xf9\x37\x5c\x24\x2e\x5c\xa6\x90\x95\x79\x95\x95\xb9\x6c\x62\xa6\x2b\xa0\x1c\x66\xae\x1b\xbe\x67\xb3\xe2\x83\x1c\xa3\xab\x49\x98\x8c\x06\xa9\xdb\x5c\x99\x4f\x94\xc0\x21\xd7\x7c\x39\x2c\x4f\xa8\x67\x0a\x57\x34\x17\x2b\x6f\xdb\x5a\x23\x96\xd2\xd8\x0a\x34\x36\xcd\xab\x68\x03\xc3\x55\x6d\x92\x4c\x50\xd7\xa8\x04\xd8\x56\x0a\x92\x51\x4c\xe7\x76\x6a\x20\x56\xc9\x7c\x9b\x29\x65\x73\x6d\xe6\x34\xbb\x33\x62\xbf\x3d\xff\x43\x88\x0c\x56\x3e\xcf\x07\x93\xae\x16\xcc\x17\xa9\x0b\x23\xeb\xcd\x47\x8e\x86\xc3\x23\x3c\x20\x32\x43\xbc\x4b\xdc\xed\xe6\xfe\x13\xe5\x14\x97\x23\xb7\x69\x1a\x94\xa0\xb3\xa5\x3d\x68\x29\x22\x98\xda\x99\xaa\x5f\x5b\xbd\xa6\xf8\xd2\x0c\x2f\xb8\x2e\x62\x30\x3e\x99\xd6\x29\x5b\xd0\x54\x82\x6a\x00\x30\xbc\xb9\x6e\x8a\x3d\x02\xf5\x30\x83\x1b\x63\xe0\x12\x8c\x8a\xd8\xa7\x8f\x4d\x99\x9c\x4d\x62\x2b\x55\xcc\x7a\xfe\x5c\xed\x6a\x82\xe9\x1f\x65\x5a\x65\x69\x41\x20\x21\x14\xd5\xa9\x8a\x5c\x90\x67\xcd\xbc\xc2\xed\xd2\x0c\x8d\xbd\x09\x23\xc3\xab\x9e\x93\x00\xaf\x95\x73\xe0\x69\x66\x5a\xaa\x76\x91\xa0\x01\x00\xe4\x46\x77\x58\x86\xe4\xad\xa5\xa9\xb8\xb9\xe8\x58\xc9\x24\xd7\xf8\x6a\xf1\x63\x48\x70\xa1\x51\x07\x39\x00\x54\xd6\x3f\x16\x90\x5f\x5d\xd4\xfb\xaa\x47\x89\xf1\x6a\x70\x18\x3b\xe8\xcb\x27\x83\x95\x2d\x10\xbb\xd5\x83\x41\xcc\x46\x8a\x37\x51\x95\x46\x57\xe4\xb8\x28\x95\xe1\xdc\xdc\x57\x42\xb3\x6c\x42\x23\x76\x12\xaa\x50\xbe\x24\x89\x8f\xac\x71\xb9\x01\x33\x2a\xe2\x04\x45\xeb\x88\x65\xb0\xe5\xd9\x67\x5b\x2c\xd7\x7c\x22\xce\x38\x14\x81\x3d\xfe\x96\x19\x79\x90\x51\x9d\x67\xac\x56\x86\x51\xbb\x61\x85\xd0\x8d\xb6\x94\x36\x68\xac\x69\x48\x05\xbc\xe4\x24\x54\x11\x1c\xab\x62\x9a\x70\x56\x71\x4a\x55\xa8\x96\x0e\xcd\x56\x02\x7a\x0c\xa4\x62\x29\xf3\xcc\xda\xbd\x1d\xb6\x68\x24\x33\xa3\x08\x61\xc3\x54\x91\x8c\x4d\x8d\xb4\x9a\x81\x58\x8b\x4f\x24\xb9\xb9\xd1\x6a\xf0\x57\xcb\x41\x72\xdb\x42\xdc\x26\x56\x7c\x96\x0b\x1e\x3b\x16\x09\xbe\xa5\xa2\xc4\x5f\x4a\x55\x90\x77\x12\xc0\xb1\x07\x33\x8c\xc2\x38\x30\x52\x9f\xd1\x59\x8a\x9f\x0e\xad\xbb\x12\x80\x1e\x6a\xd4\x52\x68\x42\x84\x65\xcc\xae\xf3\x71\xc2\xd5\x6c\xb4\xa7\x29\xf0\xdd\x9a\x26\x30\x60\x60\xc5\x51\xb7\xd1\x3c\xa8\x98\x50\x1c\x58\x9e\x21\xe3\x86\xd9\x42\xed\x60\x09\x93\xe8\xde\x0e\x77\xa6\x84\xc4\x88\x84\xd9\x74\x7e\xf3\x53\xd0\x0f\x9b\xa1\x85\x00\x1e\x31\xfb\x20\xd2\xd2\xfd\x88\x26\x89\xaa\x66\xaf\x3a\x42\x8b\x32\x87\xcb\xda\xc2\x35\xe5\x66\xb9\x7d\x99\x90\x0a\x14\xe4\xc6\x81\x29\x32\x97\x98\xe1\x22\x88\x14\xee\x21\xc0\x21\x71\x2f\x04\x59\x7d\x90\xbb\x0b\x5b\xa6\xe5\x3a\x8a\x9d\x0d\xf4\xe1\x6c\xa0\x7b\x7a\x1a\x8a\x4a\x4a\x34\xc8\x08\x2e\x97\x7a\x76\xa4\xd4\x91\xdc\x1d\x2e\x89\x56\xbd\x02\xf8\xcd\x33\x8d\xe5\xc9\x1b\x63\x9e\x7d\xac\xbc\x0e\x6c\xda\xe8\x1d\x70\x78\x07\x56\xb3\x88\x82\x9d\x69\x15\x02\x7f\x04\x56\x8f\x7c\xc1\x73\x80\xdd\xe0\xcd\x23\x45\x62\x19\xe5\x1e\x1b\x15\x26\xad\x70\x80\xd5\x41\x10\x24\x4d\x8f\x53\x73\x58\xab\xf0\x23\x3b\x77\x55\x2c\xef\xc5\x3d\xcd\xe2\xb3\xeb\x1d\x71\xe9\x65\x76\x5e\xbc\x15\x0a\x4a\xae\x31\xa8\x84\x47\xc7\x32\xd7\x05\x7c\xe6\x2f\xdb\xf4\xac\xa5\xa1\x08\x35\x2d\xcd\xa4\x33\x5e\x77\xc6\xeb\xea\xf5\xe0\xc6\x6b\xf3\x4e\x19\x0b\xb6\x74\x5c\x1d\xc4\x00\x4f\xea\x86\xd2\x3e\xa4\x15\x34\x20\x30\x48\xdd\xab\x71\xf0\x15\xb9\x0d\x8f\x48\xb1\xb6\x81\xac\xe7\x28\x10\xb0\xea\xa7\xb7\x98\x3e\x90\x1d\xb4\x7e\xad\x5e\xbc\x36\x85\xe0\x6e\xab\xdd\x0b\x52\x43\x50\x6c\xb7\x6f\x91\x90\xfb\x56\xef\x12\x71\x51\xc6\x0e\x81\x98\x1b\x94\xea\xc4\xab\xe1\xe4\x93\xc6\x0b\x40\x1a\x16\xd2\xc5\xab\xe9\x6a\x90\x3d\x8a\xea\xe2\xf5\xc4\xa5\x75\xf1\x6a\x6c\xe2\x26\xcd\xcb\xec\xae\x19\xee\xc3\x16\xdb\xdd\x73\x68\x8f\x6f\xbd\xef\x17\x25\xde\x9e\x3f\x5b\xef\xac\xf7\x2b\xd7\x23\x5a\xef\x03\xc2\xed\x88\x81\x9d\x80\xd0\xa2\x1f\x9a\xdb\x9c\x59\x7f\xcc\x9c\x58\x39\x2c\x10\xc8\xcc\x96\x73\x06\x7d\x99\x95\xdd\xa6\x47\xc3\xe1\xd1\x91\x33\xf3\xdb\xfd\x99\xeb\xc9\xe0\x8f\x84\x89\x48\xc6\xb8\xa8\xa6\xfd\x4c\x69\x60\xfa\x85\x76\x1e\xf6\x65\xee\xbe\x15\xba\x5e\xa1\xed\x66\x4b\xd2\xe0\x04\x37\x2f\x9d\xbd\x6e\xa6\x1f\xa3\x80\x76\x58\x26\xbb\x5c\x15\x1b\x9f\x38\xa4\x14\x76\x38\x79\x0f\xce\x5f\x6b\x17\xc7\xc6\x6b\x1f\xf6\xba\x47\xa1\x6c\xbc\x1e\xb9\x5c\x36\x5e\x7b\x71\xd4\x46\xa5\xb3\xd7\x0c\xee\xf1\x0a\x68\xe3\xf5\x4c\x8b\xa9\x94\xaf\x46\xc5\xb4\xf1\xda\xaf\xa4\x76\xf9\xdd\x86\x4b\xdf\x4a\x79\x6d\xbc\x9a\x15\xd9\xc6\xab\xed\x52\xdb\x78\xd5\x9c\x09\xb0\x81\x5f\xf0\x46\xc9\x03\x97\xf6\x9d\x72\xe4\xa3\x66\xf3\x54\x66\x34\x5b\x92\xd8\xda\x1a\x96\x6b\x12\x30\x83\x0c\xcc\x83\x51\x51\xa0\xef\x31\xcf\x5a\xca\x1f\x68\x90\x7c\xc9\x62\x9e\x6f\x2c\x59\xbc\x69\xda\x7e\x00\x34\x2c\x8b\xa4\xe5\x9c\x9b\xd8\x94\x87\x12\xa4\xd1\x9d\xad\x91\xe3\xe6\x10\x39\x7d\x08\xb9\xd3\xab\x20\x1f\x83\x31\x0c\x3c\x7d\xb6\x16\xa0\x7b\x18\xdb\x2e\x19\xae\xd0\xe5\x61\x7d\xff\xc7\xf6\xc1\x13\x23\x7f\xbc\x05\xa6\xf7\x48\x6b\x42\x1a\x26\x99\xf1\xbf\x33\x28\xb0\xd5\x18\xc2\x4a\x82\xd8\xed\x0b\x7f\x25\x32\x0a\x1c\xcb\x25\xf6\x03\xb3\xee\x77\xb6\x33\xcc\x9b\xb9\x37\x5f\x47\xe1\x01\x2c\x3a\x89\x42\x5f\x1d\x8f\x00\xbb\x11\x44\x74\x98\x3b\x3f\xdf\xb7\x41\x19\xbc\x5c\x99\x2f\x01\xb4\x7a\xf0\x4c\xf1\xa1\x7b\x07\x21\xa9\x83\x4a\x65\x65\xc5\xc2\xfc\x32\x72\x33\x10\x28\x65\x90\x9e\xe0\xa4\x70\x95\x83\x0c\x68\xbf\x62\x65\x21\x39\x01\x7f\x54\x51\xf7\xcb\xa3\x17\xae\xec\x2a\xc1\x93\xf2\xb6\x72\xd0\x6d\x7e\xe0\xb9\xb0\x51\x04\x2b\x7b\x64\xfd\x16\xc9\x15\xcb\x06\xd3\x9c\xc7\xfb\x6c\x8e\x67\xcc\xdd\x6a\xf3\xb4\xe6\x9c\xac\x21\xff\x3a\x80\x6b\xf9\x28\x8b\x06\x74\xbf\x77\xe9\x43\x33\x4a\x84\x3f\x84\x84\x2b\x87\x69\x50\x17\x09\xe0\x8f\x9c\xf3\xf7\xdc\x7a\xbd\xd5\x32\x84\x68\x19\xd9\x34\x59\x5e\xc2\x73\xc4\x66\x71\xe7\x41\x54\xea\xc0\xfc\xc7\xe9\xb7\xce\x58\x3f\x66\x13\x59\x94\x00\x41\x75\xc7\xc6\xd2\xc6\x2c\x61\x50\x27\xdd\xd5\x60\x37\x0f\x80\x9b\x77\x2e\x17\x66\x33\x7f\x12\xe4\x83\x03\xa5\xe7\x93\x57\x84\x9e\x94\x52\x15\x6c\x59\x15\xc1\x58\x8c\x01\xb6\x49\xf1\x9d\x2c\x17\xaa\x4f\xc6\x27\x2e\xd8\x04\x4e\x9c\x30\x32\x5f\xe2\xc4\x59\x54\x9a\x33\x66\x26\x00\x12\x7e\x33\x39\x27\x4a\xd0\x54\xcd\x24\x54\xd7\x8f\x68\x4a\x23\xae\x97\x44\x67\x34\xba\x83\x1a\x3c\x19\xb3\x9f\xeb\x93\xe8\xc4\x06\x6b\x85\xd3\x57\x8e\xf9\xd5\xb3\x4c\xe6\xd3\x19\x84\xb1\xe2\x53\x51\x42\x95\x1b\xfd\xda\xf7\xad\x2a\xa3\x48\xbc\x14\x74\xce\x23\x8f\x98\x97\xc9\x05\x57\x5c\x5a\x53\xae\x6b\xf7\xda\x23\x9e\xa1\x79\xf8\x3c\xa1\x7c\x4e\x8e\x15\x63\xc4\x6f\x09\xfc\xc5\xd6\x69\x47\xb3\x45\x56\x76\xf8\x4b\x8f\xd9\x2d\x2c\xd0\x40\x41\xe0\xbc\x67\x0a\xf9\xa3\xe9\xf9\xda\x8f\x9e\xf8\xe5\x5a\xdf\x27\x99\x81\x33\xde\x21\x55\x32\x11\xcb\xc0\x25\x79\x76\x7d\xa5\x42\x55\x03\xf7\x96\xc5\x73\x83\x1f\x12\x29\xa6\x61\x9a\x7e\xb1\x33\x0d\x29\x15\x50\xbf\x64\xc1\xe3\x9c\x26\x48\x44\x6d\x67\xce\x47\x57\xf8\x3a\x9f\xce\xf4\xe0\x9e\x81\xa9\x05\x79\x4d\x11\xce\xe4\x3e\xca\x57\x42\x71\xb8\x02\xa2\xab\xad\xa9\x00\xcd\x56\xa6\x6b\xf7\x74\x09\x98\x2e\x36\x6c\xa4\xe4\x0d\x75\x78\x5a\xd8\xc4\xba\x19\x87\xee\x9d\xf9\x7a\x14\x46\x4a\x00\x5b\x94\x99\x62\xd8\xa9\xab\x7d\x33\x13\x1f\xe0\xdb\xf9\xdb\xb6\xf4\x18\x35\x0b\x64\x24\xb7\xed\x8a\xca\x03\x48\x5c\x8b\x62\x91\x6f\x6d\x6d\xc0\x86\xb2\x40\xef\x87\xc0\x26\x16\x78\x31\xcc\xb1\xa1\x22\x1e\xd0\xc4\xec\x9c\xeb\x8f\xe7\x36\x4a\x19\x0f\x42\xc9\x4b\xef\xca\xfc\x70\xe1\x71\xa1\x8d\xcc\xb0\xf6\x08\x40\x3a\xfa\x98\xc5\x40\x34\xc2\x8a\x88\xf7\x46\xfd\xb5\x8b\x77\xfd\xf1\xbc\x4f\xf8\x90\x0d\xdd\x5f\xfe\x51\x47\xb5\xb4\x9c\x62\x8c\x9f\x8f\xdb\x84\x7d\x07\x5d\x09\x2d\x4d\xe1\xbb\x7f\xfd\x2f\xd3\x49\xf3\xeb\x9f\x06\xff\x15\x20\x6d\xfe\xe9\xaf\x86\x08\x66\xe6\x81\xf2\xdd\x30\x50\xcc\xc3\xca\xff\xf5\xda\xc2\x2e\x5b\x50\xe6\xbf\xda\x6a\x53\x4c\x68\x23\x26\x5e\x4b\x70\xc1\xf3\x18\x77\x23\x7c\x3b\x63\x7f\x73\x56\x43\x98\x26\x6f\xb1\x89\xa8\x66\x02\x08\xb5\xcb\xa8\x10\x52\xe3\xeb\xb6\xb0\xaa\xe9\xff\x31\xe8\xfb\x98\xfc\xd5\x27\x5a\x4a\x38\x8e\x78\xe4\xcf\x04\x61\xae\x18\x25\x8e\x15\xa6\x83\xda\x28\x34\xc7\x7b\x4c\xb3\x66\x86\x7d\x7e\xac\xe9\x07\xf4\xed\x2b\x21\xf5\x57\x7e\xf9\x2b\x65\xb2\xe9\x42\x72\x87\xb0\x6d\x4e\x8a\xc0\x92\x85\x1e\xf3\x79\xbc\x24\x73\xae\x34\xbd\x63\x43\x32\x32\xbc\x25\x74\x75\xe1\xec\x09\x02\xc8\x8c\x2c\x26\xb9\xd0\x3c\x81\x5f\x8b\x76\x4c\x97\x43\x9e\x73\x35\x21\x2a\x87\xfa\xdd\x69\xc6\x06\x8e\x8b\xd9\xa7\x56\x68\x41\x31\x96\xbe\x5f\xec\x19\x45\xd1\x3f\x8d\xe1\x55\x98\x0f\x2a\xec\xf6\x5a\x89\xcd\x32\xfd\x94\x22\x2a\x38\x17\x4c\xa6\x1a\x92\x77\xc0\xac\x12\xe7\xef\x45\x2d\xc4\x5a\x27\x05\x8b\x98\x52\x34\x5b\xf6\x01\xb9\x9c\x7b\xb4\x6b\x1b\x8e\x03\x1c\x75\x4e\x05\xe2\x86\x67\x2c\x92\x42\xe9\x2c\x8f\x34\x16\x92\x1b\x67\xf2\x8e\x09\x1f\x0b\x68\x56\xb1\x1c\x94\x55\x04\xc7\x80\x33\x4b\x92\x68\x46\xc5\x34\x28\xc4\x32\xa7\x31\xcc\xfd\xf7\x5e\xca\x71\xe3\x31\x33\x40\x27\x46\xb0\xe0\x1a\xa6\x62\x6c\xf8\x88\xb7\xb1\x7e\x12\xc4\xa9\xd1\xfd\xc2\x08\x6a\x86\xc4\x93\x1d\xb4\xab\x11\xfd\x22\x0d\x2d\x76\x03\x60\xdb\x2d\x07\x75\xcd\x99\xa6\x31\xd5\x74\x8f\xc0\xae\xb7\x45\xf5\x38\x57\x40\x1e\x2b\x78\x7a\xaf\xa3\xe5\x43\x4e\xdc\x92\x29\x0f\x93\x97\xe0\x24\xce\xdc\xcc\x43\x36\xb4\x36\x7b\xca\x7a\x01\x30\x5e\x0b\xe4\x19\x57\x9e\xcb\x34\xef\x5a\x43\x72\x51\xd4\x1e\x2c\xc8\x49\x3d\x1f\x53\x43\xf3\xaa\x99\xfa\x3d\xe6\xe8\xb6\x70\x84\x45\xe5\xe0\xad\xb5\x22\x08\x72\x09\x26\x34\xcf\x58\x98\x2b\x66\xa7\x2e\x17\xb8\xc9\x2b\x93\x08\xb3\x3c\x65\x5a\x15\xe1\x27\x48\x87\x0d\x71\xb1\xfc\xce\x2a\xa3\x40\xa4\xed\xc4\x5a\x7d\x6e\xbd\x2c\x84\xd3\xae\xa4\xa5\xb3\x86\xf2\x3f\xc8\xbc\xee\x63\x51\x46\xbc\xfc\xb7\x32\x6e\x62\x84\xae\xc0\xcc\x17\x4d\x14\x31\x99\x18\x5d\xab\x40\xa9\xc7\x6f\x80\x2b\x4a\x95\x32\xde\x90\xc8\xcd\xe8\x62\x7f\x0b\x54\x21\x23\x0d\x3c\x44\x2f\x7c\x6e\x00\x9f\x1b\xbc\xac\x6f\xa9\x6b\x12\xde\xe1\xae\xda\x61\x1e\xe5\x8f\x34\x32\x8b\x1a\x92\x32\x6a\x68\xcb\xac\xe2\x87\x7b\x6a\x6f\x9d\x83\xde\x21\x6b\x13\x18\x18\x37\x74\xe2\x15\xf9\xaa\xc4\xdf\xad\x1c\xe5\x75\x24\x8c\xbb\x3d\x76\x4a\xd3\xd0\x2e\x82\x4b\x0f\x2f\x3f\x7e\x52\x69\x0c\x04\x8b\xf5\xba\x84\x8b\xef\xf5\xc2\x9e\x11\xcc\x32\xb0\x92\xb9\xb4\x02\xb3\xb1\x32\x99\x24\x2c\x83\x21\x58\xbd\xa9\xe2\x1c\x07\x64\x4f\x34\xd5\xf6\xbd\x72\xea\xa5\x4b\xc1\xee\xbd\x18\x41\x15\x62\xa8\x38\x47\x16\xb3\x35\xe1\x36\xb6\xe7\x63\x90\xcf\xc4\x12\xbb\x7e\xe1\x97\xc5\x29\x9d\x64\x6a\x3e\x64\xe4\x4d\x41\xc7\x09\x3a\x85\xfd\xc4\x43\x5f\x68\x72\x4f\x97\x0a\x76\x7c\x21\xc7\xfb\xef\x5b\xbc\xb2\xa2\xe1\x1b\x36\xc1\xb7\x6b\x3b\xba\xf6\x72\x75\xed\xe3\xec\x82\x2c\x48\x2e\xea\x44\x16\x15\x2f\x6c\xad\x89\x51\xbd\xf6\xf1\x8e\x41\xf8\x09\x78\xc5\x9b\xb9\x3a\xca\x00\xa4\xd7\x57\xd0\x84\x93\xc6\xa7\xf0\x87\xe3\x35\xde\x17\x30\x66\x66\x57\x17\xf9\xcd\xb0\x43\xc2\x77\xd7\x04\x08\x14\x5b\xeb\x7b\x00\x29\xb5\xe6\x60\x5f\x44\x2b\x63\x10\xe0\x01\x5f\x1c\x02\x08\x3f\x15\x4b\xcb\xc3\xf5\x8c\x67\xf1\x20\xa5\x99\x5e\xa2\xe2\xd8\x2f\x7d\xcd\x07\xcb\x37\x1a\xf8\x9e\x5e\x9a\x7a\xf8\xbf\x1b\x67\x18\x06\xef\x0a\xe1\x59\x33\xfc\xc6\x79\x7d\x8c\xf1\xd4\x0f\xc7\x5f\x3b\x9e\x77\x41\x76\xba\xd3\x05\x9f\x6c\x3c\x71\x48\x3e\xf6\xe5\x18\x15\x1f\x2a\x12\xfe\xb0\x0e\x93\x0c\xc3\x99\x3d\x47\x07\xe5\xc7\x74\xa0\x6f\x74\x4e\x5a\x14\xce\x0e\x8c\x78\x56\x2a\x70\xc1\x30\xb6\x6c\x8f\x58\x5a\x33\x4d\xf8\xad\xb0\x01\x7f\x2e\xc8\xb1\x90\x02\xcf\x0a\x3e\x7b\x82\xb1\x40\x1b\xec\x50\xf0\x88\xad\xb7\x56\x2e\x77\x19\x9c\x4d\xc7\x16\xb8\x88\xcd\x62\x01\xad\x06\x7d\x48\xe5\x51\xc4\x98\xd7\xa0\xc3\xea\x2b\xc5\x59\xb6\x5d\x76\x75\x1b\x95\x04\x60\x15\xa5\x69\x92\x14\x9a\xab\x9d\x2e\x09\x9c\xcd\x59\xfb\x02\x86\x57\x4a\x94\xb1\x4a\x3c\x54\x04\xb7\x28\x95\x22\x42\x5f\x3c\xd7\x4b\xd7\x83\x90\x03\xc1\x6b\xa0\x32\x28\x54\x68\xf9\x04\x6d\x4c\x81\xe8\xef\x27\x13\x88\x91\xad\x47\x5e\xe6\x45\x16\x44\xc1\x50\x9e\x31\x8d\xee\xee\x69\x16\x43\x5d\xda\x94\x6a\x8e\xb0\xd8\xfd\x52\xb3\xc7\x41\x1f\xa0\x2a\x7c\xb8\xf9\x4e\xbc\x82\x01\xc5\x2e\x64\xe5\x33\x84\xe6\x5a\xce\xa9\xe6\x11\xa8\xad\x7c\x12\x58\x0c\xe7\x1e\x45\xb0\x52\x43\x0f\xe8\xaa\xaf\xc6\x7e\x8b\x9e\x97\x8c\x11\x7d\x2f\x09\x9f\x1b\x99\x80\x42\x39\x88\x89\xcf\xf8\x71\xb6\xcd\x6d\x3d\x35\x82\xcf\x0f\x60\x50\x0e\x9e\x42\x85\xd8\xa8\x4b\x0a\x9a\xf7\xd6\x4b\x6f\xb6\xb3\x29\x33\xfd\x0a\xcb\xb6\xef\x98\x3d\x6d\xfa\x1a\x6c\xd5\xbe\x59\x9e\x7b\x66\x24\x01\xb5\x75\xc3\xaa\xe1\xba\x1e\x61\x81\x56\x45\x62\xae\x2a\x55\x96\x8f\xe3\x4c\xa6\xa9\x35\x86\xcc\x4f\xaa\x3d\x02\x1f\x41\xb6\x60\x2a\x28\x24\x8c\x66\xe9\x29\x13\xbe\x12\xb6\xc5\x9d\x80\x93\x5b\xfd\x44\xe9\xc0\x0c\xc9\xf1\x59\x92\xce\xe8\x09\xf9\x60\x0b\xe6\xf8\x9d\xeb\xe3\xe7\x6a\xc9\x4a\x68\x5a\xb1\xe2\x52\x27\xe4\xd4\xbd\x3a\x21\xa7\x13\x72\xfe\xbd\x85\x1c\x1f\xb8\xb5\xaf\x80\x73\xe3\xa3\x15\x2b\xe5\xb5\x9d\xe7\xbf\x08\x67\xdc\x64\xb1\xb8\x9a\x90\x1b\x16\xc9\x05\xcb\x90\xc8\x41\x19\x4b\xc3\xcc\x5f\x53\x9e\x18\x12\xe7\x48\x5d\xa1\x11\x02\x9a\x69\xd9\x0e\x17\x28\xe1\x7e\x36\xed\x36\x9f\xdb\x4e\xd9\x9c\x3d\xf3\xbc\xf5\x88\xa5\x19\x5b\x70\x99\x2b\x17\x9f\x90\x6b\x3c\x66\x4a\x5b\x86\x3b\xe3\x53\x8f\x72\xed\xfd\x9a\x19\x8b\x64\x16\x17\xc9\xe1\x4a\x53\x9d\xab\x72\xc6\x43\x84\xa6\xb3\xf6\xac\x31\x7e\x1e\x1f\x98\xba\xef\x47\x49\x31\x3c\xe3\x80\x53\x71\xf4\x06\x03\x3c\x8a\x2a\xd2\x3a\x88\x39\x29\xe2\x5d\x8c\x0c\x95\x6b\x16\x6c\x2b\xbb\x01\x1a\xcf\x75\x29\x7f\xf5\x14\x2b\x97\x0c\x7c\xb3\x83\x22\xc4\xa4\x06\x7c\x79\x78\xed\x35\xeb\xe4\x80\x54\xcd\xf0\x7a\xc6\x51\x26\x95\xc1\x36\x8f\xa3\x24\x07\xc6\x52\x92\x43\xe2\x29\x49\x9b\x31\x95\xc4\x47\x66\x1f\x72\x62\x6e\x5c\x4c\x78\xe5\xcc\x58\xc2\xbb\xed\xcc\x94\x10\x01\x7c\x3b\x5c\xb9\xaa\x78\xd6\x87\xe9\xcf\x00\x58\x01\xc3\xc8\x5e\x7b\x5a\x41\x9d\x43\x47\x25\xfb\xec\xf1\x77\x03\x39\xa6\x28\x11\xad\x25\x84\x1b\xcc\x53\x84\xf2\x81\x53\x37\xb0\xf1\x57\x4e\x5d\xea\x4e\x70\x77\x82\xeb\xbe\xff\x94\x27\x18\x63\x97\x9b\x84\xd6\x97\x75\x06\x74\x4d\x92\x9f\x73\x96\x2d\x89\x11\x7c\x8a\xf8\x1d\x00\x1a\x56\x3c\xb6\x11\x30\xd6\x92\x52\x5f\x4e\x7f\x44\x9e\x0f\x76\x9a\xcb\xcf\x46\xea\x83\x2c\xb4\x03\x68\x59\xb5\xa9\x72\xa2\x31\xce\x96\x9b\xf4\x92\x54\x37\xb4\x08\x64\x81\x9c\x67\x44\xbc\xb3\x77\x17\xfb\x29\x37\xcd\xbc\x56\x64\x1f\xcf\xd5\xca\xe0\xcf\xb6\x0c\x10\x27\xc2\xff\x52\xae\xb1\xe4\xed\x0f\xe4\x8e\x2d\xfb\xd6\xd1\x6d\xb1\xd3\xdd\xc3\x18\xaf\x51\x06\xfc\xac\x0b\x34\xb1\x6e\x82\xf6\xa0\x8a\xfb\x59\x0c\xf0\xaa\x0f\x11\x59\x7e\xcb\x4d\x42\x53\xe2\xbb\x37\xd9\x6e\x04\x25\x19\x5e\xa5\xad\x60\xe1\x4f\x21\x50\x0f\xf6\x04\xc0\xe6\xb9\xc0\x65\xbf\x0d\x20\x58\x1b\xa8\x45\xd3\x45\x24\xfb\xab\xbd\x78\xb9\x89\x3d\x78\xa8\x7e\x9b\x96\x22\x6f\xef\xd8\xf2\x48\xd9\x9c\x3f\x29\xd4\x8c\xa7\x0e\xa9\x1d\x28\x81\xdd\xb9\xe4\x23\x04\x00\xb8\x26\xf0\xcc\x5f\x89\x3e\x79\x27\xb5\xf9\xdf\x25\xc4\x02\xa1\x79\x52\x32\xf5\x4e\x6a\xb8\xf3\xe8\x93\x85\xdd\x3d\x78\xaa\xac\x6d\x92\x83\x6d\x11\x63\xd6\x20\xdf\xc2\xc5\x98\xc0\x94\x58\xb7\xaa\x9f\x56\xae\xc8\x95\x20\x32\x73\x73\xa2\x1d\xb4\xaf\xb2\x4d\x38\x7b\x52\x60\x06\x5e\xd3\x86\x9d\x4a\x99\x95\x66\x72\x4b\x73\xde\xa2\xcc\xdd\x2f\x60\x6f\x02\x13\xbc\x0f\x8c\x01\x80\x5a\xaa\xd9\x94\x47\x64\xce\xb2\x29\x64\x77\x46\xb3\xfd\x17\xa8\x39\xdd\xc6\x6b\x2f\xea\x1d\x7e\xb8\xf1\xce\x00\x56\xf7\x06\x42\x93\x0e\x65\x98\xd8\x0a\xb2\x88\x39\x4d\xcd\xa6\xf8\x87\xe1\x04\xb0\x2e\xff\x02\x40\x69\x35\x24\x67\xae\xca\x67\xf8\x9b\xb5\x5c\x84\xcd\x98\x16\x8c\x1c\xff\x73\xce\x17\x34\x61\x18\xb0\x47\x85\xc7\xde\x94\x93\x15\x36\xdd\xb7\xa8\xd2\x86\x4a\x79\x77\x50\xef\x8e\x2d\x7b\xfd\x95\x8d\xd4\xbb\x12\xbd\x22\xc5\xba\xb4\x75\x3c\x43\x03\x4f\x41\x0f\x7e\xeb\xb5\xcd\xd9\x9f\x48\x9c\xdf\x63\x97\x58\x23\xd0\x79\x42\x95\x6a\x96\x9d\xba\x19\xe3\x6c\x14\xb4\x59\x64\x09\xd9\x30\xcc\xd6\x6d\x55\x10\xae\xdf\x3c\x64\xa8\xd1\x2c\x2d\x6c\x89\x92\xfa\xf0\x0a\x55\xaa\xea\x1b\xf0\xc9\x18\xf7\x61\x3e\x5b\xe1\x69\xdd\x30\x5f\x1f\xc1\x66\x28\x27\x21\x26\x23\x57\xa0\xe2\x72\x97\x9e\x21\xa4\x26\x5c\x44\x49\x6e\xcd\x85\xf0\x2a\x28\xc8\x4d\x45\xfa\x3d\x26\xe7\x80\xcd\xf3\xd1\x37\xe0\xe4\x11\xe7\xd3\x5d\x89\xc4\xad\xba\xdf\xc0\xe1\xe9\xbd\x59\x38\x57\x6d\x8f\x75\xb2\x23\xee\xb1\x0c\x99\x79\x5e\x96\x31\x5e\xf3\x71\xc6\xc8\xf9\x8c\x0a\xc1\x92\x20\x27\xd5\x1a\x32\x7c\x99\x28\x10\x3c\x6c\x71\xa8\xa3\x72\x75\x28\x47\xc7\x84\xcf\x80\x6e\xbd\x42\xee\x97\x5d\xac\xa9\xb5\x6a\xdb\x16\x39\x71\x26\xef\x49\x2c\xc9\x3d\xd4\x0b\x58\x18\x76\x04\x3e\x56\xe5\x18\x59\xd0\x53\x88\x78\x88\xe4\x3c\xcd\xe4\x9c\x2b\x17\xd7\x6e\x17\xae\xd5\x24\xce\x24\xaf\x81\xcd\xb3\x09\xd4\xe5\xf5\x39\xd1\x34\x9b\x32\x6d\x9a\x21\x22\x9f\x8f\x59\xed\x14\xd3\x87\x00\x05\x7b\xee\x55\xa8\xda\x2d\x24\x85\x53\xff\xc3\x0f\xef\x1a\x97\x9b\x5d\xb7\x82\xf7\x32\x4b\xe2\x7b\x1e\xa3\x43\x4f\x91\x63\xd3\xf0\xc9\xf3\xaf\x0d\x7b\x7f\xcf\xe3\xc3\x26\xc0\xc5\x2b\x99\x09\x20\x30\x03\xb6\x3a\x12\x07\xdc\x6a\xf8\xc0\x09\xb9\xe4\x98\xf1\x63\xfe\x42\x64\x98\xf9\x98\x8b\x22\xeb\xcb\x2f\x06\xd0\x55\x73\x1e\x9c\x36\xa1\x98\xc6\x5c\x0d\x48\x77\x90\x7a\x46\x14\x9f\xe7\x89\xa6\x82\xc9\x5c\x25\xcb\xda\xdb\xe2\x69\x26\x79\x92\xb0\xcf\xb8\x8b\x9b\xf0\x2b\xff\x52\x99\x6f\x41\x88\x49\x91\xda\xb8\xc2\xb8\x8a\x20\xa8\xf8\xd4\x33\x31\x9f\x02\xc4\x3e\xb3\xc8\xc6\xeb\xa6\x49\x3e\xe5\x3b\x52\x12\xfe\xcd\x60\xc4\x0b\xa0\xe6\x5c\xb1\x22\x7b\xbe\x6e\xa1\x94\xa7\x43\xfd\x7e\x50\x66\x7d\xbb\x1e\xda\x3b\x66\x29\x13\x31\xa0\x8e\x05\x7b\x15\xbb\xdb\xea\x5c\x59\x04\xaf\xfd\x29\xd4\xe5\x67\x9d\x51\x43\x6e\xe6\x86\xb0\x38\x40\x30\x3e\x21\x54\xd4\x27\x1d\xcf\x03\x69\x97\xfc\xdb\xf1\xe8\x07\x2f\xc4\x7c\x18\xbe\x3b\x52\x51\xbb\xed\x55\x39\x0c\x77\x0d\x0e\xbb\xfd\x4a\x39\xfc\xef\x30\x3c\x76\xb5\x06\x82\xba\xd2\xab\xae\x40\xe5\x17\x01\xce\x3e\x81\x4c\xdb\x26\x90\x45\xaf\xf1\x8d\x8a\x66\x6b\x6f\x56\x0b\x1e\x6f\xd1\x64\xed\xbe\x0d\x48\x3a\xe0\x83\xda\x86\x6c\xb6\x10\x51\x66\x2e\x8b\xf0\xb4\x5c\x88\x5d\xc4\xea\x21\x30\xb7\xa9\xa6\x8a\xe9\x7a\x56\x8d\xd5\x90\x3b\xc7\xe9\xb1\x15\x04\x79\x87\x30\x6f\x97\x6e\x4a\x06\x7f\xb2\x32\x81\x28\x3d\x69\xa4\x01\x37\x21\x0e\xd5\x88\x79\x37\x2d\xb6\x11\x9b\x65\x88\xa8\xae\x5d\x91\xa6\x16\xbd\xb7\x3d\xf8\xf0\xa1\x71\xd9\x52\xf3\x4a\x65\xc4\x76\xa5\x01\xf7\x86\xff\x9c\x87\x92\x3a\x60\x41\xf8\x31\xda\xe7\xdb\x1a\xc8\x34\x62\x85\x89\xe8\x82\xab\xbb\x26\xc0\x5c\xdf\x9d\x5f\x96\x5f\x2e\x6f\xf8\xef\xce\x2f\x89\xbd\x5b\xcb\x8a\xd3\xc4\x8c\x73\x28\x6e\xd4\x34\x62\x85\x69\x34\xe6\xea\xee\xd1\x8b\x82\xa7\xf1\xbb\x5d\x31\xd4\x8f\x6d\x65\x72\x38\x26\x01\xc0\xce\x52\xe6\xe4\xde\xe2\x03\x58\xa1\xf6\x96\xa7\xaf\xc8\xa5\x50\x79\xc6\x0a\xef\x67\x55\xbe\x35\x9c\xf4\x39\x15\x0f\x3f\x68\x6f\x3c\x67\x33\x57\x4a\x33\x0d\x92\x6d\x63\xac\x32\x80\xe3\xb7\x2f\xbb\x21\xec\x58\xfa\xab\x89\x8b\x41\xeb\xdb\xdc\x67\x0f\xe8\xe5\x1e\x32\x8b\x1d\xc0\x7d\x84\xcb\xfb\xda\x43\xe1\x90\xd3\x98\x2d\x4e\x55\x4c\x5f\xf6\xe1\x33\x2e\x36\x58\x97\xfa\x44\x15\xe9\xbd\xec\x0d\xc9\x88\xcf\x79\x42\xb3\x64\x59\xc2\x1f\x2e\x9e\x33\x2c\xc0\x35\x08\xce\xac\x17\x3d\x72\x2c\x33\x68\x39\xa2\x82\x24\xcc\x65\xff\xd8\x03\xb5\x44\x11\xf0\xe4\xb1\xa9\x08\x79\x50\x1b\x21\x12\x94\xa6\xdb\xe0\x03\xb2\x9b\x12\xb8\xcb\x45\x41\xb1\xb9\x30\x64\x7c\x48\x3e\xac\x2b\xaf\x0d\x67\xc3\x3d\xf1\x54\x53\xf9\xa0\xba\xd9\x81\xb5\xf9\x57\x14\xba\xa7\x9b\xa6\xdd\x5a\xdd\x94\xeb\x1b\x96\xca\x46\x02\x00\xbe\x52\xb1\x84\x71\x6d\x6e\x48\xc5\x01\x93\x93\x6a\xa8\x70\x9b\x69\x1e\xe5\x09\x35\x32\x31\xda\xc1\x86\xe4\xe2\xf2\xfa\xe6\xf2\xfc\xec\xf6\xf2\xe2\x15\x71\x2d\xf1\x50\x5a\x1b\x92\xdb\x10\x1b\x29\x08\x79\xb5\x00\x34\xfe\x5b\x7d\x4b\x7c\xa8\x28\xa0\x0e\x01\xf1\x82\x0a\x72\x25\xb8\x2e\x90\x80\x31\x48\x2b\x91\xc2\x86\x5d\x99\xb7\xad\x1d\x6e\xca\x31\x74\x42\xd8\xc6\xcc\xcf\xe5\xd6\xe0\x74\x20\xaa\xa8\xef\xca\x0e\x2d\xee\x01\x24\x87\x62\x72\xdb\x92\xdd\x1d\xf8\x67\xc3\xe3\x71\x8b\x06\xf6\x02\x7f\x15\x29\xbe\x87\x1c\x77\x58\x2f\x6b\x8a\x31\x13\xc3\x4b\x8e\x86\x47\x4e\x50\x48\x56\xe0\xe5\x7d\xa3\x21\x9c\x55\x79\x6f\x0d\x09\x79\xef\x42\x98\x21\x17\x77\x3d\x52\x3d\x02\x24\x04\x78\xe7\x95\x1d\xea\x12\x45\xf2\x71\xf8\x51\x8b\x7f\x35\xe5\x0b\x26\x70\x60\xed\x12\x24\xf7\xf9\x86\x73\x7e\x53\xf4\xfb\xc3\xcd\x9b\x76\xbb\x84\xe7\xac\x61\x87\xce\xe5\x7c\x8e\xa8\x48\x33\x9f\x59\x57\x24\xc7\xf9\xd3\xde\x9a\xc2\x82\xf8\x4e\x93\x1d\x9b\xba\x42\xa7\xdc\x4b\x15\x05\xc5\xdf\xb6\xd1\xf8\xa2\x90\x53\x9b\x43\x09\x5b\x28\x31\xe5\x80\x42\x2c\xc9\x3e\xf5\x3d\x3e\xbd\xb9\x3c\xbb\x78\x7b\x39\x9c\xc7\x8f\x4e\x32\x98\x88\x53\xc9\x85\x56\xbb\xd5\x92\x5d\x85\x53\xea\x93\x15\xff\xd1\xa6\x5c\xf7\xd2\xbd\x18\x86\x38\xb8\xd6\x02\x04\xb6\x98\x69\xca\x13\x15\xac\xa3\x96\xa9\x4c\xe4\x74\x3d\xae\x70\x83\x05\xfa\x35\xe2\xa9\x0c\xe8\xc0\xac\x7c\xbb\xf2\x7a\x9d\x72\x10\xe5\xf9\x70\xe5\x1f\xcc\x34\x14\x63\xf5\x72\x30\x54\x6d\x78\xa6\xc3\x7d\x10\xc1\x6b\x65\x0e\x50\x1b\x84\x43\xec\xc0\xe9\x0a\xb4\xb7\xa0\x14\x4b\x5d\x89\xec\xa1\xa7\x6e\xb7\x30\x66\x68\xd0\xee\x7a\x3b\xe5\x39\xfb\x8b\x7d\xa7\x4c\xe4\xd2\x8c\x0d\x3c\x3c\x11\x54\x08\x91\x59\xc0\x5d\x43\x9a\xe7\x0c\x2f\xce\x4c\x83\x4f\x25\xcb\xaa\x01\xa6\x90\x7d\xbc\xd5\x0a\x33\xec\x93\x64\x59\x00\x1e\x5a\x55\x98\x4e\x11\x76\x28\xb3\xf6\xdb\x34\xe3\x0b\x9e\xb0\x29\x80\x8e\x72\x31\x0d\x72\x3f\xc3\x6c\x51\x0b\x42\x5a\xb6\x86\xbe\x35\x7f\x05\xf0\xd2\xb0\x2f\xde\xbd\xbf\x05\xfc\x5a\x70\x0a\x1e\x2c\x60\x9b\x0f\x42\x31\x93\xc1\x60\x00\x7a\xff\xf1\xdf\x8c\xac\x18\x27\x27\xe4\x07\x66\xbf\x23\x01\x60\x37\x83\x8a\x36\x33\xe9\xd1\x4e\xa1\xaf\xc5\xcc\xc2\x76\x44\xa7\xb9\x7d\xea\xd4\x3c\x69\x04\x23\x64\x37\xa5\xe7\xa1\x80\x27\x82\x14\xa2\xbf\xe7\xf1\xe5\xca\x16\x49\xff\xde\x54\xce\x59\x45\xd7\xed\x4f\xef\x91\x49\x2d\x3d\xa4\x44\x2d\xe7\x09\x17\x77\x05\x0e\xd6\x44\x9a\x3d\x84\x31\xfa\x5c\xdc\xb9\x1d\x9b\x31\x9a\x6c\xa6\x94\xfb\xec\x8f\x56\xa9\xa4\xde\xc3\x78\x77\xbb\x4c\xd1\x17\xee\x8f\xbd\x75\xf5\x86\x24\xae\xd7\x7b\x76\xe3\xe5\xaa\x59\x35\xf7\xa3\xab\xd1\xf9\xa8\x54\x89\xd4\xe8\x74\x70\xef\x31\x8d\xcb\x9b\x58\x02\x0c\xe7\x09\x25\x3b\xfe\xf3\x2e\x4f\xed\x80\x24\xf9\xee\x67\x30\xcc\xe7\x5a\x66\x9a\x26\x2d\x11\x81\x68\x46\xd3\xb3\x5c\xcf\x2e\xb8\x02\x00\x81\xa6\x42\xc0\xfd\x0c\xb1\x88\x1d\x0c\x1e\x77\x8b\x8e\xad\x91\xf3\xbf\x9c\x5d\x13\x9a\x9b\x55\xd4\x16\x2c\xb3\x55\x17\xb7\xeb\xff\x08\x03\xea\x5b\xe9\xbd\x6d\xeb\xc1\xfb\xde\x39\x04\x5a\x74\x08\xc0\x19\x7f\xce\x4e\x00\x2e\xb8\xe6\x54\xcb\x9a\xf5\xb2\xca\xfa\x7b\xae\xb4\x9c\xdb\xed\x79\xe5\x1a\x02\xaf\x2c\x30\xdc\x52\xdb\xe5\x52\x00\x20\x68\xc3\xe4\x5c\x09\x23\x16\xd3\x88\x55\x22\x00\xfb\x80\x47\x89\x6d\x73\xff\xcc\x7f\xd9\xc8\x4c\x00\xb2\x4a\xfe\xf4\xaa\x84\x0f\xbe\x52\x6c\xc1\x19\x15\x0a\x24\xff\x56\x2d\x31\xfc\xe7\xa6\x27\xdb\x9a\xbd\x70\x54\xff\x3b\xa7\x09\xce\xc6\xbb\xb6\x6d\x44\xe5\x99\x6d\xd8\x49\xb7\x9e\x6e\xce\xdf\x79\xad\x39\x57\x88\x83\x85\x4f\xe8\x8c\x0a\x65\x16\xa2\xac\x1b\x1d\x59\xd7\xce\x11\x39\xd6\x51\x5a\xbb\x24\xfc\x03\x45\x66\x63\x57\xed\xbc\xbf\xf1\x11\xd9\x75\x7b\xf5\x20\xde\x16\xd8\xbb\x4d\x4d\x1b\xa5\x81\x20\xb3\x25\x6f\xb8\xd2\x0e\xec\x1f\x6e\x70\x65\x91\x6a\x41\xd2\xb9\x36\xaa\x13\x4f\xff\x87\xc6\x71\xf6\x0a\x39\x89\x2b\xdb\x9b\x81\xbc\xe3\x30\xa5\xa8\xf0\xfe\xb8\x63\xbd\x4c\x2d\xe0\xdc\xed\xf9\x35\xc1\xe2\x1b\x7f\xfc\x3d\x96\x0c\xfd\xdd\xd7\xbf\x7f\x51\x7b\x41\x9f\x2e\xfc\x79\x4f\xcb\x41\xeb\x1e\x9b\x67\x11\x35\x07\xe2\x02\xc6\xcb\x01\x3d\xb4\x67\x17\xf7\x91\x59\x54\x4f\xa5\xf7\x13\x2a\xba\x08\xb3\x27\x8d\x30\x23\x3e\xe9\x01\x69\xc2\xe1\x54\x05\x09\xca\xf5\xf3\x23\x28\x3b\xe7\x62\xf7\xae\x29\xef\x16\x3c\xbf\x46\xbf\x0b\xbc\x4f\x10\x73\x7d\xf1\x6e\xf4\x3f\x6f\xce\xbe\xbd\x7c\x03\xbd\xb4\x71\x55\x66\x1b\x70\xb1\x77\x1c\x51\xfd\x6d\x55\x47\x13\xdc\x3d\x19\xcd\xfc\x1c\xef\x5e\x8f\x2a\x8a\xb2\xb9\xd3\xd0\xb9\x71\xa8\xb4\x2c\x26\xb5\xc6\xfe\xb8\xa6\x2b\x28\x86\xc1\xb2\xf6\x52\x1c\xf6\xb6\x70\x05\x90\x4c\x25\x65\xc8\xac\x14\xf6\xf0\x60\x7d\x65\xe7\x0a\x90\x67\x60\xc4\x37\xe3\xc5\x39\x68\xdd\x7c\xff\x40\x73\x55\x97\xc5\x67\xcd\x73\x5f\x8e\x46\xf0\x96\x73\xf2\x98\x43\x8a\x11\x39\x99\xa1\xd7\x86\x52\x33\xe5\xa1\xfb\x9f\xe9\x4e\x49\xd7\x21\xfd\x36\xa1\x5e\x6b\xa1\x82\x4b\x55\xae\x4a\x8e\x8d\x52\xc6\xc0\x26\x64\x6c\xe7\xdb\xa7\x56\xbd\x54\x29\x8d\x5a\xad\xc3\x51\xdc\xc2\x3b\x90\x52\xfd\xf8\x04\x10\x3e\xdb\x62\x40\xa9\x6f\xaf\xe9\x46\x3e\x77\x2f\x56\x13\xb9\x1a\xad\x90\xab\x12\x91\x4a\x97\x24\x17\x66\x7c\x3d\xf1\xf2\x91\x47\xa1\x9e\x3f\xec\xa9\xba\xb4\xad\xb6\xa4\x33\xa9\xa5\xd8\x3b\x48\xfc\x7a\xcd\xeb\xe5\x73\x8c\x4f\x9c\x17\xa5\x4f\x82\x8a\x80\x10\x61\xe8\x0d\xfa\x46\x8c\x73\x5c\x42\x0a\x67\xda\x2f\x1b\xf6\x1f\x5d\xf2\x88\xaf\x2e\x5a\x3a\x73\x5f\x52\xf2\x61\x53\x13\x6c\xab\x21\x14\x71\xe3\x8c\x8b\xab\x0b\x2b\x77\xb9\xac\x0a\x65\xb7\x1d\xd9\xbc\xef\x5a\xe3\x8b\x32\xd3\xf7\x32\x6b\x9e\x6a\x7c\x5d\x7a\xb1\xe2\xd5\xb7\xbf\xad\x64\x13\x3d\xc7\x33\x82\x7d\x7c\xe2\x73\x32\x02\x87\x69\x05\x07\xbb\x7a\x32\x7c\x14\xfb\x03\x1c\x9e\xa7\x3d\x34\x7b\x72\xa1\x87\x4d\x49\x6d\x55\xf0\x76\xbb\xac\xe1\x08\x3f\xda\xd7\xac\x81\xc0\xac\x4d\x41\x24\xa8\x3f\x84\xb6\xf9\xd6\x88\x42\x26\xb1\x1a\x61\x03\x7a\x70\xa5\xd9\x1c\x0b\x0a\xd3\x24\x31\x73\x29\x45\x08\x1b\x6c\xd3\x4e\xfb\x04\x91\x77\xe7\x34\x75\x45\x99\xe5\xbd\xb8\xa7\x59\x4c\xce\xae\xaf\xda\x39\xfa\x0d\x42\x8b\x71\xff\xd4\x43\x82\x2a\x17\x8b\x94\x31\x23\x63\xae\x55\x51\xc6\x8d\xe9\x50\x1b\x34\xe4\xcd\xfb\x88\xcc\x21\x35\x07\xd2\x7e\x2f\xe0\x7e\x82\xc8\x48\xd3\xa4\x52\xe4\xfe\xc5\x8b\x17\x68\xbc\x7a\xf1\x87\x3f\xfc\x01\x4b\xeb\xc4\x2c\xe2\xf3\xd5\x07\xe1\xa9\xff\x78\xf9\x72\x48\xfe\xcf\xd9\xdb\x37\x50\xe6\x2f\xd5\x0a\xe1\x2e\xb0\x65\x2c\xfb\x1d\xbc\xac\xfa\xe4\x7f\x8d\xde\xbf\x2b\xca\x84\x94\x7f\xb5\xd5\x93\xed\xf0\x86\xe4\x22\x08\x01\x0a\xcd\x53\x54\xcf\x6c\x45\x1b\x4d\xe8\x64\x82\xc5\x2b\xc7\xae\x76\x2a\x1e\x29\x97\xd9\x0c\x25\xa0\xb1\xfe\x84\x59\xfe\x04\x62\x93\x8c\x22\x8d\xc6\x3c\x97\x5c\x8f\xa1\x56\xd0\x96\xa7\x7f\xd0\x95\x3e\x16\x0e\x9f\x28\xa8\x42\x51\x40\xc1\x65\x4c\x19\x99\xd2\x16\xd4\xc3\xc6\x7c\xd7\x4d\x27\x9e\xd2\x07\x53\xbb\x3a\x42\x69\x63\x39\xe0\xda\xa2\x08\xf9\xdf\xd0\xad\xb8\x2b\x38\xf6\x81\x7c\x22\x65\x9e\xef\x7b\x83\x6b\x65\x53\xd6\x3d\xb9\x20\x34\x91\x50\xbb\xc9\x2f\x6d\xc1\x8f\x82\x92\xe6\xbb\x87\xd2\x18\x79\xaf\x29\xfa\x2a\x52\xa1\xb7\xb4\x76\xfd\x96\xb2\x49\x3b\x48\xed\xa7\x63\x99\x6b\xe7\x02\xc6\x36\xb1\x68\x21\x56\xce\x6e\x80\x1c\xb8\x07\xd8\xe0\x3e\xa0\xb3\x8d\x71\x2b\xcb\x64\xbe\x24\x04\xf4\x09\xa3\xd1\x8c\xdc\xb1\xe5\x00\x09\x53\x4a\x21\x1b\xc5\xd7\xc6\x2a\x57\xb6\x28\x8a\x93\x18\xc9\xd6\x4e\x96\xf3\xa8\x17\xbb\xc8\x67\xb3\x38\xf1\x51\x59\x49\xc7\x62\x46\x8a\x40\x81\x77\xc0\xc4\x41\x75\x59\x0f\x12\x89\xa5\xa5\xcb\x59\x17\xe6\x7c\xb1\xd8\xbc\xa6\xb6\x7d\xb9\x08\x23\x30\x84\xce\xb2\xaa\x5c\xac\xbc\x6d\x4b\x29\x5b\xb1\x0d\x3e\x48\x1d\x14\x6f\x10\x8a\x00\x05\xdb\x6c\xa9\x1e\xfb\xac\x9b\x25\x3f\x11\xa5\xac\x10\xc5\x74\x6e\xa7\x06\x2b\x42\xe5\x22\x61\x4a\x11\x0e\x23\x9c\xd3\xec\x8e\x39\x50\x12\x9a\x0c\xc9\xb5\xe9\xa4\x47\x3e\x42\x0c\xdc\x05\x86\x91\x99\x33\x1a\xa6\xbb\x98\x8f\x1c\x0d\x87\x47\x48\xc1\xd7\x24\xbf\x34\xd8\x19\xfb\x01\xa8\xee\x01\x9c\x5a\x29\xd4\x9c\x2a\x84\x81\x35\x52\x1b\xc0\x1c\x4b\xc8\xe2\xd2\x33\xc7\xa1\x68\x6d\xf8\x9d\xd5\xe1\xec\x81\xf6\xb9\x2f\x48\xf5\x3e\x10\xd5\xb5\xdc\x09\xe5\x6b\x7f\x68\xea\xbd\x80\xa9\x57\x2a\x46\xdb\x25\xb2\xc7\xac\x39\x52\xef\x01\x40\xca\xf3\x46\x20\x9f\xee\xda\x84\x09\x33\xaf\x23\xf5\xd9\x4a\x6c\x09\xfb\xa2\xc4\xbc\xab\xc9\xba\x3a\x62\x2e\xdd\xad\x90\x93\x3d\xd1\x34\x33\xf0\xf4\xf2\x5d\xb3\xea\x1c\xa4\xb1\xc0\x57\xbd\x9a\x08\x80\xd5\xab\x9e\x53\xae\x7a\xad\x9c\x26\x4f\xdd\xd3\x20\x24\x1d\xa6\x52\x4b\x40\x62\xd6\xfe\xc8\x0d\xa1\xa8\xbd\xe5\x51\xd4\xc8\x2a\x4a\x26\xb9\xf6\x69\x39\x6b\x58\x03\x34\xea\x70\x9b\x31\x19\xd2\x3d\x16\x30\x0a\x2c\x5d\x05\xf4\xb7\x29\xcf\xc0\x6b\xaf\x23\xdd\xb4\x7a\xda\x2f\x36\x70\xe3\x80\x39\x74\x32\xc3\xde\xf3\x38\xb2\x68\x08\x2e\x82\xb8\x24\xc3\x40\xf0\x86\x56\x28\x20\x39\x71\xc4\x56\xea\x69\x3c\xb2\x7a\x86\x15\xdb\x45\x6b\x45\x38\xbb\xbe\x6a\x51\xa2\x0f\x5a\xfd\x45\xcb\xf4\x60\xba\x29\xd5\x4d\xb9\x28\x46\x6e\x0d\xbc\x86\xc2\x3c\x7b\xd1\x70\xa5\xdb\xaf\x0d\x5d\x0c\xcc\xaa\x15\x50\x36\x5b\x98\xde\x53\xd0\x00\xc8\xcd\x39\xf8\xe0\xbc\x3e\x77\x31\xf2\x11\x45\x42\x98\x8f\x46\x65\xad\xdd\xb5\x5a\x82\x0c\x06\x4b\x46\x50\x9b\x04\x75\xbc\x40\x59\x4c\x65\xfc\xca\x16\x00\x16\x42\x62\xd5\x2f\xd5\xc7\xe2\x26\xaa\x8f\x4a\xa0\x11\x14\x02\xb7\x6c\x16\x18\xc0\xf7\x16\x0d\xf6\x2a\x53\x73\x48\xa1\x1a\xb3\x80\x30\xf2\xeb\xa6\xab\x48\x0e\xac\x3b\x43\x02\x2e\xb4\x5f\x25\x8b\xb2\xb1\x1a\x5b\xf2\xd5\xb9\xa3\x19\x9b\x53\x04\x85\x73\xc3\x33\x54\xe6\x3e\xe3\x5a\x33\x44\xf5\x61\xd9\x5c\x11\x39\xe9\x97\x2a\xc4\xf5\x16\x2f\x7b\xfb\xd4\xf3\x38\xb0\xe4\x0a\x29\x56\xa1\x85\xc9\xb8\x2e\x49\x67\x66\x5f\x83\xba\x90\x00\x92\xa3\xa8\x18\x19\x0c\x83\x59\xe0\xec\x3d\xfa\xc0\x9f\x52\x45\xea\x7b\x21\xa1\x53\x91\x3a\x15\xa9\x15\x15\x29\x60\x2c\x8e\xe0\xd8\x89\x0a\xd5\xa6\x10\x51\xca\xe9\x4e\x45\x56\x4f\x80\x12\x63\xb6\xa6\xd3\x9a\x64\x56\xb6\xa2\x19\xd5\xe7\xc8\xe9\x52\x76\x1f\xe7\x7a\x32\xf8\x23\x61\x22\x92\x31\x2e\xbe\x69\x3f\x53\x1a\x44\x9b\x42\xfd\x08\xfb\x32\x77\xdf\x0a\x2d\x71\xd0\xf6\xbe\x4b\xb7\x17\x1d\x70\xbe\xba\xd7\x2d\x31\xf8\x82\xad\xfb\x24\x58\x57\xe0\xd8\xe5\xc8\x5b\xfe\x5e\x78\x09\xb1\x16\x30\x6c\x6e\x57\xe6\x94\x1c\xe3\xcd\x61\x94\xe6\x7d\xfb\xc0\x70\xce\xe6\x32\x5b\xf6\xfd\x43\xe6\xc7\xd2\x5b\xf6\x89\x13\x90\x09\xa2\x3c\x33\xca\x5e\xb2\xfc\x52\xa5\x03\x37\x41\x8f\x2c\x1c\xf8\x75\x6a\x56\x0d\x26\xbc\x2a\xe1\x77\x1e\xe8\x0a\x54\xf9\xa2\x3a\xce\xc4\x83\xef\xa9\xbe\x57\x51\xe1\x2e\x13\x0b\xb2\xa0\x59\x83\xd2\xd5\xe1\x75\xa0\x3c\x10\xf3\x05\x57\xfb\x15\xac\x5b\xab\x35\x73\x0b\xeb\x25\x73\x9d\xe6\xda\x52\x4a\x77\x2a\x5c\xaa\xb7\x3f\x0d\x15\xa1\xe8\x65\x6f\xaf\x6e\x7c\x31\x45\x61\xf1\xda\xb3\x34\x2c\x5e\x87\x16\x88\x2d\xb7\xb2\xf7\xb6\x69\xb5\xdc\xb3\xbb\xdc\xb6\x68\xe3\x1c\x16\x2c\xb2\xc0\x27\x70\xc2\xe9\x23\x1d\x34\x8c\x07\x69\xd1\x56\x63\x81\xd0\x7f\xc9\x66\x9a\x96\x5c\xaf\x36\x53\xef\xdf\xdc\xef\x3a\xb2\x98\xf8\x9d\xd3\xb5\xd6\xe6\xeb\x9c\xae\x9d\xd3\xb5\xee\xd5\x39\x5d\x3b\x8b\x42\xf9\xfa\xa2\x2d\x0a\x9d\xd3\xb5\x73\xba\x1e\x36\x87\x0f\xe2\x74\xb5\x62\x5c\xe1\x71\x7d\x54\x87\xab\x2d\xeb\x72\x16\x45\x32\x17\xfa\x56\xde\xb1\xda\x1e\x84\x5a\xc2\xfc\x4a\xeb\x8f\x27\xd9\x37\x17\x2c\x1a\x89\x07\xfb\x08\x06\x34\x8f\xb9\x11\xde\xf7\xde\x40\x67\xb6\x01\x27\xa7\x1b\x52\x2c\x62\x16\xfb\x96\xdd\x21\xd5\x66\xae\x87\xe4\x8c\x64\x2c\xe2\x29\xb7\xd5\xbb\x29\xde\xc7\x1d\xe6\x51\xf6\xb9\x56\x2c\x99\x58\xb4\x73\x11\x16\x85\x29\x44\x70\x4b\xe1\xd6\x7e\x06\x79\x8e\x74\x20\xd9\xae\x42\x4e\xc6\xfe\xe6\x98\x95\xed\xcd\x6d\xd8\x42\x68\x14\x81\xa1\x94\x6a\xd1\xc0\xc7\x52\x6e\x33\x90\x1f\xfa\x60\xb3\xcf\x29\xcf\x60\xf3\x8e\x58\x24\x45\x9d\x8a\x98\x1b\x16\xe8\xb2\xda\x92\x5b\x29\x6b\xd1\xc4\x02\xf8\xbe\xee\xe5\x82\x26\x3c\xe6\x7a\xe9\x7d\x6d\xb6\xca\x12\xc5\x13\xe3\x97\x51\x15\xd3\x48\x68\x9a\x66\x92\x46\x33\xa6\x82\x7e\xa3\xc8\x61\x13\xb1\x7c\xd4\x39\x56\x02\x03\xa9\x03\xde\x31\xac\x2f\x59\x92\x4c\x6a\xe7\x2e\xdf\xf0\xc1\xdb\xa0\x31\x78\x1d\xf9\x97\xce\x96\xe0\x53\x97\x61\x13\xd8\x2b\x3e\x09\xff\x50\x44\x26\xb1\xc3\xf7\xf8\xe3\x0b\x23\xe6\x45\x76\x0f\x1a\x2a\x07\x08\x10\x5a\x92\xc4\xb0\x62\x43\xf9\x36\xbf\xfc\xf5\x37\x64\x26\xf3\x4c\x0d\xc3\x24\xa1\x97\x70\x0f\x55\x34\x27\x26\x6a\x92\x30\xaa\x34\x79\xf9\x82\xcc\xb9\xc8\x0d\x07\x6a\xbc\x6d\x9a\x4b\x36\x81\x4c\xf3\xfb\x6f\x6a\xbf\xd7\x54\x9a\x59\xf5\x48\xda\x5d\x95\x22\x12\xaf\x15\x6a\xec\x49\xc2\xe4\x32\xc4\xb1\xae\x88\x38\x96\xe8\x86\xb3\x2d\xb4\x7c\x80\xf3\xf5\x73\x2e\xc7\x4b\xdd\x24\x11\xf1\x7f\xe3\x1b\xe5\x0c\x44\x77\xb3\x0e\xba\x48\x01\x2e\xb2\xf5\xa3\x0f\x52\x2b\x61\xca\x95\xde\x51\x29\xa1\xc8\x51\xdc\xfa\x58\x7d\xb6\x32\x35\xf2\x7e\xc3\xb4\x14\xd0\x11\x9c\xac\xeb\xcc\x43\x51\xc4\xb0\xa6\xe1\x45\x51\x69\x47\x48\x6c\x7f\x67\xf3\x4f\x0c\xb6\xe5\x36\x48\x0b\x18\xdd\x35\x87\x5a\x4f\xba\x72\x5b\xa2\xf1\x58\xf1\xb5\xf2\x29\x50\x5c\x4c\x11\x52\x7b\x9e\x27\x9a\xa7\x49\x31\x6e\xff\x82\x25\xe4\xa1\xd9\x8c\x06\x96\x1e\x8a\xc9\xb9\x08\xc5\x04\x26\xc6\x63\xdf\x16\x13\x1a\x91\xa1\x33\xc3\x0f\x52\x9a\x51\x3f\x79\x50\x37\x55\x9d\x58\x0b\x1c\x05\x3f\x20\x52\x1e\x43\xce\x33\x9a\xf8\x81\x86\xbe\x9f\x36\x37\x8d\x66\x82\x8a\x1a\x06\xe6\xb2\xaa\x07\x2f\x11\x79\xef\x43\xc0\xb0\xc2\x46\x65\xb7\x58\xa1\xe6\x5b\x1a\xdd\x31\x11\x63\xf9\x21\x18\x76\xbc\x14\x74\x6e\xa1\xa8\x82\x9a\xca\x95\xf7\x55\xdf\x9a\x1a\x30\x53\xce\xa5\xea\x22\xd7\x6d\x73\x0e\x72\xd5\x18\xeb\xe5\x83\xc2\x5a\xc6\xdb\xce\xb9\x42\x23\x4c\xc6\x17\x11\x73\xfc\xdf\x7c\xaa\xcd\xae\x2f\x6a\xe4\xa3\xaf\x74\xde\x86\x2a\xf2\x60\xff\x02\xb9\xf7\xc6\x6f\x40\x9d\xa2\x89\x39\xda\x4b\x9f\x9e\x59\x59\xdc\xf1\xb2\xdd\x82\x2a\xd9\xb8\x49\x1a\xed\xd1\xcd\xb7\x17\xe5\x43\x7c\x43\x63\xa9\xc8\xb7\x89\x8c\xee\xc8\x05\x03\xa1\xeb\x21\x0b\x82\x64\xe3\xf8\x29\x01\xa3\xe7\x74\xba\xcb\x3b\x36\x20\x73\x29\xb8\x96\xd9\x76\x7a\xd1\xd5\x27\x7c\x12\x38\xe2\x6c\x1c\x3f\x6b\x30\x62\xb3\xc1\xf6\xa9\x46\x98\xc1\x31\x84\xd7\x1d\x96\xdf\x9e\x87\xea\xd7\x33\x79\x3f\xd0\x72\x90\x2b\x36\xe0\x35\xfc\xad\x0d\x46\x77\xc7\x96\xe0\x64\x6e\x38\xbe\xef\xf1\xb5\x92\x72\xa0\x25\xd8\x94\xe0\xbe\x61\xd1\x37\xdf\x5e\x18\xde\x30\x0c\x85\xbd\x53\xa6\xa3\xd3\x88\xa5\xb3\x53\xfb\xe1\x67\x39\x29\x8e\x5a\x34\x9d\x95\x33\x12\xc9\x24\xb1\xf9\xce\x72\x42\xce\x59\x3a\xf3\x8d\x3d\xf6\x48\x9f\x0e\xea\x36\x95\xb2\x29\xe4\x67\x70\x60\xcc\xdb\xf6\xbc\x04\x1b\x27\x1b\x37\xab\x63\xf0\x58\x5b\xe5\x59\x57\x62\x7c\xc0\xc9\x79\xe0\xaa\xfa\xa5\x5a\xfa\x61\xe8\x65\x19\x0e\xd8\xc5\x70\x94\xc8\xcd\xd5\x04\x25\xe9\x98\xc5\x44\x2e\x58\x96\xf1\x98\x29\xe2\xe9\x4d\xa8\x7a\xf2\xe4\xb1\xe7\xad\x43\x26\x7e\x72\x64\xe2\x3d\x74\x9c\x80\x3c\x99\xb7\x57\xc9\x13\x8d\xe7\x5c\x3c\x3b\x02\xa5\x22\x9a\xb0\xab\xf7\x0d\x94\x89\x11\xbe\x51\xd6\x27\xdc\xcd\x00\x50\x6c\x07\x4c\xd7\xf7\x7e\xbf\x10\x21\xe3\x5d\xf6\xd1\x07\xd0\x0a\xa6\x54\xb3\xfb\x9d\xec\x6f\x50\x10\xa8\xdd\x4f\x82\xdc\xf9\x94\xfa\xc3\x13\x41\xe3\x05\xbb\x1c\x71\xbf\xda\x64\x9f\x76\x9d\x9a\x1a\x5d\xdc\x40\x2a\x48\xb2\x6e\xa3\x9e\x5d\x5f\x91\xef\xb0\xe5\x76\x91\xfa\x32\xa9\x51\xba\xbb\x90\x73\xca\x1b\x17\xda\x98\x95\x0b\x53\xbb\xee\x5e\xfb\x66\x09\xb6\x1b\xd6\x08\x99\xf0\x69\x6e\x34\x30\xab\x35\x75\x20\x6a\x8f\x22\x80\x14\xf2\x47\x60\x09\x72\x11\x87\x85\xcc\xe1\x56\x10\x98\x82\x77\x4d\x12\xc5\x84\xe2\xe0\x27\x09\x9c\xd5\xb6\xdc\x1b\xd6\x17\xc4\xf0\x42\x14\x52\xfa\xe4\x8d\x9c\x72\xe1\x4e\xa5\xb4\x6e\xb4\x09\xe5\x49\xdd\xc9\xe8\xa4\x8a\x27\x97\x2a\x94\x4a\x2e\x05\x1d\x27\x75\xa2\x00\xca\x64\x3d\xa1\xe0\xe7\x64\xf0\xf6\x69\xcc\x95\xf9\x3f\x19\x8d\xde\x80\x4d\x3c\x17\x4e\xd6\x05\x7b\xb1\x25\x6b\x3e\xd2\x1f\x0f\x60\xbb\x67\x06\x29\xcd\x1e\x18\x77\x57\x22\x36\x9d\x65\xaa\x14\x76\x62\xdb\x43\xa4\x3f\x1f\x39\x8b\x9e\xfb\x31\x23\xb7\x33\x1e\xdd\x5d\x07\xa6\x6f\x99\x99\x7b\x22\xb8\x55\x62\x42\xd5\xdf\xda\x24\x88\xb6\xab\xd7\xcd\x15\xd8\xdb\x80\x9e\x8f\xec\x80\x4d\x33\x84\x2a\x25\x23\x5e\xf8\x39\xc0\x5c\x52\x10\xfc\x18\x08\x7e\xbb\x83\x00\x9e\x7e\x20\x6f\x72\x8b\xe6\xaa\x9e\xaa\x90\x17\x71\xe1\xc6\xda\x6a\xc7\x71\x6b\xec\x81\xd2\x7d\x5b\xc2\xe5\x76\xb2\x69\xc5\x68\xef\xa2\xb8\xed\x22\x39\x29\xc9\x55\x59\x5c\x59\x26\x8f\xcf\x6d\x71\xf9\x5a\x1b\x6a\x9d\x44\x86\x75\xda\x70\xc5\x53\x87\xf7\xac\x19\x1f\x0e\x53\x2a\xd3\x3c\xc1\x58\x89\xc3\xc1\xc5\x9d\x75\x16\xbf\xd3\x92\x59\xff\x31\x80\x36\x9b\x06\x02\xff\x32\x30\x37\x03\x91\xec\xc5\xef\xbf\xf9\xe6\x4b\x47\xe1\xac\xab\x02\x3f\x04\x0c\x67\x4d\x93\x68\x97\x69\xd3\x65\xda\x84\x5b\xf1\x21\x61\x54\x5b\xce\xa5\x69\x18\xe2\xda\x2c\xbc\xb5\x7e\xb6\x4c\xed\x20\xd8\xa6\x01\xb0\x0d\xf2\x61\x5a\xca\x82\x69\x1c\x0b\xda\x24\xe3\xa5\xcb\x73\xf9\xa5\xe5\xb9\xec\x13\x03\xda\x3c\xa7\xa5\x49\xec\xe7\x2f\x29\x7f\xa5\xc1\x61\xac\x9f\x67\xd1\x3c\xbb\xa2\x39\x9e\x5d\x73\xcb\xd6\x3e\x25\x8d\x42\xfb\x8c\xd5\x22\x8a\x0a\x82\xae\xf0\x20\xe2\x63\x69\x69\x0e\xd6\xa3\xe8\x10\xa4\x81\x02\x85\xcd\xcb\x26\xb5\x04\xad\x4e\xfe\x7e\x54\x71\x6d\xf8\xdb\x4f\xe3\xd1\xf8\x65\xba\x0c\xba\xc2\x20\xcf\xdb\xa6\xad\x4a\xd8\x22\xce\x92\x00\x67\x1d\x18\xb1\x1c\x87\x98\x86\xc5\x19\x39\xbb\xbe\x32\xea\x32\xa4\xcf\xd0\x44\x0d\xc9\x1a\x3e\xed\xec\x92\x96\xaf\x3b\xfe\x4c\xb5\x66\xf3\x54\xd7\x5f\xec\xce\xa4\xfd\xe4\x26\xed\xbd\xed\x71\x1f\xfd\x8b\xbe\x02\x64\x3e\xa7\x62\x60\x4e\x14\x18\xb7\x4b\x5e\xb0\x0a\x09\x1e\x12\x17\x95\x8b\x73\x41\x33\x86\xa0\x4f\xe5\x8a\xb7\x34\xa8\x7f\xf8\x30\x46\x48\x68\x7b\xef\x91\x23\x03\xad\x9c\xb4\x48\xae\x84\x7d\xda\xe1\xf8\x59\x70\x87\x2a\xe0\xc2\x25\xbd\x59\xcf\x18\x32\xeb\x6b\x48\x44\x29\x9e\x2a\x4b\xc2\x28\x0a\xd3\x24\x91\xf7\xf8\xed\x90\x81\x99\xd9\x37\x7d\xb1\x19\x56\x63\x46\xe6\xdc\x28\xd5\xd6\xf8\x19\x76\x07\x5d\x91\x46\xa2\x66\x19\x0a\xac\x99\xf5\x66\x8d\x98\x0e\x17\xda\x28\xa4\x02\x03\xa1\xcd\xbf\x5d\xe0\x0d\xa2\xe2\x5a\x9a\x30\x66\x33\xba\xe0\x32\xcf\xf0\x6d\x2d\x49\xcf\xfe\x04\x2c\x61\x29\x73\x6f\x9a\xc2\x2a\x89\x7e\x74\x6a\xcd\x3c\xbd\x2b\x7e\x04\x51\x3e\x96\xce\x96\x30\x60\x9f\xb9\xd2\xab\x63\x71\x53\xe4\x40\xdb\xda\xda\x37\x0b\x95\x1a\xb6\xd0\xb8\x22\xda\xc7\xf0\xbd\xb2\x60\xb2\x18\xc1\x4f\x5f\x50\x3d\xb4\x9d\x58\xa4\x9d\xac\xd3\xb6\xac\xe3\xdd\x55\x09\x8f\x96\x8d\x2b\x85\x15\x6e\x2a\xf3\x3a\xf9\x96\x2a\x16\x93\xb7\x54\xd0\x29\xaa\x65\xc7\xa3\xeb\x6f\xdf\x9e\x98\x65\x03\xb5\xef\xea\x62\xad\x2f\x6b\x14\xf6\xe1\x5d\x9b\x69\x10\x2b\x23\xdc\x83\x13\x35\x1c\x63\xab\x69\x1c\xc4\x73\x93\x7a\x00\xb1\xab\xa9\x97\xd5\x1a\x8f\x15\xa2\xb0\x98\xc7\x07\x56\x75\xe4\x42\x69\x9a\x24\xd7\x09\x15\x67\x69\x9a\xc9\xc5\x7a\x4d\xb8\x9c\x18\x6e\x1f\x74\xac\x1d\x63\x1f\xdc\xcd\x14\x27\x1a\x7c\xbd\x82\x5c\x15\xed\x0f\xc9\x95\xf6\x0a\xb1\x14\xc0\x06\x7b\x67\xb9\x96\x73\xaa\x79\xd4\x33\x7a\x73\xef\x2d\x15\x39\x4d\xd6\x46\x18\x6d\x1d\xc6\x26\xb1\x6e\xeb\x4b\x9b\xc1\xd1\x6a\xbc\xb6\x55\x3e\xd8\xfe\xbe\xa6\x99\xa1\x2d\xe7\xa3\x8f\x8d\xde\x55\x9a\xea\x7c\x85\x72\x6e\xa1\xe6\x9b\xe9\xf7\x80\x24\x54\xe9\x0f\x69\x6c\x4e\x72\xe5\xd7\x6d\x44\x3a\xa2\x9a\x26\x72\xfa\x17\x46\x93\xf5\xfb\xb9\xb4\x4f\xce\xc3\xa7\x9d\xf1\x07\xb7\xcc\x28\x1f\xfb\x07\x8f\x14\x31\x42\xb1\xcb\xd7\xce\x58\xc2\x16\x54\x68\xf7\x3a\x56\xca\x56\x47\x76\xfc\xb0\x8b\x78\x61\xf0\x8c\x99\x66\xd9\x9c\x8b\x72\x9b\x23\x78\xf6\x5c\x8a\x98\xa3\xa9\x0f\x8c\x59\xf8\x46\xb9\xdd\xcd\x5b\x6d\x93\x39\x7f\x8b\x01\xbf\x4c\x79\x82\xfe\x94\xa7\x02\x1f\x1b\x5b\x99\x70\x86\x37\xc1\x73\x5d\xea\xdb\xca\x4c\x91\x3b\x61\x84\x39\xc0\xbc\x58\x4f\xa4\x76\xf2\xf6\x5d\x3c\x7d\xe0\xd6\x18\xbb\xb0\x39\x2e\x72\x60\xfb\xbd\xc9\xd0\xbf\x6d\x8b\xe1\xb5\x5b\x1a\xa8\x76\x65\x33\x05\x5d\xb7\xef\xfc\x6b\x98\xdc\x57\xa9\xae\x5e\x7a\x68\x33\xc5\xaf\x25\x2c\xd5\x93\x6b\xea\xe2\xa6\x97\x69\x6d\x81\xf2\xbd\xa2\x7e\xd6\x90\xf2\x76\xb2\xa8\x9a\xf0\xe5\x65\x65\xf8\xca\x06\xc5\x65\x56\x7d\xa0\x24\xe5\x0c\x81\x3a\xa8\xb0\x93\x05\x9c\x85\xd1\xd8\xde\x34\x1c\xcc\xa8\x71\xf0\x5b\xdf\xfa\x9a\xd1\xb0\x6b\x63\x17\x9c\x71\x98\x22\x50\x05\x38\x0b\x4e\xbf\x93\xd6\x51\x6a\x13\x4a\x0d\x0d\x00\xbe\xdd\x27\x2a\x8f\x66\x84\x2a\xd3\x35\xb3\xa1\xcd\x89\x67\xc3\x39\x15\x7c\xc2\x94\x1e\x7a\x1c\x5a\xf5\xe3\xd7\x3f\x0d\xc9\x6b\x99\x11\x1b\x87\xdd\x77\x08\x10\xb6\x9f\xc5\xbe\xe0\x0a\x07\xe3\xdf\x2d\x34\xcd\x54\xc6\xb6\xd3\xf7\xd0\x59\x4d\xef\x0c\x0f\xc3\xce\xe6\x0c\xdc\x05\xaf\x48\xcf\x08\x79\xc1\xa7\xff\x61\xd8\xd2\xbf\x7a\xe4\xf8\x1e\x98\x76\xcf\xfc\xd9\xc3\x0f\xfa\x58\xc2\x50\x11\x2e\x3e\x8c\x69\x7e\x19\x9f\x4e\x59\x86\x2a\x1f\x81\x74\xb8\x13\x8b\x60\x21\x64\xf0\xb0\xf3\xfc\x16\x2a\x62\xb5\x23\x3f\x7e\xfd\x53\x8f\x1c\x97\xc7\x45\xb8\x88\xd9\x67\xf2\x35\x9a\x7e\xb9\x32\x63\x3c\xb1\x0e\x14\xb5\x14\x9a\x7e\x36\x6d\x46\x33\xa9\x98\x40\xf5\x5b\x4b\x32\xa3\x0b\x46\x94\x34\x5a\x2b\x4b\x92\x81\x35\x6b\x93\x7b\x0a\xa8\x22\x6e\x2a\x21\x09\x9c\xa4\x34\xd3\xa5\x2d\x31\xb4\x56\x0d\xf8\x9a\x59\xb6\xa9\x70\xee\xdf\x09\x17\xd6\x67\x64\xbd\x55\x66\xcd\x21\xa5\x11\x17\x49\x4b\x12\xcd\xa8\x98\xfa\x3c\xea\x49\xae\xf3\x8c\xed\x70\xb7\xd4\x3c\x03\x77\x5c\x34\x4a\xb7\xfd\x9e\x8b\xaa\xe7\x7e\xbd\x2d\x68\xca\xb5\x0b\xfa\xb7\x81\x7c\x7a\x79\x6a\x56\x21\xe3\xe3\x5c\xcb\x4c\x9d\xc6\x6c\xc1\x92\x53\xc5\xa7\x03\x9a\x45\x33\xae\x59\x64\x86\x75\x4a\x53\x3e\x88\xa4\x30\x2b\x0e\x08\x02\xf3\xf8\xd7\x50\x04\x73\x60\xba\xba\x03\xd7\xb8\xe6\xa0\x77\x1b\xc2\x9e\xd4\x00\xd6\xda\x18\x6b\xd8\x70\x56\x07\x8a\xf6\x94\x47\x18\x2d\x18\x2f\x4e\x5b\x19\xac\x83\xe5\x6d\xce\x63\x8e\x2c\xd2\x74\x54\x6d\xc3\x1c\x3b\x8c\xd2\x80\x53\x59\xa2\x94\x73\x1a\x23\x29\xa5\x62\xf9\xe0\x9b\xdf\x4c\x29\x00\xb2\x47\xcb\x41\x84\xf5\xed\x07\x54\xc4\xe6\xdf\x98\x8f\x12\x2d\x5b\x99\xc3\x9c\x37\x22\x04\x1f\xae\x2e\x1e\xe7\x48\xe4\xbc\x85\x53\x6f\xe5\xb5\x9a\x42\x14\x8a\xaa\x10\xb2\xa3\xb3\x9c\x39\xa6\x59\x16\x50\xb9\x72\xad\xfe\x7f\xd6\x67\xe2\x91\xb9\x76\x89\x54\xdb\x3d\x1d\x81\xec\x58\xb3\xbf\x6f\x8a\x37\xaa\x35\xf1\x4d\x63\x16\x06\xca\x65\xcf\x97\x86\xe1\x14\x14\x60\x30\x9b\x7d\xb4\xb5\xf6\x90\xf3\xd1\x9b\x8e\x0c\xd6\xe2\x03\x45\x5e\x29\xd9\xad\x40\x15\xfa\x4b\xa9\xd2\x16\x0e\x4a\x33\xa5\x09\x5d\x50\x9e\x80\x45\x5d\x8e\x15\xcb\x16\x58\xf2\xc8\xc2\xe2\xd1\xaa\x9e\x65\xab\x1a\xa0\x18\xf5\x48\x9a\x8f\x1b\xc3\xea\xaa\x6c\x1b\x00\x68\x43\x95\xde\x6f\xec\x75\x2b\x7a\x0f\xaa\x97\x1b\x7f\x36\x5f\xd8\x53\x8d\x31\xfb\xef\x2f\x8c\x66\x7a\xcc\xe8\xff\xcf\xde\xf9\xec\x38\xed\x03\x71\xfc\xbe\x4f\xe1\x5b\x2f\xdd\xdf\x3b\xfc\xb6\x2d\xa8\x12\x02\x04\x2d\x12\xc7\xd0\x8c\xba\xd1\xa6\x71\x15\x3b\xea\x01\xf1\xee\xc8\x9e\x71\x6c\x37\xfe\xc7\x06\x50\x57\xec\x6d\xb7\x71\x92\xb1\x33\xb6\xbf\xf9\x64\x3c\x96\xbb\x26\x35\xef\x4e\x5c\xda\x3b\xcf\x00\x17\xeb\xd0\x17\x60\x47\x2e\x95\xc4\x1a\xb4\xef\xa3\x26\xc5\x04\x34\xa3\xa3\xfd\x69\x8f\xb6\xb5\xdc\xf5\x95\x5e\xf7\xc2\xbb\x5f\xac\xa6\x7f\xe2\xb4\x9e\xa4\x8e\xc9\x93\x24\x96\xc6\x14\x10\xbc\x03\x7a\x76\xf8\x05\x42\x8f\x40\x7f\xa7\xca\x27\x10\x22\x99\x1a\xc2\x0f\xe1\xc3\xd2\xd8\x95\xaf\x3e\x87\x9d\xcc\x31\x5c\x3f\xa1\x04\x74\x0d\xb2\x6a\x5a\xd3\x95\xb1\x29\xc6\x56\xca\x8d\xae\xc9\x0a\xf6\x50\x89\x94\x40\xb8\xce\x88\x25\x78\x87\x46\xf3\x0e\xee\x2f\xbc\xaf\xd9\xaa\x3a\x41\xbb\xaa\x04\xd0\xb5\xdc\xe5\x6a\xf8\x8c\x16\xe2\xb7\x9a\x1c\x66\x5f\x11\x93\x11\xfe\x18\x27\x22\xdf\xb0\xaf\x58\x68\xe0\xd2\x20\xc8\x5d\x3f\xc0\x92\xbd\x51\xb3\xd7\x92\xed\xbb\xa7\x8e\x5f\xe6\xd9\x2a\x93\x5f\x2e\xfc\x30\x2b\xca\xdc\xa2\x53\xe4\x51\x42\x18\x0f\xf8\x8c\xe6\x3e\xd3\x22\x1a\xf0\x23\xa8\xd1\x9f\x6c\xc6\xa2\xc6\x22\xf5\xe7\x04\x41\xa9\x17\xc5\x9e\x1f\x7b\x10\x98\x73\x25\x98\xd0\xaf\x14\x39\xbf\x85\x8e\x56\xbc\x65\xcd\xdb\x86\xce\x32\x96\x9a\x79\xed\x68\x8f\xd0\xf3\xa6\x9b\x9d\xdb\xa0\xd4\x48\x47\xe1\x39\x86\x46\xe0\x53\xcc\xc2\x30\x74\x72\x66\x3d\xa7\x2c\x8a\x92\x14\x1d\x35\xb5\x5b\x7d\xfe\x12\x6f\xec\xe8\xdc\x97\x9b\x9f\xf2\x58\x6a\x2e\x90\xca\xf6\x99\x2c\x84\x7a\xc5\x4f\xaf\xf8\xe9\x25\xe1\xa7\xac\xc7\xa7\x90\xd3\xcb\x80\x4d\xd9\x2a\xa6\x00\xd3\x4d\xa2\xa5\xa2\x1a\x25\x71\xd2\xcd\x82\xa4\x6c\xd5\x0a\xe1\xd1\xbf\x83\x8d\xb2\x2d\x96\x40\x45\x37\x08\x89\x4a\x04\x19\xd4\x25\x32\x71\xeb\x14\x76\x85\xa2\xdd\x30\x71\xbc\x9c\x09\xa9\x71\xe5\xcc\x73\xd5\xa2\x12\x70\x59\xdb\x16\x64\x5c\xb9\xf6\x22\xc1\x48\xdb\x09\x4e\x8c\x65\xeb\xcd\xc7\x4f\x9b\xd5\xff\xbb\xcd\xfa\x5a\xdf\x85\x5a\x3a\xa3\xc4\xd2\x0c\xe2\xde\x51\x62\x91\x02\x6a\x40\x8e\x1c\x52\x3e\x10\x39\x34\x0c\x4d\xe8\xac\xf9\xba\x70\xd6\x2c\x37\x6b\xfe\xc8\xf7\xce\xd2\xee\xa9\x7a\xa7\xf6\x16\x8c\x18\x53\xba\xe7\x91\xb7\xb5\x30\xb1\xa6\xdb\xf5\xb8\x7a\xa9\xe9\x0e\xed\x50\x2b\x71\xb1\xdf\x6f\xd7\xe2\x3f\xc6\x1e\xe0\x50\x0d\x42\x53\x98\x9a\x77\x0b\xc9\x3e\xbc\x7f\xf7\x55\xc7\x50\xeb\x12\xcb\x31\xd9\x87\xce\x20\xdb\x54\x98\x04\x57\x62\x16\x32\xf6\x00\x28\x54\xf4\x9d\x0f\xd5\x59\x8d\x62\x02\x77\x59\x90\x5a\x8b\x3c\x42\x7b\x56\x23\xe6\x13\x30\x9b\xfb\x53\x5d\xd8\xee\x61\x6e\x42\x1e\x8f\x20\x71\xa5\x53\x2a\xaa\x31\xd9\x6a\x19\xe2\x3a\x83\xb5\x7a\xaf\x8f\xf4\x36\x7e\xa9\x04\x11\xab\xa0\xb5\x99\xe7\x9b\xe7\x33\x71\xc4\x11\x81\x1b\x38\x3c\xeb\xff\x26\x36\x2b\x63\x2d\xc7\xc0\x20\x92\x46\x16\xd3\xd4\x78\x18\x50\x38\x67\xfd\x84\x65\xc0\x75\x23\x7b\x37\x1e\xa3\xa8\x1d\x93\xcb\x6c\xd1\x1b\x5e\xd4\xde\xee\x92\x14\x6d\xe7\xff\x36\x7c\x1b\xf7\x17\xb5\xf6\x12\x91\x61\xdf\x7f\xdc\xdd\xfd\x0c\x00\x00\xff\xff\x4b\x58\xaa\x42\xfc\xbb\x0a\x00") +var _olmManifests0220CrdsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x77\xe3\xb6\xb5\x28\xfe\x7f\x3f\x05\x96\x9b\xf3\xb3\xdd\x48\xf2\x4c\xd2\x93\xdb\xfa\xb6\xcd\x72\x6d\x27\xf1\x2f\x33\x1e\x2d\xdb\x49\x6f\xef\xcc\x9c\x14\x22\xb7\x24\xd4\x24\xc0\x02\xa0\x6c\xf5\xe4\x7c\xf7\xbb\xb0\xf1\x20\xa9\x97\x25\x91\x1e\xcb\x1e\xa2\x6b\x35\x63\x91\x04\xc1\x8d\x8d\xfd\x7e\x74\xbb\xdd\xdf\xd0\x8c\xfd\x0c\x52\x31\xc1\x8f\x09\xcd\x18\xdc\x6b\xe0\xe6\x2f\xd5\xbb\xfd\x83\xea\x31\x71\x34\x79\xfd\x9b\x5b\xc6\xe3\x63\x72\x9a\x2b\x2d\xd2\x2b\x50\x22\x97\x11\x9c\xc1\x90\x71\xa6\x99\xe0\xbf\x49\x41\xd3\x98\x6a\x7a\xfc\x1b\x42\x28\xe7\x42\x53\xf3\xb3\x32\x7f\x12\x12\x09\xae\xa5\x48\x12\x90\xdd\x11\xf0\xde\x6d\x3e\x80\x41\xce\x92\x18\x24\x4e\xee\x5f\x3d\x79\xd5\xfb\x43\xef\xd5\x6f\x08\x89\x24\xe0\xe3\x37\x2c\x05\xa5\x69\x9a\x1d\x13\x9e\x27\xc9\x6f\x08\xe1\x34\x85\x63\x12\x51\x4d\x13\x31\xb2\x8b\x50\x3d\x91\x81\xa4\x5a\x48\xd5\x8b\x84\x04\x61\xfe\x93\xfe\x46\x65\x10\x99\xb7\x8f\xa4\xc8\xb3\x63\xb2\xf0\x1e\x3b\x9f\x5f\x24\xd5\x30\x12\x92\xf9\xbf\x09\xe9\x12\x91\xa4\xf8\x6f\xf7\xf1\xf6\xb5\xd7\xf8\x5a\xfc\x3d\x61\x4a\xff\x38\x7f\xed\x0d\x53\x1a\xaf\x67\x49\x2e\x69\x32\xbb\x60\xbc\xa4\xc6\x42\xea\xcb\xe2\xf5\xe6\x75\x11\xd5\x4a\x46\xf6\x32\xe3\xa3\x3c\xa1\x72\xe6\xd9\xdf\x10\xa2\x22\x91\xc1\x31\xc1\x47\x33\x1a\x41\xfc\x1b\x42\x1c\x08\xdd\x54\x5d\x42\xe3\x18\xb7\x85\x26\x7d\xc9\xb8\x06\x79\x2a\x92\x3c\xe5\xe1\x55\xe6\x9e\x18\x54\x24\x59\xa6\x11\xf4\x37\x63\x20\x99\x04\xad\xa7\x08\x12\x22\x86\x44\x8f\xc1\xbf\x3b\x3c\x45\xc8\x3f\x95\xe0\x7d\xaa\xc7\xc7\xa4\x67\x20\xdc\x8b\x99\xca\x12\x3a\x35\xab\x29\xdd\x65\xb7\xe9\xcc\x5e\x2b\xfd\xae\xa7\x66\xe9\x4a\x4b\xc6\x47\xab\x96\x62\xee\x5b\x7f\x0d\x16\x34\x37\xd3\x6c\x7e\x09\x33\x3f\xae\xfb\xfe\x2c\x1f\x24\x4c\x8d\x41\xae\xbf\x88\xf0\xc8\xdc\x1a\xfa\x0b\xae\x2c\x59\x48\x69\x52\x7f\xa0\x7a\x73\x87\x61\xee\x05\x27\xa3\xf9\x6f\x8c\xa9\xf6\x3f\xda\x9b\x26\xaf\x69\x92\x8d\xe9\x6b\xf7\xa3\x8a\xc6\x90\xd2\x02\x1f\x44\x06\xfc\xa4\x7f\xf1\xf3\xd7\xd7\x33\x17\x48\x15\x3a\x15\x3c\x27\x4c\x11\x4a\x24\x64\x42\x31\x2d\xe4\xd4\x40\xeb\xf4\xfa\x67\xd5\x21\xa7\x57\x67\xaa\x43\x28\x8f\xc3\xc1\x23\x19\x8d\x6e\xe9\x08\x54\x6f\x6e\xad\x62\xf0\x4f\x88\x74\xe9\x67\x09\xff\xca\x99\x84\xb8\xbc\x0a\x03\x1e\x0f\x93\x99\x9f\x0d\xfc\x4b\x3f\x65\xd2\xbc\x53\x97\x0e\xb2\x1d\x25\x2a\x57\xf9\x7d\xe6\x0b\xf7\x0d\x18\xec\x7d\x24\x36\x04\x0e\x14\xa2\x80\x3b\x63\x10\x3b\xd8\x59\xd4\x60\xca\x7c\xbf\x04\x05\xdc\x92\x3c\xf3\x33\xe5\xee\x9b\x7a\xe4\x1a\xa4\x79\xd0\x1c\xf7\x3c\x89\x0d\x25\x9c\x80\xd4\x44\x42\x24\x46\x9c\xfd\x3b\xcc\xa6\x88\x16\xf8\x9a\x84\x6a\x50\x9a\xe0\xa9\xe5\x34\x21\x13\x9a\xe4\x60\x41\x99\xd2\x29\x91\x60\xe6\x25\x39\x2f\xcd\x80\xb7\xa8\x1e\x79\x2b\x24\x10\xc6\x87\xe2\x98\x8c\xb5\xce\xd4\xf1\xd1\xd1\x88\x69\x4f\xc3\x23\x91\xa6\x39\x67\x7a\x7a\x84\xe4\x98\x0d\x72\x43\x0e\x8f\x62\x98\x40\x72\xa4\xd8\xa8\x4b\x65\x34\x66\x1a\x22\x9d\x4b\x38\xa2\x19\xeb\xe2\x62\x39\xd2\xf1\x5e\x1a\xff\x56\x3a\xaa\xaf\xf6\x67\xc0\xb7\x10\x99\x89\x27\x9b\x2b\x61\x6d\x88\xa7\xc5\x22\xfb\xb8\xfd\x96\x02\xa4\xe6\x27\x03\x95\xab\xf3\xeb\x1b\xe2\x17\x60\xc1\x6e\x21\x5c\xdc\xaa\x0a\x60\x1b\x40\x31\x3e\x04\x69\xef\x1c\x4a\x91\xe2\x2c\xc0\xe3\x4c\x30\xae\xed\x91\x4e\x18\x70\x4d\x54\x3e\x48\x99\x56\x88\x73\xa0\xb4\xd9\x87\x1e\x39\x45\x16\x46\x06\x40\xf2\xcc\x9c\xa4\xb8\x47\x2e\x38\x39\xa5\x29\x24\xa7\x54\xc1\xa3\x83\xda\x40\x54\x75\x0d\xf8\xd6\x07\x76\x99\x03\xcf\x3f\x30\x77\xc6\x08\xf1\x1c\x72\xad\x9b\x97\x1d\x4a\x62\x4f\xe0\x22\x0a\x4c\x56\x9c\x45\x33\x68\x1c\x4b\x50\x0b\x2e\xcc\x1d\x48\x7b\xa3\xc5\x93\xb1\x50\x66\xff\xa8\x26\xef\xde\xbc\x25\x11\xe5\x24\x57\x60\x0e\x4f\x24\x38\x37\x08\xa1\x05\xa1\x86\x97\x75\xe1\x9e\x29\x44\x20\x09\x23\xa6\xb4\x9c\xf6\xc8\x77\x42\xa6\x54\x1f\x93\x3f\xf9\x9f\xba\x38\x9d\x90\x84\x65\x7f\x39\xfe\x53\x26\xa4\xfe\x0b\x79\xc7\x93\xa9\x99\x34\x26\x77\x63\xe0\xe4\x3a\x7c\x1b\xf9\x73\xe9\x8f\xef\x65\x16\xf5\xc8\xc5\x88\x0b\xe9\xef\x34\x58\x75\x91\xd2\x11\x90\x21\x83\x04\xf1\x5a\x81\xee\xcd\xee\xe0\xca\x5d\x24\x56\x5c\x1a\xb2\xd1\x5b\x9a\x3d\x08\x9a\x53\x7f\xa7\x79\x97\x79\x7d\x99\x79\x17\x17\xb5\x40\x54\x36\x9f\x64\xfe\x49\xa3\x5b\x42\xdd\x5b\x52\x9a\x75\x15\x1e\x9b\x12\x98\xd6\x83\xc0\xa9\x9f\xc0\xc0\xaf\xf8\xf9\xc2\x51\xae\xde\xa6\x9f\x5d\xfe\xb2\x8d\x9f\x2d\xc4\x90\x07\x81\xf6\x76\x11\x17\x59\xe3\x1d\x23\x99\x45\x7d\x11\xdb\xcf\x7e\xf0\x2d\xdf\x97\xef\x26\x70\x9f\x09\x05\x8a\xc4\x6c\x38\x04\x69\xe8\x8e\x98\x80\x94\x2c\x06\x45\x86\x42\xe2\x7e\x65\x22\xc6\x33\x19\xf6\xaf\xc2\x6a\xfb\x22\x5e\x77\x63\xcc\xab\x91\x61\x58\x64\x74\x68\xb8\xf4\x73\x17\x9e\x76\xf2\xc0\xe1\x35\x83\x8b\x18\xae\x21\x81\x48\x0b\xb9\xf8\x8e\x19\x98\x5c\x96\x1e\x70\x54\xdf\xff\x75\x37\x66\xd1\x98\xa4\xb9\x42\xaa\xab\x65\x0e\x15\xb8\x68\x41\x86\x4c\x13\xc1\x09\xc5\xd7\x1a\x5a\x3f\xff\x64\x4a\x75\x34\x76\x77\xec\x2b\x92\xd0\x01\x24\x6a\x76\x9e\x01\x20\xcb\x8d\xf3\x04\x62\x33\x21\xd2\x12\x9c\x73\xc9\x27\x3c\x00\x25\x62\x49\x59\x90\xb7\x57\xc3\x8c\x3c\x84\x65\x16\xf0\x4c\x48\xa6\xa7\xa7\x09\x55\x6a\x19\x4e\xcf\x41\xf7\x62\x88\xe8\xc3\x86\x0c\xe2\x0e\x61\x3c\x66\x46\xa5\x51\xfe\xdb\xf7\x55\x98\xb7\x67\xee\x35\x0c\xae\x74\xbf\x87\x90\xbf\x87\xdc\xb1\x24\x31\xc0\x8a\x61\x48\xf3\x04\x89\xe4\xbf\x41\x0a\xc2\x10\x3b\x25\xe2\x15\x17\xfe\xf2\x6a\xe0\xad\xf8\x56\x2d\x12\x23\x20\x16\xda\xcb\x03\x5f\x79\x53\xdc\x4f\xa8\x84\xb2\x74\xee\xd8\x90\xf9\x50\xfc\xdc\xd2\xd4\xab\x97\x47\xa5\xac\xa8\x29\xe5\xc1\x34\xa4\x2b\xf6\x72\x5e\x75\x30\x58\x66\xa4\x8e\x62\xa1\x88\xea\x5a\x53\x83\x75\x28\xe6\xd9\x2b\xa0\x08\xe5\x53\xa2\xa9\x95\x48\xa8\xc3\x5f\xb7\x63\x5a\xb2\x2c\x01\xf2\xa7\x5b\x98\x76\xac\x0c\x08\xc3\x21\x44\xfa\x2f\x24\x57\x5e\x2a\xc2\xfb\xcd\x1f\x41\xc8\xfe\x93\xff\xd7\x5f\x96\x7d\xf1\x5a\xf8\xfc\xf0\xd9\xb7\xc3\x2e\x69\xd5\x1d\x33\x10\x3a\xc7\x07\x66\x90\xd3\x42\xc0\xce\x65\xe0\x83\x9f\xd5\x23\xe7\x69\xa6\xa7\x24\x05\xca\x95\x3f\xd9\x49\x52\xb9\x59\xf5\xc8\xdf\x0c\x1d\x2c\xa1\x31\x4d\x12\x71\x17\x64\x62\xc4\x90\x4b\x71\xed\xce\x7b\x87\xf4\x25\x0c\x41\x16\xbf\x20\x99\xbc\x14\xe7\xf7\x10\xe5\x7a\x29\x05\x28\xc3\x6d\x05\x2a\xdb\x71\x0b\xd3\x0d\x00\xf2\x23\x4c\x3d\xef\xb6\x5f\x76\x0b\x53\x8b\x0c\xf8\x53\x81\x43\x34\xcb\x12\x06\x56\x3c\x5d\x05\x99\x5b\x98\x2a\x3c\xdf\xe6\xf9\x5b\x3b\x3b\x98\xfb\x3b\x05\x96\x78\x32\x7b\x6e\x24\x24\xf5\xbf\x2d\xbe\x46\x22\x1d\x30\x6e\x5f\x66\xa7\xf6\x5b\x81\xb3\x7b\x80\xf2\x18\xff\xc4\xd7\x34\x01\x2e\xbf\xa8\x0d\x60\xf6\xce\x7f\x47\x21\xfb\x13\x6a\x56\xb4\x6f\xc4\xf8\xc4\x9e\xf8\x31\xcb\xbc\x4a\x85\x4b\xef\x91\x9f\x69\xc2\x0a\x7d\xd4\xe2\x86\x85\x00\x7e\xd5\xf9\xbf\x72\x9a\xf4\xc8\x99\xa5\x67\xf8\xf5\xee\x27\x77\x93\x01\xe4\xbf\x72\x36\xa1\x89\xe1\xdf\x5a\x18\x0a\x19\x47\x54\xc6\xc8\x61\x9c\x9e\xa6\x84\xdd\x3d\x8a\x84\xc0\x88\xa7\xfe\xb4\x17\x7b\xa4\x50\x47\x24\x19\x95\x9a\x45\x79\x42\xa5\xb7\x3d\x4d\x1b\x81\x68\x81\x34\xd7\x10\x09\x1e\xaf\x3c\xc1\x4b\xa9\xab\x7b\xb6\x0c\x63\x64\x11\x20\x99\x88\x51\x44\x61\x29\xcc\x22\xe9\x41\x95\x8d\x8b\xa1\x3f\xd5\xe1\x88\x75\x88\x30\xdc\xe3\x8e\x29\xa7\xc6\x05\x51\x99\x59\x51\xfa\xb0\x44\x1e\xc3\xa9\xe8\x91\xbf\x4e\x3d\xa7\xe9\x10\xa6\x2d\xef\xd1\x46\xae\xe9\x78\x01\xc0\xa1\xac\x03\x76\x71\xa0\x86\x42\x82\x11\x6f\x0f\x62\x81\xcf\xc0\x84\x45\xfa\xb0\x47\xfe\xaf\x61\x66\x66\xe3\x39\x8c\xa8\x66\x13\xf0\x28\xee\x19\x9f\x96\x60\x54\x3f\x42\x15\x79\x45\x0e\xf0\x31\xc2\xd2\x14\x62\x46\x35\x24\xd3\x43\x32\x98\xe2\x6b\xd4\x54\x69\x48\xd7\xd9\x3a\xa3\xd4\x8f\x2a\x76\xa0\xf9\x31\x74\x2a\x0a\xe3\xfa\x9b\xdf\xaf\xb8\x13\x17\xbb\xc1\xce\xfe\x8c\x8a\x75\x85\xd4\x58\x5d\x7b\x66\x0b\x03\x0f\x12\x81\x8a\x04\xba\xc1\x94\x3b\x0b\x9d\xe2\x5c\x79\xcb\xc6\x00\x02\x99\x09\x1b\xfc\x4f\x83\x07\xd4\x28\x16\x88\xe5\x16\x73\x6b\xe0\x38\x8b\x56\xa9\x06\x4b\x39\xda\x72\xcd\x95\xa0\xf6\x3a\xa0\x0a\xbe\xf9\xfd\x12\x95\xc0\xda\x9d\xcc\x9e\xcf\x6b\xb7\x64\x0d\x46\x59\x4c\xbe\x6c\xb3\x1e\x3c\xd6\xe1\xf5\x5b\xcd\xc0\x8c\x12\xf0\xa0\xba\x12\x54\x05\xca\xc3\x7e\x77\xbd\x46\x88\x06\x7c\xca\x38\x48\x3b\x9b\x21\x7e\x8c\x2b\x4d\xb9\x66\x48\xd9\x82\xee\xe8\x75\xc9\x3b\xa6\xc7\x9b\xa8\x2b\x88\x6b\x8e\xd0\x58\xe4\x72\xd6\x81\x39\xfa\xb0\xb1\x5a\xe9\x05\xda\x87\xed\x0c\x7d\x2f\xfa\xda\x77\x52\xa5\xd8\xc8\x48\x99\xe4\x0e\xd8\x68\xac\x3d\x3b\xa9\x4a\x9b\xe6\x57\xf7\x0a\xf6\x6f\x3c\x4d\x69\x60\x02\x4c\x23\x07\x18\x80\x01\xa0\xca\x53\x88\x3d\xcd\x88\x21\x03\x1e\x03\x8f\xa6\x68\xd5\x4a\x26\x20\x7b\xe4\x27\x65\x76\x8a\xfc\xc0\x46\x63\x03\x42\xfb\xd2\xb2\xa8\x84\x52\x81\x61\xd5\xd5\x15\x30\x23\xd9\x1b\xb9\x46\x1a\x8d\xc6\x80\xdf\xc8\x40\x7e\x06\x88\x67\xee\x57\x24\xce\xd1\xd6\x36\xbb\x88\xdc\xc0\xa1\x87\x52\xac\xa4\x7c\x14\x0c\x09\x41\x25\xb0\x07\xde\x7c\xd2\x48\x58\xab\x1a\x5a\x7e\x0d\xed\xd4\xa2\xa0\xa3\xcc\x9a\x42\xc2\x1c\x8c\xeb\xaf\xbf\xb2\xf3\x7a\x65\xc2\x91\x1e\x41\xe8\xec\xc7\x18\xcc\x21\x39\xb7\xc0\x87\xb2\x3e\xe2\xc9\xcc\x2b\x3b\xd5\xa2\xe7\x90\x1c\xd3\x74\x76\xc9\x05\x4d\x97\x94\xdf\x42\x4c\x12\xb8\x67\x91\x18\x49\x9a\x8d\x59\x44\x93\x64\x8a\xc7\x14\xd5\x41\xa6\x15\x5a\x51\x56\x98\x6d\x96\x91\xf1\xe0\x02\xd8\xd8\x7c\xa1\x20\x92\xa0\x1f\x36\x85\x5d\xdb\xfb\x0a\xa6\x6c\x38\xa0\x01\xb1\x9b\xc0\xe2\x88\xc3\x39\x6f\xef\xa1\x51\x64\x0e\x12\xa2\xae\xe0\x1a\x9c\x00\x52\x42\xe5\x1e\xb9\x40\x96\x3a\x00\x85\x58\x7e\x0b\x90\x59\x4c\x4b\x98\xd2\x44\xa5\x34\x49\x3a\x44\x31\x1e\x01\x01\x1a\x8d\x2d\x38\x39\x80\x57\xa8\xb5\x64\x60\xc5\x20\xc3\x6a\xa7\x61\x6f\x80\xeb\xc5\x42\xcd\x6a\xbd\x6b\x85\xce\xb5\x1a\x8c\x81\xa6\x3c\x0c\xc9\x82\x16\x79\x9e\xe8\x7c\x4e\xaa\x70\xef\x6d\xf0\x6a\x6b\x27\xbe\xd6\x46\xf8\x18\x3d\x4c\x6b\x7e\xaa\xdc\x1e\xfc\x0c\x63\x71\xe7\x2d\xce\x73\x87\xdc\x10\x5e\xe5\xf7\x36\x66\x2a\x32\x27\x1d\x62\x72\x2a\xb8\x42\xf9\xd4\x3a\x1e\xd0\x71\x30\xa1\x89\x45\x05\x3f\x71\x26\x92\x04\x8f\x7c\xee\xd5\x09\x23\xc7\x73\x02\xe9\x00\xe2\x18\x62\xf3\x59\x76\x29\x4b\xd8\x5c\x4d\x53\x91\xe7\x0f\x7d\x91\x24\xab\xb9\xd8\x4a\xbd\x74\x1d\xad\xd4\x03\x60\x95\x6c\x54\x65\x7d\x1e\x62\x4c\x85\x33\x13\x83\x06\x99\x32\xee\xc4\x23\x23\xea\x06\xc0\x0e\x40\xdf\x01\x70\x12\x8d\x21\xba\x0d\x47\xc9\xf9\x6d\x66\x76\xcd\x39\x8d\xaa\x14\xab\x70\x89\x89\x24\x41\x45\x43\x01\x10\x66\x74\x02\x0e\x77\xfe\x99\x99\x33\x5a\x22\xf6\x74\x42\x59\x42\x07\x09\x20\xd7\x0c\x7f\x75\x2a\xfe\x23\xcf\xcf\xb3\x3c\x49\x8c\x10\xcb\x63\x32\xba\xea\x9f\x12\x2d\xe9\x70\xc8\x22\x73\x29\x66\x12\x22\xed\x6c\x12\xcb\x3e\x61\x95\xb8\xb6\xf4\x44\x28\x4d\x75\x3e\xb7\x47\x2b\x36\x78\xd5\xc6\x1a\x3d\x84\x2d\x35\x10\x55\xb6\xf2\xaa\xaa\xac\x98\x65\x80\x55\xb6\x2a\xc6\xd4\x1e\xb9\x14\xa8\x23\x50\x4d\xde\x82\x32\x6c\x17\x01\x74\x05\x54\x09\x5e\xa2\xae\x28\xfd\x4a\x36\x62\x9c\x26\xee\xa3\xd0\xeb\x63\x44\x74\x26\x78\xd0\x3d\xe8\xd4\x1c\xca\x94\x8d\x24\xd5\x81\x28\x16\xeb\x76\xdc\xc5\xf1\xc5\x61\xae\x73\x09\x3d\x72\xc2\xa7\xb8\xdf\x43\xa0\xe6\x07\x33\xb3\x96\x22\xce\x23\x23\x2f\x19\x02\x9b\xab\xf2\x24\x8d\x92\xd1\x0a\xd4\xf6\x4e\xfd\x4b\xbc\xa0\xa7\xcc\x01\xa0\xcc\x19\x4f\x05\x07\x42\x55\x66\xf4\x38\x8f\x93\xb9\x44\x23\x76\x00\x30\x32\x8b\x93\xfe\x05\xf1\xa1\x21\x3d\xd2\xed\x76\xc9\x8d\xf9\x59\x69\x99\x47\xc8\x5f\xcc\x11\xe2\xb1\xe3\x14\x16\xfb\xf0\x23\x29\x8a\x9d\xf8\x19\xc4\x59\x3e\xac\x08\x96\x51\x3d\x26\x3d\x0b\xf8\x5e\x09\x14\x84\x7c\x67\x78\xcd\x3d\x4d\x33\xc4\x7b\x43\xba\xbf\x13\xe2\xda\xee\x90\x7d\xe1\x7f\x93\xa3\xa3\x59\x84\x10\x03\x23\x9f\x3a\xeb\x21\xe2\xc5\x50\x88\x7d\x55\xfd\x9e\x9e\x79\xf0\x47\x2e\xee\xf8\xa2\x57\xe3\xbb\xa8\x84\x63\xf2\x61\xef\xc4\x1f\xbd\x0f\x7b\x1d\xf2\x61\xaf\x2f\xc5\xc8\xc8\xac\x8c\x8f\xcc\x0f\x06\xa3\x3e\xec\x9d\xc1\x48\xd2\x18\xe2\x0f\x7b\x66\xda\x2f\x33\xa3\x5e\xbd\x05\x39\x82\x1f\x61\xfa\x67\x9c\x2c\xfc\xec\xd9\xc1\x9f\x53\x73\x1d\x7f\x37\xfc\xd7\x30\xa9\x3f\xa7\x34\x0b\x3f\xbc\xa5\x59\x78\xf8\xb4\x40\xb2\xf7\x1f\x53\xd0\x74\xf2\xba\x57\x6c\xe7\x3f\xfe\xa9\x04\x3f\xfe\xb0\x57\xac\xbf\x23\x52\x83\x16\x99\x9e\x7e\xd8\x23\x95\xb7\x1e\x7f\xd8\xc3\xf7\xfa\xdf\xfd\x22\x8f\x3f\xec\x99\x37\x99\x9f\xa5\xd0\x62\x90\x0f\x8f\x3f\xec\x0d\xa6\x1a\x54\xe7\x75\x47\x42\xd6\x31\xd2\xd2\x9f\x8b\x37\x7c\xd8\xfb\x07\xf9\xc0\xcd\x62\x51\x11\xb4\x3b\xa9\xc8\xff\xec\xad\xe0\xe7\x2b\x88\xfe\x6a\xe5\xcd\x68\x67\x09\x55\xfa\x46\x52\xae\x98\x0f\x93\x58\x7a\x6b\x6a\x0f\xfb\xd2\xeb\x12\x09\xc0\xd2\xcb\x16\x1b\x96\x5e\x5e\xc2\x3a\xd7\x61\x5b\xf3\xdf\xb0\xa6\xc9\x79\xfe\x41\x2f\xcf\x98\x2b\x85\x91\x26\xec\x8f\x61\x00\xee\x6e\x73\x10\x8d\x10\x6f\xce\xb7\x23\x6e\x46\x5c\xe4\xb8\x6f\x3d\x77\x78\x83\x76\x1f\x5c\x9c\x39\x8f\x41\x26\x53\x23\x4e\x14\xb3\x46\x63\x23\xed\xc7\x3d\x62\x8d\x06\x34\x98\x68\x6e\xcd\x41\x42\xd6\xc4\x4b\x96\x6b\x5c\x57\x98\xd1\x10\x0e\x7b\xe0\xdd\x34\xc8\xe5\xa2\x08\x32\x8d\x6c\x6e\x7b\x4f\x0a\x29\x59\x54\x8c\x58\xd5\xd5\xcb\xd1\xc3\x21\xc7\x9a\x80\x77\x77\x3b\xa7\x74\x9e\x52\xc3\x37\x68\x6c\xd6\x5b\x5c\xb3\xba\x9b\xd5\xb5\x2c\x3d\xa5\x03\x91\x3b\xdb\x6e\xd8\x07\x07\x6a\xc7\x45\x50\x2a\xcb\xf4\xf4\x41\x73\xc9\x5a\x1f\x9f\xd2\xfb\x37\xc0\x47\x7a\x7c\x4c\xbe\xfe\xea\x7f\x7d\xf3\x87\x25\x37\x5a\xc2\x08\xf1\xf7\xc0\x9d\x21\x68\x4d\x30\xcc\x3f\x38\x6b\x31\x2c\x22\x99\x46\xc5\x3d\xc1\xc2\x5d\x60\xd0\x1d\x45\x3f\xa5\xe3\x95\x79\x66\xe0\x62\xa8\xbc\x35\x34\x44\xd0\x31\x12\xd2\xc2\xc9\x58\x20\xe0\xc9\x94\xbc\xfe\xaa\x43\x06\x0e\xc4\xf3\xe4\xfb\xfd\xfd\xc7\xde\x82\x25\x33\x45\xfe\xd8\x99\x59\x0f\x53\xc4\x6c\x95\x18\x22\xe2\x58\xfd\x52\x82\x65\x83\xde\x12\x30\xcf\x06\x21\xac\xf7\xa1\x8d\x7b\xc8\x18\xb8\x9e\x21\x30\x65\x9c\xa5\x79\x7a\x4c\x5e\x2d\xb9\xc5\x92\xb4\x35\x77\xd3\xde\x5c\x48\x01\xd4\x90\xae\x91\xa4\xa9\x91\x77\x22\xc2\x62\xe0\x9a\x0d\x19\xc8\x32\x6a\xa3\xae\x6f\x1f\xf4\xae\xd6\x00\x45\xf4\xc2\x1a\x3a\x54\x42\xf6\xbe\x15\x72\x24\x72\x60\xe7\xba\x89\xca\x04\x6a\x9a\x81\x3d\x0d\x56\x7b\x21\x70\x9f\x59\x39\xb5\xe4\x83\x48\x81\x72\xc6\x47\xde\xbb\xeb\x0d\xc9\x96\xeb\xde\x8d\x01\x59\x4f\x30\x52\x5a\x63\x7f\x64\x34\xa5\x18\x95\x26\x4a\x46\x39\x95\x94\x6b\xa3\xc3\x9e\xf4\x2f\xac\x80\x3e\x6b\xd0\xa4\x45\xc8\x8f\x3f\x8d\xf6\xa8\x5a\x62\x65\x96\xe8\xc2\x84\xf0\xc4\x36\x77\x54\x5f\xbf\xfa\x6a\xe5\x96\x87\xfb\x96\xfb\xef\xa8\xd6\x20\xf9\x31\xf9\xaf\xf7\x27\xdd\xff\x4b\xbb\xff\xfe\x78\xe0\xfe\xf1\xaa\xfb\xc7\x5f\x3a\xc7\x1f\x7f\x57\xfa\xf3\xe3\xe1\xb7\x5f\x2c\x99\x69\xb1\x24\xbf\x04\x7d\x1c\x13\xf1\x42\xa2\xdf\xd1\x0e\x72\x18\x31\x24\x37\x32\x87\x0e\xf9\x8e\x26\x0a\x3a\xe4\x27\x8e\xac\xa1\x26\xd0\x80\xe7\xe9\x2a\x4d\xaf\x4b\xf6\xcc\x5b\x17\x0b\x1f\xe1\x16\x5c\xd2\xea\x7b\xdc\x72\x57\xe9\xae\xeb\x01\xc9\xdb\x19\x4a\x94\xa6\x14\x5a\x86\xb1\x48\xe6\x20\x89\x9e\x13\x6f\x7b\x91\x48\x8f\x4a\xa1\x67\x46\xae\x7e\x4b\xf9\x94\x14\x64\xcd\x0a\xa5\xb3\x98\xae\xb4\xa1\x4d\x34\x92\x42\xa9\x10\x3b\xa7\x48\xc2\x6e\x81\x9c\x14\x4a\xa3\x21\x96\x03\x88\x28\x0a\xe2\x72\xc0\xb4\xa4\xd6\xe2\xeb\xe5\xca\xc2\x9c\x34\xcc\x13\x72\x60\x74\xd5\x1e\xc6\x4b\xcc\x51\xd7\x43\x67\xba\x1d\xb0\x84\xe9\xa9\xd5\xa3\x23\xc1\x87\x09\x73\xf2\x7f\x9a\x09\xa9\x29\xd7\xce\xc8\x08\x23\xb8\x27\xac\xf0\x7b\x33\x45\x0e\x62\xae\x5e\xbf\xfe\xea\xeb\xeb\x7c\x10\x8b\x94\x32\xfe\x5d\xaa\x8f\x0e\xbf\x3d\xf8\x57\x4e\x13\x74\xf1\x5e\xd2\x14\xbe\x4b\xf5\x61\x73\x6c\xf1\xf5\x37\x6b\x9c\xa2\x83\xf7\xf6\xac\x7c\x3c\x78\xdf\x75\xff\xfa\x9d\xff\xe9\xf0\xdb\x83\x0f\xbd\x95\xd7\x0f\x7f\x67\xbe\xa1\x74\x02\x3f\xbe\xef\x16\xc7\xaf\xf7\xf1\x77\x87\xdf\x96\xae\x1d\x2e\x3a\x8c\xf7\xdd\xdb\x7c\x00\x92\x83\x06\xd5\x35\x5a\x40\x37\xa5\x59\xf7\x16\xa6\x4b\x0e\xe7\x52\x71\x74\x7e\x22\x0b\xb1\x94\x66\x8b\x54\x6f\x1b\x42\x76\x05\x18\xb6\x14\x2d\x44\xf2\x9a\xee\x17\x4e\x97\x88\x64\xf6\x12\x06\xb9\x6f\x61\x72\x32\x7c\xc7\x9a\xd9\x56\x89\xd3\x6b\x60\xcb\x7a\xf2\x23\x5f\x11\xa6\xf3\xe0\x4b\xc2\x77\x6e\x3d\x83\x3f\xdf\x4b\x22\x9c\xd7\x9e\x27\x67\x4b\x35\xad\xaa\x01\xf3\xe2\xcc\x8a\xbe\x48\x7a\x50\x9c\x1b\x0b\xa3\xe7\xe5\x9c\xfd\x2b\x07\x72\x71\xe6\xe8\x51\x87\x30\x1e\x25\x79\x6c\x24\x85\x9f\x7e\xba\x38\x33\xca\xfb\x5f\x1d\xb9\xb9\x03\x12\x0b\xbe\xaf\xc9\xbb\xcb\x37\x7f\x47\x4b\x00\xde\xd1\xb1\x0c\xdd\x3a\xa3\x68\xc2\x6c\x70\xb4\x67\xc0\xe4\xaf\x60\xe6\x72\x6f\x8e\x68\x16\x8c\x27\x48\xee\x78\x4c\xc6\x90\x64\x46\x80\xb8\x05\xa2\x72\xe9\x56\x67\x26\xb6\xee\x5e\x03\x6b\xe2\x9c\xc1\x23\xd0\x88\xe4\x09\x06\xf9\x6e\x03\x34\x17\x76\xca\x04\xbf\x36\x52\xe0\x23\x9c\x0f\x83\xc8\xef\x9c\xcc\x8a\xef\xd8\xe2\x30\xac\x88\xb5\x7d\xf0\x0b\x89\x3b\x4c\xa7\xf6\x4b\x1f\xfd\x24\xcd\x7d\xef\x56\x6f\xb4\xc6\x4c\x74\x6b\x5e\x3d\x60\x7c\x9e\x8b\xe1\xaa\xaa\xce\x33\x29\x0f\x68\x58\x0d\x9e\xd1\x31\x55\x64\x00\xc0\xd1\x96\x6b\x4d\x7f\xc0\x1d\xd6\x41\x61\x85\xcd\xb3\xae\x16\xdd\x78\xf1\xe6\x3d\x00\xb9\x87\xa1\xb6\x42\x73\xad\x7c\xdb\xc9\xc6\x8a\xea\xdd\x78\xba\x08\x06\xca\xda\x32\x31\x6a\xc8\xcb\x20\x9b\x7e\xd8\x72\xc5\x64\xc6\xa4\x8b\x9a\x85\x33\x6a\x38\x3d\x63\x7e\x49\x46\x7b\xac\x58\x36\xb4\x40\x57\x5e\xd5\xb2\xb7\xf9\x1a\xed\x36\x5f\x83\x9c\xb0\xad\x98\xdf\x43\x07\x33\xb2\x41\x26\x27\x8f\x7f\xac\x8c\xe8\xb5\xf5\x4b\xd0\xf4\x17\x89\x07\x7c\x37\x2b\x26\x50\x16\x82\xab\x82\x59\x37\x99\x63\x53\x66\x69\xa9\xc9\x31\x06\x16\xfb\x9f\xb4\x90\xe8\x6f\x2f\xff\x96\x0f\x82\xa0\x5c\xcc\xee\x74\x20\xf2\xdf\xff\xf3\x9b\xdf\x3c\xcb\x74\xc9\x24\x57\x1a\xa4\x03\x9f\xcf\x15\xfc\x74\x69\x93\xf6\xf5\xee\x0c\x39\xc8\xe1\xf5\x52\xfa\xe4\xa2\x7b\xe6\xd3\x28\x17\x7e\x08\xde\xb2\x30\x9d\x52\x4d\xca\xff\x76\x37\x16\x89\x95\x8b\x66\x7b\xcc\x04\xcb\x4a\x72\xc6\xf5\xcf\x25\xec\xfd\x34\x59\x95\x33\x8e\xc5\xd5\x4b\x98\x94\xf6\xa9\xfc\xfa\x9f\xe7\x7e\x5f\xf7\xf5\xfe\xf3\xa9\x79\x73\x29\x9a\x45\x70\x4c\xf8\x4a\xa8\x4f\x8d\x5d\xbc\xa0\x05\xb7\xd8\x15\x5d\xcd\x5f\x78\x38\xbd\xd2\xe9\xae\xd9\x98\xaa\x79\x10\xf7\x67\x7e\x5d\x30\x5d\xb3\x49\x95\x8b\xb0\xdf\x8a\xd7\x96\x82\x04\xb7\x1a\xee\x9d\x91\x7b\xff\xb1\xf0\x99\xeb\x0c\xa2\x7f\xb4\x09\x96\x6d\x82\x65\x9b\x60\xb9\xa3\x09\x96\x0f\x9f\x7b\x73\x86\x49\x0c\x51\x42\x7d\x9a\x8b\x86\x24\xc1\x6c\xc7\xb1\xb8\x0b\xa1\x97\x49\x52\x0e\xd5\x2c\x02\xbf\x52\xca\x31\x9c\x21\xcb\xac\x6d\x9c\x92\x11\x9b\x00\x0f\x91\x28\xeb\x2e\x7e\x75\xc2\xe7\x62\x06\xe5\xaf\xba\x05\xce\x5c\x59\x99\x0b\x3a\x2b\x03\xad\x80\xda\x49\x71\xaf\xb3\x11\xe4\xdc\xba\xfc\x73\x09\x31\xe6\x3c\x58\x24\x4f\x69\x86\x52\x1e\xc6\x53\xe8\x31\x86\xa9\x06\x04\xc7\x74\x1b\x74\xb8\xa1\xd3\x69\x4a\x8c\x18\x87\x04\x41\x0b\xe1\xa2\x72\xcc\xb3\x48\x18\x24\x68\xc9\x60\x52\x36\x90\x06\x47\xd4\xe6\x3a\xc1\xfa\xd9\x62\x2b\x45\x62\x9a\x31\x27\xbb\xc4\x41\xb0\x5c\x03\x7a\xfd\x0b\x87\x6f\x85\x38\xaa\x1c\xbe\x81\xc2\x24\x05\x27\x1f\x04\xb9\x16\xdf\xe4\x10\x2b\x26\x98\x77\x61\x31\xc3\x80\xad\x8c\x84\x03\xb4\xcc\x48\xca\xcd\x85\x85\xc8\xfd\x08\x59\x88\xe2\x8e\x2f\x8f\x0e\x68\x36\xbf\xab\x0c\xbb\xf0\xb3\x59\xe0\x04\x13\x39\xbd\xea\xac\x05\x9e\x56\xab\x41\x23\xec\xdc\x2d\x31\x99\x30\x4a\xe8\x68\x24\x31\x54\x76\x69\xa4\xc1\x9a\x39\x5a\x0f\x85\x46\x10\x3c\x8c\x28\xc9\xaf\xbc\xc3\x90\xc1\x95\x37\x2c\xb5\xd0\xfa\x1b\xe6\x85\xc5\xea\x58\x2f\x9b\x8c\xa2\x19\xcd\x83\x56\xc8\x07\x12\x57\x1e\xde\x5b\x3b\x1e\xd8\x61\x3b\xaa\xfb\x3c\xb3\x10\x77\x75\x60\xce\x47\x41\x9a\x0d\x39\x88\x0a\x6f\xb6\x73\x93\x64\x20\x8d\x3e\x6e\x83\x89\x29\x89\xac\xfc\x16\x08\x8f\xf7\x0e\x3f\xb0\x9c\xb5\xf6\xdf\x8e\x75\xb0\xc0\x8e\x2e\xc6\x53\x3d\x70\xdb\x7a\x5b\x65\xc7\x03\x19\xdb\xb3\x63\xcd\xfc\x25\x37\xf7\xea\x8c\xee\x5a\x73\x1b\x30\x34\x3e\xe9\x1a\x09\x39\x76\x54\xcd\x5b\xf4\xee\x6d\x39\x92\x44\xd2\x3b\x02\x3c\x12\x86\x58\xfc\xff\xd7\xef\x2e\x7d\xf2\xda\x85\x26\x2c\xcd\x12\x48\x31\xae\xe2\x2d\x95\x6a\x4c\x13\x90\xc8\x9d\x7e\xe2\x69\xe5\xef\x99\xf8\xef\x18\x12\x3a\xb5\x93\xc5\x10\x09\xb4\xc4\x0b\x49\x32\x23\xe0\xa6\x59\x8e\xf9\x1b\x78\x15\xdf\xfb\x60\x86\xce\x16\xa0\x29\x4c\x54\x83\xe9\x42\x0b\x68\x75\xdc\x77\xe3\x75\x69\x40\x79\x31\x0f\x53\x02\x3b\xd6\xa2\x07\xe5\x89\x1f\xfc\xca\x90\x1e\xd3\x5f\x61\x63\x2b\xcf\xb8\x61\x22\xd8\xd7\x5f\xad\xb8\x33\x86\x2c\x11\x53\x83\x17\x0f\x9f\x95\x35\xbf\x67\xed\x73\xbd\xee\x7c\xeb\x9e\xe5\x35\xe7\xb3\xc6\xa9\x26\x66\x5a\xa4\x40\x6d\x35\xd1\x2a\xf7\xdf\x46\x13\x2d\xb0\x3f\x2e\x9f\xed\x51\x98\x5f\xff\xc2\x5b\x1b\x82\xd7\xd7\xd2\xa6\x1f\x83\xdf\xb8\x24\x48\x4f\x33\x47\x69\x8c\x2c\x38\xcb\xee\x9e\x86\xcb\x3d\x20\xcf\xf8\xdb\x1e\x90\x6a\xfc\x6d\x0f\xc9\x36\x76\x6c\xc2\x36\x1f\x46\x3a\x3b\x36\xa2\xb1\x0f\x23\xe0\x16\x93\x4e\x56\x7b\x93\xb7\x98\xd7\xe8\xc4\x3b\x20\xe1\x5d\x57\x96\x51\x91\xef\x5c\xc2\xa1\x11\xde\xb0\x1a\xcb\x20\x11\xd1\xad\xb3\x5b\x5e\x9d\x85\xdc\x3e\x5f\x7d\xc8\x65\xf6\x11\xf6\x10\x06\xb7\x22\x5d\x2b\xd2\xb5\x22\xdd\x73\x11\xe9\xac\x7f\x60\x17\x28\xd5\xcc\x42\x96\xd2\x2a\x1b\x7b\xd9\x52\xab\x15\xa3\xa5\x56\x38\x5a\x6a\xf5\xc0\x78\x76\xd4\x6a\x2d\x39\x6d\x8d\x18\xc2\xd5\x07\xb9\x35\xa6\xb6\xc6\xd4\xd6\x98\xea\x46\xcb\xcb\xdc\x68\x79\x59\xcb\xcb\x5a\x63\xea\xaa\x29\x5b\x63\xea\x86\x13\xb5\xc6\xd4\xd6\x98\xda\x1a\x53\x5b\x63\xea\x43\x1f\xd3\x8a\x74\xad\x48\xd7\x8a\x74\xeb\x2e\xa6\x35\xa6\xb6\xc6\xd4\x55\xa3\xa5\x56\xa5\xd1\x52\xab\x15\xe3\x65\x53\xab\xfa\xc6\xd4\x28\x01\xca\x17\x2b\x55\x33\xf1\xdf\x78\x5f\xa8\x5f\xef\x8a\x74\xba\x5f\x07\x30\xa6\x13\x26\x72\x59\x14\x4a\x3a\xbd\xfe\x99\x8c\x40\x2b\x83\x05\xa0\x61\x91\x60\x5e\x33\xd9\x18\x38\x1d\x24\x0b\x27\x7e\x88\x94\xb8\x27\x57\x1b\x8f\x07\x42\x98\xaf\x9b\x87\x18\xaa\x3a\x5e\xd3\xd9\x24\x9e\x79\x6f\x59\x8e\xdd\xe2\xa0\xe6\xd3\xab\xb3\xa6\x42\x99\xc9\x07\xee\x2b\x64\x1b\xee\x60\xab\xf0\x62\xd9\x40\x57\xe8\xef\xdd\x1d\x87\x18\x93\xdc\x7c\xcd\x72\x73\xe8\x59\xc4\x74\x32\x0d\x2f\xee\x2d\x2a\x3b\xf2\x7c\x42\xa2\x4f\xaf\xce\xd6\x37\xdf\xfb\x0d\xf8\x14\x96\xfa\xd6\x0e\xdf\xda\xe1\xc3\x68\xc5\xa0\x2d\x27\x6d\xc5\xa0\x15\xe3\x65\x8b\x41\xbb\x6e\xb7\x6e\xad\xcd\xa4\xb5\x36\xaf\xbe\xad\xb5\x36\xb7\xd6\xe6\xd6\x7e\xb3\x64\xb4\x82\x0b\x8e\x56\x70\x79\x60\x3c\x3b\xc1\xa5\xb5\x36\xb7\xd4\xaa\xa5\x56\x2d\xb5\x7a\x1e\xd4\xea\x39\x86\xee\xb6\x46\xbf\xd6\xe8\xd7\x1a\xfd\x5a\x6e\xd4\x72\xa3\x07\xc6\xb3\xe3\x46\xad\xd1\x6f\xd3\x89\x5a\xa3\xdf\xc2\xd1\x1a\xfd\x1e\x18\xad\xd1\xaf\x35\xfa\x2d\x19\xad\xe0\xb2\xe5\xa4\xad\xe0\xb2\x62\xbc\x6c\xc1\xa5\x35\xfa\xb5\xd4\xaa\xa5\x56\x2d\xb5\x7a\x1e\xd4\xaa\xbe\xd1\xef\x81\x93\xb4\xfa\xd9\xd5\x27\x65\xe5\xb3\x2c\x5a\xf5\xc2\xad\x1b\xba\xd7\x6a\x00\x3b\xa0\x0a\xbe\xf9\xfd\x5c\xdd\xf2\xf2\x2d\x29\xc4\x8c\xea\xed\xfb\xb3\x16\xaf\x58\xbe\x67\x6b\xec\x7d\x58\xc6\x96\xb3\xb8\xc2\xca\x0f\x06\xc5\x9a\xad\x8d\x2f\xec\xcd\xa1\xc9\xfc\x4c\x5f\xce\x82\xf3\xf0\x25\x05\xe8\x83\xd2\x78\x37\x06\xdf\xd0\xc6\x95\x9e\x0e\xed\xe2\x99\x0a\xd1\xcb\x0b\xfb\x27\xd5\x0c\x47\xf6\xef\x59\x70\xf9\xa1\x4d\x5b\x54\x7d\x7b\x21\xb0\x3c\x80\xce\xac\xf5\xfa\x2c\xa4\x00\xcf\x42\x2c\xa3\xd2\x50\x48\x6f\xe5\x46\xa6\x5d\xba\x7b\x06\xde\xab\xbb\x49\xad\xe4\xd4\x0f\x73\xe8\x6e\x29\x53\x79\x99\x65\x7d\x1d\xc6\xec\x7a\x60\xf4\x41\xa6\x4c\xa9\x65\x01\xd7\xd5\xa5\x3f\x44\x36\xd7\x20\x97\x4b\xe0\xef\xbf\xa8\xb4\x9c\x20\x3e\xd9\xf6\x3f\x03\x1a\x11\x99\x27\xae\x09\xa8\x2b\x7f\x4d\x68\x14\x89\x9c\x6b\xc2\x01\x62\x6b\xd9\x58\x84\xab\x6b\x10\xdb\x35\xe4\xa7\x75\xa5\xa7\xae\x5d\xe7\x83\x77\xb9\x6f\x38\xb1\x9f\xb0\xb0\xa0\x7a\x79\xac\x2f\x6d\xe1\xeb\x1f\xe6\x5a\x9b\xb0\xc2\xb5\x19\x61\x65\x7f\xfb\x22\x61\xd1\xf4\x2a\x4f\xc0\xb5\x88\x2b\x75\xd0\xb7\xd2\x6e\x59\x44\xce\xf0\x6e\x5c\xbd\xed\x4d\x19\x0b\xb0\x9d\xa4\x5d\x61\x80\xca\xe3\xbe\x4b\x95\x6d\xed\x60\x1e\x22\x34\xcb\x12\x4c\xa5\x10\x46\x68\xb1\x0d\xfa\x43\x7f\xbd\x45\xb7\xad\x2f\xbd\xac\x25\x5e\x93\x8d\x44\x6c\xe2\x6d\x56\x83\x87\x50\x85\x6c\x28\x6b\x13\x5b\x22\xfe\x7b\x29\xf2\x6c\xcd\xdb\xe7\x2d\x8b\xf6\x69\xdf\x7d\xab\xdc\xc0\xc6\x5f\x74\x2e\x23\xdf\x31\xd8\x36\xe9\x72\x26\x51\xdb\x0d\x3c\xcd\x13\xcd\xb2\xc4\xb6\xf9\x1e\xd9\x09\xa9\x84\x82\x6f\x74\x08\xe5\x53\xef\x81\x72\x6d\x22\x20\x26\x74\x64\x66\xd4\xbe\x79\xac\xed\x2f\x91\xa7\x60\x4e\x73\x5c\x6a\x68\x6a\xd4\x29\x3e\x2d\x66\x27\x77\x2c\x49\xb0\x7d\x6f\x92\x88\xbb\xe5\x6d\xfd\x66\xc7\x66\x42\x21\xd9\x4c\x30\x24\x9b\x8b\xc0\x84\x70\xc1\xbd\x69\xf7\xa7\xab\x37\xdb\x6d\xe2\x65\x75\x0e\xd7\x0b\x04\xb0\xb1\x75\x46\xa5\x66\x34\x21\xb9\x4c\x94\xdd\x47\x6a\x94\x00\xe9\x9b\xa9\x8c\x29\x7a\x06\x23\x50\xb6\x6b\x07\xf9\x9d\xdd\x39\x07\x58\x7b\x3e\x05\x4f\xa6\x84\xda\x9d\x1f\xe6\x49\xd2\x21\x43\xc6\xa9\x21\xbb\x90\xf9\x4c\x18\xa3\x3f\x91\x6b\xc6\x23\x30\xdf\xd4\x0d\x82\x05\xae\xc8\xcc\x68\xce\x77\x38\xa4\x71\xa7\xd4\xd1\x19\xfb\x70\xe3\x2b\xcc\x81\x8d\xb0\x6d\xdd\x50\x48\x2f\xb2\x5c\x89\x04\xcd\xdb\xce\xf0\xed\x3a\xda\xd3\xf2\xe5\xbf\x32\x8e\x4a\x0a\xb9\x42\xc6\x61\x94\x1d\x60\xd8\x1f\xda\x4c\x89\x6d\x6a\x0d\xee\x14\x08\x75\xa0\xf2\x68\x6c\x3e\x69\x2f\x13\xb1\xda\x33\x64\x64\x4f\x41\x24\x41\xab\xbd\x43\xf3\xd7\xec\x37\xe0\xf7\x95\x9f\x3b\xa2\x19\xdb\x3b\xec\x10\x04\x10\x36\x3a\x11\x7a\xfc\x7c\xf1\xd0\x7f\x6b\xa5\xbf\xd6\x43\x63\xa6\x8b\x5f\x69\x06\xd7\xb5\x43\x64\xb6\x09\x86\xa1\xd1\x1a\x30\x4f\xca\x20\xa5\xed\xcf\x19\x1a\xc4\xcf\x12\x6b\x42\x4e\x42\x83\x7c\xd0\xd8\x07\xdc\xdd\x0d\x13\x90\x53\x3d\x36\xda\x2a\x53\xcf\xff\xf0\xaf\xe9\x58\x2a\xc6\x42\x80\xbb\x03\xef\x81\x5b\x20\xb9\xed\xac\x34\x0b\xdc\xfd\xdf\xed\x97\xa5\x5e\x23\x3e\x15\xd4\xfc\xd9\x82\x12\xd9\xeb\x56\x60\xfc\xd9\x3c\x59\x05\xa1\xfd\xc9\x52\xcb\x40\x3f\xde\xbc\xb1\x5d\x94\x1c\xac\x7e\x64\x3c\x56\xa1\x92\x51\x1c\xba\x65\x1a\x78\x2f\x04\x32\xae\xf0\x39\x02\x78\x5e\x7c\x5d\x57\xe4\x7c\x60\xfa\x92\x7e\xb3\x0b\x2a\x09\x76\x65\xaa\x48\x39\x86\x4e\x75\xac\xcb\xc9\xe8\x22\x09\x1d\x40\x62\x5b\x2e\x99\xab\xc5\xf2\xc9\xc9\x9b\xb7\xa1\x3b\x19\x76\xfb\xfc\xd4\x8a\xc8\x1a\x8e\xd3\xb9\x1e\x6f\xf3\x63\x7d\xd9\x13\x41\xb1\x99\x31\x98\x5c\x83\xb6\xc7\x2c\xa5\x99\x39\x65\x76\x8e\x85\xb6\xcc\x37\x08\xe9\x87\x0f\xcb\x46\x32\xfb\xfa\x3d\x99\x16\xbd\x64\xad\xa3\xb2\x9e\xc7\x77\x93\xb3\xb7\xc2\xc2\x51\x8c\x0a\x98\x67\x10\xda\xc9\xf5\x4e\x12\x8f\x42\x7f\x3d\x8b\xc1\xca\x26\x46\xdb\x34\x74\xe9\x7f\x2f\xa6\x68\x78\x0b\x36\x51\x9a\x8c\xde\x9c\x40\xa4\xc5\xea\xb2\x6f\xfe\x66\x0d\x69\x96\x3c\x74\xf2\xc8\xc6\x0a\x56\xca\xf8\x15\xd0\x78\x7a\x0d\x91\xe0\xf1\x9a\x04\xb6\xb2\x1f\x6f\x19\x67\x69\x9e\x12\x9e\xa7\x03\x40\x10\x2b\x3b\x17\x12\x12\xab\xbc\x52\xc2\xe1\x2e\x99\xfa\x56\xc1\x24\x13\xb1\xa7\x27\x03\xec\x88\x1c\x4f\xb1\xbf\x19\x16\x48\xe5\x53\x33\x09\x76\x3e\xf6\x75\xf4\x48\x24\xa9\x32\x62\x51\x07\x27\x65\xda\x70\xac\x01\xa0\x6f\x89\xc5\x60\xf6\x98\x4e\x28\x4b\x8c\x68\xdd\x23\x67\x30\xa4\x79\x82\x6d\xfa\xc8\x2b\x72\x60\x5e\xe6\xf5\xa9\x45\x0f\x18\x71\x57\x09\xa3\x89\x2b\x97\xe3\x8e\x0b\x3a\xdc\xc0\x5a\xbe\x4e\xfd\x3e\x3f\xd6\xad\xe3\xe7\x47\x46\x73\xb5\xae\x1a\x5e\xd9\x98\x0b\xdb\x11\xbb\x2c\x89\x96\x48\x3a\x53\x6e\xe6\xf5\x58\xf6\xea\xda\x07\x0b\x56\x2d\xc5\x48\x82\x52\x67\x40\xe3\x84\x71\xd8\x1e\xbf\x6e\xc6\x40\x52\x7a\x8f\x38\x86\x0d\xcd\x19\xaf\x60\x18\x2d\x7f\x95\x16\xb6\x69\xbe\x7f\x3d\x19\xc0\x10\xdb\x30\xe2\x07\x97\x76\xdf\xe2\xcf\x90\xb2\x04\xe2\x1e\xbe\xa3\x34\x4b\xd1\xbd\xd8\x22\x8e\xf9\x9b\xf1\x1c\xcc\x53\x99\x14\xa8\x4c\xda\x47\xcb\x3c\x1e\x79\x28\x2d\xda\x89\xfb\x8e\x7d\xfd\x19\x50\x9c\xdf\x47\xd6\xc8\xe7\x3a\x81\x7b\xdc\x54\xb9\x1c\x1a\xd5\xd1\x6b\x9c\xa5\x05\xb9\x56\xaf\xe4\x52\x68\xd7\xf8\x2f\x7c\x20\x3e\xed\x1a\x51\x82\xd2\x2c\xc5\x03\x16\xe7\xd2\xb7\xc5\x44\x98\xd1\xc5\x5b\x5f\x39\x2a\xdf\xbc\x7a\xb5\xa6\xfc\xf6\xf8\x48\x2f\x01\x35\xe5\x6d\xf0\xe5\x32\xd0\x21\x4f\xfe\x8d\x0a\x6c\xf6\x98\x39\x31\x18\xfb\x7b\x82\x44\x3f\x21\x53\x9a\xf1\x51\xce\xd4\x98\x0c\x40\xdf\x01\x70\x02\xf7\xb6\xc2\x05\xf9\x37\x48\x81\x9b\x6a\xc0\x5b\xb8\x08\x2a\x40\x7b\xbd\x3b\x10\x9b\x30\xc5\x04\xff\x81\x29\x2d\xe4\xf4\x0d\x4b\xd9\x03\xa5\x47\xfd\x98\xef\x72\x1c\x20\x28\x92\x18\x7b\x13\xb3\x88\x5e\x83\xfd\x60\x09\x68\xc1\xd4\xc2\xaa\xa7\xc4\x9c\x93\x01\x8d\x6e\x1f\x0d\xc0\xaf\x76\x05\xc2\x9e\x5d\x6f\x01\x55\x94\xf7\xc2\x04\x48\xb6\x2c\x52\x9e\xdf\x5b\xf8\x54\xa0\x7c\x37\x16\x0a\xf0\x06\x6b\x64\xc4\xc7\xbc\x53\x80\xa9\x40\x30\xcc\xe9\x16\x1c\x14\xa1\xc3\x61\xf5\x8e\xe2\xb0\xa3\xe4\x99\xe6\x4a\x93\x94\xea\x68\x6c\x4d\x59\x22\x0e\xe2\xc4\xbe\x72\x62\xff\x26\x50\x5e\xdb\x88\xbc\xb9\xb9\x97\xd8\x75\x9e\xdf\x1b\xdd\xf2\x41\x6f\x4e\x75\x54\x40\x3e\x3b\x4d\x55\x03\x4e\xaa\x1b\xe2\xe4\xb6\xd4\xb6\x08\xbe\x41\x03\x70\xf1\x0b\xee\xc2\xc9\xe5\xd9\xfa\xa6\x98\x6d\x14\xdc\x8d\x55\xdc\x59\x53\xf7\x8a\x8f\xf2\x26\x53\x77\xa5\x6a\xef\xb6\xad\xa1\x3b\x84\x92\x5b\x98\xda\x2e\xd2\x73\x6d\x79\x25\x24\x4e\x92\x00\xec\x4e\x6b\x6e\x72\x2d\xa5\x37\x58\xef\xc6\xd8\x63\xc7\x66\xae\x08\x3f\xba\x66\xa1\x1b\x3e\xe1\x3f\x7a\x83\xc7\x36\x47\x70\x3b\x6e\x61\xba\xd9\x03\x33\xdb\x6d\x76\xc1\xe9\x3e\x76\xdf\xcd\x0f\x41\xd0\x0b\x5b\xbd\x99\x8f\xa8\x3c\x36\x36\x51\xf9\xe1\x81\x58\xeb\xf3\x02\xfa\x95\xad\x4c\xe6\x1b\xf7\x95\x45\x46\x73\xa6\xc7\x2c\x43\x46\xe4\x9d\x01\xbe\xc9\xf9\xcf\x34\x61\x71\x98\xc2\x9e\xdf\x0b\xde\x31\xe2\x93\xf9\x0f\x12\x5d\x2b\xae\x9d\x09\x50\x97\x42\xe3\x2f\x9f\x0c\x40\x76\x99\xb5\xc0\x63\xa7\x70\x56\x68\xa4\x32\xa8\x78\x95\xfa\xa3\xab\x9e\xaf\xec\x15\x40\xc9\x14\xb9\xe0\x44\x48\x0f\x07\xec\x58\x6f\x27\xb2\x53\x20\x9f\x18\x58\x07\x07\xda\xa7\x17\xce\xe1\xc0\x27\x64\x05\x7a\x2b\xa6\x73\x53\xa1\x7c\x60\xaf\xd8\x8e\xf8\x09\x4a\xbb\x4e\x54\xa5\xde\xc9\xcd\x22\x92\x82\x1c\xa1\xc7\x25\x5a\xdb\xe3\x50\xdd\x94\xcd\xe8\xae\x1d\x1b\x53\xdf\xf2\x0b\x37\xc2\x02\x64\x4d\xd6\x04\x54\x87\xb9\xd9\x19\x2a\x26\xa7\xff\x36\x14\x1c\xf7\xe0\x7f\x48\x46\x99\x54\x3d\x72\x42\x14\xe3\xa3\x04\x2a\xd7\x9c\x86\x51\x9e\xc6\xcc\xc0\x14\x31\xa4\x76\x42\x13\xa7\x4b\x51\x4e\xc0\xda\xac\xcc\xec\xb3\x2c\xb5\xe3\x24\x15\x43\x79\x82\xa3\x6b\xef\x16\xa6\x7b\x9d\x39\xa4\xd9\xbb\xe0\x7b\x96\xb7\xcc\xa1\x49\x60\x44\xe8\x23\xdb\xc3\x6b\x7b\x4d\x72\xe1\x0d\x19\xce\xb6\x76\xb4\xea\x4b\xd7\xc6\x08\x1f\xdb\xb1\xa5\xb0\x5e\xd1\x12\x5d\x44\x93\x16\x24\x57\x60\xa5\x75\x3c\x65\x04\xbc\x9c\x89\x52\x25\x2a\xa6\x1c\xee\x50\x7a\xdc\x19\xc1\xcf\x68\x12\x8c\x8f\x7e\xca\x62\xaa\xd7\x0a\x2a\xb5\xa3\x02\x91\xfd\x2b\x3b\x09\xc9\x71\x16\x83\x5b\x43\x36\x22\x19\x95\x34\x55\x3d\xd2\x77\xd5\x0d\x11\xd3\xd8\xb0\x6c\x4b\x74\xb0\xbb\x99\x66\x40\xfe\x4c\xae\xca\x6b\xe9\x91\x6e\xb7\x4b\x6e\xde\x9d\xbd\x3b\x26\xf6\x17\x2b\x65\x6b\x41\x86\x02\x95\x20\x91\x4b\xf3\xaa\x09\x70\x54\xfc\x8d\x7c\x2f\x38\xbc\x1b\x9a\x13\x42\x35\x4c\x40\x92\x3b\xb3\x55\x11\x8b\x21\x58\xaf\x7a\xfb\x8f\x8b\xc7\xdb\x49\x26\x29\xbd\xbf\xce\xe5\x68\x83\x0d\x20\x73\x9b\x50\x36\xd9\x14\xca\x24\xa2\x5e\x39\x3b\x57\x45\x63\x88\xf3\x04\x62\x42\x07\x62\x02\x15\x93\x6d\xf5\x31\x64\xe9\x39\xf8\x07\x0d\xcf\x1b\x28\x91\xe4\x3a\x28\xab\x07\x70\x7f\x4c\xfe\x13\x5d\xdb\x94\x64\x20\x23\xe0\x9a\x8e\x60\xd6\x0c\x60\xef\x7b\xfd\xea\x3f\x0e\x1d\x3f\x32\x33\x3a\xeb\xc9\x2b\x83\x11\x6f\xe9\xfd\x4f\xbc\x30\x0d\x32\x45\x5e\xf5\xc8\xc9\xcc\xcb\xf0\xb9\x24\xca\x13\xb4\xb5\xa0\xbb\xbe\xf4\xca\xc1\x94\x48\x91\xa3\xc3\x9e\xe4\x59\x55\x9b\xfd\xea\x3f\xff\xc3\x28\x7d\x34\xcd\x12\x38\xf6\x45\x51\xad\xda\x6c\x64\x18\x2d\xc8\xd7\xaf\xfe\xc3\x52\x4f\x73\x3e\x0b\xad\xb0\x80\x19\x35\x00\xcb\x33\xc2\x52\x1b\x8a\x09\xc9\xb4\xa8\xae\x2a\xab\xe8\xaf\x34\x95\x5a\x75\x08\x7a\xf5\x83\x70\xa8\x85\xa6\xc9\x8c\x96\x8f\x5a\x38\xdc\x59\x20\xc5\x02\x61\x02\x68\xa8\x22\xaf\xbf\x7e\xf5\x1f\xf3\xe6\x94\x77\x3c\x02\x7c\x12\x9f\xc0\x30\x8b\x81\x51\xee\x6f\x59\x92\x40\xdc\x79\x70\xf9\xc3\x5c\xea\x31\xc8\x0e\x01\xae\xbc\xb1\xca\xac\x6f\x66\x6d\x38\xbb\xcc\x39\x47\x19\xc1\x5a\x87\xd1\xa2\x55\xb2\x70\xb9\x8f\x35\x8c\x50\x93\x54\x28\xbd\x78\xc9\xeb\x1f\x37\x33\x28\x9f\xbe\x1b\x6e\x2a\x0e\x74\xb7\x30\x43\xcc\x3f\xbd\x85\x48\x79\xdf\xbd\x0d\x99\x92\x5d\xc6\x75\x57\xc8\xae\x9d\xe6\x98\x68\x99\x3f\xec\x35\x28\x46\x5a\x39\x01\x9f\x80\x0c\xe4\xa5\xf3\x36\xb7\xab\x8f\x72\xf2\xb7\x3f\xcf\xb1\xb8\xe3\xcb\x29\x07\x12\x4e\x47\x33\xb6\x3c\xf5\x55\x8b\xdb\xcc\xb1\x31\x6f\x37\x77\xff\xaf\x79\xec\xde\x80\x1c\xb8\xb3\x1b\x4e\xbb\x91\xab\xd0\xe3\xd1\x59\xe3\xed\xe1\xd8\x5a\xce\x67\x6d\x4e\xe6\x06\xfb\x9a\x05\x94\x6b\xee\x84\x2f\xa0\x40\x76\x1d\x85\x43\x46\x63\x44\x81\x39\xe7\x6a\xe9\x41\x4f\x80\x2a\xbd\x08\x14\xed\x41\x7f\x78\xac\x0e\xe0\x9f\x1d\x55\xa1\xd3\x48\x48\x08\xf2\xc2\xc6\x78\x6a\x11\x65\xef\x0a\xac\x87\xcf\x06\x9c\x55\x84\xa8\xbd\x70\x24\xcc\xfe\x55\xe5\xab\xc7\x0a\x9b\xf1\x46\xce\x6d\x44\x6b\xf7\x68\x29\xb0\xd7\x99\x4e\x1d\xf1\x0a\x1e\x45\xeb\xd2\xdc\x19\x29\x3a\x05\x4d\x57\x27\x79\xcc\x8e\x2a\xd1\xbe\xd6\x94\xc7\x54\xc6\x6e\x95\xfb\xfb\x2a\x4c\xd9\x23\x6f\xd1\x97\xc6\x87\xe2\x98\x8c\xb5\xce\xd4\xf1\xd1\xd1\x88\xe9\xde\xed\x1f\x54\x8f\x89\xa3\x48\xa4\x69\xce\x99\x9e\x1e\xa1\x03\x8d\x0d\x72\x2d\xa4\x3a\x8a\x61\x02\xc9\x91\x62\xa3\x2e\x95\xd1\x98\x69\x88\x74\x2e\xe1\x88\x66\xac\x5b\xc8\xcc\xaa\x97\xc6\xbf\xf5\x2f\x7a\x64\xc1\xb8\x72\x86\xd0\xba\x24\x27\xd0\xcd\xf9\x2d\x17\x77\xbc\x8b\x9a\xac\xda\xe8\x34\xad\x17\xc5\xe0\xc7\x0c\xbc\x37\x09\x5c\xc8\x44\xfc\xe8\x9b\x60\x3e\xa6\x4b\x79\xdc\xb5\x4e\xc7\x47\xde\x8b\x6d\x6c\xbb\xdd\x22\x30\x60\x9d\x88\x73\x3b\xb6\xd3\x86\x68\xa4\xd9\x04\xb6\x72\x62\xfb\x51\xd9\xee\x77\x3e\x60\x34\xce\xa5\xdd\xf1\x92\x37\xdb\xfb\x66\x52\x3a\x45\x59\x07\xdf\x4d\x84\x65\xe5\x5c\xc4\xe0\x2c\x9f\x13\x54\xed\xaf\x0d\x33\xbf\x31\xa2\xb0\xf3\x71\xa3\xdd\x77\xaa\x34\xa4\x96\x38\xd9\xe7\x93\x29\xd1\x72\x6a\x1d\xe3\xf2\xd6\x28\x9f\xce\x73\x6d\x24\xfe\x5b\xbc\x4f\x29\x11\x31\x14\x7d\x0a\xb8\x7a\xb9\xcb\xdb\xf0\x28\xc9\x84\x62\xf8\x6e\xc7\xf3\x36\xb3\xcc\x6d\xcf\x2e\x4b\x6e\xba\x6f\x7e\xbf\xc9\xd6\x0d\xb1\x8d\xc2\x86\x56\xf6\x6a\x04\xc5\xb0\x1c\xe1\xef\xb6\x67\x5f\x79\xc5\xd5\x88\x25\x91\xe0\x4a\x4b\xca\x96\xe7\x30\x2d\x1e\x5b\xba\x42\xb6\xf7\x37\x10\xc4\xa0\x93\xad\x80\x42\xe6\x63\xb0\x3c\x53\x44\xb4\xf4\xa0\x2e\x03\xc6\xa6\x38\xf9\x58\x42\x43\xb8\xb6\x34\xad\x6e\x01\x23\x52\x0b\x4e\xf6\x69\x18\x82\x94\x10\x9f\xa1\xf4\x79\x1d\xbe\xeb\x62\xc4\x45\xf8\xf9\xfc\x1e\xa2\x7c\xdd\x4c\xf0\xf9\x31\x67\xcb\xf3\x06\x11\x17\x76\x62\x17\x61\x8e\xae\xbf\xe0\xe4\x0f\x81\x60\x77\x82\x88\xa2\x9a\xa9\xa1\xcd\x17\x0b\x1b\x01\x25\xc7\x67\x40\xe1\xe0\x1e\x46\x16\x67\x53\x1f\x98\x46\x72\x13\x8d\x85\x50\xe6\x94\xe3\x7e\xe2\xbc\x13\x26\xac\xcf\x0f\x93\x57\x24\x49\x0d\x8d\xf1\x49\x2c\xc5\xf4\xd6\x50\x5b\x3c\xc6\x94\x55\xc1\x03\x04\xbd\x97\xca\x4c\x83\x86\x47\xf3\xc7\x08\xa5\x26\xa5\x89\xca\x53\x33\xe9\x1d\xb0\xd1\x58\xab\x0e\x61\x3d\xe8\x21\xd6\x00\x8d\xc6\xa5\x69\x53\x00\x5d\xe9\x82\x52\x46\xb5\xb2\x95\xf8\x20\x64\x35\xb8\x34\x9c\x4e\xe0\x31\xb3\x7b\xb9\x10\x5c\x1d\x02\x3a\xea\x1d\x76\x48\x91\x28\x6e\xd6\x38\x98\x12\xa6\xc1\xd0\x6c\xd4\x45\xa4\xc8\x47\xf6\x4b\xc0\xc7\x74\xe2\xba\x42\xca\x07\x7a\x51\x63\xd4\x19\xf7\xec\xc7\xed\x99\x7d\xc3\x95\xe7\xa9\xd1\x17\x03\x51\x47\xb3\xba\x6f\x9c\x23\xa4\x04\x95\x09\xab\x6d\xce\x1a\xdc\xff\x77\x78\xe8\x40\x1d\x16\xc0\x1c\xb3\xd1\xd8\xc3\x92\x3a\x46\x50\xdd\x83\xcd\xcf\x1e\xa9\xe5\x4b\xb1\x63\x4b\x8f\x8a\x1d\x55\xdf\xb6\xcf\x97\x28\xb0\xaa\xb4\xff\x1a\x64\x1a\xa0\x88\x28\x82\x24\xc3\xd9\xb9\x7d\xc3\x1a\x87\x63\xe4\x15\x39\x40\x24\x63\x7a\x5f\x21\xc2\x77\x45\x76\xd8\x23\x27\x84\xe7\xe1\xcc\xad\x7a\x01\x17\x61\x7e\x37\x91\x79\xa9\x12\xc5\x5c\x5b\x7e\x71\x2d\x72\x67\xc7\x76\x9e\xf2\xf2\xe8\x3a\x08\xc0\xc3\x65\x11\x57\x4d\x62\x61\xbd\xe5\x04\xf5\x48\xb7\x9f\xc3\x7f\xc5\xf6\x73\xcc\x05\x58\xe0\x71\x2d\xa2\x28\x40\xa6\x9d\xb2\xf4\x14\x0e\x64\xf5\x14\x5b\x58\x6c\x8b\x15\xa4\x19\xcc\x20\x0d\xc1\x95\xd4\x8a\xd0\x59\x3c\x66\xc3\x58\x7c\x16\x55\x05\xda\x15\x22\x3f\x98\xe2\xd5\x0d\x83\x97\x96\x8f\xba\x94\xae\x18\xb5\x68\x5e\x31\x56\x22\xde\xee\x05\xf6\x2c\x1e\x0d\xa1\xad\x1d\xf5\x49\x5b\x31\x36\x0f\x0d\x5a\x36\xcf\x16\x01\x43\x8b\x47\x53\x67\xd3\x8e\x2d\x82\x8b\x16\x8f\x39\x11\xf5\x71\x62\x8d\x16\x8f\xad\x8d\xa4\x8b\xc7\xb6\x71\x49\x8b\xc7\x4c\xaa\xe2\x23\x05\x29\x75\xaa\x11\x4a\xe4\x7b\x6d\xcf\xf1\x9b\x5a\xfc\xa4\x18\x0d\x83\x78\xbb\xc8\xa6\xc5\x63\x56\x00\x7c\x26\x51\x4e\x0b\xa6\xfa\x5e\x9b\x69\xde\x2c\x7d\xd8\xe6\xa8\xfb\x38\x1d\xa7\x50\x74\x5c\xea\x8c\xb7\x33\x63\x44\x75\x26\x01\xcb\x0a\x60\xd8\x97\xb7\xc3\x7c\x9a\xc0\xaa\xc5\xa3\x39\xc6\x69\x47\x43\xec\xd3\x8e\xc6\x90\x1b\x05\x9e\xef\xac\x5d\xf8\x09\x65\x1d\x6b\x99\x6e\x65\x9d\x56\xd6\xd9\x60\xb4\xb2\xce\xba\xa3\x95\x75\x96\x8d\x56\xd6\x59\x30\x5a\x59\xa7\x95\x75\x6a\x8d\xdd\x93\x75\xac\xa5\xaa\x31\x83\xd9\xdf\xac\xc1\x75\xd6\x42\x86\xd2\x94\x0f\xe9\xa9\x9a\xca\x0c\xef\xbf\x76\x24\xf6\x06\xcd\x6b\x2e\x52\x5d\x52\x3e\x02\xf2\xba\xfb\xfa\xd5\x9a\xe9\x80\x8b\x47\x9d\xa0\x9d\xf2\xd8\x34\x75\x70\x76\x2c\xf3\x48\x3c\x9a\x77\xc9\x9d\xd4\xe0\xf0\xa8\x48\x98\x4b\x1c\x44\xa1\xaa\x55\x0a\x9a\x50\x5d\x31\x88\xb3\x14\x82\x43\xb4\x92\x82\x5c\xc4\xf4\x0a\xee\xfc\x1d\x66\x53\x7b\xdb\xad\x20\x02\x6a\xe3\xd8\x07\x10\x56\x21\x52\xb0\x09\xa6\xfe\xd0\x9b\x25\x80\x87\x15\x39\x80\xde\xa8\x47\x62\x9b\xac\x4d\xb9\x8b\x19\x3b\xec\x94\xdd\xe3\xa9\x21\xae\x12\xff\x63\x96\xed\xfc\xe3\x30\x01\xae\x73\x9a\x24\x53\x02\x13\x16\xe9\xf0\x7d\x18\x10\xc8\xb4\x75\x76\xd6\x71\xa5\xd4\x10\x0f\xeb\x8a\x84\xdd\xb9\xb3\xb5\x99\xbf\xda\x8f\xfa\xb2\xdb\xdc\x3a\xb6\xa7\x37\x33\x72\x89\x85\x50\x6f\xa9\x5a\xa5\xcd\xdb\xac\xbf\x12\xff\x89\x08\xfe\xee\x6a\x5b\xf7\x18\x69\x88\x27\xd4\xe6\x03\xb3\x0a\x54\x9e\x24\x06\xbd\xad\xc7\x6c\x1e\x04\x0b\x3c\x59\x0b\xb2\x6d\xac\x9b\x35\x2d\x65\xdd\xe0\x3d\x37\x22\x13\x89\x18\x4d\xcb\x3b\x68\x3b\xb2\x94\xca\xdb\x50\xa2\xf2\x81\x13\x01\xcd\x21\xba\x9c\xd9\xf2\xd6\x17\xb2\x74\xb4\xbe\x90\xb9\xd1\xda\x07\x66\x47\x6b\x1f\xd8\x60\xb4\xf6\x81\x05\xa3\xb5\x0f\xcc\x8f\xd6\x3e\xd0\xda\x07\xea\x8c\x97\x6f\x1f\x20\xad\x2f\x64\xd9\x68\x65\x9d\x62\xb4\xb2\xce\xfa\xa3\x95\x75\xe6\x47\x2b\xeb\xb4\xb2\x4e\x2b\xeb\xb4\xb2\xce\xb6\xa3\x06\x72\x67\x22\x6e\x3c\x45\x26\x13\xf1\x8a\x0c\x19\x6b\xaf\x8e\x44\x37\x11\x51\xa8\x2c\x62\x1e\x71\x9e\x0f\x45\x53\x6b\x42\xef\x90\x7f\x0b\x0e\x36\x3d\xc1\x96\xac\x4d\x81\x08\x6c\x02\x91\x89\xf8\x40\x1d\x6e\x11\x78\xde\x66\xd8\xb4\x19\x36\x9f\x41\x86\xcd\x98\x2a\x57\xf8\x08\x49\xeb\xf2\x84\x9b\xd2\xf1\xbf\x01\x99\x7e\xb6\xf9\x36\x06\xe1\x1c\xc2\x60\x8f\xb8\x02\x29\x2c\xec\x62\xe7\xdb\x85\xb8\x5f\x85\x98\xd3\xcb\x6c\x8b\x9d\x38\x86\x98\x64\x20\xbb\x16\xc9\x04\x19\x32\x57\xff\x6b\x06\x7f\x1d\x84\x9f\x79\xde\x4c\x15\x12\xcf\x3a\x79\xa6\xfa\x29\x8d\xf9\xa6\xca\x2e\xba\x0a\x57\x7c\x76\xa9\x34\xcd\x68\xa5\x5d\xa2\x9d\x3b\xed\xc7\x5a\x7a\x69\x53\x4a\x24\x2a\x79\xd7\x1b\x95\x39\x5e\x3e\x16\x16\xa7\xfd\x57\x0e\x72\x4a\xc4\x04\x64\xa1\x18\x85\xee\x3c\x9d\xd0\x64\x26\xa2\xae\x00\x72\x33\x06\x9e\x46\x4c\x11\x4d\x6a\xea\x4d\x7b\x0d\xc9\x8e\x55\x3f\x5e\x3e\x9a\x55\x1c\x1a\x54\x1b\x9e\x5b\x2d\xe5\xe5\xa3\x51\xf3\x1b\x69\xd8\x04\x47\x1a\x34\xc3\x91\x66\x4d\x71\xa4\x71\x73\x1c\x69\xd2\x24\x47\x3e\x79\x05\xe8\xe5\xa3\x61\xf3\x11\x69\xdc\x4a\x47\x9e\x61\x3d\xe9\xe5\xe3\x11\xc0\xdd\xa4\xc5\x8e\xb4\xd5\xa9\x6b\x8f\xa6\x0d\x6a\xa4\x69\xa3\x1a\x69\x1a\x0f\xb7\xaa\x82\xbd\x7c\xb4\xf5\xb1\x1f\x41\x4e\x6b\x4c\x88\xa8\x5b\x53\xfb\xa1\x85\x36\x80\x93\xa1\x77\xef\xa7\x52\x80\x2c\x97\x2e\x1a\xc6\x9a\x77\x97\x7a\x75\x61\xa8\x66\xb9\xb1\xa9\x8f\x5b\x45\x8c\xc6\xdf\x63\x6f\xf0\xca\x79\xa9\x78\x5c\x69\xb2\xb9\xd6\x31\x85\xe9\x2c\x34\x8f\x31\x4a\x41\xd1\x74\xaa\xf4\x30\xde\xdb\xb3\xe1\xa4\x85\x34\xc1\xe3\xd9\x00\xd3\xe2\x09\xd4\x2f\x6c\x3b\xdb\x3d\x6f\xc7\xde\x57\xc5\x1d\x7b\xbd\x72\xe7\x5b\x37\xe3\xc1\x7f\xff\xcf\x61\xa5\x7a\x4b\x31\x61\xab\xfd\xad\x3d\x5a\xed\xaf\xd6\x68\xb5\xbf\xa5\xa3\xd5\xfe\x6a\x8c\x56\xfb\x5b\x6f\xb4\xda\xdf\xf2\xd1\x6a\x7f\xad\xf6\xb7\xc5\x68\xb5\xbf\x56\xfb\xdb\x76\x7c\xc6\xda\x5f\xb3\x51\xcd\x65\x5d\xcc\x05\x89\xa0\xfc\xa8\xa9\x66\x51\x11\xf1\xec\xef\xb2\xff\x6a\x56\x07\x2c\xeb\x77\x8b\x35\xc0\xb2\x96\x38\xa7\x05\xf7\x1e\x50\xf7\x82\x42\x38\xf7\xe4\x6a\x4d\xf0\xa5\x45\x6e\x37\x86\x89\x25\x97\x70\xa3\xa8\x78\xe3\x03\xcb\x8a\xc6\xeb\x21\xea\x2c\x26\x07\xde\x17\x8f\x8d\x54\xb8\xd0\xd5\x8b\x5c\xb3\x6e\x71\x47\xf0\xce\x63\x50\x4d\x25\x9f\xbf\xe2\x42\x0e\x31\x6c\x21\x3e\xaa\xc0\x1e\x43\x1e\x41\x56\xd6\x80\x8d\x6b\x87\x8c\xdb\x48\x47\xdf\xf4\x47\x70\x1f\x34\x65\xe9\x29\x52\x40\x8f\xe7\x56\xf4\xc5\xf5\xa0\xfc\x5b\xc0\xae\x14\xe5\x43\xf1\x90\x51\xee\x92\x61\x05\xf7\x5d\xe9\x6d\xa7\xf9\x42\x5e\x0e\xbd\x54\xc2\xdb\x7b\xe4\x1c\xb1\xbe\x3c\x31\x53\x08\x1f\x6a\xfb\x9f\x34\x83\xc8\xbb\x55\xb8\xe1\x6e\xe3\xc2\x0d\x33\x11\x23\x6d\xdd\x86\xb6\x6e\x43\xad\xba\x0d\x78\xd1\x1e\xee\xc6\x0b\x38\x90\xbf\xb9\xf6\x48\x12\x10\x54\x69\x9e\x68\x96\x15\x11\xd8\xca\xbe\x2a\xb1\x9a\xc4\xd0\x45\x82\x56\xf1\xdd\xbc\x8d\x46\xe3\x59\xbc\xc7\xf9\x30\x62\x5b\x21\x39\x71\xd1\x96\xd8\xcc\x08\x2b\x0e\x78\xb5\xc3\x86\x94\xb2\xe7\x1f\x29\x78\x86\x04\x5b\x15\x5a\xb3\xed\xb5\x65\xe8\x7c\x62\x50\xc2\x50\xec\x15\x0c\xa2\xdc\xd0\x02\xa3\x56\xd9\x04\x78\xc1\x25\x0e\xd4\xe1\xa1\x97\x86\x1a\xe5\x5e\x8f\xc2\x7d\xfe\x54\xe2\x12\x7f\x59\x87\xff\xe0\x07\x05\x0e\x54\x80\xaf\xe0\x3f\xcf\x3b\x24\xb2\x7e\x74\x5b\x13\x16\xb9\xc6\xa2\xda\x9e\x3c\xa2\xed\x73\xaa\x7d\xb1\x93\x3e\x8c\x9d\xd3\x3a\x5e\x86\xdf\xa2\x4d\x18\x5d\x7f\x3c\x87\x84\xd1\x27\xf2\x4d\x3c\x9f\xbc\xd1\x67\xeb\x8f\x78\x2e\x79\xa3\xad\x0f\x62\xa3\xf1\x52\xd3\x39\xab\xa3\x41\x9f\x43\xeb\x6f\x68\x58\xa6\x6a\x84\xf9\x3f\x8e\x9f\xa1\x11\xfc\x6b\x34\xba\xac\x8d\x2c\x7b\xca\xc8\xb2\x56\x0b\x6b\xb5\xb0\xea\x68\xb5\xb0\xb9\xd1\x6a\x61\x1b\x8c\x56\x0b\x5b\x3e\x5a\x2d\x6c\x7e\xb4\x5a\x58\xab\x85\xad\x31\x5a\x2d\xac\xd5\xc2\xd6\x1d\x9f\x99\x16\xd6\x5c\xbd\xf5\x36\xc2\xeb\x11\x22\xbc\x9a\xa1\x84\x0d\xd0\xbf\x46\xb0\xae\xa1\x88\xae\x36\x9a\x6b\xb7\xa3\xb9\x6a\x96\x9d\xe3\x9a\x3d\x4e\xe9\xb9\xf2\x6e\x2f\xab\x3f\x47\x27\x82\xc5\x24\xcb\xb5\xab\xbe\xd5\xd6\xa0\xdb\xe5\x1a\x74\x95\x1d\x6d\x0b\xd1\xad\x55\x88\x6e\x19\xcc\xda\x6a\x74\x4b\xc6\xee\xc4\x98\xb5\xd5\xe8\x36\x1d\x6d\x35\xba\xc5\xa3\xad\x46\xb7\x62\xb4\xd5\xe8\xda\x6a\x74\x6d\x3d\x82\x1a\xa3\xad\x47\xb0\x60\xb4\xf5\x08\xb6\x1f\x6d\x3d\x82\xb5\x46\x5b\x8f\xa0\xad\x47\x50\x1d\xad\x17\xaa\xde\x68\xeb\x11\xd4\x1c\xad\x67\xaa\xad\x47\x50\x6b\xc2\xb6\x1a\xdd\x8b\x8a\x19\x24\xad\xf6\xd7\x6a\x7f\x6b\x8f\x56\xfb\x5b\x3a\x5a\xed\xaf\xc6\x68\xb5\xbf\xf5\x46\xab\xfd\x2d\x1f\xad\xf6\xd7\x6a\x7f\x5b\x8c\x56\xfb\x6b\xb5\xbf\x6d\xc7\x67\xac\xfd\xb5\xd5\xe8\x76\x3e\x56\x91\xec\x62\x46\x52\x5b\x8d\xae\x8d\x5f\xdc\x6a\xbb\xdb\x6a\x74\x0f\x8f\xcf\xbe\x1a\x5d\x25\x96\xee\xe9\x4a\xd2\x6d\xbe\x8c\xb6\x2e\x5d\x5b\x97\xae\xad\x4b\xd7\xd6\xa5\x6b\xeb\xd2\xb5\x75\xe9\xd6\x1f\xbb\xef\xcd\xd8\x39\xfd\xe3\x65\x78\x30\xda\x8a\x08\xeb\x8f\xb6\x22\xc2\xd2\xd1\x56\x44\x68\x2b\x22\xb4\xde\x88\x6d\x46\x5b\x11\x61\xc3\xd1\x7a\x1e\xda\x8a\x08\x1b\x8d\xb6\x2e\xdd\x8b\x89\x31\x6b\xb5\xb0\x56\x0b\xab\x8e\x56\x0b\x9b\x1b\xad\x16\xb6\xc1\x68\xb5\xb0\xe5\xa3\xd5\xc2\xe6\x47\xab\x85\xb5\x5a\xd8\x1a\xa3\xd5\xc2\x5a\x2d\x6c\xdd\xf1\x99\x69\x61\x6d\x5d\xba\x9d\x8e\xf5\x6a\xeb\xd2\x2d\x18\x6d\x5c\xd7\x6e\xc7\x75\x6d\x89\x2b\x34\xd7\x22\x15\x39\xd7\xd7\x20\x27\x2c\x82\x93\x28\x32\x7f\xdd\x88\x5b\xd8\x30\x96\xa8\xaa\x86\xae\x98\x96\x30\x1e\xb3\x08\x15\xc9\xbb\x31\x60\x59\x39\x23\xdf\xe2\x7d\x84\xda\x1b\x89\xc6\x3b\x0b\xf4\xc2\x75\x1a\xa2\x86\x01\x36\x38\xf5\xa6\xf0\xb2\x10\x1a\x08\x91\x00\xe5\x1b\x3c\xe9\xb8\x21\xc8\x0d\x4f\x73\x05\x20\x6f\x1c\x29\x2e\x26\x23\x03\x48\x04\x1f\xb9\x78\x1e\x77\x02\x7a\xe4\xb4\xb8\x21\xa2\x1c\x0f\x4f\x2e\x25\x70\x9d\x4c\x11\x0e\x58\xe0\x0a\xb5\x86\x54\x4c\x20\x46\x92\x8d\x61\x44\x56\x8e\xa4\x9a\x24\x40\xcd\xbb\x38\x14\x2f\x33\x87\x87\x92\x3e\xce\x6f\x27\x1d\x80\x0b\x6d\xda\x0a\x88\x9b\xd3\xc6\xad\xa8\xe1\x8c\x65\xc3\x89\x4d\xc8\x97\x22\xd4\x8f\x4a\x5f\x88\x47\x73\x2a\x72\x72\x47\xad\xa4\x24\x73\x8e\x87\x19\x3f\xdd\x80\x76\xc3\x97\xd7\x90\x49\xb6\x37\x3f\x74\x91\xaa\x6d\xf8\x58\x1d\x73\x00\x95\xa3\xad\x98\x54\x65\x6b\xf6\x4f\xe4\x28\xb7\x22\xa1\x43\x65\xe0\x5a\x4e\x31\xde\xce\xca\x14\x25\x4c\x4c\xe9\x08\xf6\xf7\x15\x39\x7d\x7b\x66\xc8\x5f\xae\x0c\xb5\x76\x55\xf6\x1c\x39\xcc\xa4\x98\xb0\xd8\x20\xf7\xcf\x54\x32\x3a\x48\x8c\xdc\x39\x04\x09\xdc\x88\x05\x5f\x1c\xfc\x7c\x72\xf5\xcb\xe5\xc9\xdb\xf3\x43\x94\x40\xe1\x3e\xa3\xdc\x9c\x8a\x5c\x15\x81\xa2\xee\x75\xe6\x45\xc0\x27\x4c\x0a\x6e\xd6\x87\xba\x1a\x25\x13\x3f\x6b\x14\x0e\x83\x04\x25\x92\x09\xc4\x56\x4e\x0e\x6f\xf3\x5c\x87\xf1\x2c\xd7\x5e\x77\xc4\xf0\x45\x73\x80\x78\x34\xa6\x7c\x64\xd6\x79\x26\x72\x33\xdf\x17\x5f\xe0\x8a\x24\xc4\x79\x64\x25\x27\xea\xb1\xf6\x8b\x8e\xe7\x14\x86\xd6\x2b\x5b\x12\x51\x45\x34\xf3\x6b\x2e\x7f\x96\x9a\x72\x4d\xef\x8f\x6d\xfc\xde\xde\x17\xa5\x4b\x7b\xbe\x9c\xa4\x30\xaf\xb0\xfc\xc6\xae\x2a\xc1\x4a\x86\x09\xd9\x2b\xdf\xdd\x23\xe7\xe6\x1d\x10\x97\x01\x68\xc3\x2f\x61\x02\x12\x35\x4f\x07\xbe\x0e\x91\x30\xa2\x32\x4e\x40\x61\xe0\xa1\xa7\xcd\x56\x3b\x70\x00\x83\xa0\xd7\x72\xa1\x17\x11\x13\xf2\x56\x60\x10\xe2\x50\x1c\x93\xb1\xd6\x99\x3a\x3e\x3a\xba\xcd\x07\x20\x39\x68\x50\x3d\x26\x8e\x62\x11\xa9\x23\x4d\xd5\xad\x3a\x62\xdc\x1c\xae\x6e\x4c\x35\xed\x96\x4e\xf5\x91\xe5\xdc\xdd\x48\xa4\x29\xe5\x71\x97\x3a\xec\xea\x86\x6d\x3d\xfa\xad\xe3\xa9\x5d\x1a\xee\x62\xbc\x4b\xbb\x6a\x0c\x49\xb2\xbf\x05\x3e\xd7\x93\xf9\x6a\xc8\x7a\xb5\x64\x3c\xf7\xed\xf5\x0f\xf0\x79\x38\xaf\x16\x06\x3d\x72\x29\xb4\x8b\x8f\x75\xa1\xd8\x48\x47\x11\xbe\x4b\x8f\xf4\xf9\xe5\xcd\xd5\xdf\xfb\xef\x2e\x2e\x6f\xda\x93\xdd\x9e\xec\xf6\x64\xd7\x38\xd9\xc0\x27\xb5\x4f\xb5\x97\x39\x4b\xc7\x24\xec\x37\x72\x6a\x05\xda\x1f\x83\xb0\x01\xb5\x25\x44\x3b\x9e\x0c\xea\x15\x08\x9c\xf3\xc9\xcf\xb4\x6a\x61\xe7\x0b\xc1\x41\xdc\x0d\x56\x50\x0e\x32\x78\x9d\xf8\xf8\x1a\xd6\xac\xba\xee\xab\xad\xa4\x48\x3b\xea\xbb\x96\xcc\xab\xb7\x37\x34\x54\xb6\xef\x92\xa6\x45\x85\xea\x05\xbb\xd6\x23\x6f\xbd\xda\x43\x4e\x7f\xb9\x38\x3b\xbf\xbc\xb9\xf8\xee\xe2\xfc\x6a\x7b\x3d\xba\x01\x8b\x0b\xda\x14\x1a\x02\xc0\xfe\x96\x5c\x32\x93\x30\x61\x22\x57\xc9\x34\x58\x41\x16\x13\x81\xd9\xd3\xef\xfc\xbe\xd3\xa0\x8f\x2f\x7c\xac\x65\xb6\xcd\x32\xdb\x33\x18\xd2\x3c\xb1\xda\xd3\xde\x5e\x6f\x1b\x2e\x67\x47\x53\xe8\xfb\x9d\x14\x35\x2a\x30\x57\x50\xf8\xda\xd6\x6e\x1f\x0a\xb9\xf4\x18\xef\xbb\xe8\x83\x0a\xeb\x71\xc2\xa3\xb5\xd0\x39\xe9\xd1\x3a\xc9\x6a\x42\xa7\xa6\x97\xa1\x19\xdf\x7b\x24\xf8\x90\x8d\xde\xd2\xec\x47\x98\x5e\xc1\xb0\x9e\x99\xb8\x0a\x6f\xb4\x3e\x3a\x57\x32\xda\x2a\x0d\x3b\xb3\x2f\xab\xe7\xa6\x69\xcc\x49\xd3\x54\x74\x46\xfd\xc8\x8c\xe6\x02\x29\x1a\x09\xa2\x98\xab\x87\x6f\xed\xd0\xce\xa2\xdc\x54\x8c\x4d\x23\x9e\xfb\x7a\x5c\xde\x8f\x2a\xb3\x2b\xb3\x7b\x47\x67\xf5\xba\x6a\x47\x24\x78\x04\x99\x56\x47\x62\x62\x38\x17\xdc\x1d\xdd\x09\x79\x6b\xf4\x08\xa3\xbb\x76\x2d\xd6\xaa\x23\xf4\x19\x1c\xfd\xd6\xba\xc1\x6e\xde\x9d\xbd\x3b\x26\x27\x71\xec\x9a\x9b\xe4\x0a\x86\x79\xe2\xda\x09\xf4\x08\xcd\xd8\xcf\x20\x15\x13\xbc\x43\x6e\x19\x8f\x3b\x24\x67\xf1\xb7\xdb\x13\x67\x3f\x1a\xdc\x05\x91\x59\x57\x67\xc3\x3b\x71\x8d\x3e\x96\x69\x85\x77\x05\x22\x62\xb8\x16\xd3\x0a\x71\xd3\x5b\x9d\x9d\x90\xd1\x10\x68\x36\x37\xd1\xcf\x0e\xdc\xc2\x66\xe9\xea\x7e\x41\x58\xad\x8b\xd3\x21\x6a\x26\xe2\x63\xa2\xf2\x2c\x13\x52\x2b\x92\x82\xa6\x46\xe9\xed\x19\x0c\xeb\x54\xff\x44\x5f\x55\x87\xfc\x23\xfc\x88\x0e\x27\xf5\x7e\x7f\xff\x4f\x3f\x9e\xff\xfd\x2f\xfb\xfb\x1f\xff\x51\xbe\x8a\xac\xd0\x46\x01\x55\x6f\x51\x19\x44\x3d\x2e\x62\xb8\xc4\x77\xe0\x9f\xaa\xe2\x66\x71\x17\x34\xd5\xb9\xea\x8d\x85\xd2\x17\xfd\xf0\x67\x26\xe2\xd9\xbf\x54\x0d\x89\x83\xec\x26\x63\xc0\x2d\xea\x53\x3d\xde\x11\xf6\x50\xd0\x92\x86\x8f\xaa\x9b\xb5\xdc\x44\x27\xa5\xf8\xcf\xef\x3c\x08\x8c\xf4\x74\x27\x99\xd6\xe8\x7a\x73\xa9\xe0\x62\xd8\x31\xa7\xb6\x10\x3b\x27\xaf\x6b\xd7\x47\x69\x94\xb4\x85\x1d\x6c\x18\x60\x08\x11\x07\x2d\x7b\x90\x03\x83\x9d\x77\x31\x9f\xf4\x2f\xc8\xc4\x42\x78\x67\x80\xe3\xd3\x7b\xbf\x7b\x54\x1a\x17\x9a\x2e\x39\x50\x05\x0d\xf1\xd8\x06\x05\x85\x24\x63\x92\xb0\x94\xb9\x58\x43\xd7\xa0\x49\x91\x03\xfb\x63\x2f\xca\xf2\x8e\xbb\xa1\x97\x42\x2a\xe4\x34\xfc\x09\xd9\x18\x52\xa3\x69\x75\x95\x16\x92\x8e\xa0\x13\x1e\xb7\x8f\x85\xbf\xec\x83\x95\x17\xcc\x3f\x6d\x55\xe1\xc2\x55\xea\x28\x32\xc4\x2f\x8f\xb6\x79\xd0\xef\x08\x69\x0b\x98\x71\xf9\x08\x22\x61\xb0\xc4\x59\x81\x33\x40\x11\xf5\xc9\x89\x48\xf2\x14\x54\x27\x88\x41\xd6\x1a\xc0\x27\x46\xb3\x54\x3b\x25\xa8\xc5\x6c\xc2\x54\x13\x61\xc4\x0b\xe4\x34\xe6\x22\xf2\x45\xae\xb3\x5c\xbb\x7a\x33\xa5\xc6\x6e\x42\xa1\xdd\x22\x14\x05\xa8\x90\xfd\xd7\x7b\xf5\xa3\xd1\xa9\xd6\x20\xf9\x31\xf9\xaf\x83\x0f\x5f\xfe\xda\x3d\xfc\xf6\xe0\xe0\xfd\xab\xee\x1f\x3f\x7e\x79\xf0\xa1\x87\xff\xf8\xdd\xe1\xb7\x87\xbf\xfa\x3f\xbe\x3c\x3c\x3c\x38\x78\xff\xe3\xdb\xef\x6f\xfa\xe7\x1f\xd9\xe1\xaf\xef\x79\x9e\xde\xda\xbf\x7e\x3d\x78\x0f\xe7\x1f\xd7\x9c\xe4\xf0\xf0\xdb\x2f\x6a\x2f\x9d\xf2\xe9\xbb\x9a\x04\xd4\x8e\x6e\x63\xe5\x82\x66\x67\x6c\x28\xce\xfa\xbe\x5b\x28\x4d\x5d\xc6\x75\x57\xc8\xae\x9d\xfa\x98\x68\x99\xd7\x23\x26\x05\x53\x6a\xfa\xfc\xfb\xee\x5d\xc7\x05\x43\x0a\xec\x7a\x67\x0e\xb8\x82\x48\x82\xfe\x14\x96\x1c\xfb\x26\x2f\xa7\xcc\xc4\x3c\xbe\x34\x3e\xf7\x39\x18\x77\x42\xc8\x20\xee\x6b\x21\x89\x0e\xa5\x48\x7b\xa4\xe4\xde\x98\x60\xc2\x87\xbb\xef\x16\x6a\x58\x41\xfd\x68\x8d\x41\xad\x31\x68\xc9\x78\xd0\x18\x74\x6d\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\xa3\x05\xc9\x44\x96\x27\x54\x2f\xf1\x8c\x2d\x70\xa7\xbb\xa3\x5e\xc4\x23\x17\xc1\x34\x96\xa1\xa5\x8b\x7d\x98\xe4\x24\x49\x08\xe3\xf6\xe0\xe3\x04\xde\x61\x26\xc1\xaa\x36\x84\x5a\x7f\xf6\xc4\x2c\xe1\xce\x95\x95\x2b\xc7\xe5\x28\xa2\x34\x95\x1a\x63\x8f\xb1\xec\x9c\x65\x25\xce\xfb\xc4\x78\x51\x7c\x2e\x08\x87\x21\x17\x64\x61\x67\xcc\x84\x2a\xed\x97\x8d\xab\xd1\xf4\x16\xbd\x8d\x11\xc4\xc0\x23\xc0\xc4\xb4\x1c\x8a\x6f\x1d\x18\xbd\x8d\x9c\xf3\x89\x9d\x83\x92\x38\xb7\xc1\x20\x96\xfc\x2d\x9e\xe3\x65\x05\x20\x18\x44\xbc\xf6\x0d\x8c\x43\x1c\x02\x52\xfd\xa0\x61\x87\xfc\xbe\x60\x65\x55\x4f\x13\x79\x50\x9f\x67\x06\xcf\x56\x2d\x61\x68\x8e\x59\x16\xe6\xe7\x2a\x93\x7c\x09\xce\xc0\xfa\xec\xf3\xb3\x63\x9d\x0d\xb1\xcd\x66\x58\xe6\x06\xbe\x93\x26\xd9\x64\x13\xce\x92\x4c\xc2\x90\xdd\x37\x74\x4e\x4f\x78\x61\x89\x61\x31\x70\xcd\x86\xcc\xf6\xbc\xcf\x24\x64\xc0\xe3\x50\xb8\x14\x93\xc3\x79\x15\x36\x3b\x19\xcc\x63\x05\xee\x66\x49\xd9\xf5\x22\x61\xbf\xa5\x63\xa4\xa5\x63\x5b\x8f\x4f\x44\xc7\x1c\xe6\xee\x0e\x11\xc3\xc8\xf3\xfa\xd1\xef\xa7\xd5\x50\x76\x44\xe4\x8d\x11\xad\xc8\xec\x3a\xc2\x59\x94\xcd\x92\x0c\x69\xd8\x81\x34\x6a\x61\x83\xd7\xc8\x98\x8d\x0c\x64\x13\x98\x40\xe2\xe4\x26\x92\x52\x4e\x47\x36\xbf\x5b\x0b\x6f\xaa\x35\x8a\x96\xc1\x63\xc9\xe2\xb9\xb8\x7b\x94\xe3\x0d\x6e\x27\x82\xc6\x78\x51\x8a\x24\x01\xa9\x48\xc2\x6e\x81\x9c\x41\x96\x88\xa9\x4b\xd7\xe6\x31\xb9\xd6\x54\x1b\xac\xbe\x06\xbd\x9d\xdb\xb7\x16\xc6\xe2\x8a\xfb\x79\x92\xf4\x45\xc2\xa2\xad\x8c\x2a\xd5\x9d\xbb\xc0\xfd\xca\xf2\x24\x21\x19\x4e\xd9\x23\xef\x38\x12\x8d\x93\xe4\x8e\x4e\x55\x87\x5c\xc2\x04\x64\x87\x5c\x0c\x2f\x85\xee\x5b\xe9\xbb\x1a\x70\x67\x6f\x24\x6c\x48\x8e\xb1\xba\x8d\x26\x9a\x8e\x50\x77\xf2\x6e\xc0\x8e\x81\x7f\x79\x02\x4b\x1f\xee\x98\x5a\xa8\xac\xd4\x46\x9c\xdf\xe2\x4c\x86\x56\xd9\xbf\x3f\xf9\x36\x25\x6c\x08\xd1\x34\x4a\xea\x1f\xad\x93\x08\x03\x18\x8a\x8c\xf3\x12\x7e\xbb\x6a\xea\x2e\xc7\x13\xb5\x40\xc6\x89\x2d\x73\x6e\xeb\xb7\x17\xa8\x1e\x56\x64\xb5\x5d\xd5\xa8\x92\xb8\x35\xf3\xac\xcb\x36\x33\xa1\xf4\xb5\xd1\xd0\x1b\x29\x86\xbe\xdf\xf7\xd3\x11\x2c\xf9\x9c\x24\x10\x13\x96\xa6\x10\x1b\x2d\x3e\x99\x12\x3a\xd4\x98\x6b\x5b\xb1\x10\x44\x12\x2c\xd6\xba\x2a\x26\x63\xca\xe3\x04\x24\x19\x52\x96\x38\x7b\x40\xe5\x7e\x0d\x32\x65\x1c\xcd\x02\xd6\x23\x8b\x26\x06\xf3\x57\x14\x09\xe9\xcb\xd3\x33\xad\xfc\xa5\xe2\x60\x22\x1f\x29\x21\xc0\xac\x6b\x99\x0c\x12\x11\xdd\x2a\x92\x73\xcd\x12\xbb\x18\x21\x6e\x49\x24\xd2\x2c\xc1\xa3\x53\xe3\x64\x85\x7f\x76\x03\x2a\x75\xcd\xec\xea\xe8\xb7\xc5\x25\xfc\x61\x5b\x86\xde\x80\x20\xd6\x84\x18\x06\xf7\x10\x35\x96\xe7\x7f\x7e\x0f\x51\xa9\xb0\x04\xf6\x63\xc0\x13\x8d\x79\x9e\xf4\x16\x5e\x50\x25\xbb\x1a\xb9\x74\xe5\x51\x81\xdf\xa9\x9d\xd3\x17\xc2\x72\xaf\x20\x09\xe3\x48\xdf\x5c\x7e\x1d\x61\x5c\x19\xce\x5e\x39\x0c\xf6\xe8\x39\xa1\x95\xc4\x4c\x62\x15\x84\x69\x08\xa4\xf6\x73\x61\x81\x01\x21\x34\x39\xd8\x3f\xda\x3f\x9c\xb3\x3f\xee\x1b\x09\x24\x01\x4b\x6b\x7d\xe2\x5e\x58\x94\x62\x69\x96\x4c\x71\x1d\xfb\x71\x87\x30\xed\x23\xad\x65\xce\xfd\xaa\x5c\xd2\x5f\x87\x28\x41\xb4\xa4\xbe\xba\x8a\xfd\xd5\xdc\xa4\x65\xee\xa8\xfc\xc1\xfe\xaf\xfb\x1d\x02\x3a\x3a\x24\x77\x82\xef\x6b\x5c\x7e\x8f\xdc\x08\x23\x4a\x17\x13\x4d\x45\x4e\x38\xd8\xc0\x7e\xb8\xcf\x12\x16\x31\x9d\x4c\x91\x62\x11\x91\x6b\x9b\x43\x4c\xb5\x4f\x36\x3c\xbf\x67\xda\xc5\xab\x19\x92\xf1\x0a\xa1\x69\xa9\x16\xa1\x46\xcc\x99\xc0\xd1\x18\x68\xa2\xc7\x36\x48\x84\x0b\xde\xfd\x37\x48\x81\x39\x88\xdc\x5d\x79\x71\x55\xff\x1a\xd1\x1c\x0c\x11\xfd\x1e\x9a\x6b\xe2\xf3\xc3\xcd\x4d\xff\x7b\xd0\x33\x24\xc3\xbc\xc5\x87\xee\xa0\x35\x00\xe4\x50\xc8\x74\x07\x68\x47\x33\xce\xca\x2e\xc9\x84\xdc\x05\x12\x36\x16\xaa\xd6\x5e\x92\xb9\xfd\x14\x4a\xa3\x36\xe4\xa4\x31\x0e\x91\xd9\xc1\x6a\x0c\x89\xef\x73\x73\xd1\xef\x91\xbf\x8b\xdc\x7c\xcd\x80\x0e\x92\x69\xa8\xc4\xa0\x40\x93\x3d\x33\xd5\x9e\x21\x4f\x06\x1b\x7e\x00\x1a\x1b\x15\xc5\x50\x0f\xa0\xbb\xd1\xcf\x8a\xb8\xf3\xe0\xd6\xd6\x2c\x1f\xc8\x95\x16\x29\x19\xbb\xcf\xae\xa6\x5e\xba\x93\xd1\xc3\xd3\xe3\xf3\x9a\x24\x64\x96\xc2\xb9\x67\x5e\x1c\xfd\x9a\xa3\x1b\x16\xee\xee\xf7\x01\x96\xb1\x8a\xca\x60\x73\x0d\x9d\x6c\x62\x10\xb7\xc0\x32\xa8\x06\xdb\xb9\x4a\xca\x63\x87\x6b\x8f\x6e\x9d\xc8\x39\x3b\x11\x3a\xf5\xea\xc7\x7a\x35\x5a\x79\xb4\x99\xb8\x01\xb2\xc8\xc8\xea\x70\xc6\x5a\x5f\x1a\x02\xe2\xe3\x94\xbe\xfc\x14\x00\x68\x66\xf3\x49\x93\x10\xc8\x1a\x08\xed\x9e\x0f\xec\xd6\xc2\xe8\xa1\x98\x7a\x69\x89\x2b\x92\x09\x05\x72\xb2\x6d\x32\x77\x31\x9a\xfb\x74\xb1\xbd\xc6\xef\xc7\x82\x3c\x69\x49\x78\x9e\x0e\x40\x16\x99\x29\x52\xcf\x03\xa4\x14\x99\x70\x69\x6f\xf7\xe6\xdc\x6a\xfb\x44\xf3\xe4\x37\xff\xf9\x9f\x5f\xff\x67\xcf\x4e\x1f\xa2\x14\x38\xb9\x38\xb9\x3c\xf9\xe5\xfa\xe7\x53\x4c\x8e\xad\x0b\xd5\x86\x42\x30\x9b\x0e\xc0\x6c\x34\xfc\xf2\x51\x83\x2f\x31\xe5\xa3\x36\x15\xa9\xda\xfe\x71\x4a\x83\x01\x46\x6f\x33\x1a\xa7\x93\xfd\x4a\xc5\xca\x8c\xac\x59\x35\xa4\x9a\xa3\xb6\x13\x67\x4c\x47\xd9\xb5\x88\x6e\x1b\xd4\x6b\xce\x20\x93\x10\x59\x3b\xd9\xcd\x69\xdf\xce\x6e\xf4\xcb\xcb\x77\x37\x45\xaa\x01\xc6\xe3\x90\x37\xde\xbe\xf4\x83\xb3\xa4\x19\x9d\xf4\x16\x32\x1d\x54\xf7\x01\x8d\x6e\xef\xa8\x8c\xd1\xb2\x45\x35\x1b\xb0\x84\xd9\xe2\xbf\xbe\x29\x24\x17\x36\xe0\xcf\x16\x39\x13\xc3\xd9\xd2\x9a\x85\x39\x14\x4d\x56\x36\x8e\x66\x48\x59\x82\x16\xd4\x9c\x6b\x96\x82\x8b\x08\x8a\xb2\x60\xd2\x2b\xdb\xb4\x5b\xe5\xcb\x8f\x9d\x55\xbe\xf6\xdf\x79\xaf\xde\xc6\x7a\x58\xdd\xb8\xc4\x1d\x66\x75\x8e\xc5\xd9\x84\x90\x96\xd5\x7d\x16\xac\x2e\x93\x70\xad\x45\xd6\x90\x97\xc4\x4e\xb6\xc4\x47\x32\x80\xa1\x30\x44\x78\xa9\xd3\xc3\xf7\x08\xe6\x98\x1c\xe8\xad\x5a\xa2\xe2\xd8\xb0\x11\x99\x2a\x8f\xc6\xde\x40\xc9\x41\xa9\x23\x74\x87\xe4\x99\xd5\x5a\x91\x5c\xe7\x12\x3a\xe6\xeb\x20\xc5\xd5\x75\x8a\x2c\x07\xf3\x7a\xe0\xf6\x47\xd0\x91\xb5\xdc\x96\x08\x39\x16\x06\x75\xcb\x9f\x75\xa3\x44\x92\xaa\x31\x60\x79\x11\xb8\x67\xbe\x1b\x4a\x5f\xc4\xfb\xfb\xc5\xa7\x18\xc6\x32\x92\x34\x02\x92\x81\x64\xc2\x30\xa3\x9c\xeb\x58\xdc\x71\x32\x80\x11\xe3\xca\x83\xc2\xcc\xed\x61\x86\xfe\x18\xa6\x42\x61\xb8\x1e\xb9\xaa\x14\x3b\x71\x69\x48\x91\x28\x8e\xa6\x5b\xf3\xac\x27\x09\x39\x56\xa9\x65\x72\x80\xb0\x0f\x8f\xd5\x6b\x2c\xf9\x20\xe7\xf8\xe6\x18\x12\x3a\xb5\xd1\xa6\x43\xc6\x69\xc2\xfe\x0d\x52\x1d\x36\xe0\x71\x32\x20\x2c\xae\x2d\x5d\x07\x96\xea\xa7\xd1\xb8\x9e\xf3\xb7\x75\x51\xad\x39\x5a\x17\x55\x9d\x49\x5a\x17\x55\xeb\xa2\x7a\x60\xb4\x2e\xaa\xd6\x45\x35\x33\x76\x56\x4b\x6a\x5d\x54\x5b\x8f\xd6\x45\xb5\x7a\xb4\x2e\xaa\x35\x46\xeb\xa2\x5a\x73\xb4\x2e\xaa\xd6\x45\xd5\xba\xa8\x5a\x17\xd5\x67\x64\xb7\xf3\xa3\x75\x51\xcd\x4d\xd2\xba\xa8\x5a\x17\xd5\xda\x63\x67\x95\xaf\xd6\x45\x65\x47\xeb\xa2\xaa\x8e\xcf\x8b\xd5\x79\x07\x4f\xdf\xa8\x7a\xf5\x73\xda\xfa\xe8\x54\x60\x91\xf3\x13\x95\x9b\xc6\x85\x57\x95\xfa\xc4\x95\xca\x82\xf8\x54\x1c\xe7\x11\x2a\xfc\x4c\x0b\xf3\xa5\x36\x75\x55\xf8\x24\x43\x75\x94\x09\xfb\x7f\x85\xa3\xa2\xe4\xa1\xb0\x0a\xef\xf6\x39\x6b\x4f\x96\x8d\x55\xc7\x2d\xf1\x69\x5c\x12\x3b\xe2\xbf\x69\xc0\x0d\xd1\xba\x20\x5e\x9c\x0b\xe2\xe5\x74\xcd\x75\x9e\xf9\x9b\xb1\x04\x35\x16\xc9\xd6\x88\x5e\x41\xf2\xb7\x8c\xb3\x34\x4f\x0d\xce\x29\x83\xcf\x6c\x12\x42\x00\x54\x40\x57\x4b\xb1\xad\x15\xd1\xdc\xc8\x62\xc0\x62\xa7\x94\x25\x66\x1b\x31\x7f\x73\x4c\x27\x06\xd7\x55\x1e\x45\x00\xd8\x4a\xad\xac\xe1\x7c\xdd\x0b\x6f\x0a\xad\x33\x5e\xd7\xa3\x37\xf5\x98\xb8\x2d\x47\x8a\xb3\x7c\xfd\xd5\x56\x73\x8c\x64\xd6\x0c\x5d\xfe\xfe\xaa\x7f\x5a\x6e\x93\xcd\x3d\x59\x66\x7c\x22\x92\x89\xed\xb0\x8f\x37\x19\x61\xcd\x35\xe3\xc7\x66\xee\x03\xd0\xb4\xa4\xdb\x38\xb5\x40\x11\xe0\x74\x90\x98\xe7\xcc\x53\x81\x23\xf7\x2d\xdf\x05\xaa\x73\x09\x64\x44\xf5\x53\x12\xfc\xfa\x2a\x4c\x2d\xf5\xa5\x09\x7e\x53\x57\x42\xaf\xda\xe0\x8c\x1c\x5e\xb5\x42\x8d\x10\x2f\x6c\x05\xfd\xb5\xe5\xf0\xda\x94\xb2\xbe\x6c\x5c\xff\x68\x11\x2c\x71\x83\x1f\xde\x18\x80\xf7\x5c\xcb\x67\xcf\xce\xcb\x4a\x90\xef\x2a\xa5\x05\xc9\x12\x5a\xf4\x85\xc2\x1d\xf8\x01\x79\xd0\xe9\x18\xa2\xdb\x2b\xe7\x89\x3d\x50\x00\x41\x36\x1d\x31\x3d\xce\x07\xbd\x48\xa4\x47\x86\x24\xd8\xff\x1b\x24\x62\x70\x94\x52\xa5\x41\x1a\x71\xd5\xb1\xb8\x6e\x64\x66\x61\x7c\xd4\x4b\xe3\xc3\x1e\xf9\xc0\x6d\x76\x7b\xd1\x87\xb2\x54\xdb\xc1\xbc\xdf\xd7\xd9\x18\x80\xa1\xae\x42\x96\xdb\x87\x0f\xa6\xb8\xbc\x5e\x9d\x42\xc9\xb5\x59\x52\x4d\x2f\xf8\xa7\xf7\x80\xb7\x94\x8b\x34\x60\x70\x79\x6e\x9e\xee\xc6\x22\x3e\x1a\xf0\x70\xef\x90\x77\x7b\x67\x44\xe3\x5d\xf1\x68\xef\x60\xb5\xe9\x06\x1c\xb0\x4d\x78\xb0\x9b\xf3\x5e\x3f\x42\x51\xe6\xc7\xf1\x5a\x37\x68\xda\x6b\xc8\x5b\xfd\x29\x3c\xd5\x8d\x7c\x75\x5d\x0f\xf5\xa7\xf3\x4e\x37\xf3\xb9\x4d\x2a\x02\xcf\xd5\x23\xdd\x80\x89\xbe\x49\xf3\x7c\x63\xa6\xf9\x47\xf3\x40\xd7\xf7\x3e\xef\x80\xe7\xb9\x36\x90\x19\x67\x9a\xd1\xe4\x0c\x12\x3a\xbd\x86\x48\xf0\x78\x6b\x0e\x33\x53\xa5\x33\x9c\x1f\x65\xa7\x75\x76\xaa\x6a\xa2\xc5\x98\xba\x62\xe4\x46\xa3\xb2\x89\x25\xde\x97\xe1\x04\x0a\xf4\x2a\xdb\x55\xee\xa4\x77\x82\xec\x8c\x41\xcc\x66\x9d\x34\xb9\x89\x3f\x88\x3b\x22\x86\x1a\x38\x39\x60\xdc\xef\xe3\x61\x49\x0d\x2c\xac\x93\x01\xad\xcd\xd5\xd7\xaf\xfc\xcd\x2f\xcf\xec\x88\x06\x56\xa5\x1e\xdf\x0a\xec\x5e\xf4\xb0\x19\xd8\xdd\x38\xcc\x93\xaa\x29\xd8\x9a\x87\xab\xf4\xe6\x75\x51\x4e\xf9\x35\xce\x1b\x4e\x1b\xe5\x31\x71\x99\x68\x2f\x6f\xd3\x6a\xc7\xd5\x54\x45\xbf\x10\x47\xf3\x90\xd5\xf8\xe6\xb4\x6f\x8d\xc6\xad\xb9\x64\x57\xcc\x25\x4f\x14\x9b\xb2\x83\x82\xee\x33\x8d\x47\x69\x05\xdd\x0d\x46\x29\x37\xf5\x7b\x49\x23\xe8\x37\x2e\x23\xf8\xe3\x44\xe2\x5c\x52\x47\x00\x83\xc8\xe7\x0f\x0f\x07\x88\xed\x69\x0a\xf9\xbc\x98\x29\x3b\xcc\x93\x64\x4a\xf2\x4c\xf0\x6a\xf6\xb3\xf5\xb5\xcf\x26\xd3\xa2\x49\x7e\xc1\x5b\x0a\xc1\x32\x93\xc2\xf1\x4c\x99\x73\x6e\x68\x70\xd1\x13\x0d\x05\x49\x2c\xd3\x4c\x2b\x29\xbb\x8a\x8d\xcc\xf2\x0d\xff\xc3\x6c\xde\x22\x00\xb1\x32\xa1\x79\x7a\x28\x64\xc4\x06\xc9\x94\x8c\x69\x12\x1a\xe0\x50\x72\xcb\x92\xc4\x4d\xd3\x23\xd7\xa0\xad\x4b\xc1\xf2\xce\x44\xf0\x11\x2e\x8e\x72\xdf\x78\x11\x22\xf3\x6c\x94\x00\xe5\x79\x66\xdf\x67\x38\xf1\x54\xe4\xd2\xbf\xaf\x17\x1c\x13\x81\x03\x73\x96\x74\x4a\xed\xdd\x56\x6e\x6c\x88\xfd\xc9\x95\x11\x00\xde\xf9\xb2\xd4\x9d\xf2\x9c\xbe\x72\xb8\x2a\x35\xf7\xc9\xa4\x98\xb0\xd8\x7a\x37\x3c\xd8\xb0\x91\xb4\x6d\xe0\x13\xce\x33\x17\xbc\xcb\x61\x44\x51\x50\x71\xa7\xc8\xee\x99\x9d\xc7\x46\x10\xf0\x18\x5b\xfa\x18\x09\x5f\x64\x95\x74\xfa\x09\xb3\xcd\x88\x4b\x90\x23\x07\x5c\x10\x81\xf1\xa8\x39\x67\xda\x36\xb8\x1f\xe7\x9a\xc4\xe2\x8e\x1f\x6e\xe4\x75\x45\x47\xeb\xcd\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x7e\x3b\x1a\xc1\x52\x10\xb9\xfe\x24\xda\xdf\xdd\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x6b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x5b\xc3\xee\x02\xeb\xd7\x6c\x39\x84\xa2\xf3\x35\xc6\x89\x9f\x5d\x5e\xff\xf2\xe6\xe4\xaf\xe7\x6f\x7a\xe4\x9c\x46\xe3\x72\x4d\x0c\x4e\x28\x12\x0d\x24\x14\x63\x3a\x01\x42\x49\xce\xd9\xbf\x72\xe7\xf0\x3d\x08\xcf\x1e\x36\x5a\xab\x7d\x4b\xee\x8b\xdd\xf9\x1b\x6b\x07\x67\x7b\xfd\xdb\xb8\x2c\xa1\x00\x1b\xb8\xcc\x8a\x4f\xe7\xe6\x92\x55\x0e\x50\xd4\xc2\xc0\xf9\x11\x9b\x38\x32\xec\x8a\xdf\xd3\x38\x44\x8a\x19\x3c\x37\x68\x61\x58\x15\x1d\x60\x84\xd7\x18\x08\x07\x6d\xd0\x3a\xd8\x98\x04\x57\x95\xe2\x24\xb9\x02\xd5\x21\x83\x1c\x63\xd2\x32\xc9\x52\x2a\x59\x32\x2d\x4f\x66\x78\xd5\x65\x70\x79\x4f\x67\x97\x74\xf6\xee\xfc\x1a\x73\x04\x32\x69\xcb\x96\x60\x50\x19\x5e\xc7\xcf\x1a\x80\x79\xc2\xb5\x11\xee\x91\x13\x3e\xb5\x17\xed\x01\x67\x8a\x24\x4c\x69\x40\x16\xec\x64\x48\xef\x4c\xdf\x7b\xd5\xc3\xff\xed\x99\xaf\x94\x46\xc8\x0c\xb1\x72\xd1\x5c\xf0\xaa\x15\x43\xd9\x20\x29\x41\xd3\x7d\xfb\x8b\x6a\x08\x57\x04\x09\x19\x20\x96\x1a\xc2\xd1\xb0\xd5\x08\x5e\xdb\x20\x90\xf1\x51\x52\xc6\xaa\xed\xc8\x7e\x5d\xdd\xb2\xae\x66\xd9\x2d\xbe\xa0\xbf\xad\x82\xd9\x48\x63\xba\x62\x0d\x0d\xb5\x73\x2a\xb8\x9f\x57\xa7\x1c\x45\x10\xe5\x0e\xbd\x17\x7d\x7f\x02\x9c\x74\x93\xce\xb4\x75\xcd\x8a\x98\xa4\x0e\x79\x45\xfe\x44\xee\xc9\x9f\x50\xbd\xfa\xa6\x6e\xf3\xab\xba\x8a\x4f\x13\x21\x46\x46\xab\xbf\xe8\x37\x04\xf1\xbf\x19\xea\x64\x66\x34\x50\xd5\x82\x0c\x98\x13\xe7\xe1\x5e\x83\x34\x74\xd4\xed\xc4\x93\xb6\x0d\x33\x0b\xfc\x84\x68\x66\xdd\x0d\x17\xc3\x6a\x58\xd3\x66\x88\x66\x1e\xff\x41\x28\x7d\xe9\xa8\x50\xb5\x01\x4e\x31\x5b\x4a\x75\x34\xae\x92\x31\x23\xa8\x29\x5d\x1c\x30\x45\x62\x81\x51\x56\x36\x7c\x79\xcc\x6a\x04\x4f\xec\x0e\x1a\xd7\xf3\xa7\x57\xf6\x73\xd5\x4e\xcd\x18\x50\x50\xf3\x71\x82\x55\xa9\x32\x56\x26\x62\x27\x93\x99\x65\xc5\x25\x9e\xb1\x42\x28\x73\xb6\x9a\x60\x65\x46\x5c\x32\xe7\x29\xa2\xdc\x26\x90\x0c\x41\x4a\x1b\x71\x3e\x98\xfa\x60\xbd\xda\x9b\x57\xeb\x24\x65\x52\x68\x11\x89\x1a\x9d\xcd\xaa\x3e\x6e\x37\x1d\x02\xc1\x46\xf9\x7a\x33\xf9\x4f\x67\xfd\x0e\xb9\x39\xed\x63\xb7\xa7\xeb\xd3\x9b\x7e\x55\x53\xd9\xbb\x39\xed\xef\x3d\x29\x28\x88\x97\xac\xd0\x30\xbd\xc5\x24\x15\xc3\x93\x11\xdb\xba\x29\xcd\xba\xb7\x30\xdd\x92\xa7\x36\xc1\xd7\xbb\x61\x87\x1b\xf9\x20\x0b\xe6\x94\x66\x1b\xcf\x26\x81\xc6\xec\x13\x65\x71\xf9\x30\xd8\xf0\xce\xc5\xe9\x5c\xa9\x98\x40\x6c\xc5\x61\xff\x04\xf0\x38\x13\xcc\xc8\x8b\x6d\x8e\xd7\xe6\x4f\xb7\x39\x5e\x6b\x8f\x36\xc7\xab\xcd\xf1\x9a\x1f\x3b\x13\xc8\xda\xe6\x78\xbd\x2c\xbf\x7d\x9b\xe3\xf5\x99\xbb\xfe\xdb\x1c\xaf\xc5\xa3\xcd\xf1\x6a\x73\xbc\xd6\x1b\x6d\x8e\xd7\xe6\x63\xe7\x82\x96\xda\x1c\xaf\x8d\x46\x9b\xe3\x35\x3f\xda\x1c\xaf\x25\xa3\xcd\xf1\x5a\x32\xda\x1c\xaf\x36\xc7\xab\xcd\xf1\x6a\x43\x5f\x1f\x9c\x6b\x37\x43\x5f\x49\x9b\xe3\xe5\x46\x9b\xe3\xf5\x22\x02\xfc\x48\x9b\xe3\xb5\xd6\x68\x73\xbc\xda\x1c\xaf\x6d\x46\x9b\xe3\xf5\x52\xcc\x25\x6d\x8e\x57\x9b\xe3\xf5\xf9\x08\xba\x6d\x8e\x57\x9b\xe3\xd5\xe6\x78\xb5\x39\x5e\x2b\x57\xd1\xe6\x78\xbd\x04\x15\xd0\xf7\x01\xae\x9f\xb3\xb4\x7f\x2a\xd2\x2c\xd7\x40\xae\xfc\x94\x41\x8a\xb4\x84\x81\xa9\xb2\x44\x50\x3f\x84\x30\x12\x7c\xc8\x46\x8e\xb2\x1f\xd9\xe6\xbb\xdd\xf0\x3d\xdd\x52\xc3\xdb\x67\x18\x3f\x98\xb0\x94\x6d\x97\x48\x46\xe6\x36\xe6\x0d\xce\x55\xf2\xcb\x98\x93\x94\xd2\x7b\x3c\x22\x34\x15\xb9\x6d\x58\x1c\xb9\xfd\x0b\x20\xb4\xde\xab\x9d\xdb\x19\xd2\x8c\x8a\x53\x64\xc4\xf5\x9b\x08\x2b\xa1\x5a\x83\xe4\xc7\xe4\xbf\x0e\x3e\x7c\xf9\x6b\xf7\xf0\xdb\x83\x83\xf7\xaf\xba\x7f\xfc\xf8\xe5\xc1\x87\x1e\xfe\xe3\x77\x87\xdf\x1e\xfe\xea\xff\xf8\xf2\xf0\xf0\xe0\xe0\xfd\x8f\x6f\xbf\xbf\xe9\x9f\x7f\x64\x87\xbf\xbe\xe7\x79\x7a\x6b\xff\xfa\xf5\xe0\x3d\x9c\x7f\x5c\x73\x92\xc3\xc3\x6f\xbf\xd8\x7a\xc9\xb5\x45\xe2\xe6\x04\xe2\x86\xc4\xe1\x47\x11\x86\x9d\x43\xb7\xa1\xb3\xe8\x82\x51\xe6\x4e\xa3\x63\x58\xab\x4e\xa3\xa7\xa6\x28\xe6\x85\x79\x98\x22\x22\x65\xda\x08\x87\x46\x1e\xa4\xe5\x70\x56\xa6\x2b\x4a\xa9\xa3\x03\x18\xd0\x4d\xb5\x6d\xaf\x1e\x42\x41\x4b\x41\x2c\xc2\x4b\x7e\xae\xff\x3c\x4b\xb3\x04\xdb\x9a\xe3\x79\xee\xfa\x58\x16\x64\xae\x2d\x6d\x78\x78\xb4\xb4\xe1\x25\xd2\x06\x05\x51\x2e\x99\x9e\x9e\x0a\xae\xe1\x7e\x2b\x0b\x4b\x95\x34\x5c\x57\x27\x74\x31\x63\x2e\x8b\xdb\x5d\x23\x22\xb3\x71\xdf\x33\xe9\xf4\x63\x91\x27\x31\x26\x73\xe4\x1c\x15\x4c\x9b\xa5\x07\xda\x6a\x7f\xa8\xf7\x60\x28\xf7\xec\x4b\xbc\x3e\x67\xd5\xcc\x7f\xe5\x6c\x42\x13\xa3\xed\x16\x4f\xf4\x51\x83\x29\x3f\xb4\xee\x99\xd7\x54\xdd\x16\x07\x1e\xba\x46\x86\x0e\x6b\x3e\xf2\x9f\x84\x3f\xc1\xbd\x7e\x8e\x52\x1a\x0a\x48\x7d\xc9\x26\x2c\x81\x11\x9c\xab\x88\x26\x48\xd7\x9a\xe1\x15\x27\x4b\x66\xc7\x8d\x97\x22\x51\xe4\x6e\x0c\x86\x56\x13\xea\x4d\x00\x98\x61\x37\xa2\x8c\x93\xd4\x6c\x51\xe6\x1f\x56\xd6\x96\x60\xc8\x7f\x46\xa5\xd9\xe0\x60\x33\x40\x15\x79\x20\x44\xe2\x32\x1e\x92\x69\x31\xbf\xcb\xfd\xe1\xe2\x17\x0e\x77\xbf\x98\xd9\x14\x19\x26\x74\x14\x4c\x05\x0a\xf4\x9c\xb5\xaf\x98\x7a\xe9\x07\x60\x3a\x41\x0e\x84\x26\x77\x74\xaa\x0a\xc3\x49\xa9\xee\x83\x3a\x26\xaf\x0f\x11\x9d\xa9\x22\x61\x8e\x98\x7c\x75\x88\xee\xbf\xd3\x93\xfe\x2f\xd7\x7f\xbf\xfe\xe5\xe4\xec\xed\xc5\x25\xb9\x14\x1a\x2c\x53\x2b\x35\x07\x8c\x82\x86\x61\x56\x89\xef\x40\x2d\x5d\xa8\x1e\xda\x2e\x99\x22\x77\x8c\xc7\xe2\x4e\x6d\x6d\xa3\xb5\xe8\x67\x80\x07\x94\x6f\x35\x47\x44\x33\x8a\x3d\x0f\x6b\x70\x98\xb9\x08\x93\xf2\xa4\xc8\xc3\xe3\xf8\x28\x96\x22\xb3\x40\xf0\x46\xae\x82\xd5\x56\xd5\xe8\x72\x0c\x2b\xee\xef\xb0\x3a\xe1\x48\x52\xae\x0b\x6b\x4f\xb1\x67\xae\xd9\x62\xaf\xf6\x76\x3c\xef\x8c\x26\x1a\x37\x97\xcd\x74\x12\xc7\x10\x57\xc0\xff\xe2\x22\x07\x4f\xfd\xc7\x4d\x8b\x2a\x15\xa4\xff\xee\xfa\xe2\xff\xcc\xe0\xf1\x34\xab\x17\x28\xd5\x4c\x66\xac\x14\x59\x63\xbb\x7b\xe5\x32\x2f\xdb\xfd\xdd\x89\xfd\x0d\xdc\xb2\x19\xf7\xfc\x55\xce\xab\x85\x8c\x8a\xf9\x49\x2a\x62\xe8\x91\x7e\xf0\x13\x54\xaf\x96\x0a\x1c\x50\x09\xc4\xdc\xc2\x35\xa3\x49\x32\x2d\x8b\x68\x5a\xd8\x2c\xc4\x4a\x6d\x86\x32\x21\x1f\xd2\x44\x3d\x35\x35\xae\xc3\x1b\x8d\x1c\xf1\xd6\xe8\xc3\x8d\x6c\x47\x98\x8d\xc4\xc0\x85\x76\x82\xb5\x59\x25\xd6\xbb\x90\x22\x22\x56\xf9\x2e\x05\x63\x55\xf8\x9b\xb2\xbe\x0a\xcf\x1a\x99\xf2\xc0\xee\x87\x99\xad\xa1\x3a\x57\x30\x2b\xa0\xfb\x3e\xc4\x41\x1d\x37\xb3\x4b\xa0\xb1\xe0\xc9\x14\x23\x2f\x6d\x2c\x45\x4a\xd5\x2d\xc4\xf6\x07\x27\x9a\x05\x4f\x85\x99\x31\xbc\xea\xc6\xac\xdb\xbb\x25\x50\x24\xb3\x11\x1e\xe8\xce\x80\xf8\x89\x77\xbd\xc6\x21\x34\x40\x79\xc7\x93\xe9\x95\x10\xfa\xbb\x90\x46\xdb\x08\x06\xfc\xcd\x49\xcb\x55\x53\x34\x8a\x93\x14\xdf\xdb\xc5\xdd\xc0\x43\x55\xce\xe0\x3d\x2b\x76\xfc\xb9\x1f\x29\x99\xf3\x13\xf5\xbd\x14\xf9\xd6\x4c\x6c\x4e\xd8\xfc\xfe\xe2\x0c\x49\x51\xee\x5c\x95\x5c\xcb\x29\x96\x0e\x98\xaf\xfa\x16\x14\x83\x9f\x9c\xb3\xb5\x7c\x26\x0a\xbf\x18\x79\x4b\xa7\x84\x26\x4a\x78\x58\x32\xbe\x50\x0b\x75\x2a\xae\xb9\x3c\x10\x7a\x3c\xa7\xdb\x9a\x03\x35\xff\x5c\xa7\xe4\xb9\x2c\xca\xd0\x31\x3e\xf7\xb8\xa6\xb7\xa0\x48\x26\x21\x82\x18\x78\xf4\xd4\xdb\xfe\xd4\x0e\x3f\x44\x9d\x4b\xc1\xcd\xc1\x6c\x04\x79\x2e\x82\xa7\xd7\x81\xb4\x8c\x2a\xe8\x33\x76\xda\x1f\x45\xcf\x31\x1e\xcb\x5c\x81\xb4\x6e\x6e\x99\x83\xdd\xc9\x1f\xf3\x01\x24\x06\xf2\x46\x25\x75\x9d\xe2\xad\x39\x83\xa5\x74\x04\x84\xea\x80\x69\x5a\x10\xe0\xca\x50\x4c\x6b\x00\xd5\x24\x16\x50\x64\xdf\x53\x45\x7e\xba\x38\x23\xaf\xc8\x81\x79\xd7\x21\xe2\x0f\x36\x92\xd7\xc2\x06\xb9\xcd\xea\xa8\x43\x3f\x05\x2e\x09\x91\x97\x08\x69\x89\x44\x87\x70\x41\x54\x1e\x8d\xcb\xdd\xeb\xbd\xda\xec\x02\x21\xd1\xb5\xb2\x9b\xb8\xfe\xb4\x14\xea\x27\x05\xb2\x31\x02\xf5\xd3\x16\x04\xaa\x2c\x46\x19\x9c\xab\x42\xcf\x22\x56\x0a\x9a\xc6\x54\x53\x47\xb8\xfc\x0d\x3b\xbb\xa5\x9f\x37\xf9\x52\xf0\x86\xf1\xfc\xde\x06\x1e\x35\x67\x6a\xb9\x3e\xc7\x69\x49\xe4\xa1\x8e\xbb\x4e\xb3\x2c\x61\xb6\xda\xc6\x4c\x20\xdc\x45\x05\x57\x3a\x4b\xc4\x44\xa4\x13\x34\x49\x84\xa1\x8f\x46\x38\xa1\x3c\x16\xe9\xdc\xcb\x8c\x10\x09\x95\x7a\xa9\x3d\xd2\x62\x5f\x75\xec\x88\x51\x28\x81\x09\xd4\xa8\x2d\x36\x5b\x1f\xd6\xcc\x66\x80\xe3\x31\x02\xa7\x27\x09\x1d\x40\x62\x61\x6c\x31\x50\xcd\x63\xe0\x53\x47\xa3\x4a\x91\x34\x97\x3e\x73\x25\x12\xb0\xe1\x5d\x1e\x10\x66\xfa\x67\x01\x07\x9c\xa4\x29\x38\xa0\x36\x58\x81\x03\xea\xb5\xcf\x01\x0e\x79\x0d\x56\x4f\x66\xe1\x60\xe4\x86\x2a\x1c\x90\x79\xef\x3a\x1c\x14\x44\x91\x48\xb3\xbe\x14\x46\xed\x6c\x8c\x37\xb9\x69\x0b\x9f\xa1\x35\x6c\x2c\x08\xc6\x42\x5e\x50\xbd\x99\xca\x52\x60\x27\xd5\x96\x49\xf8\xe8\xce\xff\xaf\xc4\xb3\x90\xf4\xcc\x32\x32\x3f\x4b\xc5\xbd\x68\x9e\x74\x17\x9e\x33\x3b\x68\x22\x37\xa2\x86\xb1\xb3\x11\x6e\x24\x22\x9a\x60\xed\xd8\x7a\x28\x47\x66\xd1\x6e\x76\xe2\x52\x38\x2f\xfa\x28\xf1\x37\x1f\x40\x82\x65\x44\xf1\x17\x67\xc2\xe4\x22\x86\x92\x2f\xdb\xc6\x21\xdf\xd8\xb0\x4f\xbc\xcf\x47\x12\x1b\xb9\xc2\xbb\x95\xe3\xca\xd3\x5a\xb8\x0a\x68\x6f\x43\x45\x5a\xb3\x40\xe0\x31\xe3\x23\xb4\xab\x75\x88\x84\xc4\xc6\x20\x3b\x22\x70\x6b\x35\xc8\x7d\x3c\x12\x7e\x52\x7f\x1e\xfc\xab\x51\x16\x63\x82\xbb\x99\xd1\x52\xe4\x25\xac\xa1\x25\xb7\x4c\x91\xbd\x37\x1e\x00\x35\x4a\x78\xee\x22\x87\xd9\xb3\x5f\x18\x76\xd3\x5a\x3a\x6f\x19\x8f\x5d\xb8\x6e\x05\x58\xa1\xd8\xba\x95\x83\x31\x10\x9c\xc5\x65\xda\x72\x4c\x3e\x70\x12\x80\x45\xba\x5b\xa3\xc7\x95\x15\x99\xbd\x8d\xae\xbb\xda\xf0\x1a\x5e\x32\x3b\xcd\x4f\x1c\xf7\xde\xbc\xb7\x6b\x34\xf7\xf9\xfb\xfc\xb7\x3c\x69\xe9\x1e\x47\xfd\x9a\xd6\x62\xfe\x66\xa7\xf5\x22\x7d\x64\xd0\x5a\x33\x3e\x52\x65\x4d\x86\x26\x49\xc5\x18\xbe\x48\x95\xf1\x3b\x1c\x4a\xeb\xcf\xab\x10\x33\x69\x06\xcf\x45\x0d\x49\x8c\x38\xf1\xcc\x95\x90\x51\xaa\xe8\xa9\x34\x90\xd0\x8c\x26\xd7\xd9\xf6\x25\x4a\xc9\x5c\x39\xbc\xb7\xd7\x27\xd5\xa9\x91\x59\x63\xe7\x07\xb3\x57\xe6\x3a\xa1\x71\xca\x94\x42\x43\x18\x0c\xc6\x42\xdc\x92\x83\x05\xf5\xb8\x4a\x71\x5a\x8a\x8d\xd4\x91\xc3\xf9\xae\x59\xfd\x21\x61\x3c\x09\x51\x51\xa8\x07\x73\xad\xbc\x21\x07\x5f\x12\x85\x55\xe0\x1e\xba\xba\xd5\x2e\x58\x61\x7e\x99\xb6\x52\xb5\xc1\x82\x27\x27\xd8\xf3\xdb\x73\x59\xb3\xec\xca\x03\x5b\x74\xe9\x70\x7b\xb6\xb2\xda\x42\x38\x5a\xe9\xf1\xc9\x81\xe4\x84\x8b\x08\x54\x73\x05\x9d\x7e\x28\xe6\x24\x31\xd8\x2c\x1e\xc0\xe8\x27\xba\x34\xc8\x0e\xed\xd2\xfb\x98\x0c\xea\x1e\xdd\x2f\x4b\xd4\x37\x05\x71\x31\xfa\x48\x92\x8d\x69\xd7\x2a\xe9\x86\xa2\x21\x09\xf4\x22\xc4\x58\x70\xe1\x92\x24\x0c\x13\x15\x1c\x51\x1a\x49\x94\xf5\xe6\xe1\x9e\x38\x12\x5d\x5a\xea\x69\xe1\x25\x2e\x3b\x02\x31\x99\xcc\xd6\x8f\x28\xd6\x70\xc7\xf4\xd8\x77\x7a\xa9\x78\x0d\x71\x25\x12\x14\x3a\x60\x38\x01\x29\x85\x74\x01\x59\xde\x6e\x8d\x33\x21\x25\xc7\x88\x2e\x83\x24\xd4\xfc\xb5\xaf\xca\x8e\xea\xa2\x14\x3c\xc6\x2b\x1a\x6c\x82\xe1\x10\x22\x14\xb4\xca\x00\xb6\x54\xfb\xa0\x28\x7c\xeb\xb2\x0c\x0c\x82\xb9\x52\xf2\x29\xbb\x37\x6f\x29\x3f\x55\x76\x89\xbb\x82\xb3\x8b\x2f\x1f\xf6\x08\xb9\xe0\x21\x82\xb7\x63\x76\xb1\x7c\xa7\x0f\x3d\xd3\xe6\x13\xcb\x7d\x08\xf0\x03\xca\x86\x33\x23\x1d\xca\xbc\x01\x8c\xaf\x63\x0e\x27\x65\x93\x78\xa3\xe4\x00\x4d\xe3\x6e\x52\xb3\xf5\x5e\x06\xa8\x63\x2a\x37\xb7\x3c\x96\xb9\xfc\x79\x38\x40\x48\x5d\x3a\xe7\xaa\x29\x34\x54\x1c\xfe\xba\x34\x5b\x49\x7a\x0f\x0e\xb7\xbe\x88\x6d\x35\x95\x50\x0d\x02\x7b\x3a\x61\x75\x17\xf6\x6f\x2f\x9f\x15\x32\x1e\x17\x36\x3b\xa0\x5c\x66\xc5\x95\xd4\x8e\x89\x11\xb5\x13\x6f\x5b\x48\xb3\x04\x30\x8b\xb3\x34\x73\x91\xa0\x5a\xaa\x26\xdf\x09\x0b\x29\x0a\xd2\xbb\xe2\x2e\x1d\xf2\x4f\x3c\x94\x21\x10\xd5\xd7\x9d\xe8\x87\xc7\xad\x86\xc8\x94\x6f\x2d\x81\x19\x96\x5a\x78\xd3\x05\x89\xd9\x70\x08\x3e\xe0\xd5\x68\x8e\x54\xd2\xd4\x90\x78\x45\x1c\x08\x06\x30\x62\x36\x20\x32\x10\xb6\x7d\x23\xee\xb9\x5c\xbf\x8e\x25\x86\x4c\x93\x94\x8d\xc6\x16\x51\x08\xc5\x0c\x5d\xe2\x9d\x8a\x89\xa0\x31\x41\xdc\x16\x92\xdc\x51\x99\x1a\xbe\x41\xa3\x31\x7a\x28\x29\x27\x71\x2e\xb1\xca\xb2\x06\x1a\x4f\xbb\x4a\x53\x6d\x24\x65\x90\x4e\xa1\xf4\xeb\x6f\x4b\xea\xaf\x1c\x6d\x49\xfd\x35\x47\x5b\x52\xbf\x2d\xa9\x3f\x3f\x76\x26\x3a\xb4\x2d\xa9\xff\xb2\xca\x24\xb5\x25\xf5\x9f\xda\x9b\xd0\x96\xd4\x6f\x4b\xea\xaf\x1a\x6d\x49\xfd\x07\x46\x5b\x52\x7f\x8b\xf1\x02\x28\x57\x5b\x52\x7f\x8b\xd1\x96\xd4\x5f\x3c\xda\x92\xfa\xf3\xa3\x2d\xa9\xbf\x74\xb4\x25\xf5\xb7\x1e\x6d\x49\xfd\xb6\xa4\x7e\x5b\x69\x74\xb3\xb9\x76\xb3\xd2\x28\x69\x4b\xea\xbb\xd1\x96\xd4\x7f\x11\xf5\x14\x49\x5b\x52\x7f\xad\xd1\x96\xd4\x6f\x4b\xea\x6f\x33\xda\x92\xfa\x2f\xc5\x5c\xd2\x96\xd4\x6f\x4b\xea\x7f\x3e\x82\x6e\x5b\x52\xbf\x2d\xa9\xdf\x96\xd4\x6f\x4b\xea\xaf\x5c\x45\x5b\x52\xff\x25\xa8\x80\x4a\xc7\x6c\xab\x0a\xa0\xeb\x14\x2b\x72\x41\xe8\xa5\xda\x00\x83\x7c\x38\x04\x89\x94\x0b\xdf\x3c\x17\x3c\x55\xd4\x65\x9c\x75\xb2\x82\xee\x60\xdd\x23\x97\xaf\xb3\xe4\x71\x57\x8c\x00\x2b\x75\x16\x91\xe2\xe7\xef\xbe\x5b\x50\x19\x69\xeb\xa8\xc2\x6d\x63\xa4\x71\xcd\xef\xf8\x76\xfe\xf1\x25\x00\x5f\x94\x3f\xe6\xe0\x1e\x25\x42\xb9\x08\x77\x04\x56\x34\xa6\x9c\x83\xd7\xf7\x98\x46\x3b\xca\x00\x80\x13\x91\x81\xf3\x4e\x53\xa2\x18\x1f\x25\x40\xa8\xd6\x34\x1a\xf7\xcc\x9b\xb8\x07\x76\x11\x8d\xee\x7e\x51\x5a\x02\x4d\x7d\x5c\x7e\x4a\x99\x9d\x8a\xd0\x48\x0a\xa5\x48\x9a\x27\x9a\x65\x61\x32\xa2\x00\x13\x6a\x2c\xa3\x0a\xc0\xc0\xa8\xb8\x22\x84\xbd\x53\xbc\xcd\x2d\x4b\x94\x4b\xd3\xa1\xb6\xd9\xc1\x7a\xe0\x69\xa6\xa7\x21\x8e\x17\xc8\x90\x49\xa5\x49\x94\x30\xe4\xd6\xf8\x46\x9b\x3b\x8d\xf3\x75\x3c\xaf\xe6\x6e\xa5\xca\x2d\x95\xc7\x28\xb6\x66\x5a\xd9\xa8\xd8\x62\x42\x37\x55\xcc\x94\x13\xf3\x55\x87\x50\x5f\x37\xcd\x02\xda\xaf\x14\x41\xed\x39\x8b\x9d\xdd\xfd\x54\x9a\xae\x54\x2f\xb6\x08\x1b\x2e\x10\x1d\x53\x1c\x3c\x72\x76\x2a\xd9\x1c\x85\x40\x81\x51\x7a\x73\xc7\x00\x37\x80\xc3\xc4\xe0\x00\x44\x60\xf8\x2b\x5d\x82\xf5\x9f\x1c\xe9\x4b\x4c\xf1\x2d\x28\x45\x47\xd0\xdf\xd2\xd1\xb0\x4c\x23\x43\x5f\x43\xb1\x31\x88\x0a\x89\xcd\xae\x0d\xbf\x14\xd1\x99\x55\x31\x88\xa4\x76\x4d\x41\xf8\xb9\x93\x4c\x6b\xc0\x4d\xc5\x0a\x7b\xe8\xab\x9c\x4d\xc0\xdf\x9f\x89\xf1\x7c\xeb\x27\x29\x1e\x36\x44\x9d\xc7\x36\xe2\x72\x00\x64\x20\x19\x0c\xc9\x90\x61\x18\x27\x06\x56\x76\x6c\xc1\x25\x6a\xad\x00\x4a\x19\x7d\x57\x70\x2f\xcb\xfa\x75\xf5\xc8\xdf\xdc\xc2\xb4\xcc\x79\x44\x4b\xb5\x6c\x31\xc3\x94\x0d\xc9\x08\x03\x33\x9d\xb4\xf8\xfb\x57\x7f\xfc\x86\x0c\xa6\x86\xa5\xa1\x64\xa5\x85\xa6\x49\xf8\xc8\x04\xf8\xc8\xc0\xca\x1e\xcf\x6a\x8e\x64\x80\x00\x76\xf3\xb0\x0b\x7f\xfd\xd5\xed\xa0\xca\x63\x8f\x62\x98\x1c\x95\xe0\xd7\x4d\xc4\x68\x51\x7f\x94\xed\x43\xb6\xb7\x54\x89\x16\xa0\x99\x48\x58\x34\xad\x8d\x68\xbe\xf2\x17\x19\x8b\x3b\x2b\xeb\x2f\xc0\x9e\x22\xdd\x2a\x13\x59\x9e\x58\xa3\xf3\x77\x21\xbb\x38\x57\x30\x9f\x03\xb8\xf0\x5c\xa0\x99\xd4\x4d\x31\x5b\x37\xdd\xc6\xe3\xfa\x57\x0a\x97\x5b\xe2\x0c\x79\xa1\x00\x18\x2a\x42\xdf\xd1\x24\x19\xd0\xe8\xf6\x46\xbc\x11\x23\xf5\x8e\x9f\x4b\x29\x64\x75\x2d\x09\x35\xd4\x72\x9c\xf3\x5b\xdb\xc1\x21\x94\x48\x10\x23\x23\x5a\x65\xb9\xf6\x89\x0c\x8b\x3e\xd8\xe6\xcb\x7b\x22\xec\xd5\xa0\x62\x16\xb8\x67\x85\xae\xe3\x52\xb5\x2c\x46\x96\xe7\x57\x65\x64\xfb\xea\xd5\xef\xff\x60\x51\x97\x08\x49\xfe\xf0\x0a\x63\xb6\x55\xc7\x1e\x62\xa4\x6d\x86\x51\xa4\x34\x49\x8c\xda\x50\x46\x4a\x03\xe8\x45\x48\xf8\xc9\x71\x50\xd7\x47\xb7\xb5\x45\xa9\x9b\x9b\xbf\xa3\x1c\xc5\xb4\x82\x64\xd8\xb1\x59\x49\x41\xad\xd9\x47\xc6\xb0\xef\xa8\x0f\xa6\x86\xed\x80\x00\x34\x11\x49\x9e\xc2\x19\x4c\x58\x13\x4d\x9c\x2a\xb3\x79\x55\x3f\x61\x0a\x13\xc0\x06\x89\x88\x6e\x49\xec\x2e\x96\x22\x4f\x66\x2b\x81\x6f\x0f\x85\x6d\x63\x70\x6a\xc4\xde\x2c\xfd\xfe\x4a\xd4\x4d\x4a\xb3\x2c\xe4\x08\x49\x7a\x57\x01\x06\x9e\x49\x2c\x57\x50\xb3\x9e\x4c\x6d\x33\x73\x5d\x23\x73\xd7\x7d\x91\xa1\x9b\x5b\x4f\xb1\x75\xd4\x49\x7d\x1b\x75\xb1\xfa\xed\x0d\x93\x15\x84\x28\x26\xf4\xa7\x21\xc3\x7f\xdb\xac\x92\xb9\xac\xc8\x90\x58\x17\x10\xc3\x0a\x00\x06\x7d\x90\x24\x6f\x6f\x70\x6d\xc0\xba\x59\x2f\xe4\xa8\x02\x17\x1e\xac\xca\x29\xd5\x4e\x20\xf4\xe6\x6b\x4a\x32\x90\x8a\x29\xc3\x97\x7f\xc6\x03\x75\x9a\x50\x96\x96\x4c\x80\x4f\x03\x04\x7b\xb8\xb1\x7c\x72\x7d\x4a\xd9\x17\xb1\x9b\x10\x49\xa1\x2d\x1d\xbd\x40\xac\xad\x4a\xb5\x0d\x32\xd4\xa7\x26\x95\x3f\x17\xd0\xac\x52\x4a\xf3\x4b\x20\x95\xf6\xae\x97\x44\x20\xf1\xfb\x9e\x2b\x7d\x0c\x8b\x6f\x88\x0c\x20\x61\x74\x9b\x5b\xa5\x84\x15\xe5\xd1\x1e\x94\x92\x48\xef\xf4\xc0\x1e\xb1\x5e\x70\x73\x26\xdc\xa3\x64\xff\x78\xff\x49\x89\xa4\x05\x91\x14\x19\x1d\xd5\xea\xe5\x33\x03\xa9\xd9\x69\xcb\x85\x26\x8c\x1a\x84\xd7\x43\xd9\x35\xbc\x0b\xe2\xa2\x8e\x0e\x56\x49\xb2\xde\x51\x0f\x60\xa7\x20\xd8\x7c\xec\x3b\x3a\x25\x54\x8a\x9c\xc7\xce\xbe\x14\x0c\x7c\x6f\x67\x5e\x7c\x29\x38\x78\xc3\xf9\x6c\x9d\x0a\xb4\xe8\x33\x4e\x5e\xf7\x5e\xbf\x7a\x29\x9c\x0a\xbf\x70\x86\x53\x5d\x06\x4e\x65\xe9\xd3\x93\x7e\xab\xaf\x78\xdf\xd0\xf7\xbe\x75\x26\x96\xa2\xa0\x3d\xf3\xe5\xb2\xf1\xa7\x3b\xc9\x34\x94\x7a\xfc\x1d\xa0\xe2\x62\xf4\xc3\x52\x55\x86\xc3\x45\x9d\x24\x6a\x02\xa9\x5e\x19\x0c\x95\x0f\x1e\x91\x6e\x39\x02\x85\xc7\x6d\x91\x85\x4b\xad\x20\x61\x65\x40\xed\xed\x91\x03\x7b\xe7\xbe\x4d\x68\x3e\x7c\x52\xd4\x72\x40\x3b\xbf\xcf\x6a\xd4\xd8\x9c\xc9\x9d\xcf\x28\xda\xe0\xb2\x06\x21\xf8\x57\x18\xd3\x09\x60\x22\x37\x4b\xa8\x4c\xd0\xe7\x78\x6d\xd7\x4e\x06\xb9\x26\xc0\x27\x4c\x0a\x9e\x02\xd7\x64\x42\x25\xc3\xaa\x38\x12\xb0\xb2\x83\xd1\x45\xbf\x38\xf8\xf9\xe4\x0a\x03\x1a\x0e\x5d\x49\x0a\xb7\xca\x5c\xf9\xf2\x35\xe5\x95\x94\xa6\x7b\x70\xfb\xfc\x3a\x0c\x0c\x91\xe6\xfa\x75\x99\xf7\xa4\xb9\xce\x6d\x5b\x96\xfb\x28\xc9\x15\x9b\x3c\x15\x25\x71\x19\xf6\x67\x6c\xab\x7d\x9e\xc9\xf6\x2f\x00\x35\x97\xb8\x8f\xa6\xf5\x05\x09\x7a\x73\x0e\x93\x7d\x15\x92\xf6\xca\x3e\x70\x67\x7a\x72\xb5\x34\x6c\xf8\x9c\xaf\xb8\x38\x27\x42\x60\xdd\x98\xa7\x35\x42\xc5\x5c\x9d\xe2\x0a\x37\x03\x6b\x35\x20\xb9\x92\xc7\x77\x76\x79\x5d\x2e\x42\x62\xd5\x25\x11\xf7\x48\xbf\xf8\xb1\xa8\x54\x83\xf5\xd3\x82\x12\x09\x72\x54\x14\x15\x1f\x01\x07\x89\x42\x82\x99\xb2\xd2\x56\x95\x0c\xa8\xb2\x4e\x9e\xb3\xcb\x6b\x6b\xb3\xdd\x0c\x66\x5b\x8b\xd9\xdb\x4b\xa8\x86\xe3\xdb\x34\x86\x2d\x84\xdb\x6a\xcf\xb4\x60\xb0\x32\x80\x41\xa5\xd4\x4e\x4c\x2e\xfa\x84\xc6\xb1\x44\xb7\x8f\x13\x7d\x4a\x95\x2a\x83\x6f\x01\xab\xc2\x50\x05\xe5\x35\x95\xc0\x8d\x24\xae\x00\x2c\x39\xcb\xb3\x84\x59\x37\x42\xf9\x81\xa2\x9a\x0d\x36\xf9\xda\x1c\x69\xeb\xa8\x79\x5b\x2b\x79\x35\xa8\x90\xd8\xb6\x28\xe5\x8a\xdd\x93\xa0\x44\x32\x29\x0a\x0a\xcf\xec\x9a\x3b\x11\x68\x12\x0f\xbb\xe6\x6b\x50\xae\xb5\x63\xc0\xb5\x34\x47\x73\x76\xb7\xb0\x8b\x7d\x92\xe3\x69\x0a\x13\xb2\x09\xa0\x7f\xdc\x95\xdf\x74\x65\xdc\x8a\x12\xc7\xd6\x37\x6c\xab\x4c\x03\x95\x9e\xa2\xe1\xaa\xb6\x3c\x89\xe4\xa9\x10\x61\xd6\xd8\x71\x76\x79\x6d\x29\xa1\xfd\xf8\xd0\x9d\x76\xd1\x2e\x15\x54\x6d\x6b\x0c\x7c\xb2\x2a\x43\x75\x34\x8f\x99\xe6\x7e\xae\x5d\x77\xad\x40\x96\x1a\xe2\x5f\xad\x64\xbb\x1a\x6f\x57\x40\x65\x34\xde\x06\xfe\x2b\x08\x81\x9d\x94\xc4\xc2\x46\x02\x0c\x85\x44\x95\xb8\x8b\xe4\x3d\x11\xe2\x36\xcf\xd6\xa1\xe8\x6e\x1a\xdb\x70\x6d\x2d\x02\x51\x79\xe2\xb3\xa2\xe9\x31\x57\xdb\xf8\x7b\xab\xb2\x0f\x68\x2b\xf1\xe0\x44\x45\x02\x85\x98\xd5\x9b\x4e\x93\x5c\x69\x90\xdf\x31\xa9\xf4\x9e\xaf\x17\x8d\x18\x6c\x6d\x22\xfb\xe5\x1b\xfe\xc6\xf4\xd8\x95\x6e\xdc\xef\x54\x2f\x99\xbf\xdd\xc4\xfb\x46\xa7\xdd\xbf\x14\x1c\xf6\x7b\xb3\x62\x57\x20\xe5\x81\xac\x2d\xe5\x29\x6e\xe9\x0a\x12\x1b\x2f\x8a\x17\x4a\xb8\x72\xe3\xca\x56\x9a\x37\x78\xfa\xa7\x40\x13\x8a\x25\xe2\xf0\xee\x71\x51\x66\xd2\xd6\x8d\xb2\x75\x32\x85\x13\xf4\xa6\x65\x10\x95\x4a\x49\x69\xb1\xfc\xb3\xb7\x91\xe7\x36\xc6\x00\x5b\x7e\xd4\xd5\x0b\x79\xc3\xf8\xed\x86\xe8\x57\x8d\x2e\x39\x9f\x9b\xad\x52\x4f\xdc\xfa\x68\x19\xb7\xc1\x77\x86\xc5\xd0\x81\xc8\xb5\xaf\x49\xa2\x4a\x8a\x23\xe3\xff\xb4\x7b\x81\xf6\xf6\xcc\x56\xec\x5b\xa4\x23\xaa\x8e\x35\xfa\x78\x25\x50\x4d\xb9\xa6\x58\x5b\xf4\x4c\x44\xb7\x20\x49\x62\x96\xd1\x23\x45\xe0\x4b\xa5\x9a\xa5\xcc\x61\xc3\xa8\x8b\x6d\x2d\x1d\x90\x8d\x21\x05\x49\x93\xa2\xa8\x6b\x0d\x50\xbf\x71\x84\x33\xcc\x5a\x8e\x49\xb1\x45\xd1\x5c\x19\x46\x73\x0e\xcf\x17\xdd\x95\xd2\xa9\xaf\x74\xcb\x38\x86\x1b\xdc\x33\x85\x66\xfd\x4c\xc4\xe5\xc4\xb3\x5c\x81\xec\x86\xb4\x40\x97\x7b\xa3\x42\x20\x4e\x0c\x83\x7c\x34\x62\x7c\xe4\xa8\x33\xd2\xf4\x52\xb9\xed\xa0\xe9\x60\xa4\x77\x24\xc1\x16\x9c\x45\xe9\xc1\xc6\x97\xb1\xf2\xfd\xa9\x88\xed\xed\x83\xa9\xd5\x06\xfd\xce\x16\x01\xd2\x17\x9c\x08\xe9\x4a\x23\xd0\x38\xc6\xb5\xcf\x7f\x21\x5e\xad\x7e\x55\x27\xc4\x71\xd8\xc8\xee\xf0\x54\x09\x2c\x2a\x1f\x18\x61\x27\x97\x11\x2c\xb2\x9d\x96\x4a\xfc\xd2\x09\x65\x09\xda\x29\x04\x27\x91\x3d\xc5\x2e\xd6\xcc\x9c\x7e\xbe\x8f\x51\x70\xd8\xac\x13\xdf\x79\x3e\x8f\x01\x35\x4a\x54\x6d\xcb\x67\xb6\xe2\x31\xd5\xf2\x42\x27\x7c\xc1\xb7\xd8\x80\x71\x0d\x69\x26\x24\x95\xd3\x59\x8f\xa9\xa1\x89\x06\xe3\xcc\x7e\xcd\x6c\x4c\x5f\xc4\xc8\x36\x16\xe0\xd9\xc4\x36\x0e\x5e\x80\x6a\x0b\x51\x1a\x89\x2e\x17\xc4\x6f\xa0\x61\x0f\x2a\x1a\x43\x9c\x63\xb0\xfa\x28\xa7\xd8\xd8\xdc\x10\x0d\x67\x5b\x9f\xba\x28\x40\x8b\x7b\x21\xbe\x30\x64\x25\x4c\x31\x26\x07\x8b\x7e\x9a\x5f\xb0\x78\xa8\x8d\x44\xb4\x7d\x9d\xb1\xc7\x6b\x08\x4a\xbc\x29\x5a\x4d\xe0\xc7\xc2\x84\x45\xda\x3f\x34\x5c\x86\xa7\x11\x0d\xed\x64\xfb\xc2\x15\x1b\x8c\xc0\xd0\x3e\xad\x8a\x4f\x71\x41\x2c\x58\x4e\xf4\x03\x37\x3c\x69\x39\xea\x17\x78\xfe\x00\x86\xa3\x18\x5f\xdd\x8a\x15\xd4\x22\x40\x69\xd1\xb7\x9b\x35\xcd\xe4\x0d\x38\xdc\x6e\xfc\x9c\x6c\x5a\x07\xaa\x86\xbe\xb1\xbd\x33\x71\x2b\x27\x60\x1d\xd5\x86\xca\x51\x7d\x35\x70\xff\x44\x8e\xf2\xd4\x96\x27\x17\x33\x15\xa2\x2d\x7e\xa3\xc9\xce\x70\xe3\xd3\xb7\x67\xe5\xec\x8c\x72\xd8\xb9\xcf\x6d\x31\x52\x5e\x4d\x53\xee\xac\x2d\xf7\xc2\xe8\x9d\xc1\x40\x5c\xb0\x0d\xa7\xa0\x3a\x63\x65\x78\x9b\x57\xd0\x19\xcf\x8c\xa0\x81\xe2\x51\x61\xae\xe4\xd1\x98\xf2\x11\x5a\xf8\x45\x6e\xe6\xfb\xe2\x0b\x5c\x91\x84\x38\x8f\x5c\x4b\x0c\x1f\xda\xfd\x85\x37\x6c\xba\xea\x44\xd8\x99\x4f\x45\x34\xf3\x6b\x2e\x7f\x96\x95\x42\x8e\x09\xeb\x41\x8f\xec\x7d\x51\xba\xb4\x67\xdf\x9e\x49\x61\x5e\xe1\xa2\xc2\x71\x55\x09\xd3\x78\xe8\xf6\xca\x77\xf7\xc8\xb9\x79\x07\x3a\x7b\x02\x00\x4b\x81\xcb\x83\x02\x7c\x1d\x22\x61\x44\x65\x9c\x60\x32\xe1\x30\xc8\x5b\x36\xe5\xc8\x01\x0c\x4f\x3a\x86\x0a\x72\xa1\x17\x19\x5e\xd7\xcc\xf8\xd0\x54\xdd\xaa\x23\x2b\xa5\x75\x63\xaa\x69\x17\xdb\x88\x58\x02\x75\x64\x2d\x07\x5d\x57\xc0\xb5\x4b\x1d\x4e\x75\xc3\xb6\x1e\xfd\xd6\x25\x8d\x75\x69\xb8\x8b\xf1\x2e\xed\x62\x29\xd5\xed\xc3\x60\x9f\x20\x62\xa2\x96\x12\x5f\xa3\x8e\xef\xac\xe4\x1d\xea\xb8\x23\x0c\xb0\x0b\x4a\x51\xb7\x3b\x04\x67\xb8\x52\xb5\x95\x83\x7c\x7e\x79\x73\xf5\xf7\xfe\xbb\x8b\xcb\x9b\xf6\x3c\xb7\xe7\xb9\x3d\xcf\x35\xce\x33\xf0\x49\xed\xb3\x1c\x54\xbb\x45\xda\xee\x4c\xdd\xbc\x52\xb2\xf8\x0b\x8a\x3b\x3b\xe7\x93\x9f\xa9\x11\x2e\x33\x09\x0a\x65\x11\x23\xa3\x2e\x72\x10\xbb\x1b\x6c\x23\xb1\xd3\x67\x1f\x78\xf6\x84\x61\x63\x0d\x86\xe3\x5c\x96\x6a\x1c\x2c\xda\xb5\x72\xe7\xbe\xd3\x5f\x2e\xce\xce\x2f\x6f\x2e\xbe\xbb\x38\xbf\x7a\xd2\x38\x8a\x9a\x75\xeb\xaa\xdc\x78\x4b\x2e\x99\x49\x98\x30\x91\xab\x64\x1a\x4a\xdf\x2e\x26\x02\xf3\xa1\x78\xdc\xa8\x82\xd3\x50\xdd\x77\xe1\x63\x2d\xb3\x6d\x96\xd9\x56\xc3\x4a\x6a\x94\x2c\x69\x0a\x7d\xbf\x93\x22\x6d\x08\x85\xaf\xad\x79\xc0\x5b\xf3\x17\xe1\xd3\xbe\xab\x6e\x50\x61\x3d\x4e\x78\x2c\x4a\x29\x18\x29\x34\xcd\x74\x8d\xbe\x06\x8d\x54\x2a\x6d\xa6\xa8\xa7\x0d\xc1\x78\x4b\xb3\x1f\x61\x7a\x05\x35\x2b\xa3\xcc\x78\x51\x12\x88\x0c\xa3\x23\xb7\x30\xb5\xce\xd5\x53\xff\xb2\x3a\x15\x5c\x76\xb2\xd0\xeb\x2d\xd4\x29\xc2\xdb\x64\x85\xd6\x5b\xa8\x11\x93\xe9\xc7\x5c\xad\x52\xb3\x85\x28\xa7\x99\x3d\xad\xb7\x7b\xa4\xd9\xea\xac\x8f\x50\x91\x76\xbf\xcc\xee\x1d\x9d\xd5\x1b\x17\x8e\x10\x13\xc3\xb9\xe0\xee\xc8\xc5\xa3\x75\x8d\xc6\xda\xb5\x58\xab\x8e\x30\xe8\xe6\xe8\xb7\xf8\x1f\x72\xf3\xee\xec\xdd\x31\x39\x89\x63\x17\x17\x9d\x2b\x18\xe6\x89\xb5\xd2\xab\x1e\xa1\x19\xfb\x19\xa4\xc2\xc6\x70\xb7\x8c\xc7\x1d\x92\xb3\xf8\xdb\x3a\xf5\xa4\xec\x68\x70\x17\x84\xf7\x45\x35\xbb\x13\xd7\xce\xd5\x58\xe6\x5d\x81\x88\x10\x9b\xf4\x88\xb8\xe9\x4b\xcb\x38\x21\xa3\x21\xd0\xd4\xed\x81\x47\xec\x16\x36\x4b\x57\xf7\x0b\xc2\x6a\xdd\x38\xa1\xf6\x56\x7c\x4c\x54\x8e\x35\x70\x54\x68\x5c\x87\xad\x60\x3b\xd5\x3f\x55\x46\x23\xe8\x90\x7f\x84\x1f\xb1\xd5\xbc\x7a\xbf\xbf\xff\xa7\x1f\xcf\xff\xfe\x97\xfd\xfd\x8f\xff\x28\x5f\x45\x56\x88\x5a\xf3\xcc\x2d\xe8\xba\xe2\x22\x86\x4b\x7c\x07\xfe\xe9\xc4\xb5\x93\x28\x12\x39\xd7\xee\x02\x26\x2c\xf7\xc6\x42\xe9\x8b\x7e\xf8\x33\x13\xf1\xec\x5f\xaa\x56\x91\xb4\x9d\x64\x0c\xb8\x45\x35\x12\x6f\xec\x68\x8e\x3d\x14\xb4\xa4\xe1\xa3\xea\x66\x0d\x4d\x39\xa2\x31\xa4\xb6\x4c\xd3\x77\x1e\x04\xd8\x5c\xd7\x57\x46\xe0\x98\x4e\x6e\x24\xd3\x6a\xc5\xbc\xbd\xc9\xeb\x5a\x5d\xc8\xed\x68\x90\xb4\x85\x1d\x6c\x18\x60\x08\x11\x07\x2d\x7b\x90\x03\x83\xf5\x5a\x4a\xe1\x68\x3e\xe9\x5f\x90\x89\x85\xf0\xce\x00\xc7\x7b\xdc\xbe\x7b\x54\x1a\x57\xf6\xeb\x55\x34\xc4\x63\xdb\x8b\xd6\x5f\x77\x25\x04\x54\xa8\xea\x05\x46\xb1\x39\xb0\x3f\xf6\xa2\x2c\xef\xb8\x1b\x7a\x29\xa4\x42\x4e\xc3\x9f\xc1\x9f\xd8\x55\x5a\x48\x3a\xc2\x94\x13\xfb\xb8\x7d\x2c\xfc\x65\x1f\xac\xbc\x60\xfe\x69\xab\x0a\x47\xb9\x34\x42\x43\x32\xf5\x14\x79\xcb\x52\x18\xc5\xd8\x41\xda\xe6\x41\xbf\x23\xa4\x2d\x60\x46\xdd\x8e\xb3\x76\x54\x11\xb2\x08\x0a\x40\x81\x33\x40\x11\xf5\x49\x97\x52\xdb\x09\x62\x90\xb5\x06\xf0\x89\xd1\x2c\xb7\x2e\x0a\x56\x8c\x06\xa9\x59\xcc\x26\x4c\x89\x1a\x89\x35\x61\xa2\xe5\xd9\x02\xae\xaa\x87\x8d\x89\x0a\x66\xb3\xfb\x0c\xeb\x20\x85\xf3\x3a\x43\xf6\x5f\xd7\x69\x85\x64\x47\x46\xb5\x06\xc9\x8f\xc9\x7f\x1d\x7c\xf8\xf2\xd7\xee\xe1\xb7\x07\x07\xef\x5f\x75\xff\xf8\xf1\xcb\x83\x0f\x3d\xfc\xc7\xef\x0e\xbf\x3d\xfc\xd5\xff\xf1\xe5\xe1\xe1\xc1\xc1\xfb\x1f\xdf\x7e\x7f\xd3\x3f\xff\xc8\x0e\x7f\x7d\xcf\xf3\xf4\xd6\xfe\xf5\xeb\xc1\x7b\x38\xff\xb8\xe6\x24\x87\x87\xdf\x7e\x51\x7b\xe9\x0d\x94\x25\xb5\xa3\xc9\xe2\xa4\xd5\x19\x1b\x41\xbf\x47\xac\xc8\x6f\x87\x47\xaf\xa6\xcf\xbf\x0f\x8c\x3e\x2e\x18\x52\x60\xd7\x3b\x73\xc0\x15\x44\x12\xf4\xa7\xb0\xe4\xd8\x37\x95\x8a\x23\xec\x2b\x12\x54\x8b\x97\xc6\xe7\x3e\x07\xe3\x4e\xe8\xa5\x87\xfb\x5a\x48\xa2\x43\x29\x52\x9f\xf0\x8e\xee\x0d\x6c\xb0\xef\xef\xbb\x85\x5a\xdd\x5d\xed\x68\x8d\x41\xad\x31\x68\xc9\x78\xd0\x18\x74\x6d\xf1\x70\x67\x2d\x41\xc0\x27\xdb\xba\x30\x16\x7a\xd0\xbd\xae\x53\xae\x0e\xb7\x9e\x43\xad\xe7\x8f\x7a\xd1\x84\xb2\x08\xa1\xb1\x0c\x2d\x5d\xec\xc3\x24\x27\xd8\x6c\xda\x1e\x7c\x9c\xa0\xc8\x28\xb1\xaa\x8d\x2b\x5e\x08\x13\xb3\x84\x50\xfd\xba\x52\xe7\x12\x83\x2a\x31\xcc\xf5\x6f\x36\xea\xf4\xd6\x06\xa2\x1a\x25\x8d\xf1\xa2\x42\x68\x10\x0e\x8b\xb2\xd2\x54\x29\x11\xd9\x00\xda\x90\xdf\x80\x45\xeb\xdc\xb2\x71\x35\xd8\xe1\x3e\x93\x10\x41\x0c\x3c\x02\x57\x72\xba\xd2\x70\x93\x72\x72\xce\x27\xbe\xec\x76\xec\xb3\x65\x70\x25\x8b\xe7\x78\x59\x01\x08\x06\x11\x9d\x13\xac\x14\x87\x80\x54\xbf\x88\x9c\xc5\x50\x0c\x31\x2c\xac\xac\xdb\xf5\xe4\xab\xcd\xc5\xeb\xf3\xcc\xe0\xd9\xaa\x25\x0c\xcd\x31\xcb\xc2\xfc\x5c\x65\x92\x2f\xc1\x19\x58\x9f\x7d\x7e\x76\xac\xb3\x21\xb6\xd9\x0c\xcb\xdc\xc0\x77\xd2\x24\x9b\x6c\xc2\x59\x92\x49\x18\xb2\xfb\x86\xce\xe9\x09\x2f\x2c\x31\x2c\x06\xae\xd9\x90\xd9\xec\x99\x4c\x42\x06\xdc\x66\x24\xd0\x68\x8c\xb4\xdf\x71\xca\xc2\x39\xbd\x8b\xc1\x3c\x56\xe0\x6e\x96\x94\x5d\x2f\x12\xf6\x5b\x3a\x46\x5a\x3a\xb6\xf5\xf8\x44\x74\xcc\x61\xee\xee\x10\x31\x8c\x3c\xaf\x1f\xf3\x7e\x5a\x2d\x23\x83\x88\xbc\x31\xa2\x15\x29\x4e\x47\x38\xcb\x56\x06\xe8\x5a\xf8\x80\xaf\xed\xe7\x49\xd2\x50\xe9\xed\xfd\x0b\x84\x46\x96\x27\x89\xcb\x38\xee\x91\x77\x1c\x8f\xe4\x09\xb6\x78\xe8\x90\x4b\x98\x80\xec\x90\x8b\xe1\xa5\xd0\x7d\x2b\xdb\x56\xc3\xd9\xec\x8d\x84\x0d\xc9\xb1\xd1\x9a\x94\x26\xda\x96\xd9\x2f\x15\x05\x12\xb2\x32\x41\x51\x6f\xac\x46\x18\xfa\xf2\x6d\xf9\xad\xcf\x05\xed\x3e\xd1\x36\x85\x3e\x26\x0d\xa8\xa7\x6e\x26\x1f\x20\x87\x41\x91\xce\x3b\xb2\x28\xa1\xf7\x19\xd6\xd8\xc8\x84\xd2\xd7\x46\x8b\x6d\xa6\xc7\x4d\xdf\x4f\x87\x6d\x23\x68\x92\x40\x5c\x69\x72\x64\x9b\x73\xd0\xaa\x16\x8d\xa9\xc6\xa1\x57\x04\x90\x31\xe5\x71\x02\x12\xeb\xbd\xab\xd9\xa2\x56\xac\x68\x70\x10\x5a\x52\xf8\x64\x50\x1a\x45\x42\xc6\xae\xb9\xac\x4b\xca\xc4\xc5\x84\xe3\x85\xb4\x36\xa5\x9c\x8e\x00\x2d\x0b\x73\x55\x83\xb1\x96\xb4\x2a\xf5\xb5\x18\x0b\x71\x4b\x22\x91\x66\x09\x1e\x80\x1a\xe7\xa3\x68\xab\x13\x50\xb4\x6b\x66\x57\x47\xa5\x8e\x3b\xf8\x43\xbd\x86\x3b\xb5\x84\x95\x26\x44\x15\xb8\x87\xa8\xb1\x96\x7c\xe7\xf7\x10\x95\x7a\x4a\x9a\x2d\x71\x4d\x25\xb5\x40\xdb\x46\xfd\x56\xc1\xb5\xcd\xf2\x4d\x99\xc2\x6b\x64\x99\x95\xc7\x4c\x0d\x39\x9c\xd3\x97\xcc\x76\xaf\xc0\xee\x03\x36\x83\x19\x33\xcf\x7c\x15\xed\xca\x61\xb0\x47\x6f\xae\xf0\x5c\x08\x36\xf6\x73\x61\x9e\xb5\x10\x9a\x1c\xec\x1f\xed\x1f\xce\xd9\xe8\x66\xea\x2e\xdf\x94\x9e\x64\x58\x68\x30\xc3\xaa\x7d\x10\xed\xc7\x1d\xc2\xb4\x27\xb6\xb6\xde\x01\xae\xca\xa5\xc3\x75\x88\x12\x44\x4b\x1a\x33\xa7\x05\xe1\xaf\xe6\x26\x2d\x73\x57\xec\xe0\x60\xff\xd7\xfd\x0e\x01\x1d\x1d\x92\x3b\xc1\xf7\x35\x2e\x1f\x2b\x83\xe4\xaa\x34\xd1\x54\xe4\xd8\x80\xcf\x82\x20\x94\xf9\x30\x14\x8b\x88\xdc\x76\xeb\x19\x53\xed\xd3\xf0\xce\xef\x99\xf6\x1d\x2a\xc4\x90\xbc\xb2\xcd\x82\x80\x3a\x2b\x61\xc2\x26\x70\x34\x06\x9a\xe8\xb1\x0d\xa4\xe0\x82\x77\x6d\xbf\x37\x43\x4a\xdc\x95\xba\x3e\x85\x7a\x26\xb7\xf2\xa8\x61\x7e\x9b\x5f\x50\x4d\xe9\xda\x10\xd1\xef\xb7\x6f\x42\x4b\xe6\xfa\x33\xdf\xdc\xf4\xbf\xaf\xb4\xa1\x45\x2a\xae\x75\xe6\xc3\x5b\x4a\x25\x33\x76\x80\x76\x34\xe3\xd0\xab\xd5\x8f\x96\x34\x48\xc2\xea\xf6\xa5\x25\xf3\xfd\xb6\x37\x6b\x48\x4b\xfe\x2e\x72\x6c\xa4\x47\x07\xc9\x94\xdc\x51\xae\x7d\x2a\xde\x9e\x99\x6a\xcf\x90\x27\x83\x0d\x3f\x00\x8d\x41\x2a\xa4\x1e\x40\xb7\x2e\x0d\xe6\x47\x63\x8e\xa6\xd2\xda\x9a\xe5\x03\xb9\xd2\x22\x25\x63\xf7\xd9\xd5\xf4\x44\x77\x32\x7a\x78\x7a\x7c\xee\x8f\x84\xcc\x52\x38\xf7\xcc\x8b\xa3\x5f\x73\x74\xc3\xc2\xbd\x52\x42\x3f\x2a\x83\xad\xdc\x68\x85\x71\x0b\x2c\xdb\x22\xb1\x21\x5a\xda\x40\x80\x00\x69\x30\x48\x80\xd4\x4b\x76\x9c\x9d\x08\x1d\x5f\xf5\xe3\xa1\x1a\x8b\x3b\x20\x8d\xf9\xd6\xc9\x22\x43\xa4\xc3\x19\x1b\x05\xdb\x10\x10\x1b\xf5\x68\x93\xfa\xe9\x94\xe5\xb1\x1a\x00\xcd\x6c\x3e\x69\x12\x02\x59\x03\xe1\xcf\xf3\xc1\xcf\x73\x8d\xc2\x91\x4c\xd8\x52\xb4\x3b\xc3\x65\xea\x76\x4d\x27\x8b\x73\x89\x25\xe1\xa1\xc9\xad\x7e\x16\x9d\xd3\x49\x73\x61\x8a\x4d\x07\x29\x36\x1a\xa2\xf8\xa8\x01\x8a\x98\x16\x51\x9b\x8a\x54\xed\xe3\x38\xa5\xc1\x00\xa3\xb7\x19\x8d\xd3\xc9\x7e\xce\xba\xe3\x1b\x71\x54\xcd\xa1\xe6\xa8\xed\xc4\x19\xd3\x51\x76\x2d\xa2\xdb\x06\xf5\x9a\x33\xc8\x24\x44\xd6\x4e\x76\x73\xda\xb7\xb3\x1b\xfd\xf2\xf2\xdd\x4d\x11\x8e\x8f\x31\x2b\x85\xe1\xf2\x07\x67\x49\x33\x3a\xe9\x2d\x64\x3a\xa8\xee\x03\x1a\xdd\xde\x51\x19\xa3\x65\x8b\x6a\x36\x60\x09\xd3\x53\x54\xce\x25\x60\xac\x3f\x17\x36\x28\xce\xd6\x7f\x14\xbe\x8b\x6b\x68\x31\x1e\x6c\x58\x68\x21\x73\xd1\x33\x43\xca\x8c\x3e\x1e\x5a\xf5\xda\xa8\x99\x28\x0b\x26\xbd\xb2\x65\xba\x55\xbe\xfc\xd8\x59\xe5\xab\xd4\x86\x76\x53\x3d\xac\x6e\xec\xde\x0e\xb3\x3a\xc7\xe2\x64\xe8\xb2\xd6\xb2\xba\x86\xe6\xdb\x5d\x56\x97\x49\xb8\xd6\x22\x6b\xc8\x4b\x62\x27\x5b\xe2\x23\x19\xc0\x50\x18\x22\xbc\xd4\xe9\x11\xe7\xe0\x4a\x73\x9e\xf4\x2f\x82\x55\x4b\x54\x1c\x1b\x36\x6a\xd1\xd7\xe3\x4c\xd8\x04\x38\x28\x75\x84\xee\x90\x3c\xb3\x5a\xab\x6f\xa8\xdb\x31\x5f\x07\x29\xae\xae\x53\x64\x02\xb8\x76\xbe\xf8\x23\xe8\xc8\x5a\x6e\x4b\x84\x1c\x3b\x85\xb9\xe5\xcf\xba\x51\x22\x49\xd5\xd8\xb6\xba\x85\x7b\xa6\x5d\xbb\xe6\xbe\x2d\x0f\x5c\xee\xb8\x3b\x92\x34\x02\x92\x81\x64\xc2\x30\xa3\x9c\xeb\x58\xdc\x71\x32\x80\x11\xe3\xca\x83\x02\x2b\x6e\x3a\x98\xa1\x3f\x86\xa9\x50\x32\xad\x47\xae\x2a\x05\x41\x5c\xaa\x4e\x24\x8a\xa3\xe9\xd6\x3c\xeb\x49\x42\x8e\x85\x70\xb2\x8d\x63\x02\x84\xcb\xbd\x74\x1e\x5a\xf2\x41\xce\xf1\xcd\x31\x24\x74\x6a\x23\x32\xb1\x0d\x36\xfb\x37\x48\x75\xd8\x80\xc7\xc9\x76\x83\xf2\xd7\x96\xae\x03\x4b\x9d\xd2\x68\x5c\xcf\x85\xdb\xba\xa8\xd6\x1c\xad\x8b\xaa\xce\x24\xad\x8b\xaa\x75\x51\x3d\x30\x5a\x17\x55\xeb\xa2\x9a\x19\x3b\xab\x25\xb5\x2e\xaa\xad\x47\xeb\xa2\x5a\x3d\x5a\x17\xd5\x1a\xa3\x75\x51\xad\x39\x5a\x17\x55\xeb\xa2\x6a\x5d\x54\xad\x8b\xea\x33\xb2\xdb\xf9\xd1\xba\xa8\xe6\x26\x69\x5d\x54\xad\x8b\x6a\xed\xb1\xb3\xca\x57\xeb\xa2\xb2\xa3\x75\x51\x55\xc7\xe7\xc5\xea\xbc\x83\xa7\x6f\x54\xbd\xfa\x3d\x86\x51\x61\x74\x34\xf6\x45\xa6\x3d\xd5\xb1\xff\x7f\x1a\xdb\xff\x8e\x38\x4a\x1a\xb0\xf7\xb7\xb6\xfe\x17\x67\xeb\x6f\xc6\x4e\xd6\x80\x8d\xac\x36\x4d\x76\x2e\xf0\x9b\xb1\x04\x35\x16\xc9\xd6\x88\x5e\x41\xf2\xb7\x8c\xb3\x34\x4f\x0d\xce\x29\x83\xcf\x6c\x12\x7c\xed\xaa\x68\xbc\x8c\x2e\x78\x6b\xae\x33\x37\xb2\x18\xb0\xf2\x26\x65\x89\xd9\x46\x4c\x94\x1c\xd3\x89\xc1\x75\x95\x47\x11\x00\xf6\xf5\x2a\xab\x12\x5f\xf7\xc2\x9b\x42\x1f\x87\xd7\xf5\xe8\x4d\x3d\x6e\x69\x6b\x63\xe2\x2c\x5f\x7f\xb5\xd5\x1c\x23\x99\x35\x43\x97\xbf\xbf\xea\x9f\x96\xe8\x32\xe5\x9e\x2c\x33\x3e\x11\xc9\xc4\x36\xb6\xc5\x9b\x8c\x54\xd4\x9b\x6b\x89\x19\x94\x08\x27\x7f\x2b\xdb\x81\xd9\x3c\x67\x9e\x0a\x29\xed\x7d\x1b\x48\xb1\x75\x77\xd8\x62\x34\x40\xf0\xeb\xeb\x0a\xb5\xf4\x84\x26\xf8\x4d\x5d\x51\xb8\x2a\xc7\x18\x81\xb7\x6a\xee\x19\x21\x5e\xd8\x72\xee\x6b\x0b\xbc\xb5\x29\x65\x7d\x21\xb4\xfe\xd1\x22\x58\x6f\x05\x3f\xbc\x31\x00\xef\xb9\x16\xe2\x9e\x9d\x97\xb5\x0d\xdf\xe2\x48\x0b\x92\x25\xb4\x68\x52\x84\x3b\xf0\x03\xf2\xa0\xd3\x31\x44\xb7\x57\xce\xe5\x79\xa0\x00\x42\xbc\xca\x88\xe9\x71\x3e\xe8\x45\x22\x3d\x32\x24\xc1\xfe\xdf\x20\x11\x83\xa3\x94\x2a\x0d\xf2\x28\x16\x91\x63\x71\xdd\xc8\xcc\xc2\xf8\xa8\x97\xc6\x87\xd8\xde\xf6\xa2\xda\x14\xb1\x54\x0a\xc1\xbc\xdf\x29\x83\x64\x00\x86\xba\x0a\x54\xf8\x4b\xf5\xd4\xcc\xf2\x36\x6e\x5c\x5b\x1e\xb5\x59\x52\x4d\x77\xf3\xa7\x77\x35\xb7\x94\x8b\x34\x60\xd9\x78\x6e\x2e\xe5\xc6\x42\x2b\x1a\x70\x25\xef\x90\x1b\x79\x67\x44\xe3\x5d\x71\x1d\xef\x60\xe9\xe3\x06\x3c\x9d\x4d\xb8\x8a\x9b\x73\x13\x3f\x42\x85\xe0\xc7\x71\x0f\x37\x68\x43\x6b\xc8\x2d\xfc\x29\x5c\xc2\x8d\x7c\x75\x5d\x57\xf0\xa7\x73\x03\x37\xf3\xb9\x4d\x2a\x02\xcf\xd5\xf5\xdb\x80\x2d\xbc\x49\x3b\x78\x63\x36\xf0\x47\x73\xf5\xd6\x77\xf3\xee\x80\x8b\xb7\x36\x90\x19\x67\x9a\xd1\xe4\x0c\x12\x3a\xbd\x86\x48\xf0\x78\x6b\x0e\x33\x53\x32\x32\x9c\x1f\x65\xa7\x75\x76\xaa\x6a\x46\xc3\x98\xba\xca\xd8\x46\xa3\xb2\x19\x1c\xde\x3f\xe1\x04\x0a\x74\x2d\xd8\x55\x6e\x53\x74\xee\x4e\xc8\xdb\x44\xd0\x58\x1d\x65\xc2\xfe\x5f\x91\xaf\x50\x4a\x54\xb0\xef\xaa\x97\xa9\xf0\xd4\x06\x31\x9b\xde\xd1\xe4\x26\xfe\x20\xee\x88\x18\x6a\xe0\xe4\x80\x71\xbf\x8f\x87\x25\x35\xb0\xb0\x4e\x06\xb4\x36\x57\x5f\xbf\xf2\x37\xbf\x3c\xb3\x23\x1a\x58\x95\x7a\x7c\x2b\xb0\x7b\xd1\xc3\x66\x60\x77\xe3\x30\x4f\xaa\xa6\x60\x6b\x1e\xae\xd2\x9b\xd7\x45\x6d\xdf\xd7\x38\x6f\x38\x6d\x94\xc7\xc4\xa5\x7c\xbd\xbc\x4d\xab\x1d\xc0\x52\x15\xfd\x42\xc0\xca\x43\x56\xe3\x9b\xd3\xbe\x35\x1a\xb7\xe6\x92\x5d\x31\x97\x3c\x51\x10\xc8\x0e\x0a\xba\xcf\x34\xf0\xa3\x15\x74\x37\x18\xa5\x24\xd0\xef\x25\x8d\xa0\xdf\xb8\x8c\xe0\x8f\x13\x89\x73\x49\x1d\x01\x0c\x22\x9f\x3f\x3c\x1c\x20\xb6\xa7\x29\x24\xce\x62\x4a\xea\x30\x4f\x92\x29\xc9\x33\xc1\xab\x69\xc6\xd6\xd7\x3e\x9b\xb5\x8a\x26\xf9\x05\x6f\x29\x04\xcb\x4c\x0a\xc7\x33\x65\xce\xb9\xa1\xc1\x45\x83\x2e\x14\x24\xb1\xaa\x31\xad\xe4\xc6\x2a\x36\x32\xcb\x37\xfc\x0f\xd3\x66\x8b\x48\xbf\xca\x84\xe6\xe9\xa1\x90\x11\x1b\x24\x53\x32\xa6\x49\xe8\xc6\x42\xc9\x2d\x4b\x12\x37\x4d\x8f\x5c\x83\xb6\x2e\x05\xcb\x3b\x13\xc1\x47\xb8\x38\xca\x7d\x17\x40\x88\xcc\xb3\x51\x02\x94\xe7\x99\x7d\x9f\xe1\xc4\x53\x91\x4b\xff\xbe\x5e\x70\x4c\x14\x5d\xf7\x59\xd2\x29\xf5\x1a\x5b\xb9\xb1\xa1\x3f\x4d\xae\x8c\x00\xf0\xce\x57\x71\xee\x94\xe7\x14\x13\x90\x92\xc5\xce\xce\x6f\x7f\xcb\xa4\x98\xb0\xd8\x7a\x37\x3c\xd8\xb0\xab\xb1\xed\x26\x13\xce\x33\x17\xbc\xcb\x61\x44\x51\x50\x71\xa7\xc8\xee\x99\x9d\xc7\x46\x10\xf0\x18\xfb\xcb\x18\x09\x5f\x64\x95\xbc\xf5\x09\xb3\x9d\x71\x4b\x90\x23\x07\x5c\x10\x81\x81\x9f\x39\x67\xda\x76\x5b\x1f\xe7\x9a\xc4\xe2\x8e\x1f\x6e\xe4\x75\x45\x47\xeb\xcd\x42\x00\x55\xdd\xaf\x8b\xe4\x1c\xfb\xbd\xab\xc1\xcb\x94\x33\x7d\x0e\x49\xce\x15\xd4\x64\xef\x8d\x09\x47\xdf\xfc\x7e\x3b\x1a\xc1\x52\x10\xb9\xfe\x24\xda\xdf\xdd\x98\x45\xe3\xb2\x30\xcb\x52\x50\x44\xe4\x33\x6a\xf1\x6b\xf7\xd8\xe2\x1d\x6a\x55\xc0\x45\x63\x5b\xc3\xee\x02\xeb\x97\x6b\x58\x3a\x1f\xbf\x57\x6a\xc8\x8c\xa1\xd9\x67\x97\xd7\xbf\xbc\x39\xf9\xeb\xf9\x1b\x77\x3e\x79\x99\xe9\xe7\x9c\xfd\x2b\x07\x42\x53\x61\x64\xe1\xa4\x1c\x06\xd8\x41\x8d\xbe\xf4\x03\x9e\xe4\x66\x03\x06\xb7\x64\xc8\xd8\x3d\xbe\x7e\x58\x24\xf6\xa0\x7f\xfc\xa8\xc8\xa7\xee\xaa\x55\x04\xb7\x18\xb9\xb1\xd4\x55\x8b\x12\x0e\xda\x9c\x3c\x2b\x51\xda\x2e\x6b\x8c\x8f\x92\xb2\x30\xb9\x1d\xb9\xaa\xab\x13\xd5\xd5\x88\xba\xc5\x17\xf4\xb7\x55\x8c\x1a\xe9\xee\x55\xac\xa1\xa1\x9e\x38\x05\xd5\xf6\x6a\x80\x6d\x5a\xec\xd5\x00\x2b\x7a\x5c\xf4\x09\x8d\x63\x89\x62\x0a\x9e\xfa\x74\xa6\x37\x66\x56\xc4\xd2\x74\xc8\x2b\xf2\x27\x72\x4f\xfe\x84\x6a\xc1\x37\x75\x3b\x08\xd5\x15\xd8\x9b\x08\x8d\x31\xda\xe8\x45\xbf\x21\x88\xff\x6d\x4c\x35\xce\x68\xa0\xaa\x05\x19\x30\x27\x86\xc2\xbd\x06\x69\xc4\x22\xb7\x13\x4f\xda\x7b\xc9\x2c\xf0\x13\xa2\x99\x35\x93\x5f\x0c\xab\xe1\x38\x9b\x21\x9a\x79\xdc\xe8\xf7\x97\x8e\x0a\x55\xfb\x9c\x14\xb3\xa5\x54\x47\xe3\x2a\x19\x33\x02\x86\xaa\x30\xa7\x58\x20\x19\xb7\x61\xb7\x63\x56\xc3\xe9\xbf\x3b\x68\x5c\xcf\x0f\x5c\xd9\xcf\x55\x3b\x35\xa3\xf8\x23\x9f\x77\x82\x41\xa9\x74\x52\x26\xe2\x1e\x39\xa7\xd1\x18\x97\x15\x97\x78\x86\xd1\x40\x70\xb2\x31\x9d\x98\x8d\x77\xcf\xda\xbe\x40\x28\xad\x04\xeb\x28\xe2\x92\x39\x4f\x11\xe5\xb6\x39\xe7\x10\xa4\xb4\x91\xd2\x83\xa9\x0f\x32\xab\xbd\x79\xb5\x4e\x52\x26\x85\x16\x91\xa8\xd1\x1e\x6a\x36\xfb\x02\xa7\x43\x20\xd8\xe8\x54\x6f\xde\xfd\xe9\xac\xdf\x21\x37\xa7\x7d\x6c\xea\x73\x7d\x7a\xd3\xaf\x4a\xd8\x7b\x37\xa7\xfd\xbd\x27\x05\x05\xf1\x66\x36\x34\xa8\x6e\x31\x49\xc5\x60\x92\x30\xa5\xbb\x29\xcd\xba\xb7\x30\xdd\x92\xa7\x36\xc1\xd7\xbb\x61\x87\x1b\xf9\x20\x0b\xe6\x94\x66\x1b\xcf\x26\x81\xc6\xac\x4d\xf3\x59\x7f\xb4\x69\x3e\x6b\x8e\x36\xcd\xa7\x4d\xf3\x99\x1f\x3b\x13\xcb\xd8\xa6\xf9\xbc\x2c\xd7\x6d\x9b\xe6\xf3\x99\x7b\x7f\xdb\x34\x9f\xc5\xa3\x4d\xf3\x69\xd3\x7c\xd6\x1b\x6d\x9a\xcf\xe6\x63\xe7\xe2\x56\xda\x34\x9f\x8d\x46\x9b\xe6\x33\x3f\xda\x34\x9f\x25\xa3\x4d\xf3\x59\x32\xda\x34\x9f\x36\xcd\xa7\x4d\xf3\x69\xa3\x1f\x1f\x9c\x6b\x37\xa3\x1f\x49\x9b\xe6\xe3\x46\x9b\xe6\xf3\x22\x62\xbc\x48\x9b\xe6\xb3\xd6\x68\xd3\x7c\xda\x34\x9f\x6d\x46\x9b\xe6\xf3\x52\xcc\x25\x6d\x9a\x4f\x9b\xe6\xf3\xf9\x08\xba\x6d\x9a\x4f\x9b\xe6\xd3\xa6\xf9\xb4\x69\x3e\x2b\x57\xd1\xa6\xf9\xbc\x04\x15\xd0\xf7\x5c\xad\x9f\xa3\x72\xe5\x67\x5a\x3f\xac\x8f\x9c\x2f\xf8\x15\x2d\x21\x2a\x33\x93\xc8\x62\xca\x44\x02\x8d\xa7\x38\x25\xf6\x79\x28\x09\x59\xcf\x30\x3a\x30\x61\x29\xdb\x2e\x2d\x88\xcc\x1d\x9a\x37\x38\x57\xc9\xeb\x62\xc0\x92\xd2\x7b\x3c\x00\x34\x15\xb9\x6d\xfd\x1a\x89\x34\xcb\x75\x15\xa6\xb8\x3d\xdb\x74\x6d\x1d\xb2\x91\xe3\xa8\x47\xb6\xc1\x6c\x37\x4c\xdb\x2d\x35\x75\x7d\xc2\x56\xad\x34\xf6\x51\x73\xfd\x26\x82\x46\xa8\xd6\x20\xf9\x31\xf9\xaf\x83\x0f\x5f\xfe\xda\x3d\xfc\xf6\xe0\xe0\xfd\xab\xee\x1f\x3f\x7e\x79\xf0\xa1\x87\xff\xf8\xdd\xe1\xb7\x87\xbf\xfa\x3f\xbe\x3c\x3c\x3c\x38\x78\xff\xe3\xdb\xef\x6f\xfa\xe7\x1f\xd9\xe1\xaf\xef\x79\x9e\xde\xda\xbf\x7e\x3d\x78\x0f\xe7\x1f\xd7\x9c\xe4\xf0\xf0\xdb\x2f\xb6\x5e\x72\x6d\x81\xb7\x39\x71\xb7\x21\x61\xf7\x51\x44\x5d\xe7\xae\x6d\xe8\x2c\xba\x50\x93\xb9\xd3\xe8\xd8\xd1\xaa\xd3\xe8\x35\x6e\x14\xe2\xc2\x3c\x4c\x11\x91\x32\xad\x1d\x15\xa5\xe5\x60\x55\xa6\x2b\x2a\xa7\xa3\x03\xd8\x10\x9b\x6a\xdb\xa8\x3a\x04\x7a\x96\x42\x54\x84\x97\xeb\x5c\x27\x6f\x96\x66\x09\x36\x88\xc6\xf3\xdc\xf5\x91\x2a\xc8\x3a\x5b\xda\xf0\xf0\x68\x69\xc3\x4b\xa4\x0d\x0a\xa2\x5c\x32\x3d\x3d\x15\x5c\xc3\xfd\x56\xf6\x93\x65\x06\xa4\xeb\xea\xd4\x2e\x36\x4c\xb9\x98\x36\x7b\x8d\x88\xcc\xc6\x77\x2f\xcd\x9c\x1e\x8b\x3c\x89\x31\x2f\x29\xe7\xa8\x52\xda\x14\x37\xd0\x56\xdf\x43\x4d\x07\x83\xb7\x67\x5f\xe7\x35\x38\x3b\xf5\xbf\x72\x36\xa1\x89\xd1\x6f\x8b\x27\xfa\xa8\xb3\x94\x1f\xda\xca\x88\xf5\xc4\x32\x16\x8a\x37\x7d\xc9\x26\x2c\x81\x11\x9c\xab\x88\x26\x48\x95\x9a\xa1\xf4\x27\x4b\x66\xc7\x2d\x92\x22\x51\xe4\x6e\x0c\xd8\x81\x9f\x7a\xf5\x1c\x13\xc9\x46\x94\x71\x92\x1a\xa2\x9a\xf9\x87\x95\xd5\xf3\x0d\xf1\x36\x52\x2f\xd7\x85\x3e\x8f\xea\xeb\x40\x88\xc4\x65\x23\x24\xd3\x62\x7e\x66\x4d\x6f\x5c\xfc\xc2\xe1\xee\x17\x33\x9b\x22\xc3\x84\x8e\x82\x1a\xaf\x40\xcf\x59\xe2\x8a\xa9\x97\x7e\x00\x86\xfa\xe7\x40\x68\x72\x47\xa7\xaa\x30\x6a\x14\x73\x30\x75\x4c\x5e\x1f\x22\xe2\x51\x45\xc2\x1c\x31\xf9\xea\x10\x5d\x73\xa7\x27\xfd\x5f\xae\xff\x7e\xfd\xcb\xc9\xd9\xdb\x8b\x4b\x72\x29\x34\x58\x96\x54\x6a\x92\x16\x51\x6e\x34\x04\xb7\x4a\x7c\x07\x6a\xd0\x42\xf5\xd0\xae\xc8\x14\xb9\x63\x3c\x16\x77\x6a\x6b\xfb\xa9\x45\x3f\x03\x3c\xa0\x7c\xab\x39\x22\x9a\x51\xec\xfd\x56\x83\x3f\xcc\x45\x7f\x94\x27\x45\x0e\x1c\xc7\x47\xb1\x14\x99\x05\x82\x37\x40\x95\x95\xa4\xb3\x19\xbb\xb2\x8f\x2f\xc5\xfd\x1d\x56\x27\x1c\x49\xca\x75\x61\x89\x29\xf6\xcc\x35\x9d\xeb\xd5\xde\x8e\xe7\x9d\x6d\x44\xe3\xe6\x32\x8d\x4e\xe2\x18\xe2\x0a\xf8\x5f\x5c\x54\xdf\xa9\xff\xb8\x69\x51\x8c\x81\xf4\xdf\x5d\x5f\xfc\x9f\x19\x3c\x9e\x66\xf5\x82\x98\x9a\x49\x00\x95\x22\x6b\x6c\x77\xaf\x20\x15\x93\x76\x7f\x77\x65\x7f\x03\xb7\x6c\xc6\x75\x7e\x95\xf3\x32\x43\xe3\xa5\xf9\x49\x2a\x62\xe8\x91\x7e\xb0\xe1\x57\xaf\x96\x8b\xcc\x48\x20\xe6\x16\xae\x19\x4d\x92\x69\x59\x98\xd2\xc2\x66\x08\x56\x4a\x10\x94\x09\xf9\x90\x26\xea\xa9\xa9\x71\x1d\xde\x68\xe4\x88\xb7\x46\x9b\x6d\x64\x3b\xc2\x6c\x24\x06\x2e\xb4\x13\x86\xcd\x2a\xb1\xac\x83\x14\x11\xb1\xaa\x73\x29\x50\xaa\xc2\xdf\x94\xf5\x23\x78\xd6\xc8\x94\x07\x76\x3f\xcc\x6c\x8d\xc8\xb9\x02\xb5\x98\x35\x16\xca\xb4\x99\x5d\x02\x8d\x05\x4f\xa6\x18\x15\x69\xe3\x1c\x52\xaa\x6e\x21\xb6\x3f\x38\xd1\x2c\x78\x11\xcc\x8c\xe1\x55\x37\x66\xdd\xde\x65\x80\x22\x99\x8d\xbe\x40\x57\x83\xd1\xf0\x9f\x74\xd7\x6b\x1c\x42\x03\x94\x77\x3c\x99\x5e\x09\xa1\xbf\x0b\x29\xae\x8d\x60\xc0\xdf\x9c\xb4\x8c\x00\xa9\x46\x7a\x51\x7c\x6f\x17\x77\x03\x0f\x55\x39\xbb\xf6\xac\xd8\xf1\xff\xc7\xde\xfb\x70\xb7\x6d\x23\xfd\xc2\x5f\x05\xc7\xbb\xe7\xda\xde\x4a\x4a\xd2\xee\xee\xd3\x27\xb7\xef\xf6\x78\x6d\xa7\xf5\x6d\xe2\xf8\xc6\x4e\xfb\xee\xdb\xf4\xd9\x85\x48\x48\xc2\x63\x12\x60\x09\xd0\x8e\xf6\xf6\x7e\xf7\xf7\x60\x66\x00\x82\x94\x9c\xd8\x24\x13\xd9\xae\xb8\xe7\x6c\x63\x89\x02\xc1\xc1\x60\x30\x7f\x7f\xf3\xd0\xb7\x54\x59\xa9\x03\xf3\x5d\xa9\xab\xce\x87\xd8\x8a\xb2\xf9\xdd\xc9\x11\x88\xa2\x8a\xc2\x88\xca\x96\xcb\x42\x4b\xf4\x41\xdd\x60\x18\xbc\xa5\x40\x68\xbc\x27\xea\x98\x15\x7b\xc5\x97\x8c\x67\x46\x7b\x5a\x4a\xb5\xce\x5e\x64\x64\x8c\xba\xaf\xa7\xda\x2e\x56\xac\x50\xb7\xa1\x56\x7f\x37\x8a\xa2\x8a\x35\x36\x98\x54\x2b\x3f\xb7\xfc\x52\x18\x56\x94\x22\x11\xa9\x50\xc9\xa6\x97\x7d\xd3\xc1\x38\x60\x9d\x53\xad\xdc\xc6\x1c\x84\x79\x4e\x42\x14\x96\x48\x1a\xb3\x0a\xc4\x73\xc9\xfa\xe3\x10\xd5\x85\x6d\x59\x19\x51\x62\x08\xba\xac\x04\xae\xe4\x0f\xd5\x54\x64\x8e\xf2\xce\x24\xa5\x8e\xd9\xe8\x78\x90\x39\x9f\x0b\xc6\x6d\xe0\x34\xab\x99\x50\xc6\x49\x4c\x74\x5f\x5a\x96\x6a\x51\x57\xc6\x73\xc3\xde\x9e\x1c\xb1\xa7\x6c\xcf\x3d\x6b\x1f\xf8\x07\x1a\x6a\x5b\x8d\x09\x68\x6d\x1b\x75\xe6\x87\x80\x29\x01\xf3\x32\x5d\xa2\x90\x18\x31\xa5\x99\xa9\x92\x45\xdc\xc5\xdb\x9b\xcd\x94\xa4\x08\x81\x91\xfb\xc9\xeb\x9b\x95\x50\x6f\x8d\x28\x07\x13\x50\x6f\x3b\x08\xa8\x58\x8d\x72\x3c\xd7\xa4\x1e\x32\x56\x2e\x2c\x4f\xb9\xe5\x24\xb8\x42\x57\xf5\xfb\xba\xa4\xbf\x6f\xf1\x65\xc4\x4b\xa9\xaa\xf7\xe8\x22\x1d\xce\xd5\x72\x7e\x0c\xc3\x02\x0f\x01\xd5\x61\xd5\x79\x51\x64\xb2\x0e\x20\x47\x49\x6a\x27\x0d\x5e\x19\xdd\xa0\x26\x82\x9c\xf0\x71\x68\xa7\x9c\x70\x95\xea\x7c\xe5\x61\x10\xf4\xe6\xc9\x22\x7e\xc0\x96\xfb\x9a\xd7\x3d\x71\x0a\x65\xe2\x4a\xf4\x80\xd0\x6a\x71\xde\x4b\x37\x9a\x23\x8e\xe7\x08\x18\x9e\x65\x7c\x2a\x32\xa4\x31\x72\xa0\x59\xe5\xc0\x4d\x67\x8a\x96\x3a\x1b\xae\xb4\xe5\x8d\xce\x04\xa6\x5e\x79\x42\xb8\xe1\x1f\x04\x1d\x60\x90\xa1\xe8\x00\xd6\x60\x83\x0e\x60\xd7\x3e\x04\x3a\x54\x3d\x8e\x7a\xd6\xa6\x83\xd3\x1b\x9a\x74\x80\xc3\xfb\xbe\xd3\xc1\x88\x24\xd1\x79\x71\x56\x6a\x67\x76\x0e\x76\x36\xd1\xb0\x75\x9c\x0f\x1d\x1b\xe0\xb7\x8f\x2d\x60\x8a\xea\x35\x6f\xe6\x65\x94\x74\xc9\x2d\x1e\x12\x3e\xf3\xf2\x7f\x44\x67\x16\x88\x9e\xf6\x41\xe6\x47\x69\x04\x02\xdd\x2f\xe9\x8b\x87\x7c\x1c\x0c\x51\xb7\xd0\xc3\xd9\x39\xc8\x69\xa4\x13\x9e\x01\x44\x6a\x3f\x96\x63\x6d\xb6\x6b\x0f\x1c\xa5\xda\x42\x8c\x12\x3e\xf3\xe9\x1f\x80\x96\x09\x9f\x90\x0b\x53\xe9\x54\x44\x51\x67\xcc\x11\xbe\xc0\x94\x4c\xb8\xcf\x67\xf9\x3a\xbd\x82\xb2\x40\x44\xda\xf8\xb5\xd5\x84\x4e\xf6\x2a\x00\xaf\xba\x09\x0a\x95\x4a\x35\x07\xbf\xda\x88\x95\x22\xc3\xfc\x60\x12\x02\x97\x68\x41\xee\xc2\x96\xf0\x83\xfa\xfd\xe0\x1f\x0d\xba\x98\xd4\x8a\x46\x06\x4f\x91\xd7\xb0\x66\x28\x6e\xa5\x61\x3b\x2f\x3d\x01\x7a\x20\x55\xde\xc7\x13\x66\x07\xdf\x30\xac\x26\x7a\x3a\x2f\xa5\x4a\x29\x95\xb6\x41\x2c\x6f\xe7\x92\x1e\x0c\x49\xda\x32\x8d\x65\xcb\x73\xf6\x4e\xb1\x40\x2c\x36\xee\xcc\x1e\x6f\x50\x65\xf6\x3e\xba\xf1\x87\x1d\xaf\xe1\x21\xed\x61\xde\x2a\x58\x7b\xf7\xdc\xb1\xb3\xdc\x57\xef\xf3\xef\xb2\x51\x58\x1d\x92\x7e\x43\x5b\x31\x3f\xe1\xb0\x5e\xa5\x4f\x1c\x5b\x5b\xa9\xe6\x26\xb6\x64\x9a\x78\xf8\xeb\x4d\x19\xbf\xc2\xb3\x52\x63\x09\xe6\xaa\x09\xd1\x2a\x01\x78\x28\x66\x48\xe6\xd4\x89\x07\x6e\x84\xcc\x73\xc3\x0f\x4b\x47\x09\x2b\x79\x76\x5e\x74\x87\x0f\x65\x2b\x50\x75\xaf\xce\x0f\x9a\x43\xc3\x61\xbd\x10\x25\x9e\xfd\xee\x7b\xc6\xd3\x5c\x1a\x03\x8e\x30\x31\x5d\x68\x7d\xc9\xf6\xd6\x60\x65\x45\x59\x56\x46\xce\xcd\x13\xe2\xf9\xb1\x9b\xfd\x3e\x93\x2a\x0b\x99\x4c\x60\x07\x2b\x6b\xbc\x23\x07\x1e\x92\x84\x59\xc0\x1a\x12\x3c\x33\x25\x2b\xac\x4e\x13\x01\x99\x1d\x17\x6c\x5c\x60\xaf\x2e\xcf\x69\x4f\x48\x94\x8f\x2c\xd1\x29\xf1\x76\x1b\xf5\x6c\x2d\x1d\x51\x7b\xdc\x38\x91\x48\xb9\x48\x84\x19\x0e\x6c\xe9\xfb\x7a\x4c\x96\x0a\xac\xb0\x11\x90\xfd\xc4\x6f\x4c\x87\x03\xbf\xf4\x2e\x14\x6a\xd2\x4f\x77\x63\x8d\xfa\xa2\x16\x2e\xce\x1e\xc9\x8a\x05\x1f\xa3\x91\xee\x24\x1a\x88\x40\xaf\x42\x2c\xb4\xd2\x25\xb2\xa8\x3b\x44\xb5\x02\x96\x06\x11\x85\xd1\x3c\x58\x13\x12\xd1\xd1\x54\x0f\xeb\x28\x71\x1c\x08\x84\x42\x2f\xc4\x76\xa8\xe7\x70\x2d\xed\x02\x30\x58\x17\xad\xa8\x21\xcc\xa4\x14\x06\x02\x30\x8a\x89\xb2\xd4\x25\x25\x64\x79\xbf\x35\x8c\x04\x92\x1c\x32\xba\x1c\x93\x70\xf7\xd7\xae\x89\x03\xd5\x35\xe2\x39\xe4\x18\x3a\x6e\x12\xb3\x99\x48\x40\xd1\x8a\x09\x8c\x52\x7b\xaf\x06\xa5\xf5\x25\x1c\x56\x7b\xc4\xf4\x5c\xbe\x77\x4f\x89\x7f\xd5\xea\xbb\xa2\xb4\x1a\xaf\xff\x7a\x7f\xc2\xd8\x89\x0a\xf9\xb7\x23\xb7\x8a\xf1\x9d\x3e\xf5\xcc\xba\x57\x8c\xe1\xf6\xe1\x05\x62\xc7\x99\xd3\x0e\xcb\x6a\x00\x8e\xef\xe3\x0e\x67\xb1\x4b\x7c\x50\x71\x00\xae\x71\x1a\xd4\x2d\xbd\xd7\x01\xfa\xb8\xca\xdd\x2d\x9f\xca\x5d\xfe\x30\x02\x20\xac\xaf\x9c\x23\xa4\x83\x2d\x06\xfa\xed\xae\x2d\x06\xfa\x2d\xaf\x2d\x06\xfa\x16\x03\x7d\xf5\xba\x37\x29\x83\x5b\x0c\xf4\xc7\x85\x6b\xb3\xc5\x40\xdf\xb4\x8b\x79\x8b\x81\xbe\xc5\x40\xff\xd0\xb5\xc5\x40\xff\xc8\xb5\xc5\x40\xef\x70\x3d\x02\xc9\xb5\xc5\x40\xef\x70\x6d\x31\xd0\xd7\x5f\x5b\x0c\xf4\xd5\x6b\x8b\x81\x7e\xe3\xb5\xc5\x40\xef\x7c\x6d\x31\xd0\xb7\x18\xe8\x5b\x68\xc8\xbb\x8d\x75\x3f\xa1\x21\xd9\x16\x03\x9d\xae\x2d\x06\xfa\xa3\x00\xc0\x63\x5b\x0c\xf4\x5b\x5d\x5b\x0c\xf4\x2d\x06\x7a\x97\x6b\x8b\x81\xfe\x58\xdc\x25\x5b\x0c\xf4\x2d\x06\xfa\xef\x47\xd1\xdd\x62\xa0\x6f\x31\xd0\xb7\x18\xe8\x5b\x0c\xf4\x0f\xce\x62\x8b\x81\xfe\x18\x4c\x40\x63\x53\xd9\x09\x16\xf2\x36\x08\x36\x94\x99\x1c\x15\x8c\x4f\xab\xd9\x4c\x94\x20\xb9\xe0\xc9\x2b\xc9\x53\x35\x58\x5f\x3b\xc8\x2a\xec\x08\xc0\x70\xa8\x88\xe3\x86\x9f\x53\x85\x3a\xc0\x37\xd6\xe9\xc3\xc7\xaf\x5f\xac\x81\xcb\xe9\x9c\x55\xd8\x35\x71\x16\xe6\xfc\x5a\x75\x8b\x8f\xdf\x40\xf0\x75\x45\x45\x44\xf7\x24\xd3\x86\xd2\x9e\x81\x58\xc9\x82\x2b\x25\xbc\xbd\x27\x2d\xf8\x51\xa6\x42\x28\xa6\x0b\x41\xd1\x69\xce\x8c\x54\xf3\x4c\x30\x6e\x2d\x4f\x16\x13\xf7\x24\xe5\x89\x5d\xa7\x28\xd3\x27\xc6\x96\x82\xe7\x3e\x59\x3b\xe7\x12\x87\x62\x3c\x29\xb5\x31\x2c\xaf\x32\x2b\x8b\x30\x18\x33\x02\xaa\x2c\xf0\xa0\x0a\xc4\x80\xac\xb8\x3a\xaf\x79\x54\x3f\x8d\xa6\xa5\x63\xbc\x32\xb0\x36\x47\x00\xf1\x9c\x17\x76\xc9\xdc\x2b\x67\x04\xfb\x5a\x1a\xcb\x92\x4c\xc2\x69\x0d\x4f\xc4\x82\x5a\x18\x6f\xe4\xcf\x6a\x45\x33\x35\x34\x55\x95\x82\xda\x5a\x58\xc3\x20\x0d\xb8\x1e\x90\x86\x4a\xa5\x21\x35\xdf\x8c\x18\xf7\x60\x5a\x48\x68\x3f\x53\x20\xb5\x3f\x59\x70\x74\xfa\x28\x1a\x2e\x02\x11\x75\xbc\x89\x0e\xac\x9a\xd1\x21\xef\xdd\x33\xe7\xa8\x91\xe2\x5f\x2b\x14\x90\xa5\xb7\xb2\x0d\x60\x01\x94\xb8\x72\x3c\x20\x12\xe1\xce\x57\x7e\x03\xd7\x7f\x76\xa6\xb7\xbc\x9c\x0b\x1b\xf2\x99\xba\xe6\x8a\x37\xd3\x42\x62\xb8\xdf\xd8\x10\xa9\x49\x06\xd4\x39\xd3\x29\x94\xfc\xd4\x75\x55\xeb\xf0\x84\x71\x86\x04\xa3\xb6\xee\x06\xaf\x18\x61\x8a\x66\x78\xa8\x29\x78\x22\x0c\xdb\x3b\x39\x3b\x1c\xb1\xb3\x93\x23\xca\xc3\xd4\xb3\x75\x75\xcc\x24\xc3\x90\x03\x6f\x42\x36\x0e\x08\x6d\xd1\xf0\x51\xed\x27\x3d\xfb\x2c\xe8\x57\xef\x14\xa5\x97\xb6\x25\x00\xa8\x5c\x01\xdd\x9c\x99\x0a\x54\x24\xf2\x09\xc9\x50\x98\x41\xcc\x27\xea\x72\x44\x8f\x3b\xe4\x7f\x11\x26\x42\x54\xa2\xaa\x0b\x1f\xeb\x06\x01\x0b\xe7\xf5\x4a\x69\x07\xa4\x82\x52\xde\x4b\xa7\x7c\x97\x5e\x16\x52\xa4\x8a\xbd\x12\xc6\xf0\xb9\x38\xeb\x18\xde\xba\xc9\x0f\x00\x11\xae\x5a\x1c\x80\x00\xca\xb0\xd0\x37\x7c\x52\xe7\x04\x37\x95\x6f\x96\xe3\x9c\x02\x67\x5d\x97\xd2\x5a\x01\xa2\x04\xc0\xfe\x60\xb1\xdb\x58\x00\xbb\xad\xcc\xe2\x57\x7e\x90\xfa\xc7\x4e\x95\x50\x29\xe6\xf9\x4e\x05\x9b\x96\x52\xcc\xd8\x4c\x42\xf2\x30\xa4\xf3\x8e\x10\xfb\x89\xa3\xef\xc9\x18\x51\xc2\x7c\xc8\x82\xf2\xf3\x9a\xb0\x9f\x68\x62\xb6\xac\x14\x36\x1d\x21\xe5\x1e\x8a\x5d\xe5\x8c\xcd\x21\x1d\x98\x6c\x94\x3f\x3f\xfd\xcf\xbf\xb2\xe9\xd2\x29\x52\xc0\x90\x56\x5b\x9e\x85\x97\xcc\x84\x9a\x3b\x5a\xe1\xa1\xd0\x2c\xd7\x0c\x14\x80\xb6\x20\x38\xf1\x67\x5f\x5e\x4e\x9b\x9a\xdd\x93\x54\x5c\x3d\x89\xe8\x37\xce\xf4\x7c\xc2\x0e\x43\x75\x64\x55\xa4\xe0\xe7\xef\x0e\xd5\x3d\x1c\x9b\xe9\x4c\x26\xcb\xde\x8c\xe6\x41\xc8\xd8\x42\x5f\xa3\x85\xb9\x86\x7b\xea\xca\xaf\x42\x17\x55\x86\xa1\x8e\x17\xa1\xd0\xb9\x32\x62\xb5\x1c\x71\xed\xbe\x00\xe7\x3c\x0d\xd1\x92\xa3\x94\x05\xee\x1f\xa9\xa9\xcc\x85\xdc\xc7\x01\x8b\x0c\x84\xc9\x0b\x9e\x65\x53\x9e\x5c\x5e\xe8\x97\x7a\x6e\x5e\xab\xe3\xb2\xd4\x65\x73\x2e\x19\x77\x67\xf4\xa2\x52\x97\xd8\x0a\x22\xa0\x35\xe8\xb9\x53\xe8\x8b\xca\x7a\x70\xef\x75\x2f\x8c\xa5\xfb\xfe\xe8\xf7\xc6\x77\x3d\x8a\x78\x2f\x6b\x0b\x9b\xaa\xc6\x90\x23\xe3\xf1\x4d\xcc\x6c\x5f\x3e\xfd\xf3\xd7\xc8\xba\x4c\x97\xec\xeb\xa7\x50\x29\x60\x46\xb8\x89\xe1\x44\x75\xea\x49\xce\xb3\xcc\x09\xf2\x98\x29\x1d\xa1\xd7\x31\xe1\x67\xe7\x41\xdb\x9f\xdd\x6e\xad\xc0\x5f\x5c\xfc\x03\x4e\x11\x69\x8d\xc8\x66\x23\x2c\x90\x0a\xc6\xf4\x2e\xa8\x23\xbb\x24\x7d\xa0\x4a\xed\x1e\xa8\xdd\x57\x3a\xab\x72\x71\x24\xae\xe4\x10\xbd\x9e\x1a\xa3\x79\x07\x53\x26\x0d\x9c\x83\xd3\x4c\x27\x97\x2c\xa5\x2f\xa3\x7c\xa7\x36\x28\x79\x77\x2a\x74\xcd\xfc\xea\x91\xf1\x75\xe3\xfb\x37\x72\xbd\x72\x5e\x14\x4e\x07\x80\x3a\xcc\x92\x5f\x37\x88\x01\x7b\x12\x90\x13\x7a\x42\xdb\xf4\x0e\x6e\xf4\x0d\x6d\x8c\xe9\x8d\x9c\xdc\xec\x3c\x44\xe7\x5c\xa7\xfe\x91\x91\x7a\xf6\xdd\xdd\xe1\x0d\x86\xa8\x07\xf4\xbb\xa1\x80\x7f\x63\x2d\xd3\x8a\x62\x1e\x40\x35\x03\x63\xa0\x02\xe0\xd8\x07\x44\x72\x77\x37\xff\x00\x3e\xf5\x7e\x89\x6e\x0d\xba\xa8\x10\xcb\xc8\xb9\x25\x85\xd0\xdb\x2a\x9c\x15\xa2\x34\xd2\xb8\x73\xf9\x47\xd8\x50\x87\x19\x97\x79\xe4\x78\xde\x0c\x11\x70\x73\x03\x92\x73\x7f\x49\xe9\xec\x14\x1c\x10\x44\x21\xa2\x58\xaf\x51\x6b\x9b\x5a\xed\x79\x35\x05\xfe\x81\xdb\xef\xd2\x50\x6f\xc0\x93\x78\xd3\x32\xf6\xc7\x7a\x19\x9a\x22\xd6\x7d\x12\x64\x2c\xde\xf5\x98\x24\x2b\xbc\xdf\x43\x15\xac\x61\xf2\x03\xc9\x0f\x90\xa8\xb4\xb8\x4d\x11\xda\xb0\x3a\x71\x87\x45\xb6\x00\x19\x90\x13\x86\x49\x1b\x6e\x4f\xd0\x4f\xd9\xee\xf3\xdd\x8d\x4a\x57\x24\x51\xa9\x0b\x3e\xef\xd5\x8f\xa8\x45\xa9\xf6\xb0\x31\x58\x86\xb3\x9f\x22\x51\x52\xd0\x5d\x4e\x92\x78\x2c\x20\x40\x7a\xc2\x60\xbe\x27\x30\x59\x16\xd0\x2f\x8e\x5d\xf3\x25\xe3\xa5\xae\x54\x4a\xee\xd0\xe0\x8f\x7e\xd5\x7a\xf0\xa9\x56\xc2\xc7\x79\xda\x58\x1b\x10\x80\x92\x8a\x3d\x9b\x3c\x7b\xfa\x58\x8e\x38\x78\xc3\xd6\x11\x77\x1a\x8e\x38\x94\x4f\x1b\x7d\x57\x8f\xda\x3f\xd0\xfb\xbe\x22\xdf\x4c\x0d\xca\x2f\x3d\xe4\x37\x7c\x74\x5d\x4a\x2b\xa2\x2e\x83\x7b\x60\xf1\x38\xc3\x32\x42\x96\xd8\x5f\xd7\x0d\xa3\x27\x91\xfa\x41\x79\x98\x6a\xfa\x09\xe5\x16\x09\x28\xd8\x6e\xeb\x5c\x63\xe6\x03\x22\x2c\x26\xd4\xce\x0e\xdb\xc3\x3b\x77\xb1\xfe\x7e\x7f\xa3\xac\x45\x44\x3b\x7e\x5f\xf4\xc0\x09\x6d\x41\x3d\x14\x1c\x9c\x77\xc5\x80\x14\xfc\xbb\x58\xf0\x2b\x01\xb8\x03\x32\xe3\x65\x06\x21\xf2\x73\x9c\x3b\x9b\x56\x96\x09\x75\x25\x4b\xad\xc0\x4f\x7c\xc5\x4b\x09\xc8\x3e\xa5\x98\x89\x52\x28\x67\xc4\xfe\x71\xef\xc7\x83\x37\x90\x7f\xb3\x8f\x5d\x5f\xfc\x2c\x2b\xe3\x21\x78\xe2\x99\x44\xc3\x7d\x74\xf9\xfc\x3c\x1c\x0d\x41\xe6\xfa\x79\xb9\xe7\xe4\x95\xad\xb0\xb5\xcc\xfb\x24\xab\x8c\xbc\xda\x94\x24\x21\x40\x88\x23\xd9\x69\x9d\x5b\xe0\x14\x35\xa1\x56\x70\x26\xea\x30\xc1\x47\x60\xb8\x77\x4d\xa8\x31\x8d\x53\x36\xc8\x67\xc5\x72\x39\x5f\x58\xca\xf6\x6c\x45\x0e\xa2\x10\x54\x0e\x6e\xde\x4d\x7a\xaf\xdc\xb1\x7b\x90\x49\x6e\xee\xaa\x72\xad\x14\x32\xd2\x28\x90\xe8\xa1\x08\xeb\x8f\x67\xc1\x29\xe3\x1e\x84\x9e\xca\x93\x33\x8a\xa0\x79\xba\x49\xf5\xdf\x98\x58\x13\xcc\x12\x4c\x94\xc1\x9f\xa0\xbb\x71\xc6\x22\x50\x20\x9f\x50\x02\xc2\x1f\x90\xa8\xc0\x22\x51\x5a\x8d\x17\x11\x68\x53\xa1\xd3\x3b\x16\xf9\x75\x35\x3c\x3a\x99\x1c\xeb\x29\xc8\x16\x3a\x4b\x7d\x0f\x6d\xf4\xe5\x4c\x85\xbd\x16\x42\xb1\x93\x33\xa0\x9f\x7b\x45\x88\x08\xdd\x40\x45\x0c\x2b\x00\x3c\x53\x64\xca\x36\xe8\x79\x57\x06\xeb\x61\x95\xf4\x51\xe9\xc3\x9b\xf6\xde\xf3\xdf\x07\x9a\xf9\x8c\x6c\x3e\xd5\x57\x02\x48\x9a\xa6\xa5\x30\x3d\xe0\x8d\x36\x60\xa7\xf6\x12\xa5\xb2\x53\x7b\x9f\x66\x60\x24\x90\xcd\xbb\x96\x40\x7d\x87\xad\x0a\x8c\xf7\x99\x25\xd8\xc9\xd9\x61\x0f\xe9\xb5\xfb\x96\xe2\x22\x6e\xa8\xdd\x5d\xc3\x64\x91\xd4\x31\xd7\x09\xab\xc3\x8d\x51\xa1\x04\x6a\x8c\x77\x8b\x75\x75\x55\x13\x23\xa1\xd6\x53\x48\x33\x85\xc3\x38\xb1\x42\x45\xd2\xe4\xce\x81\xa0\x43\xa1\x53\xe8\xbf\x54\x53\xc3\xf8\x5f\xc4\x04\xf1\xc9\x12\x28\xe4\x29\x75\x64\x14\x92\x90\x5b\x82\x09\x5c\xef\x3e\xfd\x30\x92\xe2\x2b\xc4\xfc\x6c\xb4\x3c\x3b\x39\x1a\x92\x5d\x0a\x99\xde\x3b\x76\xb9\xbb\x7d\xd9\x2c\x89\x6b\x22\x49\xd0\x80\x7e\xb3\x9f\xe9\xf4\x06\x35\xa9\x3e\x68\xe0\xfe\xb8\x13\xb0\xd5\x8c\x33\xf4\x2f\xb6\x7a\xbc\x77\x20\xca\x9d\xa5\x04\xa8\x5a\x67\x55\x96\x9d\x8b\xa4\x14\x77\xf5\xab\x36\xd7\xff\xa4\x35\xd6\x4d\x2a\x4f\xa4\xbf\x03\x3c\x01\xdd\xac\x6a\x10\xcc\x28\xb1\xa3\x2e\x3e\x2c\xaa\x0c\x72\x61\xb9\x5a\x7a\x82\xc3\xec\x4d\x14\xc4\x92\xc6\xa7\xd5\x60\x1a\x57\x63\x15\x8c\x08\x0f\x0b\x3d\xa5\xb8\x31\x18\x6a\x95\x2a\x95\x57\x32\xad\x78\x06\x0f\x02\x2d\x34\xee\xbf\x1f\x4e\xc8\xdc\x83\xba\x76\x68\xc1\xef\x7b\xec\xe3\xbc\xff\x80\xd3\x5b\x4a\x35\x1f\xc3\x27\xee\xc1\x34\xc3\xb1\x56\x63\x3e\x76\x6c\xf3\x40\x14\x35\x80\x25\x7f\x0d\x9a\xd0\x1b\xbf\xbe\x5e\xa5\x77\x86\x97\xae\xe6\x0b\x20\x56\x99\x73\x8f\x10\x98\x09\x0b\xe0\x6f\x14\xc0\xc5\xac\x1d\xfa\x6d\x4a\x6a\x55\x0c\x86\xd7\xe4\x8d\x07\xa2\xac\x75\xf5\x68\xb5\xb2\x8f\x23\x31\x43\x34\xb2\x77\xe6\x40\x7d\x25\xca\x2b\x29\xae\x9f\xd0\x51\x37\x76\x66\xfc\x18\x29\x62\x9e\x00\x61\x9f\xfc\x01\xd5\xc1\x8b\xd7\x47\xaf\xa1\x93\x32\xb9\x19\x2b\x23\x66\x55\x46\xbd\xe8\x27\x8c\x17\xf2\x47\x51\x1a\xc0\x8a\xbd\x94\x2a\x1d\xb1\x4a\xa6\xdf\x7e\xc6\x0c\x17\xa9\x64\x9d\xb6\xd7\x4b\x6a\xbd\x24\xa9\x44\x65\xc3\xf2\xdf\x75\xbb\x78\xca\x02\x9a\x8a\x4c\xab\x79\x54\xf4\x0c\xea\xc0\x89\x92\x76\xa5\xe9\x2c\x02\x38\x82\x49\xab\xcb\x14\x92\x23\xa5\x2e\x1b\xfe\x5b\x37\x1e\xc0\xda\x45\x29\x96\x4e\xa4\xc9\xc6\x78\x90\xb7\x62\xc2\xe1\xc1\x30\xf3\xc1\xd7\x47\x7a\xd4\x5f\x0f\x97\x87\xe8\x8d\x0b\xae\x52\xf8\x33\x49\x74\x99\xd2\x7c\xa5\x0d\xf9\x9c\x98\xfd\x83\x29\x27\x70\x0c\x39\x89\xc6\x55\xfb\xc9\x60\x31\x96\x79\x23\xf7\xcf\xab\x29\x95\x92\xbf\x56\x82\xf1\x5c\x3b\x41\xdc\xc6\xb6\x6f\x51\x24\xe7\x4b\x38\x0b\x61\xaa\x2f\x7d\x7e\x3a\x15\x15\x9a\x11\x7b\x23\x78\x2a\xa3\xba\xe8\x11\x7b\xd9\x2c\x94\x1e\xb9\xb9\x9c\x63\x05\x27\x7d\x84\xb3\x2f\x85\xd1\x55\x99\x88\x37\x18\xd4\xc9\x7d\x02\xd1\xea\xcb\xb8\x55\xb1\xfc\x52\x28\x34\xa2\x1d\x69\x20\x6e\x55\x95\xb0\x06\xc9\x42\xa4\x15\x9c\x2a\xd3\x25\x9b\x49\x6c\x78\x01\x47\xbb\x9c\x2f\x84\xb1\x5e\x19\x7c\x02\x49\x39\x75\xef\x30\x3f\x01\x60\xdf\x28\x7b\xb7\x76\x3b\xe5\x1c\xe0\x98\x61\xcb\x72\xeb\x0b\x54\xd0\xc6\x32\x55\xee\xf7\x72\x9b\xd2\x66\xc2\x5e\xba\x47\x21\x3f\x45\x8d\x04\x64\x8b\xb8\x10\x54\x23\xbf\x19\x9b\x71\xb3\x80\x36\x1b\xed\x25\x20\x8c\xfe\xa4\x2a\x9d\xc0\x40\xe8\x6c\x0e\xed\xd1\xa1\x95\x2e\x74\xd2\x5e\xe7\x68\xe9\x59\x90\xe0\x26\x3b\x8e\xce\xbb\x87\x72\x88\x1d\x84\x04\x73\x47\xf8\xa4\x25\x09\x70\x25\xdd\x81\xe5\x21\xa6\xca\x4a\xd5\x11\x4e\x27\x15\x3e\xdf\x91\xd4\x3d\x9e\xd9\x29\x0e\xd9\xe7\x04\xe4\xe5\xbc\xbf\xa7\x62\xf7\xa0\x9c\x57\xb8\xd1\x49\x0a\xd7\x40\xdb\x93\x56\xa2\x31\x28\x53\xce\x02\x39\x7c\x75\x14\x57\x36\xc5\x25\x1b\xbe\x2e\x6c\xc2\x7e\xec\xeb\x57\x6e\x3b\x96\x9d\x40\xaf\xbd\xd5\x75\x9b\x0c\x27\x34\xb2\x2b\x6f\x12\x84\xa7\x79\xcd\x57\xaa\xa2\xb2\x74\x12\xd6\x46\xa2\x4a\x16\x5c\xcd\xc1\x2e\xd4\x95\x1b\xef\x8f\x7f\x84\x19\x95\x22\xad\x12\xea\x31\xe2\xb9\xf6\x8f\xde\xcb\x4a\xc8\x5e\x20\xae\x4c\xc2\x0b\x3f\xe7\xf8\xb5\xcc\x52\x59\xfe\xfe\x39\x93\x13\x31\x61\x3b\x7f\x8c\xbe\xda\xc1\xa7\x17\xa5\x76\x8f\xa0\x8a\x0a\x98\x55\x26\x2d\x64\x36\xec\xc4\x77\x4f\xd8\xb1\x7b\x06\x44\x9e\x02\x01\xa3\xa4\xff\x69\x4d\xbe\x11\x2b\xc5\x9c\x97\x69\x46\x1e\x92\xeb\xa8\x52\x24\x10\x4c\xbc\x97\xc6\x1a\x3c\x86\x6c\x0f\xe1\x64\xb9\xb9\x74\xa2\xc8\x6d\xae\x71\xca\x2d\x1f\x47\xbb\xfa\x09\x9a\x5a\x63\x02\x3f\x1e\x73\xe2\xae\x5a\x6a\x3d\xf9\x03\x15\x5c\x8e\x79\xb8\x4b\x3a\xa5\x1c\x60\x88\xbb\xab\x3a\x0f\xcd\x2d\xd6\x03\x03\xbb\xb9\x81\x8f\x6b\x60\x7c\xa0\x01\xb4\x95\xa9\x55\xa6\x20\x47\x09\xe6\xf9\x86\x2d\x7d\x7c\x7a\xf1\xe6\x1f\x67\xaf\x4f\x4e\x2f\xb6\x3b\x7b\xbb\xb3\xb7\x3b\xbb\xc7\xce\x16\xea\xaa\xf7\xae\xf6\xd6\xd3\xba\x40\x6d\x1b\x7d\x32\xaa\x39\x7a\x44\xe9\x70\xc7\xea\xea\x47\xee\x94\xe9\xa2\x14\x06\xf4\x13\x88\x32\xad\x89\x5b\xd3\x0d\xa8\xba\x1f\x3e\xf8\x7c\xb8\x0d\x66\xb3\x0d\x98\x25\x14\x3b\x56\xd6\xad\x5a\xdc\x14\xf1\xf0\x9f\x27\x47\xc7\xa7\x17\x27\x2f\x4e\x8e\xdf\x6c\x34\xbd\xa3\x27\xfa\x63\xf3\x5c\xee\x78\x4a\x16\xa5\xb8\x92\xba\x32\xd9\x32\x00\x48\xaf\x17\x02\xab\x19\x82\x2a\x05\x8f\x87\xc7\xc8\x5e\xfb\xb3\xed\x61\x3b\xec\x61\xdb\xcc\x76\xe9\x01\xfc\x33\x14\xfb\xbe\x28\x75\x3e\x10\x0b\x9f\xa3\x2f\xc6\x87\xb0\xd7\xf1\xd3\x2e\x61\x84\x34\x8e\x1e\x52\x1e\x6b\x40\x12\xa7\x8f\xe6\x85\xed\xd1\x1d\x64\x10\xbc\xdf\x61\xa0\x71\x31\xc3\xe6\x15\x2f\x7e\x10\xcb\x37\xa2\x27\xbe\x50\x93\xde\x22\x13\x89\x3b\xe8\xd8\xa5\x58\x62\x3a\xe5\xa1\x7f\x58\x1f\x1c\xa4\x7b\x09\x97\x7c\x29\xfa\x40\x59\x0f\x89\x73\x7c\x29\x7a\xa4\x8a\xfa\x6b\x05\xf1\xd7\x2d\x21\xe8\x69\x6e\x4d\xfb\xad\x1e\x1b\x16\xe3\xf8\x13\xe0\x3a\x3f\xde\x38\x4a\xf3\x1a\x70\x15\x7c\xf8\x76\xe0\x95\xc0\x48\xfa\xb2\x71\x76\x05\x21\xc2\xb0\x88\x13\x78\xd3\x87\x1e\x48\xc9\x18\x88\x34\x7d\xdb\x0b\x32\x5c\xc2\x61\xe5\xea\x6e\x2d\x58\x31\x33\x3f\x20\xd8\xa5\xcf\x3d\xe8\x81\x09\x3d\x01\xa1\xcb\xee\xa8\xf9\x27\x04\x46\x47\xec\x5f\xe1\x43\xe8\xe2\x6f\x7e\xde\xdd\xfd\xe6\x87\xe3\x7f\xfc\x6d\x77\xf7\x97\x7f\xc5\xdf\xc2\x51\x88\xe1\xed\xe6\x2d\x80\xe0\xa0\x74\x2a\x4e\xe1\x19\xf0\x27\xa9\x6b\x07\x18\x42\xa1\x2f\xa0\x00\x7b\x82\xb9\x46\xe1\xcf\x42\xa7\xed\xbf\x4c\x2f\xa8\xc1\x7b\x79\x30\xc0\x12\xf5\xa8\x07\xc2\x6b\xb8\xe3\xa1\x96\x25\x03\x6f\x55\x1a\x35\xb4\xb6\x49\x16\x22\x47\xb0\xb3\x17\x9e\x04\xd0\xb7\xd8\x23\x3d\x28\x28\x8f\x77\x9a\x69\x13\x77\x72\xe7\xea\x59\xaf\x06\xef\x78\x0d\x28\xda\xc2\x0a\x0e\x4c\x30\xa0\x08\x51\x0b\x37\x72\x38\x60\x43\x9a\x4b\xe8\xab\x79\x70\x76\xc2\xae\x90\xc2\xf7\x86\x38\x3e\xbc\xf9\xe2\x93\xca\xb8\x10\x44\x6d\x97\xe1\x3e\xc7\x0c\x66\xff\x3d\x41\x22\x98\x80\x8d\x27\x9c\x61\xb3\x87\x1f\x4e\x92\xa2\x1a\xd1\x0d\x93\x5c\xe4\xba\x5c\x86\x3f\x43\x29\xe6\xd8\x58\x5d\xf2\x39\x54\xc2\xe0\xcf\xf1\x67\xe1\x2f\xfc\x61\xe3\x01\xab\xbf\x46\x53\xb8\x8e\xa5\x92\x44\xee\x08\xed\x51\x5f\xf7\x50\xb6\x79\xd2\xdf\x13\xd1\x96\xf4\x05\x68\x6a\x5e\x4d\x86\x0c\x9e\x38\x54\x38\x03\x15\xc1\x9e\xa4\x12\xe1\x51\x9d\xc5\x06\xde\x00\x75\xe5\x2c\xcb\xce\xd0\x7a\xf5\x35\xa0\x34\x4b\xe5\x95\x34\xba\x47\xbd\x4f\x18\xe8\xe6\x8c\x47\x42\x29\xc1\x2c\xae\xe0\x36\x7b\x5f\x00\x9a\x58\xd8\xaf\x2d\xb1\xff\xac\x4f\x43\x31\xbc\x0a\x6e\xad\x28\xd5\x73\xf6\x5f\x7b\xef\xbe\xf8\x6d\xbc\xff\xed\xde\xde\xcf\x4f\xc7\xff\xf9\xcb\x17\x7b\xef\x26\xf0\x8f\x3f\xed\x7f\xbb\xff\x9b\xff\xe3\x8b\xfd\xfd\xbd\xbd\x9f\x7f\x78\xf5\xdd\xc5\xd9\xf1\x2f\x72\xff\xb7\x9f\x55\x95\x5f\xe2\x5f\xbf\xed\xfd\x2c\x8e\x7f\xb9\xe5\x20\xfb\xfb\xdf\xfe\xb1\xf7\xd4\x07\x00\xf7\xc5\x6b\x48\x88\xdf\xe6\x88\x83\xb0\xdf\x27\xec\x6b\x81\x97\x67\xaf\xa1\xf7\xff\x1b\x2f\x35\xa3\xac\x1e\x7f\x5c\xdf\x9b\x0d\x8e\x69\xa1\x9f\xc3\x93\x83\x4f\x6a\x56\xc8\x04\xd3\xe2\xb1\x9d\x73\xbf\x07\xe7\x4e\xe8\x48\x09\xeb\x5a\x6b\xa2\xb3\x52\xe7\xbe\x0e\x1f\xc2\x1b\x58\x31\x46\xf7\x5d\x8a\x5e\x3d\x92\xf1\xda\x3a\x83\xb6\xce\xa0\x1b\xae\x8f\x3a\x83\xb0\x88\xe0\xfe\x7a\x82\x84\xba\xea\x1a\xc2\x58\x1b\x41\xf7\xb6\x4e\x8c\x76\x77\xbb\x80\xda\xc4\x6f\xf5\xba\x95\x6b\x9d\x4c\x83\x07\x5a\xbe\x3e\x86\xc9\x0e\xa0\x65\x3b\x6e\x7c\x18\x20\xa0\x89\x0a\x34\x6d\x7c\xd5\xe4\x95\x9b\x42\xc0\x90\x6f\xa0\xc5\x42\x6e\xb1\x54\x73\xc2\x9f\xc0\xa3\x84\xa2\x4f\x52\xd5\x38\xbb\x41\x39\xac\xc1\xd9\xb9\x31\x3a\x81\x2e\x48\x08\x8b\x17\x40\xf8\x68\xda\x30\x1b\xcb\x2f\x21\xda\x98\x88\x54\xa8\x44\x10\x70\x7b\xa3\x6d\x2d\x57\xec\x58\x5d\x79\xf0\xfa\xb4\xc2\x64\x10\x14\x7f\xeb\xc7\x78\x5c\x09\x08\x8e\x11\x29\x08\x16\xe5\x21\x80\xd4\x0f\x16\x36\x87\x54\x0c\x3d\xab\xbd\xac\xdd\x3a\x5b\xf6\x3e\xc5\xfb\x9f\x99\x21\xb2\xd5\x4b\x19\x5a\x39\x2c\x6b\xf7\x73\xf3\x90\x7c\x0c\xc1\xc0\xfe\xc7\xe7\xef\xee\xe8\x1c\xe8\xd8\x1c\xe6\xc8\xbc\x43\xec\x64\xc8\x63\x72\x88\x60\x49\x51\x8a\x99\x7c\x3f\xd0\x3e\x3d\x88\xea\x09\x65\x2a\x94\x95\x33\x89\xcd\x7b\x8b\x52\x14\x42\x81\xab\x15\x4a\x34\x9c\xec\xa7\x93\xb2\x0e\x4e\xdf\xc7\x64\x1e\x54\xb8\x87\x15\x65\xe7\xeb\x94\xfd\xad\x1c\x63\x5b\x39\xd6\xf9\xfa\x4c\x72\x8c\x38\xf7\xfe\x08\x31\xc8\x3c\xef\x9f\xfd\x7e\xd8\x4c\x65\x07\x46\xee\x5f\x42\xdc\x82\x71\x0b\xa2\xd1\x6a\x4c\x5e\xc3\x3a\xb6\x92\x65\xe2\x4a\x64\xa4\x37\xb1\x9c\x2b\x3e\x47\xec\x7d\xab\x03\x5a\x8f\x2e\x43\xff\xa4\x76\xde\x3d\xe8\xf1\xbe\xc4\x0b\xbe\x2c\x75\x96\x89\xd2\xb0\x4c\x5e\x0a\x76\x24\x8a\x4c\x2f\x73\xca\x7d\x4d\xd9\xb9\xe5\xd6\x71\xf5\xb9\xb0\xdd\xc2\xbe\xfd\x60\x3c\x7c\x15\xfa\x40\x60\xe7\x58\xd6\x0e\x45\xe1\xac\xa0\x0a\xca\xd7\x0a\x84\xc6\x01\xb4\x72\x19\xb1\x53\x71\x25\xca\x11\x3b\x99\x9d\x6a\x7b\x86\xda\x77\x33\xe1\x0e\x6f\x64\x72\xc6\x9e\x3b\xbb\xce\x58\x66\xb1\x9d\x46\x54\xa0\xae\xcb\xc6\x00\x35\x50\xdb\x10\xf5\x79\xab\xb5\xe7\x30\x52\xa8\x3c\xef\x14\xc9\xe8\xb5\x4c\xa1\x5f\x51\xef\x05\x3a\xc0\x7a\xd2\x1a\xbb\x37\xe2\x6f\xc4\x55\xf0\xd0\x63\x60\x05\x4a\xc5\x4a\x61\x0a\xad\x8c\x68\xe2\x2a\x86\x19\xa1\xb5\x3b\x2c\x68\x6b\xe7\xc3\xb3\xef\xb1\x59\x68\x63\xa1\x84\x76\x98\x2e\x58\x67\x7e\x38\xa8\x48\xe6\x59\x26\xd2\x46\x1b\x34\x6c\xdf\xc3\x9b\x1e\x82\x04\xda\x31\xa4\xa1\xa1\x07\x16\x2a\x37\x6a\x9c\x1b\xf7\x87\x96\x7a\xbe\x69\x8d\xef\xa7\x7c\x53\x65\x73\xbd\x31\xe1\x1c\x89\x18\x60\x05\xe1\x19\x70\xbf\x4d\xd4\xf9\x66\xa1\xf5\x25\x4b\x74\x5e\x64\xb0\x75\x7a\xec\xac\xba\xf1\x56\x60\xa5\xb1\x1b\xdd\x3c\x89\x7a\x72\xc1\x07\xfd\x5a\x72\xf5\x52\xc4\x86\x50\xc3\xc4\x7b\x91\x0c\xd6\xb4\xf3\xf8\xbd\x48\xa2\xae\xb3\x80\x41\x95\x78\x84\x08\xb7\x63\xfb\x37\x13\xef\x1d\x72\x18\xca\xcd\xdf\xa3\x96\x2e\xbe\x5a\xb0\x7d\x30\xa6\x87\x37\xa7\x47\x40\xa7\x08\xb0\x85\xb0\xbe\x2e\x86\xd1\x08\xcc\x88\x5b\x6f\x05\xeb\x2f\x24\x52\xfb\xb1\xa0\x27\x94\xd6\x96\xed\xed\x3e\xd9\xdd\x5f\xf1\x3f\xb6\x30\xb2\x2f\xa2\x5f\x4a\xc0\x76\x2c\x00\x28\x51\x24\xbb\xe9\x88\x49\xeb\x33\xad\xb1\x61\x11\xcc\x8a\x8a\xfe\x46\xcc\x68\x66\x4b\x9e\x4a\x52\x63\xe0\x53\x77\x93\x2d\x2b\x92\xf2\x7b\xbb\xbf\xed\x52\x2f\xa3\x6b\xad\x76\x2d\x4c\x7f\xc2\x2e\x10\x27\x26\x0c\xb4\xd4\x15\xb4\xe8\x44\x12\x14\x99\x4c\xa4\xcd\x96\x20\xb1\x98\xae\xb0\x9f\x97\x3b\x2f\xa8\xd8\xf0\xf8\xbd\xb4\xbe\x9b\x88\x9e\xb1\xa7\xd8\x4e\x4c\x70\xf2\x80\x66\xf2\x4a\x3c\x59\x08\x9e\xd9\x05\x26\x89\x28\xad\xc6\xd8\x11\xd2\x89\x12\xfa\xa6\x6f\xbc\xa4\x9f\x3b\x31\xbe\x7a\xb8\x16\x57\x27\xd4\xd3\x72\x70\x42\xf4\xbb\xee\x6d\xaa\xd9\x0a\x5c\xd7\xc5\xc5\xd9\x77\x8d\x46\xd5\x20\xc5\xad\x2d\x7c\xea\x4e\xd4\xcd\xfd\x1e\xc8\x8e\x61\x82\x95\xbd\x3a\x56\xb3\x01\x45\x58\xdf\xce\xd5\x6c\x3d\xfc\xda\xed\x5b\x56\xb3\x7f\xe8\x0a\xc0\x40\xf8\x34\x5b\x06\x24\x06\x23\x2c\xdb\x71\x43\xed\x38\xf1\xe4\xb8\xe1\x7b\xc1\x53\x04\xca\x30\x56\xf0\x4e\xaa\x5b\x7c\x0d\x16\x44\x8b\xe6\x36\xec\x39\x50\x19\xab\x73\xb6\xa0\xd7\x6e\x96\x5e\xd2\xce\x98\xc0\xee\xf1\x75\x4d\xa5\x28\x50\xc2\xd1\x6f\x1e\x9d\xfc\x5a\x91\x1b\x48\xf7\x46\xd7\x82\x24\x26\x5b\xdc\x14\x47\x2a\x24\x16\xe2\xce\x0c\x24\x4b\x07\x48\x7e\x60\x03\x26\x40\xb0\x7e\x85\x9c\xed\x81\x20\xa8\xd7\x3f\xd7\x6b\xb0\x9c\x0a\x36\x58\xde\x00\x5b\xe7\x64\x25\x9e\x41\xef\xcb\x40\x44\x1c\x34\x5a\xcf\xfa\x97\x8a\xc6\xd7\x87\x09\x30\xcc\xe2\xb3\x21\x29\x50\x0c\x90\xda\xbd\x9a\xd8\x8d\x30\x52\x50\x7a\x89\xc2\x15\xc4\x84\x11\xe5\x55\xd7\x62\xee\xfa\x1a\xee\xd5\x75\x77\x8b\xdf\x5f\x6b\xea\xa4\x4b\xa6\x42\x1b\x6c\x0f\x6b\xba\x4a\x90\x28\x33\x81\xba\x66\x7b\x77\xae\x3f\x8e\xb8\x9a\x0b\xf6\xcc\xfd\xf2\xaf\x7f\xf9\xcb\x57\x7f\x99\xe0\xf0\x21\x4b\x41\xb1\x93\x83\xd3\x83\x7f\x9e\xff\x78\x08\xc5\xb1\x7d\xa9\x3a\x50\x0a\xe6\xd0\x09\x98\x83\xa6\x5f\x7e\xd2\xe4\x4b\x28\xf9\xe8\x2d\x45\x9a\xbe\x7f\x18\x32\xc6\xf7\x24\xdd\x2f\xc2\xd9\x73\xba\x66\xd3\x91\xea\xb6\xda\xbd\xd8\x63\x36\x29\xce\x75\x72\x39\xa0\x5d\x73\x24\x8a\x52\x24\xe8\x27\xbb\x38\x3c\xc3\xd1\x9d\x7d\x79\xfa\xfa\xa2\x2e\x35\x80\x7c\x9c\x1a\x4c\xef\x7b\xf2\xa4\x39\x9b\xf4\x52\x14\x36\x98\xee\x53\x9e\x5c\x5e\xf3\x32\x05\xcf\x16\xb7\x72\x2a\x33\x69\x11\xfb\xaf\x14\xd4\xb7\x0a\x13\xfe\x10\xe4\xcc\xf7\x05\x46\x59\x8e\x0e\x04\xef\x0e\x05\x97\x15\xe6\xd1\xcc\xb8\xcc\xc0\x83\x4a\x2d\x79\x31\x23\x28\x29\x82\x4b\x2f\xf6\x69\x6f\x8d\x2f\x7f\xdd\x5b\xe3\x2b\x6a\x19\x7c\x57\x3b\xac\x6f\x5e\xe2\x3d\x3e\xea\xe8\x88\x2b\x1b\xdd\xbb\xb7\x47\xdd\x00\xe3\xdd\xdf\xa3\xae\x28\xc5\xb9\xd5\x9d\x5a\x00\xb0\xd5\x28\x09\x0e\x76\x43\x8c\x64\x2a\x66\xda\x09\xe1\x1b\x83\x1e\x69\x05\x9b\x90\x2b\x28\x0e\xf4\x5e\x2d\xdd\x08\x6c\x60\x46\xa6\xef\x97\x9d\x11\x70\xea\x13\x13\xa3\xa5\xfa\xe6\xc7\x23\xf7\x76\x22\x87\xd9\x8d\xea\x2a\x07\x6a\xbd\x0c\x1f\x0a\x9b\xa0\xe7\x36\x12\xe4\x80\x1c\x4a\xd3\x6f\x87\x51\x92\x92\x9b\x05\xb6\x25\x16\xef\xa5\xef\x4f\x7f\xa6\xd3\x76\x33\xf1\x79\xc9\x13\xc1\x0a\x51\x4a\xed\x0e\xa3\x4a\xd9\x54\x5f\x2b\x36\x15\x73\xa9\x8c\x27\x05\x80\xa7\x13\xcd\x20\x1e\x23\x4d\x00\x86\x9b\xb0\x37\x0d\xb0\x13\x2a\x43\x4a\x74\xbd\x35\x69\xce\xed\x48\x12\x9c\x58\x40\x27\xec\xd5\x13\x28\x1c\xb7\x2f\xfa\xd8\x94\xf7\x2a\x05\x4f\x4e\x45\xc6\x97\x98\x6d\x0a\x2d\xcb\xe5\xbf\x45\x69\xf6\x07\x88\x38\x61\x03\x2e\xff\xdd\x8d\xf3\x90\x86\x95\x82\x27\x8b\x7e\xc1\xdf\x6d\x88\xea\x96\xd7\x36\x44\xd5\x67\x90\x6d\x88\x6a\x1b\xa2\xfa\xc8\xb5\x0d\x51\x6d\x43\x54\xad\xeb\xde\x5a\x49\xdb\x10\x55\xe7\x6b\x1b\xa2\xfa\xf0\xb5\x0d\x51\xdd\xe2\xda\x86\xa8\x6e\x79\x6d\x43\x54\xdb\x10\xd5\x36\x44\xb5\x0d\x51\xfd\x8e\xfc\x76\xfe\xda\x86\xa8\x56\x06\xd9\x86\xa8\xb6\x21\xaa\x5b\x5f\xf7\xd6\xf8\xda\x86\xa8\xf0\xda\x86\xa8\x9a\xd7\xef\xeb\xa8\xf3\x01\x9e\x33\x67\xea\xf5\xaf\x69\x3b\x83\xa0\x82\x4c\x28\x4e\xa4\x67\x8d\x3a\x28\x7c\xd4\xa4\xee\x51\x11\xc1\x82\xf8\x52\x1c\x8a\x08\xd5\x71\xa6\xb5\xf5\x52\x3d\xfb\xc8\x15\x3a\xad\x03\x15\x51\x84\x02\x0d\xde\xee\x35\x6b\x1b\xab\xc6\xea\x13\x96\xf8\x3c\x21\x89\x7b\x12\xbf\x19\x20\x0c\xb1\x0d\x41\x3c\xba\x10\xc4\x30\xee\xbb\x01\x5c\x77\xbd\x8f\x0a\x8a\xcc\x5f\x2c\x4a\x61\x16\x3a\xeb\xcc\xe8\x0d\x26\x7f\x25\x95\xcc\xab\x1c\x3a\xc5\x3a\x7e\x96\x57\x21\x05\x20\xb4\xaf\x26\x89\x8d\x5e\xc4\xa8\xa5\xac\x6f\x25\x0b\xf5\x9b\x0b\x7e\x05\xed\x51\xab\x24\x11\x22\x8d\x9a\xd2\x83\x86\xf5\xd5\x24\x3c\x29\xb4\xce\x78\xd6\x4f\xde\xf4\x3b\xc4\x11\x8e\x14\x46\xf9\xea\xcb\x4e\x63\xcc\xcb\x62\x18\xb9\xfc\xdd\x9b\xb3\xc3\x48\x2e\x73\xe5\xc5\xb2\x54\x57\x3a\x03\xaa\x72\xbc\xc9\x29\x6b\x13\xac\xdf\x97\xce\x60\x9a\x0a\xcb\x23\xdb\x86\xcc\x02\xc3\x84\xe2\x53\xe8\x50\xeb\x7e\x15\x4e\xe4\x33\x3c\x77\x05\xb7\x55\x29\xd8\x9c\xdb\x4d\x0a\xfc\xfe\x26\x4c\x2f\xf3\x65\x88\xf3\xa6\xaf\x86\xde\xf4\xc1\x39\x3d\xbc\xe9\x85\x9a\x03\x5f\x20\x82\xfe\xad\xf5\xf0\xde\x92\xb2\xbf\x6e\xdc\x7f\x6b\x31\x80\xb8\x81\x17\x1f\x8c\xc0\x3b\xe7\xd4\x3a\x8a\x8e\xf3\xd8\x08\xf2\x5d\xa5\xac\x66\x45\xc6\xeb\xbe\x50\xb0\x02\xdf\xc3\x19\x74\xb8\x10\xc9\xe5\x1b\x8a\xc4\xee\x19\x21\x82\x6e\x3a\x97\x76\x51\x4d\x27\x89\xce\x9f\x38\x91\x80\xff\x37\xcd\xf4\xf4\x49\xce\x8d\x15\xa5\x53\x57\xe9\x88\x1b\x27\x6e\x14\xa9\xe6\x93\x3c\xdd\x9f\xb0\x77\x0a\xab\xdb\xeb\x3e\x94\x11\xb6\x83\x7b\xbe\xc7\xd9\x98\x0a\x27\x5d\x35\xf8\x21\x22\x08\x3b\x37\xbd\x49\x1f\xa0\xe4\xde\x47\x52\xcf\x28\xf8\xe7\x8f\x80\x6f\x25\x17\x1b\xc0\xe1\xf2\xd0\x22\xdd\x83\x65\x7c\x0c\x10\xe1\xbe\x47\xd1\xed\x7b\xa3\x1a\xdf\x97\x88\xf6\x3d\x44\x9b\x1e\x20\x00\x3b\x44\x04\x7b\xb8\xe8\xf5\x27\x00\x65\xfe\x34\x51\xeb\x01\x5d\x7b\x03\x45\xab\x3f\x47\xa4\x7a\x90\xb7\xee\x1b\xa1\xfe\x7c\xd1\xe9\x61\x5e\x77\x48\x43\xe0\xa1\x46\xa4\x07\x70\xd1\x0f\xe9\x9e\x1f\xcc\x35\xff\xc9\x22\xd0\xfd\xa3\xcf\xf7\x20\xf2\xdc\x9b\xc8\x52\x49\x2b\x79\x76\x24\x32\xbe\x3c\x17\x89\x56\x69\xe7\x13\xa6\x85\xd2\x19\xf6\x8f\xc1\x61\xc9\x4f\xd5\x2c\xb4\x58\x70\x02\x23\x77\x16\x15\x16\x96\xf8\x58\x06\x29\x14\x10\x55\xc6\x59\xde\xcb\xe8\x04\xbb\x37\x0e\x31\xac\x3a\x19\x72\x11\xbf\xd7\xd7\x4c\xcf\xac\x50\x6c\x4f\x2a\xbf\x8e\xfb\x91\x19\x58\x7b\x27\x03\x5b\xbb\x6f\x9f\x3d\xf5\x37\x3f\x3e\xb7\x23\x38\x58\x8d\xf9\xf4\x5e\x60\x7a\xd0\xc7\xdd\xc0\x74\xe3\xac\xca\x9a\xae\x60\x74\x0f\x37\xe5\xcd\xb3\x1a\x4e\xf9\x19\x8c\x1b\x76\x1b\x57\x29\xa3\x4a\xb4\xc7\xb7\x68\xbd\xf3\x6a\x9a\xaa\x5f\xc8\xa3\xf9\x98\xd7\xf8\xe2\xf0\x0c\x9d\xc6\x5b\x77\xc9\x7d\x71\x97\x6c\x28\x37\xe5\x1e\x2a\xba\x0f\x34\x1f\x65\xab\xe8\xde\xe1\x8a\x6a\x53\xbf\x2b\x79\x22\xce\x06\xd7\x11\xfc\x76\x62\x69\x55\x72\x12\x80\x41\xe5\xf3\x9b\x47\x09\x91\xe2\x6e\x0a\xf5\xbc\x50\x29\x3b\xab\xb2\x6c\xc9\xaa\x42\xab\x66\xf5\x33\xc6\xda\xdb\xc5\xb4\xe0\x92\x5f\xf3\x94\x5a\xb1\x2c\x4a\x4d\x67\x66\x59\x29\xe5\x64\x70\xdd\x13\x0d\x14\x49\x80\x69\xe6\x8d\x92\x5d\x23\xe7\x6e\xfa\xee\xfc\x83\x6a\xde\x3a\x01\xb1\x31\xa0\xfb\xf5\x4c\x97\x89\x9c\x66\x4b\xb6\xe0\x59\x68\x80\xc3\xd9\xa5\xcc\x32\x1a\x66\xc2\xce\x85\xc5\x90\x02\x9e\x9d\x99\x56\x73\x98\x1c\x57\xbe\xf1\xa2\x48\xdc\x6f\x93\x4c\x70\x55\x15\xf8\x3c\x77\x12\x2f\x75\x55\xfa\xe7\x4d\x42\x60\x22\x9c\xc0\x4a\x66\xa3\xa8\xbd\xdb\x07\x17\x36\xe4\xfe\x54\xc6\x29\x00\xaf\x3d\x2c\xf5\x28\x1e\xd3\x23\x87\x9b\xa8\xb9\x4f\x51\xea\x2b\x99\x62\x74\xc3\x93\x0d\x1a\x49\x63\x03\x9f\xb0\x9f\x95\x56\x63\x25\xe6\x1c\x14\x15\xda\x45\xb8\x66\x38\x0e\x66\x10\xa8\x14\x5a\xfa\x38\x0d\x5f\x17\x8d\x72\xfa\x2b\x89\xcd\x88\x23\xca\xb1\x3d\xa5\x99\x86\x7c\xd4\x4a\x49\x8b\x0d\xee\x17\x95\x65\xa9\xbe\x56\xfb\x77\x8a\xba\x42\xa0\xf5\x62\x2d\x81\x9a\xe1\xd7\x75\x7a\x0e\xbe\xef\x87\xc9\x2b\x0d\xb9\x3e\x67\xac\x52\x46\xf4\x3c\xde\x07\x53\x8e\xfe\xfa\xe7\x6e\x32\x42\xe6\x42\x57\xf6\xb3\x58\x7f\xd7\x0b\x99\x2c\x62\x65\x56\xe6\xc2\x30\x5d\xb5\xcc\xe2\x67\xf4\xb3\xf5\x2b\xb4\x35\x01\xd7\x5d\x5d\x1d\xbb\x6b\xbc\x5f\x6d\x38\x84\xba\xf3\x35\xe4\x89\x1f\x9d\x9e\xff\xf3\xe5\xc1\xdf\x8f\x5f\x4e\xd8\x31\x4f\x16\x31\x26\x86\x62\x1c\x84\x06\x08\x8a\x05\xbf\x12\x8c\xb3\x4a\xc9\x5f\x2b\x0a\xf8\xee\x85\xdf\xee\x0f\x8a\xd5\xde\xf1\xf4\x85\xee\xfc\x83\xb5\x83\xc3\x5e\xff\x98\x97\xa5\x8d\x80\x06\x2e\x6d\xf5\xe9\xd8\x7d\x85\xc6\x01\xa8\x5a\x90\x38\x3f\x97\x57\x24\x86\x09\xfc\x9e\xa7\x21\x53\xcc\xf1\xb9\x63\x0b\x77\x54\xf1\x29\x64\x78\x2d\x04\x53\xc2\x3a\xb6\x0e\x3e\x26\xad\x4c\x03\x9c\xa4\x32\xc2\x8c\xd8\xb4\x82\x9c\xb4\xa2\x94\x39\x2f\x65\xb6\x8c\x07\x73\x67\xd5\x69\x08\x79\x2f\xdb\x53\x3a\x7a\x7d\x7c\x0e\x35\x02\x45\x89\xb0\x25\x90\x54\x06\xdf\xc3\x6b\x4d\x85\xfb\x05\xb5\x11\x9e\xb0\x03\xb5\xc4\x2f\x71\x83\x4b\xc3\x32\x69\xac\x80\x23\x98\x74\x48\x1f\x4c\xdf\x79\x3a\x81\xff\xed\xb8\xb7\x2c\x9d\x92\x19\x72\xe5\x92\x95\xe4\x55\x54\x43\xe5\x34\x8b\xa8\x49\xef\xfe\xa8\x1a\xc2\xd5\x49\x42\x8e\x88\x51\x43\x38\x1e\x96\x1a\xc8\x8b\x0d\x02\xa5\x9a\x67\x31\x57\x75\x13\xfb\x7d\x6d\xcb\xbe\x96\xe5\xb8\x7e\x83\xb3\xae\x06\xe6\x20\x8d\xe9\xea\x39\x0c\xd4\xce\xa9\x3e\xfd\xbc\x39\x45\x12\x41\xc7\x1d\x7a\x4f\xce\xfc\x0e\x20\xed\x26\x6f\xb5\x75\x2d\xea\x9c\xa4\x11\x7b\xca\xbe\x61\xef\xd9\x37\x60\x5e\xfd\xb5\x6f\xf3\xab\xbe\x86\xcf\x10\x29\x46\xce\xaa\x3f\x39\x1b\x88\xe2\x3f\x39\xe9\xe4\x46\x74\x54\xb5\x9a\x4d\x25\xa9\xf3\xe2\xbd\x15\xa5\x93\xa3\xb4\x12\x1b\x6d\x1b\xe6\x26\xf8\x19\xd9\x0c\xc3\x0d\x27\xb3\x66\x5a\xd3\xdd\x18\xcd\xfd\xfc\x7b\x6d\xec\x29\x49\xa1\x66\x03\x9c\x7a\xb4\x9c\xdb\x64\xd1\x14\x63\x4e\x51\x33\xb6\xde\x60\x86\xa5\x1a\xb2\xac\x30\x7d\x79\x21\x7b\x24\x4f\xdc\x1f\x36\xee\x17\x4f\x6f\xac\xe7\x87\x56\xaa\xe5\x40\x01\xcb\x87\x14\xab\x08\x19\xab\xd0\x29\xe9\x64\x6e\x5a\x69\x74\x66\x7c\x40\x29\x23\x5f\x4d\xf0\x32\x03\x2f\xb9\xfd\x94\x70\x85\x05\x24\x33\x51\x96\x98\x71\x3e\x5d\xfa\x64\xbd\xde\x8b\xd7\x6b\x27\x15\xa5\xb6\x3a\xd1\x3d\x3a\x9b\x35\x63\xdc\x34\x1c\x10\x01\xb3\x7c\xbd\x9b\xfc\xed\xd1\xd9\x88\x5d\x1c\x9e\x41\xb7\xa7\xf3\xc3\x8b\xb3\xa6\xa5\xb2\x73\x71\x78\xb6\xb3\x51\x52\x30\xaf\x59\x81\x63\xba\xc3\x20\x0d\xc7\x93\x53\xdb\xc6\x39\x2f\xc6\x97\x62\xd9\xf1\x4c\x1d\xe2\x5c\x1f\x87\x15\x1e\xe4\x85\x90\xcc\x39\x2f\xee\x3c\x5a\x29\x78\x2a\x3f\x53\x15\x97\x4f\x83\x0d\xcf\x5c\x5f\xce\x95\xeb\x2b\x91\xa2\x3a\xec\x7f\x21\x54\x5a\x68\xe9\xf4\xc5\x6d\x8d\xd7\xdd\x7f\xbd\xad\xf1\xba\xf5\xb5\xad\xf1\xda\xd6\x78\xad\x5e\xf7\x26\x91\x75\x5b\xe3\xf5\xb8\xe2\xf6\xdb\x1a\xaf\xdf\x79\xe8\x7f\x5b\xe3\xb5\xfe\xda\xd6\x78\x6d\x6b\xbc\x6e\x77\x6d\x6b\xbc\xee\x7e\xdd\xbb\xa4\xa5\x6d\x8d\xd7\x9d\xae\x6d\x8d\xd7\xea\xb5\xad\xf1\xba\xe1\xda\xd6\x78\xdd\x70\x6d\x6b\xbc\xb6\x35\x5e\xdb\x1a\xaf\x6d\xea\xeb\x47\xc7\xba\x9f\xa9\xaf\x6c\x5b\xe3\x45\xd7\xb6\xc6\xeb\x51\x24\xf8\xb1\x6d\x8d\xd7\xad\xae\x6d\x8d\xd7\xb6\xc6\xab\xcb\xb5\xad\xf1\x7a\x2c\xee\x92\x6d\x8d\xd7\xb6\xc6\xeb\xf7\xa3\xe8\x6e\x6b\xbc\xb6\x35\x5e\xdb\x1a\xaf\x6d\x8d\xd7\x07\x67\xb1\xad\xf1\x7a\x0c\x26\xa0\xef\x03\xdc\xbf\x66\x69\xf7\x50\xe7\x45\x65\x05\x7b\xe3\x87\x0c\x5a\x24\x0a\x06\x69\x62\x8d\xa0\x7f\x0a\x61\xa2\xd5\x4c\xce\x49\xb2\x3f\xc1\xe6\xbb\xe3\xf0\x3e\xe3\xa8\xe1\xed\x03\xcc\x1f\xcc\x64\x2e\xbb\x15\x92\xb1\x95\x85\x79\x09\x63\x45\x71\x19\xb7\x93\x72\xfe\x1e\xb6\x08\xcf\x75\x85\x0d\x8b\x13\x5a\xbf\x40\x42\x8c\x5e\xdd\xbb\x95\x61\xc3\x98\x38\x75\x45\xdc\xd9\x10\x69\x25\xdc\x5a\x51\xaa\xe7\xec\xbf\xf6\xde\x7d\xf1\xdb\x78\xff\xdb\xbd\xbd\x9f\x9f\x8e\xff\xf3\x97\x2f\xf6\xde\x4d\xe0\x1f\x7f\xda\xff\x76\xff\x37\xff\xc7\x17\xfb\xfb\x7b\x7b\x3f\xff\xf0\xea\xbb\x8b\xb3\xe3\x5f\xe4\xfe\x6f\x3f\xab\x2a\xbf\xc4\xbf\x7e\xdb\xfb\x59\x1c\xff\x72\xcb\x41\xf6\xf7\xbf\xfd\x63\xe7\x29\xf7\x56\x89\x87\x53\x88\x07\x52\x87\x3f\x89\x32\x4c\x01\xdd\x81\xf6\x22\x25\xa3\xac\xec\x46\x3a\xb0\x3e\xb4\x1b\xbd\x34\x05\x35\x2f\x8c\x23\x0d\xd3\xb9\xb4\x4e\x39\x74\xfa\x20\x8f\xd3\x59\xa5\x6d\x18\xa5\x24\x07\x20\xa1\x9b\x5b\x6c\xaf\x1e\x52\x41\xa3\x24\x16\xed\x35\x3f\xea\x3f\x2f\xf3\x22\x83\xb6\xe6\xb0\x9f\xc7\x3e\x97\x05\x0e\xd7\xad\x6c\xf8\xf8\xb5\x95\x0d\x8f\x51\x36\x18\x91\x54\xa5\xb4\xcb\x43\xad\xac\x78\xdf\xc9\xc3\xd2\x14\x0d\xe7\xcd\x01\x29\x67\x8c\xaa\xb8\xe9\x3b\xa6\x0b\xcc\xfb\x6e\x95\xd3\x2f\x74\x95\xa5\x50\xcc\x51\x29\x30\x30\xb1\x4a\x4f\x58\xb4\xfe\xc0\xee\x81\x54\xee\xf6\x43\xbc\x3d\x87\x66\xe6\xaf\x95\xbc\xe2\x99\xb3\x76\xeb\x5f\x9c\x81\x05\x13\xff\xe8\xb6\x7b\xde\x72\x73\x59\x6f\x78\x31\x76\x3a\x74\x98\xf3\x13\xff\x4a\xf0\x91\x78\x6f\x1f\xa2\x96\x06\x0a\xd2\x59\x29\xaf\x64\x26\xe6\xe2\xd8\x24\x3c\x03\xb9\x36\xcc\x59\x71\x70\xc3\xe8\xb0\xf0\xa5\xce\x0c\xbb\x5e\x08\x27\xab\x19\xf7\x2e\x00\xa8\xb0\x9b\x73\xa9\x58\xee\x96\xa8\xf0\x3f\x36\xe8\x4b\x70\xe2\xbf\xe0\xa5\x5b\xe0\xe0\x33\x00\x13\x79\xaa\x75\x46\x15\x0f\xd9\xb2\x1e\x9f\x6a\x7f\x94\xfe\xa7\x12\xd7\xff\x74\xa3\x19\x36\xcb\xf8\x3c\xb8\x0a\x8c\xb0\x2b\xde\xbe\x7a\xe8\x1b\x5f\x00\xca\x09\x2a\xc1\x78\x76\xcd\x97\xa6\x76\x9c\x44\xb8\x0f\xe6\x39\x7b\xb6\x0f\xec\xcc\x0d\x0b\x63\xa4\xec\xcb\x7d\x08\xff\x1d\x1e\x9c\xfd\xf3\xfc\x1f\xe7\xff\x3c\x38\x7a\x75\x72\xca\x4e\xb5\x15\x78\xa8\x45\xcd\x01\x93\x60\x61\xb8\x59\xc2\x33\xc0\x4a\xd7\x66\x02\xbe\x4b\x69\xd8\xb5\x54\xa9\xbe\x36\x9d\x7d\xb4\xc8\x7e\x8e\x78\x82\xab\x4e\x63\x24\xbc\xe0\xd0\xf3\xb0\xc7\x09\xb3\x92\x61\x12\x0f\x0a\x67\x78\x9a\x3e\x49\x4b\x5d\x20\x11\xbc\x93\xab\x3e\x6a\x9b\x66\x74\x9c\xc3\x0a\xeb\x3b\x6b\x0e\x38\x2f\xb9\xb2\xb5\xb7\xa7\x5e\x33\x6a\xb6\x38\xe9\xbd\x1c\x0f\xbb\xa2\x89\xa7\xc3\x55\x33\x1d\xa4\xa9\x48\x1b\xe4\x7f\x74\x99\x83\x87\xfe\xe5\x96\x35\x4a\x05\x3b\x7b\x7d\x7e\xf2\xff\xb6\xf8\x78\x59\xf4\x4b\x94\x1a\xa6\x32\xb6\xd4\xc5\x60\xab\xfb\x86\x2a\x2f\xb7\xeb\x7b\x2f\xd6\x37\x9c\x96\xc3\x84\xe7\xdf\x54\xaa\x09\x64\x54\x8f\xcf\x72\x9d\x8a\x09\x3b\x0b\x71\x82\xe6\xb7\x11\xc0\x01\x2f\x05\x73\xb7\x28\x2b\x79\x96\x2d\x63\x15\xcd\x6a\xac\x42\x6c\x60\x33\xc4\x82\x7c\xc6\x33\xb3\x69\x69\xdc\xe7\x6c\x74\x7a\xc4\x2b\x67\x0f\x0f\xb2\x1c\x61\x34\x96\x0a\xa5\x2d\x29\xd6\x6e\x96\x80\x77\x51\xea\x84\xa1\xf1\x1d\x25\x63\x35\xce\x37\x83\xb1\x0a\x7f\x34\x4a\xe3\x89\x7d\x16\x46\x46\x47\x75\x65\x44\x5b\x41\xf7\x7d\x88\x83\x39\xee\x46\x2f\x05\x4f\xb5\xca\x96\x90\x79\x89\xb9\x14\x39\x37\x97\x22\xc5\x0f\x48\x35\x0b\x91\x0a\x37\x62\x78\xd4\x85\x9b\xb7\x0f\x4b\x80\x4a\x86\x19\x1e\x10\xce\x10\xe9\x86\x57\xbd\xc7\x26\x74\x44\x79\xad\xb2\xe5\x1b\xad\xed\x8b\x50\x46\x3b\x08\x07\xfc\x44\xda\x72\xd3\x15\x0d\xea\x24\x87\xe7\x8e\x61\x35\x60\x53\xc5\x15\xbc\x47\xf5\x8a\x3f\xf4\x2d\x55\x56\xea\xc0\x7c\x57\xea\xaa\xf3\x21\xb6\xa2\x6c\x7e\x77\x72\x04\xa2\xa8\xa2\x50\xa5\xb2\xe5\x12\xa0\x03\x56\x51\xdf\x82\x61\xf0\x96\x82\xad\xf1\x9e\xa8\xe3\x62\xec\x15\x5f\x32\x9e\x19\xed\x69\x29\xd5\x5a\x2b\x94\x4c\x5c\xf7\xf5\x54\xdb\xc5\x8a\x6d\xeb\x36\xd4\xea\xef\x46\x51\xe4\xb2\x86\xa1\x93\x6a\xe5\xe7\x96\x5f\x0a\xc3\x8a\x52\x24\x22\x15\x2a\xd9\xf4\xb2\x6f\x3a\xe0\x07\xac\x73\xaa\x95\xdb\x98\x83\x30\xcf\x49\x88\xf4\x12\x49\x63\x56\x81\x98\x31\x59\x7f\x1c\x22\xc7\xb0\x2d\x2b\x23\x4a\x0c\x73\x97\x95\xc0\x95\xfc\xa1\x9a\x8a\xcc\x51\xde\x99\xa4\xd4\x29\x1e\xdd\x19\x32\xe7\x73\xc1\xb8\x0d\x9c\x66\x35\x13\xca\x38\x89\x89\x0e\x50\xcb\x52\x2d\xea\xea\x7b\x6e\xd8\xdb\x93\x23\xf6\x94\xed\xb9\x67\xed\x03\xff\x40\x23\x79\xab\x31\xc9\xad\x6d\xa3\xce\xfc\x10\x30\x25\x60\x5e\xa6\x4b\x14\x12\x23\xa6\x34\x33\x55\xb2\x88\xbb\xd7\x7b\xb3\x99\x12\x21\x21\xb4\x72\x3f\x79\x7d\xb3\x12\xea\xad\x11\xe5\x60\x02\xea\x6d\x07\x01\x15\xab\x51\x8e\xe7\x9a\xd4\x43\xc6\xca\x85\xe5\x29\xb7\x9c\x04\x97\xbf\xe1\xde\x2e\xe9\xef\x5b\x7c\x19\xf1\x52\xaa\xea\x3d\x26\x1e\x0d\xe7\x6a\x39\x3f\x86\x61\x59\xe2\xa9\x0e\xab\xce\x8b\x22\x93\x88\xb6\xd1\x4a\x84\x3b\x69\xf0\xca\xe8\x06\x35\x11\xe4\x04\xcf\x32\xed\xe4\xa3\x53\x4e\xb8\x4a\x75\xbe\xf2\x30\xa7\x44\x8a\x06\x5e\xea\x84\x6d\xb9\xaf\x79\xdd\x13\xa7\x50\x26\xae\x44\x0f\x6c\xb1\x36\x3e\xac\x1b\xcd\x11\xc7\x73\x04\x0c\xcf\x32\x3e\x15\x19\xd2\x18\x39\xd0\xac\x72\xe0\xa6\xb3\x51\x4b\x9d\x0d\x57\x3e\xf3\x46\x67\x02\xd3\xbb\x3c\x21\xdc\xf0\x0f\x82\x0e\x30\xc8\x50\x74\x00\x6b\xb0\x41\x07\xb0\x6b\x1f\x02\x1d\xaa\x1e\x47\x3d\x6b\xd3\xc1\xe9\x0d\x4d\x3a\xc0\xe1\x7d\xdf\xe9\x60\x44\x92\xe8\xbc\x38\x2b\xb5\x33\x3b\x07\x3b\x9b\x68\xd8\x3a\x66\x88\x8e\x8d\x35\xc9\x58\x70\x16\x34\x6f\xe6\x65\x94\xd8\xc9\x2d\x1e\x12\x3e\xbb\xf3\x7f\x44\x67\x16\x88\x9e\xf6\x41\xe6\x47\x69\x84\x17\xdd\x2f\xe9\x8b\x87\x7c\x1c\x0c\x51\x1b\xd1\xc3\xd9\x39\xc8\x69\xa4\x13\x9e\x01\x76\x6c\x3f\x96\x63\x6d\xb6\x6b\x0f\x1c\xa5\xf3\x42\x8c\x12\x3e\xf3\x09\x24\x00\x23\x0a\x9f\x90\x0b\x53\xe9\x54\x44\xb1\x6c\xcc\x43\xbe\xc0\xb4\x4f\xb8\xcf\x67\x12\x3b\xbd\xc2\x87\x95\xd3\xc6\xaf\xad\x26\x04\xb4\x57\x01\x91\xd6\x4d\x50\xa8\x54\xaa\x39\xf8\xd5\x46\xac\x14\x19\xe6\x20\x93\x10\xb8\x44\x0b\x72\x17\xb6\x84\x1f\xd4\xef\x07\xff\x68\xd0\xc5\xa4\x56\x34\x32\x78\x8a\xbc\x86\x35\x43\x71\x2b\x0d\xdb\x79\xe9\x09\xd0\x03\xc2\xf3\x3e\x9e\x30\x3b\xf8\x86\x61\x35\xd1\xd3\x79\x29\x55\x4a\xe9\xba\x0d\x62\x05\xb0\x75\xd4\x83\x21\x11\x5c\xa6\xb1\x6c\x79\xce\xde\x29\x16\x88\xc5\xc6\x9d\xd9\xe3\x0d\xaa\xcc\xde\x47\x37\xfe\xb0\xe3\x35\x3c\xa4\x3d\xcc\x5b\x05\x6b\xef\x9e\x3b\x76\x96\xfb\xea\x7d\xfe\x5d\x36\x0a\xdd\x43\xd2\x6f\x68\x2b\xe6\x27\x1c\xd6\xab\xf4\x89\x63\x6b\x2b\xd5\xdc\xc4\x96\x0c\xcf\xb2\x86\x33\x7c\x9d\x29\xe3\x57\x38\x40\xeb\xaf\x9a\x10\xad\x32\x83\x87\x62\x86\x64\x4e\x9d\x78\xe0\x46\xc8\x3c\x37\xfc\xb0\x74\x94\xb0\x92\x67\xe7\x45\x77\x88\x52\xb6\x02\x87\xf7\xea\xfc\xa0\x39\x34\x1c\xd6\xd0\xf9\xc1\xad\x95\xfb\x9e\xf1\x34\x97\xc6\x80\x23\x4c\x4c\x17\x5a\x5f\xb2\xbd\x35\x78\x5c\x51\x9e\x96\x91\x73\xf3\x84\x78\x7e\xec\x66\xbf\xcf\xa4\xca\x42\x56\x14\xd8\xc1\xca\x1a\xef\xc8\x81\x87\x24\x61\x16\xb0\x86\x84\x5b\x4d\xc9\x0a\xab\xd3\x44\xa4\x6a\xc7\x05\x1b\x17\xd8\xab\xcb\x73\xda\x13\x76\xe5\x23\x4b\x74\x4a\xbc\xdd\x46\x56\x5b\x4b\x47\xd4\x1e\x37\x4e\x24\x52\x2e\x12\x61\x86\x03\x74\xfa\xbe\x1e\x93\xa5\x02\xab\x78\x04\x64\x3f\xf1\x1b\x93\xec\xc0\x2f\xbd\x0b\xc5\xa0\xf4\xd3\xdd\x58\xa3\xbe\xa8\x85\x8b\xb3\x47\xb2\x62\xc1\xc7\x68\xa4\x3b\x89\x06\x22\xd0\xab\x10\x0b\xad\x34\x15\x49\xb8\x43\x54\x2b\x60\x69\x10\x51\x18\xcd\x83\x35\x21\x11\x1d\x4d\xf5\xb0\x8e\x12\xc7\x81\x40\x28\x26\x43\xfc\x88\x7a\x0e\xd7\xd2\x2e\x7c\xa7\x97\x46\xd4\x10\x66\x52\x0a\x03\x01\x18\xc5\x44\x59\xea\x92\x12\xb2\xbc\xdf\x1a\x46\x02\x49\x0e\x19\x5d\x8e\x49\xb8\xfb\x6b\xd7\xc4\x81\xea\x1a\x0a\x1e\xf2\x15\x1d\x37\x89\xd9\x4c\x24\xa0\x68\xc5\x04\x46\xa9\xbd\x57\x03\xdf\x52\x95\x81\x63\x30\x82\x92\xcf\xe5\x7b\xf7\x94\xf8\x57\x71\x48\x9c\x00\x67\xd7\x7f\xbd\x3f\x61\xec\x44\x85\x0c\xde\x91\x5b\xc5\xf8\x4e\x9f\x7a\x66\xdd\x2b\xc6\x7d\x08\xe0\x05\x62\xc7\x99\xd3\x0e\xcb\x6a\x00\x8e\xef\xe3\x0e\x67\xb1\x4b\x7c\x50\x71\x00\xae\x71\x1a\xd4\x2d\xbd\xd7\x01\xfa\xb8\xca\xdd\x2d\x9f\xca\x5d\xfe\x30\x02\x20\xac\xaf\x9c\x23\x34\x85\x81\xc0\xe1\xcf\xa3\xd1\x22\xed\x3d\x04\xdc\xce\x74\x8a\x68\x2a\x01\x0d\x02\x7a\x3a\x01\xba\x8b\xfc\xb7\xd7\xcf\x6a\x1d\x4f\x69\xac\x0e\x88\x61\x56\x08\x52\x3b\x65\x4e\xd5\xce\xbc\x6f\x21\x2f\x32\x01\x55\x9c\xd1\xc8\x75\x81\x6a\x84\x26\x3f\x0a\x13\xa9\x01\xe9\x09\xdc\x65\xc4\xfe\x1b\x36\x65\x48\x44\xf5\xb8\x13\x67\xe1\xe7\x68\x21\x4a\xe3\x5b\x4b\x40\x85\xa5\xd5\xde\x75\xc1\x52\x39\x9b\x09\x9f\xf0\xea\x2c\x47\x5e\xf2\xdc\x89\x78\xc3\x88\x04\x53\x31\x97\x98\x10\x19\x04\xdb\xae\x53\xf7\xa8\xd6\x6f\x84\xc2\x50\x5a\x96\xcb\xf9\x02\x19\x85\x71\xa8\xd0\x65\x3e\xa8\x98\x69\x9e\x32\xe0\x6d\x5d\xb2\x6b\x5e\xe6\xee\xdc\xe0\xc9\x02\x22\x94\x5c\xb1\xb4\x2a\x01\x65\xd9\x0a\x9e\x2e\xc7\xc6\x72\xeb\x34\x65\x51\x92\x41\xe9\xe7\xbf\x85\xd4\xff\xe0\xb5\x85\xd4\xbf\xe5\xb5\x85\xd4\xdf\x42\xea\xaf\x5e\xf7\x26\x3b\x74\x0b\xa9\xff\xb8\x60\x92\xb6\x90\xfa\x9b\x8e\x26\x6c\x21\xf5\xb7\x90\xfa\x1f\xba\xb6\x90\xfa\x1f\xb9\xb6\x90\xfa\x1d\xae\x47\x20\xb9\xb6\x90\xfa\x1d\xae\x2d\xa4\xfe\xfa\x6b\x0b\xa9\xbf\x7a\x6d\x21\xf5\x6f\xbc\xb6\x90\xfa\x9d\xaf\x2d\xa4\xfe\x16\x52\x7f\x8b\x34\x7a\xb7\xb1\xee\x27\xd2\x28\xdb\x42\xea\xd3\xb5\x85\xd4\x7f\x14\x78\x8a\x6c\x0b\xa9\x7f\xab\x6b\x0b\xa9\xbf\x85\xd4\xef\x72\x6d\x21\xf5\x1f\x8b\xbb\x64\x0b\xa9\xbf\x85\xd4\xff\xfd\x28\xba\x5b\x48\xfd\x2d\xa4\xfe\x16\x52\x7f\x0b\xa9\xff\xc1\x59\x6c\x21\xf5\x1f\x83\x09\x68\x6c\x2a\x3b\x21\x80\xde\x06\xac\x88\x92\xd0\x23\x6c\x80\x69\x35\x9b\x89\x12\x24\x17\x3c\x79\x25\x79\xaa\xc6\x65\x6c\x07\x59\x85\x1d\x01\xee\x11\xd5\xeb\xdc\xf0\x73\x02\x23\x00\xa4\xce\x3a\x53\xfc\xf8\xf5\x8b\x35\xc8\x48\x9d\xb3\x0a\xbb\xe6\x48\xc3\x9c\x5f\xab\x6e\xf1\xf1\x1b\x08\xbe\xae\x7e\x8c\xe8\x9e\x64\xda\x50\x86\x3b\x10\x2b\x59\x70\xa5\x84\xb7\xf7\xa4\x05\x3f\xca\x54\x08\xc5\x74\x21\x28\x3a\xcd\x99\x91\x6a\x9e\x09\xc6\xad\xe5\xc9\x62\xe2\x9e\xa4\x3c\xb1\xeb\x6c\x74\xfa\xc4\xd8\x52\xf0\xdc\xe7\xe5\xe7\x5c\xe2\x50\x8c\x27\xa5\x36\x86\xe5\x55\x66\x65\x11\x06\x63\x46\x40\x41\x0d\x1e\x54\x81\x18\x90\x15\x57\xa7\xb0\x8f\xea\xa7\xd1\xb4\x74\x0c\x4d\x07\xd6\xe6\x08\xf0\xc0\xf3\xc2\x2e\x43\x1e\xaf\x60\x33\x59\x1a\xcb\x92\x4c\xc2\x69\x0d\x4f\xc4\xda\x69\x18\x6f\xe4\xcf\x6a\x45\x33\x35\x34\x55\x95\x82\xda\x5a\x58\x83\x59\xb1\xf5\x80\x34\x54\x2a\x0d\xa9\xf9\x66\xc4\xb8\xc7\x4d\x43\x42\xfb\x99\x02\xa9\xfd\xc9\x82\xa3\xd3\x47\xd1\x70\x11\x5e\x6c\x9d\x36\x5c\x33\x3a\x94\x38\x78\xe6\x1c\x35\xaa\x39\x6a\x85\x02\xb2\xf4\x56\xb6\x01\x2c\x80\x12\x57\x8e\x07\x44\x22\xdc\xf9\xca\x6f\xe0\xfa\xcf\xce\xf4\xd1\xa1\xf8\x4a\x18\xc3\xe7\xe2\xac\x63\xa0\xe1\x26\x8b\x0c\x62\x0d\xf5\xc2\x00\x2b\x64\x58\x5d\x1b\x3e\xa9\xb3\x33\x9b\x6a\x10\xcb\x71\x4e\x41\xf9\xb9\x2e\xa5\xb5\x02\x16\x15\x10\xf6\x20\x56\xd9\x2e\xc0\xdf\x6d\xe5\x78\xbe\xf2\x83\xd4\x3f\x76\x42\x5d\xa5\x98\x71\x39\x15\x6c\x5a\x4a\x31\x63\x33\x09\x69\x9c\x90\x58\x39\x42\xc0\x25\x8e\x5e\x00\x63\x9c\xbd\xab\x95\xd7\x65\xfd\xbc\x26\xec\x27\x9a\x98\x2d\x2b\x95\xf0\x08\xcb\x16\x2a\x4c\xe5\x8c\xcd\x21\x31\x93\xb4\xc5\x3f\x3f\xfd\xcf\xbf\xb2\xe9\xd2\x1d\x69\xa0\x59\x59\x6d\x79\x16\x5e\x32\x13\x6a\xee\x68\x85\xdb\xb3\x59\x23\x19\x28\x00\xdd\x3c\x70\xe2\xcf\xbe\xbc\x9c\x36\xcf\xd8\x27\xa9\xb8\x7a\x12\xd1\x6f\x9c\xe9\xf9\xba\xfe\x28\xdd\x53\xb6\x3b\x9a\x44\x6b\xd8\x4c\x67\x32\x59\xf6\x66\x34\x8f\xfc\xc5\x16\xfa\x1a\x75\xfd\x35\xdc\x53\x97\x5b\x15\xba\xa8\x32\x74\x3a\xbf\x08\xd5\xc5\x95\x11\xab\x35\x80\x6b\xf7\x05\xb8\x49\x69\x88\x36\x6e\x3a\xe6\xe3\xfa\x47\x6a\xaa\x2d\x21\x47\x5e\x00\x00\x03\x43\xe8\x05\xcf\xb2\x29\x4f\x2e\x2f\xf4\x4b\x3d\x37\xaf\xd5\x71\x59\xea\xb2\x39\x97\x8c\x3b\x69\xb9\xa8\xd4\x25\x76\x70\x08\x10\x09\x7a\xee\x54\xab\xa2\xb2\xbe\x90\x61\xdd\x0b\x63\xbd\xbc\x17\xc2\xde\x0c\xaa\x47\x11\xef\x65\x6d\xeb\x50\xa9\x16\x72\x64\x3c\xbe\x89\x99\xed\xcb\xa7\x7f\xfe\x1a\x59\x97\xe9\x92\x7d\xfd\x14\x72\xb6\xcd\x08\x37\x31\xc8\x36\x77\x50\xe4\x3c\xcb\x9c\xd9\x10\x33\xa5\x23\xf4\x3a\x26\xfc\xec\x3c\x68\xfb\xb3\xdb\xad\x55\xa9\x8b\x8b\x7f\x80\x1e\x25\xad\x11\xd9\x6c\x84\x55\x49\xc1\xac\xd9\x85\x83\x61\x97\xa4\x0f\x94\x86\xdd\x03\x05\xe8\x4a\x67\x55\x2e\x8e\xc4\x95\x1c\xa2\x89\x53\x63\x34\x6f\xea\x67\xd2\x40\x01\xd8\x34\xd3\xc9\x25\x4b\xe9\xcb\x28\xf3\xa4\x8d\x04\xde\x9d\x0a\x5d\x73\x70\x7a\xe4\xde\xdc\xf8\xfe\x8d\xac\x9b\x9c\x17\x45\xa8\x11\x2a\xf9\x75\x83\x18\xb0\x27\x01\xae\xa0\x27\x9e\x4c\x6f\x37\x73\x5f\x27\xf3\x98\xde\xc8\xc9\xcd\xce\x43\x74\xce\x3a\xe9\xef\xa3\xae\x67\xdf\xdd\x31\xd9\x60\x88\x7a\x40\xbf\x1b\x0a\xf8\x37\x56\x95\xac\x54\x45\x86\xc2\xba\xc0\x18\xa8\x00\x38\xf6\x01\x91\xdc\xdd\xe1\x3a\x80\x77\xb3\x5f\xca\x51\x83\x2e\x2a\x78\x95\x73\x6e\x49\x21\xf4\xee\x6b\xce\x0a\x51\x1a\x69\xdc\xb9\xfc\x23\x6c\xa8\xc3\x8c\xcb\x3c\x72\x01\x6e\x86\x08\xb8\xb9\x01\x3e\xb9\xbf\xa4\x3c\xd3\x29\x0d\x08\xa2\x10\xa1\xa3\xd7\xa8\xb5\x4d\xad\x76\xc0\x03\x75\xd3\xa2\xf2\xc7\x9a\x9a\x4d\x49\xe9\x3e\x09\xa2\x12\xef\x7a\x4c\x02\x12\xde\xef\xa1\xca\xc7\x30\xf9\x81\xc4\x00\x08\x46\x5a\xdc\xa6\x24\x6c\x18\x8f\xb8\x51\x22\x95\x9e\xec\xc0\x09\xc3\x28\xb8\xdb\x13\xf4\x53\xb6\xfb\x7c\x77\xa3\x42\x12\x49\x54\xea\x82\xcf\x7b\xf5\xf2\x69\x51\xaa\x3d\x6c\x0c\x34\xe1\xcc\x20\xf8\x3e\xc0\xae\xc1\x5d\x22\xad\x71\x74\x00\x25\x09\xa3\xa3\x9e\xc0\x64\x20\x60\x3d\xf6\x35\x5f\x32\x5e\xea\x4a\xa5\xe4\x5f\x0a\x0e\xbe\x57\xad\x07\x9f\x6a\x25\xbc\xe3\xbc\x8d\x53\x01\x1e\x7d\xa9\xd8\xb3\xc9\xb3\xa7\x8f\xe5\xa4\x82\x37\x6c\x9d\x54\xa7\xe1\xa4\x42\xf9\xb4\xd1\x77\xf5\x88\xf7\x03\xbd\xef\x2b\x72\xb1\xd4\x80\xf6\xd2\xc3\x65\xc3\x47\xd7\xa5\xb4\x22\xea\xf1\xb7\x07\x86\x8b\xb3\x0f\x23\x54\x86\xfd\x75\x9d\x24\x7a\x12\xa9\x1f\x0c\x86\xa9\xa6\x9f\x50\x6e\x91\x80\x82\xed\xb6\xce\xc3\x65\x3e\x20\xc2\x62\x42\xed\xec\xb0\x3d\xbc\x73\x17\x0b\x9a\xf7\x37\xca\x5a\x44\xb4\xe3\xf7\x45\x0f\x8c\xcd\x56\xed\x7c\xc1\xc1\x07\x57\x0c\x48\xc1\xbf\x8b\x05\xbf\x12\x50\xc8\x2d\x33\x5e\x66\x10\x73\x3c\xc7\xb9\xb3\x69\x65\x99\x50\x57\xb2\xd4\x2a\x17\xca\xb2\x2b\x5e\x4a\x40\xc5\x29\x05\x20\x3b\x38\x5b\xf4\x8f\x7b\x3f\x1e\xbc\x81\x84\x86\x7d\x82\xa4\xa0\x59\x56\xc6\xc3\xd7\xc4\x33\x89\x86\xfb\xe8\xf2\xf9\x79\x38\x1a\x82\xcc\xf5\xf3\x72\xcf\xc9\x2b\x5b\x61\x5b\x96\xf7\x49\x56\x19\x79\xb5\x29\x49\x42\x15\xf6\x47\xb2\xd3\x3a\xb7\xaa\xfd\x6b\x42\xad\x14\xee\x83\x6b\x7d\x4d\x81\xde\x4a\xc0\x64\xd7\x84\xa2\xbd\x38\x06\x4e\xae\x27\xc2\xd2\xc0\xf4\x39\x8f\xb8\xb8\xa2\x42\x00\x6e\xcc\x66\x9d\x50\x4a\xa7\xe2\xee\xa8\x3b\xcd\xf4\x1e\x1a\x02\x63\xe6\x51\x05\x9f\x49\x16\x22\xad\x00\xde\x49\x1a\x04\x47\x75\xe6\x03\xaf\x51\xf8\x14\x74\x09\x3a\x99\x05\x48\x03\x35\x06\xe7\x20\xd2\xdc\xff\xbe\xf4\x00\x08\xfe\x03\xd3\x1a\x11\x8c\x52\x37\xd6\x88\x71\x63\xaa\x1c\xb7\x04\x36\x40\x98\x49\x6b\x42\x8f\x59\xaf\x1d\xbb\x8d\x71\xc7\x82\xaa\x1e\xf4\x3d\x17\x19\x30\x57\x0f\x1a\xef\x9e\x46\xe3\x20\xa1\x8d\xff\x8b\x18\x8e\x12\x26\x20\xda\x16\xf2\x38\x35\x78\x49\x67\x12\x9a\x28\x71\xa2\xf7\xf9\x9a\x5f\xa2\xea\x80\x77\x00\x3c\x0c\x9f\x8a\xcc\xb4\x07\x9a\xd6\x8b\x42\xa8\xa4\x44\xf8\x9e\x5d\x72\xb9\x31\x72\xae\xa0\x7f\xa6\x1b\xed\x8e\x9d\x32\x3b\xdb\x4c\x43\x74\xc1\xed\x2c\xd5\x1a\x59\x58\x39\x2f\xc6\x64\xf5\x5a\x9d\xcb\xe4\x0e\x23\xe9\x3b\x4e\xb9\x55\x2b\xdd\xa8\xc1\x7d\x7d\xbe\xe2\xf1\x31\x91\x57\x63\xc2\xce\x75\x4e\x29\x4e\x2a\xea\xe2\xe5\x9b\xa9\xba\x13\xa3\x14\x8e\x16\x90\x78\x24\xeb\x68\x3c\x74\xbd\xf1\x55\xd0\xf0\x9c\xa0\x92\x53\x18\x17\xe0\x27\xa9\x99\xab\xce\x32\x7d\x0d\x89\xc5\x38\xae\xe7\x6d\x48\x81\x79\xce\xc6\xad\xce\xb4\x93\x26\x68\xe8\x87\x9f\x43\xf7\x8e\x3e\xfe\x14\xcc\xcf\x01\x38\xbe\x93\xa3\xf8\xcf\x93\xb3\x43\xff\x67\x7b\x26\xcd\x26\x0c\x37\xdf\x15\xc3\x61\xdf\x74\xd7\x0c\xfb\x18\x7d\xe4\xeb\xc3\x05\x57\x3e\x6e\x75\xe3\xf3\x96\x26\xb1\x59\x3d\x9d\x05\x2f\x05\xc1\xc5\x39\xc1\x6d\x0a\x9e\xdc\x38\x8b\x80\xcd\xf6\xc1\x1b\x3e\x38\x53\x53\x15\xbe\xbf\x76\x06\x37\x86\x99\xd4\x5c\xf6\xf3\x9f\x7e\xb9\x25\x31\x3f\xf6\x9b\x75\xa4\xfd\xf0\x6f\x1a\x5d\xfa\x6e\xf5\x8b\xf5\x3d\xbc\x6e\xf7\xdb\xa8\x0d\xde\xad\xee\xbf\xa9\x05\xef\x6d\x9f\xe6\x5b\xb7\xdd\xee\xc5\xda\xab\x7d\x8b\xdb\x71\xed\x3f\x9e\x35\xe7\x36\xe4\x09\x20\x6e\xce\x96\x67\x3a\x75\x7b\x13\x53\xe4\xee\x06\x6c\xd0\x59\xda\x77\xf5\x8c\x75\xf0\x67\x75\xf7\x63\x75\xf3\x0b\xb4\x74\x85\x1b\x50\x4f\x09\x91\x4d\xcd\x59\x03\x67\xaa\x2a\x4b\xa1\xa0\x43\x7e\x05\x49\x91\xbe\xf3\x3d\xca\x73\x90\xcb\x84\xe9\x89\xc0\xf4\xec\x20\x1c\x9b\x94\x2c\x97\x73\xc0\xf9\x8c\x70\xad\x67\x15\xe4\x3e\xc2\x29\x81\xb8\x75\x5a\xb9\x79\x3c\x5f\x07\xa6\xa1\x0b\xa1\xa2\xb6\xf8\xa4\x60\x8f\x1d\xff\x35\xe0\x35\x50\x67\x98\xe4\xe9\x1f\x8a\x8c\xdb\x99\x2e\xf3\xb1\xd7\x24\xc7\x0d\x7d\x82\x1d\x42\x16\x8e\xf1\xa6\x18\xa6\xc2\x22\xfe\xa6\x4a\x33\x11\x1d\xfc\xe1\x55\x55\x8a\x68\x55\xac\x52\xa5\x48\xf4\x5c\xc9\x7f\xd7\x84\x80\x23\x30\xf8\x91\xb8\x71\x87\x2e\x53\x55\x96\xdd\x3d\x65\xa1\xa3\xbe\xa0\xaf\x44\xb9\x10\xfc\x8e\xcc\xdb\xca\x7e\xa1\x31\xea\x36\xa5\x86\xe0\x07\x48\x3b\xf6\x0f\x71\x5a\xb4\x4e\xa0\x0c\x0e\xa3\xf1\x3e\xc7\x99\xc3\xd9\xef\x94\x42\xce\xe6\xf2\x4a\x28\x8f\x4e\x7e\x98\xf1\xd0\x6a\xdb\x03\xb2\x12\x42\x7a\x65\x75\xc8\x6f\x60\xdc\x46\x18\xc9\x90\x0e\x45\xa1\xd5\x78\x9c\xe8\x16\x6a\xd4\x9d\xf9\xa6\x68\xb7\xb9\x13\x52\x0c\xb0\x4b\xe4\xa8\x7e\xa5\xdc\xbb\x61\x1b\x20\x9c\x2c\x81\x44\x18\x6f\xb5\x50\x02\xcc\xc7\x1f\x41\xd9\x6b\x4e\x06\xad\x1b\x86\x34\xeb\x80\x16\x5b\x13\x36\x73\x47\xc7\x12\xf5\xa1\x93\x59\xf3\x49\xb2\x81\xcf\x0f\x65\x52\xa0\xa9\xd7\xa6\xe3\x99\x4e\x9d\xc2\x36\x62\x61\x29\xe3\x3e\xe5\x14\x9a\xc1\x3d\x19\x6d\x46\xd4\xe7\xca\x52\x98\x42\x63\x9b\x80\xf8\xb1\xa3\xc8\x55\x26\x6d\x23\x2f\x0f\x1b\xbe\x85\xad\x81\x40\x6e\xff\x16\xa5\x5e\xab\xee\xcf\xa5\x9d\x5c\x7e\x0d\xba\xbe\x50\x0b\xae\x12\x34\xb3\x9e\x5c\x8a\xc2\x3c\x31\x72\x8e\xaa\xfd\x5f\xbf\xfe\x1a\xf4\x7c\x4f\x92\x27\x6f\x8e\x0f\x8e\x5e\x1d\x4f\xf2\xf4\x01\x29\xfd\x05\xb7\x56\x94\xea\x39\xfb\xaf\xbd\x77\x5f\xfc\x36\xde\xff\x76\x6f\xef\xe7\xa7\xe3\xff\xfc\xe5\x8b\xbd\x77\x13\xf8\xc7\x9f\xf6\xbf\xdd\xff\xcd\xff\xf1\xc5\xfe\xfe\xde\xde\xcf\x3f\xbc\xfa\xee\xe2\xec\xf8\x17\xb9\xff\xdb\xcf\xaa\xca\x2f\xf1\xaf\xdf\xf6\x7e\x16\xc7\xbf\xdc\x72\x90\xfd\xfd\x6f\xff\x78\xc7\x89\x76\x2c\x61\xe9\x5b\xb6\xd2\xab\x54\x65\xc0\xf2\x94\xa2\x14\x22\x07\xf1\xd7\x25\xb1\xab\xe9\x50\x6d\x0d\xe5\x0f\x58\xfa\xcb\xc9\x44\xff\x34\x35\x77\x62\xd2\xa0\xe8\xcc\xf4\x35\x24\x63\x4a\xed\x14\xa7\x09\x7b\x0d\xe7\x20\x3b\x15\x57\xa2\x1c\xf9\x51\x5f\xba\x9b\xce\xc2\x3d\xb1\xc7\x6e\xdd\x1d\x1d\xcb\x01\x3a\xae\x89\x9f\x7b\x0f\xe2\x61\x8b\x13\x9a\x3c\xc8\xa7\x09\xfb\x91\x97\x52\x57\x86\x74\x91\x18\x19\x1c\xb3\xcd\xc2\x49\x02\x0e\x0c\x8a\x05\x85\x41\x42\x11\x99\x0f\x07\x05\xda\x1c\x04\x79\x7d\xb8\xfe\x48\x90\xd6\xad\xd4\x95\x7f\x54\xe9\xb3\x62\x57\x40\xc5\xf1\x30\x58\x2b\xff\xfd\x89\x66\xe2\x89\xc2\x30\x7e\x1e\x20\x5b\x9d\x26\x86\xa3\x2c\xe4\xdc\xe7\x5e\xc3\xfb\xa3\xa5\x1b\x7d\x1a\x38\xa4\xc3\x92\x76\xd9\xa6\x5d\x4b\x00\x8a\xf6\xfb\xf5\x60\x8b\x26\xf4\x72\x8c\xde\xec\x8b\x8f\xea\x7d\xb3\x83\x7c\x02\x87\xc8\x38\x29\xa5\x95\x09\xcf\x76\xe0\x70\xf2\x5f\x25\x59\xe5\xf4\xc4\xf8\xdb\x52\x30\x7b\xad\xf1\x29\x3c\x63\x97\x62\x79\xad\xcb\xd4\x9f\xcf\xfe\x89\xf5\x5a\x18\xeb\x1f\xe9\x6c\x41\xd8\xc0\xe8\x91\x28\x73\x51\xb2\xa9\xf0\xce\xf6\xd6\xcd\xcb\x09\x3b\x50\x4b\x8a\x54\xaa\xb8\x1e\x31\x02\x71\x03\x1d\x01\xb5\xa8\x06\x93\xd0\x21\xe6\x9f\xc6\xb1\x52\xf4\x26\x47\xb4\x53\xc0\xc2\x2e\xf0\xa7\xbf\xf7\x44\xeb\x92\x0a\xa2\x60\x77\x94\x58\xce\xa5\xfd\xd7\x9f\x45\x5a\x38\xfd\x46\x2a\x61\xcc\x77\x6e\x29\xfb\xa8\xab\x4d\xee\xe0\xa0\x96\xd0\xd8\x50\x54\x55\x67\x1f\x0b\xb7\xa5\x30\x9c\xec\xc4\xb0\x4e\xeb\x3b\x27\xec\x00\x3e\x80\xf4\x79\xa7\x79\x41\xc1\x9d\x1b\x4c\x5a\xd3\xee\x43\x8f\x77\x1c\x9c\x1e\xf9\x34\x67\xd4\x14\x4c\x13\x59\x1d\x55\xe6\xe6\x4c\x40\xd3\xa3\x64\x5b\xf1\x6b\xc5\xa1\xa5\xee\xce\x45\x59\x89\x9d\x6e\xaa\x12\x62\xf6\x3f\xf9\xcb\xd7\x4f\x41\x5b\x0a\xcf\x1b\xc3\xf3\xba\xa8\x4a\x77\x4f\xa7\xe9\x94\x48\xd3\xce\x21\x7a\x13\xf3\x83\x27\xb8\xb7\x3b\x28\xbe\x05\x65\xc0\xb0\x4c\x81\xe6\x9d\xbc\xb0\x9d\xd2\x66\xba\x27\xcc\x8c\xeb\xe9\x5e\xdc\xbd\xdd\x59\x9f\x5c\x97\xc6\x73\x87\x08\x88\xd5\xa3\xe1\xaa\x18\x5c\x92\xf0\x9c\xc8\x09\x8c\x5d\x31\xe8\x63\xc8\x9c\x05\xc1\x05\x01\x04\x10\x8f\xcb\xa2\x47\x96\x70\x07\x79\x03\x45\x31\xbd\xf5\xbb\xdd\x37\x38\x10\x2b\x6a\x85\x6e\xa5\xd8\x21\x04\x83\x41\xef\x20\x55\xee\x00\x2a\xc7\x46\xec\xb5\x7a\x81\xa9\xf4\x23\xd4\xee\x1a\x40\x25\x78\xd3\xa0\x15\x85\x4f\xfe\x40\xef\x3e\xc6\x29\x77\x11\x0a\x77\x27\x77\x64\x39\xf6\x3c\xfd\x77\xdf\xb4\xc6\x6a\xb0\x5e\xc3\x32\xa6\x13\x52\xd6\x6d\xd2\x48\x7c\xb2\x79\xa9\xab\xc2\x07\x5d\x9b\x3d\xcf\xea\x46\x1f\x18\x2b\xc4\x96\xc0\x4a\x37\x87\x0e\xce\x0f\x60\x60\x51\x7b\xcd\x52\x96\xa0\x79\xec\x4f\x5d\x2c\x98\x42\x0f\x42\x59\xa9\x66\x4b\xf4\x28\x6c\xb9\x93\x89\x39\x4f\x96\x3b\xcd\xe7\xac\x0b\x12\x4b\xa8\xe3\x91\x39\x62\xab\xe3\xf3\xea\xf2\x07\xa8\x92\x00\xfd\x01\xf7\x1a\xa8\x06\x95\xa1\x29\xfa\x23\xdf\xd7\xef\xa1\x67\xab\xec\x61\x99\xff\xe5\xeb\xbf\x8c\xbd\xef\x0d\xa6\xf2\x59\x18\x2a\x04\x79\x07\xd5\x25\x1b\x6b\xe6\x14\x24\x69\x0a\x58\x5f\xd0\xc4\xea\xe3\x3c\x3c\xfd\x43\xea\xd6\xfa\x41\xfc\x02\xd4\x43\x7c\x16\x72\x35\x3d\xf0\x7d\xb6\x5f\xbb\x43\xcc\x42\x67\x29\x6c\x14\xea\xe3\xe4\x1f\xc5\xb8\xb5\xa5\x9c\x56\x96\xdc\xa4\x89\xce\xf3\x66\x79\x25\xf5\xd2\x9b\xb0\xba\xbe\x2e\x36\x61\x81\x93\x27\x8c\x9d\x0b\x81\x7d\x24\xa3\x79\x80\x9c\xf5\xa4\x24\x6f\xab\x9e\x61\xd3\x6f\x34\xc2\x3e\x93\x5b\xa8\xfb\x71\x4c\x81\xb8\x9e\x5e\xfb\x9d\x83\x60\xa5\xc4\xf1\x32\x14\x70\x2b\xad\x7d\x5b\x27\x13\x64\x1e\xd7\x01\x5a\x4a\x44\x72\xb4\x30\x08\x27\x0b\xbc\xfc\x03\xb6\x01\x85\x2c\x4b\x88\x1a\xa2\x6f\xf2\xda\x0d\xb1\x90\x05\xda\xd4\xdc\x86\x9f\x43\xbc\xdf\x7d\x1d\xa3\x34\x40\x5f\xcb\x67\x68\xd4\xea\x6b\xf0\x0a\x7f\x77\x72\x14\xf6\x88\xbb\xeb\xc5\x39\x86\x84\xbe\x9c\x50\x97\x5e\x3b\x97\x29\x9b\x62\x8e\x87\x93\x97\x7b\x4a\x5c\x63\xd6\x38\x39\x4e\x83\x5e\x7d\xe5\xb3\xa9\x71\xb4\xf0\x70\x1a\x72\x9f\x7d\x45\xfd\x52\x45\xe9\xad\xf2\xa9\xa4\xac\xd2\xd7\x6f\x76\xbd\xbb\xfa\x7a\x5c\x5e\x8f\xc7\xe3\x31\x85\x82\x41\x4a\x8f\x1a\x34\x08\xc2\x3c\xd7\xa9\x9c\x2d\x5b\x94\x70\x6c\x5e\x3f\x02\x38\x92\xab\x25\xcd\xae\x7f\x6b\xdf\xbb\x23\x79\xf7\x73\xc7\xf5\x41\x6e\x58\x13\x66\xee\x1b\x9f\x5a\x17\xb9\x46\x3b\xd9\xd4\x00\xe8\x7a\x86\x4c\x0a\x89\xf6\x37\x2c\x8c\xf7\x02\x11\xd7\x10\xac\x1f\x5a\xe9\xe2\x7d\xa1\x11\x34\x18\x0a\x59\xa0\xb9\x5b\x3b\x3c\x01\xc9\xa3\x6e\x57\x41\x3e\x5e\x63\xd7\x90\x42\x81\x11\x31\x4f\x04\x36\xe5\x6e\xc8\x30\x9d\xbd\x16\x9f\xec\x4f\xd8\x09\xb1\x16\x18\x84\x4a\x53\x8b\x38\xa6\x15\x13\xc5\x42\xe4\xa2\xe4\x59\xf3\x41\x54\xd0\xfb\xdc\x89\xdb\xd2\x71\x29\x86\x00\x72\x5e\xa0\xb4\x05\xe1\x99\xca\xd2\xb7\x98\x8d\x42\x73\x3b\xaf\xd5\x1b\xad\xed\x2b\x69\x40\x77\x21\x67\x08\x6a\x9a\x3b\xeb\x0e\x34\xff\x5d\x9d\x1d\xdd\x97\x93\x3f\x5b\xfc\x8b\xf9\x36\x71\x43\xc8\x5a\x27\x41\x9c\xd0\xba\x6b\x27\xb8\xb7\x84\xf7\xd3\x68\xb8\x1b\x7c\xb1\xeb\xfa\xbc\xad\x34\x79\xfb\xcc\x5d\xde\x28\x81\x8b\xdb\x06\xb0\xd6\xe7\xee\x4c\xbe\x39\xe9\x05\x2c\x73\xaa\x61\x9f\xf4\x64\x9a\x93\xd5\xe6\x72\x35\x8b\x80\xbb\x2f\x74\xcd\x54\x5a\x8d\xa1\xd9\x53\x65\x7c\xe0\xb2\xf4\x2e\xdf\xc6\x01\x44\x1d\x28\xf1\xd8\xc4\x2e\x82\xbc\x56\xe9\x9d\xea\xa4\x4c\x55\x8a\x90\xcc\x98\x6a\x51\x37\x7e\xe2\x86\xbd\x3d\x39\x62\x4f\xd9\x1e\x24\xf2\x86\x62\x6e\x84\xaf\x70\xa6\x6c\x2b\xdb\x74\xe6\x87\x68\x9a\x2e\x84\x1d\xa1\x34\xca\x22\xdf\x15\x53\xab\x70\x0c\x13\x06\xe7\x0d\xbd\x0c\x37\xcd\xe3\x5d\xf9\xb1\x5b\xba\x7e\xc8\x90\x19\x40\x06\xbd\xed\x20\x83\x62\xc5\x7a\x88\x4e\x94\x9b\x5e\xbd\xdf\xbb\x84\x6a\x26\xb9\x0d\xc0\x54\xe7\xc7\x30\x20\xe2\x46\xbc\xb7\xa4\xc6\xdf\xb1\xcd\xf9\x2a\x3e\x10\x81\x24\x05\x28\x81\x92\xab\x54\xe7\x2b\x4f\x73\xab\x09\xc6\x5b\xb4\x9a\x5b\xb6\xbb\xe9\xea\x55\xed\xd9\xaf\x58\x12\x6c\xfc\x01\xaa\x64\x5f\x82\xaf\x40\x9a\xc0\x09\xe8\x3c\x80\xfc\xf1\x15\xb3\xb5\x37\x88\x42\xef\xa2\xa1\x52\x67\x1d\xeb\xee\x1a\x6f\xfd\x46\x67\x54\xef\xe0\x5f\xdb\x0d\x7c\x6f\xdf\xda\x76\x0c\x13\xb4\xc5\xcb\xb2\x68\xbd\x35\xb8\x73\xee\xeb\x5b\x57\x9d\x4e\x69\xd6\x7e\x6b\x48\x87\x6d\xbc\x35\x9c\xbb\xf7\xf1\xad\x9b\xd9\xcf\x03\x1c\x26\x34\x20\xd3\x94\x83\x4d\x4d\x07\xda\x78\x28\x75\x86\x24\x38\xa1\x1e\x96\x1c\xed\x53\x31\x8f\x89\x4e\x9f\x5b\x74\xeb\x84\x67\x0b\x6c\xf9\xde\x6d\x9d\x59\x7b\xad\xdb\x43\x46\xc9\x18\xdc\xcd\x16\x3e\x8b\x52\x0a\x39\x82\x39\xe9\x3a\x20\xd3\x0a\xbe\x90\x9b\x8e\x7e\xe9\xb3\x21\xdc\xf9\x5b\x67\x38\xc6\xbf\xb6\x9a\xba\xd0\x7a\xd0\x78\x0e\x13\x14\x98\xaf\x58\x70\xbb\x18\xb1\x52\x64\x88\x03\x4b\xfb\xec\x12\x4d\xa9\xdd\x46\xda\xa4\xe7\x58\xff\x68\x50\x58\xa0\x0b\x35\x8c\x0c\x2e\x1f\xaf\x86\xcc\x50\x7e\x49\xc3\x76\x5e\x7a\x02\xec\x3c\x64\x01\xbd\x83\xef\x13\xd6\x0e\xbd\x58\x97\x52\xa5\x04\x90\xda\x20\x4d\x48\xd1\x45\xdd\xd0\x7b\x98\xfc\x5e\xe7\xa5\x00\x67\x6f\x20\x0d\x1b\x77\x66\x06\x0a\x85\xf9\x80\xe8\xf8\x06\x25\xd3\xfb\x54\xfc\x43\xda\xc3\xbc\x55\xb0\xd2\x0a\x6a\x27\x94\x5e\x73\x9f\x7f\x97\x6e\xcd\x12\xfb\x88\xde\x95\x22\x97\x9e\xe2\xf7\x20\xc0\x52\xcd\xb1\x66\x26\x52\xe1\x6b\xe8\x4a\xb2\x0b\xa9\x13\x74\x4b\xf5\x1e\xc1\xea\x50\xbe\xeb\xca\xe9\x84\xe9\x55\x39\x2f\x97\xec\xbb\x93\x23\xd4\xc0\x1b\x86\x80\xd2\xfe\xd1\x81\x53\x52\x42\x27\xe4\x6a\x79\x0f\x14\xe7\x6e\x08\x31\x9d\xf1\x61\xfa\x22\xef\xf6\x32\x13\xb1\x84\xab\x27\x4f\x9d\x53\x21\xd8\x42\x67\x29\xe3\x81\xc1\x94\x2f\x02\x4b\xfd\x73\x30\x80\x1e\x55\x7f\x4e\x9c\xf1\x45\xc1\xe9\x4a\xd5\x95\x22\xfe\xfe\xbd\xb6\x4a\xe0\xf7\xf4\x3e\x95\x42\x7b\xcf\x54\xc6\x2b\x95\x2c\x7e\x2f\x2c\xb3\x86\xfa\x21\xd4\xc1\xd9\xa5\x28\x95\xc8\x58\xc1\x4b\x9e\x0b\x1b\x9a\x1d\x1a\xd1\x05\xfa\xa7\x27\x72\x50\x3f\xdc\xa0\x1e\x98\x3f\xdd\x9b\x16\xf6\x45\x0b\xea\x83\xc1\xb2\xa6\x93\xdb\x0c\x4f\x47\x37\xa5\x25\x35\xf8\xec\x38\x78\x6f\x60\x8c\x5e\x6d\x08\x9b\x20\x58\x88\xe0\x7f\x2f\xde\xad\x59\xe6\x3b\x80\x75\xf3\x13\x0e\x58\xe3\x11\xf8\x4c\x86\xbb\xba\xcb\xbc\xca\xb4\x8a\x02\xb6\x6b\x56\x5c\x51\xcd\x96\x09\x9f\xd9\x57\xde\x59\xee\x42\x1d\xe0\x83\xf2\x70\xcd\x73\xc3\x0f\x4b\x01\x15\xa7\x3c\x3b\x2f\x44\xc7\x26\xfe\xcd\x16\xfe\xaf\xce\x0f\x9a\x83\xc2\xa1\x04\xc9\xd6\x6e\x4d\xdc\xf7\x51\xc9\xc0\xb5\x98\x2e\xb4\xbe\x64\x7b\x6b\xca\x1e\xa3\x2a\x17\x23\xe7\xe6\x09\xb1\xf7\xd8\xcd\x7b\x9f\x49\x05\x50\xb6\xab\x10\xc0\xfe\x21\x49\x98\x05\xac\x15\xe5\xac\xd1\x31\xbc\x3a\x4d\x90\x51\x98\x51\xb3\x09\x03\x67\x75\x31\xee\x9e\xef\xe5\xaf\x8f\x2c\xc8\x4d\xe5\xaf\x6b\xa9\x86\x0e\x8d\x8d\x90\x84\xcc\x6d\xa7\xbe\x0f\x40\x87\xef\xeb\xd1\x62\xe4\x35\x39\x6b\x80\xc2\xd7\x86\x52\x08\x56\xee\x42\x73\x2a\xfa\xe9\x6e\xac\xd5\x37\xa1\xd3\x78\x56\x2c\x38\xa5\x86\x61\x39\xb0\xcf\xa0\x98\x0a\xb6\xd0\x4a\x97\x54\xe6\x50\x17\xf2\x80\x98\xc1\xba\x1b\x58\x01\x92\xb7\xd1\x54\x0f\x6b\x0f\x92\xef\x97\x32\xcb\xf8\x1c\x9a\xdb\xb4\xaa\x71\x40\xb8\xea\x0a\xa3\x9a\xf1\xcd\xbe\x64\xd1\x37\x6e\x00\xdc\x68\x83\x52\xcc\x07\x33\xa9\x6c\x03\xb2\x40\x0e\xdc\xbc\x1d\x59\xce\x7c\x32\xb3\x9f\x02\xb8\x29\x42\xd1\xa6\x71\xbc\x83\xf9\x1b\xf2\x4a\x34\x08\x8c\x92\x77\xcf\xa3\xd6\x58\x4c\xb2\xc2\xf3\x02\x7e\xcf\x59\x2e\xdf\xbb\xa7\xc4\xbf\x8a\xab\x0d\x54\x0a\x51\xe2\xf5\x5f\xef\x3b\x63\xac\xb6\xdc\x46\x6e\x15\xe3\x3b\xa3\xa6\x0a\x0a\xbe\x38\xc5\x72\x01\x7c\x81\x38\xd2\x42\xfd\x11\xfa\xf0\x77\x77\x54\xb3\x10\x2a\x1d\x68\xab\x43\xc8\x94\x86\x73\x0b\xed\x8f\xef\x3e\x21\x54\x77\xcb\x10\x61\xd4\xd5\x33\xfa\xb3\x1f\xed\x9f\x53\x86\x19\x51\x5e\xc9\x44\x1c\x24\x89\xae\x54\xaf\x2c\xd4\x23\xe1\x5e\x81\x5b\x91\x9e\x37\xc6\x44\x8f\x7b\x0a\xdf\x62\x25\x3a\xcf\x24\x47\x44\xa2\xe6\x9d\x58\x64\x57\x8f\x03\x1e\xfb\xd6\x0c\x89\x65\x8c\x15\xbc\x5b\x46\x69\x4f\x0a\xf5\x4d\x95\x5f\x7d\xe3\x75\x27\x5c\x8b\x82\xe4\xac\x5f\x49\x83\xbf\x5d\x0d\x82\xe5\xe6\xb2\xc6\x69\x12\x50\x86\x14\x36\x53\xf4\x39\xbd\xe8\x98\xe3\x53\x3b\x61\x37\x75\xa0\xae\x75\x72\xcf\xbd\xfc\x81\x79\xf1\xbf\x8f\x4e\xfb\x65\x8e\x87\x16\x35\x58\xdf\xb2\xa0\xa1\x83\xaa\x1e\x97\xe5\xc7\xe5\x89\xee\xc9\x23\x56\x72\x42\xdf\xa7\xce\x6b\x99\xe0\xe8\x53\x61\x7b\x51\xa6\xfe\xfe\xc4\xc9\xf4\x3a\x5a\x8e\xa2\x9e\x1a\xa5\xe5\x82\x2b\x13\x95\xa0\x0a\x18\xda\x67\xc5\x86\xf9\xe0\x41\x48\xab\x4d\xde\x83\x3d\xef\x74\x6d\xde\x61\x6c\x59\x25\x96\x55\xd6\xb8\xcf\xf1\xe1\x5e\x60\xde\xe2\xf1\xa5\x98\x4b\x63\xcb\xa5\x6f\xe1\x36\x8b\x26\x41\x5e\xa1\x70\xcb\xa5\x58\xb2\xef\x7f\x38\xfe\xc7\x3f\x5f\xbe\x3e\x3c\x78\xf9\xcf\x57\x07\x87\xdf\x9f\x9c\x1e\xbf\x7b\x77\xfe\x8f\xf3\x8b\xe3\x57\xef\xde\x1d\x22\xc2\x08\x95\xe3\x9e\x0b\xfb\xee\x1d\x71\xaa\x79\xf7\xee\x22\x29\x64\xf1\xee\xdd\x99\xf7\x81\x60\x73\x86\xff\x7d\x74\x0a\xf2\x13\xab\xc2\x42\xda\x13\x9c\xad\x48\x74\x98\xf7\x82\x9b\x3a\xc9\xb2\x51\x6f\xd3\x01\xd0\xb3\xeb\x71\xb7\x16\x4e\xa9\xd7\x66\x77\x03\xd6\x5d\x95\xbc\x8b\x37\x78\xe9\xd8\x54\xd8\x6b\x41\x65\x8c\x6b\xf1\xba\x78\x54\x18\x1d\x41\x70\xad\xeb\xdc\x82\xca\x99\x66\x57\x52\x5c\x23\xe6\x04\x36\xc9\xab\xdb\x07\x41\x59\x33\x96\xb6\xae\xa2\x82\x81\x92\x54\xe8\x34\xb4\x4a\x6a\xf9\xa5\x57\x7c\xd2\x8d\x32\x1a\xc4\x7d\x13\x29\x3b\x3b\x39\x62\xcf\x26\xa8\xe4\x9c\x1c\x21\x0c\xe5\x5a\x94\x2a\x6f\xa9\xba\x03\x15\x4f\xdf\x35\x55\x07\x35\x03\x74\x11\x46\x1d\x38\xa0\x9a\xa6\x3a\xe7\x77\x6d\x8a\xf6\x91\xfa\x15\x6c\x59\xf9\x6b\xc5\x33\xd4\x01\xce\x74\xba\x2a\x99\x76\xbe\xf1\x1f\xfd\x6d\xf2\x4d\x98\xc7\xdf\x26\xdf\x40\x33\x4c\x4f\xb6\xbf\x4d\xcc\x55\x32\xf9\x86\x0a\xa4\x19\xdd\xb4\x36\x47\x78\xa5\xda\x89\xf4\x59\xfc\x0d\x3c\x9b\x83\xbe\xfb\x59\xca\x5d\x06\xec\x2a\x3a\x70\x2f\x51\xd4\x02\xa1\xf6\x3a\x29\x05\xc7\x54\x73\x96\x8a\x4c\xd4\x38\x30\xf7\xa0\x99\xe5\xcd\xdd\x3d\x7d\xac\xad\xd1\xfb\x34\xf6\x4d\x05\x7d\xe9\x77\xdf\x22\x35\x36\x18\xbe\xaa\x3b\xce\x77\xd8\x00\x3d\x91\x1a\xee\x14\x36\xb2\x3a\x13\xb8\x3e\x7d\x76\xca\xda\xba\xba\x5d\x13\x8f\xde\x85\x10\x9b\xa8\x46\xbf\xf0\x40\xa6\x8e\x23\x2e\xc2\xfc\xc1\xd2\xc0\xd6\x7f\x18\x5c\xc5\x6f\xa0\xda\x6d\xc9\xdc\xa9\x65\xd1\x93\x11\x57\x88\xda\x12\x9a\x14\x7e\x73\x29\x96\x23\x04\xf4\x40\x25\xe4\x6f\x11\x22\x73\x28\x89\x46\xe0\x35\x5d\xb2\x6f\xfc\xbf\xfe\x76\x57\x6b\xad\x87\x1f\xb5\x8f\x17\x15\x5f\xaa\x77\xe4\xeb\x18\xab\x60\x9a\x08\x1f\x48\x59\x2a\x90\xb1\x1a\xc9\x35\x61\xc7\x50\xf7\x8a\x1a\x29\xa1\xd2\x66\x59\xe3\x66\xe3\x3b\x4c\x36\xd0\x21\xc0\xff\x12\x55\xc7\x9c\xea\x73\xaa\xcc\x04\x98\x9d\x99\x28\xeb\x4f\x40\xc0\x9c\xea\xe3\xf7\x22\xa9\xec\xe7\xac\x56\xc7\xeb\x52\xf4\xef\xf9\xf5\x83\x08\x10\x44\x48\x1b\xa7\x85\x87\xca\x84\x7a\x77\x46\xc9\x69\x1f\xa6\xed\xa5\x58\x9a\x00\xb2\x76\x89\xa3\x53\x55\x73\xe0\x5f\x7f\x90\x1d\xbf\x97\xc6\x9a\xff\xe9\x1b\x8e\xe5\xd3\xba\xd5\x1b\xc7\x2c\xb1\x7a\xf4\x08\x60\xcf\xfd\x09\x8f\xf9\xdc\x04\xf7\x2f\xd0\x9b\xea\xaf\x3d\x25\x22\x08\x3d\xee\xde\x69\xd7\x50\x7a\x92\x56\x50\xa8\x16\x63\xb1\xd5\x89\x35\xf8\x63\xe4\x4f\xa4\x21\xd0\xe5\xd8\x29\x79\xcd\x63\x86\x3e\xa2\x9b\x24\xa0\x8a\xc8\x2b\x9e\x09\x45\x28\xb6\x59\x9a\xf0\x12\x43\xf4\x04\x28\x64\x08\x08\x9b\x90\x34\xdc\x19\x47\x92\xac\x5e\x65\x43\xa1\x3c\x5e\x5a\x99\x54\x19\x2f\x99\xdb\x8f\x73\x5d\xde\x11\x77\x08\xaf\x7e\x8d\xef\x02\x8b\xf6\xe8\x07\xdd\x94\xef\xed\x11\xdb\x40\x87\xa4\xbd\x38\x93\x09\xea\x6b\x9a\x1b\x65\xaf\x09\xa4\xad\x67\x5e\x36\x05\x41\x11\x43\xe5\xd9\x86\x73\x5c\xce\xc1\xff\xbd\x1f\x1d\x1e\x61\x67\x4e\xd8\xdf\x43\xb5\xf8\x88\xd5\x3e\x63\xa8\x49\xa5\x67\xd2\xb6\xa1\xe5\xaa\x37\xf5\x4c\x97\xd0\xc5\x70\x2f\xd5\xf0\x1b\x71\x25\x13\xbb\x3f\x61\xff\x9f\xd3\x14\xc1\x89\xec\xd5\x49\xda\x66\xa1\x0e\xb7\x06\xec\x7b\xca\xf6\xe0\x67\xb1\x2a\xb9\xef\x03\x45\x84\x04\xfa\xc0\xb2\x61\x7a\x44\xb8\xd7\x44\xb7\x1b\x62\x14\x35\xc5\x16\x6b\x84\x93\x5f\x07\x09\x19\x64\xa2\x34\xb4\x4b\x1b\x9e\xdb\x10\x67\xf1\x22\x34\x30\xce\x7f\x83\x8f\x9e\x95\x62\x0e\xfb\x0f\x77\xcf\x67\xdc\x7d\x56\x17\x3a\xd3\xf3\xe5\x79\x51\x0a\x9e\x1e\x6a\x65\x6c\x09\xa2\xa1\x0f\xbe\xdb\x4d\x63\x46\x8d\xb3\x16\xfa\x9a\x71\x2a\x67\xd7\x33\x44\xc8\xd3\xd5\x7c\x81\xad\x02\xe0\x87\xbe\xc9\xac\x9f\x22\x19\x9d\x66\xc2\xce\x43\x2b\x00\x60\xf0\xd0\x59\x00\x46\x01\x87\xc7\x35\x5f\xd2\x66\xe2\x53\x99\x0a\x13\xe5\x28\xfb\xc9\x60\xe8\xe7\xc6\xf7\x07\xa9\x7c\x70\x7a\x74\xd7\xfe\x0b\x1b\x54\x68\x6f\x78\x95\xa0\x19\x21\xd5\x6b\xfa\x06\x8d\x14\xe8\xc6\x73\x4d\x9a\x2a\x62\xb9\x7a\xca\x7c\x46\xdd\xb4\x0f\xf8\x52\xce\xdf\x9f\x5f\x8a\xeb\x0e\xbf\xf4\x2f\xfa\x83\xb8\x7b\x2a\xd8\x18\xec\xd1\xb7\xca\x70\x2b\xcd\x0c\x1a\xb5\x7c\x46\x7d\x1c\x8a\x0e\xba\xf5\x93\xc0\xab\x59\xbb\x13\x8f\xe6\x8b\xc2\x03\xde\x62\x83\x59\x28\xff\xaf\xb6\x83\xf0\x00\xc4\x22\x88\xd0\x8a\xc2\xed\xa0\x84\xda\x33\x59\x5d\xc7\xa1\x31\x52\x51\xe5\x53\x51\x86\xbd\x8f\xce\x00\x59\xb6\xa0\x69\x5b\x7b\xbf\xbb\x60\xec\x9c\x09\xd7\x37\xad\x0c\xc8\x73\xfc\xde\x69\x1e\xa6\x5b\xa2\x12\x5e\xcd\xee\x6a\xad\x41\x31\x3c\xe6\x13\x38\x5b\xcb\xd0\xe8\x72\x02\x66\x6f\xfc\x49\x57\x39\x57\x5f\xfd\xfa\x33\xb2\x7e\x3d\x1a\xd9\x9a\x44\xe9\x1b\x5f\xbf\xd5\x2a\x25\x2e\xf8\x23\xa7\x90\x19\xa1\x02\x8f\x0e\x6c\xae\xea\x83\x9d\xda\xe6\x67\x41\x9b\x73\x46\x91\xbb\x09\x7f\xd7\xb7\x11\x52\x8f\x1e\x8f\x6c\x80\x3e\x8f\x0c\x64\xd9\x65\x07\x09\x18\xff\xde\x13\xab\xf3\x20\xfd\x3b\x3e\xb2\xee\x06\x75\x7d\x35\x18\xea\xb2\x36\xad\x91\xb3\x1a\xa6\x75\x2d\xec\x6a\xc3\xba\xd7\xb3\x07\x68\x83\xc6\x7a\xda\xb8\xf5\xd5\x20\x84\xbe\x83\xb5\xcb\x21\xc0\xa4\x67\x7e\x77\xac\xb5\x79\x4f\xd4\x88\x9d\x6a\xeb\xfe\x13\x99\xbf\x47\x5a\x98\x53\x6d\xe1\x93\x7b\x41\x4a\x7c\x85\x01\x09\xe9\xdb\x08\x00\xde\x1b\xc8\x4d\x0a\xd1\xba\x13\xcf\x13\x6c\x8d\x61\x71\xa2\x98\x2e\x3d\xc5\x82\x75\x61\x68\x88\x38\xac\x40\x18\x5b\x37\x1a\x27\x6e\x9c\x98\xce\x1f\x18\x8e\x86\x82\xec\x2f\xfc\x06\xc0\x53\x8b\x0c\x0a\x04\xd2\xaa\x44\x0c\x5b\xa7\x6b\x5a\x31\x97\x09\xcb\x45\x39\x87\xb6\xd1\xc9\x62\x88\xe5\xeb\x73\xae\xe0\xd5\xf3\x74\x89\x27\xd3\x83\x97\xe0\xc8\x06\x15\x6b\x40\x15\x00\xc7\xc3\x63\x2d\xe7\x60\x49\xfd\x9f\xe0\x83\xfe\xbf\xac\xe0\xb2\x04\xcc\x5b\x8a\x1d\xc7\xdf\x51\xf4\x25\x1e\xc6\x8d\xb0\xe2\x5b\xe2\x8a\x09\xac\x64\x72\xa3\xb7\x15\x8f\x11\xbb\x5e\x68\x83\x87\x61\x70\x7f\xec\x5c\x8a\xe5\xce\x68\x85\xf5\x76\x4e\xd4\x4e\x1d\x18\x6e\x30\x5b\x38\x84\x21\x83\x70\x07\xbe\xdb\xf9\x74\xba\x4a\xaf\xc3\x76\x88\x8e\x01\xed\x09\x75\xe4\x2b\xb2\x79\x7a\x6b\xfe\xbb\xaf\x70\xa0\xc8\x3e\xc7\x98\xe0\xbc\x14\x58\x8c\x09\xa6\x34\x28\xea\xd4\xdd\xa5\x52\xe2\x4a\xb8\xc5\x4a\xa5\x21\x3c\x40\x9f\x62\xf0\xaf\x15\x93\xe8\xff\x39\xd2\xa7\xda\x7a\xab\xfd\x5f\xde\xed\x85\xfc\xf7\x5e\xe6\x55\x8e\xb8\x59\xd6\x59\x0a\xa9\x9c\x79\x20\x60\x9f\xd9\xd0\xb4\x17\x9a\x66\x2b\xf1\xb1\xe5\xe5\x1c\x32\x1c\xc9\x5e\xf0\x6c\x36\xcf\xf4\x94\x67\x2c\x97\xca\x3d\x86\x82\x97\x8d\xcf\xc2\x4c\xe8\xcf\x0f\x3c\x08\xf6\x82\x9c\xcb\x69\x26\xc8\x20\x69\x61\x6c\x47\x3f\x6e\xdd\x08\x9b\x34\x13\xc6\x60\xbc\xf1\x95\x54\x47\xde\x9b\xf1\x42\x97\x4c\xbc\xe7\x79\x91\x09\x2c\xd1\x63\x5f\x8d\xff\xad\x95\x60\x14\xa0\x1f\x31\xbf\x3c\x75\xdf\xb2\x67\xb8\x91\xea\xc6\x02\x21\xfb\xa2\x61\x13\x06\x4f\x8a\x61\x5f\x3e\xf9\xf2\xc9\xb3\xe7\xee\x0c\x41\x37\x3d\x37\x04\x41\xb4\x4a\x8d\x67\x13\xf6\x1b\x73\x33\x78\x46\xff\xfd\x92\xfe\xfb\x15\xfb\x8d\xfd\xc6\xd8\x19\x3b\x63\xf1\x7f\xdd\x7f\xd8\x6f\x6c\xec\x88\x10\x4d\xf5\x99\x7b\x9b\x44\xe7\x44\x41\xf0\x41\x87\x82\xdb\xd0\x37\xd0\x6a\x1a\x1a\xaa\x9d\x12\x9d\x0b\x98\xea\x97\xff\xd3\xdf\x03\xa1\x62\x8b\xad\x1d\x61\x52\x7b\x30\xa5\x7d\x76\x0d\x4e\xb5\x9c\x5f\xa2\x41\x79\x90\xd8\x8a\x67\xee\xe1\x7b\x5f\x8d\x9f\xed\x33\xad\x9a\xb7\x5f\x49\xed\x94\x77\x3f\xc3\xbd\x67\xfb\x93\x95\x29\x7f\xb9\x66\xca\xad\x2e\x87\x54\xee\xe8\x06\xbd\x99\xdf\x3d\xab\x1f\xa8\xe5\x35\x5f\x06\x86\xf7\x06\xf5\x5c\x5e\x05\xb4\xff\x08\x84\x04\xa2\x8d\xc0\xbf\xd2\xe3\x4a\xe1\xa0\x4b\x26\xed\x84\x9d\xd8\xdd\x5d\xdf\x53\xd3\xe9\xfa\xbe\x2d\xc1\x51\x8c\x97\x09\x84\x07\xde\x78\xda\xca\x46\xee\x80\xce\x36\xa8\x5b\xf7\x4e\x7d\x05\xf0\xca\xc3\x2e\xe9\x2d\xe2\x76\xea\x1d\xd7\xa8\x66\x5f\xdd\xf5\xed\x8d\x1b\x12\xa7\x3e\xb8\xbb\x5b\xa8\xd7\x5e\x0c\x5d\x8a\x65\x6b\xe7\xd7\xef\x34\x82\x1c\x1e\xef\xb5\x63\xe8\xb6\x43\x57\xbd\x61\xef\x76\x9a\xfb\xf2\xdd\x0e\x38\xef\xc3\xf9\x49\x7d\x7c\x78\x96\x54\xd4\x00\x4e\xcf\x98\x67\xe3\x08\xa1\xeb\x40\xa5\x75\xca\x44\xc7\xf9\x03\x84\x3d\xe8\x8c\x73\x88\x23\x94\xab\x6f\x12\xa5\x55\x34\xb2\xf0\xdc\x2e\xac\xf7\xf1\x84\x1d\x20\x03\x1b\x08\x7e\xdc\x66\x5e\x37\xd2\xae\x6e\x07\x7b\xad\xd5\x6e\x0d\xbc\xcb\x72\x8d\x10\x69\xca\x1f\x8f\xe4\xab\xd2\xcc\x82\xaa\x12\x96\xf5\x64\xb6\x26\x0f\xa6\x76\x10\x23\xf8\xa4\x63\x12\xa8\x9b\x88\xf9\x27\x42\xf5\x7f\xb6\x06\x89\x91\xb6\x8b\x69\x92\xeb\x29\x31\x52\xfd\x4c\x6d\xf1\xb9\x3f\xb5\xe5\x47\x50\xbe\x1b\xe7\x26\xb4\xcc\xec\x72\x58\x7c\x39\x6a\xcd\x9e\x3e\xff\x4b\x97\x33\xe4\xcb\xe7\x77\x3b\x1c\xe8\xbf\x17\x8d\x65\x5e\xbb\xba\x7f\xd9\xab\x67\xb9\x0f\x01\xcc\x35\x9b\x00\x8a\x1d\xea\x60\xd6\x24\x1c\x68\x46\xda\x8a\x63\x7d\x84\x12\xd7\x94\xb4\x76\xf3\x4b\x45\x35\x6e\x5e\xb8\x8f\xdc\xf9\xc3\x2b\x23\xa0\x68\xa5\x82\x7a\x66\x47\x48\x1f\x44\xfb\x6a\xef\x2b\x36\x66\x4f\xf7\x1d\x37\x28\x64\x2b\x20\x66\x7c\x94\xb9\xa3\x81\x72\x30\xed\xc2\x29\x4f\x8e\x32\x66\x14\x5a\x69\xb5\x0e\x21\x58\xd2\xd0\x2b\x51\x61\x55\xcd\xba\x6e\x89\x50\x36\xe3\x76\x66\x4d\xa2\x13\x75\xa6\xd3\xa6\xcf\x3f\x14\xc2\xcc\xb9\x15\x9d\x40\x0f\x36\x2b\xef\x23\x4f\xfc\x00\xe1\xdf\x30\x96\xd7\xf0\x9c\x91\xa2\x67\x08\x49\x81\x1d\x8d\x27\xd0\xae\x9a\xce\x5a\x4a\x6d\x44\x27\x0f\xf1\x8e\x34\xc1\xcf\x27\xa1\x52\x2c\x89\x9a\x04\x96\x28\x2e\x64\x2a\x4a\xe1\x1b\x22\xc7\x89\xb0\x21\x82\xc2\x7e\xaa\xef\xc4\x04\x58\xc8\x14\xc2\x81\xfe\x86\x85\x57\x3b\xd3\x2a\xb9\x14\xd6\x5b\x48\x25\xe4\xee\x15\x95\x65\x53\x9e\x71\xe5\x6c\xed\x15\x8f\xb9\xd5\x38\x18\xfe\x12\x9e\x82\xd5\xe4\x21\x41\x13\x87\x8e\xe2\xfb\x52\x19\xeb\x46\xc3\xc0\x7f\x3d\xc1\x83\xcc\xe8\x11\xbb\xae\x07\x58\xd5\x74\x61\x28\xfa\x37\x1a\x7d\x0a\x68\xe7\xfd\xff\x1e\xeb\x83\x76\xd8\x84\x89\xc9\x1c\x84\x6c\x6b\x25\x76\x9a\xd5\x05\x3e\x61\x75\x67\x84\x2f\xe3\x16\x84\xaa\x3d\x48\xc3\x26\x1c\xea\x68\xb2\x2a\x85\x22\xa8\xf6\xc0\xe1\x8e\xe6\x13\xdc\x16\xf4\xa3\x83\xa8\xfc\xf0\xe8\x27\x76\x9d\x96\xf5\xb9\xf3\x21\x56\x74\xca\xfe\x46\xde\xea\x31\x53\x2b\x42\x14\x18\x4c\x05\xcf\x7c\xea\x24\xf4\xc9\x09\x20\xa1\x6a\x77\xb7\xd6\x46\x81\xc3\x51\xe2\xd4\xe7\xa5\xd3\xa6\x1b\xe7\x15\xdb\xf3\xb5\x0e\xcc\x8a\x2c\xc3\x3d\x58\x1f\xdb\x4e\xfc\xc6\x6d\xe1\x25\x8c\xd0\xd4\x9c\xd7\xfe\xb0\xd9\x4b\x1e\x93\xf8\xc0\x38\x5b\x06\x78\x9f\x11\x9b\x56\xd6\xa9\xd9\x4e\x64\xde\x4a\xd1\x46\x63\x62\x21\xb2\x82\x95\x22\xad\x12\x2a\xfa\x03\x19\x7d\x10\x6b\x05\xd8\x96\xd1\x6f\xfa\x9d\x06\x41\x77\xb0\x4f\x88\x6a\x1a\x11\x72\x06\x5b\x1a\x4c\x1f\x39\x63\xe2\x4a\x94\x4b\x56\x68\x63\x60\x77\xc1\xa6\xc1\xcc\x77\x70\xb2\x04\x24\x42\x38\xc1\x60\x56\xfe\xd0\xd8\xa1\x53\x63\x07\xb4\x2a\xdd\x90\x30\x9f\xc7\x88\xfc\xea\xc9\x33\x67\x44\x7e\x48\x01\x38\x83\xff\xd5\x56\xa1\xff\xef\xc9\x6c\x8d\x9e\x53\xcf\xa5\xc1\x39\x77\x31\x1c\xbf\x04\xfb\xee\xab\xfd\xc8\x7e\xfc\xca\x99\xba\x7b\x6e\xae\x5f\xee\xbb\x59\x47\x96\xe1\x97\x91\x65\x18\x7e\x49\x33\x12\xa6\x61\x1b\x9e\x28\x2a\x73\x80\x1e\x61\xa4\x1d\x52\xca\xbc\x9b\x91\xb1\xa4\x17\xc8\xdc\x8b\x68\x64\xbb\xa6\x66\xba\x6b\xd1\x44\x95\x96\xfd\xc9\xa9\xa6\x7f\x8a\xee\xbf\xd1\xa6\xeb\x6e\xaa\xf5\x6d\x3d\x9f\x49\x63\xa1\xff\xbc\xd3\xfc\xef\xde\x1b\xb9\x7b\x2c\xbd\x6f\x24\x7d\xf5\x2d\x90\x20\x39\x2f\xee\x30\x0e\x82\xb1\xf7\x6a\x54\xf6\x92\xa2\xb0\x34\x14\x45\x19\xd1\x91\x90\x53\x34\x7c\xba\x8c\x8b\x67\xa6\x22\xd3\x08\x6d\x4f\x79\x82\x77\xa8\xcb\x0b\xbd\x81\x8c\xd5\x25\x9f\x8b\x27\xf4\xd8\x87\xd2\x13\xec\x47\x44\xbf\x6f\x84\x94\x10\xbb\x80\x70\xf1\x7d\xfd\x92\x4f\x36\x00\x29\xc0\x13\x48\xfd\x07\x42\x36\xc0\xa7\xa2\xa2\x82\x07\x92\xb7\xd2\x01\x29\xa7\x4f\x94\x94\x5f\x9b\xe3\x8c\x1b\x2b\x93\xbf\x67\x3a\xb9\x3c\xb7\xba\x1c\x40\xb5\x58\x37\x6a\x63\x4d\x15\x3b\xf8\xe9\x9c\x1d\x49\x73\x59\xb7\x58\x42\x18\xf3\x66\xb6\x3d\x0f\x30\x7e\x54\x78\xc9\x72\x9e\x2c\x50\x23\x25\xbf\x87\x6f\xe5\x30\xdc\x5e\xf9\x03\xbf\x36\x02\xa7\x3f\x75\xd3\x77\x5f\x8b\xee\x22\x78\x63\xa0\x4b\xf8\x3a\x27\x47\x1b\xc8\x72\x99\x99\xae\xbd\xe7\xd8\x9a\x86\x20\x1e\x59\x16\x0b\x08\x33\x41\x4d\x61\x01\xce\xb0\xd9\xe4\x03\x78\x68\xa9\x2b\x76\xcd\x31\x5c\x05\x12\x76\xc2\x2e\x64\xf1\x9c\x1d\x47\x70\xf9\xeb\x86\x72\xda\x47\x80\x2e\xa3\x04\x41\xe0\xb9\xd5\xd6\xf8\xc7\xa8\x5a\x99\xe7\x6c\x47\xbc\xb7\x7f\xde\x19\xb1\x9d\xf7\x33\xe3\xfe\xa3\xec\x0c\xda\x6b\x50\xdb\x2e\xa7\xe3\xa9\x99\x28\x6b\x8b\x10\x7f\xb0\x8a\x1a\x30\x3c\xcb\xb2\x8b\xd7\x47\xaf\x9f\x83\x2e\x9f\x6a\x67\xcc\x51\x63\x5b\x8f\x81\x41\xb2\x31\x22\x03\x14\x73\x26\x3a\x2f\x4a\x9d\xcb\xa8\x52\x05\xb6\x5c\x97\x1d\xc0\x86\x08\x95\x82\xbd\x0a\xcc\x30\x08\x3f\x85\xe1\x3c\x4b\x45\x1f\xa8\xdb\x30\xd3\xc9\x8c\x69\x0c\x4e\x35\x6b\xe5\xa4\x09\x37\x39\xf6\xa1\x51\xb0\x5d\x6b\xcd\x30\x4e\x33\xa7\xaf\x9e\xa4\xe2\xea\x89\x49\xf9\xb3\x11\x3c\x06\xb9\x61\xd9\x9a\x13\x37\x6c\xe7\xd9\xce\x84\x9d\xcb\x5c\x66\xbc\xcc\xa8\x8f\x1c\x0d\x51\xdf\xe7\x0c\x05\x3f\x20\x98\xbf\x4f\x77\xd8\x1e\x16\xab\x81\xba\x91\x09\x0f\x5d\x12\xa0\xba\x20\x96\xbf\xdf\x49\xbb\x64\x03\x38\x87\x58\x6f\x07\x11\xa3\x96\xb2\xaf\x55\xd6\x39\xc5\xa7\xc9\x1c\x7e\x34\x9f\xe9\x5d\x56\x54\x4d\x3b\xd3\x25\x19\x81\xe1\x16\x5f\x11\x2f\x15\xa9\x2d\xaf\xdc\xd2\xdf\xbd\x8d\xe3\xa7\x3a\x7e\xd8\x00\x28\x2d\x2c\x9c\x22\xc3\xd0\xd7\x8f\x06\xe1\x2f\x25\x7f\xad\x04\x3b\x39\x0a\xfd\xba\x45\x69\xa4\xb1\x4e\x44\xa5\x0d\xd5\x40\xa2\xbe\xb0\x77\x90\xf3\x7f\x6b\xc5\x8e\xff\x7e\x4e\xd3\xda\xbf\x87\xc4\xee\x28\xe9\xf8\xbf\xab\x52\x38\x8d\xa8\xb7\xfa\x15\x46\x6a\xab\x5c\xee\x73\x76\xc4\x2d\x47\xcd\x0b\x25\x95\xae\x51\x24\x40\xa9\x9a\x42\x76\xaf\x87\x08\xe9\xa8\x3c\xb3\xcd\x6b\x3f\x8e\x83\x4e\xbb\xc3\x4e\xba\x9f\xbf\x7d\x73\xb2\x01\xdd\x29\x81\xe3\x76\xfe\x4a\xa7\x03\x29\x50\xd1\x80\xfe\xc8\x03\x54\xaf\x43\xfc\x9c\xe5\xee\x49\xec\x54\x2b\x31\x62\x6f\x04\x4f\x99\x93\x6e\xf4\xcf\x9f\x4a\x69\xef\x0a\x94\x50\x5f\xbd\x8f\x7e\xbf\x88\x83\x10\xc2\x0f\xe6\x89\x70\x1a\x81\xe3\x00\x92\x13\x08\x1d\xd2\x01\xa6\x99\x9e\x32\x12\x16\x9b\x7c\xfb\xb7\x6f\x4e\x06\x7b\xf9\xb7\x6f\x4e\xfc\xbb\xbb\x7f\xea\xd9\xfd\x7c\xed\x01\x8d\x87\xda\x76\x78\xd1\x52\xf6\x6b\x75\xae\xc6\x94\x6f\x1b\x04\xb7\xb7\x06\x26\x43\xd9\x01\x9b\xa2\xf9\xa5\x54\x9d\x93\xc5\x9b\xd2\x06\xf0\xe4\x03\x76\x42\x14\x1b\x03\xc8\x96\xf4\x39\xcb\xab\xcc\x42\x79\x3c\xf0\x9a\x63\x3e\xc8\x50\xf0\x5c\xc7\x08\x2a\x8a\xb1\x23\x81\xe1\x88\xf4\xb9\x4f\x58\x0c\xbf\x58\xff\x83\x57\x5c\xf1\xb9\xbb\x1d\x4e\x40\x96\xe3\x9f\x11\x93\xef\xa1\xd3\x5d\x85\xaf\xf8\x15\x97\x19\x9f\xca\x4c\x5a\xd0\xe7\xf6\x27\x5e\x9b\x37\x88\x95\xe1\xa6\xbc\x31\xe9\x37\xa8\x6a\x1b\xd4\xd6\xb8\x90\x18\x70\x70\xd8\x9e\xfb\xee\xc9\xb5\x13\xf5\xfb\x13\x90\xfb\x70\x23\xc0\x96\xb6\x94\xdf\x37\x1f\x53\x7e\x37\xa2\xa7\xc2\x7a\xbf\xe8\xd8\xec\x62\x55\x77\x72\x23\xad\xd5\x9d\xe0\x0b\x42\xa7\x7a\xe4\xea\x13\x36\x1c\xed\xa1\x40\xc1\xde\xe9\xf8\xfb\xbe\x2a\xd4\xa7\xd9\x38\xe9\xe3\xdb\x38\x0c\xdb\x02\xd1\x4a\x0f\x42\xae\x7a\x38\xaf\x6b\x04\x14\x42\xfc\xaa\x55\x67\x85\x3b\xeb\x9c\x64\xb9\x47\x27\x84\xdf\xbb\xfd\xd4\xa5\x0a\x13\xaf\xde\xe2\x37\x70\xf0\x30\x74\xf1\xa3\x79\xb2\xe0\x21\x05\x1f\xb3\xce\xfb\xac\xe7\x6b\x26\xa2\x58\xcc\xfa\x67\x53\xba\x61\x5e\x9c\x37\xa3\x36\x87\xa2\x58\xb0\x17\xe7\x6b\xc4\x24\x66\xb2\xba\xf7\x36\x18\xcb\xd9\x35\x2c\x93\x33\x61\x65\x27\x22\x6c\x58\x50\xe6\x5a\x49\xab\x4b\xb3\x89\x5a\x52\x7a\xf4\x30\x8a\x9b\x1f\xcd\xf1\xe7\x1b\x4f\x14\xf6\x2a\xfa\x94\xb3\x44\x67\x99\x48\x7c\x7e\x29\x2c\x71\xf8\xd9\x1a\x47\x0c\x65\x20\x98\xc9\xe5\xd7\xe0\x8a\x21\xa7\xcb\x13\x64\xbb\x27\x6f\x8e\x0f\x8e\x5e\x1d\x4f\xf2\xf4\x0f\x0b\x7d\x3d\xb6\x7a\x5c\x19\x31\x96\xb6\x9f\xbe\xb5\xc1\xc2\xd3\x01\x3c\xdd\x76\x31\x94\x93\xdb\x2e\xdc\x92\xd5\xe8\x87\x6f\x4d\x8d\x4f\xea\xe3\xce\xa5\xd6\x76\x15\xa1\x74\x56\x65\x19\xae\xad\x2d\x85\x18\xc5\xfe\xed\x3b\xe2\xb7\xd6\xd7\xfd\xd2\x85\x6b\x37\x6f\x83\x44\x9f\x56\x33\xbe\x2f\x1b\xa4\xbf\xae\xd0\x55\xd3\x66\x2b\xeb\x50\x8f\xd7\x5c\x89\xf3\xc6\xe7\x18\x10\xb1\x0b\xb7\x2e\x97\x62\xc9\xa0\xc6\x70\xa6\x4b\xc0\xfb\x6e\xf2\xa7\xb0\x09\x10\xef\x09\x34\xd7\x26\x85\xe3\x9e\x10\xbe\x8f\x2a\x02\x2f\xf2\x46\xcc\x86\x24\xfb\x1b\x31\x5b\x47\x75\xfa\x18\x40\xd1\x42\x7a\x9c\xd3\x57\x2a\xbb\xc0\x94\x57\x04\x63\x44\xda\xae\x5d\x06\x2a\x12\xbd\x27\x74\xef\x55\xde\x37\x44\x09\x7a\x9f\x56\x42\x6c\x65\xf1\x62\xb7\x25\x2d\x92\xbd\x73\x18\x44\x5f\x39\x2b\x56\x5c\x3f\xb9\xd6\xe5\xa5\x54\xf3\xf1\xb5\xb4\x8b\x31\x52\xca\x3c\x01\x68\xd8\x27\x7f\x80\xff\x50\x14\xf9\x20\x4d\x29\xff\xad\x32\x62\x56\x65\x98\x99\x66\x26\x8c\x17\xf2\x47\x51\x1a\xc8\xb2\xbc\x94\x2a\x1d\xb1\x4a\xa6\xdf\x76\x5d\x31\x36\xc4\x6e\xe9\xde\xda\xb5\x4d\xeb\x8a\xba\xbb\xea\xf8\x18\x2d\xbd\x4c\x2a\x79\xaa\x0d\x36\x08\x70\xa4\x6a\x6c\x01\x9e\xe6\x52\xdd\x97\x1d\xd0\xd5\x3a\x90\x2a\xed\x46\xc9\x56\x00\x02\xc6\x69\x9a\x07\xf4\x19\x85\xb1\x43\xce\x0f\xf7\xde\x13\xec\x00\x4a\xd9\x3f\xcd\xdc\x9f\x5b\x09\x96\x7c\x69\x7e\xcd\xc6\xf8\x94\x71\x91\xd6\x74\xdd\x26\xf2\xdc\xe5\xfa\x7c\x89\x3c\xc3\x3a\xe4\x3f\x43\x7a\xce\x27\xe5\x38\x76\x8f\x75\xe6\x4f\xeb\x07\xdb\x20\xa9\xfb\x6b\xc6\x9f\x46\x43\xab\x4f\x1f\x68\x5e\x63\x3c\xa2\x0a\x28\x60\x28\x95\xbc\x3f\x0d\xfb\x21\x87\x6e\x09\xbe\xc2\x38\xd1\x4a\x11\x90\xee\xeb\x42\xa8\x73\xcb\x93\xcb\x9e\x51\xdd\xad\x56\xf5\x3b\xd3\xaa\x3e\x51\x22\x90\x67\x51\xac\xa7\xa3\xf4\xb7\x3a\xd9\x1b\x37\xf9\x03\x14\xc0\xd8\x15\xe6\x15\x2f\xfa\x7b\x57\xfd\x48\x2d\x0d\x2a\x7c\x4c\x0e\x55\x28\x0e\x2a\x74\x51\x65\x08\x13\x2b\x0d\xd1\xf1\xf3\x6b\x3c\x7d\xf7\x37\x1d\x31\xc3\xe5\xc0\x44\x03\x36\x25\x6a\xee\x3e\x99\x4a\x5b\xcb\x4a\x23\x2c\xc2\x8f\x10\x96\x9e\x56\x2c\xa1\x12\x63\xd0\x47\x9c\xee\x41\xc3\x45\xba\x8a\x62\x3a\xb1\xbe\x18\x34\x20\x95\x3c\x7d\xfa\xf4\x29\xa2\x2f\xfc\xc7\x7f\xfc\x07\xd3\x25\x34\xad\x4a\x64\xbe\x7a\x23\xdc\xf5\x97\x67\xcf\x26\xec\x1f\x07\xaf\x5e\x42\x45\x43\x61\x0d\xb6\x32\xc1\x91\xdd\x0d\x8d\x1f\x9b\x11\xfb\x5f\xe7\xaf\x4f\xeb\xaa\xe0\xe6\xb7\x60\x9a\x87\xd7\x6b\x02\x48\x3f\xfd\xeb\x9f\xff\x3c\x61\x47\xb2\x84\x8a\x2e\x29\x42\x73\xd2\xe0\x6a\xe1\xa5\x40\xb4\x08\xa8\xdb\xf7\x1a\x97\x0c\x7d\x80\x08\x02\x0a\xdb\x37\x63\xa1\xab\x63\xc8\x4c\x26\x16\x8b\xc7\x50\xac\xf9\xde\xa7\x88\x3d\x4d\x68\xee\xa4\xfd\xc1\xe4\x46\x2c\x93\x97\x82\xcd\x0c\xb4\x45\xaf\xf1\x80\xa8\x63\x1f\x15\xca\xe0\x60\xf5\x5a\x19\x61\x1f\x78\xda\x6a\x2f\x57\x73\x83\xb7\x61\xa4\x96\xc2\x4a\xe5\xad\x97\x62\x39\x46\x3e\x2b\xb8\x0c\xc5\x30\x90\x01\xd8\x68\x16\x15\x7c\x3d\x29\x3b\x0c\x52\xc5\xd7\xb9\x17\xa5\xfe\x6f\x64\x01\x28\x31\x8e\xc4\x33\x94\x00\xc3\x4a\x52\x01\x70\x14\xdd\xf2\x65\xd2\xd4\x9d\xd4\x7f\x4c\x90\xe7\xab\x7d\x23\x32\x69\xdc\x23\x00\x60\xe2\x03\x4f\xae\x9b\xde\x39\x2e\x35\xc8\x2f\x95\x5a\xf9\x35\x15\xf3\x93\xb8\xa4\x6e\x51\x04\xdd\x57\x8f\x81\x38\x46\x84\xbd\x40\xf7\x7a\x2a\x05\x42\x34\xf2\xad\x8d\xb0\x15\x91\x06\xb2\xe8\xdd\xb3\xa1\x93\x11\xbc\x61\xce\xcb\x4b\x67\xb8\x92\x74\x99\xb0\x33\x37\xc9\x00\xdf\x80\xa8\x78\x57\x18\xd8\xcc\xf9\x12\x1e\x4b\x8a\x1b\x3c\x64\x77\x32\xd9\xc5\xed\xa7\x4b\x66\x2c\x2f\x69\x2f\xb9\xcf\x1f\x07\x1c\xe7\x2b\x5e\x18\x84\x87\x73\x9a\x2a\x40\x27\x6a\x28\x49\xb7\x8b\xba\x3f\x32\xd2\x7a\x0b\xa1\xc9\xc6\x40\x98\xce\x03\xdc\x73\xf8\x4c\x5a\x7d\xda\xe5\xf7\x02\xdb\x31\xef\xa1\x70\xe0\xd5\x8e\xa9\xa6\xad\xc8\xc6\xad\xf4\x0d\x6a\x1f\x90\x89\x07\xa5\x60\xac\x6f\x17\x46\x82\x33\x56\xc0\x9a\x3d\xce\x1f\xaa\x1e\x81\xd7\x10\xda\x04\x5e\xfd\x75\x0a\xbc\xfa\x04\x91\xf1\x6a\xf0\xb0\x8f\x24\x23\x31\xe9\x00\xc3\x33\x6a\x56\x2f\x01\x34\x75\x29\xa2\x6d\x8d\x1d\xd0\x7c\x27\x3f\xc5\xf8\xd4\xe8\xac\xb2\xf8\xd3\xfa\xcb\xf8\xf4\x83\x41\x3d\xb8\x24\x1c\x79\xe1\xb6\xe8\x2c\x04\x2d\x00\x8f\x8f\x3e\xc7\x22\x5e\xbd\xc5\x46\x1f\x27\xc4\xef\xc8\x01\xd1\x9b\xce\xc1\x60\x1b\x82\xd6\x7e\xb0\x50\x71\x77\xbd\x10\x94\x02\x11\xe9\x7d\x4e\x9a\x3a\x19\x01\x4a\xa5\x57\xe1\x10\x0f\x27\xdd\x88\x9b\x31\x31\xb2\xbf\x2f\xc1\x48\xb6\x17\xfa\xaa\x87\xb4\xbb\x13\x65\x45\x39\xe3\x89\xd8\x8f\x7d\x0c\xa2\x58\x88\x5c\x94\x8e\x50\x74\x9f\xaf\xd1\x5e\x70\x95\x66\x04\x5c\x20\x4a\xd8\xc1\xe2\xbd\x15\xa5\x23\xea\xe1\xf9\x09\x4b\x4b\x79\x25\x4a\xc3\xf6\xfe\x2e\x9c\xad\x81\x30\x54\xfb\x0f\x30\x0d\x16\x5f\x64\x13\x1e\x10\x78\xf0\x30\xa5\x1f\x30\xd4\xba\x96\xd0\xf5\x52\x79\xc8\x2b\xb7\xac\x26\xf6\x1d\x4d\xdc\x86\x80\x23\x14\xa4\x2f\xb4\x3e\xc4\xd8\xa6\xef\xf4\x0b\x1d\x1a\x12\x8b\x03\x73\x43\x9d\x7f\x01\x0e\x87\x04\x3b\xc1\xa4\x6c\xac\xb8\x61\xf8\x82\x92\x3a\x58\xf5\xa1\xda\x8f\x19\xd9\x95\xfa\x4a\xa6\x5e\x1d\x82\xd4\x88\x1a\xf4\xaf\xe0\x26\x02\x2f\xe0\xc6\x68\xea\x67\x1e\x2d\x0d\x5a\xa9\xa0\x34\x35\x7b\x66\xf8\x70\x73\x1c\x26\xd3\x80\x3c\xdf\xa9\x61\x17\x1b\xe4\x40\xd4\xa9\x38\xab\xa6\x99\x34\x8b\xf3\x41\x43\x22\xeb\x06\xc6\xa4\xc4\x95\x4c\x95\x1b\x23\x23\x46\x28\x23\xa9\xbf\x2a\xaa\x5b\xd2\x69\xdb\x1a\x96\xc1\xff\x3a\xde\x14\x1a\xaa\xe1\xa1\x6b\xab\xff\xea\xb4\x9e\x07\x81\x95\x60\xbb\xc0\x54\xbc\x55\x45\xe3\xf3\x84\x67\x99\x21\xfd\x36\x80\x61\xfb\xb3\x07\x35\x54\x0f\x60\x82\x5c\x21\x1d\xc3\xf8\xd9\x43\x0a\x0e\x0a\xaf\x80\xdc\xbe\xf6\xc5\x4c\x04\x71\xa9\x95\xbf\x09\xba\x1e\xfa\x1f\x04\x0a\x61\x25\x0e\x32\xdd\x06\x31\xb3\xb7\xe1\x9f\x87\x17\xfe\xf9\x34\x35\x15\x75\x2f\x2a\x0e\x1f\x8e\xa1\x42\xcb\x77\xd4\xe7\x01\xd9\xa0\xb6\x24\x27\x1f\x4b\xd3\xdc\x58\x08\x18\xe7\x77\x60\x09\xff\x7c\x18\xef\x6e\x7b\x50\x50\xc5\x9c\x29\x0e\x12\x6a\x4c\xf4\x4b\xa2\x2d\x45\x36\x72\xd8\xe7\xab\x72\xad\x3e\xd3\xe1\x38\xc7\x0f\x77\x0d\x4b\x75\x52\x39\xe3\xab\x26\x7b\x9d\x70\xd1\xaf\xad\xcd\xe3\xc2\xd9\x4f\xf5\xb5\xba\xe6\x65\x7a\x70\xd6\xa9\x36\xb7\xa9\x9c\xd5\x63\xc5\xaa\xb7\xff\x98\xb9\xcf\xf9\x54\x57\x36\x60\x1b\x6e\xa3\x7d\x6b\x87\x88\xa5\xf9\x3a\x77\x9b\xd5\x4e\xc8\xde\x32\x9a\x77\x57\x87\xdd\x36\x40\xb8\x0d\x10\x36\xae\xfb\x14\x20\x3c\xc1\x00\x61\xdc\x12\xae\x21\x5e\xc8\x43\xeb\x28\xfe\x28\x62\x4c\x47\xb5\x48\x45\x4d\xbc\x5d\xcf\xdb\x52\xfe\x71\xf3\xd6\x5c\x17\x19\x0c\x5e\xe6\x82\x5e\xf6\x18\xe2\x51\xf7\x20\x9e\x04\xb4\xec\x61\x15\xe2\xd5\x14\xf8\x75\xbd\x1a\xa2\xd4\x62\x60\x3a\x8a\x70\x17\x3a\x7d\x8e\xa0\xb1\x00\xf4\x8e\xcd\xc9\x46\x04\xfb\x3d\x22\xdf\x85\x4a\xe1\x1f\xa6\xe0\x89\x00\xf9\x16\xd4\x9f\x41\x82\x04\x3d\x19\x80\x0d\xc4\x04\x0c\x18\x01\xa8\x73\xd6\x87\x1b\xd8\x60\x1c\xe1\xae\xda\xe2\xe9\x3b\x52\x1b\x51\x14\x47\xf5\x8c\x60\x92\x85\xc8\x39\xfc\xf3\x85\x27\x81\x93\x8d\xce\x78\xb0\x02\x21\xe0\x44\x99\x1b\xa6\x67\xa3\x46\xa6\xeb\xce\xd5\xb3\x9d\x7e\xc1\x06\x36\x5c\x9c\x92\xf9\x7d\x74\xd6\x3b\xd8\xc3\xda\x04\x3b\x6b\xc4\x76\xdc\x1e\x02\x9d\xc7\x6d\xab\x00\x67\x1f\x32\x28\xe0\xfc\x40\x0a\xdf\x1b\xe2\x0c\x1d\xc4\xed\x1a\xbc\x1d\x85\xa8\xc1\x03\x50\xfe\xb6\xc1\xdb\xc7\x18\xbc\x8d\x0e\x46\x2f\xe8\xd6\x04\x72\xe3\x90\x80\x8f\xe6\x4e\x85\x37\x6a\xc8\x86\xf1\xa1\x5c\x1f\xc7\xd5\x65\x33\x75\x69\x77\x32\xd9\xdd\xf5\xd1\x5d\xe2\xfb\xca\xce\xc6\x5f\x33\xa1\x12\x9d\x22\xb3\xb8\xf1\x4b\x63\x41\xdd\xab\xdd\x6d\xf1\x5c\x72\xff\xac\x38\xfd\x09\xc6\x1e\x62\xa9\x7b\xcb\x16\x0f\x49\xf8\xe2\x13\x28\x31\xb5\xea\x12\x80\x0f\x89\x44\x01\xcf\x9a\x74\x18\xff\xbd\x61\x99\xcc\x25\x35\x4a\x75\x1b\x5d\x18\x6b\xd8\x1e\x7e\x38\x49\x8a\x6a\x44\x37\x4c\x72\x91\xeb\x72\x39\x0a\x37\xb9\x2f\x1b\xbf\xa2\x3b\xf6\xb1\x8d\x49\x55\x96\x42\xd9\x6c\xf9\x98\x35\x20\x4f\xc4\x7b\xa2\x00\x85\x35\xee\x83\x38\x52\x5f\x4d\xd6\xaa\x23\xbe\xe0\x36\x8f\xfa\x0b\x04\x34\x5a\x33\xaa\xe3\xe2\xee\x53\xa1\xae\xd8\x15\x2f\xef\x88\x1c\xbf\xee\x1a\x50\xe7\x49\xe5\x95\x34\x7d\xbb\x18\xb3\x36\x79\xce\x83\x13\xda\x6d\x36\x5d\xd9\xa2\xb2\x24\xd1\xfd\x0e\xf4\x28\xe3\x61\xe7\xb5\x94\xc3\x67\x5d\xba\x2b\x35\xaf\x82\x5b\x2b\x4a\xf5\x9c\xfd\xd7\xde\xbb\x2f\x7e\x1b\xef\x7f\xbb\xb7\xf7\xf3\xd3\xf1\x7f\xfe\xf2\xc5\xde\xbb\x09\xfc\xe3\x4f\xfb\xdf\xee\xff\xe6\xff\xf8\x62\x7f\x7f\x6f\xef\xe7\x1f\x5e\x7d\x77\x71\x76\xfc\x8b\xdc\xff\xed\x67\x55\xe5\x97\xf8\xd7\x6f\x7b\x3f\x8b\xe3\x5f\x6e\x39\xc8\xfe\xfe\xb7\x7f\xec\x3d\x75\xae\x96\xaf\x7b\x8a\x42\xbc\xc6\x03\x1e\xc9\xcd\x11\x07\x61\xbf\x56\x5b\x09\xa9\xec\x58\x97\x63\x1c\xfa\x39\x80\x05\xf7\x7c\x80\x67\xaf\xa1\xf7\x7f\xad\x06\xd4\x70\xfb\x5e\xa9\xdf\xf0\x06\x87\xd0\xe7\x91\x1c\xa0\xcc\xd8\x8f\xd4\x2c\x93\xb1\x22\x2f\x74\xc9\xcb\x25\x4b\xc9\x9b\xb9\x5c\x83\x40\x14\x41\x10\xf5\x86\x14\x86\x79\xa4\xb2\xdc\x40\xa5\x71\x6f\x44\x21\x91\xca\x2a\x1f\x08\x4f\x08\xc6\x8a\x17\xe3\x1a\x90\xf7\x09\xb5\xdf\xa7\x14\xd1\x6d\x14\xd0\x98\xf2\xe4\x12\x2d\xa8\xb0\x5a\xa8\x37\x46\xa5\xf5\x3b\x3b\x94\x12\x91\x0b\xae\x82\x63\xdf\x77\x1c\x73\x4b\xe9\x6f\xc6\xb1\x1b\x4e\x78\x8c\xb4\x53\x02\x61\xdd\x91\x4a\x97\xec\x15\x28\x40\x1b\x5d\x7d\x36\x08\x56\x88\xfc\xb7\x78\xe9\xb4\xbe\x81\x2a\x51\xfd\x70\x3e\x81\xc8\x6a\xb0\x37\x09\xd7\x6b\x06\x4d\xb6\xea\x0c\xb1\x86\x66\x01\x0b\x79\xec\xb7\xa5\x8f\xdf\xba\xe5\x74\xa3\xa2\x6e\x0a\x8e\xe9\xcc\x60\xde\x8a\x4c\xa0\x0f\x14\xd8\xa6\xb0\x1c\x61\x09\x2f\xa2\xe6\xd0\x95\x71\x4f\xd2\xaa\x79\x4f\xfd\x20\x6c\x93\x35\x45\x9e\xf0\x1d\x5d\x9b\x16\xb5\xfb\xe6\x3c\xbc\x59\xed\xcf\x80\x92\x65\x6f\x7e\x9a\x0a\x8c\x14\x7a\x0a\xa9\xda\x7a\x06\x99\x15\x51\xbf\x1e\xdf\x92\x66\x85\x51\x95\xcc\x9a\x9c\xea\x3b\x4f\x84\x17\xaf\x14\x25\x14\xae\xb0\xdd\x7a\xae\xab\x8c\x28\xc7\xf3\x4a\xa6\xc3\xf1\xdb\x83\x53\x3b\x7a\x2a\x1b\x43\xa9\x18\x83\x28\x16\x83\xab\x13\x21\x65\xb3\x7f\x87\xe4\x3a\xfb\xb3\x71\x9e\xc6\xcd\x31\x9a\x99\xa0\x3c\xf4\x43\xf3\xc2\xc0\xa7\x1b\x5c\x04\x57\x12\x9d\xb3\xc9\x32\x21\x68\x27\xd9\x68\xdd\x83\xc3\xe2\x9e\x80\xa2\xaa\x71\x68\x95\x5a\x3b\x24\xd8\x54\xcc\x30\xe3\x09\x7f\x03\x9e\x02\x2a\x05\x4b\x45\x26\xac\x88\x7a\x1c\x17\xd8\x95\xb5\x14\xb9\xbe\x72\xdb\xec\x9d\x62\x6f\x0d\xc5\xcb\xe5\xec\x39\xe3\xfb\x8d\x82\x63\x83\x06\xb6\x12\x22\xc5\xfa\xb0\xa8\xa9\x60\x59\x29\x33\x62\xd3\x7d\x9f\xcf\x6a\xb0\x7b\x68\x09\x4e\x35\xea\xee\x05\x7e\xac\x52\x38\x02\x00\x48\x55\xa9\x73\x66\x14\x2f\xcc\x42\x5b\x70\x99\xf0\x82\x27\xd2\x2e\x99\x2d\x79\x72\xe9\x6e\x81\x38\x2a\x3c\x6e\xc4\x92\x7d\x4a\x6f\x8f\xc9\xd7\x2c\x59\xb3\x8b\x52\x57\xf3\x05\xd4\x50\xe1\x5d\x49\xc6\x8d\x7f\xfb\xb5\xbf\x27\x1b\xde\xb0\x74\xa9\x78\x2e\x93\xd0\x3b\xa4\xd4\x57\xd2\x48\x4d\x91\x2e\x3f\xee\x59\xe8\xc2\x80\xd1\xb3\xc3\x8c\xcb\x9c\xed\x19\x21\xd8\xb1\x67\x09\xfc\xe6\x1c\x35\x49\xf4\x24\x96\xcd\xa4\x3a\x02\x7c\x24\xe0\x01\xf7\x49\x2d\x7a\x43\xaa\x02\x2a\x03\x6e\xe6\x6b\x1f\xba\x1f\x96\x6b\xfd\x9c\x74\x09\x09\x6f\xbe\x05\x90\x50\xa9\x8e\x32\x62\x0e\xce\x4e\x4c\x6c\xdf\x52\x1b\x45\x1c\x09\xbe\xc8\xb4\x9a\xc7\xc0\x77\x35\x67\x3a\x21\xaf\xa0\x1f\xe6\x95\x4c\x2b\x9e\xa1\x78\xa7\xc9\x1c\x9e\x9f\xe0\xcf\xe5\x7c\x61\xc7\xd7\x02\xbc\x9f\x78\x0a\xd6\x7b\xc6\x3f\x54\xae\x64\xda\x4a\x03\xc7\x81\x25\x2f\x1b\x7a\x92\xa1\xe7\x24\x5f\x02\xf0\x2e\x25\x77\x36\x92\x71\x3c\x4c\x3d\x0e\xb1\x8e\xe2\x30\xbd\x83\xd0\x20\xd1\xa9\x44\xe0\x1e\x76\x24\x06\x4e\x5d\x9d\x1b\x74\x7b\xac\x7b\x6e\x84\x8f\x6d\xdd\xf9\x11\x14\xe2\xee\x9d\x83\x37\xa6\xc8\x5e\xd5\x6c\x72\x21\xf2\x22\xe3\x76\x98\xd4\x92\x9d\x9f\x22\xf7\x77\x14\x3c\x76\xdb\x91\xab\x74\xcc\x33\xc7\x91\x67\x3f\x1e\x52\x65\x1b\x6e\xb0\x46\xfa\xda\x45\xdd\xa3\x14\x95\x03\xd4\x92\xd6\x6e\x2d\xc0\x52\x9b\x8a\x14\x84\x11\x3d\x19\x7c\x14\xd7\x0a\x5b\xff\xba\x3f\xce\x7e\x3c\x1c\x31\x39\x11\x13\xff\x57\xb8\xd5\x4b\x43\xab\xe7\x58\xe0\x10\x2a\x68\x80\x9f\xb1\x0b\x77\xe4\xfc\x8d\x7f\xfb\xaf\x6f\xdc\x24\xdd\xb7\x7f\x1b\x7f\x13\xf5\x32\xfa\xdb\xbf\x9c\x70\x2d\xdd\x0d\xcd\x4f\xe3\xfc\x72\x90\x7b\xee\xaf\x7f\x9d\xe9\xf4\xbc\x10\xc9\x04\x5f\xcb\xfc\x0b\xb3\x04\x98\x50\xd6\xe9\xda\x67\x1a\x32\xcb\x64\x8a\x5c\x0e\xcf\x2e\xc5\x7f\xfb\x00\x01\xb5\x4b\x25\x41\x92\x70\x2b\x14\x1c\x00\xbe\xd0\x58\x69\x8b\x3f\xc7\x46\xab\x30\xff\xbd\x59\xdc\xfa\xd4\x6a\x0d\xdb\x1c\x45\xc9\x81\x62\xe2\xbd\x34\x80\x3b\x83\xef\x0a\xe4\xe0\x94\xbc\xee\xcf\x34\x37\xac\xa3\x70\x80\x19\xc2\xee\xe1\x59\xc6\xfe\xa4\xb4\xfd\x53\x58\x7e\x9f\x98\x08\x07\x97\x66\xfc\x4a\xcb\x94\x55\xd0\x37\xcb\xed\x40\x05\x9e\xed\xba\x75\xe1\x74\xc9\x72\x69\x2c\xbf\x14\x13\x76\xee\xce\xac\x38\xc3\x00\xa9\xa7\x18\x74\xa1\x11\x29\xab\x94\x95\x19\x7c\x5b\x8f\xe3\xa6\x1c\x9f\x65\x27\x33\x66\xaa\x04\x9a\xf3\x96\x62\xec\x4f\x47\xba\x6b\x45\xc6\xd4\xef\x32\x0a\x8b\xbd\xe0\x68\x3f\x15\x29\xfc\x14\x5b\xfd\x2a\x62\xaf\x95\xbc\x6a\x37\x4f\xad\x92\xfa\x44\x04\x62\x42\xd7\x6c\x77\x08\x66\x3e\x01\x08\x4d\x39\x0a\x18\x28\x91\x08\x63\x78\xb9\xc4\x6e\xa8\x32\x34\x6d\xa4\x94\x57\x38\xa9\x73\xae\x2a\x18\xa0\x14\xd8\x5b\xb7\x4a\x80\x3a\x9c\x4d\x4b\x7d\x29\x54\x28\x21\x08\x0d\xd2\x43\x42\x75\x9d\x35\x0a\xf1\x7b\xcd\x92\x05\x57\x73\x51\x57\x91\xe7\x3c\x05\xda\xff\x10\x34\x2d\xff\x3e\x8e\x02\x7c\xe6\x14\x16\x69\x81\x14\x53\x77\x3e\x85\xb0\xc7\x3b\x15\x70\x70\x47\x75\x5c\xc2\xbd\x92\xcc\x3a\xc9\x44\x36\x8c\x23\xbc\xbf\x0b\x7c\x0c\x0a\xc5\x06\x93\xb7\x73\x61\x79\xca\x2d\x1f\x2c\x81\xfb\x15\x0f\x5d\x3f\x29\xa9\x03\xd8\x21\x4a\xf6\xa0\x33\xd6\xab\x92\xba\x90\x31\xae\x00\x48\x83\x85\x5f\x7d\xc0\xa5\xb2\x8e\xaf\x29\xe8\x88\x79\xd9\xa0\xab\xf1\x2c\xd3\xd7\x84\x54\xe7\x47\x43\x91\x25\x52\x96\x56\xa0\xf6\xd5\x22\xad\x4f\x50\x7c\x90\x98\x89\x5b\xe8\xc1\xa8\x7c\x51\xc7\xfe\x93\x66\x6e\xf6\x5a\x05\x0d\xcf\x3a\xa1\xac\xc4\xd6\xf8\x1e\x08\x82\x88\x5f\x29\xdc\xaa\xad\x65\x80\x75\x9a\x0b\x6b\xea\xac\x4a\x3c\x4d\x9c\x88\xa4\xb3\x9c\x9c\x08\x70\xd4\xd0\xd2\x90\x1d\xbe\x5e\x53\xc4\x85\x33\x9a\x4e\x0b\x77\x7e\x6d\x7c\x65\x86\x0b\x1e\x61\xfb\xdb\x57\x3a\xed\x1f\x85\x6a\xf5\x71\xad\x07\xae\xab\x4d\xb0\xf2\xc8\x80\x93\x07\x6f\x80\x98\xbc\x69\xc0\x64\xe0\x11\xb0\xe0\x57\xdd\xdd\xa9\xb5\x66\x3a\x0e\xcd\xda\xe0\x71\x63\x78\xdc\xf8\x59\x5f\xc7\x75\xff\xac\x45\x7f\xf5\xcc\x5e\x6c\x4e\x68\x80\x48\x85\x13\xad\xe7\x83\x04\x12\x5a\x28\x4a\x61\x5c\x3a\x7f\x29\x33\x23\x64\xc3\x50\x3d\xad\x90\x4e\x6a\x3e\x67\x7f\x6a\x68\x5c\xa4\xd9\x06\x6b\x18\xab\x98\xf6\xbc\x79\x3c\xa1\x85\xf7\x70\x5e\xcd\xdb\xf7\x5b\x83\x81\xaa\xb7\xde\x6a\xf4\xd5\x52\x41\xfd\x76\xaa\x32\xf4\xe1\x0f\x35\xaa\x8e\x99\x4b\x9d\x65\xbe\x77\x3b\x5a\xc8\xad\xdc\x26\xe8\x1b\x84\xd1\x92\x51\x70\x43\x04\x7d\x5f\x89\xeb\xa0\xd8\x71\x83\x70\xa5\x3e\x56\x0f\xae\x12\x9f\x70\xb6\x6e\xbc\x50\xd1\x75\xa0\x96\x38\xf5\xa3\x88\xb4\xe8\x5e\x60\x73\xf7\x20\x67\x01\x28\x3e\xcd\x30\x23\x27\x28\x3e\x30\x17\x9e\x5d\xf3\xa5\x81\x5d\x56\x5b\x6c\xe1\xf9\x84\xf5\x5e\x0f\xfc\x46\xcc\x7a\xf4\x93\x8f\xaf\xc1\xa2\xf9\xc3\xc5\xf3\x01\x6c\x45\xaa\xee\x49\xba\xf5\x30\x1d\x5a\x70\xb7\xaf\xe1\xd2\x02\x20\x33\x12\xd2\xa2\x86\x88\xaf\x36\xb6\xf3\xc1\xd9\x09\x0c\xec\x2d\xb7\x39\xfc\xe1\x4f\xf4\x10\x28\x9c\x0a\xb7\xdf\x6a\x88\x28\xe0\xdd\xf8\xb7\x6b\xf2\xc6\x6a\xa6\xff\x01\xfa\x21\x51\xfc\xc5\xd7\x03\xbb\x03\xe1\xe0\xec\x04\x9f\x38\x81\x96\xb8\x5c\x2d\x49\xd7\xb2\x0b\x59\xa6\xe3\x82\x97\x76\x89\xce\x8b\x51\xe3\x69\xa1\x28\x72\x00\x72\x0c\x1a\x1a\xee\xd3\x42\x2d\xbe\x1a\x6b\x04\xe4\xf3\x81\x17\x8a\x9c\xdd\xb8\x32\xf7\x8d\x22\x7d\x4b\x34\xfd\xd5\xa0\x48\xdc\x42\xc7\xfb\x2e\x1e\x04\x45\xd2\x58\x10\x7f\xaa\x73\xd9\xc9\x78\xd3\x4c\x67\xc1\x63\x16\x74\x68\xf2\x37\xe9\xb8\x6e\x2c\xe8\x6c\x60\xfc\xbb\x91\x46\x4c\xce\xdc\x01\xa7\xd5\x98\xaa\xd5\x83\x73\x9c\xf4\x3e\x9f\xf7\x89\x86\xbc\xdb\xba\xe8\xfe\x8c\x9f\x15\x0f\x10\xf6\x3a\xdb\x53\x5a\xe1\xfe\xc7\x7b\xf7\x31\xed\xf5\x06\xff\x2e\xdc\x32\x61\x3f\x2d\x84\x8a\x0f\xbf\xd8\x21\x3e\x0a\x87\xb0\x54\xa9\x5b\x7c\x38\x19\xc1\x1f\x60\xaa\x24\x11\x22\x78\x90\xe2\x76\xf1\xb5\x7c\xa2\x29\xe7\xdc\x26\x0b\x61\x98\xd1\x00\x3b\x6a\x2c\xcf\xb2\xda\x73\x43\xe4\xd2\xa0\x47\x78\x2f\x7a\xa4\x5e\x34\x8a\xbc\xc9\x89\x55\x64\x9c\x3c\x25\xb3\x4a\x25\x98\x58\x25\xed\xd2\xcf\xe0\xa8\xad\x4a\x81\xb9\x6a\xd0\xa1\x23\x67\xe8\xbb\x8d\xcc\xce\x40\x4c\x10\xb0\x4b\x14\xa9\xcd\x93\x9f\xb0\xf5\x9c\x34\x9d\xf2\xe4\xf2\x9a\x97\xa9\x81\xfa\x75\x6e\x25\xb6\x38\x1c\x35\x86\xdd\x8b\xe6\xe0\x9e\xde\xd0\x14\xf6\x83\x71\x6b\x44\x68\x65\x57\x3f\x86\xf1\xca\xea\x9c\x5b\x99\x80\xdb\x46\xce\x22\x4f\x7c\x1e\x5a\x40\x84\x48\x2a\x4a\x76\x38\x2b\xe8\x35\xc0\x82\x2b\xb1\xcc\xc2\x5e\x6b\x26\x73\xa7\x81\x71\x68\xfd\x3c\x0b\xd5\xea\x3e\x66\xf0\xa1\x99\x3a\x35\xf3\x27\x08\xd4\x44\x77\xa1\x43\xc8\x99\xea\x06\x86\x0f\x51\x81\xe0\x0e\xa7\xb2\xec\x51\x4b\x41\xa2\xdf\x38\x9e\x76\x73\x8d\x58\x75\xe4\x96\xe7\x5a\x38\xbd\xcb\x7c\x90\x61\xcd\x64\xdd\x8c\xe4\x5c\x61\xe1\xae\x34\xde\x85\x40\x99\xd8\x7b\x69\xa9\x8b\x82\x9c\x81\xf9\x7e\x7b\x46\x10\x7b\x2b\xaf\x84\x81\xb8\xb3\xcf\xed\x76\x64\x98\x0b\x25\x4a\x6e\xc1\x93\x4f\x70\x84\xb0\x73\xdb\x8f\x68\x6c\x98\x09\x82\xb2\xec\xb3\xb7\xd4\xe0\x3f\x30\x6e\xc8\x14\xbf\x95\x62\x8a\x9e\x45\xd2\x4d\xb7\x1a\xe5\x07\x87\xd9\x6a\x94\x5b\x8d\xb2\xc3\xb5\xd5\x28\xdb\xd7\x56\xa3\x8c\xaf\x90\x8c\x3c\xac\x36\x59\x57\x17\x44\x89\x1f\x71\x2a\x55\x7d\xc3\x4d\x2e\xbf\x93\x19\x7b\x23\x12\x7d\x25\x4a\x3c\x44\x8e\xdf\x17\x5c\x39\x5d\xe9\x05\x97\x99\x3b\x42\xfc\x51\x52\xbb\x37\xa0\x8f\x4e\xd3\xc5\x1e\x79\x94\xc2\x7a\xd0\x66\xcd\x69\x52\x84\x74\xe1\xee\xa7\x40\x7e\x51\x8a\x2b\xa9\x2b\xe3\x13\xbe\x2a\x8b\xc2\xc2\x58\xd2\x67\x16\x72\x1e\xda\xdd\x85\x74\x8c\x52\x24\xba\x4c\x6b\xc8\x2a\x63\xb9\xad\x4c\xb3\x86\x34\x41\x9f\xf6\x70\xee\xcc\x40\xc7\x7b\x74\x7a\x0e\x79\xce\x60\xc6\xdc\xe0\xfb\x75\xf7\x25\x66\xe2\xe1\x87\x53\x62\x43\x9f\x1c\x58\x27\x26\x3a\xd5\xb7\xb2\x22\x62\x57\x62\xac\x3b\xaf\x61\x03\x8f\xe6\x09\x36\x0f\x1f\x87\x61\xc7\x75\x2e\x60\xe7\xfe\x88\xf1\x35\xe0\x6a\xb2\xc1\x81\x53\xe2\xeb\xc1\xa5\x0e\x36\xaf\xc1\xaa\x16\xd8\x27\xa9\x5c\x60\xc3\x57\x2f\xb0\x4f\x5f\xc1\xc0\x42\x45\xd9\xf0\xfb\xfe\x8d\xaf\x70\x6b\xed\x7c\x3a\x96\x3e\xb4\xf3\x1b\x50\x6a\x61\x1c\x69\x98\xce\xa5\xb5\xc2\x27\x90\x84\x9d\x0c\x0e\xff\xb8\xc2\x87\x64\x0e\xf8\x12\x30\x4b\x44\xbc\x0f\x3d\xa4\x22\x5d\x15\x34\xce\x6b\x69\xc0\x40\xe2\xca\xd9\xb5\x88\x68\x0b\xb2\x63\x4c\xe9\xbe\xde\x56\xdf\xca\xa1\xfe\xe3\x6e\xe5\x50\x7c\x6d\xe5\x10\x83\x6e\x5c\x19\x14\x8f\x0c\xaa\x18\xfb\x41\x09\x4a\x87\x4f\x45\xc6\x7e\xad\x44\xb9\x64\x4e\xd1\xad\xd3\x4c\xa1\xdd\x96\x91\x29\x25\x6a\x92\x63\xb2\xaf\x75\x79\x4f\x75\x3c\x70\x9c\x1e\xbf\x77\x76\x02\x20\x20\x0c\x2e\xf5\xdb\x0f\x68\x02\x19\xe1\x2a\x84\x95\x89\xad\x03\xcc\x11\x69\xd8\x0b\xce\x54\x38\x38\x3d\x1a\xd2\xd4\x1f\x22\x7d\x80\x0d\x97\x42\xc0\x56\x5c\x32\x1f\x20\x11\x92\x32\x7c\x03\x07\x5b\x48\xf3\x08\x8e\x46\x76\x29\x96\x23\xca\xa6\xa2\x5e\x8b\xfe\x66\x4c\x4c\x6c\x36\x7c\xe9\x07\x14\xd8\xbc\x06\x3e\x81\x86\xf4\x0d\xe2\xd5\xb7\xc1\x47\x73\x2c\x4f\xdc\x61\x0e\xc5\x81\x0f\xd9\x01\x1a\x81\xc4\xd7\x4d\x4d\x41\x90\x5b\xa1\x87\x80\xaf\x96\x0a\x0c\x0a\x15\x62\x20\x61\x87\x61\x2f\x36\xb4\x7b\x0a\x2f\xbf\x8c\x9f\x88\x58\x61\x0b\x36\xca\x72\x2e\xc5\x72\xd7\x10\x96\x86\x56\x66\x21\x0b\xdf\x25\x12\xe4\x24\xed\x4a\xf6\x23\xe4\xbf\xf9\x21\x50\x22\x9e\xa8\x11\x3b\xd5\xd6\xfd\xe7\x18\x12\x7a\x31\xc6\xa2\x85\x39\xd5\x16\x3e\xb9\xd7\xe4\xc6\x57\xfb\x44\xc4\xa6\x10\x8d\x84\x10\x0b\xa6\xae\x43\xed\xaa\x4f\xf3\x04\xa2\x52\x2e\x4f\x58\x18\x69\xd8\x89\x62\xba\xf4\x54\xb5\xbe\xf1\x95\xa1\x21\xbc\xf7\x3a\x8a\x86\xad\x19\x83\x16\x43\x97\x8d\xb5\xf8\xc0\x70\x21\xb0\x26\xfd\x37\xe0\xdd\x86\x48\x64\xc8\x4d\x85\xe6\x4b\xdc\x8a\xb9\x4c\x58\x2e\xca\x39\xe0\xae\x24\x8b\xa1\x97\x78\xa8\x73\x11\xaf\x01\x4f\x47\xbc\x06\xe5\x43\x50\x51\x5e\x42\xd6\xf1\xa7\x51\x7f\x70\x6c\x3c\xae\x73\x5e\x38\x16\xfc\x3f\xee\x54\x06\x2e\xf8\xbf\xd0\xdc\xcd\x4c\xd8\x01\x33\x52\xcd\x33\xd1\xf8\x8e\xfc\x99\xf1\x30\x6e\x04\x67\xbf\xfe\x5a\xc9\x2b\x9e\x09\xac\x12\xe0\x2a\xb4\x5e\xd1\xb3\x15\xa5\x6b\x44\x1d\xde\x9c\x5c\x0e\x31\xf8\x9d\x4b\xb1\xdc\x19\xad\xb0\xed\xce\x89\xda\xa9\x21\x9c\x1a\x8c\x1a\x94\x0b\x08\xcf\xee\xc0\x77\x3b\x9f\x47\x4f\x7b\x00\x66\xec\x60\x3c\x49\x2e\xe7\xc3\x8c\x1b\x33\x04\x9a\x4c\xab\x20\xbc\x35\xfa\xba\xc6\x12\xe7\xd1\x3d\x75\x49\x38\x55\xa0\x0c\xee\x47\x87\x0a\xc8\xa1\xf2\x81\x07\xa0\xff\x15\xf5\xb3\xee\x0b\x43\xb7\x16\x0a\x1c\x40\xd8\x7c\x85\x6c\x03\x51\xa1\x4e\xd3\xb9\x81\xe2\x3f\x42\x44\x44\xcf\xd8\x8b\xba\x61\x84\x34\xe0\xa2\x92\xbe\x66\x56\x69\xcb\xa4\x4a\xb2\x8a\x82\x21\xf0\x53\x70\x70\x0d\x63\xc0\x0e\x46\xde\xc1\x19\xbb\x1e\xd6\x73\xb4\x4f\x29\x5a\x29\x84\x6a\x67\x7f\x40\xbe\x4d\xc8\xa6\x40\x6a\x6f\x92\x5a\xb3\x4e\x25\x1f\xcd\x46\x27\x49\x53\xbf\x7c\x21\xa7\xa5\x60\x87\x0b\xae\x94\xc8\x22\x14\x19\x72\x86\x72\x6b\x79\xb2\xc0\x98\x1d\x67\x6e\x1f\x67\xc2\xee\x1a\x6c\xd0\x9f\xf3\x64\x21\x55\xc0\x55\x50\x01\x4d\xa9\xae\x2b\xdb\x40\x6b\xa0\xbe\x06\xd2\x80\x5d\x65\x76\xa9\xad\x0c\xf1\x5d\xdc\xcf\xa5\xd9\x6d\xa6\x06\x28\x6f\xdf\x53\x23\xf5\xd3\x9e\x07\xca\xe3\xb9\x0c\xad\x4f\xe0\xde\x0f\xf7\xab\xc9\x83\x43\x5b\xaa\x99\x28\x4b\x5c\xa1\xa9\xa0\x1f\xb4\x7a\xcc\x4e\xa8\x89\xc5\x42\x5f\xb3\x54\xb3\x6b\xe8\xb6\x7a\xe5\x14\x08\x48\x45\x32\x5e\xf5\x88\x66\x0a\x89\x81\x89\xce\x8b\x52\xe7\xd2\xf8\xf2\x47\x62\x8f\x8d\x01\xa6\x64\x55\x67\xcc\xd9\xe6\x2a\x66\x95\x6a\x36\x7b\x7c\x71\xc8\x2c\x2f\xe7\xc2\xba\x67\x30\x55\xe5\x53\xd1\x13\x17\x66\xd3\xa8\xe4\x83\x76\x01\xd9\x0d\x6d\x40\x1a\x54\xfb\x48\x7f\x0f\xf6\xc6\xff\x0a\x12\x08\x21\x4d\x71\xa6\x4b\x4a\xb6\x0c\x5f\x12\x0c\xbd\xe3\xc2\x1f\xe9\xe0\xac\x94\x35\x3d\x51\xe1\xfb\xf4\x07\x41\x56\xf8\xe9\xa7\xd3\x61\x60\xdd\x77\xeb\xf1\x6e\xe2\xba\x6b\x5d\x66\xe9\xb5\x4c\x51\x39\x33\x6c\xcf\xdd\xbc\xdf\x8f\x02\x1b\x44\x79\xef\xbd\xd3\xaf\xaf\x65\x3a\x10\xf1\x61\xa8\x26\xd1\x7d\x1e\xb5\x23\x3a\x03\xaa\xcb\x54\x28\xeb\x84\x65\x69\xd8\x1e\xfc\x62\x9f\x1d\x4b\xac\xc4\x87\xdf\x03\x88\x6a\x3e\x95\xaa\x46\x79\xa8\x17\xd5\x1d\x97\x4e\x6e\x78\xf3\xde\x08\x8b\x35\xd4\x50\x86\xac\xed\x82\x19\x99\x57\x99\xe5\x4a\xe8\xca\x64\xcb\x9e\xac\xfd\x50\x17\x76\x96\x89\xf7\xb8\xc3\xfb\x2b\x3d\x61\xa8\xa6\xf2\x03\x89\xb6\x35\x70\xca\x8a\xf6\x53\xa7\x82\xa7\x4f\x82\x26\x14\x80\x00\xc4\x7b\x91\x50\x8d\x58\x91\x55\x73\xd9\xa9\x28\x78\xdb\x07\xb1\xd3\xaf\x6f\xd7\x07\xb1\x6e\xf7\x56\x19\x51\x23\x97\xf5\xeb\x43\x7e\x0f\xdb\x16\x6e\x56\xbf\xbc\x58\xdf\xb2\x30\x15\x85\x50\x29\x40\xa7\xbf\xa8\xf7\x1f\x4e\x7e\x63\xb4\x27\xc8\xf2\x61\xce\x0a\x8f\x7f\xde\x38\xa5\xa3\xc4\xfb\x85\xce\x52\xc3\xc4\x7b\x5b\x72\x77\x1c\xe4\x4e\xf0\x87\xdf\xcc\x18\x57\x7d\x45\xfb\x63\x69\xbc\xc5\x3e\x93\x06\x9a\x3e\x52\x0d\xd4\x0c\xda\x91\x73\xd7\xc4\x7d\x38\x6b\xea\x35\x3e\x1e\xb8\x39\x27\x1e\xa0\x24\x1d\x4c\xb3\x0e\x6d\x4d\x13\x4d\x7a\x4a\xb3\xfe\xa5\x5f\x33\x4d\xb3\xa6\xb5\x5e\x6b\x56\x1b\xdc\xac\xdb\xce\x9a\x0f\xab\xb3\xe6\x0c\xe0\x9e\xfa\x83\x1f\xd3\x38\x2d\x9f\x1d\x7d\x48\x6a\xeb\x6d\x7c\x74\xb4\xa3\xa2\x33\x19\x3a\xe5\xd0\x40\x04\x9b\xc0\x8c\x5b\x8d\xba\x38\xa2\x52\xaa\x9b\x34\xdf\x74\xdf\x41\x6e\xb9\x11\xb6\x8f\x27\xb9\xa9\x60\xd6\xe3\x39\x91\x13\x73\x3e\x7d\x85\xdd\x3b\xa1\xd0\xd3\x43\x20\xb1\xf1\xdf\x48\x17\x55\x8d\x3b\x9d\x16\xea\xe9\xee\xc1\x91\x45\xc8\x2c\xc3\x31\x52\xb7\xda\x09\xb7\x3d\x1b\xd2\xf7\x38\x8d\x69\xb6\x6f\xdf\x9e\x1c\x0d\x49\x42\x37\x9e\xd7\x56\xe1\xdf\x4d\x32\x12\x97\x02\x80\xae\xfc\xb5\x8a\x0d\x6d\x80\x6e\x0c\x84\xa3\xfb\x37\x41\x9d\x79\x22\xea\x30\xc1\x91\x34\x97\xfd\x01\xce\x57\x86\x6c\x6e\xf7\xef\x0e\x8f\x19\x7d\x7a\x2b\xef\xfc\x5d\xdc\xf3\x7d\x51\xb1\xe7\x89\xa8\x03\x77\xa9\x34\x97\x1b\x00\x47\xef\x6b\x03\x17\xe9\x69\xb7\x3a\xce\xfb\x19\x69\x68\x5b\x78\x1e\x46\x35\xc2\xf7\x5d\xea\x8a\x5d\x13\x8c\x20\x59\x88\x17\xb2\x78\xce\x8e\x95\xa9\x4a\x51\x67\x68\xb5\x87\x72\xfa\xd6\xad\xed\x45\x40\x6a\x34\xcf\x07\x8b\x4a\x0c\xcd\xa9\x8f\x25\xcc\x51\xf0\xd2\x82\x21\x37\x0c\x23\x85\xe1\xbc\x9c\x8e\x3e\x50\xb7\xe1\xa4\x93\x99\x2f\xbe\x18\x11\xa6\x58\x00\x4e\xf7\x37\x39\xde\x89\x40\x46\x63\x6e\x79\x11\x80\x7d\xd9\x93\x54\x5c\x3d\x31\x29\x7f\x36\x82\xc7\xf8\x92\xc1\xe6\x9c\xb8\x61\x3b\xcf\x76\x26\xec\x5c\xe6\x32\xe3\x65\xb6\x6c\x34\x38\xab\xef\x73\xc7\xae\x1f\x10\xb2\x59\x9e\xee\xb0\x3d\x5d\xc2\xc8\x09\x57\x2c\x13\x1e\x73\x81\x76\xf5\x12\xed\x8e\xfd\xfb\x21\x22\xd9\xbd\x89\x14\xa1\xb4\x1c\x88\xd7\x52\xaf\x53\xd1\x79\xdf\x00\xad\x3d\xaa\x0f\x3c\xa9\xdc\x29\x38\x61\x6f\xe9\xf8\x22\xbd\x00\x99\x01\x36\xb3\xbf\xe3\x7e\x2d\xd6\xfd\xf3\x87\x74\xf2\x6c\xac\x86\xee\xee\x1b\xa1\xbb\x7a\x4f\xe6\xd2\xbe\x11\x85\x1e\x40\x87\xc3\x81\x5a\xf1\x05\x69\xdd\x07\xda\x48\x68\x4f\xc3\x2d\xe3\x28\x92\x92\x2a\xe3\xce\xa8\xc3\xe8\xc2\x84\x1d\x1d\x9f\xbd\x39\x3e\x3c\xb8\x38\x3e\x7a\xce\xbe\xa3\x91\x64\x6c\x07\x4c\xd8\x45\x8c\x3b\x1d\x55\xb4\x11\xb8\x6f\x78\xd6\x88\x44\x2c\x57\x75\xe3\x0c\xc0\xe1\xe4\x8a\x9d\x28\x69\xeb\x96\x61\x58\x17\x90\x69\x45\x99\xfe\xee\xd7\x14\xdd\x98\x4b\xcc\x47\x55\x34\x98\xfb\xba\x39\x1a\xec\x50\x6c\xb0\x13\xa6\xd2\xc9\x41\xb2\x61\xe5\xaf\x5e\x9e\x4d\x18\xaa\xbe\x17\xce\x30\x36\x56\xe8\x83\xe4\x61\x20\x30\x5a\x5c\x7f\x8e\x87\x6d\x68\xfb\xe8\x81\x75\x75\xd9\xe8\xca\x38\x99\xec\x4e\x98\x3b\xc6\x77\x27\xbb\x5e\xe5\xcb\x56\x5a\x87\x86\x41\x63\xfc\xf2\x26\xc3\x4f\x18\x7b\xed\xcb\x26\x01\x7c\x6a\x7d\x17\x52\xc4\x5f\x8c\x7a\x4e\xb6\xb6\x8d\x2f\xdd\xaf\xa6\xf1\x43\x09\xf0\x7c\x2e\xaf\x84\xc2\x17\xdb\x9c\xa4\xf6\x53\x1d\x64\x19\xe3\x37\x27\x4b\xf9\xcd\xcb\xcd\xbd\x1b\x4a\x9c\x81\xde\x8c\xc4\x17\xbd\x57\xa2\xf3\x1c\x11\xba\x17\x01\x4c\xa6\xc6\x83\x09\xd2\x71\x23\x56\x3e\xe2\x92\xcf\x3a\x6d\xec\xd6\xc9\xe0\x87\x6a\x59\xf5\xe1\x63\x2a\x6f\x56\xb5\x39\x75\xf7\x3e\x66\x04\x8c\x6f\x3c\xc8\x2a\x1d\xb3\x4f\xc2\xc3\x9f\xbc\x39\x3e\x38\x7a\x75\x3c\xc9\xd3\x07\x28\xa4\x85\x4a\x0b\x2d\x95\x35\x5d\x2d\xfc\x6e\xfd\xd0\xfb\x8a\xf7\x30\xed\x61\x74\xb8\x30\x9c\xdf\x3f\xfe\x83\xa8\xcb\x41\x2a\x2c\x97\x99\x89\xb8\xcb\xea\x42\x67\x7a\xbe\xbe\x01\xda\x1d\xd8\xe6\x0f\x88\x90\x3b\xe6\x63\xc7\x8f\x9b\x33\x76\xbb\xf7\x51\x6e\xdb\xb9\xd8\x37\xd9\x11\xb2\xa6\x56\xb0\x1b\xa1\xdd\xf1\x23\x20\xd8\x67\x34\x23\x56\xa8\x88\xee\x1c\x10\x6f\xbe\x09\x45\xdd\xd5\x21\xea\xae\x7e\x5b\xfb\x62\x33\xc4\xef\x6a\x5a\x38\x49\xde\xb5\x8d\x7f\x93\xea\x7e\xa4\xe6\x01\x52\x94\x62\x1c\x60\xb3\xa1\xbd\xb7\x2e\x23\xb5\x2c\x3e\x4f\xbc\x27\xd8\xfb\x8d\xf1\xae\x6c\xd9\xf6\x08\xd7\x9a\x7c\x70\xc4\x23\x16\x61\x96\x2d\xeb\xd6\x28\xe4\x0d\xe3\x73\x84\xc3\x2e\x29\x20\x57\x94\xf2\x4a\x66\x62\x0e\x6d\x8f\xa4\x9a\x47\x30\x4e\x31\xf0\x13\xb5\x41\x6a\x06\xa7\x5e\xb9\xbf\xa2\xd6\x7b\xc0\x59\xa7\xaf\x2f\xa0\x83\x16\xa4\x54\xf4\x36\x38\xdd\x03\x61\xcf\x8f\xc7\x63\x70\xfd\xed\xfd\xb7\xb3\x7c\xd2\x6c\x9f\xfd\x24\xe8\x39\x1a\x5a\x7c\x95\xd0\xe6\x7e\xa1\x43\xbf\x25\x98\x6b\x4d\x59\x60\x68\x4c\xe3\xa3\xbb\x9e\xb8\x3b\x9d\x46\x8d\x47\x79\xe3\x7e\x29\x00\xb2\xbb\xce\x33\x78\x88\x56\xd2\x86\x0e\xd0\x81\xa5\xbd\x0f\x36\xad\xdb\x23\x21\x7d\xc0\x9f\x0b\x9c\x99\x65\x9e\x49\x75\x59\x63\xc4\xcf\xb4\xe3\x63\x2c\x67\x96\xea\xd2\xef\x9a\x52\xf0\xec\xe6\x13\xa3\x0b\x8f\x6e\xec\xb4\xb0\x83\xc5\x23\x20\x5e\xe0\xa4\xc5\xf7\x5e\x78\x51\x02\x58\x2c\xea\x77\x76\x1e\x34\xc5\xa4\x49\x8c\xec\x2f\xde\x61\x98\x86\x6c\x57\xec\xe4\xfc\xf0\xfc\xe4\xb3\x46\xfd\x6e\x3a\x5c\x61\x76\x0f\xda\x7a\x90\xbf\x76\xcb\xaa\x1a\xb3\xac\xea\xfa\x4b\x74\xbd\x9c\xe9\xd2\xf2\x6c\x03\x82\x33\x59\xf0\xe2\xa0\xb2\x8b\x23\x69\x00\xad\x71\x18\xf5\x6f\x65\xd4\xa8\x5e\x11\xfb\xd0\xf9\x86\x1b\xd2\xb3\x2f\xdd\x77\xf8\xfd\xc1\x19\xe3\x95\xe3\x47\x4b\x2d\x86\x36\x96\x2c\xe7\xdf\xe2\x1c\x6b\xa0\x07\xa5\x0c\x8d\xf9\x11\xba\xf8\xbb\xee\x13\x55\x3e\x5f\xd5\xdb\x36\x1e\x0d\x27\x17\x4a\xfd\x47\x12\x83\x96\x4a\x5a\xc9\xad\x2e\x07\x8b\x0d\x36\x46\x0c\x0e\xc3\xca\x58\x9d\xd3\x2e\x3a\xf1\x77\x40\x42\x16\xe8\x6f\x2b\x3f\xaa\xbd\x89\x60\x7d\x02\xcd\x4f\x94\xb3\x15\x79\x22\x5a\x65\x36\x23\x68\xfd\x83\x63\xcb\x70\xcf\x37\xe4\x44\x07\x14\xfb\xec\x6f\xcf\x1b\xcd\x31\x57\x3a\x18\x7b\x2f\x66\xdd\x1e\x77\x63\x5e\x69\xf9\xeb\x30\xa2\x4d\xfe\xaa\x5a\xf1\x04\x24\xd1\xff\xae\x78\x86\xa4\x3d\xdd\xa4\xf3\xbd\xb9\xa4\xc3\xbc\x71\x93\x4b\xe8\xe5\x6b\x96\x38\x0d\xde\xb6\xca\x20\x46\x3f\x52\xc4\x96\x5c\x19\xc7\x27\x4d\x7f\xc6\x2e\x25\x40\xec\xb2\x3d\x9b\x14\xfb\x1b\xa3\xd4\x50\xe5\xb0\x59\xa5\x62\x65\x15\xdf\xfd\x02\x59\xe3\x65\x28\x87\xed\xf7\x9a\x1b\x4f\x72\x80\xdd\x3e\x8c\xdf\x96\xc6\x0a\x7c\x14\xd3\x0b\x15\x44\xf6\x52\x1a\xeb\x1b\x08\xc3\x07\xd2\x50\xaf\x35\xb0\x05\xce\x98\x2e\x99\x2c\xfe\xc9\xd3\xb4\x7c\x8e\x7a\x04\xd9\xaa\xf0\x6f\x13\xe0\xf0\xb9\x0a\xd9\x36\x7b\x76\x59\x50\x13\x8f\x8b\xc3\x33\x86\x8d\xc2\xbf\xfe\xeb\x53\xb0\x0b\xbe\xfa\xf2\xaf\x4f\x7b\x32\xe2\x43\xad\x2a\x64\x43\xfb\x44\x07\xcf\xac\x78\x24\x55\x24\x8d\x6a\x11\x47\x0b\xd0\x76\xcf\xb1\x38\xc3\x9d\x93\x24\x34\x71\x23\x38\xae\x0c\xa7\xf7\x90\x3a\xf1\xb6\xea\xe2\x77\x54\x75\xc1\x42\x35\x3e\x0a\xd6\x41\x18\x39\x1e\x10\x60\x75\x56\x05\x38\xca\xee\xb3\x87\x22\xbb\x3b\x52\xb7\x2b\x27\x37\x39\x38\x4e\xf1\xf3\xad\xf3\xeb\xf2\xd4\xa3\xd3\xf3\x7f\xbe\x3c\xf8\xfb\xf1\x4b\x78\x57\xca\x0a\x74\xec\x49\x96\x50\x97\x9c\xf5\xdb\xb3\x7b\x77\xe7\x56\x57\x92\x0e\x91\x60\xa0\x5a\xa9\x05\x8a\x9d\xbe\x38\xbf\x6b\x56\x41\x5f\x73\x56\xcd\x7a\x50\xef\xa1\xc5\x35\xa0\xd3\xba\x28\x37\x53\x39\x3f\x70\x50\x24\x82\xbd\x6f\xf8\x51\x1c\x0f\xe1\x3b\xf6\x76\x75\x74\xe4\x0d\x76\xef\x74\xbd\x0f\xc7\xbf\x1d\xc5\x90\x8a\x83\x47\xbe\x3f\x2b\xb5\xfb\xe9\x90\xe5\x50\xb0\x0e\xbb\x38\x96\x57\x1f\x9d\x08\xc3\xb3\xa3\x74\xa7\xaa\x3b\x4f\x85\x09\xdd\x98\x1f\x01\xb7\x16\xeb\x5a\x0f\xf6\x3f\x1d\xd6\x0e\x4b\x3d\xb8\x7d\xeb\xa5\x28\xab\xa0\x51\xd7\x7d\x53\x03\x4f\x9f\x91\xc9\xc9\x11\x66\x0a\x9e\x0c\xda\x10\xbe\xfe\x08\x3f\x01\xe8\xbd\x87\x78\xc0\xc0\xc4\x37\x54\x5e\x16\x9e\x3d\xcc\x76\x0c\xc3\xb5\x91\x56\xee\xc4\x25\xbe\x7d\x79\xa1\x3d\x92\x4e\x0c\xc9\x72\x2f\x59\x88\xdd\xbb\x73\x28\x1c\x43\x3f\x75\x74\x37\x6c\xd2\xd5\x50\x2c\xb4\xd5\x6a\xe0\x1a\xda\x75\x83\x36\x05\xdb\x19\xdc\x71\x88\x95\xee\x99\x28\x23\x79\x8b\x15\x44\x21\xac\xee\x2c\x0f\x7f\x74\x6b\xe5\x03\xec\xcd\xf0\xfa\xc3\x93\x44\x45\x7a\x72\xb4\x01\x21\xf4\xd8\xc0\x8e\xee\x1a\x26\xdc\x58\xa2\x6c\x3a\x50\xe5\xbe\x1b\xc8\xd3\xfc\xe4\x88\xcc\x05\x5f\x96\x6f\x68\x5b\xb1\x9b\xf7\xd5\x46\x54\x29\x5d\xda\x6b\x5d\x0e\x05\x1f\xd7\x1c\xae\x95\x85\x49\xdf\xad\x80\x71\x3c\x4e\x29\x82\x6f\xf9\xe0\x25\xc9\x39\x48\x92\x56\x1b\xd4\x9b\x24\xca\xa7\x10\x28\x0f\x47\x90\x7c\x1a\xc5\xe5\xd3\x22\x71\x6d\xcc\xfc\xf5\xdb\x63\x10\x62\xf9\xc1\xc8\x0d\xea\x18\xa5\x96\xbb\x1c\xdc\xcd\x91\xe4\xd9\x88\x9c\x2d\xb5\x93\x43\xdd\xc4\x49\x53\xc4\xfa\x91\x30\x38\x88\x6d\x1b\xb3\xcc\xad\xac\x56\x71\xc3\x47\x02\xeb\x1a\x31\xec\x99\x98\xf3\x82\x9a\xe6\xa7\xfa\x5a\x5d\xf3\x32\x65\x07\x67\x27\x9f\x5f\xae\xf6\xae\x04\xc5\xfd\xd0\xa7\xb7\x40\xb3\x16\xb4\x1e\x0f\x32\xf0\x21\x49\xc8\xfd\x31\x95\xd6\x60\x2a\x3f\x24\xe3\xdb\xd8\x1b\xe5\xce\xa9\x90\xc9\xe2\x24\x9d\x93\x6a\x34\x52\xa4\x56\x29\xa6\x13\xcb\x33\xdf\x88\x59\xd8\x6b\x21\x14\x7b\xfa\xf4\x29\x06\x28\x9e\xfe\xc7\x7f\xfc\x07\x83\xae\x9b\xa9\x48\x64\xbe\x7a\x23\xdc\xf5\x97\x67\xcf\x26\xec\x1f\x07\xaf\x5e\x32\x9e\x80\x2d\x87\xc8\xb7\x38\x32\xac\x67\xfc\x63\x33\x62\xff\xeb\xfc\xf5\xa9\x3f\xbe\x4c\xeb\x5b\x60\x97\xf0\x7a\x13\x76\x14\xe5\xde\xc7\xc1\x03\x6e\x17\x40\x0d\xa5\x2d\xe3\xb3\x19\x32\x1c\x48\x6e\x69\xbc\x30\xf1\xd8\x73\x72\xbe\xf0\x9d\xe8\x1d\xab\x65\x50\x14\x20\xdd\x14\x21\x60\xe3\x71\x1c\xb1\xc6\x01\xc6\x0a\x87\x08\x4c\x65\xc4\x32\x79\x29\xd8\xcc\x40\x3f\xfa\xba\x71\x4a\x29\x8c\x33\xc0\x12\xae\xdc\xe8\x38\x58\xbd\x32\x46\xf4\xc4\xc6\xdc\x74\xe6\x44\xcf\xce\xe5\xcd\x10\x32\xed\x79\xdf\x42\x8c\x7a\x03\xfa\x1a\x2d\x14\x19\x6e\x15\x1e\x6a\x26\x43\xe3\x6d\xcf\xc2\xfb\x20\x53\x11\xfa\x61\x2d\x19\x79\xa6\xd5\x3c\xe6\xc1\x5a\xfb\xf0\xc9\x94\xcb\x42\x74\x25\xc6\x40\x0d\x75\x86\x69\x4f\x87\xc2\xfd\x15\x2f\xfa\x75\x02\x69\xe6\xe8\xfa\x31\x1b\x38\x94\x7c\xaa\x2b\xeb\x73\xf6\xe8\x7b\x80\x6f\xb3\xda\x93\xbe\xd7\x14\x06\xeb\x52\x34\x5c\xdf\xbf\x81\x9a\x6e\x35\x73\xe6\xe0\xd4\x6e\xaa\xac\x23\x26\x78\xb2\x60\x97\x62\x39\xc6\x13\xa0\xe0\x80\x1e\x01\xd4\x3e\x72\x34\x6e\xb4\xe1\x0f\x9e\xe7\xd4\x59\x93\xb4\x14\x3e\xc1\x32\xd2\x0f\x3c\xfa\x84\x37\xb8\x0c\xe9\xe5\xd4\xca\x4a\x45\x1e\x4a\xdf\xbb\x32\xd1\xca\x52\x5f\xcc\xd0\xbb\x0a\x12\x46\x5b\x80\x04\x4e\xc2\x88\xd4\xfd\xcc\x7c\xe8\xc9\x75\x56\xa9\x3b\x51\x48\xff\xa8\xd4\xca\xaf\x01\xcf\x1d\x72\x7a\x8d\x20\x64\x24\xee\x7b\x22\x46\x99\xa9\x0b\x99\x40\xc5\x91\xbb\x9d\xee\xf5\x54\x0a\x84\x68\x00\x26\x18\x61\x2b\x22\x0d\xe4\x09\xbb\x67\x0b\x63\x98\x84\x37\xcc\x79\x79\xf9\xff\xb3\xf7\xee\xdd\x8d\xdb\xd6\xe2\xe8\xff\xfd\x14\x58\x6e\xd7\xb2\x9d\x4a\xf2\x4c\xda\xd3\xf6\xcc\xed\x69\x97\x33\x9e\xc9\xf1\xc9\x3c\x7c\xed\x49\xb2\x7e\x37\x93\xdf\x29\x44\x42\x12\x6a\x12\x60\x08\x50\x1e\xf5\xf1\xdd\xef\xc2\xde\x00\x08\x52\x94\x44\x4a\xf4\x63\x12\xf2\x8f\x64\x4c\x91\x20\xb0\xb1\xb1\xdf\x0f\xe6\x0a\x0d\xd3\x64\x42\xae\xcc\x24\x7d\xb5\x79\x6c\x25\xb8\xc4\x04\x11\x43\x63\xc2\x4a\x10\xe6\x23\xc7\x93\xc9\x31\xb2\xca\x86\xba\x10\x07\x63\x4d\x9f\x5d\xe4\x7a\xeb\x1e\x57\x41\xe5\xb7\x34\x53\xd8\x4d\xcf\xa8\x16\xd0\xb1\x52\x42\xdd\x16\xbd\x70\xc2\x04\x3d\xb0\x84\x78\x78\xf5\xdc\xc6\xac\xdf\x4e\xa8\xfd\xf5\x41\x3d\xc0\xd7\x5e\xbd\xfa\xee\x7f\xda\x63\xf7\xd3\x4d\xbd\x4f\x2d\x0e\x59\x4a\xd2\x57\x47\xc6\xde\x5b\x6e\xa6\x3d\x34\x36\x73\x57\xd5\x75\x04\xf2\x6d\xa5\x96\x74\x2b\x5d\xc4\x96\x52\x4f\xd8\x67\xa5\x7c\x5c\xce\x80\xa4\x36\xd7\xba\x09\xf5\x32\xc7\x61\x0c\x04\x1e\x5f\xeb\x38\xb4\xcb\x9e\xbb\xee\xa3\x4d\xfd\xe1\x6a\x49\xfd\x3a\x24\x88\xa6\x7e\x55\x0d\x19\x41\x59\x09\xcf\x6a\xc3\xec\x63\xd8\x2a\x2d\xa1\x5b\x67\x49\x1c\x26\xe4\xad\x65\xc5\x88\xe4\x74\xaa\x64\x52\x68\x5f\x89\xa2\x81\x4f\xc3\xa0\xae\xb7\x27\x16\x6d\x72\x8f\x05\x5c\x1b\xe4\x15\x64\x65\xfd\x30\x70\xbc\x7a\x24\x3e\x87\x06\xc8\xe2\xf5\x0b\x0b\x93\xc5\xab\xc7\x5d\x70\xe2\x62\xcf\x3b\xe1\x86\xf5\xd5\x3b\x5d\x46\x64\x45\xba\x85\x18\x59\xad\x50\x74\x76\x82\x2a\xe6\x50\xee\x5b\x01\xbb\xbc\x0e\xb7\xea\xda\x75\x59\x03\xe3\xf9\xd5\x65\x8f\x5a\x69\x30\xea\x06\xbd\x34\x7c\x62\xd0\x4c\xdb\x5c\x15\x00\x5f\xa2\x66\x6a\x44\x7a\x67\x40\xba\x28\x21\x6a\x5d\x7a\x86\x28\xff\x02\x54\x9b\xb5\x85\xbf\x36\xcc\x28\x4c\xe6\xaa\x76\xe8\x40\x63\x70\xc9\xb6\x82\xae\x1e\x2e\x86\x07\x48\xdc\xcf\x5f\x0d\x7a\xa2\xca\x0b\x40\xff\x80\x8c\x9d\xfa\x55\xe5\xa2\xd7\x0e\x88\xe4\x86\x25\x86\xe9\x91\x9a\xc9\x26\x93\xf1\x0b\xec\xf9\x4d\x85\x90\x1a\xf0\x46\x8d\x48\x02\xfd\xc8\x47\x68\x8a\x31\x12\x68\x10\xfd\x95\x07\x4e\xd3\x9e\x65\xce\xde\x90\x87\xf4\x8e\x40\x04\x90\x08\x60\x77\xd5\x0f\x26\x91\x7b\xc0\x26\x73\x95\xa2\x4a\x9f\x6d\xf9\x2b\x78\x65\xc7\x77\x48\xa4\xa2\x05\x4b\x29\xf6\x23\x71\x00\x32\xf4\xfa\x2e\xe7\x5a\x33\xac\x3a\xce\xf2\x54\x11\x39\x1b\x55\xfc\xc6\x47\xcb\xe7\x47\x7d\xc9\xb3\xe4\x3e\x14\x6a\xe2\x4e\xe8\xbe\x65\xc0\x36\x5d\x55\xbf\x41\x45\xb9\x30\xa7\x13\xb4\xe9\x04\x1a\x24\x89\x9a\xc1\xd2\x08\x11\x4b\x84\xff\x93\x06\xdd\xfd\xd9\x22\xf6\xb5\x41\x8c\xbc\x60\x3a\xd8\x20\x06\x1b\x44\x1f\x23\xde\x9b\x0d\x22\x60\xdc\x8e\x98\x36\xd8\x23\xc2\x44\x3c\x67\x94\x28\x4b\x59\x04\x65\xa2\x0d\xca\x3b\x73\x84\xcc\xab\xbe\x82\xe3\xc9\xe4\xf8\xd8\x19\x29\xec\xf9\x28\xf4\x6c\xfc\x27\xc2\x44\x24\x63\x44\x2a\x33\x7e\xae\x34\x08\xb5\xa5\x56\x1e\xce\x25\x75\xdf\x0a\xfd\x0d\x30\x76\xbf\x28\xd1\x23\x85\x72\x21\x29\xaf\xef\x55\x04\x2b\x05\x2f\x5f\x06\xcc\x02\xd0\x57\x4b\xb4\x12\x58\x19\x22\x93\xf0\x94\xdb\xfa\x84\x86\x5c\x30\xa5\x15\x39\xc1\x9b\x93\x28\x2b\x46\xf6\x81\x49\xca\x52\x99\xaf\x46\xfe\x21\xf3\x63\xe5\x2d\xfb\xc4\x29\x48\x6d\x51\x91\xe7\x4c\xe8\x64\xf5\xcb\x95\xdf\x1c\x88\x9f\xb0\xf8\xe6\xb1\xe2\x90\xbc\x8f\xa6\xab\x8a\x96\x65\x13\x01\xb0\xde\x79\x68\x03\x1f\xb2\x19\x18\xa3\xd2\xf8\x63\xee\x32\xb1\x24\x4b\x9a\xef\x9d\x81\xd1\x74\xdd\x8b\xc4\x16\xf3\x25\x57\x72\xef\x1c\xb6\xc6\x21\x43\xe0\xdd\x58\xa6\x8c\x36\x62\x59\xe8\xac\xd0\x96\xbb\xb8\xb3\xed\x4a\xf6\xf9\x33\x5d\x13\x7c\x9f\x1f\xf5\x38\xb9\x8c\x6a\xcd\x72\xf1\x82\xfc\xdf\x93\x8f\xbf\xfd\xd7\xf8\xf4\xaf\x27\x27\x3f\x3c\x1b\xff\xe7\x8f\xbf\x3d\xf9\x38\x81\x7f\x7c\x71\xfa\xd7\xd3\x7f\xb9\x3f\x7e\x7b\x7a\x7a\x72\xf2\xc3\x37\x6f\xbf\xfe\x70\xf5\xea\x47\x7e\xfa\xaf\x1f\x44\x91\xde\xe2\x5f\xff\x3a\xf9\x81\xbd\xfa\xb1\xe5\x20\xa7\xa7\x7f\xfd\x4d\x8f\x8b\xa0\x62\xf5\xbe\x37\x12\x8c\xd7\xf8\x5e\xc4\x88\xea\xd8\x3d\xa3\x2e\x21\x9f\xc6\xa5\x45\x7b\xcc\x85\x1e\xcb\x7c\x8c\x1f\x79\x41\x74\x5e\xf4\x45\xba\x4a\xf6\x77\x7f\x34\xa6\x14\x62\xca\x0a\x98\x4e\xb1\x79\x82\x44\x04\x03\x53\x7b\xb4\x0c\xdb\x3e\xb6\xcd\x46\x61\xfb\xe3\x60\x0f\x6e\x73\xdd\x63\xa4\x92\xad\x67\xf3\x0b\x0f\x53\xba\xb1\xdd\x94\x87\x18\xa5\xb5\x6b\x88\x51\x5a\xbf\x86\x18\xa5\x8e\xd7\x10\xa3\xe4\xae\x21\x46\x69\xb0\x0f\x1e\x7e\xfd\xc2\xed\x83\x43\x8c\x52\xd7\x6b\x88\x51\xda\xfb\xfa\x8c\x62\x94\x50\xc8\x6f\x8a\x54\xb2\x62\x7e\x19\xa6\xf4\x64\xa3\x94\x94\xc1\x87\x88\x9d\x47\x91\x2c\x84\xfe\x20\x6f\xd9\x81\x8e\xdc\x9a\x4e\xba\x36\x3a\x94\x44\xdc\xa0\xa3\xae\x3f\xfc\x24\x15\xd6\xbe\xe4\xd1\x1e\xe4\xc7\xfe\x24\x47\x5a\xc4\xdc\xe8\xa8\x3d\x1f\x16\x37\x6c\x58\x16\x5b\xc4\x2c\x2e\x7f\xb0\x24\x4d\x9b\xfd\x9e\x90\x73\x92\xb3\x88\x67\xdc\x30\x00\xa8\x15\x04\xf7\xf1\xf8\xf8\x2e\xce\x5c\x2b\x96\xcc\x6c\x27\x5b\x51\xa6\x39\xe7\x81\xfe\x69\x39\x4a\xe3\x67\x50\x86\x90\xae\xd7\x28\x51\x0b\x59\x24\x31\xc9\xd9\xdf\x9d\xf0\x61\x67\xf3\x21\x1c\x21\x34\xa9\xc2\x52\xca\xcf\xda\xc1\x69\xc6\x6d\x51\xb1\xa7\x44\x06\xd9\xa7\x8c\xe7\x70\xd8\x6e\x58\x24\x45\xdc\xb7\x85\x64\x6d\xfc\x52\x56\x00\xbf\x10\x8b\x49\x5c\xe0\x03\x90\x8e\x49\x13\x1e\x73\xbd\xf2\xf1\x1c\x78\xec\x8d\xd8\x8a\xbd\x83\x2d\x22\xa8\x72\x23\x08\xcd\xb2\x5c\xd2\x68\xc1\x54\xf0\x35\x14\x42\x6d\xa1\x0c\x9f\xe5\x99\x14\x73\x2e\x50\x0e\x85\x77\x8c\xb0\x92\xac\x48\x2e\xb5\x0b\x4d\xdb\xf0\xc1\x0f\xc1\x60\xf0\x3a\x4a\x1c\x3a\x5f\x41\xfc\x9a\x0c\x87\xc0\x59\xf1\x59\xf8\x87\x22\x32\x89\x5d\x69\xd6\x3f\x3d\x33\x82\x7f\x64\xb1\xd8\x30\x01\x28\x9a\xa9\x25\x49\x8c\xf0\x64\x18\xc3\xe6\x97\xbf\xfc\x3d\x59\xc8\x22\x57\x93\xb0\xd8\xdf\x73\xb8\x87\x16\x0e\xa7\x38\x68\x92\x30\xaa\x34\x79\xfe\x8c\xa4\x5c\x14\x86\xe3\xf7\x84\x78\x7d\xc9\xba\x81\x94\xfb\x87\xdf\x1f\x38\x5a\x3f\xf2\xed\x46\xc9\x36\xc3\x8e\x79\x56\xbc\xb5\x67\x1c\x0b\x7a\x60\xd7\xcc\x9a\xb0\x6b\x59\x52\xb8\x8b\x42\xcb\x47\x3e\xf9\x3f\x15\x72\xba\xd2\x87\x97\xb0\xb1\xe3\x54\x6b\xd7\xfc\xbf\xf6\x66\x9b\x52\xb1\x65\xa5\xd8\x3d\xa6\xf2\xe8\x3d\xbe\xe7\x5c\xe9\xbd\x3a\x7c\x97\x35\x6f\xf6\x78\xf9\x50\x66\x3e\x37\xfa\x71\x2f\x99\xf4\x30\x92\xd3\xe8\x9c\x45\x3a\x8a\x98\x02\x52\xe4\x8a\xc2\x81\x71\x17\x9f\xdd\xf3\xa3\x4f\xb4\xda\x4c\x53\x11\x19\x87\xfc\x3d\xf4\x2a\x3d\x08\x58\x87\x88\xfc\x0e\xb1\x7b\x82\x16\x0e\x56\xa5\x11\x8a\x8b\x39\xb6\x16\x4d\x8b\x44\xf3\x2c\x29\x21\x77\xed\x5e\xb0\x0c\x38\xf4\x16\xd0\xc0\x3c\x4d\xb1\xe8\x15\x56\x3f\x07\xcf\xca\x89\x1f\x8b\x09\x8d\x1d\x32\x73\xc3\xc7\x33\x9a\x53\x0f\xfe\x48\xa6\x29\x55\xa7\xd6\xf1\x40\x21\x0a\xc6\xb6\x01\x32\x6f\xd1\xa4\x9c\x71\x10\x75\xf0\x58\x88\xab\x99\xa0\x62\x6f\xf7\x5f\xb5\xe0\x3c\x0c\x45\xe4\x9d\x0f\xb4\xc7\x26\xf7\x35\x8c\xb5\x02\xf1\x57\x34\xba\x65\x22\x26\xdf\x2a\x07\xb8\x78\x25\x68\x6a\xeb\xc7\x67\xb9\xc4\x2e\xea\x2c\xae\xbd\xaf\x46\xd6\xec\x88\xa5\x4f\x5c\x01\x2b\x94\xb7\x1e\x0b\x8a\x85\xea\xa9\x78\xb0\x19\x68\x17\xbd\x53\x68\xd2\xcd\xf9\x32\x62\x4e\x76\x34\xef\x3d\xd6\xe2\x97\x7b\x57\xab\x23\xcd\xa5\xa3\x6c\x1b\x53\x3c\x85\xc0\xd2\xbd\xe7\x12\xca\xc4\xd3\xc4\x90\xb8\x95\xaf\xf9\x53\x43\xb0\xe9\x0a\xec\x5e\x8f\x52\x79\x2c\x9f\x1e\x5e\x53\xea\x38\x9f\xc6\x55\x62\x76\x4d\x63\xa9\xc8\x57\x89\x8c\x6e\xc9\x05\x03\xa5\xe1\x3e\x9b\xef\xe7\xd3\xf8\xf3\x6e\x9c\x99\xd2\xf9\x7e\x11\x23\x63\x92\x4a\xc1\xb5\xcc\xf7\xa1\xc7\x4f\xa8\x50\xe0\xd0\xca\xb0\x4d\xc5\x74\x73\xce\x7e\x2e\x8d\x0c\x0d\xca\xf7\x83\x3a\x30\x94\x37\x9d\x00\xe5\xc1\x5b\x40\x54\xf7\xa6\x23\xbf\x5e\xc8\xbb\xb1\x96\xe3\x42\xb1\x31\xdf\x3b\x10\xea\x60\x40\xdd\xb2\x15\x44\x95\xf5\x02\x2a\x3b\x58\x45\x73\xd7\x12\xec\xec\x70\xdf\xc8\x77\xd7\x5f\x5d\x7c\xab\x58\x3e\x09\xb5\x95\x33\xa6\xa3\xb3\x88\x65\x8b\x33\x3b\xc2\x67\x0f\x56\x47\x36\xfb\x81\xab\x1b\x0d\x05\x81\x48\x26\x89\x2d\x30\x26\x67\xe4\x25\xcb\x16\xfe\x73\x4f\x03\x6e\x9f\x73\x4f\xb9\x4c\xca\x7e\xda\x4d\x1d\x9b\x91\xaa\x64\x03\xee\x20\xd5\x08\x90\x3f\x9f\x76\x6b\xe4\xfd\x14\xd1\xfd\x01\xbb\xb3\xec\xd3\x8a\xef\x49\x80\xf7\xe9\xb4\xf4\x3b\xae\xf4\xf4\x0b\xf3\x87\xaa\x0d\xfb\x5c\x74\x6a\x85\x6c\x5f\xce\x50\x19\x8d\x59\x4c\xe4\x92\xe5\x39\x8f\x99\x22\x9e\x6e\x87\x36\x28\x9e\x3c\x0d\xc8\x0f\xbd\x03\x3f\xaf\x80\x83\xa7\x63\x7e\x38\x06\xfb\x43\x85\x88\xc3\x9d\x35\x22\x4e\xe3\x94\x8b\xa7\x81\xed\x7b\xc2\x4d\x45\x34\x61\x97\xef\x0f\xd6\xd6\xed\x38\x55\x85\xfd\xc6\xde\x0c\x7a\x0a\xec\xa8\xb3\xff\x8d\xc7\x5d\x22\x64\xbc\x9f\x03\xed\x91\xd5\xee\x39\xd5\xec\x6e\x4f\x41\x68\x5c\x92\xfc\x7d\xdf\x07\xf5\xec\xf3\x56\xdb\x9f\x44\xa7\x90\xe0\x94\x63\xc9\xff\xc7\x12\xb2\x2c\x3e\xf5\xe3\x48\xc2\xb1\xc2\xa6\x6c\xf5\x56\x6c\xee\xcc\x9e\x5f\x5d\x92\xaf\xf1\xf1\xc7\xeb\x82\x92\x4b\x8d\x2a\xcf\x85\x4c\x29\xef\xa7\x01\x7a\x7d\xd0\x7a\x3f\xac\x10\x08\x57\xfe\x59\x62\x1f\x36\x42\x51\x59\x6e\xb8\xc8\x59\x4c\xac\x3d\xe5\x67\xd6\xe2\x61\x4d\x9c\xfe\x79\xb4\x78\xb8\xaf\x2e\xd9\x81\x69\xde\xe5\xef\x94\x52\xb4\x43\x27\x10\x22\x7c\xac\x13\x51\x4c\x28\x0e\xe1\x0d\x41\x04\x1e\x88\xda\x10\x96\xee\x93\x75\x50\xec\x1e\x91\x37\x72\xce\x85\xa3\x62\xd2\x46\xd5\xcc\x28\x4f\x0e\x03\xe7\x20\x27\xff\xc2\xe4\x64\xa5\x92\x57\x82\x4e\x93\xfd\x43\x26\xab\x87\xc0\x0f\x47\x5e\x27\x74\x4e\x18\xfc\x71\x16\x73\x65\xfe\x4f\x6e\x6e\xde\x80\x33\xb8\x10\x4e\xbf\x04\x37\xa7\xe5\x2d\x3e\x35\x1a\x89\xcc\xe3\xd1\x05\x24\xe2\xbd\x75\xf0\x08\xc6\x23\x5c\xc4\x66\xe9\x4c\x55\x82\x92\xed\x13\xd8\x2b\xc5\xe7\xdd\x61\xe8\xe3\x94\x91\x0f\x0b\x1e\xdd\x5e\x05\xfe\x5f\x99\x9b\x7b\x22\xb8\x55\x11\x52\xea\xbf\x3d\x16\x37\xb2\xcb\xba\xea\xcb\xa0\x16\x8c\xe7\x38\xb5\x23\xa7\x37\x16\x82\xf0\x1b\x55\x4a\x46\xbc\x8c\x3f\x00\x4b\x74\xc9\xbe\x63\x60\xdf\x8f\x07\x15\x10\x38\xfb\x01\x08\xca\xb9\x0d\x52\x8b\xc3\x28\xfb\x04\x55\xa1\x94\xc2\x85\x83\xdb\xa3\x01\x01\x71\xbc\xb7\x96\xa6\xe5\x70\xeb\x2d\x4d\x9d\x9a\x59\x73\x91\xbb\x84\x57\x8b\x40\x4e\x65\xb0\x3d\xb4\xd7\x51\xc8\xb7\x36\xb5\xcd\x4c\x1e\x05\x74\xfb\xa7\xa6\x37\x99\xff\x6a\xf1\x41\x78\xcf\x3a\xcd\x81\xf6\x64\x32\x2b\x12\x8c\xac\x3d\xbc\xb3\xab\xf3\x31\xe2\x77\x1e\xc1\x89\xfe\xd4\x3a\x3b\x1d\x87\xe9\x79\xdd\xf3\x15\x7f\x1e\xfd\x9d\x02\xd5\xe2\xd9\x1f\x7e\xff\xfb\xcf\xbd\xe3\xd3\x61\x86\xbb\xc7\x6e\xf9\x74\x90\xeb\xad\xa1\x36\xc3\xe5\x50\x9b\x61\xa8\xcd\x50\xbd\x1e\xdd\x3f\xfc\xf0\xd5\x17\x7a\xc9\x6e\xeb\x23\xb3\xed\xd0\xfa\x0a\x07\x66\xc5\xf5\x93\x11\x77\x70\x05\x85\x87\xa8\x9b\xd0\x53\x8e\xd8\xe1\x35\x12\x86\xca\x08\xbf\xac\xca\x08\xfd\xe5\x88\xf5\x55\x05\xe1\xf0\xdc\xb0\x5f\x4e\xc5\x83\x83\xc9\xc6\xa1\x79\xf5\x07\x67\xd3\xf7\xd5\xf4\xa3\x2f\xeb\x7e\x6f\x16\x86\xe3\x72\xbc\x46\x7b\x8b\x2b\xf1\xe6\xaa\xe9\x1f\x1f\xab\xa0\x58\xbe\x96\x86\xba\x3c\xa2\xea\x4c\x0e\xb6\x3c\xe0\x54\xe4\x5e\xbc\xbb\xc9\x8a\xf7\xfe\xa6\x16\x20\xe0\x6f\x3f\xfd\xb8\x80\xc1\x41\x7e\x58\x98\xfa\xcf\xcb\x3d\xfa\x33\xed\x80\x7f\x5f\xee\x51\x55\xa9\x9a\xeb\xac\x8e\x40\x20\x41\x84\x93\xd3\xb0\x33\x4d\x49\x16\xce\xaf\x2e\x49\x94\x33\x28\xed\x40\x13\x35\x21\x0d\x12\x9e\x73\x20\x59\x89\xd0\x49\x76\x54\x6b\x96\x66\xfa\x50\xcc\x1b\xbc\xa3\xbf\x30\xef\xe8\xbd\x7b\x29\x16\x45\x4a\xc5\xd8\x50\x0b\xf0\x8f\x56\xe2\x4e\x6a\xfc\x70\x42\x2c\x5d\x40\xb1\x02\x6c\xa1\x90\xd2\x5c\x08\xfe\x53\xc1\x4a\x73\x85\x97\x3a\x9e\x80\x73\x07\xe6\xd1\x33\xec\x50\xa2\xaa\x51\x91\x48\xae\x25\x71\x59\x80\x78\x38\x3a\x82\x11\x88\x65\x15\xd3\x9b\x5e\x30\x94\xde\xae\xa0\x48\x42\xf9\x54\x55\x3f\x44\x05\x91\x26\x89\xbc\xc3\x6f\x87\xf2\x88\xd9\x3f\x33\x17\x5b\x97\x64\xca\x48\xca\xf3\x5c\xe6\xd6\x8d\x14\x4e\x07\xc3\x87\x8c\x9e\xc9\x72\x54\xd8\x72\x1b\xf4\x71\xc3\xb4\xdd\x6a\x40\x15\x2d\x09\x15\x98\xc0\x69\xfe\xed\x22\xae\xe1\xdb\x8e\xde\x4d\xd9\x82\x2e\xb9\x2c\x72\x7c\x5b\x4b\x72\x64\x7f\x02\xde\xbb\x92\x85\xb7\x9d\x17\x90\xa1\xe5\x57\xa7\x1a\xe0\xf4\xae\xfc\x11\x14\xdc\x58\x3a\x73\xe4\x98\x7d\xe2\x4a\xaf\xaf\xc5\x81\xc8\xb5\x9c\x78\x0c\xcc\x5b\xaa\xcc\x30\xd8\xef\xf6\xce\xbd\xad\xe2\x5b\x38\x5a\x55\x52\x5d\xde\xc0\x4f\xbb\xe4\x54\x5b\xb1\x06\x53\xe6\x5d\x3a\xdc\xe7\x17\xc3\x8a\xab\xdc\xb3\xd7\xd5\x93\x14\x94\x07\x21\x79\xeb\xe5\xa3\x2c\x12\x1e\xad\x2e\x2f\xfa\x8d\xdc\xc0\x31\x1d\xfb\x53\x3e\x6a\xc3\xdc\x27\x5f\x51\xc5\x62\xf2\x96\x0a\x3a\x47\xab\xcb\xc9\xcd\xd5\x57\x6f\x4f\x0d\x16\x81\x55\xe7\xf2\xa2\x31\xb4\xe3\x26\x1c\xfc\xdd\x63\xe5\xb9\x93\x3a\xe8\x7a\x13\x1b\xd6\x46\xdd\x13\x7c\x8f\x56\x02\x80\x78\x99\xe0\x90\xf6\x69\x0d\xe2\xc0\x55\xbd\x48\x14\x86\x6f\xb8\xea\x6f\xaa\x4e\xaa\x97\x69\x7c\x7b\x9f\x00\x08\xec\xe6\xdb\x56\xd9\xce\x07\xd6\xc2\xcf\x55\xed\x46\xa2\x73\xaa\xd9\x7c\x75\xc1\xb2\x44\xae\x0c\x02\x5c\x05\x66\x7c\x7c\x74\x8a\x62\x43\x3e\xa5\x11\xc9\x8b\x84\x61\x6f\xa1\x7a\xd9\x35\xc1\x58\x5c\x52\x3a\x2e\x94\xa6\x50\x74\x0d\xc7\xdf\x3a\xa3\xd6\xcc\xaa\x2d\x5b\x1a\xe3\x3c\x77\x3e\x55\x2d\x51\x69\x4e\xc9\xd6\x57\xda\x33\x26\xf8\xfc\x6e\x9c\xed\xe2\xd7\x6c\xed\xc1\xac\x76\x07\x84\x53\x7e\x5d\x24\x86\xf9\x24\x71\xad\xc5\x2b\xc8\x69\x76\x8f\xb1\xda\x05\xd0\x04\x33\xfb\x11\x99\x16\x46\x88\x63\xaa\x62\xe3\x5e\x2f\xf5\x79\xb7\x40\x97\xb6\x79\x89\xd0\x2c\x4b\x38\x86\x30\xcb\xdc\xfa\xa5\x03\x83\xe6\xfa\x63\x6d\x48\x4b\x47\x59\xa6\x9b\xec\x32\x26\x4b\x96\x4f\xdb\xd4\xa9\xe8\x2a\x96\xd0\x8c\x83\x1f\xa7\xb5\x14\x53\xd9\xb8\xf3\xab\x4b\x7c\xbb\xc9\x70\xec\x7e\xc4\x1d\xb4\x7b\xe3\xdc\x1b\xb6\x67\x10\x6a\x2e\xbe\xd2\xd2\xf9\xd5\x25\x96\xf6\xb2\xc5\x96\x4a\xf3\x87\xd1\x13\x28\x06\x39\x96\x15\x1e\xe9\xdc\x8c\xa8\x89\x14\xfe\xa3\x4c\x14\x29\xc3\x02\x4d\x65\xb3\x31\xa3\x3c\x8a\x55\x39\x7a\x69\x3d\x31\xba\x4e\x7b\x81\xa4\xbb\x87\xbf\xa3\x47\xbf\x33\x2f\x12\x52\x5c\xdb\x65\x7e\x7b\xfd\x66\xbf\x4d\x7c\x57\x1d\xc3\x16\xe4\x61\x50\x7b\x30\xa3\xb9\xe6\x34\x21\x45\x9e\x38\x97\x20\xc6\xf7\xdb\x30\xba\x05\x5d\x06\x45\x8b\x26\x84\x7c\x81\x3b\x67\x01\x8b\xe7\x13\x9b\xef\x5a\x33\x6e\x91\x24\x23\x32\xe3\xd0\x6e\x5d\xb3\x8c\x84\x2e\xa9\x1b\x2e\x22\xa3\xca\x89\xb1\xef\xa6\x03\x33\x72\x0a\x9e\x3f\xa4\xe0\xf1\x04\x79\x97\x25\x31\x14\xb2\x84\x4f\x98\x03\x1b\x81\xb9\xc1\x68\xa0\x2f\x93\x42\x69\x96\x5f\x4b\xc3\x0c\x82\x90\x1b\x28\xea\x41\xc3\x9f\xbf\xe2\x22\x86\x18\xab\x6b\x60\x1c\x11\x15\x84\x71\x30\xe4\x98\x21\xc1\x77\x6e\x70\xa7\x44\xa8\x13\x55\x44\x0b\xb3\xa4\xa3\x4c\xc6\xea\xc8\x90\x91\x23\x34\xf7\xa9\xa3\x53\xf3\x57\x7d\x0d\x18\x41\x13\xbc\x77\x46\x33\x7e\x74\x3a\x22\x00\x20\x70\xde\x49\xbd\xf8\x7c\xf1\xd0\xad\x15\xf4\xeb\xbd\xb0\xf0\x3a\x1c\x01\x70\x50\x94\x6e\xba\xbb\x05\xd7\xcc\xb7\x46\x47\x2b\x91\xaf\x52\x53\x27\xd6\x84\x9c\x0b\xc2\xd2\x4c\x83\xe5\x99\xa4\x8c\x3a\x77\x36\x5b\xb2\x7c\x65\xf4\x7b\xa8\xe2\xf1\xd9\x1f\x7e\x8f\x8f\x07\x01\xbc\xd6\x77\xbe\x44\x72\x38\x61\x6b\xc0\x3d\xfe\xe2\xb8\x62\x33\x48\x92\x80\x9a\x7f\xb6\xa0\x04\xf6\xba\x17\x18\xbf\x33\x6f\x56\x41\x88\xb7\x90\x5a\x7a\xfa\xf1\xe6\x8d\x75\x8a\x20\xac\xbe\xe1\x22\x56\xbe\x13\xa2\x8d\xd9\xb6\xf0\x6e\x04\x32\xcc\xf0\x73\x04\xf0\xba\xf8\xda\x56\xe4\xdc\x32\xbc\x93\xd8\x37\x0d\xb5\x75\x00\x2b\xf6\xbf\x95\x71\xf3\xd1\xa9\xec\xef\x65\xf0\xb0\x0f\x14\x28\x6d\x26\x76\x2c\x2b\xaa\xae\xb2\x46\x79\x7e\xfb\x76\x6c\x01\xfd\xa6\x99\x94\xc6\x02\xa0\x93\xc1\x2f\x60\x09\xc2\x1a\xe5\x64\x96\xd0\x79\x89\x46\x40\xf5\x50\x48\x7a\x79\xf3\x9d\x5b\x82\x22\xbc\x59\x5c\xdd\x29\xcf\xee\x92\x60\xc7\x25\x94\x36\x3e\x61\x3e\xd2\xf8\xe3\x6e\x31\xd6\x0f\xbe\x19\x9b\xda\x38\x0a\xf5\x56\x23\xdc\x26\xf8\x3b\x7b\x1b\x0d\x30\xc1\x15\x5b\x73\x4a\x25\xc4\x3e\x81\x1c\x72\xf3\x5d\x05\x4d\x76\xcc\x77\x03\xd2\xde\xb2\xd5\x9d\xcc\x9b\xeb\xa8\xef\x8d\x5f\x5b\xbf\x98\xd0\x29\x4b\x76\x1f\x90\xb7\x34\x33\xcb\x2e\x03\x4d\x51\xf3\xb6\x7e\x4a\x94\xfd\x31\x26\xcc\xc5\xe1\xc9\x7c\x4e\x05\xff\x07\x46\xe7\x46\xe6\x1c\xcb\xdc\xfc\x79\x82\xbe\x0e\xd4\xdb\x13\x16\xe9\x53\x8b\x7f\x8d\x74\x6f\x07\x82\xd2\x38\xe6\x28\x3d\x5c\xed\xc0\xa5\xed\x40\xe0\xe2\xf6\x3e\x60\xbe\xe5\x60\xed\xc6\xfd\xed\xce\xd2\x16\xb4\xb9\xc8\xb7\xc4\x51\x6d\x7d\x3f\xa5\xdc\x76\xd5\x7d\x72\x50\x61\x29\xe5\xfb\x2e\x0b\xaf\x03\xe0\x9a\x52\x5d\xe4\x5c\x37\x32\xa4\xed\x2f\x72\xf1\x4d\x31\x65\xd6\x3f\xdc\xf9\x75\x01\x61\x82\xe7\x57\x97\xfd\x6e\x47\xe5\x84\x83\x16\x6f\x27\x68\xe4\x16\x52\x08\x9a\x4e\xf9\xbc\x90\x85\x4a\x56\xa1\x51\x92\x82\x7b\xdb\x28\xf5\x68\x95\x11\xc7\x9a\x50\x21\xc5\x2a\xb5\x8f\x8a\x28\x29\x62\x56\x19\x11\xbc\x80\x4b\xc9\x63\x42\x0b\x2d\x53\xaa\x79\x44\x22\xc9\xf2\x08\x3c\x86\xe1\x48\x85\x62\x84\x6e\x78\x37\x2a\x94\x96\x29\x49\x69\xae\x16\x34\x49\x36\xed\x71\x0f\x5c\x6d\x5b\xe9\xf1\x31\xac\x7f\xe3\x8f\x4b\x9c\xf5\x9e\xf8\xbd\xa3\xd2\x7a\x0b\xfc\x36\x93\x3b\x68\x80\xe5\x66\x2c\x6d\x31\x86\xcd\xf1\x6f\xac\x5e\xb4\x63\x63\x76\x41\x67\xdb\xc9\xdd\xb9\xae\x2d\xd4\x70\xeb\xbb\x10\xa4\xcb\xe2\xcb\x94\xce\x5b\x08\x92\x6f\x8c\x76\x40\xc5\xca\xbd\x86\x85\x36\xd5\x88\xc8\xdc\x46\x8d\xf8\xbe\xe8\xf6\x27\x5f\xac\x35\x27\xef\xc1\x1d\x27\x73\x1b\xbe\x6d\xb1\x14\x82\xfa\x59\x3e\x93\x79\x6a\xe4\x3a\x9e\x93\x59\x21\xc0\x48\xa6\x6c\xb4\x37\xa8\x24\xd6\x56\x43\x13\x25\xfd\x09\x04\xff\x9e\x70\x93\x20\x54\x91\x3b\x96\x24\x13\x72\x9e\x24\xb6\x02\x68\x50\xeb\xa1\xcc\xd7\x2e\x63\x0a\xa6\x2b\x12\xf3\x39\x53\x9a\x9c\xdc\xfc\xf7\xf9\x29\x70\x6d\xb0\x63\xac\x88\xa6\x2e\x5d\xad\x6a\x9f\x01\xfe\x1f\x17\x20\x27\x44\x54\xd3\x44\xce\xd1\xad\x0e\x76\x5a\x11\x93\x2c\xa1\x2b\x28\xef\x9f\xd1\x1c\x22\x4e\x23\xb4\xd1\x90\xbc\x10\x50\xd8\xf8\x41\x39\xce\x6e\x52\xb0\xad\xf6\xf0\x18\x70\x72\xcf\xa3\xbe\xa3\xc2\xeb\xfd\xb2\xb2\x9c\x65\x09\xdd\x60\x55\xa8\x60\xf4\x87\x4a\x32\xb2\x11\x73\x41\x85\x95\x82\xf9\x31\x26\xe4\x06\x71\x27\xa5\x3a\x42\x9f\xe6\xdf\x52\xa6\x69\x4c\x35\x9d\x18\x5d\xf0\x6f\xd5\xcc\x38\x99\xc4\x66\xa0\xcd\x1b\xbd\x61\xce\x28\x2f\x36\x37\xc4\xaf\x9e\x42\x23\xd4\xfa\xc7\x41\x3e\x77\xe7\x71\xab\x19\xe3\x40\xfa\x04\xcb\x7f\xf5\xc9\xa8\x62\x5b\x7d\x68\x95\xb9\xd6\x5f\xaa\x5a\x19\x92\xea\x4a\x2c\xb6\xa6\x0c\xca\x44\x7e\xb0\x9d\x90\xdc\x1d\x30\xa1\x9e\xbf\xbb\xd8\x6c\xee\xda\x6d\x32\xd8\x61\x22\xa8\x3a\x06\xb6\x4c\xcf\x19\x98\xed\x2f\x55\xef\x80\x4b\x87\x81\x04\x42\x4c\x2e\xa1\xae\x1a\x8c\x7b\x18\x37\xac\x9a\xfa\x88\xef\x6d\xb6\x8f\xb4\x72\xcf\xb4\x71\xca\xec\xca\x34\x1b\xfb\xc9\x6e\x7c\xa8\x9d\x8f\x66\x67\x36\xd8\xa6\x6c\x2f\x84\x3c\x24\x87\x38\x13\xa9\x07\x76\x5b\x9f\x56\x4b\xfb\x8e\x5b\x6a\x87\x89\xfa\xad\xac\x04\x1e\xdd\xb2\xd5\xb1\xb2\x59\x2f\x52\xa8\x05\xcf\x30\x5d\xd1\xba\x21\xec\xee\x92\xef\x68\xc2\x63\x3f\x04\x62\xf5\xa5\x18\x91\x77\x52\x9b\xff\xbd\xfa\xc4\x95\x46\xf5\xf3\x42\x32\xf5\x4e\x6a\xb8\xd3\xcb\x52\x71\x0a\x1d\x16\x6a\x15\x60\xb4\x64\xc3\xb9\x0a\xd4\x64\xb7\xa0\x4b\x4b\xf6\x1c\x50\xb8\x22\x97\xc2\x48\x04\x76\x45\x3e\x8d\x57\xd9\x21\x5c\x0e\x8a\x90\x62\x0c\x36\xee\xc6\x31\x2c\x20\x64\x5e\x81\xc3\x96\xe1\xec\x50\x18\x00\x08\xbf\x70\xe5\x88\xb8\xe7\xd9\xd4\x99\xdd\x78\x44\x52\x96\xcf\xc1\x6b\x13\xed\xf0\x5a\xb4\x35\x45\xb6\x32\x40\xee\xdc\x2b\x20\x99\x6f\x36\x1a\x2e\xd6\x36\x29\x78\x1e\xc9\x52\x8a\xd6\x8c\x7f\x1a\xea\x03\x90\xfa\x37\xe4\x72\xab\x09\x39\x77\x6d\x66\xc2\xdf\xac\xf7\x2a\x1c\xc6\x8c\xc0\x15\x31\xa4\x64\x49\x13\x86\x55\xf6\xa9\xf0\xf9\x56\x72\xb6\x46\xd8\x47\x36\xa7\xdb\x9c\x59\x2f\x32\x1d\xdd\xb2\xd5\xd1\x68\x6d\x6b\x8f\x2e\xc5\x51\x99\x74\x57\xd9\x4c\x4f\x44\x41\xda\x3a\x82\xdf\x8e\xf6\xe7\x05\x5b\x89\x65\x7b\xf3\xca\xce\x7d\x53\xb7\xbc\xd9\xfd\xdc\x28\x6c\x9c\xa8\x53\x03\x42\x70\xf9\xe6\x24\x95\x39\x98\x33\xcd\xdd\xb0\xbc\x87\x11\x55\x6f\x79\x96\x95\xd5\x50\x8a\x6c\x9e\xd3\x98\x91\x79\x4e\xb3\x45\x57\xb1\x04\x65\x9b\xa6\xe1\x3f\x1b\x41\x77\x03\xf0\xb7\x68\x74\x5b\xdf\xbb\x63\xd3\x85\x94\xb7\x90\x0a\x07\x88\x70\x8f\xf6\x87\xef\xf1\x5b\x17\xe5\x3d\xa7\x4a\x2a\x12\x33\x4d\x79\x02\xb1\x1c\xef\xdf\xbc\xb5\xd1\x1e\x8e\x8f\xbb\x59\x36\x07\x4e\xf4\xa0\x00\xd0\xd8\x46\x21\x5d\xb3\x25\x67\x77\xd6\x2a\xb1\x29\x4e\x63\x4c\xe6\x4c\x40\x70\xc2\x96\x20\x9e\x31\x51\x3c\x66\xaf\x20\xf1\x76\xf3\x40\x07\x18\xce\x37\xcc\x79\xd7\xe1\xdd\x4e\xc1\x77\x52\xef\x16\x5c\xd6\xab\xbf\x57\x32\xdf\x52\x08\xa8\x5d\x1e\x70\xbb\x1c\x5f\x1b\x49\xfe\x82\xfc\xfe\xf7\xbf\xdb\xf8\x50\x4a\x3f\xf1\xb4\x48\x5f\x90\x3f\xfc\xc7\x7f\xfc\xee\x3f\x36\x3f\xc6\x05\x3e\xf6\x7c\xf3\xfa\xec\x69\x7b\x79\x7d\xf1\x04\xe0\x1d\xfb\x68\xba\xed\x4e\xb9\x16\x43\xcd\x28\x4f\x8a\xdc\xc6\x71\xb6\x54\x11\x5e\x87\xef\x80\x43\xa5\x4c\x7c\xa0\x6e\x44\x17\xec\x65\x83\xc0\x66\x5c\x30\x05\x0d\x5c\x0a\x91\xb3\x48\xce\x05\xff\x07\x8b\x5d\xff\x16\x08\xec\x80\x4a\xef\x0e\xc5\x09\x13\x31\xf6\xd1\x34\x3c\x6f\x41\x45\x9c\x6c\x73\xf8\xb7\x58\x69\x78\x82\x0f\x02\x19\x70\x9e\x4e\x00\x7b\x5b\xbe\x51\x03\x17\x74\x03\xb5\xee\x27\xe4\x68\x08\xb6\x83\x56\x8a\x84\xf1\x66\x8b\x62\xdd\x30\xc7\x35\xbd\x0f\x55\x56\xb8\xf7\x53\xc1\xf2\x15\x24\x79\x94\x82\x7d\x10\x08\xf6\xa1\xac\x21\xe0\x96\x61\x25\x2a\x2c\xe2\x52\xd3\x85\x4b\x21\xa6\x0c\xf7\xa8\x7d\x1b\xde\x61\xe8\x3e\x77\x8e\x24\x72\x4e\x44\x91\x24\x9b\x1e\x15\x72\x9b\xcb\x29\x84\xdd\x0e\x55\xb2\x9d\x8e\xd7\xd6\x2c\xd0\x00\xe9\x07\x35\x0e\x84\x0b\xef\x49\x94\x7f\xda\xe6\x82\x70\xc1\xad\x62\x3a\xdb\xc7\x73\xb6\x2b\x55\xd3\xc2\x8c\x80\x57\x97\x80\xcf\x96\x05\x66\xee\xd3\xb0\x80\x57\xa7\xf8\x9c\x76\x46\x86\x86\xa9\x3f\x39\x53\xc3\x1e\x8b\x6f\x63\x76\x68\x58\xfa\x60\x7c\x58\x03\x78\xdb\x68\xa8\x0e\x91\x50\x2d\x77\xb2\x85\x51\x02\xaf\xc1\x34\xd1\x89\x13\xb5\x20\xcc\xdd\xcc\x14\xad\x77\x35\x67\x5c\x2c\x25\x16\x7a\xee\x24\xc3\x5d\xaf\xbd\x58\x13\xe5\xee\x80\xb2\x5a\x59\xce\x0b\xbf\xa1\x48\x6b\x14\x5a\x52\xa8\xdd\xc6\xee\xed\x2b\xd8\x9e\xfb\xd1\x8b\x0e\x52\x5d\x79\x91\xb0\xef\xb9\x5e\xbc\x77\x85\xdd\x2d\x56\xeb\x22\x4b\x60\xb1\xc1\x0f\x06\x85\xae\x4b\xc9\xf0\x12\x5b\x89\xb1\x48\xa6\x29\x13\x31\x06\x11\xa5\xf4\x96\x91\xb2\x5d\xa5\x91\xf1\x40\x0c\x86\xe1\xd8\xa7\x8c\x8a\x52\x4e\x5c\x1a\x5a\xbe\x0d\xa3\x5a\xe2\x53\x5b\x5e\xdb\x3a\xa9\x62\x7b\x32\x45\x90\x0d\x51\x49\x9a\x20\x53\x96\x48\x48\xc3\xc6\x48\x51\x8c\x65\xb6\x8f\x02\x49\xb6\x77\x2d\xd7\xb3\x45\x1f\x99\x98\x97\xb5\xa4\x54\x02\x8d\x65\x2d\x05\x96\x82\x4d\xc8\xb5\x15\x61\xda\x49\x45\x6d\xc8\x69\x4b\x52\xda\x9a\x21\x96\x75\x14\x3a\x43\xd6\xbd\x17\xc2\x76\xe9\xee\xb5\x81\xae\x7b\xf8\xe7\x0c\x5f\xdf\x74\xa1\x1b\x78\xab\x47\xba\xe4\x0a\x1e\xb6\x35\xe2\x15\x61\xdb\x62\x30\xd5\x8d\xc9\xcb\xeb\x57\xe7\x1f\x5e\x8d\xc8\xb7\x57\x17\xf0\xff\x8b\x57\x6f\x5e\x99\xff\xbf\x7c\xff\xee\xdd\xab\x97\x1f\x8c\x1c\xf1\x05\x96\x8f\x37\x6a\x9c\x81\xae\xe1\x47\xb2\x4a\x2d\xa8\x58\x91\x59\xa1\x0d\x39\x28\x3f\x56\x99\x05\x45\x1b\x00\x8d\x63\xa3\x32\x7e\x76\x7b\xd8\x0c\xf0\xba\xd9\x24\xec\x9b\x81\x15\xf7\x6d\xb2\xd4\x6e\x31\xa9\x35\x92\xb4\xce\x3a\xa8\x4c\xf9\x68\xcf\x74\x83\x8f\x82\xbc\x96\x39\xb1\x8d\xc6\xa0\xf3\x64\xac\x8e\x6d\x52\x87\xf9\xf7\x04\x6f\x9d\x25\x72\x7e\xec\x73\x3d\x18\x49\xe4\x9c\xa8\x62\xea\x73\x70\x80\x9b\xc2\xd3\x5f\xb8\xc7\x2a\xa9\x0b\x23\x9f\x88\x13\xbc\xe5\x07\xaf\xbc\x13\x3e\x10\x8e\x7b\x06\xdd\xc1\x2a\x4f\x9a\x1b\xf5\x01\xbf\x38\x6b\x9e\x81\x13\x9c\x78\x5e\x7b\xe3\xa3\x30\xe8\x7a\xc7\x93\x38\xa2\x79\xbc\x86\xb3\xc0\xdc\x70\xcb\x01\x7a\x58\x32\x17\x3b\x39\x97\x83\xdb\x42\x17\x72\xc9\xf2\x84\x66\x18\x21\x0e\x35\x8b\x21\xf4\x08\x3e\x72\xc1\x32\x06\x79\x50\xae\xd3\x38\x13\x51\x22\xa1\xa6\x06\x72\xc6\x51\x75\xe9\x18\x8a\xe4\x0a\x0f\xda\x64\x9a\xf2\x84\x1c\x3d\x59\x32\x07\x61\xc6\x9d\xb0\x17\x03\x93\x37\x16\x66\xf1\x79\x1b\xa8\x34\x7a\xc9\x97\x91\x23\x9b\x65\x76\x34\x22\x47\xbe\xf6\x48\x6c\xa5\xe4\xa3\x2f\x8e\xca\x07\xc2\x3c\x25\x10\x92\xad\x4b\x68\x0c\xdf\x09\xb3\x19\x61\x83\x9d\xe3\xca\x7f\xba\xac\x1f\x63\x58\x9b\x35\x62\xc1\x1c\xaa\x03\x4d\x2a\x13\x59\xfb\x6a\x99\x62\xb7\xf3\x8b\x66\xfa\xc1\xeb\x1a\xd2\xd1\x31\x55\xcf\x02\x27\x67\x66\x37\x5c\x40\xda\x4d\x05\x79\xbc\xe3\x2d\x2c\x70\xc3\x73\x92\xd1\xdc\xa8\x22\xee\xc9\x6a\x8b\xb2\x2f\x76\x36\x28\x6b\x81\x04\x81\x7f\xa5\xa5\xd4\x7e\xe3\xdf\x78\x99\x50\xa5\x1a\x2c\xaf\x40\x08\xcc\xc0\x84\xe1\xc8\x84\x3a\xe7\x13\xd4\x9f\x5e\xd0\xe5\x96\x02\x05\x2d\x26\xad\x69\x3e\x67\x7a\xbb\x67\x84\x8a\xd5\xfb\xad\x25\xcd\xc6\xad\x8b\xa8\x8e\xdb\x9d\xa6\x4f\xe3\xb2\x80\xd6\x98\x0b\x3d\x96\xf9\x18\x5f\x79\x41\x74\x5e\x6c\xf2\x71\x69\x9e\x32\x59\xe8\x1b\x16\x49\xd1\x9c\xd1\x60\x9f\xeb\xcd\xd5\xd3\x21\xcd\xc3\x7a\x1b\xcf\x9d\x18\x11\x16\x21\x74\x8a\x59\x29\x63\x38\x0f\x63\xb5\x8c\xca\xfb\x37\x6f\x0f\xd9\x6c\x02\x69\xcc\xdb\x77\xf2\x3b\x4b\xf6\xc5\xdc\xcf\xd4\xce\x7c\xeb\x6b\x6f\x0b\xdd\xfd\xa5\x97\xde\x73\xb5\xfd\x69\x0b\x8c\xed\xa5\x30\x36\xae\x5f\x69\xaa\x8b\x35\x6c\xa8\xec\x8d\x25\x96\x37\x98\x52\x66\x65\xfa\x1b\x78\x2f\x34\xf2\xad\xe7\xff\x63\x4d\x11\x78\xce\x05\x2b\x4e\x88\x7d\xd1\x9c\x4f\x9d\x53\x8e\x0a\x24\x8d\x74\x01\xb9\xc9\x54\xdb\xc0\x46\x5b\x00\xe7\x57\x4d\xcb\x68\x54\x19\xb7\xa9\x89\x11\xcb\xb5\x7a\x43\x95\xfe\x36\x8b\xe9\x86\xec\xa5\x5a\xc0\xa2\xd2\x70\x60\x50\xb0\xbe\x13\x2c\x36\x14\xde\x82\x00\xc7\x23\x77\x86\xf4\x16\x38\x62\x57\x4f\x7e\x79\x80\xcc\xeb\x63\xf3\xa9\xe6\x59\x5f\x4b\x03\x93\xf3\x46\x02\x54\x0d\xd5\xd8\x35\x5b\xc3\x4e\x72\x18\x8d\x08\xf6\xa9\x49\xe3\x3e\x7c\xc6\x09\xa3\xa2\x39\x5c\xbe\x86\x51\xf0\x5c\x77\x1c\xb2\x1f\x20\x77\x0b\x6e\x44\x56\xcc\xf2\x52\xc4\x89\x50\x31\x4b\xd8\x86\x64\xaf\x03\x43\x49\xed\x17\x2e\xec\x07\x5a\x85\x39\x5d\x55\xdf\xf1\x06\x7d\x2b\x84\xdb\xe4\x89\x52\x58\xb6\xd2\x83\xd7\x9a\xea\xab\x02\xf1\x65\x9a\xc8\xe8\x16\x0b\x82\x41\x3e\x3f\xff\x07\xcb\x5d\xdc\x79\xd9\x0c\xcc\x76\xa8\x9a\xbb\xee\x9b\x0e\x6e\xae\x1d\x11\x8c\x62\xc6\x36\x00\xf4\xe3\xcb\xbc\xb4\x2c\x16\xc2\x66\xcf\x3d\x4c\xe8\xaa\x53\x54\x20\x5e\xbf\xe2\x39\x58\xd7\x59\xb0\x76\x08\xd4\x2b\xb4\x2a\x23\x4d\x6d\x76\xcb\xd9\x37\x9b\x33\x41\x7a\x0d\x47\xdd\x96\x8f\x82\x4f\x00\xf8\x44\xb4\xb5\xd4\xcc\xd6\xcc\x95\xb6\x96\xaf\x1d\x19\x2a\xa4\xbd\x90\xee\xa7\xdc\x66\xb4\x5e\x83\x0b\x7b\xf7\xf6\x6d\x4c\x03\x28\xaf\x2e\x3e\xbc\xb6\x85\x52\x3b\x79\x99\x44\x97\x82\x96\xd5\xe2\x21\x5e\xed\xb0\x49\x9e\xe8\x89\x9f\xc9\x7c\xa3\x02\xd3\xdf\xe4\xb7\xe7\x33\xed\x1c\xc8\x48\x9f\x9b\x63\xd7\xd6\x93\x77\x0c\xf5\xf2\xaf\x8c\x08\x25\x0b\xae\xb4\xcc\xad\x6b\x0d\x9a\x89\xe5\x14\x9a\x9d\x36\xc7\x80\xf5\x13\x0d\xf7\xd2\x4f\x81\xd0\x2c\x63\xd4\xf7\x19\xb2\xbc\x09\x1a\x05\xe5\x2c\x92\x79\xdc\x38\x31\xa7\xdd\x37\xca\x52\x8d\x9f\xef\x21\x37\x33\xa1\x4a\x7f\xf0\x73\x30\x02\x42\x4b\x6a\x5c\x15\x7f\xec\x12\xcb\xd5\xb8\x72\x2e\x52\x94\x3f\x4a\x42\x05\x5a\x35\x0e\x93\xc1\x77\x0b\x19\xe5\xda\x50\x9a\xdb\x6b\x5d\x77\x5e\x72\x0b\x96\xf8\x30\x33\x4f\x99\x52\x5b\x13\x8d\x6a\x41\x1a\x50\xd3\x97\xf8\x9a\xbe\xf6\x75\xc7\xec\x51\x40\xc0\x70\x4c\x57\x75\x6b\xb5\x19\xd5\x08\x88\x09\x68\x50\xf0\xc7\xea\xa0\x2d\xcb\x16\x54\xb5\x5d\x8c\x3f\x45\x3e\xc4\xb7\xf5\x71\x68\x39\x9b\x9c\x51\xb5\x2d\x55\xb2\x06\xdb\x69\xce\xd9\x8c\xbc\xa4\x29\x4b\x5e\x52\xd5\x27\x70\x81\x02\x4c\x08\x9b\xcc\x27\xe4\xf8\x3a\xf0\xb6\xbe\x93\xfa\xed\xb6\x9e\x0b\x3b\xaa\x03\xb4\x39\xd1\xf7\x7a\x96\x0f\x56\x12\x76\x9f\xdc\x03\xcf\xec\xc1\x33\xdc\x72\x42\x9f\xc4\xd9\xdc\x9e\xef\xbb\xe9\x3c\x56\x4f\x62\x91\x83\xc5\x2f\xda\xf7\x44\xee\x48\x66\xdc\x74\x0a\x9f\xf2\xf9\xdb\xb1\x24\x3f\xc4\x4d\xa3\xc9\x64\x6d\x75\x1f\x2a\x9a\x2b\x98\xfd\xc3\x00\x3b\x28\xd7\x6d\x66\xfa\xf2\xe6\xbb\x3e\xc5\x96\xc7\x4d\xb6\xb7\x1b\xb8\xf1\xf7\x2d\x72\xf9\x78\x3b\x17\x3e\x34\x91\x3f\x06\x47\x8b\xc1\x80\x87\x0c\xc0\xb8\x70\x5f\xb5\xb6\x0e\x5f\x69\x17\xfe\x9a\xd9\x8e\x66\xf6\x99\x0a\x7e\x9c\x40\xef\x38\xb6\xc4\x86\x8d\x90\xf0\xc1\x88\x60\xca\x1c\x8a\xd3\x2d\x9f\x6f\xa9\x50\xb5\x53\xa6\x76\x2b\xba\x3b\x95\x58\xb2\x7b\x6b\xdd\x43\xdb\x36\x18\xaf\xb6\x3a\x5b\x0b\x9d\xb8\x83\xb2\xb6\x5b\xe3\xe9\x30\xd8\x4e\xf1\xaf\xe3\x78\xcd\x06\xdc\xfa\x55\xab\xec\x6b\x5e\xb9\x06\x22\x8d\x8e\xe1\xc8\x50\xe0\x08\xea\x3d\x23\xed\xb6\xe4\xa9\x6a\xbf\xbd\xae\xd3\x40\x08\x37\xac\x62\x78\x5f\xcb\x2a\x0a\xde\x1f\xcc\x77\x56\xd0\x68\x3d\xde\x13\x28\x07\xb2\x13\x81\xee\xb7\x50\x01\x5e\xbb\xb0\xee\xf1\xf1\xad\x4d\x41\xa6\xad\x38\x76\x4f\x95\x59\x14\xcb\x97\x2c\xae\x78\xea\x6c\xdd\xf5\xea\xbd\xc0\x6f\x5b\x8e\x6f\xc1\x4e\xfe\xf9\xef\x5f\xfd\x6a\x3c\x1e\xff\xaa\x8c\xcd\x7a\x41\x68\xc6\xd9\x27\xcd\x30\x02\x6f\x72\xfb\x27\x68\xae\xb3\x7c\xfe\x2b\x40\x38\xf2\x12\xac\xcd\xce\xcc\x7a\xe1\x33\x08\x7f\xe5\x32\x30\xcd\x47\xa8\x10\x52\x87\xb1\x48\x91\x14\x3a\x97\x49\xc2\xf2\xf1\x9c\x89\xc9\x6d\x31\x65\xd3\x82\x27\x31\xcb\x61\x70\xf7\xe9\xe5\xb3\xc9\x9f\x26\xcf\x7e\x45\x7c\xbe\xa5\x91\xec\x95\xa6\x69\xf6\x02\x12\x3f\x7e\x65\x31\xce\x55\x64\xcb\x12\x2a\xd4\xc4\x87\x79\x4f\x22\x99\x33\x69\xfe\x97\xfe\x4a\x65\x2c\x32\xdf\xc6\x83\x46\x1a\x9f\xb1\xa6\x33\x3b\x45\x5b\xca\xac\x04\xd3\x98\xc8\x24\x85\x7f\xe3\xd2\x6d\x09\xb9\xab\xc4\xd6\xa3\x4b\xb8\xd2\xdf\xd4\x7f\x79\xc3\x15\xb2\xcb\x2c\x29\x72\x9a\x54\xa7\x0a\x3f\xa8\x85\xcc\x75\xa5\xd4\xea\x98\x70\x64\x8d\x8a\x8b\x79\x91\xd0\xbc\xf2\xd6\xaf\x5c\xcc\x43\x69\xae\x33\x5c\x72\x59\x89\xa5\x1b\x57\x82\x65\xb9\xd0\x2c\x7f\x29\x93\x22\x0d\xad\x63\xe3\x75\xb9\x72\xc6\x73\xa5\x6d\x8d\xbb\xaa\x53\xa1\x49\x2e\x86\xef\x07\x38\xfa\x77\x25\x05\xb8\x0b\xc9\xc4\x80\x7b\xb2\xf9\xa5\x1f\x9e\xfd\x18\xbc\x87\x7b\x58\x95\x57\x1b\x4f\x49\xc3\x8c\x69\x96\xe5\x72\x49\xb1\x42\xdf\x96\xb9\xb8\xe7\xd6\x3e\x7b\xbe\xfe\xc3\x86\x6f\x37\x0f\x59\xf1\xd1\x85\x43\x56\x7e\xd0\x0d\xd5\x0b\xf1\xe1\xe5\x73\x9a\x64\x0b\xea\xf2\x0c\x55\xb4\x60\x29\x2d\x37\x49\x66\x4c\x9c\x5f\x5d\x7e\xf7\xbb\x9b\xda\x0f\xcd\xf5\x0c\x0d\xca\xf9\xd4\xba\xa0\x2a\x3e\x75\xba\x98\x4f\x8d\x28\x4f\xc0\xda\x34\xd7\x84\xbc\x66\xa1\xce\x48\xe5\x78\xc6\x6b\xb7\x0d\x74\x82\x5b\x9b\x84\xab\x80\xc8\xd4\x08\x5d\xb5\xff\x57\x19\xf0\x59\x59\x99\x45\x78\x16\x5b\x98\x95\xd1\x3b\xce\xcd\x53\x2e\x5a\xd8\x35\x4d\x88\x41\x46\x96\xfb\x2a\x48\x98\xc6\xa9\x49\x90\x7f\x88\xa3\x81\xb9\x02\xf3\x64\x34\x53\x1a\xe2\x16\x72\xe1\x9a\xf8\x8e\x7c\x2f\xf2\x9c\x99\x71\xab\x19\x8c\x2e\x25\xa3\xa1\x45\xd9\x9c\x6b\x47\x42\x23\x99\xa6\x85\xe0\x7a\x75\x06\xd4\x90\x4f\x0b\xb3\x1b\x67\x31\x5b\xb2\xe4\x4c\xf1\xf9\x98\xe6\xd1\x82\x6b\x16\xe9\x22\x67\x67\x34\xe3\x63\x98\xac\xc0\x00\x9c\x34\xfe\xb5\xa7\xe3\x75\xa5\x73\x23\x87\x69\x92\x11\xaa\xb0\x86\x8a\x70\x3c\xe8\x35\x8e\xed\x90\x2b\x75\x47\xa1\xf2\xed\xab\x9b\x0f\xa5\x8b\x11\x2b\x05\x01\x84\x03\x27\x5b\x09\x6c\x03\x28\xe8\x25\x63\x0b\x7d\xbb\xd4\x4e\x9f\xd0\x69\xfe\x88\x12\x6e\x74\x12\x55\x4c\x53\xae\x95\x8b\x75\xc4\xc0\xc1\x97\xc0\x41\xa0\xec\x24\x5a\x6a\x26\xe4\x52\x94\xfa\xfd\xbd\x83\x1a\xa2\x82\xc6\x06\x7c\xed\x81\x1d\x32\xc0\xf5\x17\x1a\x14\x29\xc7\xa2\x36\xee\x4e\x70\xc6\x6f\x32\x16\xf9\xd3\xe0\xcf\xf4\x39\xd6\x4c\xb7\x85\xf5\x7d\x2c\xa6\xc4\x0e\xd1\xf0\xf2\x5a\x48\xc1\x16\xbd\x6e\xb3\x2e\x37\x26\x0d\xf4\xb4\xfa\x53\x43\xec\xc2\xb8\x1d\x1b\x21\x3b\x14\x32\xf7\xe9\xdd\x76\x20\xc7\x1b\xac\x76\x0c\xb5\xee\x3d\xc3\xb0\xf9\x18\xa0\x2b\x8b\x10\xb6\x90\xa3\x10\x04\x0a\x1b\xc8\x1e\x9d\xbb\x72\x86\x58\x1f\xfe\x2d\x15\x05\x4d\x1a\x03\xd8\xb6\xca\x77\x0e\x36\x9b\xeb\x2b\x6c\xaa\x70\xbb\x19\x74\xbd\xd6\x6a\xd8\x3a\x7b\x9b\x2f\xbd\xb5\xc4\xc4\xa6\x00\x2f\xc4\xc6\xce\xa5\x29\x82\x3a\xf2\x9b\x5c\x9a\x87\xc4\x20\x1d\x85\x67\x6a\x2d\x6c\x04\x19\xe8\xf6\xd0\x11\xa5\x59\xa6\xca\x22\x15\x5a\x92\x48\xa6\x59\xc2\x74\x95\xf7\x42\x50\x6e\xb7\x18\xa5\x7a\xcc\xed\x9e\x27\xd5\xd6\x2c\xb9\xd9\xe0\xaf\x1d\xa3\x65\xb7\xcb\xf9\xd3\x9a\x89\xc2\x50\xe1\x9b\x4a\x35\xf0\x0d\x2d\x58\xab\x47\x72\xf3\xbb\x61\x8d\x42\xcc\x46\xad\x76\xfb\x71\x31\x26\xae\xf0\x70\x6c\x03\x53\xe3\x20\x6d\x6d\x73\x68\xc9\x81\x71\x3a\x9b\x65\x95\xe6\x65\x96\x09\x29\x6b\x9d\x4b\x37\xbc\xbf\x53\x2d\x84\x84\xbd\x6d\xd1\x78\x55\x4e\x7e\x69\x01\x9a\xdb\x1e\x8f\x94\x64\x9c\x61\xec\xbc\x17\x87\x00\x60\x8c\xc6\xf6\xa6\x61\x78\x39\xf3\xf1\xe1\xd6\xde\x0d\x03\x94\xe2\x12\xf4\xe4\xa1\x18\xa8\x4e\xfe\xe7\xe6\xfd\xbb\xb3\xaf\xa5\x4d\x26\xb4\xad\x43\x00\x93\x53\x08\x69\x77\x1d\x32\x62\xa6\x0c\x7a\xde\x80\xf1\x3c\xa5\x82\xcf\x98\xd2\x13\x5f\x23\x44\xfd\xf0\xe5\x8f\x93\x30\x35\x60\xe4\x8a\x9b\x7b\xa1\xc2\xa2\x06\x90\x72\xb3\x98\xb2\xbc\xa6\x6f\x28\x9a\x49\xd7\x49\xe4\x0e\x26\xab\xe9\xad\xa1\xdf\x38\xd9\xc2\xe8\x32\xb7\xec\x05\x39\x42\xd5\xc4\x7f\xfa\x9f\x46\x0c\xff\xf7\x11\x39\xb9\x83\x90\xe7\x23\xf3\xe7\x11\x7e\xd0\xcb\x80\x61\x23\x9c\xf2\xc3\x18\x28\x9d\xf3\xf9\x9c\xe5\xd6\x77\x04\x66\x55\xe8\x19\xc2\xa1\x85\x67\xf9\xb0\xb0\xfd\xd0\xca\x9a\x9b\xf5\x89\xfc\xf0\xe5\x8f\x47\xe4\xa4\xba\x2e\xc2\x45\xcc\x3e\x91\x2f\xbd\xfb\x21\x93\xf1\xa9\x8d\xca\x52\x2b\xa1\xe9\x27\x33\x66\xb4\x90\x8a\x09\x0c\xf9\xd6\x12\xdb\xb8\x28\x09\x9e\xad\x24\x19\xdb\x06\xf7\xe4\x0e\xd3\x86\x1d\x28\x31\x0d\x17\x4a\x16\x55\x25\x64\x6c\x7f\x0b\x5f\x33\xdb\x36\x07\xd3\x8a\x91\xbe\xb0\xcf\x0b\x26\x36\x84\x55\x92\x54\x81\x9b\x64\x48\xdf\x82\x0a\x70\xb3\xd8\xf6\x30\x46\x9e\x9a\x6c\xf2\x49\xee\xc4\xf8\x6d\x26\xad\x06\xb1\xb5\x4d\x8b\xe0\x07\x12\x0a\x5b\x2f\x71\x9b\xc1\xec\x51\xbb\x20\x1f\xb4\xa2\xad\xd1\x47\xeb\xcb\xc2\x90\xa3\x07\x58\x1b\xf4\x8a\x3d\xdb\x7b\x69\x4e\xa4\xee\xc2\x09\x8e\x6f\xf0\xc0\x47\xf5\xb7\xcd\x71\xc1\x88\x43\xab\xb4\x06\x14\x2e\xa5\x31\x92\x40\x2a\x56\xf7\x8e\xc6\x06\x80\xe0\xb5\x8d\x56\x63\x6b\x97\x1b\x53\x11\x9b\x7f\x2b\xae\xb4\xb9\xbf\x37\xc4\xb6\x18\x42\xab\x50\xfa\xf6\xf2\xe2\x61\x90\xbb\xe0\x7b\x9e\xd6\x69\x21\xe2\x84\xbd\x91\xf2\x76\x43\x2a\x70\x65\x41\x5f\x85\x4f\x7b\xef\x1c\x6a\x69\x5c\x8c\x7d\x0c\x6d\xa0\xe5\x92\xac\x48\x90\xbc\x16\x22\xa3\xd1\x2d\x9d\x33\xfb\x51\x60\x23\x36\xc1\x1f\x35\x65\x50\x05\x7a\xad\x2b\xb7\x71\xf6\x68\x0d\xb0\xf3\xdc\x30\x4d\xc7\x17\x6d\xd9\x01\xea\xe6\xbd\x7b\xbe\xbd\xf8\x95\x2b\x12\xee\x35\x9b\x6d\x7c\xd0\x17\xb7\xdf\x94\x7f\x32\x86\xd6\x5e\x1b\x7f\x74\x85\x90\x1b\x1f\xd8\xed\x43\xac\xcf\xb3\x6d\x74\x53\xed\x35\xb7\x23\x8e\x60\x58\x28\x57\x1e\x83\x3b\x76\x17\xa0\x1b\xdb\x1d\x55\x40\x81\x92\xa5\x8d\xcc\x79\x90\x92\x48\xbb\xc5\xe6\x86\xf5\xee\x21\x3c\x87\x13\xdf\xe9\xb7\xdb\x29\x48\x37\xcc\x69\x10\xa7\x07\x71\xfa\x89\x8b\xd3\x9d\xce\xc0\xee\xd0\x83\xcf\x43\xc0\xee\xb4\xe8\xdd\xd1\xf6\x4f\x52\xe4\xee\xbc\xc6\x16\xc1\xff\x4f\x56\x08\xef\xb4\xd8\x96\x02\x79\xd3\x92\x7f\xce\x62\x79\x27\x18\xee\x8c\x87\x79\x82\x82\x7a\xeb\x05\x6e\x4f\x0a\x69\x58\x5f\x90\x8f\x51\xb3\x03\x9b\x49\x63\x7b\x71\x6f\xa7\x0d\xc5\xe4\x5d\xe2\x54\x2f\x15\x60\x7b\x8b\xbe\x6b\x15\x36\xb7\xb1\x2c\x31\x5e\x6d\x63\xe6\xba\x64\x8b\xe0\xb5\x25\xce\xbc\x8c\x2b\x3e\x38\x6d\x04\xaf\x0e\x99\x55\x6d\x13\x31\xca\x65\xb7\x49\x24\xe9\xb0\x64\x23\xc3\x67\xb9\x9c\xb6\xad\x58\x73\x0f\xab\x6a\x19\x65\x78\x60\x38\x3b\x64\xe7\xfb\xfd\xed\x6d\xb1\xbb\x92\x38\x1a\xe6\x8e\x35\xed\x2a\x91\x64\x7e\x3f\x8e\x15\x6c\xf2\x7d\xcc\x74\xef\xe0\xcb\x40\xac\xc6\x49\x8e\x9c\x07\xf3\x43\x5e\xb0\x11\x79\x4d\x13\xc5\x46\xe4\x5b\x71\x2b\xe4\x5d\x7f\xf3\xdd\x5e\x91\xa1\x61\xb6\x1f\x6c\xed\x85\x16\xb9\x42\xad\xa7\x52\x6a\xf7\x2d\x89\xfd\xa5\x7f\xc1\x59\x68\xac\x86\x3e\x2e\x04\xff\xa9\xa8\x2a\x2a\xde\xc9\x74\x52\x57\x61\x5e\xde\x7c\x07\xc8\x81\xea\xb6\xaa\x14\xb5\x35\x3f\xaa\xcd\x61\xd5\x6d\xf2\xa0\xb6\x2a\xaa\xd5\xc4\x70\xa3\xe8\x57\x55\xad\xc4\x96\x27\xac\x9b\x65\xb2\x22\x49\x26\xe4\x52\x1f\x2b\x33\x07\x1e\xd1\x24\x59\x19\xad\xa5\xd6\x2d\xec\xb0\x0c\xae\x16\x0c\x62\xed\xb0\x61\xc5\x15\xbe\x64\xc1\xeb\x0e\xd0\x68\x70\x62\xb1\x5d\xc7\x61\x25\x13\xb7\xf4\xc5\x6a\x98\xda\xb5\x7d\xdc\x21\x4a\xb8\xff\x25\x54\xed\xa0\xa8\x6b\x02\xd2\x08\x46\x66\xb2\x10\x31\xa1\x1a\xb6\x67\xcf\x39\x57\x7d\xb8\x0f\xe7\xf0\xdf\x2e\x3f\xf5\x63\x6c\x0c\x3c\xf0\x65\x1e\xdf\x16\xe1\xab\x24\x72\xec\x13\x8b\x8a\x20\xc6\x2b\x8c\xe1\xd8\xcf\xd6\xd8\x6f\xee\xeb\xa3\x24\xa6\x3e\x6c\x4e\x69\xdf\xa9\x93\x1e\x03\xda\x47\x75\xb7\x13\x15\x7a\x88\x3d\x6f\x53\xd8\xa9\x7d\x65\xa2\x26\xb4\x07\xae\x88\x4f\x4d\x99\x0a\x56\xb8\x86\xdf\x86\x9e\x50\xa8\xc0\x62\x98\x8c\xed\x8a\x00\x75\xaa\x16\x72\x6f\xca\xd8\x36\x3f\xf1\xad\x93\xdf\xcc\x07\x41\xb6\x1b\xaf\xc9\x76\x96\xff\x95\xb2\x1d\x34\xef\x29\x43\x69\x80\x49\xa6\x74\x05\xa1\x69\x69\x26\x73\x4d\xd1\xc1\x51\x88\x98\xe5\x4a\x53\xac\x51\xe2\xf2\xf2\x32\xb3\xe6\x05\x55\x84\x6b\x45\x22\x9b\x64\x88\x1b\x76\x4f\x99\x8c\x01\xb0\xaf\xcc\x0b\x5e\x44\xa8\x7c\x1c\xf9\x6a\x65\x63\xb6\xee\xc2\xf6\x89\x25\x74\x4b\x60\xd5\xa1\x74\xf6\x46\xb3\xac\x4e\x57\x83\x45\x08\x10\xc7\x97\x3c\xc6\x60\x24\x96\x11\x2e\xfa\x21\xaa\xbb\x1d\x38\xe8\x98\xd8\x7c\xac\xc6\xde\x4a\xb3\xf1\x81\x2d\x1a\xed\x6e\xa2\x2e\x33\x8c\x94\xdf\x75\xf6\xb7\x77\x9f\xf7\xab\x38\x90\x5c\x6e\x8e\x94\xc3\x6b\x6d\x57\x5d\xf6\xc5\x96\xdd\x0d\x62\x75\x21\x1a\x54\xe7\x56\x92\x5a\xb5\xda\x63\xf2\xd0\x55\x6e\x76\xa4\xfe\xed\x2c\xc4\x32\x0e\x02\x07\x5b\x3e\x06\x86\xc9\xad\xcf\xee\xca\x23\x7c\xe8\xba\x3a\x07\x56\x4c\x29\x2f\xe7\x42\xea\x65\xb0\xdd\x56\xf6\x96\x03\x95\x5b\xd3\xf3\x70\x2d\xec\xe3\x2d\xc7\x6c\x95\x00\xd8\x7f\xda\x1b\xcb\xaa\x69\xbf\x4d\x3c\x29\xa3\xb9\xe6\x51\x91\xd0\xbc\x3c\xfb\x40\xe4\xd7\xf2\x96\x3a\xcf\x59\x69\x9a\xeb\x56\x45\x16\x6e\xdc\x93\xbe\xe6\x22\x14\x5c\x58\x30\xe1\x9d\x7f\x98\x06\x46\xa6\x6c\x6e\x98\x67\x96\x25\x2b\x97\x63\x50\x46\xb0\x27\x5c\xe9\xb2\xf9\x1f\xc8\x02\x6d\x43\x21\x3a\x97\x6b\xf8\x45\xe7\xd1\xc9\x24\x8d\xa4\x98\xf1\xf9\xc3\x65\xd1\xbd\x7f\xf3\xf6\x25\x7c\x12\xee\x95\x39\x74\xfe\xfe\x5a\x06\x5d\x39\x49\xb8\x5d\x26\xc9\xf9\x1f\xca\x14\x39\x5b\xcf\xa1\x21\x3f\xce\x65\x5f\xb9\xfd\xdc\x33\xef\xca\x4f\xd3\x45\x65\x78\x56\xac\x32\x29\x14\x37\x32\x31\xd4\xcf\x82\x87\xb0\xfb\xc9\xfb\x37\x6f\xfb\x4d\xba\x1a\x32\xac\x86\x0c\xab\x21\xc3\x6a\xd7\x81\x6a\x91\x61\xe5\x4f\x33\xe4\x57\xb9\xb0\x3d\xf3\x6f\x9b\x26\x54\x1e\x77\x5f\xd3\xba\xed\xc7\xb7\xcb\x87\x33\x46\x0d\x68\x76\x47\x16\xbe\xb6\x0f\x96\x5d\x78\x2a\x79\xba\x96\xcc\x80\x2e\xfe\xfe\xcd\x5b\x3f\xee\x3d\xe4\x44\xc4\x5c\x99\xcf\xbc\x94\x19\x67\xf1\xcb\x9b\xef\xda\x35\x69\xbe\xa8\xbf\x55\xc9\xe9\xc0\x1f\xcd\xcc\x8f\x15\x39\xc2\x87\xc8\xcb\x9b\xef\x8e\xdc\x42\x60\x23\xca\x46\x5e\x3e\xab\x8d\x50\x1d\x0a\x04\x48\xff\x47\x04\xa3\x90\x68\xf5\x76\x5c\x69\x74\x24\x85\xed\x3a\xb3\xa0\x8a\x4c\x19\x13\xc1\xa0\xa8\x02\xbf\xb7\x4f\x43\x29\x50\x1b\xa7\x04\x15\xbc\xb1\xe8\x7f\x19\xd5\x30\x21\xdf\x1b\xd1\x26\x67\x4c\x98\x65\xc4\x23\xd8\x02\xac\x90\xcb\x80\xf7\xa2\x4b\x2f\x58\x98\x3a\x82\x15\x41\x19\x9f\x0d\x93\xdc\x9e\x31\xd2\xa4\x93\xb6\x48\x7c\x2a\x31\x7d\x63\x01\x99\x7b\xc4\xf6\x87\xb0\x2b\x1f\x95\xd6\x64\x7f\x54\x9c\x9b\x11\x90\x48\x30\x42\xcd\xd9\xd6\xde\x69\x16\x88\xd1\x65\x33\x80\xf3\xab\x4b\x5f\x46\x76\x42\xc6\xe3\xb1\x8d\x17\xd3\x79\x11\x69\x2c\x0d\xa5\xb1\x91\x91\x19\x35\xe6\x39\x70\x2b\xc5\xc0\x12\xe4\xfa\xb5\x59\xec\xc4\x20\x2f\x08\xc8\x9c\x58\xeb\x55\x09\x8a\x09\xa9\xc6\xec\x19\x30\x90\xd7\x52\xda\x1d\xc2\x0f\xfe\x93\x9c\x9d\x91\xeb\x9a\x75\x7c\x6a\x84\x56\xdb\x1c\x05\x84\xff\x99\x94\xc7\x55\x3b\x19\x9b\x98\x17\xbf\x11\xf2\x4e\x34\x7d\x1a\xbe\x45\x73\xf6\x82\x7c\x3c\x3a\x5f\x52\x9e\x18\xfc\xfd\x78\x34\x22\x1f\x8f\xae\x6c\xac\x32\x17\xf3\x8f\xb6\xd7\xc1\xc7\xa3\x0b\x06\x0d\xb8\xe3\x8f\x47\x66\xd8\xdf\x42\xf7\xb6\xb7\x2c\x9f\xb3\x6f\xd8\xea\xbf\x60\x30\x7f\xfb\x06\x3b\xbd\xad\xfe\x0b\x1b\xbd\x99\xfb\x86\x5a\x7d\x58\x65\xec\xbf\x52\x9a\xf9\x1b\x6f\x69\xe6\x5f\x0e\xc2\x30\x7e\xf8\xd1\x90\xf9\xe5\xf3\x49\xb9\x9d\x7f\xfb\xbb\x92\xe2\xc5\xc7\xa3\xa0\x7e\xa7\x4c\x0d\x5a\x64\x7a\xf5\xf1\x88\x54\xbe\xfa\xe2\xe3\x11\x7c\xd7\xdd\x77\x93\x7c\xf1\xf1\xc8\x7c\xc9\xdc\xce\xa5\x96\xd3\x62\xf6\xe2\xe3\xd1\x74\xa5\x99\x1a\x3d\x1f\xe5\x2c\x1b\x99\x53\xfd\x5f\xe5\x17\x3e\x1e\xfd\x8d\x7c\x14\x66\xb2\x10\x56\x80\x3b\xa9\xc8\xbf\x9b\x1b\x63\xf4\x60\x13\x5b\x77\x34\x6c\x7c\x74\x57\x71\x2c\x34\x9a\xef\x63\x3a\x3b\xb0\x3b\xf5\xde\x85\x42\xd7\x5f\x2c\xdb\x56\x1e\x16\x0e\x62\x0f\xaf\xef\xfc\xee\x75\x51\xb0\x3b\xa3\xf2\x59\x8e\x8a\x01\x98\xf1\x84\x60\x6b\x44\x4c\x40\x34\x72\x12\xb8\xcf\xa1\x65\x8b\x20\x85\x72\x32\x5b\x55\xbb\x35\x84\x03\x0f\xbc\x1d\x06\xc4\xbe\x28\x62\x99\x36\xa7\xeb\x81\x0a\x9a\x76\x2b\x0b\x9a\xae\x99\xf6\xf7\x0f\xdb\x40\x50\x5b\x1b\x3f\x75\x6d\x7d\x71\x59\x07\x2e\x3e\xa5\x9f\xde\x40\x77\xa7\x17\xe4\x77\x5f\xfe\xf1\x0f\x7f\xda\x64\xd7\x9d\xa2\x36\xff\xf5\xd6\xbc\xe5\x06\x30\xac\xbf\x58\xb7\xad\x4e\x9c\xf0\x39\x29\x93\xa2\xcb\x4e\xaa\xd5\x98\x1d\xc5\x34\x99\x82\xfb\xaa\xc8\x0c\x5c\x5e\xbb\x54\x55\x11\x61\x3c\x61\xe3\x60\xdc\x13\xf0\x64\x45\x9e\x7f\x89\x3d\x8d\xe0\xd3\x6b\xe4\xfb\x87\x4f\x3f\x4e\x1a\xa6\xcc\x15\xf9\xcf\x51\x6d\x3e\x46\xe0\x29\x80\xe3\x19\xc4\x41\x4f\xb5\xd1\x55\x6d\xc4\xf1\x06\x36\xc8\xfc\x7c\x77\x6d\x5c\x87\xfe\x1e\x7f\xf8\xfd\xe6\xfd\x75\xed\xd7\x9f\xf5\xe1\x54\xb4\x4e\x43\x2f\x05\x50\xac\x61\x4f\x53\x48\xe8\x0f\xe2\x46\x42\xd4\xd6\xdd\x22\x7f\xc8\x55\x2e\xe3\x22\x32\xba\x98\x9c\xb9\xb0\xf4\x28\x24\x50\xd0\x58\xc6\x9c\x06\x54\xb1\x09\xfb\x64\x80\xce\xca\x0e\x43\x46\xdf\x65\x54\x70\x31\x57\x65\x15\x47\x20\x20\xc8\x75\xef\x16\x0c\x58\x8f\x0e\xfb\x71\xc2\xac\x14\x8f\x21\x66\x9e\x92\x79\x41\x73\x2a\x34\xc3\x4e\x0d\xd8\x93\x13\x15\xcc\x92\xe4\xd1\xa0\x30\xa6\x3d\x8d\x78\x54\x91\x58\x99\x29\x5a\x55\x10\x7b\xb9\xf6\x76\x54\x9f\x3f\xfb\x72\xeb\x96\xfb\xe7\x36\x5b\xd8\xa9\xd6\x2c\x17\x2f\xc8\xff\xfd\xe1\x7c\xfc\xff\xd1\xf1\x3f\x7e\x3c\xb1\xff\x78\x36\xfe\xcf\xff\x1d\xbd\xf8\xf1\x8b\xe0\xcf\x1f\x4f\xff\xfa\x9b\x3e\xec\xad\xaa\xd7\xc8\xaa\x56\x40\xdb\xdd\x31\xe6\xc8\x7c\x75\x5b\x57\xae\x31\x39\x82\x29\x6d\x7f\xc6\x4e\x77\x9b\x86\xd1\x0e\x48\xba\x1e\xd0\x65\x74\xa7\x12\xcf\x80\xe2\x19\xb1\x74\x62\xc5\xdb\x49\x24\xd3\xb3\xc0\xbc\x60\xe4\xea\xb7\x54\xac\x48\x49\xd6\x50\x28\xad\x63\xba\x82\x2c\x33\x1a\xe5\x52\xa9\x8a\x89\xf8\x96\x11\x2f\xb9\x22\xb1\x9c\xb2\x88\x82\x20\x9e\x4f\xb9\xce\x69\xbe\x0a\xf4\x0e\x57\xe1\xbe\x50\x6c\x56\x24\xe4\x44\x31\x46\x26\x42\xc6\x6c\x9d\xba\x9e\x22\x0d\xa5\x53\x9e\x70\x0d\x29\x21\x31\x33\x7a\x76\xc2\xad\xfc\xef\xdc\xd7\xae\x05\xee\x9c\x7d\x22\x5c\xfb\x36\xf4\x5c\x91\x93\x58\xa8\xe7\xcf\xbf\xfc\xdd\x4d\x31\x8d\x65\x4a\xb9\x78\x9d\xea\xb3\xd3\xbf\x9e\xfc\x54\xd0\x04\xd2\x57\xde\xd1\x94\xbd\x4e\xf5\x41\x91\x62\x55\xb6\xf8\xfc\x0f\x2d\x4e\xd1\xc9\x0f\x78\x56\x7e\x3c\xf9\x61\x6c\xff\xf5\x85\xbb\x75\xfa\xd7\x93\x8f\x93\xad\xbf\x9f\x7e\x61\xd6\x10\x9c\xc0\x1f\x7f\x18\x97\xc7\x6f\xf2\xe3\x17\xa7\x7f\x0d\x7e\x3b\xfd\xcd\x60\x61\x2f\x4d\xe6\x81\xee\xf5\x60\x96\x76\x3b\x86\x57\xa4\xea\x16\xf7\xfa\xef\xeb\x96\xf7\xb5\xc9\xa3\x05\xbe\xa1\x82\x5d\x54\xf9\x48\x60\xa3\xaf\x0f\xd1\xb2\x9c\x5d\x5f\xe6\xfa\xfa\x1a\x51\xd2\x45\xdc\xf0\x6a\x3e\xd0\x7a\x43\x7c\xfe\xb6\xf6\xfc\xdf\x6c\x76\x48\x60\xb4\x02\x4b\xe6\xaa\x1a\xdd\x22\xc1\xf2\x53\xad\x17\xe3\x93\x05\x1b\xec\x3a\x83\x0f\x60\xf0\x01\x0c\x3e\x80\xa7\xe1\x03\xa8\x1f\x79\xf0\x05\x40\x4b\x54\x15\x58\x92\x69\x9c\x72\xb1\xe1\xf8\x6f\x3f\xf7\x96\x3a\x8c\x48\x26\x8d\x2c\xc3\x21\xf6\x5a\x2e\x59\x9e\x73\x88\x79\xc3\x77\x72\x56\x76\x20\x0c\xe3\xcf\x7b\xb2\xc0\xc6\x2c\x4b\xe4\x2a\xdd\x54\xb7\xfc\x7e\xc2\x89\xed\x22\x7b\x8e\x60\x1e\xac\xbe\x83\xd5\xf7\xe7\x62\xf5\x1d\x4c\xb9\x83\x29\x77\x30\xe5\x36\x5c\x83\x29\x77\x30\xe5\x0e\xa6\xdc\xc1\x94\xbb\x76\x0d\xa6\x5c\xfb\xcc\x60\xca\x1d\x4c\xb9\x0f\x6d\xca\x2d\x2f\x55\x29\xe7\xfb\x40\x3a\x65\x9b\x38\xa7\x35\x6d\xde\x36\x56\xb5\xfa\x7c\x55\x2d\x6f\xd0\xe5\xb9\x56\x2e\xcd\x10\xd4\xf6\x49\xd8\x80\xed\x61\xbb\xcd\x0f\x41\x53\x83\xfa\x3c\xa8\xcf\x43\xd0\x54\x79\x0d\x9a\xb6\xbf\x06\x4d\x7b\xd0\xb4\x07\x4d\x7b\xd0\xb4\x07\x4d\xbb\x7e\x0d\x9a\x36\x5e\x83\xa6\x3d\x68\xda\x0d\xd7\xe7\xa1\x69\x6f\x0b\x9a\x9a\x19\x94\x75\x37\x77\x45\x4d\x91\x30\x9c\xe6\xcb\x21\x9c\x66\x08\xa7\x19\xc2\x69\x86\x70\x1a\x77\x3d\x74\x38\x4d\xd5\xfc\x86\x31\x2f\x15\x73\x1b\xe0\x6c\x96\xcb\x25\x8f\x99\xaa\x05\xdf\xf8\x32\x7b\x01\x97\x49\xa1\x31\x5f\x19\x50\xc3\x1e\x26\x9c\x66\xb0\xcd\x0d\xb6\xb9\xc1\x36\x37\xd8\xe6\x82\x6b\xb0\xcd\xf9\x6b\xb0\xcd\x0d\xb6\xb9\xc1\x36\x37\xd8\xe6\x06\xdb\x5c\xfd\x1a\x6c\x73\x78\x0d\xb6\xb9\xc1\x36\xd7\x70\x7d\x1e\xb6\xb9\x10\x83\x86\xac\x8a\x41\xf5\x1c\x54\xcf\x27\xa6\x7a\x0e\xfa\xe4\xa0\x4f\x0e\xfa\x64\xc3\x35\xe8\x93\x83\x3e\x39\xe8\x93\x83\x3e\xb9\x76\x0d\xfa\xa4\x7d\x66\xd0\x27\x07\x7d\x72\xc8\xaa\xe8\x98\x55\xf1\xfe\xcd\xdb\x20\x92\x03\x23\x3c\x02\xcc\x82\x8e\xda\x50\x69\xd7\xf1\xe4\xc1\x0b\x3b\xa8\xc2\x83\x2a\x3c\x78\x61\xc9\xa0\x35\x0f\x5a\xf3\xa0\x35\x0f\x5a\x73\x7d\xe3\x06\xad\x79\xd0\x9a\xab\x5b\x39\x68\xcd\xdd\x81\x36\x68\xcd\x83\xd6\xdc\xb0\x15\x3f\x0f\xad\x79\x28\x2b\xab\x65\x0e\xe5\x62\x1f\xbe\xa4\xec\xd7\xbe\xa1\xe7\x7a\x39\x59\xf8\x6d\x63\x29\x59\x9c\x30\xfc\xd4\x54\x46\x56\x22\x56\xae\xd7\x8f\x75\x2d\x44\x1f\xa1\x76\x2c\xb6\x01\xb2\x8a\x43\x21\x38\x88\x3d\x69\x91\x68\xae\x99\xa0\x22\x5a\x01\x9b\x7d\xff\xe6\x2d\x49\xa9\xa0\xf3\xa0\x93\x8f\x9a\x90\x4b\x0d\xf4\x46\xe7\xbe\x75\x93\xed\x36\xe4\xf3\x3e\xc2\xe6\x46\x50\x7d\xc2\xf7\x17\x02\x85\xc3\x09\x01\x2c\x06\x01\xd0\xb0\x0f\xe8\x45\x14\xb6\x21\xfa\x55\xfd\x80\x0f\x99\x30\x43\x26\xcc\x90\x09\xf3\x44\x32\x61\x80\x7e\x6c\x6c\x30\x57\x21\x32\x7b\xb4\xdd\x8a\xd9\x8c\x16\x49\x43\x2b\xdf\x22\x03\xdb\x9a\xb7\x60\x91\x0b\x7c\xb2\x83\x7d\x55\xb1\x84\x45\x5a\xe6\x3b\x9b\xd4\xdd\xd8\x07\xed\x1b\xb8\xcc\xca\xd2\x8e\xd5\x76\xba\xd5\x62\xa5\xbb\x66\x4b\x40\x74\xd1\xd1\xe2\xd5\xa7\x0c\x2c\x8d\x1b\xec\xc2\x6b\xb3\xaf\xbf\x84\x27\xca\xb5\xd8\x4b\xe8\x94\x25\x1e\x14\x8e\x92\xa6\x78\x64\x50\x52\x2b\xef\x80\x80\x79\xfe\xee\x62\xdd\xc4\x5d\x5d\xe0\x26\xab\x34\xd9\x6e\x99\x5e\x9b\xfa\xf9\x96\xe9\x59\xc2\xe0\x7e\x01\xab\x82\x57\x5e\x91\xe8\x8d\x08\x25\xb7\x6c\x85\xf4\xb1\x92\x9c\x65\x1e\xce\x19\x50\x53\xd8\xcc\x5b\xb6\x82\x87\x2c\xb1\xdc\x21\x60\xf6\xd2\x35\xfc\x96\x6d\x82\x10\xfe\xee\x26\xbb\x59\x40\x6d\xd5\x9f\xfb\x96\xad\xb6\xfd\x5c\x03\xb8\x81\x83\xb7\x21\x1a\xc8\x9b\x1b\xde\x60\xe3\x81\x4d\xb3\x2c\xe1\x0c\xa8\xe1\xd6\xb1\x5b\xc9\xe3\xc4\x2f\xb5\xc3\x44\xfd\x56\x06\x16\x27\xd8\xec\x63\x85\x1b\x6b\x30\x7d\xc1\x33\x2b\x64\xa0\x68\xe1\x58\xe1\x77\x34\xe1\x81\x18\x03\x58\x7d\x29\x46\xe4\x9d\xd4\xe6\x7f\xaf\x3e\x71\x43\xea\x0d\x3e\x5c\x48\xa6\xde\x49\x0d\x77\x7a\x59\x2a\x4e\xa1\xc3\x42\xad\x66\xc7\x03\x37\x89\x9c\x55\xf8\xa1\x11\xc3\x66\x95\x2c\x40\xf3\xf4\xa5\x30\xea\xa4\x5d\x51\xc5\x18\x62\x86\x48\x0b\x05\x0c\x4c\x48\x31\x46\xfb\x45\xd3\x18\x16\x10\x32\xaf\xc0\x61\xcb\x70\x76\x28\xb0\x93\xe0\x2f\x28\x01\x25\x46\x94\x25\x31\xf6\x0b\x06\x6e\x6e\x88\x36\x8f\x08\x7a\x3b\xc0\xe7\xd0\x06\xbc\xdb\xe8\x0a\x5e\x3b\xa8\x4b\xcb\xbd\x02\x92\xf9\xc6\x1c\x80\x0e\x24\x16\x9f\x47\xb2\x94\xd2\xcc\x6c\xd3\x3f\x0d\xf5\x01\x48\xfd\x9b\x64\x94\x1b\x89\xf9\x1c\xa4\xff\x84\x55\x7e\xb3\xad\xc0\xc3\x61\xcc\x08\x5c\x11\x43\x4a\x96\x34\x31\xf4\x0e\xec\xf3\x84\x25\x48\xfd\x8c\x90\x5e\x23\xec\x23\x72\xb7\x90\x0a\x89\x19\x5a\xa9\xb8\x22\x47\xb7\x6c\x75\x34\x5a\xdb\xda\xa3\x4b\x61\xdd\x54\x6b\x9b\xe9\x89\xa8\x14\xc9\x8a\x1c\xc1\x6f\x47\xfb\xf3\x82\xad\xc4\x92\xc6\x68\x3e\xa0\xc9\x55\x0b\x6a\xb6\x75\xdf\xaa\xce\xe5\x4d\x7d\xf6\x6b\x7c\xbd\xfe\x8a\x23\x7e\x98\x91\x1b\xea\x26\xf0\x24\xa1\xf8\xa8\x75\x02\x43\x2b\x54\x34\x8f\x60\xbf\x57\x88\x97\xf6\x70\x3e\x51\xa7\xb8\xb3\x46\x1e\x75\xb0\x07\x4d\xaf\x73\x83\x77\xa3\xd0\xf3\xe8\x0a\x13\x87\xe3\xf3\xab\xcb\xdd\x9d\x75\x6f\xe0\x15\xa2\x59\x92\xa0\x0b\xdb\xc8\xac\x5a\x5a\x99\xb5\x51\x84\xc9\x82\xf1\x03\x25\x7f\xe3\x64\x9b\x9a\xb5\xc2\xaf\x20\x0a\x79\x25\x76\xf7\x5c\x3f\xd4\x5e\xb0\xe4\x8e\x7d\xca\x12\x1e\x71\xed\xe8\x77\x29\x5b\x81\x3e\x04\x2f\x01\xe1\xe2\x20\x0d\x28\xa6\x47\xa5\xac\xc6\x15\xe1\x73\x21\xf3\x66\xfc\xbc\x9f\xd8\x75\x42\x3e\x8d\x6f\x8b\x29\xcb\x05\xd3\x4c\x8d\x8d\x8c\x35\xb6\x2f\xb0\xf5\x23\x50\x17\x61\x77\x41\xe9\xe8\xdb\xea\x0b\x15\x05\xd4\x0e\xe6\x68\xeb\x6a\xad\xb3\x30\x3c\xe5\x21\x08\xe7\x39\x67\x68\x31\xf4\x0e\x14\x7d\x27\x89\x2a\x32\x9b\x5b\x5e\x1b\xd2\x1c\x4d\xf2\x51\x38\x41\xfb\x45\xd9\x0d\x18\x08\x05\x04\x4b\xb8\x94\x76\x7b\xb2\xac\xa6\x0c\xdb\x95\xca\x25\x73\x6a\x2c\xb2\x04\xc3\x0c\xb2\x05\x55\xac\xd4\xc1\x54\x11\x45\x8c\xc5\x2c\xc6\x1f\x2c\x2b\x61\xb3\x19\x8b\x34\x5f\xb2\x64\x05\xc6\x7f\x85\x22\x89\xff\xbe\xc1\x6c\xfc\x7c\xb9\xe0\xda\x17\x05\xfb\xa4\x9d\x92\x4e\x38\x28\xe1\x55\x4b\x45\xee\x97\xbb\xa0\x8a\xcc\x28\x4f\x8c\x5e\xf7\x51\x90\x0f\x2c\x5a\x5c\xe5\x6c\xc9\xd9\xdd\xb7\x42\xd1\x19\x7b\x4d\x79\xf2\x5a\xe6\x77\x34\x8f\x03\x18\xdc\xc7\xf2\xcd\xac\xfc\x6f\x38\x25\x07\x97\x73\x4f\x38\x93\x55\xd0\x97\xd9\x7a\xc6\xcc\x7a\xef\xdc\x02\xaf\x12\x03\x31\x70\xb8\x52\xa3\xd0\x7a\x8c\x22\x39\x9b\xb1\x9c\x09\x73\x9e\xa8\x1b\x3f\x78\xc9\xb3\x87\x88\x6a\x9a\xc8\x79\xd9\x52\xda\xea\xbd\xe8\x18\xa3\xf0\x31\x07\x3d\xe7\x06\x62\x46\x54\x80\xfe\x1f\x78\x76\x03\xa3\xd1\x47\x41\xbe\x3f\xbf\x7e\x77\xf9\xee\xeb\x17\xc0\x55\xb6\x41\x78\x1d\xaf\xb9\x22\x05\x3c\x15\x58\x3d\x54\x91\x68\x83\xe2\x85\xf0\xfe\xa2\x29\x5b\xd0\x25\x37\x67\x20\xb7\xf6\x90\x25\xc3\x3e\xe2\x46\x0d\x26\x89\x54\x66\x9c\x84\x29\x45\x56\xb2\xc0\x20\x9e\x98\xb1\x0c\x5d\xdc\x4a\x53\x01\xdd\x4b\xac\x3f\xa3\xbe\x08\x32\x65\xe6\x57\x67\x11\x5b\x3b\x5d\x4d\xfe\x84\x1d\x94\xc3\x69\xba\x1b\x14\x59\xb2\xd5\xe1\x31\xde\xf2\x96\xf9\x75\x1b\x88\xab\x6a\x7f\xfb\x68\x29\x54\xfc\xb7\xf5\xdb\x0e\x1f\xbc\xee\xae\xfb\x6f\xd6\xa3\x30\xf0\xe3\x5b\xc4\xc2\x0e\x1a\xff\xf6\x88\xaa\xca\x2a\x83\xe0\x9a\x9a\xec\xdd\xc4\x39\x83\x20\xa1\x3e\x99\xcd\x10\xaa\x35\x84\x6a\x0d\xa1\x5a\x6b\xbf\x0f\xa1\x5a\x43\xa8\xd6\x10\xaa\x35\x84\x6a\x0d\xa1\x5a\x43\xa8\xd6\x10\xaa\x45\x86\x50\xad\xf2\x99\x21\x54\x6b\x08\xd5\x7a\xbc\x04\xa7\x40\x2b\xdd\xa9\x60\xbe\x29\x9f\x45\xe9\x44\xbb\x60\x28\x77\x32\xab\xa2\x61\x5d\xe5\xb4\xa7\xd8\xf0\x63\x3b\x4c\x67\xab\x72\x1b\xa1\x4b\xb4\xb7\xe2\x56\xed\xb7\x81\xd9\x64\xcd\x35\xee\x39\x50\x65\x51\x4f\xd5\x4e\x5b\xf5\x2c\x5c\xb3\x59\x47\xc7\xc2\x35\x9b\x85\xa6\x36\x04\x4c\xd5\x9f\x60\xc3\x55\xbc\xc3\xe1\x1e\x62\x07\x36\x07\x38\x35\x2e\xc1\x08\xfb\xce\x5e\x6a\xf1\xd1\xae\x61\xa3\x23\x74\xe7\x91\x06\x7e\x7c\x45\xf5\xa2\xd5\x0c\x8e\x2f\x2d\xd8\xc0\x6b\x08\x7e\xdc\x8c\xb3\x88\x55\x62\xa8\x40\x8e\x63\x34\xb6\x37\x8d\xe0\x93\x33\xfb\xdb\x08\x25\x0e\xeb\x2b\x2d\x63\xac\x8c\xd0\x44\xa8\x21\xc4\x3c\x26\xff\x73\xf3\xfe\xdd\xd9\xd7\xd2\xca\x0a\x46\x9b\x51\xb6\x43\x52\xca\x84\x1e\x11\x55\x44\x0b\x42\x95\x99\x9a\xd1\x6f\x6f\xc0\xf4\x90\x52\xc1\x67\x4c\xe9\x89\x1d\x8d\xe5\xea\x87\x2f\x7f\x9c\x54\xcd\x1d\xdc\x3a\x54\x5d\x24\x92\x45\x00\x38\x1b\x66\x31\xfe\x5d\x10\x5a\x61\x4a\x99\x8c\xed\xa4\xef\x60\xb2\x9a\xde\x32\x22\xed\x64\x0b\x06\x4c\xe1\x05\x39\x32\x68\x12\x7c\xfa\x9f\xe6\x60\xfd\xfb\x88\x9c\xdc\x81\x49\xff\xc8\xfc\x79\x84\x1f\xf4\x81\x63\xe6\x5e\xc0\xf1\xed\x87\x51\xbe\xcf\xf9\x7c\x0e\xe2\x16\xd8\x6d\x97\x4c\xe8\x53\xe0\x6f\x33\x22\x64\xf0\xb0\xb0\xfe\xb1\xd2\x2b\x56\x9f\xc8\x0f\x5f\xfe\x78\x44\x4e\xaa\xeb\x32\x22\x28\xfb\x44\xbe\xf4\x9e\xb0\x4c\xc6\xa7\x4e\x6b\x5d\x09\x4d\x3f\x81\x62\xb0\x90\x8a\x09\x74\x24\x68\x89\xd6\x58\x25\x8d\xf2\xc9\x92\x64\x8c\x02\x66\x4c\xee\xd0\x00\xe7\x40\x89\xce\xe4\x8c\xe6\xba\x16\x56\xf7\xe1\xfd\xc5\xfb\x17\xf8\x35\xb3\x6d\x73\xe1\xb4\xdc\x19\x17\x34\xb1\x66\x6d\x2f\x1f\x9a\x89\x14\xb8\x49\x5a\x5a\xd5\xd6\x59\x74\x67\x85\x2e\x72\x36\xa9\x87\x59\xb5\xc6\xf8\xa6\x18\xb7\x66\x64\x87\x58\xb7\xfa\x41\x7b\xc4\x48\xb2\xd6\x4b\x14\x1b\x3c\xad\xeb\x4b\x7c\x17\xe0\xe0\xd6\x25\x96\xa4\xd9\xac\x32\x96\x91\x32\x0b\x8c\x58\xa6\xd5\x99\x5c\x1a\xd2\xc9\xee\xce\xee\x64\x7e\xcb\xc5\x7c\x6c\x90\x6c\x8c\x3b\xaf\xce\x80\xc5\x9c\xfd\x1a\xfe\x77\xd0\x8a\x80\x4f\xb5\x5f\x16\x06\xb4\x3e\xc0\xda\x80\x7d\x9e\xed\xbd\x34\x27\x5f\x76\xe1\x04\xc7\x37\x4e\xf9\xab\xbd\x6d\x8e\x0b\x3a\xc2\x6d\xa4\x6b\x40\xe1\x52\x1a\x23\x09\xa4\x62\x75\xef\x68\x6c\x00\x08\x3a\x7e\xb4\x1a\xdb\x50\xf4\x31\x15\xf1\xd8\xcb\xd7\xd1\x6a\x6f\x88\x15\xbc\xe5\x01\xfe\xf6\xf2\xe2\x61\x90\xbb\xe0\x9d\x4e\x6b\x5f\x89\x04\xa4\x12\x7c\x4e\x93\x6c\x41\xfb\xea\xb7\x30\x84\xa0\xc3\x35\x84\xa0\x0f\x21\xe8\x43\x08\x7a\x79\x3d\x91\x10\xf4\x21\x84\x7c\x08\x21\x1f\x42\xc8\x37\xff\x3c\x84\x90\x0f\x21\xe4\x43\x08\x79\xfd\x1a\x42\xc8\x87\x10\xf2\x21\x84\x7c\x08\x21\x6f\xb8\xfa\x28\x55\xf7\x19\x06\x5f\x0e\xce\xb1\xcf\xc3\x39\x36\xb8\xbb\x06\x77\xd7\xe0\xee\x1a\xdc\x5d\x7b\x60\xfc\xe0\xee\x1a\xdc\x5d\x83\xbb\x6b\x70\x77\x3d\x51\x77\x57\xa7\xce\xe2\x9f\x75\xe1\xac\x87\xaf\x99\x05\xb7\xd6\xcb\x65\x6d\xac\x94\x65\x8b\x64\xad\x55\xc2\x2a\x8b\x60\xbd\xc4\x5c\xca\xfb\xaf\x80\x55\x35\x00\xba\xa6\xcc\x1d\x1a\xb1\x0f\x0e\xbd\xc1\xa1\x37\x38\xf4\x76\x9d\x92\x0e\x0e\x3d\xf0\xe5\x85\x47\xc1\xaa\x23\x65\x0a\xc7\xfb\x66\xd7\xc6\xe6\x4f\xb7\x37\xad\x58\xab\x4a\xf8\x79\x97\x8b\x52\x7e\x3f\xb0\xb0\xc0\x49\x31\x1b\x1a\xc9\x34\x93\xc2\x20\x46\x3f\xce\xc5\x72\xbc\x16\xd9\xaa\xee\x51\x7b\x7f\xca\xc2\x60\x72\xeb\xd9\x4a\x33\xa9\x58\xc5\x8e\xbb\x87\xe2\xbd\xdd\x35\x35\x46\xa7\x8f\x33\xa1\xed\xa1\xb8\x57\xde\x6f\x25\x8b\xbc\x09\xdf\xb0\xae\x49\xf0\x3c\xfd\x54\xb0\x1c\x5b\xe7\x97\x0e\x9c\x12\x28\xce\xe4\x8a\x2e\xa9\x0a\x58\x8e\xb7\x6c\x66\x4b\x30\xb5\x59\x2a\xe9\xe0\x8f\x5d\x5b\xf5\x83\xfa\x64\x49\x6b\xff\x49\x0b\xef\xc9\xd3\xf6\xcf\x92\xb6\x3e\x5a\xd2\xd2\x4f\x4b\x5a\xf8\x6a\x49\x3b\x7f\x2d\x69\xed\xb3\x25\x6d\xfc\xb6\xe4\x9e\x7d\xb7\xa4\xbd\x53\x93\xb4\xf6\xe1\xae\x4d\xfa\xc9\xf9\x71\x3b\x2e\xbb\x8d\x3f\x77\x6d\xd1\x83\x4f\xb7\x06\xea\xdd\x7e\x5d\xd2\xd6\xb7\x4b\xda\xa7\x27\xed\xf4\xf1\x92\xc1\xcf\xdb\x8d\xbf\xec\x24\xba\xdd\xfc\xbd\xad\xf6\x32\x67\xb3\x76\x4e\xfa\x6b\x36\xc3\xc5\x04\xe2\x44\xe9\xe8\x90\x1b\x65\x88\x52\xea\x18\x59\x2a\xea\x8a\xe7\x54\x64\x97\x87\x89\x88\xba\xe6\xd1\xe2\x3a\x34\x5e\xd1\xc0\x96\x05\x34\xd2\xcd\x76\x44\x98\xc8\x79\xb4\x70\x93\x35\x42\xae\xf5\xac\x6d\x2f\x78\x12\x4e\x7b\xc7\x86\xb6\x63\x67\xbb\xbd\x39\x0d\x0b\xdd\xc3\xa7\x13\x4e\x7c\x27\xf1\xde\x5e\x4d\x66\xc3\xa4\x82\x4a\x20\xb5\x0c\x7c\xab\x87\x57\xb2\xd4\x3d\x06\x3d\x60\x68\x4b\xf3\x74\xcb\xd9\x86\x93\xa5\x2e\x41\x75\xbd\x66\x8b\x28\x27\x6f\x1d\xb2\x5b\x72\xed\xc3\x65\xb4\x10\xbb\xda\x0b\x5e\x3b\xeb\x81\x84\x0f\x6e\xac\x0c\x52\x5e\xed\xa5\xaf\x6e\xd5\x42\xca\x6b\xcd\x0f\x7e\x48\x75\x90\xbe\x38\x5d\x79\xb5\x2d\xd3\x51\x05\x03\x3a\xe1\x7b\x05\xc1\x1d\x85\x68\x93\xe9\x5a\x0c\xc2\xa3\x2c\x72\x67\x55\x92\x0d\xab\x3b\x3f\xb4\x28\x49\xdf\x8b\xdf\x55\x88\x62\xc3\x3a\x3e\x74\xab\x2e\xd1\xf7\xac\x77\xd5\x3f\xd8\x30\xeb\x9b\x5e\x2b\x21\xec\x39\xf7\xed\x45\x09\x36\xcc\xfc\x43\xbd\x3c\x41\x8f\xd3\xda\x19\xb7\xd0\x30\x9f\x21\x7a\x61\x88\x5e\x78\xe2\xd1\x0b\x9d\xce\xc0\xb6\x48\x86\x26\xf4\x7f\xaa\xf1\x0c\x9d\x16\xbd\x2d\xb6\xa1\x69\xd1\x4f\x24\xc2\xa1\xf3\x1a\xb7\x46\x3b\x6c\x5a\xe8\x13\x89\x79\xe8\xb4\xd8\x96\xf1\x0f\x4d\x4b\xfe\x39\x47\x41\x74\x82\xe1\x96\x88\x88\x26\xb8\x3d\x89\xb8\x88\x8d\x0b\xfc\x45\x77\x15\x0b\x6b\x1f\x3f\x5c\x80\xc4\x4d\xf0\xd5\x5a\x90\x44\xf8\xd3\x5a\xa0\x44\x65\xb6\x18\x2c\xd1\xd0\x51\x4c\x15\xd3\xf0\xdf\xf5\xa8\x0a\x55\xfd\x78\x9b\xf6\x62\xa1\x7d\x0d\x62\x02\x5e\xca\xa4\x48\x43\x1b\xc7\x78\x5d\xf4\xcf\x68\x74\x6b\xb4\x16\xfb\xbd\x29\x78\xd6\x02\xe4\xfc\xbb\x92\x02\x24\x4a\x32\x01\x31\xc4\x40\x30\xf8\x19\xf7\xe7\x0a\x07\xf9\xd5\x56\x0c\x6e\xfc\xbc\x2b\x50\x6d\xbd\xf5\x4e\x03\x29\x85\x9f\x6c\x6d\xe8\xfa\x8c\xf0\xd5\xb5\x39\xdd\xd4\x6f\xb7\x9e\xd2\x82\x0a\xc1\x12\x43\x0b\xd0\xa3\x0f\xd2\x9d\x87\xcf\x76\xf0\xd8\x97\xd7\x66\xf3\x72\xed\x7e\xc3\x74\x2a\x29\xfa\x87\xc6\xc8\x84\x28\x4a\x6e\x19\xcb\x54\xe0\x2c\x29\xc0\xa7\x02\xb9\x20\xd3\x95\x51\xef\xa2\x5b\x28\x37\x0a\x52\x19\xac\xf7\x25\x6e\x4c\xcf\x09\xf4\x80\xec\x19\x8b\x82\x5b\x43\x08\xce\x10\x82\x33\x84\xe0\xec\x3a\x63\x2d\x42\x70\xc2\x03\x5f\x09\xc3\xa1\x82\x9c\x67\x59\x02\x46\x29\x57\x1a\xd6\xd6\x1c\xb4\x05\x37\xd6\x2c\x71\x7b\xa6\x17\xd5\x98\x83\xbb\xbd\x46\xa1\xab\x3f\x78\xa6\x56\x7b\x62\x6b\x84\x0d\xd2\xd3\x26\xf9\x6e\xab\x74\x18\x49\x31\xe3\xf3\xdd\x79\x31\x01\x2c\x5f\xc2\x2b\xa5\xc7\x0c\x87\x28\x6c\x65\xdb\x92\x53\x41\xfa\x56\x85\x6f\xdf\x47\x72\xcc\x0c\x24\xb0\x8d\xe1\x01\x95\x55\x5c\xce\xca\xe9\x8d\x20\x9a\x26\xe7\xb1\xa5\x8f\x99\x8c\x8f\x15\x50\xb3\xb8\x48\x6c\xa9\x69\x2c\xc5\x62\x8e\xa6\xe0\x89\x59\xc9\x98\x6a\x3c\x0f\x4c\x61\xbe\xe3\x17\x42\xea\x2f\xfc\x48\x68\x78\xc9\xf9\x9c\x7b\xd2\xe7\xfb\x95\x64\x32\x9e\xf8\x62\x0e\x1a\x5c\x96\xd5\x01\x27\xe4\x5b\x65\x1d\xcc\x8e\x38\x9c\xfc\xf3\xdf\xa7\x86\xb0\xb2\x1c\x0b\x75\xda\x81\x2b\xef\xed\x88\x02\xe9\x29\xb6\x47\xc8\x98\x9d\xef\x00\xf5\x1a\xb8\x2f\x7c\xfc\x96\x79\xdd\x6f\x55\x08\xe4\xbc\x48\x82\x34\x31\x03\xa3\xc3\xdd\xaa\x6d\x1d\x1b\x19\x5a\xf9\x58\x7c\x01\x6e\xfb\x1b\x3f\xab\x4b\xcc\x94\xc4\xdb\xaf\x3e\xb1\xa8\xd0\x3b\x55\xce\x06\x23\xb2\x5d\x26\x18\xa4\x92\xc4\x7e\x0e\x44\x27\xfb\x83\x59\x2f\x30\x4e\x03\x1e\x1b\xda\xa6\xa8\xe6\x6a\xb6\xc2\xbc\x5b\x07\x30\x16\xc4\x46\x95\xe7\xcb\x08\x2a\x41\x1d\xe2\x69\xa1\xb1\xb4\xe9\x8a\x44\x0b\x69\xf0\x8b\x22\xdc\x61\xdc\x25\x97\x18\x40\x04\xf6\xe0\x9c\xa4\x86\x03\x58\xed\x2e\x18\x1e\x3d\xde\xe5\x6b\x46\x15\x96\x4a\x97\xb0\x72\x41\x35\x66\x18\xb0\xb3\x99\x3f\xe6\x46\x5d\x01\x8f\x5f\x91\x9a\x41\xef\x18\x9f\x2f\xb4\x1a\x11\x3e\x61\x13\xd8\x5d\x46\xa3\x45\x30\x6c\xca\x98\x56\x84\x26\x89\xef\x4a\x12\xa0\x44\xe8\x6e\x3f\xf1\x4c\xd3\x32\xb8\x91\xa7\xb7\xf5\x5d\x6b\x04\xd7\x88\x30\x1d\x4d\x4e\x47\xe0\xc1\x33\xa7\x85\xc2\x1c\xa7\x2b\xc2\x35\xd4\xe2\x06\x06\x9d\xcb\x62\x8e\x2b\xb1\x81\x06\xca\x4b\x47\xd6\x3e\x2b\x62\xd0\x26\xc4\x9c\x1c\xe1\xe2\x8e\x9c\xc0\x63\x86\xb3\x26\x57\x58\x9f\x2b\x2d\x8b\x16\xcf\x3c\x67\x2a\x93\xd8\x80\xa5\x1e\xb9\xf0\xff\xf8\x97\x4e\xd4\x69\x09\xcc\x05\x9f\x2f\x1c\x2c\x69\x8e\x34\xa5\xba\x07\xed\x9c\x8f\x6d\xc2\x48\x5a\x06\x91\x54\xfd\x3c\xae\x5c\x7c\x89\x13\xc1\xee\x69\x96\xa7\x1e\x06\xb0\xc1\xa8\xeb\x5b\xa3\x6c\x6a\x73\x98\x11\x88\xe4\x19\x39\x01\x14\xe1\xfa\x58\x01\xba\x8e\x65\x76\x3a\x21\xe7\xa0\xed\xb6\xf8\x80\x90\x7e\x7c\x3b\x90\xf9\xa8\x92\xe5\x58\xed\x7c\x16\xed\x3c\xb5\x5d\x7c\xb5\x86\x9b\x67\xde\xa4\xd4\xea\x71\x84\xc9\xce\x47\xbb\xf8\x6d\x49\x30\x87\x36\x4f\xaf\xb9\xf4\x00\xa5\xcb\xb0\x45\x96\xa7\x23\x42\x95\x92\x11\x2f\xbb\x26\xad\x63\x3a\xae\xa4\x8d\x1f\xa7\x23\xfc\x49\xe7\xf5\x93\x8e\x81\xa9\xd5\xab\x1e\xdf\x69\x43\x52\xab\x50\xa9\x10\xac\xe9\x0a\x7e\x05\x47\xe1\x94\x25\x3b\xa2\x33\xc3\xab\x4b\xf0\x97\xbb\x5a\x07\x81\x6d\x58\xd0\xc6\x85\x3c\x5a\xbc\x6a\x13\x4c\x3a\x20\x07\x5e\x5d\x8e\x69\x79\xb5\x89\x6c\xad\xbf\xd1\x2a\xce\xb5\x7a\x75\xc7\x5f\xbc\x5a\xc5\xc0\x56\xaf\x35\x91\xa4\xaf\x50\xd8\xea\xd5\x31\x24\xa1\xbc\xda\x87\xc9\x6e\x59\xd7\xf5\x7d\xc5\xca\x8e\xaa\x81\xb2\xe4\x6b\x8d\xb8\xfe\xa6\x25\x65\xeb\x01\x40\x6d\x03\x6a\xb7\x80\xe7\xfc\xb3\x09\xaa\x6d\x18\xea\x6b\x6d\x86\x79\xb3\xf1\x65\x70\xd8\x52\x17\x5c\x6a\x85\xb7\x51\xad\x20\x0d\xd8\xa2\xb2\x9c\x19\x86\x85\x8d\xbf\x6c\x27\x94\x7b\x8b\xe3\x6d\xda\xfd\x6e\x84\x1d\xaf\xce\xe4\x3d\xfc\x60\x27\x74\x03\x16\xf9\x1a\x1a\x67\x3d\x0c\x77\xc4\x26\x5d\x03\x77\x1c\xb8\x63\xf5\x1a\xb8\xa3\xbf\x06\xee\xb8\xe3\x1a\xb8\xe3\xc0\x1d\xef\x9d\x3b\xa2\x2e\xbb\x87\xf2\xfc\x3d\x9a\x38\xea\xda\x32\x70\x5a\xe7\x17\xaa\xaa\xcd\x86\xdf\xb8\x04\x8a\x0f\xa0\x6a\x5b\xdb\x71\x0e\xb1\x61\xcf\xc7\xcf\x9f\x3d\xeb\xa2\x54\xef\x6a\xf8\x16\x5e\x41\xf3\xb7\xdf\x7d\xb9\xf5\x8d\x4d\xf6\xb7\x1e\xac\xa6\x16\xc7\xbd\x21\xaf\x22\x3b\x6c\x30\x7c\x02\x75\x12\x52\x93\x94\x69\x42\x75\xc5\x54\xc4\x53\x36\x72\x86\xe5\xb2\xbf\xf6\xb4\x34\xcd\xc6\x44\x0a\x17\xa9\x28\x63\x36\xd9\x6f\x06\x11\xa3\x0a\xf2\x4d\xa6\xcc\xcf\x42\xa6\xe6\xab\x5c\x68\x77\x5c\xcc\x14\x98\x83\x0a\x39\x61\x93\xf9\x84\xc4\x05\xb3\x09\x4e\xe8\xa7\xb3\xed\xac\xd4\x4a\x69\x96\x82\x25\x57\xe6\xbe\xe9\x9b\xce\x21\x46\x11\x02\x25\x0b\x9a\x24\x2b\xc2\x96\xdc\x66\xfb\x9a\xc1\xc1\x4d\x08\x35\xe1\xcd\x4a\x5a\x99\x08\x7b\xcf\x4f\xa8\x63\xf0\xae\x54\x85\x2e\xdc\x7e\x6d\xec\xce\x91\xc6\xd7\x76\x25\x93\x8d\xc2\xaa\x36\xe3\xa2\x0d\x1c\xfe\x09\xc8\xf5\xfe\x7a\xb7\xc9\x95\x74\xa6\x64\x1d\xa8\x57\x5d\x2c\x2d\x92\xc4\x20\x06\x5a\x61\xd7\x17\xd0\x60\x1d\x6d\x48\x64\x43\xc3\x7b\x1a\x24\xb4\x61\x07\x73\x99\xc9\x44\xce\x57\x21\xa4\xb1\x83\x1c\x4f\x33\x67\x1c\x47\xaf\x1e\xf3\xdd\x99\xdf\xd5\xb6\x66\xb0\xfc\x0d\x96\xbf\x41\xb7\x59\xbb\x06\xdd\xc6\x5f\x83\x6e\xb3\xe3\x1a\x74\x9b\x41\xb7\x19\x2c\x7f\x64\xe0\x8e\x5b\x60\x32\x70\x47\x32\x70\xc7\x8d\xeb\x1a\xb8\xe3\x56\xf0\x0c\xdc\x71\xe0\x8e\x4d\x57\x26\xe3\x03\x02\x1d\x33\x19\x6f\x89\x73\x44\xab\x4f\x24\xc7\x89\x8c\xb0\xed\x04\x26\xa6\x3a\x3b\x9f\xa2\x29\x1a\xa2\x46\xe4\x1f\x52\x30\x0c\x5e\x33\x7b\x03\xe6\x24\xa8\x83\x60\x1e\x3f\x51\xa7\x5b\x03\x9b\x86\x38\xc9\x21\x4e\xf2\xc9\xc7\x49\x2e\xa8\xc2\x7d\x45\xa2\xb4\x39\x6c\x32\x38\x90\x1f\x58\x9e\x7e\xa6\x51\x93\x06\x5d\xec\x76\x43\x8a\x4d\xb9\xa5\xb8\xf2\xd8\xfa\x0b\x58\x7c\x55\x5d\xaf\x95\x97\xb1\x56\x53\x1c\xb3\x98\x64\x2c\x1f\x23\x8a\x48\x32\xe3\xb6\x98\x55\x0d\xfb\x2c\x7c\x1e\x35\xfa\xb1\xba\x8e\x47\x0c\x81\xac\x4e\x64\x0f\x9b\x6b\x68\x38\xae\x50\xf8\x27\x11\x10\xd9\x55\xaa\x1f\x13\x6d\x8d\xbc\xdf\xb4\x94\xeb\xbb\x8b\xe6\xad\x4a\x9f\xae\x5f\x8d\xf5\x34\xb7\xd6\x3e\x1d\xf9\x02\x0f\x11\x55\xc8\x29\xba\xaa\x96\x1d\xd5\xa8\xfd\xf4\x94\xfd\x2d\xd1\xe4\xd1\xcb\xa5\xae\x5f\xfb\x8a\x6e\x7b\x09\x6e\x4f\xbf\xc8\xea\x26\x00\x75\x56\xd0\xc9\xde\x4a\x3a\xd9\x4b\x51\x27\xfb\x2a\xeb\xe4\x00\x85\x9d\xec\xa7\xb4\x93\x07\x28\xf1\xba\x7e\xed\xad\xa2\x92\x03\xf4\x78\xf2\x59\x14\x86\x5d\xbf\x0e\x02\xd6\x7e\x3a\x3d\x19\xca\xc9\x76\xb8\xf6\x57\xb9\xc9\xfe\x6a\x37\xd9\x1f\x33\x5a\x96\xa5\x5d\xbf\x86\x42\xb5\x07\x71\xf6\x3d\x18\x57\xf7\x62\xb6\x9b\x3e\xde\x09\x4b\x7c\x9d\xa1\xfe\x85\x4d\x5d\x76\x36\x0c\x7b\x6d\x3a\x06\x03\xa1\x16\x01\x73\xf1\x51\x23\x80\x63\x70\x3f\x76\xca\x6f\x21\x82\xca\xad\xc1\x60\xbe\x82\x6e\x2d\xa4\xc9\x6e\xbc\x14\x4c\x81\x60\xc7\xbc\x89\x28\x6c\xae\x68\x9e\x9d\x60\x38\x48\xc9\xed\x44\x5c\x0f\x10\x29\xdf\x00\x19\x31\x65\x54\x28\x72\xe4\x6c\x4f\xc7\xaa\x7c\xe2\x68\x52\x66\xf7\xf9\x11\x21\x09\x39\xcc\xe8\xdb\xde\xd4\x7d\xdb\xce\x0e\x92\xf6\x20\x69\x0f\x92\xf6\x20\x69\x37\x5e\x83\xa4\xdd\xe1\x1a\x24\xed\x41\xd2\xde\xf6\xe1\x41\xd2\x1e\x24\xed\xdd\x1f\xdf\x4f\xd2\xde\x37\x4e\x28\x94\x7b\xad\x73\x0e\x2b\x67\x41\x6b\x7e\x1f\x43\xe4\x0b\x94\xc2\xbf\xfa\x95\xb7\x43\x59\xba\x59\xda\x0e\x25\xf2\x35\xdd\x62\xb2\x43\xb4\xf6\xc2\xf7\xda\x9b\xdb\xa5\xee\xa7\x15\x0b\xb5\x07\x6e\x04\x0e\x85\x3d\x91\xe3\x83\x73\x85\xdb\x4a\x73\x53\x56\xfa\xc9\x63\x72\xe2\x3c\x2e\x50\x21\x5a\x48\x5d\xfd\x51\x68\x3e\x2e\x9f\xf0\x3e\x18\x70\x2f\x56\xf2\x6d\x92\x6a\x7f\x35\x51\xab\xad\x58\xee\xa7\x21\x21\x2c\xaf\xcc\x81\xbb\x46\x7a\x10\x2d\x91\x17\x42\x98\x51\xa1\x4a\x36\x78\xe3\x90\xe6\x60\x01\x38\xdf\xd9\xdf\x08\x4b\x30\x1f\x90\x98\x4a\x28\x05\xfe\x4e\x6a\xcb\x48\xdb\x50\x7e\x29\xac\x47\xd4\xdc\x71\x5e\x5f\x87\x94\xb0\x22\xee\xbf\x3e\x21\xaf\x00\x0f\xc3\x81\x6d\xc9\x69\x9a\x24\xf2\xae\x0b\x49\x7a\xa8\xb4\xa8\xbb\xce\x69\x51\x35\xff\xdd\x90\x15\xf5\x0b\xc9\x8a\x82\x1f\xf1\x08\xf5\x9e\x1e\x45\xbe\x5f\x30\xc0\xa2\x9c\x01\xa8\xd2\x22\xd1\x3c\x2b\x63\xa5\x14\x7e\x2a\x41\x29\x73\x66\x23\x4f\xaa\x78\x69\xbe\x46\xa3\x45\x1d\x3f\x61\x3c\x88\xad\x52\x70\x68\x6d\x74\x07\x4d\x12\x9b\x53\xe4\x44\x52\x0c\x61\xe1\x8f\x1d\x99\x70\xe1\xaa\x22\x3a\x6d\x06\x88\xcc\x89\xa1\x85\xc9\xca\x56\xaa\xdb\x42\x44\x51\x29\x5a\x32\xc7\x7a\xe7\x7c\xc9\x44\x49\x49\x4f\xd4\xe9\xa9\xe3\xe1\xbd\x52\xf8\x7b\xa1\xd0\x7f\x0e\x28\xe9\x5f\xda\xd0\x68\x58\x90\xa7\xd2\x25\xf8\x4a\x1a\xfd\x98\x21\x18\x5d\xfc\xfc\xdd\x6c\x0c\x7b\xf8\xf7\x1f\xd0\xb7\xff\xf9\x64\x96\x3d\xb2\x85\xf1\x31\x62\xeb\x9f\xbc\x55\x71\x08\xae\x2f\xaf\x43\x83\xeb\xef\xdd\x72\xf8\xb8\x31\xf6\x9f\x81\xb5\xf0\x31\x63\xec\x07\x0b\xe1\xd6\x4d\x79\x6a\xa1\xef\xd5\x6b\x2f\x8b\xe0\x60\x0d\xdc\x9b\x0b\x77\x64\x38\x87\x5a\x01\x3b\x62\xc4\x9e\x7e\xf6\xc1\xc7\xfe\x30\x3e\xf6\x41\xe2\x6d\x79\x0d\x12\xef\x46\xa0\x0c\x12\x2f\x19\x24\xde\x5d\xcb\x1b\x24\xde\xad\xe0\x19\x24\xde\xad\x9b\x32\x48\xbc\x83\xc4\x4b\x3e\x37\x89\x77\x9f\x2a\x5d\x83\xaf\xfb\x20\x5f\x77\x57\x6a\xd1\x89\x46\x74\xc4\x83\xce\xbe\xed\xc1\xaf\xfd\x54\xfc\xda\xad\x13\xfe\x85\xe6\x87\x26\xfd\x87\x7b\xb5\x29\xf3\x9f\x2e\x25\x8f\x49\x56\x68\x9b\x4f\x3d\x64\xff\xf7\x91\xfd\x5f\x81\xfc\x50\x02\xa0\x55\x09\x80\x4d\x30\x1b\xea\x00\x0c\x75\x00\x7a\x76\x42\x0f\x75\x00\x86\x3a\x00\x43\x1d\x00\x77\x0d\xd9\x49\x64\xc8\x4e\x6a\x75\x0d\xd9\x49\x9b\xaf\x21\x3b\xe9\xc9\x5a\x5f\xc9\x90\x9d\xf4\xb4\x2d\xb1\x64\xc8\x4e\x1a\xac\xb3\x2d\x37\xea\x33\xcc\x4e\x1a\xea\x00\x3c\xd5\x18\x05\x32\x48\xda\x83\xa4\x3d\x48\xda\x83\xa4\xbd\xfd\x1a\x24\xed\x0e\xd7\x20\x69\x0f\x92\xf6\xb6\x0f\x0f\x92\xf6\x20\x69\xef\xfe\xf8\x50\x07\xe0\x33\x8a\x8d\x20\x43\x1d\x80\x21\x5e\x62\xa8\x03\xf0\xcb\xad\x03\x50\xf1\xdd\x3f\x5e\x31\x80\xee\xd3\x18\x2a\x02\x0c\x15\x01\x86\x8a\x00\x43\x45\x00\x77\x0d\x15\x01\xf0\x7a\x4a\xb6\xc6\x21\x3f\x6a\x23\x50\x86\xfc\x28\x32\xe4\x47\xed\x5a\xde\x67\x60\x37\x1c\xf2\xa3\x9e\xa0\xad\x70\xc8\x8f\x1a\xec\x82\xf5\xcd\xf9\x4c\xf2\xa3\x86\x8a\x00\x4f\xd1\xdb\x3e\x48\xbc\x2d\xaf\x41\xe2\xdd\x08\x94\x41\xe2\x25\x83\xc4\xbb\x6b\x79\x83\xc4\xbb\x15\x3c\x83\xc4\xbb\x75\x53\x06\x89\x77\x90\x78\xc9\xe7\x26\xf1\x0e\x15\x01\x86\x8a\x00\x43\x45\x80\xcf\xd1\xc3\xbd\x73\xa7\x99\x58\x6e\xda\xd3\xca\x2e\xbe\x12\xcb\xaa\x9e\xc2\xc4\x92\xe7\x52\x00\x05\x5e\xd2\x9c\xd3\x69\x02\x27\x15\x24\x1e\x0b\x7f\x4b\x3f\x59\x3e\x21\x2f\xa9\xb0\x8e\x56\xf4\x64\x6e\x9c\xff\x6e\xc4\xdf\x81\xea\xf5\x69\x7f\x47\xab\xa2\x9a\x68\x9c\x3a\xb1\x0f\x98\xa9\x53\xf2\xd2\x4f\x7c\xe3\x67\x5a\x11\xf0\x36\xfa\xc1\x18\x90\x73\xe3\x03\xed\xa4\x78\x33\xc4\xf6\xb3\x59\x01\xcb\x3b\x9a\x96\x29\xfe\x0d\xd0\x98\x90\xb7\x56\x42\xa2\xe4\xe5\xff\x5e\x5e\xbc\x7a\xf7\xe1\xf2\xf5\xe5\xab\xeb\xed\x48\xd7\x92\xac\xc0\x41\xea\x30\xd9\xe3\xef\xdc\x1e\x41\x9a\x37\x13\x86\x02\xff\xe6\xe4\xbb\xf3\xeb\xff\x7d\x77\xfe\xf6\xd5\x29\xb0\x5f\xf6\x29\xa3\x22\x66\x31\x29\x94\x23\x09\x59\xce\x96\x5c\x16\x2a\x59\xf9\xe3\xdd\x8c\xb4\x75\x6c\xb5\x8a\xe6\x8a\x28\x96\x2f\x79\xd4\x0c\x22\x94\x62\x69\x89\x40\x91\xc7\xf0\x9c\x29\x99\x2c\x59\x8c\xb2\x86\x9f\xb4\xfb\x0e\x17\x59\xa1\x9d\x44\x0c\x21\x08\xe6\x54\x88\x68\x41\xc5\x9c\xc5\x13\x72\x21\x0b\x33\xde\x6f\x7e\x03\x0b\xcb\x59\x5c\x44\xc8\xeb\xa8\x13\x98\x7e\x33\x72\x94\xc4\xd0\x02\x85\x65\x14\x54\x44\x33\xb7\xf4\x10\x3a\x6a\x25\x34\xfd\xf4\x02\x7d\xf0\x47\xbf\x09\x7e\x3a\x72\x25\x28\xa4\xf9\x04\xd2\x23\x9c\x55\x02\xd5\x0f\x12\x72\x14\x3e\x3d\x21\xaf\xcc\x37\x58\x1c\xee\x03\x86\x50\xb0\x25\xcb\x41\x9e\xb6\xbb\x30\x22\x39\x9b\xd3\x3c\x4e\x98\x82\xe0\x81\xbb\x05\x83\x72\x1e\x28\x61\x59\x80\x31\x2f\xad\x0b\xa9\x27\xe4\x82\xcd\x68\x91\x68\xa0\x21\x47\x47\x93\xe3\xde\x50\xed\x75\x2e\x77\x24\xbf\x57\xd0\xed\x06\x8b\x4a\xcc\x64\xbe\xf1\x78\x1c\x5b\xd3\x44\x85\xac\x29\xc3\x49\xac\xa6\xe7\x68\x35\xea\x17\x2d\x56\xd2\x42\x10\x6c\xaf\xce\x47\x52\xcc\xf8\xfc\x2d\xcd\xbe\x61\xab\x6b\x36\xeb\x18\x0d\x81\x4c\xd4\xea\xb4\xc0\xc0\x0c\x39\xc4\x01\x77\x33\x9d\x7b\xf4\xe5\xb7\x31\x9a\x74\xb3\x79\xb4\xb6\x74\xac\x95\xb4\x40\xa6\x6f\xd9\x77\x8f\xc5\x79\xca\x6b\x37\x45\x6f\x9c\xdc\x71\x48\xda\xed\x39\xd5\x13\xf2\x56\x42\x48\xce\x4c\xbe\x20\x0b\xad\x33\xf5\xe2\xec\xec\xb6\x98\xb2\x5c\x30\xcd\xd4\x84\xcb\xb3\x58\x46\xea\x2c\x92\x22\x62\x99\x56\x67\x72\x69\x28\x1f\xbb\x3b\xbb\x93\xf9\x2d\x17\xf3\xb1\x91\x74\xc6\xb8\xab\xea\x0c\x84\xa9\xb3\x5f\xa3\xc4\xfe\xe1\xfd\xc5\xfb\x17\xe4\x3c\x8e\x6d\xc5\x9e\x42\xb1\x59\x91\xd8\xea\x1d\x13\x42\x33\xfe\x1d\xcb\x8d\x52\x36\x22\xb7\x5c\xc4\x23\x52\xf0\xf8\xaf\xdb\x0f\xf7\x9e\x10\x93\x19\xea\x46\x7b\x40\xed\x06\x04\xc5\x55\x85\x4e\x79\xa4\x37\x14\x8a\x6b\x05\x7b\xee\x0c\x07\x96\xa1\x74\x58\xc6\x54\xca\x84\x51\xb1\xe3\x0d\x00\x5b\xf7\x33\x7b\x5c\x1e\x5a\xd4\x72\x2c\x02\x64\x32\x7e\x41\x54\x91\x65\x32\xd7\x8a\xa4\x4c\xd3\x98\x6a\x3a\x31\x3b\x37\xaa\xfe\x09\xc2\xf1\x88\xfc\xcd\xdf\x04\x09\x57\xfd\x70\x7c\xfc\xe7\x6f\x5e\xfd\x9f\xbf\x1c\x1f\xff\xf8\xb7\xf0\x57\x20\x7b\x68\xea\xaa\x3e\x62\x44\xee\x89\x11\x77\xdf\xc1\x37\xe0\x4f\xcb\x46\xcf\xa3\x48\x16\x42\xdb\x1f\x34\xd5\x85\x9a\x2c\xa4\xd2\x97\x57\xfe\xcf\x4c\xc6\xf5\xbf\xd4\x0e\x4e\x40\xee\x97\xe8\x00\x38\xaf\xa8\x5e\xf4\x4c\x7a\xca\x73\xb1\x07\xba\xda\x37\xc3\x0a\x49\x29\x85\x7f\xbe\x76\xd3\x35\x1c\xe8\x2e\xe7\x5a\x33\x01\x72\x07\xc4\xdd\xc9\xd9\xc8\x60\x6e\xc9\x66\x97\xcf\x3b\xa9\xa3\xad\x8f\xa2\x87\xda\x1e\x8b\x83\xd9\xdb\x95\x21\x32\x7b\x42\xbb\xae\xd7\x9d\x5f\x5d\x92\x25\x42\xa3\xf7\x85\xb8\x28\xac\xd7\x07\x9f\x49\x5f\xa9\xca\x2e\xcb\x4b\x9a\x2f\xd0\xb2\xe4\xe3\xbd\x48\xc2\x53\x6e\x0d\xc0\xb6\xaa\x95\x22\x27\x78\x73\x12\x65\xc5\xc8\x3e\x30\x49\x59\x2a\xf3\x95\xff\x93\x65\x0b\x96\x1a\x89\x6d\xac\xb4\xcc\xe9\x9c\x8d\xfc\xeb\xf8\x9a\xff\x0b\x5f\xac\x7c\x60\xfd\x6d\x14\xa9\xa3\x22\x37\xcc\x23\x59\x39\x0a\xc2\xe2\xc7\x3d\x8b\x0e\x4c\x3d\x1f\x45\xbf\x1b\xef\xf6\x64\xb9\x5e\x5b\x44\xa6\xed\x57\x05\x32\xe4\x52\x26\x45\xca\xd4\xc8\xb3\x27\x94\xd6\xc5\xd2\x48\x93\xea\x5e\x18\x61\xcc\x97\x5c\xed\xe5\x9f\xbe\xf1\x96\x3a\x30\x91\x15\xda\x68\x2a\x18\x0c\x1e\x54\x84\x93\x0a\x74\x00\x1f\xa3\x58\x21\x29\xcf\x8f\xda\x79\x5f\xa9\xd6\x2c\x17\x2f\xc8\xff\x3d\xf9\xf8\xdb\x7f\x8d\x4f\xff\x7a\x72\xf2\xc3\xb3\xf1\x7f\xfe\xf8\xdb\x93\x8f\x13\xf8\xc7\x17\xa7\x7f\x3d\xfd\x97\xfb\xe3\xb7\xa7\xa7\x27\x27\x3f\x7c\xf3\xf6\xeb\x0f\x57\xaf\x7e\xe4\xa7\xff\xfa\x41\x14\xe9\x2d\xfe\xf5\xaf\x93\x1f\xd8\xab\x1f\x5b\x0e\x72\x7a\xfa\xd7\xdf\xb4\x9a\x1e\x15\xab\xf7\x2d\x0e\x3c\x5e\xe3\x3d\x22\xec\xcb\xb7\x3a\x18\xe8\x3f\x8d\x4b\xa1\x6d\xcc\x85\x1e\xcb\x7c\x8c\xaf\xbf\x20\x3a\x2f\x76\x1f\x8c\x92\xa8\xed\x83\xe7\xae\x1c\xd8\x8b\x92\xa0\x79\xd2\xdc\x3b\x22\x2b\x16\xe5\x4c\xf7\xa5\xc1\xe0\x68\x8e\x7f\xd4\x4c\xb2\x83\x52\x53\x2a\x35\xde\x2e\x09\xf0\x2a\x39\xef\x2c\x97\xe9\x84\x04\x66\xa1\x25\x78\x32\xed\x73\xb7\x6c\x87\x96\xeb\xae\x41\x09\xfa\xbc\x94\xa0\x1b\xdc\xdf\x7b\xd7\x80\x98\x58\x6e\x33\xd3\xd4\x6d\xba\xaf\x21\x95\x25\x34\x47\x3b\x01\x4a\x4b\x92\xc9\xac\x48\xa8\xde\x60\xb6\x6b\xb0\x4d\x5b\xdc\x2f\xbd\x00\x66\xa3\xc1\x0e\x6c\xa9\x5c\xda\x6c\x0c\x25\xe7\x49\x42\xb8\xc0\x93\x00\x03\x38\x6b\x5e\xce\x50\x5e\x22\x14\x0d\xce\x4b\x33\x85\x3b\x9b\x70\x13\x18\x1a\xb9\x32\xba\x4e\xae\xc1\xe2\x0f\x09\x39\x48\xb3\xac\x69\x8c\x8b\x32\x2d\xc7\x73\x5b\xef\xa5\x6c\xac\xbf\x98\x50\xa5\xdd\xb4\x61\x36\x9a\xde\x82\x29\x34\x62\x31\x13\x11\x83\x10\x84\x82\x95\x6b\x9d\x1a\x61\x10\xcc\xfb\x30\x06\x25\x71\x91\x25\x3c\x32\xf0\x33\x33\x69\x1e\xe3\x32\x4d\x0b\x0d\x86\xe2\x87\xb2\xe2\x9b\x1d\xbf\x71\xe5\x5e\xbd\x31\x1f\x48\x95\x17\xad\x7d\xb4\x85\x57\xdd\xd5\x61\xe6\xfb\x76\x84\xd7\x9b\xdb\x76\x72\xaa\x35\x8a\x5b\xda\x18\xaa\x94\xf6\xa1\x2d\x86\xed\xe8\xec\xcf\x92\xc6\x76\xa0\xaf\xed\x69\x6b\x07\xe3\x52\x57\x7a\xda\xd6\x9a\x94\xe5\x6c\xc6\x3f\x75\xc0\xc7\x73\x51\xaa\x28\x3c\x66\x42\x1b\x45\x00\x2a\x53\x67\x39\xcb\x98\x88\x7d\xba\x1f\x04\x78\x89\xea\x3a\xee\xd5\x63\x84\x52\x46\xf7\xe3\x75\xd3\x24\xc5\x0c\x67\xeb\x67\x7e\xb6\xec\xae\xf7\x7f\xb0\x84\x8c\x77\x06\x7f\xd7\xf6\x31\x78\xa3\x16\xe9\x6a\xcb\x7f\xdb\x49\x1a\xed\xcd\xbb\x9c\x32\x19\x63\x8d\x6b\x5d\x06\x21\x4c\xc8\x4d\xc3\x9b\x10\x6b\x60\x9f\x38\x3e\x56\x18\x96\xa0\xea\x03\xd5\xb2\x9b\x31\x32\x01\x07\xed\x88\x52\xc8\xea\x8a\x1c\x2c\xbf\x67\x54\x29\x3e\x17\xe3\x4c\xc6\x50\x97\xfb\x6c\x13\x42\xb4\x38\x54\xdd\x22\x9b\x76\xe2\x95\x37\x4e\xb4\xdb\xa6\x6b\x6f\x7f\x0b\x64\x0b\x57\x11\x3e\x0f\x7e\xb4\x76\x1d\x17\x47\x1f\xc8\x90\xa5\x44\x74\x18\x4c\x53\x2a\xe8\x9c\x8d\xed\xc7\xc7\xfe\xe3\x63\xff\xad\x43\xc0\xdc\x86\x6a\xa1\x49\xb1\x75\x5b\x88\xe3\x37\x68\xb2\x8c\x7d\x7b\x08\x8c\xdf\xfb\xc4\xd3\x22\x25\x34\x95\x05\x86\xe8\xad\x83\xd3\x05\xb2\xf4\x02\xb0\x06\x40\xa9\x8d\x90\x6a\x09\x2d\xb2\x57\xc8\xdd\x13\xb5\x6c\xb5\xb2\x68\x75\xb3\x64\x75\xb0\x60\xed\x6d\xb9\x72\x46\xea\xf6\xf8\x78\xed\xec\xe6\x35\x8c\xe4\x62\x27\x46\xe6\xbe\xde\xfd\xe5\x8c\xf8\x71\xb8\x22\x32\xe5\x5a\x5b\x83\x2e\x2d\x8f\xfd\x88\x70\x5d\xb1\x7e\xda\xb3\x00\xfd\x1e\xb0\x45\x06\xfb\x64\xb4\x29\x0e\x56\x74\xe7\xb5\x18\x21\x97\xbd\xe3\x58\x1d\x82\x0a\xc2\xd3\x0c\x83\x59\x01\xa7\xc7\x4e\x37\xb3\x41\x06\xc3\xf9\x18\xce\x47\xd3\x4b\xaa\x8b\x2c\x12\x8a\x21\x65\x04\xa3\x17\x47\x0c\x66\xbb\xc6\x33\x10\xa1\x89\x38\x64\xce\x02\x04\xd1\x73\x31\x27\xd7\x0c\x2c\x03\x37\x4c\x2b\x1b\x13\x09\x6f\xd0\x9c\xad\xa7\x98\x39\x4b\x88\x0f\xb5\xa5\xb3\x59\xf5\x89\x98\x65\x89\x5c\xa5\x20\xd9\x5e\xea\x50\x9e\xf1\xa2\x0b\x4b\xb3\x84\x6a\xe6\x05\x9b\xed\xd6\x86\x83\x39\x5f\x97\xfc\xae\xc7\xcd\xe8\x6a\x17\x1d\xdc\x22\x26\xf8\xe9\xe7\x69\xb5\xd6\xc8\xda\xda\xdd\xdb\xd8\xdc\x5b\xe6\x5b\xb5\x57\x02\x5b\x19\xe5\xef\x3b\x8b\xaa\x93\x3a\xd6\x36\x53\xea\xe9\xe7\x46\x75\x58\x76\xdb\xfc\xa7\x21\xe3\x69\x1b\xa8\xdb\x65\x2d\xb4\xce\x58\x68\xb5\x7f\x2d\x33\x97\x86\x5c\xa5\x0e\xfc\xe5\x1e\x84\xbf\x9d\x7b\xa9\x65\xc2\x50\x72\x6d\xa7\xbb\x7f\x28\x9f\xf7\xfd\xcf\xd0\xbd\x1b\x8c\xf4\x30\x5e\x8a\x0f\x4e\x6c\x31\x67\xab\x9c\x17\xa0\x96\xd6\x14\x9a\x9d\x69\xe9\xe6\x65\x36\x4e\xac\x88\xd9\x33\x6d\x3b\xdf\x05\xad\xe0\x74\x0e\x4e\x9f\x3f\x7b\x6c\x1b\x31\x90\x9f\xfe\x12\xc4\xb7\xfb\xfc\x17\x8f\x21\x7f\x76\xff\xfa\xcb\x81\x79\x0b\xed\x18\x1b\x4e\xa9\x83\x80\xf1\x0a\x5e\x20\x5c\xc4\xe0\x60\xb2\x4b\x05\x08\xe0\x58\x06\x3e\xb0\x2c\x97\xff\x82\x89\x54\xd6\xcc\x05\x9e\xa8\xf2\x61\x65\x5d\x66\x81\x5e\x65\x4d\x0a\xe5\xc9\x60\xe4\x9d\xb4\x45\x09\xd9\x88\x5c\x81\x2d\xb5\xbc\x03\x27\xe9\x9d\xc4\xf2\x84\x1b\x7d\x59\x21\xdc\x76\x72\x91\x9d\x8c\xbe\x02\x90\x6f\x4a\x26\x8f\x2b\xab\x30\xf9\x12\x83\x2b\x99\x70\xdb\x20\x73\xcb\x56\x25\xb3\xb1\x22\x04\x90\xfc\x51\x89\x25\x8e\x15\x20\xef\xf8\x7f\x9c\x29\x2b\x9d\x72\x81\x1f\xc3\xa1\xdd\x56\xc0\xe8\x0e\xa0\x46\xb2\x4b\x12\xfc\x4c\x1f\xe0\x6a\x27\x67\x54\x60\xf6\xbe\x83\x8c\xe1\xa9\x64\xb3\x74\x11\x88\x14\xaf\x7e\x2a\x68\x52\x4d\x42\xb0\xb7\xec\x43\x6b\x54\xfd\x8e\x27\x71\x44\x73\x1b\xe5\x05\x67\x94\x28\x89\xbb\x87\x55\xf1\x22\x2a\xfc\x69\x2f\xf7\x08\xfb\x20\x92\x8c\xe6\x9a\x47\x45\x42\x73\x62\xce\xc2\x5c\xe6\xad\x12\x05\x76\x42\xb4\x44\x9a\x1b\x16\x49\x11\x77\x51\x00\x3e\xd4\xdf\xad\xfb\x5a\x33\x96\x73\x5b\xee\x8f\xa7\xac\x8e\xa4\x27\x55\x9b\xb6\x9c\xb9\x53\xed\x8f\x58\xc5\xf2\x51\xe6\x64\x72\x45\x38\xd6\x0b\x3d\x0d\xc8\xa3\x3f\x15\x13\xf2\xd5\xca\x99\x59\xc0\xe4\x62\xb3\x2b\x14\xd3\x2e\x11\xc6\xa1\xac\x05\x76\x79\xa0\x66\x32\x87\xe4\x94\x93\x58\x62\x46\xc6\x92\x47\xfa\x74\x42\xfe\x3f\x96\x4b\xcc\xe0\x64\x73\xac\xde\x68\x51\xdc\x2b\xae\xd0\xb8\x14\x3c\xf8\xcf\xc8\x09\x56\xd2\xe4\x69\xca\x62\x4e\x35\x4b\x56\xa7\xa8\xc7\xba\x5a\x9c\x6d\xb6\xae\x8d\xd1\x20\x28\xbc\xfa\x87\xdf\x6f\x79\xb2\x6b\x0e\xd5\x77\x2e\x2b\xa5\x84\x0c\xc6\x10\xd4\xb6\xd0\xf3\x20\xb9\x45\xdc\x0c\x63\x10\xca\xa4\x4e\x47\x66\xfc\x06\xff\xdd\xe0\x01\x25\x39\x9b\x03\x96\x23\xe6\x1e\x88\xe3\x18\x4d\xf9\x56\x16\x62\xb3\x49\xb0\xb2\xf0\x37\x56\x09\xff\x2e\x78\x71\x63\x96\xe2\x83\x88\x09\xc1\x4c\x02\x13\x25\x25\x60\x97\x04\x76\x6e\xc8\x03\x3e\x55\x46\xa2\xec\x9c\x64\xaf\x19\x89\x30\x97\x1d\x51\xef\xbd\xe4\x2d\xfa\x0f\x75\xc0\x65\x08\x10\xb7\x80\xa9\xe5\xed\x69\x4b\x0e\x00\x3f\x11\x82\x25\x82\xc2\xb7\x58\xec\xa2\xd8\x30\xd7\x18\x5e\x25\xc7\x2f\x8e\x7b\x21\xbe\xb8\x9c\x5c\x66\x74\x4e\x77\xd7\x3b\xae\x2a\x23\xb5\x57\x49\xcc\x34\xcb\x53\x28\x4c\xbb\x90\x77\xf8\x3b\xb2\xad\xcc\x3e\xc5\x6c\x4d\x5f\xb3\xda\x85\x54\xc0\x95\xaa\x49\x8c\x70\x7e\xc1\x31\x7a\x47\x57\x84\xe6\xb2\x10\xb1\x95\x9a\x3c\x01\x7d\x5b\xfb\xf0\x3b\x29\x80\x52\x14\xca\xc0\xea\x43\x85\x4a\x4f\x99\xa6\xe6\xd8\x3c\x9f\x3c\xdf\x51\x7b\xba\x25\xc0\x3a\xe6\xad\xc2\x6c\x6a\x96\x42\xe7\x2b\x77\x67\xa6\x97\x79\xe5\x8c\xc6\xef\x45\xd2\x45\x96\x7b\x8b\xe8\x05\xaf\x8e\x41\x09\xe3\x33\xb0\xdd\x8e\xf0\xd6\x5d\xce\x35\x0b\xc8\xe3\xc9\x8c\x26\x0a\x1a\x6e\x17\xc2\x8b\xb0\xa7\x55\x11\x04\x1e\x69\xb3\xa0\xdd\xf1\x20\xaa\x98\x1e\x78\xce\xec\x81\x02\x94\x2b\x8f\x99\x47\xb8\x63\xb5\xe5\xc8\x55\x93\x3b\xc9\x09\x3e\x69\x24\x36\x29\xf5\xd6\xf6\xee\xed\x83\x44\x70\x81\x46\xb3\xee\xa2\x92\xb8\xbc\xe1\xac\xc7\xd5\x7e\xc5\x16\x74\xc9\x14\x51\x3c\xe5\x09\xcd\x13\xc8\x15\xbc\xc1\xf9\x41\x33\xf6\xc6\x0c\xf4\x6e\xd9\xcd\xe1\x4c\x82\xe1\x76\x82\xda\xcd\xc3\xc0\x09\x68\x84\x9b\x17\x16\x01\x77\x95\xc3\x3f\x45\x49\xa1\xf8\xf2\xd0\xd3\x64\xb3\x1f\xf6\x60\xd5\x75\x2e\x9d\xc9\xf8\x26\x63\xd1\x43\xf2\xe8\xaa\x86\x61\x48\x55\xec\x36\x1d\x78\x32\x2a\xfb\x14\x1b\xeb\x4f\x19\xa1\x51\xc4\x94\x72\x31\x95\xab\x30\xce\xd3\xaf\xe1\x73\x29\x28\x40\xef\xd4\xab\x84\x2a\xcd\xa3\xaf\x12\x19\xdd\xde\x68\x99\x77\xca\xd9\x6f\x7a\xbf\x56\x86\xe1\xfc\xfb\x1b\x72\xc1\xd5\x6d\x90\x4d\x60\x9d\xa6\xa1\xb9\x84\x92\xdb\x62\xca\x12\xa6\x8f\x8f\x15\x72\xb9\x94\x46\x0b\x2e\x98\x63\x70\xc2\xa7\xa4\x58\x85\xcf\x40\xb9\xab\xcf\xd4\x26\x3e\x9d\x59\x7c\xfd\x35\xbd\x53\x0c\xa7\x3f\x35\xd3\x37\x3f\xb3\x36\x19\xe9\xbd\xfa\x29\x70\x32\x97\x17\x3d\xf9\x20\x66\xea\x83\x99\x63\x37\xe3\xf6\x31\xbe\xe5\x54\x87\x19\x4f\x98\xed\x3e\x60\x16\xec\x62\xd4\xec\xa9\x80\xfd\x5b\xc9\x82\xdc\x51\xd4\x91\x81\x22\x4e\xc8\x07\x9e\xbd\x20\xaf\x84\x2a\x72\x56\x5a\x37\xea\x43\x71\x55\xe6\x99\x39\xe5\x0a\xf6\x1b\x15\x10\x43\xf7\xac\xae\x45\x5e\x7d\xa2\x69\x96\x30\xf5\x82\x1c\xb1\x4f\xfa\xf7\x47\x23\x72\xf4\x69\xa6\xcc\xff\x84\x9e\xa9\xa3\x09\xb9\x4c\xbd\xd7\x9d\x8b\x19\xcb\x73\xe6\x02\xa1\xf0\x05\xc3\x9a\x03\xae\x7b\x2f\xe8\x62\x83\xea\x8c\xec\x16\x4b\x72\x87\xf5\x28\x0c\xc1\x67\x79\x2e\x73\x1f\x87\x1e\x80\x01\x78\x4d\x24\xd3\x2c\x97\x29\x0f\xcc\x7c\x80\xee\xbd\x46\xdb\x81\xf1\xa1\x4d\x43\x8e\x3a\x36\xf8\x17\x1d\x42\x04\x37\x44\x1b\x54\xb8\x9c\xb9\x60\x0a\xd4\x22\xad\x5a\x0f\xc3\xd9\x87\xcc\xe6\xdb\x51\x0c\x21\x0b\xb7\xfb\xb5\x4f\xa8\x23\x67\x31\x5b\x9e\xa9\x98\x3e\x1f\xc1\x67\x94\x0d\x04\xac\xce\x89\x2a\x72\xf4\xfc\x68\x42\x6e\x1c\x23\x1e\x85\x73\x2c\x9f\x9b\xc9\xdc\x0f\x08\x76\xf6\x67\x47\xe4\x44\xe6\x30\x72\x44\x05\x49\x18\x5d\x5a\xdb\x32\x1e\xb7\x15\xaa\xbb\xa7\xad\x13\x22\xdb\xe6\x86\xb5\xef\xbc\xd2\x56\x48\x5d\xdf\x44\xf7\x9e\x33\x01\xe4\x85\xcd\x15\x98\xc9\xdc\xd6\x01\xf1\x8f\x28\xa6\xe1\xe8\x71\x51\x51\xa1\x1f\x81\xc0\x92\x8e\xa9\xf4\x8e\x7a\x76\x85\x8e\x7b\x0f\x74\x20\xc1\x7f\x2a\x18\xb9\xbc\xf0\x09\xf5\x2c\x57\x5c\x69\x73\x8c\xe3\x0a\xeb\xe2\xc8\xcf\x4e\xce\x53\xfa\x0f\x29\xc8\xab\xaf\x6e\xec\x04\x4e\x1f\x15\x54\x3b\xa9\x01\xfd\x47\x91\x33\xc3\x85\x3b\x30\x77\xff\x4e\x9d\xa1\x9b\xfb\xe4\x82\x6a\x8a\x7c\xdd\x46\x5a\x89\x92\x94\x1b\x96\x3d\xe5\x22\xb6\x3f\x05\x0c\xfb\xa1\x79\xab\xd9\xbd\x77\xdb\xc4\xa4\xf0\xc1\x6f\xaf\x2f\x7b\xe2\xc1\x11\x10\xf3\xf9\x5b\x19\x77\x66\xc4\xc1\xab\x8e\xf8\xfe\xb7\x81\xe9\x4b\xbc\x4f\x52\x33\x26\x31\xda\xfb\x88\x5c\x33\x1a\x13\x73\x7e\xed\x3f\xbf\x37\xba\x67\x6b\x5a\xd5\x8a\x85\x38\x00\x76\x5c\x86\x7b\xcd\x2d\x21\x8c\x74\x8f\x0d\xe6\xc0\xb1\xb2\xbc\x64\x9a\xc8\x29\xb1\xc7\xa1\xef\xb9\x7f\x7b\x7d\xb9\xc7\xd4\xbf\xbd\xbe\x74\x33\x37\xff\x94\xb3\x87\x9b\xf4\x5e\xe2\x5b\x29\xbd\xbd\xae\x89\x5b\x25\x4b\x2e\x13\x37\xea\x22\x59\x7b\x79\x6c\xd2\x97\x24\xd6\x27\xc4\x6e\xb9\x68\x91\x85\x5b\x3d\x65\xe6\x1d\xa3\x50\x60\xac\x5a\xe0\x47\xbc\x59\x50\x48\x7d\xf6\x09\x79\xb0\xcf\x66\xe3\x95\xe1\x0a\x6e\xc7\x8d\x12\x08\xb4\x8d\x5c\x30\xf4\x72\xc6\x2f\x5c\xec\x80\x7f\xa3\xf9\x85\xb7\x10\xa9\x19\x5b\xfa\x4a\x30\x70\x33\x0e\x10\xec\x04\xad\x4a\xc2\xff\x44\x97\x94\x27\x74\xca\x13\x0e\xa5\xd4\x8d\x76\x1f\x46\xa3\x2a\x98\x72\xaf\xa7\x7e\x4f\x91\xc3\x8b\x13\x6b\xc6\x2d\x72\x62\x7e\x3b\x03\xe3\xd8\xe9\x04\xa8\x15\x3c\x08\x35\x1a\x6b\x42\xc9\xf5\x2e\xa1\xa4\x37\xf9\x01\x76\xc0\x9c\x98\xae\x5c\xd1\xbc\xd3\xc8\x15\xe1\x87\x1b\x5b\x4f\xee\x29\x33\x46\xcc\xb5\x6a\xc5\x1a\x01\xbf\x76\x3e\xd9\x9e\x39\x1e\x8a\x5c\xf1\xe7\x81\x5c\xc4\x67\xb4\xed\xc1\x3f\xcb\x17\x1d\x1f\x02\x25\x09\x22\xce\x6c\xb6\x5b\x25\x34\x13\xb1\xef\xc6\xd2\x1a\x5b\x82\x09\xb9\xae\xc1\xb9\x36\x7d\xd1\xba\x14\x6d\x70\x18\xd1\x75\x55\xee\x3d\xb7\x28\x24\x81\x70\x9b\xb4\xc0\xc5\xd6\x93\x8c\x58\xb6\x98\x75\x71\x89\x9b\x17\x5e\xdf\x54\x2d\x81\x2f\x59\xb6\x20\xaf\x6f\x1a\x8e\x31\xc0\x1e\x66\xad\xd0\x3e\x78\xac\x48\xc2\x67\x4c\xf3\x1d\x4b\xb8\x87\x83\x9c\x4a\xc1\xb5\xcc\x37\xa7\x40\x93\x4e\x87\xd3\x0d\xd7\x95\xa1\xba\xf7\xcc\xce\x96\x05\x44\xde\x06\x77\x29\x89\x64\x92\xb0\x48\xdb\x92\x56\x00\x5e\xff\x5a\x83\xf2\xc4\xac\x3d\x60\x72\xfb\x27\x50\x9f\xac\xa2\x74\x86\x9b\x7b\x76\xfd\xea\xfc\xe2\xed\xab\x49\x1a\xff\x7a\x21\xef\xc6\x5a\x8e\x0b\xc5\xc6\xbc\x45\x85\x92\xc7\x8b\x5e\xc4\x2b\x6b\x55\x30\xab\x6e\x90\xc1\x5a\x5f\xef\x5d\xfe\x24\xf9\x56\x61\xd4\x02\xd8\x8e\x9c\x4f\x4a\x4a\x3d\x22\x39\xb5\x39\x92\xd4\x9a\x9e\x8a\x24\x41\x68\xeb\x9c\xb1\x51\x68\x8b\xd9\x9a\x1a\xd2\x79\x61\x07\x1b\x2a\x2a\x0b\xbc\x5f\x19\xe2\xe1\x11\xae\x0b\xc7\xd8\x2d\x93\xac\x43\xb1\x7c\xb3\x0a\xc7\x9b\xca\x7d\x34\x9c\xe9\x85\x81\xea\x2d\x5b\x11\x08\x04\x9e\xc9\xdc\xe0\x53\x5e\xc5\x0d\xa6\x23\x58\xfa\x59\xa1\x58\x3e\xb1\x6c\xe7\xc1\xc1\xd6\xa1\x8a\xd0\x1e\xc5\xdb\xfc\x8b\x4d\x30\xb3\xb7\xcb\xca\xbe\x56\x5e\xa3\x85\x5e\x30\xa1\x8d\xd8\x6f\x68\x99\x85\x4c\x23\x10\x6d\x1c\xf6\x83\x43\xad\x65\x11\xa3\x6e\x25\x87\x86\x32\x3d\x5d\x70\xd2\x9c\x9a\xae\xe8\x68\xde\x81\x44\xc4\x90\xcc\xfb\x5c\xae\x9c\xc6\x12\x02\x36\xb0\x02\x5d\x05\xd1\x68\x9c\x72\xf1\x04\x4f\x67\xc4\x45\xbc\x0b\x0e\x35\x03\x18\xbc\x51\x15\xc5\xec\x3d\x6b\xd0\xf7\x7e\x43\xea\x34\x29\x4c\x78\xb7\x1e\xc4\xaa\xff\xb0\xd5\xe1\x4b\x57\xea\xa7\x64\x8c\x5f\x19\x67\x71\x09\x95\xc1\x19\xb8\xee\xc1\xeb\xd7\xa4\xf4\x00\x2e\xbe\x9e\x76\x9b\x3c\xb0\x34\x74\xbf\x7a\xee\x83\x00\xaa\x8b\xcc\x73\x28\xf7\x2e\x69\x26\x34\xde\x57\x2e\xf9\x0c\x2b\x9b\xc1\x19\x75\xfa\x32\x34\xe4\xa7\x39\x4d\x99\x66\x39\x86\xc0\xd9\xa0\x3a\x61\xb3\x13\xde\x67\x4c\xdc\x68\x1a\xdd\xf6\x5d\x0a\x75\xe0\xb8\xf7\xc7\x71\x0f\x76\x05\x3a\x44\xb0\x75\x91\x56\xa1\x17\x99\x0b\xcb\x85\x9e\x08\x89\xf1\xe5\xc8\xba\x58\x39\x7c\x39\xaa\x2a\x77\x2d\xcb\x93\xa1\x61\x03\x22\xdd\x7c\x7d\x3d\x88\xe0\x47\x28\xf4\xc3\x0d\xdb\x9f\x01\x4b\x02\xf7\xf1\xa3\x05\xaf\x56\xa9\x43\x6a\xee\x4c\xb9\x2e\xcf\xbd\x62\x9a\x64\x2c\x4f\xb9\x4d\xeb\x96\x82\x44\x36\x2d\x00\xf8\x9a\xe1\x61\x76\xb8\x80\xe7\x09\x22\x23\x4d\x6d\xce\x0c\x99\x32\x7d\xc7\x98\x20\xcf\x9e\x3d\x7b\x06\x72\xc9\xb3\x3f\xfe\xf1\x8f\x04\xea\x48\xc4\x2c\xe2\xe9\xfa\x83\xf0\xd4\x7f\x3c\x7f\x3e\x21\xff\xe7\xfc\xed\x1b\x88\x2a\xcb\xb4\x22\x53\xa9\x17\x76\x64\xf3\x40\xe5\x65\x35\x22\xff\x73\xf3\xfe\x9d\x13\x27\x54\xed\x57\x50\x41\xfc\xf2\xaa\x21\x82\xcf\xfe\xf0\xfb\xdf\x4f\xc8\x05\xcf\x21\x9f\x98\x43\x06\x84\x0f\x82\xcc\x5c\x60\x20\x34\x1e\xaa\x67\xf0\x5b\x0e\x62\x83\x84\x53\x3e\x5f\x00\x00\xcc\x81\x90\x62\x96\xf0\x48\x63\x4d\x41\x3c\xfa\x08\x68\xdb\x17\x89\xda\x74\x2f\x2b\x45\xc0\xe4\x46\x24\xe1\xb7\x8c\xcc\xd4\xd7\xb9\x2c\xb2\x32\xcd\x31\x67\xca\xc8\xb2\x11\x15\x90\x55\x02\x83\x95\x7b\xa5\x98\x7e\xd4\x20\x8c\x96\x86\xa0\x0a\x0e\xc2\x3b\x35\x01\x65\xe4\x6b\xab\x8d\x11\x1f\x32\xca\x7d\xe0\x20\xf8\xd4\x2b\x95\xfd\xbd\xee\x19\x07\xb5\xe4\x5c\xee\x4a\x96\xcb\xbf\xe3\x56\x71\xe1\xb2\xa0\xac\x84\xac\xac\x4c\x66\x93\x4e\x45\x60\x73\x75\x59\xf9\x86\x17\xda\x8c\xff\x20\x7f\xea\x72\x16\x26\xda\x41\x5a\x3a\xb6\x57\xab\x14\xbe\x6c\xf8\x72\x59\xac\xdd\x60\x93\xc2\x7d\x2d\xc4\xda\xdb\xb6\x8f\x8a\x25\x3f\xb6\xbb\x8e\x4d\x61\x2b\xc7\xc0\x50\x5c\x9b\x00\x14\xf4\x6c\xaa\x14\xa3\xab\x44\xf9\x28\xa6\x0b\x0b\x1a\x88\xbc\x32\xdf\x66\x4a\xd9\x3c\xa2\x94\xe6\xb7\x46\x49\xb0\x54\x60\x02\x51\xcf\xca\xe7\x30\x61\x42\xd9\x12\x8d\xe5\x29\x5d\x55\xb2\x06\xcc\x47\x8e\x27\x93\x63\x3c\x26\x32\xc7\x5a\x9e\x88\xf3\xe6\xfe\x23\xe5\x4b\x57\xa3\xd2\x69\x86\x6d\xf7\xc0\x9e\x63\xdb\x96\xd0\x4a\xb4\x33\xb5\x90\x6a\x53\xc1\xb7\x63\xdb\xc2\x6e\xfd\x71\xdb\xf7\xc5\x1d\xc3\x02\x5a\x3c\xda\xb5\x07\x6e\x87\xde\xb7\x9b\xaa\x35\x58\x18\xdb\x93\xd0\xb6\x23\x64\xe7\x5a\xe0\x69\x2b\xd6\xd7\x30\xd5\xe3\xd4\x72\xbe\xf7\xdd\x38\x9f\xcd\xd7\xab\x34\x07\x7b\xfa\xac\xee\x72\x86\x99\x2e\x55\xd2\x65\x49\x43\x28\x0a\xf8\x46\x5c\x65\xda\xcb\x93\xe6\x68\x21\xda\x74\x2b\x3c\xdf\x85\xbb\xe1\xd5\xce\x31\x81\x57\x05\xd7\x9c\x77\x02\x17\x6d\x49\x69\x56\x69\xf0\x91\xa0\xdd\x00\x64\x4c\x77\x78\x26\xe4\xad\x25\xb5\x88\x64\x74\xaa\x64\x52\x68\x7c\xb5\xfc\x31\xa4\xc3\x30\xa8\xab\xb2\x00\xc4\xd7\x3f\x16\x50\x65\x5d\xb6\x38\x6b\x47\xa0\xf1\xea\x70\x38\x87\x6a\x9f\xf7\x58\xed\xd3\xd7\xa7\x55\x2d\xfb\x35\xa9\x7b\x2b\xaf\x1b\x29\xde\x45\xbf\x52\x9c\x9c\x94\x6d\x42\x9c\x3b\xfe\x52\x68\x96\xcf\x68\xc4\x4e\x43\xbd\xcb\xb7\x63\xf1\x21\x42\x2e\x2f\x62\x41\x45\x9c\xa0\x00\x1e\xb1\x1c\x70\x9f\x7d\xd2\x2c\x37\x20\x79\x79\x73\x49\xe2\x9c\x2f\x59\xae\xc8\xc9\x57\xcc\xc8\x8b\x8c\xea\x22\x67\xad\xb2\xab\xfa\x8d\xad\x84\x69\xf4\xa5\xe9\xc1\x60\x5d\x43\xf5\xe0\x25\x47\x79\x44\x70\xbe\x4a\x30\x21\x54\x11\xa4\x2a\xd4\x65\x27\x06\x95\x80\x40\x03\xcd\x58\xc9\x22\xb7\x56\x74\x57\x57\x35\x92\xb9\x51\x97\x70\x60\xaa\x48\xce\xe6\x46\x9a\xcd\x5d\xb3\x61\x46\xa2\xa4\x30\x37\x7a\x0d\x67\x3b\x24\x00\xb0\x34\xcd\x6e\x8b\xd5\x9b\x59\xa9\x5a\x2e\x79\xec\x58\x25\xf6\x3e\xf6\x5d\x0d\x33\xaa\x82\x54\x9b\xa0\x02\x7d\x00\x58\x94\xd1\x81\xa1\xfa\x24\xd6\x4a\xb0\x7f\x68\x14\x96\x50\xdb\xa2\x45\xfb\x88\x2e\x44\x58\xc6\xec\xaa\x98\x26\x5c\x2d\x6e\xf6\x34\x21\x36\x0d\x81\xc1\x0a\x6b\x5e\xbf\x8d\x96\x44\xc5\x84\xe2\xc0\xf2\x0c\x19\x37\x4c\x97\x1b\x39\x4a\x02\x10\xdd\xdb\x21\x42\x4a\xc8\xfe\x48\x98\xad\x60\x60\x7e\x7a\x57\xce\xc3\x26\xa5\x61\xcd\x92\x98\x7d\x2b\xb2\xca\xfd\x88\x26\x89\xaa\x27\xec\x3a\x8a\x89\xb2\x87\x4b\x54\xc3\x3d\xe5\x66\xbb\x7d\x67\x94\x5a\xf5\xcb\x8d\x0b\x53\x24\x95\x98\xc6\x23\x88\x14\xee\x21\x28\xbd\xe2\x5e\x08\x12\x19\x21\x5d\x19\x50\xa6\xe7\xd6\x91\x83\xb9\xf4\xfe\xcc\xa5\x87\xc6\xe1\x85\xfd\xde\xcb\x6c\xe8\x4a\x59\x52\x4f\x4a\x1d\xc9\xdd\x11\xd4\xd1\xab\x5b\x01\xbf\x79\xae\x75\xce\xa7\x85\xee\x5e\xef\xad\xf6\x3a\xb0\x69\xa3\x88\xc0\x29\x1e\xdb\xd5\x47\x01\x8a\x5a\x0d\xc1\x9f\x85\xf5\xb3\x5f\xf2\x1c\x60\x37\x78\xf3\x58\x91\x58\x46\x85\xaf\x0b\x0b\x40\x2b\x1d\x68\x6d\xaa\x27\x92\xae\xe7\xaa\x7b\x49\xaf\xf0\x23\x3b\xd1\x2b\x96\x77\xe2\x8e\xe6\xf1\xf9\xd5\x8e\xe8\xfb\x2a\x3b\x2f\xdf\x0a\x05\x25\x77\x1b\xba\x00\xd2\xa9\x2c\x74\x59\x3a\xf4\xe7\x63\xaf\x6e\x52\xd3\xb5\x34\xa4\xa1\xa5\x3d\xba\xab\xa2\x3f\x98\xb8\x07\x13\x77\xe5\xda\xc7\xc4\x7d\x89\x26\xee\xb0\x0e\x6e\xe5\xb8\xba\xf2\x0a\x3c\x69\x1b\xdb\x7b\x9f\x56\xd2\x8b\x92\xc0\xa0\x34\x55\x8f\xe3\xaf\x09\x70\x78\x44\xca\xbd\x0d\x84\x3e\x47\x81\x80\x67\x3f\xbe\x45\xf5\x9e\xec\xa4\xed\xfb\x14\xe3\xb5\xa9\x91\xe0\xb6\xbe\xc5\x20\x35\x04\x8d\x86\x47\xb6\x0a\xf4\xc8\xea\x5d\x22\x2e\x5b\xf8\x61\x11\xea\x0e\x6d\x4a\xf1\xea\x08\x7c\xd2\x79\x03\x48\xc7\x26\xc2\x78\x75\xdd\x0d\xb2\x47\x43\x61\xbc\x1e\xb9\xad\x30\x5e\x9d\x6d\xdf\xa4\x7b\x8b\xe1\x86\xe5\xde\x6f\xa3\xe1\x3d\x97\xb6\xbf\x59\x7f\x5f\x73\xfe\xa8\x6c\x6f\xf7\xf4\xd9\xfa\x60\xce\x5f\xbb\x1e\xd0\x9c\x1f\x10\x6e\x47\x0c\x1a\x4c\xfb\xa1\xb9\xcd\xd9\xf7\xa7\xcc\x89\x95\x93\xb2\xfa\x9a\x41\x39\x67\xd9\x97\x79\xd5\xad\x7a\x3c\x99\x1c\x1f\x3b\x7b\xbf\xc5\xcf\x42\xcf\xc6\x7f\x22\x4c\x44\x32\xc6\x4d\x35\xe3\xe7\x4a\x03\xd3\x2f\xd5\xf4\x70\x2e\xa9\xfb\x56\xe8\x9a\x85\xb1\xbb\x6d\x49\x87\x13\xdc\xbd\x6d\x78\x13\xa4\x1f\xa2\x79\x78\xd8\x22\xbc\xda\x11\x1c\x9f\x38\xa4\x0d\x78\x08\xbc\x7b\xe7\xaf\xad\x1b\x83\xe3\xb5\x0f\x7b\xdd\xa3\x49\x38\x5e\x0f\xdc\x2a\x1c\xaf\xbd\x38\x6a\xa7\xb6\xe1\x0d\x8b\x7b\xb8\xe6\xe1\x78\x3d\xd1\x46\x32\xd5\xab\x53\x23\x71\xbc\xf6\x6b\x27\x5e\x7d\xb7\xe3\xd6\xf7\xd2\x5a\x1c\xaf\x6e\x0d\xc6\xf1\xea\xbb\xcd\x38\x5e\x2d\x21\x01\xc6\xf0\x0b\xde\x29\x15\xc1\xbd\x53\x0d\x97\xd4\x2c\xcd\x64\x4e\xf3\x15\x89\xad\xad\x61\xd5\x90\x11\x1a\xa4\x84\x1e\x5c\x1a\x06\xe6\x11\xf3\xbc\xa7\x6c\x84\x0e\xd9\xa0\x2c\xe6\xc5\xc6\x76\xcd\x9b\xc0\x86\x6f\x85\x40\xbb\x83\x6a\x60\xb6\x92\x98\x73\x77\xda\xc7\x5c\x61\x45\x1a\xdd\xda\x8e\x41\x0e\xaa\xc8\xfb\x83\x24\x97\xa3\xa3\x5a\x1d\x68\x30\x8f\x81\xef\xcf\x76\x46\x74\x0f\xe3\xd8\x15\x53\x16\x7a\x43\x6c\x58\xc0\x89\x7d\xf0\xd4\x48\x24\x6f\x81\x0d\x3e\xd0\x2e\x91\x8e\x99\x6d\xfc\x1f\x0c\xda\x8d\x75\x8e\x8d\x77\x2f\xfa\x72\xd0\x12\x24\x73\xdf\x17\x2d\x91\x51\xe0\x7b\xae\x70\x28\xd8\x86\x57\x0e\xf9\x9d\xed\xde\x6c\x86\x19\x15\xe5\x0b\x30\xfa\x24\x0a\xfd\x7a\x3c\x82\xd2\x96\x20\xc5\x03\x30\xfd\x06\x7c\x08\xba\x04\x16\xca\x7c\x09\x2a\xcf\x07\xcf\x94\x1f\xba\x73\x15\x36\x75\xd0\xc8\xad\xaa\x7b\x98\x5f\x6e\xfc\xca\x4a\xbd\x0d\x52\x20\x9c\xa0\xae\x0a\x10\x13\xed\x57\xac\xb8\x24\x67\xe0\xbb\x2a\xdb\xa2\xf9\xe2\x8e\x6b\x68\x26\x78\x52\xc5\x33\x57\xcb\xce\x2f\xbc\x10\x36\xd0\x60\x0d\x69\x9a\x71\xa6\x50\x2c\x1f\xcf\x0b\x1e\xef\x83\x2d\x4f\x98\x01\xb6\x66\x7b\xdd\x99\x5d\x47\x16\x77\x00\x63\xf3\x81\x18\x1d\x58\xc3\x51\x19\xbd\x51\xe1\x0d\x61\x59\xbc\x6a\x24\x07\x75\xc1\x02\xfe\xc8\x39\x97\xd0\x07\xaf\xda\x5a\x9e\x11\xad\x22\x9b\xac\xcb\x2b\xe5\x2e\x71\x58\xc4\x3c\x08\x6c\x1d\x9b\xff\x38\x15\xd8\xd9\xf3\xa7\x6c\x26\xcb\x0e\x29\xa8\x11\xd9\x70\xdc\x98\x25\x0c\xda\xc8\xbb\x16\xf5\xe6\x01\x70\x09\xa7\x72\x69\x90\xf9\xa3\x20\xdf\xba\x9a\xfd\x7c\xf6\x82\xd0\xd3\x4a\x0a\x84\xed\x3a\x23\x18\x8b\x31\x46\x37\x29\xbf\x93\x17\x42\x8d\xc8\xf4\xd4\xc5\xa3\xc0\x89\x13\x46\x2c\x4c\x9c\xc4\x8b\x7a\x75\xce\x0c\x00\x20\xed\x38\x97\x29\x51\x82\x66\x6a\x21\x35\xa8\x86\x34\xa3\x11\xd7\x2b\xa2\x73\x1a\xdd\x42\x8b\xa2\x9c\xd9\xcf\x8d\x48\x74\x6a\x03\xbb\x42\xf0\x55\xc3\x86\xf5\x22\x97\xc5\x7c\x01\x91\xb0\xf8\x54\x94\x50\xe5\x56\xdf\xf8\xbe\xd5\x76\x14\x89\x57\x82\xa6\x3c\xf2\x55\x03\x73\xb9\xe4\x8a\x4b\x6b\xed\x75\xe3\x5e\xf9\xca\x70\x68\x41\x7e\x99\x50\x9e\x92\x13\xc5\x18\x79\xe5\x50\x02\x7f\xb1\x6d\xec\xd1\xb2\x91\x57\x83\x03\xa4\x2f\x69\x2e\x6c\x41\x84\x92\xc0\x79\xe7\x15\x32\x4c\x33\xf3\xc6\x8f\x9e\xfa\xed\x6a\x9e\x93\xcc\xc1\x71\xef\x4a\x77\x32\x11\xcb\xc0\x6b\x79\x7e\x75\xa9\x42\x6d\x04\x71\xcb\xd6\xbd\x83\x1f\x12\x29\xe6\x61\x19\x81\x12\x33\x0d\x29\x15\xd0\xde\x65\xc9\xe3\x82\x26\x48\x44\xed\x64\x5e\xde\x5c\xe2\xeb\x7c\xbe\xd0\xe3\x3b\x06\xd6\x18\xe4\x35\xe5\x99\x71\x1f\xe5\x6b\xd1\x3a\x5c\x01\xd1\xd5\xd6\x9a\x80\x96\x2d\x33\xb5\x3b\xba\x82\xb2\x35\x36\xc4\xa4\xe2\x30\x75\x85\xc5\x70\x88\x26\x88\xc3\xf4\xce\x7d\xbb\x0e\x23\x36\x80\xb9\xca\x80\x18\x30\x75\x7d\x6e\x06\xf0\x41\x1d\x40\x7f\xdb\x76\x66\xa3\x66\x83\x8c\x70\xb7\x5d\x97\xb9\x07\xa1\x6c\x59\x6e\xf2\x07\xdb\x3a\xb1\xa3\x70\x70\xf4\x7d\x60\x36\x0b\x1c\x1d\xe6\xd8\x50\x11\x8f\x69\x62\x30\xe7\xea\xbb\x97\x36\xc2\x19\x0f\x42\xc5\x91\xef\xba\x20\x71\xe1\xcb\x66\x1b\x99\xa1\xf1\x08\x40\x1e\xfc\x94\xc5\x40\x34\xc2\x86\x91\x77\x46\x43\xb6\x9b\x77\xf5\xdd\xcb\x11\xe1\x13\x36\x71\x7f\xf9\x47\x1d\xd5\xd2\x72\x8e\x61\x80\x3e\xc6\x13\xf0\x0e\xa6\x12\x1a\xa3\xc2\x77\xff\xf6\x67\x33\x49\xf3\xeb\x5f\xc6\x7f\x0e\xaa\x8d\xfe\xe5\x6f\x86\x08\xe6\xe6\x81\xea\xdd\x30\x96\xcc\x57\xdd\xff\xdb\x95\xad\x4a\x6d\x6b\x56\xff\xcd\x36\xe3\x62\x42\x1b\xb9\xf1\x4a\x82\x97\x9e\xc7\x88\x8d\xf0\xed\x9c\xfd\xdd\x19\x16\x01\x4c\xde\xa8\x13\x51\xcd\x04\x10\x6a\x97\x94\x21\xa4\xc6\xd7\x6d\xdf\x59\x33\xff\x13\x30\x09\x60\x52\xd9\x88\x68\x29\xe1\x38\xe2\x91\x3f\x17\x84\xb9\x5e\x9d\xb8\x56\x00\x07\xb5\x81\x6a\x8e\xf7\x98\x61\x0d\x84\x7d\x0a\xae\x99\x07\xcc\xed\x0b\x21\xf5\x17\x7e\xfb\x6b\x5d\xc4\xe9\x52\x72\x57\x80\xdc\x9c\x14\x81\x1d\x1d\x7d\x49\xec\xe9\x8a\xa4\x5c\x69\x7a\xcb\x26\xe4\xc6\xf0\x96\xd0\x1b\x86\xd0\x13\x04\x2a\x58\xb2\x98\x14\x42\xf3\x04\x7e\x2d\xc7\x31\x53\x0e\x79\xce\xe5\x8c\xa8\x02\xda\x9b\x67\x39\x1b\x3b\x2e\x66\x9f\x5a\xa3\x05\xe5\x5a\x46\x7e\xb3\x17\x14\x75\x81\x2c\x86\x57\x01\x1e\x54\x58\xf4\x5a\x8b\xe3\x32\xf3\x94\x22\x2a\x39\x17\x00\x53\x4d\xc8\x3b\x60\x56\x89\x73\x09\xa3\x5a\x62\x0d\x98\x82\x45\x4c\x29\x9a\xaf\x46\x50\xd8\x9d\xfb\x62\xe0\x36\x74\x07\x38\x6a\x4a\x05\x96\x55\xcf\x59\x24\x85\xd2\x79\x11\x69\xec\xb3\x37\xcd\xe5\x2d\x13\x3e\x5c\xd0\xec\x62\x35\x80\xab\x8c\x9f\x01\x7f\x97\x24\xd1\x82\x8a\x79\xd0\xa7\x26\xa5\x31\xc0\xfe\x1b\x2f\xe5\xb8\xf5\x18\x08\xd0\x99\x11\x2c\xb8\x06\x50\x4c\x0d\x1f\xf1\x66\xd8\x8f\xc2\xd7\xe3\x19\x95\x76\x52\xb3\x24\x9e\xec\xa0\x5d\x9d\xe8\x17\xe9\x68\xd4\x1b\x03\xdb\xee\x39\x00\x2c\x65\x9a\xc6\x54\xd3\x3d\x82\xc0\xde\x96\xcd\xf5\x5c\x7f\x7d\x6c\x70\xea\x1d\x93\x96\x0f\x39\x71\x4b\x66\x3c\xcc\x7f\x82\x93\xb8\x70\x90\x87\x8c\x6b\x6d\x70\xca\x3a\x0a\x30\xb6\x0b\xe4\x19\xd7\xbd\xcc\x0c\xef\x46\x43\x72\x51\xb6\x66\x2c\xc9\x49\x3b\x37\x54\x47\x0b\xac\x01\xfd\x1e\x30\xfa\x50\xfa\xca\xa2\x6a\x7c\x57\xa3\x08\x82\x5c\x82\x09\xcd\x73\x16\xa6\x9b\x59\xd0\x15\x02\x91\xbc\x06\x44\x80\xf2\x9c\x69\x55\x46\xa8\x20\x1d\x36\xc4\xc5\xf2\x3b\xab\x8c\x02\x91\xb6\x80\xb5\xfa\x5c\xb3\x2c\x84\x60\x57\xd2\xd2\x59\x43\xf9\xef\x05\xae\xfb\x18\x9d\xb1\x9d\xc0\x5b\x19\x77\xb1\x53\xd7\xaa\xf0\x97\x43\x94\xf1\x9b\x18\x89\xab\x40\xa9\xc7\x07\xc0\x5b\xa5\x2a\x49\x73\x48\xe4\x16\x74\xb9\xbf\x91\xaa\x94\x91\xc6\xbe\x94\x31\x7c\x6e\x0c\x9f\x1b\x3f\x6f\x6f\xcc\xeb\x12\x01\xe2\xae\xd6\x91\x20\xd5\x8f\x74\xb2\x9c\x1a\x92\x72\xd3\xd1\xdc\x59\xcb\x46\xf6\x23\x58\x9a\x6f\xbd\x88\xde\x73\x6b\x33\x1d\x18\x37\xd4\xe2\x05\xf9\xa2\xc2\xe5\xad\x34\xe5\x35\x25\x8c\xd4\x3d\x71\xaa\xd3\xc4\x6e\x85\x4b\x3e\xaf\x3e\x7e\x5a\x1b\x0c\xc4\x8b\x66\x8d\xc2\x45\x04\x7b\x91\xcf\x88\x67\x39\x18\xcf\x5c\xfe\x81\x41\xaf\x5c\x26\x09\xcb\x61\x09\x56\x7b\xaa\x79\xd1\xa1\x96\x29\xda\x74\x47\x5e\x45\xf5\x32\xa6\x60\x77\x5e\x98\xa0\x0a\x4b\xb7\x38\x8f\x17\xb3\x8d\xf3\x36\x8e\xe7\xa3\x96\xcf\xc5\x0a\xa7\x7e\x11\x80\x16\x55\x4f\x32\x37\x1f\x32\x52\xa7\xa0\xd3\x04\xbd\xc7\x9e\xd9\xc2\x5c\x68\x72\x47\x57\x0a\xf0\xbe\x94\xe6\xfd\xf7\x6d\x55\xb5\x72\xe0\x6b\x36\xc3\xb7\x5b\x7b\xc4\xf6\xf2\x89\xed\xe3\x15\x83\x74\x4a\x2e\xda\x84\x20\x95\x2f\x6c\x6d\x1c\x52\xbf\xf6\x71\xa3\x41\x9c\x0a\xb8\xcf\xbb\xf9\x44\xaa\x7d\xca\xaf\x2e\x61\x08\x27\x93\xcf\xe1\x0f\xc7\x71\xbc\xd3\x60\xca\x0c\x56\x97\x89\xd2\x80\x21\xe1\xbb\x0d\x91\x04\x25\x6a\x7d\x03\xd5\x58\xad\x95\xd8\x77\x1a\xcb\x19\x44\x82\xc0\x17\x27\xd0\x8e\x80\x8a\x95\xe5\xe4\x7a\xc1\xf3\x78\x9c\xd1\x5c\xaf\x50\x7d\x1c\x55\xbe\xe6\xc3\xeb\x3b\x2d\x7c\x4f\x77\x4e\xbb\xd2\xc7\x1b\x21\x0c\x8b\x77\xe6\x61\x6b\x9d\xdf\x08\xd7\x87\x58\x4f\xfb\x00\xfe\xc6\xf5\x84\xa5\x45\x9d\x46\xf8\x68\xeb\x89\x43\xf2\x71\x38\xdf\x30\x34\x48\x55\x5d\xaf\xc8\x06\xc2\xd6\x55\x32\x8c\x82\xf6\x5c\x1e\x14\x22\x33\xd2\xc8\xe8\xa1\xb4\xec\x35\x1e\x18\xf6\xac\xa4\xe0\x62\x68\x6c\xa7\x23\xb1\xb2\xa6\x9b\xf0\x5b\xe1\x00\xfe\x94\x90\x13\x21\x05\x9e\x1c\x7c\xf6\x14\x43\x88\x36\xd8\xa6\xe0\x11\xdb\xa2\xae\xda\x21\x34\x38\xa9\x8e\x49\x70\x11\x9b\xad\x03\xca\x0d\x3a\x92\x2a\xa2\x88\x31\xaf\x55\x87\x2d\x6a\xca\x93\x6d\xa7\xec\x5a\x5d\x2a\x09\x45\x5c\x94\xa6\x49\x52\x6a\xb3\x16\x5c\x12\xf8\x9c\xb3\x00\x06\xec\xaf\x92\x68\x63\x15\x7b\x68\xa2\x8e\x61\x2f\x85\x88\xd0\x85\xcf\xf5\xca\xcd\xe0\xa2\xce\xea\x41\x8d\x50\xa8\xe4\xf2\x19\xda\x9d\x02\x75\xc0\x03\x13\x48\x93\x6d\xe1\x5e\xe5\x4c\xb6\x36\x83\xa1\x43\x53\x1a\xdd\xde\xd1\x3c\x86\x56\xbe\x19\xd5\x1c\xcb\x82\x8f\x2a\xc3\x9e\x04\x73\x80\x46\xfa\x21\x16\x9d\x7a\xa5\x43\x31\x5f\x82\xba\xfc\x0c\xa1\x85\x96\x29\xd5\x3c\x02\x55\x96\xcf\x02\x2b\x62\xea\x4b\x1a\xd6\xda\x0e\x02\x95\xf5\x0d\xec\x3f\xa0\x37\x26\x67\x44\xdf\x49\xc2\x53\x23\x21\x50\x68\xa5\x31\xf3\x19\x43\xce\xde\xb9\x6d\xa6\x46\x0c\xfa\x1e\x8c\xcc\xc1\x53\xa8\x24\x1b\x15\x4a\xc1\xf0\xde\xa2\xe9\x4d\x79\x36\xe5\x66\x54\x63\xe0\xf6\x1d\x83\xd3\x66\xae\x01\xaa\x8e\xcc\xf6\xdc\x31\x23\x17\xa8\xad\x08\xab\x26\x4d\x33\xc2\x9e\xb6\x8a\xc4\x5c\xd5\x1a\x53\x9f\xc4\xb9\xcc\x32\x6b\x20\x49\x4f\xeb\x33\x02\xbf\x41\xbe\x64\x2a\xe8\xbd\x8c\xa6\xea\x39\x13\xbe\x79\xb8\x2d\x67\x01\x27\xb7\xfe\x89\xca\x81\x99\x60\x42\xe8\x29\xf9\xd6\x36\x15\xf2\x88\xeb\xa3\xee\x5a\x09\x4e\x68\x6d\xb1\xb2\xd3\x20\xf1\xb4\xbd\x06\x89\x67\x90\x78\x7e\xd9\x12\x8f\x0f\xf7\xda\x57\xda\x29\x63\x1c\x6b\x0d\xc9\x5d\x30\x40\xf9\xc0\x26\x23\xc6\xe5\x8c\x5c\xb3\x48\x2e\x59\x8e\x44\x0e\x1a\x7f\x1a\x5e\xfe\x9a\xf2\xc4\x90\x38\x47\xea\x4a\xf5\x10\x2a\xaa\x56\x4d\x73\x81\x46\xee\xa1\x69\xd1\x3c\xb5\x93\xb2\x99\x7e\xe6\x79\xeb\x24\xcb\x72\xb6\xe4\xb2\x50\x2e\x64\xa1\xd0\x78\xcc\x94\xb6\xfc\x76\xc1\xe7\xbe\x30\xb7\x77\x75\xe6\x2c\x92\x79\x5c\xa6\x94\x2b\x4d\x75\xa1\xaa\x79\x12\x11\x5a\xd3\xfa\x33\xd0\x78\x38\xde\x33\x75\xdf\x8f\x92\x62\xc4\xc6\x01\xa7\xe2\xf8\x0d\xc6\x7c\x94\x7d\xb7\x75\x10\x86\x52\x86\xc0\x18\x11\xaa\xd0\x2c\x40\x2b\x8b\x00\x9d\x61\x5d\xc9\x7a\x3d\xc3\xc6\x2d\x63\x3f\xec\xb8\x8c\x3a\x69\x51\x71\x3d\xbc\xf6\x82\x3a\x39\x20\xc1\x33\xbc\x9e\x70\xe0\x49\x6d\xb1\xdd\xa3\x2f\xc9\x81\x11\x98\xe4\x90\x28\x4c\xd2\x67\x24\x26\xf1\xf1\xdc\x87\x9c\x98\x6b\x17\x49\x5e\x3b\x33\x96\xf0\x6e\x3b\x33\x95\x82\x02\x7e\x1c\xae\x5c\x07\x48\xeb\xd6\xf4\x67\x00\x4c\x82\x61\x3c\xb0\x3d\xad\xa0\xcd\xa1\xef\x92\x7d\xf2\x55\x7f\x03\x39\xa6\x6c\xaa\xad\x25\x44\x20\xa4\x19\x56\x02\x82\x53\x37\xb6\x21\x59\x4e\x5b\x1a\x4e\xf0\x70\x82\xdb\xbe\xff\x98\x27\x18\x23\x9e\xbb\x04\xe4\xd7\x3a\x05\xe1\xeb\x36\x09\x97\x4e\x59\x42\x7e\x2a\x58\xbe\x22\x46\x08\x2a\xc3\x7b\xa0\xbc\xb1\xe2\xb1\x0d\x90\xb1\x46\x95\xf6\x32\xfb\x03\xf2\x7f\x30\xd9\xbc\xfa\x64\x24\x40\xc8\x63\x3b\x80\xae\xd5\x87\xaa\xa6\x2a\x23\xb4\x3c\x04\x43\x09\x0f\x3d\x8c\x15\x99\xcf\x88\x7b\xe7\xef\x2e\xf6\x53\x74\xba\x39\xb5\xc8\x3e\x8e\xad\xb5\xc5\x9f\x6f\x59\x20\x02\xc2\xff\x52\xed\x26\xe5\x4d\x11\xe4\x96\xad\x46\xd6\x0f\x6e\xab\xb7\xbb\x87\x31\x9c\xa3\x5a\x52\xb4\x6d\xa9\x8a\x26\x00\xed\x41\x21\xf7\xb3\x1e\xe0\xd5\xbe\x08\x65\xf5\x2d\x07\x84\xae\x84\x78\x6f\x12\xde\xa9\x58\x65\x78\x6d\x2a\x5c\x89\x38\x01\x15\xf8\x5c\x5c\xb3\x47\x03\x88\xe5\x06\x6a\xd1\x75\x13\xc9\xfe\x2a\x30\x5e\x0e\xb0\x07\x2f\xd5\xa3\x69\x25\x30\xf7\x96\xad\x8e\x95\xcd\x1a\x94\x42\x2d\x78\xe6\xea\xc3\x03\x25\xb0\x98\x4b\xbe\x83\xf8\x00\x37\x04\x9e\xf9\x4b\x31\x22\xef\xa4\x36\xff\x7b\x05\xa1\x42\x68\xa9\x94\x4c\xbd\x93\x1a\xee\x3c\x38\xb0\x70\xba\x07\x83\xca\x9a\x29\x39\x98\x19\x31\xa4\x0d\xf2\x33\x5c\x08\x0a\x80\xc4\xfa\x5b\x3d\x58\xb9\x22\x97\x82\xc8\xdc\xc1\x44\xbb\xe2\xc1\xca\x0e\xe1\x6c\x4b\x81\x45\xb8\x61\x0c\x0b\x4a\x99\x57\x20\xb9\x65\x38\x6f\x5c\xe6\xee\x17\xb0\x3d\x81\x35\xde\xc7\xcd\x40\x09\x5c\xaa\xd9\x9c\x47\x24\x65\xf9\x1c\xf2\x43\xa3\xc5\xfe\x1b\xd4\x9d\x6e\xe3\xb5\x17\xf5\x0e\x3f\xdc\x19\x33\x80\xd5\xbd\x81\xc8\xa5\x43\x19\x26\x8e\x82\x2c\x22\xa5\x99\x41\x8a\x7f\x1a\x4e\x00\xfb\xf2\x6f\x28\x59\xad\x26\xe4\xdc\x35\x3c\x0d\x7f\xb3\x56\x8c\x70\x18\x33\x82\x91\xe9\x7f\x2a\xf8\x92\x26\x0c\xe3\xf9\xa8\xf0\x65\x3c\xe5\x6c\x8d\x4d\x8f\x6c\xdd\x6a\x43\xa5\xbc\x67\xe8\xe8\x96\xad\x8e\x46\x6b\x88\x74\x74\x29\x8e\xca\x24\xed\x0a\xea\x78\x86\x06\x4e\x83\x23\xf8\xed\xa8\x6f\xce\xfe\x48\xa2\xfd\x1e\x58\x62\x0d\x42\x2f\x13\xaa\x54\xb7\xfc\xd6\x5a\x6a\x51\x6d\x9c\xa6\x02\x8c\x37\xc1\x33\x65\x72\x91\x8d\xde\xec\xdd\x9e\x05\x51\xfe\xdd\x23\x8d\x3a\x41\x6f\x69\xbb\xa7\xb4\x2f\xdc\xd0\x58\x50\x0c\xca\x16\xb8\x1c\x8e\x4a\x5e\x5c\xe9\x8c\xdd\x00\xaf\xef\xc0\xae\x28\x67\x61\x93\x67\xae\x40\x0d\xe6\x2e\xab\x43\x48\x4d\xb8\x88\x92\xc2\x9a\x14\xe1\x55\x50\xa2\xbb\x8a\xfa\x7b\x00\xe7\x00\xa4\x2a\x07\x70\xd8\xe4\xdc\xbe\x6b\x01\xbc\x75\x0f\x1d\xf8\x44\xbd\xc7\x0b\x61\xd5\xf7\x5a\x67\x3b\xc2\x25\xab\xc5\x38\xa3\xaa\xec\xf1\x9a\x4f\x73\x46\x5e\x2e\xa8\x10\x2c\x09\xb2\x5d\xad\xb1\xc3\xb7\xb3\x02\x81\xc4\x36\xb1\x3a\xae\x76\xb1\x72\xf4\x4d\xf8\xdc\xea\xde\x7b\x07\xff\x9c\x9a\x4a\xf5\xd6\xa7\xdc\x96\x6a\x5c\xc8\x3b\x12\x4b\x72\x07\x7d\x0b\x96\x86\x69\x81\x53\x56\x39\x76\x17\xcc\x14\x42\x24\x22\x99\x66\xb9\x4c\xb9\x72\xc1\xf1\x76\x1b\x7b\x4d\x0d\x4d\x8a\x16\x35\x80\xaa\x7b\x90\x14\xa2\x5a\x12\xfe\xf5\x4b\xa2\x69\x3e\x67\xda\x8c\x46\x44\x91\x4e\x59\xeb\xfc\xd5\xfb\xa8\x41\xf6\x39\xb5\x10\xed\xb7\x09\x16\x6e\xc3\xf7\xdf\xbf\xeb\xdc\x7a\xb7\x7c\x73\xd3\xde\xde\xc9\x3c\x89\xef\x78\x8c\x2c\x5a\x91\x13\xf3\xf0\xe9\xd3\xef\x94\x7b\x77\xc7\xe3\xce\xe0\x80\x97\xaa\x60\x70\x71\x50\x06\x0c\x04\xe0\x60\x3b\x3c\x71\x28\xa3\x0d\x6f\x9c\x92\x57\x1c\xb3\x8b\xe0\x7d\x28\x54\x93\x4e\xb9\x28\x33\xcc\x4a\x30\x1b\x62\x6c\xce\x8b\x53\x4d\x14\xd3\x98\x17\x02\xa9\x15\x52\x2f\x88\xe2\x69\x91\x68\x2a\x98\x2c\x54\xb2\x6a\x8d\x2a\x8f\x03\xea\x59\xc2\x3e\x21\x66\x77\x61\x72\xfe\xa5\x2a\xb3\x83\xd0\x95\x32\x8d\x72\x8d\xdb\x95\xc1\x55\xf1\x99\xe7\x7c\x3e\xdd\x88\x7d\x62\x91\x8d\x0a\xce\x92\x62\xce\x77\xa4\x3f\xfc\xc2\xaa\x9a\x97\x05\xa4\x0b\xc5\xca\x4c\xfd\xb6\x7d\x5d\x1e\xa8\x08\xf9\xe3\x72\xf8\x0f\xcd\x05\xc8\x63\x96\x31\x11\x43\x49\xb4\xd7\x25\xe6\xe2\xe4\x7b\x85\x9c\x2d\x2f\xd6\x95\x6a\xb9\xaa\x64\x15\x0a\x1e\x84\x70\x2d\x64\x12\x2b\xc2\x3e\xe9\x9c\x1a\xc2\x94\x1a\x12\xe4\xdf\x99\x11\x2a\xda\x13\x99\xa7\x51\x22\x98\xf4\xce\xed\xef\xb7\x5f\xe6\x53\x6c\x79\x59\xae\x5d\x6d\x6d\x58\x7d\x58\xe9\x7a\x24\xc4\xf6\xac\xa8\x6a\x84\x70\x43\x89\x79\xfb\x95\x6a\x64\xe2\x61\xa5\xe6\x55\x43\x51\xed\xda\xac\x86\x36\x9d\x9f\x45\xdd\xf9\x19\x24\x06\x77\x29\xc2\x64\xdf\xa8\x69\xd4\xf6\x66\xbd\x21\xf4\x16\x0d\xda\xe2\x6d\xc0\x07\xa0\xe2\xa9\x1d\xc8\xa6\x35\x11\x65\x60\x59\x86\xce\x15\x42\xec\xa2\x62\xf7\x51\x45\x9c\x6a\xaa\x98\x6e\x67\x4d\xa9\x8a\x0e\xe5\x9b\xe6\x00\x86\xf8\x65\x7f\xc2\x2a\xf6\x10\x90\xee\x92\x65\xc9\xf8\x2f\x56\xca\x10\x95\x27\x8d\x7c\xe1\xe0\xe3\x8a\x34\x31\xef\x45\xc6\x31\x62\xb3\x2b\x11\xd5\xad\x5b\xee\xb4\xe2\x0b\x76\x06\xdf\x7e\xdb\xb9\x97\x6b\xf0\xa6\x93\x43\xe0\xdf\x55\x20\x58\x5c\x80\x42\x3e\xfc\xa7\x22\x54\x07\xa0\xb8\x85\x5f\xb6\x7d\xbe\xaf\xb5\xcd\x23\x56\x1a\xaf\x2e\xb8\xba\xed\x52\x8c\x6c\xed\xe5\xea\x91\xf8\xfa\xe5\x2b\x62\xef\xb6\xb2\x2f\x75\x31\x30\x1d\x5a\x19\x6b\x1e\xb1\xd2\x68\x1b\x73\x75\xfb\xe0\x6d\xd5\xb3\xf8\xdd\xae\x08\xf0\x87\xb3\x7f\xd5\xa5\x5e\x57\xa2\x25\xa8\x1d\xb4\x92\x05\xb9\xb3\xa5\x0f\xac\xd4\xfc\x81\x67\x2f\xc8\x2b\xa1\x8a\x9c\x95\x9e\xdb\xfa\x50\x86\xeb\x3e\xa5\xd6\xeb\x07\x61\xc9\x53\x36\xbe\x65\x34\xd7\x20\x1e\x77\x45\x03\xff\xa2\xa3\x4f\xc1\x0d\xd1\x06\x0f\x2e\x67\x2e\xb0\x6e\x64\x73\xbc\x7d\xe1\x32\xf7\x90\xd9\xf9\xa0\xac\x49\xb8\xd7\xaf\x7d\xc9\x1f\x72\x16\xb3\xe5\x99\x8a\xe9\xf3\x11\x7c\xc6\x05\x3c\x57\xe7\x44\x15\x39\x7a\x7e\x34\x21\x37\x3c\xe5\x09\xcd\x93\x55\xa5\x14\x73\xf9\x9c\x61\x16\x6e\x40\xf0\xca\x3d\x3b\x22\x27\x32\x87\x91\x23\x2a\x48\xc2\x5c\x46\x93\x3d\x67\x2b\x94\x1d\x4f\x1f\x9a\xb8\x90\x7b\xb5\x5f\x22\x9d\xe9\x8c\x13\xb1\xe3\xd8\x96\x1f\x55\xca\xd9\x5c\x94\x24\x9d\x0b\x43\xe7\x27\xe4\xdb\xa6\x46\xe5\x70\x64\xdc\x13\x8f\x05\xd4\x87\xd1\xfb\xf6\xd2\xe0\xd6\xcd\xc1\x8f\x07\xa6\xdd\x5a\xe2\x9c\xeb\x6b\x96\xc9\x4e\x12\x02\xbe\x52\xb3\xc7\x71\x6d\x6e\x48\xc5\xa1\x50\x29\xd5\xd0\x16\x38\xd7\x3c\x2a\x12\x6a\xc4\x6a\xb4\xc6\x4d\xc8\xc5\xab\xab\xeb\x57\x2f\xcf\x3f\xbc\xba\x78\x41\xbe\xb6\x23\xf1\x50\xc2\x9b\x90\x0f\x61\x35\xa8\x20\xa2\xd7\x96\xdc\xf1\xdf\x1a\x59\x32\x44\x45\x59\xdc\x11\x6a\x7c\x50\x41\x2e\x05\xd7\x65\x79\x64\x8c\x3b\x4b\xa4\x60\xae\x7b\x68\x26\xad\x35\x70\xce\x31\x1a\x44\xd8\xc1\xcc\xcf\xd5\xd1\xe0\x74\x60\xa9\x55\x3f\x95\x1d\x8a\xe0\x3d\x88\x16\x25\x70\xfb\x12\xff\x5d\xfd\xd3\xae\xb2\xaf\xaf\x46\xeb\x12\x9c\xd0\xfa\x5f\xde\x47\x66\xe0\x0b\xb3\xbb\x72\x37\x0d\x2d\xad\x89\x61\x33\xc7\x93\x63\x27\x50\x24\x6b\x45\xf8\xfd\xa0\x61\x45\xaf\x2a\xb2\x4d\x08\x79\xef\x42\xb6\x21\xf5\xb8\xb9\x9e\x3f\x56\x87\x08\xaa\xc2\xd7\x50\xd6\x25\xc6\x14\xd3\xf0\xa3\xb6\x04\xd8\x9c\x2f\x99\xc0\x85\xf5\x4b\xa1\xdc\xe7\x3b\x77\x47\x2b\xe7\x6d\xf5\x8f\xeb\x37\xfd\xce\x0c\xcf\x5f\xe7\x79\xd9\x63\x6b\x67\x15\xc9\x34\xc5\x7a\x51\x0b\x9f\x60\x58\xe6\x08\x7a\xaa\xd0\x9b\xe6\x83\x95\xaf\x66\x3b\x90\xbf\x46\xcf\xdc\x4b\x35\x4d\xc7\xdf\xb6\x49\x09\xa2\x14\x73\xbb\xd7\x61\xb6\x45\xd6\x94\x2b\x9e\x62\x49\xfb\x99\xff\xf8\xd9\xf5\xab\xf3\x8b\xb7\xaf\x26\x69\xfc\xe0\xa4\x85\x89\x38\x93\x5c\x68\xb5\x5b\xbf\xd9\xd5\x75\xa6\x3d\xf9\xf1\x1f\xed\xca\x9d\xfd\x8b\x0e\xc7\xdc\x8d\xa0\x2e\x5d\xcc\x34\xe5\x89\x0a\xf6\x50\xcb\x4c\x26\x72\xde\x5c\x7e\xb9\xc3\xe6\xfc\x1a\xeb\xcb\x8c\xe9\xd8\xec\x7a\xbf\xa2\x7e\x9b\x3e\x1a\x75\x29\xbf\xec\x88\x5d\xae\xd5\x4b\xcd\xd0\xee\xe2\x89\x2e\xf7\x5e\x84\xb3\x35\x18\xa0\x22\x09\x07\xd8\x95\xec\x2b\x6b\xe0\x05\x3d\x6c\xda\x4a\x6d\xf7\x0d\xba\xdd\x02\x9b\xa1\x3f\xbb\x1b\x15\x55\x61\xe6\xde\xa9\x12\xb8\x2c\x67\x63\x5f\xae\x09\x5a\xab\xc8\x3c\x60\xb8\x21\xbd\x73\xd6\x1b\x67\xeb\xc1\xa7\x92\x55\xdd\x8a\x53\xca\x47\xde\xf4\x85\x35\x06\x92\x64\x55\x96\x81\xb4\x5a\x34\x9d\x63\x19\xa6\xdc\x9a\x89\xb3\x9c\x2f\x79\xc2\xe6\x50\x8a\x95\x8b\x79\x90\xfe\x1a\x26\xcc\xda\xd2\xac\x55\xa3\xeb\x5b\xf3\x57\x50\x74\x1b\xf0\xe2\xdd\xfb\x0f\x50\xd5\x17\x1c\x5c\x07\x0b\xe1\xe6\x83\x70\xde\xc6\xe3\x31\x98\x0c\x4e\xfe\x6e\xe4\xc9\x38\x39\x25\xdf\x33\xfb\x1d\x09\x65\x87\x73\x68\x05\xb4\x90\xbe\x06\x2c\xcc\xb5\x84\x2c\xa0\x23\xba\xf7\xed\x53\x67\xe6\x49\x23\x2b\x21\xab\xa9\x3c\x0f\x9d\x4f\xb1\x74\x23\xfa\x98\x1e\x5e\xf6\xec\x91\xec\xef\x4d\xe5\x9c\x69\xb5\x09\x3f\xbd\xe3\xc7\xd1\x43\x4a\xd4\x2a\x4d\xb8\xb8\x2d\xeb\x82\xcd\xa4\xc1\x21\x4c\x4d\xe0\xe2\xd6\x61\x6c\xce\x68\xb2\x99\x52\xee\x83\x1f\xbd\x52\x49\xbd\x87\x05\x10\x2c\x74\xe6\x9c\xfd\xb7\x3b\xf6\xd6\x0d\x1d\x92\xb8\xa3\xa3\x27\xb7\x5e\xae\xba\xb5\xc1\x3f\x86\x17\x2a\x34\x4d\x90\xcb\x9b\x97\x37\x97\x0f\x6a\xa1\xde\xc4\x12\x60\x76\x8f\x28\xd5\xf1\x9f\x76\x79\x87\xc7\x24\x29\x76\x3f\x83\xea\xdd\x95\xcc\x35\x4d\x7a\x22\x02\xd1\x82\x66\xe7\x85\x5e\x5c\x70\x05\x35\x14\xba\x0a\x01\x6b\xef\x07\x91\xce\x58\xbb\xd9\x15\x0c\xe4\x0e\x1d\xec\x73\x2f\xff\xfb\xfc\x8a\xd0\xc2\xec\xaf\xb6\xc5\x45\x7b\x75\xb8\xbb\x99\xdd\x60\x86\xc1\x9e\xeb\xb2\x6f\xef\x58\x95\x7b\xea\xbe\xd7\x74\x1f\x71\xb8\x83\x2f\x02\x68\x28\x52\xb0\x27\xec\x7f\xe0\x82\x6b\x4e\xb5\x6c\xd9\xa8\xac\x82\x02\x95\x77\xbd\x41\xa0\x50\x5a\xa6\x16\x83\x2f\xdd\x13\xe0\x42\x06\x2e\xbe\xf6\x52\x69\x2d\x00\xe9\x1d\x20\x76\x29\x8c\xac\x4d\x23\x56\x0b\x80\x1c\x41\xd1\x4f\x1c\x9b\xfb\x67\xfe\x6c\x0d\x54\x50\x1f\x2c\xf9\xcb\x8b\x4a\x29\xf6\xb5\xbe\x16\xce\x4a\x51\x36\x4d\xe8\xd5\xe2\xc3\x7f\xea\x4a\x14\xf8\x4f\xa2\x66\x69\xc3\x05\xfe\xbf\x05\x4d\x10\x30\xef\xfa\x36\x4b\x55\x81\xdc\x75\xbe\xd5\x1d\xb2\x53\x2f\xb7\xe3\x9d\xd7\xd2\x0b\x85\x95\xc7\x70\x3d\x3a\xa7\x42\x99\x3d\xaa\xea\x62\xc7\xd6\xf1\x74\x4c\x4e\x74\x94\xb5\xee\xdd\x7f\x4f\xa1\xed\x49\x21\x2a\x8d\x9c\x61\xe6\x1f\x70\x5b\xde\xf8\xd0\xf6\xb6\x93\xbc\x17\xd7\x10\x60\x79\x57\xab\x8a\x7d\xcb\xef\x56\xb8\x2e\x64\xfd\xe4\x0d\x57\xda\x35\x64\x80\x1b\x5c\xd9\x3a\xc2\x20\x77\x5d\x19\x45\x8e\x67\xff\x4b\xe3\x38\x7f\x81\x5c\xca\x75\x5f\xce\x41\xfa\x72\x45\xbe\xa8\xf0\xbe\xc4\x13\xbd\xca\x6c\x01\xc0\x0f\x2f\xaf\x08\x36\x48\xf9\xd3\x1f\xb0\xf3\xeb\xef\xbe\xfc\xc3\xb3\xd6\xdb\xfd\x78\xc1\xe3\x7b\xda\x31\x7a\xf7\x31\x3d\x89\xb8\xc1\x4a\x7c\xa0\x59\x09\xc8\x26\x37\x18\x8e\x67\x28\xab\x3d\xea\x88\x58\x66\x97\x3d\xbd\xdf\x4f\x82\x19\xe2\xec\x1e\x35\xce\x8e\xf8\x8c\x12\x24\x12\x1d\xd1\x25\x7c\x15\x52\x0c\xd7\xc9\x0e\x52\x9c\xab\xa7\x47\x71\x76\xc2\x66\x37\x16\x55\xb1\x27\x74\xc6\xbb\xf6\x37\x65\x08\xfb\xc5\xbb\x9b\xff\x7d\x73\xfe\xd5\xab\x37\x30\x53\xeb\xbf\x37\xa8\xc1\xc5\xde\xf1\x53\xed\x51\xad\x8d\xf2\xba\x1b\x20\xdd\xdc\x32\xa2\xe6\x90\x11\xe4\xdd\xeb\x9b\xae\xbe\x98\x43\x05\x74\x31\x6b\xb5\xf6\x87\xb5\xb6\x41\x57\x13\x96\xf7\x97\x3f\xb2\xb7\x51\x2e\x28\xa4\x55\xd1\xbf\xcc\x4e\xe1\x0c\x0f\x56\x91\x76\xee\x00\x79\x02\x7e\x07\xb3\x5e\x84\x41\xef\x1e\x87\x7b\x82\x55\x5b\x39\x20\xef\x9e\x58\x74\x8c\x6f\x39\x11\xc0\x1c\x52\xa4\x6d\xb9\xa1\xd9\x86\x5a\x33\xe5\xbb\x2f\x3c\x51\x4c\xc9\x9a\xca\x33\x77\xa1\x5e\x8d\x03\x54\xda\x95\x55\x7c\x31\x95\x5c\x8a\x4d\xe5\xcc\x5d\x84\x02\xb5\xca\xab\xca\x68\xd4\x6b\x43\x95\xf2\x16\xde\x81\x24\xf7\x87\x27\x80\xf0\xd9\x1e\x03\x69\xfd\x78\x5d\x11\xd9\xbf\x58\xcf\x92\xeb\xb4\x43\xae\xd1\x47\x26\x5d\x06\x62\x98\x4e\xf7\xc8\xdb\x47\x1e\x56\xdb\xf9\x7e\x4f\x45\xa7\x6f\x25\x27\x5b\x48\x2d\xc5\xde\x51\xf2\x4d\xaf\x57\x0f\xf4\x15\x3c\xf1\xb2\x6c\x63\x13\xf4\x78\x84\x08\x4a\xef\x8c\x30\xf2\x9c\x63\x17\x52\x38\xb7\x44\xd5\x29\xf1\xe0\x22\x48\x7c\x79\xd1\xd3\xe1\xfb\x7c\x53\x3c\xbb\x1a\x83\x7b\x0d\x06\x89\x3b\xe7\xa4\x98\x57\x1c\xc4\x2e\x2f\xac\x68\xe6\x12\x4e\x94\x45\x48\xb2\x19\x23\x7b\x63\x9d\x32\xd7\x77\x32\xef\x9e\xea\x5d\x7d\xb1\x16\xab\x60\x7f\x5b\x4b\xc5\x7a\x8a\xa7\x07\xe7\xf8\xc8\x27\xe8\x06\x4e\x50\xad\xc0\xf9\xa6\x93\x74\x1f\x07\xe9\x71\x0f\xd0\xa1\x8c\xea\x7e\xb3\x7c\x7b\x15\xd2\x1d\xba\x75\x5c\xaa\x7b\xcd\x1a\x13\xcc\x26\x95\xd4\x82\x82\xc9\x25\x38\x71\xbd\x51\x87\x5c\x62\x0b\xca\x2e\x84\xc1\xbd\x83\x06\x5c\x2c\xf4\x9c\x24\x06\xaa\x52\x84\x25\xa2\x6d\x1a\xef\x88\x60\x95\xe5\x94\x66\xae\x27\xb7\xbc\x13\x77\x34\x8f\xc9\xf9\xd5\x65\x3f\xd4\xa0\x43\x9c\x35\x62\x52\xbb\x8a\x5e\xd5\x48\xeb\xf2\x4d\x6c\x73\xb3\x60\xd0\x5b\x91\x4c\xb9\x56\x65\x4f\x3f\xa6\x43\xbd\xd2\x50\x41\xef\xcb\x32\x67\xd9\x9c\x5b\x3b\x52\xc0\x30\x05\x91\x91\xa6\x89\x6b\x22\x60\xdb\xe4\x3c\x7b\xf6\x0c\x4d\x61\xcf\xfe\xf8\xc7\x3f\x62\x67\xa5\x98\x45\x3c\x5d\x7f\x10\x9e\xfa\x8f\xe7\xcf\x27\xe4\xff\x9c\xbf\x7d\x03\x9d\x1f\x33\xad\xb0\x2a\x09\x8e\x8c\x9d\xe0\x83\x97\xd5\x88\xfc\xcf\xcd\xfb\x77\x65\x9b\x98\xea\xaf\xb6\xa1\xb6\x5d\xde\x84\x5c\x04\xf1\x4f\xa1\xa1\x8b\xea\x85\x6d\x68\xa4\x09\x9d\xcd\x10\x31\xa6\xae\x9d\x2e\x1e\x38\x97\x3d\x0e\x5d\xc1\xb1\xff\x88\x41\x89\x04\x02\xb3\x8c\x4a\x8e\xa6\x41\x57\xd9\x00\xe3\xcc\x60\x2c\x4f\x26\x61\x2a\x23\xec\x25\x3f\x53\xd0\x85\xa4\x2c\xff\x97\x33\x65\x84\x52\xdb\x5d\x11\x07\x2b\x77\x46\xb1\xd6\xb5\x1e\xee\xc3\x03\xd4\xba\x3b\x46\xd5\x74\x6f\xcf\x90\x2b\xdf\x6a\x6b\x17\x97\x6d\xea\xff\x8e\xde\xd0\x5d\x41\xc2\xf7\xe4\x91\xa9\xcc\xf5\xca\xcf\x06\xb7\xce\x56\x09\x28\xe9\x04\x4d\x24\x74\xf2\xf2\x3b\x5d\x72\xb1\xa0\xe9\xfd\xee\xa5\x74\x2e\xbe\xd8\xb5\x00\x2f\x12\xaa\xb7\xb4\x75\x3b\x9f\x6a\xbc\x88\x7b\xbb\x52\x57\x81\x4e\x65\xa1\x9d\x0f\xdb\xfe\x0e\x09\xd8\xd8\x65\xbd\x43\x19\xc9\x3d\x2a\x4f\xee\x53\x81\xb8\x73\x11\xd3\xaa\xbf\x19\x78\x42\x55\x94\x18\x11\x46\xa3\x05\xb9\x65\xab\x31\xd2\xad\x8c\x42\x36\x0f\x40\xe5\xc2\xc0\xa2\xd2\xf8\xa4\xec\x5d\x63\xe4\x63\x0b\x32\x17\x18\x10\x70\x1f\x97\x0d\xe4\x84\x50\x65\xe5\x25\x5b\x46\x54\x04\x96\x02\x57\xab\x3a\xe8\x47\xec\xeb\x86\x62\x33\xf2\x6a\x92\x8a\x39\x6f\x2c\x36\xaf\xa9\x6d\x5f\x2e\xa3\x21\x0c\x1d\xb4\xdc\xad\x10\x6b\x6f\xdb\xe6\xdb\x56\xf8\x83\x0f\x52\x57\x9d\x39\x88\xa8\x80\x76\x7e\xb6\x93\x93\x7d\xd6\x41\xc9\x03\xa2\x92\x44\xa3\x98\x2e\x2c\x68\xb0\x5f\x58\x21\x12\xa6\x14\xe1\xb0\xc2\x94\xe6\xb7\xcc\x15\x8c\xa1\xc9\x84\x5c\x99\x49\xfa\xfa\x55\x58\x16\x79\x89\x21\x76\xe6\xcc\x86\xd9\x41\xe6\x23\xc7\x93\xc9\x31\x12\xf8\x86\x5c\xa1\x0e\xf8\xb1\x5f\x4d\xdd\x3d\x6a\xe9\xd6\x5a\x7b\x67\x0a\x2b\x03\x1b\x91\x0f\x2a\x5f\x4b\xc8\x82\xd3\x0b\xc7\xc0\x68\xeb\x22\x4a\xeb\xcb\xd9\xa3\x00\xec\xbe\x75\xcb\xf7\xa9\x5a\xde\xca\x6f\x51\xbd\xf6\xaf\x56\xbe\x57\xad\xf2\x4d\x95\xca\xed\x4e\xd9\xd3\xd6\xbd\x86\xf3\x01\x25\xb6\xd3\x4e\x65\x5e\xdd\x55\x35\x52\x82\xdc\x51\xa9\xd2\xd3\x4a\x46\xb4\x45\x9f\x12\xf6\x59\x09\x85\x97\xb3\xa6\xae\x73\x2e\x59\x30\x90\x97\x1d\x0d\x35\x10\x78\x7c\x69\xb0\x5b\x2f\x17\xd2\x59\x3c\xac\x5f\x5d\xc4\xc5\xfa\xd5\xce\x19\x58\xbf\xaa\x0a\x5b\x90\x96\xe4\x89\x7e\x18\xc5\x0f\x20\xd5\x12\x6a\x76\x97\x47\x70\x42\xde\x5a\xa6\x80\xc8\x48\xa7\x4a\x26\x85\xf6\x99\x4c\x0d\x1c\x03\x06\x75\x15\xbe\x31\xa5\xd4\x3d\x16\xf0\x0f\xe0\x9c\x48\x96\xbb\xb2\x12\xbc\xf6\x3a\xe2\x5d\x7b\xee\xfd\x6c\x83\x49\x0e\x80\xa1\x13\x25\xf6\x86\xa3\x1b\xc0\xd7\x9d\x70\xb1\xd4\x15\x19\x07\x22\x49\xb4\x42\x01\xca\x89\x2b\xb6\xd1\x53\xe7\x25\xb6\xb3\xda\xd8\xb9\x5a\xc3\xc4\xf9\xd5\xe5\x5e\x1a\x40\xf0\xfe\x06\x1d\x20\x7c\xe2\x67\xac\x05\x5c\xa2\x16\x10\xb6\xdd\xb9\x28\x57\x6e\x4d\xca\x86\xec\x3c\x79\x31\x72\x6d\xda\xaf\x0d\xb1\x0c\x83\x4e\xab\x35\xf4\xd0\xd8\x53\x92\xd5\xa0\xee\x9e\xf3\x3a\xc2\x21\x7e\xea\x22\xe7\x03\x8a\x8f\x00\x8f\x4e\xed\xd2\xdd\xb5\xde\xcd\x0e\x16\x4b\x6e\xa0\xb5\x0d\xea\x83\x81\x62\x99\xc9\xf8\x85\x6d\x25\x2d\x84\xc4\x06\x72\x6a\x84\xbd\x71\xd4\x08\x15\x46\x23\x45\x04\xbe\xe2\x3c\x30\xb9\xef\x2d\x37\xec\xd5\xe5\xe8\x90\x3e\x47\x66\x03\x61\xe5\x57\x5d\x77\x91\x1c\xd8\xb6\x88\x04\xac\x69\xbf\x46\x28\x95\x3d\xb5\x23\xf9\x3e\xef\xd1\x82\xa5\xf4\xff\x67\xef\xea\x7a\xdb\xb6\xd5\xff\xfd\x3e\x05\x91\x5d\xb8\x05\xec\x64\x2d\x8a\x61\xf8\xff\xaf\xf2\xd2\x6e\xc6\xba\x35\xa7\x4e\x06\x1c\x0c\xbb\xa0\x25\xc6\xe6\x89\x4c\xea\x88\x94\x53\x63\xd8\x77\x3f\x20\x1f\x92\x22\x65\xbd\xda\x8a\x93\xb4\xf6\x4d\x1b\x89\xa4\xf8\xfe\xbc\xff\x1e\xc0\xf0\xb3\xc3\x53\xb7\xcc\x43\x46\xa5\x24\x80\xa5\x44\xb2\x95\x40\xfc\x6e\x1c\xd8\x0c\x4e\xd6\x6f\x4e\x76\x49\x07\xb3\x67\xc6\x1e\x54\xac\xc2\x00\x93\x71\x1d\xb0\x6c\x6a\x5f\x6b\x59\x22\xd1\xc0\x9b\xac\xa4\x90\x50\x04\x66\x0d\xb3\x77\xf0\x81\x0f\x21\x47\xed\x2a\x3f\x8d\x1d\xc3\x70\x94\x9f\x8e\xf2\xd3\x20\xf2\x93\x47\x58\xec\x85\x53\x21\x4b\xf9\x0e\xc3\x56\xa0\x2a\x02\x99\x3c\x00\x1e\xb5\x35\xad\x28\xc5\xb3\x50\xe3\xa6\xe4\xa1\x91\x15\xb0\xcc\x3e\xce\xe5\xdd\xe4\x27\x44\x58\xc4\x63\x58\x7c\xd5\x7e\x26\xa4\x66\x6d\x0a\x99\xc4\xef\xcb\xca\x7e\xcb\xd7\xda\xe9\xb6\x77\x5d\xba\x9d\xee\x01\x6b\x0a\xfc\x30\x10\x81\x2f\xc8\xba\x0b\x26\xb6\xb9\xb2\x2d\xd6\x80\xa1\xef\x85\x11\x12\xd2\x4a\xeb\xcd\x6d\x33\xe6\xa2\x57\xf0\xf0\x34\x4a\xf3\xb1\x29\x70\xba\x22\x2b\x9e\x6d\xc6\xae\x90\x7a\x19\xd4\x32\x25\x5e\x6b\x9e\x20\xca\x33\x25\x01\x26\x9b\x97\xca\x1d\xd8\x09\x3a\x30\x73\xe0\xd6\xa9\x5f\xd2\x20\xff\x17\x6e\x89\x02\x54\x4c\xcb\xf7\x45\x12\xa5\x3b\x07\x79\x28\xc6\x85\xd8\xa9\x9e\x12\xb6\x46\x6b\x9c\xf5\xc8\x82\xee\xff\xf6\xe4\x07\x62\xba\xa6\x62\xb7\x7c\x87\xa5\xa1\xcf\x0c\xd1\x00\xbd\x0e\xcf\x65\x9a\x4b\x73\x53\xda\x53\x61\x43\xe6\xdd\x69\x28\x31\x45\x6f\x4e\x76\xea\xc6\x8b\xc9\x2f\x0c\xbf\x1d\xb3\x0c\xc3\x6f\xdf\x5c\xc3\x61\x2b\x3b\x6f\x9b\x41\x33\x87\xdb\x9f\xdd\x16\x43\x9c\xc3\x82\x44\x16\x38\x0f\x96\x39\x3d\xd0\x41\x03\x77\x93\x9d\xf4\x36\x06\xa1\xbe\x5a\x65\x63\x5e\x7e\xc5\xda\x9a\x61\x6d\xb6\x26\xbe\xf0\x1b\x37\xd8\xce\x4c\x3e\x83\xa3\xb5\xb6\xd3\x16\x3c\x5a\x6b\x8f\xd6\xda\xa3\xb5\xf6\xa8\x6d\x38\x6a\x1b\x8e\xd6\x5a\x74\xb4\xd6\x0e\x32\x87\xc3\x59\x6b\x81\xd5\xab\xb2\xd9\x1a\x66\xaf\x30\xd8\x1e\xd4\x5e\x6b\x12\xf7\x9c\x47\x11\xcf\x99\xbc\xe1\xf7\xa4\xb3\xd1\xa1\xc4\xff\x6f\xb5\xa3\x01\x10\x6a\xe4\x81\xed\xc2\x07\x13\x0e\xfa\x73\x25\xbd\x78\x8b\x5d\xb8\x0a\x9c\xc7\x54\x71\xfe\x3b\x6f\x33\xdb\x80\x0f\x4e\xc4\x62\x12\x17\x2f\xcc\x51\x96\x6a\xae\x4f\xd1\x39\xca\x48\x44\x53\x6a\xd2\xc8\x63\x78\x0e\x1b\xcf\xe5\x46\xa0\x52\x90\xe4\xce\x60\xd4\x33\x3f\xd7\x4f\xc1\xbf\x9b\x7b\xb0\xf2\x33\x40\xa1\xb8\x45\x32\xb7\xb9\x90\x32\xf2\x1f\x4b\xda\x4c\x6f\x6e\xfc\x16\x7c\xf5\x8a\x1e\x4a\x90\x62\x48\x7f\x2c\xa5\x26\xc0\xfa\xb1\x8f\x3f\xf9\x92\xd2\x4c\x6f\xde\x19\x89\x38\xeb\x92\x53\xb5\x66\x81\xb6\x5a\x2a\xe8\x93\xd6\x8d\x92\x18\xc5\x79\xe6\x72\xa6\xae\x71\x42\x63\x2a\x37\xce\x6a\x67\xd2\x6b\x61\x38\x31\x6e\x19\x45\x31\x8d\x08\xa7\x69\xc6\x71\xb4\x24\xc2\xfb\x1a\x30\x28\x26\x88\xcc\xf9\xbe\x43\x0a\x38\xcd\xa3\xe8\x3a\x8a\x40\x26\x1b\x94\x71\x69\x0d\xef\x35\x1f\xbc\xf1\x1a\xd3\xd5\x81\xca\xc9\x6c\xa3\xad\xf3\xdc\x6f\x02\x7a\x45\xef\xfc\x3f\x04\xe2\x49\x6c\x21\x4c\x7e\xfa\x41\x31\x85\x91\xd9\x83\xea\xf2\xd3\x00\x17\x92\xa3\x44\x11\x6c\x75\x21\xd6\x57\x7e\xfb\x0e\x2d\x79\x9e\x89\x53\x1f\x74\xe0\x8d\x7e\x06\xf2\x9d\x65\x2a\x25\x4a\x08\x16\x12\xbd\xf9\x01\xad\x28\xcb\x15\x9d\xea\xbd\x6d\xfa\xf3\x41\x1e\x07\xf4\xe3\xbb\xce\xf5\xfa\xf2\x3e\xb5\x5c\x4f\x0a\xd8\xc8\x86\xf5\x31\x27\x09\x02\xe3\x00\x59\xbc\xc4\x08\x99\x4b\xd7\x9f\x6d\x26\xf9\x23\x9c\xaf\xff\xe6\x7c\xbe\x91\x7d\x82\x28\x4d\x8d\x30\x7a\xf2\x5f\xe6\x61\x17\xf0\x94\x02\x3b\xa5\xf1\xa3\x8f\x92\xe1\x62\x41\x85\x6c\xc9\x6f\x51\xc4\x57\x36\x16\xeb\x4e\x56\x16\x4a\x3a\xe8\x19\x2b\xa3\xeb\x58\x8e\xd8\xea\x96\xa2\x88\x40\x32\xcb\xab\x22\x53\x12\xe3\x50\xb6\xb5\xf9\x27\x06\x1c\xb3\x1b\x64\x00\xd4\xf4\x8e\x43\xed\xc6\x74\xd9\x2d\xd1\x7b\xac\x50\x2d\x3c\x05\x82\xb2\x05\x80\x9c\xaf\xf2\x44\xd2\x34\x29\xc6\xfd\xd9\x56\x30\x17\xb9\xaf\x73\xc3\x9e\x9a\x08\x43\x60\x31\xa0\x4d\x69\xfd\xe4\x2b\xd7\x16\x61\x12\xb0\xba\x33\x45\x0f\x52\x9c\x61\x37\x79\x3a\x93\xae\x78\x6d\xd4\x77\x58\x5b\x14\x0d\x1c\xa6\xaa\x85\x93\xa2\xc7\x9e\x15\x69\xc8\x4d\x23\x09\xc3\xac\x83\xaa\x3a\x84\xe7\xd2\x95\x10\x7f\x70\xce\x64\x90\x06\xa5\xb4\x5b\x0c\x53\x73\x81\xa3\x7b\xc2\x62\x48\x1a\xa5\x87\x1d\x6f\x18\x5e\x19\xb4\x2d\x2f\x1f\x77\xa9\xbe\x18\x1b\xc5\x04\x84\xef\xd9\x30\x63\xa0\xba\x43\xce\x41\x2e\x7a\x43\xd9\xa8\x2a\x6d\xe7\x5c\x80\xca\x26\xa3\xeb\x88\x58\xfa\xaf\xea\x0d\xd9\xf5\x75\x87\x58\xfa\xad\xce\xdb\xe5\xf1\xf6\xaf\xbe\xee\x9d\xe6\x5c\x83\x6a\xe1\x44\x1d\xed\x8d\x8b\x19\x2d\x2d\xee\x7c\x33\x6c\xd6\x9b\x6c\xde\x27\xf2\x77\x94\xcd\xe3\xf0\x10\x7f\xc6\x31\x17\xe8\x22\xe1\xd1\x3d\xba\x22\x9a\xe9\x7a\xcc\xf4\x2c\xd9\x3c\x7e\x4a\x08\xef\x15\x5e\xb4\xd9\xd9\x26\x68\xc5\x19\x95\x3c\x6b\xbe\x2f\x0e\x97\x76\xf2\x08\xf7\x5c\x8b\x50\xa5\x76\xf3\x73\x06\x7b\x56\xdb\xad\xef\xc2\xeb\x4a\x4e\x3c\xd3\xa7\x13\x1e\x99\x2c\x60\x3b\x9e\xb5\xef\x97\xfc\x61\x22\xf9\x24\x17\x64\x42\x3b\x18\x74\x7b\x0c\xf3\x9e\x6c\xb4\x15\xbb\xe7\x40\x4d\xb5\x40\x66\x90\x5c\x6b\xa0\xf4\x73\x45\xb9\x3f\x5f\x5c\xdd\x0a\x92\x9d\xfa\x3c\xe0\x19\x91\xd1\x59\x44\xd2\xe5\x99\x69\xe1\x59\x4e\x8a\xbd\x44\xfa\xce\x8a\xad\x07\x64\x26\xe2\x49\x62\x02\xb3\xf9\x1d\xba\x24\xe9\xd2\x35\x7c\xe8\x51\x3f\x1d\x22\x70\xca\x79\x5f\x20\xd4\x91\xaa\x13\x1e\x22\xfd\x04\xce\x90\xb7\x99\xb2\x79\xbf\x24\x14\x87\xda\x3e\xcf\x3a\xd5\xe6\x23\x4e\xce\xe3\xc2\x29\x8f\x02\x3c\x65\xdf\xdf\x33\x04\x4b\xb6\x1e\x23\xc1\x15\x34\xbd\x03\xa6\x3b\x26\x31\xe2\x6b\x92\x65\x34\x26\x02\xb9\x3b\xc8\x97\x52\x69\x72\xe8\x79\x3b\xe2\x36\x3f\x39\x6e\xf3\x0e\xe2\xd0\x48\xcb\x43\xc1\x35\xa5\x9f\x6c\x5d\x53\x38\x5e\x51\xf6\xec\x2e\x2a\x11\xe1\x84\x4c\x3f\xf5\x90\x3f\x4c\x8d\x50\x04\x99\x99\x87\x1e\x7e\x5a\x0b\x2a\xd9\xaf\x6e\xdf\x20\xc6\xe3\x36\x95\xea\x23\x08\x12\x0b\x2c\xc9\x43\x2b\x39\x9c\x14\x17\x55\x7b\x49\xcd\x9c\x3e\xa5\xc8\xf1\x2c\x30\x02\xbd\x3d\x0f\xa0\x67\x43\x12\x55\xb3\x6a\x7d\x95\x93\x50\xcb\x87\xdf\x2d\x83\xee\xda\x1d\x7c\x7e\x3d\x45\x3f\x43\xf1\x61\xd1\x0b\x33\x2e\x81\x0d\xbc\xe2\x2b\x4c\xfb\x26\xd9\x28\x57\x2f\xa3\xaf\xfa\x43\xb8\x76\x65\x91\x29\xec\x25\x70\xb9\xa3\x8b\x5c\xc9\x74\x46\x0e\x7b\x56\x00\x73\x5b\xac\xcb\xf3\x05\x98\xdb\x3f\x1b\x84\xa7\x72\xb2\x7e\x91\x05\xc7\x62\x97\x52\x93\x12\x67\x03\x45\x82\x30\x41\xb5\x41\xc6\xb3\x8a\x9b\x4c\x7f\x90\x5a\x12\x9c\x20\x81\xc5\x19\xa3\x8f\x7c\x41\x99\x3d\xbd\xdc\xd8\xeb\xee\x30\x4d\xba\x4e\xc6\x91\x27\x79\x72\x9e\x44\x88\xe4\x3d\xc3\xf3\xa4\x8b\xbb\x41\xb8\xd5\x5c\x45\xf4\x21\xc1\x0b\x44\xf4\x1f\x67\x31\x15\xea\x5f\x34\x9b\x7d\xd4\x4a\xf8\x9c\x59\x8e\x59\x2b\xa8\xcd\xdd\xe7\x82\x14\xe0\x20\x0e\x7b\x76\xe0\xea\xd9\x01\xfd\xcf\xab\x89\x28\x8b\x55\xc7\xbd\x54\x70\xe0\x24\xa5\x4b\x00\x1e\xa2\xf3\xf9\x05\xb7\x81\x39\x41\x37\x4b\x1a\xdd\x5f\x7b\x7a\x77\x9e\xa9\x67\xcc\x7b\x14\x10\xb0\xf2\xbb\x21\x6f\x4b\xd3\xd5\xeb\xfe\xa2\xb1\x57\xd3\xd2\x01\x7b\x61\xcc\xcc\xf8\xf5\x3b\x2c\x04\x8f\x68\x61\x73\xd1\x3a\x9a\x82\x38\xc4\x9a\x38\x0c\x3b\x26\xcd\x1e\xf4\x1d\x0e\xf0\x1f\x15\x14\xcd\xae\xa6\xcd\x8e\x2b\x7c\x0a\x46\x99\x1d\xf5\xa0\x43\x80\x3d\xb3\x03\x34\x7a\x51\x71\x1b\x1a\xdd\x32\xc3\x25\xc3\x82\x75\x53\x37\x8b\x67\x19\x31\x9b\x9b\x73\x6b\xf9\x1c\x44\xba\x81\x26\x1c\x6c\xe0\x5d\xc2\x36\xaa\xc4\xf0\x92\x35\x11\x9e\x19\x53\x83\x3e\x73\x29\x4f\xf3\x04\xfc\x39\xf6\xc7\x77\xb7\x3a\x63\xf8\xce\x40\xa6\x87\x43\xa0\x96\x8e\x7c\xc7\xde\xfe\x9e\xce\x5f\x07\x76\xa9\xc7\xdc\xfd\xf0\xe3\xbb\x77\x2f\x1d\xcd\xb4\xab\x08\xfe\x18\x70\xa6\x1d\x55\xb4\x15\xf1\x45\xd3\x63\x7c\xd1\xb7\x1b\x5f\xf4\xf8\x28\xb4\x03\x47\x10\xf5\xf4\xcd\xed\xe7\x97\xdb\x3d\x46\xa8\xb3\xf7\x6e\x5f\xcf\xdd\x1e\x51\x40\xc3\xc6\xfe\xf4\xf6\x65\xed\x13\xe7\x73\x8c\xee\xf9\x5a\xa3\x7b\x76\xf1\x65\xed\x1f\xc9\xd3\xc7\x87\xf5\x6b\x8c\xda\xe9\x71\x38\xbb\x47\x97\xec\x1d\x53\xd2\x1f\x04\xb0\xbf\x3e\x6d\x97\x84\x54\x45\xcd\x4a\x09\xd2\x06\x95\x5b\xec\xb1\xd1\x48\x78\xd0\x62\x92\xab\x13\x78\x10\x81\x04\xf5\x90\xc6\xa0\x79\xde\x27\x37\xa4\xa9\xf3\x69\x56\x32\xcc\xb8\xc7\x4f\x63\x8f\xf9\x16\x0c\x1e\xc7\x9c\x2e\x2f\x44\xe5\x2e\x02\xb4\x16\xab\xad\xd0\x57\x80\x26\xe4\x7c\xee\xa3\x44\x16\x47\xe7\xfc\x7a\xaa\x64\x70\x1d\x46\x84\x13\x71\x8a\x2a\xe8\xbc\x55\x97\x1a\xbe\xc0\xd2\x77\x2c\x25\x59\xa5\xb2\xfb\xaa\x1f\x35\xee\x4f\xae\x71\x1f\x50\x03\xb8\xcc\x57\x98\x4d\xd4\x89\xd2\x3a\xf7\xc0\x5a\x57\xba\x99\x4f\x91\x39\x3b\x40\x9e\xb4\x06\x44\x07\x17\x84\x89\x8d\xb1\x97\xe6\xf2\x71\xd4\x9e\xba\xed\x9d\x47\x0e\x74\xb5\x74\xd2\x22\xbe\xe5\xf0\x6a\x86\xe3\x66\xc1\x1e\x2a\x8f\x38\x07\x62\xb8\x5c\x12\xa0\xe1\xd7\x3a\x20\xa7\x28\x15\x72\xd2\xc0\x4a\xe3\x24\xe1\x0f\xf0\x6d\x9f\xae\xa9\xd9\x57\x7d\x31\x91\x66\x73\x82\x56\x54\xc9\xe8\x46\xc1\xea\x77\x07\x4c\xa6\x8a\x23\x27\x19\x30\xbc\x99\x31\xb6\xcd\x88\x34\x0b\xa5\x17\x5a\xc9\xb7\x0c\x1c\xc2\xd5\xff\xad\x57\x91\xfe\xb6\xbd\x13\xe6\x64\x89\xd7\x94\xe7\x19\xd4\x96\x1c\x9d\x98\x57\x9a\x36\x6c\x78\xee\xf4\x5d\x90\x0c\xd3\x8d\x4e\x54\xcc\xd3\xef\xc5\x4b\x2d\x0a\xc4\xdc\xaa\x26\x26\xe4\x0b\x15\x72\x7b\x2c\x76\x8a\x2c\x0c\xde\x50\xfb\x66\x2d\x52\x45\x16\x7a\x67\xb5\x0b\xea\x85\xfc\xca\x7a\xa6\x5f\xbd\xa0\x9c\x76\xad\xe8\xae\x07\x63\x81\xbe\x41\xf6\xc7\x59\xc2\x12\x1a\x6d\x7a\xa7\x7b\x2b\xd5\xb6\x97\xb6\x70\x36\x34\xf5\x1c\x5d\x60\x41\x62\xf4\x1b\x66\x78\x01\xf2\xde\xab\xd9\xf5\xc5\x6f\xaf\xd5\xba\x6a\x79\x72\x7a\x55\x69\x68\x9b\xf9\x8d\xff\x3e\x64\xbc\xc8\xd6\xc0\x77\x20\x55\x5b\xf5\x77\x1c\xfc\xa0\x81\x30\xc8\xd1\xa1\x6e\x60\xbd\x15\x24\xe8\xba\x1c\xc2\x5a\xce\xf9\x59\xba\x60\xd6\xab\x78\xcf\x2c\x9f\x94\x09\x89\x93\xe4\x3a\xc1\xec\x3c\x4d\x33\xbe\xae\x96\xc6\x83\xbe\xda\x82\xb6\xa7\xe0\xe6\x61\x1f\xa6\x30\xf5\xda\x84\xcd\xd0\xb4\x68\xff\x14\x4d\xa5\x93\xc2\x39\xd3\x24\xf5\xe4\x3c\x97\x7c\x85\x25\x8d\x4e\x94\xb0\x7e\xf2\x1b\x66\x39\x4e\x2a\x9d\xae\x1a\x87\x51\xc7\x22\x36\x56\xaa\x87\xae\xeb\x50\xad\x91\xd7\x68\xae\x2f\x71\xa6\x6e\xa7\xcb\xd9\x1f\xbd\xea\x0a\x89\x65\xbe\x75\x0b\x37\x50\x86\x7a\x5a\x30\x41\x09\x16\xf2\x36\x8d\xd5\xa1\x2f\xbd\x6d\xba\xf0\x23\x2c\x71\xc2\x17\xbf\x10\x9c\x54\xef\xf0\x60\x9f\x5c\xfa\xa5\xad\x02\xca\x18\xfc\xf3\xb9\x2b\x38\x12\x48\x31\xd8\x36\x06\x3e\x23\x09\x59\x63\x26\x6d\x75\x48\xae\x2e\x46\x66\xfc\x7a\x17\xd1\x42\xf9\x1a\x13\x49\xb2\x15\x65\x61\x9b\x33\x5d\xf6\x92\xb3\x98\x82\xda\x51\x2b\xd4\xa0\x46\xd8\x6e\xfd\x56\xab\xb3\x34\x34\xd8\x16\x42\x74\x4d\xaf\x3f\xe1\x54\x40\xb1\xb9\xe1\x2f\x97\xf0\x50\x5b\xda\x83\xbe\x6d\xcd\x14\xba\x67\x8a\x31\xd4\x38\x22\xd5\xd7\x56\x2b\x9f\xd0\xc6\x1f\x4c\xec\x1a\x43\x17\xea\x1d\x47\x27\xa6\xdf\x75\x36\x88\xa6\x2d\x06\xbf\x76\xce\xa2\xdc\x95\xfa\x3b\xb5\x6a\xdf\xb9\x6a\x10\xc9\x52\x4a\xc8\x1f\x14\xaa\xa7\x01\x9d\x18\xaf\x6e\x3c\x52\x57\x54\xfb\xf0\xae\x2d\x30\xd8\xb7\x44\xd9\x0e\x1c\x63\x2b\xd1\xea\x08\x2e\x1f\x0a\xd6\x53\xe3\xff\x97\x19\x51\x04\xa3\x94\x12\x00\x3f\xc1\xcc\x4c\x96\xa6\x2c\x04\xc7\xe6\xa1\xa2\x60\x4a\x24\xd4\xef\xc6\xc6\x18\x0e\xca\x65\xe3\x6b\x61\x15\xd4\x18\xc0\x3f\xb4\xe1\xe2\xec\x67\x6e\x94\xbc\x26\x48\x57\xdd\x01\x9a\x92\x8f\x91\xc8\xa3\x25\xc2\x42\x75\x4d\x6d\x68\x75\xe2\xc9\xe9\x0a\x33\x7a\x47\x84\x3c\x75\x28\xc1\xe2\xcf\xb7\x7f\x9d\xa2\x0f\x3c\x43\xc6\x51\x7d\x6c\x51\x35\x4c\x3f\x8b\x7d\x41\x05\x0c\xc6\xd5\x2d\xa4\xd6\x94\xc7\xa6\xd3\x0f\xba\xb3\x12\xdf\x2b\x1a\x06\x9d\xcd\x89\x36\x5d\xfc\x1f\x3a\x51\x6c\xa2\xf7\xe9\xbf\x15\x59\xfa\xe7\x04\xbd\x7a\xd0\x44\xfb\x44\xfd\x79\x02\x1f\x74\x6e\x93\xbe\x50\x5d\x7c\x18\x82\x25\x33\xba\x58\x90\x0c\xc4\x47\xa4\x83\x0a\x5f\x1b\x54\x10\xc6\xbd\xc2\xd6\x28\x5d\x88\x9b\xe5\x8e\xfc\xf9\xf6\xaf\x13\xf4\x2a\x1c\x17\xa2\x2c\x26\x5f\xd0\x5b\xd0\x2e\x53\xa1\xc6\xf8\xda\x18\x73\xc4\x86\x49\xfc\x45\xb5\x19\x2d\xb9\x20\x0c\x44\x79\xc9\xd1\x12\xaf\x09\x12\x5c\x49\xc0\x24\x49\x26\x46\x97\x8e\x1e\xb0\x46\x6a\xb1\x53\xa9\x03\xeb\x51\x8a\x33\x19\x6c\x89\x53\xa3\x21\xd1\x5f\x53\xcb\xb6\x60\xd6\x32\x7d\x47\x99\xb1\x5f\x19\xcb\x99\x5a\x73\x1d\x18\x0a\x8b\x24\x39\x8a\x96\x98\x2d\x5c\x6c\xfa\x5d\x2e\xf3\x8c\xb4\x98\x7e\x3a\x9e\x81\x7b\xca\x7a\x85\x30\xff\x4a\x59\xd9\xa9\xa0\x5a\xaf\xb4\xa0\xd2\x46\x45\x18\x5f\x45\xb9\x39\x53\xab\x90\xd1\x79\x2e\x79\x26\xce\x62\xb2\x26\xc9\x99\xa0\x8b\x09\xce\xa2\x25\x95\x24\x52\xc3\x3a\xc3\x29\x9d\x44\x9c\xa9\x15\xd7\xa8\x0c\xab\xf8\x7b\x9d\xde\x74\xa2\xba\xda\x82\x3a\xdd\x71\xd0\xed\x4a\xb5\x27\x55\xa6\x0d\x36\xc6\x0e\xfa\xa0\xed\x81\x82\x6e\xe6\x00\xa3\xd5\x8a\x90\xb3\x41\x06\x6b\x41\x93\xfb\xd3\x98\x91\xc1\x01\x8f\xca\x6d\xa8\x63\x07\x0e\x24\xfa\x54\x06\x37\xe5\x0a\xc7\x70\x95\x62\xb6\x79\xf4\xcd\xaf\xa6\x54\xc3\xe5\x47\x9b\x89\x6e\x82\x27\x13\xcc\x62\xf5\x7f\x08\xd8\x89\x36\x83\xcc\x61\x4e\x7b\x5d\x04\xb7\xd3\xab\xc3\x1c\x89\x9c\x0e\x70\xea\x0d\xbf\xd6\x91\x89\x02\x56\x15\x1c\x35\xb2\x9c\x58\xa2\x19\x32\xa8\x54\xd8\x56\xff\xdf\xd8\x5f\x1c\xda\x59\x1b\x4b\xd5\x6c\x35\xf1\x78\xc7\x8e\xfd\xfd\x58\xd4\xf0\x75\x72\xda\xf1\x0a\x0b\x69\xa0\xb5\x2c\x06\x41\x30\x0c\x2b\xa0\x68\x02\x53\x6f\x18\xee\xb4\x87\xac\xbf\x80\xea\xc8\xa4\x12\x73\x29\x72\x42\x49\xbb\x00\x55\xc8\x2f\x41\x1e\x34\x18\x94\x24\x42\x22\xbc\xc6\x34\xd1\xda\x79\x3e\x17\x24\x5b\x43\x42\x2a\x03\x35\x88\xcb\x72\x96\xc9\x39\x01\x6c\xd4\x81\x24\x1f\x3b\x86\xed\x55\x69\x1a\x80\x96\x86\x4a\xbd\xaf\xed\xf5\x20\x72\x0f\x88\x97\xb5\xaf\xd5\x17\x76\x14\x63\xd4\xfe\xfb\x85\xe0\x4c\xce\x09\x96\x37\xb4\x89\xee\x6e\x6d\xe9\xa0\x9e\x4b\xe5\xee\x36\xf4\x03\x41\x0b\x2e\x15\x8b\x95\xeb\xbd\x0f\x3c\x29\x80\xfa\xb8\x8d\xf6\xd8\x3b\xba\x18\xe5\x4d\x86\x75\x88\x0f\x67\x3d\x87\x19\x56\xdc\x1e\xa7\xe1\x8e\xcd\x4e\x92\x50\x1a\x80\x34\x38\x23\x66\xed\xc0\x9a\xa1\x6f\xa0\xc3\x0c\x79\x45\x84\x68\x04\xd8\x08\xbd\x0b\xa1\x34\x1c\xe5\x92\x69\x6d\x65\xdf\x41\x58\x88\x62\xa0\x63\x22\x31\x4d\xec\x51\x86\xa9\x70\xb3\xd4\x76\xbb\x36\x0e\x30\x23\x58\x34\x31\x08\x41\xaf\x3f\xeb\xc2\xd0\x69\xce\xc8\xe4\x81\x67\x31\xba\xc4\x2b\x92\x5c\x62\x41\x4c\x5b\x7e\x88\x1e\xac\xd1\x48\x0c\xda\xe5\x6a\xdd\x57\x4d\x97\x41\xf9\x53\xa8\x84\xf5\x5f\x85\x88\x05\x1d\x1c\x5b\x15\xe4\x4d\x96\x93\x31\xfa\xa0\xa8\xd7\x18\xdd\xb2\x7b\xc6\x1f\xf6\xeb\xab\x6c\xb4\x82\x04\x3d\xf5\xdd\x3f\x2c\xac\x4e\xa0\xf0\x71\xdd\xdd\xb1\x47\xe6\xc2\xaf\x51\x35\x86\xc4\xc6\x15\xb5\x3d\x52\xff\xdd\x52\x41\x29\x41\x31\xe3\x8b\x8c\x08\x40\xae\xa9\x04\x49\xec\xaa\x72\xfe\x99\x30\x13\xdc\xd7\xda\xbd\x69\x55\x2d\xdb\x53\x4b\xd7\x16\xc5\x1b\xb3\xde\xe6\x63\x69\x52\xc9\x6a\x34\x7b\x04\x7a\x1d\xad\x51\x3e\xd5\xf5\xb0\x5a\xe9\xe4\x51\x3d\xaf\x2c\x30\x25\x4d\xda\x51\x3b\xba\xcb\xd9\x1f\xf5\x93\x5d\x4b\xfb\xda\xe8\x53\xbb\x5a\x6a\x5f\x85\x54\xeb\x99\x69\x55\x42\x1d\xd5\x4f\x47\xf5\xd3\x4b\x52\x3f\xb5\xee\xf8\x26\x95\xd3\xcb\x50\x36\xb5\x0e\xb1\x49\xc1\xf4\x2c\x55\x4b\x9d\x46\xd4\xa8\x4e\x7a\xb6\x8a\xa4\xd6\xa1\x75\x54\x1e\x7d\x3b\x6a\xa3\xd6\x19\x6b\x50\x15\x3d\x43\x25\x51\x17\x86\x8c\xc4\x5d\xd8\xc4\xa9\x57\xd8\x67\x14\x8b\x74\x96\xae\x39\xeb\x94\xe3\xb3\x33\xbb\x72\x8b\x8a\x81\x6b\xed\xdb\xc8\x74\xae\x3b\xef\x65\x18\x46\x93\xec\x71\xab\xb3\xe8\xea\xfd\xf5\xe7\xf7\x97\xe7\x37\xef\xaf\xca\xfc\x5d\xd5\x4c\xb7\x70\x62\xcd\x3a\x88\x89\xc7\x89\xd5\x14\x50\x17\x72\xcd\x2b\xb5\x07\x6a\x5e\xe5\x39\xad\xaa\xb5\x3f\x5f\xb8\x17\x95\xdb\x8b\x7e\xb4\x9f\xce\xae\xc7\xf3\x16\x1c\xa7\xb0\xf1\x39\x53\x7c\xcf\x92\x27\xb1\xb0\x7e\xab\xd3\x2b\x17\x49\x45\x59\x94\xe4\xb1\x62\x2e\x6e\x6f\xa7\x57\xe2\x14\xa1\x0b\x12\xe1\x5c\x68\x2d\x4c\xcc\xd9\x48\xa2\x4f\xbf\x7f\xfc\xb7\xf6\xc7\xd6\x25\xc6\x0e\xd7\x44\xa3\xf2\x52\x0c\xc0\xc2\x12\xe0\xda\xd0\x05\x01\x46\x45\x7f\x39\xc2\xa9\xba\xc5\x04\x64\xae\x90\x9a\x17\x59\x92\x24\x55\x37\xe6\x3d\x41\x05\x82\xaa\x6a\xb8\xc8\x30\x6f\xdd\x27\x17\x44\x42\xd4\x55\x93\x87\x64\xe3\xac\xb5\x68\x5c\xf7\xd0\xb5\x06\xe2\xa3\x91\xc6\x1f\xb0\x30\x1a\xab\xca\xde\xb6\xac\x6f\xbb\x7e\xa6\x5e\xc5\x51\xa3\xdc\x80\xeb\x59\xff\xb5\xd5\x67\xd5\xd9\x42\x8f\x01\x4e\x24\x54\x76\xd6\xa6\xd6\xbb\x01\x55\xe7\x01\xd8\xd2\x65\x90\xf2\x24\x07\x1f\x76\x1e\xd9\x5e\x97\xbb\xf5\x45\x27\x11\x89\x83\xdc\x9f\xc6\x7f\x2e\x7c\x96\xcf\x5d\xf6\xd7\xa2\xbf\x46\x23\x83\xfe\xfe\xe7\xbb\xef\xfe\x17\x00\x00\xff\xff\xbb\x9b\x0c\x85\x9e\x75\x0b\x00") -func olmManifests0212CrdsYamlBytes() ([]byte, error) { +func olmManifests0220CrdsYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0212CrdsYaml, - "olm-manifests/0.21.2-crds.yaml", + _olmManifests0220CrdsYaml, + "olm-manifests/0.22.0-crds.yaml", ) } -func olmManifests0212CrdsYaml() (*asset, error) { - bytes, err := olmManifests0212CrdsYamlBytes() +func olmManifests0220CrdsYaml() (*asset, error) { + bytes, err := olmManifests0220CrdsYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.21.2-crds.yaml", size: 703484, mode: os.FileMode(420), modTime: time.Unix(1655230541, 0)} + info := bindataFileInfo{name: "olm-manifests/0.22.0-crds.yaml", size: 751006, mode: os.FileMode(420), modTime: time.Unix(1661216763, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _olmManifests0212OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdd\x6f\xe3\xb8\x11\x7f\xf7\x5f\x31\x30\x0a\xa4\x2d\x56\xfe\xdc\x64\x53\x01\x07\x5c\x9a\xdb\xbb\x3d\x74\x93\x18\x71\xb6\x2f\x45\x51\x50\xd2\x58\x66\xc3\x0f\x1d\x49\xd9\xeb\x2b\xfa\xbf\x17\x14\xf5\x6d\xda\x49\xbc\xd9\xee\x3d\x1c\x5f\x6c\x93\x33\x9c\xe1\x70\x34\x1f\x3f\x39\x08\x82\x01\xc9\xe8\xdf\x51\x69\x2a\x45\x08\x9b\xe9\xe0\x91\x8a\x24\x84\x5b\xc2\x51\x67\x24\xc6\x01\x47\x43\x12\x62\x48\x38\x00\x10\x84\x63\x08\x92\xf1\xc1\x69\x8c\x19\x2a\x62\xa4\xd2\x05\xbb\xa3\x5f\xa2\xda\xd0\x18\xaf\xe2\x58\xe6\xc2\xf4\xf7\xf4\x0a\x0f\xaa\x7d\x02\xed\x98\x49\xc9\xec\x68\x0a\xe9\x7e\x2d\x55\x44\xe2\x11\xc9\xcd\x5a\x2a\xfa\x2b\x31\x54\x8a\xd1\xe3\xa5\x1e\x51\x39\xae\xf5\xbf\x66\xb9\x36\xa8\xee\x25\xf3\x9d\x40\xef\xb4\x41\x1e\xc6\x52\x18\x25\x19\x43\x15\xd6\xba\x30\xba\xc2\x78\x17\x33\x0c\x38\x11\x24\x45\x35\x50\x39\x43\x1d\x0e\x02\x20\x19\xfd\x49\xc9\x3c\xd3\x21\xfc\x63\xf8\xe7\xe1\x3f\x07\x00\x0a\xb5\xcc\x55\x8c\xad\xa9\x0d\xaa\xa8\xfe\x19\x80\x90\xe2\xbe\x24\xfa\x74\xff\xf1\x20\xdd\x17\x9d\xf0\xaf\x54\x24\x54\xa4\x4f\x99\x39\x72\x64\x81\x35\xa9\x92\x0c\xef\x71\x65\x29\xab\x63\x1d\x91\x3a\x00\xd8\x37\xeb\x49\xc6\xd4\x79\xf4\x6f\x8c\x4d\x61\x4f\xaf\xe7\xbc\x8a\x83\xd4\x1e\x3a\x8a\xa5\x42\x69\x3f\x78\x63\xb9\xbb\x8f\x37\xd7\x52\xac\xa8\xcf\x60\xb1\x3b\xe0\xde\x8e\x24\xcb\x74\xb3\xc3\x0f\x98\x31\xb9\xe3\x28\xcc\x13\x36\xdf\x57\x15\x80\x91\x08\x99\xb6\xf4\xd6\xf6\x59\x8f\x41\x67\x18\xdb\x35\x6d\x14\x31\x98\xee\x1c\x9d\xd9\x65\x18\xc2\xbd\x64\x8c\x8a\xf4\x53\x96\x10\x83\x85\xf7\x65\x8c\xc6\x44\x87\x30\xb5\x1c\xc8\x30\x36\x52\x39\x0e\x4e\x4c\xbc\xfe\xd8\x12\xe5\x13\x06\x60\x90\x67\x8c\x18\x2c\x99\x5a\x87\xb1\x83\x75\xf8\xfd\x3b\x00\x54\x2a\x17\xdf\x3b\xb7\x79\xfb\x8c\xab\xb4\xc3\xfa\x0e\xa1\x02\x55\x4b\x56\xe0\x37\x67\x35\x62\xc9\x39\x11\x49\xd8\x9a\x0a\x60\x1c\x51\x31\x76\x56\xae\x55\x56\xa9\xee\x12\x05\x41\x7d\x25\x9d\xf9\x3f\xfc\xf1\x6e\xf1\xfe\xfe\xea\xe1\xee\xfe\x5f\xb7\x57\x37\xef\x97\x8b\xab\xeb\xf7\x7f\xea\x71\x6e\x15\x35\xb8\x34\xc4\xe4\xda\x9e\xad\xb3\x3a\x1c\xb6\x7e\x52\x4e\x52\x0c\xe1\x97\x9c\xec\xec\x53\x5b\x1f\x7f\xa5\x08\xc7\xad\x54\x8f\x56\xcd\xef\xf5\x9a\xcc\xce\x2f\xc2\xf9\x2c\x89\xde\xcd\x67\xef\xde\x5e\x5e\xcc\xa3\xc9\x65\x8c\xab\xd9\xfc\x5d\x32\x99\xcd\xa7\x6f\xc9\x5f\x92\xcb\xf8\x72\xf6\x0e\x93\xd9\x6a\x3e\x5f\x4d\xa2\xc9\x64\x7a\x71\x91\x24\xf3\x68\x72\x7e\x4e\x56\x17\xf3\x28\x9a\x4f\xfb\x72\x17\x39\x63\x0b\xc9\x68\xbc\x0b\xe1\xe7\xd5\xad\x34\x0b\x85\x1a\x6b\x6b\xdb\x91\x49\x65\x3a\x76\xb1\x27\xa8\xaf\x61\x21\x95\x09\xe1\x72\x72\x39\xe9\x50\x54\x1e\xce\xd1\x28\x1a\xeb\xd6\x1a\xa3\x1b\x14\xa8\xf5\x42\xc9\x08\xbb\xdb\xae\x8d\xc9\x7e\x42\x13\xf6\x76\xca\x88\x59\x87\x30\x5e\x23\x61\x66\xfd\x6b\x7f\xf1\x90\x7c\x1d\xaf\xd1\x6a\xf0\xe1\xe1\x61\xd1\x5a\x52\x48\x12\xfa\x0d\xe5\x1b\x54\x9c\x8a\x22\x62\xde\xa0\xd6\xf6\x0a\x4a\xf3\xff\x48\x18\x8b\x48\xfc\xf8\x20\x3f\xca\x54\xdf\x89\xf7\x4a\x75\xdc\x18\xc5\xa6\xeb\x9d\xce\xc2\xfb\x9e\xd8\x51\x64\x43\x58\x8e\x3f\x2a\xc9\xfb\xa7\x5a\x51\x64\x49\x19\xd7\x3d\x2b\x8b\xe2\xd0\xd5\x53\x3e\xf2\x3f\x07\x1e\x0d\xf6\x85\x1f\x7c\x2e\x9b\x8c\xd8\x61\x52\xf8\x4b\x8e\xba\xef\x72\x00\x71\x96\x87\x30\x9d\xf0\xde\x34\x47\x2e\xd5\x2e\x84\xe9\xc5\xe4\x86\x96\x6b\x42\x26\xb8\xec\xc4\x38\x3b\x1e\xf3\x08\x95\x40\x83\x45\x76\x94\x3a\x04\x46\x45\xfe\xf9\x4b\x02\x78\x4c\x0c\x61\x32\x7d\x59\x10\xdf\x63\xfa\xda\x81\xdc\xa3\xe5\x09\xc1\xdc\xb3\xcb\xd7\x0e\xe8\x5e\x91\x15\xdb\xa1\xa0\x5e\x32\x1d\x0d\xec\x67\xad\xc8\x7e\xd6\x59\xe9\xa6\x04\x1b\xc8\xe3\xa2\x00\xe0\x24\xb3\xe5\x07\xaa\x9f\x6d\xd8\xfc\xee\x48\xb4\xae\xe9\x9b\x83\x2b\x4c\xa9\x36\x6a\x17\x5a\x93\x6b\xd3\x13\x90\x1b\xca\x82\x22\x1a\x77\x16\xbe\x51\x46\xf8\x3d\x13\xfd\x9e\x89\x9e\xc8\x44\xaf\x1b\xb8\x2f\xbf\x24\x6e\xef\xf7\x1a\xcf\xee\x8d\xf6\xa3\x39\x49\x53\x85\x29\x31\x68\xfb\x9e\x00\x13\x6a\x7a\xe1\xfb\xf0\x7e\x0d\xab\x91\x01\x49\x38\x15\x21\x0c\x8d\xca\x71\xf8\x12\x46\x2b\xb2\xe6\xf3\x37\x93\xbe\x7e\x65\xbf\xbf\xd4\x79\xa4\x63\x45\x33\x2b\x49\x77\x7b\xc8\x58\x21\x31\x38\x7c\x03\xc3\xbc\xc8\x29\xf6\x5b\x66\x13\x87\xfd\x92\x20\x43\x83\x45\x37\x7a\x82\xd4\xb2\x23\x2a\xc3\xfc\xc6\xdd\x82\xb6\xfb\x96\x31\xb9\xa4\xb5\x33\x54\x68\x43\x18\xcb\x18\x71\x14\x47\x34\x6e\x94\xfa\xba\x17\xbe\xa1\xb8\xfd\x96\x17\xfe\x02\x3e\xab\xea\xab\x38\xca\xeb\x5d\xd9\x1b\xa8\x45\xa6\x85\x12\xdd\x4b\x4c\xd1\x58\x12\x46\x75\xf1\xb9\x2d\x3c\x6e\xcf\xcf\x32\x12\x3f\x92\x14\xf5\xe8\x79\xda\x97\xe4\x9c\x08\xba\xb2\x91\xc7\xf9\x72\x77\x6e\x4c\x63\x29\x9e\xa7\xcb\xcb\xa0\x81\x72\xb5\x50\xde\xe3\x5b\x29\x93\x11\x61\x41\x83\x80\x75\x4b\xc3\x0e\x30\xf6\x7a\x52\xdb\xf5\x56\x5f\x24\xe3\x75\xa5\x69\x88\x4a\xd1\xd4\xc8\x5d\xe9\xed\xc1\x4b\x10\x12\xc2\xb2\x35\xe9\x21\x4c\x25\x40\x53\xb2\x7a\xd4\xab\xee\xb7\xa8\xa4\x9e\x2a\x96\x25\xe3\xa3\x4d\x0d\x0d\x4e\x46\xb3\xe9\x68\x56\x9f\x20\xa1\x3a\x63\x64\xe7\xaa\xcc\x85\xdb\x16\x96\xd5\xbe\x09\xd6\x9e\x19\xc2\x3d\x66\xae\x94\xd0\x40\x44\x6d\xc1\x4a\x17\x30\x6b\x62\x80\x6a\x20\x1b\x42\x19\x89\x18\xc2\x4a\x49\x0e\x04\x52\x5b\x1f\xc0\xb5\x7b\x0e\x96\x85\xd7\xc1\x76\x4d\xe3\x35\x6c\x29\x63\x85\x27\xb2\x0d\x82\x91\x40\xfc\x06\x18\x0d\x00\x38\x15\x7f\xcb\x23\xac\xad\x39\x1d\x4d\xa7\x23\x9b\xa1\x1f\x71\xb7\x95\x2a\xb1\x0e\x79\xd6\xf7\xd9\xb3\x37\x70\x26\x19\xb7\x1f\x95\xc5\xce\xac\x07\x73\x42\xdb\xc5\x72\x55\x26\xdf\x63\x02\x1f\x88\xab\x94\x90\x13\xca\x8a\x4b\x13\x7a\x4d\x57\xa6\xf1\x86\xef\x15\x26\x6b\x62\xec\xf5\x0d\x00\x32\x25\x37\x34\xc1\x32\xcd\xf6\xf7\x61\x54\x3c\x76\x44\xec\x59\x18\x20\x57\x2c\x2c\x0a\x15\x1d\x8e\xc7\x29\x35\xeb\x3c\x2a\x5c\xc3\x57\x36\x1e\x44\xf9\xc6\x46\x21\x8e\x39\xb1\xc6\x1b\x67\x8f\xe9\xb8\x3c\x6f\x50\xbb\x48\x19\x75\x6e\x64\x82\xa5\x46\xae\x31\xba\xdb\x8a\xdb\x4e\x53\xaa\xf3\xcc\x96\x40\x98\x84\x60\xe3\x62\x8b\x74\x49\x45\xca\xf0\xb9\xd4\x37\x39\x33\xf4\xb9\xc4\x57\x8c\x35\x4f\xd1\x01\xda\xf2\x04\xce\xd2\x75\x8f\x07\x49\xd3\x58\x42\xaf\x93\x2a\xa3\xf2\xc2\x56\x68\xba\x88\xc8\xd5\x4a\x70\x62\x97\x05\x50\x66\x89\xea\x67\x3b\xf0\xf6\x2a\xea\x03\xb0\xee\x13\xd5\x5f\x00\x25\x60\x4b\xe2\x18\xb5\x56\x68\x73\x54\xbb\xdc\x76\xe1\xb7\x5f\xbd\x17\xd5\x48\x6f\x32\x45\xf3\x94\x9e\x3d\x0c\xcd\xab\x53\xd1\x1b\xb8\x56\xec\xa8\x1e\x5d\x81\xf6\xb7\xcd\x0c\x9d\x89\x22\x45\x3c\x43\x27\x6f\xda\x7a\x86\x9e\x9d\x5c\xfb\x7f\xd2\xf5\x78\xae\x7d\x5a\xe9\x7e\xd0\x3a\x59\xed\xe6\x41\x68\xb9\xb9\x3f\x5f\xb8\xd1\x7e\x54\x00\xfa\xb8\x49\x35\xfc\xf8\x49\xeb\x58\xed\x95\x7e\xcf\xc2\xc9\xe7\x4f\xa2\xce\x08\x0e\x6c\xe9\xad\x2f\x73\x95\xf6\x56\x1a\x70\x66\xd6\x56\x6f\xaf\xa3\x01\x3f\x58\x53\x8d\x02\x6e\xf1\x1f\xbd\x8f\xdc\xd4\xbb\xf5\x10\x9c\x6a\xf4\x91\x9c\x67\x89\xd8\xb7\x30\x9c\x0c\xef\x54\xc3\xdf\xda\x55\xe3\x50\x8b\xd7\xa5\xf2\x41\x45\x6e\x1c\xf7\x97\x86\x7f\x0f\x33\xaa\xd8\x0b\xe4\x68\x2f\xf7\xf4\xa9\x82\xcd\x77\x6f\x7d\xd3\x81\xc6\x38\x57\x18\xd8\xc0\xef\x59\x1f\x9e\xbf\x7d\x3b\x1f\x7a\x19\xcb\x2a\xd1\x07\xaf\x56\x44\x5d\x44\xca\x8d\x6f\x85\xd4\xb4\xa4\xb7\xf1\x9a\x2b\xb6\x25\x3b\xbd\x47\xe7\xc1\x6b\xc0\x87\xd9\x58\xf3\xec\x51\x1d\x41\x67\xdc\x38\x80\x91\xb8\xd1\xc6\x3c\x96\x5e\x8a\xa3\x58\x4a\xa3\xff\x01\xed\x8e\x81\x37\xbf\x01\xf5\x4e\xc7\x76\xaa\xe3\x79\x73\x7c\xb5\xe8\xc7\x79\xdc\x38\x80\xf6\xb8\x51\x61\x3e\xe7\x0d\xe6\xd3\x32\x8a\x7d\x88\xa8\xd9\x5d\x4b\x61\xf0\xb3\xd7\x72\x2a\x17\x57\xfa\x93\x46\x65\x45\x4c\xfa\x40\x17\xc0\x46\xb2\x9c\xe3\x8d\x8d\x3f\x5e\xc7\x73\x51\xc2\xf0\x6c\xb5\xef\xad\x00\xdc\xf2\xb9\x17\x1f\x63\xc3\xb3\x81\x6f\xef\x83\xa1\xc7\xbf\x29\xf2\xcc\xec\x7e\xa0\x2a\x84\xff\xfc\xb7\x28\xe0\x4d\x71\xc4\x10\x8a\xf6\xc9\x35\xa5\xdd\x06\xa7\x78\xcb\x5e\x86\xd2\x04\x57\x54\x50\xd3\x14\x80\x72\x2b\x30\xa9\x9a\xb5\xd4\xbd\x8a\x3f\x9a\xc7\x4b\x85\x36\xad\x7f\x58\xb8\x19\xd7\xb7\x95\x65\xfd\x4d\x99\xc3\x2b\x18\xae\x1d\x4b\xfb\xf9\xdd\xd7\x78\xf5\xf8\x3b\xdd\xd7\x55\x9f\xa8\xe8\xb5\x6a\x0f\x83\x14\x85\x55\x1b\x13\xd7\x76\xe1\x67\xaa\x0d\x15\x69\xb7\xef\xb2\x9d\x5b\x02\x66\x8d\x54\x81\x7b\x21\x7f\xd3\x14\x75\x4d\xfd\x70\x7b\x30\x09\xf8\x22\xce\x49\x8d\x6e\x5b\xab\x23\x7f\x78\x59\xe7\x11\x95\x41\xf3\x2a\xe2\x40\x1f\xee\x6c\xf0\x50\x54\x2a\xa9\xca\xe2\xc1\xc1\xd0\x5e\x6c\x58\xbd\xdb\x68\xde\x23\x74\x6e\xe3\x5a\x72\x9e\x0b\x6a\x76\x75\x93\x6b\x4d\x94\xe5\x11\xa3\x7a\x6d\x9f\x99\x6a\xfa\x43\x1e\xb9\x9a\xde\x41\x80\xcb\x4e\xfd\x54\xbd\xac\x58\xc8\xaa\x67\xb1\x2d\x8c\x41\xb5\x21\x2c\x84\x8b\x09\x1f\xfc\x2f\x00\x00\xff\xff\x9e\x71\xcf\x50\x44\x24\x00\x00") +var _olmManifests0220OlmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x6d\x6f\x23\xb7\x11\xfe\xae\x5f\x31\x10\x0a\xb8\x2d\xb2\x92\xec\xb3\xcf\xf6\x02\x01\xe2\xfa\x2e\xb9\xa0\xb6\x4f\xb0\xef\xfa\x25\x08\x0a\x2e\x77\xb4\x62\xcd\x97\x0d\xc9\x95\x4e\x29\xfa\xdf\x0b\x2e\xf7\x5d\x94\x2c\xfb\x2e\xb9\xa2\x08\xbf\x48\x5a\x0e\xc9\x87\xc3\xe1\xbc\x3c\xda\x28\x8a\x46\x24\x67\xff\x40\x6d\x98\x92\x31\xac\x8e\x47\x8f\x4c\xa6\x31\xdc\x11\x81\x26\x27\x14\x47\x02\x2d\x49\x89\x25\xf1\x08\x40\x12\x81\x31\x28\x2e\x46\x00\x9c\x24\xc8\x8d\x7b\x0a\x90\xab\x34\x32\x48\x0b\xcd\xec\x66\xf2\x58\x24\xa8\x25\x5a\x34\x13\xa6\xa6\x28\x17\x4a\x53\x8c\x41\xa3\xb1\x9a\x51\x8b\xe9\x81\x43\xa2\x55\x8d\x8a\x13\x8b\xc6\x8e\x5e\x06\x36\x47\x4d\xac\xd2\xe6\x05\x90\x13\x62\x90\x33\x89\x9f\x03\xd8\x23\x7c\x40\xbd\x62\x14\xaf\x28\x55\x85\xb4\xc3\x5d\x04\x55\x1c\xd5\xc8\x23\xe3\x07\x93\x6a\xb0\x97\x29\xf7\xeb\xcf\x62\xa8\x17\x9d\x10\x3a\x21\x85\x5d\x2a\xcd\x7e\x25\x96\x29\x39\x79\xbc\x28\x81\x36\x1a\xbb\xe6\x85\xb1\xa8\xef\x15\x0f\xe9\xcc\x6c\x8c\x45\x11\x53\x25\xad\x56\x9c\xa3\x8e\x1b\x2c\x9c\x2d\x90\x6e\x28\xc7\x48\x10\x49\x32\xd4\x23\x5d\x70\x34\xf1\x28\x02\x92\xb3\x1f\xb4\x2a\x72\x13\xc3\x4f\xe3\xbf\x8e\x7f\x1e\x81\x3b\x73\x55\x68\x8a\x9d\x47\x2b\xd4\x49\xf3\x33\x02\xa9\xe4\x7d\x25\xf4\xf1\xfe\x66\xa7\xdc\x67\xed\xf0\x6f\x4c\xa6\x4c\x66\x4f\xa9\x39\xf1\x62\x91\x53\xa9\x56\x1c\xef\x71\xe1\x24\xeb\x6d\xed\x59\x75\x04\xb0\xad\xd6\x17\x29\xd3\x14\xc9\xbf\x90\xda\x52\x9f\x41\xcb\xf9\x22\x06\xd2\xdc\x89\x09\x55\x1a\x95\xfb\x10\xad\xe6\xde\xdf\xdc\x5e\x2b\xb9\x60\x21\x85\x51\xbf\xc1\xad\x19\x49\x9e\x9b\x76\x86\x37\x98\x73\xb5\x11\x28\xed\x13\x3a\xdf\x86\xda\xbf\xa4\x24\xcf\x07\x03\x4c\x8e\xd4\xf5\x19\xab\x89\xc5\x6c\xe3\xe5\xec\x26\xc7\x18\xee\x15\xe7\x4c\x66\x1f\xf3\x94\x58\x2c\xad\x2f\xe7\x8c\x12\x13\xc3\xb1\x1b\x81\x1c\xa9\x55\xda\x8f\x10\xc4\xd2\xe5\x4d\x67\xa9\xd0\x62\x00\x16\x45\xee\x2e\x73\x35\xa8\xb3\x19\xd7\x78\x6f\x7c\x78\x06\x80\x1a\x72\xf9\xbd\x72\x20\xd7\x4a\x5a\xfc\x64\xdb\xa1\xba\x90\x57\xe6\x4e\xc9\x7b\xa5\x6c\x0c\x56\x17\xd8\x74\x19\xa4\x54\x89\x7c\xae\xd5\x82\x71\x6c\x87\x34\xdb\x2e\xa4\x65\x02\xdf\xe0\x82\x14\xdc\x36\x0b\x75\xcd\xe6\xee\x00\x9b\x71\xcd\x19\x29\x61\x12\x75\x67\x53\x51\xf8\xdc\x3a\xe8\xc2\x3b\x2a\x15\xc2\xb9\x5a\xcf\x35\x5b\x31\x8e\x19\xbe\x35\x94\xf0\xf2\xde\xc4\xb0\x20\xdc\x60\x4f\x96\x92\x9c\x24\x8c\x33\xcb\xd0\xf4\x67\x01\x48\xb5\xca\x63\xf8\x09\xc6\x57\x37\x37\x63\xf8\xb9\xd3\x4b\x95\x10\x44\xa6\xdd\x01\x11\x4c\x13\x26\xa7\xde\x9a\x1a\x24\x3a\x33\x7d\xa1\x28\x6a\x4c\xaf\xf7\xfc\x4f\x7f\x7e\x3f\x7f\x7b\x7f\xf5\xe1\xfd\xfd\x3f\xef\xae\x6e\xdf\x3e\xcc\xaf\xae\xdf\xfe\x65\x30\x72\xad\x99\xc5\x07\x4b\x6c\x61\x9c\x6a\x7b\xbd\xe3\x71\xe7\x27\x13\x24\xc3\x18\x7e\x29\xc8\xc6\x79\xa7\x46\xfb\x0b\x4d\x04\xae\x95\x7e\x74\x30\xbf\x33\x4b\x72\x72\xf6\x3a\x3e\x49\x4e\x17\x88\xe7\xaf\xe8\xec\x6c\xf6\xfa\x32\xbd\x4c\x4f\xe8\xd9\xab\x73\x7a\x9e\xbe\x9a\x9d\x9f\x9c\x9c\x1e\xcf\x2e\xcf\x2f\x8f\x4f\xcf\x4f\x2f\x48\xb2\x48\x2e\x5f\x5d\x24\x67\xc9\xec\x82\x5e\xbe\xbe\x4c\x4e\x16\x67\xa7\xa7\xc9\x70\xdd\x79\xc1\xf9\x5c\x71\x46\x37\x31\xfc\xb8\xb8\x53\x76\xae\xd1\x60\x73\xd8\x50\x06\x35\x6d\x07\xda\x8e\x5a\x2b\x98\x2b\x6d\x63\xb8\x98\x5d\xcc\x06\xe7\xe1\x2d\x42\xa0\x0b\xe8\xa6\xd3\xc7\xd9\x0a\x25\x1a\x33\xd7\x2a\xc1\xfe\xb4\x4b\x6b\xf3\x1f\xd0\x0e\x4f\x36\x27\x76\x19\xc3\x74\x89\x84\xdb\xe5\xaf\xc3\xce\x5d\xeb\x1b\xba\x44\x87\xe0\xdd\x87\x0f\xf3\x4e\x97\x46\x92\xb2\xaf\xb8\xbe\x45\x2d\x98\x2c\x2d\xfc\x16\x8d\x71\x47\x50\xa9\xff\x7b\xc2\x79\x42\xe8\xe3\x07\x75\xa3\x32\xf3\x5e\xbe\xd5\xba\x77\x8b\x50\xae\xfa\xd6\xe9\x35\xbc\x6d\x89\x3d\x20\x2b\xc2\x0b\xfc\x5e\x2b\x31\xdc\xd5\x82\x21\x4f\xab\xf8\x15\xe8\x99\x97\x9b\xae\xbd\xd9\x24\x7c\x0f\x02\x08\xb6\x17\xdf\xe9\x16\xda\xc8\xdf\x1b\xa4\xf1\x97\x02\xcd\xd0\xe4\x00\x68\x5e\xc4\x70\x3c\x13\x83\xc7\x02\x85\xd2\x9b\x18\x8e\x5f\xcf\x6e\x59\xd5\x27\x55\x8a\x0f\x3d\x5f\xee\x5a\x3f\x21\x53\x26\x06\xce\x64\xf1\xe9\x73\x02\x15\x25\x96\x70\x95\x3d\x2f\x58\x6d\x0d\xfa\xad\x03\x56\x00\xe5\x0b\x82\x56\x60\x96\xff\x9b\xc0\x15\xdc\xdb\x13\xbb\x82\xaf\x1c\xbc\x2a\xcc\x7b\x03\xd8\x51\x27\x82\x1d\xf5\x7a\xfa\xa1\xcf\x05\x2c\x5a\x26\x74\x82\xe4\x2e\x9d\x44\xfd\xa3\x0b\x0f\xdf\xee\x89\x4a\x8d\x7c\xab\x77\x8d\x19\x33\x56\x6f\xe2\xaa\xb8\xe9\x2f\x50\x58\xc6\xa3\x32\xea\xf4\x3a\x7e\xff\xc8\xe7\xc0\x18\xb4\x91\x5b\x82\x2b\x92\x46\x85\x41\x1d\xb1\xf4\xdb\x9e\x69\xfe\x11\x99\xdb\xf6\x47\x64\xde\x17\x99\xbf\x6c\x20\xbb\xf8\x9c\x38\xb6\x5d\x63\x1e\x5c\x13\x6f\x47\x37\x92\x65\x1a\x33\x62\xd1\xd5\xbb\x11\xa6\xcc\x0e\xc2\xd9\xee\xf9\xda\xa1\x56\x45\x24\x15\x4c\xc6\x30\x76\xd7\x6b\xfc\x9c\x81\x6e\xc9\x66\x5c\x98\x44\x08\xd5\xa9\xdb\xbc\x82\x29\x12\x43\x35\xcb\xdd\x4a\xa6\xcf\x1d\x50\x8d\xc4\xe2\xf8\x1b\x18\x17\x65\x8c\x75\xdf\x72\x17\x48\xdd\x97\x14\x39\x5a\x2c\x59\x88\x17\xac\x5a\x55\xc2\x55\x34\xaa\x98\x1f\xe3\xe6\xad\x7c\x77\x25\xeb\x9e\x30\x69\x2c\xe1\x3c\xe7\xc4\x4b\xec\x41\xdc\x82\xfa\x6d\x0f\x7c\xc5\x70\xfd\x35\x0f\xfc\x19\xe3\x1c\xd4\x2f\x62\x28\x5f\xee\xc8\xbe\x81\x66\xc9\xac\x04\xd1\x3f\xc4\x0c\xad\x13\xe1\xcc\x94\x9f\xeb\xd2\xe2\xb6\xec\x2c\x27\xf4\x91\x64\x68\x26\x87\xa1\xaf\xc4\x05\x91\x6c\xe1\x3c\x8f\xb7\xe5\xfe\xb3\x29\xa3\x4a\x1e\x86\xe5\x79\x94\x50\xd5\x5b\x82\x0f\xd8\x56\xc6\x55\x42\x78\xd4\xe5\x5a\xbb\xa9\x72\xf3\xf8\xcb\xae\xda\x4d\x0b\x87\x4b\x72\xd1\x64\xde\x96\xe8\x0c\x6d\xc3\x11\x57\xd6\x1e\x3d\x87\x19\x23\x3c\x5f\x92\x01\xb3\x58\x11\x73\xd5\xd0\x00\xbc\xfa\x7c\xcb\x8c\xeb\xa9\xe2\x41\x71\x31\x69\xe8\xe3\xd5\x6c\x72\x72\x32\x99\x35\x3b\x48\x99\xc9\x39\xd9\xf8\x64\x78\xee\xa7\x85\x87\x7a\xde\x14\x1b\xcb\x8c\xe1\x1e\x73\x9f\x4a\x18\x20\xb2\xd1\x60\x8d\x05\xec\x92\x58\x60\x06\xc8\x8a\x30\x4e\x12\x8e\xb0\xd0\x4a\x00\x81\xcc\xe5\x07\x70\xed\xef\xc1\x43\x69\x75\xb0\x5e\x32\xba\x84\x35\xe3\xbc\xb4\x44\xbe\x42\xb0\x0a\x48\x58\x01\x93\x11\x80\x60\xf2\xef\x45\x82\x8d\x36\x8f\x27\xc7\xc7\x13\x17\xa1\x1f\x71\xb3\x56\x3a\x75\x06\x79\x34\xb4\xd9\xa3\x6f\xe0\x48\x71\xe1\x3e\x6a\x8d\x1d\x39\x0b\x16\x84\x75\x73\xfa\x3a\x9b\xbf\xc7\x14\xde\x11\x9f\x29\xa1\x20\x8c\x97\x87\x26\xcd\x92\x2d\x6c\x6b\x0d\xdf\x69\x4c\x97\xc4\xba\xe3\x1b\x01\xe4\x5a\xad\x58\x8a\x55\x98\x1d\xce\xc3\x99\x7c\xec\x2d\xb1\xa5\x61\x80\x42\xf3\xb8\x4c\x54\x4c\x3c\x9d\x66\xcc\x2e\x8b\xa4\x34\x8d\x50\xda\xb8\x93\xdd\x9d\x5a\x8d\x38\x15\xc4\x29\x6f\x9a\x3f\x66\xd3\x6a\xbf\x51\x63\x22\x95\xd7\xb9\x55\x29\x56\x88\x7c\xa5\xf4\x7e\x2d\xef\x7a\x45\xba\x29\x72\x97\x02\x61\xda\x94\x5c\xb5\xe8\x03\x93\x19\xc7\x43\xa5\x6f\x0b\x6e\xd9\xa1\xc2\x57\x9c\xb7\xb7\x68\x87\x6c\xb5\x03\xaf\xe9\xa6\xe6\x85\xb4\x2d\xb4\x61\x50\x59\x56\x5e\x79\xee\x32\x34\x53\x7a\xe4\xba\x27\x7a\x61\x31\xe8\x8a\x52\x8e\xbd\x4a\xb0\x75\xbc\x83\x8c\x7a\x07\x9d\xff\x44\xf6\x17\x41\x45\xd4\x13\x4a\xd1\x18\x8d\x2e\x46\x75\xd3\x6d\xef\x7e\x87\xd9\x7b\x99\x8d\x0c\x1e\x66\x68\x9f\xc2\x39\xe0\x14\x83\x98\xca\xda\xc0\x97\x6c\x7b\x71\xf4\x17\x74\xbf\x5d\x64\xe8\x3d\x28\x43\xc4\x01\x98\x82\x61\xeb\x00\x9c\xbd\x58\xfb\x3b\x61\xdd\x1f\x6b\x9f\x06\x3d\x74\x5a\x2f\x86\xdd\x5e\x84\x8e\x99\x87\xe3\x85\x6f\xdd\xab\x02\x30\xe4\x91\xea\x16\xe6\x93\x3a\xdb\xea\xf6\x0c\x6b\x16\x41\x3e\x7d\x94\x4d\x44\xf0\xe4\xd3\xa0\xff\xa1\xd0\xd9\xa0\xa7\x25\xab\x4e\x7a\x8c\xca\xb0\xa2\x81\x30\x79\x55\xb7\x92\x7e\x0a\x6f\x7d\xc8\x64\x35\xb3\x0d\x18\xad\xba\x0d\x99\xad\x83\x96\xd8\xd6\x30\x3c\x45\x0c\xc1\x7e\xda\xab\x33\xc7\x0e\xfa\xab\xd9\xde\x6e\x1a\xac\x9d\xe4\x65\x1e\xd0\xb7\x70\x8d\x59\xb7\x5d\xb5\x66\x5f\x2a\x44\xad\xf9\xb6\xdf\x70\x0f\x56\xe5\xf3\x98\xb6\x0a\xd4\x1e\xbe\xcd\xb7\xdd\xac\x5b\xbd\xad\x2d\xee\xad\xde\x55\xc9\xc0\x6d\xc5\xe6\xa1\x54\xb4\xfa\xf6\x34\xf4\xd8\xbf\x24\x80\x91\x0b\x8c\x81\xfe\xf1\xd9\xe9\xe9\xab\x71\x70\x60\x95\x45\x87\xe8\xf8\x5a\xa8\xcf\xec\xf9\xf6\xb5\x98\xac\xce\xea\x5d\x3e\xeb\x8a\xaf\xc9\xc6\x6c\xc9\x05\xf8\x2c\x08\x71\x5a\x4e\x3d\x5b\x52\x7b\xd8\x2b\xdf\x76\x70\x48\xbe\x75\x39\xa1\x87\xa0\xc4\x5e\xae\xa9\xc5\xbf\x03\xdd\x3e\x72\xeb\x7f\x00\xde\xcb\xb9\xaf\x7a\x7b\xc1\x1c\xa8\xee\x0c\xf3\x60\xbe\xed\x60\xc3\x7c\xab\x39\xb1\xb3\x96\x13\x6b\xdb\x4a\xf1\x42\xe0\xad\xf3\x69\x41\xab\xf1\x9e\xc7\x8a\x7c\xb1\x6d\x6a\x00\xc2\x8d\xf3\xff\x72\x4d\xad\xc8\x47\xa1\xb9\x77\xba\xb3\xf0\xa4\x28\x72\xbb\x79\xc3\x74\x0c\xff\xfe\x4f\x59\x9d\xd8\xd2\xab\xc5\x50\xd6\x86\xbe\xe2\xee\x57\x6f\xe5\xab\x23\x95\x7b\x4e\x71\xc1\x24\xb3\x6d\x76\xab\xd6\x12\xd3\xba\x12\xcd\xfc\xfb\x25\x7b\x93\x94\x0a\xd0\xaa\xf3\xda\x90\x7f\xe2\x8b\xd2\xaa\x66\xb9\xad\x12\x94\x9a\x63\xec\xfa\xe7\x61\xf2\x12\xaa\x2a\x07\xe3\x7b\xa5\xe5\xd5\x50\xa8\x2c\x24\x1b\xf3\x80\x0c\xa5\x83\x8d\xa9\xaf\x29\xf1\x13\x33\x96\xc9\xac\x5f\x54\xba\xb2\x34\x05\xbb\x44\xa6\xc1\xbf\x65\x72\xdb\x66\xac\x6d\x72\x74\xb7\x33\xb0\x84\xdc\xc5\x8b\xaa\xf8\x2e\xaa\x3d\xef\x8d\x2d\x8b\x84\xa9\xa8\xfd\x3f\x66\x07\xc9\xe0\x75\xf0\xa1\x0c\xe8\x99\xce\xe9\x68\xa7\x5f\x2e\x27\xac\xff\xe0\x69\xff\x4c\xe9\x9d\xc6\xb5\x12\xa2\x90\xcc\x6e\x9a\x0a\xde\xa9\x28\x2f\x12\xce\xcc\x12\x75\x4b\x8d\xbc\x2b\x12\x5f\xb0\x78\x7e\xf3\xa1\x97\x1c\xd6\xff\xd8\xcc\x55\x5d\x90\xb9\xfa\xcc\xa2\x5e\x11\x1e\xc3\xeb\x99\x18\xfd\x37\x00\x00\xff\xff\xfd\x1b\x85\x88\xff\x27\x00\x00") -func olmManifests0212OlmYamlBytes() ([]byte, error) { +func olmManifests0220OlmYamlBytes() ([]byte, error) { return bindataRead( - _olmManifests0212OlmYaml, - "olm-manifests/0.21.2-olm.yaml", + _olmManifests0220OlmYaml, + "olm-manifests/0.22.0-olm.yaml", ) } -func olmManifests0212OlmYaml() (*asset, error) { - bytes, err := olmManifests0212OlmYamlBytes() +func olmManifests0220OlmYaml() (*asset, error) { + bytes, err := olmManifests0220OlmYamlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "olm-manifests/0.21.2-olm.yaml", size: 9284, mode: os.FileMode(420), modTime: time.Unix(1655230541, 0)} + info := bindataFileInfo{name: "olm-manifests/0.22.0-olm.yaml", size: 10239, mode: os.FileMode(420), modTime: time.Unix(1661216762, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -255,12 +243,12 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "olm-manifests/0.19.1-crds.yaml": olmManifests0191CrdsYaml, - "olm-manifests/0.19.1-olm.yaml": olmManifests0191OlmYaml, "olm-manifests/0.20.0-crds.yaml": olmManifests0200CrdsYaml, "olm-manifests/0.20.0-olm.yaml": olmManifests0200OlmYaml, "olm-manifests/0.21.2-crds.yaml": olmManifests0212CrdsYaml, "olm-manifests/0.21.2-olm.yaml": olmManifests0212OlmYaml, + "olm-manifests/0.22.0-crds.yaml": olmManifests0220CrdsYaml, + "olm-manifests/0.22.0-olm.yaml": olmManifests0220OlmYaml, } // AssetDir returns the file names below a certain @@ -305,12 +293,12 @@ type bintree struct { var _bintree = &bintree{nil, map[string]*bintree{ "olm-manifests": &bintree{nil, map[string]*bintree{ - "0.19.1-crds.yaml": &bintree{olmManifests0191CrdsYaml, map[string]*bintree{}}, - "0.19.1-olm.yaml": &bintree{olmManifests0191OlmYaml, map[string]*bintree{}}, "0.20.0-crds.yaml": &bintree{olmManifests0200CrdsYaml, map[string]*bintree{}}, "0.20.0-olm.yaml": &bintree{olmManifests0200OlmYaml, map[string]*bintree{}}, "0.21.2-crds.yaml": &bintree{olmManifests0212CrdsYaml, map[string]*bintree{}}, "0.21.2-olm.yaml": &bintree{olmManifests0212OlmYaml, map[string]*bintree{}}, + "0.22.0-crds.yaml": &bintree{olmManifests0220CrdsYaml, map[string]*bintree{}}, + "0.22.0-olm.yaml": &bintree{olmManifests0220OlmYaml, map[string]*bintree{}}, }}, }} diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle/validate/cmd.go b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle/validate/cmd.go index 791bbd8c1..7d585163e 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle/validate/cmd.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle/validate/cmd.go @@ -100,7 +100,17 @@ To validate a bundle against the (alpha) validator for Deprecated APIs specifica To validate a bundle against an external validator, in addition to required bundle validators: $ operator-sdk bundle validate ./bundle --alpha-select-external /path/to/external-validator[:/path/to/optional-second-validator] - ` + +To validate a bundle against the (alpha) validator for Multiple Architectures bundle validation, in addition to required bundle validators: + +IMPORTANT: To use this option it is required to have access to pull the images defined on the CSV. + + $ operator-sdk bundle validate ./bundle --select-optional name=multiarch + +NOTE: The --optional-values can be used to inform the container-tools that should be used i.e. "--optional-values=container-tools=docker". +The valid values for the container-tools optional value are [docker, podman, none]. If no value is supplied then the command will default to using docker to inspect the images. +More info: https://github.com/operator-framework/api/blob/master/pkg/validation/internal/multiarch.go +` ) // NewCmd returns a command that will validate an operator bundle. diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle/validate/optional.go b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle/validate/optional.go index f6dcd9d77..7c11bce22 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle/validate/optional.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle/validate/optional.go @@ -70,6 +70,14 @@ var optionalValidators = validators{ }, desc: "Good Practices bundle validation. This validator validates the bundle against criteria and suggestions defined as good practices for bundles under the operator-framework solutions. More info: https://sdk.operatorframework.io/docs/best-practices/.", }, + { + Validator: apivalidation.MultipleArchitecturesValidator, + name: "multiarch", + labels: map[string]string{ + nameKey: "multiarch", + }, + desc: "(Alpha) Multiple Architectures bundle validation. This validator validates the bundle against criteria defined to configure the support for multiple architectures. More info: https://olm.operatorframework.io/docs/advanced-tasks/ship-operator-supporting-multiarch/.", + }, } // runOptionalValidators runs optional validators selected by sel on bundle. diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/cli/cli.go b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/cli/cli.go index 4a4213270..b62df240d 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/cli/cli.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/cli/cli.go @@ -26,11 +26,13 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/model/stage" "sigs.k8s.io/kubebuilder/v3/pkg/plugin" kustomizev1 "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1" - declarativev1 "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1" - + kustomizev2Alpha "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha" "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang" + declarativev1 "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1" + deployimagev1alpha "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1" golangv2 "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2" golangv3 "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3" + grafanav1alpha "sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha" "github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/alpha/config3alphato3" "github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/bundle" @@ -74,8 +76,6 @@ func Run() error { // This CLI can run kubebuilder commands and certain SDK specific commands that are aligned for // the kubebuilder project layout func GetPluginsCLIAndRoot() (*cli.CLI, *cobra.Command) { - // todo: Export the bundles KB and then change here to use the bundles exported instead - // more info: https://github.com/kubernetes-sigs/kubebuilder/pull/2112 gov2Bundle, _ := plugin.NewBundle(golang.DefaultNameQualifier, golangv2.Plugin{}.Version(), golangv2.Plugin{}, envtestv1.Plugin{}, @@ -88,34 +88,48 @@ func GetPluginsCLIAndRoot() (*cli.CLI, *cobra.Command) { manifestsv2.Plugin{}, scorecardv2.Plugin{}, ) + gov4AlphaBundle, _ := plugin.NewBundle(golang.DefaultNameQualifier, plugin.Version{Number: 4, Stage: stage.Alpha}, + kustomizev2Alpha.Plugin{}, + // TODO: We need to bump here golangv4-alpha when Kubebuilder + // begin to provide it without k8s 1.22 support + golangv3.Plugin{}, + manifestsv2.Plugin{}, + scorecardv2.Plugin{}, + ) ansibleBundle, _ := plugin.NewBundle("ansible"+plugins.DefaultNameQualifier, plugin.Version{Number: 1}, - kustomizev1.Plugin{}, + kustomizev2Alpha.Plugin{}, ansiblev1.Plugin{}, manifestsv2.Plugin{}, scorecardv2.Plugin{}, ) helmBundle, _ := plugin.NewBundle("helm"+plugins.DefaultNameQualifier, plugin.Version{Number: 1}, - kustomizev1.Plugin{}, + kustomizev2Alpha.Plugin{}, helmv1.Plugin{}, manifestsv2.Plugin{}, scorecardv2.Plugin{}, ) hybridBundle, _ := plugin.NewBundle("hybrid.helm"+plugins.DefaultNameQualifier, plugin.Version{Number: 1, Stage: stage.Alpha}, - kustomizev1.Plugin{}, + kustomizev2Alpha.Plugin{}, hybrid.Plugin{}, manifestsv2.Plugin{}, scorecardv2.Plugin{}, ) + deployImageBundle, _ := plugin.NewBundle("deploy-image."+golang.DefaultNameQualifier, plugin.Version{Number: 1, Stage: stage.Alpha}, + deployimagev1alpha.Plugin{}, + manifestsv2.Plugin{}, + ) c, err := cli.New( cli.WithCommandName("operator-sdk"), cli.WithVersion(makeVersionString()), cli.WithPlugins( ansibleBundle, - gov2Bundle, + gov2Bundle, // Deprecated gov3Bundle, + gov4AlphaBundle, helmBundle, hybridBundle, - kustomizev1.Plugin{}, + grafanav1alpha.Plugin{}, + deployImageBundle, declarativev1.Plugin{}, &quarkusv1.Plugin{}, ), diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/bundle/bundle.go b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/bundle/bundle.go index 4da2ac2b8..b7c43239a 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/bundle/bundle.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/bundle/bundle.go @@ -21,7 +21,6 @@ import ( "os" "path/filepath" - kbutil "sigs.k8s.io/kubebuilder/v3/pkg/plugin/util" "sigs.k8s.io/yaml" "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3" @@ -163,11 +162,6 @@ func (c bundleCmd) runManifests() (err error) { c.outputDir = defaultRootDir } - // The following code was added for we ensure that default - // option commented in the config/manager/controller_manager_config.yaml - // will not be used in the bundle. - c.removeDefaultCommentsFromControllerManager() - col := &collector.Manifests{} switch { case genutil.IsPipeReader(): @@ -250,45 +244,6 @@ func (c bundleCmd) runManifests() (err error) { c.println("Bundle manifests generated successfully in", c.outputDir) return nil -} - -// removeDefaultCommentsFromControllerManager will the remove the specific comment added by -// default in the scaffolds in order to not set it on the bundles -// note that the replace only should be made when the string and path are found -// so that, we do not raise an issue here. -func (c bundleCmd) removeDefaultCommentsFromControllerManager() { - const commentsControllerManager = `# leaderElectionReleaseOnCancel defines if the leader should step down volume -# when the Manager ends. This requires the binary to immediately end when the -# Manager is stopped, otherwise, this setting is unsafe. Setting this significantly -# speeds up voluntary leader transitions as the new leader don't have to wait -# LeaseDuration time first. -# In the default scaffold provided, the program ends immediately after -# the manager stops, so would be fine to enable this option. However, -# if you are doing or is intended to do any operation such as perform cleanups -# after the manager stops then its usage might be unsafe. -# leaderElectionReleaseOnCancel: true -` - - // if not found we will not raise an error - _ = kbutil.ReplaceInFile(filepath.Join(c.inputDir, "config/manager/controller_manager_config.yaml"), commentsControllerManager, "") - - //todo: remove the space on Kubebuilder project so that we can remove the following replace - //it is required because of the molecule issues, see: https://github.com/operator-framework/operator-sdk/issues/5838 - - const commentManagerUpdate = `# leaderElectionReleaseOnCancel defines if the leader should step down volume -# when the Manager ends. This requires the binary to immediately end when the -# Manager is stopped, otherwise, this setting is unsafe. Setting this significantly -# speeds up voluntary leader transitions as the new leader don't have to wait -# LeaseDuration time first. -# In the default scaffold provided, the program ends immediately after -# the manager stops, so would be fine to enable this option. However, -# if you are doing or is intended to do any operation such as perform cleanups -# after the manager stops then its usage might be unsafe. -# leaderElectionReleaseOnCancel: true -` - - // if not found we will not raise an error - _ = kbutil.ReplaceInFile(filepath.Join(c.inputDir, "config/manager/controller_manager_config.yaml"), commentManagerUpdate, "") } diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/kustomize/manifests.go b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/kustomize/manifests.go index 7606643da..09ce04ab3 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/kustomize/manifests.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/kustomize/manifests.go @@ -22,6 +22,8 @@ import ( "path/filepath" "strings" + manifestsv2 "github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2" + log "github.com/sirupsen/logrus" "github.com/spf13/afero" "github.com/spf13/cobra" @@ -35,7 +37,7 @@ import ( genutil "github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/generate/internal" "github.com/operator-framework/operator-sdk/internal/generate/clusterserviceversion/bases" - "github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/templates/config/manifests" + templatemanifests "github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/templates/config/manifests" "github.com/operator-framework/operator-sdk/internal/util/k8sutil" "github.com/operator-framework/operator-sdk/internal/util/projutil" ) @@ -225,7 +227,12 @@ func (c manifestsCmd) run(cfg config.Config) error { } // Write a kustomization.yaml to outputDir if one does not exist. - kustomization := manifests.Kustomization{SupportsWebhooks: operatorType == projutil.OperatorTypeGo} + kustomization := templatemanifests.Kustomization{ + // we need perform different scaffold when we know that is using kustomize version 4.x + // and is Golang Type + SupportsKustomizeV4: manifestsv2.HasSupportForKustomizeV4(cfg), + SupportsWebhooks: operatorType == projutil.OperatorTypeGo, + } // Ensure the path to the manifest directory is correctly carried through kustomization.Path = c.outputDir err = machinery.NewScaffold(machinery.Filesystem{FS: afero.NewOsFs()}, machinery.WithConfig(cfg)).Execute( diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/run/bundle/cmd.go b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/run/bundle/cmd.go index 6f287ea7f..d13194b4e 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/run/bundle/cmd.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/run/bundle/cmd.go @@ -31,6 +31,8 @@ func NewCmd(cfg *operator.Configuration) *cobra.Command { Short: "Deploy an Operator in the bundle format with OLM", Long: `The single argument to this command is a bundle image, with the full registry path specified. If using a docker.io image, you must specify docker.io(/)?/:. +If the bundle image provided is a SQLite index, it must be pullable by the cluster as SQLite images are pulled from the cluster. +If the bundle image provided is a File-Based Catalog (FBC) index, it will be pulled on the local machine. The main purpose of this command is to streamline running the bundle without having to provide an index image with the bundle already included. diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/run/bundleupgrade/cmd.go b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/run/bundleupgrade/cmd.go index 1f7fa2271..5288fc642 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/run/bundleupgrade/cmd.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/cmd/operator-sdk/run/bundleupgrade/cmd.go @@ -30,7 +30,9 @@ func NewCmd(cfg *operator.Configuration) *cobra.Command { Use: "bundle-upgrade ", Short: "Upgrade an Operator previously installed in the bundle format with OLM", Long: `The single argument to this command is a bundle image, with the full registry path specified. -If using a docker.io image, you must specify docker.io(/)?/:.`, +If using a docker.io image, you must specify docker.io(/)?/:. +If the bundle image provided is a SQLite index, it must be pullable by the cluster as SQLite images are pulled from the cluster. +If the bundle image provided is a File-Based Catalog (FBC) index, it will be pulled on the local machine.`, Args: cobra.ExactArgs(1), PreRunE: func(*cobra.Command, []string) error { return cfg.Load() }, Run: func(cmd *cobra.Command, args []string) { diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/fbcindex/fbc_registry_pod.go b/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/fbcindex/fbc_registry_pod.go index da354dc37..b81fbaabe 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/fbcindex/fbc_registry_pod.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/fbcindex/fbc_registry_pod.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/util/retry" + pointer "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "github.com/operator-framework/operator-sdk/internal/olm/operator" @@ -208,6 +209,32 @@ func (f *FBCRegistryPod) podForBundleRegistry(cs *v1alpha1.CatalogSource) (*core Namespace: f.cfg.Namespace, }, Spec: corev1.PodSpec{ + // DO NOT set RunAsUser and RunAsNonRoot, we must leave this empty to allow + // those that want to use this command against Openshift vendor do not face issues. + // + // Why not set RunAsUser? + // RunAsUser cannot be set because in OpenShift each namespace has a valid range like + // [1000680000, 1000689999]. Therefore, values like 1001 will not work. Also, in OCP each namespace + // has a valid range allocate. Therefore, by leaving it empty the OCP will adopt RunAsUser strategy + // of MustRunAsRange. The PSA will look for the openshift.io/sa.scc.uid-range annotation + // in the namespace to populate RunAsUser fields when the pod be admitted. Note that + // is NOT possible to know a valid value that could be accepeted beforehand. + // + // Why not set RunAsNonRoot? + // If we set RunAsNonRoot = true and the image informed does not define the UserID + // (i.e. in the Dockerfile we have not `USER 11211:11211 `) then, the Pod will fail to run with the + // error `"container has runAsNonRoot and image will run as root …` in ANY Kubernetes cluster. + // (vanilla or OCP). Therefore, by leaving it empty this field will be set by OCP if/when the Pod be + // qualified for restricted-v2 SCC policy. + + // TODO: remove when OpenShift 4.10 and Kubernetes 1.19 be no longer supported + // Why not set SeccompProfile? + // This option can only work in OCP versions >= 4.11 and Kubernetes versions >= 19. + //SecurityContext: &corev1.PodSecurityContext{ + // SeccompProfile: &corev1.SeccompProfile{ + // Type: corev1.SeccompProfileTypeRuntimeDefault, + // }, + //}, Volumes: []corev1.Volume{ { Name: k8sutil.TrimDNS1123Label(cm.Name + "-volume"), @@ -245,8 +272,17 @@ func (f *FBCRegistryPod) podForBundleRegistry(cs *v1alpha1.CatalogSource) (*core SubPath: cm.Name, }, }, + SecurityContext: &corev1.SecurityContext{ + Privileged: pointer.Bool(false), + ReadOnlyRootFilesystem: pointer.Bool(false), + AllowPrivilegeEscalation: pointer.Bool(false), + Capabilities: &corev1.Capabilities{ + Drop: []corev1.Capability{"ALL"}, + }, + }, }, }, + ServiceAccountName: f.cfg.ServiceAccount, }, } diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/index/registry_pod.go b/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/index/registry_pod.go index 0d892b57b..509cbf7a4 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/index/registry_pod.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/olm/operator/registry/index/registry_pod.go @@ -29,6 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "github.com/operator-framework/operator-sdk/internal/olm/operator" @@ -217,6 +218,32 @@ func (rp *SQLiteRegistryPod) podForBundleRegistry() (*corev1.Pod, error) { Namespace: rp.cfg.Namespace, }, Spec: corev1.PodSpec{ + // DO NOT set RunAsUser and RunAsNonRoot, we must leave this empty to allow + // those that want to use this command against Openshift vendor do not face issues. + // + // Why not set RunAsUser? + // RunAsUser cannot be set because in OpenShift each namespace has a valid range like + // [1000680000, 1000689999]. Therefore, values like 1001 will not work. Also, in OCP each namespace + // has a valid range allocate. Therefore, by leaving it empty the OCP will adopt RunAsUser strategy + // of MustRunAsRange. The PSA will look for the openshift.io/sa.scc.uid-range annotation + // in the namespace to populate RunAsUser fields when the pod be admitted. Note that + // is NOT possible to know a valid value that could be accepeted beforehand. + // + // Why not set RunAsNonRoot? + // If we set RunAsNonRoot = true and the image informed does not define the UserID + // (i.e. in the Dockerfile we have not `USER 11211:11211 `) then, the Pod will fail to run with the + // error `"container has runAsNonRoot and image will run as root …` in ANY Kubernetes cluster. + // (vanilla or OCP). Therefore, by leaving it empty this field will be set by OCP if/when the Pod be + // qualified for restricted-v2 SCC policy. + // + // TODO: remove when OpenShift 4.10 and Kubernetes 1.19 be no longer supported + // Why not set SeccompProfile? + // This option can only work in OCP versions >= 4.11 and Kubernetes versions >= 19. + //SecurityContext: &corev1.PodSecurityContext{ + // SeccompProfile: &corev1.SeccompProfile{ + // Type: corev1.SeccompProfileTypeRuntimeDefault, + // }, + //}, Containers: []corev1.Container{ { Name: defaultContainerName, @@ -229,6 +256,14 @@ func (rp *SQLiteRegistryPod) podForBundleRegistry() (*corev1.Pod, error) { Ports: []corev1.ContainerPort{ {Name: defaultContainerPortName, ContainerPort: rp.GRPCPort}, }, + SecurityContext: &corev1.SecurityContext{ + Privileged: pointer.Bool(false), + ReadOnlyRootFilesystem: pointer.Bool(false), + AllowPrivilegeEscalation: pointer.Bool(false), + Capabilities: &corev1.Capabilities{ + Drop: []corev1.Capability{"ALL"}, + }, + }, }, }, ServiceAccountName: rp.cfg.ServiceAccount, diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/init.go b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/init.go index d0a408eca..20929a2b6 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/init.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/init.go @@ -243,36 +243,5 @@ func addInitCustomizations(projectName string) error { return fmt.Errorf("error updating kustomization.yaml files: %v", err) } - //todo: remove the space on Kubebuilder project so that we can remove the following replace - //it is required because of the molecule issues, see: https://github.com/operator-framework/operator-sdk/issues/5838 - - const commentManager = `# leaderElectionReleaseOnCancel defines if the leader should step down volume -# when the Manager ends. This requires the binary to immediately end when the -# Manager is stopped, otherwise, this setting is unsafe. Setting this significantly -# speeds up voluntary leader transitions as the new leader don't have to wait -# LeaseDuration time first. -# In the default scaffold provided, the program ends immediately after -# the manager stops, so would be fine to enable this option. However, -# if you are doing or is intended to do any operation such as perform cleanups -# after the manager stops then its usage might be unsafe. -# leaderElectionReleaseOnCancel: true` - - const commentManagerUpdate = `# leaderElectionReleaseOnCancel defines if the leader should step down volume -# when the Manager ends. This requires the binary to immediately end when the -# Manager is stopped, otherwise, this setting is unsafe. Setting this significantly -# speeds up voluntary leader transitions as the new leader don't have to wait -# LeaseDuration time first. -# In the default scaffold provided, the program ends immediately after -# the manager stops, so would be fine to enable this option. However, -# if you are doing or is intended to do any operation such as perform cleanups -# after the manager stops then its usage might be unsafe. -# leaderElectionReleaseOnCancel: true` - - controllerManagerFile := filepath.Join("config", "manager", "controller_manager_config.yaml") - - err = util.ReplaceInFile(controllerManagerFile, commentManager, commentManagerUpdate) - if err != nil { - return err - } return nil } diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/init.go b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/init.go index dcee0bb7e..b3ab4f1c7 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/init.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/init.go @@ -21,6 +21,7 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/config" "sigs.k8s.io/kubebuilder/v3/pkg/machinery" "sigs.k8s.io/kubebuilder/v3/pkg/plugins" + kustomizev2Alpha "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha" "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates" "github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/config/rbac" @@ -33,12 +34,7 @@ import ( "github.com/operator-framework/operator-sdk/internal/version" ) -const ( - // kustomizeVersion is the sigs.k8s.io/kustomize version to be used in the project - kustomizeVersion = "v3.8.7" - - imageName = "controller:latest" -) +const imageName = "controller:latest" // ansibleOperatorVersion is set to the version of ansible-operator at compile-time. var ansibleOperatorVersion = version.ImageVersion @@ -77,7 +73,7 @@ func (s *initScaffolder) Scaffold() error { &templates.Dockerfile{AnsibleOperatorVersion: ansibleOperatorVersion}, &templates.Makefile{ Image: imageName, - KustomizeVersion: kustomizeVersion, + KustomizeVersion: kustomizev2Alpha.KustomizeVersion, AnsibleOperatorVersion: ansibleOperatorVersion, }, &templates.GitIgnore{}, diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/kustomize.go b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/kustomize.go index 813b1a96c..24f9c4f56 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/kustomize.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/ansible/v1/scaffolds/internal/templates/molecule/mdefault/kustomize.go @@ -39,7 +39,7 @@ func (f *Kustomize) SetTemplateDefaults() error { const kustomizeTemplate = `--- - name: Build kustomize testing overlay # load_restrictor must be set to none so we can load patch files from the default overlay - command: '{{ "{{ kustomize }}" }} build --load_restrictor none .' + command: '{{ "{{ kustomize }}" }} build --load-restrictor LoadRestrictionsNone' args: chdir: '{{ "{{ config_dir }}" }}/testing' register: resources diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/helm/v1/scaffolds/init.go b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/helm/v1/scaffolds/init.go index eb7c3500a..42a497a46 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/helm/v1/scaffolds/init.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/helm/v1/scaffolds/init.go @@ -20,6 +20,8 @@ package scaffolds import ( "os" + kustomizev2Alpha "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha" + "sigs.k8s.io/kubebuilder/v3/pkg/config" "sigs.k8s.io/kubebuilder/v3/pkg/machinery" "sigs.k8s.io/kubebuilder/v3/pkg/plugins" @@ -30,12 +32,7 @@ import ( "github.com/operator-framework/operator-sdk/internal/version" ) -const ( - // kustomizeVersion is the sigs.k8s.io/kustomize version to be used in the project - kustomizeVersion = "v3.8.7" - - imageName = "controller:latest" -) +const imageName = "controller:latest" // helmOperatorVersion is set to the version of helm-operator at compile-time. var helmOperatorVersion = version.ImageVersion @@ -80,7 +77,7 @@ func (s *initScaffolder) Scaffold() error { &templates.GitIgnore{}, &templates.Makefile{ Image: imageName, - KustomizeVersion: kustomizeVersion, + KustomizeVersion: kustomizev2Alpha.KustomizeVersion, HelmOperatorVersion: helmOperatorVersion, }, &templates.Watches{}, diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/init.go b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/init.go index 244fe34ba..58b2fc577 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/init.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/init.go @@ -105,7 +105,9 @@ func (s *initSubcommand) Scaffold(fs machinery.Filesystem) error { ) if err := scaffold.Execute( - &manifests.Kustomization{SupportsWebhooks: operatorType == projutil.OperatorTypeGo}, + &manifests.Kustomization{ + SupportsKustomizeV4: HasSupportForKustomizeV4(s.config), + SupportsWebhooks: operatorType == projutil.OperatorTypeGo}, ); err != nil { return fmt.Errorf("error scaffolding manifests: %w", err) } diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/templates/config/manifests/kustomization.go b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/templates/config/manifests/kustomization.go index 7e7b090a8..08c69d269 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/templates/config/manifests/kustomization.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/templates/config/manifests/kustomization.go @@ -27,6 +27,12 @@ type Kustomization struct { machinery.TemplateMixin machinery.ProjectNameMixin + // SupportsKustomizeV4 is true for the projects that are + // scaffold using the kustomize/v2-aplha plugin and + // the major bump for it 4x + // Previous versions uses 3x + SupportsKustomizeV4 bool + SupportsWebhooks bool } @@ -36,6 +42,12 @@ func (f *Kustomization) SetTemplateDefaults() error { f.Path = filepath.Join("config", "manifests", "kustomization.yaml") } + // We cannot overwiting the file after it be created because + // it might contain user changes (i.e to work with Kustomize 4.x + // the target /spec/template/spec/containers/1/volumeMounts/0 + // needs to be replaced with /spec/template/spec/containers/0/volumeMounts/0 + f.IfExistsAction = machinery.SkipFile + f.TemplateBody = kustomizationTemplate return nil @@ -63,7 +75,11 @@ resources: # # Remove the manager container's "cert" volumeMount, since OLM will create and mount a set of certs. # # Update the indices in this path if adding or removing containers/volumeMounts in the manager's Deployment. # - op: remove +{{ if .SupportsKustomizeV4 }} +# path: /spec/template/spec/containers/0/volumeMounts/0 +{{ else -}} # path: /spec/template/spec/containers/1/volumeMounts/0 +{{ end -}} # # Remove the "cert" volume, since OLM will create and mount a set of certs. # # Update the indices in this path if adding or removing volumes in the manager's Deployment. # - op: remove diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/utils.go b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/utils.go new file mode 100644 index 000000000..3de39d598 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/manifests/v2/utils.go @@ -0,0 +1,78 @@ +// Copyright 2021 The Operator-SDK 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 v2 + +import ( + "errors" + "strings" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" +) + +const ( + goV3APluginKey = "go.sdk.operatorframework.io/v3" + legacyGoPluginKey = "go.sdk.operatorframework.io/v2" + legacyGoPluginAlphaKey = "go.sdk.operatorframework.io/v2-alpha" + kubebuilderGoV3 = "go.kubebuilder.io/v3" + kubebuilderGoV2 = "go.kubebuilder.io/v2" +) + +// HasSupportForKustomizeV4 will return true when we can do the scaffolds +// using kustomize version +func HasSupportForKustomizeV4(c config.Config) bool { + + // When we are creating the project with the Bundle Plugin + // we have data only into the pluginChain + for _, pluginKey := range c.GetPluginChain() { + if strings.HasPrefix(pluginKey, "go") { + switch { + case pluginKey == kubebuilderGoV3: + return false + case pluginKey == kubebuilderGoV2: + return false + } + } + } + + // If we call the implementation afterwords as we do + // via the subCommand "operator-sdk generate kustomize" + // we have the PROJECT file and the plugin layout + err := c.DecodePluginConfig(goV3APluginKey, struct{}{}) + if err == nil || !errors.As(err, &config.PluginKeyNotFoundError{}) { + return false + } + + err = c.DecodePluginConfig(legacyGoPluginKey, struct{}{}) + if err == nil || !errors.As(err, &config.PluginKeyNotFoundError{}) { + return false + } + + err = c.DecodePluginConfig(legacyGoPluginAlphaKey, struct{}{}) + if err == nil || !errors.As(err, &config.PluginKeyNotFoundError{}) { + return false + } + + err = c.DecodePluginConfig(kubebuilderGoV2, struct{}{}) + if err == nil || !errors.As(err, &config.PluginKeyNotFoundError{}) { + return false + } + + err = c.DecodePluginConfig(kubebuilderGoV3, struct{}{}) + if err == nil || !errors.As(err, &config.PluginKeyNotFoundError{}) { + return false + } + + return true +} diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/util/cleanup.go b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/util/cleanup.go index d6fc47548..35b505d1d 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/util/cleanup.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/util/cleanup.go @@ -84,35 +84,105 @@ func UpdateKustomizationsInit() error { # 'CERTMANAGER' needs to be enabled to use ca injection #- webhookcainjection_patch.yaml -# the following config is for teaching kustomize how to do var substitution -vars: # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. -#- name: CERTIFICATE_NAMESPACE # namespace of the certificate CR -# objref: -# kind: Certificate -# group: cert-manager.io -# version: v1 -# name: serving-cert # this name should match the one in certificate.yaml -# fieldref: -# fieldpath: metadata.namespace -#- name: CERTIFICATE_NAME -# objref: -# kind: Certificate -# group: cert-manager.io -# version: v1 -# name: serving-cert # this name should match the one in certificate.yaml -#- name: SERVICE_NAMESPACE # namespace of the service -# objref: -# kind: Service -# version: v1 -# name: webhook-service -# fieldref: -# fieldpath: metadata.namespace -#- name: SERVICE_NAME -# objref: -# kind: Service -# version: v1 -# name: webhook-service +# Uncomment the following replacements to add the cert-manager CA injection annotations +#replacements: +# - source: # Add cert-manager annotation to ValidatingWebhookConfiguration, MutatingWebhookConfiguration and CRDs +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.namespace # namespace of the certificate CR +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - source: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.name +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - source: # Add cert-manager annotation to the webhook Service +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.name # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 0 +# create: true +# - source: +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.namespace # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 1 +# create: true `, ""); err != nil { return fmt.Errorf("remove %s patch and vars blocks: %v", defaultKFile, err) } diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/util/legacy_keys.go b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/util/legacy_keys.go index 89a5fb70d..1e0da04de 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/plugins/util/legacy_keys.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/plugins/util/legacy_keys.go @@ -26,7 +26,8 @@ import ( const ( // The catch-all plugin key for the go/v2+manifests+scorecard plugins. // Should still be accepted for backwards-compat. - legacyGoPluginKey = "go.sdk.operatorframework.io/v2-alpha" + legacyGoPluginKey = "go.sdk.operatorframework.io/v2-alpha" + legacyGoPluginAlphaKey = "go.sdk.operatorframework.io/v2-alpha" // Hard-code the latest manifests and scorecard keys here to avoid a circular import. manifestsKey = "manifests.sdk.operatorframework.io/v2" @@ -47,11 +48,7 @@ func UpdateIfLegacyKey(c config.Config) bool { return false } - err := c.DecodePluginConfig(legacyGoPluginKey, struct{}{}) - if err == nil || !errors.As(err, &config.PluginKeyNotFoundError{}) { - // There is no way to remove keys from "plugins", so print a warning. - log.Warnf("Plugin key %q is deprecated. Replace this key with %q and %q on separate lines.", - legacyGoPluginKey, manifestsKey, scorecardKey) + if IsGolangLegacyLayout(c) { return true } @@ -75,3 +72,22 @@ func UpdateIfLegacyKey(c config.Config) bool { return false } + +// IsGolangLegacyLayout returns true if c's does not have the plugins +// configuration. +func IsGolangLegacyLayout(c config.Config) bool { + err := c.DecodePluginConfig(legacyGoPluginKey, struct{}{}) + if err == nil || !errors.As(err, &config.PluginKeyNotFoundError{}) { + // There is no way to remove keys from "plugins", so print a warning. + log.Warnf("Plugin key %q is deprecated. Replace this key with %q and %q on separate lines.", + legacyGoPluginKey, manifestsKey, scorecardKey) + return true + } + + err = c.DecodePluginConfig(legacyGoPluginAlphaKey, struct{}{}) + if err == nil || !errors.As(err, &config.PluginKeyNotFoundError{}) { + return true + } + + return false +} diff --git a/vendor/github.com/operator-framework/operator-sdk/internal/scorecard/storage.go b/vendor/github.com/operator-framework/operator-sdk/internal/scorecard/storage.go index 9fd156f13..500a22f70 100644 --- a/vendor/github.com/operator-framework/operator-sdk/internal/scorecard/storage.go +++ b/vendor/github.com/operator-framework/operator-sdk/internal/scorecard/storage.go @@ -177,6 +177,13 @@ func addStorageToPod(podDef *v1.Pod, mountPath string, storageImage string) { } podDef.Spec.Containers[0].VolumeMounts = append(podDef.Spec.Containers[0].VolumeMounts, vMount) + // add mountPath to Env + mountPathEnv := v1.EnvVar{ + Name: "SCORECARD_STORAGE", + Value: mountPath, + } + podDef.Spec.Containers[0].Env = append(podDef.Spec.Containers[0].Env, mountPathEnv) + } func gatherTestOutput(r PodTestRunner, suiteName, testName, podName, mountPath string) error { @@ -188,7 +195,7 @@ func gatherTestOutput(r PodTestRunner, suiteName, testName, podName, mountPath s return err } - srcPath := r.TestOutput + srcPath := mountPath prefix := getStoragePrefix(srcPath) prefix = path.Clean(prefix) destPath := getDestPath(r.TestOutput, suiteName, testName) diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collector.go b/vendor/github.com/prometheus/client_golang/prometheus/collector.go index ac1ca3cf5..cf05079fb 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/collector.go @@ -69,9 +69,9 @@ type Collector interface { // If a Collector collects the same metrics throughout its lifetime, its // Describe method can simply be implemented as: // -// func (c customCollector) Describe(ch chan<- *Desc) { -// DescribeByCollect(c, ch) -// } +// func (c customCollector) Describe(ch chan<- *Desc) { +// DescribeByCollect(c, ch) +// } // // However, this will not work if the metrics collected change dynamically over // the lifetime of the Collector in a way that their combined set of descriptors diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collectors/collectors.go b/vendor/github.com/prometheus/client_golang/prometheus/collectors/collectors.go index c4d0f5c35..f4c92913a 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/collectors/collectors.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/collectors/collectors.go @@ -14,3 +14,27 @@ // Package collectors provides implementations of prometheus.Collector to // conveniently collect process and Go-related metrics. package collectors + +import "github.com/prometheus/client_golang/prometheus" + +// NewBuildInfoCollector returns a collector collecting a single metric +// "go_build_info" with the constant value 1 and three labels "path", "version", +// and "checksum". Their label values contain the main module path, version, and +// checksum, respectively. The labels will only have meaningful values if the +// binary is built with Go module support and from source code retrieved from +// the source repository (rather than the local file system). This is usually +// accomplished by building from outside of GOPATH, specifying the full address +// of the main package, e.g. "GO111MODULE=on go run +// github.com/prometheus/client_golang/examples/random". If built without Go +// module support, all label values will be "unknown". If built with Go module +// support but using the source code from the local file system, the "path" will +// be set appropriately, but "checksum" will be empty and "version" will be +// "(devel)". +// +// This collector uses only the build information for the main module. See +// https://github.com/povilasv/prommod for an example of a collector for the +// module dependencies. +func NewBuildInfoCollector() prometheus.Collector { + //nolint:staticcheck // Ignore SA1019 until v2. + return prometheus.NewBuildInfoCollector() +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector.go index e09f149d7..d5a7279fb 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector.go @@ -101,7 +101,7 @@ func (c *dbStatsCollector) Describe(ch chan<- *prometheus.Desc) { ch <- c.waitDuration ch <- c.maxIdleClosed ch <- c.maxLifetimeClosed - c.describeNewInGo115(ch) + ch <- c.maxIdleTimeClosed } // Collect implements Collector. @@ -115,5 +115,5 @@ func (c *dbStatsCollector) Collect(ch chan<- prometheus.Metric) { ch <- prometheus.MustNewConstMetric(c.waitDuration, prometheus.CounterValue, stats.WaitDuration.Seconds()) ch <- prometheus.MustNewConstMetric(c.maxIdleClosed, prometheus.CounterValue, float64(stats.MaxIdleClosed)) ch <- prometheus.MustNewConstMetric(c.maxLifetimeClosed, prometheus.CounterValue, float64(stats.MaxLifetimeClosed)) - c.collectNewInGo115(ch, stats) + ch <- prometheus.MustNewConstMetric(c.maxIdleTimeClosed, prometheus.CounterValue, float64(stats.MaxIdleTimeClosed)) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_go116.go similarity index 64% rename from vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector.go rename to vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_go116.go index edaa4e50b..effc57840 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_go116.go @@ -11,6 +11,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !go1.17 +// +build !go1.17 + package collectors import "github.com/prometheus/client_golang/prometheus" @@ -42,28 +45,5 @@ import "github.com/prometheus/client_golang/prometheus" // NOTE: The problem is solved in Go 1.15, see // https://github.com/golang/go/issues/19812 for the related Go issue. func NewGoCollector() prometheus.Collector { - //nolint:staticcheck // Ignore SA1019 until v2. return prometheus.NewGoCollector() } - -// NewBuildInfoCollector returns a collector collecting a single metric -// "go_build_info" with the constant value 1 and three labels "path", "version", -// and "checksum". Their label values contain the main module path, version, and -// checksum, respectively. The labels will only have meaningful values if the -// binary is built with Go module support and from source code retrieved from -// the source repository (rather than the local file system). This is usually -// accomplished by building from outside of GOPATH, specifying the full address -// of the main package, e.g. "GO111MODULE=on go run -// github.com/prometheus/client_golang/examples/random". If built without Go -// module support, all label values will be "unknown". If built with Go module -// support but using the source code from the local file system, the "path" will -// be set appropriately, but "checksum" will be empty and "version" will be -// "(devel)". -// -// This collector uses only the build information for the main module. See -// https://github.com/povilasv/prommod for an example of a collector for the -// module dependencies. -func NewBuildInfoCollector() prometheus.Collector { - //nolint:staticcheck // Ignore SA1019 until v2. - return prometheus.NewBuildInfoCollector() -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.go b/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.go new file mode 100644 index 000000000..246c5ea94 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.go @@ -0,0 +1,160 @@ +// Copyright 2021 The Prometheus 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. + +//go:build go1.17 +// +build go1.17 + +package collectors + +import ( + "regexp" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/internal" +) + +var ( + // MetricsAll allows all the metrics to be collected from Go runtime. + MetricsAll = GoRuntimeMetricsRule{regexp.MustCompile("/.*")} + // MetricsGC allows only GC metrics to be collected from Go runtime. + // e.g. go_gc_cycles_automatic_gc_cycles_total + MetricsGC = GoRuntimeMetricsRule{regexp.MustCompile(`^/gc/.*`)} + // MetricsMemory allows only memory metrics to be collected from Go runtime. + // e.g. go_memory_classes_heap_free_bytes + MetricsMemory = GoRuntimeMetricsRule{regexp.MustCompile(`^/memory/.*`)} + // MetricsScheduler allows only scheduler metrics to be collected from Go runtime. + // e.g. go_sched_goroutines_goroutines + MetricsScheduler = GoRuntimeMetricsRule{regexp.MustCompile(`^/sched/.*`)} +) + +// WithGoCollectorMemStatsMetricsDisabled disables metrics that is gathered in runtime.MemStats structure such as: +// +// go_memstats_alloc_bytes +// go_memstats_alloc_bytes_total +// go_memstats_sys_bytes +// go_memstats_lookups_total +// go_memstats_mallocs_total +// go_memstats_frees_total +// go_memstats_heap_alloc_bytes +// go_memstats_heap_sys_bytes +// go_memstats_heap_idle_bytes +// go_memstats_heap_inuse_bytes +// go_memstats_heap_released_bytes +// go_memstats_heap_objects +// go_memstats_stack_inuse_bytes +// go_memstats_stack_sys_bytes +// go_memstats_mspan_inuse_bytes +// go_memstats_mspan_sys_bytes +// go_memstats_mcache_inuse_bytes +// go_memstats_mcache_sys_bytes +// go_memstats_buck_hash_sys_bytes +// go_memstats_gc_sys_bytes +// go_memstats_other_sys_bytes +// go_memstats_next_gc_bytes +// +// so the metrics known from pre client_golang v1.12.0, +// +// NOTE(bwplotka): The above represents runtime.MemStats statistics, but they are +// actually implemented using new runtime/metrics package. (except skipped go_memstats_gc_cpu_fraction +// -- see https://github.com/prometheus/client_golang/issues/842#issuecomment-861812034 for explanation). +// +// Some users might want to disable this on collector level (although you can use scrape relabelling on Prometheus), +// because similar metrics can be now obtained using WithGoCollectorRuntimeMetrics. Note that the semantics of new +// metrics might be different, plus the names can be change over time with different Go version. +// +// NOTE(bwplotka): Changing metric names can be tedious at times as the alerts, recording rules and dashboards have to be adjusted. +// The old metrics are also very useful, with many guides and books written about how to interpret them. +// +// As a result our recommendation would be to stick with MemStats like metrics and enable other runtime/metrics if you are interested +// in advanced insights Go provides. See ExampleGoCollector_WithAdvancedGoMetrics. +func WithGoCollectorMemStatsMetricsDisabled() func(options *internal.GoCollectorOptions) { + return func(o *internal.GoCollectorOptions) { + o.DisableMemStatsLikeMetrics = true + } +} + +// GoRuntimeMetricsRule allow enabling and configuring particular group of runtime/metrics. +// TODO(bwplotka): Consider adding ability to adjust buckets. +type GoRuntimeMetricsRule struct { + // Matcher represents RE2 expression will match the runtime/metrics from https://golang.bg/src/runtime/metrics/description.go + // Use `regexp.MustCompile` or `regexp.Compile` to create this field. + Matcher *regexp.Regexp +} + +// WithGoCollectorRuntimeMetrics allows enabling and configuring particular group of runtime/metrics. +// See the list of metrics https://golang.bg/src/runtime/metrics/description.go (pick the Go version you use there!). +// You can use this option in repeated manner, which will add new rules. The order of rules is important, the last rule +// that matches particular metrics is applied. +func WithGoCollectorRuntimeMetrics(rules ...GoRuntimeMetricsRule) func(options *internal.GoCollectorOptions) { + rs := make([]internal.GoCollectorRule, len(rules)) + for i, r := range rules { + rs[i] = internal.GoCollectorRule{ + Matcher: r.Matcher, + } + } + + return func(o *internal.GoCollectorOptions) { + o.RuntimeMetricRules = append(o.RuntimeMetricRules, rs...) + } +} + +// WithoutGoCollectorRuntimeMetrics allows disabling group of runtime/metrics that you might have added in WithGoCollectorRuntimeMetrics. +// It behaves similarly to WithGoCollectorRuntimeMetrics just with deny-list semantics. +func WithoutGoCollectorRuntimeMetrics(matchers ...*regexp.Regexp) func(options *internal.GoCollectorOptions) { + rs := make([]internal.GoCollectorRule, len(matchers)) + for i, m := range matchers { + rs[i] = internal.GoCollectorRule{ + Matcher: m, + Deny: true, + } + } + + return func(o *internal.GoCollectorOptions) { + o.RuntimeMetricRules = append(o.RuntimeMetricRules, rs...) + } +} + +// GoCollectionOption represents Go collection option flag. +// Deprecated. +type GoCollectionOption uint32 + +const ( + // GoRuntimeMemStatsCollection represents the metrics represented by runtime.MemStats structure. + // Deprecated. Use WithGoCollectorMemStatsMetricsDisabled() function to disable those metrics in the collector. + GoRuntimeMemStatsCollection GoCollectionOption = 1 << iota + // GoRuntimeMetricsCollection is the new set of metrics represented by runtime/metrics package. + // Deprecated. Use WithGoCollectorRuntimeMetrics(GoRuntimeMetricsRule{Matcher: regexp.MustCompile("/.*")}) + // function to enable those metrics in the collector. + GoRuntimeMetricsCollection +) + +// WithGoCollections allows enabling different collections for Go collector on top of base metrics. +// Deprecated. Use WithGoCollectorRuntimeMetrics() and WithGoCollectorMemStatsMetricsDisabled() instead to control metrics. +func WithGoCollections(flags GoCollectionOption) func(options *internal.GoCollectorOptions) { + return func(options *internal.GoCollectorOptions) { + if flags&GoRuntimeMemStatsCollection == 0 { + WithGoCollectorMemStatsMetricsDisabled()(options) + } + + if flags&GoRuntimeMetricsCollection != 0 { + WithGoCollectorRuntimeMetrics(GoRuntimeMetricsRule{Matcher: regexp.MustCompile("/.*")})(options) + } + } +} + +// NewGoCollector returns a collector that exports metrics about the current Go +// process using debug.GCStats (base metrics) and runtime/metrics (both in MemStats style and new ones). +func NewGoCollector(opts ...func(o *internal.GoCollectorOptions)) prometheus.Collector { + //nolint:staticcheck // Ignore SA1019 until v2. + return prometheus.NewGoCollector(opts...) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/vendor/github.com/prometheus/client_golang/prometheus/counter.go index 00d70f09b..de30de6da 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/counter.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -51,7 +51,7 @@ type Counter interface { // will lead to a valid (label-less) exemplar. But if Labels is nil, the current // exemplar is left in place. AddWithExemplar panics if the value is < 0, if any // of the provided labels are invalid, or if the provided labels contain more -// than 64 runes in total. +// than 128 runes in total. type ExemplarAdder interface { AddWithExemplar(value float64, exemplar Labels) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/prometheus/client_golang/prometheus/desc.go index 4bb816ab7..8bc5e44e2 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/desc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -20,6 +20,9 @@ import ( "strings" "github.com/cespare/xxhash/v2" + + "github.com/prometheus/client_golang/prometheus/internal" + //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/golang/protobuf/proto" "github.com/prometheus/common/model" @@ -154,7 +157,7 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * Value: proto.String(v), }) } - sort.Sort(labelPairSorter(d.constLabelPairs)) + sort.Sort(internal.LabelPairSorter(d.constLabelPairs)) return d } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector_pre_go115.go b/vendor/github.com/prometheus/client_golang/prometheus/get_pid.go similarity index 61% rename from vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector_pre_go115.go rename to vendor/github.com/prometheus/client_golang/prometheus/get_pid.go index 65235069d..614fd61be 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector_pre_go115.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/get_pid.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright 2015 The Prometheus 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 @@ -11,17 +11,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !go1.15 -// +build !go1.15 +//go:build !js || wasm +// +build !js wasm -package collectors +package prometheus -import ( - "database/sql" +import "os" - "github.com/prometheus/client_golang/prometheus" -) - -func (c *dbStatsCollector) describeNewInGo115(ch chan<- *prometheus.Desc) {} - -func (c *dbStatsCollector) collectNewInGo115(ch chan<- prometheus.Metric, stats sql.DBStats) {} +func getPIDFn() func() (int, error) { + pid := os.Getpid() + return func() (int, error) { + return pid, nil + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/get_pid_gopherjs.go b/vendor/github.com/prometheus/client_golang/prometheus/get_pid_gopherjs.go new file mode 100644 index 000000000..eaf8059ee --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/get_pid_gopherjs.go @@ -0,0 +1,23 @@ +// Copyright 2015 The Prometheus 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. + +//go:build js && !wasm +// +build js,!wasm + +package prometheus + +func getPIDFn() func() (int, error) { + return func() (int, error) { + return 1, nil + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go index 08195b410..ad9a71a5e 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go @@ -19,6 +19,10 @@ import ( "time" ) +// goRuntimeMemStats provides the metrics initially provided by runtime.ReadMemStats. +// From Go 1.17 those similar (and better) statistics are provided by runtime/metrics, so +// while eval closure works on runtime.MemStats, the struct from Go 1.17+ is +// populated using runtime/metrics. func goRuntimeMemStats() memStatsMetrics { return memStatsMetrics{ { @@ -197,14 +201,6 @@ func goRuntimeMemStats() memStatsMetrics { ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.NextGC) }, valType: GaugeValue, - }, { - desc: NewDesc( - memstatNamespace("gc_cpu_fraction"), - "The fraction of this program's available CPU time used by the GC since the program started.", - nil, nil, - ), - eval: func(ms *runtime.MemStats) float64 { return ms.GCCPUFraction }, - valType: GaugeValue, }, } } @@ -232,7 +228,7 @@ func newBaseGoCollector() baseGoCollector { "A summary of the pause duration of garbage collection cycles.", nil, nil), gcLastTimeDesc: NewDesc( - memstatNamespace("last_gc_time_seconds"), + "go_memstats_last_gc_time_seconds", "Number of seconds since 1970 of last garbage collection.", nil, nil), goInfoDesc: NewDesc( @@ -254,8 +250,9 @@ func (c *baseGoCollector) Describe(ch chan<- *Desc) { // Collect returns the current state of all metrics of the collector. func (c *baseGoCollector) Collect(ch chan<- Metric) { ch <- MustNewConstMetric(c.goroutinesDesc, GaugeValue, float64(runtime.NumGoroutine())) - n, _ := runtime.ThreadCreateProfile(nil) - ch <- MustNewConstMetric(c.threadsDesc, GaugeValue, float64(n)) + + n := getRuntimeNumThreads() + ch <- MustNewConstMetric(c.threadsDesc, GaugeValue, n) var stats debug.GCStats stats.PauseQuantiles = make([]time.Duration, 5) @@ -268,7 +265,6 @@ func (c *baseGoCollector) Collect(ch chan<- Metric) { quantiles[0.0] = stats.PauseQuantiles[0].Seconds() ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), stats.PauseTotal.Seconds(), quantiles) ch <- MustNewConstMetric(c.gcLastTimeDesc, GaugeValue, float64(stats.LastGC.UnixNano())/1e9) - ch <- MustNewConstMetric(c.goInfoDesc, GaugeValue, 1) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_go116.go b/vendor/github.com/prometheus/client_golang/prometheus/go_collector_go116.go index 24526131e..897a6e906 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_go116.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/go_collector_go116.go @@ -40,13 +40,28 @@ type goCollector struct { // // Deprecated: Use collectors.NewGoCollector instead. func NewGoCollector() Collector { + msMetrics := goRuntimeMemStats() + msMetrics = append(msMetrics, struct { + desc *Desc + eval func(*runtime.MemStats) float64 + valType ValueType + }{ + // This metric is omitted in Go1.17+, see https://github.com/prometheus/client_golang/issues/842#issuecomment-861812034 + desc: NewDesc( + memstatNamespace("gc_cpu_fraction"), + "The fraction of this program's available CPU time used by the GC since the program started.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return ms.GCCPUFraction }, + valType: GaugeValue, + }) return &goCollector{ base: newBaseGoCollector(), msLast: &runtime.MemStats{}, msRead: runtime.ReadMemStats, msMaxWait: time.Second, msMaxAge: 5 * time.Minute, - msMetrics: goRuntimeMemStats(), + msMetrics: msMetrics, } } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_go117.go b/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go similarity index 53% rename from vendor/github.com/prometheus/client_golang/prometheus/go_collector_go117.go rename to vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go index d43bdcdda..3a2d55e84 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_go117.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go @@ -25,10 +25,72 @@ import ( //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/golang/protobuf/proto" - "github.com/prometheus/client_golang/prometheus/internal" dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/client_golang/prometheus/internal" +) + +const ( + // constants for strings referenced more than once. + goGCHeapTinyAllocsObjects = "/gc/heap/tiny/allocs:objects" + goGCHeapAllocsObjects = "/gc/heap/allocs:objects" + goGCHeapFreesObjects = "/gc/heap/frees:objects" + goGCHeapFreesBytes = "/gc/heap/frees:bytes" + goGCHeapAllocsBytes = "/gc/heap/allocs:bytes" + goGCHeapObjects = "/gc/heap/objects:objects" + goGCHeapGoalBytes = "/gc/heap/goal:bytes" + goMemoryClassesTotalBytes = "/memory/classes/total:bytes" + goMemoryClassesHeapObjectsBytes = "/memory/classes/heap/objects:bytes" + goMemoryClassesHeapUnusedBytes = "/memory/classes/heap/unused:bytes" + goMemoryClassesHeapReleasedBytes = "/memory/classes/heap/released:bytes" + goMemoryClassesHeapFreeBytes = "/memory/classes/heap/free:bytes" + goMemoryClassesHeapStacksBytes = "/memory/classes/heap/stacks:bytes" + goMemoryClassesOSStacksBytes = "/memory/classes/os-stacks:bytes" + goMemoryClassesMetadataMSpanInuseBytes = "/memory/classes/metadata/mspan/inuse:bytes" + goMemoryClassesMetadataMSPanFreeBytes = "/memory/classes/metadata/mspan/free:bytes" + goMemoryClassesMetadataMCacheInuseBytes = "/memory/classes/metadata/mcache/inuse:bytes" + goMemoryClassesMetadataMCacheFreeBytes = "/memory/classes/metadata/mcache/free:bytes" + goMemoryClassesProfilingBucketsBytes = "/memory/classes/profiling/buckets:bytes" + goMemoryClassesMetadataOtherBytes = "/memory/classes/metadata/other:bytes" + goMemoryClassesOtherBytes = "/memory/classes/other:bytes" ) +// rmNamesForMemStatsMetrics represents runtime/metrics names required to populate goRuntimeMemStats from like logic. +var rmNamesForMemStatsMetrics = []string{ + goGCHeapTinyAllocsObjects, + goGCHeapAllocsObjects, + goGCHeapFreesObjects, + goGCHeapAllocsBytes, + goGCHeapObjects, + goGCHeapGoalBytes, + goMemoryClassesTotalBytes, + goMemoryClassesHeapObjectsBytes, + goMemoryClassesHeapUnusedBytes, + goMemoryClassesHeapReleasedBytes, + goMemoryClassesHeapFreeBytes, + goMemoryClassesHeapStacksBytes, + goMemoryClassesOSStacksBytes, + goMemoryClassesMetadataMSpanInuseBytes, + goMemoryClassesMetadataMSPanFreeBytes, + goMemoryClassesMetadataMCacheInuseBytes, + goMemoryClassesMetadataMCacheFreeBytes, + goMemoryClassesProfilingBucketsBytes, + goMemoryClassesMetadataOtherBytes, + goMemoryClassesOtherBytes, +} + +func bestEffortLookupRM(lookup []string) []metrics.Description { + ret := make([]metrics.Description, 0, len(lookup)) + for _, rm := range metrics.All() { + for _, m := range lookup { + if m == rm.Name { + ret = append(ret, rm) + } + } + } + return ret +} + type goCollector struct { base baseGoCollector @@ -36,70 +98,124 @@ type goCollector struct { // snapshot is always produced by Collect. mu sync.Mutex - // rm... fields all pertain to the runtime/metrics package. - rmSampleBuf []metrics.Sample - rmSampleMap map[string]*metrics.Sample - rmMetrics []collectorMetric + // Contains all samples that has to retrieved from runtime/metrics (not all of them will be exposed). + sampleBuf []metrics.Sample + // sampleMap allows lookup for MemStats metrics and runtime/metrics histograms for exact sums. + sampleMap map[string]*metrics.Sample + + // rmExposedMetrics represents all runtime/metrics package metrics + // that were configured to be exposed. + rmExposedMetrics []collectorMetric + rmExactSumMapForHist map[string]string // With Go 1.17, the runtime/metrics package was introduced. // From that point on, metric names produced by the runtime/metrics // package could be generated from runtime/metrics names. However, // these differ from the old names for the same values. // - // This field exist to export the same values under the old names + // This field exists to export the same values under the old names // as well. - msMetrics memStatsMetrics + msMetrics memStatsMetrics + msMetricsEnabled bool +} + +type rmMetricDesc struct { + metrics.Description +} + +func matchRuntimeMetricsRules(rules []internal.GoCollectorRule) []rmMetricDesc { + var descs []rmMetricDesc + for _, d := range metrics.All() { + var ( + deny = true + desc rmMetricDesc + ) + + for _, r := range rules { + if !r.Matcher.MatchString(d.Name) { + continue + } + deny = r.Deny + } + if deny { + continue + } + + desc.Description = d + descs = append(descs, desc) + } + return descs +} + +func defaultGoCollectorOptions() internal.GoCollectorOptions { + return internal.GoCollectorOptions{ + RuntimeMetricSumForHist: map[string]string{ + "/gc/heap/allocs-by-size:bytes": goGCHeapAllocsBytes, + "/gc/heap/frees-by-size:bytes": goGCHeapFreesBytes, + }, + RuntimeMetricRules: []internal.GoCollectorRule{ + //{Matcher: regexp.MustCompile("")}, + }, + } } // NewGoCollector is the obsolete version of collectors.NewGoCollector. // See there for documentation. // // Deprecated: Use collectors.NewGoCollector instead. -func NewGoCollector() Collector { - descriptions := metrics.All() +func NewGoCollector(opts ...func(o *internal.GoCollectorOptions)) Collector { + opt := defaultGoCollectorOptions() + for _, o := range opts { + o(&opt) + } + + exposedDescriptions := matchRuntimeMetricsRules(opt.RuntimeMetricRules) // Collect all histogram samples so that we can get their buckets. // The API guarantees that the buckets are always fixed for the lifetime // of the process. var histograms []metrics.Sample - for _, d := range descriptions { + for _, d := range exposedDescriptions { if d.Kind == metrics.KindFloat64Histogram { histograms = append(histograms, metrics.Sample{Name: d.Name}) } } - metrics.Read(histograms) + + if len(histograms) > 0 { + metrics.Read(histograms) + } + bucketsMap := make(map[string][]float64) for i := range histograms { bucketsMap[histograms[i].Name] = histograms[i].Value.Float64Histogram().Buckets } - // Generate a Desc and ValueType for each runtime/metrics metric. - metricSet := make([]collectorMetric, 0, len(descriptions)) - sampleBuf := make([]metrics.Sample, 0, len(descriptions)) - sampleMap := make(map[string]*metrics.Sample, len(descriptions)) - for i := range descriptions { - d := &descriptions[i] - namespace, subsystem, name, ok := internal.RuntimeMetricsToProm(d) + // Generate a collector for each exposed runtime/metrics metric. + metricSet := make([]collectorMetric, 0, len(exposedDescriptions)) + // SampleBuf is used for reading from runtime/metrics. + // We are assuming the largest case to have stable pointers for sampleMap purposes. + sampleBuf := make([]metrics.Sample, 0, len(exposedDescriptions)+len(opt.RuntimeMetricSumForHist)+len(rmNamesForMemStatsMetrics)) + sampleMap := make(map[string]*metrics.Sample, len(exposedDescriptions)) + for _, d := range exposedDescriptions { + namespace, subsystem, name, ok := internal.RuntimeMetricsToProm(&d.Description) if !ok { // Just ignore this metric; we can't do anything with it here. // If a user decides to use the latest version of Go, we don't want - // to fail here. This condition is tested elsewhere. + // to fail here. This condition is tested in TestExpectedRuntimeMetrics. continue } - // Set up sample buffer for reading, and a map - // for quick lookup of sample values. sampleBuf = append(sampleBuf, metrics.Sample{Name: d.Name}) sampleMap[d.Name] = &sampleBuf[len(sampleBuf)-1] var m collectorMetric if d.Kind == metrics.KindFloat64Histogram { - _, hasSum := rmExactSumMap[d.Name] + _, hasSum := opt.RuntimeMetricSumForHist[d.Name] unit := d.Name[strings.IndexRune(d.Name, ':')+1:] m = newBatchHistogram( NewDesc( BuildFQName(namespace, subsystem, name), - d.Description, + d.Description.Description, nil, nil, ), @@ -111,24 +227,61 @@ func NewGoCollector() Collector { Namespace: namespace, Subsystem: subsystem, Name: name, - Help: d.Description, - }) + Help: d.Description.Description, + }, + ) } else { m = NewGauge(GaugeOpts{ Namespace: namespace, Subsystem: subsystem, Name: name, - Help: d.Description, + Help: d.Description.Description, }) } metricSet = append(metricSet, m) } + + // Add exact sum metrics to sampleBuf if not added before. + for _, h := range histograms { + sumMetric, ok := opt.RuntimeMetricSumForHist[h.Name] + if !ok { + continue + } + + if _, ok := sampleMap[sumMetric]; ok { + continue + } + sampleBuf = append(sampleBuf, metrics.Sample{Name: sumMetric}) + sampleMap[sumMetric] = &sampleBuf[len(sampleBuf)-1] + } + + var ( + msMetrics memStatsMetrics + msDescriptions []metrics.Description + ) + + if !opt.DisableMemStatsLikeMetrics { + msMetrics = goRuntimeMemStats() + msDescriptions = bestEffortLookupRM(rmNamesForMemStatsMetrics) + + // Check if metric was not exposed before and if not, add to sampleBuf. + for _, mdDesc := range msDescriptions { + if _, ok := sampleMap[mdDesc.Name]; ok { + continue + } + sampleBuf = append(sampleBuf, metrics.Sample{Name: mdDesc.Name}) + sampleMap[mdDesc.Name] = &sampleBuf[len(sampleBuf)-1] + } + } + return &goCollector{ - base: newBaseGoCollector(), - rmSampleBuf: sampleBuf, - rmSampleMap: sampleMap, - rmMetrics: metricSet, - msMetrics: goRuntimeMemStats(), + base: newBaseGoCollector(), + sampleBuf: sampleBuf, + sampleMap: sampleMap, + rmExposedMetrics: metricSet, + rmExactSumMapForHist: opt.RuntimeMetricSumForHist, + msMetrics: msMetrics, + msMetricsEnabled: !opt.DisableMemStatsLikeMetrics, } } @@ -138,7 +291,7 @@ func (c *goCollector) Describe(ch chan<- *Desc) { for _, i := range c.msMetrics { ch <- i.desc } - for _, m := range c.rmMetrics { + for _, m := range c.rmExposedMetrics { ch <- m.Desc() } } @@ -148,8 +301,12 @@ func (c *goCollector) Collect(ch chan<- Metric) { // Collect base non-memory metrics. c.base.Collect(ch) + if len(c.sampleBuf) == 0 { + return + } + // Collect must be thread-safe, so prevent concurrent use of - // rmSampleBuf. Just read into rmSampleBuf but write all the data + // sampleBuf elements. Just read into sampleBuf but write all the data // we get into our Metrics or MemStats. // // This lock also ensures that the Metrics we send out are all from @@ -164,14 +321,17 @@ func (c *goCollector) Collect(ch chan<- Metric) { defer c.mu.Unlock() // Populate runtime/metrics sample buffer. - metrics.Read(c.rmSampleBuf) + metrics.Read(c.sampleBuf) + + // Collect all our runtime/metrics user chose to expose from sampleBuf (if any). + for i, metric := range c.rmExposedMetrics { + // We created samples for exposed metrics first in order, so indexes match. + sample := c.sampleBuf[i] - // Update all our metrics from rmSampleBuf. - for i, sample := range c.rmSampleBuf { // N.B. switch on concrete type because it's significantly more efficient // than checking for the Counter and Gauge interface implementations. In // this case, we control all the types here. - switch m := c.rmMetrics[i].(type) { + switch m := metric.(type) { case *counter: // Guard against decreases. This should never happen, but a failure // to do so will result in a panic, which is a harsh consequence for @@ -191,12 +351,15 @@ func (c *goCollector) Collect(ch chan<- Metric) { panic("unexpected metric type") } } - // ms is a dummy MemStats that we populate ourselves so that we can - // populate the old metrics from it. - var ms runtime.MemStats - memStatsFromRM(&ms, c.rmSampleMap) - for _, i := range c.msMetrics { - ch <- MustNewConstMetric(i.desc, i.valType, i.eval(&ms)) + + if c.msMetricsEnabled { + // ms is a dummy MemStats that we populate ourselves so that we can + // populate the old metrics from it if goMemStatsCollection is enabled. + var ms runtime.MemStats + memStatsFromRM(&ms, c.sampleMap) + for _, i := range c.msMetrics { + ch <- MustNewConstMetric(i.desc, i.valType, i.eval(&ms)) + } } } @@ -224,11 +387,6 @@ func unwrapScalarRMValue(v metrics.Value) float64 { } } -var rmExactSumMap = map[string]string{ - "/gc/heap/allocs-by-size:bytes": "/gc/heap/allocs:bytes", - "/gc/heap/frees-by-size:bytes": "/gc/heap/frees:bytes", -} - // exactSumFor takes a runtime/metrics metric name (that is assumed to // be of kind KindFloat64Histogram) and returns its exact sum and whether // its exact sum exists. @@ -236,11 +394,11 @@ var rmExactSumMap = map[string]string{ // The runtime/metrics API for histograms doesn't currently expose exact // sums, but some of the other metrics are in fact exact sums of histograms. func (c *goCollector) exactSumFor(rmName string) float64 { - sumName, ok := rmExactSumMap[rmName] + sumName, ok := c.rmExactSumMapForHist[rmName] if !ok { return 0 } - s, ok := c.rmSampleMap[sumName] + s, ok := c.sampleMap[sumName] if !ok { return 0 } @@ -261,35 +419,30 @@ func memStatsFromRM(ms *runtime.MemStats, rm map[string]*metrics.Sample) { // while having Mallocs - Frees still represent a live object count. // Unfortunately, MemStats doesn't actually export a large allocation count, // so it's impossible to pull this number out directly. - tinyAllocs := lookupOrZero("/gc/heap/tiny/allocs:objects") - ms.Mallocs = lookupOrZero("/gc/heap/allocs:objects") + tinyAllocs - ms.Frees = lookupOrZero("/gc/heap/frees:objects") + tinyAllocs + tinyAllocs := lookupOrZero(goGCHeapTinyAllocsObjects) + ms.Mallocs = lookupOrZero(goGCHeapAllocsObjects) + tinyAllocs + ms.Frees = lookupOrZero(goGCHeapFreesObjects) + tinyAllocs - ms.TotalAlloc = lookupOrZero("/gc/heap/allocs:bytes") - ms.Sys = lookupOrZero("/memory/classes/total:bytes") + ms.TotalAlloc = lookupOrZero(goGCHeapAllocsBytes) + ms.Sys = lookupOrZero(goMemoryClassesTotalBytes) ms.Lookups = 0 // Already always zero. - ms.HeapAlloc = lookupOrZero("/memory/classes/heap/objects:bytes") + ms.HeapAlloc = lookupOrZero(goMemoryClassesHeapObjectsBytes) ms.Alloc = ms.HeapAlloc - ms.HeapInuse = ms.HeapAlloc + lookupOrZero("/memory/classes/heap/unused:bytes") - ms.HeapReleased = lookupOrZero("/memory/classes/heap/released:bytes") - ms.HeapIdle = ms.HeapReleased + lookupOrZero("/memory/classes/heap/free:bytes") + ms.HeapInuse = ms.HeapAlloc + lookupOrZero(goMemoryClassesHeapUnusedBytes) + ms.HeapReleased = lookupOrZero(goMemoryClassesHeapReleasedBytes) + ms.HeapIdle = ms.HeapReleased + lookupOrZero(goMemoryClassesHeapFreeBytes) ms.HeapSys = ms.HeapInuse + ms.HeapIdle - ms.HeapObjects = lookupOrZero("/gc/heap/objects:objects") - ms.StackInuse = lookupOrZero("/memory/classes/heap/stacks:bytes") - ms.StackSys = ms.StackInuse + lookupOrZero("/memory/classes/os-stacks:bytes") - ms.MSpanInuse = lookupOrZero("/memory/classes/metadata/mspan/inuse:bytes") - ms.MSpanSys = ms.MSpanInuse + lookupOrZero("/memory/classes/metadata/mspan/free:bytes") - ms.MCacheInuse = lookupOrZero("/memory/classes/metadata/mcache/inuse:bytes") - ms.MCacheSys = ms.MCacheInuse + lookupOrZero("/memory/classes/metadata/mcache/free:bytes") - ms.BuckHashSys = lookupOrZero("/memory/classes/profiling/buckets:bytes") - ms.GCSys = lookupOrZero("/memory/classes/metadata/other:bytes") - ms.OtherSys = lookupOrZero("/memory/classes/other:bytes") - ms.NextGC = lookupOrZero("/gc/heap/goal:bytes") - - // N.B. LastGC is omitted because runtime.GCStats already has this. - // See https://github.com/prometheus/client_golang/issues/842#issuecomment-861812034 - // for more details. - ms.LastGC = 0 + ms.HeapObjects = lookupOrZero(goGCHeapObjects) + ms.StackInuse = lookupOrZero(goMemoryClassesHeapStacksBytes) + ms.StackSys = ms.StackInuse + lookupOrZero(goMemoryClassesOSStacksBytes) + ms.MSpanInuse = lookupOrZero(goMemoryClassesMetadataMSpanInuseBytes) + ms.MSpanSys = ms.MSpanInuse + lookupOrZero(goMemoryClassesMetadataMSPanFreeBytes) + ms.MCacheInuse = lookupOrZero(goMemoryClassesMetadataMCacheInuseBytes) + ms.MCacheSys = ms.MCacheInuse + lookupOrZero(goMemoryClassesMetadataMCacheFreeBytes) + ms.BuckHashSys = lookupOrZero(goMemoryClassesProfilingBucketsBytes) + ms.GCSys = lookupOrZero(goMemoryClassesMetadataOtherBytes) + ms.OtherSys = lookupOrZero(goMemoryClassesOtherBytes) + ms.NextGC = lookupOrZero(goGCHeapGoalBytes) // N.B. GCCPUFraction is intentionally omitted. This metric is not useful, // and often misleading due to the fact that it's an average over the lifetime @@ -324,6 +477,11 @@ type batchHistogram struct { // buckets must always be from the runtime/metrics package, following // the same conventions. func newBatchHistogram(desc *Desc, buckets []float64, hasSum bool) *batchHistogram { + // We need to remove -Inf values. runtime/metrics keeps them around. + // But -Inf bucket should not be allowed for prometheus histograms. + if buckets[0] == math.Inf(-1) { + buckets = buckets[1:] + } h := &batchHistogram{ desc: desc, buckets: buckets, @@ -382,8 +540,10 @@ func (h *batchHistogram) Write(out *dto.Metric) error { for i, count := range h.counts { totalCount += count if !h.hasSum { - // N.B. This computed sum is an underestimate. - sum += h.buckets[i] * float64(count) + if count != 0 { + // N.B. This computed sum is an underestimate. + sum += h.buckets[i] * float64(count) + } } // Skip the +Inf bucket, but only for the bucket list. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go index 893802fd6..0d47fecdc 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -581,11 +581,11 @@ func (h *constHistogram) Desc() *Desc { func (h *constHistogram) Write(out *dto.Metric) error { his := &dto.Histogram{} + buckets := make([]*dto.Bucket, 0, len(h.buckets)) his.SampleCount = proto.Uint64(h.count) his.SampleSum = proto.Float64(h.sum) - for upperBound, count := range h.buckets { buckets = append(buckets, &dto.Bucket{ CumulativeCount: proto.Uint64(count), diff --git a/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go b/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go new file mode 100644 index 000000000..fd45cadc0 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go @@ -0,0 +1,651 @@ +// Copyright 2022 The Prometheus 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. +// +// It provides tools to compare sequences of strings and generate textual diffs. +// +// Maintaining `GetUnifiedDiffString` here because original repository +// (https://github.com/pmezard/go-difflib) is no loger maintained. +package internal + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" +) + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func calculateRatio(matches, length int) float64 { + if length > 0 { + return 2.0 * float64(matches) / float64(length) + } + return 1.0 +} + +type Match struct { + A int + B int + Size int +} + +type OpCode struct { + Tag byte + I1 int + I2 int + J1 int + J2 int +} + +// SequenceMatcher compares sequence of strings. The basic +// algorithm predates, and is a little fancier than, an algorithm +// published in the late 1980's by Ratcliff and Obershelp under the +// hyperbolic name "gestalt pattern matching". The basic idea is to find +// the longest contiguous matching subsequence that contains no "junk" +// elements (R-O doesn't address junk). The same idea is then applied +// recursively to the pieces of the sequences to the left and to the right +// of the matching subsequence. This does not yield minimal edit +// sequences, but does tend to yield matches that "look right" to people. +// +// SequenceMatcher tries to compute a "human-friendly diff" between two +// sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the +// longest *contiguous* & junk-free matching subsequence. That's what +// catches peoples' eyes. The Windows(tm) windiff has another interesting +// notion, pairing up elements that appear uniquely in each sequence. +// That, and the method here, appear to yield more intuitive difference +// reports than does diff. This method appears to be the least vulnerable +// to synching up on blocks of "junk lines", though (like blank lines in +// ordinary text files, or maybe "

" lines in HTML files). That may be +// because this is the only method of the 3 that has a *concept* of +// "junk" . +// +// Timing: Basic R-O is cubic time worst case and quadratic time expected +// case. SequenceMatcher is quadratic time for the worst case and has +// expected-case behavior dependent in a complicated way on how many +// elements the sequences have in common; best case time is linear. +type SequenceMatcher struct { + a []string + b []string + b2j map[string][]int + IsJunk func(string) bool + autoJunk bool + bJunk map[string]struct{} + matchingBlocks []Match + fullBCount map[string]int + bPopular map[string]struct{} + opCodes []OpCode +} + +func NewMatcher(a, b []string) *SequenceMatcher { + m := SequenceMatcher{autoJunk: true} + m.SetSeqs(a, b) + return &m +} + +func NewMatcherWithJunk(a, b []string, autoJunk bool, + isJunk func(string) bool, +) *SequenceMatcher { + m := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk} + m.SetSeqs(a, b) + return &m +} + +// Set two sequences to be compared. +func (m *SequenceMatcher) SetSeqs(a, b []string) { + m.SetSeq1(a) + m.SetSeq2(b) +} + +// Set the first sequence to be compared. The second sequence to be compared is +// not changed. +// +// SequenceMatcher computes and caches detailed information about the second +// sequence, so if you want to compare one sequence S against many sequences, +// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other +// sequences. +// +// See also SetSeqs() and SetSeq2(). +func (m *SequenceMatcher) SetSeq1(a []string) { + if &a == &m.a { + return + } + m.a = a + m.matchingBlocks = nil + m.opCodes = nil +} + +// Set the second sequence to be compared. The first sequence to be compared is +// not changed. +func (m *SequenceMatcher) SetSeq2(b []string) { + if &b == &m.b { + return + } + m.b = b + m.matchingBlocks = nil + m.opCodes = nil + m.fullBCount = nil + m.chainB() +} + +func (m *SequenceMatcher) chainB() { + // Populate line -> index mapping + b2j := map[string][]int{} + for i, s := range m.b { + indices := b2j[s] + indices = append(indices, i) + b2j[s] = indices + } + + // Purge junk elements + m.bJunk = map[string]struct{}{} + if m.IsJunk != nil { + junk := m.bJunk + for s := range b2j { + if m.IsJunk(s) { + junk[s] = struct{}{} + } + } + for s := range junk { + delete(b2j, s) + } + } + + // Purge remaining popular elements + popular := map[string]struct{}{} + n := len(m.b) + if m.autoJunk && n >= 200 { + ntest := n/100 + 1 + for s, indices := range b2j { + if len(indices) > ntest { + popular[s] = struct{}{} + } + } + for s := range popular { + delete(b2j, s) + } + } + m.bPopular = popular + m.b2j = b2j +} + +func (m *SequenceMatcher) isBJunk(s string) bool { + _, ok := m.bJunk[s] + return ok +} + +// Find longest matching block in a[alo:ahi] and b[blo:bhi]. +// +// If IsJunk is not defined: +// +// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where +// alo <= i <= i+k <= ahi +// blo <= j <= j+k <= bhi +// and for all (i',j',k') meeting those conditions, +// k >= k' +// i <= i' +// and if i == i', j <= j' +// +// In other words, of all maximal matching blocks, return one that +// starts earliest in a, and of all those maximal matching blocks that +// start earliest in a, return the one that starts earliest in b. +// +// If IsJunk is defined, first the longest matching block is +// determined as above, but with the additional restriction that no +// junk element appears in the block. Then that block is extended as +// far as possible by matching (only) junk elements on both sides. So +// the resulting block never matches on junk except as identical junk +// happens to be adjacent to an "interesting" match. +// +// If no blocks match, return (alo, blo, 0). +func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match { + // CAUTION: stripping common prefix or suffix would be incorrect. + // E.g., + // ab + // acab + // Longest matching block is "ab", but if common prefix is + // stripped, it's "a" (tied with "b"). UNIX(tm) diff does so + // strip, so ends up claiming that ab is changed to acab by + // inserting "ca" in the middle. That's minimal but unintuitive: + // "it's obvious" that someone inserted "ac" at the front. + // Windiff ends up at the same place as diff, but by pairing up + // the unique 'b's and then matching the first two 'a's. + besti, bestj, bestsize := alo, blo, 0 + + // find longest junk-free match + // during an iteration of the loop, j2len[j] = length of longest + // junk-free match ending with a[i-1] and b[j] + j2len := map[int]int{} + for i := alo; i != ahi; i++ { + // look at all instances of a[i] in b; note that because + // b2j has no junk keys, the loop is skipped if a[i] is junk + newj2len := map[int]int{} + for _, j := range m.b2j[m.a[i]] { + // a[i] matches b[j] + if j < blo { + continue + } + if j >= bhi { + break + } + k := j2len[j-1] + 1 + newj2len[j] = k + if k > bestsize { + besti, bestj, bestsize = i-k+1, j-k+1, k + } + } + j2len = newj2len + } + + // Extend the best by non-junk elements on each end. In particular, + // "popular" non-junk elements aren't in b2j, which greatly speeds + // the inner loop above, but also means "the best" match so far + // doesn't contain any junk *or* popular non-junk elements. + for besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + !m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize++ + } + + // Now that we have a wholly interesting match (albeit possibly + // empty!), we may as well suck up the matching junk on each + // side of it too. Can't think of a good reason not to, and it + // saves post-processing the (possibly considerable) expense of + // figuring out what to do with it. In the case of an empty + // interesting match, this is clearly the right thing to do, + // because no other kind of match is possible in the regions. + for besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize++ + } + + return Match{A: besti, B: bestj, Size: bestsize} +} + +// Return list of triples describing matching subsequences. +// +// Each triple is of the form (i, j, n), and means that +// a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in +// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are +// adjacent triples in the list, and the second is not the last triple in the +// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe +// adjacent equal blocks. +// +// The last triple is a dummy, (len(a), len(b), 0), and is the only +// triple with n==0. +func (m *SequenceMatcher) GetMatchingBlocks() []Match { + if m.matchingBlocks != nil { + return m.matchingBlocks + } + + var matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match + matchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match { + match := m.findLongestMatch(alo, ahi, blo, bhi) + i, j, k := match.A, match.B, match.Size + if match.Size > 0 { + if alo < i && blo < j { + matched = matchBlocks(alo, i, blo, j, matched) + } + matched = append(matched, match) + if i+k < ahi && j+k < bhi { + matched = matchBlocks(i+k, ahi, j+k, bhi, matched) + } + } + return matched + } + matched := matchBlocks(0, len(m.a), 0, len(m.b), nil) + + // It's possible that we have adjacent equal blocks in the + // matching_blocks list now. + nonAdjacent := []Match{} + i1, j1, k1 := 0, 0, 0 + for _, b := range matched { + // Is this block adjacent to i1, j1, k1? + i2, j2, k2 := b.A, b.B, b.Size + if i1+k1 == i2 && j1+k1 == j2 { + // Yes, so collapse them -- this just increases the length of + // the first block by the length of the second, and the first + // block so lengthened remains the block to compare against. + k1 += k2 + } else { + // Not adjacent. Remember the first block (k1==0 means it's + // the dummy we started with), and make the second block the + // new block to compare against. + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + i1, j1, k1 = i2, j2, k2 + } + } + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + + nonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0}) + m.matchingBlocks = nonAdjacent + return m.matchingBlocks +} + +// Return list of 5-tuples describing how to turn a into b. +// +// Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple +// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the +// tuple preceding it, and likewise for j1 == the previous j2. +// +// The tags are characters, with these meanings: +// +// 'r' (replace): a[i1:i2] should be replaced by b[j1:j2] +// +// 'd' (delete): a[i1:i2] should be deleted, j1==j2 in this case. +// +// 'i' (insert): b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case. +// +// 'e' (equal): a[i1:i2] == b[j1:j2] +func (m *SequenceMatcher) GetOpCodes() []OpCode { + if m.opCodes != nil { + return m.opCodes + } + i, j := 0, 0 + matching := m.GetMatchingBlocks() + opCodes := make([]OpCode, 0, len(matching)) + for _, m := range matching { + // invariant: we've pumped out correct diffs to change + // a[:i] into b[:j], and the next matching block is + // a[ai:ai+size] == b[bj:bj+size]. So we need to pump + // out a diff to change a[i:ai] into b[j:bj], pump out + // the matching block, and move (i,j) beyond the match + ai, bj, size := m.A, m.B, m.Size + tag := byte(0) + if i < ai && j < bj { + tag = 'r' + } else if i < ai { + tag = 'd' + } else if j < bj { + tag = 'i' + } + if tag > 0 { + opCodes = append(opCodes, OpCode{tag, i, ai, j, bj}) + } + i, j = ai+size, bj+size + // the list of matching blocks is terminated by a + // sentinel with size 0 + if size > 0 { + opCodes = append(opCodes, OpCode{'e', ai, i, bj, j}) + } + } + m.opCodes = opCodes + return m.opCodes +} + +// Isolate change clusters by eliminating ranges with no changes. +// +// Return a generator of groups with up to n lines of context. +// Each group is in the same format as returned by GetOpCodes(). +func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode { + if n < 0 { + n = 3 + } + codes := m.GetOpCodes() + if len(codes) == 0 { + codes = []OpCode{{'e', 0, 1, 0, 1}} + } + // Fixup leading and trailing groups if they show no changes. + if codes[0].Tag == 'e' { + c := codes[0] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2} + } + if codes[len(codes)-1].Tag == 'e' { + c := codes[len(codes)-1] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)} + } + nn := n + n + groups := [][]OpCode{} + group := []OpCode{} + for _, c := range codes { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + // End the current group and start a new one whenever + // there is a large range with no changes. + if c.Tag == 'e' && i2-i1 > nn { + group = append(group, OpCode{ + c.Tag, i1, min(i2, i1+n), + j1, min(j2, j1+n), + }) + groups = append(groups, group) + group = []OpCode{} + i1, j1 = max(i1, i2-n), max(j1, j2-n) + } + group = append(group, OpCode{c.Tag, i1, i2, j1, j2}) + } + if len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') { + groups = append(groups, group) + } + return groups +} + +// Return a measure of the sequences' similarity (float in [0,1]). +// +// Where T is the total number of elements in both sequences, and +// M is the number of matches, this is 2.0*M / T. +// Note that this is 1 if the sequences are identical, and 0 if +// they have nothing in common. +// +// .Ratio() is expensive to compute if you haven't already computed +// .GetMatchingBlocks() or .GetOpCodes(), in which case you may +// want to try .QuickRatio() or .RealQuickRation() first to get an +// upper bound. +func (m *SequenceMatcher) Ratio() float64 { + matches := 0 + for _, m := range m.GetMatchingBlocks() { + matches += m.Size + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() relatively quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute. +func (m *SequenceMatcher) QuickRatio() float64 { + // viewing a and b as multisets, set matches to the cardinality + // of their intersection; this counts the number of matches + // without regard to order, so is clearly an upper bound + if m.fullBCount == nil { + m.fullBCount = map[string]int{} + for _, s := range m.b { + m.fullBCount[s]++ + } + } + + // avail[x] is the number of times x appears in 'b' less the + // number of times we've seen it in 'a' so far ... kinda + avail := map[string]int{} + matches := 0 + for _, s := range m.a { + n, ok := avail[s] + if !ok { + n = m.fullBCount[s] + } + avail[s] = n - 1 + if n > 0 { + matches++ + } + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() very quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute than either .Ratio() or .QuickRatio(). +func (m *SequenceMatcher) RealQuickRatio() float64 { + la, lb := len(m.a), len(m.b) + return calculateRatio(min(la, lb), la+lb) +} + +// Convert range to the "ed" format +func formatRangeUnified(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 1 { + return fmt.Sprintf("%d", beginning) + } + if length == 0 { + beginning-- // empty ranges begin at line just before the range + } + return fmt.Sprintf("%d,%d", beginning, length) +} + +// Unified diff parameters +type UnifiedDiff struct { + A []string // First sequence lines + FromFile string // First file name + FromDate string // First file time + B []string // Second sequence lines + ToFile string // Second file name + ToDate string // Second file time + Eol string // Headers end of line, defaults to LF + Context int // Number of context lines +} + +// Compare two sequences of lines; generate the delta as a unified diff. +// +// Unified diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by 'n' which +// defaults to three. +// +// By default, the diff control lines (those with ---, +++, or @@) are +// created with a trailing newline. This is helpful so that inputs +// created from file.readlines() result in diffs that are suitable for +// file.writelines() since both the inputs and outputs have trailing +// newlines. +// +// For inputs that do not have trailing newlines, set the lineterm +// argument to "" so that the output will be uniformly newline free. +// +// The unidiff format normally has a header for filenames and modification +// times. Any or all of these may be specified using strings for +// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'. +// The modification times are normally expressed in the ISO 8601 format. +func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + wf := func(format string, args ...interface{}) error { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + return err + } + ws := func(s string) error { + _, err := buf.WriteString(s) + return err + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + err := wf("--- %s%s%s", diff.FromFile, fromDate, diff.Eol) + if err != nil { + return err + } + err = wf("+++ %s%s%s", diff.ToFile, toDate, diff.Eol) + if err != nil { + return err + } + } + } + first, last := g[0], g[len(g)-1] + range1 := formatRangeUnified(first.I1, last.I2) + range2 := formatRangeUnified(first.J1, last.J2) + if err := wf("@@ -%s +%s @@%s", range1, range2, diff.Eol); err != nil { + return err + } + for _, c := range g { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + if c.Tag == 'e' { + for _, line := range diff.A[i1:i2] { + if err := ws(" " + line); err != nil { + return err + } + } + continue + } + if c.Tag == 'r' || c.Tag == 'd' { + for _, line := range diff.A[i1:i2] { + if err := ws("-" + line); err != nil { + return err + } + } + } + if c.Tag == 'r' || c.Tag == 'i' { + for _, line := range diff.B[j1:j2] { + if err := ws("+" + line); err != nil { + return err + } + } + } + } + } + return nil +} + +// Like WriteUnifiedDiff but returns the diff a string. +func GetUnifiedDiffString(diff UnifiedDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteUnifiedDiff(w, diff) + return w.String(), err +} + +// Split a string on "\n" while preserving them. The output can be used +// as input for UnifiedDiff and ContextDiff structures. +func SplitLines(s string) []string { + lines := strings.SplitAfter(s, "\n") + lines[len(lines)-1] += "\n" + return lines +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/internal/go_collector_options.go b/vendor/github.com/prometheus/client_golang/prometheus/internal/go_collector_options.go new file mode 100644 index 000000000..723b45d64 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/internal/go_collector_options.go @@ -0,0 +1,32 @@ +// Copyright 2021 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package internal + +import "regexp" + +type GoCollectorRule struct { + Matcher *regexp.Regexp + Deny bool +} + +// GoCollectorOptions should not be used be directly by anything, except `collectors` package. +// Use it via collectors package instead. See issue +// https://github.com/prometheus/client_golang/issues/1030. +// +// This is internal, so external users only can use it via `collector.WithGoCollector*` methods +type GoCollectorOptions struct { + DisableMemStatsLikeMetrics bool + RuntimeMetricSumForHist map[string]string + RuntimeMetricRules []GoCollectorRule +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go b/vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go index fe0a52180..97d17d6cb 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go @@ -61,9 +61,9 @@ func RuntimeMetricsToProm(d *metrics.Description) (string, string, string, bool) // name has - replaced with _ and is concatenated with the unit and // other data. name = strings.ReplaceAll(name, "-", "_") - name = name + "_" + unit - if d.Cumulative { - name = name + "_total" + name += "_" + unit + if d.Cumulative && d.Kind != metrics.KindFloat64Histogram { + name += "_total" } valid := model.IsValidMetricName(model.LabelValue(namespace + "_" + subsystem + "_" + name)) @@ -84,12 +84,12 @@ func RuntimeMetricsToProm(d *metrics.Description) (string, string, string, bool) func RuntimeMetricsBucketsForUnit(buckets []float64, unit string) []float64 { switch unit { case "bytes": - // Rebucket as powers of 2. - return rebucketExp(buckets, 2) + // Re-bucket as powers of 2. + return reBucketExp(buckets, 2) case "seconds": - // Rebucket as powers of 10 and then merge all buckets greater + // Re-bucket as powers of 10 and then merge all buckets greater // than 1 second into the +Inf bucket. - b := rebucketExp(buckets, 10) + b := reBucketExp(buckets, 10) for i := range b { if b[i] <= 1 { continue @@ -103,11 +103,11 @@ func RuntimeMetricsBucketsForUnit(buckets []float64, unit string) []float64 { return buckets } -// rebucketExp takes a list of bucket boundaries (lower bound inclusive) and +// reBucketExp takes a list of bucket boundaries (lower bound inclusive) and // downsamples the buckets to those a multiple of base apart. The end result // is a roughly exponential (in many cases, perfectly exponential) bucketing // scheme. -func rebucketExp(buckets []float64, base float64) []float64 { +func reBucketExp(buckets []float64, base float64) []float64 { bucket := buckets[0] var newBuckets []float64 // We may see a -Inf here, in which case, add it and skip it diff --git a/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go index 351c26e1a..6515c1148 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go @@ -19,18 +19,34 @@ import ( dto "github.com/prometheus/client_model/go" ) -// metricSorter is a sortable slice of *dto.Metric. -type metricSorter []*dto.Metric +// LabelPairSorter implements sort.Interface. It is used to sort a slice of +// dto.LabelPair pointers. +type LabelPairSorter []*dto.LabelPair -func (s metricSorter) Len() int { +func (s LabelPairSorter) Len() int { return len(s) } -func (s metricSorter) Swap(i, j int) { +func (s LabelPairSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s metricSorter) Less(i, j int) bool { +func (s LabelPairSorter) Less(i, j int) bool { + return s[i].GetName() < s[j].GetName() +} + +// MetricSorter is a sortable slice of *dto.Metric. +type MetricSorter []*dto.Metric + +func (s MetricSorter) Len() int { + return len(s) +} + +func (s MetricSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s MetricSorter) Less(i, j int) bool { if len(s[i].Label) != len(s[j].Label) { // This should not happen. The metrics are // inconsistent. However, we have to deal with the fact, as @@ -68,7 +84,7 @@ func (s metricSorter) Less(i, j int) bool { // the slice, with the contained Metrics sorted within each MetricFamily. func NormalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { for _, mf := range metricFamiliesByName { - sort.Sort(metricSorter(mf.Metric)) + sort.Sort(MetricSorter(mf.Metric)) } names := make([]string, 0, len(metricFamiliesByName)) for name, mf := range metricFamiliesByName { diff --git a/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/vendor/github.com/prometheus/client_golang/prometheus/labels.go index 2744443ac..6eee198fe 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/labels.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/labels.go @@ -39,7 +39,7 @@ var errInconsistentCardinality = errors.New("inconsistent label cardinality") func makeInconsistentCardinalityError(fqName string, labels, labelValues []string) error { return fmt.Errorf( - "%s: %q has %d variable labels named %q but %d values %q were provided", + "%w: %q has %d variable labels named %q but %d values %q were provided", errInconsistentCardinality, fqName, len(labels), labels, len(labelValues), labelValues, @@ -49,7 +49,7 @@ func makeInconsistentCardinalityError(fqName string, labels, labelValues []strin func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { if len(labels) != expectedNumberOfValues { return fmt.Errorf( - "%s: expected %d label values but got %d in %#v", + "%w: expected %d label values but got %d in %#v", errInconsistentCardinality, expectedNumberOfValues, len(labels), labels, ) @@ -67,7 +67,7 @@ func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { func validateLabelValues(vals []string, expectedNumberOfValues int) error { if len(vals) != expectedNumberOfValues { return fmt.Errorf( - "%s: expected %d label values but got %d in %#v", + "%w: expected %d label values but got %d in %#v", errInconsistentCardinality, expectedNumberOfValues, len(vals), vals, ) diff --git a/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/metric.go index dc121910a..f0941f6f0 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/metric.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -14,6 +14,9 @@ package prometheus import ( + "errors" + "math" + "sort" "strings" "time" @@ -115,22 +118,6 @@ func BuildFQName(namespace, subsystem, name string) string { return name } -// labelPairSorter implements sort.Interface. It is used to sort a slice of -// dto.LabelPair pointers. -type labelPairSorter []*dto.LabelPair - -func (s labelPairSorter) Len() int { - return len(s) -} - -func (s labelPairSorter) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s labelPairSorter) Less(i, j int) bool { - return s[i].GetName() < s[j].GetName() -} - type invalidMetric struct { desc *Desc err error @@ -174,3 +161,96 @@ func (m timestampedMetric) Write(pb *dto.Metric) error { func NewMetricWithTimestamp(t time.Time, m Metric) Metric { return timestampedMetric{Metric: m, t: t} } + +type withExemplarsMetric struct { + Metric + + exemplars []*dto.Exemplar +} + +func (m *withExemplarsMetric) Write(pb *dto.Metric) error { + if err := m.Metric.Write(pb); err != nil { + return err + } + + switch { + case pb.Counter != nil: + pb.Counter.Exemplar = m.exemplars[len(m.exemplars)-1] + case pb.Histogram != nil: + for _, e := range m.exemplars { + // pb.Histogram.Bucket are sorted by UpperBound. + i := sort.Search(len(pb.Histogram.Bucket), func(i int) bool { + return pb.Histogram.Bucket[i].GetUpperBound() >= e.GetValue() + }) + if i < len(pb.Histogram.Bucket) { + pb.Histogram.Bucket[i].Exemplar = e + } else { + // The +Inf bucket should be explicitly added if there is an exemplar for it, similar to non-const histogram logic in https://github.com/prometheus/client_golang/blob/main/prometheus/histogram.go#L357-L365. + b := &dto.Bucket{ + CumulativeCount: proto.Uint64(pb.Histogram.Bucket[len(pb.Histogram.GetBucket())-1].GetCumulativeCount()), + UpperBound: proto.Float64(math.Inf(1)), + Exemplar: e, + } + pb.Histogram.Bucket = append(pb.Histogram.Bucket, b) + } + } + default: + // TODO(bwplotka): Implement Gauge? + return errors.New("cannot inject exemplar into Gauge, Summary or Untyped") + } + + return nil +} + +// Exemplar is easier to use, user-facing representation of *dto.Exemplar. +type Exemplar struct { + Value float64 + Labels Labels + // Optional. + // Default value (time.Time{}) indicates its empty, which should be + // understood as time.Now() time at the moment of creation of metric. + Timestamp time.Time +} + +// NewMetricWithExemplars returns a new Metric wrapping the provided Metric with given +// exemplars. Exemplars are validated. +// +// Only last applicable exemplar is injected from the list. +// For example for Counter it means last exemplar is injected. +// For Histogram, it means last applicable exemplar for each bucket is injected. +// +// NewMetricWithExemplars works best with MustNewConstMetric and +// MustNewConstHistogram, see example. +func NewMetricWithExemplars(m Metric, exemplars ...Exemplar) (Metric, error) { + if len(exemplars) == 0 { + return nil, errors.New("no exemplar was passed for NewMetricWithExemplars") + } + + var ( + now = time.Now() + exs = make([]*dto.Exemplar, len(exemplars)) + err error + ) + for i, e := range exemplars { + ts := e.Timestamp + if ts == (time.Time{}) { + ts = now + } + exs[i], err = newExemplar(e.Value, ts, e.Labels) + if err != nil { + return nil, err + } + } + + return &withExemplarsMetric{Metric: m, exemplars: exs}, nil +} + +// MustNewMetricWithExemplars is a version of NewMetricWithExemplars that panics where +// NewMetricWithExemplars would have returned an error. +func MustNewMetricWithExemplars(m Metric, exemplars ...Exemplar) Metric { + ret, err := NewMetricWithExemplars(m, exemplars...) + if err != nil { + panic(err) + } + return ret +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/num_threads.go b/vendor/github.com/prometheus/client_golang/prometheus/num_threads.go new file mode 100644 index 000000000..7c12b2108 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/num_threads.go @@ -0,0 +1,25 @@ +// Copyright 2018 The Prometheus 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. + +//go:build !js || wasm +// +build !js wasm + +package prometheus + +import "runtime" + +// getRuntimeNumThreads returns the number of open OS threads. +func getRuntimeNumThreads() float64 { + n, _ := runtime.ThreadCreateProfile(nil) + return float64(n) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/num_threads_gopherjs.go b/vendor/github.com/prometheus/client_golang/prometheus/num_threads_gopherjs.go new file mode 100644 index 000000000..7348df01d --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/num_threads_gopherjs.go @@ -0,0 +1,22 @@ +// Copyright 2018 The Prometheus 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. + +//go:build js && !wasm +// +build js,!wasm + +package prometheus + +// getRuntimeNumThreads returns the number of open OS threads. +func getRuntimeNumThreads() float64 { + return 1 +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/observer.go b/vendor/github.com/prometheus/client_golang/prometheus/observer.go index 44128016f..03773b21f 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/observer.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/observer.go @@ -58,7 +58,7 @@ type ObserverVec interface { // current time as timestamp, and the provided Labels. Empty Labels will lead to // a valid (label-less) exemplar. But if Labels is nil, the current exemplar is // left in place. ObserveWithExemplar panics if any of the provided labels are -// invalid or if the provided labels contain more than 64 runes in total. +// invalid or if the provided labels contain more than 128 runes in total. type ExemplarObserver interface { ObserveWithExemplar(value float64, exemplar Labels) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go index 5bfe0ff5b..8548dd18e 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go @@ -16,7 +16,6 @@ package prometheus import ( "errors" "fmt" - "io/ioutil" "os" "strconv" "strings" @@ -104,8 +103,7 @@ func NewProcessCollector(opts ProcessCollectorOpts) Collector { } if opts.PidFn == nil { - pid := os.Getpid() - c.pidFn = func() (int, error) { return pid, nil } + c.pidFn = getPIDFn() } else { c.pidFn = opts.PidFn } @@ -152,13 +150,13 @@ func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, err error) // It is meant to be used for the PidFn field in ProcessCollectorOpts. func NewPidFileFn(pidFilePath string) func() (int, error) { return func() (int, error) { - content, err := ioutil.ReadFile(pidFilePath) + content, err := os.ReadFile(pidFilePath) if err != nil { - return 0, fmt.Errorf("can't read pid file %q: %+v", pidFilePath, err) + return 0, fmt.Errorf("can't read pid file %q: %w", pidFilePath, err) } pid, err := strconv.Atoi(strings.TrimSpace(string(content))) if err != nil { - return 0, fmt.Errorf("can't parse pid file %q: %+v", pidFilePath, err) + return 0, fmt.Errorf("can't parse pid file %q: %w", pidFilePath, err) } return pid, nil diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector_go115.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_js.go similarity index 53% rename from vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector_go115.go rename to vendor/github.com/prometheus/client_golang/prometheus/process_collector_js.go index 6d152fbf1..b1e363d6c 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector_go115.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_js.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright 2019 The Prometheus 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 @@ -11,21 +11,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build go1.15 -// +build go1.15 +//go:build js +// +build js -package collectors +package prometheus -import ( - "database/sql" - - "github.com/prometheus/client_golang/prometheus" -) - -func (c *dbStatsCollector) describeNewInGo115(ch chan<- *prometheus.Desc) { - ch <- c.maxIdleTimeClosed +func canCollectProcess() bool { + return false } -func (c *dbStatsCollector) collectNewInGo115(ch chan<- prometheus.Metric, stats sql.DBStats) { - ch <- prometheus.MustNewConstMetric(c.maxIdleTimeClosed, prometheus.CounterValue, float64(stats.MaxIdleTimeClosed)) +func (c *processCollector) processCollect(ch chan<- Metric) { + // noop on this platform + return } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go index 2dc3660da..c0152cdb6 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !windows -// +build !windows +//go:build !windows && !js +// +build !windows,!js package prometheus diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go index e7c0d0546..9819917b8 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go @@ -76,16 +76,19 @@ func (r *responseWriterDelegator) Write(b []byte) (int, error) { return n, err } -type closeNotifierDelegator struct{ *responseWriterDelegator } -type flusherDelegator struct{ *responseWriterDelegator } -type hijackerDelegator struct{ *responseWriterDelegator } -type readerFromDelegator struct{ *responseWriterDelegator } -type pusherDelegator struct{ *responseWriterDelegator } +type ( + closeNotifierDelegator struct{ *responseWriterDelegator } + flusherDelegator struct{ *responseWriterDelegator } + hijackerDelegator struct{ *responseWriterDelegator } + readerFromDelegator struct{ *responseWriterDelegator } + pusherDelegator struct{ *responseWriterDelegator } +) func (d closeNotifierDelegator) CloseNotify() <-chan bool { //nolint:staticcheck // Ignore SA1019. http.CloseNotifier is deprecated but we keep it here to not break existing users. return d.ResponseWriter.(http.CloseNotifier).CloseNotify() } + func (d flusherDelegator) Flush() { // If applicable, call WriteHeader here so that observeWriteHeader is // handled appropriately. @@ -94,9 +97,11 @@ func (d flusherDelegator) Flush() { } d.ResponseWriter.(http.Flusher).Flush() } + func (d hijackerDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { return d.ResponseWriter.(http.Hijacker).Hijack() } + func (d readerFromDelegator) ReadFrom(re io.Reader) (int64, error) { // If applicable, call WriteHeader here so that observeWriteHeader is // handled appropriately. @@ -107,6 +112,7 @@ func (d readerFromDelegator) ReadFrom(re io.Reader) (int64, error) { d.written += n return n, err } + func (d pusherDelegator) Push(target string, opts *http.PushOptions) error { return d.ResponseWriter.(http.Pusher).Push(target, opts) } @@ -261,7 +267,7 @@ func init() { http.Flusher }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} } - pickDelegator[pusher+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { //23 + pickDelegator[pusher+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 23 return struct { *responseWriterDelegator http.Pusher diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go index d86d0cf4b..a4cc9810b 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go @@ -33,6 +33,7 @@ package promhttp import ( "compress/gzip" + "errors" "fmt" "io" "net/http" @@ -84,6 +85,13 @@ func Handler() http.Handler { // instrumentation. Use the InstrumentMetricHandler function to apply the same // kind of instrumentation as it is used by the Handler function. func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { + return HandlerForTransactional(prometheus.ToTransactionalGatherer(reg), opts) +} + +// HandlerForTransactional is like HandlerFor, but it uses transactional gather, which +// can safely change in-place returned *dto.MetricFamily before call to `Gather` and after +// call to `done` of that `Gather`. +func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerOpts) http.Handler { var ( inFlightSem chan struct{} errCnt = prometheus.NewCounterVec( @@ -103,7 +111,8 @@ func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { errCnt.WithLabelValues("gathering") errCnt.WithLabelValues("encoding") if err := opts.Registry.Register(errCnt); err != nil { - if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + are := &prometheus.AlreadyRegisteredError{} + if errors.As(err, are) { errCnt = are.ExistingCollector.(*prometheus.CounterVec) } else { panic(err) @@ -123,7 +132,8 @@ func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { return } } - mfs, err := reg.Gather() + mfs, done, err := reg.Gather() + defer done() if err != nil { if opts.ErrorLog != nil { opts.ErrorLog.Println("error gathering metrics:", err) @@ -242,7 +252,8 @@ func InstrumentMetricHandler(reg prometheus.Registerer, handler http.Handler) ht cnt.WithLabelValues("500") cnt.WithLabelValues("503") if err := reg.Register(cnt); err != nil { - if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + are := &prometheus.AlreadyRegisteredError{} + if errors.As(err, are) { cnt = are.ExistingCollector.(*prometheus.CounterVec) } else { panic(err) @@ -254,7 +265,8 @@ func InstrumentMetricHandler(reg prometheus.Registerer, handler http.Handler) ht Help: "Current number of scrapes being served.", }) if err := reg.Register(gge); err != nil { - if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + are := &prometheus.AlreadyRegisteredError{} + if errors.As(err, are) { gge = are.ExistingCollector.(prometheus.Gauge) } else { panic(err) diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go index 861b4d21c..097aff2df 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go @@ -38,11 +38,11 @@ func (rt RoundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { // // See the example for ExampleInstrumentRoundTripperDuration for example usage. func InstrumentRoundTripperInFlight(gauge prometheus.Gauge, next http.RoundTripper) RoundTripperFunc { - return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { + return func(r *http.Request) (*http.Response, error) { gauge.Inc() defer gauge.Dec() return next.RoundTrip(r) - }) + } } // InstrumentRoundTripperCounter is a middleware that wraps the provided @@ -59,22 +59,29 @@ func InstrumentRoundTripperInFlight(gauge prometheus.Gauge, next http.RoundTripp // If the wrapped RoundTripper panics or returns a non-nil error, the Counter // is not incremented. // +// Use with WithExemplarFromContext to instrument the exemplars on the counter of requests. +// // See the example for ExampleInstrumentRoundTripperDuration for example usage. func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.RoundTripper, opts ...Option) RoundTripperFunc { - rtOpts := &option{} + rtOpts := defaultOptions() for _, o := range opts { - o(rtOpts) + o.apply(rtOpts) } code, method := checkLabels(counter) - return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { + return func(r *http.Request) (*http.Response, error) { resp, err := next.RoundTrip(r) if err == nil { + exemplarAdd( + counter.With(labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...)), + 1, + rtOpts.getExemplarFn(r.Context()), + ) counter.With(labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...)).Inc() } return resp, err - }) + } } // InstrumentRoundTripperDuration is a middleware that wraps the provided @@ -94,24 +101,30 @@ func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.Rou // If the wrapped RoundTripper panics or returns a non-nil error, no values are // reported. // +// Use with WithExemplarFromContext to instrument the exemplars on the duration histograms. +// // Note that this method is only guaranteed to never observe negative durations // if used with Go1.9+. func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundTripper, opts ...Option) RoundTripperFunc { - rtOpts := &option{} + rtOpts := defaultOptions() for _, o := range opts { - o(rtOpts) + o.apply(rtOpts) } code, method := checkLabels(obs) - return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { + return func(r *http.Request) (*http.Response, error) { start := time.Now() resp, err := next.RoundTrip(r) if err == nil { - obs.With(labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...)).Observe(time.Since(start).Seconds()) + exemplarObserve( + obs.With(labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...)), + time.Since(start).Seconds(), + rtOpts.getExemplarFn(r.Context()), + ) } return resp, err - }) + } } // InstrumentTrace is used to offer flexibility in instrumenting the available @@ -149,7 +162,7 @@ type InstrumentTrace struct { // // See the example for ExampleInstrumentRoundTripperDuration for example usage. func InstrumentRoundTripperTrace(it *InstrumentTrace, next http.RoundTripper) RoundTripperFunc { - return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { + return func(r *http.Request) (*http.Response, error) { start := time.Now() trace := &httptrace.ClientTrace{ @@ -231,5 +244,5 @@ func InstrumentRoundTripperTrace(it *InstrumentTrace, next http.RoundTripper) Ro r = r.WithContext(httptrace.WithClientTrace(r.Context(), trace)) return next.RoundTrip(r) - }) + } } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go index a23f0edc6..bfe500987 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go @@ -28,6 +28,22 @@ import ( // magicString is used for the hacky label test in checkLabels. Remove once fixed. const magicString = "zZgWfBxLqvG8kc8IMv3POi2Bb0tZI3vAnBx+gBaFi9FyPzB/CzKUer1yufDa" +func exemplarObserve(obs prometheus.Observer, val float64, labels map[string]string) { + if labels == nil { + obs.Observe(val) + return + } + obs.(prometheus.ExemplarObserver).ObserveWithExemplar(val, labels) +} + +func exemplarAdd(obs prometheus.Counter, val float64, labels map[string]string) { + if labels == nil { + obs.Add(val) + return + } + obs.(prometheus.ExemplarAdder).AddWithExemplar(val, labels) +} + // InstrumentHandlerInFlight is a middleware that wraps the provided // http.Handler. It sets the provided prometheus.Gauge to the number of // requests currently handled by the wrapped http.Handler. @@ -48,7 +64,7 @@ func InstrumentHandlerInFlight(g prometheus.Gauge, next http.Handler) http.Handl // names are "code" and "method". The function panics otherwise. For the "method" // label a predefined default label value set is used to filter given values. // Values besides predefined values will count as `unknown` method. -//`WithExtraMethods` can be used to add more methods to the set. The Observe +// `WithExtraMethods` can be used to add more methods to the set. The Observe // method of the Observer in the ObserverVec is called with the request duration // in seconds. Partitioning happens by HTTP status code and/or HTTP method if // the respective instance label names are present in the ObserverVec. For @@ -62,28 +78,37 @@ func InstrumentHandlerInFlight(g prometheus.Gauge, next http.Handler) http.Handl // Note that this method is only guaranteed to never observe negative durations // if used with Go1.9+. func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, opts ...Option) http.HandlerFunc { - mwOpts := &option{} + hOpts := defaultOptions() for _, o := range opts { - o(mwOpts) + o.apply(hOpts) } code, method := checkLabels(obs) if code { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { now := time.Now() d := newDelegator(w, nil) next.ServeHTTP(d, r) - obs.With(labels(code, method, r.Method, d.Status(), mwOpts.extraMethods...)).Observe(time.Since(now).Seconds()) - }) + exemplarObserve( + obs.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), + time.Since(now).Seconds(), + hOpts.getExemplarFn(r.Context()), + ) + } } - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { now := time.Now() next.ServeHTTP(w, r) - obs.With(labels(code, method, r.Method, 0, mwOpts.extraMethods...)).Observe(time.Since(now).Seconds()) - }) + + exemplarObserve( + obs.With(labels(code, method, r.Method, 0, hOpts.extraMethods...)), + time.Since(now).Seconds(), + hOpts.getExemplarFn(r.Context()), + ) + } } // InstrumentHandlerCounter is a middleware that wraps the provided http.Handler @@ -104,25 +129,34 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, op // // See the example for InstrumentHandlerDuration for example usage. func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler, opts ...Option) http.HandlerFunc { - mwOpts := &option{} + hOpts := defaultOptions() for _, o := range opts { - o(mwOpts) + o.apply(hOpts) } code, method := checkLabels(counter) if code { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) - counter.With(labels(code, method, r.Method, d.Status(), mwOpts.extraMethods...)).Inc() - }) + + exemplarAdd( + counter.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), + 1, + hOpts.getExemplarFn(r.Context()), + ) + } } - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { next.ServeHTTP(w, r) - counter.With(labels(code, method, r.Method, 0, mwOpts.extraMethods...)).Inc() - }) + exemplarAdd( + counter.With(labels(code, method, r.Method, 0, hOpts.extraMethods...)), + 1, + hOpts.getExemplarFn(r.Context()), + ) + } } // InstrumentHandlerTimeToWriteHeader is a middleware that wraps the provided @@ -148,20 +182,24 @@ func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler, // // See the example for InstrumentHandlerDuration for example usage. func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Handler, opts ...Option) http.HandlerFunc { - mwOpts := &option{} + hOpts := defaultOptions() for _, o := range opts { - o(mwOpts) + o.apply(hOpts) } code, method := checkLabels(obs) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { now := time.Now() d := newDelegator(w, func(status int) { - obs.With(labels(code, method, r.Method, status, mwOpts.extraMethods...)).Observe(time.Since(now).Seconds()) + exemplarObserve( + obs.With(labels(code, method, r.Method, status, hOpts.extraMethods...)), + time.Since(now).Seconds(), + hOpts.getExemplarFn(r.Context()), + ) }) next.ServeHTTP(d, r) - }) + } } // InstrumentHandlerRequestSize is a middleware that wraps the provided @@ -184,27 +222,34 @@ func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Ha // // See the example for InstrumentHandlerDuration for example usage. func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler, opts ...Option) http.HandlerFunc { - mwOpts := &option{} + hOpts := defaultOptions() for _, o := range opts { - o(mwOpts) + o.apply(hOpts) } code, method := checkLabels(obs) - if code { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) size := computeApproximateRequestSize(r) - obs.With(labels(code, method, r.Method, d.Status(), mwOpts.extraMethods...)).Observe(float64(size)) - }) + exemplarObserve( + obs.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), + float64(size), + hOpts.getExemplarFn(r.Context()), + ) + } } - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { next.ServeHTTP(w, r) size := computeApproximateRequestSize(r) - obs.With(labels(code, method, r.Method, 0, mwOpts.extraMethods...)).Observe(float64(size)) - }) + exemplarObserve( + obs.With(labels(code, method, r.Method, 0, hOpts.extraMethods...)), + float64(size), + hOpts.getExemplarFn(r.Context()), + ) + } } // InstrumentHandlerResponseSize is a middleware that wraps the provided @@ -227,9 +272,9 @@ func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler, // // See the example for InstrumentHandlerDuration for example usage. func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler, opts ...Option) http.Handler { - mwOpts := &option{} + hOpts := defaultOptions() for _, o := range opts { - o(mwOpts) + o.apply(hOpts) } code, method := checkLabels(obs) @@ -237,7 +282,11 @@ func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) - obs.With(labels(code, method, r.Method, d.Status(), mwOpts.extraMethods...)).Observe(float64(d.Written())) + exemplarObserve( + obs.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), + float64(d.Written()), + hOpts.getExemplarFn(r.Context()), + ) }) } @@ -246,7 +295,7 @@ func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler // Collector does not have a Desc or has more than one Desc or its Desc is // invalid. It also panics if the Collector has any non-const, non-curried // labels that are not named "code" or "method". -func checkLabels(c prometheus.Collector) (code bool, method bool) { +func checkLabels(c prometheus.Collector) (code, method bool) { // TODO(beorn7): Remove this hacky way to check for instance labels // once Descriptors can have their dimensionality queried. var ( diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go index 35e41bd1e..c590d912c 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go @@ -13,19 +13,46 @@ package promhttp -// Option are used to configure a middleware or round tripper.. -type Option func(*option) +import ( + "context" -type option struct { - extraMethods []string + "github.com/prometheus/client_golang/prometheus" +) + +// Option are used to configure both handler (middleware) or round tripper. +type Option interface { + apply(*options) +} + +// options store options for both a handler or round tripper. +type options struct { + extraMethods []string + getExemplarFn func(requestCtx context.Context) prometheus.Labels +} + +func defaultOptions() *options { + return &options{getExemplarFn: func(ctx context.Context) prometheus.Labels { return nil }} } +type optionApplyFunc func(*options) + +func (o optionApplyFunc) apply(opt *options) { o(opt) } + // WithExtraMethods adds additional HTTP methods to the list of allowed methods. // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods for the default list. // // See the example for ExampleInstrumentHandlerWithExtraMethods for example usage. func WithExtraMethods(methods ...string) Option { - return func(o *option) { + return optionApplyFunc(func(o *options) { o.extraMethods = methods - } + }) +} + +// WithExemplarFromContext adds allows to put a hook to all counter and histogram metrics. +// If the hook function returns non-nil labels, exemplars will be added for that request, otherwise metric +// will get instrumented without exemplar. +func WithExemplarFromContext(getExemplarFn func(requestCtx context.Context) prometheus.Labels) Option { + return optionApplyFunc(func(o *options) { + o.getExemplarFn = getExemplarFn + }) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/prometheus/client_golang/prometheus/registry.go index 383a7f594..325f665ff 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/registry.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -15,8 +15,8 @@ package prometheus import ( "bytes" + "errors" "fmt" - "io/ioutil" "os" "path/filepath" "runtime" @@ -289,7 +289,7 @@ func (r *Registry) Register(c Collector) error { // Is the descriptor valid at all? if desc.err != nil { - return fmt.Errorf("descriptor %s is invalid: %s", desc, desc.err) + return fmt.Errorf("descriptor %s is invalid: %w", desc, desc.err) } // Is the descID unique? @@ -407,6 +407,14 @@ func (r *Registry) MustRegister(cs ...Collector) { // Gather implements Gatherer. func (r *Registry) Gather() ([]*dto.MetricFamily, error) { + r.mtx.RLock() + + if len(r.collectorsByID) == 0 && len(r.uncheckedCollectors) == 0 { + // Fast path. + r.mtx.RUnlock() + return nil, nil + } + var ( checkedMetricChan = make(chan Metric, capMetricChan) uncheckedMetricChan = make(chan Metric, capMetricChan) @@ -416,7 +424,6 @@ func (r *Registry) Gather() ([]*dto.MetricFamily, error) { registeredDescIDs map[uint64]struct{} // Only used for pedantic checks ) - r.mtx.RLock() goroutineBudget := len(r.collectorsByID) + len(r.uncheckedCollectors) metricFamiliesByName := make(map[string]*dto.MetricFamily, len(r.dimHashesByName)) checkedCollectors := make(chan Collector, len(r.collectorsByID)) @@ -556,7 +563,7 @@ func (r *Registry) Gather() ([]*dto.MetricFamily, error) { // This is intended for use with the textfile collector of the node exporter. // Note that the node exporter expects the filename to be suffixed with ".prom". func WriteToTextfile(filename string, g Gatherer) error { - tmp, err := ioutil.TempFile(filepath.Dir(filename), filepath.Base(filename)) + tmp, err := os.CreateTemp(filepath.Dir(filename), filepath.Base(filename)) if err != nil { return err } @@ -575,7 +582,7 @@ func WriteToTextfile(filename string, g Gatherer) error { return err } - if err := os.Chmod(tmp.Name(), 0644); err != nil { + if err := os.Chmod(tmp.Name(), 0o644); err != nil { return err } return os.Rename(tmp.Name(), filename) @@ -596,7 +603,7 @@ func processMetric( } dtoMetric := &dto.Metric{} if err := metric.Write(dtoMetric); err != nil { - return fmt.Errorf("error collecting metric %v: %s", desc, err) + return fmt.Errorf("error collecting metric %v: %w", desc, err) } metricFamily, ok := metricFamiliesByName[desc.fqName] if ok { // Existing name. @@ -718,12 +725,13 @@ func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { for i, g := range gs { mfs, err := g.Gather() if err != nil { - if multiErr, ok := err.(MultiError); ok { + multiErr := MultiError{} + if errors.As(err, &multiErr) { for _, err := range multiErr { - errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %w", i+1, err)) } } else { - errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %w", i+1, err)) } } for _, mf := range mfs { @@ -884,11 +892,11 @@ func checkMetricConsistency( h.Write(separatorByteSlice) // Make sure label pairs are sorted. We depend on it for the consistency // check. - if !sort.IsSorted(labelPairSorter(dtoMetric.Label)) { + if !sort.IsSorted(internal.LabelPairSorter(dtoMetric.Label)) { // We cannot sort dtoMetric.Label in place as it is immutable by contract. copiedLabels := make([]*dto.LabelPair, len(dtoMetric.Label)) copy(copiedLabels, dtoMetric.Label) - sort.Sort(labelPairSorter(copiedLabels)) + sort.Sort(internal.LabelPairSorter(copiedLabels)) dtoMetric.Label = copiedLabels } for _, lp := range dtoMetric.Label { @@ -935,7 +943,7 @@ func checkDescConsistency( metricFamily.GetName(), dtoMetric, desc, ) } - sort.Sort(labelPairSorter(lpsFromDesc)) + sort.Sort(internal.LabelPairSorter(lpsFromDesc)) for i, lpFromDesc := range lpsFromDesc { lpFromMetric := dtoMetric.Label[i] if lpFromDesc.GetName() != lpFromMetric.GetName() || @@ -948,3 +956,89 @@ func checkDescConsistency( } return nil } + +var _ TransactionalGatherer = &MultiTRegistry{} + +// MultiTRegistry is a TransactionalGatherer that joins gathered metrics from multiple +// transactional gatherers. +// +// It is caller responsibility to ensure two registries have mutually exclusive metric families, +// no deduplication will happen. +type MultiTRegistry struct { + tGatherers []TransactionalGatherer +} + +// NewMultiTRegistry creates MultiTRegistry. +func NewMultiTRegistry(tGatherers ...TransactionalGatherer) *MultiTRegistry { + return &MultiTRegistry{ + tGatherers: tGatherers, + } +} + +// Gather implements TransactionalGatherer interface. +func (r *MultiTRegistry) Gather() (mfs []*dto.MetricFamily, done func(), err error) { + errs := MultiError{} + + dFns := make([]func(), 0, len(r.tGatherers)) + // TODO(bwplotka): Implement concurrency for those? + for _, g := range r.tGatherers { + // TODO(bwplotka): Check for duplicates? + m, d, err := g.Gather() + errs.Append(err) + + mfs = append(mfs, m...) + dFns = append(dFns, d) + } + + // TODO(bwplotka): Consider sort in place, given metric family in gather is sorted already. + sort.Slice(mfs, func(i, j int) bool { + return *mfs[i].Name < *mfs[j].Name + }) + return mfs, func() { + for _, d := range dFns { + d() + } + }, errs.MaybeUnwrap() +} + +// TransactionalGatherer represents transactional gatherer that can be triggered to notify gatherer that memory +// used by metric family is no longer used by a caller. This allows implementations with cache. +type TransactionalGatherer interface { + // Gather returns metrics in a lexicographically sorted slice + // of uniquely named MetricFamily protobufs. Gather ensures that the + // returned slice is valid and self-consistent so that it can be used + // for valid exposition. As an exception to the strict consistency + // requirements described for metric.Desc, Gather will tolerate + // different sets of label names for metrics of the same metric family. + // + // Even if an error occurs, Gather attempts to gather as many metrics as + // possible. Hence, if a non-nil error is returned, the returned + // MetricFamily slice could be nil (in case of a fatal error that + // prevented any meaningful metric collection) or contain a number of + // MetricFamily protobufs, some of which might be incomplete, and some + // might be missing altogether. The returned error (which might be a + // MultiError) explains the details. Note that this is mostly useful for + // debugging purposes. If the gathered protobufs are to be used for + // exposition in actual monitoring, it is almost always better to not + // expose an incomplete result and instead disregard the returned + // MetricFamily protobufs in case the returned error is non-nil. + // + // Important: done is expected to be triggered (even if the error occurs!) + // once caller does not need returned slice of dto.MetricFamily. + Gather() (_ []*dto.MetricFamily, done func(), err error) +} + +// ToTransactionalGatherer transforms Gatherer to transactional one with noop as done function. +func ToTransactionalGatherer(g Gatherer) TransactionalGatherer { + return &noTransactionGatherer{g: g} +} + +type noTransactionGatherer struct { + g Gatherer +} + +// Gather implements TransactionalGatherer interface. +func (g *noTransactionGatherer) Gather() (_ []*dto.MetricFamily, done func(), err error) { + mfs, err := g.g.Gather() + return mfs, func() {}, err +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/value.go b/vendor/github.com/prometheus/client_golang/prometheus/value.go index b4e0ae11c..2d3abc1cb 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/value.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -23,6 +23,8 @@ import ( "github.com/golang/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" + "github.com/prometheus/client_golang/prometheus/internal" + dto "github.com/prometheus/client_model/go" ) @@ -38,6 +40,23 @@ const ( UntypedValue ) +var ( + CounterMetricTypePtr = func() *dto.MetricType { d := dto.MetricType_COUNTER; return &d }() + GaugeMetricTypePtr = func() *dto.MetricType { d := dto.MetricType_GAUGE; return &d }() + UntypedMetricTypePtr = func() *dto.MetricType { d := dto.MetricType_UNTYPED; return &d }() +) + +func (v ValueType) ToDTO() *dto.MetricType { + switch v { + case CounterValue: + return CounterMetricTypePtr + case GaugeValue: + return GaugeMetricTypePtr + default: + return UntypedMetricTypePtr + } +} + // valueFunc is a generic metric for simple values retrieved on collect time // from a function. It implements Metric and Collector. Its effective type is // determined by ValueType. This is a low-level building block used by the @@ -91,11 +110,15 @@ func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { return nil, err } + + metric := &dto.Metric{} + if err := populateMetric(valueType, value, MakeLabelPairs(desc, labelValues), nil, metric); err != nil { + return nil, err + } + return &constMetric{ - desc: desc, - valType: valueType, - val: value, - labelPairs: MakeLabelPairs(desc, labelValues), + desc: desc, + metric: metric, }, nil } @@ -110,10 +133,8 @@ func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelVal } type constMetric struct { - desc *Desc - valType ValueType - val float64 - labelPairs []*dto.LabelPair + desc *Desc + metric *dto.Metric } func (m *constMetric) Desc() *Desc { @@ -121,7 +142,11 @@ func (m *constMetric) Desc() *Desc { } func (m *constMetric) Write(out *dto.Metric) error { - return populateMetric(m.valType, m.val, m.labelPairs, nil, out) + out.Label = m.metric.Label + out.Counter = m.metric.Counter + out.Gauge = m.metric.Gauge + out.Untyped = m.metric.Untyped + return nil } func populateMetric( @@ -170,12 +195,12 @@ func MakeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { }) } labelPairs = append(labelPairs, desc.constLabelPairs...) - sort.Sort(labelPairSorter(labelPairs)) + sort.Sort(internal.LabelPairSorter(labelPairs)) return labelPairs } // ExemplarMaxRunes is the max total number of runes allowed in exemplar labels. -const ExemplarMaxRunes = 64 +const ExemplarMaxRunes = 128 // newExemplar creates a new dto.Exemplar from the provided values. An error is // returned if any of the label names or values are invalid or if the total diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/vendor/github.com/prometheus/client_golang/prometheus/vec.go index 4ababe6c9..7ae322590 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/vec.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -99,6 +99,16 @@ func (m *MetricVec) Delete(labels Labels) bool { return m.metricMap.deleteByHashWithLabels(h, labels, m.curry) } +// DeletePartialMatch deletes all metrics where the variable labels contain all of those +// passed in as labels. The order of the labels does not matter. +// It returns the number of metrics deleted. +// +// Note that curried labels will never be matched if deleting from the curried vector. +// To match curried labels with DeletePartialMatch, it must be called on the base vector. +func (m *MetricVec) DeletePartialMatch(labels Labels) int { + return m.metricMap.deleteByLabels(labels, m.curry) +} + // Without explicit forwarding of Describe, Collect, Reset, those methods won't // show up in GoDoc. @@ -381,6 +391,82 @@ func (m *metricMap) deleteByHashWithLabels( return true } +// deleteByLabels deletes a metric if the given labels are present in the metric. +func (m *metricMap) deleteByLabels(labels Labels, curry []curriedLabelValue) int { + m.mtx.Lock() + defer m.mtx.Unlock() + + var numDeleted int + + for h, metrics := range m.metrics { + i := findMetricWithPartialLabels(m.desc, metrics, labels, curry) + if i >= len(metrics) { + // Didn't find matching labels in this metric slice. + continue + } + delete(m.metrics, h) + numDeleted++ + } + + return numDeleted +} + +// findMetricWithPartialLabel returns the index of the matching metric or +// len(metrics) if not found. +func findMetricWithPartialLabels( + desc *Desc, metrics []metricWithLabelValues, labels Labels, curry []curriedLabelValue, +) int { + for i, metric := range metrics { + if matchPartialLabels(desc, metric.values, labels, curry) { + return i + } + } + return len(metrics) +} + +// indexOf searches the given slice of strings for the target string and returns +// the index or len(items) as well as a boolean whether the search succeeded. +func indexOf(target string, items []string) (int, bool) { + for i, l := range items { + if l == target { + return i, true + } + } + return len(items), false +} + +// valueMatchesVariableOrCurriedValue determines if a value was previously curried, +// and returns whether it matches either the "base" value or the curried value accordingly. +// It also indicates whether the match is against a curried or uncurried value. +func valueMatchesVariableOrCurriedValue(targetValue string, index int, values []string, curry []curriedLabelValue) (bool, bool) { + for _, curriedValue := range curry { + if curriedValue.index == index { + // This label was curried. See if the curried value matches our target. + return curriedValue.value == targetValue, true + } + } + // This label was not curried. See if the current value matches our target label. + return values[index] == targetValue, false +} + +// matchPartialLabels searches the current metric and returns whether all of the target label:value pairs are present. +func matchPartialLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { + for l, v := range labels { + // Check if the target label exists in our metrics and get the index. + varLabelIndex, validLabel := indexOf(l, desc.variableLabels) + if validLabel { + // Check the value of that label against the target value. + // We don't consider curried values in partial matches. + matches, curried := valueMatchesVariableOrCurriedValue(v, varLabelIndex, values, curry) + if matches && !curried { + continue + } + } + return false + } + return true +} + // getOrCreateMetricWithLabelValues retrieves the metric by hash and label value // or creates it and returns the new one. // @@ -485,7 +571,7 @@ func findMetricWithLabels( return len(metrics) } -func matchLabelValues(values []string, lvs []string, curry []curriedLabelValue) bool { +func matchLabelValues(values, lvs []string, curry []curriedLabelValue) bool { if len(values) != len(lvs)+len(curry) { return false } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go index 74ee93280..1498ee144 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go @@ -21,6 +21,8 @@ import ( "github.com/golang/protobuf/proto" dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/client_golang/prometheus/internal" ) // WrapRegistererWith returns a Registerer wrapping the provided @@ -182,7 +184,7 @@ func (m *wrappingMetric) Write(out *dto.Metric) error { Value: proto.String(lv), }) } - sort.Sort(labelPairSorter(out.Label)) + sort.Sort(internal.LabelPairSorter(out.Label)) return nil } diff --git a/vendor/github.com/prometheus/common/expfmt/fuzz.go b/vendor/github.com/prometheus/common/expfmt/fuzz.go index dc2eedeef..f819e4f8b 100644 --- a/vendor/github.com/prometheus/common/expfmt/fuzz.go +++ b/vendor/github.com/prometheus/common/expfmt/fuzz.go @@ -12,6 +12,7 @@ // limitations under the License. // Build only when actually fuzzing +//go:build gofuzz // +build gofuzz package expfmt diff --git a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go index 8a9313a3b..9d94ae9ef 100644 --- a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go +++ b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go @@ -22,7 +22,6 @@ import ( "strconv" "strings" - "github.com/golang/protobuf/ptypes" "github.com/prometheus/common/model" dto "github.com/prometheus/client_model/go" @@ -473,10 +472,11 @@ func writeExemplar(w enhancedWriter, e *dto.Exemplar) (int, error) { if err != nil { return written, err } - ts, err := ptypes.Timestamp((*e).Timestamp) + err = (*e).Timestamp.CheckValid() if err != nil { return written, err } + ts := (*e).Timestamp.AsTime() // TODO(beorn7): Format this directly from components of ts to // avoid overflow/underflow and precision issues of the float // conversion. diff --git a/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/prometheus/common/model/time.go index 7f67b16e4..c909b8aa8 100644 --- a/vendor/github.com/prometheus/common/model/time.go +++ b/vendor/github.com/prometheus/common/model/time.go @@ -193,7 +193,7 @@ func ParseDuration(durationStr string) (Duration, error) { // Allow 0 without a unit. return 0, nil case "": - return 0, fmt.Errorf("empty duration string") + return 0, errors.New("empty duration string") } matches := durationRE.FindStringSubmatch(durationStr) if matches == nil { diff --git a/vendor/github.com/prometheus/procfs/.gitignore b/vendor/github.com/prometheus/procfs/.gitignore index 25e3659ab..7cc33ae4a 100644 --- a/vendor/github.com/prometheus/procfs/.gitignore +++ b/vendor/github.com/prometheus/procfs/.gitignore @@ -1 +1,2 @@ -/fixtures/ +/testdata/fixtures/ +/fixtures diff --git a/vendor/github.com/prometheus/procfs/.golangci.yml b/vendor/github.com/prometheus/procfs/.golangci.yml index 0aa09edac..a197699a1 100644 --- a/vendor/github.com/prometheus/procfs/.golangci.yml +++ b/vendor/github.com/prometheus/procfs/.golangci.yml @@ -1,4 +1,12 @@ --- linters: enable: - - golint + - godot + - revive + +linter-settings: + godot: + capital: true + exclude: + # Ignore "See: URL" + - 'See:' diff --git a/vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md b/vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md index 9a1aff412..d325872bd 100644 --- a/vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md +++ b/vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md @@ -1,3 +1,3 @@ -## Prometheus Community Code of Conduct +# Prometheus Community Code of Conduct -Prometheus follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). +Prometheus follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md). diff --git a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md index 943de7615..853eb9d49 100644 --- a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md +++ b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md @@ -97,7 +97,7 @@ Many of the files are changing continuously and the data being read can in some reads in the same file. Also, most of the files are relatively small (less than a few KBs), and system calls to the `stat` function will often return the wrong size. Therefore, for most files it's recommended to read the full file in a single operation using an internal utility function called `util.ReadFileNoStat`. -This function is similar to `ioutil.ReadFile`, but it avoids the system call to `stat` to get the current size of +This function is similar to `os.ReadFile`, but it avoids the system call to `stat` to get the current size of the file. Note that parsing the file's contents can still be performed one line at a time. This is done by first reading @@ -113,7 +113,7 @@ the full file, and then using a scanner on the `[]byte` or `string` containing t ``` The `/sys` filesystem contains many very small files which contain only a single numeric or text value. These files -can be read using an internal function called `util.SysReadFile` which is similar to `ioutil.ReadFile` but does +can be read using an internal function called `util.SysReadFile` which is similar to `os.ReadFile` but does not bother to check the size of the file before reading. ``` data, err := util.SysReadFile("/sys/class/power_supply/BAT0/capacity") diff --git a/vendor/github.com/prometheus/procfs/Makefile b/vendor/github.com/prometheus/procfs/Makefile index fa2bd5b52..7edfe4d09 100644 --- a/vendor/github.com/prometheus/procfs/Makefile +++ b/vendor/github.com/prometheus/procfs/Makefile @@ -14,18 +14,18 @@ include Makefile.common %/.unpacked: %.ttar - @echo ">> extracting fixtures" + @echo ">> extracting fixtures $*" ./ttar -C $(dir $*) -x -f $*.ttar touch $@ -fixtures: fixtures/.unpacked +fixtures: testdata/fixtures/.unpacked update_fixtures: - rm -vf fixtures/.unpacked - ./ttar -c -f fixtures.ttar fixtures/ + rm -vf testdata/fixtures/.unpacked + ./ttar -c -f testdata/fixtures.ttar -C testdata/ fixtures/ .PHONY: build build: .PHONY: test -test: fixtures/.unpacked common-test +test: testdata/fixtures/.unpacked common-test diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common index a1b1ca40f..6c8e3e219 100644 --- a/vendor/github.com/prometheus/procfs/Makefile.common +++ b/vendor/github.com/prometheus/procfs/Makefile.common @@ -36,29 +36,6 @@ GO_VERSION ?= $(shell $(GO) version) GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) PRE_GO_111 ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.') -GOVENDOR := -GO111MODULE := -ifeq (, $(PRE_GO_111)) - ifneq (,$(wildcard go.mod)) - # Enforce Go modules support just in case the directory is inside GOPATH (and for Travis CI). - GO111MODULE := on - - ifneq (,$(wildcard vendor)) - # Always use the local vendor/ directory to satisfy the dependencies. - GOOPTS := $(GOOPTS) -mod=vendor - endif - endif -else - ifneq (,$(wildcard go.mod)) - ifneq (,$(wildcard vendor)) -$(warning This repository requires Go >= 1.11 because of Go modules) -$(warning Some recipes may not work as expected as the current Go runtime is '$(GO_VERSION_NUMBER)') - endif - else - # This repository isn't using Go modules (yet). - GOVENDOR := $(FIRST_GOPATH)/bin/govendor - endif -endif PROMU := $(FIRST_GOPATH)/bin/promu pkgs = ./... @@ -78,17 +55,23 @@ ifneq ($(shell which gotestsum),) endif endif -PROMU_VERSION ?= 0.12.0 +PROMU_VERSION ?= 0.13.0 PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz GOLANGCI_LINT := GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.39.0 +GOLANGCI_LINT_VERSION ?= v1.45.2 # golangci-lint only supports linux, darwin and windows platforms on i386/amd64. # windows isn't included here because of the path separator being different. ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386)) - GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint + # If we're in CI and there is an Actions file, that means the linter + # is being run in Actions, so we don't need to run it here. + ifeq (,$(CIRCLE_JOB)) + GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint + else ifeq (,$(wildcard .github/workflows/golangci-lint.yml)) + GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint + endif endif endif @@ -144,32 +127,25 @@ common-check_license: .PHONY: common-deps common-deps: @echo ">> getting dependencies" -ifdef GO111MODULE - GO111MODULE=$(GO111MODULE) $(GO) mod download -else - $(GO) get $(GOOPTS) -t ./... -endif + $(GO) mod download .PHONY: update-go-deps update-go-deps: @echo ">> updating Go dependencies" @for m in $$($(GO) list -mod=readonly -m -f '{{ if and (not .Indirect) (not .Main)}}{{.Path}}{{end}}' all); do \ - $(GO) get $$m; \ + $(GO) get -d $$m; \ done - GO111MODULE=$(GO111MODULE) $(GO) mod tidy -ifneq (,$(wildcard vendor)) - GO111MODULE=$(GO111MODULE) $(GO) mod vendor -endif + $(GO) mod tidy .PHONY: common-test-short common-test-short: $(GOTEST_DIR) @echo ">> running short tests" - GO111MODULE=$(GO111MODULE) $(GOTEST) -short $(GOOPTS) $(pkgs) + $(GOTEST) -short $(GOOPTS) $(pkgs) .PHONY: common-test common-test: $(GOTEST_DIR) @echo ">> running all tests" - GO111MODULE=$(GO111MODULE) $(GOTEST) $(test-flags) $(GOOPTS) $(pkgs) + $(GOTEST) $(test-flags) $(GOOPTS) $(pkgs) $(GOTEST_DIR): @mkdir -p $@ @@ -177,25 +153,21 @@ $(GOTEST_DIR): .PHONY: common-format common-format: @echo ">> formatting code" - GO111MODULE=$(GO111MODULE) $(GO) fmt $(pkgs) + $(GO) fmt $(pkgs) .PHONY: common-vet common-vet: @echo ">> vetting code" - GO111MODULE=$(GO111MODULE) $(GO) vet $(GOOPTS) $(pkgs) + $(GO) vet $(GOOPTS) $(pkgs) .PHONY: common-lint common-lint: $(GOLANGCI_LINT) ifdef GOLANGCI_LINT @echo ">> running golangci-lint" -ifdef GO111MODULE # 'go list' needs to be executed before staticcheck to prepopulate the modules cache. # Otherwise staticcheck might fail randomly for some reason not yet explained. - GO111MODULE=$(GO111MODULE) $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null - GO111MODULE=$(GO111MODULE) $(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs) -else - $(GOLANGCI_LINT) run $(pkgs) -endif + $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null + $(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs) endif .PHONY: common-yamllint @@ -212,28 +184,15 @@ endif common-staticcheck: lint .PHONY: common-unused -common-unused: $(GOVENDOR) -ifdef GOVENDOR - @echo ">> running check for unused packages" - @$(GOVENDOR) list +unused | grep . && exit 1 || echo 'No unused packages' -else -ifdef GO111MODULE +common-unused: @echo ">> running check for unused/missing packages in go.mod" - GO111MODULE=$(GO111MODULE) $(GO) mod tidy -ifeq (,$(wildcard vendor)) + $(GO) mod tidy @git diff --exit-code -- go.sum go.mod -else - @echo ">> running check for unused packages in vendor/" - GO111MODULE=$(GO111MODULE) $(GO) mod vendor - @git diff --exit-code -- go.sum go.mod vendor/ -endif -endif -endif .PHONY: common-build common-build: promu @echo ">> building binaries" - GO111MODULE=$(GO111MODULE) $(PROMU) build --prefix $(PREFIX) $(PROMU_BINARIES) + $(PROMU) build --prefix $(PREFIX) $(PROMU_BINARIES) .PHONY: common-tarball common-tarball: promu @@ -289,12 +248,6 @@ $(GOLANGCI_LINT): | sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION) endif -ifdef GOVENDOR -.PHONY: $(GOVENDOR) -$(GOVENDOR): - GOOS= GOARCH= $(GO) get -u github.com/kardianos/govendor -endif - .PHONY: precheck precheck:: diff --git a/vendor/github.com/prometheus/procfs/SECURITY.md b/vendor/github.com/prometheus/procfs/SECURITY.md index 67741f015..fed02d85c 100644 --- a/vendor/github.com/prometheus/procfs/SECURITY.md +++ b/vendor/github.com/prometheus/procfs/SECURITY.md @@ -3,4 +3,4 @@ The Prometheus security policy, including how to report vulnerabilities, can be found here: -https://prometheus.io/docs/operating/security/ + diff --git a/vendor/github.com/prometheus/procfs/arp.go b/vendor/github.com/prometheus/procfs/arp.go index 4e47e6172..68f36e888 100644 --- a/vendor/github.com/prometheus/procfs/arp.go +++ b/vendor/github.com/prometheus/procfs/arp.go @@ -15,11 +15,28 @@ package procfs import ( "fmt" - "io/ioutil" "net" + "os" + "strconv" "strings" ) +// Learned from include/uapi/linux/if_arp.h. +const ( + // completed entry (ha valid). + ATFComplete = 0x02 + // permanent entry. + ATFPermanent = 0x04 + // Publish entry. + ATFPublish = 0x08 + // Has requested trailers. + ATFUseTrailers = 0x10 + // Obsoleted: Want to use a netmask (only for proxy entries). + ATFNetmask = 0x20 + // Don't answer this addresses. + ATFDontPublish = 0x40 +) + // ARPEntry contains a single row of the columnar data represented in // /proc/net/arp. type ARPEntry struct { @@ -29,12 +46,14 @@ type ARPEntry struct { HWAddr net.HardwareAddr // Name of the device Device string + // Flags + Flags byte } // GatherARPEntries retrieves all the ARP entries, parse the relevant columns, // and then return a slice of ARPEntry's. func (fs FS) GatherARPEntries() ([]ARPEntry, error) { - data, err := ioutil.ReadFile(fs.proc.Path("net/arp")) + data, err := os.ReadFile(fs.proc.Path("net/arp")) if err != nil { return nil, fmt.Errorf("error reading arp %q: %w", fs.proc.Path("net/arp"), err) } @@ -72,14 +91,26 @@ func parseARPEntries(data []byte) ([]ARPEntry, error) { } func parseARPEntry(columns []string) (ARPEntry, error) { + entry := ARPEntry{Device: columns[5]} ip := net.ParseIP(columns[0]) - mac := net.HardwareAddr(columns[3]) + entry.IPAddr = ip + + if mac, err := net.ParseMAC(columns[3]); err == nil { + entry.HWAddr = mac + } else { + return ARPEntry{}, err + } - entry := ARPEntry{ - IPAddr: ip, - HWAddr: mac, - Device: columns[5], + if flags, err := strconv.ParseUint(columns[2], 0, 8); err == nil { + entry.Flags = byte(flags) + } else { + return ARPEntry{}, err } return entry, nil } + +// IsComplete returns true if ARP entry is marked with complete flag. +func (entry *ARPEntry) IsComplete() bool { + return entry.Flags&ATFComplete != 0 +} diff --git a/vendor/github.com/prometheus/procfs/cpuinfo.go b/vendor/github.com/prometheus/procfs/cpuinfo.go index 5623b24a1..ff6b927da 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build linux // +build linux package procfs @@ -27,7 +28,7 @@ import ( "github.com/prometheus/procfs/internal/util" ) -// CPUInfo contains general information about a system CPU found in /proc/cpuinfo +// CPUInfo contains general information about a system CPU found in /proc/cpuinfo. type CPUInfo struct { Processor uint VendorID string @@ -469,7 +470,7 @@ func parseCPUInfoDummy(_ []byte) ([]CPUInfo, error) { // nolint:unused,deadcode } // firstNonEmptyLine advances the scanner to the first non-empty line -// and returns the contents of that line +// and returns the contents of that line. func firstNonEmptyLine(scanner *bufio.Scanner) string { for scanner.Scan() { line := scanner.Text() diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_armx.go b/vendor/github.com/prometheus/procfs/cpuinfo_armx.go index 44b590ed3..64cfd534c 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_armx.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_armx.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build linux && (arm || arm64) // +build linux // +build arm arm64 diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go b/vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go index 91e272573..c11207f3a 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build linux && (mips || mipsle || mips64 || mips64le) // +build linux // +build mips mipsle mips64 mips64le diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_others.go b/vendor/github.com/prometheus/procfs/cpuinfo_others.go index 95b5b4ec4..ea41bf2ca 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_others.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_others.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build linux -// +build !386,!amd64,!arm,!arm64,!mips,!mips64,!mips64le,!mipsle,!ppc64,!ppc64le,!riscv64,!s390x +//go:build linux && !386 && !amd64 && !arm && !arm64 && !mips && !mips64 && !mips64le && !mipsle && !ppc64 && !ppc64le && !riscv64 && !s390x +// +build linux,!386,!amd64,!arm,!arm64,!mips,!mips64,!mips64le,!mipsle,!ppc64,!ppc64le,!riscv64,!s390x package procfs diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go b/vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go index 6068bd571..003bc2ad4 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build linux && (ppc64 || ppc64le) // +build linux // +build ppc64 ppc64le diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go b/vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go index e83c2e207..1c9b7313b 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build linux && (riscv || riscv64) // +build linux // +build riscv riscv64 diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_s390x.go b/vendor/github.com/prometheus/procfs/cpuinfo_s390x.go index 26814eeba..fa3686bc0 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_s390x.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_s390x.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build linux // +build linux package procfs diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_x86.go b/vendor/github.com/prometheus/procfs/cpuinfo_x86.go index d5bedf97f..a0ef55562 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_x86.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_x86.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build linux && (386 || amd64) // +build linux // +build 386 amd64 diff --git a/vendor/github.com/prometheus/procfs/fixtures.ttar b/vendor/github.com/prometheus/procfs/fixtures.ttar deleted file mode 100644 index 5e7eeef4a..000000000 --- a/vendor/github.com/prometheus/procfs/fixtures.ttar +++ /dev/null @@ -1,7673 +0,0 @@ -# Archive created by ttar -c -f fixtures.ttar fixtures/ -Directory: fixtures -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/cmdline -Lines: 1 -vimNULLBYTEtest.goNULLBYTE+10NULLBYTEEOF -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/comm -Lines: 1 -vim -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/cwd -SymlinkTo: /usr/bin -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/environ -Lines: 1 -PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binNULLBYTEHOSTNAME=cd24e11f73a5NULLBYTETERM=xtermNULLBYTEGOLANG_VERSION=1.12.5NULLBYTEGOPATH=/goNULLBYTEHOME=/rootNULLBYTEEOF -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/exe -SymlinkTo: /usr/bin/vim -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231/fd -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/0 -SymlinkTo: ../../symlinktargets/abc -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/1 -SymlinkTo: ../../symlinktargets/def -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/10 -SymlinkTo: ../../symlinktargets/xyz -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/2 -SymlinkTo: ../../symlinktargets/ghi -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/3 -SymlinkTo: ../../symlinktargets/uvw -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231/fdinfo -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/0 -Lines: 6 -pos: 0 -flags: 02004000 -mnt_id: 13 -inotify wd:3 ino:1 sdev:34 mask:fce ignored_mask:0 fhandle-bytes:c fhandle-type:81 f_handle:000000000100000000000000 -inotify wd:2 ino:1300016 sdev:fd00002 mask:fce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:16003001ed3f022a -inotify wd:1 ino:2e0001 sdev:fd00000 mask:fce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01002e00138e7c65 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/1 -Lines: 4 -pos: 0 -flags: 02004002 -mnt_id: 13 -eventfd-count: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/10 -Lines: 3 -pos: 0 -flags: 02004002 -mnt_id: 9 -Mode: 400 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/2 -Lines: 3 -pos: 0 -flags: 02004002 -mnt_id: 9 -Mode: 400 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/3 -Lines: 3 -pos: 0 -flags: 02004002 -mnt_id: 9 -Mode: 400 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/io -Lines: 7 -rchar: 750339 -wchar: 818609 -syscr: 7405 -syscw: 5245 -read_bytes: 1024 -write_bytes: 2048 -cancelled_write_bytes: -1024 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/limits -Lines: 17 -Limit Soft Limit Hard Limit Units -Max cpu time unlimited unlimited seconds -Max file size unlimited unlimited bytes -Max data size unlimited unlimited bytes -Max stack size 8388608 unlimited bytes -Max core file size 0 unlimited bytes -Max resident set unlimited unlimited bytes -Max processes 62898 62898 processes -Max open files 2048 4096 files -Max locked memory 18446744073708503040 18446744073708503040 bytes -Max address space 8589934592 unlimited bytes -Max file locks unlimited unlimited locks -Max pending signals 62898 62898 signals -Max msgqueue size 819200 819200 bytes -Max nice priority 0 0 -Max realtime priority 0 0 -Max realtime timeout unlimited unlimited us -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/mountstats -Lines: 20 -device rootfs mounted on / with fstype rootfs -device sysfs mounted on /sys with fstype sysfs -device proc mounted on /proc with fstype proc -device /dev/sda1 mounted on / with fstype ext4 -device 192.168.1.1:/srv/test mounted on /mnt/nfs/test with fstype nfs4 statvers=1.1 - opts: rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.1,clientaddr=192.168.1.5,local_lock=none - age: 13968 - caps: caps=0xfff7,wtmult=512,dtsize=32768,bsize=0,namlen=255 - nfsv4: bm0=0xfdffafff,bm1=0xf9be3e,bm2=0x0,acl=0x0,pnfs=not configured - sec: flavor=1,pseudoflavor=1 - events: 52 226 0 0 1 13 398 0 0 331 0 47 0 0 77 0 0 77 0 0 0 0 0 0 0 0 0 - bytes: 1207640230 0 0 0 1210214218 0 295483 0 - RPC iostats version: 1.0 p/v: 100003/4 (nfs) - xprt: tcp 832 0 1 0 11 6428 6428 0 12154 0 24 26 5726 - per-op statistics - NULL: 0 0 0 0 0 0 0 0 - READ: 1298 1298 0 207680 1210292152 6 79386 79407 - WRITE: 0 0 0 0 0 0 0 0 - ACCESS: 2927395007 2927394995 0 526931094212 362996810236 18446743919241604546 1667369447 1953587717 - -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231/net -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/net/dev -Lines: 4 -Inter-| Receive | Transmit - face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed - lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231/ns -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/ns/mnt -SymlinkTo: mnt:[4026531840] -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/ns/net -SymlinkTo: net:[4026531993] -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/root -SymlinkTo: / -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/schedstat -Lines: 1 -411605849 93680043 79 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/smaps -Lines: 252 -00400000-00cb1000 r-xp 00000000 fd:01 952273 /bin/alertmanager -Size: 8900 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2952 kB -Pss: 2952 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 2952 kB -Private_Dirty: 0 kB -Referenced: 2864 kB -Anonymous: 0 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me dw sd -00cb1000-016b0000 r--p 008b1000 fd:01 952273 /bin/alertmanager -Size: 10236 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 6152 kB -Pss: 6152 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 6152 kB -Private_Dirty: 0 kB -Referenced: 5308 kB -Anonymous: 0 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me dw sd -016b0000-0171a000 rw-p 012b0000 fd:01 952273 /bin/alertmanager -Size: 424 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 176 kB -Pss: 176 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 84 kB -Private_Dirty: 92 kB -Referenced: 176 kB -Anonymous: 92 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 12 kB -SwapPss: 12 kB -Locked: 0 kB -VmFlags: rd wr mr mw me dw ac sd -0171a000-0173f000 rw-p 00000000 00:00 0 -Size: 148 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 76 kB -Pss: 76 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 76 kB -Referenced: 76 kB -Anonymous: 76 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac sd -c000000000-c000400000 rw-p 00000000 00:00 0 -Size: 4096 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2564 kB -Pss: 2564 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 20 kB -Private_Dirty: 2544 kB -Referenced: 2544 kB -Anonymous: 2564 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 1100 kB -SwapPss: 1100 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac sd -c000400000-c001600000 rw-p 00000000 00:00 0 -Size: 18432 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16024 kB -Pss: 16024 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 5864 kB -Private_Dirty: 10160 kB -Referenced: 11944 kB -Anonymous: 16024 kB -LazyFree: 5848 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 440 kB -SwapPss: 440 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac sd nh -c001600000-c004000000 rw-p 00000000 00:00 0 -Size: 43008 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac sd -7f0ab95ca000-7f0abbb7b000 rw-p 00000000 00:00 0 -Size: 38596 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1992 kB -Pss: 1992 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 476 kB -Private_Dirty: 1516 kB -Referenced: 1828 kB -Anonymous: 1992 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 384 kB -SwapPss: 384 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac sd -7ffc07ecf000-7ffc07ef0000 rw-p 00000000 00:00 0 [stack] -Size: 132 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 4 kB -SwapPss: 4 kB -Locked: 0 kB -VmFlags: rd wr mr mw me gd ac -7ffc07f9e000-7ffc07fa1000 r--p 00000000 00:00 0 [vvar] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr pf io de dd sd -7ffc07fa1000-7ffc07fa3000 r-xp 00000000 00:00 0 [vdso] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me de sd -ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -LazyFree: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/smaps_rollup -Lines: 17 -00400000-ffffffffff601000 ---p 00000000 00:00 0 [rollup] -Rss: 29948 kB -Pss: 29944 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 15548 kB -Private_Dirty: 14396 kB -Referenced: 24752 kB -Anonymous: 20756 kB -LazyFree: 5848 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 1940 kB -SwapPss: 1940 kB -Locked: 0 kB -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/stat -Lines: 1 -26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/status -Lines: 53 - -Name: prometheus -Umask: 0022 -State: S (sleeping) -Tgid: 26231 -Ngid: 0 -Pid: 26231 -PPid: 1 -TracerPid: 0 -Uid: 1000 1000 1000 0 -Gid: 1001 1001 1001 0 -FDSize: 128 -Groups: -NStgid: 1 -NSpid: 1 -NSpgid: 1 -NSsid: 1 -VmPeak: 58472 kB -VmSize: 58440 kB -VmLck: 0 kB -VmPin: 0 kB -VmHWM: 8028 kB -VmRSS: 6716 kB -RssAnon: 2092 kB -RssFile: 4624 kB -RssShmem: 0 kB -VmData: 2580 kB -VmStk: 136 kB -VmExe: 948 kB -VmLib: 6816 kB -VmPTE: 128 kB -VmPMD: 12 kB -VmSwap: 660 kB -HugetlbPages: 0 kB -Threads: 1 -SigQ: 8/63965 -SigPnd: 0000000000000000 -ShdPnd: 0000000000000000 -SigBlk: 7be3c0fe28014a03 -SigIgn: 0000000000001000 -SigCgt: 00000001800004ec -CapInh: 0000000000000000 -CapPrm: 0000003fffffffff -CapEff: 0000003fffffffff -CapBnd: 0000003fffffffff -CapAmb: 0000000000000000 -Seccomp: 0 -Cpus_allowed: ff -Cpus_allowed_list: 0-7 -Mems_allowed: 00000000,00000001 -Mems_allowed_list: 0 -voluntary_ctxt_switches: 4742839 -nonvoluntary_ctxt_switches: 1727500 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/wchan -Lines: 1 -poll_schedule_timeoutEOF -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26232 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/cmdline -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/comm -Lines: 1 -ata_sff -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/cwd -SymlinkTo: /does/not/exist -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26232/fd -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/0 -SymlinkTo: ../../symlinktargets/abc -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/1 -SymlinkTo: ../../symlinktargets/def -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/2 -SymlinkTo: ../../symlinktargets/ghi -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/3 -SymlinkTo: ../../symlinktargets/uvw -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/4 -SymlinkTo: ../../symlinktargets/xyz -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/limits -Lines: 17 -Limit Soft Limit Hard Limit Units -Max cpu time unlimited unlimited seconds -Max file size unlimited unlimited bytes -Max data size unlimited unlimited bytes -Max stack size 8388608 unlimited bytes -Max core file size 0 unlimited bytes -Max resident set unlimited unlimited bytes -Max processes 29436 29436 processes -Max open files 1024 4096 files -Max locked memory 65536 65536 bytes -Max address space unlimited unlimited bytes -Max file locks unlimited unlimited locks -Max pending signals 29436 29436 signals -Max msgqueue size 819200 819200 bytes -Max nice priority 0 0 -Max realtime priority 0 0 -Max realtime timeout unlimited unlimited us -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/maps -Lines: 9 -55680ae1e000-55680ae20000 r--p 00000000 fd:01 47316994 /bin/cat -55680ae29000-55680ae2a000 rwxs 0000a000 fd:01 47316994 /bin/cat -55680bed6000-55680bef7000 rw-p 00000000 00:00 0 [heap] -7fdf964fc000-7fdf973f2000 r--p 00000000 fd:01 17432624 /usr/lib/locale/locale-archive -7fdf973f2000-7fdf97417000 r--p 00000000 fd:01 60571062 /lib/x86_64-linux-gnu/libc-2.29.so -7ffe9215c000-7ffe9217f000 rw-p 00000000 00:00 0 [stack] -7ffe921da000-7ffe921dd000 r--p 00000000 00:00 0 [vvar] -7ffe921dd000-7ffe921de000 r-xp 00000000 00:00 0 [vdso] -ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/root -SymlinkTo: /does/not/exist -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/stat -Lines: 1 -33 (ata_sff) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 5 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/wchan -Lines: 1 -0EOF -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26233 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26233/cmdline -Lines: 1 -com.github.uiautomatorNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26233/schedstat -Lines: 8 - ____________________________________ -< this is a malformed schedstat file > - ------------------------------------ - \ ^__^ - \ (oo)\_______ - (__)\ )\/\ - ||----w | - || || -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26234 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26234/maps -Lines: 4 -08048000-08089000 r-xp 00000000 03:01 104219 /bin/tcsh -08089000-0808c000 rw-p 00041000 03:01 104219 /bin/tcsh -0808c000-08146000 rwxp 00000000 00:00 0 -40000000-40015000 r-xp 00000000 03:01 61874 /lib/ld-2.3.2.so -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/584 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/584/stat -Lines: 2 -1020 ((a b ) ( c d) ) R 28378 1020 28378 34842 1020 4218880 286 0 0 0 0 0 0 0 20 0 1 0 10839175 10395648 155 18446744073709551615 4194304 4238788 140736466511168 140736466511168 140609271124624 0 0 0 0 0 0 0 17 5 0 0 0 0 0 6336016 6337300 25579520 140736466515030 140736466515061 140736466515061 140736466518002 0 -#!/bin/cat /proc/self/stat -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/buddyinfo -Lines: 3 -Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 -Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 -Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/cmdline -Lines: 1 -BOOT_IMAGE=/vmlinuz-5.11.0-22-generic root=UUID=456a0345-450d-4f7b-b7c9-43e3241d99ad ro quiet splash vt.handoff=7 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/cpuinfo -Lines: 216 -processor : 0 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 799.998 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 0 -cpu cores : 4 -apicid : 0 -initial apicid : 0 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 1 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.037 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 1 -cpu cores : 4 -apicid : 2 -initial apicid : 2 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 2 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.010 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 2 -cpu cores : 4 -apicid : 4 -initial apicid : 4 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 3 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.028 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 3 -cpu cores : 4 -apicid : 6 -initial apicid : 6 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 4 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 799.989 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 0 -cpu cores : 4 -apicid : 1 -initial apicid : 1 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 5 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.083 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 1 -cpu cores : 4 -apicid : 3 -initial apicid : 3 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 6 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.017 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 2 -cpu cores : 4 -apicid : 5 -initial apicid : 5 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 7 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.030 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 3 -cpu cores : 4 -apicid : 7 -initial apicid : 7 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/crypto -Lines: 972 -name : ccm(aes) -driver : ccm_base(ctr(aes-aesni),cbcmac(aes-aesni)) -module : ccm -priority : 300 -refcnt : 4 -selftest : passed -internal : no -type : aead -async : no -blocksize : 1 -ivsize : 16 -maxauthsize : 16 -geniv : - -name : cbcmac(aes) -driver : cbcmac(aes-aesni) -module : ccm -priority : 300 -refcnt : 7 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 16 - -name : ecdh -driver : ecdh-generic -module : ecdh_generic -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : kpp -async : yes - -name : ecb(arc4) -driver : ecb(arc4)-generic -module : arc4 -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : no -blocksize : 1 -min keysize : 1 -max keysize : 256 -ivsize : 0 -chunksize : 1 -walksize : 1 - -name : arc4 -driver : arc4-generic -module : arc4 -priority : 0 -refcnt : 3 -selftest : passed -internal : no -type : cipher -blocksize : 1 -min keysize : 1 -max keysize : 256 - -name : crct10dif -driver : crct10dif-pclmul -module : crct10dif_pclmul -priority : 200 -refcnt : 2 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 2 - -name : crc32 -driver : crc32-pclmul -module : crc32_pclmul -priority : 200 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 4 - -name : __ghash -driver : cryptd(__ghash-pclmulqdqni) -module : kernel -priority : 50 -refcnt : 1 -selftest : passed -internal : yes -type : ahash -async : yes -blocksize : 16 -digestsize : 16 - -name : ghash -driver : ghash-clmulni -module : ghash_clmulni_intel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : ahash -async : yes -blocksize : 16 -digestsize : 16 - -name : __ghash -driver : __ghash-pclmulqdqni -module : ghash_clmulni_intel -priority : 0 -refcnt : 1 -selftest : passed -internal : yes -type : shash -blocksize : 16 -digestsize : 16 - -name : crc32c -driver : crc32c-intel -module : crc32c_intel -priority : 200 -refcnt : 5 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 4 - -name : cbc(aes) -driver : cbc(aes-aesni) -module : kernel -priority : 300 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : no -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : ctr(aes) -driver : ctr(aes-aesni) -module : kernel -priority : 300 -refcnt : 5 -selftest : passed -internal : no -type : skcipher -async : no -blocksize : 1 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : pkcs1pad(rsa,sha256) -driver : pkcs1pad(rsa-generic,sha256) -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : akcipher - -name : __xts(aes) -driver : cryptd(__xts-aes-aesni) -module : kernel -priority : 451 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : yes -blocksize : 16 -min keysize : 32 -max keysize : 64 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : xts(aes) -driver : xts-aes-aesni -module : kernel -priority : 401 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : yes -blocksize : 16 -min keysize : 32 -max keysize : 64 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __ctr(aes) -driver : cryptd(__ctr-aes-aesni) -module : kernel -priority : 450 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : yes -blocksize : 1 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : ctr(aes) -driver : ctr-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : yes -blocksize : 1 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __cbc(aes) -driver : cryptd(__cbc-aes-aesni) -module : kernel -priority : 450 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : yes -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : cbc(aes) -driver : cbc-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : yes -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __ecb(aes) -driver : cryptd(__ecb-aes-aesni) -module : kernel -priority : 450 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : yes -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 0 -chunksize : 16 -walksize : 16 - -name : ecb(aes) -driver : ecb-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : yes -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 0 -chunksize : 16 -walksize : 16 - -name : __generic-gcm-aes-aesni -driver : cryptd(__driver-generic-gcm-aes-aesni) -module : kernel -priority : 50 -refcnt : 1 -selftest : passed -internal : yes -type : aead -async : yes -blocksize : 1 -ivsize : 12 -maxauthsize : 16 -geniv : - -name : gcm(aes) -driver : generic-gcm-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : aead -async : yes -blocksize : 1 -ivsize : 12 -maxauthsize : 16 -geniv : - -name : __generic-gcm-aes-aesni -driver : __driver-generic-gcm-aes-aesni -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : yes -type : aead -async : no -blocksize : 1 -ivsize : 12 -maxauthsize : 16 -geniv : - -name : __gcm-aes-aesni -driver : cryptd(__driver-gcm-aes-aesni) -module : kernel -priority : 50 -refcnt : 1 -selftest : passed -internal : yes -type : aead -async : yes -blocksize : 1 -ivsize : 8 -maxauthsize : 16 -geniv : - -name : rfc4106(gcm(aes)) -driver : rfc4106-gcm-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : aead -async : yes -blocksize : 1 -ivsize : 8 -maxauthsize : 16 -geniv : - -name : __gcm-aes-aesni -driver : __driver-gcm-aes-aesni -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : yes -type : aead -async : no -blocksize : 1 -ivsize : 8 -maxauthsize : 16 -geniv : - -name : __xts(aes) -driver : __xts-aes-aesni -module : kernel -priority : 401 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : no -blocksize : 16 -min keysize : 32 -max keysize : 64 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __ctr(aes) -driver : __ctr-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : no -blocksize : 1 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __cbc(aes) -driver : __cbc-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : no -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __ecb(aes) -driver : __ecb-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : no -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 0 -chunksize : 16 -walksize : 16 - -name : __aes -driver : __aes-aesni -module : kernel -priority : 300 -refcnt : 1 -selftest : passed -internal : yes -type : cipher -blocksize : 16 -min keysize : 16 -max keysize : 32 - -name : aes -driver : aes-aesni -module : kernel -priority : 300 -refcnt : 8 -selftest : passed -internal : no -type : cipher -blocksize : 16 -min keysize : 16 -max keysize : 32 - -name : hmac(sha1) -driver : hmac(sha1-generic) -module : kernel -priority : 100 -refcnt : 9 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 20 - -name : ghash -driver : ghash-generic -module : kernel -priority : 100 -refcnt : 3 -selftest : passed -internal : no -type : shash -blocksize : 16 -digestsize : 16 - -name : jitterentropy_rng -driver : jitterentropy_rng -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_hmac_sha256 -module : kernel -priority : 221 -refcnt : 2 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_hmac_sha512 -module : kernel -priority : 220 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_hmac_sha384 -module : kernel -priority : 219 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_hmac_sha1 -module : kernel -priority : 218 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_sha256 -module : kernel -priority : 217 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_sha512 -module : kernel -priority : 216 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_sha384 -module : kernel -priority : 215 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_sha1 -module : kernel -priority : 214 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_ctr_aes256 -module : kernel -priority : 213 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_ctr_aes192 -module : kernel -priority : 212 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_ctr_aes128 -module : kernel -priority : 211 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : hmac(sha256) -driver : hmac(sha256-generic) -module : kernel -priority : 100 -refcnt : 10 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 32 - -name : stdrng -driver : drbg_pr_hmac_sha256 -module : kernel -priority : 210 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_hmac_sha512 -module : kernel -priority : 209 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_hmac_sha384 -module : kernel -priority : 208 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_hmac_sha1 -module : kernel -priority : 207 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_sha256 -module : kernel -priority : 206 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_sha512 -module : kernel -priority : 205 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_sha384 -module : kernel -priority : 204 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_sha1 -module : kernel -priority : 203 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_ctr_aes256 -module : kernel -priority : 202 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_ctr_aes192 -module : kernel -priority : 201 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_ctr_aes128 -module : kernel -priority : 200 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : 842 -driver : 842-scomp -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : 842 -driver : 842-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : compression - -name : lzo-rle -driver : lzo-rle-scomp -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : lzo-rle -driver : lzo-rle-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : compression - -name : lzo -driver : lzo-scomp -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : lzo -driver : lzo-generic -module : kernel -priority : 0 -refcnt : 9 -selftest : passed -internal : no -type : compression - -name : crct10dif -driver : crct10dif-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 2 - -name : crc32c -driver : crc32c-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 4 - -name : zlib-deflate -driver : zlib-deflate-scomp -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : deflate -driver : deflate-scomp -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : deflate -driver : deflate-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : compression - -name : aes -driver : aes-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : cipher -blocksize : 16 -min keysize : 16 -max keysize : 32 - -name : sha224 -driver : sha224-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 28 - -name : sha256 -driver : sha256-generic -module : kernel -priority : 100 -refcnt : 11 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 32 - -name : sha1 -driver : sha1-generic -module : kernel -priority : 100 -refcnt : 11 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 20 - -name : md5 -driver : md5-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 16 - -name : ecb(cipher_null) -driver : ecb-cipher_null -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : no -blocksize : 1 -min keysize : 0 -max keysize : 0 -ivsize : 0 -chunksize : 1 -walksize : 1 - -name : digest_null -driver : digest_null-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 0 - -name : compress_null -driver : compress_null-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : compression - -name : cipher_null -driver : cipher_null-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : cipher -blocksize : 1 -min keysize : 0 -max keysize : 0 - -name : rsa -driver : rsa-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : akcipher - -name : dh -driver : dh-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : kpp - -name : aes -driver : aes-asm -module : kernel -priority : 200 -refcnt : 1 -selftest : passed -internal : no -type : cipher -blocksize : 16 -min keysize : 16 -max keysize : 32 - -Mode: 444 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/diskstats -Lines: 52 - 1 0 ram0 0 0 0 0 0 0 0 0 0 0 0 - 1 1 ram1 0 0 0 0 0 0 0 0 0 0 0 - 1 2 ram2 0 0 0 0 0 0 0 0 0 0 0 - 1 3 ram3 0 0 0 0 0 0 0 0 0 0 0 - 1 4 ram4 0 0 0 0 0 0 0 0 0 0 0 - 1 5 ram5 0 0 0 0 0 0 0 0 0 0 0 - 1 6 ram6 0 0 0 0 0 0 0 0 0 0 0 - 1 7 ram7 0 0 0 0 0 0 0 0 0 0 0 - 1 8 ram8 0 0 0 0 0 0 0 0 0 0 0 - 1 9 ram9 0 0 0 0 0 0 0 0 0 0 0 - 1 10 ram10 0 0 0 0 0 0 0 0 0 0 0 - 1 11 ram11 0 0 0 0 0 0 0 0 0 0 0 - 1 12 ram12 0 0 0 0 0 0 0 0 0 0 0 - 1 13 ram13 0 0 0 0 0 0 0 0 0 0 0 - 1 14 ram14 0 0 0 0 0 0 0 0 0 0 0 - 1 15 ram15 0 0 0 0 0 0 0 0 0 0 0 - 7 0 loop0 0 0 0 0 0 0 0 0 0 0 0 - 7 1 loop1 0 0 0 0 0 0 0 0 0 0 0 - 7 2 loop2 0 0 0 0 0 0 0 0 0 0 0 - 7 3 loop3 0 0 0 0 0 0 0 0 0 0 0 - 7 4 loop4 0 0 0 0 0 0 0 0 0 0 0 - 7 5 loop5 0 0 0 0 0 0 0 0 0 0 0 - 7 6 loop6 0 0 0 0 0 0 0 0 0 0 0 - 7 7 loop7 0 0 0 0 0 0 0 0 0 0 0 - 8 0 sda 25354637 34367663 1003346126 18492372 28444756 11134226 505697032 63877960 0 9653880 82621804 - 8 1 sda1 250 0 2000 36 0 0 0 0 0 36 36 - 8 2 sda2 246 0 1968 32 0 0 0 0 0 32 32 - 8 3 sda3 340 13 2818 52 11 8 152 8 0 56 60 - 8 4 sda4 25353629 34367650 1003337964 18492232 27448755 11134218 505696880 61593380 0 7576432 80332428 - 252 0 dm-0 59910002 0 1003337218 46229572 39231014 0 505696880 1158557800 0 11325968 1206301256 - 252 1 dm-1 388 0 3104 84 74 0 592 0 0 76 84 - 252 2 dm-2 11571 0 308350 6536 153522 0 5093416 122884 0 65400 129416 - 252 3 dm-3 3870 0 3870 104 0 0 0 0 0 16 104 - 252 4 dm-4 392 0 1034 28 38 0 137 16 0 24 44 - 252 5 dm-5 3729 0 84279 924 98918 0 1151688 104684 0 58848 105632 - 179 0 mmcblk0 192 3 1560 156 0 0 0 0 0 136 156 - 179 1 mmcblk0p1 17 3 160 24 0 0 0 0 0 24 24 - 179 2 mmcblk0p2 95 0 760 68 0 0 0 0 0 68 68 - 2 0 fd0 2 0 16 80 0 0 0 0 0 80 80 - 254 0 vda 1775784 15386 32670882 8655768 6038856 20711856 213637440 2069221364 0 41614592 2077872228 - 254 1 vda1 668 85 5984 956 207 4266 35784 32772 0 8808 33720 - 254 2 vda2 1774936 15266 32663262 8654692 5991028 20707590 213601656 2069152216 0 41607628 2077801992 - 11 0 sr0 0 0 0 0 0 0 0 0 0 0 0 - 259 0 nvme0n1 47114 4 4643973 21650 1078320 43950 39451633 1011053 0 222766 1032546 - 259 1 nvme0n1p1 1140 0 9370 16 1 0 1 0 0 16 16 - 259 2 nvme0n1p2 45914 4 4631243 21626 1036885 43950 39451632 919480 0 131580 940970 - 8 0 sdb 326552 841 9657779 84 41822 2895 1972905 5007 0 60730 67070 68851 0 1925173784 11130 - 8 1 sdb1 231 3 34466 4 24 23 106 0 0 64 64 0 0 0 0 - 8 2 sdb2 326310 838 9622281 67 40726 2872 1972799 4924 0 58250 64567 68851 0 1925173784 11130 - 8 0 sdc 14202 71 579164 21861 2995 1589 180500 40875 0 11628 55200 0 0 0 0 127 182 - 8 1 sdc1 1027 0 13795 5021 2 0 4096 3 0 690 4579 0 0 0 0 0 0 - 8 2 sdc2 13126 71 561749 16802 2830 1589 176404 40620 0 10931 50449 0 0 0 0 0 0 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/fs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/fs/fscache -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/fs/fscache/stats -Lines: 24 -FS-Cache statistics -Cookies: idx=3 dat=67877 spc=0 -Objects: alc=67473 nal=0 avl=67473 ded=388 -ChkAux : non=12 ok=33 upd=44 obs=55 -Pages : mrk=547164 unc=364577 -Acquire: n=67880 nul=98 noc=25 ok=67780 nbf=39 oom=26 -Lookups: n=67473 neg=67470 pos=58 crt=67473 tmo=85 -Invals : n=14 run=13 -Updates: n=7 nul=3 run=8 -Relinqs: n=394 nul=1 wcr=2 rtr=3 -AttrChg: n=6 ok=5 nbf=4 oom=3 run=2 -Allocs : n=20 ok=19 wt=18 nbf=17 int=16 -Allocs : ops=15 owt=14 abt=13 -Retrvls: n=151959 ok=82823 wt=23467 nod=69136 nbf=15 int=69 oom=43 -Retrvls: ops=151959 owt=42747 abt=44 -Stores : n=225565 ok=225565 agn=12 nbf=13 oom=14 -Stores : ops=69156 run=294721 pgs=225565 rxd=225565 olm=43 -VmScan : nos=364512 gon=2 bsy=43 can=12 wt=66 -Ops : pend=42753 run=221129 enq=628798 can=11 rej=88 -Ops : ini=377538 dfr=27 rel=377538 gc=37 -CacheOp: alo=1 luo=2 luc=3 gro=4 -CacheOp: inv=5 upo=6 dro=7 pto=8 atc=9 syn=10 -CacheOp: rap=11 ras=12 alp=13 als=14 wrp=15 ucp=16 dsp=17 -CacheEv: nsp=18 stl=19 rtr=20 cul=21EOF -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/fs/xfs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/fs/xfs/stat -Lines: 23 -extent_alloc 92447 97589 92448 93751 -abt 0 0 0 0 -blk_map 1767055 188820 184891 92447 92448 2140766 0 -bmbt 0 0 0 0 -dir 185039 92447 92444 136422 -trans 706 944304 0 -ig 185045 58807 0 126238 0 33637 22 -log 2883 113448 9 17360 739 -push_ail 945014 0 134260 15483 0 3940 464 159985 0 40 -xstrat 92447 0 -rw 107739 94045 -attr 4 0 0 0 -icluster 8677 7849 135802 -vnodes 92601 0 0 0 92444 92444 92444 0 -buf 2666287 7122 2659202 3599 2 7085 0 10297 7085 -abtb2 184941 1277345 13257 13278 0 0 0 0 0 0 0 0 0 0 2746147 -abtc2 345295 2416764 172637 172658 0 0 0 0 0 0 0 0 0 0 21406023 -bmbt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -ibt2 343004 1358467 0 0 0 0 0 0 0 0 0 0 0 0 0 -fibt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -qm 0 0 0 0 0 0 0 0 -xpc 399724544 92823103 86219234 -debug 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/loadavg -Lines: 1 -0.02 0.04 0.05 1/497 11947 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/mdstat -Lines: 60 -Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] - -md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] sdd1[10](S) sdd2[11](S) - 5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU] - -md127 : active raid1 sdi2[0] sdj2[1] - 312319552 blocks [2/2] [UU] - -md0 : active raid1 sdi1[0] sdj1[1] - 248896 blocks [2/2] [UU] - -md4 : inactive raid1 sda3[0](F) sdb3[1](S) - 4883648 blocks [2/2] [UU] - -md6 : active raid1 sdb2[2](F) sdc[1](S) sda2[0] - 195310144 blocks [2/1] [U_] - [=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec - -md8 : active raid1 sdb1[1] sda1[0] sdc[2](S) sde[3](S) - 195310144 blocks [2/2] [UU] - [=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec - -md201 : active raid1 sda3[0] sdb3[1] - 1993728 blocks super 1.2 [2/2] [UU] - [=>...................] check = 5.7% (114176/1993728) finish=0.2min speed=114176K/sec - -md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1](F) - 7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU] - bitmap: 0/30 pages [0KB], 65536KB chunk - -md9 : active raid1 sdc2[2] sdd2[3] sdb2[1] sda2[0] sde[4](F) sdf[5](F) sdg[6](S) - 523968 blocks super 1.2 [4/4] [UUUU] - resync=DELAYED - -md10 : active raid0 sda1[0] sdb1[1] - 314159265 blocks 64k chunks - -md11 : active (auto-read-only) raid1 sdb2[0] sdc2[1] sdc3[2](F) hda[4](S) ssdc2[3](S) - 4190208 blocks super 1.2 [2/2] [UU] - resync=PENDING - -md12 : active raid0 sdc2[0] sdd2[1] - 3886394368 blocks super 1.2 512k chunks - -md126 : active raid0 sdb[1] sdc[0] - 1855870976 blocks super external:/md127/0 128k chunks - -md219 : inactive sdb[2](S) sdc[1](S) sda[0](S) - 7932 blocks super external:imsm - -md00 : active raid0 xvdb[0] - 4186624 blocks super 1.2 256k chunks - -md120 : active linear sda1[1] sdb1[0] - 2095104 blocks super 1.2 0k rounding - -md101 : active (read-only) raid0 sdb[2] sdd[1] sdc[0] - 322560 blocks super 1.2 512k chunks - -unused devices: -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/meminfo -Lines: 42 -MemTotal: 15666184 kB -MemFree: 440324 kB -Buffers: 1020128 kB -Cached: 12007640 kB -SwapCached: 0 kB -Active: 6761276 kB -Inactive: 6532708 kB -Active(anon): 267256 kB -Inactive(anon): 268 kB -Active(file): 6494020 kB -Inactive(file): 6532440 kB -Unevictable: 0 kB -Mlocked: 0 kB -SwapTotal: 0 kB -SwapFree: 0 kB -Dirty: 768 kB -Writeback: 0 kB -AnonPages: 266216 kB -Mapped: 44204 kB -Shmem: 1308 kB -Slab: 1807264 kB -SReclaimable: 1738124 kB -SUnreclaim: 69140 kB -KernelStack: 1616 kB -PageTables: 5288 kB -NFS_Unstable: 0 kB -Bounce: 0 kB -WritebackTmp: 0 kB -CommitLimit: 7833092 kB -Committed_AS: 530844 kB -VmallocTotal: 34359738367 kB -VmallocUsed: 36596 kB -VmallocChunk: 34359637840 kB -HardwareCorrupted: 0 kB -AnonHugePages: 12288 kB -HugePages_Total: 0 -HugePages_Free: 0 -HugePages_Rsvd: 0 -HugePages_Surp: 0 -Hugepagesize: 2048 kB -DirectMap4k: 91136 kB -DirectMap2M: 16039936 kB -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/net -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/arp -Lines: 2 -IP address HW type Flags HW address Mask Device -192.168.224.1 0x1 0x2 00:50:56:c0:00:08 * ens33 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/dev -Lines: 6 -Inter-| Receive | Transmit - face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed -vethf345468: 648 8 0 0 0 0 0 0 438 5 0 0 0 0 0 0 - lo: 1664039048 1566805 0 0 0 0 0 0 1664039048 1566805 0 0 0 0 0 0 -docker0: 2568 38 0 0 0 0 0 0 438 5 0 0 0 0 0 0 - eth0: 874354587 1036395 0 0 0 0 0 0 563352563 732147 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/ip_vs -Lines: 21 -IP Virtual Server version 1.2.1 (size=4096) -Prot LocalAddress:Port Scheduler Flags - -> RemoteAddress:Port Forward Weight ActiveConn InActConn -TCP C0A80016:0CEA wlc - -> C0A85216:0CEA Tunnel 100 248 2 - -> C0A85318:0CEA Tunnel 100 248 2 - -> C0A85315:0CEA Tunnel 100 248 1 -TCP C0A80039:0CEA wlc - -> C0A85416:0CEA Tunnel 0 0 0 - -> C0A85215:0CEA Tunnel 100 1499 0 - -> C0A83215:0CEA Tunnel 100 1498 0 -TCP C0A80037:0CEA wlc - -> C0A8321A:0CEA Tunnel 0 0 0 - -> C0A83120:0CEA Tunnel 100 0 0 -TCP [2620:0000:0000:0000:0000:0000:0000:0001]:0050 sh - -> [2620:0000:0000:0000:0000:0000:0000:0002]:0050 Route 1 0 0 - -> [2620:0000:0000:0000:0000:0000:0000:0003]:0050 Route 1 0 0 - -> [2620:0000:0000:0000:0000:0000:0000:0004]:0050 Route 1 1 1 -FWM 10001000 wlc - -> C0A8321A:0CEA Route 0 0 1 - -> C0A83215:0CEA Route 0 0 2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/ip_vs_stats -Lines: 6 - Total Incoming Outgoing Incoming Outgoing - Conns Packets Packets Bytes Bytes - 16AA370 E33656E5 0 51D8C8883AB3 0 - - Conns/s Pkts/s Pkts/s Bytes/s Bytes/s - 4 1FB3C 0 1282A8F 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/protocols -Lines: 14 -protocol size sockets memory press maxhdr slab module cl co di ac io in de sh ss gs se re sp bi br ha uh gp em -PACKET 1344 2 -1 NI 0 no kernel n n n n n n n n n n n n n n n n n n n -PINGv6 1112 0 -1 NI 0 yes kernel y y y n n y n n y y y y n y y y y y n -RAWv6 1112 1 -1 NI 0 yes kernel y y y n y y y n y y y y n y y y y n n -UDPLITEv6 1216 0 57 NI 0 yes kernel y y y n y y y n y y y y n n n y y y n -UDPv6 1216 10 57 NI 0 yes kernel y y y n y y y n y y y y n n n y y y n -TCPv6 2144 1937 1225378 no 320 yes kernel y y y y y y y y y y y y y n y y y y y -UNIX 1024 120 -1 NI 0 yes kernel n n n n n n n n n n n n n n n n n n n -UDP-Lite 1024 0 57 NI 0 yes kernel y y y n y y y n y y y y y n n y y y n -PING 904 0 -1 NI 0 yes kernel y y y n n y n n y y y y n y y y y y n -RAW 912 0 -1 NI 0 yes kernel y y y n y y y n y y y y n y y y y n n -UDP 1024 73 57 NI 0 yes kernel y y y n y y y n y y y y y n n y y y n -TCP 1984 93064 1225378 yes 320 yes kernel y y y y y y y y y y y y y n y y y y y -NETLINK 1040 16 -1 NI 0 no kernel n n n n n n n n n n n n n n n n n n n -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/net/rpc -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/rpc/nfs -Lines: 5 -net 18628 0 18628 6 -rpc 4329785 0 4338291 -proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 -proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 0 241 4 4 2 39 -proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/rpc/nfsd -Lines: 11 -rc 0 6 18622 -fh 0 0 0 0 0 -io 157286400 0 -th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -ra 32 0 0 0 0 0 0 0 0 0 0 0 -net 18628 0 18628 6 -rpc 18628 0 0 0 0 -proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 -proc3 22 2 112 0 2719 111 0 0 0 0 0 0 0 0 0 0 0 27 216 0 2 1 0 -proc4 2 2 10853 -proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/sockstat -Lines: 6 -sockets: used 1602 -TCP: inuse 35 orphan 0 tw 4 alloc 59 mem 22 -UDP: inuse 12 mem 62 -UDPLITE: inuse 0 -RAW: inuse 0 -FRAG: inuse 0 memory 0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/sockstat6 -Lines: 5 -TCP6: inuse 17 -UDP6: inuse 9 -UDPLITE6: inuse 0 -RAW6: inuse 1 -FRAG6: inuse 0 memory 0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/softnet_stat -Lines: 2 -00015c73 00020e76 F0000769 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 -01663fb2 00000000 000109a4 00000000 00000000 00000000 00000000 00000000 00000000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/softnet_stat.broken -Lines: 1 -00015c73 00020e76 F0000769 00000000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/net/stat -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/stat/arp_cache -Lines: 3 -entries allocs destroys hash_grows lookups hits res_failed rcv_probes_mcast rcv_probes_ucast periodic_gc_runs forced_gc_runs unresolved_discards table_fulls -00000014 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000a 0000000b 0000000c -00000014 0000000d 0000000e 0000000f 00000010 00000011 00000012 00000013 00000014 00000015 00000016 00000017 00000018 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/stat/ndisc_cache -Lines: 3 -entries allocs destroys hash_grows lookups hits res_failed rcv_probes_mcast rcv_probes_ucast periodic_gc_runs forced_gc_runs unresolved_discards table_fulls -00000024 000000f0 000000f1 000000f2 000000f3 000000f4 000000f5 000000f6 000000f7 000000f8 000000f9 000000fa 000000fb -00000024 000000fc 000000fd 000000fe 000000ff 00000100 00000101 00000102 00000103 00000104 00000105 00000106 00000107 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/tcp -Lines: 4 - sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode - 0: 0500000A:0016 00000000:0000 0A 00000000:00000001 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 - 1: 00000000:0016 00000000:0000 0A 00000001:00000000 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 - 2: 00000000:0016 00000000:0000 0A 00000001:00000001 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/tcp6 -Lines: 3 - sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops - 1315: 00000000000000000000000000000000:14EB 00000000000000000000000000000000:0000 07 00000000:00000000 00:00000000 00000000 981 0 21040 2 0000000013726323 0 - 6073: 000080FE00000000FFADE15609667CFE:C781 00000000000000000000000000000000:0000 07 00000000:00000000 00:00000000 00000000 1000 0 11337031 2 00000000b9256fdd 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/udp -Lines: 4 - sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode - 0: 0500000A:0016 00000000:0000 0A 00000000:00000001 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 - 1: 00000000:0016 00000000:0000 0A 00000001:00000000 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 - 2: 00000000:0016 00000000:0000 0A 00000001:00000001 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/udp6 -Lines: 3 - sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops - 1315: 00000000000000000000000000000000:14EB 00000000000000000000000000000000:0000 07 00000000:00000000 00:00000000 00000000 981 0 21040 2 0000000013726323 0 - 6073: 000080FE00000000FFADE15609667CFE:C781 00000000000000000000000000000000:0000 07 00000000:00000000 00:00000000 00000000 1000 0 11337031 2 00000000b9256fdd 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/udp_broken -Lines: 2 - sl local_address rem_address st - 1: 00000000:0016 00000000:0000 0A -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/unix -Lines: 6 -Num RefCount Protocol Flags Type St Inode Path -0000000000000000: 00000002 00000000 00010000 0001 01 3442596 /var/run/postgresql/.s.PGSQL.5432 -0000000000000000: 0000000a 00000000 00010000 0005 01 10061 /run/udev/control -0000000000000000: 00000007 00000000 00000000 0002 01 12392 /dev/log -0000000000000000: 00000003 00000000 00000000 0001 03 4787297 /var/run/postgresql/.s.PGSQL.5432 -0000000000000000: 00000003 00000000 00000000 0001 03 5091797 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/unix_without_inode -Lines: 6 -Num RefCount Protocol Flags Type St Path -0000000000000000: 00000002 00000000 00010000 0001 01 /var/run/postgresql/.s.PGSQL.5432 -0000000000000000: 0000000a 00000000 00010000 0005 01 /run/udev/control -0000000000000000: 00000007 00000000 00000000 0002 01 /dev/log -0000000000000000: 00000003 00000000 00000000 0001 03 /var/run/postgresql/.s.PGSQL.5432 -0000000000000000: 00000003 00000000 00000000 0001 03 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/xfrm_stat -Lines: 28 -XfrmInError 1 -XfrmInBufferError 2 -XfrmInHdrError 4 -XfrmInNoStates 3 -XfrmInStateProtoError 40 -XfrmInStateModeError 100 -XfrmInStateSeqError 6000 -XfrmInStateExpired 4 -XfrmInStateMismatch 23451 -XfrmInStateInvalid 55555 -XfrmInTmplMismatch 51 -XfrmInNoPols 65432 -XfrmInPolBlock 100 -XfrmInPolError 10000 -XfrmOutError 1000000 -XfrmOutBundleGenError 43321 -XfrmOutBundleCheckError 555 -XfrmOutNoStates 869 -XfrmOutStateProtoError 4542 -XfrmOutStateModeError 4 -XfrmOutStateSeqError 543 -XfrmOutStateExpired 565 -XfrmOutPolBlock 43456 -XfrmOutPolDead 7656 -XfrmOutPolError 1454 -XfrmFwdHdrError 6654 -XfrmOutStateInvalid 28765 -XfrmAcquireError 24532 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/pressure -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/pressure/cpu -Lines: 1 -some avg10=0.10 avg60=2.00 avg300=3.85 total=15 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/pressure/io -Lines: 2 -some avg10=0.10 avg60=2.00 avg300=3.85 total=15 -full avg10=0.20 avg60=3.00 avg300=4.95 total=25 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/pressure/memory -Lines: 2 -some avg10=0.10 avg60=2.00 avg300=3.85 total=15 -full avg10=0.20 avg60=3.00 avg300=4.95 total=25 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/schedstat -Lines: 6 -version 15 -timestamp 15819019232 -cpu0 498494191 0 3533438552 2553969831 3853684107 2465731542 2045936778163039 343796328169361 4767485306 -domain0 00000000,00000003 212499247 210112015 1861015 1860405436 536440 369895 32599 210079416 25368550 24241256 384652 927363878 807233 6366 1647 24239609 2122447165 1886868564 121112060 2848625533 125678146 241025 1032026 1885836538 2545 12 2533 0 0 0 0 0 0 1387952561 21076581 0 -cpu1 518377256 0 4155211005 2778589869 10466382 2867629021 1904686152592476 364107263788241 5145567945 -domain0 00000000,00000003 217653037 215526982 1577949 1580427380 557469 393576 28538 215498444 28721913 27662819 371153 870843407 745912 5523 1639 27661180 2331056874 2107732788 111442342 652402556 123615235 196159 1045245 2106687543 2400 3 2397 0 0 0 0 0 0 1437804657 26220076 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/self -SymlinkTo: 26231 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/slabinfo -Lines: 302 -slabinfo - version: 2.1 -# name : tunables : slabdata -pid_3 375 532 576 28 4 : tunables 0 0 0 : slabdata 19 19 0 -pid_2 3 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 -nvidia_p2p_page_cache 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -nvidia_pte_cache 9022 9152 368 22 2 : tunables 0 0 0 : slabdata 416 416 0 -nvidia_stack_cache 321 326 12624 2 8 : tunables 0 0 0 : slabdata 163 163 0 -kvm_async_pf 0 0 472 34 4 : tunables 0 0 0 : slabdata 0 0 0 -kvm_vcpu 0 0 15552 2 8 : tunables 0 0 0 : slabdata 0 0 0 -kvm_mmu_page_header 0 0 504 32 4 : tunables 0 0 0 : slabdata 0 0 0 -pte_list_desc 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -x86_emulator 0 0 3024 10 8 : tunables 0 0 0 : slabdata 0 0 0 -x86_fpu 0 0 4608 7 8 : tunables 0 0 0 : slabdata 0 0 0 -iwl_cmd_pool:0000:04:00.0 0 128 512 32 4 : tunables 0 0 0 : slabdata 4 4 0 -ext4_groupinfo_4k 3719 3740 480 34 4 : tunables 0 0 0 : slabdata 110 110 0 -bio-6 32 75 640 25 4 : tunables 0 0 0 : slabdata 3 3 0 -bio-5 16 48 1344 24 8 : tunables 0 0 0 : slabdata 2 2 0 -bio-4 17 92 1408 23 8 : tunables 0 0 0 : slabdata 4 4 0 -fat_inode_cache 0 0 1056 31 8 : tunables 0 0 0 : slabdata 0 0 0 -fat_cache 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -ovl_aio_req 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 -ovl_inode 0 0 1000 32 8 : tunables 0 0 0 : slabdata 0 0 0 -squashfs_inode_cache 0 0 1088 30 8 : tunables 0 0 0 : slabdata 0 0 0 -fuse_request 0 0 472 34 4 : tunables 0 0 0 : slabdata 0 0 0 -fuse_inode 0 0 1152 28 8 : tunables 0 0 0 : slabdata 0 0 0 -xfs_dqtrx 0 0 864 37 8 : tunables 0 0 0 : slabdata 0 0 0 -xfs_dquot 0 0 832 39 8 : tunables 0 0 0 : slabdata 0 0 0 -xfs_buf 0 0 768 21 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_bui_item 0 0 544 30 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_bud_item 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_cui_item 0 0 768 21 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_cud_item 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_rui_item 0 0 1024 32 8 : tunables 0 0 0 : slabdata 0 0 0 -xfs_rud_item 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_icr 0 0 520 31 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_ili 0 0 528 31 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_inode 0 0 1344 24 8 : tunables 0 0 0 : slabdata 0 0 0 -xfs_efi_item 0 0 768 21 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_efd_item 0 0 776 21 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_buf_item 0 0 608 26 4 : tunables 0 0 0 : slabdata 0 0 0 -xf_trans 0 0 568 28 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_ifork 0 0 376 21 2 : tunables 0 0 0 : slabdata 0 0 0 -xfs_da_state 0 0 816 20 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_btree_cur 0 0 560 29 4 : tunables 0 0 0 : slabdata 0 0 0 -xfs_bmap_free_item 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 -xfs_log_ticket 0 0 520 31 4 : tunables 0 0 0 : slabdata 0 0 0 -nfs_direct_cache 0 0 560 29 4 : tunables 0 0 0 : slabdata 0 0 0 -nfs_commit_data 4 28 1152 28 8 : tunables 0 0 0 : slabdata 1 1 0 -nfs_write_data 32 50 1280 25 8 : tunables 0 0 0 : slabdata 2 2 0 -nfs_read_data 0 0 1280 25 8 : tunables 0 0 0 : slabdata 0 0 0 -nfs_inode_cache 0 0 1408 23 8 : tunables 0 0 0 : slabdata 0 0 0 -nfs_page 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 -rpc_inode_cache 0 0 1024 32 8 : tunables 0 0 0 : slabdata 0 0 0 -rpc_buffers 8 13 2496 13 8 : tunables 0 0 0 : slabdata 1 1 0 -rpc_tasks 8 25 640 25 4 : tunables 0 0 0 : slabdata 1 1 0 -fscache_cookie_jar 1 35 464 35 4 : tunables 0 0 0 : slabdata 1 1 0 -jfs_mp 32 35 464 35 4 : tunables 0 0 0 : slabdata 1 1 0 -jfs_ip 0 0 1592 20 8 : tunables 0 0 0 : slabdata 0 0 0 -reiser_inode_cache 0 0 1096 29 8 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_end_io_wq 0 0 464 35 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_prelim_ref 0 0 424 38 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_delayed_extent_op 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_delayed_data_ref 0 0 448 36 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_delayed_tree_ref 0 0 440 37 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_delayed_ref_head 0 0 480 34 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_inode_defrag 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_delayed_node 0 0 648 25 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_ordered_extent 0 0 752 21 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_extent_map 0 0 480 34 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_extent_state 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 -bio-3 35 92 704 23 4 : tunables 0 0 0 : slabdata 4 4 0 -btrfs_extent_buffer 0 0 600 27 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_free_space_bitmap 0 0 12288 2 8 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_free_space 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_path 0 0 448 36 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_trans_handle 0 0 440 37 4 : tunables 0 0 0 : slabdata 0 0 0 -btrfs_inode 0 0 1496 21 8 : tunables 0 0 0 : slabdata 0 0 0 -ext4_inode_cache 84136 84755 1400 23 8 : tunables 0 0 0 : slabdata 3685 3685 0 -ext4_free_data 22 80 392 20 2 : tunables 0 0 0 : slabdata 4 4 0 -ext4_allocation_context 0 70 464 35 4 : tunables 0 0 0 : slabdata 2 2 0 -ext4_prealloc_space 24 74 440 37 4 : tunables 0 0 0 : slabdata 2 2 0 -ext4_system_zone 267 273 376 21 2 : tunables 0 0 0 : slabdata 13 13 0 -ext4_io_end_vec 0 88 368 22 2 : tunables 0 0 0 : slabdata 4 4 0 -ext4_io_end 0 80 400 20 2 : tunables 0 0 0 : slabdata 4 4 0 -ext4_bio_post_read_ctx 128 147 384 21 2 : tunables 0 0 0 : slabdata 7 7 0 -ext4_pending_reservation 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -ext4_extent_status 79351 79422 376 21 2 : tunables 0 0 0 : slabdata 3782 3782 0 -jbd2_transaction_s 44 100 640 25 4 : tunables 0 0 0 : slabdata 4 4 0 -jbd2_inode 6785 6840 400 20 2 : tunables 0 0 0 : slabdata 342 342 0 -jbd2_journal_handle 0 80 392 20 2 : tunables 0 0 0 : slabdata 4 4 0 -jbd2_journal_head 824 1944 448 36 4 : tunables 0 0 0 : slabdata 54 54 0 -jbd2_revoke_table_s 4 23 352 23 2 : tunables 0 0 0 : slabdata 1 1 0 -jbd2_revoke_record_s 0 156 416 39 4 : tunables 0 0 0 : slabdata 4 4 0 -ext2_inode_cache 0 0 1144 28 8 : tunables 0 0 0 : slabdata 0 0 0 -mbcache 0 0 392 20 2 : tunables 0 0 0 : slabdata 0 0 0 -dm_thin_new_mapping 0 152 424 38 4 : tunables 0 0 0 : slabdata 4 4 0 -dm_snap_pending_exception 0 0 464 35 4 : tunables 0 0 0 : slabdata 0 0 0 -dm_exception 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -dm_dirty_log_flush_entry 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -dm_bio_prison_cell_v2 0 0 432 37 4 : tunables 0 0 0 : slabdata 0 0 0 -dm_bio_prison_cell 0 148 432 37 4 : tunables 0 0 0 : slabdata 4 4 0 -kcopyd_job 0 8 3648 8 8 : tunables 0 0 0 : slabdata 1 1 0 -io 0 32 512 32 4 : tunables 0 0 0 : slabdata 1 1 0 -dm_uevent 0 0 3224 10 8 : tunables 0 0 0 : slabdata 0 0 0 -dax_cache 1 28 1152 28 8 : tunables 0 0 0 : slabdata 1 1 0 -aic94xx_ascb 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 -aic94xx_dma_token 0 0 384 21 2 : tunables 0 0 0 : slabdata 0 0 0 -asd_sas_event 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 -sas_task 0 0 704 23 4 : tunables 0 0 0 : slabdata 0 0 0 -qla2xxx_srbs 0 0 832 39 8 : tunables 0 0 0 : slabdata 0 0 0 -sd_ext_cdb 2 22 368 22 2 : tunables 0 0 0 : slabdata 1 1 0 -scsi_sense_cache 258 288 512 32 4 : tunables 0 0 0 : slabdata 9 9 0 -virtio_scsi_cmd 64 75 640 25 4 : tunables 0 0 0 : slabdata 3 3 0 -L2TP/IPv6 0 0 1536 21 8 : tunables 0 0 0 : slabdata 0 0 0 -L2TP/IP 0 0 1408 23 8 : tunables 0 0 0 : slabdata 0 0 0 -ip6-frags 0 0 520 31 4 : tunables 0 0 0 : slabdata 0 0 0 -fib6_nodes 5 32 512 32 4 : tunables 0 0 0 : slabdata 1 1 0 -ip6_dst_cache 4 25 640 25 4 : tunables 0 0 0 : slabdata 1 1 0 -ip6_mrt_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 -PINGv6 0 0 1600 20 8 : tunables 0 0 0 : slabdata 0 0 0 -RAWv6 25 40 1600 20 8 : tunables 0 0 0 : slabdata 2 2 0 -UDPLITEv6 0 0 1728 18 8 : tunables 0 0 0 : slabdata 0 0 0 -UDPv6 3 54 1728 18 8 : tunables 0 0 0 : slabdata 3 3 0 -tw_sock_TCPv6 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 -request_sock_TCPv6 0 0 632 25 4 : tunables 0 0 0 : slabdata 0 0 0 -TCPv6 0 33 2752 11 8 : tunables 0 0 0 : slabdata 3 3 0 -uhci_urb_priv 0 0 392 20 2 : tunables 0 0 0 : slabdata 0 0 0 -sgpool-128 2 14 4544 7 8 : tunables 0 0 0 : slabdata 2 2 0 -sgpool-64 2 13 2496 13 8 : tunables 0 0 0 : slabdata 1 1 0 -sgpool-32 2 44 1472 22 8 : tunables 0 0 0 : slabdata 2 2 0 -sgpool-16 2 68 960 34 8 : tunables 0 0 0 : slabdata 2 2 0 -sgpool-8 2 46 704 23 4 : tunables 0 0 0 : slabdata 2 2 0 -btree_node 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 -bfq_io_cq 0 0 488 33 4 : tunables 0 0 0 : slabdata 0 0 0 -bfq_queue 0 0 848 38 8 : tunables 0 0 0 : slabdata 0 0 0 -mqueue_inode_cache 1 24 1344 24 8 : tunables 0 0 0 : slabdata 1 1 0 -isofs_inode_cache 0 0 968 33 8 : tunables 0 0 0 : slabdata 0 0 0 -io_kiocb 0 0 640 25 4 : tunables 0 0 0 : slabdata 0 0 0 -kioctx 0 30 1088 30 8 : tunables 0 0 0 : slabdata 1 1 0 -aio_kiocb 0 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 -userfaultfd_ctx_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 -fanotify_path_event 0 0 392 20 2 : tunables 0 0 0 : slabdata 0 0 0 -fanotify_fid_event 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 -fsnotify_mark 0 0 408 20 2 : tunables 0 0 0 : slabdata 0 0 0 -dnotify_mark 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 -dnotify_struct 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -dio 0 0 1088 30 8 : tunables 0 0 0 : slabdata 0 0 0 -bio-2 4 25 640 25 4 : tunables 0 0 0 : slabdata 1 1 0 -fasync_cache 0 0 384 21 2 : tunables 0 0 0 : slabdata 0 0 0 -audit_tree_mark 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 -pid_namespace 30 34 480 34 4 : tunables 0 0 0 : slabdata 1 1 0 -posix_timers_cache 0 27 592 27 4 : tunables 0 0 0 : slabdata 1 1 0 -iommu_devinfo 24 32 512 32 4 : tunables 0 0 0 : slabdata 1 1 0 -iommu_domain 10 10 3264 10 8 : tunables 0 0 0 : slabdata 1 1 0 -iommu_iova 8682 8748 448 36 4 : tunables 0 0 0 : slabdata 243 243 0 -UNIX 529 814 1472 22 8 : tunables 0 0 0 : slabdata 37 37 0 -ip4-frags 0 0 536 30 4 : tunables 0 0 0 : slabdata 0 0 0 -ip_mrt_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 -UDP-Lite 0 0 1536 21 8 : tunables 0 0 0 : slabdata 0 0 0 -tcp_bind_bucket 7 128 512 32 4 : tunables 0 0 0 : slabdata 4 4 0 -inet_peer_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 -xfrm_dst_cache 0 0 704 23 4 : tunables 0 0 0 : slabdata 0 0 0 -xfrm_state 0 0 1152 28 8 : tunables 0 0 0 : slabdata 0 0 0 -ip_fib_trie 7 21 384 21 2 : tunables 0 0 0 : slabdata 1 1 0 -ip_fib_alias 9 20 392 20 2 : tunables 0 0 0 : slabdata 1 1 0 -ip_dst_cache 27 84 576 28 4 : tunables 0 0 0 : slabdata 3 3 0 -PING 0 0 1408 23 8 : tunables 0 0 0 : slabdata 0 0 0 -RAW 32 46 1408 23 8 : tunables 0 0 0 : slabdata 2 2 0 -UDP 11 168 1536 21 8 : tunables 0 0 0 : slabdata 8 8 0 -tw_sock_TCP 1 56 576 28 4 : tunables 0 0 0 : slabdata 2 2 0 -request_sock_TCP 0 25 632 25 4 : tunables 0 0 0 : slabdata 1 1 0 -TCP 10 60 2624 12 8 : tunables 0 0 0 : slabdata 5 5 0 -hugetlbfs_inode_cache 2 35 928 35 8 : tunables 0 0 0 : slabdata 1 1 0 -dquot 0 0 640 25 4 : tunables 0 0 0 : slabdata 0 0 0 -bio-1 32 46 704 23 4 : tunables 0 0 0 : slabdata 2 2 0 -eventpoll_pwq 409 600 408 20 2 : tunables 0 0 0 : slabdata 30 30 0 -eventpoll_epi 408 672 576 28 4 : tunables 0 0 0 : slabdata 24 24 0 -inotify_inode_mark 58 195 416 39 4 : tunables 0 0 0 : slabdata 5 5 0 -scsi_data_buffer 0 0 360 22 2 : tunables 0 0 0 : slabdata 0 0 0 -bio_crypt_ctx 128 147 376 21 2 : tunables 0 0 0 : slabdata 7 7 0 -request_queue 29 39 2408 13 8 : tunables 0 0 0 : slabdata 3 3 0 -blkdev_ioc 81 148 440 37 4 : tunables 0 0 0 : slabdata 4 4 0 -bio-0 125 200 640 25 4 : tunables 0 0 0 : slabdata 8 8 0 -biovec-max 166 196 4544 7 8 : tunables 0 0 0 : slabdata 28 28 0 -biovec-128 0 52 2496 13 8 : tunables 0 0 0 : slabdata 4 4 0 -biovec-64 0 88 1472 22 8 : tunables 0 0 0 : slabdata 4 4 0 -biovec-16 0 92 704 23 4 : tunables 0 0 0 : slabdata 4 4 0 -bio_integrity_payload 4 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 -khugepaged_mm_slot 59 180 448 36 4 : tunables 0 0 0 : slabdata 5 5 0 -ksm_mm_slot 0 0 384 21 2 : tunables 0 0 0 : slabdata 0 0 0 -ksm_stable_node 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 -ksm_rmap_item 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 -user_namespace 2 37 864 37 8 : tunables 0 0 0 : slabdata 1 1 0 -uid_cache 5 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 -dmaengine-unmap-256 1 13 2496 13 8 : tunables 0 0 0 : slabdata 1 1 0 -dmaengine-unmap-128 1 22 1472 22 8 : tunables 0 0 0 : slabdata 1 1 0 -dmaengine-unmap-16 1 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 -dmaengine-unmap-2 1 36 448 36 4 : tunables 0 0 0 : slabdata 1 1 0 -audit_buffer 0 22 360 22 2 : tunables 0 0 0 : slabdata 1 1 0 -sock_inode_cache 663 1170 1216 26 8 : tunables 0 0 0 : slabdata 45 45 0 -skbuff_ext_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 -skbuff_fclone_cache 1 72 896 36 8 : tunables 0 0 0 : slabdata 2 2 0 -skbuff_head_cache 3 650 640 25 4 : tunables 0 0 0 : slabdata 26 26 0 -configfs_dir_cache 7 38 424 38 4 : tunables 0 0 0 : slabdata 1 1 0 -file_lock_cache 27 116 552 29 4 : tunables 0 0 0 : slabdata 4 4 0 -file_lock_ctx 106 120 392 20 2 : tunables 0 0 0 : slabdata 6 6 0 -fsnotify_mark_connector 52 66 368 22 2 : tunables 0 0 0 : slabdata 3 3 0 -net_namespace 1 6 5312 6 8 : tunables 0 0 0 : slabdata 1 1 0 -task_delay_info 784 1560 416 39 4 : tunables 0 0 0 : slabdata 40 40 0 -taskstats 45 92 688 23 4 : tunables 0 0 0 : slabdata 4 4 0 -proc_dir_entry 678 682 528 31 4 : tunables 0 0 0 : slabdata 22 22 0 -pde_opener 0 189 376 21 2 : tunables 0 0 0 : slabdata 9 9 0 -proc_inode_cache 7150 8250 992 33 8 : tunables 0 0 0 : slabdata 250 250 0 -seq_file 60 735 456 35 4 : tunables 0 0 0 : slabdata 21 21 0 -sigqueue 0 156 416 39 4 : tunables 0 0 0 : slabdata 4 4 0 -bdev_cache 36 78 1216 26 8 : tunables 0 0 0 : slabdata 3 3 0 -shmem_inode_cache 1599 2208 1016 32 8 : tunables 0 0 0 : slabdata 69 69 0 -kernfs_iattrs_cache 1251 1254 424 38 4 : tunables 0 0 0 : slabdata 33 33 0 -kernfs_node_cache 52898 52920 464 35 4 : tunables 0 0 0 : slabdata 1512 1512 0 -mnt_cache 42 46 704 23 4 : tunables 0 0 0 : slabdata 2 2 0 -filp 4314 6371 704 23 4 : tunables 0 0 0 : slabdata 277 277 0 -inode_cache 28695 29505 920 35 8 : tunables 0 0 0 : slabdata 843 843 0 -dentry 166069 169074 528 31 4 : tunables 0 0 0 : slabdata 5454 5454 0 -names_cache 0 35 4544 7 8 : tunables 0 0 0 : slabdata 5 5 0 -hashtab_node 0 0 360 22 2 : tunables 0 0 0 : slabdata 0 0 0 -ebitmap_node 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 -avtab_extended_perms 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -avtab_node 0 0 360 22 2 : tunables 0 0 0 : slabdata 0 0 0 -avc_xperms_data 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -avc_xperms_decision_node 0 0 384 21 2 : tunables 0 0 0 : slabdata 0 0 0 -avc_xperms_node 0 0 392 20 2 : tunables 0 0 0 : slabdata 0 0 0 -avc_node 37 40 408 20 2 : tunables 0 0 0 : slabdata 2 2 0 -iint_cache 0 0 448 36 4 : tunables 0 0 0 : slabdata 0 0 0 -lsm_inode_cache 122284 122340 392 20 2 : tunables 0 0 0 : slabdata 6117 6117 0 -lsm_file_cache 4266 4485 352 23 2 : tunables 0 0 0 : slabdata 195 195 0 -key_jar 8 25 640 25 4 : tunables 0 0 0 : slabdata 1 1 0 -buffer_head 255622 257076 440 37 4 : tunables 0 0 0 : slabdata 6948 6948 0 -uts_namespace 0 0 776 21 4 : tunables 0 0 0 : slabdata 0 0 0 -nsproxy 31 40 408 20 2 : tunables 0 0 0 : slabdata 2 2 0 -vm_area_struct 39115 43214 528 31 4 : tunables 0 0 0 : slabdata 1394 1394 0 -mm_struct 96 529 1408 23 8 : tunables 0 0 0 : slabdata 23 23 0 -fs_cache 102 756 448 36 4 : tunables 0 0 0 : slabdata 21 21 0 -files_cache 102 588 1152 28 8 : tunables 0 0 0 : slabdata 21 21 0 -signal_cache 266 672 1536 21 8 : tunables 0 0 0 : slabdata 32 32 0 -sighand_cache 266 507 2496 13 8 : tunables 0 0 0 : slabdata 39 39 0 -task_struct 783 963 10240 3 8 : tunables 0 0 0 : slabdata 321 321 0 -cred_jar 364 952 576 28 4 : tunables 0 0 0 : slabdata 34 34 0 -anon_vma_chain 63907 67821 416 39 4 : tunables 0 0 0 : slabdata 1739 1739 0 -anon_vma 25891 28899 416 39 4 : tunables 0 0 0 : slabdata 741 741 0 -pid 408 992 512 32 4 : tunables 0 0 0 : slabdata 31 31 0 -Acpi-Operand 6682 6740 408 20 2 : tunables 0 0 0 : slabdata 337 337 0 -Acpi-ParseExt 0 39 416 39 4 : tunables 0 0 0 : slabdata 1 1 0 -Acpi-Parse 0 80 392 20 2 : tunables 0 0 0 : slabdata 4 4 0 -Acpi-State 0 78 416 39 4 : tunables 0 0 0 : slabdata 2 2 0 -Acpi-Namespace 3911 3948 384 21 2 : tunables 0 0 0 : slabdata 188 188 0 -trace_event_file 2638 2660 424 38 4 : tunables 0 0 0 : slabdata 70 70 0 -ftrace_event_field 6592 6594 384 21 2 : tunables 0 0 0 : slabdata 314 314 0 -pool_workqueue 41 64 1024 32 8 : tunables 0 0 0 : slabdata 2 2 0 -radix_tree_node 21638 24045 912 35 8 : tunables 0 0 0 : slabdata 687 687 0 -task_group 48 78 1216 26 8 : tunables 0 0 0 : slabdata 3 3 0 -vmap_area 4411 4680 400 20 2 : tunables 0 0 0 : slabdata 234 234 0 -dma-kmalloc-8k 0 0 24576 1 8 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-4k 0 0 12288 2 8 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-2k 0 0 6144 5 8 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-1k 0 0 3072 10 8 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-512 0 0 1536 21 8 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-256 0 0 1024 32 8 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-128 0 0 640 25 4 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-64 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-32 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-16 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-8 0 0 344 23 2 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-192 0 0 528 31 4 : tunables 0 0 0 : slabdata 0 0 0 -dma-kmalloc-96 0 0 432 37 4 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-8k 0 0 24576 1 8 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-4k 0 0 12288 2 8 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-2k 0 0 6144 5 8 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-1k 0 0 3072 10 8 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-512 0 0 1536 21 8 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-256 0 0 1024 32 8 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-192 0 0 528 31 4 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-128 31 75 640 25 4 : tunables 0 0 0 : slabdata 3 3 0 -kmalloc-rcl-96 3371 3626 432 37 4 : tunables 0 0 0 : slabdata 98 98 0 -kmalloc-rcl-64 2080 2272 512 32 4 : tunables 0 0 0 : slabdata 71 71 0 -kmalloc-rcl-32 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-16 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-rcl-8 0 0 344 23 2 : tunables 0 0 0 : slabdata 0 0 0 -kmalloc-8k 133 140 24576 1 8 : tunables 0 0 0 : slabdata 140 140 0 -kmalloc-4k 403 444 12288 2 8 : tunables 0 0 0 : slabdata 222 222 0 -kmalloc-2k 2391 2585 6144 5 8 : tunables 0 0 0 : slabdata 517 517 0 -kmalloc-1k 2163 2420 3072 10 8 : tunables 0 0 0 : slabdata 242 242 0 -kmalloc-512 2972 3633 1536 21 8 : tunables 0 0 0 : slabdata 173 173 0 -kmalloc-256 1841 1856 1024 32 8 : tunables 0 0 0 : slabdata 58 58 0 -kmalloc-192 2165 2914 528 31 4 : tunables 0 0 0 : slabdata 94 94 0 -kmalloc-128 1137 1175 640 25 4 : tunables 0 0 0 : slabdata 47 47 0 -kmalloc-96 1925 2590 432 37 4 : tunables 0 0 0 : slabdata 70 70 0 -kmalloc-64 9433 10688 512 32 4 : tunables 0 0 0 : slabdata 334 334 0 -kmalloc-32 9098 10062 416 39 4 : tunables 0 0 0 : slabdata 258 258 0 -kmalloc-16 10914 10956 368 22 2 : tunables 0 0 0 : slabdata 498 498 0 -kmalloc-8 7576 7705 344 23 2 : tunables 0 0 0 : slabdata 335 335 0 -kmem_cache_node 904 928 512 32 4 : tunables 0 0 0 : slabdata 29 29 0 -kmem_cache 904 936 832 39 8 : tunables 0 0 0 : slabdata 24 24 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/stat -Lines: 16 -cpu 301854 612 111922 8979004 3552 2 3944 0 0 0 -cpu0 44490 19 21045 1087069 220 1 3410 0 0 0 -cpu1 47869 23 16474 1110787 591 0 46 0 0 0 -cpu2 46504 36 15916 1112321 441 0 326 0 0 0 -cpu3 47054 102 15683 1113230 533 0 60 0 0 0 -cpu4 28413 25 10776 1140321 217 0 8 0 0 0 -cpu5 29271 101 11586 1136270 672 0 30 0 0 0 -cpu6 29152 36 10276 1139721 319 0 29 0 0 0 -cpu7 29098 268 10164 1139282 555 0 31 0 0 0 -intr 8885917 17 0 0 0 0 0 0 0 1 79281 0 0 0 0 0 0 0 231237 0 0 0 0 250586 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223424 190745 13 906 1283803 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -ctxt 38014093 -btime 1418183276 -processes 26442 -procs_running 2 -procs_blocked 1 -softirq 5057579 250191 1481983 1647 211099 186066 0 1783454 622196 12499 508444 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/swaps -Lines: 2 -Filename Type Size Used Priority -/dev/dm-2 partition 131068 176 -2 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/symlinktargets -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/README -Lines: 2 -This directory contains some empty files that are the symlinks the files in the "fd" directory point to. -They are otherwise ignored by the tests -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/abc -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/def -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/ghi -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/uvw -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/xyz -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/sys -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/sys/kernel -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/sys/kernel/random -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/kernel/random/entropy_avail -Lines: 1 -3943 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/kernel/random/poolsize -Lines: 1 -4096 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/kernel/random/urandom_min_reseed_secs -Lines: 1 -60 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/kernel/random/write_wakeup_threshold -Lines: 1 -3072 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/sys/vm -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/admin_reserve_kbytes -Lines: 1 -8192 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/block_dump -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/compact_unevictable_allowed -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_background_bytes -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_background_ratio -Lines: 1 -10 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_bytes -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_expire_centisecs -Lines: 1 -3000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_ratio -Lines: 1 -20 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_writeback_centisecs -Lines: 1 -500 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirtytime_expire_seconds -Lines: 1 -43200 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/drop_caches -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/extfrag_threshold -Lines: 1 -500 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/hugetlb_shm_group -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/laptop_mode -Lines: 1 -5 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/legacy_va_layout -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/lowmem_reserve_ratio -Lines: 1 -256 256 32 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/max_map_count -Lines: 1 -65530 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/memory_failure_early_kill -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/memory_failure_recovery -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/min_free_kbytes -Lines: 1 -67584 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/min_slab_ratio -Lines: 1 -5 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/min_unmapped_ratio -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/mmap_min_addr -Lines: 1 -65536 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/nr_hugepages -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/nr_hugepages_mempolicy -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/nr_overcommit_hugepages -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/numa_stat -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/numa_zonelist_order -Lines: 1 -Node -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/oom_dump_tasks -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/oom_kill_allocating_task -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/overcommit_kbytes -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/overcommit_memory -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/overcommit_ratio -Lines: 1 -50 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/page-cluster -Lines: 1 -3 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/panic_on_oom -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/percpu_pagelist_fraction -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/stat_interval -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/swappiness -Lines: 1 -60 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/user_reserve_kbytes -Lines: 1 -131072 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/vfs_cache_pressure -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/watermark_boost_factor -Lines: 1 -15000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/watermark_scale_factor -Lines: 1 -10 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/zone_reclaim_mode -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/zoneinfo -Lines: 262 -Node 0, zone DMA - per-node stats - nr_inactive_anon 230981 - nr_active_anon 547580 - nr_inactive_file 316904 - nr_active_file 346282 - nr_unevictable 115467 - nr_slab_reclaimable 131220 - nr_slab_unreclaimable 47320 - nr_isolated_anon 0 - nr_isolated_file 0 - workingset_nodes 11627 - workingset_refault 466886 - workingset_activate 276925 - workingset_restore 84055 - workingset_nodereclaim 487 - nr_anon_pages 795576 - nr_mapped 215483 - nr_file_pages 761874 - nr_dirty 908 - nr_writeback 0 - nr_writeback_temp 0 - nr_shmem 224925 - nr_shmem_hugepages 0 - nr_shmem_pmdmapped 0 - nr_anon_transparent_hugepages 0 - nr_unstable 0 - nr_vmscan_write 12950 - nr_vmscan_immediate_reclaim 3033 - nr_dirtied 8007423 - nr_written 7752121 - nr_kernel_misc_reclaimable 0 - pages free 3952 - min 33 - low 41 - high 49 - spanned 4095 - present 3975 - managed 3956 - protection: (0, 2877, 7826, 7826, 7826) - nr_free_pages 3952 - nr_zone_inactive_anon 0 - nr_zone_active_anon 0 - nr_zone_inactive_file 0 - nr_zone_active_file 0 - nr_zone_unevictable 0 - nr_zone_write_pending 0 - nr_mlock 0 - nr_page_table_pages 0 - nr_kernel_stack 0 - nr_bounce 0 - nr_zspages 0 - nr_free_cma 0 - numa_hit 1 - numa_miss 0 - numa_foreign 0 - numa_interleave 0 - numa_local 1 - numa_other 0 - pagesets - cpu: 0 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 1 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 2 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 3 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 4 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 5 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 6 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 7 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - node_unreclaimable: 0 - start_pfn: 1 -Node 0, zone DMA32 - pages free 204252 - min 19510 - low 21059 - high 22608 - spanned 1044480 - present 759231 - managed 742806 - protection: (0, 0, 4949, 4949, 4949) - nr_free_pages 204252 - nr_zone_inactive_anon 118558 - nr_zone_active_anon 106598 - nr_zone_inactive_file 75475 - nr_zone_active_file 70293 - nr_zone_unevictable 66195 - nr_zone_write_pending 64 - nr_mlock 4 - nr_page_table_pages 1756 - nr_kernel_stack 2208 - nr_bounce 0 - nr_zspages 0 - nr_free_cma 0 - numa_hit 113952967 - numa_miss 0 - numa_foreign 0 - numa_interleave 0 - numa_local 113952967 - numa_other 0 - pagesets - cpu: 0 - count: 345 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 1 - count: 356 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 2 - count: 325 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 3 - count: 346 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 4 - count: 321 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 5 - count: 316 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 6 - count: 373 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 7 - count: 339 - high: 378 - batch: 63 - vm stats threshold: 48 - node_unreclaimable: 0 - start_pfn: 4096 -Node 0, zone Normal - pages free 18553 - min 11176 - low 13842 - high 16508 - spanned 1308160 - present 1308160 - managed 1268711 - protection: (0, 0, 0, 0, 0) - nr_free_pages 18553 - nr_zone_inactive_anon 112423 - nr_zone_active_anon 440982 - nr_zone_inactive_file 241429 - nr_zone_active_file 275989 - nr_zone_unevictable 49272 - nr_zone_write_pending 844 - nr_mlock 154 - nr_page_table_pages 9750 - nr_kernel_stack 15136 - nr_bounce 0 - nr_zspages 0 - nr_free_cma 0 - numa_hit 162718019 - numa_miss 0 - numa_foreign 0 - numa_interleave 26812 - numa_local 162718019 - numa_other 0 - pagesets - cpu: 0 - count: 316 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 1 - count: 366 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 2 - count: 60 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 3 - count: 256 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 4 - count: 253 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 5 - count: 159 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 6 - count: 311 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 7 - count: 264 - high: 378 - batch: 63 - vm stats threshold: 56 - node_unreclaimable: 0 - start_pfn: 1048576 -Node 0, zone Movable - pages free 0 - min 0 - low 0 - high 0 - spanned 0 - present 0 - managed 0 - protection: (0, 0, 0, 0, 0) -Node 0, zone Device - pages free 0 - min 0 - low 0 - high 0 - spanned 0 - present 0 - managed 0 - protection: (0, 0, 0, 0, 0) -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/block -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/block/dm-0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/dm-0/stat -Lines: 1 -6447303 0 710266738 1529043 953216 0 31201176 4557464 0 796160 6088971 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/block/sda -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/block/sda/queue -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/add_random -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/chunk_sectors -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/dax -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/discard_granularity -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/discard_max_bytes -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/discard_max_hw_bytes -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/discard_zeroes_data -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/fua -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/hw_sector_size -Lines: 1 -512 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/io_poll -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/io_poll_delay -Lines: 1 --1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/io_timeout -Lines: 1 -30000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/block/sda/queue/iosched -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/back_seek_max -Lines: 1 -16384 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/back_seek_penalty -Lines: 1 -2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/fifo_expire_async -Lines: 1 -250 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/fifo_expire_sync -Lines: 1 -125 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/low_latency -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/max_budget -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/slice_idle -Lines: 1 -8 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/slice_idle_us -Lines: 1 -8000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/strict_guarantees -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iosched/timeout_sync -Lines: 1 -125 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/iostats -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/logical_block_size -Lines: 1 -512 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/max_discard_segments -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/max_hw_sectors_kb -Lines: 1 -32767 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/max_integrity_segments -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/max_sectors_kb -Lines: 1 -1280 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/max_segment_size -Lines: 1 -65536 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/max_segments -Lines: 1 -168 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/minimum_io_size -Lines: 1 -512 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/nomerges -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/nr_requests -Lines: 1 -64 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/nr_zones -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/optimal_io_size -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/physical_block_size -Lines: 1 -512 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/read_ahead_kb -Lines: 1 -128 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/rotational -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/rq_affinity -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/scheduler -Lines: 1 -mq-deadline kyber [bfq] none -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/wbt_lat_usec -Lines: 1 -75000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/write_cache -Lines: 1 -write back -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/write_same_max_bytes -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/write_zeroes_max_bytes -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/queue/zoned -Lines: 1 -none -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/stat -Lines: 1 -9652963 396792 759304206 412943 8422549 6731723 286915323 13947418 0 5658367 19174573 1 2 3 12 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/drm -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/drm/card0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/drm/card0/device -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/aer_dev_correctable -Lines: 9 -RxErr 0 -BadTLP 0 -BadDLLP 0 -Rollover 0 -Timeout 0 -NonFatalErr 0 -CorrIntErr 0 -HeaderOF 0 -TOTAL_ERR_COR 0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/aer_dev_fatal -Lines: 19 -Undefined 0 -DLP 0 -SDES 0 -TLP 0 -FCP 0 -CmpltTO 0 -CmpltAbrt 0 -UnxCmplt 0 -RxOF 0 -MalfTLP 0 -ECRC 0 -UnsupReq 0 -ACSViol 0 -UncorrIntErr 0 -BlockedTLP 0 -AtomicOpBlocked 0 -TLPBlockedErr 0 -PoisonTLPBlocked 0 -TOTAL_ERR_FATAL 0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/aer_dev_nonfatal -Lines: 19 -Undefined 0 -DLP 0 -SDES 0 -TLP 0 -FCP 0 -CmpltTO 0 -CmpltAbrt 0 -UnxCmplt 0 -RxOF 0 -MalfTLP 0 -ECRC 0 -UnsupReq 0 -ACSViol 0 -UncorrIntErr 0 -BlockedTLP 0 -AtomicOpBlocked 0 -TLPBlockedErr 0 -PoisonTLPBlocked 0 -TOTAL_ERR_NONFATAL 0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/ari_enabled -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/boot_vga -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/broken_parity_status -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/class -Lines: 1 -0x030000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/consistent_dma_mask_bits -Lines: 1 -44 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/current_link_speed -Lines: 1 -8.0 GT/s PCIe -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/current_link_width -Lines: 1 -16 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/d3cold_allowed -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/device -Lines: 1 -0x687f -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/dma_mask_bits -Lines: 1 -44 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/driver_override -Lines: 1 -(null) -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/gpu_busy_percent -Lines: 1 -4 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/irq -Lines: 1 -95 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/local_cpulist -Lines: 1 -0-15 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/local_cpus -Lines: 1 -0000ffff -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/max_link_speed -Lines: 1 -8.0 GT/s PCIe -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/max_link_width -Lines: 1 -16 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/mem_info_gtt_total -Lines: 1 -8573157376 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/mem_info_gtt_used -Lines: 1 -144560128 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/mem_info_vis_vram_total -Lines: 1 -8573157376 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/mem_info_vis_vram_used -Lines: 1 -1490378752 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/mem_info_vram_total -Lines: 1 -8573157376 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/mem_info_vram_used -Lines: 1 -1490378752 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/mem_info_vram_vendor -Lines: 1 -samsung -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/modalias -Lines: 1 -pci:v00001002d0000687Fsv00001043sd000004C4bc03sc00i00 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/msi_bus -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/numa_node -Lines: 1 --1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pcie_bw -Lines: 1 -6641 815 256 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pcie_replay_count -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/power_dpm_force_performance_level -Lines: 1 -manual -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/power_dpm_state -Lines: 1 -performance -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/power_state -Lines: 1 -D0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_cur_state -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_dpm_dcefclk -Lines: 5 -0: 600Mhz * -1: 720Mhz -2: 800Mhz -3: 847Mhz -4: 900Mhz -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_dpm_mclk -Lines: 4 -0: 167Mhz * -1: 500Mhz -2: 800Mhz -3: 945Mhz -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_dpm_pcie -Lines: 2 -0: 8.0GT/s, x16 -1: 8.0GT/s, x16 * -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_dpm_sclk -Lines: 8 -0: 852Mhz * -1: 991Mhz -2: 1084Mhz -3: 1138Mhz -4: 1200Mhz -5: 1401Mhz -6: 1536Mhz -7: 1630Mhz -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_dpm_socclk -Lines: 8 -0: 600Mhz -1: 720Mhz * -2: 800Mhz -3: 847Mhz -4: 900Mhz -5: 960Mhz -6: 1028Mhz -7: 1107Mhz -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_features -Lines: 32 -Current ppfeatures: 0x0000000019a1ff4f -FEATURES BITMASK ENABLEMENT -DPM_PREFETCHER 0x0000000000000001 Y -GFXCLK_DPM 0x0000000000000002 Y -UCLK_DPM 0x0000000000000004 Y -SOCCLK_DPM 0x0000000000000008 Y -UVD_DPM 0x0000000000000010 N -VCE_DPM 0x0000000000000020 N -ULV 0x0000000000000040 Y -MP0CLK_DPM 0x0000000000000080 N -LINK_DPM 0x0000000000000100 Y -DCEFCLK_DPM 0x0000000000000200 Y -AVFS 0x0000000000000400 Y -GFXCLK_DS 0x0000000000000800 Y -SOCCLK_DS 0x0000000000001000 Y -LCLK_DS 0x0000000000002000 Y -PPT 0x0000000000004000 Y -TDC 0x0000000000008000 Y -THERMAL 0x0000000000010000 Y -GFX_PER_CU_CG 0x0000000000020000 N -RM 0x0000000000040000 N -DCEFCLK_DS 0x0000000000080000 N -ACDC 0x0000000000100000 N -VR0HOT 0x0000000000200000 Y -VR1HOT 0x0000000000400000 N -FW_CTF 0x0000000000800000 Y -LED_DISPLAY 0x0000000001000000 Y -FAN_CONTROL 0x0000000002000000 N -FAST_PPT 0x0000000004000000 N -DIDT 0x0000000008000000 Y -ACG 0x0000000010000000 Y -PCC_LIMIT 0x0000000020000000 N -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_force_state -Lines: 1 - -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_mclk_od -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_num_states -Lines: 3 -states: 2 -0 boot -1 performance -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_od_clk_voltage -Lines: 18 -OD_SCLK: -0: 852Mhz 800mV -1: 991Mhz 900mV -2: 1084Mhz 950mV -3: 1138Mhz 1000mV -4: 1200Mhz 1050mV -5: 1401Mhz 1100mV -6: 1536Mhz 1150mV -7: 1630Mhz 1200mV -OD_MCLK: -0: 167Mhz 800mV -1: 500Mhz 800mV -2: 800Mhz 950mV -3: 945Mhz 1100mV -OD_RANGE: -SCLK: 852MHz 2400MHz -MCLK: 167MHz 1500MHz -VDDC: 800mV 1200mV -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_power_profile_mode -Lines: 8 -NUM MODE_NAME BUSY_SET_POINT FPS USE_RLC_BUSY MIN_ACTIVE_LEVEL - 0 BOOTUP_DEFAULT : 70 60 0 0 - 1 3D_FULL_SCREEN*: 70 60 1 3 - 2 POWER_SAVING : 90 60 0 0 - 3 VIDEO : 70 60 0 0 - 4 VR : 70 90 0 0 - 5 COMPUTE : 30 60 0 6 - 6 CUSTOM : 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/pp_sclk_od -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/product_name -Lines: 1 - -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/product_number -Lines: 1 - -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/resource -Lines: 13 -0x0000007c00000000 0x0000007dffffffff 0x000000000014220c -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000007e00000000 0x0000007e0fffffff 0x000000000014220c -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x000000000000d000 0x000000000000d0ff 0x0000000000040101 -0x00000000fcd00000 0x00000000fcd7ffff 0x0000000000040200 -0x00000000fcd80000 0x00000000fcd9ffff 0x0000000000046200 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/revision -Lines: 1 -0xc1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/serial_number -Lines: 1 - -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/subsystem_device -Lines: 1 -0x04c4 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/subsystem_vendor -Lines: 1 -0x1043 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/thermal_throttling_logging -Lines: 1 -0000:09:00.0: thermal throttling logging enabled, with interval 60 seconds -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/uevent -Lines: 6 -DRIVER=amdgpu -PCI_CLASS=30000 -PCI_ID=1002:687F -PCI_SUBSYS_ID=1043:04C4 -PCI_SLOT_NAME=0000:09:00.0 -MODALIAS=pci:v00001002d0000687Fsv00001043sd000004C4bc03sc00i00 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/unique_id -Lines: 1 -0123456789abcdef -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/vbios_version -Lines: 1 -115-D050PIL-100 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/drm/card0/device/vendor -Lines: 1 -0x1002 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/fc_host -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/fc_host/host0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/dev_loss_tmo -Lines: 1 -30 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/fabric_name -Lines: 1 -0x0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/node_name -Lines: 1 -0x2000e0071bce95f2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/port_id -Lines: 1 -0x000002 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/port_name -Lines: 1 -0x1000e0071bce95f2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/port_state -Lines: 1 -Online -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/port_type -Lines: 1 -Point-To-Point (direct nport connection) -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/speed -Lines: 1 -16 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/fc_host/host0/statistics -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/dumped_frames -Lines: 1 -0xffffffffffffffff -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/error_frames -Lines: 1 -0x0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/fcp_packet_aborts -Lines: 1 -0x13 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/invalid_crc_count -Lines: 1 -0x2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/invalid_tx_word_count -Lines: 1 -0x8 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/link_failure_count -Lines: 1 -0x9 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/loss_of_signal_count -Lines: 1 -0x11 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/loss_of_sync_count -Lines: 1 -0x10 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/nos_count -Lines: 1 -0x12 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/rx_frames -Lines: 1 -0x3 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/rx_words -Lines: 1 -0x4 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/seconds_since_last_reset -Lines: 1 -0x7 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/tx_frames -Lines: 1 -0x5 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/statistics/tx_words -Lines: 1 -0x6 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/supported_classes -Lines: 1 -Class 3 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/supported_speeds -Lines: 1 -4 Gbit, 8 Gbit, 16 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/fc_host/host0/symbolic_name -Lines: 1 -Emulex SN1100E2P FV12.4.270.3 DV12.4.0.0. HN:gotest. OS:Linux -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/hfi1_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/board_id -Lines: 1 -HPE 100Gb 1-port OP101 QSFP28 x16 PCIe Gen3 with Intel Omni-Path Adapter -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/fw_ver -Lines: 1 -1.27.0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/hfi1_0/ports -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/hfi1_0/ports/1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/VL15_dropped -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/excessive_buffer_overrun_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/link_downed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/link_error_recovery -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/local_link_integrity_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_data -Lines: 1 -345091702026 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_packets -Lines: 1 -638036947 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_remote_physical_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_rcv_switch_relay_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_data -Lines: 1 -273558326543 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_discards -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_packets -Lines: 1 -568318856 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/port_xmit_wait -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/counters/symbol_error -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/phys_state -Lines: 1 -5: LinkUp -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/rate -Lines: 1 -100 Gb/sec (4X EDR) -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/state -Lines: 1 -4: ACTIVE -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/board_id -Lines: 1 -SM_1141000001000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/fw_ver -Lines: 1 -2.31.5050 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/hca_type -Lines: 1 -MT4099 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/VL15_dropped -Lines: 1 -0 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/excessive_buffer_overrun_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_downed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_error_recovery -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/local_link_integrity_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_data -Lines: 1 -2221223609 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_packets -Lines: 1 -87169372 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_remote_physical_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_switch_relay_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_data -Lines: 1 -26509113295 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_discards -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_packets -Lines: 1 -85734114 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_wait -Lines: 1 -3599 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/symbol_error -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/phys_state -Lines: 1 -5: LinkUp -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/rate -Lines: 1 -40 Gb/sec (4X QDR) -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/state -Lines: 1 -4: ACTIVE -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/VL15_dropped -Lines: 1 -0 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/excessive_buffer_overrun_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_downed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_error_recovery -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/local_link_integrity_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_data -Lines: 1 -2460436784 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_packets -Lines: 1 -89332064 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_remote_physical_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_switch_relay_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_data -Lines: 1 -26540356890 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_discards -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_packets -Lines: 1 -88622850 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_wait -Lines: 1 -3846 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/symbol_error -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/phys_state -Lines: 1 -5: LinkUp -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/rate -Lines: 1 -40 Gb/sec (4X QDR) -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/state -Lines: 1 -4: ACTIVE -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/net -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/net/eth0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/addr_assign_type -Lines: 1 -3 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/addr_len -Lines: 1 -6 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/address -Lines: 1 -01:01:01:01:01:01 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/broadcast -Lines: 1 -ff:ff:ff:ff:ff:ff -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/carrier -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/carrier_changes -Lines: 1 -2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/carrier_down_count -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/carrier_up_count -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/dev_id -Lines: 1 -0x20 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/device -SymlinkTo: ../../../devices/pci0000:00/0000:00:1f.6/ -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/dormant -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/duplex -Lines: 1 -full -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/flags -Lines: 1 -0x1303 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/ifalias -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/ifindex -Lines: 1 -2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/iflink -Lines: 1 -2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/link_mode -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/mtu -Lines: 1 -1500 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/name_assign_type -Lines: 1 -2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/netdev_group -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/operstate -Lines: 1 -up -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/phys_port_id -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/phys_port_name -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/phys_switch_id -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/speed -Lines: 1 -1000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/tx_queue_len -Lines: 1 -1000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/type -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/nvme -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/nvme/nvme0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/nvme/nvme0/firmware_rev -Lines: 1 -1B2QEXP7 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/nvme/nvme0/model -Lines: 1 -Samsung SSD 970 PRO 512GB -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/nvme/nvme0/serial -Lines: 1 -S680HF8N190894I -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/nvme/nvme0/state -Lines: 1 -live -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/power_supply -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/power_supply/AC -SymlinkTo: ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/power_supply/BAT0 -SymlinkTo: ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/powercap -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/powercap/intel-rapl -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl/enabled -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/powercap/intel-rapl:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_max_power_uw -Lines: 1 -95000000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_name -Lines: 1 -long_term -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_power_limit_uw -Lines: 1 -4090000000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_time_window_us -Lines: 1 -999424 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_max_power_uw -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_name -Lines: 1 -short_term -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_power_limit_uw -Lines: 1 -4090000000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_time_window_us -Lines: 1 -2440 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/enabled -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/energy_uj -Lines: 1 -240422366267 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/max_energy_range_uj -Lines: 1 -262143328850 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/name -Lines: 1 -package-0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/powercap/intel-rapl:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_max_power_uw -Lines: 0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_name -Lines: 1 -long_term -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_power_limit_uw -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_time_window_us -Lines: 1 -976 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0:0/enabled -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0:0/energy_uj -Lines: 1 -118821284256 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0:0/max_energy_range_uj -Lines: 1 -262143328850 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0:0/name -Lines: 1 -core -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:0:0/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/powercap/intel-rapl:a -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_0_max_power_uw -Lines: 1 -95000000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_0_name -Lines: 1 -long_term -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_0_power_limit_uw -Lines: 1 -4090000000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_0_time_window_us -Lines: 1 -999424 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_1_max_power_uw -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_1_name -Lines: 1 -short_term -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_1_power_limit_uw -Lines: 1 -4090000000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/constraint_1_time_window_us -Lines: 1 -2440 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/enabled -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/energy_uj -Lines: 1 -240422366267 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/max_energy_range_uj -Lines: 1 -262143328850 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/name -Lines: 1 -package-10 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/powercap/intel-rapl:a/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/scsi_tape -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/scsi_tape/nst0 -SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/scsi_tape/nst0a -SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/scsi_tape/nst0l -SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/scsi_tape/nst0m -SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/scsi_tape/st0 -SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/scsi_tape/st0a -SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/scsi_tape/st0l -SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/scsi_tape/st0m -SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal/cooling_device0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device0/cur_state -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device0/max_state -Lines: 1 -50 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device0/type -Lines: 1 -Processor -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal/cooling_device1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device1/cur_state -Lines: 1 --1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device1/max_state -Lines: 1 -27 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device1/type -Lines: 1 -intel_powerclamp -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal/thermal_zone0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone0/policy -Lines: 1 -step_wise -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone0/temp -Lines: 1 -49925 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone0/type -Lines: 1 -bcm2835_thermal -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal/thermal_zone1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/mode -Lines: 1 -enabled -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/passive -Lines: 1 -0 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/policy -Lines: 1 -step_wise -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/temp -Lines: 1 --44000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/type -Lines: 1 -acpitz -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/device -SymlinkTo: ../../../ACPI0003:00 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/online -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/async -Lines: 1 -disabled -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/autosuspend_delay_ms -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/control -Lines: 1 -auto -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_active_kids -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_active_time -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_enabled -Lines: 1 -disabled -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_status -Lines: 1 -unsupported -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_suspended_time -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_usage -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup -Lines: 1 -enabled -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_abort_count -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_active -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_active_count -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_count -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_expire_count -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_last_time_ms -Lines: 1 -10598 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_max_time_ms -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_prevent_sleep_time_ms -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_total_time_ms -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/subsystem -SymlinkTo: ../../../../../../../../../class/power_supply -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/type -Lines: 1 -Mains -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/uevent -Lines: 2 -POWER_SUPPLY_NAME=AC -POWER_SUPPLY_ONLINE=0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/alarm -Lines: 1 -2369000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/capacity -Lines: 1 -98 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/capacity_level -Lines: 1 -Normal -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/charge_start_threshold -Lines: 1 -95 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/charge_stop_threshold -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/cycle_count -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/device -SymlinkTo: ../../../PNP0C0A:00 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full -Lines: 1 -50060000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full_design -Lines: 1 -47520000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_now -Lines: 1 -49450000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/manufacturer -Lines: 1 -LGC -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/model_name -Lines: 1 -LNV-45N1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/async -Lines: 1 -disabled -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/autosuspend_delay_ms -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/control -Lines: 1 -auto -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_active_kids -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_active_time -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_enabled -Lines: 1 -disabled -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_status -Lines: 1 -unsupported -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_suspended_time -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_usage -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power_now -Lines: 1 -4830000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/present -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/serial_number -Lines: 1 -38109 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/status -Lines: 1 -Discharging -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/subsystem -SymlinkTo: ../../../../../../../../../class/power_supply -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/technology -Lines: 1 -Li-ion -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/type -Lines: 1 -Battery -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/uevent -Lines: 16 -POWER_SUPPLY_NAME=BAT0 -POWER_SUPPLY_STATUS=Discharging -POWER_SUPPLY_PRESENT=1 -POWER_SUPPLY_TECHNOLOGY=Li-ion -POWER_SUPPLY_CYCLE_COUNT=0 -POWER_SUPPLY_VOLTAGE_MIN_DESIGN=10800000 -POWER_SUPPLY_VOLTAGE_NOW=11750000 -POWER_SUPPLY_POWER_NOW=5064000 -POWER_SUPPLY_ENERGY_FULL_DESIGN=47520000 -POWER_SUPPLY_ENERGY_FULL=47390000 -POWER_SUPPLY_ENERGY_NOW=40730000 -POWER_SUPPLY_CAPACITY=85 -POWER_SUPPLY_CAPACITY_LEVEL=Normal -POWER_SUPPLY_MODEL_NAME=LNV-45N1 -POWER_SUPPLY_MANUFACTURER=LGC -POWER_SUPPLY_SERIAL_NUMBER=38109 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_min_design -Lines: 1 -10800000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_now -Lines: 1 -12229000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/in_flight -Lines: 1 -1EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/io_ns -Lines: 1 -9247011087720EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/other_cnt -Lines: 1 -1409EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/read_byte_cnt -Lines: 1 -979383912EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/read_cnt -Lines: 1 -3741EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/read_ns -Lines: 1 -33788355744EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/resid_cnt -Lines: 1 -19EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/write_byte_cnt -Lines: 1 -1496246784000EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/write_cnt -Lines: 1 -53772916EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0/stats/write_ns -Lines: 1 -5233597394395EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/in_flight -Lines: 1 -1EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/io_ns -Lines: 1 -9247011087720EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/other_cnt -Lines: 1 -1409EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/read_byte_cnt -Lines: 1 -979383912EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/read_cnt -Lines: 1 -3741EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/read_ns -Lines: 1 -33788355744EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/resid_cnt -Lines: 1 -19EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/write_byte_cnt -Lines: 1 -1496246784000EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/write_cnt -Lines: 1 -53772916EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0a/stats/write_ns -Lines: 1 -5233597394395EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/in_flight -Lines: 1 -1EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/io_ns -Lines: 1 -9247011087720EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/other_cnt -Lines: 1 -1409EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/read_byte_cnt -Lines: 1 -979383912EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/read_cnt -Lines: 1 -3741EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/read_ns -Lines: 1 -33788355744EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/resid_cnt -Lines: 1 -19EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/write_byte_cnt -Lines: 1 -1496246784000EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/write_cnt -Lines: 1 -53772916EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0l/stats/write_ns -Lines: 1 -5233597394395EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/in_flight -Lines: 1 -1EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/io_ns -Lines: 1 -9247011087720EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/other_cnt -Lines: 1 -1409EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/read_byte_cnt -Lines: 1 -979383912EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/read_cnt -Lines: 1 -3741EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/read_ns -Lines: 1 -33788355744EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/resid_cnt -Lines: 1 -19EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/write_byte_cnt -Lines: 1 -1496246784000EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/write_cnt -Lines: 1 -53772916EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/nst0m/stats/write_ns -Lines: 1 -5233597394395EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/in_flight -Lines: 1 -1EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/io_ns -Lines: 1 -9247011087720EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/other_cnt -Lines: 1 -1409EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/read_byte_cnt -Lines: 1 -979383912EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/read_cnt -Lines: 1 -3741EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/read_ns -Lines: 1 -33788355744EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/resid_cnt -Lines: 1 -19EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/write_byte_cnt -Lines: 1 -1496246784000EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/write_cnt -Lines: 1 -53772916EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0/stats/write_ns -Lines: 1 -5233597394395EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/in_flight -Lines: 1 -1EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/io_ns -Lines: 1 -9247011087720EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/other_cnt -Lines: 1 -1409EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/read_byte_cnt -Lines: 1 -979383912EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/read_cnt -Lines: 1 -3741EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/read_ns -Lines: 1 -33788355744EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/resid_cnt -Lines: 1 -19EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/write_byte_cnt -Lines: 1 -1496246784000EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/write_cnt -Lines: 1 -53772916EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0a/stats/write_ns -Lines: 1 -5233597394395EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/in_flight -Lines: 1 -1EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/io_ns -Lines: 1 -9247011087720EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/other_cnt -Lines: 1 -1409EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/read_byte_cnt -Lines: 1 -979383912EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/read_cnt -Lines: 1 -3741EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/read_ns -Lines: 1 -33788355744EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/resid_cnt -Lines: 1 -19EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/write_byte_cnt -Lines: 1 -1496246784000EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/write_cnt -Lines: 1 -53772916EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0l/stats/write_ns -Lines: 1 -5233597394395EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/in_flight -Lines: 1 -1EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/io_ns -Lines: 1 -9247011087720EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/other_cnt -Lines: 1 -1409EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/read_byte_cnt -Lines: 1 -979383912EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/read_cnt -Lines: 1 -3741EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/read_ns -Lines: 1 -33788355744EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/resid_cnt -Lines: 1 -19EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/write_byte_cnt -Lines: 1 -1496246784000EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/write_cnt -Lines: 1 -53772916EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m/stats/write_ns -Lines: 1 -5233597394395EOF -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/dirty_data -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hits -Lines: 1 -289 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hits -Lines: 1 -546 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/io_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/metadata_written -Lines: 1 -512 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/priority_stats -Lines: 5 -Unused: 99% -Metadata: 0% -Average: 10473 -Sectors per Q: 64 -Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/written -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:1f.6 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/ari_enabled -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/broken_parity_status -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/class -Lines: 1 -0x020000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/consistent_dma_mask_bits -Lines: 1 -64 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/d3cold_allowed -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/device -Lines: 1 -0x15d7 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/dma_mask_bits -Lines: 1 -64 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/driver_override -Lines: 1 -(null) -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/irq -Lines: 1 -140 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/local_cpulist -Lines: 1 -0-7 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/local_cpus -Lines: 1 -ff -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/modalias -Lines: 1 -pci:v00008086d000015D7sv000017AAsd0000225Abc02sc00i00 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/msi_bus -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/numa_node -Lines: 1 --1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/resource -Lines: 13 -0x00000000ec200000 0x00000000ec21ffff 0x0000000000040200 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/revision -Lines: 1 -0x21 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/subsystem_device -Lines: 1 -0x225a -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/subsystem_vendor -Lines: 1 -0x17aa -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/uevent -Lines: 6 -DRIVER=e1000e -PCI_CLASS=20000 -PCI_ID=8086:15D7 -PCI_SUBSYS_ID=17AA:225A -PCI_SLOT_NAME=0000:00:1f.6 -MODALIAS=pci:v00008086d000015D7sv000017AAsd0000225Abc02sc00i00 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/vendor -Lines: 1 -0x8086 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/rbd -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/rbd/0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/rbd/0/name -Lines: 1 -demo -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/rbd/0/pool -Lines: 1 -iscsi-images -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/rbd/1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/rbd/1/name -Lines: 1 -wrong -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/rbd/1/pool -Lines: 1 -wrong-images -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/clocksource -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/clocksource/clocksource0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/clocksource/clocksource0/available_clocksource -Lines: 1 -tsc hpet acpi_pm -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/clocksource/clocksource0/current_clocksource -Lines: 1 -tsc -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/cpufreq -SymlinkTo: ../cpufreq/policy0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle/core_throttle_count -Lines: 1 -10084 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle/package_throttle_count -Lines: 1 -34818 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu0/topology -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_id -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_siblings -Lines: 1 -ff -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_siblings_list -Lines: 1 -0-7 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/physical_package_id -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/thread_siblings -Lines: 1 -11 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/thread_siblings_list -Lines: 1 -0,4 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu1 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu1/cpufreq -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freq -Lines: 1 -1200195 -Mode: 400 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_max_freq -Lines: 1 -3300000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_min_freq -Lines: 1 -1200000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_transition_latency -Lines: 1 -4294967295 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/related_cpus -Lines: 1 -1 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_available_governors -Lines: 1 -performance powersave -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_driver -Lines: 1 -intel_pstate -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor -Lines: 1 -powersave -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq -Lines: 1 -3300000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq -Lines: 1 -1200000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_setspeed -Lines: 1 - -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle/core_throttle_count -Lines: 1 -523 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle/package_throttle_count -Lines: 1 -34818 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu1/topology -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_id -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_siblings -Lines: 1 -ff -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_siblings_list -Lines: 1 -0-7 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/physical_package_id -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/thread_siblings -Lines: 1 -22 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/thread_siblings_list -Lines: 1 -1,5 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpufreq -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpufreq/policy0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/affected_cpus -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq -Lines: 1 -2400000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq -Lines: 1 -800000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_transition_latency -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/related_cpus -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors -Lines: 1 -performance powersave -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq -Lines: 1 -1219917 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_driver -Lines: 1 -intel_pstate -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_governor -Lines: 1 -powersave -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq -Lines: 1 -2400000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq -Lines: 1 -800000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed -Lines: 1 - -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpufreq/policy1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/node -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/node/node1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/node/node1/vmstat -Lines: 6 -nr_free_pages 1 -nr_zone_inactive_anon 2 -nr_zone_active_anon 3 -nr_zone_inactive_file 4 -nr_zone_active_file 5 -nr_zone_unevictable 6 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/node/node2 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/node/node2/vmstat -Lines: 6 -nr_free_pages 7 -nr_zone_inactive_anon 8 -nr_zone_active_anon 9 -nr_zone_inactive_file 10 -nr_zone_active_file 11 -nr_zone_unevictable 12 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/average_key_size -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0 -Mode: 777 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/dirty_data -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hits -Lines: 1 -289 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hits -Lines: 1 -546 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/writeback_rate_debug -Lines: 7 -rate: 1.1M/sec -dirty: 20.4G -target: 20.4G -proportional: 427.5k -integral: 790.0k -change: 321.5k/sec -next io: 17ms -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/btree_cache_size -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0 -Mode: 777 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/io_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/metadata_written -Lines: 1 -512 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/priority_stats -Lines: 5 -Unused: 99% -Metadata: 0% -Average: 10473 -Sectors per Q: 64 -Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/written -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache_available_percent -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/congested -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/active_journal_entries -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_nodes -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_read_average_duration_us -Lines: 1 -1305 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/cache_read_races -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/root_usage_percent -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hits -Lines: 1 -289 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hits -Lines: 1 -546 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/tree_depth -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_may_use -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_readonly -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_reserved -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_used -Lines: 1 -808189952 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/disk_total -Lines: 1 -2147483648 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/disk_used -Lines: 1 -808189952 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/flags -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/raid0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/raid0/total_bytes -Lines: 1 -2147483648 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/raid0/used_bytes -Lines: 1 -808189952 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/total_bytes -Lines: 1 -2147483648 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/total_bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/global_rsv_reserved -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/global_rsv_size -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_may_use -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_readonly -Lines: 1 -131072 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_reserved -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_used -Lines: 1 -933888 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/disk_total -Lines: 1 -2147483648 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/disk_used -Lines: 1 -1867776 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/flags -Lines: 1 -4 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/raid1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/raid1/total_bytes -Lines: 1 -1073741824 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/raid1/used_bytes -Lines: 1 -933888 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/total_bytes -Lines: 1 -1073741824 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/total_bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_may_use -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_readonly -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_reserved -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_used -Lines: 1 -16384 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/disk_total -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/disk_used -Lines: 1 -32768 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/flags -Lines: 1 -2 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/raid1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/raid1/total_bytes -Lines: 1 -8388608 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/raid1/used_bytes -Lines: 1 -16384 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/total_bytes -Lines: 1 -8388608 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/total_bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/clone_alignment -Lines: 1 -4096 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop25 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop25/size -Lines: 1 -20971520 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop26 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop26/size -Lines: 1 -20971520 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/big_metadata -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/extended_iref -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/mixed_backref -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/skinny_metadata -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/label -Lines: 1 -fixture -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/metadata_uuid -Lines: 1 -0abb23a9-579b-43e6-ad30-227ef47fcb9d -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/nodesize -Lines: 1 -16384 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/quota_override -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/sectorsize -Lines: 1 -4096 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_may_use -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_readonly -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_reserved -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_used -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/disk_total -Lines: 1 -644087808 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/disk_used -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/flags -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/raid5 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/raid5/total_bytes -Lines: 1 -644087808 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/raid5/used_bytes -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/total_bytes -Lines: 1 -644087808 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/total_bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/global_rsv_reserved -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/global_rsv_size -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_may_use -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_readonly -Lines: 1 -262144 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_reserved -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_used -Lines: 1 -114688 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/disk_total -Lines: 1 -429391872 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/disk_used -Lines: 1 -114688 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/flags -Lines: 1 -4 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/raid6 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/raid6/total_bytes -Lines: 1 -429391872 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/raid6/used_bytes -Lines: 1 -114688 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/total_bytes -Lines: 1 -429391872 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/total_bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_may_use -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_readonly -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_reserved -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_used -Lines: 1 -16384 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/disk_total -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/disk_used -Lines: 1 -16384 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/flags -Lines: 1 -2 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/raid6 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/raid6/total_bytes -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/raid6/used_bytes -Lines: 1 -16384 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/total_bytes -Lines: 1 -16777216 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/total_bytes_pinned -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/clone_alignment -Lines: 1 -4096 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop22 -SymlinkTo: ../../../../devices/virtual/block/loop22 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop23 -SymlinkTo: ../../../../devices/virtual/block/loop23 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop24 -SymlinkTo: ../../../../devices/virtual/block/loop24 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop25 -SymlinkTo: ../../../../devices/virtual/block/loop25 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/big_metadata -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/extended_iref -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/mixed_backref -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/raid56 -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/skinny_metadata -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/label -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/metadata_uuid -Lines: 1 -7f07c59f-6136-449c-ab87-e1cf2328731b -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/nodesize -Lines: 1 -16384 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/quota_override -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/sectorsize -Lines: 1 -4096 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs/sda1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs/sda1/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/xfs/sda1/stats/stats -Lines: 1 -extent_alloc 1 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs/sdb1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs/sdb1/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/xfs/sdb1/stats/stats -Lines: 1 -extent_alloc 2 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/fileio_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/fileio_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/udev_path -Lines: 1 -/home/iscsi/file_back_1G -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/iblock_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/udev_path -Lines: 1 -/dev/rbd1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/rbd_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/udev_path -Lines: 1 -/dev/rbd/iscsi-images/demo -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/udev_path -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/7f4a4eb56d -SymlinkTo: ../../../../../../target/core/rd_mcp_119/ramdisk_lio_1G -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds -Lines: 1 -204950 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes -Lines: 1 -10325 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes -Lines: 1 -40325 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/795b7c7026 -SymlinkTo: ../../../../../../target/core/iblock_0/block_lio_rbd1 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds -Lines: 1 -104950 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes -Lines: 1 -20095 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes -Lines: 1 -71235 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/fff5e16686 -SymlinkTo: ../../../../../../target/core/fileio_1/file_lio_1G -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds -Lines: 1 -301950 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes -Lines: 1 -10195 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes -Lines: 1 -30195 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/eba1edf893 -SymlinkTo: ../../../../../../target/core/rbd_0/iscsi-images-demo -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds -Lines: 1 -1234 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes -Lines: 1 -1504 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes -Lines: 1 -4733 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/prometheus/procfs/internal/fs/fs.go b/vendor/github.com/prometheus/procfs/internal/fs/fs.go index 0040753b1..3c18c7610 100644 --- a/vendor/github.com/prometheus/procfs/internal/fs/fs.go +++ b/vendor/github.com/prometheus/procfs/internal/fs/fs.go @@ -26,7 +26,7 @@ const ( // DefaultSysMountPoint is the common mount point of the sys filesystem. DefaultSysMountPoint = "/sys" - // DefaultConfigfsMountPoint is the common mount point of the configfs + // DefaultConfigfsMountPoint is the common mount point of the configfs. DefaultConfigfsMountPoint = "/sys/kernel/config" ) diff --git a/vendor/github.com/prometheus/procfs/internal/util/parse.go b/vendor/github.com/prometheus/procfs/internal/util/parse.go index 22cb07a6b..b030951fa 100644 --- a/vendor/github.com/prometheus/procfs/internal/util/parse.go +++ b/vendor/github.com/prometheus/procfs/internal/util/parse.go @@ -14,7 +14,7 @@ package util import ( - "io/ioutil" + "os" "strconv" "strings" ) @@ -66,7 +66,7 @@ func ParsePInt64s(ss []string) ([]*int64, error) { // ReadUintFromFile reads a file and attempts to parse a uint64 from it. func ReadUintFromFile(path string) (uint64, error) { - data, err := ioutil.ReadFile(path) + data, err := os.ReadFile(path) if err != nil { return 0, err } @@ -75,7 +75,7 @@ func ReadUintFromFile(path string) (uint64, error) { // ReadIntFromFile reads a file and attempts to parse a int64 from it. func ReadIntFromFile(path string) (int64, error) { - data, err := ioutil.ReadFile(path) + data, err := os.ReadFile(path) if err != nil { return 0, err } diff --git a/vendor/github.com/prometheus/procfs/internal/util/readfile.go b/vendor/github.com/prometheus/procfs/internal/util/readfile.go index 8051161b2..71b7a70eb 100644 --- a/vendor/github.com/prometheus/procfs/internal/util/readfile.go +++ b/vendor/github.com/prometheus/procfs/internal/util/readfile.go @@ -15,17 +15,16 @@ package util import ( "io" - "io/ioutil" "os" ) -// ReadFileNoStat uses ioutil.ReadAll to read contents of entire file. -// This is similar to ioutil.ReadFile but without the call to os.Stat, because +// ReadFileNoStat uses io.ReadAll to read contents of entire file. +// This is similar to os.ReadFile but without the call to os.Stat, because // many files in /proc and /sys report incorrect file sizes (either 0 or 4096). -// Reads a max file size of 512kB. For files larger than this, a scanner +// Reads a max file size of 1024kB. For files larger than this, a scanner // should be used. func ReadFileNoStat(filename string) ([]byte, error) { - const maxBufferSize = 1024 * 512 + const maxBufferSize = 1024 * 1024 f, err := os.Open(filename) if err != nil { @@ -34,5 +33,5 @@ func ReadFileNoStat(filename string) ([]byte, error) { defer f.Close() reader := io.LimitReader(f, maxBufferSize) - return ioutil.ReadAll(reader) + return io.ReadAll(reader) } diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go index c07de0b6c..1ab875cee 100644 --- a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go +++ b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go @@ -11,7 +11,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build linux,!appengine +//go:build (linux || darwin) && !appengine +// +build linux darwin +// +build !appengine package util @@ -21,7 +23,7 @@ import ( "syscall" ) -// SysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. +// SysReadFile is a simplified os.ReadFile that invokes syscall.Read directly. // https://github.com/prometheus/node_exporter/pull/728/files // // Note that this function will not read files larger than 128 bytes. @@ -33,7 +35,7 @@ func SysReadFile(file string) (string, error) { defer f.Close() // On some machines, hwmon drivers are broken and return EAGAIN. This causes - // Go's ioutil.ReadFile implementation to poll forever. + // Go's os.ReadFile implementation to poll forever. // // Since we either want to read data or bail immediately, do the simplest // possible read using syscall directly. diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go index bd55b4537..1d86f5e63 100644 --- a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go +++ b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go @@ -11,7 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build linux,appengine !linux +//go:build (linux && appengine) || (!linux && !darwin) +// +build linux,appengine !linux,!darwin package util diff --git a/vendor/github.com/prometheus/procfs/ipvs.go b/vendor/github.com/prometheus/procfs/ipvs.go index 89e447746..391c07957 100644 --- a/vendor/github.com/prometheus/procfs/ipvs.go +++ b/vendor/github.com/prometheus/procfs/ipvs.go @@ -20,7 +20,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net" "os" "strconv" @@ -84,7 +83,7 @@ func parseIPVSStats(r io.Reader) (IPVSStats, error) { stats IPVSStats ) - statContent, err := ioutil.ReadAll(r) + statContent, err := io.ReadAll(r) if err != nil { return IPVSStats{}, err } diff --git a/vendor/github.com/prometheus/procfs/kernel_random.go b/vendor/github.com/prometheus/procfs/kernel_random.go index da3a941d6..db88566bd 100644 --- a/vendor/github.com/prometheus/procfs/kernel_random.go +++ b/vendor/github.com/prometheus/procfs/kernel_random.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !windows // +build !windows package procfs diff --git a/vendor/github.com/prometheus/procfs/loadavg.go b/vendor/github.com/prometheus/procfs/loadavg.go index 0cce190ec..0096cafbd 100644 --- a/vendor/github.com/prometheus/procfs/loadavg.go +++ b/vendor/github.com/prometheus/procfs/loadavg.go @@ -21,7 +21,7 @@ import ( "github.com/prometheus/procfs/internal/util" ) -// LoadAvg represents an entry in /proc/loadavg +// LoadAvg represents an entry in /proc/loadavg. type LoadAvg struct { Load1 float64 Load5 float64 diff --git a/vendor/github.com/prometheus/procfs/mdstat.go b/vendor/github.com/prometheus/procfs/mdstat.go index f0b9e5f75..a95c889cb 100644 --- a/vendor/github.com/prometheus/procfs/mdstat.go +++ b/vendor/github.com/prometheus/procfs/mdstat.go @@ -15,7 +15,7 @@ package procfs import ( "fmt" - "io/ioutil" + "os" "regexp" "strconv" "strings" @@ -64,7 +64,7 @@ type MDStat struct { // structs containing the relevant info. More information available here: // https://raid.wiki.kernel.org/index.php/Mdstat func (fs FS) MDStat() ([]MDStat, error) { - data, err := ioutil.ReadFile(fs.proc.Path("mdstat")) + data, err := os.ReadFile(fs.proc.Path("mdstat")) if err != nil { return nil, err } @@ -166,8 +166,12 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { } func evalStatusLine(deviceLine, statusLine string) (active, total, down, size int64, err error) { + statusFields := strings.Fields(statusLine) + if len(statusFields) < 1 { + return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q", statusLine) + } - sizeStr := strings.Fields(statusLine)[0] + sizeStr := statusFields[0] size, err = strconv.ParseInt(sizeStr, 10, 64) if err != nil { return 0, 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) diff --git a/vendor/github.com/prometheus/procfs/net_conntrackstat.go b/vendor/github.com/prometheus/procfs/net_conntrackstat.go index 9964a3600..8300daca0 100644 --- a/vendor/github.com/prometheus/procfs/net_conntrackstat.go +++ b/vendor/github.com/prometheus/procfs/net_conntrackstat.go @@ -25,7 +25,7 @@ import ( ) // A ConntrackStatEntry represents one line from net/stat/nf_conntrack -// and contains netfilter conntrack statistics at one CPU core +// and contains netfilter conntrack statistics at one CPU core. type ConntrackStatEntry struct { Entries uint64 Found uint64 @@ -38,12 +38,12 @@ type ConntrackStatEntry struct { SearchRestart uint64 } -// ConntrackStat retrieves netfilter's conntrack statistics, split by CPU cores +// ConntrackStat retrieves netfilter's conntrack statistics, split by CPU cores. func (fs FS) ConntrackStat() ([]ConntrackStatEntry, error) { return readConntrackStat(fs.proc.Path("net", "stat", "nf_conntrack")) } -// Parses a slice of ConntrackStatEntries from the given filepath +// Parses a slice of ConntrackStatEntries from the given filepath. func readConntrackStat(path string) ([]ConntrackStatEntry, error) { // This file is small and can be read with one syscall. b, err := util.ReadFileNoStat(path) @@ -61,7 +61,7 @@ func readConntrackStat(path string) ([]ConntrackStatEntry, error) { return stat, nil } -// Reads the contents of a conntrack statistics file and parses a slice of ConntrackStatEntries +// Reads the contents of a conntrack statistics file and parses a slice of ConntrackStatEntries. func parseConntrackStat(r io.Reader) ([]ConntrackStatEntry, error) { var entries []ConntrackStatEntry @@ -79,7 +79,7 @@ func parseConntrackStat(r io.Reader) ([]ConntrackStatEntry, error) { return entries, nil } -// Parses a ConntrackStatEntry from given array of fields +// Parses a ConntrackStatEntry from given array of fields. func parseConntrackStatEntry(fields []string) (*ConntrackStatEntry, error) { if len(fields) != 17 { return nil, fmt.Errorf("invalid conntrackstat entry, missing fields") @@ -143,7 +143,7 @@ func parseConntrackStatEntry(fields []string) (*ConntrackStatEntry, error) { return entry, nil } -// Parses a uint64 from given hex in string +// Parses a uint64 from given hex in string. func parseConntrackStatField(field string) (uint64, error) { val, err := strconv.ParseUint(field, 16, 64) if err != nil { diff --git a/vendor/github.com/prometheus/procfs/net_dev.go b/vendor/github.com/prometheus/procfs/net_dev.go index 47a710bef..e66208aa0 100644 --- a/vendor/github.com/prometheus/procfs/net_dev.go +++ b/vendor/github.com/prometheus/procfs/net_dev.go @@ -87,17 +87,17 @@ func newNetDev(file string) (NetDev, error) { // parseLine parses a single line from the /proc/net/dev file. Header lines // must be filtered prior to calling this method. func (netDev NetDev) parseLine(rawLine string) (*NetDevLine, error) { - parts := strings.SplitN(rawLine, ":", 2) - if len(parts) != 2 { + idx := strings.LastIndex(rawLine, ":") + if idx == -1 { return nil, errors.New("invalid net/dev line, missing colon") } - fields := strings.Fields(strings.TrimSpace(parts[1])) + fields := strings.Fields(strings.TrimSpace(rawLine[idx+1:])) var err error line := &NetDevLine{} // Interface Name - line.Name = strings.TrimSpace(parts[0]) + line.Name = strings.TrimSpace(rawLine[:idx]) if line.Name == "" { return nil, errors.New("invalid net/dev line, empty interface name") } diff --git a/vendor/github.com/prometheus/procfs/net_ip_socket.go b/vendor/github.com/prometheus/procfs/net_ip_socket.go index 8c9ee3de8..7fd57d7f4 100644 --- a/vendor/github.com/prometheus/procfs/net_ip_socket.go +++ b/vendor/github.com/prometheus/procfs/net_ip_socket.go @@ -34,7 +34,7 @@ const ( readLimit = 4294967296 // Byte -> 4 GiB ) -// this contains generic data structures for both udp and tcp sockets +// This contains generic data structures for both udp and tcp sockets. type ( // NetIPSocket represents the contents of /proc/net/{t,u}dp{,6} file without the header. NetIPSocket []*netIPSocketLine diff --git a/vendor/github.com/prometheus/procfs/net_protocols.go b/vendor/github.com/prometheus/procfs/net_protocols.go index 8c6de3791..374b6f73f 100644 --- a/vendor/github.com/prometheus/procfs/net_protocols.go +++ b/vendor/github.com/prometheus/procfs/net_protocols.go @@ -23,7 +23,7 @@ import ( "github.com/prometheus/procfs/internal/util" ) -// NetProtocolStats stores the contents from /proc/net/protocols +// NetProtocolStats stores the contents from /proc/net/protocols. type NetProtocolStats map[string]NetProtocolStatLine // NetProtocolStatLine contains a single line parsed from /proc/net/protocols. We @@ -41,7 +41,7 @@ type NetProtocolStatLine struct { Capabilities NetProtocolCapabilities } -// NetProtocolCapabilities contains a list of capabilities for each protocol +// NetProtocolCapabilities contains a list of capabilities for each protocol. type NetProtocolCapabilities struct { Close bool // 8 Connect bool // 9 diff --git a/vendor/github.com/prometheus/procfs/net_softnet.go b/vendor/github.com/prometheus/procfs/net_softnet.go index 46f12c61d..a94f86dc4 100644 --- a/vendor/github.com/prometheus/procfs/net_softnet.go +++ b/vendor/github.com/prometheus/procfs/net_softnet.go @@ -30,13 +30,13 @@ import ( // * Linux 4.17 https://elixir.bootlin.com/linux/v4.17/source/net/core/net-procfs.c#L162 // and https://elixir.bootlin.com/linux/v4.17/source/include/linux/netdevice.h#L2810. -// SoftnetStat contains a single row of data from /proc/net/softnet_stat +// SoftnetStat contains a single row of data from /proc/net/softnet_stat. type SoftnetStat struct { - // Number of processed packets + // Number of processed packets. Processed uint32 - // Number of dropped packets + // Number of dropped packets. Dropped uint32 - // Number of times processing packets ran out of quota + // Number of times processing packets ran out of quota. TimeSqueezed uint32 } diff --git a/vendor/github.com/prometheus/procfs/xfrm.go b/vendor/github.com/prometheus/procfs/net_xfrm.go similarity index 96% rename from vendor/github.com/prometheus/procfs/xfrm.go rename to vendor/github.com/prometheus/procfs/net_xfrm.go index eed07c7d7..f9d9d243d 100644 --- a/vendor/github.com/prometheus/procfs/xfrm.go +++ b/vendor/github.com/prometheus/procfs/net_xfrm.go @@ -79,10 +79,13 @@ type XfrmStat struct { // Policy is dead XfrmOutPolDead int // Policy Error - XfrmOutPolError int - XfrmFwdHdrError int + XfrmOutPolError int + // Forward routing of a packet is not allowed + XfrmFwdHdrError int + // State is invalid, perhaps expired XfrmOutStateInvalid int - XfrmAcquireError int + // State hasn’t been fully acquired before use + XfrmAcquireError int } // NewXfrmStat reads the xfrm_stat statistics. diff --git a/vendor/github.com/prometheus/procfs/netstat.go b/vendor/github.com/prometheus/procfs/netstat.go index 94d892f11..dcea9c5a6 100644 --- a/vendor/github.com/prometheus/procfs/netstat.go +++ b/vendor/github.com/prometheus/procfs/netstat.go @@ -21,13 +21,13 @@ import ( "strings" ) -// NetStat contains statistics for all the counters from one file +// NetStat contains statistics for all the counters from one file. type NetStat struct { - Filename string Stats map[string][]uint64 + Filename string } -// NetStat retrieves stats from /proc/net/stat/ +// NetStat retrieves stats from `/proc/net/stat/`. func (fs FS) NetStat() ([]NetStat, error) { statFiles, err := filepath.Glob(fs.proc.Path("net/stat/*")) if err != nil { @@ -55,7 +55,7 @@ func (fs FS) NetStat() ([]NetStat, error) { // Other strings represent per-CPU counters for scanner.Scan() { for num, counter := range strings.Fields(scanner.Text()) { - value, err := strconv.ParseUint(counter, 16, 32) + value, err := strconv.ParseUint(counter, 16, 64) if err != nil { return nil, err } diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/prometheus/procfs/proc.go index 28f696803..c30223af7 100644 --- a/vendor/github.com/prometheus/procfs/proc.go +++ b/vendor/github.com/prometheus/procfs/proc.go @@ -16,7 +16,7 @@ package procfs import ( "bytes" "fmt" - "io/ioutil" + "io" "os" "strconv" "strings" @@ -82,7 +82,7 @@ func (fs FS) Self() (Proc, error) { // NewProc returns a process for the given pid. // -// Deprecated: use fs.Proc() instead +// Deprecated: Use fs.Proc() instead. func (fs FS) NewProc(pid int) (Proc, error) { return fs.Proc(pid) } @@ -142,7 +142,7 @@ func (p Proc) Wchan() (string, error) { } defer f.Close() - data, err := ioutil.ReadAll(f) + data, err := io.ReadAll(f) if err != nil { return "", err } @@ -185,7 +185,7 @@ func (p Proc) Cwd() (string, error) { return wd, err } -// RootDir returns the absolute path to the process's root directory (as set by chroot) +// RootDir returns the absolute path to the process's root directory (as set by chroot). func (p Proc) RootDir() (string, error) { rdir, err := os.Readlink(p.path("root")) if os.IsNotExist(err) { @@ -311,7 +311,7 @@ func (p Proc) FileDescriptorsInfo() (ProcFDInfos, error) { // Schedstat returns task scheduling information for the process. func (p Proc) Schedstat() (ProcSchedstat, error) { - contents, err := ioutil.ReadFile(p.path("schedstat")) + contents, err := os.ReadFile(p.path("schedstat")) if err != nil { return ProcSchedstat{}, err } diff --git a/vendor/github.com/prometheus/procfs/proc_cgroup.go b/vendor/github.com/prometheus/procfs/proc_cgroup.go index be45b7987..cca03327c 100644 --- a/vendor/github.com/prometheus/procfs/proc_cgroup.go +++ b/vendor/github.com/prometheus/procfs/proc_cgroup.go @@ -45,7 +45,7 @@ type Cgroup struct { } // parseCgroupString parses each line of the /proc/[pid]/cgroup file -// Line format is hierarchyID:[controller1,controller2]:path +// Line format is hierarchyID:[controller1,controller2]:path. func parseCgroupString(cgroupStr string) (*Cgroup, error) { var err error @@ -69,7 +69,7 @@ func parseCgroupString(cgroupStr string) (*Cgroup, error) { return cgroup, nil } -// parseCgroups reads each line of the /proc/[pid]/cgroup file +// parseCgroups reads each line of the /proc/[pid]/cgroup file. func parseCgroups(data []byte) ([]Cgroup, error) { var cgroups []Cgroup scanner := bufio.NewScanner(bytes.NewReader(data)) @@ -88,7 +88,7 @@ func parseCgroups(data []byte) ([]Cgroup, error) { // Cgroups reads from /proc//cgroups and returns a []*Cgroup struct locating this PID in each process // control hierarchy running on this system. On every system (v1 and v2), all hierarchies contain all processes, -// so the len of the returned struct is equal to the number of active hierarchies on this system +// so the len of the returned struct is equal to the number of active hierarchies on this system. func (p Proc) Cgroups() ([]Cgroup, error) { data, err := util.ReadFileNoStat(p.path("cgroup")) if err != nil { diff --git a/vendor/github.com/prometheus/procfs/proc_cgroups.go b/vendor/github.com/prometheus/procfs/proc_cgroups.go new file mode 100644 index 000000000..24d4dce9c --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_cgroups.go @@ -0,0 +1,98 @@ +// Copyright 2021 The Prometheus 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 procfs + +import ( + "bufio" + "bytes" + "fmt" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// CgroupSummary models one line from /proc/cgroups. +// This file contains information about the controllers that are compiled into the kernel. +// +// Also see http://man7.org/linux/man-pages/man7/cgroups.7.html +type CgroupSummary struct { + // The name of the controller. controller is also known as subsystem. + SubsysName string + // The unique ID of the cgroup hierarchy on which this controller is mounted. + Hierarchy int + // The number of control groups in this hierarchy using this controller. + Cgroups int + // This field contains the value 1 if this controller is enabled, or 0 if it has been disabled + Enabled int +} + +// parseCgroupSummary parses each line of the /proc/cgroup file +// Line format is `subsys_name hierarchy num_cgroups enabled`. +func parseCgroupSummaryString(CgroupSummaryStr string) (*CgroupSummary, error) { + var err error + + fields := strings.Fields(CgroupSummaryStr) + // require at least 4 fields + if len(fields) < 4 { + return nil, fmt.Errorf("at least 4 fields required, found %d fields in cgroup info string: %s", len(fields), CgroupSummaryStr) + } + + CgroupSummary := &CgroupSummary{ + SubsysName: fields[0], + } + CgroupSummary.Hierarchy, err = strconv.Atoi(fields[1]) + if err != nil { + return nil, fmt.Errorf("failed to parse hierarchy ID") + } + CgroupSummary.Cgroups, err = strconv.Atoi(fields[2]) + if err != nil { + return nil, fmt.Errorf("failed to parse Cgroup Num") + } + CgroupSummary.Enabled, err = strconv.Atoi(fields[3]) + if err != nil { + return nil, fmt.Errorf("failed to parse Enabled") + } + return CgroupSummary, nil +} + +// parseCgroupSummary reads each line of the /proc/cgroup file. +func parseCgroupSummary(data []byte) ([]CgroupSummary, error) { + var CgroupSummarys []CgroupSummary + scanner := bufio.NewScanner(bytes.NewReader(data)) + for scanner.Scan() { + CgroupSummaryString := scanner.Text() + // ignore comment lines + if strings.HasPrefix(CgroupSummaryString, "#") { + continue + } + CgroupSummary, err := parseCgroupSummaryString(CgroupSummaryString) + if err != nil { + return nil, err + } + CgroupSummarys = append(CgroupSummarys, *CgroupSummary) + } + + err := scanner.Err() + return CgroupSummarys, err +} + +// CgroupSummarys returns information about current /proc/cgroups. +func (fs FS) CgroupSummarys() ([]CgroupSummary, error) { + data, err := util.ReadFileNoStat(fs.proc.Path("cgroups")) + if err != nil { + return nil, err + } + return parseCgroupSummary(data) +} diff --git a/vendor/github.com/prometheus/procfs/proc_environ.go b/vendor/github.com/prometheus/procfs/proc_environ.go index 6134b3580..57a89895d 100644 --- a/vendor/github.com/prometheus/procfs/proc_environ.go +++ b/vendor/github.com/prometheus/procfs/proc_environ.go @@ -19,7 +19,7 @@ import ( "github.com/prometheus/procfs/internal/util" ) -// Environ reads process environments from /proc//environ +// Environ reads process environments from `/proc//environ`. func (p Proc) Environ() ([]string, error) { environments := make([]string, 0) diff --git a/vendor/github.com/prometheus/procfs/proc_fdinfo.go b/vendor/github.com/prometheus/procfs/proc_fdinfo.go index cf63227f0..1bbdd4a8e 100644 --- a/vendor/github.com/prometheus/procfs/proc_fdinfo.go +++ b/vendor/github.com/prometheus/procfs/proc_fdinfo.go @@ -22,7 +22,6 @@ import ( "github.com/prometheus/procfs/internal/util" ) -// Regexp variables var ( rPos = regexp.MustCompile(`^pos:\s+(\d+)$`) rFlags = regexp.MustCompile(`^flags:\s+(\d+)$`) @@ -122,7 +121,7 @@ func (p ProcFDInfos) Len() int { return len(p) } func (p ProcFDInfos) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p ProcFDInfos) Less(i, j int) bool { return p[i].FD < p[j].FD } -// InotifyWatchLen returns the total number of inotify watches +// InotifyWatchLen returns the total number of inotify watches. func (p ProcFDInfos) InotifyWatchLen() (int, error) { length := 0 for _, f := range p { diff --git a/vendor/github.com/prometheus/procfs/proc_limits.go b/vendor/github.com/prometheus/procfs/proc_limits.go index dd20f198a..7a1388185 100644 --- a/vendor/github.com/prometheus/procfs/proc_limits.go +++ b/vendor/github.com/prometheus/procfs/proc_limits.go @@ -79,7 +79,7 @@ var ( // NewLimits returns the current soft limits of the process. // -// Deprecated: use p.Limits() instead +// Deprecated: Use p.Limits() instead. func (p Proc) NewLimits() (ProcLimits, error) { return p.Limits() } diff --git a/vendor/github.com/prometheus/procfs/proc_maps.go b/vendor/github.com/prometheus/procfs/proc_maps.go index 1d7772d51..f1bcbf32b 100644 --- a/vendor/github.com/prometheus/procfs/proc_maps.go +++ b/vendor/github.com/prometheus/procfs/proc_maps.go @@ -11,7 +11,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris) && !js // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +// +build !js package procfs @@ -25,7 +27,7 @@ import ( "golang.org/x/sys/unix" ) -// ProcMapPermissions contains permission settings read from /proc/[pid]/maps +// ProcMapPermissions contains permission settings read from `/proc/[pid]/maps`. type ProcMapPermissions struct { // mapping has the [R]ead flag set Read bool @@ -39,8 +41,8 @@ type ProcMapPermissions struct { Private bool } -// ProcMap contains the process memory-mappings of the process, -// read from /proc/[pid]/maps +// ProcMap contains the process memory-mappings of the process +// read from `/proc/[pid]/maps`. type ProcMap struct { // The start address of current mapping. StartAddr uintptr @@ -79,7 +81,7 @@ func parseDevice(s string) (uint64, error) { return unix.Mkdev(uint32(major), uint32(minor)), nil } -// parseAddress just converts a hex-string to a uintptr +// parseAddress converts a hex-string to a uintptr. func parseAddress(s string) (uintptr, error) { a, err := strconv.ParseUint(s, 16, 0) if err != nil { @@ -89,7 +91,7 @@ func parseAddress(s string) (uintptr, error) { return uintptr(a), nil } -// parseAddresses parses the start-end address +// parseAddresses parses the start-end address. func parseAddresses(s string) (uintptr, uintptr, error) { toks := strings.Split(s, "-") if len(toks) < 2 { diff --git a/vendor/github.com/prometheus/procfs/proc_netstat.go b/vendor/github.com/prometheus/procfs/proc_netstat.go new file mode 100644 index 000000000..48b523819 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_netstat.go @@ -0,0 +1,440 @@ +// Copyright 2022 The Prometheus 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 procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ProcNetstat models the content of /proc//net/netstat. +type ProcNetstat struct { + // The process ID. + PID int + TcpExt + IpExt +} + +type TcpExt struct { // nolint:revive + SyncookiesSent float64 + SyncookiesRecv float64 + SyncookiesFailed float64 + EmbryonicRsts float64 + PruneCalled float64 + RcvPruned float64 + OfoPruned float64 + OutOfWindowIcmps float64 + LockDroppedIcmps float64 + ArpFilter float64 + TW float64 + TWRecycled float64 + TWKilled float64 + PAWSActive float64 + PAWSEstab float64 + DelayedACKs float64 + DelayedACKLocked float64 + DelayedACKLost float64 + ListenOverflows float64 + ListenDrops float64 + TCPHPHits float64 + TCPPureAcks float64 + TCPHPAcks float64 + TCPRenoRecovery float64 + TCPSackRecovery float64 + TCPSACKReneging float64 + TCPSACKReorder float64 + TCPRenoReorder float64 + TCPTSReorder float64 + TCPFullUndo float64 + TCPPartialUndo float64 + TCPDSACKUndo float64 + TCPLossUndo float64 + TCPLostRetransmit float64 + TCPRenoFailures float64 + TCPSackFailures float64 + TCPLossFailures float64 + TCPFastRetrans float64 + TCPSlowStartRetrans float64 + TCPTimeouts float64 + TCPLossProbes float64 + TCPLossProbeRecovery float64 + TCPRenoRecoveryFail float64 + TCPSackRecoveryFail float64 + TCPRcvCollapsed float64 + TCPDSACKOldSent float64 + TCPDSACKOfoSent float64 + TCPDSACKRecv float64 + TCPDSACKOfoRecv float64 + TCPAbortOnData float64 + TCPAbortOnClose float64 + TCPAbortOnMemory float64 + TCPAbortOnTimeout float64 + TCPAbortOnLinger float64 + TCPAbortFailed float64 + TCPMemoryPressures float64 + TCPMemoryPressuresChrono float64 + TCPSACKDiscard float64 + TCPDSACKIgnoredOld float64 + TCPDSACKIgnoredNoUndo float64 + TCPSpuriousRTOs float64 + TCPMD5NotFound float64 + TCPMD5Unexpected float64 + TCPMD5Failure float64 + TCPSackShifted float64 + TCPSackMerged float64 + TCPSackShiftFallback float64 + TCPBacklogDrop float64 + PFMemallocDrop float64 + TCPMinTTLDrop float64 + TCPDeferAcceptDrop float64 + IPReversePathFilter float64 + TCPTimeWaitOverflow float64 + TCPReqQFullDoCookies float64 + TCPReqQFullDrop float64 + TCPRetransFail float64 + TCPRcvCoalesce float64 + TCPOFOQueue float64 + TCPOFODrop float64 + TCPOFOMerge float64 + TCPChallengeACK float64 + TCPSYNChallenge float64 + TCPFastOpenActive float64 + TCPFastOpenActiveFail float64 + TCPFastOpenPassive float64 + TCPFastOpenPassiveFail float64 + TCPFastOpenListenOverflow float64 + TCPFastOpenCookieReqd float64 + TCPFastOpenBlackhole float64 + TCPSpuriousRtxHostQueues float64 + BusyPollRxPackets float64 + TCPAutoCorking float64 + TCPFromZeroWindowAdv float64 + TCPToZeroWindowAdv float64 + TCPWantZeroWindowAdv float64 + TCPSynRetrans float64 + TCPOrigDataSent float64 + TCPHystartTrainDetect float64 + TCPHystartTrainCwnd float64 + TCPHystartDelayDetect float64 + TCPHystartDelayCwnd float64 + TCPACKSkippedSynRecv float64 + TCPACKSkippedPAWS float64 + TCPACKSkippedSeq float64 + TCPACKSkippedFinWait2 float64 + TCPACKSkippedTimeWait float64 + TCPACKSkippedChallenge float64 + TCPWinProbe float64 + TCPKeepAlive float64 + TCPMTUPFail float64 + TCPMTUPSuccess float64 + TCPWqueueTooBig float64 +} + +type IpExt struct { // nolint:revive + InNoRoutes float64 + InTruncatedPkts float64 + InMcastPkts float64 + OutMcastPkts float64 + InBcastPkts float64 + OutBcastPkts float64 + InOctets float64 + OutOctets float64 + InMcastOctets float64 + OutMcastOctets float64 + InBcastOctets float64 + OutBcastOctets float64 + InCsumErrors float64 + InNoECTPkts float64 + InECT1Pkts float64 + InECT0Pkts float64 + InCEPkts float64 + ReasmOverlaps float64 +} + +func (p Proc) Netstat() (ProcNetstat, error) { + filename := p.path("net/netstat") + data, err := util.ReadFileNoStat(filename) + if err != nil { + return ProcNetstat{PID: p.PID}, err + } + procNetstat, err := parseNetstat(bytes.NewReader(data), filename) + procNetstat.PID = p.PID + return procNetstat, err +} + +// parseNetstat parses the metrics from proc//net/netstat file +// and returns a ProcNetstat structure. +func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) { + var ( + scanner = bufio.NewScanner(r) + procNetstat = ProcNetstat{} + ) + + for scanner.Scan() { + nameParts := strings.Split(scanner.Text(), " ") + scanner.Scan() + valueParts := strings.Split(scanner.Text(), " ") + // Remove trailing :. + protocol := strings.TrimSuffix(nameParts[0], ":") + if len(nameParts) != len(valueParts) { + return procNetstat, fmt.Errorf("mismatch field count mismatch in %s: %s", + fileName, protocol) + } + for i := 1; i < len(nameParts); i++ { + value, err := strconv.ParseFloat(valueParts[i], 64) + if err != nil { + return procNetstat, err + } + key := nameParts[i] + + switch protocol { + case "TcpExt": + switch key { + case "SyncookiesSent": + procNetstat.TcpExt.SyncookiesSent = value + case "SyncookiesRecv": + procNetstat.TcpExt.SyncookiesRecv = value + case "SyncookiesFailed": + procNetstat.TcpExt.SyncookiesFailed = value + case "EmbryonicRsts": + procNetstat.TcpExt.EmbryonicRsts = value + case "PruneCalled": + procNetstat.TcpExt.PruneCalled = value + case "RcvPruned": + procNetstat.TcpExt.RcvPruned = value + case "OfoPruned": + procNetstat.TcpExt.OfoPruned = value + case "OutOfWindowIcmps": + procNetstat.TcpExt.OutOfWindowIcmps = value + case "LockDroppedIcmps": + procNetstat.TcpExt.LockDroppedIcmps = value + case "ArpFilter": + procNetstat.TcpExt.ArpFilter = value + case "TW": + procNetstat.TcpExt.TW = value + case "TWRecycled": + procNetstat.TcpExt.TWRecycled = value + case "TWKilled": + procNetstat.TcpExt.TWKilled = value + case "PAWSActive": + procNetstat.TcpExt.PAWSActive = value + case "PAWSEstab": + procNetstat.TcpExt.PAWSEstab = value + case "DelayedACKs": + procNetstat.TcpExt.DelayedACKs = value + case "DelayedACKLocked": + procNetstat.TcpExt.DelayedACKLocked = value + case "DelayedACKLost": + procNetstat.TcpExt.DelayedACKLost = value + case "ListenOverflows": + procNetstat.TcpExt.ListenOverflows = value + case "ListenDrops": + procNetstat.TcpExt.ListenDrops = value + case "TCPHPHits": + procNetstat.TcpExt.TCPHPHits = value + case "TCPPureAcks": + procNetstat.TcpExt.TCPPureAcks = value + case "TCPHPAcks": + procNetstat.TcpExt.TCPHPAcks = value + case "TCPRenoRecovery": + procNetstat.TcpExt.TCPRenoRecovery = value + case "TCPSackRecovery": + procNetstat.TcpExt.TCPSackRecovery = value + case "TCPSACKReneging": + procNetstat.TcpExt.TCPSACKReneging = value + case "TCPSACKReorder": + procNetstat.TcpExt.TCPSACKReorder = value + case "TCPRenoReorder": + procNetstat.TcpExt.TCPRenoReorder = value + case "TCPTSReorder": + procNetstat.TcpExt.TCPTSReorder = value + case "TCPFullUndo": + procNetstat.TcpExt.TCPFullUndo = value + case "TCPPartialUndo": + procNetstat.TcpExt.TCPPartialUndo = value + case "TCPDSACKUndo": + procNetstat.TcpExt.TCPDSACKUndo = value + case "TCPLossUndo": + procNetstat.TcpExt.TCPLossUndo = value + case "TCPLostRetransmit": + procNetstat.TcpExt.TCPLostRetransmit = value + case "TCPRenoFailures": + procNetstat.TcpExt.TCPRenoFailures = value + case "TCPSackFailures": + procNetstat.TcpExt.TCPSackFailures = value + case "TCPLossFailures": + procNetstat.TcpExt.TCPLossFailures = value + case "TCPFastRetrans": + procNetstat.TcpExt.TCPFastRetrans = value + case "TCPSlowStartRetrans": + procNetstat.TcpExt.TCPSlowStartRetrans = value + case "TCPTimeouts": + procNetstat.TcpExt.TCPTimeouts = value + case "TCPLossProbes": + procNetstat.TcpExt.TCPLossProbes = value + case "TCPLossProbeRecovery": + procNetstat.TcpExt.TCPLossProbeRecovery = value + case "TCPRenoRecoveryFail": + procNetstat.TcpExt.TCPRenoRecoveryFail = value + case "TCPSackRecoveryFail": + procNetstat.TcpExt.TCPSackRecoveryFail = value + case "TCPRcvCollapsed": + procNetstat.TcpExt.TCPRcvCollapsed = value + case "TCPDSACKOldSent": + procNetstat.TcpExt.TCPDSACKOldSent = value + case "TCPDSACKOfoSent": + procNetstat.TcpExt.TCPDSACKOfoSent = value + case "TCPDSACKRecv": + procNetstat.TcpExt.TCPDSACKRecv = value + case "TCPDSACKOfoRecv": + procNetstat.TcpExt.TCPDSACKOfoRecv = value + case "TCPAbortOnData": + procNetstat.TcpExt.TCPAbortOnData = value + case "TCPAbortOnClose": + procNetstat.TcpExt.TCPAbortOnClose = value + case "TCPDeferAcceptDrop": + procNetstat.TcpExt.TCPDeferAcceptDrop = value + case "IPReversePathFilter": + procNetstat.TcpExt.IPReversePathFilter = value + case "TCPTimeWaitOverflow": + procNetstat.TcpExt.TCPTimeWaitOverflow = value + case "TCPReqQFullDoCookies": + procNetstat.TcpExt.TCPReqQFullDoCookies = value + case "TCPReqQFullDrop": + procNetstat.TcpExt.TCPReqQFullDrop = value + case "TCPRetransFail": + procNetstat.TcpExt.TCPRetransFail = value + case "TCPRcvCoalesce": + procNetstat.TcpExt.TCPRcvCoalesce = value + case "TCPOFOQueue": + procNetstat.TcpExt.TCPOFOQueue = value + case "TCPOFODrop": + procNetstat.TcpExt.TCPOFODrop = value + case "TCPOFOMerge": + procNetstat.TcpExt.TCPOFOMerge = value + case "TCPChallengeACK": + procNetstat.TcpExt.TCPChallengeACK = value + case "TCPSYNChallenge": + procNetstat.TcpExt.TCPSYNChallenge = value + case "TCPFastOpenActive": + procNetstat.TcpExt.TCPFastOpenActive = value + case "TCPFastOpenActiveFail": + procNetstat.TcpExt.TCPFastOpenActiveFail = value + case "TCPFastOpenPassive": + procNetstat.TcpExt.TCPFastOpenPassive = value + case "TCPFastOpenPassiveFail": + procNetstat.TcpExt.TCPFastOpenPassiveFail = value + case "TCPFastOpenListenOverflow": + procNetstat.TcpExt.TCPFastOpenListenOverflow = value + case "TCPFastOpenCookieReqd": + procNetstat.TcpExt.TCPFastOpenCookieReqd = value + case "TCPFastOpenBlackhole": + procNetstat.TcpExt.TCPFastOpenBlackhole = value + case "TCPSpuriousRtxHostQueues": + procNetstat.TcpExt.TCPSpuriousRtxHostQueues = value + case "BusyPollRxPackets": + procNetstat.TcpExt.BusyPollRxPackets = value + case "TCPAutoCorking": + procNetstat.TcpExt.TCPAutoCorking = value + case "TCPFromZeroWindowAdv": + procNetstat.TcpExt.TCPFromZeroWindowAdv = value + case "TCPToZeroWindowAdv": + procNetstat.TcpExt.TCPToZeroWindowAdv = value + case "TCPWantZeroWindowAdv": + procNetstat.TcpExt.TCPWantZeroWindowAdv = value + case "TCPSynRetrans": + procNetstat.TcpExt.TCPSynRetrans = value + case "TCPOrigDataSent": + procNetstat.TcpExt.TCPOrigDataSent = value + case "TCPHystartTrainDetect": + procNetstat.TcpExt.TCPHystartTrainDetect = value + case "TCPHystartTrainCwnd": + procNetstat.TcpExt.TCPHystartTrainCwnd = value + case "TCPHystartDelayDetect": + procNetstat.TcpExt.TCPHystartDelayDetect = value + case "TCPHystartDelayCwnd": + procNetstat.TcpExt.TCPHystartDelayCwnd = value + case "TCPACKSkippedSynRecv": + procNetstat.TcpExt.TCPACKSkippedSynRecv = value + case "TCPACKSkippedPAWS": + procNetstat.TcpExt.TCPACKSkippedPAWS = value + case "TCPACKSkippedSeq": + procNetstat.TcpExt.TCPACKSkippedSeq = value + case "TCPACKSkippedFinWait2": + procNetstat.TcpExt.TCPACKSkippedFinWait2 = value + case "TCPACKSkippedTimeWait": + procNetstat.TcpExt.TCPACKSkippedTimeWait = value + case "TCPACKSkippedChallenge": + procNetstat.TcpExt.TCPACKSkippedChallenge = value + case "TCPWinProbe": + procNetstat.TcpExt.TCPWinProbe = value + case "TCPKeepAlive": + procNetstat.TcpExt.TCPKeepAlive = value + case "TCPMTUPFail": + procNetstat.TcpExt.TCPMTUPFail = value + case "TCPMTUPSuccess": + procNetstat.TcpExt.TCPMTUPSuccess = value + case "TCPWqueueTooBig": + procNetstat.TcpExt.TCPWqueueTooBig = value + } + case "IpExt": + switch key { + case "InNoRoutes": + procNetstat.IpExt.InNoRoutes = value + case "InTruncatedPkts": + procNetstat.IpExt.InTruncatedPkts = value + case "InMcastPkts": + procNetstat.IpExt.InMcastPkts = value + case "OutMcastPkts": + procNetstat.IpExt.OutMcastPkts = value + case "InBcastPkts": + procNetstat.IpExt.InBcastPkts = value + case "OutBcastPkts": + procNetstat.IpExt.OutBcastPkts = value + case "InOctets": + procNetstat.IpExt.InOctets = value + case "OutOctets": + procNetstat.IpExt.OutOctets = value + case "InMcastOctets": + procNetstat.IpExt.InMcastOctets = value + case "OutMcastOctets": + procNetstat.IpExt.OutMcastOctets = value + case "InBcastOctets": + procNetstat.IpExt.InBcastOctets = value + case "OutBcastOctets": + procNetstat.IpExt.OutBcastOctets = value + case "InCsumErrors": + procNetstat.IpExt.InCsumErrors = value + case "InNoECTPkts": + procNetstat.IpExt.InNoECTPkts = value + case "InECT1Pkts": + procNetstat.IpExt.InECT1Pkts = value + case "InECT0Pkts": + procNetstat.IpExt.InECT0Pkts = value + case "InCEPkts": + procNetstat.IpExt.InCEPkts = value + case "ReasmOverlaps": + procNetstat.IpExt.ReasmOverlaps = value + } + } + } + } + return procNetstat, scanner.Err() +} diff --git a/vendor/github.com/prometheus/procfs/proc_psi.go b/vendor/github.com/prometheus/procfs/proc_psi.go index dc6c14f0a..a68fe1529 100644 --- a/vendor/github.com/prometheus/procfs/proc_psi.go +++ b/vendor/github.com/prometheus/procfs/proc_psi.go @@ -35,9 +35,10 @@ import ( const lineFormat = "avg10=%f avg60=%f avg300=%f total=%d" -// PSILine is a single line of values as returned by /proc/pressure/* -// The Avg entries are averages over n seconds, as a percentage -// The Total line is in microseconds +// PSILine is a single line of values as returned by `/proc/pressure/*`. +// +// The Avg entries are averages over n seconds, as a percentage. +// The Total line is in microseconds. type PSILine struct { Avg10 float64 Avg60 float64 @@ -46,8 +47,9 @@ type PSILine struct { } // PSIStats represent pressure stall information from /proc/pressure/* -// Some indicates the share of time in which at least some tasks are stalled -// Full indicates the share of time in which all non-idle tasks are stalled simultaneously +// +// "Some" indicates the share of time in which at least some tasks are stalled. +// "Full" indicates the share of time in which all non-idle tasks are stalled simultaneously. type PSIStats struct { Some *PSILine Full *PSILine @@ -65,7 +67,7 @@ func (fs FS) PSIStatsForResource(resource string) (PSIStats, error) { return parsePSIStats(resource, bytes.NewReader(data)) } -// parsePSIStats parses the specified file for pressure stall information +// parsePSIStats parses the specified file for pressure stall information. func parsePSIStats(resource string, r io.Reader) (PSIStats, error) { psiStats := PSIStats{} diff --git a/vendor/github.com/prometheus/procfs/proc_smaps.go b/vendor/github.com/prometheus/procfs/proc_smaps.go index a576a720a..0e97d9957 100644 --- a/vendor/github.com/prometheus/procfs/proc_smaps.go +++ b/vendor/github.com/prometheus/procfs/proc_smaps.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !windows // +build !windows package procfs @@ -28,30 +29,30 @@ import ( ) var ( - // match the header line before each mapped zone in /proc/pid/smaps + // match the header line before each mapped zone in `/proc/pid/smaps`. procSMapsHeaderLine = regexp.MustCompile(`^[a-f0-9].*$`) ) type ProcSMapsRollup struct { - // Amount of the mapping that is currently resident in RAM + // Amount of the mapping that is currently resident in RAM. Rss uint64 - // Process's proportional share of this mapping + // Process's proportional share of this mapping. Pss uint64 - // Size in bytes of clean shared pages + // Size in bytes of clean shared pages. SharedClean uint64 - // Size in bytes of dirty shared pages + // Size in bytes of dirty shared pages. SharedDirty uint64 - // Size in bytes of clean private pages + // Size in bytes of clean private pages. PrivateClean uint64 - // Size in bytes of dirty private pages + // Size in bytes of dirty private pages. PrivateDirty uint64 - // Amount of memory currently marked as referenced or accessed + // Amount of memory currently marked as referenced or accessed. Referenced uint64 - // Amount of memory that does not belong to any file + // Amount of memory that does not belong to any file. Anonymous uint64 - // Amount would-be-anonymous memory currently on swap + // Amount would-be-anonymous memory currently on swap. Swap uint64 - // Process's proportional memory on swap + // Process's proportional memory on swap. SwapPss uint64 } diff --git a/vendor/github.com/prometheus/procfs/proc_snmp.go b/vendor/github.com/prometheus/procfs/proc_snmp.go new file mode 100644 index 000000000..ae191896c --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_snmp.go @@ -0,0 +1,353 @@ +// Copyright 2022 The Prometheus 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 procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ProcSnmp models the content of /proc//net/snmp. +type ProcSnmp struct { + // The process ID. + PID int + Ip + Icmp + IcmpMsg + Tcp + Udp + UdpLite +} + +type Ip struct { // nolint:revive + Forwarding float64 + DefaultTTL float64 + InReceives float64 + InHdrErrors float64 + InAddrErrors float64 + ForwDatagrams float64 + InUnknownProtos float64 + InDiscards float64 + InDelivers float64 + OutRequests float64 + OutDiscards float64 + OutNoRoutes float64 + ReasmTimeout float64 + ReasmReqds float64 + ReasmOKs float64 + ReasmFails float64 + FragOKs float64 + FragFails float64 + FragCreates float64 +} + +type Icmp struct { + InMsgs float64 + InErrors float64 + InCsumErrors float64 + InDestUnreachs float64 + InTimeExcds float64 + InParmProbs float64 + InSrcQuenchs float64 + InRedirects float64 + InEchos float64 + InEchoReps float64 + InTimestamps float64 + InTimestampReps float64 + InAddrMasks float64 + InAddrMaskReps float64 + OutMsgs float64 + OutErrors float64 + OutDestUnreachs float64 + OutTimeExcds float64 + OutParmProbs float64 + OutSrcQuenchs float64 + OutRedirects float64 + OutEchos float64 + OutEchoReps float64 + OutTimestamps float64 + OutTimestampReps float64 + OutAddrMasks float64 + OutAddrMaskReps float64 +} + +type IcmpMsg struct { + InType3 float64 + OutType3 float64 +} + +type Tcp struct { // nolint:revive + RtoAlgorithm float64 + RtoMin float64 + RtoMax float64 + MaxConn float64 + ActiveOpens float64 + PassiveOpens float64 + AttemptFails float64 + EstabResets float64 + CurrEstab float64 + InSegs float64 + OutSegs float64 + RetransSegs float64 + InErrs float64 + OutRsts float64 + InCsumErrors float64 +} + +type Udp struct { // nolint:revive + InDatagrams float64 + NoPorts float64 + InErrors float64 + OutDatagrams float64 + RcvbufErrors float64 + SndbufErrors float64 + InCsumErrors float64 + IgnoredMulti float64 +} + +type UdpLite struct { // nolint:revive + InDatagrams float64 + NoPorts float64 + InErrors float64 + OutDatagrams float64 + RcvbufErrors float64 + SndbufErrors float64 + InCsumErrors float64 + IgnoredMulti float64 +} + +func (p Proc) Snmp() (ProcSnmp, error) { + filename := p.path("net/snmp") + data, err := util.ReadFileNoStat(filename) + if err != nil { + return ProcSnmp{PID: p.PID}, err + } + procSnmp, err := parseSnmp(bytes.NewReader(data), filename) + procSnmp.PID = p.PID + return procSnmp, err +} + +// parseSnmp parses the metrics from proc//net/snmp file +// and returns a map contains those metrics (e.g. {"Ip": {"Forwarding": 2}}). +func parseSnmp(r io.Reader, fileName string) (ProcSnmp, error) { + var ( + scanner = bufio.NewScanner(r) + procSnmp = ProcSnmp{} + ) + + for scanner.Scan() { + nameParts := strings.Split(scanner.Text(), " ") + scanner.Scan() + valueParts := strings.Split(scanner.Text(), " ") + // Remove trailing :. + protocol := strings.TrimSuffix(nameParts[0], ":") + if len(nameParts) != len(valueParts) { + return procSnmp, fmt.Errorf("mismatch field count mismatch in %s: %s", + fileName, protocol) + } + for i := 1; i < len(nameParts); i++ { + value, err := strconv.ParseFloat(valueParts[i], 64) + if err != nil { + return procSnmp, err + } + key := nameParts[i] + + switch protocol { + case "Ip": + switch key { + case "Forwarding": + procSnmp.Ip.Forwarding = value + case "DefaultTTL": + procSnmp.Ip.DefaultTTL = value + case "InReceives": + procSnmp.Ip.InReceives = value + case "InHdrErrors": + procSnmp.Ip.InHdrErrors = value + case "InAddrErrors": + procSnmp.Ip.InAddrErrors = value + case "ForwDatagrams": + procSnmp.Ip.ForwDatagrams = value + case "InUnknownProtos": + procSnmp.Ip.InUnknownProtos = value + case "InDiscards": + procSnmp.Ip.InDiscards = value + case "InDelivers": + procSnmp.Ip.InDelivers = value + case "OutRequests": + procSnmp.Ip.OutRequests = value + case "OutDiscards": + procSnmp.Ip.OutDiscards = value + case "OutNoRoutes": + procSnmp.Ip.OutNoRoutes = value + case "ReasmTimeout": + procSnmp.Ip.ReasmTimeout = value + case "ReasmReqds": + procSnmp.Ip.ReasmReqds = value + case "ReasmOKs": + procSnmp.Ip.ReasmOKs = value + case "ReasmFails": + procSnmp.Ip.ReasmFails = value + case "FragOKs": + procSnmp.Ip.FragOKs = value + case "FragFails": + procSnmp.Ip.FragFails = value + case "FragCreates": + procSnmp.Ip.FragCreates = value + } + case "Icmp": + switch key { + case "InMsgs": + procSnmp.Icmp.InMsgs = value + case "InErrors": + procSnmp.Icmp.InErrors = value + case "InCsumErrors": + procSnmp.Icmp.InCsumErrors = value + case "InDestUnreachs": + procSnmp.Icmp.InDestUnreachs = value + case "InTimeExcds": + procSnmp.Icmp.InTimeExcds = value + case "InParmProbs": + procSnmp.Icmp.InParmProbs = value + case "InSrcQuenchs": + procSnmp.Icmp.InSrcQuenchs = value + case "InRedirects": + procSnmp.Icmp.InRedirects = value + case "InEchos": + procSnmp.Icmp.InEchos = value + case "InEchoReps": + procSnmp.Icmp.InEchoReps = value + case "InTimestamps": + procSnmp.Icmp.InTimestamps = value + case "InTimestampReps": + procSnmp.Icmp.InTimestampReps = value + case "InAddrMasks": + procSnmp.Icmp.InAddrMasks = value + case "InAddrMaskReps": + procSnmp.Icmp.InAddrMaskReps = value + case "OutMsgs": + procSnmp.Icmp.OutMsgs = value + case "OutErrors": + procSnmp.Icmp.OutErrors = value + case "OutDestUnreachs": + procSnmp.Icmp.OutDestUnreachs = value + case "OutTimeExcds": + procSnmp.Icmp.OutTimeExcds = value + case "OutParmProbs": + procSnmp.Icmp.OutParmProbs = value + case "OutSrcQuenchs": + procSnmp.Icmp.OutSrcQuenchs = value + case "OutRedirects": + procSnmp.Icmp.OutRedirects = value + case "OutEchos": + procSnmp.Icmp.OutEchos = value + case "OutEchoReps": + procSnmp.Icmp.OutEchoReps = value + case "OutTimestamps": + procSnmp.Icmp.OutTimestamps = value + case "OutTimestampReps": + procSnmp.Icmp.OutTimestampReps = value + case "OutAddrMasks": + procSnmp.Icmp.OutAddrMasks = value + case "OutAddrMaskReps": + procSnmp.Icmp.OutAddrMaskReps = value + } + case "IcmpMsg": + switch key { + case "InType3": + procSnmp.IcmpMsg.InType3 = value + case "OutType3": + procSnmp.IcmpMsg.OutType3 = value + } + case "Tcp": + switch key { + case "RtoAlgorithm": + procSnmp.Tcp.RtoAlgorithm = value + case "RtoMin": + procSnmp.Tcp.RtoMin = value + case "RtoMax": + procSnmp.Tcp.RtoMax = value + case "MaxConn": + procSnmp.Tcp.MaxConn = value + case "ActiveOpens": + procSnmp.Tcp.ActiveOpens = value + case "PassiveOpens": + procSnmp.Tcp.PassiveOpens = value + case "AttemptFails": + procSnmp.Tcp.AttemptFails = value + case "EstabResets": + procSnmp.Tcp.EstabResets = value + case "CurrEstab": + procSnmp.Tcp.CurrEstab = value + case "InSegs": + procSnmp.Tcp.InSegs = value + case "OutSegs": + procSnmp.Tcp.OutSegs = value + case "RetransSegs": + procSnmp.Tcp.RetransSegs = value + case "InErrs": + procSnmp.Tcp.InErrs = value + case "OutRsts": + procSnmp.Tcp.OutRsts = value + case "InCsumErrors": + procSnmp.Tcp.InCsumErrors = value + } + case "Udp": + switch key { + case "InDatagrams": + procSnmp.Udp.InDatagrams = value + case "NoPorts": + procSnmp.Udp.NoPorts = value + case "InErrors": + procSnmp.Udp.InErrors = value + case "OutDatagrams": + procSnmp.Udp.OutDatagrams = value + case "RcvbufErrors": + procSnmp.Udp.RcvbufErrors = value + case "SndbufErrors": + procSnmp.Udp.SndbufErrors = value + case "InCsumErrors": + procSnmp.Udp.InCsumErrors = value + case "IgnoredMulti": + procSnmp.Udp.IgnoredMulti = value + } + case "UdpLite": + switch key { + case "InDatagrams": + procSnmp.UdpLite.InDatagrams = value + case "NoPorts": + procSnmp.UdpLite.NoPorts = value + case "InErrors": + procSnmp.UdpLite.InErrors = value + case "OutDatagrams": + procSnmp.UdpLite.OutDatagrams = value + case "RcvbufErrors": + procSnmp.UdpLite.RcvbufErrors = value + case "SndbufErrors": + procSnmp.UdpLite.SndbufErrors = value + case "InCsumErrors": + procSnmp.UdpLite.InCsumErrors = value + case "IgnoredMulti": + procSnmp.UdpLite.IgnoredMulti = value + } + } + } + } + return procSnmp, scanner.Err() +} diff --git a/vendor/github.com/prometheus/procfs/proc_snmp6.go b/vendor/github.com/prometheus/procfs/proc_snmp6.go new file mode 100644 index 000000000..f611992d5 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_snmp6.go @@ -0,0 +1,381 @@ +// Copyright 2022 The Prometheus 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 procfs + +import ( + "bufio" + "bytes" + "errors" + "io" + "os" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ProcSnmp6 models the content of /proc//net/snmp6. +type ProcSnmp6 struct { + // The process ID. + PID int + Ip6 + Icmp6 + Udp6 + UdpLite6 +} + +type Ip6 struct { // nolint:revive + InReceives float64 + InHdrErrors float64 + InTooBigErrors float64 + InNoRoutes float64 + InAddrErrors float64 + InUnknownProtos float64 + InTruncatedPkts float64 + InDiscards float64 + InDelivers float64 + OutForwDatagrams float64 + OutRequests float64 + OutDiscards float64 + OutNoRoutes float64 + ReasmTimeout float64 + ReasmReqds float64 + ReasmOKs float64 + ReasmFails float64 + FragOKs float64 + FragFails float64 + FragCreates float64 + InMcastPkts float64 + OutMcastPkts float64 + InOctets float64 + OutOctets float64 + InMcastOctets float64 + OutMcastOctets float64 + InBcastOctets float64 + OutBcastOctets float64 + InNoECTPkts float64 + InECT1Pkts float64 + InECT0Pkts float64 + InCEPkts float64 +} + +type Icmp6 struct { + InMsgs float64 + InErrors float64 + OutMsgs float64 + OutErrors float64 + InCsumErrors float64 + InDestUnreachs float64 + InPktTooBigs float64 + InTimeExcds float64 + InParmProblems float64 + InEchos float64 + InEchoReplies float64 + InGroupMembQueries float64 + InGroupMembResponses float64 + InGroupMembReductions float64 + InRouterSolicits float64 + InRouterAdvertisements float64 + InNeighborSolicits float64 + InNeighborAdvertisements float64 + InRedirects float64 + InMLDv2Reports float64 + OutDestUnreachs float64 + OutPktTooBigs float64 + OutTimeExcds float64 + OutParmProblems float64 + OutEchos float64 + OutEchoReplies float64 + OutGroupMembQueries float64 + OutGroupMembResponses float64 + OutGroupMembReductions float64 + OutRouterSolicits float64 + OutRouterAdvertisements float64 + OutNeighborSolicits float64 + OutNeighborAdvertisements float64 + OutRedirects float64 + OutMLDv2Reports float64 + InType1 float64 + InType134 float64 + InType135 float64 + InType136 float64 + InType143 float64 + OutType133 float64 + OutType135 float64 + OutType136 float64 + OutType143 float64 +} + +type Udp6 struct { // nolint:revive + InDatagrams float64 + NoPorts float64 + InErrors float64 + OutDatagrams float64 + RcvbufErrors float64 + SndbufErrors float64 + InCsumErrors float64 + IgnoredMulti float64 +} + +type UdpLite6 struct { // nolint:revive + InDatagrams float64 + NoPorts float64 + InErrors float64 + OutDatagrams float64 + RcvbufErrors float64 + SndbufErrors float64 + InCsumErrors float64 +} + +func (p Proc) Snmp6() (ProcSnmp6, error) { + filename := p.path("net/snmp6") + data, err := util.ReadFileNoStat(filename) + if err != nil { + // On systems with IPv6 disabled, this file won't exist. + // Do nothing. + if errors.Is(err, os.ErrNotExist) { + return ProcSnmp6{PID: p.PID}, nil + } + + return ProcSnmp6{PID: p.PID}, err + } + + procSnmp6, err := parseSNMP6Stats(bytes.NewReader(data)) + procSnmp6.PID = p.PID + return procSnmp6, err +} + +// parseSnmp6 parses the metrics from proc//net/snmp6 file +// and returns a map contains those metrics. +func parseSNMP6Stats(r io.Reader) (ProcSnmp6, error) { + var ( + scanner = bufio.NewScanner(r) + procSnmp6 = ProcSnmp6{} + ) + + for scanner.Scan() { + stat := strings.Fields(scanner.Text()) + if len(stat) < 2 { + continue + } + // Expect to have "6" in metric name, skip line otherwise + if sixIndex := strings.Index(stat[0], "6"); sixIndex != -1 { + protocol := stat[0][:sixIndex+1] + key := stat[0][sixIndex+1:] + value, err := strconv.ParseFloat(stat[1], 64) + if err != nil { + return procSnmp6, err + } + + switch protocol { + case "Ip6": + switch key { + case "InReceives": + procSnmp6.Ip6.InReceives = value + case "InHdrErrors": + procSnmp6.Ip6.InHdrErrors = value + case "InTooBigErrors": + procSnmp6.Ip6.InTooBigErrors = value + case "InNoRoutes": + procSnmp6.Ip6.InNoRoutes = value + case "InAddrErrors": + procSnmp6.Ip6.InAddrErrors = value + case "InUnknownProtos": + procSnmp6.Ip6.InUnknownProtos = value + case "InTruncatedPkts": + procSnmp6.Ip6.InTruncatedPkts = value + case "InDiscards": + procSnmp6.Ip6.InDiscards = value + case "InDelivers": + procSnmp6.Ip6.InDelivers = value + case "OutForwDatagrams": + procSnmp6.Ip6.OutForwDatagrams = value + case "OutRequests": + procSnmp6.Ip6.OutRequests = value + case "OutDiscards": + procSnmp6.Ip6.OutDiscards = value + case "OutNoRoutes": + procSnmp6.Ip6.OutNoRoutes = value + case "ReasmTimeout": + procSnmp6.Ip6.ReasmTimeout = value + case "ReasmReqds": + procSnmp6.Ip6.ReasmReqds = value + case "ReasmOKs": + procSnmp6.Ip6.ReasmOKs = value + case "ReasmFails": + procSnmp6.Ip6.ReasmFails = value + case "FragOKs": + procSnmp6.Ip6.FragOKs = value + case "FragFails": + procSnmp6.Ip6.FragFails = value + case "FragCreates": + procSnmp6.Ip6.FragCreates = value + case "InMcastPkts": + procSnmp6.Ip6.InMcastPkts = value + case "OutMcastPkts": + procSnmp6.Ip6.OutMcastPkts = value + case "InOctets": + procSnmp6.Ip6.InOctets = value + case "OutOctets": + procSnmp6.Ip6.OutOctets = value + case "InMcastOctets": + procSnmp6.Ip6.InMcastOctets = value + case "OutMcastOctets": + procSnmp6.Ip6.OutMcastOctets = value + case "InBcastOctets": + procSnmp6.Ip6.InBcastOctets = value + case "OutBcastOctets": + procSnmp6.Ip6.OutBcastOctets = value + case "InNoECTPkts": + procSnmp6.Ip6.InNoECTPkts = value + case "InECT1Pkts": + procSnmp6.Ip6.InECT1Pkts = value + case "InECT0Pkts": + procSnmp6.Ip6.InECT0Pkts = value + case "InCEPkts": + procSnmp6.Ip6.InCEPkts = value + + } + case "Icmp6": + switch key { + case "InMsgs": + procSnmp6.Icmp6.InMsgs = value + case "InErrors": + procSnmp6.Icmp6.InErrors = value + case "OutMsgs": + procSnmp6.Icmp6.OutMsgs = value + case "OutErrors": + procSnmp6.Icmp6.OutErrors = value + case "InCsumErrors": + procSnmp6.Icmp6.InCsumErrors = value + case "InDestUnreachs": + procSnmp6.Icmp6.InDestUnreachs = value + case "InPktTooBigs": + procSnmp6.Icmp6.InPktTooBigs = value + case "InTimeExcds": + procSnmp6.Icmp6.InTimeExcds = value + case "InParmProblems": + procSnmp6.Icmp6.InParmProblems = value + case "InEchos": + procSnmp6.Icmp6.InEchos = value + case "InEchoReplies": + procSnmp6.Icmp6.InEchoReplies = value + case "InGroupMembQueries": + procSnmp6.Icmp6.InGroupMembQueries = value + case "InGroupMembResponses": + procSnmp6.Icmp6.InGroupMembResponses = value + case "InGroupMembReductions": + procSnmp6.Icmp6.InGroupMembReductions = value + case "InRouterSolicits": + procSnmp6.Icmp6.InRouterSolicits = value + case "InRouterAdvertisements": + procSnmp6.Icmp6.InRouterAdvertisements = value + case "InNeighborSolicits": + procSnmp6.Icmp6.InNeighborSolicits = value + case "InNeighborAdvertisements": + procSnmp6.Icmp6.InNeighborAdvertisements = value + case "InRedirects": + procSnmp6.Icmp6.InRedirects = value + case "InMLDv2Reports": + procSnmp6.Icmp6.InMLDv2Reports = value + case "OutDestUnreachs": + procSnmp6.Icmp6.OutDestUnreachs = value + case "OutPktTooBigs": + procSnmp6.Icmp6.OutPktTooBigs = value + case "OutTimeExcds": + procSnmp6.Icmp6.OutTimeExcds = value + case "OutParmProblems": + procSnmp6.Icmp6.OutParmProblems = value + case "OutEchos": + procSnmp6.Icmp6.OutEchos = value + case "OutEchoReplies": + procSnmp6.Icmp6.OutEchoReplies = value + case "OutGroupMembQueries": + procSnmp6.Icmp6.OutGroupMembQueries = value + case "OutGroupMembResponses": + procSnmp6.Icmp6.OutGroupMembResponses = value + case "OutGroupMembReductions": + procSnmp6.Icmp6.OutGroupMembReductions = value + case "OutRouterSolicits": + procSnmp6.Icmp6.OutRouterSolicits = value + case "OutRouterAdvertisements": + procSnmp6.Icmp6.OutRouterAdvertisements = value + case "OutNeighborSolicits": + procSnmp6.Icmp6.OutNeighborSolicits = value + case "OutNeighborAdvertisements": + procSnmp6.Icmp6.OutNeighborAdvertisements = value + case "OutRedirects": + procSnmp6.Icmp6.OutRedirects = value + case "OutMLDv2Reports": + procSnmp6.Icmp6.OutMLDv2Reports = value + case "InType1": + procSnmp6.Icmp6.InType1 = value + case "InType134": + procSnmp6.Icmp6.InType134 = value + case "InType135": + procSnmp6.Icmp6.InType135 = value + case "InType136": + procSnmp6.Icmp6.InType136 = value + case "InType143": + procSnmp6.Icmp6.InType143 = value + case "OutType133": + procSnmp6.Icmp6.OutType133 = value + case "OutType135": + procSnmp6.Icmp6.OutType135 = value + case "OutType136": + procSnmp6.Icmp6.OutType136 = value + case "OutType143": + procSnmp6.Icmp6.OutType143 = value + } + case "Udp6": + switch key { + case "InDatagrams": + procSnmp6.Udp6.InDatagrams = value + case "NoPorts": + procSnmp6.Udp6.NoPorts = value + case "InErrors": + procSnmp6.Udp6.InErrors = value + case "OutDatagrams": + procSnmp6.Udp6.OutDatagrams = value + case "RcvbufErrors": + procSnmp6.Udp6.RcvbufErrors = value + case "SndbufErrors": + procSnmp6.Udp6.SndbufErrors = value + case "InCsumErrors": + procSnmp6.Udp6.InCsumErrors = value + case "IgnoredMulti": + procSnmp6.Udp6.IgnoredMulti = value + } + case "UdpLite6": + switch key { + case "InDatagrams": + procSnmp6.UdpLite6.InDatagrams = value + case "NoPorts": + procSnmp6.UdpLite6.NoPorts = value + case "InErrors": + procSnmp6.UdpLite6.InErrors = value + case "OutDatagrams": + procSnmp6.UdpLite6.OutDatagrams = value + case "RcvbufErrors": + procSnmp6.UdpLite6.RcvbufErrors = value + case "SndbufErrors": + procSnmp6.UdpLite6.SndbufErrors = value + case "InCsumErrors": + procSnmp6.UdpLite6.InCsumErrors = value + } + } + } + } + return procSnmp6, scanner.Err() +} diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/prometheus/procfs/proc_stat.go index 8c7b6e80a..06c556ef9 100644 --- a/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/vendor/github.com/prometheus/procfs/proc_stat.go @@ -81,10 +81,10 @@ type ProcStat struct { STime uint // Amount of time that this process's waited-for children have been // scheduled in user mode, measured in clock ticks. - CUTime uint + CUTime int // Amount of time that this process's waited-for children have been // scheduled in kernel mode, measured in clock ticks. - CSTime uint + CSTime int // For processes running a real-time scheduling policy, this is the negated // scheduling priority, minus one. Priority int @@ -115,7 +115,7 @@ type ProcStat struct { // NewStat returns the current status information of the process. // -// Deprecated: use p.Stat() instead +// Deprecated: Use p.Stat() instead. func (p Proc) NewStat() (ProcStat, error) { return p.Stat() } @@ -141,6 +141,11 @@ func (p Proc) Stat() (ProcStat, error) { } s.Comm = string(data[l+1 : r]) + + // Check the following resources for the details about the particular stat + // fields and their data types: + // * https://man7.org/linux/man-pages/man5/proc.5.html + // * https://man7.org/linux/man-pages/man3/scanf.3.html _, err = fmt.Fscan( bytes.NewBuffer(data[r+2:]), &s.State, diff --git a/vendor/github.com/prometheus/procfs/proc_status.go b/vendor/github.com/prometheus/procfs/proc_status.go index 6edd8333b..594022ded 100644 --- a/vendor/github.com/prometheus/procfs/proc_status.go +++ b/vendor/github.com/prometheus/procfs/proc_status.go @@ -33,37 +33,37 @@ type ProcStatus struct { TGID int // Peak virtual memory size. - VmPeak uint64 // nolint:golint + VmPeak uint64 // nolint:revive // Virtual memory size. - VmSize uint64 // nolint:golint + VmSize uint64 // nolint:revive // Locked memory size. - VmLck uint64 // nolint:golint + VmLck uint64 // nolint:revive // Pinned memory size. - VmPin uint64 // nolint:golint + VmPin uint64 // nolint:revive // Peak resident set size. - VmHWM uint64 // nolint:golint + VmHWM uint64 // nolint:revive // Resident set size (sum of RssAnnon RssFile and RssShmem). - VmRSS uint64 // nolint:golint + VmRSS uint64 // nolint:revive // Size of resident anonymous memory. - RssAnon uint64 // nolint:golint + RssAnon uint64 // nolint:revive // Size of resident file mappings. - RssFile uint64 // nolint:golint + RssFile uint64 // nolint:revive // Size of resident shared memory. - RssShmem uint64 // nolint:golint + RssShmem uint64 // nolint:revive // Size of data segments. - VmData uint64 // nolint:golint + VmData uint64 // nolint:revive // Size of stack segments. - VmStk uint64 // nolint:golint + VmStk uint64 // nolint:revive // Size of text segments. - VmExe uint64 // nolint:golint + VmExe uint64 // nolint:revive // Shared library code size. - VmLib uint64 // nolint:golint + VmLib uint64 // nolint:revive // Page table entries size. - VmPTE uint64 // nolint:golint + VmPTE uint64 // nolint:revive // Size of second-level page tables. - VmPMD uint64 // nolint:golint + VmPMD uint64 // nolint:revive // Swapped-out virtual memory size by anonymous private. - VmSwap uint64 // nolint:golint + VmSwap uint64 // nolint:revive // Size of hugetlb memory portions HugetlbPages uint64 diff --git a/vendor/github.com/prometheus/procfs/proc_sys.go b/vendor/github.com/prometheus/procfs/proc_sys.go new file mode 100644 index 000000000..d46533ebf --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_sys.go @@ -0,0 +1,51 @@ +// Copyright 2022 The Prometheus 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 procfs + +import ( + "fmt" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +func sysctlToPath(sysctl string) string { + return strings.Replace(sysctl, ".", "/", -1) +} + +func (fs FS) SysctlStrings(sysctl string) ([]string, error) { + value, err := util.SysReadFile(fs.proc.Path("sys", sysctlToPath(sysctl))) + if err != nil { + return nil, err + } + return strings.Fields(value), nil + +} + +func (fs FS) SysctlInts(sysctl string) ([]int, error) { + fields, err := fs.SysctlStrings(sysctl) + if err != nil { + return nil, err + } + + values := make([]int, len(fields)) + for i, f := range fields { + vp := util.NewValueParser(f) + values[i] = vp.Int() + if err := vp.Err(); err != nil { + return nil, fmt.Errorf("field %d in sysctl %s is not a valid int: %w", i, sysctl, err) + } + } + return values, nil +} diff --git a/vendor/github.com/prometheus/procfs/schedstat.go b/vendor/github.com/prometheus/procfs/schedstat.go index 28228164e..5f7f32dc8 100644 --- a/vendor/github.com/prometheus/procfs/schedstat.go +++ b/vendor/github.com/prometheus/procfs/schedstat.go @@ -40,7 +40,7 @@ type Schedstat struct { CPUs []*SchedstatCPU } -// SchedstatCPU contains the values from one "cpu" line +// SchedstatCPU contains the values from one "cpu" line. type SchedstatCPU struct { CPUNum string @@ -49,14 +49,14 @@ type SchedstatCPU struct { RunTimeslices uint64 } -// ProcSchedstat contains the values from /proc//schedstat +// ProcSchedstat contains the values from `/proc//schedstat`. type ProcSchedstat struct { RunningNanoseconds uint64 WaitingNanoseconds uint64 RunTimeslices uint64 } -// Schedstat reads data from /proc/schedstat +// Schedstat reads data from `/proc/schedstat`. func (fs FS) Schedstat() (*Schedstat, error) { file, err := os.Open(fs.proc.Path("schedstat")) if err != nil { diff --git a/vendor/github.com/prometheus/procfs/slab.go b/vendor/github.com/prometheus/procfs/slab.go index 7896fd724..bc9aaf5c2 100644 --- a/vendor/github.com/prometheus/procfs/slab.go +++ b/vendor/github.com/prometheus/procfs/slab.go @@ -137,7 +137,7 @@ func parseSlabInfo21(r *bytes.Reader) (SlabInfo, error) { return s, nil } -// SlabInfo reads data from /proc/slabinfo +// SlabInfo reads data from `/proc/slabinfo`. func (fs FS) SlabInfo() (SlabInfo, error) { // TODO: Consider passing options to allow for parsing different // slabinfo versions. However, slabinfo 2.1 has been stable since diff --git a/vendor/github.com/prometheus/procfs/softirqs.go b/vendor/github.com/prometheus/procfs/softirqs.go new file mode 100644 index 000000000..559129cbc --- /dev/null +++ b/vendor/github.com/prometheus/procfs/softirqs.go @@ -0,0 +1,160 @@ +// Copyright 2022 The Prometheus 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 procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Softirqs represents the softirq statistics. +type Softirqs struct { + Hi []uint64 + Timer []uint64 + NetTx []uint64 + NetRx []uint64 + Block []uint64 + IRQPoll []uint64 + Tasklet []uint64 + Sched []uint64 + HRTimer []uint64 + RCU []uint64 +} + +func (fs FS) Softirqs() (Softirqs, error) { + fileName := fs.proc.Path("softirqs") + data, err := util.ReadFileNoStat(fileName) + if err != nil { + return Softirqs{}, err + } + + reader := bytes.NewReader(data) + + return parseSoftirqs(reader) +} + +func parseSoftirqs(r io.Reader) (Softirqs, error) { + var ( + softirqs = Softirqs{} + scanner = bufio.NewScanner(r) + ) + + if !scanner.Scan() { + return Softirqs{}, fmt.Errorf("softirqs empty") + } + + for scanner.Scan() { + parts := strings.Fields(scanner.Text()) + var err error + + // require at least one cpu + if len(parts) < 2 { + continue + } + switch { + case parts[0] == "HI:": + perCPU := parts[1:] + softirqs.Hi = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.Hi[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (HI%d): %w", count, i, err) + } + } + case parts[0] == "TIMER:": + perCPU := parts[1:] + softirqs.Timer = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.Timer[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (TIMER%d): %w", count, i, err) + } + } + case parts[0] == "NET_TX:": + perCPU := parts[1:] + softirqs.NetTx = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.NetTx[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (NET_TX%d): %w", count, i, err) + } + } + case parts[0] == "NET_RX:": + perCPU := parts[1:] + softirqs.NetRx = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.NetRx[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (NET_RX%d): %w", count, i, err) + } + } + case parts[0] == "BLOCK:": + perCPU := parts[1:] + softirqs.Block = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.Block[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (BLOCK%d): %w", count, i, err) + } + } + case parts[0] == "IRQ_POLL:": + perCPU := parts[1:] + softirqs.IRQPoll = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.IRQPoll[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (IRQ_POLL%d): %w", count, i, err) + } + } + case parts[0] == "TASKLET:": + perCPU := parts[1:] + softirqs.Tasklet = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.Tasklet[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (TASKLET%d): %w", count, i, err) + } + } + case parts[0] == "SCHED:": + perCPU := parts[1:] + softirqs.Sched = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.Sched[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (SCHED%d): %w", count, i, err) + } + } + case parts[0] == "HRTIMER:": + perCPU := parts[1:] + softirqs.HRTimer = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.HRTimer[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (HRTIMER%d): %w", count, i, err) + } + } + case parts[0] == "RCU:": + perCPU := parts[1:] + softirqs.RCU = make([]uint64, len(perCPU)) + for i, count := range perCPU { + if softirqs.RCU[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse %q (RCU%d): %w", count, i, err) + } + } + } + } + + if err := scanner.Err(); err != nil { + return Softirqs{}, fmt.Errorf("couldn't parse softirqs: %w", err) + } + + return softirqs, scanner.Err() +} diff --git a/vendor/github.com/prometheus/procfs/stat.go b/vendor/github.com/prometheus/procfs/stat.go index 6d8727541..33f97caa0 100644 --- a/vendor/github.com/prometheus/procfs/stat.go +++ b/vendor/github.com/prometheus/procfs/stat.go @@ -41,7 +41,7 @@ type CPUStat struct { // SoftIRQStat represent the softirq statistics as exported in the procfs stat file. // A nice introduction can be found at https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html -// It is possible to get per-cpu stats by reading /proc/softirqs +// It is possible to get per-cpu stats by reading `/proc/softirqs`. type SoftIRQStat struct { Hi uint64 Timer uint64 @@ -145,7 +145,7 @@ func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { // NewStat returns information about current cpu/process statistics. // See https://www.kernel.org/doc/Documentation/filesystems/proc.txt // -// Deprecated: use fs.Stat() instead +// Deprecated: Use fs.Stat() instead. func NewStat() (Stat, error) { fs, err := NewFS(fs.DefaultProcMountPoint) if err != nil { @@ -155,15 +155,15 @@ func NewStat() (Stat, error) { } // NewStat returns information about current cpu/process statistics. -// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +// See: https://www.kernel.org/doc/Documentation/filesystems/proc.txt // -// Deprecated: use fs.Stat() instead +// Deprecated: Use fs.Stat() instead. func (fs FS) NewStat() (Stat, error) { return fs.Stat() } // Stat returns information about current cpu/process statistics. -// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +// See: https://www.kernel.org/doc/Documentation/filesystems/proc.txt func (fs FS) Stat() (Stat, error) { fileName := fs.proc.Path("stat") data, err := util.ReadFileNoStat(fileName) diff --git a/vendor/github.com/prometheus/procfs/vm.go b/vendor/github.com/prometheus/procfs/vm.go index cb1389141..20ceb77e2 100644 --- a/vendor/github.com/prometheus/procfs/vm.go +++ b/vendor/github.com/prometheus/procfs/vm.go @@ -11,13 +11,13 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !windows // +build !windows package procfs import ( "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -29,7 +29,7 @@ import ( // https://www.kernel.org/doc/Documentation/sysctl/vm.txt // Each setting is exposed as a single file. // Each file contains one line with a single numerical value, except lowmem_reserve_ratio which holds an array -// and numa_zonelist_order (deprecated) which is a string +// and numa_zonelist_order (deprecated) which is a string. type VM struct { AdminReserveKbytes *int64 // /proc/sys/vm/admin_reserve_kbytes BlockDump *int64 // /proc/sys/vm/block_dump @@ -87,7 +87,7 @@ func (fs FS) VM() (*VM, error) { return nil, fmt.Errorf("%s is not a directory", path) } - files, err := ioutil.ReadDir(path) + files, err := os.ReadDir(path) if err != nil { return nil, err } diff --git a/vendor/github.com/prometheus/procfs/zoneinfo.go b/vendor/github.com/prometheus/procfs/zoneinfo.go index 209e2ac98..c745a4c04 100644 --- a/vendor/github.com/prometheus/procfs/zoneinfo.go +++ b/vendor/github.com/prometheus/procfs/zoneinfo.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !windows // +build !windows package procfs @@ -18,7 +19,7 @@ package procfs import ( "bytes" "fmt" - "io/ioutil" + "os" "regexp" "strings" @@ -72,7 +73,7 @@ var nodeZoneRE = regexp.MustCompile(`(\d+), zone\s+(\w+)`) // structs containing the relevant info. More information available here: // https://www.kernel.org/doc/Documentation/sysctl/vm.txt func (fs FS) Zoneinfo() ([]Zoneinfo, error) { - data, err := ioutil.ReadFile(fs.proc.Path("zoneinfo")) + data, err := os.ReadFile(fs.proc.Path("zoneinfo")) if err != nil { return nil, fmt.Errorf("error reading zoneinfo %q: %w", fs.proc.Path("zoneinfo"), err) } diff --git a/vendor/github.com/xlab/treeprint/README.md b/vendor/github.com/xlab/treeprint/README.md index 6f1628295..59fb121fc 100644 --- a/vendor/github.com/xlab/treeprint/README.md +++ b/vendor/github.com/xlab/treeprint/README.md @@ -41,10 +41,11 @@ The utility will yield Unicode-friendly trees. The output is predictable and the ## Use cases -When you want to render a complex data structure: +### When you want to render a complex data structure: ```go func main() { + // to add a custom root name use `treeprint.NewWithRoot()` instead tree := treeprint.New() // create a new branch in the root @@ -86,10 +87,11 @@ Will give you: └── outernode ``` -Another case, when you have to make a tree where any leaf may have some meta-data (as `tree` is capable of it): +### Another case, when you have to make a tree where any leaf may have some meta-data (as `tree` is capable of it): ```go func main { + // to add a custom root name use `treeprint.NewWithRoot()` instead tree := treeprint.New() tree.AddNode("Dockerfile") @@ -122,6 +124,30 @@ Output: └── [122K] testtool.a ``` +### Iterating over the tree nodes + +```go +tree := New() + +one := tree.AddBranch("one") +one.AddNode("one-subnode1").AddNode("one-subnode2") +one.AddBranch("two").AddNode("two-subnode1").AddNode("two-subnode2"). + AddBranch("three").AddNode("three-subnode1").AddNode("three-subnode2") +tree.AddNode("outernode") + +// if you need to iterate over the whole tree +// call `VisitAll` from your top root node. +tree.VisitAll(func(item *node) { + if len(item.Nodes) > 0 { + // branch nodes + fmt.Println(item.Value) // will output one, two, three + } else { + // leaf nodes + fmt.Println(item.Value) // will output one-*, two-*, three-* and outernode + } +}) + +``` Yay! So it works. ## License diff --git a/vendor/github.com/xlab/treeprint/treeprint.go b/vendor/github.com/xlab/treeprint/treeprint.go index 8876f7e56..f90441461 100644 --- a/vendor/github.com/xlab/treeprint/treeprint.go +++ b/vendor/github.com/xlab/treeprint/treeprint.go @@ -6,11 +6,18 @@ import ( "fmt" "io" "reflect" + "strings" ) +// Value defines any value type Value interface{} + +// MetaValue defines any meta value type MetaValue interface{} +// NodeVisitor function type for iterating over nodes +type NodeVisitor func(item *node) + // Tree represents a tree structure with leaf-nodes and branch-nodes. type Tree interface { // AddNode adds a new node to a branch. @@ -39,6 +46,11 @@ type Tree interface { SetValue(value Value) SetMetaValue(meta MetaValue) + + // VisitAll iterates over the tree, branches and nodes. + // If need to iterate over the whole tree, use the root node. + // Note this method uses a breadth-first approach. + VisitAll(fn NodeVisitor) } type node struct { @@ -50,8 +62,10 @@ type node struct { func (n *node) FindLastNode() Tree { ns := n.Nodes - n = ns[len(ns)-1] - return n + if len(ns) == 0 { + return nil + } + return ns[len(ns)-1] } func (n *node) AddNode(v Value) Tree { @@ -59,9 +73,6 @@ func (n *node) AddNode(v Value) Tree { Root: n, Value: v, }) - if n.Root != nil { - return n.Root - } return n } @@ -71,14 +82,12 @@ func (n *node) AddMetaNode(meta MetaValue, v Value) Tree { Meta: meta, Value: v, }) - if n.Root != nil { - return n.Root - } return n } func (n *node) AddBranch(v Value) Tree { branch := &node{ + Root: n, Value: v, } n.Nodes = append(n.Nodes, branch) @@ -87,6 +96,7 @@ func (n *node) AddBranch(v Value) Tree { func (n *node) AddMetaBranch(meta MetaValue, v Value) Tree { branch := &node{ + Root: n, Meta: meta, Value: v, } @@ -131,7 +141,7 @@ func (n *node) Bytes() []byte { if n.Meta != nil { buf.WriteString(fmt.Sprintf("[%v] %v", n.Meta, n.Value)) } else { - buf.WriteString(fmt.Sprintf("%v",n.Value)) + buf.WriteString(fmt.Sprintf("%v", n.Value)) } buf.WriteByte('\n') } else { @@ -140,7 +150,7 @@ func (n *node) Bytes() []byte { edge = EdgeTypeEnd levelsEnded = append(levelsEnded, level) } - printValues(buf, 0, levelsEnded, edge, n.Meta, n.Value) + printValues(buf, 0, levelsEnded, edge, n) } if len(n.Nodes) > 0 { printNodes(buf, level, levelsEnded, n.Nodes) @@ -152,14 +162,25 @@ func (n *node) String() string { return string(n.Bytes()) } -func (n *node) SetValue(value Value){ +func (n *node) SetValue(value Value) { n.Value = value } -func (n *node) SetMetaValue(meta MetaValue){ +func (n *node) SetMetaValue(meta MetaValue) { n.Meta = meta } +func (n *node) VisitAll(fn NodeVisitor) { + for _, node := range n.Nodes { + fn(node) + + if len(node.Nodes) > 0 { + node.VisitAll(fn) + continue + } + } +} + func printNodes(wr io.Writer, level int, levelsEnded []int, nodes []*node) { @@ -169,7 +190,7 @@ func printNodes(wr io.Writer, levelsEnded = append(levelsEnded, level) edge = EdgeTypeEnd } - printValues(wr, level, levelsEnded, edge, node.Meta, node.Value) + printValues(wr, level, levelsEnded, edge, node) if len(node.Nodes) > 0 { printNodes(wr, level+1, levelsEnded, node.Nodes) } @@ -177,15 +198,19 @@ func printNodes(wr io.Writer, } func printValues(wr io.Writer, - level int, levelsEnded []int, edge EdgeType, meta MetaValue, val Value) { + level int, levelsEnded []int, edge EdgeType, node *node) { for i := 0; i < level; i++ { if isEnded(levelsEnded, i) { - fmt.Fprint(wr, " ") + fmt.Fprint(wr, strings.Repeat(" ", IndentSize+1)) continue } - fmt.Fprintf(wr, "%s   ", EdgeTypeLink) + fmt.Fprintf(wr, "%s%s", EdgeTypeLink, strings.Repeat(" ", IndentSize)) } + + val := renderValue(level, node) + meta := node.Meta + if meta != nil { fmt.Fprintf(wr, "%s [%v] %v\n", edge, meta, val) return @@ -202,14 +227,68 @@ func isEnded(levelsEnded []int, level int) bool { return false } +func renderValue(level int, node *node) Value { + lines := strings.Split(fmt.Sprintf("%v", node.Value), "\n") + + // If value does not contain multiple lines, return itself. + if len(lines) < 2 { + return node.Value + } + + // If value contains multiple lines, + // generate a padding and prefix each line with it. + pad := padding(level, node) + + for i := 1; i < len(lines); i++ { + lines[i] = fmt.Sprintf("%s%s", pad, lines[i]) + } + + return strings.Join(lines, "\n") +} + +// padding returns a padding for the multiline values with correctly placed link edges. +// It is generated by traversing the tree upwards (from leaf to the root of the tree) +// and, on each level, checking if the node the last one of its siblings. +// If a node is the last one, the padding on that level should be empty (there's nothing to link to below it). +// If a node is not the last one, the padding on that level should be the link edge so the sibling below is correctly connected. +func padding(level int, node *node) string { + links := make([]string, level+1) + + for node.Root != nil { + if isLast(node) { + links[level] = strings.Repeat(" ", IndentSize+1) + } else { + links[level] = fmt.Sprintf("%s%s", EdgeTypeLink, strings.Repeat(" ", IndentSize)) + } + level-- + node = node.Root + } + + return strings.Join(links, "") +} + +// isLast checks if the node is the last one in the slice of its parent children +func isLast(n *node) bool { + return n == n.Root.FindLastNode() +} + type EdgeType string var ( - EdgeTypeLink EdgeType = "│" - EdgeTypeMid EdgeType = "├──" - EdgeTypeEnd EdgeType = "└──" + EdgeTypeLink EdgeType = "│" + EdgeTypeMid EdgeType = "├──" + EdgeTypeEnd EdgeType = "└──" ) +// IndentSize is the number of spaces per tree level. +var IndentSize = 3 + +// New Generates new tree func New() Tree { return &node{Value: "."} } + +// NewWithRoot Generates new tree with the given root value +func NewWithRoot(root Value) Tree { + return &node{Value: root} +} diff --git a/vendor/go.uber.org/atomic/.gitignore b/vendor/go.uber.org/atomic/.gitignore index c3fa25389..2e337a0ed 100644 --- a/vendor/go.uber.org/atomic/.gitignore +++ b/vendor/go.uber.org/atomic/.gitignore @@ -10,3 +10,6 @@ lint.log # Profiling output *.prof + +# Output of fossa analyzer +/fossa diff --git a/vendor/go.uber.org/atomic/.travis.yml b/vendor/go.uber.org/atomic/.travis.yml deleted file mode 100644 index 13d0a4f25..000000000 --- a/vendor/go.uber.org/atomic/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -sudo: false -language: go -go_import_path: go.uber.org/atomic - -env: - global: - - GO111MODULE=on - -matrix: - include: - - go: oldstable - - go: stable - env: LINT=1 - -cache: - directories: - - vendor - -before_install: - - go version - -script: - - test -z "$LINT" || make lint - - make cover - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/go.uber.org/atomic/CHANGELOG.md b/vendor/go.uber.org/atomic/CHANGELOG.md index 24c0274dc..5fe03f21b 100644 --- a/vendor/go.uber.org/atomic/CHANGELOG.md +++ b/vendor/go.uber.org/atomic/CHANGELOG.md @@ -4,6 +4,37 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.10.0] - 2022-08-11 +### Added +- Add `atomic.Float32` type for atomic operations on `float32`. +- Add `CompareAndSwap` and `Swap` methods to `atomic.String`, `atomic.Error`, + and `atomic.Value`. +- Add generic `atomic.Pointer[T]` type for atomic operations on pointers of any + type. This is present only for Go 1.18 or higher, and is a drop-in for + replacement for the standard library's `sync/atomic.Pointer` type. + +### Changed +- Deprecate `CAS` methods on all types in favor of corresponding + `CompareAndSwap` methods. + +Thanks to @eNV25 and @icpd for their contributions to this release. + +[1.10.0]: https://github.com/uber-go/atomic/compare/v1.9.0...v1.10.0 + +## [1.9.0] - 2021-07-15 +### Added +- Add `Float64.Swap` to match int atomic operations. +- Add `atomic.Time` type for atomic operations on `time.Time` values. + +[1.9.0]: https://github.com/uber-go/atomic/compare/v1.8.0...v1.9.0 + +## [1.8.0] - 2021-06-09 +### Added +- Add `atomic.Uintptr` type for atomic operations on `uintptr` values. +- Add `atomic.UnsafePointer` type for atomic operations on `unsafe.Pointer` values. + +[1.8.0]: https://github.com/uber-go/atomic/compare/v1.7.0...v1.8.0 + ## [1.7.0] - 2020-09-14 ### Added - Support JSON serialization and deserialization of primitive atomic types. @@ -15,32 +46,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed - Remove dependency on `golang.org/x/{lint, tools}`. +[1.7.0]: https://github.com/uber-go/atomic/compare/v1.6.0...v1.7.0 + ## [1.6.0] - 2020-02-24 ### Changed - Drop library dependency on `golang.org/x/{lint, tools}`. +[1.6.0]: https://github.com/uber-go/atomic/compare/v1.5.1...v1.6.0 + ## [1.5.1] - 2019-11-19 - Fix bug where `Bool.CAS` and `Bool.Toggle` do work correctly together causing `CAS` to fail even though the old value matches. +[1.5.1]: https://github.com/uber-go/atomic/compare/v1.5.0...v1.5.1 + ## [1.5.0] - 2019-10-29 ### Changed - With Go modules, only the `go.uber.org/atomic` import path is supported now. If you need to use the old import path, please add a `replace` directive to your `go.mod`. +[1.5.0]: https://github.com/uber-go/atomic/compare/v1.4.0...v1.5.0 + ## [1.4.0] - 2019-05-01 ### Added - Add `atomic.Error` type for atomic operations on `error` values. +[1.4.0]: https://github.com/uber-go/atomic/compare/v1.3.2...v1.4.0 + ## [1.3.2] - 2018-05-02 ### Added - Add `atomic.Duration` type for atomic operations on `time.Duration` values. +[1.3.2]: https://github.com/uber-go/atomic/compare/v1.3.1...v1.3.2 + ## [1.3.1] - 2017-11-14 ### Fixed - Revert optimization for `atomic.String.Store("")` which caused data races. +[1.3.1]: https://github.com/uber-go/atomic/compare/v1.3.0...v1.3.1 + ## [1.3.0] - 2017-11-13 ### Added - Add `atomic.Bool.CAS` for compare-and-swap semantics on bools. @@ -48,10 +93,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Optimize `atomic.String.Store("")` by avoiding an allocation. +[1.3.0]: https://github.com/uber-go/atomic/compare/v1.2.0...v1.3.0 + ## [1.2.0] - 2017-04-12 ### Added - Shadow `atomic.Value` from `sync/atomic`. +[1.2.0]: https://github.com/uber-go/atomic/compare/v1.1.0...v1.2.0 + ## [1.1.0] - 2017-03-10 ### Added - Add atomic `Float64` type. @@ -59,18 +108,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Support new `go.uber.org/atomic` import path. +[1.1.0]: https://github.com/uber-go/atomic/compare/v1.0.0...v1.1.0 + ## [1.0.0] - 2016-07-18 - Initial release. -[1.7.0]: https://github.com/uber-go/atomic/compare/v1.6.0...v1.7.0 -[1.6.0]: https://github.com/uber-go/atomic/compare/v1.5.1...v1.6.0 -[1.5.1]: https://github.com/uber-go/atomic/compare/v1.5.0...v1.5.1 -[1.5.0]: https://github.com/uber-go/atomic/compare/v1.4.0...v1.5.0 -[1.4.0]: https://github.com/uber-go/atomic/compare/v1.3.2...v1.4.0 -[1.3.2]: https://github.com/uber-go/atomic/compare/v1.3.1...v1.3.2 -[1.3.1]: https://github.com/uber-go/atomic/compare/v1.3.0...v1.3.1 -[1.3.0]: https://github.com/uber-go/atomic/compare/v1.2.0...v1.3.0 -[1.2.0]: https://github.com/uber-go/atomic/compare/v1.1.0...v1.2.0 -[1.1.0]: https://github.com/uber-go/atomic/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/uber-go/atomic/releases/tag/v1.0.0 diff --git a/vendor/go.uber.org/atomic/Makefile b/vendor/go.uber.org/atomic/Makefile index 1b1376d42..46c945b32 100644 --- a/vendor/go.uber.org/atomic/Makefile +++ b/vendor/go.uber.org/atomic/Makefile @@ -69,6 +69,7 @@ generate: $(GEN_ATOMICINT) $(GEN_ATOMICWRAPPER) generatenodirty: @[ -z "$$(git status --porcelain)" ] || ( \ echo "Working tree is dirty. Commit your changes first."; \ + git status; \ exit 1 ) @make generate @status=$$(git status --porcelain); \ diff --git a/vendor/go.uber.org/atomic/README.md b/vendor/go.uber.org/atomic/README.md index ade0c20f1..96b47a1f1 100644 --- a/vendor/go.uber.org/atomic/README.md +++ b/vendor/go.uber.org/atomic/README.md @@ -55,8 +55,8 @@ Released under the [MIT License](LICENSE.txt). [doc-img]: https://godoc.org/github.com/uber-go/atomic?status.svg [doc]: https://godoc.org/go.uber.org/atomic -[ci-img]: https://travis-ci.com/uber-go/atomic.svg?branch=master -[ci]: https://travis-ci.com/uber-go/atomic +[ci-img]: https://github.com/uber-go/atomic/actions/workflows/go.yml/badge.svg +[ci]: https://github.com/uber-go/atomic/actions/workflows/go.yml [cov-img]: https://codecov.io/gh/uber-go/atomic/branch/master/graph/badge.svg [cov]: https://codecov.io/gh/uber-go/atomic [reportcard-img]: https://goreportcard.com/badge/go.uber.org/atomic diff --git a/vendor/go.uber.org/atomic/bool.go b/vendor/go.uber.org/atomic/bool.go index 9cf1914b1..dfa2085f4 100644 --- a/vendor/go.uber.org/atomic/bool.go +++ b/vendor/go.uber.org/atomic/bool.go @@ -1,6 +1,6 @@ // @generated Code generated by gen-atomicwrapper. -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -36,10 +36,10 @@ type Bool struct { var _zeroBool bool // NewBool creates a new Bool. -func NewBool(v bool) *Bool { +func NewBool(val bool) *Bool { x := &Bool{} - if v != _zeroBool { - x.Store(v) + if val != _zeroBool { + x.Store(val) } return x } @@ -50,19 +50,26 @@ func (x *Bool) Load() bool { } // Store atomically stores the passed bool. -func (x *Bool) Store(v bool) { - x.v.Store(boolToInt(v)) +func (x *Bool) Store(val bool) { + x.v.Store(boolToInt(val)) } // CAS is an atomic compare-and-swap for bool values. -func (x *Bool) CAS(o, n bool) bool { - return x.v.CAS(boolToInt(o), boolToInt(n)) +// +// Deprecated: Use CompareAndSwap. +func (x *Bool) CAS(old, new bool) (swapped bool) { + return x.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap for bool values. +func (x *Bool) CompareAndSwap(old, new bool) (swapped bool) { + return x.v.CompareAndSwap(boolToInt(old), boolToInt(new)) } // Swap atomically stores the given bool and returns the old // value. -func (x *Bool) Swap(o bool) bool { - return truthy(x.v.Swap(boolToInt(o))) +func (x *Bool) Swap(val bool) (old bool) { + return truthy(x.v.Swap(boolToInt(val))) } // MarshalJSON encodes the wrapped bool into JSON. diff --git a/vendor/go.uber.org/atomic/bool_ext.go b/vendor/go.uber.org/atomic/bool_ext.go index c7bf7a827..a2e60e987 100644 --- a/vendor/go.uber.org/atomic/bool_ext.go +++ b/vendor/go.uber.org/atomic/bool_ext.go @@ -38,7 +38,7 @@ func boolToInt(b bool) uint32 { } // Toggle atomically negates the Boolean and returns the previous value. -func (b *Bool) Toggle() bool { +func (b *Bool) Toggle() (old bool) { for { old := b.Load() if b.CAS(old, !old) { diff --git a/vendor/go.uber.org/atomic/duration.go b/vendor/go.uber.org/atomic/duration.go index 027cfcb20..6f4157445 100644 --- a/vendor/go.uber.org/atomic/duration.go +++ b/vendor/go.uber.org/atomic/duration.go @@ -1,6 +1,6 @@ // @generated Code generated by gen-atomicwrapper. -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -37,10 +37,10 @@ type Duration struct { var _zeroDuration time.Duration // NewDuration creates a new Duration. -func NewDuration(v time.Duration) *Duration { +func NewDuration(val time.Duration) *Duration { x := &Duration{} - if v != _zeroDuration { - x.Store(v) + if val != _zeroDuration { + x.Store(val) } return x } @@ -51,19 +51,26 @@ func (x *Duration) Load() time.Duration { } // Store atomically stores the passed time.Duration. -func (x *Duration) Store(v time.Duration) { - x.v.Store(int64(v)) +func (x *Duration) Store(val time.Duration) { + x.v.Store(int64(val)) } // CAS is an atomic compare-and-swap for time.Duration values. -func (x *Duration) CAS(o, n time.Duration) bool { - return x.v.CAS(int64(o), int64(n)) +// +// Deprecated: Use CompareAndSwap. +func (x *Duration) CAS(old, new time.Duration) (swapped bool) { + return x.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap for time.Duration values. +func (x *Duration) CompareAndSwap(old, new time.Duration) (swapped bool) { + return x.v.CompareAndSwap(int64(old), int64(new)) } // Swap atomically stores the given time.Duration and returns the old // value. -func (x *Duration) Swap(o time.Duration) time.Duration { - return time.Duration(x.v.Swap(int64(o))) +func (x *Duration) Swap(val time.Duration) (old time.Duration) { + return time.Duration(x.v.Swap(int64(val))) } // MarshalJSON encodes the wrapped time.Duration into JSON. diff --git a/vendor/go.uber.org/atomic/duration_ext.go b/vendor/go.uber.org/atomic/duration_ext.go index 6273b66bd..4c18b0a9e 100644 --- a/vendor/go.uber.org/atomic/duration_ext.go +++ b/vendor/go.uber.org/atomic/duration_ext.go @@ -25,13 +25,13 @@ import "time" //go:generate bin/gen-atomicwrapper -name=Duration -type=time.Duration -wrapped=Int64 -pack=int64 -unpack=time.Duration -cas -swap -json -imports time -file=duration.go // Add atomically adds to the wrapped time.Duration and returns the new value. -func (d *Duration) Add(n time.Duration) time.Duration { - return time.Duration(d.v.Add(int64(n))) +func (d *Duration) Add(delta time.Duration) time.Duration { + return time.Duration(d.v.Add(int64(delta))) } // Sub atomically subtracts from the wrapped time.Duration and returns the new value. -func (d *Duration) Sub(n time.Duration) time.Duration { - return time.Duration(d.v.Sub(int64(n))) +func (d *Duration) Sub(delta time.Duration) time.Duration { + return time.Duration(d.v.Sub(int64(delta))) } // String encodes the wrapped value as a string. diff --git a/vendor/go.uber.org/atomic/error.go b/vendor/go.uber.org/atomic/error.go index a6166fbea..27b23ea16 100644 --- a/vendor/go.uber.org/atomic/error.go +++ b/vendor/go.uber.org/atomic/error.go @@ -1,6 +1,6 @@ // @generated Code generated by gen-atomicwrapper. -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -32,10 +32,10 @@ type Error struct { var _zeroError error // NewError creates a new Error. -func NewError(v error) *Error { +func NewError(val error) *Error { x := &Error{} - if v != _zeroError { - x.Store(v) + if val != _zeroError { + x.Store(val) } return x } @@ -46,6 +46,17 @@ func (x *Error) Load() error { } // Store atomically stores the passed error. -func (x *Error) Store(v error) { - x.v.Store(packError(v)) +func (x *Error) Store(val error) { + x.v.Store(packError(val)) +} + +// CompareAndSwap is an atomic compare-and-swap for error values. +func (x *Error) CompareAndSwap(old, new error) (swapped bool) { + return x.v.CompareAndSwap(packError(old), packError(new)) +} + +// Swap atomically stores the given error and returns the old +// value. +func (x *Error) Swap(val error) (old error) { + return unpackError(x.v.Swap(packError(val))) } diff --git a/vendor/go.uber.org/atomic/error_ext.go b/vendor/go.uber.org/atomic/error_ext.go index ffe0be21c..d31fb633b 100644 --- a/vendor/go.uber.org/atomic/error_ext.go +++ b/vendor/go.uber.org/atomic/error_ext.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,7 +23,7 @@ package atomic // atomic.Value panics on nil inputs, or if the underlying type changes. // Stabilize by always storing a custom struct that we control. -//go:generate bin/gen-atomicwrapper -name=Error -type=error -wrapped=Value -pack=packError -unpack=unpackError -file=error.go +//go:generate bin/gen-atomicwrapper -name=Error -type=error -wrapped=Value -pack=packError -unpack=unpackError -compareandswap -swap -file=error.go type packedError struct{ Value error } diff --git a/vendor/go.uber.org/atomic/float32.go b/vendor/go.uber.org/atomic/float32.go new file mode 100644 index 000000000..5d535a6d2 --- /dev/null +++ b/vendor/go.uber.org/atomic/float32.go @@ -0,0 +1,77 @@ +// @generated Code generated by gen-atomicwrapper. + +// Copyright (c) 2020-2022 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package atomic + +import ( + "encoding/json" + "math" +) + +// Float32 is an atomic type-safe wrapper for float32 values. +type Float32 struct { + _ nocmp // disallow non-atomic comparison + + v Uint32 +} + +var _zeroFloat32 float32 + +// NewFloat32 creates a new Float32. +func NewFloat32(val float32) *Float32 { + x := &Float32{} + if val != _zeroFloat32 { + x.Store(val) + } + return x +} + +// Load atomically loads the wrapped float32. +func (x *Float32) Load() float32 { + return math.Float32frombits(x.v.Load()) +} + +// Store atomically stores the passed float32. +func (x *Float32) Store(val float32) { + x.v.Store(math.Float32bits(val)) +} + +// Swap atomically stores the given float32 and returns the old +// value. +func (x *Float32) Swap(val float32) (old float32) { + return math.Float32frombits(x.v.Swap(math.Float32bits(val))) +} + +// MarshalJSON encodes the wrapped float32 into JSON. +func (x *Float32) MarshalJSON() ([]byte, error) { + return json.Marshal(x.Load()) +} + +// UnmarshalJSON decodes a float32 from JSON. +func (x *Float32) UnmarshalJSON(b []byte) error { + var v float32 + if err := json.Unmarshal(b, &v); err != nil { + return err + } + x.Store(v) + return nil +} diff --git a/vendor/go.uber.org/atomic/float32_ext.go b/vendor/go.uber.org/atomic/float32_ext.go new file mode 100644 index 000000000..b0cd8d9c8 --- /dev/null +++ b/vendor/go.uber.org/atomic/float32_ext.go @@ -0,0 +1,76 @@ +// Copyright (c) 2020-2022 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package atomic + +import ( + "math" + "strconv" +) + +//go:generate bin/gen-atomicwrapper -name=Float32 -type=float32 -wrapped=Uint32 -pack=math.Float32bits -unpack=math.Float32frombits -swap -json -imports math -file=float32.go + +// Add atomically adds to the wrapped float32 and returns the new value. +func (f *Float32) Add(delta float32) float32 { + for { + old := f.Load() + new := old + delta + if f.CAS(old, new) { + return new + } + } +} + +// Sub atomically subtracts from the wrapped float32 and returns the new value. +func (f *Float32) Sub(delta float32) float32 { + return f.Add(-delta) +} + +// CAS is an atomic compare-and-swap for float32 values. +// +// Deprecated: Use CompareAndSwap +func (f *Float32) CAS(old, new float32) (swapped bool) { + return f.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap for float32 values. +// +// Note: CompareAndSwap handles NaN incorrectly. NaN != NaN using Go's inbuilt operators +// but CompareAndSwap allows a stored NaN to compare equal to a passed in NaN. +// This avoids typical CompareAndSwap loops from blocking forever, e.g., +// +// for { +// old := atom.Load() +// new = f(old) +// if atom.CompareAndSwap(old, new) { +// break +// } +// } +// +// If CompareAndSwap did not match NaN to match, then the above would loop forever. +func (f *Float32) CompareAndSwap(old, new float32) (swapped bool) { + return f.v.CompareAndSwap(math.Float32bits(old), math.Float32bits(new)) +} + +// String encodes the wrapped value as a string. +func (f *Float32) String() string { + // 'g' is the behavior for floats with %v. + return strconv.FormatFloat(float64(f.Load()), 'g', -1, 32) +} diff --git a/vendor/go.uber.org/atomic/float64.go b/vendor/go.uber.org/atomic/float64.go index 071906020..11d5189a5 100644 --- a/vendor/go.uber.org/atomic/float64.go +++ b/vendor/go.uber.org/atomic/float64.go @@ -1,6 +1,6 @@ // @generated Code generated by gen-atomicwrapper. -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -37,10 +37,10 @@ type Float64 struct { var _zeroFloat64 float64 // NewFloat64 creates a new Float64. -func NewFloat64(v float64) *Float64 { +func NewFloat64(val float64) *Float64 { x := &Float64{} - if v != _zeroFloat64 { - x.Store(v) + if val != _zeroFloat64 { + x.Store(val) } return x } @@ -51,13 +51,14 @@ func (x *Float64) Load() float64 { } // Store atomically stores the passed float64. -func (x *Float64) Store(v float64) { - x.v.Store(math.Float64bits(v)) +func (x *Float64) Store(val float64) { + x.v.Store(math.Float64bits(val)) } -// CAS is an atomic compare-and-swap for float64 values. -func (x *Float64) CAS(o, n float64) bool { - return x.v.CAS(math.Float64bits(o), math.Float64bits(n)) +// Swap atomically stores the given float64 and returns the old +// value. +func (x *Float64) Swap(val float64) (old float64) { + return math.Float64frombits(x.v.Swap(math.Float64bits(val))) } // MarshalJSON encodes the wrapped float64 into JSON. diff --git a/vendor/go.uber.org/atomic/float64_ext.go b/vendor/go.uber.org/atomic/float64_ext.go index 927b1add7..48c52b0ab 100644 --- a/vendor/go.uber.org/atomic/float64_ext.go +++ b/vendor/go.uber.org/atomic/float64_ext.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -20,15 +20,18 @@ package atomic -import "strconv" +import ( + "math" + "strconv" +) -//go:generate bin/gen-atomicwrapper -name=Float64 -type=float64 -wrapped=Uint64 -pack=math.Float64bits -unpack=math.Float64frombits -cas -json -imports math -file=float64.go +//go:generate bin/gen-atomicwrapper -name=Float64 -type=float64 -wrapped=Uint64 -pack=math.Float64bits -unpack=math.Float64frombits -swap -json -imports math -file=float64.go // Add atomically adds to the wrapped float64 and returns the new value. -func (f *Float64) Add(s float64) float64 { +func (f *Float64) Add(delta float64) float64 { for { old := f.Load() - new := old + s + new := old + delta if f.CAS(old, new) { return new } @@ -36,8 +39,34 @@ func (f *Float64) Add(s float64) float64 { } // Sub atomically subtracts from the wrapped float64 and returns the new value. -func (f *Float64) Sub(s float64) float64 { - return f.Add(-s) +func (f *Float64) Sub(delta float64) float64 { + return f.Add(-delta) +} + +// CAS is an atomic compare-and-swap for float64 values. +// +// Deprecated: Use CompareAndSwap +func (f *Float64) CAS(old, new float64) (swapped bool) { + return f.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap for float64 values. +// +// Note: CompareAndSwap handles NaN incorrectly. NaN != NaN using Go's inbuilt operators +// but CompareAndSwap allows a stored NaN to compare equal to a passed in NaN. +// This avoids typical CompareAndSwap loops from blocking forever, e.g., +// +// for { +// old := atom.Load() +// new = f(old) +// if atom.CompareAndSwap(old, new) { +// break +// } +// } +// +// If CompareAndSwap did not match NaN to match, then the above would loop forever. +func (f *Float64) CompareAndSwap(old, new float64) (swapped bool) { + return f.v.CompareAndSwap(math.Float64bits(old), math.Float64bits(new)) } // String encodes the wrapped value as a string. diff --git a/vendor/go.uber.org/atomic/gen.go b/vendor/go.uber.org/atomic/gen.go index 50d6b2485..1e9ef4f87 100644 --- a/vendor/go.uber.org/atomic/gen.go +++ b/vendor/go.uber.org/atomic/gen.go @@ -24,3 +24,4 @@ package atomic //go:generate bin/gen-atomicint -name=Int64 -wrapped=int64 -file=int64.go //go:generate bin/gen-atomicint -name=Uint32 -wrapped=uint32 -unsigned -file=uint32.go //go:generate bin/gen-atomicint -name=Uint64 -wrapped=uint64 -unsigned -file=uint64.go +//go:generate bin/gen-atomicint -name=Uintptr -wrapped=uintptr -unsigned -file=uintptr.go diff --git a/vendor/go.uber.org/atomic/int32.go b/vendor/go.uber.org/atomic/int32.go index 18ae56493..b9a68f42c 100644 --- a/vendor/go.uber.org/atomic/int32.go +++ b/vendor/go.uber.org/atomic/int32.go @@ -1,6 +1,6 @@ // @generated Code generated by gen-atomicint. -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -36,8 +36,8 @@ type Int32 struct { } // NewInt32 creates a new Int32. -func NewInt32(i int32) *Int32 { - return &Int32{v: i} +func NewInt32(val int32) *Int32 { + return &Int32{v: val} } // Load atomically loads the wrapped value. @@ -46,13 +46,13 @@ func (i *Int32) Load() int32 { } // Add atomically adds to the wrapped int32 and returns the new value. -func (i *Int32) Add(n int32) int32 { - return atomic.AddInt32(&i.v, n) +func (i *Int32) Add(delta int32) int32 { + return atomic.AddInt32(&i.v, delta) } // Sub atomically subtracts from the wrapped int32 and returns the new value. -func (i *Int32) Sub(n int32) int32 { - return atomic.AddInt32(&i.v, -n) +func (i *Int32) Sub(delta int32) int32 { + return atomic.AddInt32(&i.v, -delta) } // Inc atomically increments the wrapped int32 and returns the new value. @@ -66,18 +66,25 @@ func (i *Int32) Dec() int32 { } // CAS is an atomic compare-and-swap. -func (i *Int32) CAS(old, new int32) bool { +// +// Deprecated: Use CompareAndSwap. +func (i *Int32) CAS(old, new int32) (swapped bool) { + return i.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap. +func (i *Int32) CompareAndSwap(old, new int32) (swapped bool) { return atomic.CompareAndSwapInt32(&i.v, old, new) } // Store atomically stores the passed value. -func (i *Int32) Store(n int32) { - atomic.StoreInt32(&i.v, n) +func (i *Int32) Store(val int32) { + atomic.StoreInt32(&i.v, val) } // Swap atomically swaps the wrapped int32 and returns the old value. -func (i *Int32) Swap(n int32) int32 { - return atomic.SwapInt32(&i.v, n) +func (i *Int32) Swap(val int32) (old int32) { + return atomic.SwapInt32(&i.v, val) } // MarshalJSON encodes the wrapped int32 into JSON. diff --git a/vendor/go.uber.org/atomic/int64.go b/vendor/go.uber.org/atomic/int64.go index 2bcbbfaa9..78d260976 100644 --- a/vendor/go.uber.org/atomic/int64.go +++ b/vendor/go.uber.org/atomic/int64.go @@ -1,6 +1,6 @@ // @generated Code generated by gen-atomicint. -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -36,8 +36,8 @@ type Int64 struct { } // NewInt64 creates a new Int64. -func NewInt64(i int64) *Int64 { - return &Int64{v: i} +func NewInt64(val int64) *Int64 { + return &Int64{v: val} } // Load atomically loads the wrapped value. @@ -46,13 +46,13 @@ func (i *Int64) Load() int64 { } // Add atomically adds to the wrapped int64 and returns the new value. -func (i *Int64) Add(n int64) int64 { - return atomic.AddInt64(&i.v, n) +func (i *Int64) Add(delta int64) int64 { + return atomic.AddInt64(&i.v, delta) } // Sub atomically subtracts from the wrapped int64 and returns the new value. -func (i *Int64) Sub(n int64) int64 { - return atomic.AddInt64(&i.v, -n) +func (i *Int64) Sub(delta int64) int64 { + return atomic.AddInt64(&i.v, -delta) } // Inc atomically increments the wrapped int64 and returns the new value. @@ -66,18 +66,25 @@ func (i *Int64) Dec() int64 { } // CAS is an atomic compare-and-swap. -func (i *Int64) CAS(old, new int64) bool { +// +// Deprecated: Use CompareAndSwap. +func (i *Int64) CAS(old, new int64) (swapped bool) { + return i.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap. +func (i *Int64) CompareAndSwap(old, new int64) (swapped bool) { return atomic.CompareAndSwapInt64(&i.v, old, new) } // Store atomically stores the passed value. -func (i *Int64) Store(n int64) { - atomic.StoreInt64(&i.v, n) +func (i *Int64) Store(val int64) { + atomic.StoreInt64(&i.v, val) } // Swap atomically swaps the wrapped int64 and returns the old value. -func (i *Int64) Swap(n int64) int64 { - return atomic.SwapInt64(&i.v, n) +func (i *Int64) Swap(val int64) (old int64) { + return atomic.SwapInt64(&i.v, val) } // MarshalJSON encodes the wrapped int64 into JSON. diff --git a/vendor/go.uber.org/atomic/nocmp.go b/vendor/go.uber.org/atomic/nocmp.go index a8201cb4a..54b74174a 100644 --- a/vendor/go.uber.org/atomic/nocmp.go +++ b/vendor/go.uber.org/atomic/nocmp.go @@ -23,13 +23,13 @@ package atomic // nocmp is an uncomparable struct. Embed this inside another struct to make // it uncomparable. // -// type Foo struct { -// nocmp -// // ... -// } +// type Foo struct { +// nocmp +// // ... +// } // // This DOES NOT: // -// - Disallow shallow copies of structs -// - Disallow comparison of pointers to uncomparable structs +// - Disallow shallow copies of structs +// - Disallow comparison of pointers to uncomparable structs type nocmp [0]func() diff --git a/vendor/go.uber.org/atomic/pointer_go118.go b/vendor/go.uber.org/atomic/pointer_go118.go new file mode 100644 index 000000000..e0f47dba4 --- /dev/null +++ b/vendor/go.uber.org/atomic/pointer_go118.go @@ -0,0 +1,60 @@ +// Copyright (c) 2022 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +//go:build go1.18 && !go1.19 +// +build go1.18,!go1.19 + +package atomic + +import "unsafe" + +type Pointer[T any] struct { + _ nocmp // disallow non-atomic comparison + p UnsafePointer +} + +// NewPointer creates a new Pointer. +func NewPointer[T any](v *T) *Pointer[T] { + var p Pointer[T] + if v != nil { + p.p.Store(unsafe.Pointer(v)) + } + return &p +} + +// Load atomically loads the wrapped value. +func (p *Pointer[T]) Load() *T { + return (*T)(p.p.Load()) +} + +// Store atomically stores the passed value. +func (p *Pointer[T]) Store(val *T) { + p.p.Store(unsafe.Pointer(val)) +} + +// Swap atomically swaps the wrapped pointer and returns the old value. +func (p *Pointer[T]) Swap(val *T) (old *T) { + return (*T)(p.p.Swap(unsafe.Pointer(val))) +} + +// CompareAndSwap is an atomic compare-and-swap. +func (p *Pointer[T]) CompareAndSwap(old, new *T) (swapped bool) { + return p.p.CompareAndSwap(unsafe.Pointer(old), unsafe.Pointer(new)) +} diff --git a/vendor/go.uber.org/atomic/pointer_go119.go b/vendor/go.uber.org/atomic/pointer_go119.go new file mode 100644 index 000000000..6726f17ad --- /dev/null +++ b/vendor/go.uber.org/atomic/pointer_go119.go @@ -0,0 +1,61 @@ +// Copyright (c) 2022 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +//go:build go1.19 +// +build go1.19 + +package atomic + +import "sync/atomic" + +// Pointer is an atomic pointer of type *T. +type Pointer[T any] struct { + _ nocmp // disallow non-atomic comparison + p atomic.Pointer[T] +} + +// NewPointer creates a new Pointer. +func NewPointer[T any](v *T) *Pointer[T] { + var p Pointer[T] + if v != nil { + p.p.Store(v) + } + return &p +} + +// Load atomically loads the wrapped value. +func (p *Pointer[T]) Load() *T { + return p.p.Load() +} + +// Store atomically stores the passed value. +func (p *Pointer[T]) Store(val *T) { + p.p.Store(val) +} + +// Swap atomically swaps the wrapped pointer and returns the old value. +func (p *Pointer[T]) Swap(val *T) (old *T) { + return p.p.Swap(val) +} + +// CompareAndSwap is an atomic compare-and-swap. +func (p *Pointer[T]) CompareAndSwap(old, new *T) (swapped bool) { + return p.p.CompareAndSwap(old, new) +} diff --git a/vendor/go.uber.org/atomic/string.go b/vendor/go.uber.org/atomic/string.go index 225b7a2be..c4bea70f4 100644 --- a/vendor/go.uber.org/atomic/string.go +++ b/vendor/go.uber.org/atomic/string.go @@ -1,6 +1,6 @@ // @generated Code generated by gen-atomicwrapper. -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -32,10 +32,10 @@ type String struct { var _zeroString string // NewString creates a new String. -func NewString(v string) *String { +func NewString(val string) *String { x := &String{} - if v != _zeroString { - x.Store(v) + if val != _zeroString { + x.Store(val) } return x } @@ -49,6 +49,17 @@ func (x *String) Load() string { } // Store atomically stores the passed string. -func (x *String) Store(v string) { - x.v.Store(v) +func (x *String) Store(val string) { + x.v.Store(val) +} + +// CompareAndSwap is an atomic compare-and-swap for string values. +func (x *String) CompareAndSwap(old, new string) (swapped bool) { + return x.v.CompareAndSwap(old, new) +} + +// Swap atomically stores the given string and returns the old +// value. +func (x *String) Swap(val string) (old string) { + return x.v.Swap(val).(string) } diff --git a/vendor/go.uber.org/atomic/string_ext.go b/vendor/go.uber.org/atomic/string_ext.go index 3a9558213..1f63dfd5b 100644 --- a/vendor/go.uber.org/atomic/string_ext.go +++ b/vendor/go.uber.org/atomic/string_ext.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ package atomic -//go:generate bin/gen-atomicwrapper -name=String -type=string -wrapped=Value -file=string.go +//go:generate bin/gen-atomicwrapper -name=String -type=string -wrapped=Value -compareandswap -swap -file=string.go // String returns the wrapped value. func (s *String) String() string { diff --git a/vendor/go.uber.org/multierr/go113.go b/vendor/go.uber.org/atomic/time.go similarity index 58% rename from vendor/go.uber.org/multierr/go113.go rename to vendor/go.uber.org/atomic/time.go index 264b0eac0..1660feb14 100644 --- a/vendor/go.uber.org/multierr/go113.go +++ b/vendor/go.uber.org/atomic/time.go @@ -1,4 +1,6 @@ -// Copyright (c) 2019 Uber Technologies, Inc. +// @generated Code generated by gen-atomicwrapper. + +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,35 +20,36 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -// +build go1.13 +package atomic -package multierr +import ( + "time" +) -import "errors" +// Time is an atomic type-safe wrapper for time.Time values. +type Time struct { + _ nocmp // disallow non-atomic comparison -// As attempts to find the first error in the error list that matches the type -// of the value that target points to. -// -// This function allows errors.As to traverse the values stored on the -// multierr error. -func (merr *multiError) As(target interface{}) bool { - for _, err := range merr.Errors() { - if errors.As(err, target) { - return true - } - } - return false + v Value } -// Is attempts to match the provided error against errors in the error list. -// -// This function allows errors.Is to traverse the values stored on the -// multierr error. -func (merr *multiError) Is(target error) bool { - for _, err := range merr.Errors() { - if errors.Is(err, target) { - return true - } +var _zeroTime time.Time + +// NewTime creates a new Time. +func NewTime(val time.Time) *Time { + x := &Time{} + if val != _zeroTime { + x.Store(val) } - return false + return x +} + +// Load atomically loads the wrapped time.Time. +func (x *Time) Load() time.Time { + return unpackTime(x.v.Load()) +} + +// Store atomically stores the passed time.Time. +func (x *Time) Store(val time.Time) { + x.v.Store(packTime(val)) } diff --git a/vendor/go.uber.org/zap/global_prego112.go b/vendor/go.uber.org/atomic/time_ext.go similarity index 73% rename from vendor/go.uber.org/zap/global_prego112.go rename to vendor/go.uber.org/atomic/time_ext.go index d3ab9af93..1e3dc978a 100644 --- a/vendor/go.uber.org/zap/global_prego112.go +++ b/vendor/go.uber.org/atomic/time_ext.go @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Uber Technologies, Inc. +// Copyright (c) 2021 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,9 +18,19 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -// See #682 for more information. -// +build !go1.12 +package atomic -package zap +import "time" -const _stdLogDefaultDepth = 2 +//go:generate bin/gen-atomicwrapper -name=Time -type=time.Time -wrapped=Value -pack=packTime -unpack=unpackTime -imports time -file=time.go + +func packTime(t time.Time) interface{} { + return t +} + +func unpackTime(v interface{}) time.Time { + if t, ok := v.(time.Time); ok { + return t + } + return time.Time{} +} diff --git a/vendor/go.uber.org/atomic/uint32.go b/vendor/go.uber.org/atomic/uint32.go index a973aba1a..d6f04a96d 100644 --- a/vendor/go.uber.org/atomic/uint32.go +++ b/vendor/go.uber.org/atomic/uint32.go @@ -1,6 +1,6 @@ // @generated Code generated by gen-atomicint. -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -36,8 +36,8 @@ type Uint32 struct { } // NewUint32 creates a new Uint32. -func NewUint32(i uint32) *Uint32 { - return &Uint32{v: i} +func NewUint32(val uint32) *Uint32 { + return &Uint32{v: val} } // Load atomically loads the wrapped value. @@ -46,13 +46,13 @@ func (i *Uint32) Load() uint32 { } // Add atomically adds to the wrapped uint32 and returns the new value. -func (i *Uint32) Add(n uint32) uint32 { - return atomic.AddUint32(&i.v, n) +func (i *Uint32) Add(delta uint32) uint32 { + return atomic.AddUint32(&i.v, delta) } // Sub atomically subtracts from the wrapped uint32 and returns the new value. -func (i *Uint32) Sub(n uint32) uint32 { - return atomic.AddUint32(&i.v, ^(n - 1)) +func (i *Uint32) Sub(delta uint32) uint32 { + return atomic.AddUint32(&i.v, ^(delta - 1)) } // Inc atomically increments the wrapped uint32 and returns the new value. @@ -66,18 +66,25 @@ func (i *Uint32) Dec() uint32 { } // CAS is an atomic compare-and-swap. -func (i *Uint32) CAS(old, new uint32) bool { +// +// Deprecated: Use CompareAndSwap. +func (i *Uint32) CAS(old, new uint32) (swapped bool) { + return i.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap. +func (i *Uint32) CompareAndSwap(old, new uint32) (swapped bool) { return atomic.CompareAndSwapUint32(&i.v, old, new) } // Store atomically stores the passed value. -func (i *Uint32) Store(n uint32) { - atomic.StoreUint32(&i.v, n) +func (i *Uint32) Store(val uint32) { + atomic.StoreUint32(&i.v, val) } // Swap atomically swaps the wrapped uint32 and returns the old value. -func (i *Uint32) Swap(n uint32) uint32 { - return atomic.SwapUint32(&i.v, n) +func (i *Uint32) Swap(val uint32) (old uint32) { + return atomic.SwapUint32(&i.v, val) } // MarshalJSON encodes the wrapped uint32 into JSON. diff --git a/vendor/go.uber.org/atomic/uint64.go b/vendor/go.uber.org/atomic/uint64.go index 3b6c71fd5..2574bdd5e 100644 --- a/vendor/go.uber.org/atomic/uint64.go +++ b/vendor/go.uber.org/atomic/uint64.go @@ -1,6 +1,6 @@ // @generated Code generated by gen-atomicint. -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2020-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -36,8 +36,8 @@ type Uint64 struct { } // NewUint64 creates a new Uint64. -func NewUint64(i uint64) *Uint64 { - return &Uint64{v: i} +func NewUint64(val uint64) *Uint64 { + return &Uint64{v: val} } // Load atomically loads the wrapped value. @@ -46,13 +46,13 @@ func (i *Uint64) Load() uint64 { } // Add atomically adds to the wrapped uint64 and returns the new value. -func (i *Uint64) Add(n uint64) uint64 { - return atomic.AddUint64(&i.v, n) +func (i *Uint64) Add(delta uint64) uint64 { + return atomic.AddUint64(&i.v, delta) } // Sub atomically subtracts from the wrapped uint64 and returns the new value. -func (i *Uint64) Sub(n uint64) uint64 { - return atomic.AddUint64(&i.v, ^(n - 1)) +func (i *Uint64) Sub(delta uint64) uint64 { + return atomic.AddUint64(&i.v, ^(delta - 1)) } // Inc atomically increments the wrapped uint64 and returns the new value. @@ -66,18 +66,25 @@ func (i *Uint64) Dec() uint64 { } // CAS is an atomic compare-and-swap. -func (i *Uint64) CAS(old, new uint64) bool { +// +// Deprecated: Use CompareAndSwap. +func (i *Uint64) CAS(old, new uint64) (swapped bool) { + return i.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap. +func (i *Uint64) CompareAndSwap(old, new uint64) (swapped bool) { return atomic.CompareAndSwapUint64(&i.v, old, new) } // Store atomically stores the passed value. -func (i *Uint64) Store(n uint64) { - atomic.StoreUint64(&i.v, n) +func (i *Uint64) Store(val uint64) { + atomic.StoreUint64(&i.v, val) } // Swap atomically swaps the wrapped uint64 and returns the old value. -func (i *Uint64) Swap(n uint64) uint64 { - return atomic.SwapUint64(&i.v, n) +func (i *Uint64) Swap(val uint64) (old uint64) { + return atomic.SwapUint64(&i.v, val) } // MarshalJSON encodes the wrapped uint64 into JSON. diff --git a/vendor/go.uber.org/atomic/uintptr.go b/vendor/go.uber.org/atomic/uintptr.go new file mode 100644 index 000000000..81b275a7a --- /dev/null +++ b/vendor/go.uber.org/atomic/uintptr.go @@ -0,0 +1,109 @@ +// @generated Code generated by gen-atomicint. + +// Copyright (c) 2020-2022 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package atomic + +import ( + "encoding/json" + "strconv" + "sync/atomic" +) + +// Uintptr is an atomic wrapper around uintptr. +type Uintptr struct { + _ nocmp // disallow non-atomic comparison + + v uintptr +} + +// NewUintptr creates a new Uintptr. +func NewUintptr(val uintptr) *Uintptr { + return &Uintptr{v: val} +} + +// Load atomically loads the wrapped value. +func (i *Uintptr) Load() uintptr { + return atomic.LoadUintptr(&i.v) +} + +// Add atomically adds to the wrapped uintptr and returns the new value. +func (i *Uintptr) Add(delta uintptr) uintptr { + return atomic.AddUintptr(&i.v, delta) +} + +// Sub atomically subtracts from the wrapped uintptr and returns the new value. +func (i *Uintptr) Sub(delta uintptr) uintptr { + return atomic.AddUintptr(&i.v, ^(delta - 1)) +} + +// Inc atomically increments the wrapped uintptr and returns the new value. +func (i *Uintptr) Inc() uintptr { + return i.Add(1) +} + +// Dec atomically decrements the wrapped uintptr and returns the new value. +func (i *Uintptr) Dec() uintptr { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +// +// Deprecated: Use CompareAndSwap. +func (i *Uintptr) CAS(old, new uintptr) (swapped bool) { + return i.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap. +func (i *Uintptr) CompareAndSwap(old, new uintptr) (swapped bool) { + return atomic.CompareAndSwapUintptr(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Uintptr) Store(val uintptr) { + atomic.StoreUintptr(&i.v, val) +} + +// Swap atomically swaps the wrapped uintptr and returns the old value. +func (i *Uintptr) Swap(val uintptr) (old uintptr) { + return atomic.SwapUintptr(&i.v, val) +} + +// MarshalJSON encodes the wrapped uintptr into JSON. +func (i *Uintptr) MarshalJSON() ([]byte, error) { + return json.Marshal(i.Load()) +} + +// UnmarshalJSON decodes JSON into the wrapped uintptr. +func (i *Uintptr) UnmarshalJSON(b []byte) error { + var v uintptr + if err := json.Unmarshal(b, &v); err != nil { + return err + } + i.Store(v) + return nil +} + +// String encodes the wrapped value as a string. +func (i *Uintptr) String() string { + v := i.Load() + return strconv.FormatUint(uint64(v), 10) +} diff --git a/vendor/go.uber.org/atomic/unsafe_pointer.go b/vendor/go.uber.org/atomic/unsafe_pointer.go new file mode 100644 index 000000000..34868baf6 --- /dev/null +++ b/vendor/go.uber.org/atomic/unsafe_pointer.go @@ -0,0 +1,65 @@ +// Copyright (c) 2021-2022 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package atomic + +import ( + "sync/atomic" + "unsafe" +) + +// UnsafePointer is an atomic wrapper around unsafe.Pointer. +type UnsafePointer struct { + _ nocmp // disallow non-atomic comparison + + v unsafe.Pointer +} + +// NewUnsafePointer creates a new UnsafePointer. +func NewUnsafePointer(val unsafe.Pointer) *UnsafePointer { + return &UnsafePointer{v: val} +} + +// Load atomically loads the wrapped value. +func (p *UnsafePointer) Load() unsafe.Pointer { + return atomic.LoadPointer(&p.v) +} + +// Store atomically stores the passed value. +func (p *UnsafePointer) Store(val unsafe.Pointer) { + atomic.StorePointer(&p.v, val) +} + +// Swap atomically swaps the wrapped unsafe.Pointer and returns the old value. +func (p *UnsafePointer) Swap(val unsafe.Pointer) (old unsafe.Pointer) { + return atomic.SwapPointer(&p.v, val) +} + +// CAS is an atomic compare-and-swap. +// +// Deprecated: Use CompareAndSwap +func (p *UnsafePointer) CAS(old, new unsafe.Pointer) (swapped bool) { + return p.CompareAndSwap(old, new) +} + +// CompareAndSwap is an atomic compare-and-swap. +func (p *UnsafePointer) CompareAndSwap(old, new unsafe.Pointer) (swapped bool) { + return atomic.CompareAndSwapPointer(&p.v, old, new) +} diff --git a/vendor/go.uber.org/atomic/value.go b/vendor/go.uber.org/atomic/value.go index 671f3a382..52caedb9a 100644 --- a/vendor/go.uber.org/atomic/value.go +++ b/vendor/go.uber.org/atomic/value.go @@ -25,7 +25,7 @@ import "sync/atomic" // Value shadows the type of the same name from sync/atomic // https://godoc.org/sync/atomic#Value type Value struct { - atomic.Value - _ nocmp // disallow non-atomic comparison + + atomic.Value } diff --git a/vendor/go.uber.org/multierr/.travis.yml b/vendor/go.uber.org/multierr/.travis.yml deleted file mode 100644 index 8636ab42a..000000000 --- a/vendor/go.uber.org/multierr/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false -language: go -go_import_path: go.uber.org/multierr - -env: - global: - - GO111MODULE=on - -go: - - oldstable - - stable - -before_install: -- go version - -script: -- | - set -e - make lint - make cover - -after_success: -- bash <(curl -s https://codecov.io/bash) diff --git a/vendor/go.uber.org/multierr/CHANGELOG.md b/vendor/go.uber.org/multierr/CHANGELOG.md index 6f1db9ef4..3ba05276f 100644 --- a/vendor/go.uber.org/multierr/CHANGELOG.md +++ b/vendor/go.uber.org/multierr/CHANGELOG.md @@ -1,6 +1,18 @@ Releases ======== +v1.8.0 (2022-02-28) +=================== + +- `Combine`: perform zero allocations when there are no errors. + + +v1.7.0 (2021-05-06) +=================== + +- Add `AppendInvoke` to append into errors from `defer` blocks. + + v1.6.0 (2020-09-14) =================== diff --git a/vendor/go.uber.org/multierr/LICENSE.txt b/vendor/go.uber.org/multierr/LICENSE.txt index 858e02475..413e30f7c 100644 --- a/vendor/go.uber.org/multierr/LICENSE.txt +++ b/vendor/go.uber.org/multierr/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2017 Uber Technologies, Inc. +Copyright (c) 2017-2021 Uber Technologies, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/go.uber.org/multierr/Makefile b/vendor/go.uber.org/multierr/Makefile index 316004400..dcb6fe723 100644 --- a/vendor/go.uber.org/multierr/Makefile +++ b/vendor/go.uber.org/multierr/Makefile @@ -34,9 +34,5 @@ lint: gofmt golint staticcheck .PHONY: cover cover: - go test -coverprofile=cover.out -coverpkg=./... -v ./... + go test -race -coverprofile=cover.out -coverpkg=./... -v ./... go tool cover -html=cover.out -o cover.html - -update-license: - @cd tools && go install go.uber.org/tools/update-license - @$(GOBIN)/update-license $(GO_FILES) diff --git a/vendor/go.uber.org/multierr/README.md b/vendor/go.uber.org/multierr/README.md index 751bd65e5..70aacecd7 100644 --- a/vendor/go.uber.org/multierr/README.md +++ b/vendor/go.uber.org/multierr/README.md @@ -15,9 +15,9 @@ Stable: No breaking changes will be made before 2.0. Released under the [MIT License]. [MIT License]: LICENSE.txt -[doc-img]: https://godoc.org/go.uber.org/multierr?status.svg -[doc]: https://godoc.org/go.uber.org/multierr -[ci-img]: https://travis-ci.com/uber-go/multierr.svg?branch=master +[doc-img]: https://pkg.go.dev/badge/go.uber.org/multierr +[doc]: https://pkg.go.dev/go.uber.org/multierr +[ci-img]: https://github.com/uber-go/multierr/actions/workflows/go.yml/badge.svg [cov-img]: https://codecov.io/gh/uber-go/multierr/branch/master/graph/badge.svg -[ci]: https://travis-ci.com/uber-go/multierr +[ci]: https://github.com/uber-go/multierr/actions/workflows/go.yml [cov]: https://codecov.io/gh/uber-go/multierr diff --git a/vendor/go.uber.org/multierr/error.go b/vendor/go.uber.org/multierr/error.go index 5c9b67d53..f45af149c 100644 --- a/vendor/go.uber.org/multierr/error.go +++ b/vendor/go.uber.org/multierr/error.go @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Uber Technologies, Inc. +// Copyright (c) 2017-2021 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -35,8 +35,53 @@ // // err = multierr.Append(reader.Close(), writer.Close()) // -// This makes it possible to record resource cleanup failures from deferred -// blocks with the help of named return values. +// The underlying list of errors for a returned error object may be retrieved +// with the Errors function. +// +// errors := multierr.Errors(err) +// if len(errors) > 0 { +// fmt.Println("The following errors occurred:", errors) +// } +// +// Appending from a loop +// +// You sometimes need to append into an error from a loop. +// +// var err error +// for _, item := range items { +// err = multierr.Append(err, process(item)) +// } +// +// Cases like this may require knowledge of whether an individual instance +// failed. This usually requires introduction of a new variable. +// +// var err error +// for _, item := range items { +// if perr := process(item); perr != nil { +// log.Warn("skipping item", item) +// err = multierr.Append(err, perr) +// } +// } +// +// multierr includes AppendInto to simplify cases like this. +// +// var err error +// for _, item := range items { +// if multierr.AppendInto(&err, process(item)) { +// log.Warn("skipping item", item) +// } +// } +// +// This will append the error into the err variable, and return true if that +// individual error was non-nil. +// +// See AppendInto for more information. +// +// Deferred Functions +// +// Go makes it possible to modify the return value of a function in a defer +// block if the function was using named returns. This makes it possible to +// record resource cleanup failures from deferred blocks. // // func sendRequest(req Request) (err error) { // conn, err := openConnection() @@ -49,14 +94,21 @@ // // ... // } // -// The underlying list of errors for a returned error object may be retrieved -// with the Errors function. +// multierr provides the Invoker type and AppendInvoke function to make cases +// like the above simpler and obviate the need for a closure. The following is +// roughly equivalent to the example above. // -// errors := multierr.Errors(err) -// if len(errors) > 0 { -// fmt.Println("The following errors occurred:", errors) +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer multierr.AppendInvoke(&err, multierr.Close(conn)) +// // ... // } // +// See AppendInvoke and Invoker for more information. +// // Advanced Usage // // Errors returned by Combine and Append MAY implement the following @@ -87,6 +139,7 @@ package multierr // import "go.uber.org/multierr" import ( "bytes" + "errors" "fmt" "io" "strings" @@ -186,6 +239,33 @@ func (merr *multiError) Errors() []error { return merr.errors } +// As attempts to find the first error in the error list that matches the type +// of the value that target points to. +// +// This function allows errors.As to traverse the values stored on the +// multierr error. +func (merr *multiError) As(target interface{}) bool { + for _, err := range merr.Errors() { + if errors.As(err, target) { + return true + } + } + return false +} + +// Is attempts to match the provided error against errors in the error list. +// +// This function allows errors.Is to traverse the values stored on the +// multierr error. +func (merr *multiError) Is(target error) bool { + for _, err := range merr.Errors() { + if errors.Is(err, target) { + return true + } + } + return false +} + func (merr *multiError) Error() string { if merr == nil { return "" @@ -292,6 +372,14 @@ func inspect(errors []error) (res inspectResult) { // fromSlice converts the given list of errors into a single error. func fromSlice(errors []error) error { + // Don't pay to inspect small slices. + switch len(errors) { + case 0: + return nil + case 1: + return errors[0] + } + res := inspect(errors) switch res.Count { case 0: @@ -301,8 +389,13 @@ func fromSlice(errors []error) error { return errors[res.FirstErrorIdx] case len(errors): if !res.ContainsMultiError { - // already flat - return &multiError{errors: errors} + // Error list is flat. Make a copy of it + // Otherwise "errors" escapes to the heap + // unconditionally for all other cases. + // This lets us optimize for the "no errors" case. + out := make([]error, len(errors)) + copy(out, errors) + return &multiError{errors: out} } } @@ -421,7 +514,7 @@ func Append(left error, right error) error { // items = append(items, item) // } // -// Compare this with a verison that relies solely on Append: +// Compare this with a version that relies solely on Append: // // var err error // for line := range lines { @@ -447,3 +540,113 @@ func AppendInto(into *error, err error) (errored bool) { *into = Append(*into, err) return true } + +// Invoker is an operation that may fail with an error. Use it with +// AppendInvoke to append the result of calling the function into an error. +// This allows you to conveniently defer capture of failing operations. +// +// See also, Close and Invoke. +type Invoker interface { + Invoke() error +} + +// Invoke wraps a function which may fail with an error to match the Invoker +// interface. Use it to supply functions matching this signature to +// AppendInvoke. +// +// For example, +// +// func processReader(r io.Reader) (err error) { +// scanner := bufio.NewScanner(r) +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// for scanner.Scan() { +// // ... +// } +// // ... +// } +// +// In this example, the following line will construct the Invoker right away, +// but defer the invocation of scanner.Err() until the function returns. +// +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +type Invoke func() error + +// Invoke calls the supplied function and returns its result. +func (i Invoke) Invoke() error { return i() } + +// Close builds an Invoker that closes the provided io.Closer. Use it with +// AppendInvoke to close io.Closers and append their results into an error. +// +// For example, +// +// func processFile(path string) (err error) { +// f, err := os.Open(path) +// if err != nil { +// return err +// } +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// return processReader(f) +// } +// +// In this example, multierr.Close will construct the Invoker right away, but +// defer the invocation of f.Close until the function returns. +// +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +func Close(closer io.Closer) Invoker { + return Invoke(closer.Close) +} + +// AppendInvoke appends the result of calling the given Invoker into the +// provided error pointer. Use it with named returns to safely defer +// invocation of fallible operations until a function returns, and capture the +// resulting errors. +// +// func doSomething(...) (err error) { +// // ... +// f, err := openFile(..) +// if err != nil { +// return err +// } +// +// // multierr will call f.Close() when this function returns and +// // if the operation fails, its append its error into the +// // returned error. +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// +// scanner := bufio.NewScanner(f) +// // Similarly, this scheduled scanner.Err to be called and +// // inspected when the function returns and append its error +// // into the returned error. +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// +// // ... +// } +// +// Without defer, AppendInvoke behaves exactly like AppendInto. +// +// err := // ... +// multierr.AppendInvoke(&err, mutltierr.Invoke(foo)) +// +// // ...is roughly equivalent to... +// +// err := // ... +// multierr.AppendInto(&err, foo()) +// +// The advantage of the indirection introduced by Invoker is to make it easy +// to defer the invocation of a function. Without this indirection, the +// invoked function will be evaluated at the time of the defer block rather +// than when the function returns. +// +// // BAD: This is likely not what the caller intended. This will evaluate +// // foo() right away and append its result into the error when the +// // function returns. +// defer multierr.AppendInto(&err, foo()) +// +// // GOOD: This will defer invocation of foo unutil the function returns. +// defer multierr.AppendInvoke(&err, multierr.Invoke(foo)) +// +// multierr provides a few Invoker implementations out of the box for +// convenience. See Invoker for more information. +func AppendInvoke(into *error, invoker Invoker) { + AppendInto(into, invoker.Invoke()) +} diff --git a/vendor/go.uber.org/zap/.readme.tmpl b/vendor/go.uber.org/zap/.readme.tmpl index 3154a1e64..92aa65d66 100644 --- a/vendor/go.uber.org/zap/.readme.tmpl +++ b/vendor/go.uber.org/zap/.readme.tmpl @@ -96,14 +96,14 @@ Released under the [MIT License](LICENSE.txt). 1 In particular, keep in mind that we may be benchmarking against slightly older versions of other packages. Versions are -pinned in zap's [glide.lock][] file. [↩](#anchor-versions) +pinned in the [benchmarks/go.mod][] file. [↩](#anchor-versions) -[doc-img]: https://godoc.org/go.uber.org/zap?status.svg -[doc]: https://godoc.org/go.uber.org/zap -[ci-img]: https://travis-ci.com/uber-go/zap.svg?branch=master -[ci]: https://travis-ci.com/uber-go/zap +[doc-img]: https://pkg.go.dev/badge/go.uber.org/zap +[doc]: https://pkg.go.dev/go.uber.org/zap +[ci-img]: https://github.com/uber-go/zap/actions/workflows/go.yml/badge.svg +[ci]: https://github.com/uber-go/zap/actions/workflows/go.yml [cov-img]: https://codecov.io/gh/uber-go/zap/branch/master/graph/badge.svg [cov]: https://codecov.io/gh/uber-go/zap [benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks -[glide.lock]: https://github.com/uber-go/zap/blob/master/glide.lock +[benchmarks/go.mod]: https://github.com/uber-go/zap/blob/master/benchmarks/go.mod diff --git a/vendor/go.uber.org/zap/CHANGELOG.md b/vendor/go.uber.org/zap/CHANGELOG.md index 794ee303e..da36c3708 100644 --- a/vendor/go.uber.org/zap/CHANGELOG.md +++ b/vendor/go.uber.org/zap/CHANGELOG.md @@ -3,9 +3,97 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 1.23.0 (24 Aug 2022) + +Enhancements: +* [#1147][]: Add a `zapcore.LevelOf` function to determine the level of a + `LevelEnabler` or `Core`. +* [#1155][]: Add `zap.Stringers` field constructor to log arrays of objects + that implement `String() string`. + +[#1147]: https://github.com/uber-go/zap/pull/1147 +[#1155]: https://github.com/uber-go/zap/pull/1155 + + +## 1.22.0 (8 Aug 2022) + +Enhancements: +* [#1071][]: Add `zap.Objects` and `zap.ObjectValues` field constructors to log + arrays of objects. With these two constructors, you don't need to implement + `zapcore.ArrayMarshaler` for use with `zap.Array` if those objects implement + `zapcore.ObjectMarshaler`. +* [#1079][]: Add `SugaredLogger.WithOptions` to build a copy of an existing + `SugaredLogger` with the provided options applied. +* [#1080][]: Add `*ln` variants to `SugaredLogger` for each log level. + These functions provide a string joining behavior similar to `fmt.Println`. +* [#1088][]: Add `zap.WithFatalHook` option to control the behavior of the + logger for `Fatal`-level log entries. This defaults to exiting the program. +* [#1108][]: Add a `zap.Must` function that you can use with `NewProduction` or + `NewDevelopment` to panic if the system was unable to build the logger. +* [#1118][]: Add a `Logger.Log` method that allows specifying the log level for + a statement dynamically. + +Thanks to @cardil, @craigpastro, @sashamelentyev, @shota3506, and @zhupeijun +for their contributions to this release. + +[#1071]: https://github.com/uber-go/zap/pull/1071 +[#1079]: https://github.com/uber-go/zap/pull/1079 +[#1080]: https://github.com/uber-go/zap/pull/1080 +[#1088]: https://github.com/uber-go/zap/pull/1088 +[#1108]: https://github.com/uber-go/zap/pull/1108 +[#1118]: https://github.com/uber-go/zap/pull/1118 + +## 1.21.0 (7 Feb 2022) + +Enhancements: +* [#1047][]: Add `zapcore.ParseLevel` to parse a `Level` from a string. +* [#1048][]: Add `zap.ParseAtomicLevel` to parse an `AtomicLevel` from a + string. + +Bugfixes: +* [#1058][]: Fix panic in JSON encoder when `EncodeLevel` is unset. + +Other changes: +* [#1052][]: Improve encoding performance when the `AddCaller` and + `AddStacktrace` options are used together. + +[#1047]: https://github.com/uber-go/zap/pull/1047 +[#1048]: https://github.com/uber-go/zap/pull/1048 +[#1052]: https://github.com/uber-go/zap/pull/1052 +[#1058]: https://github.com/uber-go/zap/pull/1058 + +Thanks to @aerosol and @Techassi for their contributions to this release. + +## 1.20.0 (4 Jan 2022) + +Enhancements: +* [#989][]: Add `EncoderConfig.SkipLineEnding` flag to disable adding newline + characters between log statements. +* [#1039][]: Add `EncoderConfig.NewReflectedEncoder` field to customize JSON + encoding of reflected log fields. + +Bugfixes: +* [#1011][]: Fix inaccurate precision when encoding complex64 as JSON. +* [#554][], [#1017][]: Close JSON namespaces opened in `MarshalLogObject` + methods when the methods return. +* [#1033][]: Avoid panicking in Sampler core if `thereafter` is zero. + +Other changes: +* [#1028][]: Drop support for Go < 1.15. + +[#554]: https://github.com/uber-go/zap/pull/554 +[#989]: https://github.com/uber-go/zap/pull/989 +[#1011]: https://github.com/uber-go/zap/pull/1011 +[#1017]: https://github.com/uber-go/zap/pull/1017 +[#1028]: https://github.com/uber-go/zap/pull/1028 +[#1033]: https://github.com/uber-go/zap/pull/1033 +[#1039]: https://github.com/uber-go/zap/pull/1039 + +Thanks to @psrajat, @lruggieri, @sammyrnycreal for their contributions to this release. + ## 1.19.1 (8 Sep 2021) -### Fixed +Bugfixes: * [#1001][]: JSON: Fix complex number encoding with negative imaginary part. Thanks to @hemantjadon. * [#1003][]: JSON: Fix inaccurate precision when encoding float32. diff --git a/vendor/go.uber.org/zap/CONTRIBUTING.md b/vendor/go.uber.org/zap/CONTRIBUTING.md index 5cd965687..ea02f3cae 100644 --- a/vendor/go.uber.org/zap/CONTRIBUTING.md +++ b/vendor/go.uber.org/zap/CONTRIBUTING.md @@ -16,7 +16,7 @@ you to accept the CLA when you open your pull request. [Fork][fork], then clone the repository: -``` +```bash mkdir -p $GOPATH/src/go.uber.org cd $GOPATH/src/go.uber.org git clone git@github.com:your_github_username/zap.git @@ -27,21 +27,16 @@ git fetch upstream Make sure that the tests and the linters pass: -``` +```bash make test make lint ``` -If you're not using the minor version of Go specified in the Makefile's -`LINTABLE_MINOR_VERSIONS` variable, `make lint` doesn't do anything. This is -fine, but it means that you'll only discover lint failures after you open your -pull request. - ## Making Changes Start by creating a new branch for your changes: -``` +```bash cd $GOPATH/src/go.uber.org/zap git checkout master git fetch upstream @@ -52,22 +47,22 @@ git checkout -b cool_new_feature Make your changes, then ensure that `make lint` and `make test` still pass. If you're satisfied with your changes, push them to your fork. -``` +```bash git push origin cool_new_feature ``` Then use the GitHub UI to open a pull request. -At this point, you're waiting on us to review your changes. We *try* to respond +At this point, you're waiting on us to review your changes. We _try_ to respond to issues and pull requests within a few business days, and we may suggest some improvements or alternatives. Once your changes are approved, one of the project maintainers will merge them. We're much more likely to approve your changes if you: -* Add tests for new functionality. -* Write a [good commit message][commit-message]. -* Maintain backward compatibility. +- Add tests for new functionality. +- Write a [good commit message][commit-message]. +- Maintain backward compatibility. [fork]: https://github.com/uber-go/zap/fork [open-issue]: https://github.com/uber-go/zap/issues/new diff --git a/vendor/go.uber.org/zap/README.md b/vendor/go.uber.org/zap/README.md index 1e64d6cff..a553a428c 100644 --- a/vendor/go.uber.org/zap/README.md +++ b/vendor/go.uber.org/zap/README.md @@ -54,7 +54,7 @@ and make many small allocations. Put differently, using `encoding/json` and Zap takes a different approach. It includes a reflection-free, zero-allocation JSON encoder, and the base `Logger` strives to avoid serialization overhead and allocations wherever possible. By building the high-level `SugaredLogger` -on that foundation, zap lets users *choose* when they need to count every +on that foundation, zap lets users _choose_ when they need to count every allocation and when they'd prefer a more familiar, loosely typed API. As measured by its own [benchmarking suite][], not only is zap more performant @@ -64,40 +64,40 @@ id="anchor-versions">[1](#footnote-versions) Log a message and 10 fields: -| Package | Time | Time % to zap | Objects Allocated | -| :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 862 ns/op | +0% | 5 allocs/op -| :zap: zap (sugared) | 1250 ns/op | +45% | 11 allocs/op -| zerolog | 4021 ns/op | +366% | 76 allocs/op -| go-kit | 4542 ns/op | +427% | 105 allocs/op -| apex/log | 26785 ns/op | +3007% | 115 allocs/op -| logrus | 29501 ns/op | +3322% | 125 allocs/op -| log15 | 29906 ns/op | +3369% | 122 allocs/op +| Package | Time | Time % to zap | Objects Allocated | +| :------------------ | :---------: | :-----------: | :---------------: | +| :zap: zap | 2900 ns/op | +0% | 5 allocs/op | +| :zap: zap (sugared) | 3475 ns/op | +20% | 10 allocs/op | +| zerolog | 10639 ns/op | +267% | 32 allocs/op | +| go-kit | 14434 ns/op | +398% | 59 allocs/op | +| logrus | 17104 ns/op | +490% | 81 allocs/op | +| apex/log | 32424 ns/op | +1018% | 66 allocs/op | +| log15 | 33579 ns/op | +1058% | 76 allocs/op | Log a message with a logger that already has 10 fields of context: -| Package | Time | Time % to zap | Objects Allocated | -| :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 126 ns/op | +0% | 0 allocs/op -| :zap: zap (sugared) | 187 ns/op | +48% | 2 allocs/op -| zerolog | 88 ns/op | -30% | 0 allocs/op -| go-kit | 5087 ns/op | +3937% | 103 allocs/op -| log15 | 18548 ns/op | +14621% | 73 allocs/op -| apex/log | 26012 ns/op | +20544% | 104 allocs/op -| logrus | 27236 ns/op | +21516% | 113 allocs/op +| Package | Time | Time % to zap | Objects Allocated | +| :------------------ | :---------: | :-----------: | :---------------: | +| :zap: zap | 373 ns/op | +0% | 0 allocs/op | +| :zap: zap (sugared) | 452 ns/op | +21% | 1 allocs/op | +| zerolog | 288 ns/op | -23% | 0 allocs/op | +| go-kit | 11785 ns/op | +3060% | 58 allocs/op | +| logrus | 19629 ns/op | +5162% | 70 allocs/op | +| log15 | 21866 ns/op | +5762% | 72 allocs/op | +| apex/log | 30890 ns/op | +8182% | 55 allocs/op | Log a static string, without any context or `printf`-style templating: -| Package | Time | Time % to zap | Objects Allocated | -| :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 118 ns/op | +0% | 0 allocs/op -| :zap: zap (sugared) | 191 ns/op | +62% | 2 allocs/op -| zerolog | 93 ns/op | -21% | 0 allocs/op -| go-kit | 280 ns/op | +137% | 11 allocs/op -| standard library | 499 ns/op | +323% | 2 allocs/op -| apex/log | 1990 ns/op | +1586% | 10 allocs/op -| logrus | 3129 ns/op | +2552% | 24 allocs/op -| log15 | 3887 ns/op | +3194% | 23 allocs/op +| Package | Time | Time % to zap | Objects Allocated | +| :------------------ | :--------: | :-----------: | :---------------: | +| :zap: zap | 381 ns/op | +0% | 0 allocs/op | +| :zap: zap (sugared) | 410 ns/op | +8% | 1 allocs/op | +| zerolog | 369 ns/op | -3% | 0 allocs/op | +| standard library | 385 ns/op | +1% | 2 allocs/op | +| go-kit | 606 ns/op | +59% | 11 allocs/op | +| logrus | 1730 ns/op | +354% | 25 allocs/op | +| apex/log | 1998 ns/op | +424% | 7 allocs/op | +| log15 | 4546 ns/op | +1093% | 22 allocs/op | ## Development Status: Stable @@ -131,4 +131,3 @@ pinned in the [benchmarks/go.mod][] file. [↩](#anchor-versions) [cov]: https://codecov.io/gh/uber-go/zap [benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks [benchmarks/go.mod]: https://github.com/uber-go/zap/blob/master/benchmarks/go.mod - diff --git a/vendor/go.uber.org/zap/array_go118.go b/vendor/go.uber.org/zap/array_go118.go new file mode 100644 index 000000000..ea94f9d75 --- /dev/null +++ b/vendor/go.uber.org/zap/array_go118.go @@ -0,0 +1,156 @@ +// Copyright (c) 2022 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +//go:build go1.18 +// +build go1.18 + +package zap + +import ( + "fmt" + + "go.uber.org/zap/zapcore" +) + +// Objects constructs a field with the given key, holding a list of the +// provided objects that can be marshaled by Zap. +// +// Note that these objects must implement zapcore.ObjectMarshaler directly. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the Request type, not its pointer (*Request). +// If it's on the pointer, use ObjectValues. +// +// Given an object that implements MarshalLogObject on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Author struct{ ... } +// func (a Author) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var authors []Author = ... +// logger.Info("loading article", zap.Objects("authors", authors)) +// +// Similarly, given a type that implements MarshalLogObject on its pointer +// receiver, you can log a slice of pointers to that object with Objects like +// so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +// +// If instead, you have a slice of values of such an object, use the +// ObjectValues constructor. +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +func Objects[T zapcore.ObjectMarshaler](key string, values []T) Field { + return Array(key, objects[T](values)) +} + +type objects[T zapcore.ObjectMarshaler] []T + +func (os objects[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + if err := arr.AppendObject(o); err != nil { + return err + } + } + return nil +} + +// objectMarshalerPtr is a constraint that specifies that the given type +// implements zapcore.ObjectMarshaler on a pointer receiver. +type objectMarshalerPtr[T any] interface { + *T + zapcore.ObjectMarshaler +} + +// ObjectValues constructs a field with the given key, holding a list of the +// provided objects, where pointers to these objects can be marshaled by Zap. +// +// Note that pointers to these objects must implement zapcore.ObjectMarshaler. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the *Request type, not the value (Request). +// If it's on the value, use Objects. +// +// Given an object that implements MarshalLogObject on the pointer receiver, +// you can log a slice of those objects with ObjectValues like so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +// +// If instead, you have a slice of pointers of such an object, use the Objects +// field constructor. +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +func ObjectValues[T any, P objectMarshalerPtr[T]](key string, values []T) Field { + return Array(key, objectValues[T, P](values)) +} + +type objectValues[T any, P objectMarshalerPtr[T]] []T + +func (os objectValues[T, P]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range os { + // It is necessary for us to explicitly reference the "P" type. + // We cannot simply pass "&os[i]" to AppendObject because its type + // is "*T", which the type system does not consider as + // implementing ObjectMarshaler. + // Only the type "P" satisfies ObjectMarshaler, which we have + // to convert "*T" to explicitly. + var p P = &os[i] + if err := arr.AppendObject(p); err != nil { + return err + } + } + return nil +} + +// Stringers constructs a field with the given key, holding a list of the +// output provided by the value's String method +// +// Given an object that implements String on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Request struct{ ... } +// func (a Request) String() string +// +// var requests []Request = ... +// logger.Info("sending requests", zap.Stringers("requests", requests)) +// +// Note that these objects must implement fmt.Stringer directly. +// That is, if you're trying to marshal a []Request, the String method +// must be declared on the Request type, not its pointer (*Request). +func Stringers[T fmt.Stringer](key string, values []T) Field { + return Array(key, stringers[T](values)) +} + +type stringers[T fmt.Stringer] []T + +func (os stringers[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + arr.AppendString(o.String()) + } + return nil +} diff --git a/vendor/go.uber.org/zap/config.go b/vendor/go.uber.org/zap/config.go index 55637fb0b..ee6096766 100644 --- a/vendor/go.uber.org/zap/config.go +++ b/vendor/go.uber.org/zap/config.go @@ -21,7 +21,7 @@ package zap import ( - "fmt" + "errors" "sort" "time" @@ -182,7 +182,7 @@ func (cfg Config) Build(opts ...Option) (*Logger, error) { } if cfg.Level == (AtomicLevel{}) { - return nil, fmt.Errorf("missing Level") + return nil, errors.New("missing Level") } log := New( diff --git a/vendor/go.uber.org/zap/doc.go b/vendor/go.uber.org/zap/doc.go index 8638dd1b9..3c50d7b4d 100644 --- a/vendor/go.uber.org/zap/doc.go +++ b/vendor/go.uber.org/zap/doc.go @@ -32,7 +32,7 @@ // they need to count every allocation and when they'd prefer a more familiar, // loosely typed API. // -// Choosing a Logger +// # Choosing a Logger // // In contexts where performance is nice, but not critical, use the // SugaredLogger. It's 4-10x faster than other structured logging packages and @@ -41,14 +41,15 @@ // variadic number of key-value pairs. (For more advanced use cases, they also // accept strongly typed fields - see the SugaredLogger.With documentation for // details.) -// sugar := zap.NewExample().Sugar() -// defer sugar.Sync() -// sugar.Infow("failed to fetch URL", -// "url", "http://example.com", -// "attempt", 3, -// "backoff", time.Second, -// ) -// sugar.Infof("failed to fetch URL: %s", "http://example.com") +// +// sugar := zap.NewExample().Sugar() +// defer sugar.Sync() +// sugar.Infow("failed to fetch URL", +// "url", "http://example.com", +// "attempt", 3, +// "backoff", time.Second, +// ) +// sugar.Infof("failed to fetch URL: %s", "http://example.com") // // By default, loggers are unbuffered. However, since zap's low-level APIs // allow buffering, calling Sync before letting your process exit is a good @@ -57,32 +58,35 @@ // In the rare contexts where every microsecond and every allocation matter, // use the Logger. It's even faster than the SugaredLogger and allocates far // less, but it only supports strongly-typed, structured logging. -// logger := zap.NewExample() -// defer logger.Sync() -// logger.Info("failed to fetch URL", -// zap.String("url", "http://example.com"), -// zap.Int("attempt", 3), -// zap.Duration("backoff", time.Second), -// ) +// +// logger := zap.NewExample() +// defer logger.Sync() +// logger.Info("failed to fetch URL", +// zap.String("url", "http://example.com"), +// zap.Int("attempt", 3), +// zap.Duration("backoff", time.Second), +// ) // // Choosing between the Logger and SugaredLogger doesn't need to be an // application-wide decision: converting between the two is simple and // inexpensive. -// logger := zap.NewExample() -// defer logger.Sync() -// sugar := logger.Sugar() -// plain := sugar.Desugar() // -// Configuring Zap +// logger := zap.NewExample() +// defer logger.Sync() +// sugar := logger.Sugar() +// plain := sugar.Desugar() +// +// # Configuring Zap // // The simplest way to build a Logger is to use zap's opinionated presets: // NewExample, NewProduction, and NewDevelopment. These presets build a logger // with a single function call: -// logger, err := zap.NewProduction() -// if err != nil { -// log.Fatalf("can't initialize zap logger: %v", err) -// } -// defer logger.Sync() +// +// logger, err := zap.NewProduction() +// if err != nil { +// log.Fatalf("can't initialize zap logger: %v", err) +// } +// defer logger.Sync() // // Presets are fine for small projects, but larger projects and organizations // naturally require a bit more customization. For most users, zap's Config @@ -94,7 +98,7 @@ // go.uber.org/zap/zapcore. See the package-level AdvancedConfiguration // example for sample code. // -// Extending Zap +// # Extending Zap // // The zap package itself is a relatively thin wrapper around the interfaces // in go.uber.org/zap/zapcore. Extending zap to support a new encoding (e.g., @@ -106,7 +110,7 @@ // Similarly, package authors can use the high-performance Encoder and Core // implementations in the zapcore package to build their own loggers. // -// Frequently Asked Questions +// # Frequently Asked Questions // // An FAQ covering everything from installation errors to design decisions is // available at https://github.com/uber-go/zap/blob/master/FAQ.md. diff --git a/vendor/go.uber.org/zap/encoder.go b/vendor/go.uber.org/zap/encoder.go index 08ed83354..caa04ceef 100644 --- a/vendor/go.uber.org/zap/encoder.go +++ b/vendor/go.uber.org/zap/encoder.go @@ -63,7 +63,7 @@ func RegisterEncoder(name string, constructor func(zapcore.EncoderConfig) (zapco func newEncoder(name string, encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { if encoderConfig.TimeKey != "" && encoderConfig.EncodeTime == nil { - return nil, fmt.Errorf("missing EncodeTime in EncoderConfig") + return nil, errors.New("missing EncodeTime in EncoderConfig") } _encoderMutex.RLock() diff --git a/vendor/go.uber.org/zap/global.go b/vendor/go.uber.org/zap/global.go index c1ac0507c..3cb46c9e0 100644 --- a/vendor/go.uber.org/zap/global.go +++ b/vendor/go.uber.org/zap/global.go @@ -31,6 +31,7 @@ import ( ) const ( + _stdLogDefaultDepth = 1 _loggerWriterDepth = 2 _programmerErrorTemplate = "You've found a bug in zap! Please file a bug at " + "https://github.com/uber-go/zap/issues/new and reference this error: %v" diff --git a/vendor/go.uber.org/zap/http_handler.go b/vendor/go.uber.org/zap/http_handler.go index 1297c33b3..632b6831a 100644 --- a/vendor/go.uber.org/zap/http_handler.go +++ b/vendor/go.uber.org/zap/http_handler.go @@ -22,6 +22,7 @@ package zap import ( "encoding/json" + "errors" "fmt" "io" "net/http" @@ -32,22 +33,23 @@ import ( // ServeHTTP is a simple JSON endpoint that can report on or change the current // logging level. // -// GET +// # GET // // The GET request returns a JSON description of the current logging level like: -// {"level":"info"} // -// PUT +// {"level":"info"} +// +// # PUT // // The PUT request changes the logging level. It is perfectly safe to change the // logging level while a program is running. Two content types are supported: // -// Content-Type: application/x-www-form-urlencoded +// Content-Type: application/x-www-form-urlencoded // // With this content type, the level can be provided through the request body or // a query parameter. The log level is URL encoded like: // -// level=debug +// level=debug // // The request body takes precedence over the query parameter, if both are // specified. @@ -55,18 +57,17 @@ import ( // This content type is the default for a curl PUT request. Following are two // example curl requests that both set the logging level to debug. // -// curl -X PUT localhost:8080/log/level?level=debug -// curl -X PUT localhost:8080/log/level -d level=debug +// curl -X PUT localhost:8080/log/level?level=debug +// curl -X PUT localhost:8080/log/level -d level=debug // // For any other content type, the payload is expected to be JSON encoded and // look like: // -// {"level":"info"} +// {"level":"info"} // // An example curl request could look like this: // -// curl -X PUT localhost:8080/log/level -H "Content-Type: application/json" -d '{"level":"debug"}' -// +// curl -X PUT localhost:8080/log/level -H "Content-Type: application/json" -d '{"level":"debug"}' func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { type errorResponse struct { Error string `json:"error"` @@ -108,7 +109,7 @@ func decodePutRequest(contentType string, r *http.Request) (zapcore.Level, error func decodePutURL(r *http.Request) (zapcore.Level, error) { lvl := r.FormValue("level") if lvl == "" { - return 0, fmt.Errorf("must specify logging level") + return 0, errors.New("must specify logging level") } var l zapcore.Level if err := l.UnmarshalText([]byte(lvl)); err != nil { @@ -125,7 +126,7 @@ func decodePutJSON(body io.Reader) (zapcore.Level, error) { return 0, fmt.Errorf("malformed request body: %v", err) } if pld.Level == nil { - return 0, fmt.Errorf("must specify logging level") + return 0, errors.New("must specify logging level") } return *pld.Level, nil diff --git a/vendor/go.uber.org/zap/internal/exit/exit.go b/vendor/go.uber.org/zap/internal/exit/exit.go index dfc5b05fe..f673f9947 100644 --- a/vendor/go.uber.org/zap/internal/exit/exit.go +++ b/vendor/go.uber.org/zap/internal/exit/exit.go @@ -24,24 +24,25 @@ package exit import "os" -var real = func() { os.Exit(1) } +var _exit = os.Exit -// Exit normally terminates the process by calling os.Exit(1). If the package -// is stubbed, it instead records a call in the testing spy. -func Exit() { - real() +// With terminates the process by calling os.Exit(code). If the package is +// stubbed, it instead records a call in the testing spy. +func With(code int) { + _exit(code) } // A StubbedExit is a testing fake for os.Exit. type StubbedExit struct { Exited bool - prev func() + Code int + prev func(code int) } // Stub substitutes a fake for the call to os.Exit(1). func Stub() *StubbedExit { - s := &StubbedExit{prev: real} - real = s.exit + s := &StubbedExit{prev: _exit} + _exit = s.exit return s } @@ -56,9 +57,10 @@ func WithStub(f func()) *StubbedExit { // Unstub restores the previous exit function. func (se *StubbedExit) Unstub() { - real = se.prev + _exit = se.prev } -func (se *StubbedExit) exit() { +func (se *StubbedExit) exit(code int) { se.Exited = true + se.Code = code } diff --git a/vendor/go.uber.org/zap/global_go112.go b/vendor/go.uber.org/zap/internal/level_enabler.go similarity index 70% rename from vendor/go.uber.org/zap/global_go112.go rename to vendor/go.uber.org/zap/internal/level_enabler.go index 6b5dbda80..5f3e3f1b9 100644 --- a/vendor/go.uber.org/zap/global_go112.go +++ b/vendor/go.uber.org/zap/internal/level_enabler.go @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Uber Technologies, Inc. +// Copyright (c) 2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,9 +18,18 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -// See #682 for more information. -// +build go1.12 +package internal -package zap +import "go.uber.org/zap/zapcore" -const _stdLogDefaultDepth = 1 +// LeveledEnabler is an interface satisfied by LevelEnablers that are able to +// report their own level. +// +// This interface is defined to use more conveniently in tests and non-zapcore +// packages. +// This cannot be imported from zapcore because of the cyclic dependency. +type LeveledEnabler interface { + zapcore.LevelEnabler + + Level() zapcore.Level +} diff --git a/vendor/go.uber.org/zap/level.go b/vendor/go.uber.org/zap/level.go index 3567a9a1e..db951e19a 100644 --- a/vendor/go.uber.org/zap/level.go +++ b/vendor/go.uber.org/zap/level.go @@ -22,6 +22,7 @@ package zap import ( "go.uber.org/atomic" + "go.uber.org/zap/internal" "go.uber.org/zap/zapcore" ) @@ -70,6 +71,8 @@ type AtomicLevel struct { l *atomic.Int32 } +var _ internal.LeveledEnabler = AtomicLevel{} + // NewAtomicLevel creates an AtomicLevel with InfoLevel and above logging // enabled. func NewAtomicLevel() AtomicLevel { @@ -86,6 +89,23 @@ func NewAtomicLevelAt(l zapcore.Level) AtomicLevel { return a } +// ParseAtomicLevel parses an AtomicLevel based on a lowercase or all-caps ASCII +// representation of the log level. If the provided ASCII representation is +// invalid an error is returned. +// +// This is particularly useful when dealing with text input to configure log +// levels. +func ParseAtomicLevel(text string) (AtomicLevel, error) { + a := NewAtomicLevel() + l, err := zapcore.ParseLevel(text) + if err != nil { + return a, err + } + + a.SetLevel(l) + return a, nil +} + // Enabled implements the zapcore.LevelEnabler interface, which allows the // AtomicLevel to be used in place of traditional static levels. func (lvl AtomicLevel) Enabled(l zapcore.Level) bool { diff --git a/vendor/go.uber.org/zap/logger.go b/vendor/go.uber.org/zap/logger.go index f116bd936..b5f9a99fd 100644 --- a/vendor/go.uber.org/zap/logger.go +++ b/vendor/go.uber.org/zap/logger.go @@ -22,11 +22,11 @@ package zap import ( "fmt" - "io/ioutil" + "io" "os" - "runtime" "strings" + "go.uber.org/zap/internal/bufferpool" "go.uber.org/zap/zapcore" ) @@ -42,7 +42,7 @@ type Logger struct { development bool addCaller bool - onFatal zapcore.CheckWriteAction // default is WriteThenFatal + onFatal zapcore.CheckWriteHook // default is WriteThenFatal name string errorOutput zapcore.WriteSyncer @@ -85,7 +85,7 @@ func New(core zapcore.Core, options ...Option) *Logger { func NewNop() *Logger { return &Logger{ core: zapcore.NewNopCore(), - errorOutput: zapcore.AddSync(ioutil.Discard), + errorOutput: zapcore.AddSync(io.Discard), addStack: zapcore.FatalLevel + 1, clock: zapcore.DefaultClock, } @@ -107,6 +107,19 @@ func NewDevelopment(options ...Option) (*Logger, error) { return NewDevelopmentConfig().Build(options...) } +// Must is a helper that wraps a call to a function returning (*Logger, error) +// and panics if the error is non-nil. It is intended for use in variable +// initialization such as: +// +// var logger = zap.Must(zap.NewProduction()) +func Must(logger *Logger, err error) *Logger { + if err != nil { + panic(err) + } + + return logger +} + // NewExample builds a Logger that's designed for use in zap's testable // examples. It writes DebugLevel and above logs to standard out as JSON, but // omits the timestamp and calling function to keep example output @@ -177,6 +190,14 @@ func (log *Logger) Check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { return log.check(lvl, msg) } +// Log logs a message at the specified level. The message includes any fields +// passed at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Log(lvl zapcore.Level, msg string, fields ...Field) { + if ce := log.check(lvl, msg); ce != nil { + ce.Write(fields...) + } +} + // Debug logs a message at DebugLevel. The message includes any fields passed // at the log site, as well as any fields accumulated on the logger. func (log *Logger) Debug(msg string, fields ...Field) { @@ -259,8 +280,10 @@ func (log *Logger) clone() *Logger { } func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { - // check must always be called directly by a method in the Logger interface - // (e.g., Check, Info, Fatal). + // Logger.check must always be called directly by a method in the + // Logger interface (e.g., Check, Info, Fatal). + // This skips Logger.check and the Info/Fatal/Check/etc. method that + // called it. const callerSkipOffset = 2 // Check the level first to reduce the cost of disabled log calls. @@ -283,18 +306,27 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Set up any required terminal behavior. switch ent.Level { case zapcore.PanicLevel: - ce = ce.Should(ent, zapcore.WriteThenPanic) + ce = ce.After(ent, zapcore.WriteThenPanic) case zapcore.FatalLevel: onFatal := log.onFatal - // Noop is the default value for CheckWriteAction, and it leads to - // continued execution after a Fatal which is unexpected. - if onFatal == zapcore.WriteThenNoop { + // nil or WriteThenNoop will lead to continued execution after + // a Fatal log entry, which is unexpected. For example, + // + // f, err := os.Open(..) + // if err != nil { + // log.Fatal("cannot open", zap.Error(err)) + // } + // fmt.Println(f.Name()) + // + // The f.Name() will panic if we continue execution after the + // log.Fatal. + if onFatal == nil || onFatal == zapcore.WriteThenNoop { onFatal = zapcore.WriteThenFatal } - ce = ce.Should(ent, onFatal) + ce = ce.After(ent, onFatal) case zapcore.DPanicLevel: if log.development { - ce = ce.Should(ent, zapcore.WriteThenPanic) + ce = ce.After(ent, zapcore.WriteThenPanic) } } @@ -307,42 +339,55 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Thread the error output through to the CheckedEntry. ce.ErrorOutput = log.errorOutput - if log.addCaller { - frame, defined := getCallerFrame(log.callerSkip + callerSkipOffset) - if !defined { + + addStack := log.addStack.Enabled(ce.Level) + if !log.addCaller && !addStack { + return ce + } + + // Adding the caller or stack trace requires capturing the callers of + // this function. We'll share information between these two. + stackDepth := stacktraceFirst + if addStack { + stackDepth = stacktraceFull + } + stack := captureStacktrace(log.callerSkip+callerSkipOffset, stackDepth) + defer stack.Free() + + if stack.Count() == 0 { + if log.addCaller { fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", ent.Time.UTC()) log.errorOutput.Sync() } + return ce + } + + frame, more := stack.Next() - ce.Entry.Caller = zapcore.EntryCaller{ - Defined: defined, + if log.addCaller { + ce.Caller = zapcore.EntryCaller{ + Defined: frame.PC != 0, PC: frame.PC, File: frame.File, Line: frame.Line, Function: frame.Function, } } - if log.addStack.Enabled(ce.Entry.Level) { - ce.Entry.Stack = StackSkip("", log.callerSkip+callerSkipOffset).String - } - return ce -} + if addStack { + buffer := bufferpool.Get() + defer buffer.Free() -// getCallerFrame gets caller frame. The argument skip is the number of stack -// frames to ascend, with 0 identifying the caller of getCallerFrame. The -// boolean ok is false if it was not possible to recover the information. -// -// Note: This implementation is similar to runtime.Caller, but it returns the whole frame. -func getCallerFrame(skip int) (frame runtime.Frame, ok bool) { - const skipOffset = 2 // skip getCallerFrame and Callers - - pc := make([]uintptr, 1) - numFrames := runtime.Callers(skip+skipOffset, pc) - if numFrames < 1 { - return + stackfmt := newStackFormatter(buffer) + + // We've already extracted the first frame, so format that + // separately and defer to stackfmt for the rest. + stackfmt.FormatFrame(frame) + if more { + stackfmt.FormatStack(stack) + } + ce.Stack = buffer.String() } - frame, _ = runtime.CallersFrames(pc).Next() - return frame, frame.PC != 0 + return ce } diff --git a/vendor/go.uber.org/zap/options.go b/vendor/go.uber.org/zap/options.go index e9e66161f..1511166c0 100644 --- a/vendor/go.uber.org/zap/options.go +++ b/vendor/go.uber.org/zap/options.go @@ -133,9 +133,27 @@ func IncreaseLevel(lvl zapcore.LevelEnabler) Option { } // OnFatal sets the action to take on fatal logs. +// Deprecated: Use WithFatalHook instead. func OnFatal(action zapcore.CheckWriteAction) Option { + return WithFatalHook(action) +} + +// WithFatalHook sets a CheckWriteHook to run on fatal logs. +// Zap will call this hook after writing a log statement with a Fatal level. +// +// For example, the following builds a logger that will exit the current +// goroutine after writing a fatal log message, but it will not exit the +// program. +// +// zap.New(core, zap.WithFatalHook(zapcore.WriteThenGoexit)) +// +// It is important that the provided CheckWriteHook stops the control flow at +// the current statement to meet expectations of callers of the logger. +// We recommend calling os.Exit or runtime.Goexit inside custom hooks at +// minimum. +func WithFatalHook(hook zapcore.CheckWriteHook) Option { return optionFunc(func(log *Logger) { - log.onFatal = action + log.onFatal = hook }) } diff --git a/vendor/go.uber.org/zap/stacktrace.go b/vendor/go.uber.org/zap/stacktrace.go index 0cf8c1ddf..3d187fa56 100644 --- a/vendor/go.uber.org/zap/stacktrace.go +++ b/vendor/go.uber.org/zap/stacktrace.go @@ -24,62 +24,153 @@ import ( "runtime" "sync" + "go.uber.org/zap/buffer" "go.uber.org/zap/internal/bufferpool" ) -var ( - _stacktracePool = sync.Pool{ - New: func() interface{} { - return newProgramCounters(64) - }, - } +var _stacktracePool = sync.Pool{ + New: func() interface{} { + return &stacktrace{ + storage: make([]uintptr, 64), + } + }, +} + +type stacktrace struct { + pcs []uintptr // program counters; always a subslice of storage + frames *runtime.Frames + + // The size of pcs varies depending on requirements: + // it will be one if the only the first frame was requested, + // and otherwise it will reflect the depth of the call stack. + // + // storage decouples the slice we need (pcs) from the slice we pool. + // We will always allocate a reasonably large storage, but we'll use + // only as much of it as we need. + storage []uintptr +} + +// stacktraceDepth specifies how deep of a stack trace should be captured. +type stacktraceDepth int + +const ( + // stacktraceFirst captures only the first frame. + stacktraceFirst stacktraceDepth = iota + + // stacktraceFull captures the entire call stack, allocating more + // storage for it if needed. + stacktraceFull ) -func takeStacktrace(skip int) string { - buffer := bufferpool.Get() - defer buffer.Free() - programCounters := _stacktracePool.Get().(*programCounters) - defer _stacktracePool.Put(programCounters) - - var numFrames int - for { - // Skip the call to runtime.Callers and takeStacktrace so that the - // program counters start at the caller of takeStacktrace. - numFrames = runtime.Callers(skip+2, programCounters.pcs) - if numFrames < len(programCounters.pcs) { - break - } - // Don't put the too-short counter slice back into the pool; this lets - // the pool adjust if we consistently take deep stacktraces. - programCounters = newProgramCounters(len(programCounters.pcs) * 2) +// captureStacktrace captures a stack trace of the specified depth, skipping +// the provided number of frames. skip=0 identifies the caller of +// captureStacktrace. +// +// The caller must call Free on the returned stacktrace after using it. +func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { + stack := _stacktracePool.Get().(*stacktrace) + + switch depth { + case stacktraceFirst: + stack.pcs = stack.storage[:1] + case stacktraceFull: + stack.pcs = stack.storage } - i := 0 - frames := runtime.CallersFrames(programCounters.pcs[:numFrames]) + // Unlike other "skip"-based APIs, skip=0 identifies runtime.Callers + // itself. +2 to skip captureStacktrace and runtime.Callers. + numFrames := runtime.Callers( + skip+2, + stack.pcs, + ) - // Note: On the last iteration, frames.Next() returns false, with a valid - // frame, but we ignore this frame. The last frame is a a runtime frame which - // adds noise, since it's only either runtime.main or runtime.goexit. - for frame, more := frames.Next(); more; frame, more = frames.Next() { - if i != 0 { - buffer.AppendByte('\n') + // runtime.Callers truncates the recorded stacktrace if there is no + // room in the provided slice. For the full stack trace, keep expanding + // storage until there are fewer frames than there is room. + if depth == stacktraceFull { + pcs := stack.pcs + for numFrames == len(pcs) { + pcs = make([]uintptr, len(pcs)*2) + numFrames = runtime.Callers(skip+2, pcs) } - i++ - buffer.AppendString(frame.Function) - buffer.AppendByte('\n') - buffer.AppendByte('\t') - buffer.AppendString(frame.File) - buffer.AppendByte(':') - buffer.AppendInt(int64(frame.Line)) + + // Discard old storage instead of returning it to the pool. + // This will adjust the pool size over time if stack traces are + // consistently very deep. + stack.storage = pcs + stack.pcs = pcs[:numFrames] + } else { + stack.pcs = stack.pcs[:numFrames] } + stack.frames = runtime.CallersFrames(stack.pcs) + return stack +} + +// Free releases resources associated with this stacktrace +// and returns it back to the pool. +func (st *stacktrace) Free() { + st.frames = nil + st.pcs = nil + _stacktracePool.Put(st) +} + +// Count reports the total number of frames in this stacktrace. +// Count DOES NOT change as Next is called. +func (st *stacktrace) Count() int { + return len(st.pcs) +} + +// Next returns the next frame in the stack trace, +// and a boolean indicating whether there are more after it. +func (st *stacktrace) Next() (_ runtime.Frame, more bool) { + return st.frames.Next() +} + +func takeStacktrace(skip int) string { + stack := captureStacktrace(skip+1, stacktraceFull) + defer stack.Free() + + buffer := bufferpool.Get() + defer buffer.Free() + + stackfmt := newStackFormatter(buffer) + stackfmt.FormatStack(stack) return buffer.String() } -type programCounters struct { - pcs []uintptr +// stackFormatter formats a stack trace into a readable string representation. +type stackFormatter struct { + b *buffer.Buffer + nonEmpty bool // whehther we've written at least one frame already +} + +// newStackFormatter builds a new stackFormatter. +func newStackFormatter(b *buffer.Buffer) stackFormatter { + return stackFormatter{b: b} +} + +// FormatStack formats all remaining frames in the provided stacktrace -- minus +// the final runtime.main/runtime.goexit frame. +func (sf *stackFormatter) FormatStack(stack *stacktrace) { + // Note: On the last iteration, frames.Next() returns false, with a valid + // frame, but we ignore this frame. The last frame is a a runtime frame which + // adds noise, since it's only either runtime.main or runtime.goexit. + for frame, more := stack.Next(); more; frame, more = stack.Next() { + sf.FormatFrame(frame) + } } -func newProgramCounters(size int) *programCounters { - return &programCounters{make([]uintptr, size)} +// FormatFrame formats the given frame. +func (sf *stackFormatter) FormatFrame(frame runtime.Frame) { + if sf.nonEmpty { + sf.b.AppendByte('\n') + } + sf.nonEmpty = true + sf.b.AppendString(frame.Function) + sf.b.AppendByte('\n') + sf.b.AppendByte('\t') + sf.b.AppendString(frame.File) + sf.b.AppendByte(':') + sf.b.AppendInt(int64(frame.Line)) } diff --git a/vendor/go.uber.org/zap/sugar.go b/vendor/go.uber.org/zap/sugar.go index 0b9651981..c450b2dda 100644 --- a/vendor/go.uber.org/zap/sugar.go +++ b/vendor/go.uber.org/zap/sugar.go @@ -38,10 +38,19 @@ const ( // method. // // Unlike the Logger, the SugaredLogger doesn't insist on structured logging. -// For each log level, it exposes three methods: one for loosely-typed -// structured logging, one for println-style formatting, and one for -// printf-style formatting. For example, SugaredLoggers can produce InfoLevel -// output with Infow ("info with" structured context), Info, or Infof. +// For each log level, it exposes four methods: +// +// - methods named after the log level for log.Print-style logging +// - methods ending in "w" for loosely-typed structured logging +// - methods ending in "f" for log.Printf-style logging +// - methods ending in "ln" for log.Println-style logging +// +// For example, the methods for InfoLevel are: +// +// Info(...any) Print-style logging +// Infow(...any) Structured logging (read as "info with") +// Infof(string, ...any) Printf-style logging +// Infoln(...any) Println-style logging type SugaredLogger struct { base *Logger } @@ -61,27 +70,40 @@ func (s *SugaredLogger) Named(name string) *SugaredLogger { return &SugaredLogger{base: s.base.Named(name)} } +// WithOptions clones the current SugaredLogger, applies the supplied Options, +// and returns the result. It's safe to use concurrently. +func (s *SugaredLogger) WithOptions(opts ...Option) *SugaredLogger { + base := s.base.clone() + for _, opt := range opts { + opt.apply(base) + } + return &SugaredLogger{base: base} +} + // With adds a variadic number of fields to the logging context. It accepts a // mix of strongly-typed Field objects and loosely-typed key-value pairs. When // processing pairs, the first element of the pair is used as the field key // and the second as the field value. // // For example, -// sugaredLogger.With( -// "hello", "world", -// "failure", errors.New("oh no"), -// Stack(), -// "count", 42, -// "user", User{Name: "alice"}, -// ) +// +// sugaredLogger.With( +// "hello", "world", +// "failure", errors.New("oh no"), +// Stack(), +// "count", 42, +// "user", User{Name: "alice"}, +// ) +// // is the equivalent of -// unsugared.With( -// String("hello", "world"), -// String("failure", "oh no"), -// Stack(), -// Int("count", 42), -// Object("user", User{Name: "alice"}), -// ) +// +// unsugared.With( +// String("hello", "world"), +// String("failure", "oh no"), +// Stack(), +// Int("count", 42), +// Object("user", User{Name: "alice"}), +// ) // // Note that the keys in key-value pairs should be strings. In development, // passing a non-string key panics. In production, the logger is more @@ -168,7 +190,8 @@ func (s *SugaredLogger) Fatalf(template string, args ...interface{}) { // pairs are treated as they are in With. // // When debug-level logging is disabled, this is much faster than -// s.With(keysAndValues).Debug(msg) +// +// s.With(keysAndValues).Debug(msg) func (s *SugaredLogger) Debugw(msg string, keysAndValues ...interface{}) { s.log(DebugLevel, msg, nil, keysAndValues) } @@ -210,11 +233,48 @@ func (s *SugaredLogger) Fatalw(msg string, keysAndValues ...interface{}) { s.log(FatalLevel, msg, nil, keysAndValues) } +// Debugln uses fmt.Sprintln to construct and log a message. +func (s *SugaredLogger) Debugln(args ...interface{}) { + s.logln(DebugLevel, args, nil) +} + +// Infoln uses fmt.Sprintln to construct and log a message. +func (s *SugaredLogger) Infoln(args ...interface{}) { + s.logln(InfoLevel, args, nil) +} + +// Warnln uses fmt.Sprintln to construct and log a message. +func (s *SugaredLogger) Warnln(args ...interface{}) { + s.logln(WarnLevel, args, nil) +} + +// Errorln uses fmt.Sprintln to construct and log a message. +func (s *SugaredLogger) Errorln(args ...interface{}) { + s.logln(ErrorLevel, args, nil) +} + +// DPanicln uses fmt.Sprintln to construct and log a message. In development, the +// logger then panics. (See DPanicLevel for details.) +func (s *SugaredLogger) DPanicln(args ...interface{}) { + s.logln(DPanicLevel, args, nil) +} + +// Panicln uses fmt.Sprintln to construct and log a message, then panics. +func (s *SugaredLogger) Panicln(args ...interface{}) { + s.logln(PanicLevel, args, nil) +} + +// Fatalln uses fmt.Sprintln to construct and log a message, then calls os.Exit. +func (s *SugaredLogger) Fatalln(args ...interface{}) { + s.logln(FatalLevel, args, nil) +} + // Sync flushes any buffered log entries. func (s *SugaredLogger) Sync() error { return s.base.Sync() } +// log message with Sprint, Sprintf, or neither. func (s *SugaredLogger) log(lvl zapcore.Level, template string, fmtArgs []interface{}, context []interface{}) { // If logging at this level is completely disabled, skip the overhead of // string formatting. @@ -228,6 +288,18 @@ func (s *SugaredLogger) log(lvl zapcore.Level, template string, fmtArgs []interf } } +// logln message with Sprintln +func (s *SugaredLogger) logln(lvl zapcore.Level, fmtArgs []interface{}, context []interface{}) { + if lvl < DPanicLevel && !s.base.Core().Enabled(lvl) { + return + } + + msg := getMessageln(fmtArgs) + if ce := s.base.Check(lvl, msg); ce != nil { + ce.Write(s.sweetenFields(context)...) + } +} + // getMessage format with Sprint, Sprintf, or neither. func getMessage(template string, fmtArgs []interface{}) string { if len(fmtArgs) == 0 { @@ -246,6 +318,12 @@ func getMessage(template string, fmtArgs []interface{}) string { return fmt.Sprint(fmtArgs...) } +// getMessageln format with Sprintln. +func getMessageln(fmtArgs []interface{}) string { + msg := fmt.Sprintln(fmtArgs...) + return msg[:len(msg)-1] +} + func (s *SugaredLogger) sweetenFields(args []interface{}) []Field { if len(args) == 0 { return nil diff --git a/vendor/go.uber.org/zap/writer.go b/vendor/go.uber.org/zap/writer.go index 86a709ab0..2c3dbd425 100644 --- a/vendor/go.uber.org/zap/writer.go +++ b/vendor/go.uber.org/zap/writer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2016-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,7 +23,6 @@ package zap import ( "fmt" "io" - "io/ioutil" "go.uber.org/zap/zapcore" @@ -71,7 +70,7 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { for _, path := range paths { sink, err := newSink(path) if err != nil { - openErr = multierr.Append(openErr, fmt.Errorf("couldn't open sink %q: %v", path, err)) + openErr = multierr.Append(openErr, fmt.Errorf("open sink %q: %w", path, err)) continue } writers = append(writers, sink) @@ -79,7 +78,7 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { } if openErr != nil { close() - return writers, nil, openErr + return nil, nil, openErr } return writers, close, nil @@ -93,7 +92,7 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { // using zapcore.NewMultiWriteSyncer and zapcore.Lock individually. func CombineWriteSyncers(writers ...zapcore.WriteSyncer) zapcore.WriteSyncer { if len(writers) == 0 { - return zapcore.AddSync(ioutil.Discard) + return zapcore.AddSync(io.Discard) } return zapcore.Lock(zapcore.NewMultiWriteSyncer(writers...)) } diff --git a/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go b/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go index ef2f7d963..a40e93b3e 100644 --- a/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go +++ b/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go @@ -43,6 +43,37 @@ const ( // // BufferedWriteSyncer is safe for concurrent use. You don't need to use // zapcore.Lock for WriteSyncers with BufferedWriteSyncer. +// +// To set up a BufferedWriteSyncer, construct a WriteSyncer for your log +// destination (*os.File is a valid WriteSyncer), wrap it with +// BufferedWriteSyncer, and defer a Stop() call for when you no longer need the +// object. +// +// func main() { +// ws := ... // your log destination +// bws := &zapcore.BufferedWriteSyncer{WS: ws} +// defer bws.Stop() +// +// // ... +// core := zapcore.NewCore(enc, bws, lvl) +// logger := zap.New(core) +// +// // ... +// } +// +// By default, a BufferedWriteSyncer will buffer up to 256 kilobytes of logs, +// waiting at most 30 seconds between flushes. +// You can customize these parameters by setting the Size or FlushInterval +// fields. +// For example, the following buffers up to 512 kB of logs before flushing them +// to Stderr, with a maximum of one minute between each flush. +// +// ws := &BufferedWriteSyncer{ +// WS: os.Stderr, +// Size: 512 * 1024, // 512 kB +// FlushInterval: time.Minute, +// } +// defer ws.Stop() type BufferedWriteSyncer struct { // WS is the WriteSyncer around which BufferedWriteSyncer will buffer // writes. diff --git a/vendor/go.uber.org/zap/zapcore/clock.go b/vendor/go.uber.org/zap/zapcore/clock.go index d2ea95b39..422fd82a6 100644 --- a/vendor/go.uber.org/zap/zapcore/clock.go +++ b/vendor/go.uber.org/zap/zapcore/clock.go @@ -20,9 +20,7 @@ package zapcore -import ( - "time" -) +import "time" // DefaultClock is the default clock used by Zap in operations that require // time. This clock uses the system clock for all operations. diff --git a/vendor/go.uber.org/zap/zapcore/console_encoder.go b/vendor/go.uber.org/zap/zapcore/console_encoder.go index 2307af404..1aa5dc364 100644 --- a/vendor/go.uber.org/zap/zapcore/console_encoder.go +++ b/vendor/go.uber.org/zap/zapcore/console_encoder.go @@ -125,11 +125,7 @@ func (c consoleEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, line.AppendString(ent.Stack) } - if c.LineEnding != "" { - line.AppendString(c.LineEnding) - } else { - line.AppendString(DefaultLineEnding) - } + line.AppendString(c.LineEnding) return line, nil } diff --git a/vendor/go.uber.org/zap/zapcore/core.go b/vendor/go.uber.org/zap/zapcore/core.go index a1ef8b034..9dfd64051 100644 --- a/vendor/go.uber.org/zap/zapcore/core.go +++ b/vendor/go.uber.org/zap/zapcore/core.go @@ -69,6 +69,15 @@ type ioCore struct { out WriteSyncer } +var ( + _ Core = (*ioCore)(nil) + _ leveledEnabler = (*ioCore)(nil) +) + +func (c *ioCore) Level() Level { + return LevelOf(c.LevelEnabler) +} + func (c *ioCore) With(fields []Field) Core { clone := c.clone() addFields(clone.enc, fields) diff --git a/vendor/go.uber.org/zap/zapcore/encoder.go b/vendor/go.uber.org/zap/zapcore/encoder.go index 6601ca166..5769ff3e4 100644 --- a/vendor/go.uber.org/zap/zapcore/encoder.go +++ b/vendor/go.uber.org/zap/zapcore/encoder.go @@ -22,6 +22,7 @@ package zapcore import ( "encoding/json" + "io" "time" "go.uber.org/zap/buffer" @@ -187,10 +188,13 @@ func (e *TimeEncoder) UnmarshalText(text []byte) error { // UnmarshalYAML unmarshals YAML to a TimeEncoder. // If value is an object with a "layout" field, it will be unmarshaled to TimeEncoder with given layout. -// timeEncoder: -// layout: 06/01/02 03:04pm +// +// timeEncoder: +// layout: 06/01/02 03:04pm +// // If value is string, it uses UnmarshalText. -// timeEncoder: iso8601 +// +// timeEncoder: iso8601 func (e *TimeEncoder) UnmarshalYAML(unmarshal func(interface{}) error) error { var o struct { Layout string `json:"layout" yaml:"layout"` @@ -312,14 +316,15 @@ func (e *NameEncoder) UnmarshalText(text []byte) error { type EncoderConfig struct { // Set the keys used for each log entry. If any key is empty, that portion // of the entry is omitted. - MessageKey string `json:"messageKey" yaml:"messageKey"` - LevelKey string `json:"levelKey" yaml:"levelKey"` - TimeKey string `json:"timeKey" yaml:"timeKey"` - NameKey string `json:"nameKey" yaml:"nameKey"` - CallerKey string `json:"callerKey" yaml:"callerKey"` - FunctionKey string `json:"functionKey" yaml:"functionKey"` - StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"` - LineEnding string `json:"lineEnding" yaml:"lineEnding"` + MessageKey string `json:"messageKey" yaml:"messageKey"` + LevelKey string `json:"levelKey" yaml:"levelKey"` + TimeKey string `json:"timeKey" yaml:"timeKey"` + NameKey string `json:"nameKey" yaml:"nameKey"` + CallerKey string `json:"callerKey" yaml:"callerKey"` + FunctionKey string `json:"functionKey" yaml:"functionKey"` + StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"` + SkipLineEnding bool `json:"skipLineEnding" yaml:"skipLineEnding"` + LineEnding string `json:"lineEnding" yaml:"lineEnding"` // Configure the primitive representations of common complex types. For // example, some users may want all time.Times serialized as floating-point // seconds since epoch, while others may prefer ISO8601 strings. @@ -330,6 +335,9 @@ type EncoderConfig struct { // Unlike the other primitive type encoders, EncodeName is optional. The // zero value falls back to FullNameEncoder. EncodeName NameEncoder `json:"nameEncoder" yaml:"nameEncoder"` + // Configure the encoder for interface{} type objects. + // If not provided, objects are encoded using json.Encoder + NewReflectedEncoder func(io.Writer) ReflectedEncoder `json:"-" yaml:"-"` // Configures the field separator used by the console encoder. Defaults // to tab. ConsoleSeparator string `json:"consoleSeparator" yaml:"consoleSeparator"` diff --git a/vendor/go.uber.org/zap/zapcore/entry.go b/vendor/go.uber.org/zap/zapcore/entry.go index 0885505b7..ea0431eb3 100644 --- a/vendor/go.uber.org/zap/zapcore/entry.go +++ b/vendor/go.uber.org/zap/zapcore/entry.go @@ -27,10 +27,9 @@ import ( "sync" "time" + "go.uber.org/multierr" "go.uber.org/zap/internal/bufferpool" "go.uber.org/zap/internal/exit" - - "go.uber.org/multierr" ) var ( @@ -152,6 +151,27 @@ type Entry struct { Stack string } +// CheckWriteHook is a custom action that may be executed after an entry is +// written. +// +// Register one on a CheckedEntry with the After method. +// +// if ce := logger.Check(...); ce != nil { +// ce = ce.After(hook) +// ce.Write(...) +// } +// +// You can configure the hook for Fatal log statements at the logger level with +// the zap.WithFatalHook option. +type CheckWriteHook interface { + // OnWrite is invoked with the CheckedEntry that was written and a list + // of fields added with that entry. + // + // The list of fields DOES NOT include fields that were already added + // to the logger with the With method. + OnWrite(*CheckedEntry, []Field) +} + // CheckWriteAction indicates what action to take after a log entry is // processed. Actions are ordered in increasing severity. type CheckWriteAction uint8 @@ -164,21 +184,36 @@ const ( WriteThenGoexit // WriteThenPanic causes a panic after Write. WriteThenPanic - // WriteThenFatal causes a fatal os.Exit after Write. + // WriteThenFatal causes an os.Exit(1) after Write. WriteThenFatal ) +// OnWrite implements the OnWrite method to keep CheckWriteAction compatible +// with the new CheckWriteHook interface which deprecates CheckWriteAction. +func (a CheckWriteAction) OnWrite(ce *CheckedEntry, _ []Field) { + switch a { + case WriteThenGoexit: + runtime.Goexit() + case WriteThenPanic: + panic(ce.Message) + case WriteThenFatal: + exit.With(1) + } +} + +var _ CheckWriteHook = CheckWriteAction(0) + // CheckedEntry is an Entry together with a collection of Cores that have // already agreed to log it. // -// CheckedEntry references should be created by calling AddCore or Should on a +// CheckedEntry references should be created by calling AddCore or After on a // nil *CheckedEntry. References are returned to a pool after Write, and MUST // NOT be retained after calling their Write method. type CheckedEntry struct { Entry ErrorOutput WriteSyncer dirty bool // best-effort detection of pool misuse - should CheckWriteAction + after CheckWriteHook cores []Core } @@ -186,7 +221,7 @@ func (ce *CheckedEntry) reset() { ce.Entry = Entry{} ce.ErrorOutput = nil ce.dirty = false - ce.should = WriteThenNoop + ce.after = nil for i := range ce.cores { // don't keep references to cores ce.cores[i] = nil @@ -224,17 +259,11 @@ func (ce *CheckedEntry) Write(fields ...Field) { ce.ErrorOutput.Sync() } - should, msg := ce.should, ce.Message - putCheckedEntry(ce) - - switch should { - case WriteThenPanic: - panic(msg) - case WriteThenFatal: - exit.Exit() - case WriteThenGoexit: - runtime.Goexit() + hook := ce.after + if hook != nil { + hook.OnWrite(ce, fields) } + putCheckedEntry(ce) } // AddCore adds a Core that has agreed to log this CheckedEntry. It's intended to be @@ -252,11 +281,19 @@ func (ce *CheckedEntry) AddCore(ent Entry, core Core) *CheckedEntry { // Should sets this CheckedEntry's CheckWriteAction, which controls whether a // Core will panic or fatal after writing this log entry. Like AddCore, it's // safe to call on nil CheckedEntry references. +// Deprecated: Use After(ent Entry, after CheckWriteHook) instead. func (ce *CheckedEntry) Should(ent Entry, should CheckWriteAction) *CheckedEntry { + return ce.After(ent, should) +} + +// After sets this CheckEntry's CheckWriteHook, which will be called after this +// log entry has been written. It's safe to call this on nil CheckedEntry +// references. +func (ce *CheckedEntry) After(ent Entry, hook CheckWriteHook) *CheckedEntry { if ce == nil { ce = getCheckedEntry() ce.Entry = ent } - ce.should = should + ce.after = hook return ce } diff --git a/vendor/go.uber.org/zap/zapcore/error.go b/vendor/go.uber.org/zap/zapcore/error.go index 74919b0cc..06359907a 100644 --- a/vendor/go.uber.org/zap/zapcore/error.go +++ b/vendor/go.uber.org/zap/zapcore/error.go @@ -36,13 +36,13 @@ import ( // causer (from github.com/pkg/errors), a ${key}Causes field is added with an // array of objects containing the errors this error was comprised of. // -// { -// "error": err.Error(), -// "errorVerbose": fmt.Sprintf("%+v", err), -// "errorCauses": [ -// ... -// ], -// } +// { +// "error": err.Error(), +// "errorVerbose": fmt.Sprintf("%+v", err), +// "errorCauses": [ +// ... +// ], +// } func encodeError(key string, err error, enc ObjectEncoder) (retErr error) { // Try to capture panics (from nil references or otherwise) when calling // the Error() method diff --git a/vendor/go.uber.org/zap/zapcore/hook.go b/vendor/go.uber.org/zap/zapcore/hook.go index 5db4afb30..198def991 100644 --- a/vendor/go.uber.org/zap/zapcore/hook.go +++ b/vendor/go.uber.org/zap/zapcore/hook.go @@ -27,6 +27,11 @@ type hooked struct { funcs []func(Entry) error } +var ( + _ Core = (*hooked)(nil) + _ leveledEnabler = (*hooked)(nil) +) + // RegisterHooks wraps a Core and runs a collection of user-defined callback // hooks each time a message is logged. Execution of the callbacks is blocking. // @@ -40,6 +45,10 @@ func RegisterHooks(core Core, hooks ...func(Entry) error) Core { } } +func (h *hooked) Level() Level { + return LevelOf(h.Core) +} + func (h *hooked) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { // Let the wrapped Core decide whether to log this message or not. This // also gives the downstream a chance to register itself directly with the diff --git a/vendor/go.uber.org/zap/zapcore/increase_level.go b/vendor/go.uber.org/zap/zapcore/increase_level.go index 5a1749261..7a11237ae 100644 --- a/vendor/go.uber.org/zap/zapcore/increase_level.go +++ b/vendor/go.uber.org/zap/zapcore/increase_level.go @@ -27,6 +27,11 @@ type levelFilterCore struct { level LevelEnabler } +var ( + _ Core = (*levelFilterCore)(nil) + _ leveledEnabler = (*levelFilterCore)(nil) +) + // NewIncreaseLevelCore creates a core that can be used to increase the level of // an existing Core. It cannot be used to decrease the logging level, as it acts // as a filter before calling the underlying core. If level decreases the log level, @@ -45,6 +50,10 @@ func (c *levelFilterCore) Enabled(lvl Level) bool { return c.level.Enabled(lvl) } +func (c *levelFilterCore) Level() Level { + return LevelOf(c.level) +} + func (c *levelFilterCore) With(fields []Field) Core { return &levelFilterCore{c.core.With(fields), c.level} } diff --git a/vendor/go.uber.org/zap/zapcore/json_encoder.go b/vendor/go.uber.org/zap/zapcore/json_encoder.go index af220d9b4..3921c5cd3 100644 --- a/vendor/go.uber.org/zap/zapcore/json_encoder.go +++ b/vendor/go.uber.org/zap/zapcore/json_encoder.go @@ -22,7 +22,6 @@ package zapcore import ( "encoding/base64" - "encoding/json" "math" "sync" "time" @@ -64,7 +63,7 @@ type jsonEncoder struct { // for encoding generic values by reflection reflectBuf *buffer.Buffer - reflectEnc *json.Encoder + reflectEnc ReflectedEncoder } // NewJSONEncoder creates a fast, low-allocation JSON encoder. The encoder @@ -72,7 +71,9 @@ type jsonEncoder struct { // // Note that the encoder doesn't deduplicate keys, so it's possible to produce // a message like -// {"foo":"bar","foo":"baz"} +// +// {"foo":"bar","foo":"baz"} +// // This is permitted by the JSON specification, but not encouraged. Many // libraries will ignore duplicate key-value pairs (typically keeping the last // pair) when unmarshaling, but users should attempt to avoid adding duplicate @@ -82,6 +83,17 @@ func NewJSONEncoder(cfg EncoderConfig) Encoder { } func newJSONEncoder(cfg EncoderConfig, spaced bool) *jsonEncoder { + if cfg.SkipLineEnding { + cfg.LineEnding = "" + } else if cfg.LineEnding == "" { + cfg.LineEnding = DefaultLineEnding + } + + // If no EncoderConfig.NewReflectedEncoder is provided by the user, then use default + if cfg.NewReflectedEncoder == nil { + cfg.NewReflectedEncoder = defaultReflectedEncoder + } + return &jsonEncoder{ EncoderConfig: &cfg, buf: bufferpool.Get(), @@ -118,6 +130,11 @@ func (enc *jsonEncoder) AddComplex128(key string, val complex128) { enc.AppendComplex128(val) } +func (enc *jsonEncoder) AddComplex64(key string, val complex64) { + enc.addKey(key) + enc.AppendComplex64(val) +} + func (enc *jsonEncoder) AddDuration(key string, val time.Duration) { enc.addKey(key) enc.AppendDuration(val) @@ -141,10 +158,7 @@ func (enc *jsonEncoder) AddInt64(key string, val int64) { func (enc *jsonEncoder) resetReflectBuf() { if enc.reflectBuf == nil { enc.reflectBuf = bufferpool.Get() - enc.reflectEnc = json.NewEncoder(enc.reflectBuf) - - // For consistency with our custom JSON encoder. - enc.reflectEnc.SetEscapeHTML(false) + enc.reflectEnc = enc.NewReflectedEncoder(enc.reflectBuf) } else { enc.reflectBuf.Reset() } @@ -206,10 +220,16 @@ func (enc *jsonEncoder) AppendArray(arr ArrayMarshaler) error { } func (enc *jsonEncoder) AppendObject(obj ObjectMarshaler) error { + // Close ONLY new openNamespaces that are created during + // AppendObject(). + old := enc.openNamespaces + enc.openNamespaces = 0 enc.addElementSeparator() enc.buf.AppendByte('{') err := obj.MarshalLogObject(enc) enc.buf.AppendByte('}') + enc.closeOpenNamespaces() + enc.openNamespaces = old return err } @@ -225,20 +245,23 @@ func (enc *jsonEncoder) AppendByteString(val []byte) { enc.buf.AppendByte('"') } -func (enc *jsonEncoder) AppendComplex128(val complex128) { +// appendComplex appends the encoded form of the provided complex128 value. +// precision specifies the encoding precision for the real and imaginary +// components of the complex number. +func (enc *jsonEncoder) appendComplex(val complex128, precision int) { enc.addElementSeparator() // Cast to a platform-independent, fixed-size type. r, i := float64(real(val)), float64(imag(val)) enc.buf.AppendByte('"') // Because we're always in a quoted string, we can use strconv without // special-casing NaN and +/-Inf. - enc.buf.AppendFloat(r, 64) + enc.buf.AppendFloat(r, precision) // If imaginary part is less than 0, minus (-) sign is added by default // by AppendFloat. if i >= 0 { enc.buf.AppendByte('+') } - enc.buf.AppendFloat(i, 64) + enc.buf.AppendFloat(i, precision) enc.buf.AppendByte('i') enc.buf.AppendByte('"') } @@ -301,28 +324,28 @@ func (enc *jsonEncoder) AppendUint64(val uint64) { enc.buf.AppendUint(val) } -func (enc *jsonEncoder) AddComplex64(k string, v complex64) { enc.AddComplex128(k, complex128(v)) } -func (enc *jsonEncoder) AddInt(k string, v int) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddInt32(k string, v int32) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddInt16(k string, v int16) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddInt8(k string, v int8) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddUint(k string, v uint) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUint32(k string, v uint32) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUint16(k string, v uint16) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUint8(k string, v uint8) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUintptr(k string, v uintptr) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AppendComplex64(v complex64) { enc.AppendComplex128(complex128(v)) } -func (enc *jsonEncoder) AppendFloat64(v float64) { enc.appendFloat(v, 64) } -func (enc *jsonEncoder) AppendFloat32(v float32) { enc.appendFloat(float64(v), 32) } -func (enc *jsonEncoder) AppendInt(v int) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendInt32(v int32) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendInt16(v int16) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendInt8(v int8) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendUint(v uint) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUint32(v uint32) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUint16(v uint16) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUint8(v uint8) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUintptr(v uintptr) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AddInt(k string, v int) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt32(k string, v int32) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt16(k string, v int16) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt8(k string, v int8) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddUint(k string, v uint) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint32(k string, v uint32) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint16(k string, v uint16) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint8(k string, v uint8) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUintptr(k string, v uintptr) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AppendComplex64(v complex64) { enc.appendComplex(complex128(v), 32) } +func (enc *jsonEncoder) AppendComplex128(v complex128) { enc.appendComplex(complex128(v), 64) } +func (enc *jsonEncoder) AppendFloat64(v float64) { enc.appendFloat(v, 64) } +func (enc *jsonEncoder) AppendFloat32(v float32) { enc.appendFloat(float64(v), 32) } +func (enc *jsonEncoder) AppendInt(v int) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt32(v int32) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt16(v int16) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt8(v int8) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendUint(v uint) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint32(v uint32) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint16(v uint16) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint8(v uint8) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUintptr(v uintptr) { enc.AppendUint64(uint64(v)) } func (enc *jsonEncoder) Clone() Encoder { clone := enc.clone() @@ -343,7 +366,7 @@ func (enc *jsonEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, final := enc.clone() final.buf.AppendByte('{') - if final.LevelKey != "" { + if final.LevelKey != "" && final.EncodeLevel != nil { final.addKey(final.LevelKey) cur := final.buf.Len() final.EncodeLevel(ent.Level, final) @@ -404,11 +427,7 @@ func (enc *jsonEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, final.AddString(final.StacktraceKey, ent.Stack) } final.buf.AppendByte('}') - if final.LineEnding != "" { - final.buf.AppendString(final.LineEnding) - } else { - final.buf.AppendString(DefaultLineEnding) - } + final.buf.AppendString(final.LineEnding) ret := final.buf putJSONEncoder(final) @@ -423,6 +442,7 @@ func (enc *jsonEncoder) closeOpenNamespaces() { for i := 0; i < enc.openNamespaces; i++ { enc.buf.AppendByte('}') } + enc.openNamespaces = 0 } func (enc *jsonEncoder) addKey(key string) { diff --git a/vendor/go.uber.org/zap/zapcore/level.go b/vendor/go.uber.org/zap/zapcore/level.go index e575c9f43..e01a24131 100644 --- a/vendor/go.uber.org/zap/zapcore/level.go +++ b/vendor/go.uber.org/zap/zapcore/level.go @@ -53,8 +53,62 @@ const ( _minLevel = DebugLevel _maxLevel = FatalLevel + + // InvalidLevel is an invalid value for Level. + // + // Core implementations may panic if they see messages of this level. + InvalidLevel = _maxLevel + 1 ) +// ParseLevel parses a level based on the lower-case or all-caps ASCII +// representation of the log level. If the provided ASCII representation is +// invalid an error is returned. +// +// This is particularly useful when dealing with text input to configure log +// levels. +func ParseLevel(text string) (Level, error) { + var level Level + err := level.UnmarshalText([]byte(text)) + return level, err +} + +type leveledEnabler interface { + LevelEnabler + + Level() Level +} + +// LevelOf reports the minimum enabled log level for the given LevelEnabler +// from Zap's supported log levels, or [InvalidLevel] if none of them are +// enabled. +// +// A LevelEnabler may implement a 'Level() Level' method to override the +// behavior of this function. +// +// func (c *core) Level() Level { +// return c.currentLevel +// } +// +// It is recommended that [Core] implementations that wrap other cores use +// LevelOf to retrieve the level of the wrapped core. For example, +// +// func (c *coreWrapper) Level() Level { +// return zapcore.LevelOf(c.wrappedCore) +// } +func LevelOf(enab LevelEnabler) Level { + if lvler, ok := enab.(leveledEnabler); ok { + return lvler.Level() + } + + for lvl := _minLevel; lvl <= _maxLevel; lvl++ { + if enab.Enabled(lvl) { + return lvl + } + } + + return InvalidLevel +} + // String returns a lower-case ASCII representation of the log level. func (l Level) String() string { switch l { diff --git a/vendor/go.uber.org/zap/zapcore/reflected_encoder.go b/vendor/go.uber.org/zap/zapcore/reflected_encoder.go new file mode 100644 index 000000000..8746360ec --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/reflected_encoder.go @@ -0,0 +1,41 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "encoding/json" + "io" +) + +// ReflectedEncoder serializes log fields that can't be serialized with Zap's +// JSON encoder. These have the ReflectType field type. +// Use EncoderConfig.NewReflectedEncoder to set this. +type ReflectedEncoder interface { + // Encode encodes and writes to the underlying data stream. + Encode(interface{}) error +} + +func defaultReflectedEncoder(w io.Writer) ReflectedEncoder { + enc := json.NewEncoder(w) + // For consistency with our custom JSON encoder. + enc.SetEscapeHTML(false) + return enc +} diff --git a/vendor/go.uber.org/zap/zapcore/sampler.go b/vendor/go.uber.org/zap/zapcore/sampler.go index 31ed96e12..dc518055a 100644 --- a/vendor/go.uber.org/zap/zapcore/sampler.go +++ b/vendor/go.uber.org/zap/zapcore/sampler.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2016-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -113,12 +113,12 @@ func nopSamplingHook(Entry, SamplingDecision) {} // This hook may be used to get visibility into the performance of the sampler. // For example, use it to track metrics of dropped versus sampled logs. // -// var dropped atomic.Int64 -// zapcore.SamplerHook(func(ent zapcore.Entry, dec zapcore.SamplingDecision) { -// if dec&zapcore.LogDropped > 0 { -// dropped.Inc() -// } -// }) +// var dropped atomic.Int64 +// zapcore.SamplerHook(func(ent zapcore.Entry, dec zapcore.SamplingDecision) { +// if dec&zapcore.LogDropped > 0 { +// dropped.Inc() +// } +// }) func SamplerHook(hook func(entry Entry, dec SamplingDecision)) SamplerOption { return optionFunc(func(s *sampler) { s.hook = hook @@ -133,10 +133,21 @@ func SamplerHook(hook func(entry Entry, dec SamplingDecision)) SamplerOption { // each tick. If more Entries with the same level and message are seen during // the same interval, every Mth message is logged and the rest are dropped. // +// For example, +// +// core = NewSamplerWithOptions(core, time.Second, 10, 5) +// +// This will log the first 10 log entries with the same level and message +// in a one second interval as-is. Following that, it will allow through +// every 5th log entry with the same level and message in that interval. +// +// If thereafter is zero, the Core will drop all log entries after the first N +// in that interval. +// // Sampler can be configured to report sampling decisions with the SamplerHook // option. // -// Keep in mind that zap's sampling implementation is optimized for speed over +// Keep in mind that Zap's sampling implementation is optimized for speed over // absolute precision; under load, each tick may be slightly over- or // under-sampled. func NewSamplerWithOptions(core Core, tick time.Duration, first, thereafter int, opts ...SamplerOption) Core { @@ -164,6 +175,11 @@ type sampler struct { hook func(Entry, SamplingDecision) } +var ( + _ Core = (*sampler)(nil) + _ leveledEnabler = (*sampler)(nil) +) + // NewSampler creates a Core that samples incoming entries, which // caps the CPU and I/O load of logging while attempting to preserve a // representative subset of your logs. @@ -181,6 +197,10 @@ func NewSampler(core Core, tick time.Duration, first, thereafter int) Core { return NewSamplerWithOptions(core, tick, first, thereafter) } +func (s *sampler) Level() Level { + return LevelOf(s.Core) +} + func (s *sampler) With(fields []Field) Core { return &sampler{ Core: s.Core.With(fields), @@ -200,7 +220,7 @@ func (s *sampler) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { if ent.Level >= _minLevel && ent.Level <= _maxLevel { counter := s.counts.get(ent.Level, ent.Message) n := counter.IncCheckReset(ent.Time, s.tick) - if n > s.first && (n-s.first)%s.thereafter != 0 { + if n > s.first && (s.thereafter == 0 || (n-s.first)%s.thereafter != 0) { s.hook(ent, LogDropped) return ce } diff --git a/vendor/go.uber.org/zap/zapcore/tee.go b/vendor/go.uber.org/zap/zapcore/tee.go index 07a32eef9..9bb32f055 100644 --- a/vendor/go.uber.org/zap/zapcore/tee.go +++ b/vendor/go.uber.org/zap/zapcore/tee.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2016-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -24,6 +24,11 @@ import "go.uber.org/multierr" type multiCore []Core +var ( + _ leveledEnabler = multiCore(nil) + _ Core = multiCore(nil) +) + // NewTee creates a Core that duplicates log entries into two or more // underlying Cores. // @@ -48,6 +53,16 @@ func (mc multiCore) With(fields []Field) Core { return clone } +func (mc multiCore) Level() Level { + minLvl := _maxLevel // mc is never empty + for i := range mc { + if lvl := LevelOf(mc[i]); lvl < minLvl { + minLvl = lvl + } + } + return minLvl +} + func (mc multiCore) Enabled(lvl Level) bool { for i := range mc { if mc[i].Enabled(lvl) { diff --git a/vendor/golang.org/x/crypto/AUTHORS b/vendor/golang.org/x/crypto/AUTHORS deleted file mode 100644 index 2b00ddba0..000000000 --- a/vendor/golang.org/x/crypto/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at https://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/crypto/CONTRIBUTORS b/vendor/golang.org/x/crypto/CONTRIBUTORS deleted file mode 100644 index 1fbd3e976..000000000 --- a/vendor/golang.org/x/crypto/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at https://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/crypto/cryptobyte/builder.go b/vendor/golang.org/x/crypto/cryptobyte/builder.go index ca7b1db5c..2a90c592d 100644 --- a/vendor/golang.org/x/crypto/cryptobyte/builder.go +++ b/vendor/golang.org/x/crypto/cryptobyte/builder.go @@ -95,6 +95,11 @@ func (b *Builder) AddUint32(v uint32) { b.add(byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) } +// AddUint64 appends a big-endian, 64-bit value to the byte string. +func (b *Builder) AddUint64(v uint64) { + b.add(byte(v>>56), byte(v>>48), byte(v>>40), byte(v>>32), byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) +} + // AddBytes appends a sequence of bytes to the byte string. func (b *Builder) AddBytes(v []byte) { b.add(v...) @@ -106,13 +111,13 @@ func (b *Builder) AddBytes(v []byte) { // supplied to them. The child builder passed to the continuation can be used // to build the content of the length-prefixed sequence. For example: // -// parent := cryptobyte.NewBuilder() -// parent.AddUint8LengthPrefixed(func (child *Builder) { -// child.AddUint8(42) -// child.AddUint8LengthPrefixed(func (grandchild *Builder) { -// grandchild.AddUint8(5) -// }) -// }) +// parent := cryptobyte.NewBuilder() +// parent.AddUint8LengthPrefixed(func (child *Builder) { +// child.AddUint8(42) +// child.AddUint8LengthPrefixed(func (grandchild *Builder) { +// grandchild.AddUint8(5) +// }) +// }) // // It is an error to write more bytes to the child than allowed by the reserved // length prefix. After the continuation returns, the child must be considered diff --git a/vendor/golang.org/x/crypto/cryptobyte/string.go b/vendor/golang.org/x/crypto/cryptobyte/string.go index 589d297e6..0531a3d6f 100644 --- a/vendor/golang.org/x/crypto/cryptobyte/string.go +++ b/vendor/golang.org/x/crypto/cryptobyte/string.go @@ -81,6 +81,17 @@ func (s *String) ReadUint32(out *uint32) bool { return true } +// ReadUint64 decodes a big-endian, 64-bit value into out and advances over it. +// It reports whether the read was successful. +func (s *String) ReadUint64(out *uint64) bool { + v := s.read(8) + if v == nil { + return false + } + *out = uint64(v[0])<<56 | uint64(v[1])<<48 | uint64(v[2])<<40 | uint64(v[3])<<32 | uint64(v[4])<<24 | uint64(v[5])<<16 | uint64(v[6])<<8 | uint64(v[7]) + return true +} + func (s *String) readUnsigned(out *uint32, length int) bool { v := s.read(length) if v == nil { diff --git a/vendor/golang.org/x/crypto/openpgp/armor/armor.go b/vendor/golang.org/x/crypto/openpgp/armor/armor.go index ebc87876e..be342ad47 100644 --- a/vendor/golang.org/x/crypto/openpgp/armor/armor.go +++ b/vendor/golang.org/x/crypto/openpgp/armor/armor.go @@ -23,12 +23,14 @@ import ( // A Block represents an OpenPGP armored structure. // // The encoded form is: -// -----BEGIN Type----- -// Headers // -// base64-encoded Bytes -// '=' base64 encoded checksum -// -----END Type----- +// -----BEGIN Type----- +// Headers +// +// base64-encoded Bytes +// '=' base64 encoded checksum +// -----END Type----- +// // where Headers is a possibly empty sequence of Key: Value lines. // // Since the armored data can be very large, this package presents a streaming diff --git a/vendor/golang.org/x/crypto/openpgp/armor/encode.go b/vendor/golang.org/x/crypto/openpgp/armor/encode.go index 6f07582c3..5b6e16c19 100644 --- a/vendor/golang.org/x/crypto/openpgp/armor/encode.go +++ b/vendor/golang.org/x/crypto/openpgp/armor/encode.go @@ -96,7 +96,8 @@ func (l *lineBreaker) Close() (err error) { // trailer. // // It's built into a stack of io.Writers: -// encoding -> base64 encoder -> lineBreaker -> out +// +// encoding -> base64 encoder -> lineBreaker -> out type encoding struct { out io.Writer breaker *lineBreaker diff --git a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go b/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go index 84396a089..743b35a12 100644 --- a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go +++ b/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go @@ -77,8 +77,8 @@ func Encrypt(random io.Reader, pub *PublicKey, msg []byte) (c1, c2 *big.Int, err // returns the plaintext of the message. An error can result only if the // ciphertext is invalid. Users should keep in mind that this is a padding // oracle and thus, if exposed to an adaptive chosen ciphertext attack, can -// be used to break the cryptosystem. See ``Chosen Ciphertext Attacks -// Against Protocols Based on the RSA Encryption Standard PKCS #1'', Daniel +// be used to break the cryptosystem. See “Chosen Ciphertext Attacks +// Against Protocols Based on the RSA Encryption Standard PKCS #1”, Daniel // Bleichenbacher, Advances in Cryptology (Crypto '98), func Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) { s := new(big.Int).Exp(c1, priv.X, priv.P) diff --git a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go index 593f65300..904b57e01 100644 --- a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go +++ b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go @@ -32,7 +32,7 @@ import ( // can get a derived key for e.g. AES-256 (which needs a 32-byte key) by // doing: // -// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New) +// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New) // // Remember to get a good random salt. At least 8 bytes is recommended by the // RFC. diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt.go b/vendor/golang.org/x/crypto/scrypt/scrypt.go index bbe4494c6..c971a99fa 100644 --- a/vendor/golang.org/x/crypto/scrypt/scrypt.go +++ b/vendor/golang.org/x/crypto/scrypt/scrypt.go @@ -186,7 +186,7 @@ func smix(b []byte, r, N int, v, xy []uint32) { // For example, you can get a derived key for e.g. AES-256 (which needs a // 32-byte key) by doing: // -// dk, err := scrypt.Key([]byte("some password"), salt, 32768, 8, 1, 32) +// dk, err := scrypt.Key([]byte("some password"), salt, 32768, 8, 1, 32) // // The recommended parameters for interactive logins as of 2017 are N=32768, r=8 // and p=1. The parameters N, r, and p should be increased as memory latency and diff --git a/vendor/golang.org/x/net/AUTHORS b/vendor/golang.org/x/net/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/net/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/net/CONTRIBUTORS b/vendor/golang.org/x/net/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/net/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/net/html/render.go b/vendor/golang.org/x/net/html/render.go index b46d81ca6..497e13204 100644 --- a/vendor/golang.org/x/net/html/render.go +++ b/vendor/golang.org/x/net/html/render.go @@ -85,7 +85,7 @@ func render1(w writer, n *Node) error { if _, err := w.WriteString(""); err != nil { @@ -96,7 +96,7 @@ func render1(w writer, n *Node) error { if _, err := w.WriteString("" case CommentToken: - return "" + return "" case DoctypeToken: - return "" + return "" } return "Invalid(" + strconv.Itoa(int(t.Type)) + ")" } diff --git a/vendor/golang.org/x/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go index c936843ea..780968d6c 100644 --- a/vendor/golang.org/x/net/http2/client_conn_pool.go +++ b/vendor/golang.org/x/net/http2/client_conn_pool.go @@ -139,7 +139,6 @@ func (p *clientConnPool) getStartDialLocked(ctx context.Context, addr string) *d func (c *dialCall) dial(ctx context.Context, addr string) { const singleUse = false // shared conn c.res, c.err = c.p.t.dialClientConn(ctx, addr, singleUse) - close(c.done) c.p.mu.Lock() delete(c.p.dialing, addr) @@ -147,6 +146,8 @@ func (c *dialCall) dial(ctx context.Context, addr string) { c.p.addConnLocked(addr, c.res) } c.p.mu.Unlock() + + close(c.done) } // addConnIfNeeded makes a NewClientConn out of c if a connection for key doesn't diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go index 0178647ee..184ac45fe 100644 --- a/vendor/golang.org/x/net/http2/frame.go +++ b/vendor/golang.org/x/net/http2/frame.go @@ -23,7 +23,7 @@ const frameHeaderLen = 9 var padZeros = make([]byte, 255) // zeros for padding // A FrameType is a registered frame type as defined in -// http://http2.github.io/http2-spec/#rfc.section.11.2 +// https://httpwg.org/specs/rfc7540.html#rfc.section.11.2 type FrameType uint8 const ( @@ -146,7 +146,7 @@ func typeFrameParser(t FrameType) frameParser { // A FrameHeader is the 9 byte header of all HTTP/2 frames. // -// See http://http2.github.io/http2-spec/#FrameHeader +// See https://httpwg.org/specs/rfc7540.html#FrameHeader type FrameHeader struct { valid bool // caller can access []byte fields in the Frame @@ -575,7 +575,7 @@ func (fr *Framer) checkFrameOrder(f Frame) error { // A DataFrame conveys arbitrary, variable-length sequences of octets // associated with a stream. -// See http://http2.github.io/http2-spec/#rfc.section.6.1 +// See https://httpwg.org/specs/rfc7540.html#rfc.section.6.1 type DataFrame struct { FrameHeader data []byte @@ -698,7 +698,7 @@ func (f *Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []by // endpoints communicate, such as preferences and constraints on peer // behavior. // -// See http://http2.github.io/http2-spec/#SETTINGS +// See https://httpwg.org/specs/rfc7540.html#SETTINGS type SettingsFrame struct { FrameHeader p []byte @@ -837,7 +837,7 @@ func (f *Framer) WriteSettingsAck() error { // A PingFrame is a mechanism for measuring a minimal round trip time // from the sender, as well as determining whether an idle connection // is still functional. -// See http://http2.github.io/http2-spec/#rfc.section.6.7 +// See https://httpwg.org/specs/rfc7540.html#rfc.section.6.7 type PingFrame struct { FrameHeader Data [8]byte @@ -870,7 +870,7 @@ func (f *Framer) WritePing(ack bool, data [8]byte) error { } // A GoAwayFrame informs the remote peer to stop creating streams on this connection. -// See http://http2.github.io/http2-spec/#rfc.section.6.8 +// See https://httpwg.org/specs/rfc7540.html#rfc.section.6.8 type GoAwayFrame struct { FrameHeader LastStreamID uint32 @@ -934,7 +934,7 @@ func parseUnknownFrame(_ *frameCache, fh FrameHeader, countError func(string), p } // A WindowUpdateFrame is used to implement flow control. -// See http://http2.github.io/http2-spec/#rfc.section.6.9 +// See https://httpwg.org/specs/rfc7540.html#rfc.section.6.9 type WindowUpdateFrame struct { FrameHeader Increment uint32 // never read with high bit set @@ -1123,7 +1123,7 @@ func (f *Framer) WriteHeaders(p HeadersFrameParam) error { } // A PriorityFrame specifies the sender-advised priority of a stream. -// See http://http2.github.io/http2-spec/#rfc.section.6.3 +// See https://httpwg.org/specs/rfc7540.html#rfc.section.6.3 type PriorityFrame struct { FrameHeader PriorityParam @@ -1193,7 +1193,7 @@ func (f *Framer) WritePriority(streamID uint32, p PriorityParam) error { } // A RSTStreamFrame allows for abnormal termination of a stream. -// See http://http2.github.io/http2-spec/#rfc.section.6.4 +// See https://httpwg.org/specs/rfc7540.html#rfc.section.6.4 type RSTStreamFrame struct { FrameHeader ErrCode ErrCode @@ -1225,7 +1225,7 @@ func (f *Framer) WriteRSTStream(streamID uint32, code ErrCode) error { } // A ContinuationFrame is used to continue a sequence of header block fragments. -// See http://http2.github.io/http2-spec/#rfc.section.6.10 +// See https://httpwg.org/specs/rfc7540.html#rfc.section.6.10 type ContinuationFrame struct { FrameHeader headerFragBuf []byte @@ -1266,7 +1266,7 @@ func (f *Framer) WriteContinuation(streamID uint32, endHeaders bool, headerBlock } // A PushPromiseFrame is used to initiate a server stream. -// See http://http2.github.io/http2-spec/#rfc.section.6.6 +// See https://httpwg.org/specs/rfc7540.html#rfc.section.6.6 type PushPromiseFrame struct { FrameHeader PromiseID uint32 diff --git a/vendor/golang.org/x/net/http2/hpack/encode.go b/vendor/golang.org/x/net/http2/hpack/encode.go index 97f17831f..6886dc163 100644 --- a/vendor/golang.org/x/net/http2/hpack/encode.go +++ b/vendor/golang.org/x/net/http2/hpack/encode.go @@ -191,7 +191,7 @@ func appendTableSize(dst []byte, v uint32) []byte { // bit prefix, to dst and returns the extended buffer. // // See -// http://http2.github.io/http2-spec/compression.html#integer.representation +// https://httpwg.org/specs/rfc7541.html#integer.representation func appendVarInt(dst []byte, n byte, i uint64) []byte { k := uint64((1 << n) - 1) if i < k { diff --git a/vendor/golang.org/x/net/http2/hpack/hpack.go b/vendor/golang.org/x/net/http2/hpack/hpack.go index 85f18a2b0..ebdfbee96 100644 --- a/vendor/golang.org/x/net/http2/hpack/hpack.go +++ b/vendor/golang.org/x/net/http2/hpack/hpack.go @@ -59,7 +59,7 @@ func (hf HeaderField) String() string { // Size returns the size of an entry per RFC 7541 section 4.1. func (hf HeaderField) Size() uint32 { - // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1 + // https://httpwg.org/specs/rfc7541.html#rfc.section.4.1 // "The size of the dynamic table is the sum of the size of // its entries. The size of an entry is the sum of its name's // length in octets (as defined in Section 5.2), its value's @@ -158,7 +158,7 @@ func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) { } type dynamicTable struct { - // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2 + // https://httpwg.org/specs/rfc7541.html#rfc.section.2.3.2 table headerFieldTable size uint32 // in bytes maxSize uint32 // current maxSize @@ -307,27 +307,27 @@ func (d *Decoder) parseHeaderFieldRepr() error { case b&128 != 0: // Indexed representation. // High bit set? - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.1 + // https://httpwg.org/specs/rfc7541.html#rfc.section.6.1 return d.parseFieldIndexed() case b&192 == 64: // 6.2.1 Literal Header Field with Incremental Indexing // 0b10xxxxxx: top two bits are 10 - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.1 + // https://httpwg.org/specs/rfc7541.html#rfc.section.6.2.1 return d.parseFieldLiteral(6, indexedTrue) case b&240 == 0: // 6.2.2 Literal Header Field without Indexing // 0b0000xxxx: top four bits are 0000 - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.2 + // https://httpwg.org/specs/rfc7541.html#rfc.section.6.2.2 return d.parseFieldLiteral(4, indexedFalse) case b&240 == 16: // 6.2.3 Literal Header Field never Indexed // 0b0001xxxx: top four bits are 0001 - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.3 + // https://httpwg.org/specs/rfc7541.html#rfc.section.6.2.3 return d.parseFieldLiteral(4, indexedNever) case b&224 == 32: // 6.3 Dynamic Table Size Update // Top three bits are '001'. - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.3 + // https://httpwg.org/specs/rfc7541.html#rfc.section.6.3 return d.parseDynamicTableSizeUpdate() } @@ -420,7 +420,7 @@ var errVarintOverflow = DecodingError{errors.New("varint integer overflow")} // readVarInt reads an unsigned variable length integer off the // beginning of p. n is the parameter as described in -// http://http2.github.io/http2-spec/compression.html#rfc.section.5.1. +// https://httpwg.org/specs/rfc7541.html#rfc.section.5.1. // // n must always be between 1 and 8. // diff --git a/vendor/golang.org/x/net/http2/hpack/huffman.go b/vendor/golang.org/x/net/http2/hpack/huffman.go index fe0b84ccd..20d083a71 100644 --- a/vendor/golang.org/x/net/http2/hpack/huffman.go +++ b/vendor/golang.org/x/net/http2/hpack/huffman.go @@ -169,25 +169,50 @@ func buildRootHuffmanNode() { // AppendHuffmanString appends s, as encoded in Huffman codes, to dst // and returns the extended buffer. func AppendHuffmanString(dst []byte, s string) []byte { - rembits := uint8(8) - + // This relies on the maximum huffman code length being 30 (See tables.go huffmanCodeLen array) + // So if a uint64 buffer has less than 32 valid bits can always accommodate another huffmanCode. + var ( + x uint64 // buffer + n uint // number valid of bits present in x + ) for i := 0; i < len(s); i++ { - if rembits == 8 { - dst = append(dst, 0) + c := s[i] + n += uint(huffmanCodeLen[c]) + x <<= huffmanCodeLen[c] % 64 + x |= uint64(huffmanCodes[c]) + if n >= 32 { + n %= 32 // Normally would be -= 32 but %= 32 informs compiler 0 <= n <= 31 for upcoming shift + y := uint32(x >> n) // Compiler doesn't combine memory writes if y isn't uint32 + dst = append(dst, byte(y>>24), byte(y>>16), byte(y>>8), byte(y)) } - dst, rembits = appendByteToHuffmanCode(dst, rembits, s[i]) } - - if rembits < 8 { - // special EOS symbol - code := uint32(0x3fffffff) - nbits := uint8(30) - - t := uint8(code >> (nbits - rembits)) - dst[len(dst)-1] |= t + // Add padding bits if necessary + if over := n % 8; over > 0 { + const ( + eosCode = 0x3fffffff + eosNBits = 30 + eosPadByte = eosCode >> (eosNBits - 8) + ) + pad := 8 - over + x = (x << pad) | (eosPadByte >> over) + n += pad // 8 now divides into n exactly } - - return dst + // n in (0, 8, 16, 24, 32) + switch n / 8 { + case 0: + return dst + case 1: + return append(dst, byte(x)) + case 2: + y := uint16(x) + return append(dst, byte(y>>8), byte(y)) + case 3: + y := uint16(x >> 8) + return append(dst, byte(y>>8), byte(y), byte(x)) + } + // case 4: + y := uint32(x) + return append(dst, byte(y>>24), byte(y>>16), byte(y>>8), byte(y)) } // HuffmanEncodeLength returns the number of bytes required to encode @@ -199,35 +224,3 @@ func HuffmanEncodeLength(s string) uint64 { } return (n + 7) / 8 } - -// appendByteToHuffmanCode appends Huffman code for c to dst and -// returns the extended buffer and the remaining bits in the last -// element. The appending is not byte aligned and the remaining bits -// in the last element of dst is given in rembits. -func appendByteToHuffmanCode(dst []byte, rembits uint8, c byte) ([]byte, uint8) { - code := huffmanCodes[c] - nbits := huffmanCodeLen[c] - - for { - if rembits > nbits { - t := uint8(code << (rembits - nbits)) - dst[len(dst)-1] |= t - rembits -= nbits - break - } - - t := uint8(code >> (nbits - rembits)) - dst[len(dst)-1] |= t - - nbits -= rembits - rembits = 8 - - if nbits == 0 { - break - } - - dst = append(dst, 0) - } - - return dst, rembits -} diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go index 479ba4b2b..6f2df2818 100644 --- a/vendor/golang.org/x/net/http2/http2.go +++ b/vendor/golang.org/x/net/http2/http2.go @@ -55,14 +55,14 @@ const ( ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" // SETTINGS_MAX_FRAME_SIZE default - // http://http2.github.io/http2-spec/#rfc.section.6.5.2 + // https://httpwg.org/specs/rfc7540.html#rfc.section.6.5.2 initialMaxFrameSize = 16384 // NextProtoTLS is the NPN/ALPN protocol negotiated during // HTTP/2's TLS setup. NextProtoTLS = "h2" - // http://http2.github.io/http2-spec/#SettingValues + // https://httpwg.org/specs/rfc7540.html#SettingValues initialHeaderTableSize = 4096 initialWindowSize = 65535 // 6.9.2 Initial Flow Control Window Size @@ -111,7 +111,7 @@ func (st streamState) String() string { // Setting is a setting parameter: which setting it is, and its value. type Setting struct { // ID is which setting is being set. - // See http://http2.github.io/http2-spec/#SettingValues + // See https://httpwg.org/specs/rfc7540.html#SettingFormat ID SettingID // Val is the value. @@ -143,7 +143,7 @@ func (s Setting) Valid() error { } // A SettingID is an HTTP/2 setting as defined in -// http://http2.github.io/http2-spec/#iana-settings +// https://httpwg.org/specs/rfc7540.html#iana-settings type SettingID uint16 const ( diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 4bb0d66e3..aa3b0864e 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -315,6 +315,20 @@ type ServeConnOpts struct { // requests. If nil, BaseConfig.Handler is used. If BaseConfig // or BaseConfig.Handler is nil, http.DefaultServeMux is used. Handler http.Handler + + // UpgradeRequest is an initial request received on a connection + // undergoing an h2c upgrade. The request body must have been + // completely read from the connection before calling ServeConn, + // and the 101 Switching Protocols response written. + UpgradeRequest *http.Request + + // Settings is the decoded contents of the HTTP2-Settings header + // in an h2c upgrade request. + Settings []byte + + // SawClientPreface is set if the HTTP/2 connection preface + // has already been read from the connection. + SawClientPreface bool } func (o *ServeConnOpts) context() context.Context { @@ -383,6 +397,7 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { headerTableSize: initialHeaderTableSize, serveG: newGoroutineLock(), pushEnabled: true, + sawClientPreface: opts.SawClientPreface, } s.state.registerConn(sc) @@ -465,9 +480,27 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { } } + if opts.Settings != nil { + fr := &SettingsFrame{ + FrameHeader: FrameHeader{valid: true}, + p: opts.Settings, + } + if err := fr.ForeachSetting(sc.processSetting); err != nil { + sc.rejectConn(ErrCodeProtocol, "invalid settings") + return + } + opts.Settings = nil + } + if hook := testHookGetServerConn; hook != nil { hook(sc) } + + if opts.UpgradeRequest != nil { + sc.upgradeRequest(opts.UpgradeRequest) + opts.UpgradeRequest = nil + } + sc.serve() } @@ -512,6 +545,7 @@ type serverConn struct { // Everything following is owned by the serve loop; use serveG.check(): serveG goroutineLock // used to verify funcs are on serve() pushEnabled bool + sawClientPreface bool // preface has already been read, used in h2c upgrade sawFirstSettings bool // got the initial SETTINGS frame after the preface needToSendSettingsAck bool unackedSettings int // how many SETTINGS have we sent without ACKs? @@ -974,6 +1008,9 @@ var errPrefaceTimeout = errors.New("timeout waiting for client preface") // returns errPrefaceTimeout on timeout, or an error if the greeting // is invalid. func (sc *serverConn) readPreface() error { + if sc.sawClientPreface { + return nil + } errc := make(chan error, 1) go func() { // Read the client preface @@ -1710,6 +1747,12 @@ func (sc *serverConn) processData(f *DataFrame) error { // Sender sending more than they'd declared? if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes { + if sc.inflow.available() < int32(f.Length) { + return sc.countError("data_flow", streamError(id, ErrCodeFlowControl)) + } + sc.inflow.take(int32(f.Length)) + sc.sendWindowUpdate(nil, int(f.Length)) // conn-level + st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes)) // RFC 7540, sec 8.1.2.6: A request or response is also malformed if the // value of a content-length header field does not equal the sum of the @@ -1915,6 +1958,26 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { return nil } +func (sc *serverConn) upgradeRequest(req *http.Request) { + sc.serveG.check() + id := uint32(1) + sc.maxClientStreamID = id + st := sc.newStream(id, 0, stateHalfClosedRemote) + st.reqTrailer = req.Trailer + if st.reqTrailer != nil { + st.trailer = make(http.Header) + } + rw := sc.newResponseWriter(st, req) + + // Disable any read deadline set by the net/http package + // prior to the upgrade. + if sc.hs.ReadTimeout != 0 { + sc.conn.SetReadDeadline(time.Time{}) + } + + go sc.runHandler(rw, req, sc.handler.ServeHTTP) +} + func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error { sc := st.sc sc.serveG.check() @@ -2145,6 +2208,11 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r } req = req.WithContext(st.ctx) + rw := sc.newResponseWriter(st, req) + return rw, req, nil +} + +func (sc *serverConn) newResponseWriter(st *stream, req *http.Request) *responseWriter { rws := responseWriterStatePool.Get().(*responseWriterState) bwSave := rws.bw *rws = responseWriterState{} // zero all the fields @@ -2153,10 +2221,7 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r rws.bw.Reset(chunkWriter{rws}) rws.stream = st rws.req = req - rws.body = body - - rw := &responseWriter{rws: rws} - return rw, req, nil + return &responseWriter{rws: rws} } // Run on its own goroutine. @@ -2164,6 +2229,9 @@ func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler didPanic := true defer func() { rw.rws.stream.cancelCtx() + if req.MultipartForm != nil { + req.MultipartForm.RemoveAll() + } if didPanic { e := recover() sc.writeFrameFromHandler(FrameWriteRequest{ @@ -2371,7 +2439,6 @@ type responseWriterState struct { // immutable within a request: stream *stream req *http.Request - body *requestBody // to close at end of request, if DATA frames didn't conn *serverConn // TODO: adjust buffer writing sizes based on server config, frame size updates from peer, etc @@ -2645,8 +2712,7 @@ func checkWriteHeaderCode(code int) { // Issue 22880: require valid WriteHeader status codes. // For now we only enforce that it's three digits. // In the future we might block things over 599 (600 and above aren't defined - // at http://httpwg.org/specs/rfc7231.html#status.codes) - // and we might block under 200 (once we have more mature 1xx support). + // at http://httpwg.org/specs/rfc7231.html#status.codes). // But for now any three digits. // // We used to send "HTTP/1.1 000 0" on the wire in responses but there's @@ -2667,13 +2733,41 @@ func (w *responseWriter) WriteHeader(code int) { } func (rws *responseWriterState) writeHeader(code int) { - if !rws.wroteHeader { - checkWriteHeaderCode(code) - rws.wroteHeader = true - rws.status = code - if len(rws.handlerHeader) > 0 { - rws.snapHeader = cloneHeader(rws.handlerHeader) + if rws.wroteHeader { + return + } + + checkWriteHeaderCode(code) + + // Handle informational headers + if code >= 100 && code <= 199 { + // Per RFC 8297 we must not clear the current header map + h := rws.handlerHeader + + _, cl := h["Content-Length"] + _, te := h["Transfer-Encoding"] + if cl || te { + h = h.Clone() + h.Del("Content-Length") + h.Del("Transfer-Encoding") + } + + if rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + httpResCode: code, + h: h, + endStream: rws.handlerDone && !rws.hasTrailers(), + }) != nil { + rws.dirty = true } + + return + } + + rws.wroteHeader = true + rws.status = code + if len(rws.handlerHeader) > 0 { + rws.snapHeader = cloneHeader(rws.handlerHeader) } } diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 4ded4dfd5..90fdc28cf 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -67,13 +67,23 @@ const ( // A Transport internally caches connections to servers. It is safe // for concurrent use by multiple goroutines. type Transport struct { - // DialTLS specifies an optional dial function for creating - // TLS connections for requests. + // DialTLSContext specifies an optional dial function with context for + // creating TLS connections for requests. // - // If DialTLS is nil, tls.Dial is used. + // If DialTLSContext and DialTLS is nil, tls.Dial is used. // // If the returned net.Conn has a ConnectionState method like tls.Conn, // it will be used to set http.Response.TLS. + DialTLSContext func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) + + // DialTLS specifies an optional dial function for creating + // TLS connections for requests. + // + // If DialTLSContext and DialTLS is nil, tls.Dial is used. + // + // Deprecated: Use DialTLSContext instead, which allows the transport + // to cancel dials as soon as they are no longer needed. + // If both are set, DialTLSContext takes priority. DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error) // TLSClientConfig specifies the TLS configuration to use with @@ -592,7 +602,7 @@ func (t *Transport) dialClientConn(ctx context.Context, addr string, singleUse b if err != nil { return nil, err } - tconn, err := t.dialTLS(ctx)("tcp", addr, t.newTLSConfig(host)) + tconn, err := t.dialTLS(ctx, "tcp", addr, t.newTLSConfig(host)) if err != nil { return nil, err } @@ -613,24 +623,25 @@ func (t *Transport) newTLSConfig(host string) *tls.Config { return cfg } -func (t *Transport) dialTLS(ctx context.Context) func(string, string, *tls.Config) (net.Conn, error) { - if t.DialTLS != nil { - return t.DialTLS +func (t *Transport) dialTLS(ctx context.Context, network, addr string, tlsCfg *tls.Config) (net.Conn, error) { + if t.DialTLSContext != nil { + return t.DialTLSContext(ctx, network, addr, tlsCfg) + } else if t.DialTLS != nil { + return t.DialTLS(network, addr, tlsCfg) } - return func(network, addr string, cfg *tls.Config) (net.Conn, error) { - tlsCn, err := t.dialTLSWithContext(ctx, network, addr, cfg) - if err != nil { - return nil, err - } - state := tlsCn.ConnectionState() - if p := state.NegotiatedProtocol; p != NextProtoTLS { - return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS) - } - if !state.NegotiatedProtocolIsMutual { - return nil, errors.New("http2: could not negotiate protocol mutually") - } - return tlsCn, nil + + tlsCn, err := t.dialTLSWithContext(ctx, network, addr, tlsCfg) + if err != nil { + return nil, err + } + state := tlsCn.ConnectionState() + if p := state.NegotiatedProtocol; p != NextProtoTLS { + return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS) + } + if !state.NegotiatedProtocolIsMutual { + return nil, errors.New("http2: could not negotiate protocol mutually") } + return tlsCn, nil } // disableKeepAlives reports whether connections should be closed as diff --git a/vendor/golang.org/x/net/http2/writesched_priority.go b/vendor/golang.org/x/net/http2/writesched_priority.go index 2618b2c11..0a242c669 100644 --- a/vendor/golang.org/x/net/http2/writesched_priority.go +++ b/vendor/golang.org/x/net/http2/writesched_priority.go @@ -383,16 +383,15 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { var n *priorityNode - if id := wr.StreamID(); id == 0 { + if wr.isControl() { n = &ws.root } else { + id := wr.StreamID() n = ws.nodes[id] if n == nil { // id is an idle or closed stream. wr should not be a HEADERS or - // DATA frame. However, wr can be a RST_STREAM. In this case, we - // push wr onto the root, rather than creating a new priorityNode, - // since RST_STREAM is tiny and the stream's priority is unknown - // anyway. See issue #17919. + // DATA frame. In other case, we push wr onto the root, rather + // than creating a new priorityNode. if wr.DataSize() > 0 { panic("add DATA on non-open stream") } diff --git a/vendor/golang.org/x/oauth2/AUTHORS b/vendor/golang.org/x/oauth2/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/oauth2/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/oauth2/CONTRIBUTORS b/vendor/golang.org/x/oauth2/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/oauth2/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/oauth2/authhandler/authhandler.go b/vendor/golang.org/x/oauth2/authhandler/authhandler.go index 69967cf87..9bc6cd7bc 100644 --- a/vendor/golang.org/x/oauth2/authhandler/authhandler.go +++ b/vendor/golang.org/x/oauth2/authhandler/authhandler.go @@ -13,11 +13,36 @@ import ( "golang.org/x/oauth2" ) +const ( + // Parameter keys for AuthCodeURL method to support PKCE. + codeChallengeKey = "code_challenge" + codeChallengeMethodKey = "code_challenge_method" + + // Parameter key for Exchange method to support PKCE. + codeVerifierKey = "code_verifier" +) + +// PKCEParams holds parameters to support PKCE. +type PKCEParams struct { + Challenge string // The unpadded, base64-url-encoded string of the encrypted code verifier. + ChallengeMethod string // The encryption method (ex. S256). + Verifier string // The original, non-encrypted secret. +} + // AuthorizationHandler is a 3-legged-OAuth helper that prompts // the user for OAuth consent at the specified auth code URL // and returns an auth code and state upon approval. type AuthorizationHandler func(authCodeURL string) (code string, state string, err error) +// TokenSourceWithPKCE is an enhanced version of TokenSource with PKCE support. +// +// The pkce parameter supports PKCE flow, which uses code challenge and code verifier +// to prevent CSRF attacks. A unique code challenge and code verifier should be generated +// by the caller at runtime. See https://www.oauth.com/oauth2-servers/pkce/ for more info. +func TokenSourceWithPKCE(ctx context.Context, config *oauth2.Config, state string, authHandler AuthorizationHandler, pkce *PKCEParams) oauth2.TokenSource { + return oauth2.ReuseTokenSource(nil, authHandlerSource{config: config, ctx: ctx, authHandler: authHandler, state: state, pkce: pkce}) +} + // TokenSource returns an oauth2.TokenSource that fetches access tokens // using 3-legged-OAuth flow. // @@ -33,7 +58,7 @@ type AuthorizationHandler func(authCodeURL string) (code string, state string, e // and response before exchanging the auth code for OAuth token to prevent CSRF // attacks. func TokenSource(ctx context.Context, config *oauth2.Config, state string, authHandler AuthorizationHandler) oauth2.TokenSource { - return oauth2.ReuseTokenSource(nil, authHandlerSource{config: config, ctx: ctx, authHandler: authHandler, state: state}) + return TokenSourceWithPKCE(ctx, config, state, authHandler, nil) } type authHandlerSource struct { @@ -41,10 +66,17 @@ type authHandlerSource struct { config *oauth2.Config authHandler AuthorizationHandler state string + pkce *PKCEParams } func (source authHandlerSource) Token() (*oauth2.Token, error) { - url := source.config.AuthCodeURL(source.state) + // Step 1: Obtain auth code. + var authCodeUrlOptions []oauth2.AuthCodeOption + if source.pkce != nil && source.pkce.Challenge != "" && source.pkce.ChallengeMethod != "" { + authCodeUrlOptions = []oauth2.AuthCodeOption{oauth2.SetAuthURLParam(codeChallengeKey, source.pkce.Challenge), + oauth2.SetAuthURLParam(codeChallengeMethodKey, source.pkce.ChallengeMethod)} + } + url := source.config.AuthCodeURL(source.state, authCodeUrlOptions...) code, state, err := source.authHandler(url) if err != nil { return nil, err @@ -52,5 +84,11 @@ func (source authHandlerSource) Token() (*oauth2.Token, error) { if state != source.state { return nil, errors.New("state mismatch in 3-legged-OAuth flow") } - return source.config.Exchange(source.ctx, code) + + // Step 2: Exchange auth code for access token. + var exchangeOptions []oauth2.AuthCodeOption + if source.pkce != nil && source.pkce.Verifier != "" { + exchangeOptions = []oauth2.AuthCodeOption{oauth2.SetAuthURLParam(codeVerifierKey, source.pkce.Verifier)} + } + return source.config.Exchange(source.ctx, code, exchangeOptions...) } diff --git a/vendor/golang.org/x/oauth2/google/default.go b/vendor/golang.org/x/oauth2/google/default.go index 880dd7b59..7ed02cd41 100644 --- a/vendor/golang.org/x/oauth2/google/default.go +++ b/vendor/golang.org/x/oauth2/google/default.go @@ -54,11 +54,14 @@ type CredentialsParams struct { // Optional. Subject string - // AuthHandler is the AuthorizationHandler used for 3-legged OAuth flow. Optional. + // AuthHandler is the AuthorizationHandler used for 3-legged OAuth flow. Required for 3LO flow. AuthHandler authhandler.AuthorizationHandler - // State is a unique string used with AuthHandler. Optional. + // State is a unique string used with AuthHandler. Required for 3LO flow. State string + + // PKCE is used to support PKCE flow. Optional for 3LO flow. + PKCE *authhandler.PKCEParams } func (params CredentialsParams) deepCopy() CredentialsParams { @@ -94,20 +97,20 @@ func DefaultTokenSource(ctx context.Context, scope ...string) (oauth2.TokenSourc // It looks for credentials in the following places, // preferring the first location found: // -// 1. A JSON file whose path is specified by the -// GOOGLE_APPLICATION_CREDENTIALS environment variable. -// For workload identity federation, refer to -// https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation on -// how to generate the JSON configuration file for on-prem/non-Google cloud -// platforms. -// 2. A JSON file in a location known to the gcloud command-line tool. -// On Windows, this is %APPDATA%/gcloud/application_default_credentials.json. -// On other systems, $HOME/.config/gcloud/application_default_credentials.json. -// 3. On Google App Engine standard first generation runtimes (<= Go 1.9) it uses -// the appengine.AccessToken function. -// 4. On Google Compute Engine, Google App Engine standard second generation runtimes -// (>= Go 1.11), and Google App Engine flexible environment, it fetches -// credentials from the metadata server. +// 1. A JSON file whose path is specified by the +// GOOGLE_APPLICATION_CREDENTIALS environment variable. +// For workload identity federation, refer to +// https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation on +// how to generate the JSON configuration file for on-prem/non-Google cloud +// platforms. +// 2. A JSON file in a location known to the gcloud command-line tool. +// On Windows, this is %APPDATA%/gcloud/application_default_credentials.json. +// On other systems, $HOME/.config/gcloud/application_default_credentials.json. +// 3. On Google App Engine standard first generation runtimes (<= Go 1.9) it uses +// the appengine.AccessToken function. +// 4. On Google Compute Engine, Google App Engine standard second generation runtimes +// (>= Go 1.11), and Google App Engine flexible environment, it fetches +// credentials from the metadata server. func FindDefaultCredentialsWithParams(ctx context.Context, params CredentialsParams) (*Credentials, error) { // Make defensive copy of the slices in params. params = params.deepCopy() @@ -176,7 +179,7 @@ func CredentialsFromJSONWithParams(ctx context.Context, jsonData []byte, params if config != nil { return &Credentials{ ProjectID: "", - TokenSource: authhandler.TokenSource(ctx, config, params.State, params.AuthHandler), + TokenSource: authhandler.TokenSourceWithPKCE(ctx, config, params.State, params.AuthHandler, params.PKCE), JSON: jsonData, }, nil } @@ -190,6 +193,7 @@ func CredentialsFromJSONWithParams(ctx context.Context, jsonData []byte, params if err != nil { return nil, err } + ts = newErrWrappingTokenSource(ts) return &DefaultCredentials{ ProjectID: f.ProjectID, TokenSource: ts, diff --git a/vendor/golang.org/x/oauth2/google/doc.go b/vendor/golang.org/x/oauth2/google/doc.go index 8e6a57ce9..dddf65144 100644 --- a/vendor/golang.org/x/oauth2/google/doc.go +++ b/vendor/golang.org/x/oauth2/google/doc.go @@ -15,14 +15,14 @@ // For more information on using workload identity federation, refer to // https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation. // -// OAuth2 Configs +// # OAuth2 Configs // // Two functions in this package return golang.org/x/oauth2.Config values from Google credential // data. Google supports two JSON formats for OAuth2 credentials: one is handled by ConfigFromJSON, // the other by JWTConfigFromJSON. The returned Config can be used to obtain a TokenSource or // create an http.Client. // -// Workload Identity Federation +// # Workload Identity Federation // // Using workload identity federation, your application can access Google Cloud // resources from Amazon Web Services (AWS), Microsoft Azure or any identity @@ -36,9 +36,9 @@ // Follow the detailed instructions on how to configure Workload Identity Federation // in various platforms: // -// Amazon Web Services (AWS): https://cloud.google.com/iam/docs/access-resources-aws -// Microsoft Azure: https://cloud.google.com/iam/docs/access-resources-azure -// OIDC identity provider: https://cloud.google.com/iam/docs/access-resources-oidc +// Amazon Web Services (AWS): https://cloud.google.com/iam/docs/access-resources-aws +// Microsoft Azure: https://cloud.google.com/iam/docs/access-resources-azure +// OIDC identity provider: https://cloud.google.com/iam/docs/access-resources-oidc // // For OIDC providers, the library can retrieve OIDC tokens either from a // local file location (file-sourced credentials) or from a local server @@ -51,8 +51,7 @@ // return the OIDC token. The response can be in plain text or JSON. // Additional required request headers can also be specified. // -// -// Credentials +// # Credentials // // The Credentials type represents Google credentials, including Application Default // Credentials. diff --git a/vendor/golang.org/x/oauth2/google/error.go b/vendor/golang.org/x/oauth2/google/error.go new file mode 100644 index 000000000..d84dd0047 --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/error.go @@ -0,0 +1,64 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package google + +import ( + "errors" + + "golang.org/x/oauth2" +) + +// AuthenticationError indicates there was an error in the authentication flow. +// +// Use (*AuthenticationError).Temporary to check if the error can be retried. +type AuthenticationError struct { + err *oauth2.RetrieveError +} + +func newAuthenticationError(err error) error { + re := &oauth2.RetrieveError{} + if !errors.As(err, &re) { + return err + } + return &AuthenticationError{ + err: re, + } +} + +// Temporary indicates that the network error has one of the following status codes and may be retried: 500, 503, 408, or 429. +func (e *AuthenticationError) Temporary() bool { + if e.err.Response == nil { + return false + } + sc := e.err.Response.StatusCode + return sc == 500 || sc == 503 || sc == 408 || sc == 429 +} + +func (e *AuthenticationError) Error() string { + return e.err.Error() +} + +func (e *AuthenticationError) Unwrap() error { + return e.err +} + +type errWrappingTokenSource struct { + src oauth2.TokenSource +} + +func newErrWrappingTokenSource(ts oauth2.TokenSource) oauth2.TokenSource { + return &errWrappingTokenSource{src: ts} +} + +// Token returns the current token if it's still valid, else will +// refresh the current token (using r.Context for HTTP client +// information) and return the new one. +func (s *errWrappingTokenSource) Token() (*oauth2.Token, error) { + t, err := s.src.Token() + if err != nil { + return nil, newAuthenticationError(err) + } + return t, nil +} diff --git a/vendor/golang.org/x/oauth2/google/google.go b/vendor/golang.org/x/oauth2/google/google.go index ccc23ee0a..8df0c493e 100644 --- a/vendor/golang.org/x/oauth2/google/google.go +++ b/vendor/golang.org/x/oauth2/google/google.go @@ -122,6 +122,7 @@ type credentialsFile struct { TokenURLExternal string `json:"token_url"` TokenInfoURL string `json:"token_info_url"` ServiceAccountImpersonationURL string `json:"service_account_impersonation_url"` + ServiceAccountImpersonation serviceAccountImpersonationInfo `json:"service_account_impersonation"` Delegates []string `json:"delegates"` CredentialSource externalaccount.CredentialSource `json:"credential_source"` QuotaProjectID string `json:"quota_project_id"` @@ -131,6 +132,10 @@ type credentialsFile struct { SourceCredentials *credentialsFile `json:"source_credentials"` } +type serviceAccountImpersonationInfo struct { + TokenLifetimeSeconds int `json:"token_lifetime_seconds"` +} + func (f *credentialsFile) jwtConfig(scopes []string, subject string) *jwt.Config { cfg := &jwt.Config{ Email: f.ClientEmail, @@ -139,6 +144,7 @@ func (f *credentialsFile) jwtConfig(scopes []string, subject string) *jwt.Config Scopes: scopes, TokenURL: f.TokenURL, Subject: subject, // This is the user email to impersonate + Audience: f.Audience, } if cfg.TokenURL == "" { cfg.TokenURL = JWTTokenURL @@ -177,12 +183,13 @@ func (f *credentialsFile) tokenSource(ctx context.Context, params CredentialsPar TokenURL: f.TokenURLExternal, TokenInfoURL: f.TokenInfoURL, ServiceAccountImpersonationURL: f.ServiceAccountImpersonationURL, - ClientSecret: f.ClientSecret, - ClientID: f.ClientID, - CredentialSource: f.CredentialSource, - QuotaProjectID: f.QuotaProjectID, - Scopes: params.Scopes, - WorkforcePoolUserProject: f.WorkforcePoolUserProject, + ServiceAccountImpersonationLifetimeSeconds: f.ServiceAccountImpersonation.TokenLifetimeSeconds, + ClientSecret: f.ClientSecret, + ClientID: f.ClientID, + CredentialSource: f.CredentialSource, + QuotaProjectID: f.QuotaProjectID, + Scopes: params.Scopes, + WorkforcePoolUserProject: f.WorkforcePoolUserProject, } return cfg.TokenSource(ctx) case impersonatedServiceAccount: diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/aws.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/aws.go index a5a5423c6..e917195d5 100644 --- a/vendor/golang.org/x/oauth2/google/internal/externalaccount/aws.go +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/aws.go @@ -52,6 +52,13 @@ const ( // The AWS authorization header name for the security session token if available. awsSecurityTokenHeader = "x-amz-security-token" + // The name of the header containing the session token for metadata endpoint calls + awsIMDSv2SessionTokenHeader = "X-aws-ec2-metadata-token" + + awsIMDSv2SessionTtlHeader = "X-aws-ec2-metadata-token-ttl-seconds" + + awsIMDSv2SessionTtl = "300" + // The AWS authorization header name for the auto-generated date. awsDateHeader = "x-amz-date" @@ -241,6 +248,7 @@ type awsCredentialSource struct { RegionURL string RegionalCredVerificationURL string CredVerificationURL string + IMDSv2SessionTokenURL string TargetResource string requestSigner *awsRequestSigner region string @@ -268,12 +276,22 @@ func (cs awsCredentialSource) doRequest(req *http.Request) (*http.Response, erro func (cs awsCredentialSource) subjectToken() (string, error) { if cs.requestSigner == nil { - awsSecurityCredentials, err := cs.getSecurityCredentials() + awsSessionToken, err := cs.getAWSSessionToken() + if err != nil { + return "", err + } + + headers := make(map[string]string) + if awsSessionToken != "" { + headers[awsIMDSv2SessionTokenHeader] = awsSessionToken + } + + awsSecurityCredentials, err := cs.getSecurityCredentials(headers) if err != nil { return "", err } - if cs.region, err = cs.getRegion(); err != nil { + if cs.region, err = cs.getRegion(headers); err != nil { return "", err } @@ -340,7 +358,37 @@ func (cs awsCredentialSource) subjectToken() (string, error) { return url.QueryEscape(string(result)), nil } -func (cs *awsCredentialSource) getRegion() (string, error) { +func (cs *awsCredentialSource) getAWSSessionToken() (string, error) { + if cs.IMDSv2SessionTokenURL == "" { + return "", nil + } + + req, err := http.NewRequest("PUT", cs.IMDSv2SessionTokenURL, nil) + if err != nil { + return "", err + } + + req.Header.Add(awsIMDSv2SessionTtlHeader, awsIMDSv2SessionTtl) + + resp, err := cs.doRequest(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20)) + if err != nil { + return "", err + } + + if resp.StatusCode != 200 { + return "", fmt.Errorf("oauth2/google: unable to retrieve AWS session token - %s", string(respBody)) + } + + return string(respBody), nil +} + +func (cs *awsCredentialSource) getRegion(headers map[string]string) (string, error) { if envAwsRegion := getenv("AWS_REGION"); envAwsRegion != "" { return envAwsRegion, nil } @@ -357,6 +405,10 @@ func (cs *awsCredentialSource) getRegion() (string, error) { return "", err } + for name, value := range headers { + req.Header.Add(name, value) + } + resp, err := cs.doRequest(req) if err != nil { return "", err @@ -381,7 +433,7 @@ func (cs *awsCredentialSource) getRegion() (string, error) { return string(respBody[:respBodyEnd]), nil } -func (cs *awsCredentialSource) getSecurityCredentials() (result awsSecurityCredentials, err error) { +func (cs *awsCredentialSource) getSecurityCredentials(headers map[string]string) (result awsSecurityCredentials, err error) { if accessKeyID := getenv("AWS_ACCESS_KEY_ID"); accessKeyID != "" { if secretAccessKey := getenv("AWS_SECRET_ACCESS_KEY"); secretAccessKey != "" { return awsSecurityCredentials{ @@ -392,12 +444,12 @@ func (cs *awsCredentialSource) getSecurityCredentials() (result awsSecurityCrede } } - roleName, err := cs.getMetadataRoleName() + roleName, err := cs.getMetadataRoleName(headers) if err != nil { return } - credentials, err := cs.getMetadataSecurityCredentials(roleName) + credentials, err := cs.getMetadataSecurityCredentials(roleName, headers) if err != nil { return } @@ -413,7 +465,7 @@ func (cs *awsCredentialSource) getSecurityCredentials() (result awsSecurityCrede return credentials, nil } -func (cs *awsCredentialSource) getMetadataSecurityCredentials(roleName string) (awsSecurityCredentials, error) { +func (cs *awsCredentialSource) getMetadataSecurityCredentials(roleName string, headers map[string]string) (awsSecurityCredentials, error) { var result awsSecurityCredentials req, err := http.NewRequest("GET", fmt.Sprintf("%s/%s", cs.CredVerificationURL, roleName), nil) @@ -422,6 +474,10 @@ func (cs *awsCredentialSource) getMetadataSecurityCredentials(roleName string) ( } req.Header.Add("Content-Type", "application/json") + for name, value := range headers { + req.Header.Add(name, value) + } + resp, err := cs.doRequest(req) if err != nil { return result, err @@ -441,7 +497,7 @@ func (cs *awsCredentialSource) getMetadataSecurityCredentials(roleName string) ( return result, err } -func (cs *awsCredentialSource) getMetadataRoleName() (string, error) { +func (cs *awsCredentialSource) getMetadataRoleName(headers map[string]string) (string, error) { if cs.CredVerificationURL == "" { return "", errors.New("oauth2/google: unable to determine the AWS metadata server security credentials endpoint") } @@ -451,6 +507,10 @@ func (cs *awsCredentialSource) getMetadataRoleName() (string, error) { return "", err } + for name, value := range headers { + req.Header.Add(name, value) + } + resp, err := cs.doRequest(req) if err != nil { return "", err diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go index bc3ce5317..2bf5391a1 100644 --- a/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go @@ -39,6 +39,9 @@ type Config struct { // ServiceAccountImpersonationURL is the URL for the service account impersonation request. This is only // required for workload identity pools when APIs to be accessed have not integrated with UberMint. ServiceAccountImpersonationURL string + // ServiceAccountImpersonationLifetimeSeconds is the number of seconds the service account impersonation + // token will be valid for. + ServiceAccountImpersonationLifetimeSeconds int // ClientSecret is currently only required if token_info endpoint also // needs to be called with the generated GCP access token. When provided, STS will be // called with additional basic authentication using client_id as username and client_secret as password. @@ -141,10 +144,11 @@ func (c *Config) tokenSource(ctx context.Context, tokenURLValidPats []*regexp.Re scopes := c.Scopes ts.conf.Scopes = []string{"https://www.googleapis.com/auth/cloud-platform"} imp := ImpersonateTokenSource{ - Ctx: ctx, - URL: c.ServiceAccountImpersonationURL, - Scopes: scopes, - Ts: oauth2.ReuseTokenSource(nil, ts), + Ctx: ctx, + URL: c.ServiceAccountImpersonationURL, + Scopes: scopes, + Ts: oauth2.ReuseTokenSource(nil, ts), + TokenLifetimeSeconds: c.ServiceAccountImpersonationLifetimeSeconds, } return oauth2.ReuseTokenSource(nil, imp), nil } @@ -163,7 +167,7 @@ type format struct { } // CredentialSource stores the information necessary to retrieve the credentials for the STS exchange. -// Either the File or the URL field should be filled, depending on the kind of credential in question. +// One field amongst File, URL, and Executable should be filled, depending on the kind of credential in question. // The EnvironmentID should start with AWS if being used for an AWS credential. type CredentialSource struct { File string `json:"file"` @@ -171,33 +175,50 @@ type CredentialSource struct { URL string `json:"url"` Headers map[string]string `json:"headers"` + Executable *ExecutableConfig `json:"executable"` + EnvironmentID string `json:"environment_id"` RegionURL string `json:"region_url"` RegionalCredVerificationURL string `json:"regional_cred_verification_url"` CredVerificationURL string `json:"cred_verification_url"` + IMDSv2SessionTokenURL string `json:"imdsv2_session_token_url"` Format format `json:"format"` } -// parse determines the type of CredentialSource needed +type ExecutableConfig struct { + Command string `json:"command"` + TimeoutMillis *int `json:"timeout_millis"` + OutputFile string `json:"output_file"` +} + +// parse determines the type of CredentialSource needed. func (c *Config) parse(ctx context.Context) (baseCredentialSource, error) { if len(c.CredentialSource.EnvironmentID) > 3 && c.CredentialSource.EnvironmentID[:3] == "aws" { if awsVersion, err := strconv.Atoi(c.CredentialSource.EnvironmentID[3:]); err == nil { if awsVersion != 1 { return nil, fmt.Errorf("oauth2/google: aws version '%d' is not supported in the current build", awsVersion) } - return awsCredentialSource{ + + awsCredSource := awsCredentialSource{ EnvironmentID: c.CredentialSource.EnvironmentID, RegionURL: c.CredentialSource.RegionURL, RegionalCredVerificationURL: c.CredentialSource.RegionalCredVerificationURL, CredVerificationURL: c.CredentialSource.URL, TargetResource: c.Audience, ctx: ctx, - }, nil + } + if c.CredentialSource.IMDSv2SessionTokenURL != "" { + awsCredSource.IMDSv2SessionTokenURL = c.CredentialSource.IMDSv2SessionTokenURL + } + + return awsCredSource, nil } } else if c.CredentialSource.File != "" { return fileCredentialSource{File: c.CredentialSource.File, Format: c.CredentialSource.Format}, nil } else if c.CredentialSource.URL != "" { return urlCredentialSource{URL: c.CredentialSource.URL, Headers: c.CredentialSource.Headers, Format: c.CredentialSource.Format, ctx: ctx}, nil + } else if c.CredentialSource.Executable != nil { + return CreateExecutableCredential(ctx, c.CredentialSource.Executable, c) } return nil, fmt.Errorf("oauth2/google: unable to parse credential source") } diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/executablecredsource.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/executablecredsource.go new file mode 100644 index 000000000..579bcce5f --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/executablecredsource.go @@ -0,0 +1,309 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package externalaccount + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "regexp" + "strings" + "time" +) + +var serviceAccountImpersonationRE = regexp.MustCompile("https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/(.*@.*):generateAccessToken") + +const ( + executableSupportedMaxVersion = 1 + defaultTimeout = 30 * time.Second + timeoutMinimum = 5 * time.Second + timeoutMaximum = 120 * time.Second + executableSource = "response" + outputFileSource = "output file" +) + +type nonCacheableError struct { + message string +} + +func (nce nonCacheableError) Error() string { + return nce.message +} + +func missingFieldError(source, field string) error { + return fmt.Errorf("oauth2/google: %v missing `%q` field", source, field) +} + +func jsonParsingError(source, data string) error { + return fmt.Errorf("oauth2/google: unable to parse %v\nResponse: %v", source, data) +} + +func malformedFailureError() error { + return nonCacheableError{"oauth2/google: response must include `error` and `message` fields when unsuccessful"} +} + +func userDefinedError(code, message string) error { + return nonCacheableError{fmt.Sprintf("oauth2/google: response contains unsuccessful response: (%v) %v", code, message)} +} + +func unsupportedVersionError(source string, version int) error { + return fmt.Errorf("oauth2/google: %v contains unsupported version: %v", source, version) +} + +func tokenExpiredError() error { + return nonCacheableError{"oauth2/google: the token returned by the executable is expired"} +} + +func tokenTypeError(source string) error { + return fmt.Errorf("oauth2/google: %v contains unsupported token type", source) +} + +func exitCodeError(exitCode int) error { + return fmt.Errorf("oauth2/google: executable command failed with exit code %v", exitCode) +} + +func executableError(err error) error { + return fmt.Errorf("oauth2/google: executable command failed: %v", err) +} + +func executablesDisallowedError() error { + return errors.New("oauth2/google: executables need to be explicitly allowed (set GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES to '1') to run") +} + +func timeoutRangeError() error { + return errors.New("oauth2/google: invalid `timeout_millis` field — executable timeout must be between 5 and 120 seconds") +} + +func commandMissingError() error { + return errors.New("oauth2/google: missing `command` field — executable command must be provided") +} + +type environment interface { + existingEnv() []string + getenv(string) string + run(ctx context.Context, command string, env []string) ([]byte, error) + now() time.Time +} + +type runtimeEnvironment struct{} + +func (r runtimeEnvironment) existingEnv() []string { + return os.Environ() +} + +func (r runtimeEnvironment) getenv(key string) string { + return os.Getenv(key) +} + +func (r runtimeEnvironment) now() time.Time { + return time.Now().UTC() +} + +func (r runtimeEnvironment) run(ctx context.Context, command string, env []string) ([]byte, error) { + splitCommand := strings.Fields(command) + cmd := exec.CommandContext(ctx, splitCommand[0], splitCommand[1:]...) + cmd.Env = env + + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + if ctx.Err() == context.DeadlineExceeded { + return nil, context.DeadlineExceeded + } + + if exitError, ok := err.(*exec.ExitError); ok { + return nil, exitCodeError(exitError.ExitCode()) + } + + return nil, executableError(err) + } + + bytesStdout := bytes.TrimSpace(stdout.Bytes()) + if len(bytesStdout) > 0 { + return bytesStdout, nil + } + return bytes.TrimSpace(stderr.Bytes()), nil +} + +type executableCredentialSource struct { + Command string + Timeout time.Duration + OutputFile string + ctx context.Context + config *Config + env environment +} + +// CreateExecutableCredential creates an executableCredentialSource given an ExecutableConfig. +// It also performs defaulting and type conversions. +func CreateExecutableCredential(ctx context.Context, ec *ExecutableConfig, config *Config) (executableCredentialSource, error) { + if ec.Command == "" { + return executableCredentialSource{}, commandMissingError() + } + + result := executableCredentialSource{} + result.Command = ec.Command + if ec.TimeoutMillis == nil { + result.Timeout = defaultTimeout + } else { + result.Timeout = time.Duration(*ec.TimeoutMillis) * time.Millisecond + if result.Timeout < timeoutMinimum || result.Timeout > timeoutMaximum { + return executableCredentialSource{}, timeoutRangeError() + } + } + result.OutputFile = ec.OutputFile + result.ctx = ctx + result.config = config + result.env = runtimeEnvironment{} + return result, nil +} + +type executableResponse struct { + Version int `json:"version,omitempty"` + Success *bool `json:"success,omitempty"` + TokenType string `json:"token_type,omitempty"` + ExpirationTime int64 `json:"expiration_time,omitempty"` + IdToken string `json:"id_token,omitempty"` + SamlResponse string `json:"saml_response,omitempty"` + Code string `json:"code,omitempty"` + Message string `json:"message,omitempty"` +} + +func (cs executableCredentialSource) parseSubjectTokenFromSource(response []byte, source string, now int64) (string, error) { + var result executableResponse + if err := json.Unmarshal(response, &result); err != nil { + return "", jsonParsingError(source, string(response)) + } + + if result.Version == 0 { + return "", missingFieldError(source, "version") + } + + if result.Success == nil { + return "", missingFieldError(source, "success") + } + + if !*result.Success { + if result.Code == "" || result.Message == "" { + return "", malformedFailureError() + } + return "", userDefinedError(result.Code, result.Message) + } + + if result.Version > executableSupportedMaxVersion || result.Version < 0 { + return "", unsupportedVersionError(source, result.Version) + } + + if result.ExpirationTime == 0 && cs.OutputFile != "" { + return "", missingFieldError(source, "expiration_time") + } + + if result.TokenType == "" { + return "", missingFieldError(source, "token_type") + } + + if result.ExpirationTime != 0 && result.ExpirationTime < now { + return "", tokenExpiredError() + } + + if result.TokenType == "urn:ietf:params:oauth:token-type:jwt" || result.TokenType == "urn:ietf:params:oauth:token-type:id_token" { + if result.IdToken == "" { + return "", missingFieldError(source, "id_token") + } + return result.IdToken, nil + } + + if result.TokenType == "urn:ietf:params:oauth:token-type:saml2" { + if result.SamlResponse == "" { + return "", missingFieldError(source, "saml_response") + } + return result.SamlResponse, nil + } + + return "", tokenTypeError(source) +} + +func (cs executableCredentialSource) subjectToken() (string, error) { + if token, err := cs.getTokenFromOutputFile(); token != "" || err != nil { + return token, err + } + + return cs.getTokenFromExecutableCommand() +} + +func (cs executableCredentialSource) getTokenFromOutputFile() (token string, err error) { + if cs.OutputFile == "" { + // This ExecutableCredentialSource doesn't use an OutputFile. + return "", nil + } + + file, err := os.Open(cs.OutputFile) + if err != nil { + // No OutputFile found. Hasn't been created yet, so skip it. + return "", nil + } + defer file.Close() + + data, err := ioutil.ReadAll(io.LimitReader(file, 1<<20)) + if err != nil || len(data) == 0 { + // Cachefile exists, but no data found. Get new credential. + return "", nil + } + + token, err = cs.parseSubjectTokenFromSource(data, outputFileSource, cs.env.now().Unix()) + if err != nil { + if _, ok := err.(nonCacheableError); ok { + // If the cached token is expired we need a new token, + // and if the cache contains a failure, we need to try again. + return "", nil + } + + // There was an error in the cached token, and the developer should be aware of it. + return "", err + } + // Token parsing succeeded. Use found token. + return token, nil +} + +func (cs executableCredentialSource) executableEnvironment() []string { + result := cs.env.existingEnv() + result = append(result, fmt.Sprintf("GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE=%v", cs.config.Audience)) + result = append(result, fmt.Sprintf("GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE=%v", cs.config.SubjectTokenType)) + result = append(result, "GOOGLE_EXTERNAL_ACCOUNT_INTERACTIVE=0") + if cs.config.ServiceAccountImpersonationURL != "" { + matches := serviceAccountImpersonationRE.FindStringSubmatch(cs.config.ServiceAccountImpersonationURL) + if matches != nil { + result = append(result, fmt.Sprintf("GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL=%v", matches[1])) + } + } + if cs.OutputFile != "" { + result = append(result, fmt.Sprintf("GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE=%v", cs.OutputFile)) + } + return result +} + +func (cs executableCredentialSource) getTokenFromExecutableCommand() (string, error) { + // For security reasons, we need our consumers to set this environment variable to allow executables to be run. + if cs.env.getenv("GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES") != "1" { + return "", executablesDisallowedError() + } + + ctx, cancel := context.WithDeadline(cs.ctx, cs.env.now().Add(cs.Timeout)) + defer cancel() + + output, err := cs.env.run(ctx, cs.Command, cs.executableEnvironment()) + if err != nil { + return "", err + } + return cs.parseSubjectTokenFromSource(output, executableSource, cs.env.now().Unix()) +} diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/impersonate.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/impersonate.go index 8251fc85e..54c8f209f 100644 --- a/vendor/golang.org/x/oauth2/google/internal/externalaccount/impersonate.go +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/impersonate.go @@ -48,12 +48,19 @@ type ImpersonateTokenSource struct { // Each service account must be granted roles/iam.serviceAccountTokenCreator // on the next service account in the chain. Optional. Delegates []string + // TokenLifetimeSeconds is the number of seconds the impersonation token will + // be valid for. + TokenLifetimeSeconds int } // Token performs the exchange to get a temporary service account token to allow access to GCP. func (its ImpersonateTokenSource) Token() (*oauth2.Token, error) { + lifetimeString := "3600s" + if its.TokenLifetimeSeconds != 0 { + lifetimeString = fmt.Sprintf("%ds", its.TokenLifetimeSeconds) + } reqBody := generateAccessTokenReq{ - Lifetime: "3600s", + Lifetime: lifetimeString, Scope: its.Scopes, Delegates: its.Delegates, } diff --git a/vendor/golang.org/x/oauth2/google/jwt.go b/vendor/golang.org/x/oauth2/google/jwt.go index 67d97b990..e89e6ae17 100644 --- a/vendor/golang.org/x/oauth2/google/jwt.go +++ b/vendor/golang.org/x/oauth2/google/jwt.go @@ -66,7 +66,8 @@ func newJWTSource(jsonKey []byte, audience string, scopes []string) (oauth2.Toke if err != nil { return nil, err } - return oauth2.ReuseTokenSource(tok, ts), nil + rts := newErrWrappingTokenSource(oauth2.ReuseTokenSource(tok, ts)) + return rts, nil } type jwtAccessTokenSource struct { diff --git a/vendor/golang.org/x/sync/AUTHORS b/vendor/golang.org/x/sync/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/sync/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/sync/CONTRIBUTORS b/vendor/golang.org/x/sync/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/sync/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go index 9857fe53d..4c0850a45 100644 --- a/vendor/golang.org/x/sync/errgroup/errgroup.go +++ b/vendor/golang.org/x/sync/errgroup/errgroup.go @@ -8,22 +8,35 @@ package errgroup import ( "context" + "fmt" "sync" ) +type token struct{} + // A Group is a collection of goroutines working on subtasks that are part of // the same overall task. // -// A zero Group is valid and does not cancel on error. +// A zero Group is valid, has no limit on the number of active goroutines, +// and does not cancel on error. type Group struct { cancel func() wg sync.WaitGroup + sem chan token + errOnce sync.Once err error } +func (g *Group) done() { + if g.sem != nil { + <-g.sem + } + g.wg.Done() +} + // WithContext returns a new Group and an associated Context derived from ctx. // // The derived Context is canceled the first time a function passed to Go @@ -45,14 +58,48 @@ func (g *Group) Wait() error { } // Go calls the given function in a new goroutine. +// It blocks until the new goroutine can be added without the number of +// active goroutines in the group exceeding the configured limit. // // The first call to return a non-nil error cancels the group; its error will be // returned by Wait. func (g *Group) Go(f func() error) { + if g.sem != nil { + g.sem <- token{} + } + g.wg.Add(1) + go func() { + defer g.done() + + if err := f(); err != nil { + g.errOnce.Do(func() { + g.err = err + if g.cancel != nil { + g.cancel() + } + }) + } + }() +} + +// TryGo calls the given function in a new goroutine only if the number of +// active goroutines in the group is currently below the configured limit. +// +// The return value reports whether the goroutine was started. +func (g *Group) TryGo(f func() error) bool { + if g.sem != nil { + select { + case g.sem <- token{}: + // Note: this allows barging iff channels in general allow barging. + default: + return false + } + } + g.wg.Add(1) go func() { - defer g.wg.Done() + defer g.done() if err := f(); err != nil { g.errOnce.Do(func() { @@ -63,4 +110,23 @@ func (g *Group) Go(f func() error) { }) } }() + return true +} + +// SetLimit limits the number of active goroutines in this group to at most n. +// A negative value indicates no limit. +// +// Any subsequent call to the Go method will block until it can add an active +// goroutine without exceeding the configured limit. +// +// The limit must not be modified while any goroutines in the group are active. +func (g *Group) SetLimit(n int) { + if n < 0 { + g.sem = nil + return + } + if len(g.sem) != 0 { + panic(fmt.Errorf("errgroup: modify limit while %v goroutines in the group are still active", len(g.sem))) + } + g.sem = make(chan token, n) } diff --git a/vendor/golang.org/x/sys/AUTHORS b/vendor/golang.org/x/sys/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/sys/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/sys/CONTRIBUTORS b/vendor/golang.org/x/sys/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/sys/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s b/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s new file mode 100644 index 000000000..d560019ea --- /dev/null +++ b/vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s @@ -0,0 +1,29 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (darwin || freebsd || netbsd || openbsd) && gc +// +build darwin freebsd netbsd openbsd +// +build gc + +#include "textflag.h" + +// System call support for RISCV64 BSD + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_386.go b/vendor/golang.org/x/sys/unix/errors_freebsd_386.go deleted file mode 100644 index 761db66ef..000000000 --- a/vendor/golang.org/x/sys/unix/errors_freebsd_386.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep -// them here for backwards compatibility. - -package unix - -const ( - DLT_HHDLC = 0x79 - IFF_SMART = 0x20 - IFT_1822 = 0x2 - IFT_A12MPPSWITCH = 0x82 - IFT_AAL2 = 0xbb - IFT_AAL5 = 0x31 - IFT_ADSL = 0x5e - IFT_AFLANE8023 = 0x3b - IFT_AFLANE8025 = 0x3c - IFT_ARAP = 0x58 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ASYNC = 0x54 - IFT_ATM = 0x25 - IFT_ATMDXI = 0x69 - IFT_ATMFUNI = 0x6a - IFT_ATMIMA = 0x6b - IFT_ATMLOGICAL = 0x50 - IFT_ATMRADIO = 0xbd - IFT_ATMSUBINTERFACE = 0x86 - IFT_ATMVCIENDPT = 0xc2 - IFT_ATMVIRTUAL = 0x95 - IFT_BGPPOLICYACCOUNTING = 0xa2 - IFT_BSC = 0x53 - IFT_CCTEMUL = 0x3d - IFT_CEPT = 0x13 - IFT_CES = 0x85 - IFT_CHANNEL = 0x46 - IFT_CNR = 0x55 - IFT_COFFEE = 0x84 - IFT_COMPOSITELINK = 0x9b - IFT_DCN = 0x8d - IFT_DIGITALPOWERLINE = 0x8a - IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba - IFT_DLSW = 0x4a - IFT_DOCSCABLEDOWNSTREAM = 0x80 - IFT_DOCSCABLEMACLAYER = 0x7f - IFT_DOCSCABLEUPSTREAM = 0x81 - IFT_DS0 = 0x51 - IFT_DS0BUNDLE = 0x52 - IFT_DS1FDL = 0xaa - IFT_DS3 = 0x1e - IFT_DTM = 0x8c - IFT_DVBASILN = 0xac - IFT_DVBASIOUT = 0xad - IFT_DVBRCCDOWNSTREAM = 0x93 - IFT_DVBRCCMACLAYER = 0x92 - IFT_DVBRCCUPSTREAM = 0x94 - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_EPLRS = 0x57 - IFT_ESCON = 0x49 - IFT_ETHER = 0x6 - IFT_FAITH = 0xf2 - IFT_FAST = 0x7d - IFT_FASTETHER = 0x3e - IFT_FASTETHERFX = 0x45 - IFT_FDDI = 0xf - IFT_FIBRECHANNEL = 0x38 - IFT_FRAMERELAYINTERCONNECT = 0x3a - IFT_FRAMERELAYMPI = 0x5c - IFT_FRDLCIENDPT = 0xc1 - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_FRF16MFRBUNDLE = 0xa3 - IFT_FRFORWARD = 0x9e - IFT_G703AT2MB = 0x43 - IFT_G703AT64K = 0x42 - IFT_GIF = 0xf0 - IFT_GIGABITETHERNET = 0x75 - IFT_GR303IDT = 0xb2 - IFT_GR303RDT = 0xb1 - IFT_H323GATEKEEPER = 0xa4 - IFT_H323PROXY = 0xa5 - IFT_HDH1822 = 0x3 - IFT_HDLC = 0x76 - IFT_HDSL2 = 0xa8 - IFT_HIPERLAN2 = 0xb7 - IFT_HIPPI = 0x2f - IFT_HIPPIINTERFACE = 0x39 - IFT_HOSTPAD = 0x5a - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IBM370PARCHAN = 0x48 - IFT_IDSL = 0x9a - IFT_IEEE80211 = 0x47 - IFT_IEEE80212 = 0x37 - IFT_IEEE8023ADLAG = 0xa1 - IFT_IFGSN = 0x91 - IFT_IMT = 0xbe - IFT_INTERLEAVE = 0x7c - IFT_IP = 0x7e - IFT_IPFORWARD = 0x8e - IFT_IPOVERATM = 0x72 - IFT_IPOVERCDLC = 0x6d - IFT_IPOVERCLAW = 0x6e - IFT_IPSWITCH = 0x4e - IFT_IPXIP = 0xf9 - IFT_ISDN = 0x3f - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISDNS = 0x4b - IFT_ISDNU = 0x4c - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88025CRFPINT = 0x62 - IFT_ISO88025DTR = 0x56 - IFT_ISO88025FIBER = 0x73 - IFT_ISO88026 = 0xa - IFT_ISUP = 0xb3 - IFT_L3IPXVLAN = 0x89 - IFT_LAPB = 0x10 - IFT_LAPD = 0x4d - IFT_LAPF = 0x77 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MEDIAMAILOVERIP = 0x8b - IFT_MFSIGLINK = 0xa7 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_MPC = 0x71 - IFT_MPLS = 0xa6 - IFT_MPLSTUNNEL = 0x96 - IFT_MSDSL = 0x8f - IFT_MVL = 0xbf - IFT_MYRINET = 0x63 - IFT_NFAS = 0xaf - IFT_NSIP = 0x1b - IFT_OPTICALCHANNEL = 0xc3 - IFT_OPTICALTRANSPORT = 0xc4 - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PFLOG = 0xf6 - IFT_PFSYNC = 0xf7 - IFT_PLC = 0xae - IFT_POS = 0xab - IFT_PPPMULTILINKBUNDLE = 0x6c - IFT_PROPBWAP2MP = 0xb8 - IFT_PROPCNLS = 0x59 - IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 - IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 - IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 - IFT_PROPMUX = 0x36 - IFT_PROPWIRELESSP2P = 0x9d - IFT_PTPSERIAL = 0x16 - IFT_PVC = 0xf1 - IFT_QLLC = 0x44 - IFT_RADIOMAC = 0xbc - IFT_RADSL = 0x5f - IFT_REACHDSL = 0xc0 - IFT_RFC1483 = 0x9f - IFT_RS232 = 0x21 - IFT_RSRB = 0x4f - IFT_SDLC = 0x11 - IFT_SDSL = 0x60 - IFT_SHDSL = 0xa9 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETOVERHEADCHANNEL = 0xb9 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_SRP = 0x97 - IFT_SS7SIGLINK = 0x9c - IFT_STACKTOSTACK = 0x6f - IFT_STARLAN = 0xb - IFT_STF = 0xd7 - IFT_T1 = 0x12 - IFT_TDLC = 0x74 - IFT_TERMPAD = 0x5b - IFT_TR008 = 0xb0 - IFT_TRANSPHDLC = 0x7b - IFT_TUNNEL = 0x83 - IFT_ULTRA = 0x1d - IFT_USB = 0xa0 - IFT_V11 = 0x40 - IFT_V35 = 0x2d - IFT_V36 = 0x41 - IFT_V37 = 0x78 - IFT_VDSL = 0x61 - IFT_VIRTUALIPADDRESS = 0x70 - IFT_VOICEEM = 0x64 - IFT_VOICEENCAP = 0x67 - IFT_VOICEFXO = 0x65 - IFT_VOICEFXS = 0x66 - IFT_VOICEOVERATM = 0x98 - IFT_VOICEOVERFRAMERELAY = 0x99 - IFT_VOICEOVERIP = 0x68 - IFT_X213 = 0x5d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25HUNTGROUP = 0x7a - IFT_X25MLP = 0x79 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - IPPROTO_MAXID = 0x34 - IPV6_FAITH = 0x1d - IPV6_MIN_MEMBERSHIPS = 0x1f - IP_FAITH = 0x16 - IP_MAX_SOURCE_FILTER = 0x400 - IP_MIN_MEMBERSHIPS = 0x1f - MAP_NORESERVE = 0x40 - MAP_RENAME = 0x20 - NET_RT_MAXID = 0x6 - RTF_PRCLONING = 0x10000 - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - RT_CACHING_CONTEXT = 0x1 - RT_NORTREF = 0x2 - SIOCADDRT = 0x8030720a - SIOCALIFADDR = 0x8118691b - SIOCDELRT = 0x8030720b - SIOCDLIFADDR = 0x8118691d - SIOCGLIFADDR = 0xc118691c - SIOCGLIFPHYADDR = 0xc118694b - SIOCSLIFPHYADDR = 0x8118694a -) diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go deleted file mode 100644 index 070f44b65..000000000 --- a/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep -// them here for backwards compatibility. - -package unix - -const ( - DLT_HHDLC = 0x79 - IFF_SMART = 0x20 - IFT_1822 = 0x2 - IFT_A12MPPSWITCH = 0x82 - IFT_AAL2 = 0xbb - IFT_AAL5 = 0x31 - IFT_ADSL = 0x5e - IFT_AFLANE8023 = 0x3b - IFT_AFLANE8025 = 0x3c - IFT_ARAP = 0x58 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ASYNC = 0x54 - IFT_ATM = 0x25 - IFT_ATMDXI = 0x69 - IFT_ATMFUNI = 0x6a - IFT_ATMIMA = 0x6b - IFT_ATMLOGICAL = 0x50 - IFT_ATMRADIO = 0xbd - IFT_ATMSUBINTERFACE = 0x86 - IFT_ATMVCIENDPT = 0xc2 - IFT_ATMVIRTUAL = 0x95 - IFT_BGPPOLICYACCOUNTING = 0xa2 - IFT_BSC = 0x53 - IFT_CCTEMUL = 0x3d - IFT_CEPT = 0x13 - IFT_CES = 0x85 - IFT_CHANNEL = 0x46 - IFT_CNR = 0x55 - IFT_COFFEE = 0x84 - IFT_COMPOSITELINK = 0x9b - IFT_DCN = 0x8d - IFT_DIGITALPOWERLINE = 0x8a - IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba - IFT_DLSW = 0x4a - IFT_DOCSCABLEDOWNSTREAM = 0x80 - IFT_DOCSCABLEMACLAYER = 0x7f - IFT_DOCSCABLEUPSTREAM = 0x81 - IFT_DS0 = 0x51 - IFT_DS0BUNDLE = 0x52 - IFT_DS1FDL = 0xaa - IFT_DS3 = 0x1e - IFT_DTM = 0x8c - IFT_DVBASILN = 0xac - IFT_DVBASIOUT = 0xad - IFT_DVBRCCDOWNSTREAM = 0x93 - IFT_DVBRCCMACLAYER = 0x92 - IFT_DVBRCCUPSTREAM = 0x94 - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_EPLRS = 0x57 - IFT_ESCON = 0x49 - IFT_ETHER = 0x6 - IFT_FAITH = 0xf2 - IFT_FAST = 0x7d - IFT_FASTETHER = 0x3e - IFT_FASTETHERFX = 0x45 - IFT_FDDI = 0xf - IFT_FIBRECHANNEL = 0x38 - IFT_FRAMERELAYINTERCONNECT = 0x3a - IFT_FRAMERELAYMPI = 0x5c - IFT_FRDLCIENDPT = 0xc1 - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_FRF16MFRBUNDLE = 0xa3 - IFT_FRFORWARD = 0x9e - IFT_G703AT2MB = 0x43 - IFT_G703AT64K = 0x42 - IFT_GIF = 0xf0 - IFT_GIGABITETHERNET = 0x75 - IFT_GR303IDT = 0xb2 - IFT_GR303RDT = 0xb1 - IFT_H323GATEKEEPER = 0xa4 - IFT_H323PROXY = 0xa5 - IFT_HDH1822 = 0x3 - IFT_HDLC = 0x76 - IFT_HDSL2 = 0xa8 - IFT_HIPERLAN2 = 0xb7 - IFT_HIPPI = 0x2f - IFT_HIPPIINTERFACE = 0x39 - IFT_HOSTPAD = 0x5a - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IBM370PARCHAN = 0x48 - IFT_IDSL = 0x9a - IFT_IEEE80211 = 0x47 - IFT_IEEE80212 = 0x37 - IFT_IEEE8023ADLAG = 0xa1 - IFT_IFGSN = 0x91 - IFT_IMT = 0xbe - IFT_INTERLEAVE = 0x7c - IFT_IP = 0x7e - IFT_IPFORWARD = 0x8e - IFT_IPOVERATM = 0x72 - IFT_IPOVERCDLC = 0x6d - IFT_IPOVERCLAW = 0x6e - IFT_IPSWITCH = 0x4e - IFT_IPXIP = 0xf9 - IFT_ISDN = 0x3f - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISDNS = 0x4b - IFT_ISDNU = 0x4c - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88025CRFPINT = 0x62 - IFT_ISO88025DTR = 0x56 - IFT_ISO88025FIBER = 0x73 - IFT_ISO88026 = 0xa - IFT_ISUP = 0xb3 - IFT_L3IPXVLAN = 0x89 - IFT_LAPB = 0x10 - IFT_LAPD = 0x4d - IFT_LAPF = 0x77 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MEDIAMAILOVERIP = 0x8b - IFT_MFSIGLINK = 0xa7 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_MPC = 0x71 - IFT_MPLS = 0xa6 - IFT_MPLSTUNNEL = 0x96 - IFT_MSDSL = 0x8f - IFT_MVL = 0xbf - IFT_MYRINET = 0x63 - IFT_NFAS = 0xaf - IFT_NSIP = 0x1b - IFT_OPTICALCHANNEL = 0xc3 - IFT_OPTICALTRANSPORT = 0xc4 - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PFLOG = 0xf6 - IFT_PFSYNC = 0xf7 - IFT_PLC = 0xae - IFT_POS = 0xab - IFT_PPPMULTILINKBUNDLE = 0x6c - IFT_PROPBWAP2MP = 0xb8 - IFT_PROPCNLS = 0x59 - IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 - IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 - IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 - IFT_PROPMUX = 0x36 - IFT_PROPWIRELESSP2P = 0x9d - IFT_PTPSERIAL = 0x16 - IFT_PVC = 0xf1 - IFT_QLLC = 0x44 - IFT_RADIOMAC = 0xbc - IFT_RADSL = 0x5f - IFT_REACHDSL = 0xc0 - IFT_RFC1483 = 0x9f - IFT_RS232 = 0x21 - IFT_RSRB = 0x4f - IFT_SDLC = 0x11 - IFT_SDSL = 0x60 - IFT_SHDSL = 0xa9 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETOVERHEADCHANNEL = 0xb9 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_SRP = 0x97 - IFT_SS7SIGLINK = 0x9c - IFT_STACKTOSTACK = 0x6f - IFT_STARLAN = 0xb - IFT_STF = 0xd7 - IFT_T1 = 0x12 - IFT_TDLC = 0x74 - IFT_TERMPAD = 0x5b - IFT_TR008 = 0xb0 - IFT_TRANSPHDLC = 0x7b - IFT_TUNNEL = 0x83 - IFT_ULTRA = 0x1d - IFT_USB = 0xa0 - IFT_V11 = 0x40 - IFT_V35 = 0x2d - IFT_V36 = 0x41 - IFT_V37 = 0x78 - IFT_VDSL = 0x61 - IFT_VIRTUALIPADDRESS = 0x70 - IFT_VOICEEM = 0x64 - IFT_VOICEENCAP = 0x67 - IFT_VOICEFXO = 0x65 - IFT_VOICEFXS = 0x66 - IFT_VOICEOVERATM = 0x98 - IFT_VOICEOVERFRAMERELAY = 0x99 - IFT_VOICEOVERIP = 0x68 - IFT_X213 = 0x5d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25HUNTGROUP = 0x7a - IFT_X25MLP = 0x79 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - IPPROTO_MAXID = 0x34 - IPV6_FAITH = 0x1d - IPV6_MIN_MEMBERSHIPS = 0x1f - IP_FAITH = 0x16 - IP_MAX_SOURCE_FILTER = 0x400 - IP_MIN_MEMBERSHIPS = 0x1f - MAP_NORESERVE = 0x40 - MAP_RENAME = 0x20 - NET_RT_MAXID = 0x6 - RTF_PRCLONING = 0x10000 - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - RT_CACHING_CONTEXT = 0x1 - RT_NORTREF = 0x2 - SIOCADDRT = 0x8040720a - SIOCALIFADDR = 0x8118691b - SIOCDELRT = 0x8040720b - SIOCDLIFADDR = 0x8118691d - SIOCGLIFADDR = 0xc118691c - SIOCGLIFPHYADDR = 0xc118694b - SIOCSLIFPHYADDR = 0x8118694a -) diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go deleted file mode 100644 index 856dca325..000000000 --- a/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package unix - -const ( - IFT_1822 = 0x2 - IFT_A12MPPSWITCH = 0x82 - IFT_AAL2 = 0xbb - IFT_AAL5 = 0x31 - IFT_ADSL = 0x5e - IFT_AFLANE8023 = 0x3b - IFT_AFLANE8025 = 0x3c - IFT_ARAP = 0x58 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ASYNC = 0x54 - IFT_ATM = 0x25 - IFT_ATMDXI = 0x69 - IFT_ATMFUNI = 0x6a - IFT_ATMIMA = 0x6b - IFT_ATMLOGICAL = 0x50 - IFT_ATMRADIO = 0xbd - IFT_ATMSUBINTERFACE = 0x86 - IFT_ATMVCIENDPT = 0xc2 - IFT_ATMVIRTUAL = 0x95 - IFT_BGPPOLICYACCOUNTING = 0xa2 - IFT_BSC = 0x53 - IFT_CCTEMUL = 0x3d - IFT_CEPT = 0x13 - IFT_CES = 0x85 - IFT_CHANNEL = 0x46 - IFT_CNR = 0x55 - IFT_COFFEE = 0x84 - IFT_COMPOSITELINK = 0x9b - IFT_DCN = 0x8d - IFT_DIGITALPOWERLINE = 0x8a - IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba - IFT_DLSW = 0x4a - IFT_DOCSCABLEDOWNSTREAM = 0x80 - IFT_DOCSCABLEMACLAYER = 0x7f - IFT_DOCSCABLEUPSTREAM = 0x81 - IFT_DS0 = 0x51 - IFT_DS0BUNDLE = 0x52 - IFT_DS1FDL = 0xaa - IFT_DS3 = 0x1e - IFT_DTM = 0x8c - IFT_DVBASILN = 0xac - IFT_DVBASIOUT = 0xad - IFT_DVBRCCDOWNSTREAM = 0x93 - IFT_DVBRCCMACLAYER = 0x92 - IFT_DVBRCCUPSTREAM = 0x94 - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_EPLRS = 0x57 - IFT_ESCON = 0x49 - IFT_ETHER = 0x6 - IFT_FAST = 0x7d - IFT_FASTETHER = 0x3e - IFT_FASTETHERFX = 0x45 - IFT_FDDI = 0xf - IFT_FIBRECHANNEL = 0x38 - IFT_FRAMERELAYINTERCONNECT = 0x3a - IFT_FRAMERELAYMPI = 0x5c - IFT_FRDLCIENDPT = 0xc1 - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_FRF16MFRBUNDLE = 0xa3 - IFT_FRFORWARD = 0x9e - IFT_G703AT2MB = 0x43 - IFT_G703AT64K = 0x42 - IFT_GIF = 0xf0 - IFT_GIGABITETHERNET = 0x75 - IFT_GR303IDT = 0xb2 - IFT_GR303RDT = 0xb1 - IFT_H323GATEKEEPER = 0xa4 - IFT_H323PROXY = 0xa5 - IFT_HDH1822 = 0x3 - IFT_HDLC = 0x76 - IFT_HDSL2 = 0xa8 - IFT_HIPERLAN2 = 0xb7 - IFT_HIPPI = 0x2f - IFT_HIPPIINTERFACE = 0x39 - IFT_HOSTPAD = 0x5a - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IBM370PARCHAN = 0x48 - IFT_IDSL = 0x9a - IFT_IEEE80211 = 0x47 - IFT_IEEE80212 = 0x37 - IFT_IEEE8023ADLAG = 0xa1 - IFT_IFGSN = 0x91 - IFT_IMT = 0xbe - IFT_INTERLEAVE = 0x7c - IFT_IP = 0x7e - IFT_IPFORWARD = 0x8e - IFT_IPOVERATM = 0x72 - IFT_IPOVERCDLC = 0x6d - IFT_IPOVERCLAW = 0x6e - IFT_IPSWITCH = 0x4e - IFT_ISDN = 0x3f - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISDNS = 0x4b - IFT_ISDNU = 0x4c - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88025CRFPINT = 0x62 - IFT_ISO88025DTR = 0x56 - IFT_ISO88025FIBER = 0x73 - IFT_ISO88026 = 0xa - IFT_ISUP = 0xb3 - IFT_L3IPXVLAN = 0x89 - IFT_LAPB = 0x10 - IFT_LAPD = 0x4d - IFT_LAPF = 0x77 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MEDIAMAILOVERIP = 0x8b - IFT_MFSIGLINK = 0xa7 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_MPC = 0x71 - IFT_MPLS = 0xa6 - IFT_MPLSTUNNEL = 0x96 - IFT_MSDSL = 0x8f - IFT_MVL = 0xbf - IFT_MYRINET = 0x63 - IFT_NFAS = 0xaf - IFT_NSIP = 0x1b - IFT_OPTICALCHANNEL = 0xc3 - IFT_OPTICALTRANSPORT = 0xc4 - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PFLOG = 0xf6 - IFT_PFSYNC = 0xf7 - IFT_PLC = 0xae - IFT_POS = 0xab - IFT_PPPMULTILINKBUNDLE = 0x6c - IFT_PROPBWAP2MP = 0xb8 - IFT_PROPCNLS = 0x59 - IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 - IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 - IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 - IFT_PROPMUX = 0x36 - IFT_PROPWIRELESSP2P = 0x9d - IFT_PTPSERIAL = 0x16 - IFT_PVC = 0xf1 - IFT_QLLC = 0x44 - IFT_RADIOMAC = 0xbc - IFT_RADSL = 0x5f - IFT_REACHDSL = 0xc0 - IFT_RFC1483 = 0x9f - IFT_RS232 = 0x21 - IFT_RSRB = 0x4f - IFT_SDLC = 0x11 - IFT_SDSL = 0x60 - IFT_SHDSL = 0xa9 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETOVERHEADCHANNEL = 0xb9 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_SRP = 0x97 - IFT_SS7SIGLINK = 0x9c - IFT_STACKTOSTACK = 0x6f - IFT_STARLAN = 0xb - IFT_STF = 0xd7 - IFT_T1 = 0x12 - IFT_TDLC = 0x74 - IFT_TERMPAD = 0x5b - IFT_TR008 = 0xb0 - IFT_TRANSPHDLC = 0x7b - IFT_TUNNEL = 0x83 - IFT_ULTRA = 0x1d - IFT_USB = 0xa0 - IFT_V11 = 0x40 - IFT_V35 = 0x2d - IFT_V36 = 0x41 - IFT_V37 = 0x78 - IFT_VDSL = 0x61 - IFT_VIRTUALIPADDRESS = 0x70 - IFT_VOICEEM = 0x64 - IFT_VOICEENCAP = 0x67 - IFT_VOICEFXO = 0x65 - IFT_VOICEFXS = 0x66 - IFT_VOICEOVERATM = 0x98 - IFT_VOICEOVERFRAMERELAY = 0x99 - IFT_VOICEOVERIP = 0x68 - IFT_X213 = 0x5d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25HUNTGROUP = 0x7a - IFT_X25MLP = 0x79 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - - // missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go - IFF_SMART = 0x20 - IFT_FAITH = 0xf2 - IFT_IPXIP = 0xf9 - IPPROTO_MAXID = 0x34 - IPV6_FAITH = 0x1d - IP_FAITH = 0x16 - MAP_NORESERVE = 0x40 - MAP_RENAME = 0x20 - NET_RT_MAXID = 0x6 - RTF_PRCLONING = 0x10000 - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - SIOCADDRT = 0x8030720a - SIOCALIFADDR = 0x8118691b - SIOCDELRT = 0x8030720b - SIOCDLIFADDR = 0x8118691d - SIOCGLIFADDR = 0xc118691c - SIOCGLIFPHYADDR = 0xc118694b - SIOCSLIFPHYADDR = 0x8118694a -) diff --git a/vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go deleted file mode 100644 index 946dcf3fc..000000000 --- a/vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep -// them here for backwards compatibility. - -package unix - -const ( - DLT_HHDLC = 0x79 - IPV6_MIN_MEMBERSHIPS = 0x1f - IP_MAX_SOURCE_FILTER = 0x400 - IP_MIN_MEMBERSHIPS = 0x1f - RT_CACHING_CONTEXT = 0x1 - RT_NORTREF = 0x2 -) diff --git a/vendor/golang.org/x/sys/unix/ioctl_linux.go b/vendor/golang.org/x/sys/unix/ioctl_linux.go index 884430b81..0d12c0851 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_linux.go +++ b/vendor/golang.org/x/sys/unix/ioctl_linux.go @@ -4,9 +4,7 @@ package unix -import ( - "unsafe" -) +import "unsafe" // IoctlRetInt performs an ioctl operation specified by req on a device // associated with opened file descriptor fd, and returns a non-negative @@ -217,3 +215,19 @@ func IoctlKCMAttach(fd int, info KCMAttach) error { func IoctlKCMUnattach(fd int, info KCMUnattach) error { return ioctlPtr(fd, SIOCKCMUNATTACH, unsafe.Pointer(&info)) } + +// IoctlLoopGetStatus64 gets the status of the loop device associated with the +// file descriptor fd using the LOOP_GET_STATUS64 operation. +func IoctlLoopGetStatus64(fd int) (*LoopInfo64, error) { + var value LoopInfo64 + if err := ioctlPtr(fd, LOOP_GET_STATUS64, unsafe.Pointer(&value)); err != nil { + return nil, err + } + return &value, nil +} + +// IoctlLoopSetStatus64 sets the status of the loop device associated with the +// file descriptor fd using the LOOP_SET_STATUS64 operation. +func IoctlLoopSetStatus64(fd int, value *LoopInfo64) error { + return ioctlPtr(fd, LOOP_SET_STATUS64, unsafe.Pointer(value)) +} diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index ee7362348..3b2335d5f 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -73,12 +73,12 @@ aix_ppc64) darwin_amd64) mkerrors="$mkerrors -m64" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" + mkasm="go run mkasm.go" ;; darwin_arm64) mkerrors="$mkerrors -m64" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" + mkasm="go run mkasm.go" ;; dragonfly_amd64) mkerrors="$mkerrors -m64" @@ -89,25 +89,30 @@ dragonfly_amd64) freebsd_386) mkerrors="$mkerrors -m32" mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_amd64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_arm) mkerrors="$mkerrors" mksyscall="go run mksyscall.go -l32 -arm" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; freebsd_arm64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +freebsd_riscv64) + mkerrors="$mkerrors -m64" + mksysnum="go run mksysnum.go 'https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12'" mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; netbsd_386) @@ -137,33 +142,33 @@ netbsd_arm64) mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_386) + mkasm="go run mkasm.go" mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32 -openbsd" + mksyscall="go run mksyscall.go -l32 -openbsd -libc" mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_amd64) + mkasm="go run mkasm.go" mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -openbsd" + mksyscall="go run mksyscall.go -openbsd -libc" mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_arm) + mkasm="go run mkasm.go" mkerrors="$mkerrors" - mksyscall="go run mksyscall.go -l32 -openbsd -arm" + mksyscall="go run mksyscall.go -l32 -openbsd -arm -libc" mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; openbsd_arm64) + mkasm="go run mkasm.go" mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -openbsd" + mksyscall="go run mksyscall.go -openbsd -libc" mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" @@ -227,5 +232,5 @@ esac if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; fi - if [ -n "$mkasm" ]; then echo "$mkasm $GOARCH"; fi + if [ -n "$mkasm" ]; then echo "$mkasm $GOOS $GOARCH"; fi ) | $run diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index d888fb770..2ab44aa65 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -128,6 +128,7 @@ includes_FreeBSD=' #include #include #include +#include #include #include #include @@ -202,6 +203,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -295,6 +297,10 @@ struct ltchars { #define SOL_NETLINK 270 #endif +#ifndef SOL_SMC +#define SOL_SMC 286 +#endif + #ifdef SOL_BLUETOOTH // SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h // but it is already in bluetooth_linux.go @@ -529,7 +535,7 @@ ccflags="$@" $2 ~ /^(MS|MNT|MOUNT|UMOUNT)_/ || $2 ~ /^NS_GET_/ || $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || - $2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT|TFD)_/ || + $2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT|PIOD|TFD)_/ || $2 ~ /^KEXEC_/ || $2 ~ /^LINUX_REBOOT_CMD_/ || $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || @@ -553,6 +559,7 @@ ccflags="$@" $2 ~ /^CLONE_[A-Z_]+/ || $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ && $2 ~ /^(BPF|DLT)_/ || + $2 ~ /^AUDIT_/ || $2 ~ /^(CLOCK|TIMER)_/ || $2 ~ /^CAN_/ || $2 ~ /^CAP_/ || @@ -575,7 +582,6 @@ ccflags="$@" $2 ~ /^SEEK_/ || $2 ~ /^SPLICE_/ || $2 ~ /^SYNC_FILE_RANGE_/ || - $2 !~ /^AUDIT_RECORD_MAGIC/ && $2 !~ /IOC_MAGIC/ && $2 ~ /^[A-Z][A-Z0-9_]+_MAGIC2?$/ || $2 ~ /^(VM|VMADDR)_/ || diff --git a/vendor/golang.org/x/sys/unix/str.go b/vendor/golang.org/x/sys/unix/str.go deleted file mode 100644 index 8ba89ed86..000000000 --- a/vendor/golang.org/x/sys/unix/str.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - -package unix - -func itoa(val int) string { // do it here rather than with fmt to avoid dependency - if val < 0 { - return "-" + uitoa(uint(-val)) - } - return uitoa(uint(val)) -} - -func uitoa(val uint) string { - var buf [32]byte // big enough for int64 - i := len(buf) - 1 - for val >= 10 { - buf[i] = byte(val%10 + '0') - i-- - val /= 10 - } - buf[i] = byte(val + '0') - return string(buf[i:]) -} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index ad22c33db..2db1b51e9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -217,14 +217,63 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { return } -func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { - // Recvmsg not implemented on AIX - return -1, -1, -1, ENOSYS +func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if emptyIovecs(iov) { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } + if n, err = recvmsg(fd, &msg, flags); n == -1 { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + return } -func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { - // SendmsgN not implemented on AIX - return -1, ENOSYS +func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var dummy byte + var empty bool + if len(oob) > 0 { + // send at least one normal byte + empty = emptyIovecs(iov) + if empty { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && empty { + n = 0 + } + return n, nil } func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 9c87c5f07..eda42671f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -325,27 +325,26 @@ func GetsockoptString(fd, level, opt int) (string, error) { //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) -func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { +func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) - var iov Iovec - if len(p) > 0 { - iov.Base = (*byte)(unsafe.Pointer(&p[0])) - iov.SetLen(len(p)) - } var dummy byte if len(oob) > 0 { // receive at least one normal byte - if len(p) == 0 { - iov.Base = &dummy - iov.SetLen(1) + if emptyIovecs(iov) { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } msg.Control = (*byte)(unsafe.Pointer(&oob[0])) msg.SetControllen(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = recvmsg(fd, &msg, flags); err != nil { return } @@ -356,31 +355,32 @@ func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) -func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { +func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) - var iov Iovec - if len(p) > 0 { - iov.Base = (*byte)(unsafe.Pointer(&p[0])) - iov.SetLen(len(p)) - } var dummy byte + var empty bool if len(oob) > 0 { // send at least one normal byte - if len(p) == 0 { - iov.Base = &dummy - iov.SetLen(1) + empty = emptyIovecs(iov) + if empty { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } msg.Control = (*byte)(unsafe.Pointer(&oob[0])) msg.SetControllen(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = sendmsg(fd, &msg, flags); err != nil { return 0, err } - if len(oob) > 0 && len(p) == 0 { + if len(oob) > 0 && empty { n = 0 } return n, nil diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index e5448cc93..4f87f16ea 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -393,6 +393,13 @@ func GetsockoptXucred(fd, level, opt int) (*Xucred, error) { return x, err } +func GetsockoptTCPConnectionInfo(fd, level, opt int) (*TCPConnectionInfo, error) { + var value TCPConnectionInfo + vallen := _Socklen(SizeofTCPConnectionInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + func SysctlKinfoProc(name string, args ...int) (*KinfoProc, error) { mib, err := sysctlmib(name, args...) if err != nil { diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index 6f6c510f4..de7c23e06 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -17,25 +17,12 @@ import ( "unsafe" ) -const ( - SYS_FSTAT_FREEBSD12 = 551 // { int fstat(int fd, _Out_ struct stat *sb); } - SYS_FSTATAT_FREEBSD12 = 552 // { int fstatat(int fd, _In_z_ char *path, \ - SYS_GETDIRENTRIES_FREEBSD12 = 554 // { ssize_t getdirentries(int fd, \ - SYS_STATFS_FREEBSD12 = 555 // { int statfs(_In_z_ char *path, \ - SYS_FSTATFS_FREEBSD12 = 556 // { int fstatfs(int fd, \ - SYS_GETFSSTAT_FREEBSD12 = 557 // { int getfsstat( \ - SYS_MKNODAT_FREEBSD12 = 559 // { int mknodat(int fd, _In_z_ char *path, \ -) - // See https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/versions.html. var ( osreldateOnce sync.Once osreldate uint32 ) -// INO64_FIRST from /usr/src/lib/libc/sys/compat-ino64.h -const _ino64First = 1200031 - func supportsABI(ver uint32) bool { osreldateOnce.Do(func() { osreldate, _ = SysctlUint32("kern.osreldate") }) return osreldate >= ver @@ -159,38 +146,18 @@ func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { var ( - _p0 unsafe.Pointer - bufsize uintptr - oldBuf []statfs_freebsd11_t - needsConvert bool + _p0 unsafe.Pointer + bufsize uintptr ) - if len(buf) > 0 { - if supportsABI(_ino64First) { - _p0 = unsafe.Pointer(&buf[0]) - bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) - } else { - n := len(buf) - oldBuf = make([]statfs_freebsd11_t, n) - _p0 = unsafe.Pointer(&oldBuf[0]) - bufsize = unsafe.Sizeof(statfs_freebsd11_t{}) * uintptr(n) - needsConvert = true - } + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) } - var sysno uintptr = SYS_GETFSSTAT - if supportsABI(_ino64First) { - sysno = SYS_GETFSSTAT_FREEBSD12 - } - r0, _, e1 := Syscall(sysno, uintptr(_p0), bufsize, uintptr(flags)) + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) n = int(r0) if e1 != 0 { err = e1 } - if e1 == 0 && needsConvert { - for i := range oldBuf { - buf[i].convertFrom(&oldBuf[i]) - } - } return } @@ -245,87 +212,11 @@ func Uname(uname *Utsname) error { } func Stat(path string, st *Stat_t) (err error) { - var oldStat stat_freebsd11_t - if supportsABI(_ino64First) { - return fstatat_freebsd12(AT_FDCWD, path, st, 0) - } - err = stat(path, &oldStat) - if err != nil { - return err - } - - st.convertFrom(&oldStat) - return nil + return Fstatat(AT_FDCWD, path, st, 0) } func Lstat(path string, st *Stat_t) (err error) { - var oldStat stat_freebsd11_t - if supportsABI(_ino64First) { - return fstatat_freebsd12(AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW) - } - err = lstat(path, &oldStat) - if err != nil { - return err - } - - st.convertFrom(&oldStat) - return nil -} - -func Fstat(fd int, st *Stat_t) (err error) { - var oldStat stat_freebsd11_t - if supportsABI(_ino64First) { - return fstat_freebsd12(fd, st) - } - err = fstat(fd, &oldStat) - if err != nil { - return err - } - - st.convertFrom(&oldStat) - return nil -} - -func Fstatat(fd int, path string, st *Stat_t, flags int) (err error) { - var oldStat stat_freebsd11_t - if supportsABI(_ino64First) { - return fstatat_freebsd12(fd, path, st, flags) - } - err = fstatat(fd, path, &oldStat, flags) - if err != nil { - return err - } - - st.convertFrom(&oldStat) - return nil -} - -func Statfs(path string, st *Statfs_t) (err error) { - var oldStatfs statfs_freebsd11_t - if supportsABI(_ino64First) { - return statfs_freebsd12(path, st) - } - err = statfs(path, &oldStatfs) - if err != nil { - return err - } - - st.convertFrom(&oldStatfs) - return nil -} - -func Fstatfs(fd int, st *Statfs_t) (err error) { - var oldStatfs statfs_freebsd11_t - if supportsABI(_ino64First) { - return fstatfs_freebsd12(fd, st) - } - err = fstatfs(fd, &oldStatfs) - if err != nil { - return err - } - - st.convertFrom(&oldStatfs) - return nil + return Fstatat(AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW) } func Getdents(fd int, buf []byte) (n int, err error) { @@ -333,162 +224,25 @@ func Getdents(fd int, buf []byte) (n int, err error) { } func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - if supportsABI(_ino64First) { - if basep == nil || unsafe.Sizeof(*basep) == 8 { - return getdirentries_freebsd12(fd, buf, (*uint64)(unsafe.Pointer(basep))) - } - // The freebsd12 syscall needs a 64-bit base. On 32-bit machines - // we can't just use the basep passed in. See #32498. - var base uint64 = uint64(*basep) - n, err = getdirentries_freebsd12(fd, buf, &base) - *basep = uintptr(base) - if base>>32 != 0 { - // We can't stuff the base back into a uintptr, so any - // future calls would be suspect. Generate an error. - // EIO is allowed by getdirentries. - err = EIO - } - return - } - - // The old syscall entries are smaller than the new. Use 1/4 of the original - // buffer size rounded up to DIRBLKSIZ (see /usr/src/lib/libc/sys/getdirentries.c). - oldBufLen := roundup(len(buf)/4, _dirblksiz) - oldBuf := make([]byte, oldBufLen) - n, err = getdirentries(fd, oldBuf, basep) - if err == nil && n > 0 { - n = convertFromDirents11(buf, oldBuf[:n]) + if basep == nil || unsafe.Sizeof(*basep) == 8 { + return getdirentries(fd, buf, (*uint64)(unsafe.Pointer(basep))) + } + // The syscall needs a 64-bit base. On 32-bit machines + // we can't just use the basep passed in. See #32498. + var base uint64 = uint64(*basep) + n, err = getdirentries(fd, buf, &base) + *basep = uintptr(base) + if base>>32 != 0 { + // We can't stuff the base back into a uintptr, so any + // future calls would be suspect. Generate an error. + // EIO is allowed by getdirentries. + err = EIO } return } func Mknod(path string, mode uint32, dev uint64) (err error) { - var oldDev int - if supportsABI(_ino64First) { - return mknodat_freebsd12(AT_FDCWD, path, mode, dev) - } - oldDev = int(dev) - return mknod(path, mode, oldDev) -} - -func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { - var oldDev int - if supportsABI(_ino64First) { - return mknodat_freebsd12(fd, path, mode, dev) - } - oldDev = int(dev) - return mknodat(fd, path, mode, oldDev) -} - -// round x to the nearest multiple of y, larger or equal to x. -// -// from /usr/include/sys/param.h Macros for counting and rounding. -// #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -func roundup(x, y int) int { - return ((x + y - 1) / y) * y -} - -func (s *Stat_t) convertFrom(old *stat_freebsd11_t) { - *s = Stat_t{ - Dev: uint64(old.Dev), - Ino: uint64(old.Ino), - Nlink: uint64(old.Nlink), - Mode: old.Mode, - Uid: old.Uid, - Gid: old.Gid, - Rdev: uint64(old.Rdev), - Atim: old.Atim, - Mtim: old.Mtim, - Ctim: old.Ctim, - Btim: old.Btim, - Size: old.Size, - Blocks: old.Blocks, - Blksize: old.Blksize, - Flags: old.Flags, - Gen: uint64(old.Gen), - } -} - -func (s *Statfs_t) convertFrom(old *statfs_freebsd11_t) { - *s = Statfs_t{ - Version: _statfsVersion, - Type: old.Type, - Flags: old.Flags, - Bsize: old.Bsize, - Iosize: old.Iosize, - Blocks: old.Blocks, - Bfree: old.Bfree, - Bavail: old.Bavail, - Files: old.Files, - Ffree: old.Ffree, - Syncwrites: old.Syncwrites, - Asyncwrites: old.Asyncwrites, - Syncreads: old.Syncreads, - Asyncreads: old.Asyncreads, - // Spare - Namemax: old.Namemax, - Owner: old.Owner, - Fsid: old.Fsid, - // Charspare - // Fstypename - // Mntfromname - // Mntonname - } - - sl := old.Fstypename[:] - n := clen(*(*[]byte)(unsafe.Pointer(&sl))) - copy(s.Fstypename[:], old.Fstypename[:n]) - - sl = old.Mntfromname[:] - n = clen(*(*[]byte)(unsafe.Pointer(&sl))) - copy(s.Mntfromname[:], old.Mntfromname[:n]) - - sl = old.Mntonname[:] - n = clen(*(*[]byte)(unsafe.Pointer(&sl))) - copy(s.Mntonname[:], old.Mntonname[:n]) -} - -func convertFromDirents11(buf []byte, old []byte) int { - const ( - fixedSize = int(unsafe.Offsetof(Dirent{}.Name)) - oldFixedSize = int(unsafe.Offsetof(dirent_freebsd11{}.Name)) - ) - - dstPos := 0 - srcPos := 0 - for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) { - var dstDirent Dirent - var srcDirent dirent_freebsd11 - - // If multiple direntries are written, sometimes when we reach the final one, - // we may have cap of old less than size of dirent_freebsd11. - copy((*[unsafe.Sizeof(srcDirent)]byte)(unsafe.Pointer(&srcDirent))[:], old[srcPos:]) - - reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8) - if dstPos+reclen > len(buf) { - break - } - - dstDirent.Fileno = uint64(srcDirent.Fileno) - dstDirent.Off = 0 - dstDirent.Reclen = uint16(reclen) - dstDirent.Type = srcDirent.Type - dstDirent.Pad0 = 0 - dstDirent.Namlen = uint16(srcDirent.Namlen) - dstDirent.Pad1 = 0 - - copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen]) - copy(buf[dstPos:], (*[unsafe.Sizeof(dstDirent)]byte)(unsafe.Pointer(&dstDirent))[:]) - padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen] - for i := range padding { - padding[i] = 0 - } - - dstPos += int(dstDirent.Reclen) - srcPos += int(srcDirent.Reclen) - } - - return dstPos + return Mknodat(AT_FDCWD, path, mode, dev) } func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { @@ -501,31 +255,31 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys ptrace(request int, pid int, addr uintptr, data int) (err error) func PtraceAttach(pid int) (err error) { - return ptrace(PTRACE_ATTACH, pid, 0, 0) + return ptrace(PT_ATTACH, pid, 0, 0) } func PtraceCont(pid int, signal int) (err error) { - return ptrace(PTRACE_CONT, pid, 1, signal) + return ptrace(PT_CONTINUE, pid, 1, signal) } func PtraceDetach(pid int) (err error) { - return ptrace(PTRACE_DETACH, pid, 1, 0) + return ptrace(PT_DETACH, pid, 1, 0) } func PtraceGetFpRegs(pid int, fpregsout *FpReg) (err error) { - return ptrace(PTRACE_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0) + return ptrace(PT_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0) } func PtraceGetRegs(pid int, regsout *Reg) (err error) { - return ptrace(PTRACE_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0) + return ptrace(PT_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0) } func PtraceLwpEvents(pid int, enable int) (err error) { - return ptrace(PTRACE_LWPEVENTS, pid, 0, enable) + return ptrace(PT_LWP_EVENTS, pid, 0, enable) } func PtraceLwpInfo(pid int, info uintptr) (err error) { - return ptrace(PTRACE_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{}))) + return ptrace(PT_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{}))) } func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { @@ -545,11 +299,11 @@ func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { } func PtraceSetRegs(pid int, regs *Reg) (err error) { - return ptrace(PTRACE_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0) + return ptrace(PT_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0) } func PtraceSingleStep(pid int) (err error) { - return ptrace(PTRACE_SINGLESTEP, pid, 1, 0) + return ptrace(PT_STEP, pid, 1, 0) } /* @@ -591,16 +345,12 @@ func PtraceSingleStep(pid int) (err error) { //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) -//sys fstat(fd int, stat *stat_freebsd11_t) (err error) -//sys fstat_freebsd12(fd int, stat *Stat_t) (err error) -//sys fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) -//sys fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) -//sys fstatfs(fd int, stat *statfs_freebsd11_t) (err error) -//sys fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) -//sys getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) -//sys getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) +//sys getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) //sys Getdtablesize() (size int) //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) @@ -622,13 +372,10 @@ func PtraceSingleStep(pid int) (err error) { //sys Link(path string, link string) (err error) //sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) //sys Listen(s int, backlog int) (err error) -//sys lstat(path string, stat *stat_freebsd11_t) (err error) //sys Mkdir(path string, mode uint32) (err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) -//sys mknod(path string, mode uint32, dev int) (err error) -//sys mknodat(fd int, path string, mode uint32, dev int) (err error) -//sys mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) +//sys Mknodat(fd int, path string, mode uint32, dev uint64) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) @@ -658,9 +405,7 @@ func PtraceSingleStep(pid int) (err error) { //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) -//sys stat(path string, stat *stat_freebsd11_t) (err error) -//sys statfs(path string, stat *statfs_freebsd11_t) (err error) -//sys statfs_freebsd12(path string, stat *Statfs_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) //sys Symlink(path string, link string) (err error) //sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) //sys Sync() (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go index 342fc32b1..c3c4c698e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -57,11 +57,11 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) func PtraceGetFsBase(pid int, fsbase *int64) (err error) { - return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) + return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) } func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)} - err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) return int(ioDesc.Len), err } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go index a32d5aa4a..82be61a2f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -57,11 +57,11 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) func PtraceGetFsBase(pid int, fsbase *int64) (err error) { - return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) + return ptrace(PT_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) } func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)} - err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) return int(ioDesc.Len), err } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go index 1e36d39ab..cd58f1026 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -58,6 +58,6 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)} - err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) return int(ioDesc.Len), err } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go index a09a1537b..d6f538f9e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go @@ -58,6 +58,6 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)} - err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) return int(ioDesc.Len), err } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go new file mode 100644 index 000000000..8ea6e9610 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go @@ -0,0 +1,63 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build riscv64 && freebsd +// +build riscv64,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (msghdr *Msghdr) SetIovlen(length int) { + msghdr.Iovlen = int32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { + ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)} + err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + return int(ioDesc.Len), err +} diff --git a/vendor/golang.org/x/sys/unix/syscall_illumos.go b/vendor/golang.org/x/sys/unix/syscall_illumos.go index 8d5f294c4..e48244a9c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_illumos.go +++ b/vendor/golang.org/x/sys/unix/syscall_illumos.go @@ -20,10 +20,9 @@ func bytes2iovec(bs [][]byte) []Iovec { for i, b := range bs { iovecs[i].SetLen(len(b)) if len(b) > 0 { - // somehow Iovec.Base on illumos is (*int8), not (*byte) - iovecs[i].Base = (*int8)(unsafe.Pointer(&b[0])) + iovecs[i].Base = &b[0] } else { - iovecs[i].Base = (*int8)(unsafe.Pointer(&_zero)) + iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero)) } } return iovecs diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index c8d203212..eecb58d74 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -13,6 +13,7 @@ package unix import ( "encoding/binary" + "strconv" "syscall" "time" "unsafe" @@ -233,7 +234,7 @@ func Futimesat(dirfd int, path string, tv []Timeval) error { func Futimes(fd int, tv []Timeval) (err error) { // Believe it or not, this is the best we can do on Linux // (and is what glibc does). - return Utimes("/proc/self/fd/"+itoa(fd), tv) + return Utimes("/proc/self/fd/"+strconv.Itoa(fd), tv) } const ImplementsGetwd = true @@ -1499,18 +1500,13 @@ func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error //sys keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL //sys keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL -func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { +func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) - var iov Iovec - if len(p) > 0 { - iov.Base = &p[0] - iov.SetLen(len(p)) - } var dummy byte if len(oob) > 0 { - if len(p) == 0 { + if emptyIovecs(iov) { var sockType int sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) if err != nil { @@ -1518,15 +1514,19 @@ func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn } // receive at least one normal byte if sockType != SOCK_DGRAM { - iov.Base = &dummy - iov.SetLen(1) + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } } msg.Control = &oob[0] msg.SetControllen(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = recvmsg(fd, &msg, flags); err != nil { return } @@ -1535,18 +1535,15 @@ func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn return } -func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { +func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(ptr) msg.Namelen = uint32(salen) - var iov Iovec - if len(p) > 0 { - iov.Base = &p[0] - iov.SetLen(len(p)) - } var dummy byte + var empty bool if len(oob) > 0 { - if len(p) == 0 { + empty = emptyIovecs(iov) + if empty { var sockType int sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) if err != nil { @@ -1554,19 +1551,22 @@ func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags i } // send at least one normal byte if sockType != SOCK_DGRAM { - iov.Base = &dummy - iov.SetLen(1) + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) } } msg.Control = &oob[0] msg.SetControllen(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = sendmsg(fd, &msg, flags); err != nil { return 0, err } - if len(oob) > 0 && len(p) == 0 { + if len(oob) > 0 && empty { n = 0 } return n, nil diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index 28ba7b8cb..0b69c3eff 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -12,8 +12,6 @@ import "unsafe" //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) -//sys Fstat(fd int, stat *Stat_t) (err error) -//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) @@ -43,6 +41,43 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +func timespecFromStatxTimestamp(x StatxTimestamp) Timespec { + return Timespec{ + Sec: x.Sec, + Nsec: int64(x.Nsec), + } +} + +func Fstatat(fd int, path string, stat *Stat_t, flags int) error { + var r Statx_t + // Do it the glibc way, add AT_NO_AUTOMOUNT. + if err := Statx(fd, path, AT_NO_AUTOMOUNT|flags, STATX_BASIC_STATS, &r); err != nil { + return err + } + + stat.Dev = Mkdev(r.Dev_major, r.Dev_minor) + stat.Ino = r.Ino + stat.Mode = uint32(r.Mode) + stat.Nlink = r.Nlink + stat.Uid = r.Uid + stat.Gid = r.Gid + stat.Rdev = Mkdev(r.Rdev_major, r.Rdev_minor) + // hope we don't get to process files so large to overflow these size + // fields... + stat.Size = int64(r.Size) + stat.Blksize = int32(r.Blksize) + stat.Blocks = int64(r.Blocks) + stat.Atim = timespecFromStatxTimestamp(r.Atime) + stat.Mtim = timespecFromStatxTimestamp(r.Mtime) + stat.Ctim = timespecFromStatxTimestamp(r.Ctime) + + return nil +} + +func Fstat(fd int, stat *Stat_t) (err error) { + return Fstatat(fd, "", stat, AT_EMPTY_PATH) +} + func Stat(path string, stat *Stat_t) (err error) { return Fstatat(AT_FDCWD, path, stat, 0) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 8ff7adba0..925a748a3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -22,6 +22,7 @@ import "unsafe" //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sys Listen(s int, n int) (err error) +//sys MemfdSecret(flags int) (fd int, err error) //sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go new file mode 100644 index 000000000..5930a8972 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go @@ -0,0 +1,27 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (openbsd && 386) || (openbsd && amd64) || (openbsd && arm) || (openbsd && arm64) +// +build openbsd,386 openbsd,amd64 openbsd,arm openbsd,arm64 + +package unix + +import _ "unsafe" + +// Implemented in the runtime package (runtime/sys_openbsd3.go) +func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscall_syscall10(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 uintptr) (r1, r2 uintptr, err Errno) +func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) + +//go:linkname syscall_syscall syscall.syscall +//go:linkname syscall_syscall6 syscall.syscall6 +//go:linkname syscall_syscall10 syscall.syscall10 +//go:linkname syscall_rawSyscall syscall.rawSyscall +//go:linkname syscall_rawSyscall6 syscall.rawSyscall6 + +func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) { + return syscall_syscall10(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, 0) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go index 30f285343..1378489f8 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go @@ -26,6 +26,10 @@ func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } +func (msghdr *Msghdr) SetIovlen(length int) { + msghdr.Iovlen = uint32(length) +} + func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index 932996c75..03fa546ec 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -451,26 +451,25 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg -func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { +func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) - var iov Iovec - if len(p) > 0 { - iov.Base = (*int8)(unsafe.Pointer(&p[0])) - iov.SetLen(len(p)) - } - var dummy int8 + var dummy byte if len(oob) > 0 { // receive at least one normal byte - if len(p) == 0 { - iov.Base = &dummy - iov.SetLen(1) + if emptyIovecs(iov) { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } msg.Accrightslen = int32(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = recvmsg(fd, &msg, flags); n == -1 { return } @@ -480,30 +479,31 @@ func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg -func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { +func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) - var iov Iovec - if len(p) > 0 { - iov.Base = (*int8)(unsafe.Pointer(&p[0])) - iov.SetLen(len(p)) - } - var dummy int8 + var dummy byte + var empty bool if len(oob) > 0 { // send at least one normal byte - if len(p) == 0 { - iov.Base = &dummy - iov.SetLen(1) + empty = emptyIovecs(iov) + if empty { + var iova [1]Iovec + iova[0].Base = &dummy + iova[0].SetLen(1) + iov = iova[:] } msg.Accrightslen = int32(len(oob)) } - msg.Iov = &iov - msg.Iovlen = 1 + if len(iov) > 0 { + msg.Iov = &iov[0] + msg.SetIovlen(len(iov)) + } if n, err = sendmsg(fd, &msg, flags); err != nil { return 0, err } - if len(oob) > 0 && len(p) == 0 { + if len(oob) > 0 && empty { n = 0 } return n, nil @@ -956,7 +956,7 @@ func (e *EventPort) peIntToExt(peInt *portEvent, peExt *PortEvent) { // the unsafe version would be (*fileObj)(unsafe.Pointer(uintptr(peInt.Object))) peExt.fobj = fCookie.fobj } else { - panic("mismanaged memory") + panic("unexpected event port address; may be due to kernel bug; see https://go.dev/issue/54254") } delete(e.cookies, cookie) peExt.Path = BytePtrToString((*byte)(unsafe.Pointer(peExt.fobj.Name))) diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index 70508afc1..1ff5060b5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -338,8 +338,13 @@ func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { } func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var iov [1]Iovec + if len(p) > 0 { + iov[0].Base = &p[0] + iov[0].SetLen(len(p)) + } var rsa RawSockaddrAny - n, oobn, recvflags, err = recvmsgRaw(fd, p, oob, flags, &rsa) + n, oobn, recvflags, err = recvmsgRaw(fd, iov[:], oob, flags, &rsa) // source address is only specified if the socket is unconnected if rsa.Addr.Family != AF_UNSPEC { from, err = anyToSockaddr(fd, &rsa) @@ -347,12 +352,67 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from return } +// RecvmsgBuffers receives a message from a socket using the recvmsg +// system call. The flags are passed to recvmsg. Any non-control data +// read is scattered into the buffers slices. The results are: +// - n is the number of non-control data read into bufs +// - oobn is the number of control data read into oob; this may be interpreted using [ParseSocketControlMessage] +// - recvflags is flags returned by recvmsg +// - from is the address of the sender +func RecvmsgBuffers(fd int, buffers [][]byte, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + iov := make([]Iovec, len(buffers)) + for i := range buffers { + if len(buffers[i]) > 0 { + iov[i].Base = &buffers[i][0] + iov[i].SetLen(len(buffers[i])) + } else { + iov[i].Base = (*byte)(unsafe.Pointer(&_zero)) + } + } + var rsa RawSockaddrAny + n, oobn, recvflags, err = recvmsgRaw(fd, iov, oob, flags, &rsa) + if err == nil && rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { _, err = SendmsgN(fd, p, oob, to, flags) return } func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var iov [1]Iovec + if len(p) > 0 { + iov[0].Base = &p[0] + iov[0].SetLen(len(p)) + } + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + return sendmsgN(fd, iov[:], oob, ptr, salen, flags) +} + +// SendmsgBuffers sends a message on a socket to an address using the sendmsg +// system call. The flags are passed to sendmsg. Any non-control data written +// is gathered from buffers. The function returns the number of bytes written +// to the socket. +func SendmsgBuffers(fd int, buffers [][]byte, oob []byte, to Sockaddr, flags int) (n int, err error) { + iov := make([]Iovec, len(buffers)) + for i := range buffers { + if len(buffers[i]) > 0 { + iov[i].Base = &buffers[i][0] + iov[i].SetLen(len(buffers[i])) + } else { + iov[i].Base = (*byte)(unsafe.Pointer(&_zero)) + } + } var ptr unsafe.Pointer var salen _Socklen if to != nil { @@ -361,7 +421,7 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) return 0, err } } - return sendmsgN(fd, p, oob, ptr, salen, flags) + return sendmsgN(fd, iov, oob, ptr, salen, flags) } func Send(s int, buf []byte, flags int) (err error) { @@ -484,3 +544,13 @@ func Lutimes(path string, tv []Timeval) error { } return UtimesNanoAt(AT_FDCWD, path, ts, AT_SYMLINK_NOFOLLOW) } + +// emptyIovec reports whether there are no bytes in the slice of Iovec. +func emptyIovecs(iov []Iovec) bool { + for i := range iov { + if iov[i].Len > 0 { + return false + } + } + return true +} diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go index 440900112..f8c2c5138 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -151,6 +151,7 @@ const ( BIOCSETF = 0x80084267 BIOCSETFNR = 0x80084282 BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 BIOCSETWF = 0x8008427b BIOCSETZBUF = 0x800c4281 BIOCSHDRCMPLT = 0x80044275 @@ -447,7 +448,7 @@ const ( DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 + DLT_IPMB_KONTRON = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 @@ -487,10 +488,11 @@ const ( DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 DLT_LOOP = 0x6c DLT_LORATAP = 0x10e DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x113 + DLT_MATCHING_MAX = 0x114 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -734,6 +736,7 @@ const ( IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 @@ -814,7 +817,6 @@ const ( IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff @@ -911,6 +913,7 @@ const ( IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 @@ -989,8 +992,12 @@ const ( IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b ISIG = 0x80 ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 @@ -1000,7 +1007,6 @@ const ( KERN_VERSION = 0x4 LOCAL_CONNWAIT = 0x4 LOCAL_CREDS = 0x2 - LOCAL_CREDS_PERSISTENT = 0x3 LOCAL_PEERCRED = 0x1 LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 @@ -1179,6 +1185,8 @@ const ( O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 @@ -1189,6 +1197,10 @@ const ( PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1196,6 +1208,60 @@ const ( PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETFSBASE = 0x47 + PT_GETGSBASE = 0x49 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GETXMMREGS = 0x40 + PT_GETXSTATE = 0x45 + PT_GETXSTATE_INFO = 0x44 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETFSBASE = 0x48 + PT_SETGSBASE = 0x4a + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SETXMMREGS = 0x41 + PT_SETXSTATE = 0x46 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1320,10 +1386,12 @@ const ( SIOCGHWADDR = 0xc020693e SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0086924 SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 @@ -1414,6 +1482,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSEPORT_LB = 0x10000 @@ -1472,22 +1541,40 @@ const ( TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b TCP_BBR_DRAIN_INC_EXTRA = 0x43c TCP_BBR_DRAIN_PG = 0x42e TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 TCP_BBR_IWINTSO = 0x42b TCP_BBR_LOWGAIN_FD = 0x436 TCP_BBR_LOWGAIN_HALF = 0x435 TCP_BBR_LOWGAIN_THRESH = 0x434 TCP_BBR_MAX_RTO = 0x439 TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 TCP_BBR_ONE_RETRAN = 0x431 TCP_BBR_PACE_CROSS = 0x442 TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 TCP_BBR_PACE_PER_SEC = 0x43e TCP_BBR_PACE_SEG_MAX = 0x440 TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 TCP_BBR_PROBE_RTT_GAIN = 0x44d TCP_BBR_PROBE_RTT_INT = 0x430 TCP_BBR_PROBE_RTT_LEN = 0x44e @@ -1496,12 +1583,18 @@ const ( TCP_BBR_REC_OVER_HPTS = 0x43a TCP_BBR_RETRAN_WTSO = 0x44b TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d TCP_BBR_STARTUP_LOSS_EXIT = 0x432 TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 TCP_BBR_UNLIMITED = 0x43b TCP_BBR_USEDEL_RATE = 0x437 TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 @@ -1541,6 +1634,7 @@ const ( TCP_PCAP_OUT = 0x800 TCP_RACK_EARLY_RECOV = 0x423 TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_GP_INCREASE = 0x446 TCP_RACK_IDLE_REDUCE_HIGH = 0x444 TCP_RACK_MIN_PACE = 0x445 TCP_RACK_MIN_PACE_SEG = 0x446 @@ -1554,7 +1648,6 @@ const ( TCP_RACK_PRR_SENDALOT = 0x421 TCP_RACK_REORD_FADE = 0x426 TCP_RACK_REORD_THRESH = 0x425 - TCP_RACK_SESS_CWV = 0x42a TCP_RACK_TLP_INC_VAR = 0x429 TCP_RACK_TLP_REDUCE = 0x41c TCP_RACK_TLP_THRESH = 0x427 @@ -1694,12 +1787,13 @@ const ( EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) - ELAST = syscall.Errno(0x60) + ELAST = syscall.Errno(0x61) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) @@ -1842,7 +1936,7 @@ var errorList = [...]struct { {32, "EPIPE", "broken pipe"}, {33, "EDOM", "numerical argument out of domain"}, {34, "ERANGE", "result too large"}, - {35, "EAGAIN", "resource temporarily unavailable"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, {36, "EINPROGRESS", "operation now in progress"}, {37, "EALREADY", "operation already in progress"}, {38, "ENOTSOCK", "socket operation on non-socket"}, @@ -1904,6 +1998,7 @@ var errorList = [...]struct { {94, "ECAPMODE", "not permitted in capability mode"}, {95, "ENOTRECOVERABLE", "state not recoverable"}, {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go index 64520d312..96310c3be 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -151,6 +151,7 @@ const ( BIOCSETF = 0x80104267 BIOCSETFNR = 0x80104282 BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 BIOCSETWF = 0x8010427b BIOCSETZBUF = 0x80184281 BIOCSHDRCMPLT = 0x80044275 @@ -447,7 +448,7 @@ const ( DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 + DLT_IPMB_KONTRON = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 @@ -487,10 +488,11 @@ const ( DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 DLT_LOOP = 0x6c DLT_LORATAP = 0x10e DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x113 + DLT_MATCHING_MAX = 0x114 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -734,6 +736,7 @@ const ( IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 @@ -814,7 +817,6 @@ const ( IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff @@ -911,6 +913,7 @@ const ( IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 @@ -989,8 +992,12 @@ const ( IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b ISIG = 0x80 ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 @@ -1000,7 +1007,6 @@ const ( KERN_VERSION = 0x4 LOCAL_CONNWAIT = 0x4 LOCAL_CREDS = 0x2 - LOCAL_CREDS_PERSISTENT = 0x3 LOCAL_PEERCRED = 0x1 LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 @@ -1180,6 +1186,8 @@ const ( O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 @@ -1190,6 +1198,10 @@ const ( PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1197,6 +1209,58 @@ const ( PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETFSBASE = 0x47 + PT_GETGSBASE = 0x49 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GETXSTATE = 0x45 + PT_GETXSTATE_INFO = 0x44 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETFSBASE = 0x48 + PT_SETGSBASE = 0x4a + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SETXSTATE = 0x46 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1321,10 +1385,12 @@ const ( SIOCGHWADDR = 0xc020693e SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0106924 SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 @@ -1415,6 +1481,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSEPORT_LB = 0x10000 @@ -1473,22 +1540,40 @@ const ( TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b TCP_BBR_DRAIN_INC_EXTRA = 0x43c TCP_BBR_DRAIN_PG = 0x42e TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 TCP_BBR_IWINTSO = 0x42b TCP_BBR_LOWGAIN_FD = 0x436 TCP_BBR_LOWGAIN_HALF = 0x435 TCP_BBR_LOWGAIN_THRESH = 0x434 TCP_BBR_MAX_RTO = 0x439 TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 TCP_BBR_ONE_RETRAN = 0x431 TCP_BBR_PACE_CROSS = 0x442 TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 TCP_BBR_PACE_PER_SEC = 0x43e TCP_BBR_PACE_SEG_MAX = 0x440 TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 TCP_BBR_PROBE_RTT_GAIN = 0x44d TCP_BBR_PROBE_RTT_INT = 0x430 TCP_BBR_PROBE_RTT_LEN = 0x44e @@ -1497,12 +1582,18 @@ const ( TCP_BBR_REC_OVER_HPTS = 0x43a TCP_BBR_RETRAN_WTSO = 0x44b TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d TCP_BBR_STARTUP_LOSS_EXIT = 0x432 TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 TCP_BBR_UNLIMITED = 0x43b TCP_BBR_USEDEL_RATE = 0x437 TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 @@ -1542,6 +1633,7 @@ const ( TCP_PCAP_OUT = 0x800 TCP_RACK_EARLY_RECOV = 0x423 TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_GP_INCREASE = 0x446 TCP_RACK_IDLE_REDUCE_HIGH = 0x444 TCP_RACK_MIN_PACE = 0x445 TCP_RACK_MIN_PACE_SEG = 0x446 @@ -1555,7 +1647,6 @@ const ( TCP_RACK_PRR_SENDALOT = 0x421 TCP_RACK_REORD_FADE = 0x426 TCP_RACK_REORD_THRESH = 0x425 - TCP_RACK_SESS_CWV = 0x42a TCP_RACK_TLP_INC_VAR = 0x429 TCP_RACK_TLP_REDUCE = 0x41c TCP_RACK_TLP_THRESH = 0x427 @@ -1693,12 +1784,13 @@ const ( EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) - ELAST = syscall.Errno(0x60) + ELAST = syscall.Errno(0x61) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) @@ -1841,7 +1933,7 @@ var errorList = [...]struct { {32, "EPIPE", "broken pipe"}, {33, "EDOM", "numerical argument out of domain"}, {34, "ERANGE", "result too large"}, - {35, "EAGAIN", "resource temporarily unavailable"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, {36, "EINPROGRESS", "operation now in progress"}, {37, "EALREADY", "operation already in progress"}, {38, "ENOTSOCK", "socket operation on non-socket"}, @@ -1903,6 +1995,7 @@ var errorList = [...]struct { {94, "ECAPMODE", "not permitted in capability mode"}, {95, "ENOTRECOVERABLE", "state not recoverable"}, {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go index 99e9a0e06..777b69def 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -151,6 +151,7 @@ const ( BIOCSETF = 0x80084267 BIOCSETFNR = 0x80084282 BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 BIOCSETWF = 0x8008427b BIOCSETZBUF = 0x800c4281 BIOCSHDRCMPLT = 0x80044275 @@ -362,7 +363,7 @@ const ( CTL_KERN = 0x1 CTL_MAXNAME = 0x18 CTL_NET = 0x4 - DIOCGATTR = 0xc144648e + DIOCGATTR = 0xc148648e DIOCGDELETE = 0x80106488 DIOCGFLUSH = 0x20006487 DIOCGFRONTSTUFF = 0x40086486 @@ -377,7 +378,7 @@ const ( DIOCGSTRIPESIZE = 0x4008648b DIOCSKERNELDUMP = 0x804c6490 DIOCSKERNELDUMP_FREEBSD11 = 0x80046485 - DIOCZONECMD = 0xc06c648f + DIOCZONECMD = 0xc078648f DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 @@ -407,7 +408,9 @@ const ( DLT_C_HDLC_WITH_DIR = 0xcd DLT_DBUS = 0xe7 DLT_DECT = 0xdd + DLT_DISPLAYPORT_AUX = 0x113 DLT_DOCSIS = 0x8f + DLT_DOCSIS31_XRA31 = 0x111 DLT_DVB_CI = 0xeb DLT_ECONET = 0x73 DLT_EN10MB = 0x1 @@ -417,6 +420,7 @@ const ( DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 + DLT_ETHERNET_MPACKET = 0x112 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa @@ -444,7 +448,7 @@ const ( DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 + DLT_IPMB_KONTRON = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 @@ -484,9 +488,11 @@ const ( DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 DLT_LOOP = 0x6c + DLT_LORATAP = 0x10e DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x109 + DLT_MATCHING_MAX = 0x114 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -502,7 +508,9 @@ const ( DLT_NFC_LLCP = 0xf5 DLT_NFLOG = 0xef DLT_NG40 = 0xf4 + DLT_NORDIC_BLE = 0x110 DLT_NULL = 0x0 + DLT_OPENFLOW = 0x10b DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x79 @@ -526,15 +534,18 @@ const ( DLT_RTAC_SERIAL = 0xfa DLT_SCCP = 0x8e DLT_SCTP = 0xf8 + DLT_SDLC = 0x10c DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xd DLT_STANAG_5066_D_PDU = 0xed DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TI_LLN_SNIFFER = 0x10d DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USBPCAP = 0xf9 + DLT_USB_DARWIN = 0x10a DLT_USB_FREEBSD = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc @@ -554,6 +565,7 @@ const ( DLT_USER7 = 0x9a DLT_USER8 = 0x9b DLT_USER9 = 0x9c + DLT_VSOCK = 0x10f DLT_WATTSTOPPER_DLM = 0x107 DLT_WIHART = 0xdf DLT_WIRESHARK_UPPER_PDU = 0xfc @@ -578,6 +590,7 @@ const ( ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 + EVFILT_EMPTY = -0xd EVFILT_FS = -0x9 EVFILT_LIO = -0xa EVFILT_PROC = -0x5 @@ -585,11 +598,12 @@ const ( EVFILT_READ = -0x1 EVFILT_SENDFILE = -0xc EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xc + EVFILT_SYSCOUNT = 0xd EVFILT_TIMER = -0x7 EVFILT_USER = -0xb EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 + EVNAMEMAP_NAME_SIZE = 0x40 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 @@ -606,6 +620,7 @@ const ( EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 + EXTATTR_MAXNAMELEN = 0xff EXTATTR_NAMESPACE_EMPTY = 0x0 EXTATTR_NAMESPACE_SYSTEM = 0x2 EXTATTR_NAMESPACE_USER = 0x1 @@ -647,6 +662,7 @@ const ( IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 + IFCAP_WOL_MAGIC = 0x2000 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 @@ -663,6 +679,7 @@ const ( IFF_MONITOR = 0x40000 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 + IFF_NOGROUP = 0x800000 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PPROMISC = 0x20000 @@ -719,6 +736,7 @@ const ( IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 @@ -799,7 +817,6 @@ const ( IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff @@ -837,6 +854,7 @@ const ( IPV6_DSTOPTS = 0x32 IPV6_FLOWID = 0x43 IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_LEN = 0x14 IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FLOWTYPE = 0x44 IPV6_FRAGTTL = 0x78 @@ -857,13 +875,13 @@ const ( IPV6_MAX_GROUP_SRC_FILTER = 0x200 IPV6_MAX_MEMBERSHIPS = 0xfff IPV6_MAX_SOCK_SRC_FILTER = 0x80 - IPV6_MIN_MEMBERSHIPS = 0x1f IPV6_MMTU = 0x500 IPV6_MSFILTER = 0x4a IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 + IPV6_ORIGDSTADDR = 0x48 IPV6_PATHMTU = 0x2c IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe @@ -875,6 +893,7 @@ const ( IPV6_RECVFLOWID = 0x46 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVORIGDSTADDR = 0x48 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRSSBUCKETID = 0x47 @@ -894,6 +913,7 @@ const ( IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 @@ -935,10 +955,8 @@ const ( IP_MAX_MEMBERSHIPS = 0xfff IP_MAX_SOCK_MUTE_FILTER = 0x80 IP_MAX_SOCK_SRC_FILTER = 0x80 - IP_MAX_SOURCE_FILTER = 0x400 IP_MF = 0x2000 IP_MINTTL = 0x42 - IP_MIN_MEMBERSHIPS = 0x1f IP_MSFILTER = 0x4a IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 @@ -948,6 +966,7 @@ const ( IP_OFFMASK = 0x1fff IP_ONESBCAST = 0x17 IP_OPTIONS = 0x1 + IP_ORIGDSTADDR = 0x1b IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 @@ -956,6 +975,7 @@ const ( IP_RECVFLOWID = 0x5d IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 + IP_RECVORIGDSTADDR = 0x1b IP_RECVRETOPTS = 0x6 IP_RECVRSSBUCKETID = 0x5e IP_RECVTOS = 0x44 @@ -972,8 +992,12 @@ const ( IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b ISIG = 0x80 ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 @@ -983,7 +1007,6 @@ const ( KERN_VERSION = 0x4 LOCAL_CONNWAIT = 0x4 LOCAL_CREDS = 0x2 - LOCAL_CREDS_PERSISTENT = 0x3 LOCAL_PEERCRED = 0x1 LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 @@ -1071,10 +1094,12 @@ const ( MNT_SUSPEND = 0x4 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 + MNT_UNTRUSTED = 0x800000000 MNT_UPDATE = 0x10000 - MNT_UPDATEMASK = 0x2d8d0807e + MNT_UPDATEMASK = 0xad8d0807e MNT_USER = 0x8000 - MNT_VISFLAGMASK = 0x3fef0ffff + MNT_VERIFIED = 0x400000000 + MNT_VISFLAGMASK = 0xffef0ffff MNT_WAIT = 0x1 MSG_CMSG_CLOEXEC = 0x40000 MSG_COMPAT = 0x8000 @@ -1103,6 +1128,7 @@ const ( NFDBITS = 0x20 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 + NOTE_ABSTIME = 0x10 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_CLOSE = 0x100 @@ -1159,6 +1185,8 @@ const ( O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 @@ -1169,6 +1197,10 @@ const ( PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1176,6 +1208,53 @@ const ( PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GETVFPREGS = 0x40 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SETVFPREGS = 0x41 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1257,7 +1336,6 @@ const ( RTV_WEIGHT = 0x100 RT_ALL_FIBS = -0x1 RT_BLACKHOLE = 0x40 - RT_CACHING_CONTEXT = 0x1 RT_DEFAULT_FIB = 0x0 RT_HAS_GW = 0x80 RT_HAS_HEADER = 0x10 @@ -1267,15 +1345,17 @@ const ( RT_LLE_CACHE = 0x100 RT_MAY_LOOP = 0x8 RT_MAY_LOOP_BIT = 0x3 - RT_NORTREF = 0x2 RT_REJECT = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_BINTIME = 0x4 SCM_CREDS = 0x3 + SCM_MONOTONIC = 0x6 + SCM_REALTIME = 0x5 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 + SCM_TIME_INFO = 0x7 SEEK_CUR = 0x1 SEEK_DATA = 0x3 SEEK_END = 0x2 @@ -1299,10 +1379,12 @@ const ( SIOCGHWADDR = 0xc020693e SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0086924 SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 @@ -1318,8 +1400,11 @@ const ( SIOCGIFPDSTADDR = 0xc0206948 SIOCGIFPHYS = 0xc0206935 SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRSSHASH = 0xc0186997 + SIOCGIFRSSKEY = 0xc0946996 SIOCGIFSTATUS = 0xc331693b SIOCGIFXMEDIA = 0xc028698b + SIOCGLANPCP = 0xc0206998 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGPRIVATE_0 = 0xc0206950 @@ -1350,6 +1435,7 @@ const ( SIOCSIFPHYS = 0x80206936 SIOCSIFRVNET = 0xc020695b SIOCSIFVNET = 0xc020695a + SIOCSLANPCP = 0x80206999 SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSTUNFIB = 0x8020695f @@ -1369,6 +1455,7 @@ const ( SO_BINTIME = 0x2000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 + SO_DOMAIN = 0x1019 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 @@ -1377,6 +1464,7 @@ const ( SO_LISTENINCQLEN = 0x1013 SO_LISTENQLEN = 0x1012 SO_LISTENQLIMIT = 0x1011 + SO_MAX_PACING_RATE = 0x1018 SO_NOSIGPIPE = 0x800 SO_NO_DDP = 0x8000 SO_NO_OFFLOAD = 0x4000 @@ -1387,13 +1475,22 @@ const ( SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 + SO_REUSEPORT_LB = 0x10000 SO_SETFIB = 0x1014 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 + SO_TS_BINTIME = 0x1 + SO_TS_CLOCK = 0x1017 + SO_TS_CLOCK_MAX = 0x3 + SO_TS_DEFAULT = 0x0 + SO_TS_MONOTONIC = 0x3 + SO_TS_REALTIME = 0x2 + SO_TS_REALTIME_MICRO = 0x0 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 SO_USER_COOKIE = 0x1015 @@ -1437,10 +1534,69 @@ const ( TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 + TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b + TCP_BBR_DRAIN_INC_EXTRA = 0x43c + TCP_BBR_DRAIN_PG = 0x42e + TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 + TCP_BBR_IWINTSO = 0x42b + TCP_BBR_LOWGAIN_FD = 0x436 + TCP_BBR_LOWGAIN_HALF = 0x435 + TCP_BBR_LOWGAIN_THRESH = 0x434 + TCP_BBR_MAX_RTO = 0x439 + TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 + TCP_BBR_ONE_RETRAN = 0x431 + TCP_BBR_PACE_CROSS = 0x442 + TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 + TCP_BBR_PACE_PER_SEC = 0x43e + TCP_BBR_PACE_SEG_MAX = 0x440 + TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 + TCP_BBR_PROBE_RTT_GAIN = 0x44d + TCP_BBR_PROBE_RTT_INT = 0x430 + TCP_BBR_PROBE_RTT_LEN = 0x44e + TCP_BBR_RACK_RTT_USE = 0x44a + TCP_BBR_RECFORCE = 0x42c + TCP_BBR_REC_OVER_HPTS = 0x43a + TCP_BBR_RETRAN_WTSO = 0x44b + TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f + TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d + TCP_BBR_STARTUP_LOSS_EXIT = 0x432 + TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 + TCP_BBR_UNLIMITED = 0x43b + TCP_BBR_USEDEL_RATE = 0x437 + TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 + TCP_DATA_AFTER_CLOSE = 0x44c + TCP_DELACK = 0x48 TCP_FASTOPEN = 0x401 + TCP_FASTOPEN_MAX_COOKIE_LEN = 0x10 + TCP_FASTOPEN_MIN_COOKIE_LEN = 0x4 + TCP_FASTOPEN_PSK_LEN = 0x10 TCP_FUNCTION_BLK = 0x2000 TCP_FUNCTION_NAME_LEN_MAX = 0x20 TCP_INFO = 0x20 @@ -1448,6 +1604,12 @@ const ( TCP_KEEPIDLE = 0x100 TCP_KEEPINIT = 0x80 TCP_KEEPINTVL = 0x200 + TCP_LOG = 0x22 + TCP_LOGBUF = 0x23 + TCP_LOGDUMP = 0x25 + TCP_LOGDUMPID = 0x26 + TCP_LOGID = 0x24 + TCP_LOG_ID_LEN = 0x40 TCP_MAXBURST = 0x4 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 @@ -1463,8 +1625,30 @@ const ( TCP_NOPUSH = 0x4 TCP_PCAP_IN = 0x1000 TCP_PCAP_OUT = 0x800 + TCP_RACK_EARLY_RECOV = 0x423 + TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_GP_INCREASE = 0x446 + TCP_RACK_IDLE_REDUCE_HIGH = 0x444 + TCP_RACK_MIN_PACE = 0x445 + TCP_RACK_MIN_PACE_SEG = 0x446 + TCP_RACK_MIN_TO = 0x422 + TCP_RACK_PACE_ALWAYS = 0x41f + TCP_RACK_PACE_MAX_SEG = 0x41e + TCP_RACK_PACE_REDUCE = 0x41d + TCP_RACK_PKT_DELAY = 0x428 + TCP_RACK_PROP = 0x41b + TCP_RACK_PROP_RATE = 0x420 + TCP_RACK_PRR_SENDALOT = 0x421 + TCP_RACK_REORD_FADE = 0x426 + TCP_RACK_REORD_THRESH = 0x425 + TCP_RACK_TLP_INC_VAR = 0x429 + TCP_RACK_TLP_REDUCE = 0x41c + TCP_RACK_TLP_THRESH = 0x427 + TCP_RACK_TLP_USE = 0x447 TCP_VENDOR = 0x80000000 TCSAFLUSH = 0x2 + TIMER_ABSTIME = 0x1 + TIMER_RELTIME = 0x0 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 @@ -1528,6 +1712,8 @@ const ( TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 + UTIME_NOW = -0x1 + UTIME_OMIT = -0x2 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 @@ -1592,12 +1778,13 @@ const ( EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) - ELAST = syscall.Errno(0x60) + ELAST = syscall.Errno(0x61) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) @@ -1740,7 +1927,7 @@ var errorList = [...]struct { {32, "EPIPE", "broken pipe"}, {33, "EDOM", "numerical argument out of domain"}, {34, "ERANGE", "result too large"}, - {35, "EAGAIN", "resource temporarily unavailable"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, {36, "EINPROGRESS", "operation now in progress"}, {37, "EALREADY", "operation already in progress"}, {38, "ENOTSOCK", "socket operation on non-socket"}, @@ -1802,6 +1989,7 @@ var errorList = [...]struct { {94, "ECAPMODE", "not permitted in capability mode"}, {95, "ENOTRECOVERABLE", "state not recoverable"}, {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go index 4c8377114..c557ac2db 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go @@ -151,6 +151,7 @@ const ( BIOCSETF = 0x80104267 BIOCSETFNR = 0x80104282 BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 BIOCSETWF = 0x8010427b BIOCSETZBUF = 0x80184281 BIOCSHDRCMPLT = 0x80044275 @@ -447,7 +448,7 @@ const ( DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 + DLT_IPMB_KONTRON = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 @@ -487,10 +488,11 @@ const ( DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 DLT_LOOP = 0x6c DLT_LORATAP = 0x10e DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x113 + DLT_MATCHING_MAX = 0x114 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -734,6 +736,7 @@ const ( IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 @@ -814,7 +817,6 @@ const ( IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 - IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff @@ -911,6 +913,7 @@ const ( IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 @@ -989,8 +992,12 @@ const ( IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b ISIG = 0x80 ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 @@ -1000,7 +1007,6 @@ const ( KERN_VERSION = 0x4 LOCAL_CONNWAIT = 0x4 LOCAL_CREDS = 0x2 - LOCAL_CREDS_PERSISTENT = 0x3 LOCAL_PEERCRED = 0x1 LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 @@ -1180,6 +1186,8 @@ const ( O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 @@ -1190,6 +1198,10 @@ const ( PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1197,6 +1209,51 @@ const ( PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1321,10 +1378,12 @@ const ( SIOCGHWADDR = 0xc020693e SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0106924 SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 @@ -1415,6 +1474,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSEPORT_LB = 0x10000 @@ -1473,22 +1533,40 @@ const ( TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b TCP_BBR_DRAIN_INC_EXTRA = 0x43c TCP_BBR_DRAIN_PG = 0x42e TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 TCP_BBR_IWINTSO = 0x42b TCP_BBR_LOWGAIN_FD = 0x436 TCP_BBR_LOWGAIN_HALF = 0x435 TCP_BBR_LOWGAIN_THRESH = 0x434 TCP_BBR_MAX_RTO = 0x439 TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 TCP_BBR_ONE_RETRAN = 0x431 TCP_BBR_PACE_CROSS = 0x442 TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 TCP_BBR_PACE_PER_SEC = 0x43e TCP_BBR_PACE_SEG_MAX = 0x440 TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 TCP_BBR_PROBE_RTT_GAIN = 0x44d TCP_BBR_PROBE_RTT_INT = 0x430 TCP_BBR_PROBE_RTT_LEN = 0x44e @@ -1497,12 +1575,18 @@ const ( TCP_BBR_REC_OVER_HPTS = 0x43a TCP_BBR_RETRAN_WTSO = 0x44b TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d TCP_BBR_STARTUP_LOSS_EXIT = 0x432 TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 TCP_BBR_UNLIMITED = 0x43b TCP_BBR_USEDEL_RATE = 0x437 TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 @@ -1542,6 +1626,7 @@ const ( TCP_PCAP_OUT = 0x800 TCP_RACK_EARLY_RECOV = 0x423 TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_GP_INCREASE = 0x446 TCP_RACK_IDLE_REDUCE_HIGH = 0x444 TCP_RACK_MIN_PACE = 0x445 TCP_RACK_MIN_PACE_SEG = 0x446 @@ -1555,7 +1640,6 @@ const ( TCP_RACK_PRR_SENDALOT = 0x421 TCP_RACK_REORD_FADE = 0x426 TCP_RACK_REORD_THRESH = 0x425 - TCP_RACK_SESS_CWV = 0x42a TCP_RACK_TLP_INC_VAR = 0x429 TCP_RACK_TLP_REDUCE = 0x41c TCP_RACK_TLP_THRESH = 0x427 @@ -1694,12 +1778,13 @@ const ( EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) - ELAST = syscall.Errno(0x60) + ELAST = syscall.Errno(0x61) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) @@ -1842,7 +1927,7 @@ var errorList = [...]struct { {32, "EPIPE", "broken pipe"}, {33, "EDOM", "numerical argument out of domain"}, {34, "ERANGE", "result too large"}, - {35, "EAGAIN", "resource temporarily unavailable"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, {36, "EINPROGRESS", "operation now in progress"}, {37, "EALREADY", "operation already in progress"}, {38, "ENOTSOCK", "socket operation on non-socket"}, @@ -1904,6 +1989,7 @@ var errorList = [...]struct { {94, "ECAPMODE", "not permitted in capability mode"}, {95, "ENOTRECOVERABLE", "state not recoverable"}, {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, } // Signal table diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go new file mode 100644 index 000000000..341b4d962 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go @@ -0,0 +1,2148 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build riscv64 && freebsd +// +build riscv64,freebsd + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_HYPERV = 0x2b + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2b + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B1000000 = 0xf4240 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1500000 = 0x16e360 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B2000000 = 0x1e8480 + B230400 = 0x38400 + B2400 = 0x960 + B2500000 = 0x2625a0 + B28800 = 0x7080 + B300 = 0x12c + B3000000 = 0x2dc6c0 + B3500000 = 0x3567e0 + B38400 = 0x9600 + B4000000 = 0x3d0900 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B500000 = 0x7a120 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4008427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x40184280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x80104282 + BIOCSETIF = 0x8020426c + BIOCSETVLANPCP = 0x80044285 + BIOCSETWF = 0x8010427b + BIOCSETZBUF = 0x80184281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffffffffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x5 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_COARSE = 0xc + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_COARSE = 0xa + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CPUSTATES = 0x5 + CP_IDLE = 0x4 + CP_INTR = 0x3 + CP_NICE = 0x1 + CP_SYS = 0x2 + CP_USER = 0x0 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DIOCGATTR = 0xc148648e + DIOCGDELETE = 0x80106488 + DIOCGFLUSH = 0x20006487 + DIOCGFWHEADS = 0x40046483 + DIOCGFWSECTORS = 0x40046482 + DIOCGIDENT = 0x41006489 + DIOCGKERNELDUMP = 0xc0986492 + DIOCGMEDIASIZE = 0x40086481 + DIOCGPHYSPATH = 0x4400648d + DIOCGPROVIDERNAME = 0x4400648a + DIOCGSECTORSIZE = 0x40046480 + DIOCGSTRIPEOFFSET = 0x4008648c + DIOCGSTRIPESIZE = 0x4008648b + DIOCSKERNELDUMP = 0x80986491 + DIOCSKERNELDUMP_FREEBSD11 = 0x80046485 + DIOCSKERNELDUMP_FREEBSD12 = 0x80506490 + DIOCZONECMD = 0xc080648f + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_CLASS_NETBSD_RAWAF = 0x2240000 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DISPLAYPORT_AUX = 0x113 + DLT_DOCSIS = 0x8f + DLT_DOCSIS31_XRA31 = 0x111 + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_ETHERNET_MPACKET = 0x112 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB_KONTRON = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_ISO_14443 = 0x108 + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LINUX_SLL2 = 0x114 + DLT_LOOP = 0x6c + DLT_LORATAP = 0x10e + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x114 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NORDIC_BLE = 0x110 + DLT_NULL = 0x0 + DLT_OPENFLOW = 0x10b + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RDS = 0x109 + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SDLC = 0x10c + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TI_LLN_SNIFFER = 0x10d + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_DARWIN = 0x10a + DLT_USB_FREEBSD = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_VSOCK = 0x10f + DLT_WATTSTOPPER_DLM = 0x107 + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DLT_ZWAVE_R1_R2 = 0x105 + DLT_ZWAVE_R3 = 0x106 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EHE_DEAD_PRIORITY = -0x1 + EVFILT_AIO = -0x3 + EVFILT_EMPTY = -0xd + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xd + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EVNAMEMAP_NAME_SIZE = 0x40 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_MAXNAMELEN = 0xff + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_NONE = -0xc8 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_ADD_SEALS = 0x13 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_GET_SEALS = 0x14 + F_ISUNIONSTACK = 0x15 + F_KINFO = 0x16 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFCAP_WOL_MAGIC = 0x2000 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f72 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_KNOWSEPOCH = 0x20 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOGROUP = 0x800000 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_NETMASK_DEFAULT = 0xffffff00 + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DCCP = 0x21 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_LEN = 0x14 + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_ORIGDSTADDR = 0x48 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVORIGDSTADDR = 0x48 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IPV6_VLAN_PCP = 0x4b + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_ORIGDSTADDR = 0x1b + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVORIGDSTADDR = 0x1b + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + IP_VLAN_PCP = 0x4b + ISIG = 0x80 + ISTRIP = 0x20 + ITIMER_PROF = 0x2 + ITIMER_REAL = 0x0 + ITIMER_VIRTUAL = 0x1 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCAL_CONNWAIT = 0x4 + LOCAL_CREDS = 0x2 + LOCAL_CREDS_PERSISTENT = 0x3 + LOCAL_PEERCRED = 0x1 + LOCAL_VENDOR = 0x80000000 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80000 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GUARD = 0x2000 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCAST_BLOCK_SOURCE = 0x54 + MCAST_EXCLUDE = 0x2 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x50 + MCAST_JOIN_SOURCE_GROUP = 0x52 + MCAST_LEAVE_GROUP = 0x51 + MCAST_LEAVE_SOURCE_GROUP = 0x53 + MCAST_UNBLOCK_SOURCE = 0x55 + MCAST_UNDEFINED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0xfc000000 + MFD_HUGE_SHIFT = 0x1a + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0x300d0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EMPTYDIR = 0x2000000000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_EXTLS = 0x4000000000 + MNT_EXTLSCERT = 0x8000000000 + MNT_EXTLSCERTUSER = 0x10000000000 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOCOVER = 0x1000000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNTRUSTED = 0x800000000 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0xad8d0807e + MNT_USER = 0x8000 + MNT_VERIFIED = 0x400000000 + MNT_VISFLAGMASK = 0xffef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NET_RT_NHGRP = 0x7 + NET_RT_NHOP = 0x6 + NFDBITS = 0x40 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSTIME = 0x10 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x1000000 + O_EMPTY_PATH = 0x2000000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_PATH = 0x400000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RESOLVE_BENEATH = 0x800000 + O_SEARCH = 0x40000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PIOD_READ_D = 0x1 + PIOD_READ_I = 0x3 + PIOD_WRITE_D = 0x2 + PIOD_WRITE_I = 0x4 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PTRACE_DEFAULT = 0x1 + PTRACE_EXEC = 0x1 + PTRACE_FORK = 0x8 + PTRACE_LWP = 0x10 + PTRACE_SCE = 0x2 + PTRACE_SCX = 0x4 + PTRACE_SYSCALL = 0x6 + PTRACE_VFORK = 0x20 + PT_ATTACH = 0xa + PT_CLEARSTEP = 0x10 + PT_CONTINUE = 0x7 + PT_COREDUMP = 0x1d + PT_DETACH = 0xb + PT_FIRSTMACH = 0x40 + PT_FOLLOW_FORK = 0x17 + PT_GETDBREGS = 0x25 + PT_GETFPREGS = 0x23 + PT_GETLWPLIST = 0xf + PT_GETNUMLWPS = 0xe + PT_GETREGS = 0x21 + PT_GET_EVENT_MASK = 0x19 + PT_GET_SC_ARGS = 0x1b + PT_GET_SC_RET = 0x1c + PT_IO = 0xc + PT_KILL = 0x8 + PT_LWPINFO = 0xd + PT_LWP_EVENTS = 0x18 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_RESUME = 0x13 + PT_SETDBREGS = 0x26 + PT_SETFPREGS = 0x24 + PT_SETREGS = 0x22 + PT_SETSTEP = 0x11 + PT_SET_EVENT_MASK = 0x1a + PT_STEP = 0x9 + PT_SUSPEND = 0x12 + PT_SYSCALL = 0x16 + PT_TO_SCE = 0x14 + PT_TO_SCX = 0x15 + PT_TRACE_ME = 0x0 + PT_VM_ENTRY = 0x29 + PT_VM_TIMESTAMP = 0x28 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + P_ZONEID = 0xc + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_DEFAULT_FIB = 0x0 + RT_DEFAULT_WEIGHT = 0x1 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAX_WEIGHT = 0xffffff + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_CREDS2 = 0x8 + SCM_MONOTONIC = 0x6 + SCM_REALTIME = 0x5 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIME_INFO = 0x7 + SEEK_CUR = 0x1 + SEEK_DATA = 0x3 + SEEK_END = 0x2 + SEEK_HOLE = 0x4 + SEEK_SET = 0x0 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGHWADDR = 0xc020693e + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFALIAS = 0xc044692d + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0x8020692c + SIOCGIFDESCR = 0xc020692a + SIOCGIFDOWNREASON = 0xc058699a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRSSHASH = 0xc0186997 + SIOCGIFRSSKEY = 0xc0946996 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc030698b + SIOCGLANPCP = 0xc0206998 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLANPCP = 0x80206999 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DOMAIN = 0x1019 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_MAX_PACING_RATE = 0x1018 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_RERROR = 0x20000 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSEPORT_LB = 0x10000 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TS_BINTIME = 0x1 + SO_TS_CLOCK = 0x1017 + SO_TS_CLOCK_MAX = 0x3 + SO_TS_DEFAULT = 0x0 + SO_TS_MONOTONIC = 0x3 + SO_TS_REALTIME = 0x2 + SO_TS_REALTIME_MICRO = 0x0 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCPOPT_EOL = 0x0 + TCPOPT_FAST_OPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_PAD = 0x0 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_WINDOW = 0x3 + TCP_BBR_ACK_COMP_ALG = 0x448 + TCP_BBR_ALGORITHM = 0x43b + TCP_BBR_DRAIN_INC_EXTRA = 0x43c + TCP_BBR_DRAIN_PG = 0x42e + TCP_BBR_EXTRA_GAIN = 0x449 + TCP_BBR_EXTRA_STATE = 0x453 + TCP_BBR_FLOOR_MIN_TSO = 0x454 + TCP_BBR_HDWR_PACE = 0x451 + TCP_BBR_HOLD_TARGET = 0x436 + TCP_BBR_IWINTSO = 0x42b + TCP_BBR_LOWGAIN_FD = 0x436 + TCP_BBR_LOWGAIN_HALF = 0x435 + TCP_BBR_LOWGAIN_THRESH = 0x434 + TCP_BBR_MAX_RTO = 0x439 + TCP_BBR_MIN_RTO = 0x438 + TCP_BBR_MIN_TOPACEOUT = 0x455 + TCP_BBR_ONE_RETRAN = 0x431 + TCP_BBR_PACE_CROSS = 0x442 + TCP_BBR_PACE_DEL_TAR = 0x43f + TCP_BBR_PACE_OH = 0x435 + TCP_BBR_PACE_PER_SEC = 0x43e + TCP_BBR_PACE_SEG_MAX = 0x440 + TCP_BBR_PACE_SEG_MIN = 0x441 + TCP_BBR_POLICER_DETECT = 0x457 + TCP_BBR_PROBE_RTT_GAIN = 0x44d + TCP_BBR_PROBE_RTT_INT = 0x430 + TCP_BBR_PROBE_RTT_LEN = 0x44e + TCP_BBR_RACK_INIT_RATE = 0x458 + TCP_BBR_RACK_RTT_USE = 0x44a + TCP_BBR_RECFORCE = 0x42c + TCP_BBR_REC_OVER_HPTS = 0x43a + TCP_BBR_RETRAN_WTSO = 0x44b + TCP_BBR_RWND_IS_APP = 0x42f + TCP_BBR_SEND_IWND_IN_TSO = 0x44f + TCP_BBR_STARTUP_EXIT_EPOCH = 0x43d + TCP_BBR_STARTUP_LOSS_EXIT = 0x432 + TCP_BBR_STARTUP_PG = 0x42d + TCP_BBR_TMR_PACE_OH = 0x448 + TCP_BBR_TSLIMITS = 0x434 + TCP_BBR_TSTMP_RAISES = 0x456 + TCP_BBR_UNLIMITED = 0x43b + TCP_BBR_USEDEL_RATE = 0x437 + TCP_BBR_USE_LOWGAIN = 0x433 + TCP_BBR_USE_RACK_CHEAT = 0x450 + TCP_BBR_USE_RACK_RR = 0x450 + TCP_BBR_UTTER_MAX_TSO = 0x452 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_DATA_AFTER_CLOSE = 0x44c + TCP_DEFER_OPTIONS = 0x470 + TCP_DELACK = 0x48 + TCP_FASTOPEN = 0x401 + TCP_FASTOPEN_MAX_COOKIE_LEN = 0x10 + TCP_FASTOPEN_MIN_COOKIE_LEN = 0x4 + TCP_FASTOPEN_PSK_LEN = 0x10 + TCP_FAST_RSM_HACK = 0x471 + TCP_FIN_IS_RST = 0x49 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_HDWR_RATE_CAP = 0x46a + TCP_HDWR_UP_ONLY = 0x46c + TCP_IDLE_REDUCE = 0x46 + TCP_INFO = 0x20 + TCP_IWND_NB = 0x2b + TCP_IWND_NSEG = 0x2c + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_LOG = 0x22 + TCP_LOGBUF = 0x23 + TCP_LOGDUMP = 0x25 + TCP_LOGDUMPID = 0x26 + TCP_LOGID = 0x24 + TCP_LOGID_CNT = 0x2e + TCP_LOG_ID_LEN = 0x40 + TCP_LOG_LIMIT = 0x4a + TCP_LOG_TAG = 0x2f + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXPEAKRATE = 0x45 + TCP_MAXSEG = 0x2 + TCP_MAXUNACKTIME = 0x44 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NO_PRR = 0x462 + TCP_PACING_RATE_CAP = 0x46b + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_PERF_INFO = 0x4e + TCP_PROC_ACCOUNTING = 0x4c + TCP_RACK_ABC_VAL = 0x46d + TCP_RACK_CHEAT_NOT_CONF_RATE = 0x459 + TCP_RACK_DO_DETECTION = 0x449 + TCP_RACK_EARLY_RECOV = 0x423 + TCP_RACK_EARLY_SEG = 0x424 + TCP_RACK_FORCE_MSEG = 0x45d + TCP_RACK_GP_INCREASE = 0x446 + TCP_RACK_GP_INCREASE_CA = 0x45a + TCP_RACK_GP_INCREASE_REC = 0x45c + TCP_RACK_GP_INCREASE_SS = 0x45b + TCP_RACK_IDLE_REDUCE_HIGH = 0x444 + TCP_RACK_MBUF_QUEUE = 0x41a + TCP_RACK_MEASURE_CNT = 0x46f + TCP_RACK_MIN_PACE = 0x445 + TCP_RACK_MIN_PACE_SEG = 0x446 + TCP_RACK_MIN_TO = 0x422 + TCP_RACK_NONRXT_CFG_RATE = 0x463 + TCP_RACK_NO_PUSH_AT_MAX = 0x466 + TCP_RACK_PACE_ALWAYS = 0x41f + TCP_RACK_PACE_MAX_SEG = 0x41e + TCP_RACK_PACE_RATE_CA = 0x45e + TCP_RACK_PACE_RATE_REC = 0x460 + TCP_RACK_PACE_RATE_SS = 0x45f + TCP_RACK_PACE_REDUCE = 0x41d + TCP_RACK_PACE_TO_FILL = 0x467 + TCP_RACK_PACING_BETA = 0x472 + TCP_RACK_PACING_BETA_ECN = 0x473 + TCP_RACK_PKT_DELAY = 0x428 + TCP_RACK_PROFILE = 0x469 + TCP_RACK_PROP = 0x41b + TCP_RACK_PROP_RATE = 0x420 + TCP_RACK_PRR_SENDALOT = 0x421 + TCP_RACK_REORD_FADE = 0x426 + TCP_RACK_REORD_THRESH = 0x425 + TCP_RACK_RR_CONF = 0x459 + TCP_RACK_TIMER_SLOP = 0x474 + TCP_RACK_TLP_INC_VAR = 0x429 + TCP_RACK_TLP_REDUCE = 0x41c + TCP_RACK_TLP_THRESH = 0x427 + TCP_RACK_TLP_USE = 0x447 + TCP_REC_ABC_VAL = 0x46e + TCP_REMOTE_UDP_ENCAPS_PORT = 0x47 + TCP_REUSPORT_LB_NUMA = 0x402 + TCP_REUSPORT_LB_NUMA_CURDOM = -0x1 + TCP_REUSPORT_LB_NUMA_NODOM = -0x2 + TCP_RXTLS_ENABLE = 0x29 + TCP_RXTLS_MODE = 0x2a + TCP_SHARED_CWND_ALLOWED = 0x4b + TCP_SHARED_CWND_ENABLE = 0x464 + TCP_SHARED_CWND_TIME_LIMIT = 0x468 + TCP_STATS = 0x21 + TCP_TIMELY_DYN_ADJ = 0x465 + TCP_TLS_MODE_IFNET = 0x2 + TCP_TLS_MODE_NONE = 0x0 + TCP_TLS_MODE_SW = 0x1 + TCP_TLS_MODE_TOE = 0x3 + TCP_TXTLS_ENABLE = 0x27 + TCP_TXTLS_MODE = 0x28 + TCP_USER_LOG = 0x30 + TCP_USE_CMP_ACKS = 0x4d + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIMER_ABSTIME = 0x1 + TIMER_RELTIME = 0x0 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + UTIME_NOW = -0x1 + UTIME_OMIT = -0x2 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTEGRITY = syscall.Errno(0x61) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x61) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, + {97, "EINTEGRITY", "integrity check failed"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index c0a43f8ba..785d693eb 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -140,6 +140,306 @@ const ( ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f + AUDIT_ADD = 0x3eb + AUDIT_ADD_RULE = 0x3f3 + AUDIT_ALWAYS = 0x2 + AUDIT_ANOM_ABEND = 0x6a5 + AUDIT_ANOM_CREAT = 0x6a7 + AUDIT_ANOM_LINK = 0x6a6 + AUDIT_ANOM_PROMISCUOUS = 0x6a4 + AUDIT_ARCH = 0xb + AUDIT_ARCH_AARCH64 = 0xc00000b7 + AUDIT_ARCH_ALPHA = 0xc0009026 + AUDIT_ARCH_ARCOMPACT = 0x4000005d + AUDIT_ARCH_ARCOMPACTBE = 0x5d + AUDIT_ARCH_ARCV2 = 0x400000c3 + AUDIT_ARCH_ARCV2BE = 0xc3 + AUDIT_ARCH_ARM = 0x40000028 + AUDIT_ARCH_ARMEB = 0x28 + AUDIT_ARCH_C6X = 0x4000008c + AUDIT_ARCH_C6XBE = 0x8c + AUDIT_ARCH_CRIS = 0x4000004c + AUDIT_ARCH_CSKY = 0x400000fc + AUDIT_ARCH_FRV = 0x5441 + AUDIT_ARCH_H8300 = 0x2e + AUDIT_ARCH_HEXAGON = 0xa4 + AUDIT_ARCH_I386 = 0x40000003 + AUDIT_ARCH_IA64 = 0xc0000032 + AUDIT_ARCH_LOONGARCH32 = 0x40000102 + AUDIT_ARCH_LOONGARCH64 = 0xc0000102 + AUDIT_ARCH_M32R = 0x58 + AUDIT_ARCH_M68K = 0x4 + AUDIT_ARCH_MICROBLAZE = 0xbd + AUDIT_ARCH_MIPS = 0x8 + AUDIT_ARCH_MIPS64 = 0x80000008 + AUDIT_ARCH_MIPS64N32 = 0xa0000008 + AUDIT_ARCH_MIPSEL = 0x40000008 + AUDIT_ARCH_MIPSEL64 = 0xc0000008 + AUDIT_ARCH_MIPSEL64N32 = 0xe0000008 + AUDIT_ARCH_NDS32 = 0x400000a7 + AUDIT_ARCH_NDS32BE = 0xa7 + AUDIT_ARCH_NIOS2 = 0x40000071 + AUDIT_ARCH_OPENRISC = 0x5c + AUDIT_ARCH_PARISC = 0xf + AUDIT_ARCH_PARISC64 = 0x8000000f + AUDIT_ARCH_PPC = 0x14 + AUDIT_ARCH_PPC64 = 0x80000015 + AUDIT_ARCH_PPC64LE = 0xc0000015 + AUDIT_ARCH_RISCV32 = 0x400000f3 + AUDIT_ARCH_RISCV64 = 0xc00000f3 + AUDIT_ARCH_S390 = 0x16 + AUDIT_ARCH_S390X = 0x80000016 + AUDIT_ARCH_SH = 0x2a + AUDIT_ARCH_SH64 = 0x8000002a + AUDIT_ARCH_SHEL = 0x4000002a + AUDIT_ARCH_SHEL64 = 0xc000002a + AUDIT_ARCH_SPARC = 0x2 + AUDIT_ARCH_SPARC64 = 0x8000002b + AUDIT_ARCH_TILEGX = 0xc00000bf + AUDIT_ARCH_TILEGX32 = 0x400000bf + AUDIT_ARCH_TILEPRO = 0x400000bc + AUDIT_ARCH_UNICORE = 0x4000006e + AUDIT_ARCH_X86_64 = 0xc000003e + AUDIT_ARCH_XTENSA = 0x5e + AUDIT_ARG0 = 0xc8 + AUDIT_ARG1 = 0xc9 + AUDIT_ARG2 = 0xca + AUDIT_ARG3 = 0xcb + AUDIT_AVC = 0x578 + AUDIT_AVC_PATH = 0x57a + AUDIT_BITMASK_SIZE = 0x40 + AUDIT_BIT_MASK = 0x8000000 + AUDIT_BIT_TEST = 0x48000000 + AUDIT_BPF = 0x536 + AUDIT_BPRM_FCAPS = 0x529 + AUDIT_CAPSET = 0x52a + AUDIT_CLASS_CHATTR = 0x2 + AUDIT_CLASS_CHATTR_32 = 0x3 + AUDIT_CLASS_DIR_WRITE = 0x0 + AUDIT_CLASS_DIR_WRITE_32 = 0x1 + AUDIT_CLASS_READ = 0x4 + AUDIT_CLASS_READ_32 = 0x5 + AUDIT_CLASS_SIGNAL = 0x8 + AUDIT_CLASS_SIGNAL_32 = 0x9 + AUDIT_CLASS_WRITE = 0x6 + AUDIT_CLASS_WRITE_32 = 0x7 + AUDIT_COMPARE_AUID_TO_EUID = 0x10 + AUDIT_COMPARE_AUID_TO_FSUID = 0xe + AUDIT_COMPARE_AUID_TO_OBJ_UID = 0x5 + AUDIT_COMPARE_AUID_TO_SUID = 0xf + AUDIT_COMPARE_EGID_TO_FSGID = 0x17 + AUDIT_COMPARE_EGID_TO_OBJ_GID = 0x4 + AUDIT_COMPARE_EGID_TO_SGID = 0x18 + AUDIT_COMPARE_EUID_TO_FSUID = 0x12 + AUDIT_COMPARE_EUID_TO_OBJ_UID = 0x3 + AUDIT_COMPARE_EUID_TO_SUID = 0x11 + AUDIT_COMPARE_FSGID_TO_OBJ_GID = 0x9 + AUDIT_COMPARE_FSUID_TO_OBJ_UID = 0x8 + AUDIT_COMPARE_GID_TO_EGID = 0x14 + AUDIT_COMPARE_GID_TO_FSGID = 0x15 + AUDIT_COMPARE_GID_TO_OBJ_GID = 0x2 + AUDIT_COMPARE_GID_TO_SGID = 0x16 + AUDIT_COMPARE_SGID_TO_FSGID = 0x19 + AUDIT_COMPARE_SGID_TO_OBJ_GID = 0x7 + AUDIT_COMPARE_SUID_TO_FSUID = 0x13 + AUDIT_COMPARE_SUID_TO_OBJ_UID = 0x6 + AUDIT_COMPARE_UID_TO_AUID = 0xa + AUDIT_COMPARE_UID_TO_EUID = 0xb + AUDIT_COMPARE_UID_TO_FSUID = 0xc + AUDIT_COMPARE_UID_TO_OBJ_UID = 0x1 + AUDIT_COMPARE_UID_TO_SUID = 0xd + AUDIT_CONFIG_CHANGE = 0x519 + AUDIT_CWD = 0x51b + AUDIT_DAEMON_ABORT = 0x4b2 + AUDIT_DAEMON_CONFIG = 0x4b3 + AUDIT_DAEMON_END = 0x4b1 + AUDIT_DAEMON_START = 0x4b0 + AUDIT_DEL = 0x3ec + AUDIT_DEL_RULE = 0x3f4 + AUDIT_DEVMAJOR = 0x64 + AUDIT_DEVMINOR = 0x65 + AUDIT_DIR = 0x6b + AUDIT_DM_CTRL = 0x53a + AUDIT_DM_EVENT = 0x53b + AUDIT_EGID = 0x6 + AUDIT_EOE = 0x528 + AUDIT_EQUAL = 0x40000000 + AUDIT_EUID = 0x2 + AUDIT_EVENT_LISTENER = 0x537 + AUDIT_EXE = 0x70 + AUDIT_EXECVE = 0x51d + AUDIT_EXIT = 0x67 + AUDIT_FAIL_PANIC = 0x2 + AUDIT_FAIL_PRINTK = 0x1 + AUDIT_FAIL_SILENT = 0x0 + AUDIT_FANOTIFY = 0x533 + AUDIT_FD_PAIR = 0x525 + AUDIT_FEATURE_BITMAP_ALL = 0x7f + AUDIT_FEATURE_BITMAP_BACKLOG_LIMIT = 0x1 + AUDIT_FEATURE_BITMAP_BACKLOG_WAIT_TIME = 0x2 + AUDIT_FEATURE_BITMAP_EXCLUDE_EXTEND = 0x8 + AUDIT_FEATURE_BITMAP_EXECUTABLE_PATH = 0x4 + AUDIT_FEATURE_BITMAP_FILTER_FS = 0x40 + AUDIT_FEATURE_BITMAP_LOST_RESET = 0x20 + AUDIT_FEATURE_BITMAP_SESSIONID_FILTER = 0x10 + AUDIT_FEATURE_CHANGE = 0x530 + AUDIT_FEATURE_LOGINUID_IMMUTABLE = 0x1 + AUDIT_FEATURE_ONLY_UNSET_LOGINUID = 0x0 + AUDIT_FEATURE_VERSION = 0x1 + AUDIT_FIELD_COMPARE = 0x6f + AUDIT_FILETYPE = 0x6c + AUDIT_FILTERKEY = 0xd2 + AUDIT_FILTER_ENTRY = 0x2 + AUDIT_FILTER_EXCLUDE = 0x5 + AUDIT_FILTER_EXIT = 0x4 + AUDIT_FILTER_FS = 0x6 + AUDIT_FILTER_PREPEND = 0x10 + AUDIT_FILTER_TASK = 0x1 + AUDIT_FILTER_TYPE = 0x5 + AUDIT_FILTER_URING_EXIT = 0x7 + AUDIT_FILTER_USER = 0x0 + AUDIT_FILTER_WATCH = 0x3 + AUDIT_FIRST_KERN_ANOM_MSG = 0x6a4 + AUDIT_FIRST_USER_MSG = 0x44c + AUDIT_FIRST_USER_MSG2 = 0x834 + AUDIT_FSGID = 0x8 + AUDIT_FSTYPE = 0x1a + AUDIT_FSUID = 0x4 + AUDIT_GET = 0x3e8 + AUDIT_GET_FEATURE = 0x3fb + AUDIT_GID = 0x5 + AUDIT_GREATER_THAN = 0x20000000 + AUDIT_GREATER_THAN_OR_EQUAL = 0x60000000 + AUDIT_INODE = 0x66 + AUDIT_INTEGRITY_DATA = 0x708 + AUDIT_INTEGRITY_EVM_XATTR = 0x70e + AUDIT_INTEGRITY_HASH = 0x70b + AUDIT_INTEGRITY_METADATA = 0x709 + AUDIT_INTEGRITY_PCR = 0x70c + AUDIT_INTEGRITY_POLICY_RULE = 0x70f + AUDIT_INTEGRITY_RULE = 0x70d + AUDIT_INTEGRITY_STATUS = 0x70a + AUDIT_IPC = 0x517 + AUDIT_IPC_SET_PERM = 0x51f + AUDIT_KERNEL = 0x7d0 + AUDIT_KERNEL_OTHER = 0x524 + AUDIT_KERN_MODULE = 0x532 + AUDIT_LAST_FEATURE = 0x1 + AUDIT_LAST_KERN_ANOM_MSG = 0x707 + AUDIT_LAST_USER_MSG = 0x4af + AUDIT_LAST_USER_MSG2 = 0xbb7 + AUDIT_LESS_THAN = 0x10000000 + AUDIT_LESS_THAN_OR_EQUAL = 0x50000000 + AUDIT_LIST = 0x3ea + AUDIT_LIST_RULES = 0x3f5 + AUDIT_LOGIN = 0x3ee + AUDIT_LOGINUID = 0x9 + AUDIT_LOGINUID_SET = 0x18 + AUDIT_MAC_CALIPSO_ADD = 0x58a + AUDIT_MAC_CALIPSO_DEL = 0x58b + AUDIT_MAC_CIPSOV4_ADD = 0x57f + AUDIT_MAC_CIPSOV4_DEL = 0x580 + AUDIT_MAC_CONFIG_CHANGE = 0x57d + AUDIT_MAC_IPSEC_ADDSA = 0x583 + AUDIT_MAC_IPSEC_ADDSPD = 0x585 + AUDIT_MAC_IPSEC_DELSA = 0x584 + AUDIT_MAC_IPSEC_DELSPD = 0x586 + AUDIT_MAC_IPSEC_EVENT = 0x587 + AUDIT_MAC_MAP_ADD = 0x581 + AUDIT_MAC_MAP_DEL = 0x582 + AUDIT_MAC_POLICY_LOAD = 0x57b + AUDIT_MAC_STATUS = 0x57c + AUDIT_MAC_UNLBL_ALLOW = 0x57e + AUDIT_MAC_UNLBL_STCADD = 0x588 + AUDIT_MAC_UNLBL_STCDEL = 0x589 + AUDIT_MAKE_EQUIV = 0x3f7 + AUDIT_MAX_FIELDS = 0x40 + AUDIT_MAX_FIELD_COMPARE = 0x19 + AUDIT_MAX_KEY_LEN = 0x100 + AUDIT_MESSAGE_TEXT_MAX = 0x2170 + AUDIT_MMAP = 0x52b + AUDIT_MQ_GETSETATTR = 0x523 + AUDIT_MQ_NOTIFY = 0x522 + AUDIT_MQ_OPEN = 0x520 + AUDIT_MQ_SENDRECV = 0x521 + AUDIT_MSGTYPE = 0xc + AUDIT_NEGATE = 0x80000000 + AUDIT_NETFILTER_CFG = 0x52d + AUDIT_NETFILTER_PKT = 0x52c + AUDIT_NEVER = 0x0 + AUDIT_NLGRP_MAX = 0x1 + AUDIT_NOT_EQUAL = 0x30000000 + AUDIT_NR_FILTERS = 0x8 + AUDIT_OBJ_GID = 0x6e + AUDIT_OBJ_LEV_HIGH = 0x17 + AUDIT_OBJ_LEV_LOW = 0x16 + AUDIT_OBJ_PID = 0x526 + AUDIT_OBJ_ROLE = 0x14 + AUDIT_OBJ_TYPE = 0x15 + AUDIT_OBJ_UID = 0x6d + AUDIT_OBJ_USER = 0x13 + AUDIT_OPENAT2 = 0x539 + AUDIT_OPERATORS = 0x78000000 + AUDIT_PATH = 0x516 + AUDIT_PERM = 0x6a + AUDIT_PERM_ATTR = 0x8 + AUDIT_PERM_EXEC = 0x1 + AUDIT_PERM_READ = 0x4 + AUDIT_PERM_WRITE = 0x2 + AUDIT_PERS = 0xa + AUDIT_PID = 0x0 + AUDIT_POSSIBLE = 0x1 + AUDIT_PPID = 0x12 + AUDIT_PROCTITLE = 0x52f + AUDIT_REPLACE = 0x531 + AUDIT_SADDR_FAM = 0x71 + AUDIT_SECCOMP = 0x52e + AUDIT_SELINUX_ERR = 0x579 + AUDIT_SESSIONID = 0x19 + AUDIT_SET = 0x3e9 + AUDIT_SET_FEATURE = 0x3fa + AUDIT_SGID = 0x7 + AUDIT_SID_UNSET = 0xffffffff + AUDIT_SIGNAL_INFO = 0x3f2 + AUDIT_SOCKADDR = 0x51a + AUDIT_SOCKETCALL = 0x518 + AUDIT_STATUS_BACKLOG_LIMIT = 0x10 + AUDIT_STATUS_BACKLOG_WAIT_TIME = 0x20 + AUDIT_STATUS_BACKLOG_WAIT_TIME_ACTUAL = 0x80 + AUDIT_STATUS_ENABLED = 0x1 + AUDIT_STATUS_FAILURE = 0x2 + AUDIT_STATUS_LOST = 0x40 + AUDIT_STATUS_PID = 0x4 + AUDIT_STATUS_RATE_LIMIT = 0x8 + AUDIT_SUBJ_CLR = 0x11 + AUDIT_SUBJ_ROLE = 0xe + AUDIT_SUBJ_SEN = 0x10 + AUDIT_SUBJ_TYPE = 0xf + AUDIT_SUBJ_USER = 0xd + AUDIT_SUCCESS = 0x68 + AUDIT_SUID = 0x3 + AUDIT_SYSCALL = 0x514 + AUDIT_SYSCALL_CLASSES = 0x10 + AUDIT_TIME_ADJNTPVAL = 0x535 + AUDIT_TIME_INJOFFSET = 0x534 + AUDIT_TRIM = 0x3f6 + AUDIT_TTY = 0x527 + AUDIT_TTY_GET = 0x3f8 + AUDIT_TTY_SET = 0x3f9 + AUDIT_UID = 0x1 + AUDIT_UID_UNSET = 0xffffffff + AUDIT_UNUSED_BITS = 0x7fffc00 + AUDIT_URINGOP = 0x538 + AUDIT_USER = 0x3ed + AUDIT_USER_AVC = 0x453 + AUDIT_USER_TTY = 0x464 + AUDIT_VERSION_BACKLOG_LIMIT = 0x1 + AUDIT_VERSION_BACKLOG_WAIT_TIME = 0x2 + AUDIT_VERSION_LATEST = 0x7f + AUDIT_WATCH = 0x69 + AUDIT_WATCH_INS = 0x3ef + AUDIT_WATCH_LIST = 0x3f1 + AUDIT_WATCH_REM = 0x3f0 AUTOFS_SUPER_MAGIC = 0x187 B0 = 0x0 B110 = 0x3 @@ -184,6 +484,7 @@ const ( BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_KPROBE_MULTI_RETURN = 0x1 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_REPLACE = 0x4 BPF_F_SLEEPABLE = 0x10 @@ -191,6 +492,8 @@ const ( BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TEST_RUN_ON_CPU = 0x1 BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TEST_XDP_LIVE_FRAMES = 0x2 + BPF_F_XDP_HAS_FRAGS = 0x20 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -517,9 +820,9 @@ const ( DM_UUID_FLAG = 0x4000 DM_UUID_LEN = 0x81 DM_VERSION = 0xc138fd00 - DM_VERSION_EXTRA = "-ioctl (2021-03-22)" + DM_VERSION_EXTRA = "-ioctl (2022-02-22)" DM_VERSION_MAJOR = 0x4 - DM_VERSION_MINOR = 0x2d + DM_VERSION_MINOR = 0x2e DM_VERSION_PATCHLEVEL = 0x0 DT_BLK = 0x6 DT_CHR = 0x2 @@ -535,6 +838,55 @@ const ( EFD_SEMAPHORE = 0x1 EFIVARFS_MAGIC = 0xde5e81e4 EFS_SUPER_MAGIC = 0x414a53 + EM_386 = 0x3 + EM_486 = 0x6 + EM_68K = 0x4 + EM_860 = 0x7 + EM_88K = 0x5 + EM_AARCH64 = 0xb7 + EM_ALPHA = 0x9026 + EM_ALTERA_NIOS2 = 0x71 + EM_ARCOMPACT = 0x5d + EM_ARCV2 = 0xc3 + EM_ARM = 0x28 + EM_BLACKFIN = 0x6a + EM_BPF = 0xf7 + EM_CRIS = 0x4c + EM_CSKY = 0xfc + EM_CYGNUS_M32R = 0x9041 + EM_CYGNUS_MN10300 = 0xbeef + EM_FRV = 0x5441 + EM_H8_300 = 0x2e + EM_HEXAGON = 0xa4 + EM_IA_64 = 0x32 + EM_LOONGARCH = 0x102 + EM_M32 = 0x1 + EM_M32R = 0x58 + EM_MICROBLAZE = 0xbd + EM_MIPS = 0x8 + EM_MIPS_RS3_LE = 0xa + EM_MIPS_RS4_BE = 0xa + EM_MN10300 = 0x59 + EM_NDS32 = 0xa7 + EM_NONE = 0x0 + EM_OPENRISC = 0x5c + EM_PARISC = 0xf + EM_PPC = 0x14 + EM_PPC64 = 0x15 + EM_RISCV = 0xf3 + EM_S390 = 0x16 + EM_S390_OLD = 0xa390 + EM_SH = 0x2a + EM_SPARC = 0x2 + EM_SPARC32PLUS = 0x12 + EM_SPARCV9 = 0x2b + EM_SPU = 0x17 + EM_TILEGX = 0xbf + EM_TILEPRO = 0xbc + EM_TI_C6000 = 0x8c + EM_UNICORE = 0x6e + EM_X86_64 = 0x3e + EM_XTENSA = 0x5e ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 @@ -712,6 +1064,7 @@ const ( ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be ETH_P_ERSPAN2 = 0x22eb + ETH_P_ETHERCAT = 0x88a4 ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 @@ -749,6 +1102,7 @@ const ( ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PREAUTH = 0x88c7 + ETH_P_PROFINET = 0x8892 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 @@ -837,6 +1191,7 @@ const ( FAN_FS_ERROR = 0x8000 FAN_MARK_ADD = 0x1 FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_EVICTABLE = 0x200 FAN_MARK_FILESYSTEM = 0x100 FAN_MARK_FLUSH = 0x80 FAN_MARK_IGNORED_MASK = 0x20 @@ -1055,7 +1410,7 @@ const ( IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa + IFA_MAX = 0xb IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 @@ -1403,6 +1758,7 @@ const ( LANDLOCK_ACCESS_FS_MAKE_SYM = 0x1000 LANDLOCK_ACCESS_FS_READ_DIR = 0x8 LANDLOCK_ACCESS_FS_READ_FILE = 0x4 + LANDLOCK_ACCESS_FS_REFER = 0x2000 LANDLOCK_ACCESS_FS_REMOVE_DIR = 0x10 LANDLOCK_ACCESS_FS_REMOVE_FILE = 0x20 LANDLOCK_ACCESS_FS_WRITE_FILE = 0x2 @@ -1758,6 +2114,7 @@ const ( NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 + NLM_F_BULK = 0x200 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 @@ -2075,6 +2432,11 @@ const ( PR_SET_UNALIGN = 0x6 PR_SET_VMA = 0x53564d41 PR_SET_VMA_ANON_NAME = 0x0 + PR_SME_GET_VL = 0x40 + PR_SME_SET_VL = 0x3f + PR_SME_SET_VL_ONEXEC = 0x40000 + PR_SME_VL_INHERIT = 0x20000 + PR_SME_VL_LEN_MASK = 0xffff PR_SPEC_DISABLE = 0x4 PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 @@ -2227,8 +2589,9 @@ const ( RTC_FEATURE_ALARM = 0x0 RTC_FEATURE_ALARM_RES_2S = 0x3 RTC_FEATURE_ALARM_RES_MINUTE = 0x1 + RTC_FEATURE_ALARM_WAKEUP_ONLY = 0x7 RTC_FEATURE_BACKUP_SWITCH_MODE = 0x6 - RTC_FEATURE_CNT = 0x7 + RTC_FEATURE_CNT = 0x8 RTC_FEATURE_CORRECTION = 0x5 RTC_FEATURE_NEED_WEEK_DAY = 0x2 RTC_FEATURE_UPDATE_INTERRUPT = 0x4 @@ -2302,6 +2665,7 @@ const ( RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d + RTM_DELTUNNEL = 0x79 RTM_DELVLAN = 0x71 RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 @@ -2334,8 +2698,9 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e + RTM_GETTUNNEL = 0x7a RTM_GETVLAN = 0x72 - RTM_MAX = 0x77 + RTM_MAX = 0x7b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -2359,11 +2724,13 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x1a - RTM_NR_MSGTYPES = 0x68 + RTM_NEWTUNNEL = 0x78 + RTM_NR_FAMILIES = 0x1b + RTM_NR_MSGTYPES = 0x6c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 + RTM_SETSTATS = 0x5f RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x59 RTNH_F_DEAD = 0x1 @@ -2544,6 +2911,9 @@ const ( SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_SNDBUF_LOCK = 0x1 + SOCK_TXREHASH_DEFAULT = 0xff + SOCK_TXREHASH_DISABLED = 0x0 + SOCK_TXREHASH_ENABLED = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 @@ -2559,6 +2929,8 @@ const ( SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c + SOL_MCTP = 0x11d + SOL_MPTCP = 0x11c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 @@ -2568,6 +2940,7 @@ const ( SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 + SOL_SMC = 0x11e SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_TLS = 0x11a @@ -2674,7 +3047,7 @@ const ( TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0xb + TASKSTATS_VERSION = 0xd TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 1b305fab1..36c0dfc7c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include -m32 +// mkerrors.sh -Wall -Werror -static -I/tmp/386/include -m32 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux // +build 386,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/386/include -m32 _const.go package unix @@ -326,6 +326,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 @@ -350,6 +351,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 6bcdef5dd..4ff942703 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include -m64 +// mkerrors.sh -Wall -Werror -static -I/tmp/amd64/include -m64 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux // +build amd64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/amd64/include -m64 _const.go package unix @@ -327,6 +327,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 @@ -351,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index e65df0f8d..3eaa0fb78 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/arm/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux // +build arm,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/arm/include _const.go package unix @@ -333,6 +333,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 @@ -357,6 +358,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index c7021115a..d7995bdc3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// mkerrors.sh -Wall -Werror -static -I/tmp/arm64/include -fsigned-char // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux // +build arm64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/arm64/include -fsigned-char _const.go package unix @@ -323,6 +323,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 @@ -347,6 +348,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 @@ -511,6 +513,7 @@ const ( WORDSIZE = 0x40 XCASE = 0x4 XTABS = 0x1800 + ZA_MAGIC = 0x54366345 _HIDIOCGRAWNAME = 0x80804804 _HIDIOCGRAWPHYS = 0x80404805 _HIDIOCGRAWUNIQ = 0x80404808 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go index 0d83a1cd4..928e24c20 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/loong64/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build loong64 && linux // +build loong64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/loong64/include _const.go package unix @@ -109,8 +109,6 @@ const ( IUCLC = 0x200 IXOFF = 0x1000 IXON = 0x400 - LASX_CTX_MAGIC = 0x41535801 - LSX_CTX_MAGIC = 0x53580001 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 @@ -319,6 +317,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 @@ -343,6 +342,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 7f44a495b..179bffb47 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/mips/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux // +build mips,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/mips/include _const.go package unix @@ -326,6 +326,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x1006 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x1006 @@ -351,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 2f92b4e48..1fba17bd7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/mips64/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux // +build mips64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/mips64/include _const.go package unix @@ -326,6 +326,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x1006 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x1006 @@ -351,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index f5367a966..b77dde315 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/mips64le/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux // +build mips64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/mips64le/include _const.go package unix @@ -326,6 +326,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x1006 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x1006 @@ -351,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 2e22337d7..78c6c751b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/mipsle/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux // +build mipsle,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/mipsle/include _const.go package unix @@ -326,6 +326,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x1006 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x1006 @@ -351,6 +352,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index 858c4f30f..1c0d31f0b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/ppc/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux // +build ppc,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/ppc/include _const.go package unix @@ -381,6 +381,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x12 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x12 @@ -405,6 +406,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index af2a7ba6e..959dd9bb8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/ppc64/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux // +build ppc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/ppc64/include _const.go package unix @@ -385,6 +385,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x12 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x12 @@ -409,6 +410,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index eaa2eb8e2..5a873cdbc 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/ppc64le/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux // +build ppc64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/ppc64le/include _const.go package unix @@ -385,6 +385,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x12 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x12 @@ -409,6 +410,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index faaa9f063..e336d141e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/riscv64/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux // +build riscv64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/riscv64/include _const.go package unix @@ -314,6 +314,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 @@ -338,6 +339,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 0d161f0b7..390c01d92 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// mkerrors.sh -Wall -Werror -static -I/tmp/s390x/include -fsigned-char // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux // +build s390x,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/s390x/include -fsigned-char _const.go package unix @@ -389,6 +389,7 @@ const ( SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 + SO_RCVMARK = 0x4b SO_RCVTIMEO = 0x14 SO_RCVTIMEO_NEW = 0x42 SO_RCVTIMEO_OLD = 0x14 @@ -413,6 +414,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x40 SO_TIMESTAMPNS_OLD = 0x23 SO_TIMESTAMP_NEW = 0x3f + SO_TXREHASH = 0x4a SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 4fd497a3e..98a6e5f11 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -1,11 +1,11 @@ -// mkerrors.sh -Wall -Werror -static -I/tmp/include +// mkerrors.sh -Wall -Werror -static -I/tmp/sparc64/include // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux // +build sparc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/sparc64/include _const.go package unix @@ -380,6 +380,7 @@ const ( SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x100b SO_RCVLOWAT = 0x800 + SO_RCVMARK = 0x54 SO_RCVTIMEO = 0x2000 SO_RCVTIMEO_NEW = 0x44 SO_RCVTIMEO_OLD = 0x2000 @@ -404,6 +405,7 @@ const ( SO_TIMESTAMPNS_NEW = 0x42 SO_TIMESTAMPNS_OLD = 0x21 SO_TIMESTAMP_NEW = 0x46 + SO_TXREHASH = 0x53 SO_TXTIME = 0x3f SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x25 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s index d6c3e25c0..f5bb40eda 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go amd64 +// go run mkasm.go darwin amd64 // Code generated by the command above; DO NOT EDIT. //go:build go1.13 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index 7e308a476..b41467a0e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go amd64 +// go run mkasm.go darwin amd64 // Code generated by the command above; DO NOT EDIT. //go:build go1.12 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s index 357989722..0c3f76bc2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go arm64 +// go run mkasm.go darwin arm64 // Code generated by the command above; DO NOT EDIT. //go:build go1.13 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index b09e5bb0e..e1f9204a2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go arm64 +// go run mkasm.go darwin arm64 // Code generated by the command above; DO NOT EDIT. //go:build go1.12 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index e9d9997ee..039c4aa06 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -912,7 +912,7 @@ func Fpathconf(fd int, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat(fd int, stat *stat_freebsd11_t) (err error) { +func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -922,17 +922,7 @@ func fstat(fd int, stat *stat_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat_freebsd12(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -947,22 +937,7 @@ func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { +func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -972,16 +947,6 @@ func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1002,7 +967,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) @@ -1019,23 +984,6 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) @@ -1257,21 +1205,6 @@ func Listen(s int, backlog int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func lstat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1317,43 +1250,13 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknod(path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat(fd int, path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } - _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), uintptr(dev>>32), 0) + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), uintptr(dev>>32), 0) if e1 != 0 { err = errnoErr(e1) } @@ -1753,22 +1656,7 @@ func Setuid(uid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func stat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func statfs(path string, stat *statfs_freebsd11_t) (err error) { +func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1783,21 +1671,6 @@ func statfs(path string, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func statfs_freebsd12(path string, stat *Statfs_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index edd373b1a..0535d3cfd 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -912,7 +912,7 @@ func Fpathconf(fd int, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat(fd int, stat *stat_freebsd11_t) (err error) { +func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -922,17 +922,7 @@ func fstat(fd int, stat *stat_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat_freebsd12(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -947,22 +937,7 @@ func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { +func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -972,16 +947,6 @@ func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1002,7 +967,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) @@ -1019,23 +984,6 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) @@ -1257,21 +1205,6 @@ func Listen(s int, backlog int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func lstat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1317,22 +1250,7 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknod(path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat(fd int, path string, mode uint32, dev int) (err error) { +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1347,21 +1265,6 @@ func mknodat(fd int, path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1753,22 +1656,7 @@ func Setuid(uid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func stat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func statfs(path string, stat *statfs_freebsd11_t) (err error) { +func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1783,21 +1671,6 @@ func statfs(path string, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func statfs_freebsd12(path string, stat *Statfs_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 82e9764b2..1018b5221 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -351,22 +351,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { @@ -404,6 +388,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data int) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { @@ -912,7 +912,7 @@ func Fpathconf(fd int, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat(fd int, stat *stat_freebsd11_t) (err error) { +func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -922,17 +922,7 @@ func fstat(fd int, stat *stat_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat_freebsd12(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -947,22 +937,7 @@ func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { +func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -972,16 +947,6 @@ func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1002,7 +967,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) @@ -1019,23 +984,6 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) @@ -1257,21 +1205,6 @@ func Listen(s int, backlog int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func lstat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1317,43 +1250,13 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknod(path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat(fd int, path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } - _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, uintptr(dev), uintptr(dev>>32)) if e1 != 0 { err = errnoErr(e1) } @@ -1753,22 +1656,7 @@ func Setuid(uid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func stat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func statfs(path string, stat *statfs_freebsd11_t) (err error) { +func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1783,21 +1671,6 @@ func statfs(path string, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func statfs_freebsd12(path string, stat *Statfs_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index a6479acd1..3802f4b37 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -912,7 +912,7 @@ func Fpathconf(fd int, name int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat(fd int, stat *stat_freebsd11_t) (err error) { +func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -922,17 +922,7 @@ func fstat(fd int, stat *stat_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstat_freebsd12(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -947,22 +937,7 @@ func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { +func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) @@ -972,16 +947,6 @@ func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1002,7 +967,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) @@ -1019,23 +984,6 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) @@ -1257,21 +1205,6 @@ func Listen(s int, backlog int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func lstat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1317,22 +1250,7 @@ func Mkfifo(path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknod(path string, mode uint32, dev int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mknodat(fd int, path string, mode uint32, dev int) (err error) { +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1347,21 +1265,6 @@ func mknodat(fd int, path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { @@ -1753,22 +1656,7 @@ func Setuid(uid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func stat(path string, stat *stat_freebsd11_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func statfs(path string, stat *statfs_freebsd11_t) (err error) { +func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1783,21 +1671,6 @@ func statfs(path string, stat *statfs_freebsd11_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func statfs_freebsd12(path string, stat *Statfs_t) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go new file mode 100644 index 000000000..8a2db7da9 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go @@ -0,0 +1,1889 @@ +// go run mksyscall.go -tags freebsd,riscv64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_riscv64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build freebsd && riscv64 +// +build freebsd,riscv64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data int) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirentries(fd int, buf []byte, basep *uint64) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go index 8cdfbe71e..523f2ba03 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go @@ -83,31 +83,6 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fstat(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index a1a9bcbbd..1239cc2de 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -180,6 +180,17 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func MemfdSecret(flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_MEMFD_SECRET, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index a057fc5d3..2925fe0a7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go +// go run mksyscall.go -l32 -openbsd -libc -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && 386 @@ -16,7 +16,7 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { - r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + r0, _, e1 := syscall_rawSyscall(libc_getgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -24,20 +24,28 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { return } +var libc_getgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { - _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + _, _, e1 := syscall_rawSyscall(libc_setgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { - r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_wait4_trampoline_addr, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -45,10 +53,14 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err return } +var libc_wait4_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + r0, _, e1 := syscall_syscall(libc_accept_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -56,30 +68,42 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +var libc_accept_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_accept accept "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_bind_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_bind_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_bind bind "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_connect_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_connect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_connect connect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + r0, _, e1 := syscall_rawSyscall(libc_socket_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -87,66 +111,94 @@ func socket(domain int, typ int, proto int) (fd int, err error) { return } +var libc_socket_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socket socket "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { - _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + _, _, e1 := syscall_syscall6(libc_getsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockopt getsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { - _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + _, _, e1 := syscall_syscall6(libc_setsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsockopt setsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getpeername_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getpeername_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpeername getpeername "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getsockname_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockname_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockname getsockname "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { - _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_shutdown_trampoline_addr, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_shutdown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shutdown shutdown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { - _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + _, _, e1 := syscall_rawSyscall6(libc_socketpair_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_socketpair_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socketpair socketpair "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -156,7 +208,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + r0, _, e1 := syscall_syscall6(libc_recvfrom_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -164,6 +216,10 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } +var libc_recvfrom_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -173,17 +229,21 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := syscall_syscall6(libc_sendto_trampoline_addr, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sendto_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendto sendto "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_recvmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -191,10 +251,14 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_recvmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_sendmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -202,10 +266,14 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_sendmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { - r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + r0, _, e1 := syscall_syscall6(libc_kevent_trampoline_addr, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -213,6 +281,10 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne return } +var libc_kevent_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kevent kevent "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -221,27 +293,35 @@ func utimes(path string, timeval *[2]Timeval) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_utimes_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_utimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimes utimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { - _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_futimes_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_futimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_futimes futimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + r0, _, e1 := syscall_syscall(libc_poll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -249,6 +329,10 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { return } +var libc_poll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_poll poll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { @@ -258,13 +342,17 @@ func Madvise(b []byte, behav int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + _, _, e1 := syscall_syscall(libc_madvise_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_madvise_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_madvise madvise "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -274,23 +362,31 @@ func Mlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_mlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlock mlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall(libc_mlockall_trampoline_addr, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -300,13 +396,17 @@ func Mprotect(b []byte, prot int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + _, _, e1 := syscall_syscall(libc_mprotect_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mprotect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { @@ -316,13 +416,17 @@ func Msync(b []byte, flags int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_msync_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_msync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_msync msync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -332,33 +436,45 @@ func Munlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_munlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlock munlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_munlockall_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + _, _, e1 := syscall_rawSyscall(libc_pipe2_trampoline_addr, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_pipe2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { @@ -368,7 +484,7 @@ func Getdents(fd int, buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_getdents_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -376,6 +492,10 @@ func Getdents(fd int, buf []byte) (n int, err error) { return } +var libc_getdents_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getdents getdents "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { @@ -385,7 +505,7 @@ func Getcwd(buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + r0, _, e1 := syscall_syscall(libc_getcwd_trampoline_addr, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -393,16 +513,24 @@ func Getcwd(buf []byte) (n int, err error) { return } +var libc_getcwd_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { - _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -412,17 +540,21 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + _, _, e1 := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sysctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -430,6 +562,10 @@ func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, return } +var libc_ppoll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ppoll ppoll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -438,23 +574,31 @@ func Access(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_access_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_access_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_access access "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { - _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + _, _, e1 := syscall_syscall(libc_adjtime_trampoline_addr, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_adjtime_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -463,13 +607,17 @@ func Chdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chdir chdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -478,13 +626,17 @@ func Chflags(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_chflags_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chflags chflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -493,13 +645,17 @@ func Chmod(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_chmod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chmod chmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -508,13 +664,17 @@ func Chown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_chown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chown chown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -523,27 +683,35 @@ func Chroot(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chroot_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chroot_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chroot chroot "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { - _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_close_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_close close "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { - r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + r0, _, e1 := syscall_syscall(libc_dup_trampoline_addr, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -551,33 +719,49 @@ func Dup(fd int) (nfd int, err error) { return } +var libc_dup_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup dup "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + _, _, e1 := syscall_syscall(libc_dup2_trampoline_addr, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(from int, to int, flags int) (err error) { - _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_dup3_trampoline_addr, uintptr(from), uintptr(to), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup3_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup3 dup3 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { - Syscall(SYS_EXIT, uintptr(code), 0, 0) + syscall_syscall(libc_exit_trampoline_addr, uintptr(code), 0, 0) return } +var libc_exit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_exit exit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -586,43 +770,59 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_faccessat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_faccessat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_faccessat faccessat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { - _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fchdir_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { - _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_fchflags_trampoline_addr, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchflags fchflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { - _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_fchmod_trampoline_addr, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -631,23 +831,31 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fchmodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { - _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_fchown_trampoline_addr, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchown fchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { @@ -656,27 +864,35 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_fchownat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchownat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { - _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_flock_trampoline_addr, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_flock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_flock flock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_fpathconf_trampoline_addr, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -684,16 +900,24 @@ func Fpathconf(fd int, name int) (val int, err error) { return } +var libc_fpathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstat fstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { @@ -702,71 +926,99 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fstatat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstatfs_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatfs fstatfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { - _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fsync_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fsync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fsync fsync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { - _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + _, _, e1 := syscall_syscall(libc_ftruncate_trampoline_addr, uintptr(fd), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ftruncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getegid_trampoline_addr, 0, 0, 0) egid = int(r0) return } +var libc_getegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getegid getegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_geteuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_geteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getgid_trampoline_addr, 0, 0, 0) gid = int(r0) return } +var libc_getgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgid getgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getpgid_trampoline_addr, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -774,34 +1026,50 @@ func Getpgid(pid int) (pgid int, err error) { return } +var libc_getpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { - r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpgrp_trampoline_addr, 0, 0, 0) pgrp = int(r0) return } +var libc_getpgrp_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpid_trampoline_addr, 0, 0, 0) pid = int(r0) return } +var libc_getpid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpid getpid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getppid_trampoline_addr, 0, 0, 0) ppid = int(r0) return } +var libc_getppid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getppid getppid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { - r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + r0, _, e1 := syscall_syscall(libc_getpriority_trampoline_addr, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -809,20 +1077,28 @@ func Getpriority(which int, who int) (prio int, err error) { return } +var libc_getpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrtable() (rtable int, err error) { - r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getrtable_trampoline_addr, 0, 0, 0) rtable = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -830,20 +1106,28 @@ func Getrtable() (rtable int, err error) { return } +var libc_getrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrtable getrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { - _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrusage_trampoline_addr, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrusage_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getsid_trampoline_addr, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -851,46 +1135,66 @@ func Getsid(pid int) (sid int, err error) { return } +var libc_getsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsid getsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_gettimeofday_trampoline_addr, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_gettimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_getuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getuid getuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { - r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + r0, _, _ := syscall_syscall(libc_issetugid_trampoline_addr, 0, 0, 0) tainted = bool(r0 != 0) return } +var libc_issetugid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_issetugid issetugid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { - _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + _, _, e1 := syscall_syscall(libc_kill_trampoline_addr, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_kill_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kill kill "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { - r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + r0, _, e1 := syscall_syscall(libc_kqueue_trampoline_addr, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -898,6 +1202,10 @@ func Kqueue() (fd int, err error) { return } +var libc_kqueue_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kqueue kqueue "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -906,13 +1214,17 @@ func Lchown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_lchown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lchown lchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -926,13 +1238,17 @@ func Link(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_link_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_link_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_link link "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { @@ -946,23 +1262,31 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er if err != nil { return } - _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_linkat_trampoline_addr, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_linkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_linkat linkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { - _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + _, _, e1 := syscall_syscall(libc_listen_trampoline_addr, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_listen_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_listen listen "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -971,13 +1295,17 @@ func Lstat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_lstat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lstat lstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -986,13 +1314,17 @@ func Mkdir(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { @@ -1001,13 +1333,17 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkdirat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdirat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -1016,13 +1352,17 @@ func Mkfifo(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkfifo_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifo_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifoat(dirfd int, path string, mode uint32) (err error) { @@ -1031,13 +1371,17 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkfifoat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifoat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -1046,13 +1390,17 @@ func Mknod(path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + _, _, e1 := syscall_syscall(libc_mknod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknod mknod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { @@ -1061,23 +1409,31 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + _, _, e1 := syscall_syscall6(libc_mknodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { - _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_nanosleep_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1086,7 +1442,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + r0, _, e1 := syscall_syscall(libc_open_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1094,6 +1450,10 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +var libc_open_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_open open "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { @@ -1102,7 +1462,7 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + r0, _, e1 := syscall_syscall6(libc_openat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1110,6 +1470,10 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { return } +var libc_openat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_openat openat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1118,7 +1482,7 @@ func Pathconf(path string, name int) (val int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_pathconf_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1126,6 +1490,10 @@ func Pathconf(path string, name int) (val int, err error) { return } +var libc_pathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pread(fd int, p []byte, offset int64) (n int, err error) { @@ -1135,7 +1503,7 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + r0, _, e1 := syscall_syscall6(libc_pread_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1143,6 +1511,10 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pread_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pread pread "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pwrite(fd int, p []byte, offset int64) (n int, err error) { @@ -1152,7 +1524,7 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + r0, _, e1 := syscall_syscall6(libc_pwrite_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1160,6 +1532,10 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pwrite_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1169,7 +1545,7 @@ func read(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1177,6 +1553,10 @@ func read(fd int, p []byte) (n int, err error) { return } +var libc_read_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_read read "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1191,7 +1571,7 @@ func Readlink(path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_readlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1199,6 +1579,10 @@ func Readlink(path string, buf []byte) (n int, err error) { return } +var libc_readlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlink readlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { @@ -1213,7 +1597,7 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_readlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1221,6 +1605,10 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { return } +var libc_readlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1234,13 +1622,17 @@ func Rename(from string, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_rename_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rename_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rename rename "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { @@ -1254,13 +1646,17 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + _, _, e1 := syscall_syscall6(libc_renameat_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_renameat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renameat renameat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1269,13 +1665,17 @@ func Revoke(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_revoke_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_revoke_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_revoke revoke "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1284,17 +1684,21 @@ func Rmdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_rmdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rmdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { - r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + r0, r1, e1 := syscall_syscall6(libc_lseek_trampoline_addr, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) @@ -1302,10 +1706,14 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return } +var libc_lseek_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lseek lseek "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + r0, _, e1 := syscall_syscall6(libc_select_trampoline_addr, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1313,36 +1721,52 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err return } +var libc_select_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_select select "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setegid setegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_seteuid_trampoline_addr, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_seteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setgid_trampoline_addr, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgid setgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1351,97 +1775,133 @@ func Setlogin(name string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_setlogin_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setlogin_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setlogin setlogin "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + _, _, e1 := syscall_rawSyscall(libc_setpgid_trampoline_addr, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { - _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + _, _, e1 := syscall_syscall(libc_setpriority_trampoline_addr, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + _, _, e1 := syscall_rawSyscall(libc_setregid_trampoline_addr, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setregid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setregid setregid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + _, _, e1 := syscall_rawSyscall(libc_setreuid_trampoline_addr, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setreuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + _, _, e1 := syscall_rawSyscall(libc_setresgid_trampoline_addr, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresgid setresgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + _, _, e1 := syscall_rawSyscall(libc_setresuid_trampoline_addr, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresuid setresuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrtable(rtable int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrtable setrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { - r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1449,26 +1909,38 @@ func Setsid() (pid int, err error) { return } +var libc_setsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsid setsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_settimeofday_trampoline_addr, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_settimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_settimeofday settimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setuid_trampoline_addr, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setuid setuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1477,13 +1949,17 @@ func Stat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_stat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_stat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_stat stat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1492,13 +1968,17 @@ func Statfs(path string, stat *Statfs_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_statfs_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_statfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_statfs statfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1512,13 +1992,17 @@ func Symlink(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_symlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlink symlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { @@ -1532,23 +2016,31 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + _, _, e1 := syscall_syscall(libc_symlinkat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlinkat symlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { - _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_sync_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sync sync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1557,21 +2049,29 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + _, _, e1 := syscall_syscall(libc_truncate_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_truncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_truncate truncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { - r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + r0, _, _ := syscall_syscall(libc_umask_trampoline_addr, uintptr(newmask), 0, 0) oldmask = int(r0) return } +var libc_umask_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_umask umask "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1580,13 +2080,17 @@ func Unlink(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_unlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlink unlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { @@ -1595,13 +2099,17 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_unlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1610,13 +2118,17 @@ func Unmount(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_unmount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unmount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unmount unmount "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1626,7 +2138,7 @@ func write(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1634,10 +2146,14 @@ func write(fd int, p []byte) (n int, err error) { return } +var libc_write_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_write write "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { - r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + r0, _, e1 := syscall_syscall9(libc_mmap_trampoline_addr, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -1645,20 +2161,28 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( return } +var libc_mmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mmap mmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { - _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + _, _, e1 := syscall_syscall(libc_munmap_trampoline_addr, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munmap munmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1669,7 +2193,7 @@ func readlen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1685,9 +2209,13 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error if err != nil { return } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } + +var libc_utimensat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s new file mode 100644 index 000000000..75eb2f5f3 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s @@ -0,0 +1,796 @@ +// go run mkasm.go openbsd 386 +// Code generated by the command above; DO NOT EDIT. + +#include "textflag.h" + +TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgroups(SB) + +GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getgroups_trampoline_addr(SB)/4, $libc_getgroups_trampoline<>(SB) + +TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgroups(SB) + +GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setgroups_trampoline_addr(SB)/4, $libc_setgroups_trampoline<>(SB) + +TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_wait4(SB) + +GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $4 +DATA ·libc_wait4_trampoline_addr(SB)/4, $libc_wait4_trampoline<>(SB) + +TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_accept(SB) + +GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $4 +DATA ·libc_accept_trampoline_addr(SB)/4, $libc_accept_trampoline<>(SB) + +TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_bind(SB) + +GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $4 +DATA ·libc_bind_trampoline_addr(SB)/4, $libc_bind_trampoline<>(SB) + +TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_connect(SB) + +GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $4 +DATA ·libc_connect_trampoline_addr(SB)/4, $libc_connect_trampoline<>(SB) + +TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socket(SB) + +GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $4 +DATA ·libc_socket_trampoline_addr(SB)/4, $libc_socket_trampoline<>(SB) + +TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockopt(SB) + +GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getsockopt_trampoline_addr(SB)/4, $libc_getsockopt_trampoline<>(SB) + +TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsockopt(SB) + +GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setsockopt_trampoline_addr(SB)/4, $libc_setsockopt_trampoline<>(SB) + +TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpeername(SB) + +GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpeername_trampoline_addr(SB)/4, $libc_getpeername_trampoline<>(SB) + +TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockname(SB) + +GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getsockname_trampoline_addr(SB)/4, $libc_getsockname_trampoline<>(SB) + +TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shutdown(SB) + +GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_shutdown_trampoline_addr(SB)/4, $libc_shutdown_trampoline<>(SB) + +TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socketpair(SB) + +GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $4 +DATA ·libc_socketpair_trampoline_addr(SB)/4, $libc_socketpair_trampoline<>(SB) + +TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvfrom(SB) + +GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $4 +DATA ·libc_recvfrom_trampoline_addr(SB)/4, $libc_recvfrom_trampoline<>(SB) + +TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendto(SB) + +GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sendto_trampoline_addr(SB)/4, $libc_sendto_trampoline<>(SB) + +TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvmsg(SB) + +GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $4 +DATA ·libc_recvmsg_trampoline_addr(SB)/4, $libc_recvmsg_trampoline<>(SB) + +TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendmsg(SB) + +GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sendmsg_trampoline_addr(SB)/4, $libc_sendmsg_trampoline<>(SB) + +TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kevent(SB) + +GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $4 +DATA ·libc_kevent_trampoline_addr(SB)/4, $libc_kevent_trampoline<>(SB) + +TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimes(SB) + +GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $4 +DATA ·libc_utimes_trampoline_addr(SB)/4, $libc_utimes_trampoline<>(SB) + +TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_futimes(SB) + +GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $4 +DATA ·libc_futimes_trampoline_addr(SB)/4, $libc_futimes_trampoline<>(SB) + +TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_poll(SB) + +GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $4 +DATA ·libc_poll_trampoline_addr(SB)/4, $libc_poll_trampoline<>(SB) + +TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_madvise(SB) + +GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $4 +DATA ·libc_madvise_trampoline_addr(SB)/4, $libc_madvise_trampoline<>(SB) + +TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlock(SB) + +GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mlock_trampoline_addr(SB)/4, $libc_mlock_trampoline<>(SB) + +TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlockall(SB) + +GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mlockall_trampoline_addr(SB)/4, $libc_mlockall_trampoline<>(SB) + +TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mprotect(SB) + +GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mprotect_trampoline_addr(SB)/4, $libc_mprotect_trampoline<>(SB) + +TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_msync(SB) + +GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $4 +DATA ·libc_msync_trampoline_addr(SB)/4, $libc_msync_trampoline<>(SB) + +TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlock(SB) + +GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $4 +DATA ·libc_munlock_trampoline_addr(SB)/4, $libc_munlock_trampoline<>(SB) + +TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlockall(SB) + +GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $4 +DATA ·libc_munlockall_trampoline_addr(SB)/4, $libc_munlockall_trampoline<>(SB) + +TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pipe2(SB) + +GLOBL ·libc_pipe2_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pipe2_trampoline_addr(SB)/4, $libc_pipe2_trampoline<>(SB) + +TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getdents(SB) + +GLOBL ·libc_getdents_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getdents_trampoline_addr(SB)/4, $libc_getdents_trampoline<>(SB) + +TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getcwd(SB) + +GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getcwd_trampoline_addr(SB)/4, $libc_getcwd_trampoline<>(SB) + +TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ioctl(SB) + +GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_ioctl_trampoline_addr(SB)/4, $libc_ioctl_trampoline<>(SB) + +TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) + +GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB) + +TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ppoll(SB) + +GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $4 +DATA ·libc_ppoll_trampoline_addr(SB)/4, $libc_ppoll_trampoline<>(SB) + +TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_access(SB) + +GLOBL ·libc_access_trampoline_addr(SB), RODATA, $4 +DATA ·libc_access_trampoline_addr(SB)/4, $libc_access_trampoline<>(SB) + +TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_adjtime(SB) + +GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $4 +DATA ·libc_adjtime_trampoline_addr(SB)/4, $libc_adjtime_trampoline<>(SB) + +TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chdir(SB) + +GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chdir_trampoline_addr(SB)/4, $libc_chdir_trampoline<>(SB) + +TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chflags(SB) + +GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chflags_trampoline_addr(SB)/4, $libc_chflags_trampoline<>(SB) + +TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chmod(SB) + +GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chmod_trampoline_addr(SB)/4, $libc_chmod_trampoline<>(SB) + +TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chown(SB) + +GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chown_trampoline_addr(SB)/4, $libc_chown_trampoline<>(SB) + +TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chroot(SB) + +GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chroot_trampoline_addr(SB)/4, $libc_chroot_trampoline<>(SB) + +TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_close(SB) + +GLOBL ·libc_close_trampoline_addr(SB), RODATA, $4 +DATA ·libc_close_trampoline_addr(SB)/4, $libc_close_trampoline<>(SB) + +TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup(SB) + +GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $4 +DATA ·libc_dup_trampoline_addr(SB)/4, $libc_dup_trampoline<>(SB) + +TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup2(SB) + +GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $4 +DATA ·libc_dup2_trampoline_addr(SB)/4, $libc_dup2_trampoline<>(SB) + +TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup3(SB) + +GLOBL ·libc_dup3_trampoline_addr(SB), RODATA, $4 +DATA ·libc_dup3_trampoline_addr(SB)/4, $libc_dup3_trampoline<>(SB) + +TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_exit(SB) + +GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $4 +DATA ·libc_exit_trampoline_addr(SB)/4, $libc_exit_trampoline<>(SB) + +TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_faccessat(SB) + +GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_faccessat_trampoline_addr(SB)/4, $libc_faccessat_trampoline<>(SB) + +TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchdir(SB) + +GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchdir_trampoline_addr(SB)/4, $libc_fchdir_trampoline<>(SB) + +TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchflags(SB) + +GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchflags_trampoline_addr(SB)/4, $libc_fchflags_trampoline<>(SB) + +TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmod(SB) + +GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchmod_trampoline_addr(SB)/4, $libc_fchmod_trampoline<>(SB) + +TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmodat(SB) + +GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchmodat_trampoline_addr(SB)/4, $libc_fchmodat_trampoline<>(SB) + +TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchown(SB) + +GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchown_trampoline_addr(SB)/4, $libc_fchown_trampoline<>(SB) + +TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchownat(SB) + +GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchownat_trampoline_addr(SB)/4, $libc_fchownat_trampoline<>(SB) + +TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_flock(SB) + +GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $4 +DATA ·libc_flock_trampoline_addr(SB)/4, $libc_flock_trampoline<>(SB) + +TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fpathconf(SB) + +GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fpathconf_trampoline_addr(SB)/4, $libc_fpathconf_trampoline<>(SB) + +TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstat(SB) + +GLOBL ·libc_fstat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fstat_trampoline_addr(SB)/4, $libc_fstat_trampoline<>(SB) + +TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatat(SB) + +GLOBL ·libc_fstatat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fstatat_trampoline_addr(SB)/4, $libc_fstatat_trampoline<>(SB) + +TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatfs(SB) + +GLOBL ·libc_fstatfs_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fstatfs_trampoline_addr(SB)/4, $libc_fstatfs_trampoline<>(SB) + +TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fsync(SB) + +GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fsync_trampoline_addr(SB)/4, $libc_fsync_trampoline<>(SB) + +TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ftruncate(SB) + +GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $4 +DATA ·libc_ftruncate_trampoline_addr(SB)/4, $libc_ftruncate_trampoline<>(SB) + +TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getegid(SB) + +GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getegid_trampoline_addr(SB)/4, $libc_getegid_trampoline<>(SB) + +TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_geteuid(SB) + +GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_geteuid_trampoline_addr(SB)/4, $libc_geteuid_trampoline<>(SB) + +TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgid(SB) + +GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getgid_trampoline_addr(SB)/4, $libc_getgid_trampoline<>(SB) + +TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgid(SB) + +GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpgid_trampoline_addr(SB)/4, $libc_getpgid_trampoline<>(SB) + +TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgrp(SB) + +GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpgrp_trampoline_addr(SB)/4, $libc_getpgrp_trampoline<>(SB) + +TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpid(SB) + +GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpid_trampoline_addr(SB)/4, $libc_getpid_trampoline<>(SB) + +TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getppid(SB) + +GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getppid_trampoline_addr(SB)/4, $libc_getppid_trampoline<>(SB) + +TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpriority(SB) + +GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpriority_trampoline_addr(SB)/4, $libc_getpriority_trampoline<>(SB) + +TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrlimit(SB) + +GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getrlimit_trampoline_addr(SB)/4, $libc_getrlimit_trampoline<>(SB) + +TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrtable(SB) + +GLOBL ·libc_getrtable_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getrtable_trampoline_addr(SB)/4, $libc_getrtable_trampoline<>(SB) + +TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrusage(SB) + +GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getrusage_trampoline_addr(SB)/4, $libc_getrusage_trampoline<>(SB) + +TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsid(SB) + +GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getsid_trampoline_addr(SB)/4, $libc_getsid_trampoline<>(SB) + +TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_gettimeofday(SB) + +GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $4 +DATA ·libc_gettimeofday_trampoline_addr(SB)/4, $libc_gettimeofday_trampoline<>(SB) + +TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getuid(SB) + +GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getuid_trampoline_addr(SB)/4, $libc_getuid_trampoline<>(SB) + +TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_issetugid(SB) + +GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_issetugid_trampoline_addr(SB)/4, $libc_issetugid_trampoline<>(SB) + +TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kill(SB) + +GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $4 +DATA ·libc_kill_trampoline_addr(SB)/4, $libc_kill_trampoline<>(SB) + +TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kqueue(SB) + +GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $4 +DATA ·libc_kqueue_trampoline_addr(SB)/4, $libc_kqueue_trampoline<>(SB) + +TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lchown(SB) + +GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_lchown_trampoline_addr(SB)/4, $libc_lchown_trampoline<>(SB) + +TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_link(SB) + +GLOBL ·libc_link_trampoline_addr(SB), RODATA, $4 +DATA ·libc_link_trampoline_addr(SB)/4, $libc_link_trampoline<>(SB) + +TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_linkat(SB) + +GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_linkat_trampoline_addr(SB)/4, $libc_linkat_trampoline<>(SB) + +TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_listen(SB) + +GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $4 +DATA ·libc_listen_trampoline_addr(SB)/4, $libc_listen_trampoline<>(SB) + +TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lstat(SB) + +GLOBL ·libc_lstat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_lstat_trampoline_addr(SB)/4, $libc_lstat_trampoline<>(SB) + +TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdir(SB) + +GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkdir_trampoline_addr(SB)/4, $libc_mkdir_trampoline<>(SB) + +TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdirat(SB) + +GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkdirat_trampoline_addr(SB)/4, $libc_mkdirat_trampoline<>(SB) + +TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifo(SB) + +GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkfifo_trampoline_addr(SB)/4, $libc_mkfifo_trampoline<>(SB) + +TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifoat(SB) + +GLOBL ·libc_mkfifoat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkfifoat_trampoline_addr(SB)/4, $libc_mkfifoat_trampoline<>(SB) + +TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknod(SB) + +GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mknod_trampoline_addr(SB)/4, $libc_mknod_trampoline<>(SB) + +TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknodat(SB) + +GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mknodat_trampoline_addr(SB)/4, $libc_mknodat_trampoline<>(SB) + +TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_nanosleep(SB) + +GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $4 +DATA ·libc_nanosleep_trampoline_addr(SB)/4, $libc_nanosleep_trampoline<>(SB) + +TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_open(SB) + +GLOBL ·libc_open_trampoline_addr(SB), RODATA, $4 +DATA ·libc_open_trampoline_addr(SB)/4, $libc_open_trampoline<>(SB) + +TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_openat(SB) + +GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_openat_trampoline_addr(SB)/4, $libc_openat_trampoline<>(SB) + +TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pathconf(SB) + +GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pathconf_trampoline_addr(SB)/4, $libc_pathconf_trampoline<>(SB) + +TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pread(SB) + +GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pread_trampoline_addr(SB)/4, $libc_pread_trampoline<>(SB) + +TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pwrite(SB) + +GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pwrite_trampoline_addr(SB)/4, $libc_pwrite_trampoline<>(SB) + +TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_read(SB) + +GLOBL ·libc_read_trampoline_addr(SB), RODATA, $4 +DATA ·libc_read_trampoline_addr(SB)/4, $libc_read_trampoline<>(SB) + +TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlink(SB) + +GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $4 +DATA ·libc_readlink_trampoline_addr(SB)/4, $libc_readlink_trampoline<>(SB) + +TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlinkat(SB) + +GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_readlinkat_trampoline_addr(SB)/4, $libc_readlinkat_trampoline<>(SB) + +TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rename(SB) + +GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $4 +DATA ·libc_rename_trampoline_addr(SB)/4, $libc_rename_trampoline<>(SB) + +TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renameat(SB) + +GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_renameat_trampoline_addr(SB)/4, $libc_renameat_trampoline<>(SB) + +TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_revoke(SB) + +GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $4 +DATA ·libc_revoke_trampoline_addr(SB)/4, $libc_revoke_trampoline<>(SB) + +TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rmdir(SB) + +GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_rmdir_trampoline_addr(SB)/4, $libc_rmdir_trampoline<>(SB) + +TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lseek(SB) + +GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $4 +DATA ·libc_lseek_trampoline_addr(SB)/4, $libc_lseek_trampoline<>(SB) + +TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_select(SB) + +GLOBL ·libc_select_trampoline_addr(SB), RODATA, $4 +DATA ·libc_select_trampoline_addr(SB)/4, $libc_select_trampoline<>(SB) + +TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setegid(SB) + +GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setegid_trampoline_addr(SB)/4, $libc_setegid_trampoline<>(SB) + +TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_seteuid(SB) + +GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_seteuid_trampoline_addr(SB)/4, $libc_seteuid_trampoline<>(SB) + +TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgid(SB) + +GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setgid_trampoline_addr(SB)/4, $libc_setgid_trampoline<>(SB) + +TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setlogin(SB) + +GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setlogin_trampoline_addr(SB)/4, $libc_setlogin_trampoline<>(SB) + +TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpgid(SB) + +GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setpgid_trampoline_addr(SB)/4, $libc_setpgid_trampoline<>(SB) + +TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpriority(SB) + +GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setpriority_trampoline_addr(SB)/4, $libc_setpriority_trampoline<>(SB) + +TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setregid(SB) + +GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setregid_trampoline_addr(SB)/4, $libc_setregid_trampoline<>(SB) + +TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setreuid(SB) + +GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setreuid_trampoline_addr(SB)/4, $libc_setreuid_trampoline<>(SB) + +TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresgid(SB) + +GLOBL ·libc_setresgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setresgid_trampoline_addr(SB)/4, $libc_setresgid_trampoline<>(SB) + +TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresuid(SB) + +GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setresuid_trampoline_addr(SB)/4, $libc_setresuid_trampoline<>(SB) + +TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrlimit(SB) + +GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setrlimit_trampoline_addr(SB)/4, $libc_setrlimit_trampoline<>(SB) + +TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrtable(SB) + +GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setrtable_trampoline_addr(SB)/4, $libc_setrtable_trampoline<>(SB) + +TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsid(SB) + +GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setsid_trampoline_addr(SB)/4, $libc_setsid_trampoline<>(SB) + +TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_settimeofday(SB) + +GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $4 +DATA ·libc_settimeofday_trampoline_addr(SB)/4, $libc_settimeofday_trampoline<>(SB) + +TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setuid(SB) + +GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setuid_trampoline_addr(SB)/4, $libc_setuid_trampoline<>(SB) + +TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_stat(SB) + +GLOBL ·libc_stat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_stat_trampoline_addr(SB)/4, $libc_stat_trampoline<>(SB) + +TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_statfs(SB) + +GLOBL ·libc_statfs_trampoline_addr(SB), RODATA, $4 +DATA ·libc_statfs_trampoline_addr(SB)/4, $libc_statfs_trampoline<>(SB) + +TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlink(SB) + +GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $4 +DATA ·libc_symlink_trampoline_addr(SB)/4, $libc_symlink_trampoline<>(SB) + +TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlinkat(SB) + +GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_symlinkat_trampoline_addr(SB)/4, $libc_symlinkat_trampoline<>(SB) + +TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sync(SB) + +GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sync_trampoline_addr(SB)/4, $libc_sync_trampoline<>(SB) + +TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_truncate(SB) + +GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $4 +DATA ·libc_truncate_trampoline_addr(SB)/4, $libc_truncate_trampoline<>(SB) + +TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_umask(SB) + +GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $4 +DATA ·libc_umask_trampoline_addr(SB)/4, $libc_umask_trampoline<>(SB) + +TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlink(SB) + +GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unlink_trampoline_addr(SB)/4, $libc_unlink_trampoline<>(SB) + +TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlinkat(SB) + +GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unlinkat_trampoline_addr(SB)/4, $libc_unlinkat_trampoline<>(SB) + +TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unmount(SB) + +GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unmount_trampoline_addr(SB)/4, $libc_unmount_trampoline<>(SB) + +TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_write(SB) + +GLOBL ·libc_write_trampoline_addr(SB), RODATA, $4 +DATA ·libc_write_trampoline_addr(SB)/4, $libc_write_trampoline<>(SB) + +TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mmap(SB) + +GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mmap_trampoline_addr(SB)/4, $libc_mmap_trampoline<>(SB) + +TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munmap(SB) + +GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $4 +DATA ·libc_munmap_trampoline_addr(SB)/4, $libc_munmap_trampoline<>(SB) + +TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) + +GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 04db8fa2f..98446d2b9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go +// go run mksyscall.go -openbsd -libc -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && amd64 @@ -16,7 +16,7 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { - r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + r0, _, e1 := syscall_rawSyscall(libc_getgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -24,20 +24,28 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { return } +var libc_getgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { - _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + _, _, e1 := syscall_rawSyscall(libc_setgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { - r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_wait4_trampoline_addr, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -45,10 +53,14 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err return } +var libc_wait4_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + r0, _, e1 := syscall_syscall(libc_accept_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -56,30 +68,42 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +var libc_accept_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_accept accept "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_bind_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_bind_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_bind bind "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_connect_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_connect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_connect connect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + r0, _, e1 := syscall_rawSyscall(libc_socket_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -87,66 +111,94 @@ func socket(domain int, typ int, proto int) (fd int, err error) { return } +var libc_socket_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socket socket "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { - _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + _, _, e1 := syscall_syscall6(libc_getsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockopt getsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { - _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + _, _, e1 := syscall_syscall6(libc_setsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsockopt setsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getpeername_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getpeername_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpeername getpeername "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getsockname_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockname_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockname getsockname "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { - _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_shutdown_trampoline_addr, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_shutdown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shutdown shutdown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { - _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + _, _, e1 := syscall_rawSyscall6(libc_socketpair_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_socketpair_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socketpair socketpair "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -156,7 +208,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + r0, _, e1 := syscall_syscall6(libc_recvfrom_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -164,6 +216,10 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } +var libc_recvfrom_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -173,17 +229,21 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := syscall_syscall6(libc_sendto_trampoline_addr, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sendto_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendto sendto "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_recvmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -191,10 +251,14 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_recvmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_sendmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -202,10 +266,14 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_sendmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { - r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + r0, _, e1 := syscall_syscall6(libc_kevent_trampoline_addr, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -213,6 +281,10 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne return } +var libc_kevent_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kevent kevent "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -221,27 +293,35 @@ func utimes(path string, timeval *[2]Timeval) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_utimes_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_utimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimes utimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { - _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_futimes_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_futimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_futimes futimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + r0, _, e1 := syscall_syscall(libc_poll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -249,6 +329,10 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { return } +var libc_poll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_poll poll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { @@ -258,13 +342,17 @@ func Madvise(b []byte, behav int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + _, _, e1 := syscall_syscall(libc_madvise_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_madvise_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_madvise madvise "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -274,23 +362,31 @@ func Mlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_mlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlock mlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall(libc_mlockall_trampoline_addr, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -300,13 +396,17 @@ func Mprotect(b []byte, prot int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + _, _, e1 := syscall_syscall(libc_mprotect_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mprotect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { @@ -316,13 +416,17 @@ func Msync(b []byte, flags int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_msync_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_msync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_msync msync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -332,33 +436,45 @@ func Munlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_munlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlock munlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_munlockall_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + _, _, e1 := syscall_rawSyscall(libc_pipe2_trampoline_addr, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_pipe2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { @@ -368,7 +484,7 @@ func Getdents(fd int, buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_getdents_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -376,6 +492,10 @@ func Getdents(fd int, buf []byte) (n int, err error) { return } +var libc_getdents_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getdents getdents "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { @@ -385,7 +505,7 @@ func Getcwd(buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + r0, _, e1 := syscall_syscall(libc_getcwd_trampoline_addr, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -393,16 +513,24 @@ func Getcwd(buf []byte) (n int, err error) { return } +var libc_getcwd_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { - _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -412,17 +540,21 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + _, _, e1 := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sysctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -430,6 +562,10 @@ func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, return } +var libc_ppoll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ppoll ppoll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -438,23 +574,31 @@ func Access(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_access_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_access_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_access access "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { - _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + _, _, e1 := syscall_syscall(libc_adjtime_trampoline_addr, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_adjtime_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -463,13 +607,17 @@ func Chdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chdir chdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -478,13 +626,17 @@ func Chflags(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_chflags_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chflags chflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -493,13 +645,17 @@ func Chmod(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_chmod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chmod chmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -508,13 +664,17 @@ func Chown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_chown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chown chown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -523,27 +683,35 @@ func Chroot(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chroot_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chroot_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chroot chroot "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { - _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_close_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_close close "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { - r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + r0, _, e1 := syscall_syscall(libc_dup_trampoline_addr, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -551,33 +719,49 @@ func Dup(fd int) (nfd int, err error) { return } +var libc_dup_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup dup "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + _, _, e1 := syscall_syscall(libc_dup2_trampoline_addr, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(from int, to int, flags int) (err error) { - _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_dup3_trampoline_addr, uintptr(from), uintptr(to), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup3_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup3 dup3 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { - Syscall(SYS_EXIT, uintptr(code), 0, 0) + syscall_syscall(libc_exit_trampoline_addr, uintptr(code), 0, 0) return } +var libc_exit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_exit exit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -586,43 +770,59 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_faccessat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_faccessat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_faccessat faccessat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { - _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fchdir_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { - _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_fchflags_trampoline_addr, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchflags fchflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { - _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_fchmod_trampoline_addr, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -631,23 +831,31 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fchmodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { - _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_fchown_trampoline_addr, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchown fchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { @@ -656,27 +864,35 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_fchownat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchownat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { - _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_flock_trampoline_addr, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_flock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_flock flock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_fpathconf_trampoline_addr, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -684,16 +900,24 @@ func Fpathconf(fd int, name int) (val int, err error) { return } +var libc_fpathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstat fstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { @@ -702,71 +926,99 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fstatat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstatfs_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatfs fstatfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { - _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fsync_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fsync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fsync fsync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { - _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + _, _, e1 := syscall_syscall(libc_ftruncate_trampoline_addr, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ftruncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getegid_trampoline_addr, 0, 0, 0) egid = int(r0) return } +var libc_getegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getegid getegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_geteuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_geteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getgid_trampoline_addr, 0, 0, 0) gid = int(r0) return } +var libc_getgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgid getgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getpgid_trampoline_addr, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -774,34 +1026,50 @@ func Getpgid(pid int) (pgid int, err error) { return } +var libc_getpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { - r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpgrp_trampoline_addr, 0, 0, 0) pgrp = int(r0) return } +var libc_getpgrp_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpid_trampoline_addr, 0, 0, 0) pid = int(r0) return } +var libc_getpid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpid getpid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getppid_trampoline_addr, 0, 0, 0) ppid = int(r0) return } +var libc_getppid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getppid getppid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { - r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + r0, _, e1 := syscall_syscall(libc_getpriority_trampoline_addr, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -809,20 +1077,28 @@ func Getpriority(which int, who int) (prio int, err error) { return } +var libc_getpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrtable() (rtable int, err error) { - r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getrtable_trampoline_addr, 0, 0, 0) rtable = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -830,20 +1106,28 @@ func Getrtable() (rtable int, err error) { return } +var libc_getrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrtable getrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { - _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrusage_trampoline_addr, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrusage_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getsid_trampoline_addr, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -851,46 +1135,66 @@ func Getsid(pid int) (sid int, err error) { return } +var libc_getsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsid getsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_gettimeofday_trampoline_addr, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_gettimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_getuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getuid getuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { - r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + r0, _, _ := syscall_syscall(libc_issetugid_trampoline_addr, 0, 0, 0) tainted = bool(r0 != 0) return } +var libc_issetugid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_issetugid issetugid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { - _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + _, _, e1 := syscall_syscall(libc_kill_trampoline_addr, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_kill_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kill kill "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { - r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + r0, _, e1 := syscall_syscall(libc_kqueue_trampoline_addr, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -898,6 +1202,10 @@ func Kqueue() (fd int, err error) { return } +var libc_kqueue_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kqueue kqueue "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -906,13 +1214,17 @@ func Lchown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_lchown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lchown lchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -926,13 +1238,17 @@ func Link(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_link_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_link_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_link link "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { @@ -946,23 +1262,31 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er if err != nil { return } - _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_linkat_trampoline_addr, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_linkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_linkat linkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { - _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + _, _, e1 := syscall_syscall(libc_listen_trampoline_addr, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_listen_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_listen listen "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -971,13 +1295,17 @@ func Lstat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_lstat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lstat lstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -986,13 +1314,17 @@ func Mkdir(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { @@ -1001,13 +1333,17 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkdirat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdirat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -1016,13 +1352,17 @@ func Mkfifo(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkfifo_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifo_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifoat(dirfd int, path string, mode uint32) (err error) { @@ -1031,13 +1371,17 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkfifoat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifoat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -1046,13 +1390,17 @@ func Mknod(path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + _, _, e1 := syscall_syscall(libc_mknod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknod mknod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { @@ -1061,23 +1409,31 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + _, _, e1 := syscall_syscall6(libc_mknodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { - _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_nanosleep_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1086,7 +1442,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + r0, _, e1 := syscall_syscall(libc_open_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1094,6 +1450,10 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +var libc_open_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_open open "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { @@ -1102,7 +1462,7 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + r0, _, e1 := syscall_syscall6(libc_openat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1110,6 +1470,10 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { return } +var libc_openat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_openat openat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1118,7 +1482,7 @@ func Pathconf(path string, name int) (val int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_pathconf_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1126,6 +1490,10 @@ func Pathconf(path string, name int) (val int, err error) { return } +var libc_pathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pread(fd int, p []byte, offset int64) (n int, err error) { @@ -1135,7 +1503,7 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall_syscall6(libc_pread_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1143,6 +1511,10 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pread_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pread pread "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pwrite(fd int, p []byte, offset int64) (n int, err error) { @@ -1152,7 +1524,7 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall_syscall6(libc_pwrite_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1160,6 +1532,10 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pwrite_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1169,7 +1545,7 @@ func read(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1177,6 +1553,10 @@ func read(fd int, p []byte) (n int, err error) { return } +var libc_read_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_read read "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1191,7 +1571,7 @@ func Readlink(path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_readlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1199,6 +1579,10 @@ func Readlink(path string, buf []byte) (n int, err error) { return } +var libc_readlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlink readlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { @@ -1213,7 +1597,7 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_readlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1221,6 +1605,10 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { return } +var libc_readlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1234,13 +1622,17 @@ func Rename(from string, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_rename_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rename_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rename rename "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { @@ -1254,13 +1646,17 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + _, _, e1 := syscall_syscall6(libc_renameat_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_renameat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renameat renameat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1269,13 +1665,17 @@ func Revoke(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_revoke_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_revoke_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_revoke revoke "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1284,17 +1684,21 @@ func Rmdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_rmdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rmdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { - r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + r0, _, e1 := syscall_syscall(libc_lseek_trampoline_addr, uintptr(fd), uintptr(offset), uintptr(whence)) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) @@ -1302,10 +1706,14 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return } +var libc_lseek_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lseek lseek "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + r0, _, e1 := syscall_syscall6(libc_select_trampoline_addr, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1313,36 +1721,52 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err return } +var libc_select_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_select select "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setegid setegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_seteuid_trampoline_addr, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_seteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setgid_trampoline_addr, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgid setgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1351,97 +1775,133 @@ func Setlogin(name string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_setlogin_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setlogin_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setlogin setlogin "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + _, _, e1 := syscall_rawSyscall(libc_setpgid_trampoline_addr, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { - _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + _, _, e1 := syscall_syscall(libc_setpriority_trampoline_addr, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + _, _, e1 := syscall_rawSyscall(libc_setregid_trampoline_addr, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setregid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setregid setregid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + _, _, e1 := syscall_rawSyscall(libc_setreuid_trampoline_addr, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setreuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + _, _, e1 := syscall_rawSyscall(libc_setresgid_trampoline_addr, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresgid setresgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + _, _, e1 := syscall_rawSyscall(libc_setresuid_trampoline_addr, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresuid setresuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrtable(rtable int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrtable setrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { - r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1449,26 +1909,38 @@ func Setsid() (pid int, err error) { return } +var libc_setsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsid setsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_settimeofday_trampoline_addr, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_settimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_settimeofday settimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setuid_trampoline_addr, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setuid setuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1477,13 +1949,17 @@ func Stat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_stat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_stat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_stat stat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1492,13 +1968,17 @@ func Statfs(path string, stat *Statfs_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_statfs_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_statfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_statfs statfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1512,13 +1992,17 @@ func Symlink(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_symlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlink symlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { @@ -1532,23 +2016,31 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + _, _, e1 := syscall_syscall(libc_symlinkat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlinkat symlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { - _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_sync_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sync sync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1557,21 +2049,29 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + _, _, e1 := syscall_syscall(libc_truncate_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_truncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_truncate truncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { - r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + r0, _, _ := syscall_syscall(libc_umask_trampoline_addr, uintptr(newmask), 0, 0) oldmask = int(r0) return } +var libc_umask_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_umask umask "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1580,13 +2080,17 @@ func Unlink(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_unlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlink unlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { @@ -1595,13 +2099,17 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_unlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1610,13 +2118,17 @@ func Unmount(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_unmount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unmount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unmount unmount "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1626,7 +2138,7 @@ func write(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1634,10 +2146,14 @@ func write(fd int, p []byte) (n int, err error) { return } +var libc_write_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_write write "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { - r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + r0, _, e1 := syscall_syscall6(libc_mmap_trampoline_addr, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -1645,20 +2161,28 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( return } +var libc_mmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mmap mmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { - _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + _, _, e1 := syscall_syscall(libc_munmap_trampoline_addr, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munmap munmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1669,7 +2193,7 @@ func readlen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1685,9 +2209,13 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error if err != nil { return } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } + +var libc_utimensat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s new file mode 100644 index 000000000..243a6663c --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s @@ -0,0 +1,796 @@ +// go run mkasm.go openbsd amd64 +// Code generated by the command above; DO NOT EDIT. + +#include "textflag.h" + +TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgroups(SB) + +GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB) + +TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgroups(SB) + +GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB) + +TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_wait4(SB) + +GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $8 +DATA ·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB) + +TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_accept(SB) + +GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $8 +DATA ·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB) + +TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_bind(SB) + +GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $8 +DATA ·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB) + +TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_connect(SB) + +GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $8 +DATA ·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB) + +TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socket(SB) + +GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $8 +DATA ·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB) + +TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockopt(SB) + +GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB) + +TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsockopt(SB) + +GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB) + +TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpeername(SB) + +GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB) + +TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockname(SB) + +GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB) + +TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shutdown(SB) + +GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB) + +TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socketpair(SB) + +GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $8 +DATA ·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB) + +TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvfrom(SB) + +GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $8 +DATA ·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB) + +TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendto(SB) + +GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB) + +TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvmsg(SB) + +GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $8 +DATA ·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB) + +TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendmsg(SB) + +GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB) + +TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kevent(SB) + +GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB) + +TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimes(SB) + +GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB) + +TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_futimes(SB) + +GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $8 +DATA ·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB) + +TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_poll(SB) + +GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) + +TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_madvise(SB) + +GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $8 +DATA ·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB) + +TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlock(SB) + +GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB) + +TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlockall(SB) + +GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB) + +TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mprotect(SB) + +GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB) + +TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_msync(SB) + +GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB) + +TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlock(SB) + +GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB) + +TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlockall(SB) + +GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB) + +TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pipe2(SB) + +GLOBL ·libc_pipe2_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pipe2_trampoline_addr(SB)/8, $libc_pipe2_trampoline<>(SB) + +TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getdents(SB) + +GLOBL ·libc_getdents_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getdents_trampoline_addr(SB)/8, $libc_getdents_trampoline<>(SB) + +TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getcwd(SB) + +GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) + +TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ioctl(SB) + +GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) + +TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) + +GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) + +TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ppoll(SB) + +GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ppoll_trampoline_addr(SB)/8, $libc_ppoll_trampoline<>(SB) + +TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_access(SB) + +GLOBL ·libc_access_trampoline_addr(SB), RODATA, $8 +DATA ·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB) + +TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_adjtime(SB) + +GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $8 +DATA ·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB) + +TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chdir(SB) + +GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB) + +TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chflags(SB) + +GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB) + +TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chmod(SB) + +GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB) + +TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chown(SB) + +GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB) + +TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chroot(SB) + +GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB) + +TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_close(SB) + +GLOBL ·libc_close_trampoline_addr(SB), RODATA, $8 +DATA ·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB) + +TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup(SB) + +GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB) + +TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup2(SB) + +GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB) + +TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup3(SB) + +GLOBL ·libc_dup3_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup3_trampoline_addr(SB)/8, $libc_dup3_trampoline<>(SB) + +TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_exit(SB) + +GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB) + +TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_faccessat(SB) + +GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB) + +TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchdir(SB) + +GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB) + +TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchflags(SB) + +GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB) + +TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmod(SB) + +GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB) + +TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmodat(SB) + +GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB) + +TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchown(SB) + +GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB) + +TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchownat(SB) + +GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB) + +TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_flock(SB) + +GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB) + +TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fpathconf(SB) + +GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB) + +TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstat(SB) + +GLOBL ·libc_fstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB) + +TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatat(SB) + +GLOBL ·libc_fstatat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB) + +TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatfs(SB) + +GLOBL ·libc_fstatfs_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB) + +TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fsync(SB) + +GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB) + +TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ftruncate(SB) + +GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB) + +TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getegid(SB) + +GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB) + +TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_geteuid(SB) + +GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB) + +TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgid(SB) + +GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB) + +TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgid(SB) + +GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB) + +TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgrp(SB) + +GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB) + +TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpid(SB) + +GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB) + +TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getppid(SB) + +GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB) + +TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpriority(SB) + +GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB) + +TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrlimit(SB) + +GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB) + +TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrtable(SB) + +GLOBL ·libc_getrtable_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrtable_trampoline_addr(SB)/8, $libc_getrtable_trampoline<>(SB) + +TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrusage(SB) + +GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB) + +TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsid(SB) + +GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB) + +TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_gettimeofday(SB) + +GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $8 +DATA ·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB) + +TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getuid(SB) + +GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB) + +TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_issetugid(SB) + +GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB) + +TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kill(SB) + +GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB) + +TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kqueue(SB) + +GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB) + +TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lchown(SB) + +GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB) + +TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_link(SB) + +GLOBL ·libc_link_trampoline_addr(SB), RODATA, $8 +DATA ·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB) + +TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_linkat(SB) + +GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB) + +TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_listen(SB) + +GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $8 +DATA ·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB) + +TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lstat(SB) + +GLOBL ·libc_lstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB) + +TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdir(SB) + +GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB) + +TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdirat(SB) + +GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB) + +TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifo(SB) + +GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB) + +TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifoat(SB) + +GLOBL ·libc_mkfifoat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkfifoat_trampoline_addr(SB)/8, $libc_mkfifoat_trampoline<>(SB) + +TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknod(SB) + +GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) + +TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknodat(SB) + +GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB) + +TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_nanosleep(SB) + +GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $8 +DATA ·libc_nanosleep_trampoline_addr(SB)/8, $libc_nanosleep_trampoline<>(SB) + +TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_open(SB) + +GLOBL ·libc_open_trampoline_addr(SB), RODATA, $8 +DATA ·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB) + +TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_openat(SB) + +GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB) + +TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pathconf(SB) + +GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB) + +TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pread(SB) + +GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB) + +TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pwrite(SB) + +GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB) + +TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_read(SB) + +GLOBL ·libc_read_trampoline_addr(SB), RODATA, $8 +DATA ·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB) + +TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlink(SB) + +GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB) + +TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlinkat(SB) + +GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB) + +TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rename(SB) + +GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $8 +DATA ·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB) + +TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renameat(SB) + +GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB) + +TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_revoke(SB) + +GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $8 +DATA ·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB) + +TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rmdir(SB) + +GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB) + +TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lseek(SB) + +GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB) + +TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_select(SB) + +GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 +DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) + +TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setegid(SB) + +GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB) + +TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_seteuid(SB) + +GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB) + +TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgid(SB) + +GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB) + +TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setlogin(SB) + +GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB) + +TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpgid(SB) + +GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB) + +TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpriority(SB) + +GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB) + +TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setregid(SB) + +GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB) + +TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setreuid(SB) + +GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) + +TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresgid(SB) + +GLOBL ·libc_setresgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setresgid_trampoline_addr(SB)/8, $libc_setresgid_trampoline<>(SB) + +TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresuid(SB) + +GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) + +TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrlimit(SB) + +GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) + +TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrtable(SB) + +GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setrtable_trampoline_addr(SB)/8, $libc_setrtable_trampoline<>(SB) + +TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsid(SB) + +GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB) + +TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_settimeofday(SB) + +GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $8 +DATA ·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB) + +TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setuid(SB) + +GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB) + +TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_stat(SB) + +GLOBL ·libc_stat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB) + +TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_statfs(SB) + +GLOBL ·libc_statfs_trampoline_addr(SB), RODATA, $8 +DATA ·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB) + +TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlink(SB) + +GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB) + +TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlinkat(SB) + +GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB) + +TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sync(SB) + +GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB) + +TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_truncate(SB) + +GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $8 +DATA ·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB) + +TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_umask(SB) + +GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $8 +DATA ·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB) + +TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlink(SB) + +GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB) + +TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlinkat(SB) + +GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB) + +TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unmount(SB) + +GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB) + +TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_write(SB) + +GLOBL ·libc_write_trampoline_addr(SB), RODATA, $8 +DATA ·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB) + +TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mmap(SB) + +GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB) + +TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munmap(SB) + +GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) + +TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) + +GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index 69f803006..8da6791d1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -l32 -openbsd -arm -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go +// go run mksyscall.go -l32 -openbsd -arm -libc -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && arm @@ -16,7 +16,7 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { - r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + r0, _, e1 := syscall_rawSyscall(libc_getgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -24,20 +24,28 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { return } +var libc_getgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { - _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + _, _, e1 := syscall_rawSyscall(libc_setgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { - r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_wait4_trampoline_addr, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -45,10 +53,14 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err return } +var libc_wait4_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + r0, _, e1 := syscall_syscall(libc_accept_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -56,30 +68,42 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +var libc_accept_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_accept accept "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_bind_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_bind_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_bind bind "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_connect_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_connect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_connect connect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + r0, _, e1 := syscall_rawSyscall(libc_socket_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -87,66 +111,94 @@ func socket(domain int, typ int, proto int) (fd int, err error) { return } +var libc_socket_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socket socket "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { - _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + _, _, e1 := syscall_syscall6(libc_getsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockopt getsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { - _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + _, _, e1 := syscall_syscall6(libc_setsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsockopt setsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getpeername_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getpeername_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpeername getpeername "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getsockname_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockname_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockname getsockname "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { - _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_shutdown_trampoline_addr, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_shutdown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shutdown shutdown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { - _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + _, _, e1 := syscall_rawSyscall6(libc_socketpair_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_socketpair_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socketpair socketpair "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -156,7 +208,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + r0, _, e1 := syscall_syscall6(libc_recvfrom_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -164,6 +216,10 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } +var libc_recvfrom_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -173,17 +229,21 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := syscall_syscall6(libc_sendto_trampoline_addr, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sendto_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendto sendto "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_recvmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -191,10 +251,14 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_recvmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_sendmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -202,10 +266,14 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_sendmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { - r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + r0, _, e1 := syscall_syscall6(libc_kevent_trampoline_addr, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -213,6 +281,10 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne return } +var libc_kevent_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kevent kevent "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -221,27 +293,35 @@ func utimes(path string, timeval *[2]Timeval) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_utimes_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_utimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimes utimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { - _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_futimes_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_futimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_futimes futimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + r0, _, e1 := syscall_syscall(libc_poll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -249,6 +329,10 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { return } +var libc_poll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_poll poll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { @@ -258,13 +342,17 @@ func Madvise(b []byte, behav int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + _, _, e1 := syscall_syscall(libc_madvise_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_madvise_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_madvise madvise "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -274,23 +362,31 @@ func Mlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_mlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlock mlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall(libc_mlockall_trampoline_addr, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -300,13 +396,17 @@ func Mprotect(b []byte, prot int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + _, _, e1 := syscall_syscall(libc_mprotect_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mprotect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { @@ -316,13 +416,17 @@ func Msync(b []byte, flags int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_msync_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_msync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_msync msync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -332,33 +436,45 @@ func Munlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_munlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlock munlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_munlockall_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + _, _, e1 := syscall_rawSyscall(libc_pipe2_trampoline_addr, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_pipe2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { @@ -368,7 +484,7 @@ func Getdents(fd int, buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_getdents_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -376,6 +492,10 @@ func Getdents(fd int, buf []byte) (n int, err error) { return } +var libc_getdents_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getdents getdents "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { @@ -385,7 +505,7 @@ func Getcwd(buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + r0, _, e1 := syscall_syscall(libc_getcwd_trampoline_addr, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -393,16 +513,24 @@ func Getcwd(buf []byte) (n int, err error) { return } +var libc_getcwd_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { - _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -412,17 +540,21 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + _, _, e1 := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sysctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -430,6 +562,10 @@ func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, return } +var libc_ppoll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ppoll ppoll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -438,23 +574,31 @@ func Access(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_access_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_access_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_access access "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { - _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + _, _, e1 := syscall_syscall(libc_adjtime_trampoline_addr, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_adjtime_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -463,13 +607,17 @@ func Chdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chdir chdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -478,13 +626,17 @@ func Chflags(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_chflags_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chflags chflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -493,13 +645,17 @@ func Chmod(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_chmod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chmod chmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -508,13 +664,17 @@ func Chown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_chown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chown chown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -523,27 +683,35 @@ func Chroot(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chroot_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chroot_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chroot chroot "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { - _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_close_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_close close "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { - r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + r0, _, e1 := syscall_syscall(libc_dup_trampoline_addr, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -551,33 +719,49 @@ func Dup(fd int) (nfd int, err error) { return } +var libc_dup_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup dup "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + _, _, e1 := syscall_syscall(libc_dup2_trampoline_addr, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(from int, to int, flags int) (err error) { - _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_dup3_trampoline_addr, uintptr(from), uintptr(to), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup3_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup3 dup3 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { - Syscall(SYS_EXIT, uintptr(code), 0, 0) + syscall_syscall(libc_exit_trampoline_addr, uintptr(code), 0, 0) return } +var libc_exit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_exit exit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -586,43 +770,59 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_faccessat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_faccessat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_faccessat faccessat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { - _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fchdir_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { - _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_fchflags_trampoline_addr, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchflags fchflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { - _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_fchmod_trampoline_addr, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -631,23 +831,31 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fchmodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { - _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_fchown_trampoline_addr, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchown fchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { @@ -656,27 +864,35 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_fchownat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchownat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { - _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_flock_trampoline_addr, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_flock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_flock flock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_fpathconf_trampoline_addr, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -684,16 +900,24 @@ func Fpathconf(fd int, name int) (val int, err error) { return } +var libc_fpathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstat fstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { @@ -702,71 +926,99 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fstatat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstatfs_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatfs fstatfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { - _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fsync_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fsync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fsync fsync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { - _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + _, _, e1 := syscall_syscall6(libc_ftruncate_trampoline_addr, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ftruncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getegid_trampoline_addr, 0, 0, 0) egid = int(r0) return } +var libc_getegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getegid getegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_geteuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_geteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getgid_trampoline_addr, 0, 0, 0) gid = int(r0) return } +var libc_getgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgid getgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getpgid_trampoline_addr, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -774,34 +1026,50 @@ func Getpgid(pid int) (pgid int, err error) { return } +var libc_getpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { - r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpgrp_trampoline_addr, 0, 0, 0) pgrp = int(r0) return } +var libc_getpgrp_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpid_trampoline_addr, 0, 0, 0) pid = int(r0) return } +var libc_getpid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpid getpid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getppid_trampoline_addr, 0, 0, 0) ppid = int(r0) return } +var libc_getppid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getppid getppid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { - r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + r0, _, e1 := syscall_syscall(libc_getpriority_trampoline_addr, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -809,20 +1077,28 @@ func Getpriority(which int, who int) (prio int, err error) { return } +var libc_getpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrtable() (rtable int, err error) { - r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getrtable_trampoline_addr, 0, 0, 0) rtable = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -830,20 +1106,28 @@ func Getrtable() (rtable int, err error) { return } +var libc_getrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrtable getrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { - _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrusage_trampoline_addr, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrusage_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getsid_trampoline_addr, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -851,46 +1135,66 @@ func Getsid(pid int) (sid int, err error) { return } +var libc_getsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsid getsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_gettimeofday_trampoline_addr, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_gettimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_getuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getuid getuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { - r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + r0, _, _ := syscall_syscall(libc_issetugid_trampoline_addr, 0, 0, 0) tainted = bool(r0 != 0) return } +var libc_issetugid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_issetugid issetugid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { - _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + _, _, e1 := syscall_syscall(libc_kill_trampoline_addr, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_kill_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kill kill "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { - r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + r0, _, e1 := syscall_syscall(libc_kqueue_trampoline_addr, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -898,6 +1202,10 @@ func Kqueue() (fd int, err error) { return } +var libc_kqueue_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kqueue kqueue "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -906,13 +1214,17 @@ func Lchown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_lchown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lchown lchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -926,13 +1238,17 @@ func Link(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_link_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_link_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_link link "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { @@ -946,23 +1262,31 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er if err != nil { return } - _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_linkat_trampoline_addr, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_linkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_linkat linkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { - _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + _, _, e1 := syscall_syscall(libc_listen_trampoline_addr, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_listen_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_listen listen "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -971,13 +1295,17 @@ func Lstat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_lstat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lstat lstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -986,13 +1314,17 @@ func Mkdir(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { @@ -1001,13 +1333,17 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkdirat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdirat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -1016,13 +1352,17 @@ func Mkfifo(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkfifo_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifo_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifoat(dirfd int, path string, mode uint32) (err error) { @@ -1031,13 +1371,17 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkfifoat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifoat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -1046,13 +1390,17 @@ func Mknod(path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + _, _, e1 := syscall_syscall(libc_mknod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknod mknod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { @@ -1061,23 +1409,31 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + _, _, e1 := syscall_syscall6(libc_mknodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { - _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_nanosleep_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1086,7 +1442,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + r0, _, e1 := syscall_syscall(libc_open_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1094,6 +1450,10 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +var libc_open_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_open open "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { @@ -1102,7 +1462,7 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + r0, _, e1 := syscall_syscall6(libc_openat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1110,6 +1470,10 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { return } +var libc_openat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_openat openat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1118,7 +1482,7 @@ func Pathconf(path string, name int) (val int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_pathconf_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1126,6 +1490,10 @@ func Pathconf(path string, name int) (val int, err error) { return } +var libc_pathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pread(fd int, p []byte, offset int64) (n int, err error) { @@ -1135,7 +1503,7 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + r0, _, e1 := syscall_syscall6(libc_pread_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1143,6 +1511,10 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pread_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pread pread "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pwrite(fd int, p []byte, offset int64) (n int, err error) { @@ -1152,7 +1524,7 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + r0, _, e1 := syscall_syscall6(libc_pwrite_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1160,6 +1532,10 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pwrite_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1169,7 +1545,7 @@ func read(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1177,6 +1553,10 @@ func read(fd int, p []byte) (n int, err error) { return } +var libc_read_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_read read "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1191,7 +1571,7 @@ func Readlink(path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_readlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1199,6 +1579,10 @@ func Readlink(path string, buf []byte) (n int, err error) { return } +var libc_readlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlink readlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { @@ -1213,7 +1597,7 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_readlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1221,6 +1605,10 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { return } +var libc_readlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1234,13 +1622,17 @@ func Rename(from string, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_rename_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rename_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rename rename "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { @@ -1254,13 +1646,17 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + _, _, e1 := syscall_syscall6(libc_renameat_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_renameat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renameat renameat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1269,13 +1665,17 @@ func Revoke(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_revoke_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_revoke_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_revoke revoke "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1284,17 +1684,21 @@ func Rmdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_rmdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rmdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { - r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + r0, r1, e1 := syscall_syscall6(libc_lseek_trampoline_addr, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) @@ -1302,10 +1706,14 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return } +var libc_lseek_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lseek lseek "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + r0, _, e1 := syscall_syscall6(libc_select_trampoline_addr, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1313,36 +1721,52 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err return } +var libc_select_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_select select "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setegid setegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_seteuid_trampoline_addr, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_seteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setgid_trampoline_addr, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgid setgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1351,97 +1775,133 @@ func Setlogin(name string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_setlogin_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setlogin_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setlogin setlogin "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + _, _, e1 := syscall_rawSyscall(libc_setpgid_trampoline_addr, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { - _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + _, _, e1 := syscall_syscall(libc_setpriority_trampoline_addr, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + _, _, e1 := syscall_rawSyscall(libc_setregid_trampoline_addr, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setregid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setregid setregid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + _, _, e1 := syscall_rawSyscall(libc_setreuid_trampoline_addr, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setreuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + _, _, e1 := syscall_rawSyscall(libc_setresgid_trampoline_addr, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresgid setresgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + _, _, e1 := syscall_rawSyscall(libc_setresuid_trampoline_addr, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresuid setresuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrtable(rtable int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrtable setrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { - r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1449,26 +1909,38 @@ func Setsid() (pid int, err error) { return } +var libc_setsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsid setsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_settimeofday_trampoline_addr, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_settimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_settimeofday settimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setuid_trampoline_addr, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setuid setuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1477,13 +1949,17 @@ func Stat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_stat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_stat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_stat stat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1492,13 +1968,17 @@ func Statfs(path string, stat *Statfs_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_statfs_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_statfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_statfs statfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1512,13 +1992,17 @@ func Symlink(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_symlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlink symlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { @@ -1532,23 +2016,31 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + _, _, e1 := syscall_syscall(libc_symlinkat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlinkat symlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { - _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_sync_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sync sync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1557,21 +2049,29 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + _, _, e1 := syscall_syscall6(libc_truncate_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_truncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_truncate truncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { - r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + r0, _, _ := syscall_syscall(libc_umask_trampoline_addr, uintptr(newmask), 0, 0) oldmask = int(r0) return } +var libc_umask_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_umask umask "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1580,13 +2080,17 @@ func Unlink(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_unlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlink unlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { @@ -1595,13 +2099,17 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_unlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1610,13 +2118,17 @@ func Unmount(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_unmount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unmount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unmount unmount "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1626,7 +2138,7 @@ func write(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1634,10 +2146,14 @@ func write(fd int, p []byte) (n int, err error) { return } +var libc_write_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_write write "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { - r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + r0, _, e1 := syscall_syscall9(libc_mmap_trampoline_addr, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -1645,20 +2161,28 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( return } +var libc_mmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mmap mmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { - _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + _, _, e1 := syscall_syscall(libc_munmap_trampoline_addr, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munmap munmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1669,7 +2193,7 @@ func readlen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1685,9 +2209,13 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error if err != nil { return } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } + +var libc_utimensat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s new file mode 100644 index 000000000..9ad116d9f --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s @@ -0,0 +1,796 @@ +// go run mkasm.go openbsd arm +// Code generated by the command above; DO NOT EDIT. + +#include "textflag.h" + +TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgroups(SB) + +GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getgroups_trampoline_addr(SB)/4, $libc_getgroups_trampoline<>(SB) + +TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgroups(SB) + +GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setgroups_trampoline_addr(SB)/4, $libc_setgroups_trampoline<>(SB) + +TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_wait4(SB) + +GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $4 +DATA ·libc_wait4_trampoline_addr(SB)/4, $libc_wait4_trampoline<>(SB) + +TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_accept(SB) + +GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $4 +DATA ·libc_accept_trampoline_addr(SB)/4, $libc_accept_trampoline<>(SB) + +TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_bind(SB) + +GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $4 +DATA ·libc_bind_trampoline_addr(SB)/4, $libc_bind_trampoline<>(SB) + +TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_connect(SB) + +GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $4 +DATA ·libc_connect_trampoline_addr(SB)/4, $libc_connect_trampoline<>(SB) + +TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socket(SB) + +GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $4 +DATA ·libc_socket_trampoline_addr(SB)/4, $libc_socket_trampoline<>(SB) + +TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockopt(SB) + +GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getsockopt_trampoline_addr(SB)/4, $libc_getsockopt_trampoline<>(SB) + +TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsockopt(SB) + +GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setsockopt_trampoline_addr(SB)/4, $libc_setsockopt_trampoline<>(SB) + +TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpeername(SB) + +GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpeername_trampoline_addr(SB)/4, $libc_getpeername_trampoline<>(SB) + +TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockname(SB) + +GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getsockname_trampoline_addr(SB)/4, $libc_getsockname_trampoline<>(SB) + +TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shutdown(SB) + +GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_shutdown_trampoline_addr(SB)/4, $libc_shutdown_trampoline<>(SB) + +TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socketpair(SB) + +GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $4 +DATA ·libc_socketpair_trampoline_addr(SB)/4, $libc_socketpair_trampoline<>(SB) + +TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvfrom(SB) + +GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $4 +DATA ·libc_recvfrom_trampoline_addr(SB)/4, $libc_recvfrom_trampoline<>(SB) + +TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendto(SB) + +GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sendto_trampoline_addr(SB)/4, $libc_sendto_trampoline<>(SB) + +TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvmsg(SB) + +GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $4 +DATA ·libc_recvmsg_trampoline_addr(SB)/4, $libc_recvmsg_trampoline<>(SB) + +TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendmsg(SB) + +GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sendmsg_trampoline_addr(SB)/4, $libc_sendmsg_trampoline<>(SB) + +TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kevent(SB) + +GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $4 +DATA ·libc_kevent_trampoline_addr(SB)/4, $libc_kevent_trampoline<>(SB) + +TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimes(SB) + +GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $4 +DATA ·libc_utimes_trampoline_addr(SB)/4, $libc_utimes_trampoline<>(SB) + +TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_futimes(SB) + +GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $4 +DATA ·libc_futimes_trampoline_addr(SB)/4, $libc_futimes_trampoline<>(SB) + +TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_poll(SB) + +GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $4 +DATA ·libc_poll_trampoline_addr(SB)/4, $libc_poll_trampoline<>(SB) + +TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_madvise(SB) + +GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $4 +DATA ·libc_madvise_trampoline_addr(SB)/4, $libc_madvise_trampoline<>(SB) + +TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlock(SB) + +GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mlock_trampoline_addr(SB)/4, $libc_mlock_trampoline<>(SB) + +TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlockall(SB) + +GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mlockall_trampoline_addr(SB)/4, $libc_mlockall_trampoline<>(SB) + +TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mprotect(SB) + +GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mprotect_trampoline_addr(SB)/4, $libc_mprotect_trampoline<>(SB) + +TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_msync(SB) + +GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $4 +DATA ·libc_msync_trampoline_addr(SB)/4, $libc_msync_trampoline<>(SB) + +TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlock(SB) + +GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $4 +DATA ·libc_munlock_trampoline_addr(SB)/4, $libc_munlock_trampoline<>(SB) + +TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlockall(SB) + +GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $4 +DATA ·libc_munlockall_trampoline_addr(SB)/4, $libc_munlockall_trampoline<>(SB) + +TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pipe2(SB) + +GLOBL ·libc_pipe2_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pipe2_trampoline_addr(SB)/4, $libc_pipe2_trampoline<>(SB) + +TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getdents(SB) + +GLOBL ·libc_getdents_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getdents_trampoline_addr(SB)/4, $libc_getdents_trampoline<>(SB) + +TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getcwd(SB) + +GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getcwd_trampoline_addr(SB)/4, $libc_getcwd_trampoline<>(SB) + +TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ioctl(SB) + +GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_ioctl_trampoline_addr(SB)/4, $libc_ioctl_trampoline<>(SB) + +TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) + +GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB) + +TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ppoll(SB) + +GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $4 +DATA ·libc_ppoll_trampoline_addr(SB)/4, $libc_ppoll_trampoline<>(SB) + +TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_access(SB) + +GLOBL ·libc_access_trampoline_addr(SB), RODATA, $4 +DATA ·libc_access_trampoline_addr(SB)/4, $libc_access_trampoline<>(SB) + +TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_adjtime(SB) + +GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $4 +DATA ·libc_adjtime_trampoline_addr(SB)/4, $libc_adjtime_trampoline<>(SB) + +TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chdir(SB) + +GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chdir_trampoline_addr(SB)/4, $libc_chdir_trampoline<>(SB) + +TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chflags(SB) + +GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chflags_trampoline_addr(SB)/4, $libc_chflags_trampoline<>(SB) + +TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chmod(SB) + +GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chmod_trampoline_addr(SB)/4, $libc_chmod_trampoline<>(SB) + +TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chown(SB) + +GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chown_trampoline_addr(SB)/4, $libc_chown_trampoline<>(SB) + +TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chroot(SB) + +GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $4 +DATA ·libc_chroot_trampoline_addr(SB)/4, $libc_chroot_trampoline<>(SB) + +TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_close(SB) + +GLOBL ·libc_close_trampoline_addr(SB), RODATA, $4 +DATA ·libc_close_trampoline_addr(SB)/4, $libc_close_trampoline<>(SB) + +TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup(SB) + +GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $4 +DATA ·libc_dup_trampoline_addr(SB)/4, $libc_dup_trampoline<>(SB) + +TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup2(SB) + +GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $4 +DATA ·libc_dup2_trampoline_addr(SB)/4, $libc_dup2_trampoline<>(SB) + +TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup3(SB) + +GLOBL ·libc_dup3_trampoline_addr(SB), RODATA, $4 +DATA ·libc_dup3_trampoline_addr(SB)/4, $libc_dup3_trampoline<>(SB) + +TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_exit(SB) + +GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $4 +DATA ·libc_exit_trampoline_addr(SB)/4, $libc_exit_trampoline<>(SB) + +TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_faccessat(SB) + +GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_faccessat_trampoline_addr(SB)/4, $libc_faccessat_trampoline<>(SB) + +TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchdir(SB) + +GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchdir_trampoline_addr(SB)/4, $libc_fchdir_trampoline<>(SB) + +TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchflags(SB) + +GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchflags_trampoline_addr(SB)/4, $libc_fchflags_trampoline<>(SB) + +TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmod(SB) + +GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchmod_trampoline_addr(SB)/4, $libc_fchmod_trampoline<>(SB) + +TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmodat(SB) + +GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchmodat_trampoline_addr(SB)/4, $libc_fchmodat_trampoline<>(SB) + +TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchown(SB) + +GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchown_trampoline_addr(SB)/4, $libc_fchown_trampoline<>(SB) + +TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchownat(SB) + +GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fchownat_trampoline_addr(SB)/4, $libc_fchownat_trampoline<>(SB) + +TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_flock(SB) + +GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $4 +DATA ·libc_flock_trampoline_addr(SB)/4, $libc_flock_trampoline<>(SB) + +TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fpathconf(SB) + +GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fpathconf_trampoline_addr(SB)/4, $libc_fpathconf_trampoline<>(SB) + +TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstat(SB) + +GLOBL ·libc_fstat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fstat_trampoline_addr(SB)/4, $libc_fstat_trampoline<>(SB) + +TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatat(SB) + +GLOBL ·libc_fstatat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fstatat_trampoline_addr(SB)/4, $libc_fstatat_trampoline<>(SB) + +TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatfs(SB) + +GLOBL ·libc_fstatfs_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fstatfs_trampoline_addr(SB)/4, $libc_fstatfs_trampoline<>(SB) + +TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fsync(SB) + +GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fsync_trampoline_addr(SB)/4, $libc_fsync_trampoline<>(SB) + +TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ftruncate(SB) + +GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $4 +DATA ·libc_ftruncate_trampoline_addr(SB)/4, $libc_ftruncate_trampoline<>(SB) + +TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getegid(SB) + +GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getegid_trampoline_addr(SB)/4, $libc_getegid_trampoline<>(SB) + +TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_geteuid(SB) + +GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_geteuid_trampoline_addr(SB)/4, $libc_geteuid_trampoline<>(SB) + +TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgid(SB) + +GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getgid_trampoline_addr(SB)/4, $libc_getgid_trampoline<>(SB) + +TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgid(SB) + +GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpgid_trampoline_addr(SB)/4, $libc_getpgid_trampoline<>(SB) + +TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgrp(SB) + +GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpgrp_trampoline_addr(SB)/4, $libc_getpgrp_trampoline<>(SB) + +TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpid(SB) + +GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpid_trampoline_addr(SB)/4, $libc_getpid_trampoline<>(SB) + +TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getppid(SB) + +GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getppid_trampoline_addr(SB)/4, $libc_getppid_trampoline<>(SB) + +TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpriority(SB) + +GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getpriority_trampoline_addr(SB)/4, $libc_getpriority_trampoline<>(SB) + +TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrlimit(SB) + +GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getrlimit_trampoline_addr(SB)/4, $libc_getrlimit_trampoline<>(SB) + +TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrtable(SB) + +GLOBL ·libc_getrtable_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getrtable_trampoline_addr(SB)/4, $libc_getrtable_trampoline<>(SB) + +TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrusage(SB) + +GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getrusage_trampoline_addr(SB)/4, $libc_getrusage_trampoline<>(SB) + +TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsid(SB) + +GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getsid_trampoline_addr(SB)/4, $libc_getsid_trampoline<>(SB) + +TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_gettimeofday(SB) + +GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $4 +DATA ·libc_gettimeofday_trampoline_addr(SB)/4, $libc_gettimeofday_trampoline<>(SB) + +TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getuid(SB) + +GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_getuid_trampoline_addr(SB)/4, $libc_getuid_trampoline<>(SB) + +TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_issetugid(SB) + +GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_issetugid_trampoline_addr(SB)/4, $libc_issetugid_trampoline<>(SB) + +TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kill(SB) + +GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $4 +DATA ·libc_kill_trampoline_addr(SB)/4, $libc_kill_trampoline<>(SB) + +TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kqueue(SB) + +GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $4 +DATA ·libc_kqueue_trampoline_addr(SB)/4, $libc_kqueue_trampoline<>(SB) + +TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lchown(SB) + +GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $4 +DATA ·libc_lchown_trampoline_addr(SB)/4, $libc_lchown_trampoline<>(SB) + +TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_link(SB) + +GLOBL ·libc_link_trampoline_addr(SB), RODATA, $4 +DATA ·libc_link_trampoline_addr(SB)/4, $libc_link_trampoline<>(SB) + +TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_linkat(SB) + +GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_linkat_trampoline_addr(SB)/4, $libc_linkat_trampoline<>(SB) + +TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_listen(SB) + +GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $4 +DATA ·libc_listen_trampoline_addr(SB)/4, $libc_listen_trampoline<>(SB) + +TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lstat(SB) + +GLOBL ·libc_lstat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_lstat_trampoline_addr(SB)/4, $libc_lstat_trampoline<>(SB) + +TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdir(SB) + +GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkdir_trampoline_addr(SB)/4, $libc_mkdir_trampoline<>(SB) + +TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdirat(SB) + +GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkdirat_trampoline_addr(SB)/4, $libc_mkdirat_trampoline<>(SB) + +TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifo(SB) + +GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkfifo_trampoline_addr(SB)/4, $libc_mkfifo_trampoline<>(SB) + +TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifoat(SB) + +GLOBL ·libc_mkfifoat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mkfifoat_trampoline_addr(SB)/4, $libc_mkfifoat_trampoline<>(SB) + +TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknod(SB) + +GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mknod_trampoline_addr(SB)/4, $libc_mknod_trampoline<>(SB) + +TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknodat(SB) + +GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mknodat_trampoline_addr(SB)/4, $libc_mknodat_trampoline<>(SB) + +TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_nanosleep(SB) + +GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $4 +DATA ·libc_nanosleep_trampoline_addr(SB)/4, $libc_nanosleep_trampoline<>(SB) + +TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_open(SB) + +GLOBL ·libc_open_trampoline_addr(SB), RODATA, $4 +DATA ·libc_open_trampoline_addr(SB)/4, $libc_open_trampoline<>(SB) + +TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_openat(SB) + +GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_openat_trampoline_addr(SB)/4, $libc_openat_trampoline<>(SB) + +TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pathconf(SB) + +GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pathconf_trampoline_addr(SB)/4, $libc_pathconf_trampoline<>(SB) + +TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pread(SB) + +GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pread_trampoline_addr(SB)/4, $libc_pread_trampoline<>(SB) + +TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pwrite(SB) + +GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $4 +DATA ·libc_pwrite_trampoline_addr(SB)/4, $libc_pwrite_trampoline<>(SB) + +TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_read(SB) + +GLOBL ·libc_read_trampoline_addr(SB), RODATA, $4 +DATA ·libc_read_trampoline_addr(SB)/4, $libc_read_trampoline<>(SB) + +TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlink(SB) + +GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $4 +DATA ·libc_readlink_trampoline_addr(SB)/4, $libc_readlink_trampoline<>(SB) + +TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlinkat(SB) + +GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_readlinkat_trampoline_addr(SB)/4, $libc_readlinkat_trampoline<>(SB) + +TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rename(SB) + +GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $4 +DATA ·libc_rename_trampoline_addr(SB)/4, $libc_rename_trampoline<>(SB) + +TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renameat(SB) + +GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_renameat_trampoline_addr(SB)/4, $libc_renameat_trampoline<>(SB) + +TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_revoke(SB) + +GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $4 +DATA ·libc_revoke_trampoline_addr(SB)/4, $libc_revoke_trampoline<>(SB) + +TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rmdir(SB) + +GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $4 +DATA ·libc_rmdir_trampoline_addr(SB)/4, $libc_rmdir_trampoline<>(SB) + +TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lseek(SB) + +GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $4 +DATA ·libc_lseek_trampoline_addr(SB)/4, $libc_lseek_trampoline<>(SB) + +TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_select(SB) + +GLOBL ·libc_select_trampoline_addr(SB), RODATA, $4 +DATA ·libc_select_trampoline_addr(SB)/4, $libc_select_trampoline<>(SB) + +TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setegid(SB) + +GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setegid_trampoline_addr(SB)/4, $libc_setegid_trampoline<>(SB) + +TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_seteuid(SB) + +GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_seteuid_trampoline_addr(SB)/4, $libc_seteuid_trampoline<>(SB) + +TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgid(SB) + +GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setgid_trampoline_addr(SB)/4, $libc_setgid_trampoline<>(SB) + +TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setlogin(SB) + +GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setlogin_trampoline_addr(SB)/4, $libc_setlogin_trampoline<>(SB) + +TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpgid(SB) + +GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setpgid_trampoline_addr(SB)/4, $libc_setpgid_trampoline<>(SB) + +TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpriority(SB) + +GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setpriority_trampoline_addr(SB)/4, $libc_setpriority_trampoline<>(SB) + +TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setregid(SB) + +GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setregid_trampoline_addr(SB)/4, $libc_setregid_trampoline<>(SB) + +TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setreuid(SB) + +GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setreuid_trampoline_addr(SB)/4, $libc_setreuid_trampoline<>(SB) + +TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresgid(SB) + +GLOBL ·libc_setresgid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setresgid_trampoline_addr(SB)/4, $libc_setresgid_trampoline<>(SB) + +TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresuid(SB) + +GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setresuid_trampoline_addr(SB)/4, $libc_setresuid_trampoline<>(SB) + +TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrlimit(SB) + +GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setrlimit_trampoline_addr(SB)/4, $libc_setrlimit_trampoline<>(SB) + +TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrtable(SB) + +GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setrtable_trampoline_addr(SB)/4, $libc_setrtable_trampoline<>(SB) + +TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsid(SB) + +GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setsid_trampoline_addr(SB)/4, $libc_setsid_trampoline<>(SB) + +TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_settimeofday(SB) + +GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $4 +DATA ·libc_settimeofday_trampoline_addr(SB)/4, $libc_settimeofday_trampoline<>(SB) + +TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setuid(SB) + +GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $4 +DATA ·libc_setuid_trampoline_addr(SB)/4, $libc_setuid_trampoline<>(SB) + +TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_stat(SB) + +GLOBL ·libc_stat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_stat_trampoline_addr(SB)/4, $libc_stat_trampoline<>(SB) + +TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_statfs(SB) + +GLOBL ·libc_statfs_trampoline_addr(SB), RODATA, $4 +DATA ·libc_statfs_trampoline_addr(SB)/4, $libc_statfs_trampoline<>(SB) + +TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlink(SB) + +GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $4 +DATA ·libc_symlink_trampoline_addr(SB)/4, $libc_symlink_trampoline<>(SB) + +TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlinkat(SB) + +GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_symlinkat_trampoline_addr(SB)/4, $libc_symlinkat_trampoline<>(SB) + +TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sync(SB) + +GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $4 +DATA ·libc_sync_trampoline_addr(SB)/4, $libc_sync_trampoline<>(SB) + +TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_truncate(SB) + +GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $4 +DATA ·libc_truncate_trampoline_addr(SB)/4, $libc_truncate_trampoline<>(SB) + +TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_umask(SB) + +GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $4 +DATA ·libc_umask_trampoline_addr(SB)/4, $libc_umask_trampoline<>(SB) + +TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlink(SB) + +GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unlink_trampoline_addr(SB)/4, $libc_unlink_trampoline<>(SB) + +TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlinkat(SB) + +GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unlinkat_trampoline_addr(SB)/4, $libc_unlinkat_trampoline<>(SB) + +TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unmount(SB) + +GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $4 +DATA ·libc_unmount_trampoline_addr(SB)/4, $libc_unmount_trampoline<>(SB) + +TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_write(SB) + +GLOBL ·libc_write_trampoline_addr(SB), RODATA, $4 +DATA ·libc_write_trampoline_addr(SB)/4, $libc_write_trampoline<>(SB) + +TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mmap(SB) + +GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mmap_trampoline_addr(SB)/4, $libc_mmap_trampoline<>(SB) + +TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munmap(SB) + +GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $4 +DATA ·libc_munmap_trampoline_addr(SB)/4, $libc_munmap_trampoline<>(SB) + +TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) + +GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $4 +DATA ·libc_utimensat_trampoline_addr(SB)/4, $libc_utimensat_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index c96a50517..800aab6e3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -openbsd -tags openbsd,arm64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm64.go +// go run mksyscall.go -openbsd -libc -tags openbsd,arm64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build openbsd && arm64 @@ -16,7 +16,7 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { - r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + r0, _, e1 := syscall_rawSyscall(libc_getgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -24,20 +24,28 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { return } +var libc_getgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { - _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + _, _, e1 := syscall_rawSyscall(libc_setgroups_trampoline_addr, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgroups_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { - r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_wait4_trampoline_addr, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -45,10 +53,14 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err return } +var libc_wait4_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { - r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + r0, _, e1 := syscall_syscall(libc_accept_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -56,30 +68,42 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +var libc_accept_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_accept accept "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_bind_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_bind_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_bind bind "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { - _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + _, _, e1 := syscall_syscall(libc_connect_trampoline_addr, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_connect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_connect connect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + r0, _, e1 := syscall_rawSyscall(libc_socket_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -87,66 +111,94 @@ func socket(domain int, typ int, proto int) (fd int, err error) { return } +var libc_socket_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socket socket "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { - _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + _, _, e1 := syscall_syscall6(libc_getsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockopt getsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { - _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + _, _, e1 := syscall_syscall6(libc_setsockopt_trampoline_addr, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setsockopt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsockopt setsockopt "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getpeername_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getpeername_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpeername getpeername "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + _, _, e1 := syscall_rawSyscall(libc_getsockname_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getsockname_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsockname getsockname "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { - _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_shutdown_trampoline_addr, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_shutdown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shutdown shutdown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { - _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + _, _, e1 := syscall_rawSyscall6(libc_socketpair_trampoline_addr, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_socketpair_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_socketpair socketpair "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -156,7 +208,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + r0, _, e1 := syscall_syscall6(libc_recvfrom_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -164,6 +216,10 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } +var libc_recvfrom_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -173,17 +229,21 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := syscall_syscall6(libc_sendto_trampoline_addr, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sendto_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendto sendto "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_recvmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -191,10 +251,14 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_recvmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + r0, _, e1 := syscall_syscall(libc_sendmsg_trampoline_addr, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -202,10 +266,14 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +var libc_sendmsg_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { - r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + r0, _, e1 := syscall_syscall6(libc_kevent_trampoline_addr, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -213,6 +281,10 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne return } +var libc_kevent_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kevent kevent "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -221,27 +293,35 @@ func utimes(path string, timeval *[2]Timeval) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_utimes_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_utimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimes utimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { - _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall_syscall(libc_futimes_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_futimes_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_futimes futimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + r0, _, e1 := syscall_syscall(libc_poll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -249,6 +329,10 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { return } +var libc_poll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_poll poll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { @@ -258,13 +342,17 @@ func Madvise(b []byte, behav int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + _, _, e1 := syscall_syscall(libc_madvise_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_madvise_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_madvise madvise "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -274,23 +362,31 @@ func Mlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_mlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlock mlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { - _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall(libc_mlockall_trampoline_addr, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -300,13 +396,17 @@ func Mprotect(b []byte, prot int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + _, _, e1 := syscall_syscall(libc_mprotect_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mprotect_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { @@ -316,13 +416,17 @@ func Msync(b []byte, flags int) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_msync_trampoline_addr, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_msync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_msync msync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -332,33 +436,45 @@ func Munlock(b []byte) (err error) { } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + _, _, e1 := syscall_syscall(libc_munlock_trampoline_addr, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlock munlock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { - _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_munlockall_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munlockall_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + _, _, e1 := syscall_rawSyscall(libc_pipe2_trampoline_addr, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_pipe2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { @@ -368,7 +484,7 @@ func Getdents(fd int, buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_getdents_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -376,6 +492,10 @@ func Getdents(fd int, buf []byte) (n int, err error) { return } +var libc_getdents_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getdents getdents "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { @@ -385,7 +505,7 @@ func Getcwd(buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + r0, _, e1 := syscall_syscall(libc_getcwd_trampoline_addr, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -393,16 +513,24 @@ func Getcwd(buf []byte) (n int, err error) { return } +var libc_getcwd_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { - _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -412,17 +540,21 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + _, _, e1 := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sysctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { - r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -430,6 +562,10 @@ func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, return } +var libc_ppoll_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ppoll ppoll "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -438,23 +574,31 @@ func Access(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_access_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_access_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_access access "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { - _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + _, _, e1 := syscall_syscall(libc_adjtime_trampoline_addr, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_adjtime_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -463,13 +607,17 @@ func Chdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chdir chdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -478,13 +626,17 @@ func Chflags(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_chflags_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chflags chflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -493,13 +645,17 @@ func Chmod(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_chmod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chmod chmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -508,13 +664,17 @@ func Chown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_chown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chown chown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -523,27 +683,35 @@ func Chroot(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_chroot_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_chroot_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_chroot chroot "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { - _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_close_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_close_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_close close "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { - r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + r0, _, e1 := syscall_syscall(libc_dup_trampoline_addr, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -551,33 +719,49 @@ func Dup(fd int) (nfd int, err error) { return } +var libc_dup_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup dup "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + _, _, e1 := syscall_syscall(libc_dup2_trampoline_addr, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup2_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(from int, to int, flags int) (err error) { - _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_dup3_trampoline_addr, uintptr(from), uintptr(to), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_dup3_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_dup3 dup3 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { - Syscall(SYS_EXIT, uintptr(code), 0, 0) + syscall_syscall(libc_exit_trampoline_addr, uintptr(code), 0, 0) return } +var libc_exit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_exit exit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -586,43 +770,59 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_faccessat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_faccessat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_faccessat faccessat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { - _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fchdir_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { - _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_fchflags_trampoline_addr, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchflags_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchflags fchflags "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { - _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_fchmod_trampoline_addr, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -631,23 +831,31 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fchmodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchmodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { - _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_fchown_trampoline_addr, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchown fchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { @@ -656,27 +864,35 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_fchownat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fchownat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { - _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + _, _, e1 := syscall_syscall(libc_flock_trampoline_addr, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_flock_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_flock flock "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_fpathconf_trampoline_addr, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -684,16 +900,24 @@ func Fpathconf(fd int, name int) (val int, err error) { return } +var libc_fpathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { - _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstat fstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { @@ -702,71 +926,99 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_fstatat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { - _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_fstatfs_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fstatfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fstatfs fstatfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { - _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + _, _, e1 := syscall_syscall(libc_fsync_trampoline_addr, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_fsync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fsync fsync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { - _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + _, _, e1 := syscall_syscall(libc_ftruncate_trampoline_addr, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_ftruncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getegid_trampoline_addr, 0, 0, 0) egid = int(r0) return } +var libc_getegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getegid getegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_geteuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_geteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getgid_trampoline_addr, 0, 0, 0) gid = int(r0) return } +var libc_getgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getgid getgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getpgid_trampoline_addr, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -774,34 +1026,50 @@ func Getpgid(pid int) (pgid int, err error) { return } +var libc_getpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { - r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpgrp_trampoline_addr, 0, 0, 0) pgrp = int(r0) return } +var libc_getpgrp_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getpid_trampoline_addr, 0, 0, 0) pid = int(r0) return } +var libc_getpid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpid getpid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getppid_trampoline_addr, 0, 0, 0) ppid = int(r0) return } +var libc_getppid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getppid getppid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { - r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + r0, _, e1 := syscall_syscall(libc_getpriority_trampoline_addr, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -809,20 +1077,28 @@ func Getpriority(which int, who int) (prio int, err error) { return } +var libc_getpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrtable() (rtable int, err error) { - r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getrtable_trampoline_addr, 0, 0, 0) rtable = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -830,20 +1106,28 @@ func Getrtable() (rtable int, err error) { return } +var libc_getrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrtable getrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { - _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + _, _, e1 := syscall_rawSyscall(libc_getrusage_trampoline_addr, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_getrusage_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { - r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_getsid_trampoline_addr, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -851,46 +1135,66 @@ func Getsid(pid int) (sid int, err error) { return } +var libc_getsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getsid getsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_gettimeofday_trampoline_addr, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_gettimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _, _ := syscall_rawSyscall(libc_getuid_trampoline_addr, 0, 0, 0) uid = int(r0) return } +var libc_getuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_getuid getuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { - r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + r0, _, _ := syscall_syscall(libc_issetugid_trampoline_addr, 0, 0, 0) tainted = bool(r0 != 0) return } +var libc_issetugid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_issetugid issetugid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { - _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + _, _, e1 := syscall_syscall(libc_kill_trampoline_addr, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_kill_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kill kill "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { - r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + r0, _, e1 := syscall_syscall(libc_kqueue_trampoline_addr, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -898,6 +1202,10 @@ func Kqueue() (fd int, err error) { return } +var libc_kqueue_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_kqueue kqueue "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -906,13 +1214,17 @@ func Lchown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall_syscall(libc_lchown_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lchown_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lchown lchown "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -926,13 +1238,17 @@ func Link(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_link_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_link_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_link link "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { @@ -946,23 +1262,31 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er if err != nil { return } - _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + _, _, e1 := syscall_syscall6(libc_linkat_trampoline_addr, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_linkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_linkat linkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { - _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + _, _, e1 := syscall_syscall(libc_listen_trampoline_addr, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_listen_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_listen listen "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -971,13 +1295,17 @@ func Lstat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_lstat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_lstat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lstat lstat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -986,13 +1314,17 @@ func Mkdir(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { @@ -1001,13 +1333,17 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkdirat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkdirat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -1016,13 +1352,17 @@ func Mkfifo(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall_syscall(libc_mkfifo_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifo_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifoat(dirfd int, path string, mode uint32) (err error) { @@ -1031,13 +1371,17 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + _, _, e1 := syscall_syscall(libc_mkfifoat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mkfifoat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -1046,13 +1390,17 @@ func Mknod(path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + _, _, e1 := syscall_syscall(libc_mknod_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknod_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknod mknod "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { @@ -1061,23 +1409,31 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + _, _, e1 := syscall_syscall6(libc_mknodat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_mknodat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { - _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_nanosleep_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1086,7 +1442,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + r0, _, e1 := syscall_syscall(libc_open_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1094,6 +1450,10 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +var libc_open_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_open open "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { @@ -1102,7 +1462,7 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + r0, _, e1 := syscall_syscall6(libc_openat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1110,6 +1470,10 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { return } +var libc_openat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_openat openat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1118,7 +1482,7 @@ func Pathconf(path string, name int) (val int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + r0, _, e1 := syscall_syscall(libc_pathconf_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1126,6 +1490,10 @@ func Pathconf(path string, name int) (val int, err error) { return } +var libc_pathconf_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pread(fd int, p []byte, offset int64) (n int, err error) { @@ -1135,7 +1503,7 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall_syscall6(libc_pread_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1143,6 +1511,10 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pread_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pread pread "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pwrite(fd int, p []byte, offset int64) (n int, err error) { @@ -1152,7 +1524,7 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall_syscall6(libc_pwrite_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1160,6 +1532,10 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { return } +var libc_pwrite_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1169,7 +1545,7 @@ func read(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1177,6 +1553,10 @@ func read(fd int, p []byte) (n int, err error) { return } +var libc_read_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_read read "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1191,7 +1571,7 @@ func Readlink(path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + r0, _, e1 := syscall_syscall(libc_readlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1199,6 +1579,10 @@ func Readlink(path string, buf []byte) (n int, err error) { return } +var libc_readlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlink readlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { @@ -1213,7 +1597,7 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + r0, _, e1 := syscall_syscall6(libc_readlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1221,6 +1605,10 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { return } +var libc_readlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_readlinkat readlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1234,13 +1622,17 @@ func Rename(from string, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_rename_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rename_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rename rename "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { @@ -1254,13 +1646,17 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + _, _, e1 := syscall_syscall6(libc_renameat_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_renameat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renameat renameat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1269,13 +1665,17 @@ func Revoke(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_revoke_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_revoke_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_revoke revoke "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1284,17 +1684,21 @@ func Rmdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_rmdir_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_rmdir_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { - r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + r0, _, e1 := syscall_syscall(libc_lseek_trampoline_addr, uintptr(fd), uintptr(offset), uintptr(whence)) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) @@ -1302,10 +1706,14 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { return } +var libc_lseek_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_lseek lseek "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { - r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + r0, _, e1 := syscall_syscall6(libc_select_trampoline_addr, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1313,36 +1721,52 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err return } +var libc_select_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_select select "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setegid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setegid setegid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_seteuid_trampoline_addr, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_seteuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setgid_trampoline_addr, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setgid setgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1351,97 +1775,133 @@ func Setlogin(name string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_setlogin_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setlogin_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setlogin setlogin "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + _, _, e1 := syscall_rawSyscall(libc_setpgid_trampoline_addr, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { - _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + _, _, e1 := syscall_syscall(libc_setpriority_trampoline_addr, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setpriority_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + _, _, e1 := syscall_rawSyscall(libc_setregid_trampoline_addr, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setregid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setregid setregid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + _, _, e1 := syscall_rawSyscall(libc_setreuid_trampoline_addr, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setreuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + _, _, e1 := syscall_rawSyscall(libc_setresgid_trampoline_addr, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresgid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresgid setresgid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + _, _, e1 := syscall_rawSyscall(libc_setresuid_trampoline_addr, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setresuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setresuid setresuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrlimit_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrtable(rtable int) (err error) { - _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setrtable_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setrtable setrtable "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { - r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1449,26 +1909,38 @@ func Setsid() (pid int, err error) { return } +var libc_setsid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setsid setsid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { - _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_settimeofday_trampoline_addr, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_settimeofday_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_settimeofday settimeofday "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { - _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + _, _, e1 := syscall_rawSyscall(libc_setuid_trampoline_addr, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_setuid_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setuid setuid "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1477,13 +1949,17 @@ func Stat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_stat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_stat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_stat stat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1492,13 +1968,17 @@ func Statfs(path string, stat *Statfs_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall_syscall(libc_statfs_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_statfs_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_statfs statfs "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1512,13 +1992,17 @@ func Symlink(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall_syscall(libc_symlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlink symlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { @@ -1532,23 +2016,31 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + _, _, e1 := syscall_syscall(libc_symlinkat_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } +var libc_symlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_symlinkat symlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { - _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + _, _, e1 := syscall_syscall(libc_sync_trampoline_addr, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_sync_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sync sync "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1557,21 +2049,29 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + _, _, e1 := syscall_syscall(libc_truncate_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_truncate_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_truncate truncate "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { - r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + r0, _, _ := syscall_syscall(libc_umask_trampoline_addr, uintptr(newmask), 0, 0) oldmask = int(r0) return } +var libc_umask_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_umask umask "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1580,13 +2080,17 @@ func Unlink(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall_syscall(libc_unlink_trampoline_addr, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlink_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlink unlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { @@ -1595,13 +2099,17 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + _, _, e1 := syscall_syscall(libc_unlinkat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unlinkat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1610,13 +2118,17 @@ func Unmount(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall_syscall(libc_unmount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_unmount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_unmount unmount "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1626,7 +2138,7 @@ func write(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1634,10 +2146,14 @@ func write(fd int, p []byte) (n int, err error) { return } +var libc_write_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_write write "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { - r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + r0, _, e1 := syscall_syscall6(libc_mmap_trampoline_addr, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -1645,20 +2161,28 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( return } +var libc_mmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mmap mmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { - _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + _, _, e1 := syscall_syscall(libc_munmap_trampoline_addr, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +var libc_munmap_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_munmap munmap "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1669,7 +2193,7 @@ func readlen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1685,9 +2209,13 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error if err != nil { return } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + _, _, e1 := syscall_syscall6(libc_utimensat_trampoline_addr, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } + +var libc_utimensat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s new file mode 100644 index 000000000..4efeff9ab --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s @@ -0,0 +1,796 @@ +// go run mkasm.go openbsd arm64 +// Code generated by the command above; DO NOT EDIT. + +#include "textflag.h" + +TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgroups(SB) + +GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB) + +TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgroups(SB) + +GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB) + +TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_wait4(SB) + +GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $8 +DATA ·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB) + +TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_accept(SB) + +GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $8 +DATA ·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB) + +TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_bind(SB) + +GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $8 +DATA ·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB) + +TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_connect(SB) + +GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $8 +DATA ·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB) + +TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socket(SB) + +GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $8 +DATA ·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB) + +TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockopt(SB) + +GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB) + +TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsockopt(SB) + +GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB) + +TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpeername(SB) + +GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB) + +TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsockname(SB) + +GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB) + +TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shutdown(SB) + +GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB) + +TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_socketpair(SB) + +GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $8 +DATA ·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB) + +TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvfrom(SB) + +GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $8 +DATA ·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB) + +TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendto(SB) + +GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB) + +TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_recvmsg(SB) + +GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $8 +DATA ·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB) + +TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sendmsg(SB) + +GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB) + +TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kevent(SB) + +GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB) + +TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimes(SB) + +GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB) + +TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_futimes(SB) + +GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $8 +DATA ·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB) + +TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_poll(SB) + +GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) + +TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_madvise(SB) + +GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $8 +DATA ·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB) + +TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlock(SB) + +GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB) + +TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mlockall(SB) + +GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB) + +TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mprotect(SB) + +GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB) + +TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_msync(SB) + +GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB) + +TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlock(SB) + +GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB) + +TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munlockall(SB) + +GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB) + +TEXT libc_pipe2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pipe2(SB) + +GLOBL ·libc_pipe2_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pipe2_trampoline_addr(SB)/8, $libc_pipe2_trampoline<>(SB) + +TEXT libc_getdents_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getdents(SB) + +GLOBL ·libc_getdents_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getdents_trampoline_addr(SB)/8, $libc_getdents_trampoline<>(SB) + +TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getcwd(SB) + +GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) + +TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ioctl(SB) + +GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) + +TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) + +GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) + +TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ppoll(SB) + +GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ppoll_trampoline_addr(SB)/8, $libc_ppoll_trampoline<>(SB) + +TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_access(SB) + +GLOBL ·libc_access_trampoline_addr(SB), RODATA, $8 +DATA ·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB) + +TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_adjtime(SB) + +GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $8 +DATA ·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB) + +TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chdir(SB) + +GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB) + +TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chflags(SB) + +GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB) + +TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chmod(SB) + +GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB) + +TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chown(SB) + +GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB) + +TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_chroot(SB) + +GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $8 +DATA ·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB) + +TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_close(SB) + +GLOBL ·libc_close_trampoline_addr(SB), RODATA, $8 +DATA ·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB) + +TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup(SB) + +GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB) + +TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup2(SB) + +GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB) + +TEXT libc_dup3_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_dup3(SB) + +GLOBL ·libc_dup3_trampoline_addr(SB), RODATA, $8 +DATA ·libc_dup3_trampoline_addr(SB)/8, $libc_dup3_trampoline<>(SB) + +TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_exit(SB) + +GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB) + +TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_faccessat(SB) + +GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB) + +TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchdir(SB) + +GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB) + +TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchflags(SB) + +GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB) + +TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmod(SB) + +GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB) + +TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchmodat(SB) + +GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB) + +TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchown(SB) + +GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB) + +TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fchownat(SB) + +GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB) + +TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_flock(SB) + +GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $8 +DATA ·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB) + +TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fpathconf(SB) + +GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB) + +TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstat(SB) + +GLOBL ·libc_fstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB) + +TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatat(SB) + +GLOBL ·libc_fstatat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB) + +TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fstatfs(SB) + +GLOBL ·libc_fstatfs_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB) + +TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fsync(SB) + +GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB) + +TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_ftruncate(SB) + +GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $8 +DATA ·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB) + +TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getegid(SB) + +GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB) + +TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_geteuid(SB) + +GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB) + +TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getgid(SB) + +GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB) + +TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgid(SB) + +GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB) + +TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpgrp(SB) + +GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB) + +TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpid(SB) + +GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB) + +TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getppid(SB) + +GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB) + +TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getpriority(SB) + +GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB) + +TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrlimit(SB) + +GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB) + +TEXT libc_getrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrtable(SB) + +GLOBL ·libc_getrtable_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrtable_trampoline_addr(SB)/8, $libc_getrtable_trampoline<>(SB) + +TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getrusage(SB) + +GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB) + +TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getsid(SB) + +GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB) + +TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_gettimeofday(SB) + +GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $8 +DATA ·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB) + +TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_getuid(SB) + +GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB) + +TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_issetugid(SB) + +GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB) + +TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kill(SB) + +GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB) + +TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_kqueue(SB) + +GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $8 +DATA ·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB) + +TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lchown(SB) + +GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB) + +TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_link(SB) + +GLOBL ·libc_link_trampoline_addr(SB), RODATA, $8 +DATA ·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB) + +TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_linkat(SB) + +GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB) + +TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_listen(SB) + +GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $8 +DATA ·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB) + +TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lstat(SB) + +GLOBL ·libc_lstat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB) + +TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdir(SB) + +GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB) + +TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkdirat(SB) + +GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB) + +TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifo(SB) + +GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB) + +TEXT libc_mkfifoat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mkfifoat(SB) + +GLOBL ·libc_mkfifoat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mkfifoat_trampoline_addr(SB)/8, $libc_mkfifoat_trampoline<>(SB) + +TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknod(SB) + +GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) + +TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mknodat(SB) + +GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB) + +TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_nanosleep(SB) + +GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $8 +DATA ·libc_nanosleep_trampoline_addr(SB)/8, $libc_nanosleep_trampoline<>(SB) + +TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_open(SB) + +GLOBL ·libc_open_trampoline_addr(SB), RODATA, $8 +DATA ·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB) + +TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_openat(SB) + +GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB) + +TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pathconf(SB) + +GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB) + +TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pread(SB) + +GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB) + +TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_pwrite(SB) + +GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $8 +DATA ·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB) + +TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_read(SB) + +GLOBL ·libc_read_trampoline_addr(SB), RODATA, $8 +DATA ·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB) + +TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlink(SB) + +GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB) + +TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_readlinkat(SB) + +GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB) + +TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rename(SB) + +GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $8 +DATA ·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB) + +TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renameat(SB) + +GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB) + +TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_revoke(SB) + +GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $8 +DATA ·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB) + +TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_rmdir(SB) + +GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $8 +DATA ·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB) + +TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_lseek(SB) + +GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $8 +DATA ·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB) + +TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_select(SB) + +GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 +DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) + +TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setegid(SB) + +GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB) + +TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_seteuid(SB) + +GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB) + +TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setgid(SB) + +GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB) + +TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setlogin(SB) + +GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB) + +TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpgid(SB) + +GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB) + +TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setpriority(SB) + +GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB) + +TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setregid(SB) + +GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB) + +TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setreuid(SB) + +GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) + +TEXT libc_setresgid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresgid(SB) + +GLOBL ·libc_setresgid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setresgid_trampoline_addr(SB)/8, $libc_setresgid_trampoline<>(SB) + +TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setresuid(SB) + +GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) + +TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrlimit(SB) + +GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) + +TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setrtable(SB) + +GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setrtable_trampoline_addr(SB)/8, $libc_setrtable_trampoline<>(SB) + +TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setsid(SB) + +GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB) + +TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_settimeofday(SB) + +GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $8 +DATA ·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB) + +TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setuid(SB) + +GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB) + +TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_stat(SB) + +GLOBL ·libc_stat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB) + +TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_statfs(SB) + +GLOBL ·libc_statfs_trampoline_addr(SB), RODATA, $8 +DATA ·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB) + +TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlink(SB) + +GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB) + +TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_symlinkat(SB) + +GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB) + +TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sync(SB) + +GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB) + +TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_truncate(SB) + +GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $8 +DATA ·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB) + +TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_umask(SB) + +GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $8 +DATA ·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB) + +TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlink(SB) + +GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB) + +TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unlinkat(SB) + +GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB) + +TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_unmount(SB) + +GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB) + +TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_write(SB) + +GLOBL ·libc_write_trampoline_addr(SB), RODATA, $8 +DATA ·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB) + +TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mmap(SB) + +GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB) + +TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_munmap(SB) + +GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 +DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) + +TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) + +GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go index 59d5dfc20..4e0d96107 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && freebsd @@ -19,10 +19,9 @@ const ( SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_BREAK = 17 // { caddr_t break(char *nsize); } SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } @@ -43,7 +42,6 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } @@ -58,15 +56,14 @@ const ( SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_UMASK = 60 // { int umask(int newmask); } SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } @@ -124,14 +121,10 @@ const ( SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -143,12 +136,12 @@ const ( SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } - SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } @@ -157,50 +150,44 @@ const ( SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } @@ -226,14 +213,13 @@ const ( SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } @@ -251,10 +237,6 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } - SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } @@ -267,14 +249,14 @@ const ( SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } - SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } @@ -288,10 +270,10 @@ const ( SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } - SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } @@ -300,17 +282,17 @@ const ( SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } @@ -319,7 +301,7 @@ const ( SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } @@ -338,14 +320,12 @@ const ( SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } @@ -391,7 +371,24 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go index 342d471d2..01636b838 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && freebsd @@ -19,10 +19,9 @@ const ( SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_BREAK = 17 // { caddr_t break(char *nsize); } SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } @@ -43,7 +42,6 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } @@ -58,15 +56,14 @@ const ( SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_UMASK = 60 // { int umask(int newmask); } SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } @@ -124,14 +121,10 @@ const ( SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -143,12 +136,12 @@ const ( SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } - SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } @@ -157,50 +150,44 @@ const ( SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } @@ -226,14 +213,13 @@ const ( SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } @@ -251,10 +237,6 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } - SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } @@ -267,14 +249,14 @@ const ( SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } - SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } @@ -288,10 +270,10 @@ const ( SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } - SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } @@ -300,17 +282,17 @@ const ( SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } @@ -319,7 +301,7 @@ const ( SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } @@ -338,14 +320,12 @@ const ( SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } @@ -391,7 +371,24 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go index e2e3d72c5..ad99bc106 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && freebsd @@ -19,10 +19,9 @@ const ( SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_BREAK = 17 // { caddr_t break(char *nsize); } SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } @@ -43,7 +42,6 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } @@ -58,15 +56,14 @@ const ( SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_UMASK = 60 // { int umask(int newmask); } SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } @@ -124,14 +121,10 @@ const ( SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -143,12 +136,12 @@ const ( SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } - SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } @@ -157,50 +150,44 @@ const ( SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } @@ -226,14 +213,13 @@ const ( SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } @@ -251,10 +237,6 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } - SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } @@ -267,14 +249,14 @@ const ( SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } - SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } @@ -288,10 +270,10 @@ const ( SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } - SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } @@ -300,17 +282,17 @@ const ( SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } @@ -319,7 +301,7 @@ const ( SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } @@ -338,14 +320,12 @@ const ( SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } @@ -391,7 +371,24 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go index 61ad5ca3c..89dcc4274 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && freebsd @@ -19,10 +19,9 @@ const ( SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } - SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_BREAK = 17 // { caddr_t break(char *nsize); } SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } @@ -43,7 +42,6 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } - SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } @@ -58,15 +56,14 @@ const ( SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_UMASK = 60 // { int umask(int newmask); } SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } @@ -124,14 +121,10 @@ const ( SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } - SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } - SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } - SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -143,12 +136,12 @@ const ( SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } - SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } @@ -157,50 +150,44 @@ const ( SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } - SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } - SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } - SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } - SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } @@ -226,14 +213,13 @@ const ( SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } @@ -251,10 +237,6 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } - SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } - SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } @@ -267,14 +249,14 @@ const ( SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } - SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } @@ -288,10 +270,10 @@ const ( SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } - SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } @@ -300,17 +282,17 @@ const ( SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } @@ -319,7 +301,7 @@ const ( SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } @@ -338,14 +320,12 @@ const ( SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } @@ -391,7 +371,24 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go new file mode 100644 index 000000000..ee37aaa0c --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go @@ -0,0 +1,394 @@ +// go run mksysnum.go https://cgit.freebsd.org/src/plain/sys/kern/syscalls.master?h=stable/12 +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build riscv64 && freebsd +// +build riscv64,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit sys_exit_args void + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, struct rusage *rusage); } + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_BREAK = 17 // { caddr_t break(char *nsize); } + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, int data); } + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, int flags, struct sockaddr * __restrict from, __socklen_t * __restrict fromlenaddr); } + SYS_ACCEPT = 30 // { int accept(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen); } + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); } + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); } + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); } + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); } + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } + SYS_UMASK = 60 // { int umask(int newmask); } + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); } + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, struct itimerval *oitv); } + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); } + SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); } + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); } + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, caddr_t val, int valsize); } + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, struct timezone *tzp); } + SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, caddr_t val, int *avalsize); } + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, struct timezone *tzp); } + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, int flags, caddr_t to, int tolen); } + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, struct timeval *olddelta); } + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, caddr_t arg); } + SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); } + SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); } + SYS_LGETFH = 160 // { int lgetfh(char *fname, struct fhandle *fhp); } + SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, struct rtprio *rtp); } + SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } + SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } + SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct itimerspec *value); } + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate(struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate(struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id, int which, clockid_t *clock_id); } + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb* const *acb_list, int nent, struct sigevent *sig); } + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat *stat); } + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } + SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } + SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, size_t buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); } + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); } + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, sigset_t *oset); } + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout); } + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, siginfo_t *info); } + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, acl_type_t type); } + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); } + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, unsigned int iovcnt, int flags); } + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, struct mac *mac_p); } + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, struct mac *mac_p); } + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, struct mac *mac_p); } + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, struct mac *mac_p); } + SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, u_long flags); } + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } + SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } + SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } + SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } + SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); } + SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, unsigned int value); } + SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, unsigned int value); } + SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); } + SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); } + SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); } + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } + SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } + SYS_SIGRETURN = 417 // { int sigreturn(const struct __ucontext *sigcntxp); } + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext(const struct __ucontext *ucp); } + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, acl_type_t type); } + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, int *sig); } + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, int flags); } + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } + SYS_THR_SUSPEND = 442 // { int thr_suspend(const struct timespec *timeout); } + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, u_int length); } + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr(struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } + SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, lwpid_t lwpid, struct rtprio *rtp); } + SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr *from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, int whence); } + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, mode_t mode); } + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, cpusetid_t setid); } + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, cpuwhich_t which, id_t id, cpusetid_t *setid); } + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask); } + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, const cpuset_t *mask); } + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, int flag); } + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } + SYS_READLINKAT = 500 // { ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, unsigned int iovcnt, int flags); } + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, unsigned int iovcnt, int flags); } + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, int cmd, union semun *arg); } + SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, int fd, cap_rights_t *rightsp); } + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *sm); } + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, size_t namelen); } + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, off_t offset, off_t len); } + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, off_t len, int advice); } + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, int *status, int options, struct __wrusage *wrusage, siginfo_t *info); } + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, cap_rights_t *rightsp); } + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, const u_long *cmds, size_t ncmds); } + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, u_long *cmds, size_t maxcmds); } + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, uint32_t fcntlrights); } + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, uint32_t *fcntlrightsp); } + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, int namelen); } + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, int namelen); } + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, u_long flags, int atflag); } + SYS_ACCEPT4 = 541 // { int accept4(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen, int flags); } + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, int com, void *data); } + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } + SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } + SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_FDATASYNC = 550 // { int fdatasync(int fd); } + SYS_FSTAT = 551 // { int fstat(int fd, struct stat *sb); } + SYS_FSTATAT = 552 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FHSTAT = 553 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 554 // { ssize_t getdirentries(int fd, char *buf, size_t count, off_t *basep); } + SYS_STATFS = 555 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 556 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFSSTAT = 557 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_FHSTATFS = 558 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_MKNODAT = 559 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_KEVENT = 560 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_CPUSET_GETDOMAIN = 561 // { int cpuset_getdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int *policy); } + SYS_CPUSET_SETDOMAIN = 562 // { int cpuset_setdomain(cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *mask, int policy); } + SYS_GETRANDOM = 563 // { int getrandom(void *buf, size_t buflen, unsigned int flags); } + SYS_GETFHAT = 564 // { int getfhat(int fd, char *path, struct fhandle *fhp, int flags); } + SYS_FHLINK = 565 // { int fhlink(struct fhandle *fhp, const char *to); } + SYS_FHLINKAT = 566 // { int fhlinkat(struct fhandle *fhp, int tofd, const char *to,); } + SYS_FHREADLINK = 567 // { int fhreadlink(struct fhandle *fhp, char *buf, size_t bufsize); } + SYS___SYSCTLBYNAME = 570 // { int __sysctlbyname(const char *name, size_t namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_CLOSE_RANGE = 575 // { int close_range(u_int lowfd, u_int highfd, int flags); } +) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index 62192e1de..c9c4ad031 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/386/include -m32 /tmp/386/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 490aab5d2..12ff3417c 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/amd64/include -m64 /tmp/amd64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index aca17b6fa..c3fb5e77a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/arm/include /tmp/arm/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 54b4dfa54..358c847a4 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/arm64/include -fsigned-char /tmp/arm64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go index e443f9a32..81c4849b1 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/loong64/include /tmp/loong64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build loong64 && linux @@ -85,8 +85,6 @@ const ( SYS_SPLICE = 76 SYS_TEE = 77 SYS_READLINKAT = 78 - SYS_FSTATAT = 79 - SYS_FSTAT = 80 SYS_SYNC = 81 SYS_FSYNC = 82 SYS_FDATASYNC = 83 diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 65a99efc2..202a57e90 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/mips/include /tmp/mips/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 841c8a668..1fbceb52d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/mips64/include /tmp/mips64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index e26a7c765..b4ffb7a20 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/mips64le/include /tmp/mips64le/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 26447260a..867985f9b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/mipsle/include /tmp/mipsle/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go index 26aefc186..a8cce69ed 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/ppc/include /tmp/ppc/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index 8d4cd9d99..d44c5b39d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/ppc64/include /tmp/ppc64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 3b405d1f8..4214dd9c0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/ppc64le/include /tmp/ppc64le/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index c3a5af862..3e594a8c0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/riscv64/include /tmp/riscv64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux @@ -309,6 +309,7 @@ const ( SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_MEMFD_SECRET = 447 SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 8ffa66469..7ea465204 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/s390x/include -fsigned-char /tmp/s390x/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 6a39640e7..92f628ef4 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -1,4 +1,4 @@ -// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/sparc64/include /tmp/sparc64/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go index 817edbf95..597733813 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -6,6 +6,7 @@ package unix +// Deprecated: Use libc wrappers instead of direct syscalls. const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go index ea453614e..16af29189 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -6,6 +6,7 @@ package unix +// Deprecated: Use libc wrappers instead of direct syscalls. const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go index 467971eed..f59b18a97 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go @@ -6,6 +6,7 @@ package unix +// Deprecated: Use libc wrappers instead of direct syscalls. const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go index 32eec5ed5..721ef5910 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go @@ -6,6 +6,7 @@ package unix +// Deprecated: Use libc wrappers instead of direct syscalls. const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index 885842c0e..e2a64f099 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -366,30 +366,57 @@ type ICMPv6Filter struct { Filt [8]uint32 } +type TCPConnectionInfo struct { + State uint8 + Snd_wscale uint8 + Rcv_wscale uint8 + _ uint8 + Options uint32 + Flags uint32 + Rto uint32 + Maxseg uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Snd_wnd uint32 + Snd_sbbytes uint32 + Rcv_wnd uint32 + Rttcur uint32 + Srtt uint32 + Rttvar uint32 + Txpackets uint64 + Txbytes uint64 + Txretransmitbytes uint64 + Rxpackets uint64 + Rxbytes uint64 + Rxoutoforderbytes uint64 + Txretransmitpackets uint64 +} + const ( - SizeofSockaddrInet4 = 0x10 - SizeofSockaddrInet6 = 0x1c - SizeofSockaddrAny = 0x6c - SizeofSockaddrUnix = 0x6a - SizeofSockaddrDatalink = 0x14 - SizeofSockaddrCtl = 0x20 - SizeofSockaddrVM = 0xc - SizeofXvsockpcb = 0xa8 - SizeofXSocket = 0x64 - SizeofXSockbuf = 0x18 - SizeofXVSockPgen = 0x20 - SizeofXucred = 0x4c - SizeofLinger = 0x8 - SizeofIovec = 0x10 - SizeofIPMreq = 0x8 - SizeofIPMreqn = 0xc - SizeofIPv6Mreq = 0x14 - SizeofMsghdr = 0x30 - SizeofCmsghdr = 0xc - SizeofInet4Pktinfo = 0xc - SizeofInet6Pktinfo = 0x14 - SizeofIPv6MTUInfo = 0x20 - SizeofICMPv6Filter = 0x20 + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofSockaddrCtl = 0x20 + SizeofSockaddrVM = 0xc + SizeofXvsockpcb = 0xa8 + SizeofXSocket = 0x64 + SizeofXSockbuf = 0x18 + SizeofXVSockPgen = 0x20 + SizeofXucred = 0x4c + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofTCPConnectionInfo = 0x70 ) const ( diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index b23c02337..34aa77521 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -366,30 +366,57 @@ type ICMPv6Filter struct { Filt [8]uint32 } +type TCPConnectionInfo struct { + State uint8 + Snd_wscale uint8 + Rcv_wscale uint8 + _ uint8 + Options uint32 + Flags uint32 + Rto uint32 + Maxseg uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Snd_wnd uint32 + Snd_sbbytes uint32 + Rcv_wnd uint32 + Rttcur uint32 + Srtt uint32 + Rttvar uint32 + Txpackets uint64 + Txbytes uint64 + Txretransmitbytes uint64 + Rxpackets uint64 + Rxbytes uint64 + Rxoutoforderbytes uint64 + Txretransmitpackets uint64 +} + const ( - SizeofSockaddrInet4 = 0x10 - SizeofSockaddrInet6 = 0x1c - SizeofSockaddrAny = 0x6c - SizeofSockaddrUnix = 0x6a - SizeofSockaddrDatalink = 0x14 - SizeofSockaddrCtl = 0x20 - SizeofSockaddrVM = 0xc - SizeofXvsockpcb = 0xa8 - SizeofXSocket = 0x64 - SizeofXSockbuf = 0x18 - SizeofXVSockPgen = 0x20 - SizeofXucred = 0x4c - SizeofLinger = 0x8 - SizeofIovec = 0x10 - SizeofIPMreq = 0x8 - SizeofIPMreqn = 0xc - SizeofIPv6Mreq = 0x14 - SizeofMsghdr = 0x30 - SizeofCmsghdr = 0xc - SizeofInet4Pktinfo = 0xc - SizeofInet6Pktinfo = 0x14 - SizeofIPv6MTUInfo = 0x20 - SizeofICMPv6Filter = 0x20 + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofSockaddrCtl = 0x20 + SizeofSockaddrVM = 0xc + SizeofXvsockpcb = 0xa8 + SizeofXSocket = 0x64 + SizeofXSockbuf = 0x18 + SizeofXVSockPgen = 0x20 + SizeofXucred = 0x4c + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofTCPConnectionInfo = 0x70 ) const ( diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 4eec078e5..dea0c9a60 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -90,27 +90,6 @@ type Stat_t struct { Spare [10]uint64 } -type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Btim Timespec - _ [8]byte -} - type Statfs_t struct { Version uint32 Type uint32 @@ -136,31 +115,6 @@ type Statfs_t struct { Mntonname [1024]byte } -type statfs_freebsd11_t struct { - Version uint32 - Type uint32 - Flags uint64 - Bsize uint64 - Iosize uint64 - Blocks uint64 - Bfree uint64 - Bavail int64 - Files uint64 - Ffree int64 - Syncwrites uint64 - Asyncwrites uint64 - Syncreads uint64 - Asyncreads uint64 - Spare [10]uint64 - Namemax uint32 - Owner uint32 - Fsid Fsid - Charspare [80]int8 - Fstypename [16]byte - Mntfromname [88]byte - Mntonname [88]byte -} - type Flock_t struct { Start int64 Len int64 @@ -181,14 +135,6 @@ type Dirent struct { Name [256]int8 } -type dirent_freebsd11 struct { - Fileno uint32 - Reclen uint16 - Type uint8 - Namlen uint8 - Name [256]int8 -} - type Fsid struct { Val [2]int32 } @@ -337,41 +283,9 @@ const ( ) const ( - PTRACE_ATTACH = 0xa - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0xb - PTRACE_GETFPREGS = 0x23 - PTRACE_GETFSBASE = 0x47 - PTRACE_GETLWPLIST = 0xf - PTRACE_GETNUMLWPS = 0xe - PTRACE_GETREGS = 0x21 - PTRACE_GETXSTATE = 0x45 - PTRACE_IO = 0xc - PTRACE_KILL = 0x8 - PTRACE_LWPEVENTS = 0x18 - PTRACE_LWPINFO = 0xd - PTRACE_SETFPREGS = 0x24 - PTRACE_SETREGS = 0x22 - PTRACE_SINGLESTEP = 0x9 - PTRACE_TRACEME = 0x0 -) - -const ( - PIOD_READ_D = 0x1 - PIOD_WRITE_D = 0x2 - PIOD_READ_I = 0x3 - PIOD_WRITE_I = 0x4 -) - -const ( - PL_FLAG_BORN = 0x100 - PL_FLAG_EXITED = 0x200 - PL_FLAG_SI = 0x20 -) - -const ( - TRAP_BRKPT = 0x1 - TRAP_TRACE = 0x2 + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 ) type PtraceLwpInfoStruct struct { @@ -432,6 +346,8 @@ type FpReg struct { Pad [64]uint8 } +type FpExtendedPrecision struct{} + type PtraceIoDesc struct { Op int32 Offs *byte @@ -444,8 +360,9 @@ type Kevent_t struct { Filter int16 Flags uint16 Fflags uint32 - Data int32 + Data int64 Udata *byte + Ext [4]uint64 } type FdSet struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index 7622904a5..da0ea0d60 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -86,26 +86,6 @@ type Stat_t struct { Spare [10]uint64 } -type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Btim Timespec -} - type Statfs_t struct { Version uint32 Type uint32 @@ -131,31 +111,6 @@ type Statfs_t struct { Mntonname [1024]byte } -type statfs_freebsd11_t struct { - Version uint32 - Type uint32 - Flags uint64 - Bsize uint64 - Iosize uint64 - Blocks uint64 - Bfree uint64 - Bavail int64 - Files uint64 - Ffree int64 - Syncwrites uint64 - Asyncwrites uint64 - Syncreads uint64 - Asyncreads uint64 - Spare [10]uint64 - Namemax uint32 - Owner uint32 - Fsid Fsid - Charspare [80]int8 - Fstypename [16]byte - Mntfromname [88]byte - Mntonname [88]byte -} - type Flock_t struct { Start int64 Len int64 @@ -177,14 +132,6 @@ type Dirent struct { Name [256]int8 } -type dirent_freebsd11 struct { - Fileno uint32 - Reclen uint16 - Type uint8 - Namlen uint8 - Name [256]int8 -} - type Fsid struct { Val [2]int32 } @@ -333,41 +280,9 @@ const ( ) const ( - PTRACE_ATTACH = 0xa - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0xb - PTRACE_GETFPREGS = 0x23 - PTRACE_GETFSBASE = 0x47 - PTRACE_GETLWPLIST = 0xf - PTRACE_GETNUMLWPS = 0xe - PTRACE_GETREGS = 0x21 - PTRACE_GETXSTATE = 0x45 - PTRACE_IO = 0xc - PTRACE_KILL = 0x8 - PTRACE_LWPEVENTS = 0x18 - PTRACE_LWPINFO = 0xd - PTRACE_SETFPREGS = 0x24 - PTRACE_SETREGS = 0x22 - PTRACE_SINGLESTEP = 0x9 - PTRACE_TRACEME = 0x0 -) - -const ( - PIOD_READ_D = 0x1 - PIOD_WRITE_D = 0x2 - PIOD_READ_I = 0x3 - PIOD_WRITE_I = 0x4 -) - -const ( - PL_FLAG_BORN = 0x100 - PL_FLAG_EXITED = 0x200 - PL_FLAG_SI = 0x20 -) - -const ( - TRAP_BRKPT = 0x1 - TRAP_TRACE = 0x2 + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 ) type PtraceLwpInfoStruct struct { @@ -435,6 +350,8 @@ type FpReg struct { Spare [12]uint64 } +type FpExtendedPrecision struct{} + type PtraceIoDesc struct { Op int32 Offs *byte @@ -449,6 +366,7 @@ type Kevent_t struct { Fflags uint32 Data int64 Udata *byte + Ext [4]uint64 } type FdSet struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index 19223ce8e..da8f74045 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -33,7 +33,7 @@ type Timeval struct { _ [4]byte } -type Time_t int32 +type Time_t int64 type Rusage struct { Utime Timeval @@ -88,26 +88,6 @@ type Stat_t struct { Spare [10]uint64 } -type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Btim Timespec -} - type Statfs_t struct { Version uint32 Type uint32 @@ -133,31 +113,6 @@ type Statfs_t struct { Mntonname [1024]byte } -type statfs_freebsd11_t struct { - Version uint32 - Type uint32 - Flags uint64 - Bsize uint64 - Iosize uint64 - Blocks uint64 - Bfree uint64 - Bavail int64 - Files uint64 - Ffree int64 - Syncwrites uint64 - Asyncwrites uint64 - Syncreads uint64 - Asyncreads uint64 - Spare [10]uint64 - Namemax uint32 - Owner uint32 - Fsid Fsid - Charspare [80]int8 - Fstypename [16]byte - Mntfromname [88]byte - Mntonname [88]byte -} - type Flock_t struct { Start int64 Len int64 @@ -179,14 +134,6 @@ type Dirent struct { Name [256]int8 } -type dirent_freebsd11 struct { - Fileno uint32 - Reclen uint16 - Type uint8 - Namlen uint8 - Name [256]int8 -} - type Fsid struct { Val [2]int32 } @@ -335,41 +282,9 @@ const ( ) const ( - PTRACE_ATTACH = 0xa - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0xb - PTRACE_GETFPREGS = 0x23 - PTRACE_GETFSBASE = 0x47 - PTRACE_GETLWPLIST = 0xf - PTRACE_GETNUMLWPS = 0xe - PTRACE_GETREGS = 0x21 - PTRACE_GETXSTATE = 0x45 - PTRACE_IO = 0xc - PTRACE_KILL = 0x8 - PTRACE_LWPEVENTS = 0x18 - PTRACE_LWPINFO = 0xd - PTRACE_SETFPREGS = 0x24 - PTRACE_SETREGS = 0x22 - PTRACE_SINGLESTEP = 0x9 - PTRACE_TRACEME = 0x0 -) - -const ( - PIOD_READ_D = 0x1 - PIOD_WRITE_D = 0x2 - PIOD_READ_I = 0x3 - PIOD_WRITE_I = 0x4 -) - -const ( - PL_FLAG_BORN = 0x100 - PL_FLAG_EXITED = 0x200 - PL_FLAG_SI = 0x20 -) - -const ( - TRAP_BRKPT = 0x1 - TRAP_TRACE = 0x2 + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 ) type PtraceLwpInfoStruct struct { @@ -386,15 +301,15 @@ type PtraceLwpInfoStruct struct { } type __Siginfo struct { - Signo int32 - Errno int32 - Code int32 - Pid int32 - Uid uint32 - Status int32 - Addr *byte - Value [4]byte - X_reason [32]byte + Signo int32 + Errno int32 + Code int32 + Pid int32 + Uid uint32 + Status int32 + Addr *byte + Value [4]byte + _ [32]byte } type Sigset_t struct { @@ -402,16 +317,22 @@ type Sigset_t struct { } type Reg struct { - R [13]uint32 - R_sp uint32 - R_lr uint32 - R_pc uint32 - R_cpsr uint32 + R [13]uint32 + Sp uint32 + Lr uint32 + Pc uint32 + Cpsr uint32 } type FpReg struct { - Fpr_fpsr uint32 - Fpr [8][3]uint32 + Fpsr uint32 + Fpr [8]FpExtendedPrecision +} + +type FpExtendedPrecision struct { + Exponent uint32 + Mantissa_hi uint32 + Mantissa_lo uint32 } type PtraceIoDesc struct { @@ -426,8 +347,11 @@ type Kevent_t struct { Filter int16 Flags uint16 Fflags uint32 - Data int32 + _ [4]byte + Data int64 Udata *byte + _ [4]byte + Ext [4]uint64 } type FdSet struct { @@ -453,7 +377,7 @@ type ifMsghdr struct { Addrs int32 Flags int32 Index uint16 - _ [2]byte + _ uint16 Data ifData } @@ -464,7 +388,6 @@ type IfMsghdr struct { Addrs int32 Flags int32 Index uint16 - _ [2]byte Data IfData } @@ -532,7 +455,7 @@ type IfaMsghdr struct { Addrs int32 Flags int32 Index uint16 - _ [2]byte + _ uint16 Metric int32 } @@ -543,7 +466,7 @@ type IfmaMsghdr struct { Addrs int32 Flags int32 Index uint16 - _ [2]byte + _ uint16 } type IfAnnounceMsghdr struct { @@ -560,7 +483,7 @@ type RtMsghdr struct { Version uint8 Type uint8 Index uint16 - _ [2]byte + _ uint16 Flags int32 Addrs int32 Pid int32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index 8e3e33f67..d69988e5e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -86,26 +86,6 @@ type Stat_t struct { Spare [10]uint64 } -type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Btim Timespec -} - type Statfs_t struct { Version uint32 Type uint32 @@ -131,31 +111,6 @@ type Statfs_t struct { Mntonname [1024]byte } -type statfs_freebsd11_t struct { - Version uint32 - Type uint32 - Flags uint64 - Bsize uint64 - Iosize uint64 - Blocks uint64 - Bfree uint64 - Bavail int64 - Files uint64 - Ffree int64 - Syncwrites uint64 - Asyncwrites uint64 - Syncreads uint64 - Asyncreads uint64 - Spare [10]uint64 - Namemax uint32 - Owner uint32 - Fsid Fsid - Charspare [80]int8 - Fstypename [16]byte - Mntfromname [88]byte - Mntonname [88]byte -} - type Flock_t struct { Start int64 Len int64 @@ -177,14 +132,6 @@ type Dirent struct { Name [256]int8 } -type dirent_freebsd11 struct { - Fileno uint32 - Reclen uint16 - Type uint8 - Namlen uint8 - Name [256]int8 -} - type Fsid struct { Val [2]int32 } @@ -333,39 +280,9 @@ const ( ) const ( - PTRACE_ATTACH = 0xa - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0xb - PTRACE_GETFPREGS = 0x23 - PTRACE_GETLWPLIST = 0xf - PTRACE_GETNUMLWPS = 0xe - PTRACE_GETREGS = 0x21 - PTRACE_IO = 0xc - PTRACE_KILL = 0x8 - PTRACE_LWPEVENTS = 0x18 - PTRACE_LWPINFO = 0xd - PTRACE_SETFPREGS = 0x24 - PTRACE_SETREGS = 0x22 - PTRACE_SINGLESTEP = 0x9 - PTRACE_TRACEME = 0x0 -) - -const ( - PIOD_READ_D = 0x1 - PIOD_WRITE_D = 0x2 - PIOD_READ_I = 0x3 - PIOD_WRITE_I = 0x4 -) - -const ( - PL_FLAG_BORN = 0x100 - PL_FLAG_EXITED = 0x200 - PL_FLAG_SI = 0x20 -) - -const ( - TRAP_BRKPT = 0x1 - TRAP_TRACE = 0x2 + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 ) type PtraceLwpInfoStruct struct { @@ -413,6 +330,8 @@ type FpReg struct { _ [8]byte } +type FpExtendedPrecision struct{} + type PtraceIoDesc struct { Op int32 Offs *byte @@ -427,6 +346,7 @@ type Kevent_t struct { Fflags uint32 Data int64 Udata *byte + Ext [4]uint64 } type FdSet struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go new file mode 100644 index 000000000..d6fd9e883 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go @@ -0,0 +1,626 @@ +// cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build riscv64 && freebsd +// +build riscv64,freebsd + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Time_t int64 + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + _statfsVersion = 0x20140518 + _dirblksiz = 0x400 +) + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint16 + _0 int16 + Uid uint32 + Gid uint32 + _1 int32 + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint64 + Spare [10]uint64 +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]byte + Mntfromname [1024]byte + Mntonname [1024]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + _ [4]byte +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Pad0 uint8 + Namlen uint16 + Pad1 uint16 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Xucred struct { + Version uint32 + Uid uint32 + Ngroups int16 + Groups [16]uint32 + _ *byte +} + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofXucred = 0x58 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type PtraceLwpInfoStruct struct { + Lwpid int32 + Event int32 + Flags int32 + Sigmask Sigset_t + Siglist Sigset_t + Siginfo __Siginfo + Tdname [20]int8 + Child_pid int32 + Syscall_code uint32 + Syscall_narg uint32 +} + +type __Siginfo struct { + Signo int32 + Errno int32 + Code int32 + Pid int32 + Uid uint32 + Status int32 + Addr *byte + Value [8]byte + _ [40]byte +} + +type Sigset_t struct { + Val [4]uint32 +} + +type Reg struct { + Ra uint64 + Sp uint64 + Gp uint64 + Tp uint64 + T [7]uint64 + S [12]uint64 + A [8]uint64 + Sepc uint64 + Sstatus uint64 +} + +type FpReg struct { + X [32][2]uint64 + Fcsr uint64 +} + +type FpExtendedPrecision struct{} + +type PtraceIoDesc struct { + Op int32 + Offs *byte + Addr *byte + Len uint64 +} + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte + Ext [4]uint64 +} + +type FdSet struct { + Bits [16]uint64 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0xa8 + sizeofIfData = 0x98 + SizeofIfData = 0x98 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ uint16 + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + _ [8]byte + _ [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ uint16 + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ uint16 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ uint16 + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Expire uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Pksent uint64 + Weight uint64 + Nhidx uint64 + Filler [2]uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0x18 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + _ [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_EACCESS = 0x100 + AT_SYMLINK_NOFOLLOW = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_REMOVEDIR = 0x800 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Spare int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 9962d26bb..ff6881167 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -945,6 +945,9 @@ type PerfEventAttr struct { Aux_watermark uint32 Sample_max_stack uint16 _ uint16 + Aux_sample_size uint32 + _ uint32 + Sig_data uint64 } type PerfEventMmapPage struct { @@ -1127,7 +1130,9 @@ const ( PERF_BR_SYSRET = 0x8 PERF_BR_COND_CALL = 0x9 PERF_BR_COND_RET = 0xa - PERF_BR_MAX = 0xb + PERF_BR_ERET = 0xb + PERF_BR_IRQ = 0xc + PERF_BR_MAX = 0xd PERF_SAMPLE_REGS_ABI_NONE = 0x0 PERF_SAMPLE_REGS_ABI_32 = 0x1 PERF_SAMPLE_REGS_ABI_64 = 0x2 @@ -1461,6 +1466,11 @@ const ( IFLA_ALT_IFNAME = 0x35 IFLA_PERM_ADDRESS = 0x36 IFLA_PROTO_DOWN_REASON = 0x37 + IFLA_PARENT_DEV_NAME = 0x38 + IFLA_PARENT_DEV_BUS_NAME = 0x39 + IFLA_GRO_MAX_SIZE = 0x3a + IFLA_TSO_MAX_SIZE = 0x3b + IFLA_TSO_MAX_SEGS = 0x3c IFLA_PROTO_DOWN_REASON_UNSPEC = 0x0 IFLA_PROTO_DOWN_REASON_MASK = 0x1 IFLA_PROTO_DOWN_REASON_VALUE = 0x2 @@ -2969,7 +2979,7 @@ const ( DEVLINK_CMD_TRAP_POLICER_NEW = 0x47 DEVLINK_CMD_TRAP_POLICER_DEL = 0x48 DEVLINK_CMD_HEALTH_REPORTER_TEST = 0x49 - DEVLINK_CMD_MAX = 0x4d + DEVLINK_CMD_MAX = 0x51 DEVLINK_PORT_TYPE_NOTSET = 0x0 DEVLINK_PORT_TYPE_AUTO = 0x1 DEVLINK_PORT_TYPE_ETH = 0x2 @@ -3198,7 +3208,7 @@ const ( DEVLINK_ATTR_RATE_NODE_NAME = 0xa8 DEVLINK_ATTR_RATE_PARENT_NODE_NAME = 0xa9 DEVLINK_ATTR_REGION_MAX_SNAPSHOTS = 0xaa - DEVLINK_ATTR_MAX = 0xaa + DEVLINK_ATTR_MAX = 0xae DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 @@ -3638,7 +3648,11 @@ const ( ETHTOOL_A_RINGS_RX_MINI = 0x7 ETHTOOL_A_RINGS_RX_JUMBO = 0x8 ETHTOOL_A_RINGS_TX = 0x9 - ETHTOOL_A_RINGS_MAX = 0xa + ETHTOOL_A_RINGS_RX_BUF_LEN = 0xa + ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 0xb + ETHTOOL_A_RINGS_CQE_SIZE = 0xc + ETHTOOL_A_RINGS_TX_PUSH = 0xd + ETHTOOL_A_RINGS_MAX = 0xd ETHTOOL_A_CHANNELS_UNSPEC = 0x0 ETHTOOL_A_CHANNELS_HEADER = 0x1 ETHTOOL_A_CHANNELS_RX_MAX = 0x2 @@ -4323,7 +4337,7 @@ const ( NL80211_ATTR_MAC_HINT = 0xc8 NL80211_ATTR_MAC_MASK = 0xd7 NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca - NL80211_ATTR_MAX = 0x135 + NL80211_ATTR_MAX = 0x137 NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4 NL80211_ATTR_MAX_CSA_COUNTERS = 0xce NL80211_ATTR_MAX_MATCH_SETS = 0x85 @@ -4549,7 +4563,7 @@ const ( NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY = 0x3 NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE = 0x5 NL80211_BAND_IFTYPE_ATTR_IFTYPES = 0x1 - NL80211_BAND_IFTYPE_ATTR_MAX = 0x7 + NL80211_BAND_IFTYPE_ATTR_MAX = 0xb NL80211_BAND_S1GHZ = 0x4 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE = 0x2 NL80211_BITRATE_ATTR_MAX = 0x2 @@ -4887,7 +4901,7 @@ const ( NL80211_FREQUENCY_ATTR_GO_CONCURRENT = 0xf NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 0xe NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 0xf - NL80211_FREQUENCY_ATTR_MAX = 0x19 + NL80211_FREQUENCY_ATTR_MAX = 0x1b NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 0x6 NL80211_FREQUENCY_ATTR_NO_10MHZ = 0x11 NL80211_FREQUENCY_ATTR_NO_160MHZ = 0xc @@ -5254,7 +5268,7 @@ const ( NL80211_RATE_INFO_HE_RU_ALLOC_52 = 0x1 NL80211_RATE_INFO_HE_RU_ALLOC_996 = 0x5 NL80211_RATE_INFO_HE_RU_ALLOC = 0x11 - NL80211_RATE_INFO_MAX = 0x11 + NL80211_RATE_INFO_MAX = 0x16 NL80211_RATE_INFO_MCS = 0x2 NL80211_RATE_INFO_SHORT_GI = 0x4 NL80211_RATE_INFO_VHT_MCS = 0x6 @@ -5588,3 +5602,8 @@ const ( FR_ACT_UNREACHABLE = 0x7 FR_ACT_PROHIBIT = 0x8 ) + +const ( + AUDIT_NLGRP_NONE = 0x0 + AUDIT_NLGRP_READLOG = 0x1 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 4948362f2..263604401 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/386/cgo -- -Wall -Werror -static -I/tmp/386/include -m32 linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux @@ -324,6 +324,13 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index f64345e0e..8187489d1 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/amd64/cgo -- -Wall -Werror -static -I/tmp/amd64/include -m64 linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux @@ -338,6 +338,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 72469c79e..d1612335f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/arm/cgo -- -Wall -Werror -static -I/tmp/arm/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux @@ -315,6 +315,13 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 68f072283..c28e5556b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/arm64/cgo -- -Wall -Werror -static -I/tmp/arm64/include -fsigned-char linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux @@ -317,6 +317,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go index 090ae46c6..187061f9f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/loong64/cgo -- -Wall -Werror -static -I/tmp/loong64/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build loong64 && linux @@ -318,6 +318,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 03604cca1..369129917 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/mips/cgo -- -Wall -Werror -static -I/tmp/mips/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux @@ -320,6 +320,13 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index fe57a7b26..7473468d7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/mips64/cgo -- -Wall -Werror -static -I/tmp/mips64/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux @@ -320,6 +320,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 3f0db4da8..ed9448524 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/mips64le/cgo -- -Wall -Werror -static -I/tmp/mips64le/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux @@ -320,6 +320,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 70ecd3b23..0892a73a4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/mipsle/cgo -- -Wall -Werror -static -I/tmp/mipsle/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux @@ -320,6 +320,13 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index 4e700120d..e1dd48333 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/ppc/cgo -- -Wall -Werror -static -I/tmp/ppc/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux @@ -327,6 +327,13 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + _ [4]byte + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 34a57c699..d9f654c7b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/ppc64/cgo -- -Wall -Werror -static -I/tmp/ppc64/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux @@ -327,6 +327,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 6b84a4729..74acda9fe 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/ppc64le/cgo -- -Wall -Werror -static -I/tmp/ppc64le/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux @@ -327,6 +327,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index c4a305fe2..50ebe69eb 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/riscv64/cgo -- -Wall -Werror -static -I/tmp/riscv64/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux @@ -345,6 +345,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index a1f1e4c9e..75b34c259 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/s390x/cgo -- -Wall -Werror -static -I/tmp/s390x/include -fsigned-char linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux @@ -340,6 +340,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index df95ebf3a..429c3bf7d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -objdir=/tmp/sparc64/cgo -- -Wall -Werror -static -I/tmp/sparc64/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux @@ -322,6 +322,12 @@ type Taskstats struct { Ac_btime64 uint64 Compact_count uint64 Compact_delay_total uint64 + Ac_tgid uint32 + Ac_tgetime uint64 + Ac_exe_dev uint64 + Ac_exe_inode uint64 + Wpcopy_count uint64 + Wpcopy_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go index ad4aad279..c1a9b83ad 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -178,7 +178,7 @@ type Linger struct { } type Iovec struct { - Base *int8 + Base *byte Len uint64 } diff --git a/vendor/golang.org/x/sys/windows/setupapi_windows.go b/vendor/golang.org/x/sys/windows/setupapi_windows.go index 14027da3f..f8126482f 100644 --- a/vendor/golang.org/x/sys/windows/setupapi_windows.go +++ b/vendor/golang.org/x/sys/windows/setupapi_windows.go @@ -296,7 +296,7 @@ const ( // Flag to indicate that the sorting from the INF file should be used. DI_INF_IS_SORTED DI_FLAGS = 0x00008000 - // Flag to indicate that only the the INF specified by SP_DEVINSTALL_PARAMS.DriverPath should be searched. + // Flag to indicate that only the INF specified by SP_DEVINSTALL_PARAMS.DriverPath should be searched. DI_ENUMSINGLEINF DI_FLAGS = 0x00010000 // Flag that prevents ConfigMgr from removing/re-enumerating devices during device diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 636e5de60..e27913817 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -417,6 +417,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb uint32) (err error) = psapi.GetModuleInformation //sys GetModuleFileNameEx(process Handle, module Handle, filename *uint16, size uint32) (err error) = psapi.GetModuleFileNameExW //sys GetModuleBaseName(process Handle, module Handle, baseName *uint16, size uint32) (err error) = psapi.GetModuleBaseNameW +//sys QueryWorkingSetEx(process Handle, pv uintptr, cb uint32) (err error) = psapi.QueryWorkingSetEx // NT Native APIs //sys rtlNtStatusToDosErrorNoTeb(ntstatus NTStatus) (ret syscall.Errno) = ntdll.RtlNtStatusToDosErrorNoTeb @@ -861,6 +862,7 @@ const socket_error = uintptr(^uint32(0)) //sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses //sys GetACP() (acp uint32) = kernel32.GetACP //sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar +//sys getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx // For testing: clients can set this flag to force // creation of IPv6 sockets to return EAFNOSUPPORT. @@ -970,6 +972,32 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { return unsafe.Pointer(&sa.raw), sl, nil } +type RawSockaddrBth struct { + AddressFamily [2]byte + BtAddr [8]byte + ServiceClassId [16]byte + Port [4]byte +} + +type SockaddrBth struct { + BtAddr uint64 + ServiceClassId GUID + Port uint32 + + raw RawSockaddrBth +} + +func (sa *SockaddrBth) sockaddr() (unsafe.Pointer, int32, error) { + family := AF_BTH + sa.raw = RawSockaddrBth{ + AddressFamily: *(*[2]byte)(unsafe.Pointer(&family)), + BtAddr: *(*[8]byte)(unsafe.Pointer(&sa.BtAddr)), + Port: *(*[4]byte)(unsafe.Pointer(&sa.Port)), + ServiceClassId: *(*[16]byte)(unsafe.Pointer(&sa.ServiceClassId)), + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { switch rsa.Addr.Family { case AF_UNIX: @@ -1045,6 +1073,14 @@ func Connect(fd Handle, sa Sockaddr) (err error) { return connect(fd, ptr, n) } +func GetBestInterfaceEx(sa Sockaddr, pdwBestIfIndex *uint32) (err error) { + ptr, _, err := sa.sockaddr() + if err != nil { + return err + } + return getBestInterfaceEx(ptr, pdwBestIfIndex) +} + func Getsockname(fd Handle) (sa Sockaddr, err error) { var rsa RawSockaddrAny l := int32(unsafe.Sizeof(rsa)) @@ -1698,3 +1734,71 @@ func LoadResourceData(module, resInfo Handle) (data []byte, err error) { h.Cap = int(size) return } + +// PSAPI_WORKING_SET_EX_BLOCK contains extended working set information for a page. +type PSAPI_WORKING_SET_EX_BLOCK uint64 + +// Valid returns the validity of this page. +// If this bit is 1, the subsequent members are valid; otherwise they should be ignored. +func (b PSAPI_WORKING_SET_EX_BLOCK) Valid() bool { + return (b & 1) == 1 +} + +// ShareCount is the number of processes that share this page. The maximum value of this member is 7. +func (b PSAPI_WORKING_SET_EX_BLOCK) ShareCount() uint64 { + return b.intField(1, 3) +} + +// Win32Protection is the memory protection attributes of the page. For a list of values, see +// https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants +func (b PSAPI_WORKING_SET_EX_BLOCK) Win32Protection() uint64 { + return b.intField(4, 11) +} + +// Shared returns the shared status of this page. +// If this bit is 1, the page can be shared. +func (b PSAPI_WORKING_SET_EX_BLOCK) Shared() bool { + return (b & (1 << 15)) == 1 +} + +// Node is the NUMA node. The maximum value of this member is 63. +func (b PSAPI_WORKING_SET_EX_BLOCK) Node() uint64 { + return b.intField(16, 6) +} + +// Locked returns the locked status of this page. +// If this bit is 1, the virtual page is locked in physical memory. +func (b PSAPI_WORKING_SET_EX_BLOCK) Locked() bool { + return (b & (1 << 22)) == 1 +} + +// LargePage returns the large page status of this page. +// If this bit is 1, the page is a large page. +func (b PSAPI_WORKING_SET_EX_BLOCK) LargePage() bool { + return (b & (1 << 23)) == 1 +} + +// Bad returns the bad status of this page. +// If this bit is 1, the page is has been reported as bad. +func (b PSAPI_WORKING_SET_EX_BLOCK) Bad() bool { + return (b & (1 << 31)) == 1 +} + +// intField extracts an integer field in the PSAPI_WORKING_SET_EX_BLOCK union. +func (b PSAPI_WORKING_SET_EX_BLOCK) intField(start, length int) uint64 { + var mask PSAPI_WORKING_SET_EX_BLOCK + for pos := start; pos < start+length; pos++ { + mask |= (1 << pos) + } + + masked := b & mask + return uint64(masked >> start) +} + +// PSAPI_WORKING_SET_EX_INFORMATION contains extended working set information for a process. +type PSAPI_WORKING_SET_EX_INFORMATION struct { + // The virtual address. + VirtualAddress Pointer + // A PSAPI_WORKING_SET_EX_BLOCK union that indicates the attributes of the page at VirtualAddress. + VirtualAttributes PSAPI_WORKING_SET_EX_BLOCK +} diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index e19471c6a..f9eaca528 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -160,6 +160,10 @@ const ( MAX_COMPUTERNAME_LENGTH = 15 + MAX_DHCPV6_DUID_LENGTH = 130 + + MAX_DNS_SUFFIX_STRING_LENGTH = 256 + TIME_ZONE_ID_UNKNOWN = 0 TIME_ZONE_ID_STANDARD = 1 @@ -2000,27 +2004,62 @@ type IpAdapterPrefix struct { } type IpAdapterAddresses struct { - Length uint32 - IfIndex uint32 - Next *IpAdapterAddresses - AdapterName *byte - FirstUnicastAddress *IpAdapterUnicastAddress - FirstAnycastAddress *IpAdapterAnycastAddress - FirstMulticastAddress *IpAdapterMulticastAddress - FirstDnsServerAddress *IpAdapterDnsServerAdapter - DnsSuffix *uint16 - Description *uint16 - FriendlyName *uint16 - PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte - PhysicalAddressLength uint32 - Flags uint32 - Mtu uint32 - IfType uint32 - OperStatus uint32 - Ipv6IfIndex uint32 - ZoneIndices [16]uint32 - FirstPrefix *IpAdapterPrefix - /* more fields might be present here. */ + Length uint32 + IfIndex uint32 + Next *IpAdapterAddresses + AdapterName *byte + FirstUnicastAddress *IpAdapterUnicastAddress + FirstAnycastAddress *IpAdapterAnycastAddress + FirstMulticastAddress *IpAdapterMulticastAddress + FirstDnsServerAddress *IpAdapterDnsServerAdapter + DnsSuffix *uint16 + Description *uint16 + FriendlyName *uint16 + PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte + PhysicalAddressLength uint32 + Flags uint32 + Mtu uint32 + IfType uint32 + OperStatus uint32 + Ipv6IfIndex uint32 + ZoneIndices [16]uint32 + FirstPrefix *IpAdapterPrefix + TransmitLinkSpeed uint64 + ReceiveLinkSpeed uint64 + FirstWinsServerAddress *IpAdapterWinsServerAddress + FirstGatewayAddress *IpAdapterGatewayAddress + Ipv4Metric uint32 + Ipv6Metric uint32 + Luid uint64 + Dhcpv4Server SocketAddress + CompartmentId uint32 + NetworkGuid GUID + ConnectionType uint32 + TunnelType uint32 + Dhcpv6Server SocketAddress + Dhcpv6ClientDuid [MAX_DHCPV6_DUID_LENGTH]byte + Dhcpv6ClientDuidLength uint32 + Dhcpv6Iaid uint32 + FirstDnsSuffix *IpAdapterDNSSuffix +} + +type IpAdapterWinsServerAddress struct { + Length uint32 + Reserved uint32 + Next *IpAdapterWinsServerAddress + Address SocketAddress +} + +type IpAdapterGatewayAddress struct { + Length uint32 + Reserved uint32 + Next *IpAdapterGatewayAddress + Address SocketAddress +} + +type IpAdapterDNSSuffix struct { + Next *IpAdapterDNSSuffix + String [MAX_DNS_SUFFIX_STRING_LENGTH]uint16 } const ( diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 68f52c1e6..52d4742cb 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -177,6 +177,7 @@ var ( procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") + procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx") procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject") procCancelIo = modkernel32.NewProc("CancelIo") @@ -407,6 +408,7 @@ var ( procGetModuleBaseNameW = modpsapi.NewProc("GetModuleBaseNameW") procGetModuleFileNameExW = modpsapi.NewProc("GetModuleFileNameExW") procGetModuleInformation = modpsapi.NewProc("GetModuleInformation") + procQueryWorkingSetEx = modpsapi.NewProc("QueryWorkingSetEx") procSubscribeServiceChangeNotifications = modsechost.NewProc("SubscribeServiceChangeNotifications") procUnsubscribeServiceChangeNotifications = modsechost.NewProc("UnsubscribeServiceChangeNotifications") procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") @@ -1539,6 +1541,14 @@ func GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) { return } +func getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) { + r0, _, _ := syscall.Syscall(procGetBestInterfaceEx.Addr(), 2, uintptr(sockaddr), uintptr(unsafe.Pointer(pdwBestIfIndex)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + func GetIfEntry(pIfRow *MibIfRow) (errcode error) { r0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0) if r0 != 0 { @@ -3495,6 +3505,14 @@ func GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb return } +func QueryWorkingSetEx(process Handle, pv uintptr, cb uint32) (err error) { + r1, _, e1 := syscall.Syscall(procQueryWorkingSetEx.Addr(), 3, uintptr(process), uintptr(pv), uintptr(cb)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func SubscribeServiceChangeNotifications(service Handle, eventType uint32, callback uintptr, callbackCtx uintptr, subscription *uintptr) (ret error) { ret = procSubscribeServiceChangeNotifications.Find() if ret != nil { diff --git a/vendor/golang.org/x/term/AUTHORS b/vendor/golang.org/x/term/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/term/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/term/CONTRIBUTORS b/vendor/golang.org/x/term/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/term/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/term/term.go b/vendor/golang.org/x/term/term.go index d59270880..1a40d1012 100644 --- a/vendor/golang.org/x/term/term.go +++ b/vendor/golang.org/x/term/term.go @@ -7,11 +7,11 @@ // // Putting a terminal into raw mode is the most common requirement: // -// oldState, err := term.MakeRaw(int(os.Stdin.Fd())) -// if err != nil { -// panic(err) -// } -// defer term.Restore(int(os.Stdin.Fd()), oldState) +// oldState, err := term.MakeRaw(int(os.Stdin.Fd())) +// if err != nil { +// panic(err) +// } +// defer term.Restore(int(os.Stdin.Fd()), oldState) // // Note that on non-Unix systems os.Stdin.Fd() may not be 0. package term diff --git a/vendor/golang.org/x/term/terminal.go b/vendor/golang.org/x/term/terminal.go index 535ab8257..4b48a5899 100644 --- a/vendor/golang.org/x/term/terminal.go +++ b/vendor/golang.org/x/term/terminal.go @@ -935,7 +935,7 @@ func (s *stRingBuffer) Add(a string) { // next most recent, and so on. If such an element doesn't exist then ok is // false. func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { - if n >= s.size { + if n < 0 || n >= s.size { return "", false } index := s.head - n diff --git a/vendor/golang.org/x/time/AUTHORS b/vendor/golang.org/x/time/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/time/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/time/CONTRIBUTORS b/vendor/golang.org/x/time/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/time/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/time/rate/rate.go b/vendor/golang.org/x/time/rate/rate.go index b0b982e9c..12e813cc7 100644 --- a/vendor/golang.org/x/time/rate/rate.go +++ b/vendor/golang.org/x/time/rate/rate.go @@ -196,13 +196,15 @@ func (lim *Limiter) Reserve() *Reservation { // The Limiter takes this Reservation into account when allowing future events. // The returned Reservation’s OK() method returns false if n exceeds the Limiter's burst size. // Usage example: -// r := lim.ReserveN(time.Now(), 1) -// if !r.OK() { -// // Not allowed to act! Did you remember to set lim.burst to be > 0 ? -// return -// } -// time.Sleep(r.Delay()) -// Act() +// +// r := lim.ReserveN(time.Now(), 1) +// if !r.OK() { +// // Not allowed to act! Did you remember to set lim.burst to be > 0 ? +// return +// } +// time.Sleep(r.Delay()) +// Act() +// // Use this method if you wish to wait and slow down in accordance with the rate limit without dropping events. // If you need to respect a deadline or cancel the delay, use Wait instead. // To drop or skip events exceeding rate limit, use Allow instead. @@ -221,6 +223,18 @@ func (lim *Limiter) Wait(ctx context.Context) (err error) { // canceled, or the expected wait time exceeds the Context's Deadline. // The burst limit is ignored if the rate limit is Inf. func (lim *Limiter) WaitN(ctx context.Context, n int) (err error) { + // The test code calls lim.wait with a fake timer generator. + // This is the real timer generator. + newTimer := func(d time.Duration) (<-chan time.Time, func() bool, func()) { + timer := time.NewTimer(d) + return timer.C, timer.Stop, func() {} + } + + return lim.wait(ctx, n, time.Now(), newTimer) +} + +// wait is the internal implementation of WaitN. +func (lim *Limiter) wait(ctx context.Context, n int, now time.Time, newTimer func(d time.Duration) (<-chan time.Time, func() bool, func())) error { lim.mu.Lock() burst := lim.burst limit := lim.limit @@ -236,7 +250,6 @@ func (lim *Limiter) WaitN(ctx context.Context, n int) (err error) { default: } // Determine wait limit - now := time.Now() waitLimit := InfDuration if deadline, ok := ctx.Deadline(); ok { waitLimit = deadline.Sub(now) @@ -251,10 +264,11 @@ func (lim *Limiter) WaitN(ctx context.Context, n int) (err error) { if delay == 0 { return nil } - t := time.NewTimer(delay) - defer t.Stop() + ch, stop, advance := newTimer(delay) + defer stop() + advance() // only has an effect when testing select { - case <-t.C: + case <-ch: // We can proceed. return nil case <-ctx.Done(): diff --git a/vendor/golang.org/x/tools/AUTHORS b/vendor/golang.org/x/tools/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/tools/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/tools/CONTRIBUTORS b/vendor/golang.org/x/tools/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/tools/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go index d50826dbf..2ed25a750 100644 --- a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go +++ b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go @@ -22,26 +22,42 @@ package gcexportdata // import "golang.org/x/tools/go/gcexportdata" import ( "bufio" "bytes" + "encoding/json" "fmt" "go/token" "go/types" "io" "io/ioutil" + "os/exec" "golang.org/x/tools/go/internal/gcimporter" ) // Find returns the name of an object (.o) or archive (.a) file // containing type information for the specified import path, -// using the workspace layout conventions of go/build. +// using the go command. // If no file was found, an empty filename is returned. // // A relative srcDir is interpreted relative to the current working directory. // // Find also returns the package's resolved (canonical) import path, // reflecting the effects of srcDir and vendoring on importPath. +// +// Deprecated: Use the higher-level API in golang.org/x/tools/go/packages, +// which is more efficient. func Find(importPath, srcDir string) (filename, path string) { - return gcimporter.FindPkg(importPath, srcDir) + cmd := exec.Command("go", "list", "-json", "-export", "--", importPath) + cmd.Dir = srcDir + out, err := cmd.CombinedOutput() + if err != nil { + return "", "" + } + var data struct { + ImportPath string + Export string + } + json.Unmarshal(out, &data) + return data.Export, data.ImportPath } // NewReader returns a reader for the export data section of an object @@ -100,13 +116,29 @@ func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package, // The indexed export format starts with an 'i'; the older // binary export format starts with a 'c', 'd', or 'v' // (from "version"). Select appropriate importer. - if len(data) > 0 && data[0] == 'i' { - _, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path) - return pkg, err - } + if len(data) > 0 { + switch data[0] { + case 'i': + _, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path) + return pkg, err + + case 'v', 'c', 'd': + _, pkg, err := gcimporter.BImportData(fset, imports, data, path) + return pkg, err - _, pkg, err := gcimporter.BImportData(fset, imports, data, path) - return pkg, err + case 'u': + _, pkg, err := gcimporter.UImportData(fset, imports, data[1:], path) + return pkg, err + + default: + l := len(data) + if l > 10 { + l = 10 + } + return nil, fmt.Errorf("unexpected export data with prefix %q for path %s", string(data[:l]), path) + } + } + return nil, fmt.Errorf("empty export data for %s", path) } // Write writes encoded type information for the specified package to out. diff --git a/vendor/golang.org/x/tools/go/gcexportdata/importer.go b/vendor/golang.org/x/tools/go/gcexportdata/importer.go index fe6ed9321..37a7247e2 100644 --- a/vendor/golang.org/x/tools/go/gcexportdata/importer.go +++ b/vendor/golang.org/x/tools/go/gcexportdata/importer.go @@ -22,6 +22,9 @@ import ( // version-skew problems described in the documentation of this package, // or to control the FileSet or access the imports map populated during // package loading. +// +// Deprecated: Use the higher-level API in golang.org/x/tools/go/packages, +// which is more efficient. func NewImporter(fset *token.FileSet, imports map[string]*types.Package) types.ImporterFrom { return importer{fset, imports} } diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go index 493bfa03b..e96c39600 100644 --- a/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go @@ -181,8 +181,9 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func defer rc.Close() var hdr string + var size int64 buf := bufio.NewReader(rc) - if hdr, _, err = FindExportData(buf); err != nil { + if hdr, size, err = FindExportData(buf); err != nil { return } @@ -210,10 +211,27 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func // The indexed export format starts with an 'i'; the older // binary export format starts with a 'c', 'd', or 'v' // (from "version"). Select appropriate importer. - if len(data) > 0 && data[0] == 'i' { - _, pkg, err = IImportData(fset, packages, data[1:], id) - } else { - _, pkg, err = BImportData(fset, packages, data, id) + if len(data) > 0 { + switch data[0] { + case 'i': + _, pkg, err := IImportData(fset, packages, data[1:], id) + return pkg, err + + case 'v', 'c', 'd': + _, pkg, err := BImportData(fset, packages, data, id) + return pkg, err + + case 'u': + _, pkg, err := UImportData(fset, packages, data[1:size], id) + return pkg, err + + default: + l := len(data) + if l > 10 { + l = 10 + } + return nil, fmt.Errorf("unexpected export data with prefix %q for path %s", string(data[:l]), id) + } } default: diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go b/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go index 28b91b865..4caa0f55d 100644 --- a/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go @@ -17,6 +17,7 @@ import ( "go/token" "go/types" "io" + "math/big" "sort" "strings" @@ -512,7 +513,9 @@ func (r *importReader) value() (typ types.Type, val constant.Value) { val = constant.MakeString(r.string()) case types.IsInteger: - val = r.mpint(b) + var x big.Int + r.mpint(&x, b) + val = constant.Make(&x) case types.IsFloat: val = r.mpfloat(b) @@ -561,8 +564,8 @@ func intSize(b *types.Basic) (signed bool, maxBytes uint) { return } -func (r *importReader) mpint(b *types.Basic) constant.Value { - signed, maxBytes := intSize(b) +func (r *importReader) mpint(x *big.Int, typ *types.Basic) { + signed, maxBytes := intSize(typ) maxSmall := 256 - maxBytes if signed { @@ -581,7 +584,8 @@ func (r *importReader) mpint(b *types.Basic) constant.Value { v = ^v } } - return constant.MakeInt64(v) + x.SetInt64(v) + return } v := -n @@ -591,47 +595,23 @@ func (r *importReader) mpint(b *types.Basic) constant.Value { if v < 1 || uint(v) > maxBytes { errorf("weird decoding: %v, %v => %v", n, signed, v) } - - buf := make([]byte, v) - io.ReadFull(&r.declReader, buf) - - // convert to little endian - // TODO(gri) go/constant should have a more direct conversion function - // (e.g., once it supports a big.Float based implementation) - for i, j := 0, len(buf)-1; i < j; i, j = i+1, j-1 { - buf[i], buf[j] = buf[j], buf[i] - } - - x := constant.MakeFromBytes(buf) + b := make([]byte, v) + io.ReadFull(&r.declReader, b) + x.SetBytes(b) if signed && n&1 != 0 { - x = constant.UnaryOp(token.SUB, x, 0) + x.Neg(x) } - return x } -func (r *importReader) mpfloat(b *types.Basic) constant.Value { - x := r.mpint(b) - if constant.Sign(x) == 0 { - return x - } - - exp := r.int64() - switch { - case exp > 0: - x = constant.Shift(x, token.SHL, uint(exp)) - // Ensure that the imported Kind is Float, else this constant may run into - // bitsize limits on overlarge integers. Eventually we can instead adopt - // the approach of CL 288632, but that CL relies on go/constant APIs that - // were introduced in go1.13. - // - // TODO(rFindley): sync the logic here with tip Go once we no longer - // support go1.12. - x = constant.ToFloat(x) - case exp < 0: - d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp)) - x = constant.BinaryOp(x, token.QUO, d) +func (r *importReader) mpfloat(typ *types.Basic) constant.Value { + var mant big.Int + r.mpint(&mant, typ) + var f big.Float + f.SetInt(&mant) + if f.Sign() != 0 { + f.SetMantExp(&f, int(r.int64())) } - return x + return constant.Make(&f) } func (r *importReader) ident() string { diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/unified_no.go b/vendor/golang.org/x/tools/go/internal/gcimporter/unified_no.go new file mode 100644 index 000000000..286bf4454 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/unified_no.go @@ -0,0 +1,10 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !(go1.18 && goexperiment.unified) +// +build !go1.18 !goexperiment.unified + +package gcimporter + +const unifiedIR = false diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/unified_yes.go b/vendor/golang.org/x/tools/go/internal/gcimporter/unified_yes.go new file mode 100644 index 000000000..b5d69ffbe --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/unified_yes.go @@ -0,0 +1,10 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.18 && goexperiment.unified +// +build go1.18,goexperiment.unified + +package gcimporter + +const unifiedIR = true diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/ureader_no.go b/vendor/golang.org/x/tools/go/internal/gcimporter/ureader_no.go new file mode 100644 index 000000000..8eb20729c --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/ureader_no.go @@ -0,0 +1,19 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.18 +// +build !go1.18 + +package gcimporter + +import ( + "fmt" + "go/token" + "go/types" +) + +func UImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) { + err = fmt.Errorf("go/tools compiled with a Go version earlier than 1.18 cannot read unified IR export data") + return +} diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/ureader_yes.go b/vendor/golang.org/x/tools/go/internal/gcimporter/ureader_yes.go new file mode 100644 index 000000000..3c1a43754 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/ureader_yes.go @@ -0,0 +1,612 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Derived from go/internal/gcimporter/ureader.go + +//go:build go1.18 +// +build go1.18 + +package gcimporter + +import ( + "go/token" + "go/types" + "strings" + + "golang.org/x/tools/go/internal/pkgbits" +) + +// A pkgReader holds the shared state for reading a unified IR package +// description. +type pkgReader struct { + pkgbits.PkgDecoder + + fake fakeFileSet + + ctxt *types.Context + imports map[string]*types.Package // previously imported packages, indexed by path + + // lazily initialized arrays corresponding to the unified IR + // PosBase, Pkg, and Type sections, respectively. + posBases []string // position bases (i.e., file names) + pkgs []*types.Package + typs []types.Type + + // laterFns holds functions that need to be invoked at the end of + // import reading. + laterFns []func() +} + +// later adds a function to be invoked at the end of import reading. +func (pr *pkgReader) later(fn func()) { + pr.laterFns = append(pr.laterFns, fn) +} + +// See cmd/compile/internal/noder.derivedInfo. +type derivedInfo struct { + idx pkgbits.Index + needed bool +} + +// See cmd/compile/internal/noder.typeInfo. +type typeInfo struct { + idx pkgbits.Index + derived bool +} + +func UImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) { + s := string(data) + s = s[:strings.LastIndex(s, "\n$$\n")] + input := pkgbits.NewPkgDecoder(path, s) + pkg = readUnifiedPackage(fset, nil, imports, input) + return +} + +// readUnifiedPackage reads a package description from the given +// unified IR export data decoder. +func readUnifiedPackage(fset *token.FileSet, ctxt *types.Context, imports map[string]*types.Package, input pkgbits.PkgDecoder) *types.Package { + pr := pkgReader{ + PkgDecoder: input, + + fake: fakeFileSet{ + fset: fset, + files: make(map[string]*fileInfo), + }, + + ctxt: ctxt, + imports: imports, + + posBases: make([]string, input.NumElems(pkgbits.RelocPosBase)), + pkgs: make([]*types.Package, input.NumElems(pkgbits.RelocPkg)), + typs: make([]types.Type, input.NumElems(pkgbits.RelocType)), + } + defer pr.fake.setLines() + + r := pr.newReader(pkgbits.RelocMeta, pkgbits.PublicRootIdx, pkgbits.SyncPublic) + pkg := r.pkg() + r.Bool() // has init + + for i, n := 0, r.Len(); i < n; i++ { + // As if r.obj(), but avoiding the Scope.Lookup call, + // to avoid eager loading of imports. + r.Sync(pkgbits.SyncObject) + assert(!r.Bool()) + r.p.objIdx(r.Reloc(pkgbits.RelocObj)) + assert(r.Len() == 0) + } + + r.Sync(pkgbits.SyncEOF) + + for _, fn := range pr.laterFns { + fn() + } + + pkg.MarkComplete() + return pkg +} + +// A reader holds the state for reading a single unified IR element +// within a package. +type reader struct { + pkgbits.Decoder + + p *pkgReader + + dict *readerDict +} + +// A readerDict holds the state for type parameters that parameterize +// the current unified IR element. +type readerDict struct { + // bounds is a slice of typeInfos corresponding to the underlying + // bounds of the element's type parameters. + bounds []typeInfo + + // tparams is a slice of the constructed TypeParams for the element. + tparams []*types.TypeParam + + // devived is a slice of types derived from tparams, which may be + // instantiated while reading the current element. + derived []derivedInfo + derivedTypes []types.Type // lazily instantiated from derived +} + +func (pr *pkgReader) newReader(k pkgbits.RelocKind, idx pkgbits.Index, marker pkgbits.SyncMarker) *reader { + return &reader{ + Decoder: pr.NewDecoder(k, idx, marker), + p: pr, + } +} + +// @@@ Positions + +func (r *reader) pos() token.Pos { + r.Sync(pkgbits.SyncPos) + if !r.Bool() { + return token.NoPos + } + + // TODO(mdempsky): Delta encoding. + posBase := r.posBase() + line := r.Uint() + col := r.Uint() + return r.p.fake.pos(posBase, int(line), int(col)) +} + +func (r *reader) posBase() string { + return r.p.posBaseIdx(r.Reloc(pkgbits.RelocPosBase)) +} + +func (pr *pkgReader) posBaseIdx(idx pkgbits.Index) string { + if b := pr.posBases[idx]; b != "" { + return b + } + + r := pr.newReader(pkgbits.RelocPosBase, idx, pkgbits.SyncPosBase) + + // Within types2, position bases have a lot more details (e.g., + // keeping track of where //line directives appeared exactly). + // + // For go/types, we just track the file name. + + filename := r.String() + + if r.Bool() { // file base + // Was: "b = token.NewTrimmedFileBase(filename, true)" + } else { // line base + pos := r.pos() + line := r.Uint() + col := r.Uint() + + // Was: "b = token.NewLineBase(pos, filename, true, line, col)" + _, _, _ = pos, line, col + } + + b := filename + pr.posBases[idx] = b + return b +} + +// @@@ Packages + +func (r *reader) pkg() *types.Package { + r.Sync(pkgbits.SyncPkg) + return r.p.pkgIdx(r.Reloc(pkgbits.RelocPkg)) +} + +func (pr *pkgReader) pkgIdx(idx pkgbits.Index) *types.Package { + // TODO(mdempsky): Consider using some non-nil pointer to indicate + // the universe scope, so we don't need to keep re-reading it. + if pkg := pr.pkgs[idx]; pkg != nil { + return pkg + } + + pkg := pr.newReader(pkgbits.RelocPkg, idx, pkgbits.SyncPkgDef).doPkg() + pr.pkgs[idx] = pkg + return pkg +} + +func (r *reader) doPkg() *types.Package { + path := r.String() + switch path { + case "": + path = r.p.PkgPath() + case "builtin": + return nil // universe + case "unsafe": + return types.Unsafe + } + + if pkg := r.p.imports[path]; pkg != nil { + return pkg + } + + name := r.String() + + pkg := types.NewPackage(path, name) + r.p.imports[path] = pkg + + imports := make([]*types.Package, r.Len()) + for i := range imports { + imports[i] = r.pkg() + } + pkg.SetImports(imports) + + return pkg +} + +// @@@ Types + +func (r *reader) typ() types.Type { + return r.p.typIdx(r.typInfo(), r.dict) +} + +func (r *reader) typInfo() typeInfo { + r.Sync(pkgbits.SyncType) + if r.Bool() { + return typeInfo{idx: pkgbits.Index(r.Len()), derived: true} + } + return typeInfo{idx: r.Reloc(pkgbits.RelocType), derived: false} +} + +func (pr *pkgReader) typIdx(info typeInfo, dict *readerDict) types.Type { + idx := info.idx + var where *types.Type + if info.derived { + where = &dict.derivedTypes[idx] + idx = dict.derived[idx].idx + } else { + where = &pr.typs[idx] + } + + if typ := *where; typ != nil { + return typ + } + + r := pr.newReader(pkgbits.RelocType, idx, pkgbits.SyncTypeIdx) + r.dict = dict + + typ := r.doTyp() + assert(typ != nil) + + // See comment in pkgReader.typIdx explaining how this happens. + if prev := *where; prev != nil { + return prev + } + + *where = typ + return typ +} + +func (r *reader) doTyp() (res types.Type) { + switch tag := pkgbits.CodeType(r.Code(pkgbits.SyncType)); tag { + default: + errorf("unhandled type tag: %v", tag) + panic("unreachable") + + case pkgbits.TypeBasic: + return types.Typ[r.Len()] + + case pkgbits.TypeNamed: + obj, targs := r.obj() + name := obj.(*types.TypeName) + if len(targs) != 0 { + t, _ := types.Instantiate(r.p.ctxt, name.Type(), targs, false) + return t + } + return name.Type() + + case pkgbits.TypeTypeParam: + return r.dict.tparams[r.Len()] + + case pkgbits.TypeArray: + len := int64(r.Uint64()) + return types.NewArray(r.typ(), len) + case pkgbits.TypeChan: + dir := types.ChanDir(r.Len()) + return types.NewChan(dir, r.typ()) + case pkgbits.TypeMap: + return types.NewMap(r.typ(), r.typ()) + case pkgbits.TypePointer: + return types.NewPointer(r.typ()) + case pkgbits.TypeSignature: + return r.signature(nil, nil, nil) + case pkgbits.TypeSlice: + return types.NewSlice(r.typ()) + case pkgbits.TypeStruct: + return r.structType() + case pkgbits.TypeInterface: + return r.interfaceType() + case pkgbits.TypeUnion: + return r.unionType() + } +} + +func (r *reader) structType() *types.Struct { + fields := make([]*types.Var, r.Len()) + var tags []string + for i := range fields { + pos := r.pos() + pkg, name := r.selector() + ftyp := r.typ() + tag := r.String() + embedded := r.Bool() + + fields[i] = types.NewField(pos, pkg, name, ftyp, embedded) + if tag != "" { + for len(tags) < i { + tags = append(tags, "") + } + tags = append(tags, tag) + } + } + return types.NewStruct(fields, tags) +} + +func (r *reader) unionType() *types.Union { + terms := make([]*types.Term, r.Len()) + for i := range terms { + terms[i] = types.NewTerm(r.Bool(), r.typ()) + } + return types.NewUnion(terms) +} + +func (r *reader) interfaceType() *types.Interface { + methods := make([]*types.Func, r.Len()) + embeddeds := make([]types.Type, r.Len()) + implicit := len(methods) == 0 && len(embeddeds) == 1 && r.Bool() + + for i := range methods { + pos := r.pos() + pkg, name := r.selector() + mtyp := r.signature(nil, nil, nil) + methods[i] = types.NewFunc(pos, pkg, name, mtyp) + } + + for i := range embeddeds { + embeddeds[i] = r.typ() + } + + iface := types.NewInterfaceType(methods, embeddeds) + if implicit { + iface.MarkImplicit() + } + return iface +} + +func (r *reader) signature(recv *types.Var, rtparams, tparams []*types.TypeParam) *types.Signature { + r.Sync(pkgbits.SyncSignature) + + params := r.params() + results := r.params() + variadic := r.Bool() + + return types.NewSignatureType(recv, rtparams, tparams, params, results, variadic) +} + +func (r *reader) params() *types.Tuple { + r.Sync(pkgbits.SyncParams) + + params := make([]*types.Var, r.Len()) + for i := range params { + params[i] = r.param() + } + + return types.NewTuple(params...) +} + +func (r *reader) param() *types.Var { + r.Sync(pkgbits.SyncParam) + + pos := r.pos() + pkg, name := r.localIdent() + typ := r.typ() + + return types.NewParam(pos, pkg, name, typ) +} + +// @@@ Objects + +func (r *reader) obj() (types.Object, []types.Type) { + r.Sync(pkgbits.SyncObject) + + assert(!r.Bool()) + + pkg, name := r.p.objIdx(r.Reloc(pkgbits.RelocObj)) + obj := pkgScope(pkg).Lookup(name) + + targs := make([]types.Type, r.Len()) + for i := range targs { + targs[i] = r.typ() + } + + return obj, targs +} + +func (pr *pkgReader) objIdx(idx pkgbits.Index) (*types.Package, string) { + rname := pr.newReader(pkgbits.RelocName, idx, pkgbits.SyncObject1) + + objPkg, objName := rname.qualifiedIdent() + assert(objName != "") + + tag := pkgbits.CodeObj(rname.Code(pkgbits.SyncCodeObj)) + + if tag == pkgbits.ObjStub { + assert(objPkg == nil || objPkg == types.Unsafe) + return objPkg, objName + } + + if objPkg.Scope().Lookup(objName) == nil { + dict := pr.objDictIdx(idx) + + r := pr.newReader(pkgbits.RelocObj, idx, pkgbits.SyncObject1) + r.dict = dict + + declare := func(obj types.Object) { + objPkg.Scope().Insert(obj) + } + + switch tag { + default: + panic("weird") + + case pkgbits.ObjAlias: + pos := r.pos() + typ := r.typ() + declare(types.NewTypeName(pos, objPkg, objName, typ)) + + case pkgbits.ObjConst: + pos := r.pos() + typ := r.typ() + val := r.Value() + declare(types.NewConst(pos, objPkg, objName, typ, val)) + + case pkgbits.ObjFunc: + pos := r.pos() + tparams := r.typeParamNames() + sig := r.signature(nil, nil, tparams) + declare(types.NewFunc(pos, objPkg, objName, sig)) + + case pkgbits.ObjType: + pos := r.pos() + + obj := types.NewTypeName(pos, objPkg, objName, nil) + named := types.NewNamed(obj, nil, nil) + declare(obj) + + named.SetTypeParams(r.typeParamNames()) + + // TODO(mdempsky): Rewrite receiver types to underlying is an + // Interface? The go/types importer does this (I think because + // unit tests expected that), but cmd/compile doesn't care + // about it, so maybe we can avoid worrying about that here. + rhs := r.typ() + r.p.later(func() { + underlying := rhs.Underlying() + named.SetUnderlying(underlying) + }) + + for i, n := 0, r.Len(); i < n; i++ { + named.AddMethod(r.method()) + } + + case pkgbits.ObjVar: + pos := r.pos() + typ := r.typ() + declare(types.NewVar(pos, objPkg, objName, typ)) + } + } + + return objPkg, objName +} + +func (pr *pkgReader) objDictIdx(idx pkgbits.Index) *readerDict { + r := pr.newReader(pkgbits.RelocObjDict, idx, pkgbits.SyncObject1) + + var dict readerDict + + if implicits := r.Len(); implicits != 0 { + errorf("unexpected object with %v implicit type parameter(s)", implicits) + } + + dict.bounds = make([]typeInfo, r.Len()) + for i := range dict.bounds { + dict.bounds[i] = r.typInfo() + } + + dict.derived = make([]derivedInfo, r.Len()) + dict.derivedTypes = make([]types.Type, len(dict.derived)) + for i := range dict.derived { + dict.derived[i] = derivedInfo{r.Reloc(pkgbits.RelocType), r.Bool()} + } + + // function references follow, but reader doesn't need those + + return &dict +} + +func (r *reader) typeParamNames() []*types.TypeParam { + r.Sync(pkgbits.SyncTypeParamNames) + + // Note: This code assumes it only processes objects without + // implement type parameters. This is currently fine, because + // reader is only used to read in exported declarations, which are + // always package scoped. + + if len(r.dict.bounds) == 0 { + return nil + } + + // Careful: Type parameter lists may have cycles. To allow for this, + // we construct the type parameter list in two passes: first we + // create all the TypeNames and TypeParams, then we construct and + // set the bound type. + + r.dict.tparams = make([]*types.TypeParam, len(r.dict.bounds)) + for i := range r.dict.bounds { + pos := r.pos() + pkg, name := r.localIdent() + + tname := types.NewTypeName(pos, pkg, name, nil) + r.dict.tparams[i] = types.NewTypeParam(tname, nil) + } + + typs := make([]types.Type, len(r.dict.bounds)) + for i, bound := range r.dict.bounds { + typs[i] = r.p.typIdx(bound, r.dict) + } + + // TODO(mdempsky): This is subtle, elaborate further. + // + // We have to save tparams outside of the closure, because + // typeParamNames() can be called multiple times with the same + // dictionary instance. + // + // Also, this needs to happen later to make sure SetUnderlying has + // been called. + // + // TODO(mdempsky): Is it safe to have a single "later" slice or do + // we need to have multiple passes? See comments on CL 386002 and + // go.dev/issue/52104. + tparams := r.dict.tparams + r.p.later(func() { + for i, typ := range typs { + tparams[i].SetConstraint(typ) + } + }) + + return r.dict.tparams +} + +func (r *reader) method() *types.Func { + r.Sync(pkgbits.SyncMethod) + pos := r.pos() + pkg, name := r.selector() + + rparams := r.typeParamNames() + sig := r.signature(r.param(), rparams, nil) + + _ = r.pos() // TODO(mdempsky): Remove; this is a hacker for linker.go. + return types.NewFunc(pos, pkg, name, sig) +} + +func (r *reader) qualifiedIdent() (*types.Package, string) { return r.ident(pkgbits.SyncSym) } +func (r *reader) localIdent() (*types.Package, string) { return r.ident(pkgbits.SyncLocalIdent) } +func (r *reader) selector() (*types.Package, string) { return r.ident(pkgbits.SyncSelector) } + +func (r *reader) ident(marker pkgbits.SyncMarker) (*types.Package, string) { + r.Sync(marker) + return r.pkg(), r.String() +} + +// pkgScope returns pkg.Scope(). +// If pkg is nil, it returns types.Universe instead. +// +// TODO(mdempsky): Remove after x/tools can depend on Go 1.19. +func pkgScope(pkg *types.Package) *types.Scope { + if pkg != nil { + return pkg.Scope() + } + return types.Universe +} diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/codes.go b/vendor/golang.org/x/tools/go/internal/pkgbits/codes.go new file mode 100644 index 000000000..f0cabde96 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/codes.go @@ -0,0 +1,77 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkgbits + +// A Code is an enum value that can be encoded into bitstreams. +// +// Code types are preferable for enum types, because they allow +// Decoder to detect desyncs. +type Code interface { + // Marker returns the SyncMarker for the Code's dynamic type. + Marker() SyncMarker + + // Value returns the Code's ordinal value. + Value() int +} + +// A CodeVal distinguishes among go/constant.Value encodings. +type CodeVal int + +func (c CodeVal) Marker() SyncMarker { return SyncVal } +func (c CodeVal) Value() int { return int(c) } + +// Note: These values are public and cannot be changed without +// updating the go/types importers. + +const ( + ValBool CodeVal = iota + ValString + ValInt64 + ValBigInt + ValBigRat + ValBigFloat +) + +// A CodeType distinguishes among go/types.Type encodings. +type CodeType int + +func (c CodeType) Marker() SyncMarker { return SyncType } +func (c CodeType) Value() int { return int(c) } + +// Note: These values are public and cannot be changed without +// updating the go/types importers. + +const ( + TypeBasic CodeType = iota + TypeNamed + TypePointer + TypeSlice + TypeArray + TypeChan + TypeMap + TypeSignature + TypeStruct + TypeInterface + TypeUnion + TypeTypeParam +) + +// A CodeObj distinguishes among go/types.Object encodings. +type CodeObj int + +func (c CodeObj) Marker() SyncMarker { return SyncCodeObj } +func (c CodeObj) Value() int { return int(c) } + +// Note: These values are public and cannot be changed without +// updating the go/types importers. + +const ( + ObjAlias CodeObj = iota + ObjConst + ObjType + ObjFunc + ObjVar + ObjStub +) diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/decoder.go b/vendor/golang.org/x/tools/go/internal/pkgbits/decoder.go new file mode 100644 index 000000000..2bc793668 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/decoder.go @@ -0,0 +1,433 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkgbits + +import ( + "encoding/binary" + "fmt" + "go/constant" + "go/token" + "math/big" + "os" + "runtime" + "strings" +) + +// A PkgDecoder provides methods for decoding a package's Unified IR +// export data. +type PkgDecoder struct { + // version is the file format version. + version uint32 + + // sync indicates whether the file uses sync markers. + sync bool + + // pkgPath is the package path for the package to be decoded. + // + // TODO(mdempsky): Remove; unneeded since CL 391014. + pkgPath string + + // elemData is the full data payload of the encoded package. + // Elements are densely and contiguously packed together. + // + // The last 8 bytes of elemData are the package fingerprint. + elemData string + + // elemEnds stores the byte-offset end positions of element + // bitstreams within elemData. + // + // For example, element I's bitstream data starts at elemEnds[I-1] + // (or 0, if I==0) and ends at elemEnds[I]. + // + // Note: elemEnds is indexed by absolute indices, not + // section-relative indices. + elemEnds []uint32 + + // elemEndsEnds stores the index-offset end positions of relocation + // sections within elemEnds. + // + // For example, section K's end positions start at elemEndsEnds[K-1] + // (or 0, if K==0) and end at elemEndsEnds[K]. + elemEndsEnds [numRelocs]uint32 +} + +// PkgPath returns the package path for the package +// +// TODO(mdempsky): Remove; unneeded since CL 391014. +func (pr *PkgDecoder) PkgPath() string { return pr.pkgPath } + +// SyncMarkers reports whether pr uses sync markers. +func (pr *PkgDecoder) SyncMarkers() bool { return pr.sync } + +// NewPkgDecoder returns a PkgDecoder initialized to read the Unified +// IR export data from input. pkgPath is the package path for the +// compilation unit that produced the export data. +// +// TODO(mdempsky): Remove pkgPath parameter; unneeded since CL 391014. +func NewPkgDecoder(pkgPath, input string) PkgDecoder { + pr := PkgDecoder{ + pkgPath: pkgPath, + } + + // TODO(mdempsky): Implement direct indexing of input string to + // avoid copying the position information. + + r := strings.NewReader(input) + + assert(binary.Read(r, binary.LittleEndian, &pr.version) == nil) + + switch pr.version { + default: + panic(fmt.Errorf("unsupported version: %v", pr.version)) + case 0: + // no flags + case 1: + var flags uint32 + assert(binary.Read(r, binary.LittleEndian, &flags) == nil) + pr.sync = flags&flagSyncMarkers != 0 + } + + assert(binary.Read(r, binary.LittleEndian, pr.elemEndsEnds[:]) == nil) + + pr.elemEnds = make([]uint32, pr.elemEndsEnds[len(pr.elemEndsEnds)-1]) + assert(binary.Read(r, binary.LittleEndian, pr.elemEnds[:]) == nil) + + pos, err := r.Seek(0, os.SEEK_CUR) + assert(err == nil) + + pr.elemData = input[pos:] + assert(len(pr.elemData)-8 == int(pr.elemEnds[len(pr.elemEnds)-1])) + + return pr +} + +// NumElems returns the number of elements in section k. +func (pr *PkgDecoder) NumElems(k RelocKind) int { + count := int(pr.elemEndsEnds[k]) + if k > 0 { + count -= int(pr.elemEndsEnds[k-1]) + } + return count +} + +// TotalElems returns the total number of elements across all sections. +func (pr *PkgDecoder) TotalElems() int { + return len(pr.elemEnds) +} + +// Fingerprint returns the package fingerprint. +func (pr *PkgDecoder) Fingerprint() [8]byte { + var fp [8]byte + copy(fp[:], pr.elemData[len(pr.elemData)-8:]) + return fp +} + +// AbsIdx returns the absolute index for the given (section, index) +// pair. +func (pr *PkgDecoder) AbsIdx(k RelocKind, idx Index) int { + absIdx := int(idx) + if k > 0 { + absIdx += int(pr.elemEndsEnds[k-1]) + } + if absIdx >= int(pr.elemEndsEnds[k]) { + errorf("%v:%v is out of bounds; %v", k, idx, pr.elemEndsEnds) + } + return absIdx +} + +// DataIdx returns the raw element bitstream for the given (section, +// index) pair. +func (pr *PkgDecoder) DataIdx(k RelocKind, idx Index) string { + absIdx := pr.AbsIdx(k, idx) + + var start uint32 + if absIdx > 0 { + start = pr.elemEnds[absIdx-1] + } + end := pr.elemEnds[absIdx] + + return pr.elemData[start:end] +} + +// StringIdx returns the string value for the given string index. +func (pr *PkgDecoder) StringIdx(idx Index) string { + return pr.DataIdx(RelocString, idx) +} + +// NewDecoder returns a Decoder for the given (section, index) pair, +// and decodes the given SyncMarker from the element bitstream. +func (pr *PkgDecoder) NewDecoder(k RelocKind, idx Index, marker SyncMarker) Decoder { + r := pr.NewDecoderRaw(k, idx) + r.Sync(marker) + return r +} + +// NewDecoderRaw returns a Decoder for the given (section, index) pair. +// +// Most callers should use NewDecoder instead. +func (pr *PkgDecoder) NewDecoderRaw(k RelocKind, idx Index) Decoder { + r := Decoder{ + common: pr, + k: k, + Idx: idx, + } + + // TODO(mdempsky) r.data.Reset(...) after #44505 is resolved. + r.Data = *strings.NewReader(pr.DataIdx(k, idx)) + + r.Sync(SyncRelocs) + r.Relocs = make([]RelocEnt, r.Len()) + for i := range r.Relocs { + r.Sync(SyncReloc) + r.Relocs[i] = RelocEnt{RelocKind(r.Len()), Index(r.Len())} + } + + return r +} + +// A Decoder provides methods for decoding an individual element's +// bitstream data. +type Decoder struct { + common *PkgDecoder + + Relocs []RelocEnt + Data strings.Reader + + k RelocKind + Idx Index +} + +func (r *Decoder) checkErr(err error) { + if err != nil { + errorf("unexpected decoding error: %w", err) + } +} + +func (r *Decoder) rawUvarint() uint64 { + x, err := binary.ReadUvarint(&r.Data) + r.checkErr(err) + return x +} + +func (r *Decoder) rawVarint() int64 { + ux := r.rawUvarint() + + // Zig-zag decode. + x := int64(ux >> 1) + if ux&1 != 0 { + x = ^x + } + return x +} + +func (r *Decoder) rawReloc(k RelocKind, idx int) Index { + e := r.Relocs[idx] + assert(e.Kind == k) + return e.Idx +} + +// Sync decodes a sync marker from the element bitstream and asserts +// that it matches the expected marker. +// +// If r.common.sync is false, then Sync is a no-op. +func (r *Decoder) Sync(mWant SyncMarker) { + if !r.common.sync { + return + } + + pos, _ := r.Data.Seek(0, os.SEEK_CUR) // TODO(mdempsky): io.SeekCurrent after #44505 is resolved + mHave := SyncMarker(r.rawUvarint()) + writerPCs := make([]int, r.rawUvarint()) + for i := range writerPCs { + writerPCs[i] = int(r.rawUvarint()) + } + + if mHave == mWant { + return + } + + // There's some tension here between printing: + // + // (1) full file paths that tools can recognize (e.g., so emacs + // hyperlinks the "file:line" text for easy navigation), or + // + // (2) short file paths that are easier for humans to read (e.g., by + // omitting redundant or irrelevant details, so it's easier to + // focus on the useful bits that remain). + // + // The current formatting favors the former, as it seems more + // helpful in practice. But perhaps the formatting could be improved + // to better address both concerns. For example, use relative file + // paths if they would be shorter, or rewrite file paths to contain + // "$GOROOT" (like objabi.AbsFile does) if tools can be taught how + // to reliably expand that again. + + fmt.Printf("export data desync: package %q, section %v, index %v, offset %v\n", r.common.pkgPath, r.k, r.Idx, pos) + + fmt.Printf("\nfound %v, written at:\n", mHave) + if len(writerPCs) == 0 { + fmt.Printf("\t[stack trace unavailable; recompile package %q with -d=syncframes]\n", r.common.pkgPath) + } + for _, pc := range writerPCs { + fmt.Printf("\t%s\n", r.common.StringIdx(r.rawReloc(RelocString, pc))) + } + + fmt.Printf("\nexpected %v, reading at:\n", mWant) + var readerPCs [32]uintptr // TODO(mdempsky): Dynamically size? + n := runtime.Callers(2, readerPCs[:]) + for _, pc := range fmtFrames(readerPCs[:n]...) { + fmt.Printf("\t%s\n", pc) + } + + // We already printed a stack trace for the reader, so now we can + // simply exit. Printing a second one with panic or base.Fatalf + // would just be noise. + os.Exit(1) +} + +// Bool decodes and returns a bool value from the element bitstream. +func (r *Decoder) Bool() bool { + r.Sync(SyncBool) + x, err := r.Data.ReadByte() + r.checkErr(err) + assert(x < 2) + return x != 0 +} + +// Int64 decodes and returns an int64 value from the element bitstream. +func (r *Decoder) Int64() int64 { + r.Sync(SyncInt64) + return r.rawVarint() +} + +// Int64 decodes and returns a uint64 value from the element bitstream. +func (r *Decoder) Uint64() uint64 { + r.Sync(SyncUint64) + return r.rawUvarint() +} + +// Len decodes and returns a non-negative int value from the element bitstream. +func (r *Decoder) Len() int { x := r.Uint64(); v := int(x); assert(uint64(v) == x); return v } + +// Int decodes and returns an int value from the element bitstream. +func (r *Decoder) Int() int { x := r.Int64(); v := int(x); assert(int64(v) == x); return v } + +// Uint decodes and returns a uint value from the element bitstream. +func (r *Decoder) Uint() uint { x := r.Uint64(); v := uint(x); assert(uint64(v) == x); return v } + +// Code decodes a Code value from the element bitstream and returns +// its ordinal value. It's the caller's responsibility to convert the +// result to an appropriate Code type. +// +// TODO(mdempsky): Ideally this method would have signature "Code[T +// Code] T" instead, but we don't allow generic methods and the +// compiler can't depend on generics yet anyway. +func (r *Decoder) Code(mark SyncMarker) int { + r.Sync(mark) + return r.Len() +} + +// Reloc decodes a relocation of expected section k from the element +// bitstream and returns an index to the referenced element. +func (r *Decoder) Reloc(k RelocKind) Index { + r.Sync(SyncUseReloc) + return r.rawReloc(k, r.Len()) +} + +// String decodes and returns a string value from the element +// bitstream. +func (r *Decoder) String() string { + r.Sync(SyncString) + return r.common.StringIdx(r.Reloc(RelocString)) +} + +// Strings decodes and returns a variable-length slice of strings from +// the element bitstream. +func (r *Decoder) Strings() []string { + res := make([]string, r.Len()) + for i := range res { + res[i] = r.String() + } + return res +} + +// Value decodes and returns a constant.Value from the element +// bitstream. +func (r *Decoder) Value() constant.Value { + r.Sync(SyncValue) + isComplex := r.Bool() + val := r.scalar() + if isComplex { + val = constant.BinaryOp(val, token.ADD, constant.MakeImag(r.scalar())) + } + return val +} + +func (r *Decoder) scalar() constant.Value { + switch tag := CodeVal(r.Code(SyncVal)); tag { + default: + panic(fmt.Errorf("unexpected scalar tag: %v", tag)) + + case ValBool: + return constant.MakeBool(r.Bool()) + case ValString: + return constant.MakeString(r.String()) + case ValInt64: + return constant.MakeInt64(r.Int64()) + case ValBigInt: + return constant.Make(r.bigInt()) + case ValBigRat: + num := r.bigInt() + denom := r.bigInt() + return constant.Make(new(big.Rat).SetFrac(num, denom)) + case ValBigFloat: + return constant.Make(r.bigFloat()) + } +} + +func (r *Decoder) bigInt() *big.Int { + v := new(big.Int).SetBytes([]byte(r.String())) + if r.Bool() { + v.Neg(v) + } + return v +} + +func (r *Decoder) bigFloat() *big.Float { + v := new(big.Float).SetPrec(512) + assert(v.UnmarshalText([]byte(r.String())) == nil) + return v +} + +// @@@ Helpers + +// TODO(mdempsky): These should probably be removed. I think they're a +// smell that the export data format is not yet quite right. + +// PeekPkgPath returns the package path for the specified package +// index. +func (pr *PkgDecoder) PeekPkgPath(idx Index) string { + r := pr.NewDecoder(RelocPkg, idx, SyncPkgDef) + path := r.String() + if path == "" { + path = pr.pkgPath + } + return path +} + +// PeekObj returns the package path, object name, and CodeObj for the +// specified object index. +func (pr *PkgDecoder) PeekObj(idx Index) (string, string, CodeObj) { + r := pr.NewDecoder(RelocName, idx, SyncObject1) + r.Sync(SyncSym) + r.Sync(SyncPkg) + path := pr.PeekPkgPath(r.Reloc(RelocPkg)) + name := r.String() + assert(name != "") + + tag := CodeObj(r.Code(SyncCodeObj)) + + return path, name, tag +} diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/doc.go b/vendor/golang.org/x/tools/go/internal/pkgbits/doc.go new file mode 100644 index 000000000..c8a2796b5 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/doc.go @@ -0,0 +1,32 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package pkgbits implements low-level coding abstractions for +// Unified IR's export data format. +// +// At a low-level, a package is a collection of bitstream elements. +// Each element has a "kind" and a dense, non-negative index. +// Elements can be randomly accessed given their kind and index. +// +// Individual elements are sequences of variable-length values (e.g., +// integers, booleans, strings, go/constant values, cross-references +// to other elements). Package pkgbits provides APIs for encoding and +// decoding these low-level values, but the details of mapping +// higher-level Go constructs into elements is left to higher-level +// abstractions. +// +// Elements may cross-reference each other with "relocations." For +// example, an element representing a pointer type has a relocation +// referring to the element type. +// +// Go constructs may be composed as a constellation of multiple +// elements. For example, a declared function may have one element to +// describe the object (e.g., its name, type, position), and a +// separate element to describe its function body. This allows readers +// some flexibility in efficiently seeking or re-reading data (e.g., +// inlining requires re-reading the function body for each inlined +// call, without needing to re-read the object-level details). +// +// This is a copy of internal/pkgbits in the Go implementation. +package pkgbits diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/encoder.go b/vendor/golang.org/x/tools/go/internal/pkgbits/encoder.go new file mode 100644 index 000000000..c50c838ca --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/encoder.go @@ -0,0 +1,379 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkgbits + +import ( + "bytes" + "crypto/md5" + "encoding/binary" + "go/constant" + "io" + "math/big" + "runtime" +) + +// currentVersion is the current version number. +// +// - v0: initial prototype +// +// - v1: adds the flags uint32 word +const currentVersion uint32 = 1 + +// A PkgEncoder provides methods for encoding a package's Unified IR +// export data. +type PkgEncoder struct { + // elems holds the bitstream for previously encoded elements. + elems [numRelocs][]string + + // stringsIdx maps previously encoded strings to their index within + // the RelocString section, to allow deduplication. That is, + // elems[RelocString][stringsIdx[s]] == s (if present). + stringsIdx map[string]Index + + // syncFrames is the number of frames to write at each sync + // marker. A negative value means sync markers are omitted. + syncFrames int +} + +// SyncMarkers reports whether pw uses sync markers. +func (pw *PkgEncoder) SyncMarkers() bool { return pw.syncFrames >= 0 } + +// NewPkgEncoder returns an initialized PkgEncoder. +// +// syncFrames is the number of caller frames that should be serialized +// at Sync points. Serializing additional frames results in larger +// export data files, but can help diagnosing desync errors in +// higher-level Unified IR reader/writer code. If syncFrames is +// negative, then sync markers are omitted entirely. +func NewPkgEncoder(syncFrames int) PkgEncoder { + return PkgEncoder{ + stringsIdx: make(map[string]Index), + syncFrames: syncFrames, + } +} + +// DumpTo writes the package's encoded data to out0 and returns the +// package fingerprint. +func (pw *PkgEncoder) DumpTo(out0 io.Writer) (fingerprint [8]byte) { + h := md5.New() + out := io.MultiWriter(out0, h) + + writeUint32 := func(x uint32) { + assert(binary.Write(out, binary.LittleEndian, x) == nil) + } + + writeUint32(currentVersion) + + var flags uint32 + if pw.SyncMarkers() { + flags |= flagSyncMarkers + } + writeUint32(flags) + + // Write elemEndsEnds. + var sum uint32 + for _, elems := range &pw.elems { + sum += uint32(len(elems)) + writeUint32(sum) + } + + // Write elemEnds. + sum = 0 + for _, elems := range &pw.elems { + for _, elem := range elems { + sum += uint32(len(elem)) + writeUint32(sum) + } + } + + // Write elemData. + for _, elems := range &pw.elems { + for _, elem := range elems { + _, err := io.WriteString(out, elem) + assert(err == nil) + } + } + + // Write fingerprint. + copy(fingerprint[:], h.Sum(nil)) + _, err := out0.Write(fingerprint[:]) + assert(err == nil) + + return +} + +// StringIdx adds a string value to the strings section, if not +// already present, and returns its index. +func (pw *PkgEncoder) StringIdx(s string) Index { + if idx, ok := pw.stringsIdx[s]; ok { + assert(pw.elems[RelocString][idx] == s) + return idx + } + + idx := Index(len(pw.elems[RelocString])) + pw.elems[RelocString] = append(pw.elems[RelocString], s) + pw.stringsIdx[s] = idx + return idx +} + +// NewEncoder returns an Encoder for a new element within the given +// section, and encodes the given SyncMarker as the start of the +// element bitstream. +func (pw *PkgEncoder) NewEncoder(k RelocKind, marker SyncMarker) Encoder { + e := pw.NewEncoderRaw(k) + e.Sync(marker) + return e +} + +// NewEncoderRaw returns an Encoder for a new element within the given +// section. +// +// Most callers should use NewEncoder instead. +func (pw *PkgEncoder) NewEncoderRaw(k RelocKind) Encoder { + idx := Index(len(pw.elems[k])) + pw.elems[k] = append(pw.elems[k], "") // placeholder + + return Encoder{ + p: pw, + k: k, + Idx: idx, + } +} + +// An Encoder provides methods for encoding an individual element's +// bitstream data. +type Encoder struct { + p *PkgEncoder + + Relocs []RelocEnt + Data bytes.Buffer // accumulated element bitstream data + + encodingRelocHeader bool + + k RelocKind + Idx Index // index within relocation section +} + +// Flush finalizes the element's bitstream and returns its Index. +func (w *Encoder) Flush() Index { + var sb bytes.Buffer // TODO(mdempsky): strings.Builder after #44505 is resolved + + // Backup the data so we write the relocations at the front. + var tmp bytes.Buffer + io.Copy(&tmp, &w.Data) + + // TODO(mdempsky): Consider writing these out separately so they're + // easier to strip, along with function bodies, so that we can prune + // down to just the data that's relevant to go/types. + if w.encodingRelocHeader { + panic("encodingRelocHeader already true; recursive flush?") + } + w.encodingRelocHeader = true + w.Sync(SyncRelocs) + w.Len(len(w.Relocs)) + for _, rEnt := range w.Relocs { + w.Sync(SyncReloc) + w.Len(int(rEnt.Kind)) + w.Len(int(rEnt.Idx)) + } + + io.Copy(&sb, &w.Data) + io.Copy(&sb, &tmp) + w.p.elems[w.k][w.Idx] = sb.String() + + return w.Idx +} + +func (w *Encoder) checkErr(err error) { + if err != nil { + errorf("unexpected encoding error: %v", err) + } +} + +func (w *Encoder) rawUvarint(x uint64) { + var buf [binary.MaxVarintLen64]byte + n := binary.PutUvarint(buf[:], x) + _, err := w.Data.Write(buf[:n]) + w.checkErr(err) +} + +func (w *Encoder) rawVarint(x int64) { + // Zig-zag encode. + ux := uint64(x) << 1 + if x < 0 { + ux = ^ux + } + + w.rawUvarint(ux) +} + +func (w *Encoder) rawReloc(r RelocKind, idx Index) int { + // TODO(mdempsky): Use map for lookup; this takes quadratic time. + for i, rEnt := range w.Relocs { + if rEnt.Kind == r && rEnt.Idx == idx { + return i + } + } + + i := len(w.Relocs) + w.Relocs = append(w.Relocs, RelocEnt{r, idx}) + return i +} + +func (w *Encoder) Sync(m SyncMarker) { + if !w.p.SyncMarkers() { + return + } + + // Writing out stack frame string references requires working + // relocations, but writing out the relocations themselves involves + // sync markers. To prevent infinite recursion, we simply trim the + // stack frame for sync markers within the relocation header. + var frames []string + if !w.encodingRelocHeader && w.p.syncFrames > 0 { + pcs := make([]uintptr, w.p.syncFrames) + n := runtime.Callers(2, pcs) + frames = fmtFrames(pcs[:n]...) + } + + // TODO(mdempsky): Save space by writing out stack frames as a + // linked list so we can share common stack frames. + w.rawUvarint(uint64(m)) + w.rawUvarint(uint64(len(frames))) + for _, frame := range frames { + w.rawUvarint(uint64(w.rawReloc(RelocString, w.p.StringIdx(frame)))) + } +} + +// Bool encodes and writes a bool value into the element bitstream, +// and then returns the bool value. +// +// For simple, 2-alternative encodings, the idiomatic way to call Bool +// is something like: +// +// if w.Bool(x != 0) { +// // alternative #1 +// } else { +// // alternative #2 +// } +// +// For multi-alternative encodings, use Code instead. +func (w *Encoder) Bool(b bool) bool { + w.Sync(SyncBool) + var x byte + if b { + x = 1 + } + err := w.Data.WriteByte(x) + w.checkErr(err) + return b +} + +// Int64 encodes and writes an int64 value into the element bitstream. +func (w *Encoder) Int64(x int64) { + w.Sync(SyncInt64) + w.rawVarint(x) +} + +// Uint64 encodes and writes a uint64 value into the element bitstream. +func (w *Encoder) Uint64(x uint64) { + w.Sync(SyncUint64) + w.rawUvarint(x) +} + +// Len encodes and writes a non-negative int value into the element bitstream. +func (w *Encoder) Len(x int) { assert(x >= 0); w.Uint64(uint64(x)) } + +// Int encodes and writes an int value into the element bitstream. +func (w *Encoder) Int(x int) { w.Int64(int64(x)) } + +// Len encodes and writes a uint value into the element bitstream. +func (w *Encoder) Uint(x uint) { w.Uint64(uint64(x)) } + +// Reloc encodes and writes a relocation for the given (section, +// index) pair into the element bitstream. +// +// Note: Only the index is formally written into the element +// bitstream, so bitstream decoders must know from context which +// section an encoded relocation refers to. +func (w *Encoder) Reloc(r RelocKind, idx Index) { + w.Sync(SyncUseReloc) + w.Len(w.rawReloc(r, idx)) +} + +// Code encodes and writes a Code value into the element bitstream. +func (w *Encoder) Code(c Code) { + w.Sync(c.Marker()) + w.Len(c.Value()) +} + +// String encodes and writes a string value into the element +// bitstream. +// +// Internally, strings are deduplicated by adding them to the strings +// section (if not already present), and then writing a relocation +// into the element bitstream. +func (w *Encoder) String(s string) { + w.Sync(SyncString) + w.Reloc(RelocString, w.p.StringIdx(s)) +} + +// Strings encodes and writes a variable-length slice of strings into +// the element bitstream. +func (w *Encoder) Strings(ss []string) { + w.Len(len(ss)) + for _, s := range ss { + w.String(s) + } +} + +// Value encodes and writes a constant.Value into the element +// bitstream. +func (w *Encoder) Value(val constant.Value) { + w.Sync(SyncValue) + if w.Bool(val.Kind() == constant.Complex) { + w.scalar(constant.Real(val)) + w.scalar(constant.Imag(val)) + } else { + w.scalar(val) + } +} + +func (w *Encoder) scalar(val constant.Value) { + switch v := constant.Val(val).(type) { + default: + errorf("unhandled %v (%v)", val, val.Kind()) + case bool: + w.Code(ValBool) + w.Bool(v) + case string: + w.Code(ValString) + w.String(v) + case int64: + w.Code(ValInt64) + w.Int64(v) + case *big.Int: + w.Code(ValBigInt) + w.bigInt(v) + case *big.Rat: + w.Code(ValBigRat) + w.bigInt(v.Num()) + w.bigInt(v.Denom()) + case *big.Float: + w.Code(ValBigFloat) + w.bigFloat(v) + } +} + +func (w *Encoder) bigInt(v *big.Int) { + b := v.Bytes() + w.String(string(b)) // TODO: More efficient encoding. + w.Bool(v.Sign() < 0) +} + +func (w *Encoder) bigFloat(v *big.Float) { + b := v.Append(nil, 'p', -1) + w.String(string(b)) // TODO: More efficient encoding. +} diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/flags.go b/vendor/golang.org/x/tools/go/internal/pkgbits/flags.go new file mode 100644 index 000000000..654222745 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/flags.go @@ -0,0 +1,9 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkgbits + +const ( + flagSyncMarkers = 1 << iota // file format contains sync markers +) diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/frames_go1.go b/vendor/golang.org/x/tools/go/internal/pkgbits/frames_go1.go new file mode 100644 index 000000000..5294f6a63 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/frames_go1.go @@ -0,0 +1,21 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.7 +// +build !go1.7 + +// TODO(mdempsky): Remove after #44505 is resolved + +package pkgbits + +import "runtime" + +func walkFrames(pcs []uintptr, visit frameVisitor) { + for _, pc := range pcs { + fn := runtime.FuncForPC(pc) + file, line := fn.FileLine(pc) + + visit(file, line, fn.Name(), pc-fn.Entry()) + } +} diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/frames_go17.go b/vendor/golang.org/x/tools/go/internal/pkgbits/frames_go17.go new file mode 100644 index 000000000..2324ae7ad --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/frames_go17.go @@ -0,0 +1,28 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.7 +// +build go1.7 + +package pkgbits + +import "runtime" + +// walkFrames calls visit for each call frame represented by pcs. +// +// pcs should be a slice of PCs, as returned by runtime.Callers. +func walkFrames(pcs []uintptr, visit frameVisitor) { + if len(pcs) == 0 { + return + } + + frames := runtime.CallersFrames(pcs) + for { + frame, more := frames.Next() + visit(frame.File, frame.Line, frame.Function, frame.PC-frame.Entry) + if !more { + return + } + } +} diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/reloc.go b/vendor/golang.org/x/tools/go/internal/pkgbits/reloc.go new file mode 100644 index 000000000..7a8f04ab3 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/reloc.go @@ -0,0 +1,42 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkgbits + +// A RelocKind indicates a particular section within a unified IR export. +type RelocKind int + +// An Index represents a bitstream element index within a particular +// section. +type Index int + +// A relocEnt (relocation entry) is an entry in an element's local +// reference table. +// +// TODO(mdempsky): Rename this too. +type RelocEnt struct { + Kind RelocKind + Idx Index +} + +// Reserved indices within the meta relocation section. +const ( + PublicRootIdx Index = 0 + PrivateRootIdx Index = 1 +) + +const ( + RelocString RelocKind = iota + RelocMeta + RelocPosBase + RelocPkg + RelocName + RelocType + RelocObj + RelocObjExt + RelocObjDict + RelocBody + + numRelocs = iota +) diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/support.go b/vendor/golang.org/x/tools/go/internal/pkgbits/support.go new file mode 100644 index 000000000..ad26d3b28 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/support.go @@ -0,0 +1,17 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkgbits + +import "fmt" + +func assert(b bool) { + if !b { + panic("assertion failed") + } +} + +func errorf(format string, args ...interface{}) { + panic(fmt.Errorf(format, args...)) +} diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/sync.go b/vendor/golang.org/x/tools/go/internal/pkgbits/sync.go new file mode 100644 index 000000000..5bd51ef71 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/sync.go @@ -0,0 +1,113 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkgbits + +import ( + "fmt" + "strings" +) + +// fmtFrames formats a backtrace for reporting reader/writer desyncs. +func fmtFrames(pcs ...uintptr) []string { + res := make([]string, 0, len(pcs)) + walkFrames(pcs, func(file string, line int, name string, offset uintptr) { + // Trim package from function name. It's just redundant noise. + name = strings.TrimPrefix(name, "cmd/compile/internal/noder.") + + res = append(res, fmt.Sprintf("%s:%v: %s +0x%v", file, line, name, offset)) + }) + return res +} + +type frameVisitor func(file string, line int, name string, offset uintptr) + +// SyncMarker is an enum type that represents markers that may be +// written to export data to ensure the reader and writer stay +// synchronized. +type SyncMarker int + +//go:generate stringer -type=SyncMarker -trimprefix=Sync + +const ( + _ SyncMarker = iota + + // Public markers (known to go/types importers). + + // Low-level coding markers. + SyncEOF + SyncBool + SyncInt64 + SyncUint64 + SyncString + SyncValue + SyncVal + SyncRelocs + SyncReloc + SyncUseReloc + + // Higher-level object and type markers. + SyncPublic + SyncPos + SyncPosBase + SyncObject + SyncObject1 + SyncPkg + SyncPkgDef + SyncMethod + SyncType + SyncTypeIdx + SyncTypeParamNames + SyncSignature + SyncParams + SyncParam + SyncCodeObj + SyncSym + SyncLocalIdent + SyncSelector + + // Private markers (only known to cmd/compile). + SyncPrivate + + SyncFuncExt + SyncVarExt + SyncTypeExt + SyncPragma + + SyncExprList + SyncExprs + SyncExpr + SyncExprType + SyncAssign + SyncOp + SyncFuncLit + SyncCompLit + + SyncDecl + SyncFuncBody + SyncOpenScope + SyncCloseScope + SyncCloseAnotherScope + SyncDeclNames + SyncDeclName + + SyncStmts + SyncBlockStmt + SyncIfStmt + SyncForStmt + SyncSwitchStmt + SyncRangeStmt + SyncCaseClause + SyncCommClause + SyncSelectStmt + SyncDecls + SyncLabeledStmt + SyncUseObjLocal + SyncAddLocal + SyncLinkname + SyncStmt1 + SyncStmtsEnd + SyncLabel + SyncOptLabel +) diff --git a/vendor/golang.org/x/tools/go/internal/pkgbits/syncmarker_string.go b/vendor/golang.org/x/tools/go/internal/pkgbits/syncmarker_string.go new file mode 100644 index 000000000..4a5b0ca5f --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/pkgbits/syncmarker_string.go @@ -0,0 +1,89 @@ +// Code generated by "stringer -type=SyncMarker -trimprefix=Sync"; DO NOT EDIT. + +package pkgbits + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[SyncEOF-1] + _ = x[SyncBool-2] + _ = x[SyncInt64-3] + _ = x[SyncUint64-4] + _ = x[SyncString-5] + _ = x[SyncValue-6] + _ = x[SyncVal-7] + _ = x[SyncRelocs-8] + _ = x[SyncReloc-9] + _ = x[SyncUseReloc-10] + _ = x[SyncPublic-11] + _ = x[SyncPos-12] + _ = x[SyncPosBase-13] + _ = x[SyncObject-14] + _ = x[SyncObject1-15] + _ = x[SyncPkg-16] + _ = x[SyncPkgDef-17] + _ = x[SyncMethod-18] + _ = x[SyncType-19] + _ = x[SyncTypeIdx-20] + _ = x[SyncTypeParamNames-21] + _ = x[SyncSignature-22] + _ = x[SyncParams-23] + _ = x[SyncParam-24] + _ = x[SyncCodeObj-25] + _ = x[SyncSym-26] + _ = x[SyncLocalIdent-27] + _ = x[SyncSelector-28] + _ = x[SyncPrivate-29] + _ = x[SyncFuncExt-30] + _ = x[SyncVarExt-31] + _ = x[SyncTypeExt-32] + _ = x[SyncPragma-33] + _ = x[SyncExprList-34] + _ = x[SyncExprs-35] + _ = x[SyncExpr-36] + _ = x[SyncExprType-37] + _ = x[SyncAssign-38] + _ = x[SyncOp-39] + _ = x[SyncFuncLit-40] + _ = x[SyncCompLit-41] + _ = x[SyncDecl-42] + _ = x[SyncFuncBody-43] + _ = x[SyncOpenScope-44] + _ = x[SyncCloseScope-45] + _ = x[SyncCloseAnotherScope-46] + _ = x[SyncDeclNames-47] + _ = x[SyncDeclName-48] + _ = x[SyncStmts-49] + _ = x[SyncBlockStmt-50] + _ = x[SyncIfStmt-51] + _ = x[SyncForStmt-52] + _ = x[SyncSwitchStmt-53] + _ = x[SyncRangeStmt-54] + _ = x[SyncCaseClause-55] + _ = x[SyncCommClause-56] + _ = x[SyncSelectStmt-57] + _ = x[SyncDecls-58] + _ = x[SyncLabeledStmt-59] + _ = x[SyncUseObjLocal-60] + _ = x[SyncAddLocal-61] + _ = x[SyncLinkname-62] + _ = x[SyncStmt1-63] + _ = x[SyncStmtsEnd-64] + _ = x[SyncLabel-65] + _ = x[SyncOptLabel-66] +} + +const _SyncMarker_name = "EOFBoolInt64Uint64StringValueValRelocsRelocUseRelocPublicPosPosBaseObjectObject1PkgPkgDefMethodTypeTypeIdxTypeParamNamesSignatureParamsParamCodeObjSymLocalIdentSelectorPrivateFuncExtVarExtTypeExtPragmaExprListExprsExprExprTypeAssignOpFuncLitCompLitDeclFuncBodyOpenScopeCloseScopeCloseAnotherScopeDeclNamesDeclNameStmtsBlockStmtIfStmtForStmtSwitchStmtRangeStmtCaseClauseCommClauseSelectStmtDeclsLabeledStmtUseObjLocalAddLocalLinknameStmt1StmtsEndLabelOptLabel" + +var _SyncMarker_index = [...]uint16{0, 3, 7, 12, 18, 24, 29, 32, 38, 43, 51, 57, 60, 67, 73, 80, 83, 89, 95, 99, 106, 120, 129, 135, 140, 147, 150, 160, 168, 175, 182, 188, 195, 201, 209, 214, 218, 226, 232, 234, 241, 248, 252, 260, 269, 279, 296, 305, 313, 318, 327, 333, 340, 350, 359, 369, 379, 389, 394, 405, 416, 424, 432, 437, 445, 450, 458} + +func (i SyncMarker) String() string { + i -= 1 + if i < 0 || i >= SyncMarker(len(_SyncMarker_index)-1) { + return "SyncMarker(" + strconv.FormatInt(int64(i+1), 10) + ")" + } + return _SyncMarker_name[_SyncMarker_index[i]:_SyncMarker_index[i+1]] +} diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go index 50533995a..de881562d 100644 --- a/vendor/golang.org/x/tools/go/packages/golist.go +++ b/vendor/golang.org/x/tools/go/packages/golist.go @@ -302,11 +302,12 @@ func (state *golistState) runContainsQueries(response *responseDeduper, queries } dirResponse, err := state.createDriverResponse(pattern) - // If there was an error loading the package, or the package is returned - // with errors, try to load the file as an ad-hoc package. + // If there was an error loading the package, or no packages are returned, + // or the package is returned with errors, try to load the file as an + // ad-hoc package. // Usually the error will appear in a returned package, but may not if we're // in module mode and the ad-hoc is located outside a module. - if err != nil || len(dirResponse.Packages) == 1 && len(dirResponse.Packages[0].GoFiles) == 0 && + if err != nil || len(dirResponse.Packages) == 0 || len(dirResponse.Packages) == 1 && len(dirResponse.Packages[0].GoFiles) == 0 && len(dirResponse.Packages[0].Errors) == 1 { var queryErr error if dirResponse, queryErr = state.adhocPackage(pattern, query); queryErr != nil { diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go index d859617b7..9e373d64e 100644 --- a/vendor/golang.org/x/tools/internal/imports/fix.go +++ b/vendor/golang.org/x/tools/internal/imports/fix.go @@ -796,7 +796,7 @@ func GetPackageExports(ctx context.Context, wrapped func(PackageExport), searchP return getCandidatePkgs(ctx, callback, filename, filePkg, env) } -var RequiredGoEnvVars = []string{"GO111MODULE", "GOFLAGS", "GOINSECURE", "GOMOD", "GOMODCACHE", "GONOPROXY", "GONOSUMDB", "GOPATH", "GOPROXY", "GOROOT", "GOSUMDB"} +var RequiredGoEnvVars = []string{"GO111MODULE", "GOFLAGS", "GOINSECURE", "GOMOD", "GOMODCACHE", "GONOPROXY", "GONOSUMDB", "GOPATH", "GOPROXY", "GOROOT", "GOSUMDB", "GOWORK"} // ProcessEnv contains environment variables and settings that affect the use of // the go command, the go/build package, etc. @@ -906,7 +906,7 @@ func (e *ProcessEnv) GetResolver() (Resolver, error) { if err := e.init(); err != nil { return nil, err } - if len(e.Env["GOMOD"]) == 0 { + if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 { e.resolver = newGopathResolver(e) return e.resolver, nil } diff --git a/vendor/golang.org/x/tools/internal/imports/mod.go b/vendor/golang.org/x/tools/internal/imports/mod.go index 2bcf41f5f..46693f243 100644 --- a/vendor/golang.org/x/tools/internal/imports/mod.go +++ b/vendor/golang.org/x/tools/internal/imports/mod.go @@ -70,9 +70,17 @@ func (r *ModuleResolver) init() error { Logf: r.env.Logf, WorkingDir: r.env.WorkingDir, } - vendorEnabled, mainModVendor, err := gocommand.VendorEnabled(context.TODO(), inv, r.env.GocmdRunner) - if err != nil { - return err + + vendorEnabled := false + var mainModVendor *gocommand.ModuleJSON + + // Module vendor directories are ignored in workspace mode: + // https://go.googlesource.com/proposal/+/master/design/45713-workspace.md + if len(r.env.Env["GOWORK"]) == 0 { + vendorEnabled, mainModVendor, err = gocommand.VendorEnabled(context.TODO(), inv, r.env.GocmdRunner) + if err != nil { + return err + } } if mainModVendor != nil && vendorEnabled { diff --git a/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/checked.pb.go b/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/checked.pb.go index bad8af149..64ec9ae3b 100644 --- a/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/checked.pb.go +++ b/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/checked.pb.go @@ -1117,7 +1117,7 @@ type Decl_FunctionDecl_Overload struct { // `string.isEmpty()` would have `result_type` of `kind: BOOL`. ResultType *Type `protobuf:"bytes,4,opt,name=result_type,json=resultType,proto3" json:"result_type,omitempty"` // Whether the function is to be used in a method call-style `x.f(...)` - // of a function call-style `f(x, ...)`. + // or a function call-style `f(x, ...)`. // // For methods, the first parameter declaration, `params[0]` is the // expected type of the target receiver. diff --git a/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/syntax.pb.go b/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/syntax.pb.go index 175dec53c..60ee232fc 100644 --- a/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/syntax.pb.go +++ b/vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/syntax.pb.go @@ -997,14 +997,14 @@ func (x *Expr_CreateStruct) GetEntries() []*Expr_CreateStruct_Entry { // Aggregate type macros may be applied to all elements in a list or all keys // in a map: // -// * `all`, `exists`, `exists_one` - test a predicate expression against -// the inputs and return `true` if the predicate is satisfied for all, -// any, or only one value `list.all(x, x < 10)`. -// * `filter` - test a predicate expression against the inputs and return -// the subset of elements which satisfy the predicate: -// `payments.filter(p, p > 1000)`. -// * `map` - apply an expression to all elements in the input and return the -// output aggregate type: `[1, 2, 3].map(i, i * i)`. +// - `all`, `exists`, `exists_one` - test a predicate expression against +// the inputs and return `true` if the predicate is satisfied for all, +// any, or only one value `list.all(x, x < 10)`. +// - `filter` - test a predicate expression against the inputs and return +// the subset of elements which satisfy the predicate: +// `payments.filter(p, p > 1000)`. +// - `map` - apply an expression to all elements in the input and return the +// output aggregate type: `[1, 2, 3].map(i, i * i)`. // // The `has(m.x)` macro tests whether the property `x` is present in struct // `m`. The semantics of this macro depend on the type of `m`. For proto2 diff --git a/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go b/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go index 7ea5ced87..af72196c8 100644 --- a/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go +++ b/vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go @@ -40,7 +40,6 @@ const ( // payload formats that can't be represented as JSON, such as raw binary or // an HTML page. // -// // This message can be used both in streaming and non-streaming API methods in // the request as well as the response. // @@ -50,32 +49,32 @@ const ( // // Example: // -// message GetResourceRequest { -// // A unique request id. -// string request_id = 1; +// message GetResourceRequest { +// // A unique request id. +// string request_id = 1; // -// // The raw HTTP body is bound to this field. -// google.api.HttpBody http_body = 2; +// // The raw HTTP body is bound to this field. +// google.api.HttpBody http_body = 2; // -// } +// } // -// service ResourceService { -// rpc GetResource(GetResourceRequest) -// returns (google.api.HttpBody); -// rpc UpdateResource(google.api.HttpBody) -// returns (google.protobuf.Empty); +// service ResourceService { +// rpc GetResource(GetResourceRequest) +// returns (google.api.HttpBody); +// rpc UpdateResource(google.api.HttpBody) +// returns (google.protobuf.Empty); // -// } +// } // // Example with streaming methods: // -// service CaldavService { -// rpc GetCalendar(stream google.api.HttpBody) -// returns (stream google.api.HttpBody); -// rpc UpdateCalendar(stream google.api.HttpBody) -// returns (stream google.api.HttpBody); +// service CaldavService { +// rpc GetCalendar(stream google.api.HttpBody) +// returns (stream google.api.HttpBody); +// rpc UpdateCalendar(stream google.api.HttpBody) +// returns (stream google.api.HttpBody); // -// } +// } // // Use of this type only changes how the request and response bodies are // handled, all other features will continue to work unchanged. diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go index f7a7697ca..257139080 100644 --- a/vendor/google.golang.org/grpc/balancer/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/balancer.go @@ -371,56 +371,3 @@ type ClientConnState struct { // ErrBadResolverState may be returned by UpdateClientConnState to indicate a // problem with the provided name resolver data. var ErrBadResolverState = errors.New("bad resolver state") - -// ConnectivityStateEvaluator takes the connectivity states of multiple SubConns -// and returns one aggregated connectivity state. -// -// It's not thread safe. -type ConnectivityStateEvaluator struct { - numReady uint64 // Number of addrConns in ready state. - numConnecting uint64 // Number of addrConns in connecting state. - numTransientFailure uint64 // Number of addrConns in transient failure state. - numIdle uint64 // Number of addrConns in idle state. -} - -// RecordTransition records state change happening in subConn and based on that -// it evaluates what aggregated state should be. -// -// - If at least one SubConn in Ready, the aggregated state is Ready; -// - Else if at least one SubConn in Connecting, the aggregated state is Connecting; -// - Else if at least one SubConn is TransientFailure, the aggregated state is Transient Failure; -// - Else if at least one SubConn is Idle, the aggregated state is Idle; -// - Else there are no subconns and the aggregated state is Transient Failure -// -// Shutdown is not considered. -func (cse *ConnectivityStateEvaluator) RecordTransition(oldState, newState connectivity.State) connectivity.State { - // Update counters. - for idx, state := range []connectivity.State{oldState, newState} { - updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new. - switch state { - case connectivity.Ready: - cse.numReady += updateVal - case connectivity.Connecting: - cse.numConnecting += updateVal - case connectivity.TransientFailure: - cse.numTransientFailure += updateVal - case connectivity.Idle: - cse.numIdle += updateVal - } - } - - // Evaluate. - if cse.numReady > 0 { - return connectivity.Ready - } - if cse.numConnecting > 0 { - return connectivity.Connecting - } - if cse.numTransientFailure > 0 { - return connectivity.TransientFailure - } - if cse.numIdle > 0 { - return connectivity.Idle - } - return connectivity.TransientFailure -} diff --git a/vendor/google.golang.org/grpc/balancer/conn_state_evaluator.go b/vendor/google.golang.org/grpc/balancer/conn_state_evaluator.go new file mode 100644 index 000000000..a87b6809a --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/conn_state_evaluator.go @@ -0,0 +1,70 @@ +/* + * + * Copyright 2022 gRPC 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 balancer + +import "google.golang.org/grpc/connectivity" + +// ConnectivityStateEvaluator takes the connectivity states of multiple SubConns +// and returns one aggregated connectivity state. +// +// It's not thread safe. +type ConnectivityStateEvaluator struct { + numReady uint64 // Number of addrConns in ready state. + numConnecting uint64 // Number of addrConns in connecting state. + numTransientFailure uint64 // Number of addrConns in transient failure state. + numIdle uint64 // Number of addrConns in idle state. +} + +// RecordTransition records state change happening in subConn and based on that +// it evaluates what aggregated state should be. +// +// - If at least one SubConn in Ready, the aggregated state is Ready; +// - Else if at least one SubConn in Connecting, the aggregated state is Connecting; +// - Else if at least one SubConn is Idle, the aggregated state is Idle; +// - Else if at least one SubConn is TransientFailure (or there are no SubConns), the aggregated state is Transient Failure. +// +// Shutdown is not considered. +func (cse *ConnectivityStateEvaluator) RecordTransition(oldState, newState connectivity.State) connectivity.State { + // Update counters. + for idx, state := range []connectivity.State{oldState, newState} { + updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new. + switch state { + case connectivity.Ready: + cse.numReady += updateVal + case connectivity.Connecting: + cse.numConnecting += updateVal + case connectivity.TransientFailure: + cse.numTransientFailure += updateVal + case connectivity.Idle: + cse.numIdle += updateVal + } + } + + // Evaluate. + if cse.numReady > 0 { + return connectivity.Ready + } + if cse.numConnecting > 0 { + return connectivity.Connecting + } + if cse.numIdle > 0 { + return connectivity.Idle + } + return connectivity.TransientFailure +} diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index 0d21f2210..779b03bca 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -712,8 +712,8 @@ func (cc *ClientConn) newAddrConn(addrs []resolver.Address, opts balancer.NewSub ac.ctx, ac.cancel = context.WithCancel(cc.ctx) // Track ac in cc. This needs to be done before any getTransport(...) is called. cc.mu.Lock() + defer cc.mu.Unlock() if cc.conns == nil { - cc.mu.Unlock() return nil, ErrClientConnClosing } @@ -732,7 +732,6 @@ func (cc *ClientConn) newAddrConn(addrs []resolver.Address, opts balancer.NewSub }) cc.conns[ac] = struct{}{} - cc.mu.Unlock() return ac, nil } diff --git a/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/LICENSE b/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/README.md b/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/README.md new file mode 100644 index 000000000..4758125de --- /dev/null +++ b/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/README.md @@ -0,0 +1,21 @@ +# protoc-gen-go-grpc + +This tool generates Go language bindings of `service`s in protobuf definition +files for gRPC. For usage information, please see our [quick start +guide](https://grpc.io/docs/languages/go/quickstart/). + +## Future-proofing services + +By default, to register services using the methods generated by this tool, the +service implementations must embed the corresponding +`UnimplementedServer` for future compatibility. This is a behavior +change from the grpc code generator previously included with `protoc-gen-go`. +To restore this behavior, set the option `require_unimplemented_servers=false`. +E.g.: + +``` + protoc --go-grpc_out=require_unimplemented_servers=false[,other options...]:. \ +``` + +Note that this is not recommended, and the option is only provided to restore +backward compatibility with previously-generated code. diff --git a/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/grpc.go b/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/grpc.go new file mode 100644 index 000000000..1e787344e --- /dev/null +++ b/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/grpc.go @@ -0,0 +1,430 @@ +/* + * + * Copyright 2020 gRPC 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 main + +import ( + "fmt" + "strconv" + "strings" + + "google.golang.org/protobuf/compiler/protogen" + + "google.golang.org/protobuf/types/descriptorpb" +) + +const ( + contextPackage = protogen.GoImportPath("context") + grpcPackage = protogen.GoImportPath("google.golang.org/grpc") + codesPackage = protogen.GoImportPath("google.golang.org/grpc/codes") + statusPackage = protogen.GoImportPath("google.golang.org/grpc/status") +) + +// generateFile generates a _grpc.pb.go file containing gRPC service definitions. +func generateFile(gen *protogen.Plugin, file *protogen.File) *protogen.GeneratedFile { + if len(file.Services) == 0 { + return nil + } + filename := file.GeneratedFilenamePrefix + "_grpc.pb.go" + g := gen.NewGeneratedFile(filename, file.GoImportPath) + g.P("// Code generated by protoc-gen-go-grpc. DO NOT EDIT.") + g.P() + g.P("package ", file.GoPackageName) + g.P() + generateFileContent(gen, file, g) + return g +} + +// generateFileContent generates the gRPC service definitions, excluding the package statement. +func generateFileContent(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile) { + if len(file.Services) == 0 { + return + } + + g.P("// This is a compile-time assertion to ensure that this generated file") + g.P("// is compatible with the grpc package it is being compiled against.") + g.P("// Requires gRPC-Go v1.32.0 or later.") + g.P("const _ = ", grpcPackage.Ident("SupportPackageIsVersion7")) // When changing, update version number above. + g.P() + for _, service := range file.Services { + genService(gen, file, g, service) + } +} + +func genService(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, service *protogen.Service) { + clientName := service.GoName + "Client" + + g.P("// ", clientName, " is the client API for ", service.GoName, " service.") + g.P("//") + g.P("// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.") + + // Client interface. + if service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() { + g.P("//") + g.P(deprecationComment) + } + g.Annotate(clientName, service.Location) + g.P("type ", clientName, " interface {") + for _, method := range service.Methods { + g.Annotate(clientName+"."+method.GoName, method.Location) + if method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() { + g.P(deprecationComment) + } + g.P(method.Comments.Leading, + clientSignature(g, method)) + } + g.P("}") + g.P() + + // Client structure. + g.P("type ", unexport(clientName), " struct {") + g.P("cc ", grpcPackage.Ident("ClientConnInterface")) + g.P("}") + g.P() + + // NewClient factory. + if service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() { + g.P(deprecationComment) + } + g.P("func New", clientName, " (cc ", grpcPackage.Ident("ClientConnInterface"), ") ", clientName, " {") + g.P("return &", unexport(clientName), "{cc}") + g.P("}") + g.P() + + var methodIndex, streamIndex int + // Client method implementations. + for _, method := range service.Methods { + if !method.Desc.IsStreamingServer() && !method.Desc.IsStreamingClient() { + // Unary RPC method + genClientMethod(gen, file, g, method, methodIndex) + methodIndex++ + } else { + // Streaming RPC method + genClientMethod(gen, file, g, method, streamIndex) + streamIndex++ + } + } + + mustOrShould := "must" + if !*requireUnimplemented { + mustOrShould = "should" + } + + // Server interface. + serverType := service.GoName + "Server" + g.P("// ", serverType, " is the server API for ", service.GoName, " service.") + g.P("// All implementations ", mustOrShould, " embed Unimplemented", serverType) + g.P("// for forward compatibility") + if service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() { + g.P("//") + g.P(deprecationComment) + } + g.Annotate(serverType, service.Location) + g.P("type ", serverType, " interface {") + for _, method := range service.Methods { + g.Annotate(serverType+"."+method.GoName, method.Location) + if method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() { + g.P(deprecationComment) + } + g.P(method.Comments.Leading, + serverSignature(g, method)) + } + if *requireUnimplemented { + g.P("mustEmbedUnimplemented", serverType, "()") + } + g.P("}") + g.P() + + // Server Unimplemented struct for forward compatibility. + g.P("// Unimplemented", serverType, " ", mustOrShould, " be embedded to have forward compatible implementations.") + g.P("type Unimplemented", serverType, " struct {") + g.P("}") + g.P() + for _, method := range service.Methods { + nilArg := "" + if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() { + nilArg = "nil," + } + g.P("func (Unimplemented", serverType, ") ", serverSignature(g, method), "{") + g.P("return ", nilArg, statusPackage.Ident("Errorf"), "(", codesPackage.Ident("Unimplemented"), `, "method `, method.GoName, ` not implemented")`) + g.P("}") + } + if *requireUnimplemented { + g.P("func (Unimplemented", serverType, ") mustEmbedUnimplemented", serverType, "() {}") + } + g.P() + + // Unsafe Server interface to opt-out of forward compatibility. + g.P("// Unsafe", serverType, " may be embedded to opt out of forward compatibility for this service.") + g.P("// Use of this interface is not recommended, as added methods to ", serverType, " will") + g.P("// result in compilation errors.") + g.P("type Unsafe", serverType, " interface {") + g.P("mustEmbedUnimplemented", serverType, "()") + g.P("}") + + // Server registration. + if service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() { + g.P(deprecationComment) + } + serviceDescVar := service.GoName + "_ServiceDesc" + g.P("func Register", service.GoName, "Server(s ", grpcPackage.Ident("ServiceRegistrar"), ", srv ", serverType, ") {") + g.P("s.RegisterService(&", serviceDescVar, `, srv)`) + g.P("}") + g.P() + + // Server handler implementations. + var handlerNames []string + for _, method := range service.Methods { + hname := genServerMethod(gen, file, g, method) + handlerNames = append(handlerNames, hname) + } + + // Service descriptor. + g.P("// ", serviceDescVar, " is the ", grpcPackage.Ident("ServiceDesc"), " for ", service.GoName, " service.") + g.P("// It's only intended for direct use with ", grpcPackage.Ident("RegisterService"), ",") + g.P("// and not to be introspected or modified (even as a copy)") + g.P("var ", serviceDescVar, " = ", grpcPackage.Ident("ServiceDesc"), " {") + g.P("ServiceName: ", strconv.Quote(string(service.Desc.FullName())), ",") + g.P("HandlerType: (*", serverType, ")(nil),") + g.P("Methods: []", grpcPackage.Ident("MethodDesc"), "{") + for i, method := range service.Methods { + if method.Desc.IsStreamingClient() || method.Desc.IsStreamingServer() { + continue + } + g.P("{") + g.P("MethodName: ", strconv.Quote(string(method.Desc.Name())), ",") + g.P("Handler: ", handlerNames[i], ",") + g.P("},") + } + g.P("},") + g.P("Streams: []", grpcPackage.Ident("StreamDesc"), "{") + for i, method := range service.Methods { + if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() { + continue + } + g.P("{") + g.P("StreamName: ", strconv.Quote(string(method.Desc.Name())), ",") + g.P("Handler: ", handlerNames[i], ",") + if method.Desc.IsStreamingServer() { + g.P("ServerStreams: true,") + } + if method.Desc.IsStreamingClient() { + g.P("ClientStreams: true,") + } + g.P("},") + } + g.P("},") + g.P("Metadata: \"", file.Desc.Path(), "\",") + g.P("}") + g.P() +} + +func clientSignature(g *protogen.GeneratedFile, method *protogen.Method) string { + s := method.GoName + "(ctx " + g.QualifiedGoIdent(contextPackage.Ident("Context")) + if !method.Desc.IsStreamingClient() { + s += ", in *" + g.QualifiedGoIdent(method.Input.GoIdent) + } + s += ", opts ..." + g.QualifiedGoIdent(grpcPackage.Ident("CallOption")) + ") (" + if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() { + s += "*" + g.QualifiedGoIdent(method.Output.GoIdent) + } else { + s += method.Parent.GoName + "_" + method.GoName + "Client" + } + s += ", error)" + return s +} + +func genClientMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method, index int) { + service := method.Parent + sname := fmt.Sprintf("/%s/%s", service.Desc.FullName(), method.Desc.Name()) + + if method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() { + g.P(deprecationComment) + } + g.P("func (c *", unexport(service.GoName), "Client) ", clientSignature(g, method), "{") + if !method.Desc.IsStreamingServer() && !method.Desc.IsStreamingClient() { + g.P("out := new(", method.Output.GoIdent, ")") + g.P(`err := c.cc.Invoke(ctx, "`, sname, `", in, out, opts...)`) + g.P("if err != nil { return nil, err }") + g.P("return out, nil") + g.P("}") + g.P() + return + } + streamType := unexport(service.GoName) + method.GoName + "Client" + serviceDescVar := service.GoName + "_ServiceDesc" + g.P("stream, err := c.cc.NewStream(ctx, &", serviceDescVar, ".Streams[", index, `], "`, sname, `", opts...)`) + g.P("if err != nil { return nil, err }") + g.P("x := &", streamType, "{stream}") + if !method.Desc.IsStreamingClient() { + g.P("if err := x.ClientStream.SendMsg(in); err != nil { return nil, err }") + g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }") + } + g.P("return x, nil") + g.P("}") + g.P() + + genSend := method.Desc.IsStreamingClient() + genRecv := method.Desc.IsStreamingServer() + genCloseAndRecv := !method.Desc.IsStreamingServer() + + // Stream auxiliary types and methods. + g.P("type ", service.GoName, "_", method.GoName, "Client interface {") + if genSend { + g.P("Send(*", method.Input.GoIdent, ") error") + } + if genRecv { + g.P("Recv() (*", method.Output.GoIdent, ", error)") + } + if genCloseAndRecv { + g.P("CloseAndRecv() (*", method.Output.GoIdent, ", error)") + } + g.P(grpcPackage.Ident("ClientStream")) + g.P("}") + g.P() + + g.P("type ", streamType, " struct {") + g.P(grpcPackage.Ident("ClientStream")) + g.P("}") + g.P() + + if genSend { + g.P("func (x *", streamType, ") Send(m *", method.Input.GoIdent, ") error {") + g.P("return x.ClientStream.SendMsg(m)") + g.P("}") + g.P() + } + if genRecv { + g.P("func (x *", streamType, ") Recv() (*", method.Output.GoIdent, ", error) {") + g.P("m := new(", method.Output.GoIdent, ")") + g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }") + g.P("return m, nil") + g.P("}") + g.P() + } + if genCloseAndRecv { + g.P("func (x *", streamType, ") CloseAndRecv() (*", method.Output.GoIdent, ", error) {") + g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }") + g.P("m := new(", method.Output.GoIdent, ")") + g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }") + g.P("return m, nil") + g.P("}") + g.P() + } +} + +func serverSignature(g *protogen.GeneratedFile, method *protogen.Method) string { + var reqArgs []string + ret := "error" + if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() { + reqArgs = append(reqArgs, g.QualifiedGoIdent(contextPackage.Ident("Context"))) + ret = "(*" + g.QualifiedGoIdent(method.Output.GoIdent) + ", error)" + } + if !method.Desc.IsStreamingClient() { + reqArgs = append(reqArgs, "*"+g.QualifiedGoIdent(method.Input.GoIdent)) + } + if method.Desc.IsStreamingClient() || method.Desc.IsStreamingServer() { + reqArgs = append(reqArgs, method.Parent.GoName+"_"+method.GoName+"Server") + } + return method.GoName + "(" + strings.Join(reqArgs, ", ") + ") " + ret +} + +func genServerMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method) string { + service := method.Parent + hname := fmt.Sprintf("_%s_%s_Handler", service.GoName, method.GoName) + + if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() { + g.P("func ", hname, "(srv interface{}, ctx ", contextPackage.Ident("Context"), ", dec func(interface{}) error, interceptor ", grpcPackage.Ident("UnaryServerInterceptor"), ") (interface{}, error) {") + g.P("in := new(", method.Input.GoIdent, ")") + g.P("if err := dec(in); err != nil { return nil, err }") + g.P("if interceptor == nil { return srv.(", service.GoName, "Server).", method.GoName, "(ctx, in) }") + g.P("info := &", grpcPackage.Ident("UnaryServerInfo"), "{") + g.P("Server: srv,") + g.P("FullMethod: ", strconv.Quote(fmt.Sprintf("/%s/%s", service.Desc.FullName(), method.Desc.Name())), ",") + g.P("}") + g.P("handler := func(ctx ", contextPackage.Ident("Context"), ", req interface{}) (interface{}, error) {") + g.P("return srv.(", service.GoName, "Server).", method.GoName, "(ctx, req.(*", method.Input.GoIdent, "))") + g.P("}") + g.P("return interceptor(ctx, in, info, handler)") + g.P("}") + g.P() + return hname + } + streamType := unexport(service.GoName) + method.GoName + "Server" + g.P("func ", hname, "(srv interface{}, stream ", grpcPackage.Ident("ServerStream"), ") error {") + if !method.Desc.IsStreamingClient() { + g.P("m := new(", method.Input.GoIdent, ")") + g.P("if err := stream.RecvMsg(m); err != nil { return err }") + g.P("return srv.(", service.GoName, "Server).", method.GoName, "(m, &", streamType, "{stream})") + } else { + g.P("return srv.(", service.GoName, "Server).", method.GoName, "(&", streamType, "{stream})") + } + g.P("}") + g.P() + + genSend := method.Desc.IsStreamingServer() + genSendAndClose := !method.Desc.IsStreamingServer() + genRecv := method.Desc.IsStreamingClient() + + // Stream auxiliary types and methods. + g.P("type ", service.GoName, "_", method.GoName, "Server interface {") + if genSend { + g.P("Send(*", method.Output.GoIdent, ") error") + } + if genSendAndClose { + g.P("SendAndClose(*", method.Output.GoIdent, ") error") + } + if genRecv { + g.P("Recv() (*", method.Input.GoIdent, ", error)") + } + g.P(grpcPackage.Ident("ServerStream")) + g.P("}") + g.P() + + g.P("type ", streamType, " struct {") + g.P(grpcPackage.Ident("ServerStream")) + g.P("}") + g.P() + + if genSend { + g.P("func (x *", streamType, ") Send(m *", method.Output.GoIdent, ") error {") + g.P("return x.ServerStream.SendMsg(m)") + g.P("}") + g.P() + } + if genSendAndClose { + g.P("func (x *", streamType, ") SendAndClose(m *", method.Output.GoIdent, ") error {") + g.P("return x.ServerStream.SendMsg(m)") + g.P("}") + g.P() + } + if genRecv { + g.P("func (x *", streamType, ") Recv() (*", method.Input.GoIdent, ", error) {") + g.P("m := new(", method.Input.GoIdent, ")") + g.P("if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err }") + g.P("return m, nil") + g.P("}") + g.P() + } + + return hname +} + +const deprecationComment = "// Deprecated: Do not use." + +func unexport(s string) string { return strings.ToLower(s[:1]) + s[1:] } diff --git a/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/main.go b/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/main.go new file mode 100644 index 000000000..7f104da7d --- /dev/null +++ b/vendor/google.golang.org/grpc/cmd/protoc-gen-go-grpc/main.go @@ -0,0 +1,68 @@ +/* + * + * Copyright 2020 gRPC 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. + * + */ + +// protoc-gen-go-grpc is a plugin for the Google protocol buffer compiler to +// generate Go code. Install it by building this program and making it +// accessible within your PATH with the name: +// protoc-gen-go-grpc +// +// The 'go-grpc' suffix becomes part of the argument for the protocol compiler, +// such that it can be invoked as: +// protoc --go-grpc_out=. path/to/file.proto +// +// This generates Go service definitions for the protocol buffer defined by +// file.proto. With that input, the output will be written to: +// path/to/file_grpc.pb.go +package main + +import ( + "flag" + "fmt" + + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/types/pluginpb" +) + +const version = "1.1.0" + +var requireUnimplemented *bool + +func main() { + showVersion := flag.Bool("version", false, "print the version and exit") + flag.Parse() + if *showVersion { + fmt.Printf("protoc-gen-go-grpc %v\n", version) + return + } + + var flags flag.FlagSet + requireUnimplemented = flags.Bool("require_unimplemented_servers", true, "set to false to match legacy behavior") + + protogen.Options{ + ParamFunc: flags.Set, + }.Run(func(gen *protogen.Plugin) error { + gen.SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL) + for _, f := range gen.Files { + if !f.Generate { + continue + } + generateFile(gen, f) + } + return nil + }) +} diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go index 75d01ba77..60403bc16 100644 --- a/vendor/google.golang.org/grpc/dialoptions.go +++ b/vendor/google.golang.org/grpc/dialoptions.go @@ -84,7 +84,7 @@ var extraDialOptions []DialOption // EmptyDialOption does not alter the dial configuration. It can be embedded in // another structure to build custom dial options. // -// Experimental +// # Experimental // // Notice: This type is EXPERIMENTAL and may be changed or removed in a // later release. @@ -275,7 +275,7 @@ func WithBlock() DialOption { // the context.DeadlineExceeded error. // Implies WithBlock() // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -304,7 +304,7 @@ func WithInsecure() DialOption { // WithNoProxy returns a DialOption which disables the use of proxies for this // ClientConn. This is ignored if WithDialer or WithContextDialer are used. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -335,7 +335,7 @@ func WithPerRPCCredentials(creds credentials.PerRPCCredentials) DialOption { // the ClientConn.WithCreds. This should not be used together with // WithTransportCredentials. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -391,6 +391,12 @@ func WithDialer(f func(string, time.Duration) (net.Conn, error)) DialOption { // all the RPCs and underlying network connections in this ClientConn. func WithStatsHandler(h stats.Handler) DialOption { return newFuncDialOption(func(o *dialOptions) { + if h == nil { + logger.Error("ignoring nil parameter in grpc.WithStatsHandler ClientOption") + // Do not allow a nil stats handler, which would otherwise cause + // panics. + return + } o.copts.StatsHandlers = append(o.copts.StatsHandlers, h) }) } @@ -403,7 +409,7 @@ func WithStatsHandler(h stats.Handler) DialOption { // FailOnNonTempDialError only affects the initial dial, and does not do // anything useful unless you are also using WithBlock(). // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -483,7 +489,7 @@ func WithAuthority(a string) DialOption { // current ClientConn's parent. This function is used in nested channel creation // (e.g. grpclb dial). // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -528,9 +534,6 @@ func WithDefaultServiceConfig(s string) DialOption { // service config enables them. This does not impact transparent retries, which // will happen automatically if no data is written to the wire or if the RPC is // unprocessed by the remote server. -// -// Retry support is currently enabled by default, but may be disabled by -// setting the environment variable "GRPC_GO_RETRY" to "off". func WithDisableRetry() DialOption { return newFuncDialOption(func(o *dialOptions) { o.disableRetry = true @@ -548,7 +551,7 @@ func WithMaxHeaderListSize(s uint32) DialOption { // WithDisableHealthCheck disables the LB channel health checking for all // SubConns of this ClientConn. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -595,7 +598,7 @@ func withMinConnectDeadline(f func() time.Duration) DialOption { // resolver.Register. They will be matched against the scheme used for the // current Dial only, and will take precedence over the global registry. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. diff --git a/vendor/google.golang.org/grpc/internal/envconfig/xds.go b/vendor/google.golang.org/grpc/internal/envconfig/xds.go index 55aaeea8b..a83b26bb8 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/xds.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/xds.go @@ -41,7 +41,6 @@ const ( clientSideSecuritySupportEnv = "GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT" aggregateAndDNSSupportEnv = "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER" rbacSupportEnv = "GRPC_XDS_EXPERIMENTAL_RBAC" - outlierDetectionSupportEnv = "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION" federationEnv = "GRPC_EXPERIMENTAL_XDS_FEDERATION" rlsInXDSEnv = "GRPC_EXPERIMENTAL_XDS_RLS_LB" @@ -86,7 +85,7 @@ var ( // XDSOutlierDetection indicates whether outlier detection support is // enabled, which can be enabled by setting the environment variable // "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION" to "true". - XDSOutlierDetection = strings.EqualFold(os.Getenv(outlierDetectionSupportEnv), "true") + XDSOutlierDetection = false // XDSFederation indicates whether federation support is enabled. XDSFederation = strings.EqualFold(os.Getenv(federationEnv), "true") diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/method.go b/vendor/google.golang.org/grpc/internal/grpcutil/method.go index 4e7475060..e9c4af648 100644 --- a/vendor/google.golang.org/grpc/internal/grpcutil/method.go +++ b/vendor/google.golang.org/grpc/internal/grpcutil/method.go @@ -39,6 +39,11 @@ func ParseMethod(methodName string) (service, method string, _ error) { return methodName[:pos], methodName[pos+1:], nil } +// baseContentType is the base content-type for gRPC. This is a valid +// content-type on it's own, but can also include a content-subtype such as +// "proto" as a suffix after "+" or ";". See +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests +// for more details. const baseContentType = "application/grpc" // ContentSubtype returns the content-subtype for the given content-type. The diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go index be371c6e0..28c77af70 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -78,6 +78,7 @@ type http2Client struct { framer *framer // controlBuf delivers all the control related tasks (e.g., window // updates, reset streams, and various settings) to the controller. + // Do not access controlBuf with mu held. controlBuf *controlBuffer fc *trInFlow // The scheme used: https if TLS is on, http otherwise. @@ -109,6 +110,7 @@ type http2Client struct { waitingStreams uint32 nextID uint32 + // Do not access controlBuf with mu held. mu sync.Mutex // guard the following variables state transportState activeStreams map[uint32]*Stream @@ -685,7 +687,6 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, cleanup(err) return err } - t.activeStreams[id] = s if channelz.IsOn() { atomic.AddInt64(&t.czData.streamsStarted, 1) atomic.StoreInt64(&t.czData.lastStreamCreatedTime, time.Now().UnixNano()) @@ -719,6 +720,13 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, t.nextID += 2 s.id = h.streamID s.fc = &inFlow{limit: uint32(t.initialWindowSize)} + t.mu.Lock() + if t.activeStreams == nil { // Can be niled from Close(). + t.mu.Unlock() + return false // Don't create a stream if the transport is already closed. + } + t.activeStreams[s.id] = s + t.mu.Unlock() if t.streamQuota > 0 && t.waitingStreams > 0 { select { case t.streamsQuotaAvailable <- struct{}{}: @@ -744,13 +752,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, } for { success, err := t.controlBuf.executeAndPut(func(it interface{}) bool { - if !checkForStreamQuota(it) { - return false - } - if !checkForHeaderListSize(it) { - return false - } - return true + return checkForHeaderListSize(it) && checkForStreamQuota(it) }, hdr) if err != nil { // Connection closed. @@ -1003,13 +1005,13 @@ func (t *http2Client) updateWindow(s *Stream, n uint32) { // for the transport and the stream based on the current bdp // estimation. func (t *http2Client) updateFlowControl(n uint32) { - t.mu.Lock() - for _, s := range t.activeStreams { - s.fc.newLimit(n) - } - t.mu.Unlock() updateIWS := func(interface{}) bool { t.initialWindowSize = int32(n) + t.mu.Lock() + for _, s := range t.activeStreams { + s.fc.newLimit(n) + } + t.mu.Unlock() return true } t.controlBuf.executeAndPut(updateIWS, &outgoingWindowUpdate{streamID: 0, increment: t.fc.newLimit(n)}) @@ -1215,7 +1217,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { default: t.setGoAwayReason(f) close(t.goAway) - t.controlBuf.put(&incomingGoAway{}) + defer t.controlBuf.put(&incomingGoAway{}) // Defer as t.mu is currently held. // Notify the clientconn about the GOAWAY before we set the state to // draining, to allow the client to stop attempting to create streams // before disallowing new streams on this connection. diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go index 2b0fde334..28bcba0a3 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go @@ -945,15 +945,16 @@ func (t *http2Server) streamContextErr(s *Stream) error { // WriteHeader sends the header metadata md back to the client. func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { - if s.updateHeaderSent() { - return ErrIllegalHeaderWrite - } - + s.hdrMu.Lock() + defer s.hdrMu.Unlock() if s.getState() == streamDone { return t.streamContextErr(s) } - s.hdrMu.Lock() + if s.updateHeaderSent() { + return ErrIllegalHeaderWrite + } + if md.Len() > 0 { if s.header.Len() > 0 { s.header = metadata.Join(s.header, md) @@ -962,10 +963,8 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { } } if err := t.writeHeaderLocked(s); err != nil { - s.hdrMu.Unlock() return status.Convert(err).Err() } - s.hdrMu.Unlock() return nil } @@ -1013,17 +1012,19 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { // TODO(zhaoq): Now it indicates the end of entire stream. Revisit if early // OK is adopted. func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { + s.hdrMu.Lock() + defer s.hdrMu.Unlock() + if s.getState() == streamDone { return nil } - s.hdrMu.Lock() + // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields // first and create a slice of that exact size. headerFields := make([]hpack.HeaderField, 0, 2) // grpc-status and grpc-message will be there if none else. if !s.updateHeaderSent() { // No headers have been sent. if len(s.header) > 0 { // Send a separate header frame. if err := t.writeHeaderLocked(s); err != nil { - s.hdrMu.Unlock() return err } } else { // Send a trailer only response. @@ -1052,7 +1053,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { endStream: true, onWrite: t.setResetPingStrikes, } - s.hdrMu.Unlock() + success, err := t.controlBuf.execute(t.checkForHeaderListSize, trailingHeader) if !success { if err != nil { diff --git a/vendor/google.golang.org/grpc/internal/transport/http_util.go b/vendor/google.golang.org/grpc/internal/transport/http_util.go index b77513068..56e95788d 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http_util.go +++ b/vendor/google.golang.org/grpc/internal/transport/http_util.go @@ -47,12 +47,6 @@ const ( http2MaxFrameLen = 16384 // 16KB frame // http://http2.github.io/http2-spec/#SettingValues http2InitHeaderTableSize = 4096 - // baseContentType is the base content-type for gRPC. This is a valid - // content-type on it's own, but can also include a content-subtype such as - // "proto" as a suffix after "+" or ";". See - // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests - // for more details. - ) var ( diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go index b54f5bb57..2ad9da7bf 100644 --- a/vendor/google.golang.org/grpc/server.go +++ b/vendor/google.golang.org/grpc/server.go @@ -190,7 +190,7 @@ type ServerOption interface { // EmptyServerOption does not alter the server configuration. It can be embedded // in another structure to build custom server options. // -// Experimental +// # Experimental // // Notice: This type is EXPERIMENTAL and may be changed or removed in a // later release. @@ -305,7 +305,7 @@ func CustomCodec(codec Codec) ServerOption { // https://github.com/grpc/grpc-go/blob/master/Documentation/encoding.md#using-a-codec. // Will be supported throughout 1.x. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -426,7 +426,7 @@ func ChainStreamInterceptor(interceptors ...StreamServerInterceptor) ServerOptio // InTapHandle returns a ServerOption that sets the tap handle for all the server // transport to be created. Only one can be installed. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -442,6 +442,12 @@ func InTapHandle(h tap.ServerInHandle) ServerOption { // StatsHandler returns a ServerOption that sets the stats handler for the server. func StatsHandler(h stats.Handler) ServerOption { return newFuncServerOption(func(o *serverOptions) { + if h == nil { + logger.Error("ignoring nil parameter in grpc.StatsHandler ServerOption") + // Do not allow a nil stats handler, which would otherwise cause + // panics. + return + } o.statsHandlers = append(o.statsHandlers, h) }) } @@ -469,7 +475,7 @@ func UnknownServiceHandler(streamHandler StreamHandler) ServerOption { // new connections. If this is not set, the default is 120 seconds. A zero or // negative value will result in an immediate timeout. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -490,7 +496,7 @@ func MaxHeaderListSize(s uint32) ServerOption { // HeaderTableSize returns a ServerOption that sets the size of dynamic // header table for stream. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -505,7 +511,7 @@ func HeaderTableSize(s uint32) ServerOption { // zero (default) will disable workers and spawn a new goroutine for each // stream. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -898,7 +904,7 @@ func (s *Server) newHTTP2Transport(c net.Conn) transport.ServerTransport { if err != credentials.ErrConnDispatched { // Don't log on ErrConnDispatched and io.EOF to prevent log spam. if err != io.EOF { - channelz.Warning(logger, s.channelzID, "grpc: Server.Serve failed to create ServerTransport: ", err) + channelz.Info(logger, s.channelzID, "grpc: Server.Serve failed to create ServerTransport: ", err) } c.Close() } @@ -956,19 +962,19 @@ var _ http.Handler = (*Server)(nil) // To share one port (such as 443 for https) between gRPC and an // existing http.Handler, use a root http.Handler such as: // -// if r.ProtoMajor == 2 && strings.HasPrefix( -// r.Header.Get("Content-Type"), "application/grpc") { -// grpcServer.ServeHTTP(w, r) -// } else { -// yourMux.ServeHTTP(w, r) -// } +// if r.ProtoMajor == 2 && strings.HasPrefix( +// r.Header.Get("Content-Type"), "application/grpc") { +// grpcServer.ServeHTTP(w, r) +// } else { +// yourMux.ServeHTTP(w, r) +// } // // Note that ServeHTTP uses Go's HTTP/2 server implementation which is totally // separate from grpc-go's HTTP/2 server. Performance and features may vary // between the two paths. ServeHTTP does not support some gRPC features // available through grpc-go's HTTP/2 server. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -1674,7 +1680,7 @@ type streamKey struct{} // NewContextWithServerTransportStream creates a new context from ctx and // attaches stream to it. // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -1689,7 +1695,7 @@ func NewContextWithServerTransportStream(ctx context.Context, stream ServerTrans // // See also NewContextWithServerTransportStream. // -// Experimental +// # Experimental // // Notice: This type is EXPERIMENTAL and may be changed or removed in a // later release. @@ -1704,7 +1710,7 @@ type ServerTransportStream interface { // ctx. Returns nil if the given context has no stream associated with it // (which implies it is not an RPC invocation context). // -// Experimental +// # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. @@ -1825,12 +1831,12 @@ func (s *Server) getCodec(contentSubtype string) baseCodec { // When called multiple times, all the provided metadata will be merged. All // the metadata will be sent out when one of the following happens: // -// - grpc.SendHeader is called, or for streaming handlers, stream.SendHeader. -// - The first response message is sent. For unary handlers, this occurs when -// the handler returns; for streaming handlers, this can happen when stream's -// SendMsg method is called. -// - An RPC status is sent out (error or success). This occurs when the handler -// returns. +// - grpc.SendHeader is called, or for streaming handlers, stream.SendHeader. +// - The first response message is sent. For unary handlers, this occurs when +// the handler returns; for streaming handlers, this can happen when stream's +// SendMsg method is called. +// - An RPC status is sent out (error or success). This occurs when the handler +// returns. // // SetHeader will fail if called after any of the events above. // diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go index b01c548bb..01bbb2025 100644 --- a/vendor/google.golang.org/grpc/service_config.go +++ b/vendor/google.golang.org/grpc/service_config.go @@ -57,10 +57,9 @@ type lbConfig struct { type ServiceConfig struct { serviceconfig.Config - // LB is the load balancer the service providers recommends. The balancer - // specified via grpc.WithBalancerName will override this. This is deprecated; - // lbConfigs is preferred. If lbConfig and LB are both present, lbConfig - // will be used. + // LB is the load balancer the service providers recommends. This is + // deprecated; lbConfigs is preferred. If lbConfig and LB are both present, + // lbConfig will be used. LB *string // lbConfig is the service config's load balancing configuration. If diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index 6d82e0d7c..446a91e32 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -140,13 +140,13 @@ type ClientStream interface { // To ensure resources are not leaked due to the stream returned, one of the following // actions must be performed: // -// 1. Call Close on the ClientConn. -// 2. Cancel the context provided. -// 3. Call RecvMsg until a non-nil error is returned. A protobuf-generated -// client-streaming RPC, for instance, might use the helper function -// CloseAndRecv (note that CloseSend does not Recv, therefore is not -// guaranteed to release all resources). -// 4. Receive a non-nil, non-io.EOF error from Header or SendMsg. +// 1. Call Close on the ClientConn. +// 2. Cancel the context provided. +// 3. Call RecvMsg until a non-nil error is returned. A protobuf-generated +// client-streaming RPC, for instance, might use the helper function +// CloseAndRecv (note that CloseSend does not Recv, therefore is not +// guaranteed to release all resources). +// 4. Receive a non-nil, non-io.EOF error from Header or SendMsg. // // If none of the above happen, a goroutine and a context will be leaked, and grpc // will not call the optionally-configured stats handler with a stats.End message. @@ -303,12 +303,6 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client } cs.binlog = binarylog.GetMethodLogger(method) - cs.attempt, err = cs.newAttemptLocked(false /* isTransparent */) - if err != nil { - cs.finish(err) - return nil, err - } - // Pick the transport to use and create a new stream on the transport. // Assign cs.attempt upon success. op := func(a *csAttempt) error { @@ -704,6 +698,18 @@ func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) // already be status errors. return toRPCErr(op(cs.attempt)) } + if len(cs.buffer) == 0 { + // For the first op, which controls creation of the stream and + // assigns cs.attempt, we need to create a new attempt inline + // before executing the first op. On subsequent ops, the attempt + // is created immediately before replaying the ops. + var err error + if cs.attempt, err = cs.newAttemptLocked(false /* isTransparent */); err != nil { + cs.mu.Unlock() + cs.finish(err) + return err + } + } a := cs.attempt cs.mu.Unlock() err := op(a) diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go index 0eb2998cb..8934f06bc 100644 --- a/vendor/google.golang.org/grpc/version.go +++ b/vendor/google.golang.org/grpc/version.go @@ -19,4 +19,4 @@ package grpc // Version is the current grpc version. -const Version = "1.48.0" +const Version = "1.49.0" diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh index ceb436c6c..c3fc8253b 100644 --- a/vendor/google.golang.org/grpc/vet.sh +++ b/vendor/google.golang.org/grpc/vet.sh @@ -147,7 +147,6 @@ grpc.NewGZIPDecompressor grpc.RPCCompressor grpc.RPCDecompressor grpc.ServiceConfig -grpc.WithBalancerName grpc.WithCompressor grpc.WithDecompressor grpc.WithDialer diff --git a/vendor/google.golang.org/protobuf/AUTHORS b/vendor/google.golang.org/protobuf/AUTHORS deleted file mode 100644 index 2b00ddba0..000000000 --- a/vendor/google.golang.org/protobuf/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at https://tip.golang.org/AUTHORS. diff --git a/vendor/google.golang.org/protobuf/CONTRIBUTORS b/vendor/google.golang.org/protobuf/CONTRIBUTORS deleted file mode 100644 index 1fbd3e976..000000000 --- a/vendor/google.golang.org/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at https://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/init.go b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/init.go new file mode 100644 index 000000000..369df13da --- /dev/null +++ b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/init.go @@ -0,0 +1,168 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal_gengo + +import ( + "unicode" + "unicode/utf8" + + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/encoding/protowire" + + "google.golang.org/protobuf/types/descriptorpb" +) + +type fileInfo struct { + *protogen.File + + allEnums []*enumInfo + allMessages []*messageInfo + allExtensions []*extensionInfo + + allEnumsByPtr map[*enumInfo]int // value is index into allEnums + allMessagesByPtr map[*messageInfo]int // value is index into allMessages + allMessageFieldsByPtr map[*messageInfo]*structFields + + // needRawDesc specifies whether the generator should emit logic to provide + // the legacy raw descriptor in GZIP'd form. + // This is updated by enum and message generation logic as necessary, + // and checked at the end of file generation. + needRawDesc bool +} + +type structFields struct { + count int + unexported map[int]string +} + +func (sf *structFields) append(name string) { + if r, _ := utf8.DecodeRuneInString(name); !unicode.IsUpper(r) { + if sf.unexported == nil { + sf.unexported = make(map[int]string) + } + sf.unexported[sf.count] = name + } + sf.count++ +} + +func newFileInfo(file *protogen.File) *fileInfo { + f := &fileInfo{File: file} + + // Collect all enums, messages, and extensions in "flattened ordering". + // See filetype.TypeBuilder. + var walkMessages func([]*protogen.Message, func(*protogen.Message)) + walkMessages = func(messages []*protogen.Message, f func(*protogen.Message)) { + for _, m := range messages { + f(m) + walkMessages(m.Messages, f) + } + } + initEnumInfos := func(enums []*protogen.Enum) { + for _, enum := range enums { + f.allEnums = append(f.allEnums, newEnumInfo(f, enum)) + } + } + initMessageInfos := func(messages []*protogen.Message) { + for _, message := range messages { + f.allMessages = append(f.allMessages, newMessageInfo(f, message)) + } + } + initExtensionInfos := func(extensions []*protogen.Extension) { + for _, extension := range extensions { + f.allExtensions = append(f.allExtensions, newExtensionInfo(f, extension)) + } + } + initEnumInfos(f.Enums) + initMessageInfos(f.Messages) + initExtensionInfos(f.Extensions) + walkMessages(f.Messages, func(m *protogen.Message) { + initEnumInfos(m.Enums) + initMessageInfos(m.Messages) + initExtensionInfos(m.Extensions) + }) + + // Derive a reverse mapping of enum and message pointers to their index + // in allEnums and allMessages. + if len(f.allEnums) > 0 { + f.allEnumsByPtr = make(map[*enumInfo]int) + for i, e := range f.allEnums { + f.allEnumsByPtr[e] = i + } + } + if len(f.allMessages) > 0 { + f.allMessagesByPtr = make(map[*messageInfo]int) + f.allMessageFieldsByPtr = make(map[*messageInfo]*structFields) + for i, m := range f.allMessages { + f.allMessagesByPtr[m] = i + f.allMessageFieldsByPtr[m] = new(structFields) + } + } + + return f +} + +type enumInfo struct { + *protogen.Enum + + genJSONMethod bool + genRawDescMethod bool +} + +func newEnumInfo(f *fileInfo, enum *protogen.Enum) *enumInfo { + e := &enumInfo{Enum: enum} + e.genJSONMethod = true + e.genRawDescMethod = true + return e +} + +type messageInfo struct { + *protogen.Message + + genRawDescMethod bool + genExtRangeMethod bool + + isTracked bool + hasWeak bool +} + +func newMessageInfo(f *fileInfo, message *protogen.Message) *messageInfo { + m := &messageInfo{Message: message} + m.genRawDescMethod = true + m.genExtRangeMethod = true + m.isTracked = isTrackedMessage(m) + for _, field := range m.Fields { + m.hasWeak = m.hasWeak || field.Desc.IsWeak() + } + return m +} + +// isTrackedMessage reports whether field tracking is enabled on the message. +func isTrackedMessage(m *messageInfo) (tracked bool) { + const trackFieldUse_fieldNumber = 37383685 + + // Decode the option from unknown fields to avoid a dependency on the + // annotation proto from protoc-gen-go. + b := m.Desc.Options().(*descriptorpb.MessageOptions).ProtoReflect().GetUnknown() + for len(b) > 0 { + num, typ, n := protowire.ConsumeTag(b) + b = b[n:] + if num == trackFieldUse_fieldNumber && typ == protowire.VarintType { + v, _ := protowire.ConsumeVarint(b) + tracked = protowire.DecodeBool(v) + } + m := protowire.ConsumeFieldValue(num, typ, b) + b = b[m:] + } + return tracked +} + +type extensionInfo struct { + *protogen.Extension +} + +func newExtensionInfo(f *fileInfo, extension *protogen.Extension) *extensionInfo { + x := &extensionInfo{Extension: extension} + return x +} diff --git a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go new file mode 100644 index 000000000..d34efa9b1 --- /dev/null +++ b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go @@ -0,0 +1,884 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package internal_gengo is internal to the protobuf module. +package internal_gengo + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "math" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/internal/encoding/tag" + "google.golang.org/protobuf/internal/genid" + "google.golang.org/protobuf/internal/version" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoimpl" + + "google.golang.org/protobuf/types/descriptorpb" + "google.golang.org/protobuf/types/pluginpb" +) + +// SupportedFeatures reports the set of supported protobuf language features. +var SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL) + +// GenerateVersionMarkers specifies whether to generate version markers. +var GenerateVersionMarkers = true + +// Standard library dependencies. +const ( + base64Package = protogen.GoImportPath("encoding/base64") + mathPackage = protogen.GoImportPath("math") + reflectPackage = protogen.GoImportPath("reflect") + sortPackage = protogen.GoImportPath("sort") + stringsPackage = protogen.GoImportPath("strings") + syncPackage = protogen.GoImportPath("sync") + timePackage = protogen.GoImportPath("time") + utf8Package = protogen.GoImportPath("unicode/utf8") +) + +// Protobuf library dependencies. +// +// These are declared as an interface type so that they can be more easily +// patched to support unique build environments that impose restrictions +// on the dependencies of generated source code. +var ( + protoPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/proto") + protoifacePackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/runtime/protoiface") + protoimplPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/runtime/protoimpl") + protojsonPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/encoding/protojson") + protoreflectPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/reflect/protoreflect") + protoregistryPackage goImportPath = protogen.GoImportPath("google.golang.org/protobuf/reflect/protoregistry") +) + +type goImportPath interface { + String() string + Ident(string) protogen.GoIdent +} + +// GenerateFile generates the contents of a .pb.go file. +func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.GeneratedFile { + filename := file.GeneratedFilenamePrefix + ".pb.go" + g := gen.NewGeneratedFile(filename, file.GoImportPath) + f := newFileInfo(file) + + genStandaloneComments(g, f, int32(genid.FileDescriptorProto_Syntax_field_number)) + genGeneratedHeader(gen, g, f) + genStandaloneComments(g, f, int32(genid.FileDescriptorProto_Package_field_number)) + + packageDoc := genPackageKnownComment(f) + g.P(packageDoc, "package ", f.GoPackageName) + g.P() + + // Emit a static check that enforces a minimum version of the proto package. + if GenerateVersionMarkers { + g.P("const (") + g.P("// Verify that this generated code is sufficiently up-to-date.") + g.P("_ = ", protoimplPackage.Ident("EnforceVersion"), "(", protoimpl.GenVersion, " - ", protoimplPackage.Ident("MinVersion"), ")") + g.P("// Verify that runtime/protoimpl is sufficiently up-to-date.") + g.P("_ = ", protoimplPackage.Ident("EnforceVersion"), "(", protoimplPackage.Ident("MaxVersion"), " - ", protoimpl.GenVersion, ")") + g.P(")") + g.P() + } + + for i, imps := 0, f.Desc.Imports(); i < imps.Len(); i++ { + genImport(gen, g, f, imps.Get(i)) + } + for _, enum := range f.allEnums { + genEnum(g, f, enum) + } + for _, message := range f.allMessages { + genMessage(g, f, message) + } + genExtensions(g, f) + + genReflectFileDescriptor(gen, g, f) + + return g +} + +// genStandaloneComments prints all leading comments for a FileDescriptorProto +// location identified by the field number n. +func genStandaloneComments(g *protogen.GeneratedFile, f *fileInfo, n int32) { + loc := f.Desc.SourceLocations().ByPath(protoreflect.SourcePath{n}) + for _, s := range loc.LeadingDetachedComments { + g.P(protogen.Comments(s)) + g.P() + } + if s := loc.LeadingComments; s != "" { + g.P(protogen.Comments(s)) + g.P() + } +} + +func genGeneratedHeader(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo) { + g.P("// Code generated by protoc-gen-go. DO NOT EDIT.") + + if GenerateVersionMarkers { + g.P("// versions:") + protocGenGoVersion := version.String() + protocVersion := "(unknown)" + if v := gen.Request.GetCompilerVersion(); v != nil { + protocVersion = fmt.Sprintf("v%v.%v.%v", v.GetMajor(), v.GetMinor(), v.GetPatch()) + if s := v.GetSuffix(); s != "" { + protocVersion += "-" + s + } + } + g.P("// \tprotoc-gen-go ", protocGenGoVersion) + g.P("// \tprotoc ", protocVersion) + } + + if f.Proto.GetOptions().GetDeprecated() { + g.P("// ", f.Desc.Path(), " is a deprecated file.") + } else { + g.P("// source: ", f.Desc.Path()) + } + g.P() +} + +func genImport(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo, imp protoreflect.FileImport) { + impFile, ok := gen.FilesByPath[imp.Path()] + if !ok { + return + } + if impFile.GoImportPath == f.GoImportPath { + // Don't generate imports or aliases for types in the same Go package. + return + } + // Generate imports for all non-weak dependencies, even if they are not + // referenced, because other code and tools depend on having the + // full transitive closure of protocol buffer types in the binary. + if !imp.IsWeak { + g.Import(impFile.GoImportPath) + } + if !imp.IsPublic { + return + } + + // Generate public imports by generating the imported file, parsing it, + // and extracting every symbol that should receive a forwarding declaration. + impGen := GenerateFile(gen, impFile) + impGen.Skip() + b, err := impGen.Content() + if err != nil { + gen.Error(err) + return + } + fset := token.NewFileSet() + astFile, err := parser.ParseFile(fset, "", b, parser.ParseComments) + if err != nil { + gen.Error(err) + return + } + genForward := func(tok token.Token, name string, expr ast.Expr) { + // Don't import unexported symbols. + r, _ := utf8.DecodeRuneInString(name) + if !unicode.IsUpper(r) { + return + } + // Don't import the FileDescriptor. + if name == impFile.GoDescriptorIdent.GoName { + return + } + // Don't import decls referencing a symbol defined in another package. + // i.e., don't import decls which are themselves public imports: + // + // type T = somepackage.T + if _, ok := expr.(*ast.SelectorExpr); ok { + return + } + g.P(tok, " ", name, " = ", impFile.GoImportPath.Ident(name)) + } + g.P("// Symbols defined in public import of ", imp.Path(), ".") + g.P() + for _, decl := range astFile.Decls { + switch decl := decl.(type) { + case *ast.GenDecl: + for _, spec := range decl.Specs { + switch spec := spec.(type) { + case *ast.TypeSpec: + genForward(decl.Tok, spec.Name.Name, spec.Type) + case *ast.ValueSpec: + for i, name := range spec.Names { + var expr ast.Expr + if i < len(spec.Values) { + expr = spec.Values[i] + } + genForward(decl.Tok, name.Name, expr) + } + case *ast.ImportSpec: + default: + panic(fmt.Sprintf("can't generate forward for spec type %T", spec)) + } + } + } + } + g.P() +} + +func genEnum(g *protogen.GeneratedFile, f *fileInfo, e *enumInfo) { + // Enum type declaration. + g.Annotate(e.GoIdent.GoName, e.Location) + leadingComments := appendDeprecationSuffix(e.Comments.Leading, + e.Desc.Options().(*descriptorpb.EnumOptions).GetDeprecated()) + g.P(leadingComments, + "type ", e.GoIdent, " int32") + + // Enum value constants. + g.P("const (") + for _, value := range e.Values { + g.Annotate(value.GoIdent.GoName, value.Location) + leadingComments := appendDeprecationSuffix(value.Comments.Leading, + value.Desc.Options().(*descriptorpb.EnumValueOptions).GetDeprecated()) + g.P(leadingComments, + value.GoIdent, " ", e.GoIdent, " = ", value.Desc.Number(), + trailingComment(value.Comments.Trailing)) + } + g.P(")") + g.P() + + // Enum value maps. + g.P("// Enum value maps for ", e.GoIdent, ".") + g.P("var (") + g.P(e.GoIdent.GoName+"_name", " = map[int32]string{") + for _, value := range e.Values { + duplicate := "" + if value.Desc != e.Desc.Values().ByNumber(value.Desc.Number()) { + duplicate = "// Duplicate value: " + } + g.P(duplicate, value.Desc.Number(), ": ", strconv.Quote(string(value.Desc.Name())), ",") + } + g.P("}") + g.P(e.GoIdent.GoName+"_value", " = map[string]int32{") + for _, value := range e.Values { + g.P(strconv.Quote(string(value.Desc.Name())), ": ", value.Desc.Number(), ",") + } + g.P("}") + g.P(")") + g.P() + + // Enum method. + // + // NOTE: A pointer value is needed to represent presence in proto2. + // Since a proto2 message can reference a proto3 enum, it is useful to + // always generate this method (even on proto3 enums) to support that case. + g.P("func (x ", e.GoIdent, ") Enum() *", e.GoIdent, " {") + g.P("p := new(", e.GoIdent, ")") + g.P("*p = x") + g.P("return p") + g.P("}") + g.P() + + // String method. + g.P("func (x ", e.GoIdent, ") String() string {") + g.P("return ", protoimplPackage.Ident("X"), ".EnumStringOf(x.Descriptor(), ", protoreflectPackage.Ident("EnumNumber"), "(x))") + g.P("}") + g.P() + + genEnumReflectMethods(g, f, e) + + // UnmarshalJSON method. + if e.genJSONMethod && e.Desc.Syntax() == protoreflect.Proto2 { + g.P("// Deprecated: Do not use.") + g.P("func (x *", e.GoIdent, ") UnmarshalJSON(b []byte) error {") + g.P("num, err := ", protoimplPackage.Ident("X"), ".UnmarshalJSONEnum(x.Descriptor(), b)") + g.P("if err != nil {") + g.P("return err") + g.P("}") + g.P("*x = ", e.GoIdent, "(num)") + g.P("return nil") + g.P("}") + g.P() + } + + // EnumDescriptor method. + if e.genRawDescMethod { + var indexes []string + for i := 1; i < len(e.Location.Path); i += 2 { + indexes = append(indexes, strconv.Itoa(int(e.Location.Path[i]))) + } + g.P("// Deprecated: Use ", e.GoIdent, ".Descriptor instead.") + g.P("func (", e.GoIdent, ") EnumDescriptor() ([]byte, []int) {") + g.P("return ", rawDescVarName(f), "GZIP(), []int{", strings.Join(indexes, ","), "}") + g.P("}") + g.P() + f.needRawDesc = true + } +} + +func genMessage(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + if m.Desc.IsMapEntry() { + return + } + + // Message type declaration. + g.Annotate(m.GoIdent.GoName, m.Location) + leadingComments := appendDeprecationSuffix(m.Comments.Leading, + m.Desc.Options().(*descriptorpb.MessageOptions).GetDeprecated()) + g.P(leadingComments, + "type ", m.GoIdent, " struct {") + genMessageFields(g, f, m) + g.P("}") + g.P() + + genMessageKnownFunctions(g, f, m) + genMessageDefaultDecls(g, f, m) + genMessageMethods(g, f, m) + genMessageOneofWrapperTypes(g, f, m) +} + +func genMessageFields(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + sf := f.allMessageFieldsByPtr[m] + genMessageInternalFields(g, f, m, sf) + for _, field := range m.Fields { + genMessageField(g, f, m, field, sf) + } +} + +func genMessageInternalFields(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo, sf *structFields) { + g.P(genid.State_goname, " ", protoimplPackage.Ident("MessageState")) + sf.append(genid.State_goname) + g.P(genid.SizeCache_goname, " ", protoimplPackage.Ident("SizeCache")) + sf.append(genid.SizeCache_goname) + if m.hasWeak { + g.P(genid.WeakFields_goname, " ", protoimplPackage.Ident("WeakFields")) + sf.append(genid.WeakFields_goname) + } + g.P(genid.UnknownFields_goname, " ", protoimplPackage.Ident("UnknownFields")) + sf.append(genid.UnknownFields_goname) + if m.Desc.ExtensionRanges().Len() > 0 { + g.P(genid.ExtensionFields_goname, " ", protoimplPackage.Ident("ExtensionFields")) + sf.append(genid.ExtensionFields_goname) + } + if sf.count > 0 { + g.P() + } +} + +func genMessageField(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo, field *protogen.Field, sf *structFields) { + if oneof := field.Oneof; oneof != nil && !oneof.Desc.IsSynthetic() { + // It would be a bit simpler to iterate over the oneofs below, + // but generating the field here keeps the contents of the Go + // struct in the same order as the contents of the source + // .proto file. + if oneof.Fields[0] != field { + return // only generate for first appearance + } + + tags := structTags{ + {"protobuf_oneof", string(oneof.Desc.Name())}, + } + if m.isTracked { + tags = append(tags, gotrackTags...) + } + + g.Annotate(m.GoIdent.GoName+"."+oneof.GoName, oneof.Location) + leadingComments := oneof.Comments.Leading + if leadingComments != "" { + leadingComments += "\n" + } + ss := []string{fmt.Sprintf(" Types that are assignable to %s:\n", oneof.GoName)} + for _, field := range oneof.Fields { + ss = append(ss, "\t*"+field.GoIdent.GoName+"\n") + } + leadingComments += protogen.Comments(strings.Join(ss, "")) + g.P(leadingComments, + oneof.GoName, " ", oneofInterfaceName(oneof), tags) + sf.append(oneof.GoName) + return + } + goType, pointer := fieldGoType(g, f, field) + if pointer { + goType = "*" + goType + } + tags := structTags{ + {"protobuf", fieldProtobufTagValue(field)}, + {"json", fieldJSONTagValue(field)}, + } + if field.Desc.IsMap() { + key := field.Message.Fields[0] + val := field.Message.Fields[1] + tags = append(tags, structTags{ + {"protobuf_key", fieldProtobufTagValue(key)}, + {"protobuf_val", fieldProtobufTagValue(val)}, + }...) + } + if m.isTracked { + tags = append(tags, gotrackTags...) + } + + name := field.GoName + if field.Desc.IsWeak() { + name = genid.WeakFieldPrefix_goname + name + } + g.Annotate(m.GoIdent.GoName+"."+name, field.Location) + leadingComments := appendDeprecationSuffix(field.Comments.Leading, + field.Desc.Options().(*descriptorpb.FieldOptions).GetDeprecated()) + g.P(leadingComments, + name, " ", goType, tags, + trailingComment(field.Comments.Trailing)) + sf.append(field.GoName) +} + +// genMessageDefaultDecls generates consts and vars holding the default +// values of fields. +func genMessageDefaultDecls(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + var consts, vars []string + for _, field := range m.Fields { + if !field.Desc.HasDefault() { + continue + } + name := "Default_" + m.GoIdent.GoName + "_" + field.GoName + goType, _ := fieldGoType(g, f, field) + defVal := field.Desc.Default() + switch field.Desc.Kind() { + case protoreflect.StringKind: + consts = append(consts, fmt.Sprintf("%s = %s(%q)", name, goType, defVal.String())) + case protoreflect.BytesKind: + vars = append(vars, fmt.Sprintf("%s = %s(%q)", name, goType, defVal.Bytes())) + case protoreflect.EnumKind: + idx := field.Desc.DefaultEnumValue().Index() + val := field.Enum.Values[idx] + if val.GoIdent.GoImportPath == f.GoImportPath { + consts = append(consts, fmt.Sprintf("%s = %s", name, g.QualifiedGoIdent(val.GoIdent))) + } else { + // If the enum value is declared in a different Go package, + // reference it by number since the name may not be correct. + // See https://github.com/golang/protobuf/issues/513. + consts = append(consts, fmt.Sprintf("%s = %s(%d) // %s", + name, g.QualifiedGoIdent(field.Enum.GoIdent), val.Desc.Number(), g.QualifiedGoIdent(val.GoIdent))) + } + case protoreflect.FloatKind, protoreflect.DoubleKind: + if f := defVal.Float(); math.IsNaN(f) || math.IsInf(f, 0) { + var fn, arg string + switch f := defVal.Float(); { + case math.IsInf(f, -1): + fn, arg = g.QualifiedGoIdent(mathPackage.Ident("Inf")), "-1" + case math.IsInf(f, +1): + fn, arg = g.QualifiedGoIdent(mathPackage.Ident("Inf")), "+1" + case math.IsNaN(f): + fn, arg = g.QualifiedGoIdent(mathPackage.Ident("NaN")), "" + } + vars = append(vars, fmt.Sprintf("%s = %s(%s(%s))", name, goType, fn, arg)) + } else { + consts = append(consts, fmt.Sprintf("%s = %s(%v)", name, goType, f)) + } + default: + consts = append(consts, fmt.Sprintf("%s = %s(%v)", name, goType, defVal.Interface())) + } + } + if len(consts) > 0 { + g.P("// Default values for ", m.GoIdent, " fields.") + g.P("const (") + for _, s := range consts { + g.P(s) + } + g.P(")") + } + if len(vars) > 0 { + g.P("// Default values for ", m.GoIdent, " fields.") + g.P("var (") + for _, s := range vars { + g.P(s) + } + g.P(")") + } + g.P() +} + +func genMessageMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + genMessageBaseMethods(g, f, m) + genMessageGetterMethods(g, f, m) + genMessageSetterMethods(g, f, m) +} + +func genMessageBaseMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + // Reset method. + g.P("func (x *", m.GoIdent, ") Reset() {") + g.P("*x = ", m.GoIdent, "{}") + g.P("if ", protoimplPackage.Ident("UnsafeEnabled"), " {") + g.P("mi := &", messageTypesVarName(f), "[", f.allMessagesByPtr[m], "]") + g.P("ms := ", protoimplPackage.Ident("X"), ".MessageStateOf(", protoimplPackage.Ident("Pointer"), "(x))") + g.P("ms.StoreMessageInfo(mi)") + g.P("}") + g.P("}") + g.P() + + // String method. + g.P("func (x *", m.GoIdent, ") String() string {") + g.P("return ", protoimplPackage.Ident("X"), ".MessageStringOf(x)") + g.P("}") + g.P() + + // ProtoMessage method. + g.P("func (*", m.GoIdent, ") ProtoMessage() {}") + g.P() + + // ProtoReflect method. + genMessageReflectMethods(g, f, m) + + // Descriptor method. + if m.genRawDescMethod { + var indexes []string + for i := 1; i < len(m.Location.Path); i += 2 { + indexes = append(indexes, strconv.Itoa(int(m.Location.Path[i]))) + } + g.P("// Deprecated: Use ", m.GoIdent, ".ProtoReflect.Descriptor instead.") + g.P("func (*", m.GoIdent, ") Descriptor() ([]byte, []int) {") + g.P("return ", rawDescVarName(f), "GZIP(), []int{", strings.Join(indexes, ","), "}") + g.P("}") + g.P() + f.needRawDesc = true + } +} + +func genMessageGetterMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + for _, field := range m.Fields { + genNoInterfacePragma(g, m.isTracked) + + // Getter for parent oneof. + if oneof := field.Oneof; oneof != nil && oneof.Fields[0] == field && !oneof.Desc.IsSynthetic() { + g.Annotate(m.GoIdent.GoName+".Get"+oneof.GoName, oneof.Location) + g.P("func (m *", m.GoIdent.GoName, ") Get", oneof.GoName, "() ", oneofInterfaceName(oneof), " {") + g.P("if m != nil {") + g.P("return m.", oneof.GoName) + g.P("}") + g.P("return nil") + g.P("}") + g.P() + } + + // Getter for message field. + goType, pointer := fieldGoType(g, f, field) + defaultValue := fieldDefaultValue(g, f, m, field) + g.Annotate(m.GoIdent.GoName+".Get"+field.GoName, field.Location) + leadingComments := appendDeprecationSuffix("", + field.Desc.Options().(*descriptorpb.FieldOptions).GetDeprecated()) + switch { + case field.Desc.IsWeak(): + g.P(leadingComments, "func (x *", m.GoIdent, ") Get", field.GoName, "() ", protoPackage.Ident("Message"), "{") + g.P("var w ", protoimplPackage.Ident("WeakFields")) + g.P("if x != nil {") + g.P("w = x.", genid.WeakFields_goname) + if m.isTracked { + g.P("_ = x.", genid.WeakFieldPrefix_goname+field.GoName) + } + g.P("}") + g.P("return ", protoimplPackage.Ident("X"), ".GetWeak(w, ", field.Desc.Number(), ", ", strconv.Quote(string(field.Message.Desc.FullName())), ")") + g.P("}") + case field.Oneof != nil && !field.Oneof.Desc.IsSynthetic(): + g.P(leadingComments, "func (x *", m.GoIdent, ") Get", field.GoName, "() ", goType, " {") + g.P("if x, ok := x.Get", field.Oneof.GoName, "().(*", field.GoIdent, "); ok {") + g.P("return x.", field.GoName) + g.P("}") + g.P("return ", defaultValue) + g.P("}") + default: + g.P(leadingComments, "func (x *", m.GoIdent, ") Get", field.GoName, "() ", goType, " {") + if !field.Desc.HasPresence() || defaultValue == "nil" { + g.P("if x != nil {") + } else { + g.P("if x != nil && x.", field.GoName, " != nil {") + } + star := "" + if pointer { + star = "*" + } + g.P("return ", star, " x.", field.GoName) + g.P("}") + g.P("return ", defaultValue) + g.P("}") + } + g.P() + } +} + +func genMessageSetterMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + for _, field := range m.Fields { + if !field.Desc.IsWeak() { + continue + } + + genNoInterfacePragma(g, m.isTracked) + + g.Annotate(m.GoIdent.GoName+".Set"+field.GoName, field.Location) + leadingComments := appendDeprecationSuffix("", + field.Desc.Options().(*descriptorpb.FieldOptions).GetDeprecated()) + g.P(leadingComments, "func (x *", m.GoIdent, ") Set", field.GoName, "(v ", protoPackage.Ident("Message"), ") {") + g.P("var w *", protoimplPackage.Ident("WeakFields")) + g.P("if x != nil {") + g.P("w = &x.", genid.WeakFields_goname) + if m.isTracked { + g.P("_ = x.", genid.WeakFieldPrefix_goname+field.GoName) + } + g.P("}") + g.P(protoimplPackage.Ident("X"), ".SetWeak(w, ", field.Desc.Number(), ", ", strconv.Quote(string(field.Message.Desc.FullName())), ", v)") + g.P("}") + g.P() + } +} + +// fieldGoType returns the Go type used for a field. +// +// If it returns pointer=true, the struct field is a pointer to the type. +func fieldGoType(g *protogen.GeneratedFile, f *fileInfo, field *protogen.Field) (goType string, pointer bool) { + if field.Desc.IsWeak() { + return "struct{}", false + } + + pointer = field.Desc.HasPresence() + switch field.Desc.Kind() { + case protoreflect.BoolKind: + goType = "bool" + case protoreflect.EnumKind: + goType = g.QualifiedGoIdent(field.Enum.GoIdent) + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: + goType = "int32" + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: + goType = "uint32" + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: + goType = "int64" + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: + goType = "uint64" + case protoreflect.FloatKind: + goType = "float32" + case protoreflect.DoubleKind: + goType = "float64" + case protoreflect.StringKind: + goType = "string" + case protoreflect.BytesKind: + goType = "[]byte" + pointer = false // rely on nullability of slices for presence + case protoreflect.MessageKind, protoreflect.GroupKind: + goType = "*" + g.QualifiedGoIdent(field.Message.GoIdent) + pointer = false // pointer captured as part of the type + } + switch { + case field.Desc.IsList(): + return "[]" + goType, false + case field.Desc.IsMap(): + keyType, _ := fieldGoType(g, f, field.Message.Fields[0]) + valType, _ := fieldGoType(g, f, field.Message.Fields[1]) + return fmt.Sprintf("map[%v]%v", keyType, valType), false + } + return goType, pointer +} + +func fieldProtobufTagValue(field *protogen.Field) string { + var enumName string + if field.Desc.Kind() == protoreflect.EnumKind { + enumName = protoimpl.X.LegacyEnumName(field.Enum.Desc) + } + return tag.Marshal(field.Desc, enumName) +} + +func fieldDefaultValue(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo, field *protogen.Field) string { + if field.Desc.IsList() { + return "nil" + } + if field.Desc.HasDefault() { + defVarName := "Default_" + m.GoIdent.GoName + "_" + field.GoName + if field.Desc.Kind() == protoreflect.BytesKind { + return "append([]byte(nil), " + defVarName + "...)" + } + return defVarName + } + switch field.Desc.Kind() { + case protoreflect.BoolKind: + return "false" + case protoreflect.StringKind: + return `""` + case protoreflect.MessageKind, protoreflect.GroupKind, protoreflect.BytesKind: + return "nil" + case protoreflect.EnumKind: + val := field.Enum.Values[0] + if val.GoIdent.GoImportPath == f.GoImportPath { + return g.QualifiedGoIdent(val.GoIdent) + } else { + // If the enum value is declared in a different Go package, + // reference it by number since the name may not be correct. + // See https://github.com/golang/protobuf/issues/513. + return g.QualifiedGoIdent(field.Enum.GoIdent) + "(" + strconv.FormatInt(int64(val.Desc.Number()), 10) + ")" + } + default: + return "0" + } +} + +func fieldJSONTagValue(field *protogen.Field) string { + return string(field.Desc.Name()) + ",omitempty" +} + +func genExtensions(g *protogen.GeneratedFile, f *fileInfo) { + if len(f.allExtensions) == 0 { + return + } + + g.P("var ", extensionTypesVarName(f), " = []", protoimplPackage.Ident("ExtensionInfo"), "{") + for _, x := range f.allExtensions { + g.P("{") + g.P("ExtendedType: (*", x.Extendee.GoIdent, ")(nil),") + goType, pointer := fieldGoType(g, f, x.Extension) + if pointer { + goType = "*" + goType + } + g.P("ExtensionType: (", goType, ")(nil),") + g.P("Field: ", x.Desc.Number(), ",") + g.P("Name: ", strconv.Quote(string(x.Desc.FullName())), ",") + g.P("Tag: ", strconv.Quote(fieldProtobufTagValue(x.Extension)), ",") + g.P("Filename: ", strconv.Quote(f.Desc.Path()), ",") + g.P("},") + } + g.P("}") + g.P() + + // Group extensions by the target message. + var orderedTargets []protogen.GoIdent + allExtensionsByTarget := make(map[protogen.GoIdent][]*extensionInfo) + allExtensionsByPtr := make(map[*extensionInfo]int) + for i, x := range f.allExtensions { + target := x.Extendee.GoIdent + if len(allExtensionsByTarget[target]) == 0 { + orderedTargets = append(orderedTargets, target) + } + allExtensionsByTarget[target] = append(allExtensionsByTarget[target], x) + allExtensionsByPtr[x] = i + } + for _, target := range orderedTargets { + g.P("// Extension fields to ", target, ".") + g.P("var (") + for _, x := range allExtensionsByTarget[target] { + xd := x.Desc + typeName := xd.Kind().String() + switch xd.Kind() { + case protoreflect.EnumKind: + typeName = string(xd.Enum().FullName()) + case protoreflect.MessageKind, protoreflect.GroupKind: + typeName = string(xd.Message().FullName()) + } + fieldName := string(xd.Name()) + + leadingComments := x.Comments.Leading + if leadingComments != "" { + leadingComments += "\n" + } + leadingComments += protogen.Comments(fmt.Sprintf(" %v %v %v = %v;\n", + xd.Cardinality(), typeName, fieldName, xd.Number())) + leadingComments = appendDeprecationSuffix(leadingComments, + x.Desc.Options().(*descriptorpb.FieldOptions).GetDeprecated()) + g.P(leadingComments, + "E_", x.GoIdent, " = &", extensionTypesVarName(f), "[", allExtensionsByPtr[x], "]", + trailingComment(x.Comments.Trailing)) + } + g.P(")") + g.P() + } +} + +// genMessageOneofWrapperTypes generates the oneof wrapper types and +// associates the types with the parent message type. +func genMessageOneofWrapperTypes(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + for _, oneof := range m.Oneofs { + if oneof.Desc.IsSynthetic() { + continue + } + ifName := oneofInterfaceName(oneof) + g.P("type ", ifName, " interface {") + g.P(ifName, "()") + g.P("}") + g.P() + for _, field := range oneof.Fields { + g.Annotate(field.GoIdent.GoName, field.Location) + g.Annotate(field.GoIdent.GoName+"."+field.GoName, field.Location) + g.P("type ", field.GoIdent, " struct {") + goType, _ := fieldGoType(g, f, field) + tags := structTags{ + {"protobuf", fieldProtobufTagValue(field)}, + } + if m.isTracked { + tags = append(tags, gotrackTags...) + } + leadingComments := appendDeprecationSuffix(field.Comments.Leading, + field.Desc.Options().(*descriptorpb.FieldOptions).GetDeprecated()) + g.P(leadingComments, + field.GoName, " ", goType, tags, + trailingComment(field.Comments.Trailing)) + g.P("}") + g.P() + } + for _, field := range oneof.Fields { + g.P("func (*", field.GoIdent, ") ", ifName, "() {}") + g.P() + } + } +} + +// oneofInterfaceName returns the name of the interface type implemented by +// the oneof field value types. +func oneofInterfaceName(oneof *protogen.Oneof) string { + return "is" + oneof.GoIdent.GoName +} + +// genNoInterfacePragma generates a standalone "nointerface" pragma to +// decorate methods with field-tracking support. +func genNoInterfacePragma(g *protogen.GeneratedFile, tracked bool) { + if tracked { + g.P("//go:nointerface") + g.P() + } +} + +var gotrackTags = structTags{{"go", "track"}} + +// structTags is a data structure for build idiomatic Go struct tags. +// Each [2]string is a key-value pair, where value is the unescaped string. +// +// Example: structTags{{"key", "value"}}.String() -> `key:"value"` +type structTags [][2]string + +func (tags structTags) String() string { + if len(tags) == 0 { + return "" + } + var ss []string + for _, tag := range tags { + // NOTE: When quoting the value, we need to make sure the backtick + // character does not appear. Convert all cases to the escaped hex form. + key := tag[0] + val := strings.Replace(strconv.Quote(tag[1]), "`", `\x60`, -1) + ss = append(ss, fmt.Sprintf("%s:%s", key, val)) + } + return "`" + strings.Join(ss, " ") + "`" +} + +// appendDeprecationSuffix optionally appends a deprecation notice as a suffix. +func appendDeprecationSuffix(prefix protogen.Comments, deprecated bool) protogen.Comments { + if !deprecated { + return prefix + } + if prefix != "" { + prefix += "\n" + } + return prefix + " Deprecated: Do not use.\n" +} + +// trailingComment is like protogen.Comments, but lacks a trailing newline. +type trailingComment protogen.Comments + +func (c trailingComment) String() string { + s := strings.TrimSuffix(protogen.Comments(c).String(), "\n") + if strings.Contains(s, "\n") { + // We don't support multi-lined trailing comments as it is unclear + // how to best render them in the generated code. + return "" + } + return s +} diff --git a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/reflect.go b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/reflect.go new file mode 100644 index 000000000..1319a1267 --- /dev/null +++ b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/reflect.go @@ -0,0 +1,351 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal_gengo + +import ( + "fmt" + "math" + "strings" + "unicode/utf8" + + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" + + "google.golang.org/protobuf/types/descriptorpb" +) + +func genReflectFileDescriptor(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo) { + g.P("var ", f.GoDescriptorIdent, " ", protoreflectPackage.Ident("FileDescriptor")) + g.P() + + genFileDescriptor(gen, g, f) + if len(f.allEnums) > 0 { + g.P("var ", enumTypesVarName(f), " = make([]", protoimplPackage.Ident("EnumInfo"), ",", len(f.allEnums), ")") + } + if len(f.allMessages) > 0 { + g.P("var ", messageTypesVarName(f), " = make([]", protoimplPackage.Ident("MessageInfo"), ",", len(f.allMessages), ")") + } + + // Generate a unique list of Go types for all declarations and dependencies, + // and the associated index into the type list for all dependencies. + var goTypes []string + var depIdxs []string + seen := map[protoreflect.FullName]int{} + genDep := func(name protoreflect.FullName, depSource string) { + if depSource != "" { + line := fmt.Sprintf("%d, // %d: %s -> %s", seen[name], len(depIdxs), depSource, name) + depIdxs = append(depIdxs, line) + } + } + genEnum := func(e *protogen.Enum, depSource string) { + if e != nil { + name := e.Desc.FullName() + if _, ok := seen[name]; !ok { + line := fmt.Sprintf("(%s)(0), // %d: %s", g.QualifiedGoIdent(e.GoIdent), len(goTypes), name) + goTypes = append(goTypes, line) + seen[name] = len(seen) + } + if depSource != "" { + genDep(name, depSource) + } + } + } + genMessage := func(m *protogen.Message, depSource string) { + if m != nil { + name := m.Desc.FullName() + if _, ok := seen[name]; !ok { + line := fmt.Sprintf("(*%s)(nil), // %d: %s", g.QualifiedGoIdent(m.GoIdent), len(goTypes), name) + if m.Desc.IsMapEntry() { + // Map entry messages have no associated Go type. + line = fmt.Sprintf("nil, // %d: %s", len(goTypes), name) + } + goTypes = append(goTypes, line) + seen[name] = len(seen) + } + if depSource != "" { + genDep(name, depSource) + } + } + } + + // This ordering is significant. + // See filetype.TypeBuilder.DependencyIndexes. + type offsetEntry struct { + start int + name string + } + var depOffsets []offsetEntry + for _, enum := range f.allEnums { + genEnum(enum.Enum, "") + } + for _, message := range f.allMessages { + genMessage(message.Message, "") + } + depOffsets = append(depOffsets, offsetEntry{len(depIdxs), "field type_name"}) + for _, message := range f.allMessages { + for _, field := range message.Fields { + if field.Desc.IsWeak() { + continue + } + source := string(field.Desc.FullName()) + genEnum(field.Enum, source+":type_name") + genMessage(field.Message, source+":type_name") + } + } + depOffsets = append(depOffsets, offsetEntry{len(depIdxs), "extension extendee"}) + for _, extension := range f.allExtensions { + source := string(extension.Desc.FullName()) + genMessage(extension.Extendee, source+":extendee") + } + depOffsets = append(depOffsets, offsetEntry{len(depIdxs), "extension type_name"}) + for _, extension := range f.allExtensions { + source := string(extension.Desc.FullName()) + genEnum(extension.Enum, source+":type_name") + genMessage(extension.Message, source+":type_name") + } + depOffsets = append(depOffsets, offsetEntry{len(depIdxs), "method input_type"}) + for _, service := range f.Services { + for _, method := range service.Methods { + source := string(method.Desc.FullName()) + genMessage(method.Input, source+":input_type") + } + } + depOffsets = append(depOffsets, offsetEntry{len(depIdxs), "method output_type"}) + for _, service := range f.Services { + for _, method := range service.Methods { + source := string(method.Desc.FullName()) + genMessage(method.Output, source+":output_type") + } + } + depOffsets = append(depOffsets, offsetEntry{len(depIdxs), ""}) + for i := len(depOffsets) - 2; i >= 0; i-- { + curr, next := depOffsets[i], depOffsets[i+1] + depIdxs = append(depIdxs, fmt.Sprintf("%d, // [%d:%d] is the sub-list for %s", + curr.start, curr.start, next.start, curr.name)) + } + if len(depIdxs) > math.MaxInt32 { + panic("too many dependencies") // sanity check + } + + g.P("var ", goTypesVarName(f), " = []interface{}{") + for _, s := range goTypes { + g.P(s) + } + g.P("}") + + g.P("var ", depIdxsVarName(f), " = []int32{") + for _, s := range depIdxs { + g.P(s) + } + g.P("}") + + g.P("func init() { ", initFuncName(f.File), "() }") + + g.P("func ", initFuncName(f.File), "() {") + g.P("if ", f.GoDescriptorIdent, " != nil {") + g.P("return") + g.P("}") + + // Ensure that initialization functions for different files in the same Go + // package run in the correct order: Call the init funcs for every .proto file + // imported by this one that is in the same Go package. + for i, imps := 0, f.Desc.Imports(); i < imps.Len(); i++ { + impFile := gen.FilesByPath[imps.Get(i).Path()] + if impFile.GoImportPath != f.GoImportPath { + continue + } + g.P(initFuncName(impFile), "()") + } + + if len(f.allMessages) > 0 { + // Populate MessageInfo.Exporters. + g.P("if !", protoimplPackage.Ident("UnsafeEnabled"), " {") + for _, message := range f.allMessages { + if sf := f.allMessageFieldsByPtr[message]; len(sf.unexported) > 0 { + idx := f.allMessagesByPtr[message] + typesVar := messageTypesVarName(f) + + g.P(typesVar, "[", idx, "].Exporter = func(v interface{}, i int) interface{} {") + g.P("switch v := v.(*", message.GoIdent, "); i {") + for i := 0; i < sf.count; i++ { + if name := sf.unexported[i]; name != "" { + g.P("case ", i, ": return &v.", name) + } + } + g.P("default: return nil") + g.P("}") + g.P("}") + } + } + g.P("}") + + // Populate MessageInfo.OneofWrappers. + for _, message := range f.allMessages { + if len(message.Oneofs) > 0 { + idx := f.allMessagesByPtr[message] + typesVar := messageTypesVarName(f) + + // Associate the wrapper types by directly passing them to the MessageInfo. + g.P(typesVar, "[", idx, "].OneofWrappers = []interface{} {") + for _, oneof := range message.Oneofs { + if !oneof.Desc.IsSynthetic() { + for _, field := range oneof.Fields { + g.P("(*", field.GoIdent, ")(nil),") + } + } + } + g.P("}") + } + } + } + + g.P("type x struct{}") + g.P("out := ", protoimplPackage.Ident("TypeBuilder"), "{") + g.P("File: ", protoimplPackage.Ident("DescBuilder"), "{") + g.P("GoPackagePath: ", reflectPackage.Ident("TypeOf"), "(x{}).PkgPath(),") + g.P("RawDescriptor: ", rawDescVarName(f), ",") + g.P("NumEnums: ", len(f.allEnums), ",") + g.P("NumMessages: ", len(f.allMessages), ",") + g.P("NumExtensions: ", len(f.allExtensions), ",") + g.P("NumServices: ", len(f.Services), ",") + g.P("},") + g.P("GoTypes: ", goTypesVarName(f), ",") + g.P("DependencyIndexes: ", depIdxsVarName(f), ",") + if len(f.allEnums) > 0 { + g.P("EnumInfos: ", enumTypesVarName(f), ",") + } + if len(f.allMessages) > 0 { + g.P("MessageInfos: ", messageTypesVarName(f), ",") + } + if len(f.allExtensions) > 0 { + g.P("ExtensionInfos: ", extensionTypesVarName(f), ",") + } + g.P("}.Build()") + g.P(f.GoDescriptorIdent, " = out.File") + + // Set inputs to nil to allow GC to reclaim resources. + g.P(rawDescVarName(f), " = nil") + g.P(goTypesVarName(f), " = nil") + g.P(depIdxsVarName(f), " = nil") + g.P("}") +} + +func genFileDescriptor(gen *protogen.Plugin, g *protogen.GeneratedFile, f *fileInfo) { + descProto := proto.Clone(f.Proto).(*descriptorpb.FileDescriptorProto) + descProto.SourceCodeInfo = nil // drop source code information + + b, err := proto.MarshalOptions{AllowPartial: true, Deterministic: true}.Marshal(descProto) + if err != nil { + gen.Error(err) + return + } + + g.P("var ", rawDescVarName(f), " = []byte{") + for len(b) > 0 { + n := 16 + if n > len(b) { + n = len(b) + } + + s := "" + for _, c := range b[:n] { + s += fmt.Sprintf("0x%02x,", c) + } + g.P(s) + + b = b[n:] + } + g.P("}") + g.P() + + if f.needRawDesc { + onceVar := rawDescVarName(f) + "Once" + dataVar := rawDescVarName(f) + "Data" + g.P("var (") + g.P(onceVar, " ", syncPackage.Ident("Once")) + g.P(dataVar, " = ", rawDescVarName(f)) + g.P(")") + g.P() + + g.P("func ", rawDescVarName(f), "GZIP() []byte {") + g.P(onceVar, ".Do(func() {") + g.P(dataVar, " = ", protoimplPackage.Ident("X"), ".CompressGZIP(", dataVar, ")") + g.P("})") + g.P("return ", dataVar) + g.P("}") + g.P() + } +} + +func genEnumReflectMethods(g *protogen.GeneratedFile, f *fileInfo, e *enumInfo) { + idx := f.allEnumsByPtr[e] + typesVar := enumTypesVarName(f) + + // Descriptor method. + g.P("func (", e.GoIdent, ") Descriptor() ", protoreflectPackage.Ident("EnumDescriptor"), " {") + g.P("return ", typesVar, "[", idx, "].Descriptor()") + g.P("}") + g.P() + + // Type method. + g.P("func (", e.GoIdent, ") Type() ", protoreflectPackage.Ident("EnumType"), " {") + g.P("return &", typesVar, "[", idx, "]") + g.P("}") + g.P() + + // Number method. + g.P("func (x ", e.GoIdent, ") Number() ", protoreflectPackage.Ident("EnumNumber"), " {") + g.P("return ", protoreflectPackage.Ident("EnumNumber"), "(x)") + g.P("}") + g.P() +} + +func genMessageReflectMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + idx := f.allMessagesByPtr[m] + typesVar := messageTypesVarName(f) + + // ProtoReflect method. + g.P("func (x *", m.GoIdent, ") ProtoReflect() ", protoreflectPackage.Ident("Message"), " {") + g.P("mi := &", typesVar, "[", idx, "]") + g.P("if ", protoimplPackage.Ident("UnsafeEnabled"), " && x != nil {") + g.P("ms := ", protoimplPackage.Ident("X"), ".MessageStateOf(", protoimplPackage.Ident("Pointer"), "(x))") + g.P("if ms.LoadMessageInfo() == nil {") + g.P("ms.StoreMessageInfo(mi)") + g.P("}") + g.P("return ms") + g.P("}") + g.P("return mi.MessageOf(x)") + g.P("}") + g.P() +} + +func fileVarName(f *protogen.File, suffix string) string { + prefix := f.GoDescriptorIdent.GoName + _, n := utf8.DecodeRuneInString(prefix) + prefix = strings.ToLower(prefix[:n]) + prefix[n:] + return prefix + "_" + suffix +} +func rawDescVarName(f *fileInfo) string { + return fileVarName(f.File, "rawDesc") +} +func goTypesVarName(f *fileInfo) string { + return fileVarName(f.File, "goTypes") +} +func depIdxsVarName(f *fileInfo) string { + return fileVarName(f.File, "depIdxs") +} +func enumTypesVarName(f *fileInfo) string { + return fileVarName(f.File, "enumTypes") +} +func messageTypesVarName(f *fileInfo) string { + return fileVarName(f.File, "msgTypes") +} +func extensionTypesVarName(f *fileInfo) string { + return fileVarName(f.File, "extTypes") +} +func initFuncName(f *protogen.File) string { + return fileVarName(f, "init") +} diff --git a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/well_known_types.go b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/well_known_types.go new file mode 100644 index 000000000..696dddb9f --- /dev/null +++ b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/well_known_types.go @@ -0,0 +1,1080 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal_gengo + +import ( + "strings" + + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/internal/genid" +) + +// Specialized support for well-known types are hard-coded into the generator +// as opposed to being injected in adjacent .go sources in the generated package +// in order to support specialized build systems like Bazel that always generate +// dynamically from the source .proto files. + +func genPackageKnownComment(f *fileInfo) protogen.Comments { + switch f.Desc.Path() { + case genid.File_google_protobuf_any_proto: + return ` Package anypb contains generated types for ` + genid.File_google_protobuf_any_proto + `. + + The Any message is a dynamic representation of any other message value. + It is functionally a tuple of the full name of the remote message type and + the serialized bytes of the remote message value. + + + Constructing an Any + + An Any message containing another message value is constructed using New: + + any, err := anypb.New(m) + if err != nil { + ... // handle error + } + ... // make use of any + + + Unmarshaling an Any + + With a populated Any message, the underlying message can be serialized into + a remote concrete message value in a few ways. + + If the exact concrete type is known, then a new (or pre-existing) instance + of that message can be passed to the UnmarshalTo method: + + m := new(foopb.MyMessage) + if err := any.UnmarshalTo(m); err != nil { + ... // handle error + } + ... // make use of m + + If the exact concrete type is not known, then the UnmarshalNew method can be + used to unmarshal the contents into a new instance of the remote message type: + + m, err := any.UnmarshalNew() + if err != nil { + ... // handle error + } + ... // make use of m + + UnmarshalNew uses the global type registry to resolve the message type and + construct a new instance of that message to unmarshal into. In order for a + message type to appear in the global registry, the Go type representing that + protobuf message type must be linked into the Go binary. For messages + generated by protoc-gen-go, this is achieved through an import of the + generated Go package representing a .proto file. + + A common pattern with UnmarshalNew is to use a type switch with the resulting + proto.Message value: + + switch m := m.(type) { + case *foopb.MyMessage: + ... // make use of m as a *foopb.MyMessage + case *barpb.OtherMessage: + ... // make use of m as a *barpb.OtherMessage + case *bazpb.SomeMessage: + ... // make use of m as a *bazpb.SomeMessage + } + + This pattern ensures that the generated packages containing the message types + listed in the case clauses are linked into the Go binary and therefore also + registered in the global registry. + + + Type checking an Any + + In order to type check whether an Any message represents some other message, + then use the MessageIs method: + + if any.MessageIs((*foopb.MyMessage)(nil)) { + ... // make use of any, knowing that it contains a foopb.MyMessage + } + + The MessageIs method can also be used with an allocated instance of the target + message type if the intention is to unmarshal into it if the type matches: + + m := new(foopb.MyMessage) + if any.MessageIs(m) { + if err := any.UnmarshalTo(m); err != nil { + ... // handle error + } + ... // make use of m + } + +` + case genid.File_google_protobuf_timestamp_proto: + return ` Package timestamppb contains generated types for ` + genid.File_google_protobuf_timestamp_proto + `. + + The Timestamp message represents a timestamp, + an instant in time since the Unix epoch (January 1st, 1970). + + + Conversion to a Go Time + + The AsTime method can be used to convert a Timestamp message to a + standard Go time.Time value in UTC: + + t := ts.AsTime() + ... // make use of t as a time.Time + + Converting to a time.Time is a common operation so that the extensive + set of time-based operations provided by the time package can be leveraged. + See https://golang.org/pkg/time for more information. + + The AsTime method performs the conversion on a best-effort basis. Timestamps + with denormal values (e.g., nanoseconds beyond 0 and 99999999, inclusive) + are normalized during the conversion to a time.Time. To manually check for + invalid Timestamps per the documented limitations in timestamp.proto, + additionally call the CheckValid method: + + if err := ts.CheckValid(); err != nil { + ... // handle error + } + + + Conversion from a Go Time + + The timestamppb.New function can be used to construct a Timestamp message + from a standard Go time.Time value: + + ts := timestamppb.New(t) + ... // make use of ts as a *timestamppb.Timestamp + + In order to construct a Timestamp representing the current time, use Now: + + ts := timestamppb.Now() + ... // make use of ts as a *timestamppb.Timestamp + +` + case genid.File_google_protobuf_duration_proto: + return ` Package durationpb contains generated types for ` + genid.File_google_protobuf_duration_proto + `. + + The Duration message represents a signed span of time. + + + Conversion to a Go Duration + + The AsDuration method can be used to convert a Duration message to a + standard Go time.Duration value: + + d := dur.AsDuration() + ... // make use of d as a time.Duration + + Converting to a time.Duration is a common operation so that the extensive + set of time-based operations provided by the time package can be leveraged. + See https://golang.org/pkg/time for more information. + + The AsDuration method performs the conversion on a best-effort basis. + Durations with denormal values (e.g., nanoseconds beyond -99999999 and + +99999999, inclusive; or seconds and nanoseconds with opposite signs) + are normalized during the conversion to a time.Duration. To manually check for + invalid Duration per the documented limitations in duration.proto, + additionally call the CheckValid method: + + if err := dur.CheckValid(); err != nil { + ... // handle error + } + + Note that the documented limitations in duration.proto does not protect a + Duration from overflowing the representable range of a time.Duration in Go. + The AsDuration method uses saturation arithmetic such that an overflow clamps + the resulting value to the closest representable value (e.g., math.MaxInt64 + for positive overflow and math.MinInt64 for negative overflow). + + + Conversion from a Go Duration + + The durationpb.New function can be used to construct a Duration message + from a standard Go time.Duration value: + + dur := durationpb.New(d) + ... // make use of d as a *durationpb.Duration + +` + case genid.File_google_protobuf_struct_proto: + return ` Package structpb contains generated types for ` + genid.File_google_protobuf_struct_proto + `. + + The messages (i.e., Value, Struct, and ListValue) defined in struct.proto are + used to represent arbitrary JSON. The Value message represents a JSON value, + the Struct message represents a JSON object, and the ListValue message + represents a JSON array. See https://json.org for more information. + + The Value, Struct, and ListValue types have generated MarshalJSON and + UnmarshalJSON methods such that they serialize JSON equivalent to what the + messages themselves represent. Use of these types with the + "google.golang.org/protobuf/encoding/protojson" package + ensures that they will be serialized as their JSON equivalent. + + + Conversion to and from a Go interface + + The standard Go "encoding/json" package has functionality to serialize + arbitrary types to a large degree. The Value.AsInterface, Struct.AsMap, and + ListValue.AsSlice methods can convert the protobuf message representation into + a form represented by interface{}, map[string]interface{}, and []interface{}. + This form can be used with other packages that operate on such data structures + and also directly with the standard json package. + + In order to convert the interface{}, map[string]interface{}, and []interface{} + forms back as Value, Struct, and ListValue messages, use the NewStruct, + NewList, and NewValue constructor functions. + + + Example usage + + Consider the following example JSON object: + + { + "firstName": "John", + "lastName": "Smith", + "isAlive": true, + "age": 27, + "address": { + "streetAddress": "21 2nd Street", + "city": "New York", + "state": "NY", + "postalCode": "10021-3100" + }, + "phoneNumbers": [ + { + "type": "home", + "number": "212 555-1234" + }, + { + "type": "office", + "number": "646 555-4567" + } + ], + "children": [], + "spouse": null + } + + To construct a Value message representing the above JSON object: + + m, err := structpb.NewValue(map[string]interface{}{ + "firstName": "John", + "lastName": "Smith", + "isAlive": true, + "age": 27, + "address": map[string]interface{}{ + "streetAddress": "21 2nd Street", + "city": "New York", + "state": "NY", + "postalCode": "10021-3100", + }, + "phoneNumbers": []interface{}{ + map[string]interface{}{ + "type": "home", + "number": "212 555-1234", + }, + map[string]interface{}{ + "type": "office", + "number": "646 555-4567", + }, + }, + "children": []interface{}{}, + "spouse": nil, + }) + if err != nil { + ... // handle error + } + ... // make use of m as a *structpb.Value + +` + case genid.File_google_protobuf_field_mask_proto: + return ` Package fieldmaskpb contains generated types for ` + genid.File_google_protobuf_field_mask_proto + `. + + The FieldMask message represents a set of symbolic field paths. + The paths are specific to some target message type, + which is not stored within the FieldMask message itself. + + + Constructing a FieldMask + + The New function is used construct a FieldMask: + + var messageType *descriptorpb.DescriptorProto + fm, err := fieldmaskpb.New(messageType, "field.name", "field.number") + if err != nil { + ... // handle error + } + ... // make use of fm + + The "field.name" and "field.number" paths are valid paths according to the + google.protobuf.DescriptorProto message. Use of a path that does not correlate + to valid fields reachable from DescriptorProto would result in an error. + + Once a FieldMask message has been constructed, + the Append method can be used to insert additional paths to the path set: + + var messageType *descriptorpb.DescriptorProto + if err := fm.Append(messageType, "options"); err != nil { + ... // handle error + } + + + Type checking a FieldMask + + In order to verify that a FieldMask represents a set of fields that are + reachable from some target message type, use the IsValid method: + + var messageType *descriptorpb.DescriptorProto + if fm.IsValid(messageType) { + ... // make use of fm + } + + IsValid needs to be passed the target message type as an input since the + FieldMask message itself does not store the message type that the set of paths + are for. +` + default: + return "" + } +} + +func genMessageKnownFunctions(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) { + switch m.Desc.FullName() { + case genid.Any_message_fullname: + g.P("// New marshals src into a new Any instance.") + g.P("func New(src ", protoPackage.Ident("Message"), ") (*Any, error) {") + g.P(" dst := new(Any)") + g.P(" if err := dst.MarshalFrom(src); err != nil {") + g.P(" return nil, err") + g.P(" }") + g.P(" return dst, nil") + g.P("}") + g.P() + + g.P("// MarshalFrom marshals src into dst as the underlying message") + g.P("// using the provided marshal options.") + g.P("//") + g.P("// If no options are specified, call dst.MarshalFrom instead.") + g.P("func MarshalFrom(dst *Any, src ", protoPackage.Ident("Message"), ", opts ", protoPackage.Ident("MarshalOptions"), ") error {") + g.P(" const urlPrefix = \"type.googleapis.com/\"") + g.P(" if src == nil {") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"invalid nil source message\")") + g.P(" }") + g.P(" b, err := opts.Marshal(src)") + g.P(" if err != nil {") + g.P(" return err") + g.P(" }") + g.P(" dst.TypeUrl = urlPrefix + string(src.ProtoReflect().Descriptor().FullName())") + g.P(" dst.Value = b") + g.P(" return nil") + g.P("}") + g.P() + + g.P("// UnmarshalTo unmarshals the underlying message from src into dst") + g.P("// using the provided unmarshal options.") + g.P("// It reports an error if dst is not of the right message type.") + g.P("//") + g.P("// If no options are specified, call src.UnmarshalTo instead.") + g.P("func UnmarshalTo(src *Any, dst ", protoPackage.Ident("Message"), ", opts ", protoPackage.Ident("UnmarshalOptions"), ") error {") + g.P(" if src == nil {") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"invalid nil source message\")") + g.P(" }") + g.P(" if !src.MessageIs(dst) {") + g.P(" got := dst.ProtoReflect().Descriptor().FullName()") + g.P(" want := src.MessageName()") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"mismatched message type: got %q, want %q\", got, want)") + g.P(" }") + g.P(" return opts.Unmarshal(src.GetValue(), dst)") + g.P("}") + g.P() + + g.P("// UnmarshalNew unmarshals the underlying message from src into dst,") + g.P("// which is newly created message using a type resolved from the type URL.") + g.P("// The message type is resolved according to opt.Resolver,") + g.P("// which should implement protoregistry.MessageTypeResolver.") + g.P("// It reports an error if the underlying message type could not be resolved.") + g.P("//") + g.P("// If no options are specified, call src.UnmarshalNew instead.") + g.P("func UnmarshalNew(src *Any, opts ", protoPackage.Ident("UnmarshalOptions"), ") (dst ", protoPackage.Ident("Message"), ", err error) {") + g.P(" if src.GetTypeUrl() == \"\" {") + g.P(" return nil, ", protoimplPackage.Ident("X"), ".NewError(\"invalid empty type URL\")") + g.P(" }") + g.P(" if opts.Resolver == nil {") + g.P(" opts.Resolver = ", protoregistryPackage.Ident("GlobalTypes")) + g.P(" }") + g.P(" r, ok := opts.Resolver.(", protoregistryPackage.Ident("MessageTypeResolver"), ")") + g.P(" if !ok {") + g.P(" return nil, ", protoregistryPackage.Ident("NotFound")) + g.P(" }") + g.P(" mt, err := r.FindMessageByURL(src.GetTypeUrl())") + g.P(" if err != nil {") + g.P(" if err == ", protoregistryPackage.Ident("NotFound"), " {") + g.P(" return nil, err") + g.P(" }") + g.P(" return nil, ", protoimplPackage.Ident("X"), ".NewError(\"could not resolve %q: %v\", src.GetTypeUrl(), err)") + g.P(" }") + g.P(" dst = mt.New().Interface()") + g.P(" return dst, opts.Unmarshal(src.GetValue(), dst)") + g.P("}") + g.P() + + g.P("// MessageIs reports whether the underlying message is of the same type as m.") + g.P("func (x *Any) MessageIs(m ", protoPackage.Ident("Message"), ") bool {") + g.P(" if m == nil {") + g.P(" return false") + g.P(" }") + g.P(" url := x.GetTypeUrl()") + g.P(" name := string(m.ProtoReflect().Descriptor().FullName())") + g.P(" if !", stringsPackage.Ident("HasSuffix"), "(url, name) {") + g.P(" return false") + g.P(" }") + g.P(" return len(url) == len(name) || url[len(url)-len(name)-1] == '/'") + g.P("}") + g.P() + + g.P("// MessageName reports the full name of the underlying message,") + g.P("// returning an empty string if invalid.") + g.P("func (x *Any) MessageName() ", protoreflectPackage.Ident("FullName"), " {") + g.P(" url := x.GetTypeUrl()") + g.P(" name := ", protoreflectPackage.Ident("FullName"), "(url)") + g.P(" if i := ", stringsPackage.Ident("LastIndexByte"), "(url, '/'); i >= 0 {") + g.P(" name = name[i+len(\"/\"):]") + g.P(" }") + g.P(" if !name.IsValid() {") + g.P(" return \"\"") + g.P(" }") + g.P(" return name") + g.P("}") + g.P() + + g.P("// MarshalFrom marshals m into x as the underlying message.") + g.P("func (x *Any) MarshalFrom(m ", protoPackage.Ident("Message"), ") error {") + g.P(" return MarshalFrom(x, m, ", protoPackage.Ident("MarshalOptions"), "{})") + g.P("}") + g.P() + + g.P("// UnmarshalTo unmarshals the contents of the underlying message of x into m.") + g.P("// It resets m before performing the unmarshal operation.") + g.P("// It reports an error if m is not of the right message type.") + g.P("func (x *Any) UnmarshalTo(m ", protoPackage.Ident("Message"), ") error {") + g.P(" return UnmarshalTo(x, m, ", protoPackage.Ident("UnmarshalOptions"), "{})") + g.P("}") + g.P() + + g.P("// UnmarshalNew unmarshals the contents of the underlying message of x into") + g.P("// a newly allocated message of the specified type.") + g.P("// It reports an error if the underlying message type could not be resolved.") + g.P("func (x *Any) UnmarshalNew() (", protoPackage.Ident("Message"), ", error) {") + g.P(" return UnmarshalNew(x, ", protoPackage.Ident("UnmarshalOptions"), "{})") + g.P("}") + g.P() + + case genid.Timestamp_message_fullname: + g.P("// Now constructs a new Timestamp from the current time.") + g.P("func Now() *Timestamp {") + g.P(" return New(", timePackage.Ident("Now"), "())") + g.P("}") + g.P() + + g.P("// New constructs a new Timestamp from the provided time.Time.") + g.P("func New(t ", timePackage.Ident("Time"), ") *Timestamp {") + g.P(" return &Timestamp{Seconds: int64(t.Unix()), Nanos: int32(t.Nanosecond())}") + g.P("}") + g.P() + + g.P("// AsTime converts x to a time.Time.") + g.P("func (x *Timestamp) AsTime() ", timePackage.Ident("Time"), " {") + g.P(" return ", timePackage.Ident("Unix"), "(int64(x.GetSeconds()), int64(x.GetNanos())).UTC()") + g.P("}") + g.P() + + g.P("// IsValid reports whether the timestamp is valid.") + g.P("// It is equivalent to CheckValid == nil.") + g.P("func (x *Timestamp) IsValid() bool {") + g.P(" return x.check() == 0") + g.P("}") + g.P() + + g.P("// CheckValid returns an error if the timestamp is invalid.") + g.P("// In particular, it checks whether the value represents a date that is") + g.P("// in the range of 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.") + g.P("// An error is reported for a nil Timestamp.") + g.P("func (x *Timestamp) CheckValid() error {") + g.P(" switch x.check() {") + g.P(" case invalidNil:") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"invalid nil Timestamp\")") + g.P(" case invalidUnderflow:") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"timestamp (%v) before 0001-01-01\", x)") + g.P(" case invalidOverflow:") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"timestamp (%v) after 9999-12-31\", x)") + g.P(" case invalidNanos:") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"timestamp (%v) has out-of-range nanos\", x)") + g.P(" default:") + g.P(" return nil") + g.P(" }") + g.P("}") + g.P() + + g.P("const (") + g.P(" _ = iota") + g.P(" invalidNil") + g.P(" invalidUnderflow") + g.P(" invalidOverflow") + g.P(" invalidNanos") + g.P(")") + g.P() + + g.P("func (x *Timestamp) check() uint {") + g.P(" const minTimestamp = -62135596800 // Seconds between 1970-01-01T00:00:00Z and 0001-01-01T00:00:00Z, inclusive") + g.P(" const maxTimestamp = +253402300799 // Seconds between 1970-01-01T00:00:00Z and 9999-12-31T23:59:59Z, inclusive") + g.P(" secs := x.GetSeconds()") + g.P(" nanos := x.GetNanos()") + g.P(" switch {") + g.P(" case x == nil:") + g.P(" return invalidNil") + g.P(" case secs < minTimestamp:") + g.P(" return invalidUnderflow") + g.P(" case secs > maxTimestamp:") + g.P(" return invalidOverflow") + g.P(" case nanos < 0 || nanos >= 1e9:") + g.P(" return invalidNanos") + g.P(" default:") + g.P(" return 0") + g.P(" }") + g.P("}") + g.P() + + case genid.Duration_message_fullname: + g.P("// New constructs a new Duration from the provided time.Duration.") + g.P("func New(d ", timePackage.Ident("Duration"), ") *Duration {") + g.P(" nanos := d.Nanoseconds()") + g.P(" secs := nanos / 1e9") + g.P(" nanos -= secs * 1e9") + g.P(" return &Duration{Seconds: int64(secs), Nanos: int32(nanos)}") + g.P("}") + g.P() + + g.P("// AsDuration converts x to a time.Duration,") + g.P("// returning the closest duration value in the event of overflow.") + g.P("func (x *Duration) AsDuration() ", timePackage.Ident("Duration"), " {") + g.P(" secs := x.GetSeconds()") + g.P(" nanos := x.GetNanos()") + g.P(" d := ", timePackage.Ident("Duration"), "(secs) * ", timePackage.Ident("Second")) + g.P(" overflow := d/", timePackage.Ident("Second"), " != ", timePackage.Ident("Duration"), "(secs)") + g.P(" d += ", timePackage.Ident("Duration"), "(nanos) * ", timePackage.Ident("Nanosecond")) + g.P(" overflow = overflow || (secs < 0 && nanos < 0 && d > 0)") + g.P(" overflow = overflow || (secs > 0 && nanos > 0 && d < 0)") + g.P(" if overflow {") + g.P(" switch {") + g.P(" case secs < 0:") + g.P(" return ", timePackage.Ident("Duration"), "(", mathPackage.Ident("MinInt64"), ")") + g.P(" case secs > 0:") + g.P(" return ", timePackage.Ident("Duration"), "(", mathPackage.Ident("MaxInt64"), ")") + g.P(" }") + g.P(" }") + g.P(" return d") + g.P("}") + g.P() + + g.P("// IsValid reports whether the duration is valid.") + g.P("// It is equivalent to CheckValid == nil.") + g.P("func (x *Duration) IsValid() bool {") + g.P(" return x.check() == 0") + g.P("}") + g.P() + + g.P("// CheckValid returns an error if the duration is invalid.") + g.P("// In particular, it checks whether the value is within the range of") + g.P("// -10000 years to +10000 years inclusive.") + g.P("// An error is reported for a nil Duration.") + g.P("func (x *Duration) CheckValid() error {") + g.P(" switch x.check() {") + g.P(" case invalidNil:") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"invalid nil Duration\")") + g.P(" case invalidUnderflow:") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"duration (%v) exceeds -10000 years\", x)") + g.P(" case invalidOverflow:") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"duration (%v) exceeds +10000 years\", x)") + g.P(" case invalidNanosRange:") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"duration (%v) has out-of-range nanos\", x)") + g.P(" case invalidNanosSign:") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"duration (%v) has seconds and nanos with different signs\", x)") + g.P(" default:") + g.P(" return nil") + g.P(" }") + g.P("}") + g.P() + + g.P("const (") + g.P(" _ = iota") + g.P(" invalidNil") + g.P(" invalidUnderflow") + g.P(" invalidOverflow") + g.P(" invalidNanosRange") + g.P(" invalidNanosSign") + g.P(")") + g.P() + + g.P("func (x *Duration) check() uint {") + g.P(" const absDuration = 315576000000 // 10000yr * 365.25day/yr * 24hr/day * 60min/hr * 60sec/min") + g.P(" secs := x.GetSeconds()") + g.P(" nanos := x.GetNanos()") + g.P(" switch {") + g.P(" case x == nil:") + g.P(" return invalidNil") + g.P(" case secs < -absDuration:") + g.P(" return invalidUnderflow") + g.P(" case secs > +absDuration:") + g.P(" return invalidOverflow") + g.P(" case nanos <= -1e9 || nanos >= +1e9:") + g.P(" return invalidNanosRange") + g.P(" case (secs > 0 && nanos < 0) || (secs < 0 && nanos > 0):") + g.P(" return invalidNanosSign") + g.P(" default:") + g.P(" return 0") + g.P(" }") + g.P("}") + g.P() + + case genid.Struct_message_fullname: + g.P("// NewStruct constructs a Struct from a general-purpose Go map.") + g.P("// The map keys must be valid UTF-8.") + g.P("// The map values are converted using NewValue.") + g.P("func NewStruct(v map[string]interface{}) (*Struct, error) {") + g.P(" x := &Struct{Fields: make(map[string]*Value, len(v))}") + g.P(" for k, v := range v {") + g.P(" if !", utf8Package.Ident("ValidString"), "(k) {") + g.P(" return nil, ", protoimplPackage.Ident("X"), ".NewError(\"invalid UTF-8 in string: %q\", k)") + g.P(" }") + g.P(" var err error") + g.P(" x.Fields[k], err = NewValue(v)") + g.P(" if err != nil {") + g.P(" return nil, err") + g.P(" }") + g.P(" }") + g.P(" return x, nil") + g.P("}") + g.P() + + g.P("// AsMap converts x to a general-purpose Go map.") + g.P("// The map values are converted by calling Value.AsInterface.") + g.P("func (x *Struct) AsMap() map[string]interface{} {") + g.P(" vs := make(map[string]interface{})") + g.P(" for k, v := range x.GetFields() {") + g.P(" vs[k] = v.AsInterface()") + g.P(" }") + g.P(" return vs") + g.P("}") + g.P() + + g.P("func (x *Struct) MarshalJSON() ([]byte, error) {") + g.P(" return ", protojsonPackage.Ident("Marshal"), "(x)") + g.P("}") + g.P() + + g.P("func (x *Struct) UnmarshalJSON(b []byte) error {") + g.P(" return ", protojsonPackage.Ident("Unmarshal"), "(b, x)") + g.P("}") + g.P() + + case genid.ListValue_message_fullname: + g.P("// NewList constructs a ListValue from a general-purpose Go slice.") + g.P("// The slice elements are converted using NewValue.") + g.P("func NewList(v []interface{}) (*ListValue, error) {") + g.P(" x := &ListValue{Values: make([]*Value, len(v))}") + g.P(" for i, v := range v {") + g.P(" var err error") + g.P(" x.Values[i], err = NewValue(v)") + g.P(" if err != nil {") + g.P(" return nil, err") + g.P(" }") + g.P(" }") + g.P(" return x, nil") + g.P("}") + g.P() + + g.P("// AsSlice converts x to a general-purpose Go slice.") + g.P("// The slice elements are converted by calling Value.AsInterface.") + g.P("func (x *ListValue) AsSlice() []interface{} {") + g.P(" vs := make([]interface{}, len(x.GetValues()))") + g.P(" for i, v := range x.GetValues() {") + g.P(" vs[i] = v.AsInterface()") + g.P(" }") + g.P(" return vs") + g.P("}") + g.P() + + g.P("func (x *ListValue) MarshalJSON() ([]byte, error) {") + g.P(" return ", protojsonPackage.Ident("Marshal"), "(x)") + g.P("}") + g.P() + + g.P("func (x *ListValue) UnmarshalJSON(b []byte) error {") + g.P(" return ", protojsonPackage.Ident("Unmarshal"), "(b, x)") + g.P("}") + g.P() + + case genid.Value_message_fullname: + g.P("// NewValue constructs a Value from a general-purpose Go interface.") + g.P("//") + g.P("// ╔════════════════════════╤════════════════════════════════════════════╗") + g.P("// ║ Go type │ Conversion ║") + g.P("// ╠════════════════════════╪════════════════════════════════════════════╣") + g.P("// ║ nil │ stored as NullValue ║") + g.P("// ║ bool │ stored as BoolValue ║") + g.P("// ║ int, int32, int64 │ stored as NumberValue ║") + g.P("// ║ uint, uint32, uint64 │ stored as NumberValue ║") + g.P("// ║ float32, float64 │ stored as NumberValue ║") + g.P("// ║ string │ stored as StringValue; must be valid UTF-8 ║") + g.P("// ║ []byte │ stored as StringValue; base64-encoded ║") + g.P("// ║ map[string]interface{} │ stored as StructValue ║") + g.P("// ║ []interface{} │ stored as ListValue ║") + g.P("// ╚════════════════════════╧════════════════════════════════════════════╝") + g.P("//") + g.P("// When converting an int64 or uint64 to a NumberValue, numeric precision loss") + g.P("// is possible since they are stored as a float64.") + g.P("func NewValue(v interface{}) (*Value, error) {") + g.P(" switch v := v.(type) {") + g.P(" case nil:") + g.P(" return NewNullValue(), nil") + g.P(" case bool:") + g.P(" return NewBoolValue(v), nil") + g.P(" case int:") + g.P(" return NewNumberValue(float64(v)), nil") + g.P(" case int32:") + g.P(" return NewNumberValue(float64(v)), nil") + g.P(" case int64:") + g.P(" return NewNumberValue(float64(v)), nil") + g.P(" case uint:") + g.P(" return NewNumberValue(float64(v)), nil") + g.P(" case uint32:") + g.P(" return NewNumberValue(float64(v)), nil") + g.P(" case uint64:") + g.P(" return NewNumberValue(float64(v)), nil") + g.P(" case float32:") + g.P(" return NewNumberValue(float64(v)), nil") + g.P(" case float64:") + g.P(" return NewNumberValue(float64(v)), nil") + g.P(" case string:") + g.P(" if !", utf8Package.Ident("ValidString"), "(v) {") + g.P(" return nil, ", protoimplPackage.Ident("X"), ".NewError(\"invalid UTF-8 in string: %q\", v)") + g.P(" }") + g.P(" return NewStringValue(v), nil") + g.P(" case []byte:") + g.P(" s := ", base64Package.Ident("StdEncoding"), ".EncodeToString(v)") + g.P(" return NewStringValue(s), nil") + g.P(" case map[string]interface{}:") + g.P(" v2, err := NewStruct(v)") + g.P(" if err != nil {") + g.P(" return nil, err") + g.P(" }") + g.P(" return NewStructValue(v2), nil") + g.P(" case []interface{}:") + g.P(" v2, err := NewList(v)") + g.P(" if err != nil {") + g.P(" return nil, err") + g.P(" }") + g.P(" return NewListValue(v2), nil") + g.P(" default:") + g.P(" return nil, ", protoimplPackage.Ident("X"), ".NewError(\"invalid type: %T\", v)") + g.P(" }") + g.P("}") + g.P() + + g.P("// NewNullValue constructs a new null Value.") + g.P("func NewNullValue() *Value {") + g.P(" return &Value{Kind: &Value_NullValue{NullValue: NullValue_NULL_VALUE}}") + g.P("}") + g.P() + + g.P("// NewBoolValue constructs a new boolean Value.") + g.P("func NewBoolValue(v bool) *Value {") + g.P(" return &Value{Kind: &Value_BoolValue{BoolValue: v}}") + g.P("}") + g.P() + + g.P("// NewNumberValue constructs a new number Value.") + g.P("func NewNumberValue(v float64) *Value {") + g.P(" return &Value{Kind: &Value_NumberValue{NumberValue: v}}") + g.P("}") + g.P() + + g.P("// NewStringValue constructs a new string Value.") + g.P("func NewStringValue(v string) *Value {") + g.P(" return &Value{Kind: &Value_StringValue{StringValue: v}}") + g.P("}") + g.P() + + g.P("// NewStructValue constructs a new struct Value.") + g.P("func NewStructValue(v *Struct) *Value {") + g.P(" return &Value{Kind: &Value_StructValue{StructValue: v}}") + g.P("}") + g.P() + + g.P("// NewListValue constructs a new list Value.") + g.P("func NewListValue(v *ListValue) *Value {") + g.P(" return &Value{Kind: &Value_ListValue{ListValue: v}}") + g.P("}") + g.P() + + g.P("// AsInterface converts x to a general-purpose Go interface.") + g.P("//") + g.P("// Calling Value.MarshalJSON and \"encoding/json\".Marshal on this output produce") + g.P("// semantically equivalent JSON (assuming no errors occur).") + g.P("//") + g.P("// Floating-point values (i.e., \"NaN\", \"Infinity\", and \"-Infinity\") are") + g.P("// converted as strings to remain compatible with MarshalJSON.") + g.P("func (x *Value) AsInterface() interface{} {") + g.P(" switch v := x.GetKind().(type) {") + g.P(" case *Value_NumberValue:") + g.P(" if v != nil {") + g.P(" switch {") + g.P(" case ", mathPackage.Ident("IsNaN"), "(v.NumberValue):") + g.P(" return \"NaN\"") + g.P(" case ", mathPackage.Ident("IsInf"), "(v.NumberValue, +1):") + g.P(" return \"Infinity\"") + g.P(" case ", mathPackage.Ident("IsInf"), "(v.NumberValue, -1):") + g.P(" return \"-Infinity\"") + g.P(" default:") + g.P(" return v.NumberValue") + g.P(" }") + g.P(" }") + g.P(" case *Value_StringValue:") + g.P(" if v != nil {") + g.P(" return v.StringValue") + g.P(" }") + g.P(" case *Value_BoolValue:") + g.P(" if v != nil {") + g.P(" return v.BoolValue") + g.P(" }") + g.P(" case *Value_StructValue:") + g.P(" if v != nil {") + g.P(" return v.StructValue.AsMap()") + g.P(" }") + g.P(" case *Value_ListValue:") + g.P(" if v != nil {") + g.P(" return v.ListValue.AsSlice()") + g.P(" }") + g.P(" }") + g.P(" return nil") + g.P("}") + g.P() + + g.P("func (x *Value) MarshalJSON() ([]byte, error) {") + g.P(" return ", protojsonPackage.Ident("Marshal"), "(x)") + g.P("}") + g.P() + + g.P("func (x *Value) UnmarshalJSON(b []byte) error {") + g.P(" return ", protojsonPackage.Ident("Unmarshal"), "(b, x)") + g.P("}") + g.P() + + case genid.FieldMask_message_fullname: + g.P("// New constructs a field mask from a list of paths and verifies that") + g.P("// each one is valid according to the specified message type.") + g.P("func New(m ", protoPackage.Ident("Message"), ", paths ...string) (*FieldMask, error) {") + g.P(" x := new(FieldMask)") + g.P(" return x, x.Append(m, paths...)") + g.P("}") + g.P() + + g.P("// Union returns the union of all the paths in the input field masks.") + g.P("func Union(mx *FieldMask, my *FieldMask, ms ...*FieldMask) *FieldMask {") + g.P(" var out []string") + g.P(" out = append(out, mx.GetPaths()...)") + g.P(" out = append(out, my.GetPaths()...)") + g.P(" for _, m := range ms {") + g.P(" out = append(out, m.GetPaths()...)") + g.P(" }") + g.P(" return &FieldMask{Paths: normalizePaths(out)}") + g.P("}") + g.P() + + g.P("// Intersect returns the intersection of all the paths in the input field masks.") + g.P("func Intersect(mx *FieldMask, my *FieldMask, ms ...*FieldMask) *FieldMask {") + g.P(" var ss1, ss2 []string // reused buffers for performance") + g.P(" intersect := func(out, in []string) []string {") + g.P(" ss1 = normalizePaths(append(ss1[:0], in...))") + g.P(" ss2 = normalizePaths(append(ss2[:0], out...))") + g.P(" out = out[:0]") + g.P(" for i1, i2 := 0, 0; i1 < len(ss1) && i2 < len(ss2); {") + g.P(" switch s1, s2 := ss1[i1], ss2[i2]; {") + g.P(" case hasPathPrefix(s1, s2):") + g.P(" out = append(out, s1)") + g.P(" i1++") + g.P(" case hasPathPrefix(s2, s1):") + g.P(" out = append(out, s2)") + g.P(" i2++") + g.P(" case lessPath(s1, s2):") + g.P(" i1++") + g.P(" case lessPath(s2, s1):") + g.P(" i2++") + g.P(" }") + g.P(" }") + g.P(" return out") + g.P(" }") + g.P() + g.P(" out := Union(mx, my, ms...).GetPaths()") + g.P(" out = intersect(out, mx.GetPaths())") + g.P(" out = intersect(out, my.GetPaths())") + g.P(" for _, m := range ms {") + g.P(" out = intersect(out, m.GetPaths())") + g.P(" }") + g.P(" return &FieldMask{Paths: normalizePaths(out)}") + g.P("}") + g.P() + + g.P("// IsValid reports whether all the paths are syntactically valid and") + g.P("// refer to known fields in the specified message type.") + g.P("// It reports false for a nil FieldMask.") + g.P("func (x *FieldMask) IsValid(m ", protoPackage.Ident("Message"), ") bool {") + g.P(" paths := x.GetPaths()") + g.P(" return x != nil && numValidPaths(m, paths) == len(paths)") + g.P("}") + g.P() + + g.P("// Append appends a list of paths to the mask and verifies that each one") + g.P("// is valid according to the specified message type.") + g.P("// An invalid path is not appended and breaks insertion of subsequent paths.") + g.P("func (x *FieldMask) Append(m ", protoPackage.Ident("Message"), ", paths ...string) error {") + g.P(" numValid := numValidPaths(m, paths)") + g.P(" x.Paths = append(x.Paths, paths[:numValid]...)") + g.P(" paths = paths[numValid:]") + g.P(" if len(paths) > 0 {") + g.P(" name := m.ProtoReflect().Descriptor().FullName()") + g.P(" return ", protoimplPackage.Ident("X"), ".NewError(\"invalid path %q for message %q\", paths[0], name)") + g.P(" }") + g.P(" return nil") + g.P("}") + g.P() + + g.P("func numValidPaths(m ", protoPackage.Ident("Message"), ", paths []string) int {") + g.P(" md0 := m.ProtoReflect().Descriptor()") + g.P(" for i, path := range paths {") + g.P(" md := md0") + g.P(" if !rangeFields(path, func(field string) bool {") + g.P(" // Search the field within the message.") + g.P(" if md == nil {") + g.P(" return false // not within a message") + g.P(" }") + g.P(" fd := md.Fields().ByName(", protoreflectPackage.Ident("Name"), "(field))") + g.P(" // The real field name of a group is the message name.") + g.P(" if fd == nil {") + g.P(" gd := md.Fields().ByName(", protoreflectPackage.Ident("Name"), "(", stringsPackage.Ident("ToLower"), "(field)))") + g.P(" if gd != nil && gd.Kind() == ", protoreflectPackage.Ident("GroupKind"), " && string(gd.Message().Name()) == field {") + g.P(" fd = gd") + g.P(" }") + g.P(" } else if fd.Kind() == ", protoreflectPackage.Ident("GroupKind"), " && string(fd.Message().Name()) != field {") + g.P(" fd = nil") + g.P(" }") + g.P(" if fd == nil {") + g.P(" return false // message has does not have this field") + g.P(" }") + g.P() + g.P(" // Identify the next message to search within.") + g.P(" md = fd.Message() // may be nil") + g.P() + g.P(" // Repeated fields are only allowed at the last position.") + g.P(" if fd.IsList() || fd.IsMap() {") + g.P(" md = nil") + g.P(" }") + g.P() + g.P(" return true") + g.P(" }) {") + g.P(" return i") + g.P(" }") + g.P(" }") + g.P(" return len(paths)") + g.P("}") + g.P() + + g.P("// Normalize converts the mask to its canonical form where all paths are sorted") + g.P("// and redundant paths are removed.") + g.P("func (x *FieldMask) Normalize() {") + g.P(" x.Paths = normalizePaths(x.Paths)") + g.P("}") + g.P() + g.P("func normalizePaths(paths []string) []string {") + g.P(" ", sortPackage.Ident("Slice"), "(paths, func(i, j int) bool {") + g.P(" return lessPath(paths[i], paths[j])") + g.P(" })") + g.P() + g.P(" // Elide any path that is a prefix match on the previous.") + g.P(" out := paths[:0]") + g.P(" for _, path := range paths {") + g.P(" if len(out) > 0 && hasPathPrefix(path, out[len(out)-1]) {") + g.P(" continue") + g.P(" }") + g.P(" out = append(out, path)") + g.P(" }") + g.P(" return out") + g.P("}") + g.P() + + g.P("// hasPathPrefix is like strings.HasPrefix, but further checks for either") + g.P("// an exact matche or that the prefix is delimited by a dot.") + g.P("func hasPathPrefix(path, prefix string) bool {") + g.P(" return ", stringsPackage.Ident("HasPrefix"), "(path, prefix) && (len(path) == len(prefix) || path[len(prefix)] == '.')") + g.P("}") + g.P() + + g.P("// lessPath is a lexicographical comparison where dot is specially treated") + g.P("// as the smallest symbol.") + g.P("func lessPath(x, y string) bool {") + g.P(" for i := 0; i < len(x) && i < len(y); i++ {") + g.P(" if x[i] != y[i] {") + g.P(" return (x[i] - '.') < (y[i] - '.')") + g.P(" }") + g.P(" }") + g.P(" return len(x) < len(y)") + g.P("}") + g.P() + + g.P("// rangeFields is like strings.Split(path, \".\"), but avoids allocations by") + g.P("// iterating over each field in place and calling a iterator function.") + g.P("func rangeFields(path string, f func(field string) bool) bool {") + g.P(" for {") + g.P(" var field string") + g.P(" if i := ", stringsPackage.Ident("IndexByte"), "(path, '.'); i >= 0 {") + g.P(" field, path = path[:i], path[i:]") + g.P(" } else {") + g.P(" field, path = path, \"\"") + g.P(" }") + g.P() + g.P(" if !f(field) {") + g.P(" return false") + g.P(" }") + g.P() + g.P(" if len(path) == 0 {") + g.P(" return true") + g.P(" }") + g.P(" path = ", stringsPackage.Ident("TrimPrefix"), "(path, \".\")") + g.P(" }") + g.P("}") + g.P() + + case genid.BoolValue_message_fullname, + genid.Int32Value_message_fullname, + genid.Int64Value_message_fullname, + genid.UInt32Value_message_fullname, + genid.UInt64Value_message_fullname, + genid.FloatValue_message_fullname, + genid.DoubleValue_message_fullname, + genid.StringValue_message_fullname, + genid.BytesValue_message_fullname: + funcName := strings.TrimSuffix(m.GoIdent.GoName, "Value") + typeName := strings.ToLower(funcName) + switch typeName { + case "float": + typeName = "float32" + case "double": + typeName = "float64" + case "bytes": + typeName = "[]byte" + } + + g.P("// ", funcName, " stores v in a new ", m.GoIdent, " and returns a pointer to it.") + g.P("func ", funcName, "(v ", typeName, ") *", m.GoIdent, " {") + g.P(" return &", m.GoIdent, "{Value: v}") + g.P("}") + g.P() + } +} diff --git a/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/main.go b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/main.go new file mode 100644 index 000000000..b8f6a1635 --- /dev/null +++ b/vendor/google.golang.org/protobuf/cmd/protoc-gen-go/main.go @@ -0,0 +1,57 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The protoc-gen-go binary is a protoc plugin to generate Go code for +// both proto2 and proto3 versions of the protocol buffer language. +// +// For more information about the usage of this plugin, see: +// +// https://developers.google.com/protocol-buffers/docs/reference/go-generated +package main + +import ( + "errors" + "flag" + "fmt" + "os" + "path/filepath" + + gengo "google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo" + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/internal/version" +) + +const genGoDocURL = "https://developers.google.com/protocol-buffers/docs/reference/go-generated" +const grpcDocURL = "https://grpc.io/docs/languages/go/quickstart/#regenerate-grpc-code" + +func main() { + if len(os.Args) == 2 && os.Args[1] == "--version" { + fmt.Fprintf(os.Stdout, "%v %v\n", filepath.Base(os.Args[0]), version.String()) + os.Exit(0) + } + if len(os.Args) == 2 && os.Args[1] == "--help" { + fmt.Fprintf(os.Stdout, "See "+genGoDocURL+" for usage information.\n") + os.Exit(0) + } + + var ( + flags flag.FlagSet + plugins = flags.String("plugins", "", "deprecated option") + ) + protogen.Options{ + ParamFunc: flags.Set, + }.Run(func(gen *protogen.Plugin) error { + if *plugins != "" { + return errors.New("protoc-gen-go: plugins are not supported; use 'protoc --go-grpc_out=...' to generate gRPC\n\n" + + "See " + grpcDocURL + " for more information.") + } + for _, f := range gen.Files { + if f.Generate { + gengo.GenerateFile(gen, f) + } + } + gen.SupportedFeatures = gengo.SupportedFeatures + return nil + }) +} diff --git a/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go b/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go new file mode 100644 index 000000000..a475adfdd --- /dev/null +++ b/vendor/google.golang.org/protobuf/compiler/protogen/protogen.go @@ -0,0 +1,1261 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package protogen provides support for writing protoc plugins. +// +// Plugins for protoc, the Protocol Buffer compiler, +// are programs which read a CodeGeneratorRequest message from standard input +// and write a CodeGeneratorResponse message to standard output. +// This package provides support for writing plugins which generate Go code. +package protogen + +import ( + "bufio" + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/printer" + "go/token" + "go/types" + "io/ioutil" + "os" + "path" + "path/filepath" + "sort" + "strconv" + "strings" + + "google.golang.org/protobuf/encoding/prototext" + "google.golang.org/protobuf/internal/genid" + "google.golang.org/protobuf/internal/strs" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + + "google.golang.org/protobuf/types/descriptorpb" + "google.golang.org/protobuf/types/pluginpb" +) + +const goPackageDocURL = "https://developers.google.com/protocol-buffers/docs/reference/go-generated#package" + +// Run executes a function as a protoc plugin. +// +// It reads a CodeGeneratorRequest message from os.Stdin, invokes the plugin +// function, and writes a CodeGeneratorResponse message to os.Stdout. +// +// If a failure occurs while reading or writing, Run prints an error to +// os.Stderr and calls os.Exit(1). +func (opts Options) Run(f func(*Plugin) error) { + if err := run(opts, f); err != nil { + fmt.Fprintf(os.Stderr, "%s: %v\n", filepath.Base(os.Args[0]), err) + os.Exit(1) + } +} + +func run(opts Options, f func(*Plugin) error) error { + if len(os.Args) > 1 { + return fmt.Errorf("unknown argument %q (this program should be run by protoc, not directly)", os.Args[1]) + } + in, err := ioutil.ReadAll(os.Stdin) + if err != nil { + return err + } + req := &pluginpb.CodeGeneratorRequest{} + if err := proto.Unmarshal(in, req); err != nil { + return err + } + gen, err := opts.New(req) + if err != nil { + return err + } + if err := f(gen); err != nil { + // Errors from the plugin function are reported by setting the + // error field in the CodeGeneratorResponse. + // + // In contrast, errors that indicate a problem in protoc + // itself (unparsable input, I/O errors, etc.) are reported + // to stderr. + gen.Error(err) + } + resp := gen.Response() + out, err := proto.Marshal(resp) + if err != nil { + return err + } + if _, err := os.Stdout.Write(out); err != nil { + return err + } + return nil +} + +// A Plugin is a protoc plugin invocation. +type Plugin struct { + // Request is the CodeGeneratorRequest provided by protoc. + Request *pluginpb.CodeGeneratorRequest + + // Files is the set of files to generate and everything they import. + // Files appear in topological order, so each file appears before any + // file that imports it. + Files []*File + FilesByPath map[string]*File + + // SupportedFeatures is the set of protobuf language features supported by + // this generator plugin. See the documentation for + // google.protobuf.CodeGeneratorResponse.supported_features for details. + SupportedFeatures uint64 + + fileReg *protoregistry.Files + enumsByName map[protoreflect.FullName]*Enum + messagesByName map[protoreflect.FullName]*Message + annotateCode bool + pathType pathType + module string + genFiles []*GeneratedFile + opts Options + err error +} + +type Options struct { + // If ParamFunc is non-nil, it will be called with each unknown + // generator parameter. + // + // Plugins for protoc can accept parameters from the command line, + // passed in the --_out protoc, separated from the output + // directory with a colon; e.g., + // + // --go_out==,=: + // + // Parameters passed in this fashion as a comma-separated list of + // key=value pairs will be passed to the ParamFunc. + // + // The (flag.FlagSet).Set method matches this function signature, + // so parameters can be converted into flags as in the following: + // + // var flags flag.FlagSet + // value := flags.Bool("param", false, "") + // opts := &protogen.Options{ + // ParamFunc: flags.Set, + // } + // protogen.Run(opts, func(p *protogen.Plugin) error { + // if *value { ... } + // }) + ParamFunc func(name, value string) error + + // ImportRewriteFunc is called with the import path of each package + // imported by a generated file. It returns the import path to use + // for this package. + ImportRewriteFunc func(GoImportPath) GoImportPath +} + +// New returns a new Plugin. +func (opts Options) New(req *pluginpb.CodeGeneratorRequest) (*Plugin, error) { + gen := &Plugin{ + Request: req, + FilesByPath: make(map[string]*File), + fileReg: new(protoregistry.Files), + enumsByName: make(map[protoreflect.FullName]*Enum), + messagesByName: make(map[protoreflect.FullName]*Message), + opts: opts, + } + + packageNames := make(map[string]GoPackageName) // filename -> package name + importPaths := make(map[string]GoImportPath) // filename -> import path + for _, param := range strings.Split(req.GetParameter(), ",") { + var value string + if i := strings.Index(param, "="); i >= 0 { + value = param[i+1:] + param = param[0:i] + } + switch param { + case "": + // Ignore. + case "module": + gen.module = value + case "paths": + switch value { + case "import": + gen.pathType = pathTypeImport + case "source_relative": + gen.pathType = pathTypeSourceRelative + default: + return nil, fmt.Errorf(`unknown path type %q: want "import" or "source_relative"`, value) + } + case "annotate_code": + switch value { + case "true", "": + gen.annotateCode = true + case "false": + default: + return nil, fmt.Errorf(`bad value for parameter %q: want "true" or "false"`, param) + } + default: + if param[0] == 'M' { + impPath, pkgName := splitImportPathAndPackageName(value) + if pkgName != "" { + packageNames[param[1:]] = pkgName + } + if impPath != "" { + importPaths[param[1:]] = impPath + } + continue + } + if opts.ParamFunc != nil { + if err := opts.ParamFunc(param, value); err != nil { + return nil, err + } + } + } + } + // When the module= option is provided, we strip the module name + // prefix from generated files. This only makes sense if generated + // filenames are based on the import path. + if gen.module != "" && gen.pathType == pathTypeSourceRelative { + return nil, fmt.Errorf("cannot use module= with paths=source_relative") + } + + // Figure out the import path and package name for each file. + // + // The rules here are complicated and have grown organically over time. + // Interactions between different ways of specifying package information + // may be surprising. + // + // The recommended approach is to include a go_package option in every + // .proto source file specifying the full import path of the Go package + // associated with this file. + // + // option go_package = "google.golang.org/protobuf/types/known/anypb"; + // + // Alternatively, build systems which want to exert full control over + // import paths may specify M= flags. + for _, fdesc := range gen.Request.ProtoFile { + // The "M" command-line flags take precedence over + // the "go_package" option in the .proto source file. + filename := fdesc.GetName() + impPath, pkgName := splitImportPathAndPackageName(fdesc.GetOptions().GetGoPackage()) + if importPaths[filename] == "" && impPath != "" { + importPaths[filename] = impPath + } + if packageNames[filename] == "" && pkgName != "" { + packageNames[filename] = pkgName + } + switch { + case importPaths[filename] == "": + // The import path must be specified one way or another. + return nil, fmt.Errorf( + "unable to determine Go import path for %q\n\n"+ + "Please specify either:\n"+ + "\t• a \"go_package\" option in the .proto source file, or\n"+ + "\t• a \"M\" argument on the command line.\n\n"+ + "See %v for more information.\n", + fdesc.GetName(), goPackageDocURL) + case !strings.Contains(string(importPaths[filename]), ".") && + !strings.Contains(string(importPaths[filename]), "/"): + // Check that import paths contain at least a dot or slash to avoid + // a common mistake where import path is confused with package name. + return nil, fmt.Errorf( + "invalid Go import path %q for %q\n\n"+ + "The import path must contain at least one period ('.') or forward slash ('/') character.\n\n"+ + "See %v for more information.\n", + string(importPaths[filename]), fdesc.GetName(), goPackageDocURL) + case packageNames[filename] == "": + // If the package name is not explicitly specified, + // then derive a reasonable package name from the import path. + // + // NOTE: The package name is derived first from the import path in + // the "go_package" option (if present) before trying the "M" flag. + // The inverted order for this is because the primary use of the "M" + // flag is by build systems that have full control over the + // import paths all packages, where it is generally expected that + // the Go package name still be identical for the Go toolchain and + // for custom build systems like Bazel. + if impPath == "" { + impPath = importPaths[filename] + } + packageNames[filename] = cleanPackageName(path.Base(string(impPath))) + } + } + + // Consistency check: Every file with the same Go import path should have + // the same Go package name. + packageFiles := make(map[GoImportPath][]string) + for filename, importPath := range importPaths { + if _, ok := packageNames[filename]; !ok { + // Skip files mentioned in a M= parameter + // but which do not appear in the CodeGeneratorRequest. + continue + } + packageFiles[importPath] = append(packageFiles[importPath], filename) + } + for importPath, filenames := range packageFiles { + for i := 1; i < len(filenames); i++ { + if a, b := packageNames[filenames[0]], packageNames[filenames[i]]; a != b { + return nil, fmt.Errorf("Go package %v has inconsistent names %v (%v) and %v (%v)", + importPath, a, filenames[0], b, filenames[i]) + } + } + } + + for _, fdesc := range gen.Request.ProtoFile { + filename := fdesc.GetName() + if gen.FilesByPath[filename] != nil { + return nil, fmt.Errorf("duplicate file name: %q", filename) + } + f, err := newFile(gen, fdesc, packageNames[filename], importPaths[filename]) + if err != nil { + return nil, err + } + gen.Files = append(gen.Files, f) + gen.FilesByPath[filename] = f + } + for _, filename := range gen.Request.FileToGenerate { + f, ok := gen.FilesByPath[filename] + if !ok { + return nil, fmt.Errorf("no descriptor for generated file: %v", filename) + } + f.Generate = true + } + return gen, nil +} + +// Error records an error in code generation. The generator will report the +// error back to protoc and will not produce output. +func (gen *Plugin) Error(err error) { + if gen.err == nil { + gen.err = err + } +} + +// Response returns the generator output. +func (gen *Plugin) Response() *pluginpb.CodeGeneratorResponse { + resp := &pluginpb.CodeGeneratorResponse{} + if gen.err != nil { + resp.Error = proto.String(gen.err.Error()) + return resp + } + for _, g := range gen.genFiles { + if g.skip { + continue + } + content, err := g.Content() + if err != nil { + return &pluginpb.CodeGeneratorResponse{ + Error: proto.String(err.Error()), + } + } + filename := g.filename + if gen.module != "" { + trim := gen.module + "/" + if !strings.HasPrefix(filename, trim) { + return &pluginpb.CodeGeneratorResponse{ + Error: proto.String(fmt.Sprintf("%v: generated file does not match prefix %q", filename, gen.module)), + } + } + filename = strings.TrimPrefix(filename, trim) + } + resp.File = append(resp.File, &pluginpb.CodeGeneratorResponse_File{ + Name: proto.String(filename), + Content: proto.String(string(content)), + }) + if gen.annotateCode && strings.HasSuffix(g.filename, ".go") { + meta, err := g.metaFile(content) + if err != nil { + return &pluginpb.CodeGeneratorResponse{ + Error: proto.String(err.Error()), + } + } + resp.File = append(resp.File, &pluginpb.CodeGeneratorResponse_File{ + Name: proto.String(filename + ".meta"), + Content: proto.String(meta), + }) + } + } + if gen.SupportedFeatures > 0 { + resp.SupportedFeatures = proto.Uint64(gen.SupportedFeatures) + } + return resp +} + +// A File describes a .proto source file. +type File struct { + Desc protoreflect.FileDescriptor + Proto *descriptorpb.FileDescriptorProto + + GoDescriptorIdent GoIdent // name of Go variable for the file descriptor + GoPackageName GoPackageName // name of this file's Go package + GoImportPath GoImportPath // import path of this file's Go package + + Enums []*Enum // top-level enum declarations + Messages []*Message // top-level message declarations + Extensions []*Extension // top-level extension declarations + Services []*Service // top-level service declarations + + Generate bool // true if we should generate code for this file + + // GeneratedFilenamePrefix is used to construct filenames for generated + // files associated with this source file. + // + // For example, the source file "dir/foo.proto" might have a filename prefix + // of "dir/foo". Appending ".pb.go" produces an output file of "dir/foo.pb.go". + GeneratedFilenamePrefix string + + location Location +} + +func newFile(gen *Plugin, p *descriptorpb.FileDescriptorProto, packageName GoPackageName, importPath GoImportPath) (*File, error) { + desc, err := protodesc.NewFile(p, gen.fileReg) + if err != nil { + return nil, fmt.Errorf("invalid FileDescriptorProto %q: %v", p.GetName(), err) + } + if err := gen.fileReg.RegisterFile(desc); err != nil { + return nil, fmt.Errorf("cannot register descriptor %q: %v", p.GetName(), err) + } + f := &File{ + Desc: desc, + Proto: p, + GoPackageName: packageName, + GoImportPath: importPath, + location: Location{SourceFile: desc.Path()}, + } + + // Determine the prefix for generated Go files. + prefix := p.GetName() + if ext := path.Ext(prefix); ext == ".proto" || ext == ".protodevel" { + prefix = prefix[:len(prefix)-len(ext)] + } + switch gen.pathType { + case pathTypeImport: + // If paths=import, the output filename is derived from the Go import path. + prefix = path.Join(string(f.GoImportPath), path.Base(prefix)) + case pathTypeSourceRelative: + // If paths=source_relative, the output filename is derived from + // the input filename. + } + f.GoDescriptorIdent = GoIdent{ + GoName: "File_" + strs.GoSanitized(p.GetName()), + GoImportPath: f.GoImportPath, + } + f.GeneratedFilenamePrefix = prefix + + for i, eds := 0, desc.Enums(); i < eds.Len(); i++ { + f.Enums = append(f.Enums, newEnum(gen, f, nil, eds.Get(i))) + } + for i, mds := 0, desc.Messages(); i < mds.Len(); i++ { + f.Messages = append(f.Messages, newMessage(gen, f, nil, mds.Get(i))) + } + for i, xds := 0, desc.Extensions(); i < xds.Len(); i++ { + f.Extensions = append(f.Extensions, newField(gen, f, nil, xds.Get(i))) + } + for i, sds := 0, desc.Services(); i < sds.Len(); i++ { + f.Services = append(f.Services, newService(gen, f, sds.Get(i))) + } + for _, message := range f.Messages { + if err := message.resolveDependencies(gen); err != nil { + return nil, err + } + } + for _, extension := range f.Extensions { + if err := extension.resolveDependencies(gen); err != nil { + return nil, err + } + } + for _, service := range f.Services { + for _, method := range service.Methods { + if err := method.resolveDependencies(gen); err != nil { + return nil, err + } + } + } + return f, nil +} + +// splitImportPathAndPackageName splits off the optional Go package name +// from the Go import path when separated by a ';' delimiter. +func splitImportPathAndPackageName(s string) (GoImportPath, GoPackageName) { + if i := strings.Index(s, ";"); i >= 0 { + return GoImportPath(s[:i]), GoPackageName(s[i+1:]) + } + return GoImportPath(s), "" +} + +// An Enum describes an enum. +type Enum struct { + Desc protoreflect.EnumDescriptor + + GoIdent GoIdent // name of the generated Go type + + Values []*EnumValue // enum value declarations + + Location Location // location of this enum + Comments CommentSet // comments associated with this enum +} + +func newEnum(gen *Plugin, f *File, parent *Message, desc protoreflect.EnumDescriptor) *Enum { + var loc Location + if parent != nil { + loc = parent.Location.appendPath(genid.DescriptorProto_EnumType_field_number, desc.Index()) + } else { + loc = f.location.appendPath(genid.FileDescriptorProto_EnumType_field_number, desc.Index()) + } + enum := &Enum{ + Desc: desc, + GoIdent: newGoIdent(f, desc), + Location: loc, + Comments: makeCommentSet(f.Desc.SourceLocations().ByDescriptor(desc)), + } + gen.enumsByName[desc.FullName()] = enum + for i, vds := 0, enum.Desc.Values(); i < vds.Len(); i++ { + enum.Values = append(enum.Values, newEnumValue(gen, f, parent, enum, vds.Get(i))) + } + return enum +} + +// An EnumValue describes an enum value. +type EnumValue struct { + Desc protoreflect.EnumValueDescriptor + + GoIdent GoIdent // name of the generated Go declaration + + Parent *Enum // enum in which this value is declared + + Location Location // location of this enum value + Comments CommentSet // comments associated with this enum value +} + +func newEnumValue(gen *Plugin, f *File, message *Message, enum *Enum, desc protoreflect.EnumValueDescriptor) *EnumValue { + // A top-level enum value's name is: EnumName_ValueName + // An enum value contained in a message is: MessageName_ValueName + // + // For historical reasons, enum value names are not camel-cased. + parentIdent := enum.GoIdent + if message != nil { + parentIdent = message.GoIdent + } + name := parentIdent.GoName + "_" + string(desc.Name()) + loc := enum.Location.appendPath(genid.EnumDescriptorProto_Value_field_number, desc.Index()) + return &EnumValue{ + Desc: desc, + GoIdent: f.GoImportPath.Ident(name), + Parent: enum, + Location: loc, + Comments: makeCommentSet(f.Desc.SourceLocations().ByDescriptor(desc)), + } +} + +// A Message describes a message. +type Message struct { + Desc protoreflect.MessageDescriptor + + GoIdent GoIdent // name of the generated Go type + + Fields []*Field // message field declarations + Oneofs []*Oneof // message oneof declarations + + Enums []*Enum // nested enum declarations + Messages []*Message // nested message declarations + Extensions []*Extension // nested extension declarations + + Location Location // location of this message + Comments CommentSet // comments associated with this message +} + +func newMessage(gen *Plugin, f *File, parent *Message, desc protoreflect.MessageDescriptor) *Message { + var loc Location + if parent != nil { + loc = parent.Location.appendPath(genid.DescriptorProto_NestedType_field_number, desc.Index()) + } else { + loc = f.location.appendPath(genid.FileDescriptorProto_MessageType_field_number, desc.Index()) + } + message := &Message{ + Desc: desc, + GoIdent: newGoIdent(f, desc), + Location: loc, + Comments: makeCommentSet(f.Desc.SourceLocations().ByDescriptor(desc)), + } + gen.messagesByName[desc.FullName()] = message + for i, eds := 0, desc.Enums(); i < eds.Len(); i++ { + message.Enums = append(message.Enums, newEnum(gen, f, message, eds.Get(i))) + } + for i, mds := 0, desc.Messages(); i < mds.Len(); i++ { + message.Messages = append(message.Messages, newMessage(gen, f, message, mds.Get(i))) + } + for i, fds := 0, desc.Fields(); i < fds.Len(); i++ { + message.Fields = append(message.Fields, newField(gen, f, message, fds.Get(i))) + } + for i, ods := 0, desc.Oneofs(); i < ods.Len(); i++ { + message.Oneofs = append(message.Oneofs, newOneof(gen, f, message, ods.Get(i))) + } + for i, xds := 0, desc.Extensions(); i < xds.Len(); i++ { + message.Extensions = append(message.Extensions, newField(gen, f, message, xds.Get(i))) + } + + // Resolve local references between fields and oneofs. + for _, field := range message.Fields { + if od := field.Desc.ContainingOneof(); od != nil { + oneof := message.Oneofs[od.Index()] + field.Oneof = oneof + oneof.Fields = append(oneof.Fields, field) + } + } + + // Field name conflict resolution. + // + // We assume well-known method names that may be attached to a generated + // message type, as well as a 'Get*' method for each field. For each + // field in turn, we add _s to its name until there are no conflicts. + // + // Any change to the following set of method names is a potential + // incompatible API change because it may change generated field names. + // + // TODO: If we ever support a 'go_name' option to set the Go name of a + // field, we should consider dropping this entirely. The conflict + // resolution algorithm is subtle and surprising (changing the order + // in which fields appear in the .proto source file can change the + // names of fields in generated code), and does not adapt well to + // adding new per-field methods such as setters. + usedNames := map[string]bool{ + "Reset": true, + "String": true, + "ProtoMessage": true, + "Marshal": true, + "Unmarshal": true, + "ExtensionRangeArray": true, + "ExtensionMap": true, + "Descriptor": true, + } + makeNameUnique := func(name string, hasGetter bool) string { + for usedNames[name] || (hasGetter && usedNames["Get"+name]) { + name += "_" + } + usedNames[name] = true + usedNames["Get"+name] = hasGetter + return name + } + for _, field := range message.Fields { + field.GoName = makeNameUnique(field.GoName, true) + field.GoIdent.GoName = message.GoIdent.GoName + "_" + field.GoName + if field.Oneof != nil && field.Oneof.Fields[0] == field { + // Make the name for a oneof unique as well. For historical reasons, + // this assumes that a getter method is not generated for oneofs. + // This is incorrect, but fixing it breaks existing code. + field.Oneof.GoName = makeNameUnique(field.Oneof.GoName, false) + field.Oneof.GoIdent.GoName = message.GoIdent.GoName + "_" + field.Oneof.GoName + } + } + + // Oneof field name conflict resolution. + // + // This conflict resolution is incomplete as it does not consider collisions + // with other oneof field types, but fixing it breaks existing code. + for _, field := range message.Fields { + if field.Oneof != nil { + Loop: + for { + for _, nestedMessage := range message.Messages { + if nestedMessage.GoIdent == field.GoIdent { + field.GoIdent.GoName += "_" + continue Loop + } + } + for _, nestedEnum := range message.Enums { + if nestedEnum.GoIdent == field.GoIdent { + field.GoIdent.GoName += "_" + continue Loop + } + } + break Loop + } + } + } + + return message +} + +func (message *Message) resolveDependencies(gen *Plugin) error { + for _, field := range message.Fields { + if err := field.resolveDependencies(gen); err != nil { + return err + } + } + for _, message := range message.Messages { + if err := message.resolveDependencies(gen); err != nil { + return err + } + } + for _, extension := range message.Extensions { + if err := extension.resolveDependencies(gen); err != nil { + return err + } + } + return nil +} + +// A Field describes a message field. +type Field struct { + Desc protoreflect.FieldDescriptor + + // GoName is the base name of this field's Go field and methods. + // For code generated by protoc-gen-go, this means a field named + // '{{GoName}}' and a getter method named 'Get{{GoName}}'. + GoName string // e.g., "FieldName" + + // GoIdent is the base name of a top-level declaration for this field. + // For code generated by protoc-gen-go, this means a wrapper type named + // '{{GoIdent}}' for members fields of a oneof, and a variable named + // 'E_{{GoIdent}}' for extension fields. + GoIdent GoIdent // e.g., "MessageName_FieldName" + + Parent *Message // message in which this field is declared; nil if top-level extension + Oneof *Oneof // containing oneof; nil if not part of a oneof + Extendee *Message // extended message for extension fields; nil otherwise + + Enum *Enum // type for enum fields; nil otherwise + Message *Message // type for message or group fields; nil otherwise + + Location Location // location of this field + Comments CommentSet // comments associated with this field +} + +func newField(gen *Plugin, f *File, message *Message, desc protoreflect.FieldDescriptor) *Field { + var loc Location + switch { + case desc.IsExtension() && message == nil: + loc = f.location.appendPath(genid.FileDescriptorProto_Extension_field_number, desc.Index()) + case desc.IsExtension() && message != nil: + loc = message.Location.appendPath(genid.DescriptorProto_Extension_field_number, desc.Index()) + default: + loc = message.Location.appendPath(genid.DescriptorProto_Field_field_number, desc.Index()) + } + camelCased := strs.GoCamelCase(string(desc.Name())) + var parentPrefix string + if message != nil { + parentPrefix = message.GoIdent.GoName + "_" + } + field := &Field{ + Desc: desc, + GoName: camelCased, + GoIdent: GoIdent{ + GoImportPath: f.GoImportPath, + GoName: parentPrefix + camelCased, + }, + Parent: message, + Location: loc, + Comments: makeCommentSet(f.Desc.SourceLocations().ByDescriptor(desc)), + } + return field +} + +func (field *Field) resolveDependencies(gen *Plugin) error { + desc := field.Desc + switch desc.Kind() { + case protoreflect.EnumKind: + name := field.Desc.Enum().FullName() + enum, ok := gen.enumsByName[name] + if !ok { + return fmt.Errorf("field %v: no descriptor for enum %v", desc.FullName(), name) + } + field.Enum = enum + case protoreflect.MessageKind, protoreflect.GroupKind: + name := desc.Message().FullName() + message, ok := gen.messagesByName[name] + if !ok { + return fmt.Errorf("field %v: no descriptor for type %v", desc.FullName(), name) + } + field.Message = message + } + if desc.IsExtension() { + name := desc.ContainingMessage().FullName() + message, ok := gen.messagesByName[name] + if !ok { + return fmt.Errorf("field %v: no descriptor for type %v", desc.FullName(), name) + } + field.Extendee = message + } + return nil +} + +// A Oneof describes a message oneof. +type Oneof struct { + Desc protoreflect.OneofDescriptor + + // GoName is the base name of this oneof's Go field and methods. + // For code generated by protoc-gen-go, this means a field named + // '{{GoName}}' and a getter method named 'Get{{GoName}}'. + GoName string // e.g., "OneofName" + + // GoIdent is the base name of a top-level declaration for this oneof. + GoIdent GoIdent // e.g., "MessageName_OneofName" + + Parent *Message // message in which this oneof is declared + + Fields []*Field // fields that are part of this oneof + + Location Location // location of this oneof + Comments CommentSet // comments associated with this oneof +} + +func newOneof(gen *Plugin, f *File, message *Message, desc protoreflect.OneofDescriptor) *Oneof { + loc := message.Location.appendPath(genid.DescriptorProto_OneofDecl_field_number, desc.Index()) + camelCased := strs.GoCamelCase(string(desc.Name())) + parentPrefix := message.GoIdent.GoName + "_" + return &Oneof{ + Desc: desc, + Parent: message, + GoName: camelCased, + GoIdent: GoIdent{ + GoImportPath: f.GoImportPath, + GoName: parentPrefix + camelCased, + }, + Location: loc, + Comments: makeCommentSet(f.Desc.SourceLocations().ByDescriptor(desc)), + } +} + +// Extension is an alias of Field for documentation. +type Extension = Field + +// A Service describes a service. +type Service struct { + Desc protoreflect.ServiceDescriptor + + GoName string + + Methods []*Method // service method declarations + + Location Location // location of this service + Comments CommentSet // comments associated with this service +} + +func newService(gen *Plugin, f *File, desc protoreflect.ServiceDescriptor) *Service { + loc := f.location.appendPath(genid.FileDescriptorProto_Service_field_number, desc.Index()) + service := &Service{ + Desc: desc, + GoName: strs.GoCamelCase(string(desc.Name())), + Location: loc, + Comments: makeCommentSet(f.Desc.SourceLocations().ByDescriptor(desc)), + } + for i, mds := 0, desc.Methods(); i < mds.Len(); i++ { + service.Methods = append(service.Methods, newMethod(gen, f, service, mds.Get(i))) + } + return service +} + +// A Method describes a method in a service. +type Method struct { + Desc protoreflect.MethodDescriptor + + GoName string + + Parent *Service // service in which this method is declared + + Input *Message + Output *Message + + Location Location // location of this method + Comments CommentSet // comments associated with this method +} + +func newMethod(gen *Plugin, f *File, service *Service, desc protoreflect.MethodDescriptor) *Method { + loc := service.Location.appendPath(genid.ServiceDescriptorProto_Method_field_number, desc.Index()) + method := &Method{ + Desc: desc, + GoName: strs.GoCamelCase(string(desc.Name())), + Parent: service, + Location: loc, + Comments: makeCommentSet(f.Desc.SourceLocations().ByDescriptor(desc)), + } + return method +} + +func (method *Method) resolveDependencies(gen *Plugin) error { + desc := method.Desc + + inName := desc.Input().FullName() + in, ok := gen.messagesByName[inName] + if !ok { + return fmt.Errorf("method %v: no descriptor for type %v", desc.FullName(), inName) + } + method.Input = in + + outName := desc.Output().FullName() + out, ok := gen.messagesByName[outName] + if !ok { + return fmt.Errorf("method %v: no descriptor for type %v", desc.FullName(), outName) + } + method.Output = out + + return nil +} + +// A GeneratedFile is a generated file. +type GeneratedFile struct { + gen *Plugin + skip bool + filename string + goImportPath GoImportPath + buf bytes.Buffer + packageNames map[GoImportPath]GoPackageName + usedPackageNames map[GoPackageName]bool + manualImports map[GoImportPath]bool + annotations map[string][]Location +} + +// NewGeneratedFile creates a new generated file with the given filename +// and import path. +func (gen *Plugin) NewGeneratedFile(filename string, goImportPath GoImportPath) *GeneratedFile { + g := &GeneratedFile{ + gen: gen, + filename: filename, + goImportPath: goImportPath, + packageNames: make(map[GoImportPath]GoPackageName), + usedPackageNames: make(map[GoPackageName]bool), + manualImports: make(map[GoImportPath]bool), + annotations: make(map[string][]Location), + } + + // All predeclared identifiers in Go are already used. + for _, s := range types.Universe.Names() { + g.usedPackageNames[GoPackageName(s)] = true + } + + gen.genFiles = append(gen.genFiles, g) + return g +} + +// P prints a line to the generated output. It converts each parameter to a +// string following the same rules as fmt.Print. It never inserts spaces +// between parameters. +func (g *GeneratedFile) P(v ...interface{}) { + for _, x := range v { + switch x := x.(type) { + case GoIdent: + fmt.Fprint(&g.buf, g.QualifiedGoIdent(x)) + default: + fmt.Fprint(&g.buf, x) + } + } + fmt.Fprintln(&g.buf) +} + +// QualifiedGoIdent returns the string to use for a Go identifier. +// +// If the identifier is from a different Go package than the generated file, +// the returned name will be qualified (package.name) and an import statement +// for the identifier's package will be included in the file. +func (g *GeneratedFile) QualifiedGoIdent(ident GoIdent) string { + if ident.GoImportPath == g.goImportPath { + return ident.GoName + } + if packageName, ok := g.packageNames[ident.GoImportPath]; ok { + return string(packageName) + "." + ident.GoName + } + packageName := cleanPackageName(path.Base(string(ident.GoImportPath))) + for i, orig := 1, packageName; g.usedPackageNames[packageName]; i++ { + packageName = orig + GoPackageName(strconv.Itoa(i)) + } + g.packageNames[ident.GoImportPath] = packageName + g.usedPackageNames[packageName] = true + return string(packageName) + "." + ident.GoName +} + +// Import ensures a package is imported by the generated file. +// +// Packages referenced by QualifiedGoIdent are automatically imported. +// Explicitly importing a package with Import is generally only necessary +// when the import will be blank (import _ "package"). +func (g *GeneratedFile) Import(importPath GoImportPath) { + g.manualImports[importPath] = true +} + +// Write implements io.Writer. +func (g *GeneratedFile) Write(p []byte) (n int, err error) { + return g.buf.Write(p) +} + +// Skip removes the generated file from the plugin output. +func (g *GeneratedFile) Skip() { + g.skip = true +} + +// Unskip reverts a previous call to Skip, re-including the generated file in +// the plugin output. +func (g *GeneratedFile) Unskip() { + g.skip = false +} + +// Annotate associates a symbol in a generated Go file with a location in a +// source .proto file. +// +// The symbol may refer to a type, constant, variable, function, method, or +// struct field. The "T.sel" syntax is used to identify the method or field +// 'sel' on type 'T'. +func (g *GeneratedFile) Annotate(symbol string, loc Location) { + g.annotations[symbol] = append(g.annotations[symbol], loc) +} + +// Content returns the contents of the generated file. +func (g *GeneratedFile) Content() ([]byte, error) { + if !strings.HasSuffix(g.filename, ".go") { + return g.buf.Bytes(), nil + } + + // Reformat generated code. + original := g.buf.Bytes() + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, "", original, parser.ParseComments) + if err != nil { + // Print out the bad code with line numbers. + // This should never happen in practice, but it can while changing generated code + // so consider this a debugging aid. + var src bytes.Buffer + s := bufio.NewScanner(bytes.NewReader(original)) + for line := 1; s.Scan(); line++ { + fmt.Fprintf(&src, "%5d\t%s\n", line, s.Bytes()) + } + return nil, fmt.Errorf("%v: unparsable Go source: %v\n%v", g.filename, err, src.String()) + } + + // Collect a sorted list of all imports. + var importPaths [][2]string + rewriteImport := func(importPath string) string { + if f := g.gen.opts.ImportRewriteFunc; f != nil { + return string(f(GoImportPath(importPath))) + } + return importPath + } + for importPath := range g.packageNames { + pkgName := string(g.packageNames[GoImportPath(importPath)]) + pkgPath := rewriteImport(string(importPath)) + importPaths = append(importPaths, [2]string{pkgName, pkgPath}) + } + for importPath := range g.manualImports { + if _, ok := g.packageNames[importPath]; !ok { + pkgPath := rewriteImport(string(importPath)) + importPaths = append(importPaths, [2]string{"_", pkgPath}) + } + } + sort.Slice(importPaths, func(i, j int) bool { + return importPaths[i][1] < importPaths[j][1] + }) + + // Modify the AST to include a new import block. + if len(importPaths) > 0 { + // Insert block after package statement or + // possible comment attached to the end of the package statement. + pos := file.Package + tokFile := fset.File(file.Package) + pkgLine := tokFile.Line(file.Package) + for _, c := range file.Comments { + if tokFile.Line(c.Pos()) > pkgLine { + break + } + pos = c.End() + } + + // Construct the import block. + impDecl := &ast.GenDecl{ + Tok: token.IMPORT, + TokPos: pos, + Lparen: pos, + Rparen: pos, + } + for _, importPath := range importPaths { + impDecl.Specs = append(impDecl.Specs, &ast.ImportSpec{ + Name: &ast.Ident{ + Name: importPath[0], + NamePos: pos, + }, + Path: &ast.BasicLit{ + Kind: token.STRING, + Value: strconv.Quote(importPath[1]), + ValuePos: pos, + }, + EndPos: pos, + }) + } + file.Decls = append([]ast.Decl{impDecl}, file.Decls...) + } + + var out bytes.Buffer + if err = (&printer.Config{Mode: printer.TabIndent | printer.UseSpaces, Tabwidth: 8}).Fprint(&out, fset, file); err != nil { + return nil, fmt.Errorf("%v: can not reformat Go source: %v", g.filename, err) + } + return out.Bytes(), nil +} + +// metaFile returns the contents of the file's metadata file, which is a +// text formatted string of the google.protobuf.GeneratedCodeInfo. +func (g *GeneratedFile) metaFile(content []byte) (string, error) { + fset := token.NewFileSet() + astFile, err := parser.ParseFile(fset, "", content, 0) + if err != nil { + return "", err + } + info := &descriptorpb.GeneratedCodeInfo{} + + seenAnnotations := make(map[string]bool) + annotate := func(s string, ident *ast.Ident) { + seenAnnotations[s] = true + for _, loc := range g.annotations[s] { + info.Annotation = append(info.Annotation, &descriptorpb.GeneratedCodeInfo_Annotation{ + SourceFile: proto.String(loc.SourceFile), + Path: loc.Path, + Begin: proto.Int32(int32(fset.Position(ident.Pos()).Offset)), + End: proto.Int32(int32(fset.Position(ident.End()).Offset)), + }) + } + } + for _, decl := range astFile.Decls { + switch decl := decl.(type) { + case *ast.GenDecl: + for _, spec := range decl.Specs { + switch spec := spec.(type) { + case *ast.TypeSpec: + annotate(spec.Name.Name, spec.Name) + switch st := spec.Type.(type) { + case *ast.StructType: + for _, field := range st.Fields.List { + for _, name := range field.Names { + annotate(spec.Name.Name+"."+name.Name, name) + } + } + case *ast.InterfaceType: + for _, field := range st.Methods.List { + for _, name := range field.Names { + annotate(spec.Name.Name+"."+name.Name, name) + } + } + } + case *ast.ValueSpec: + for _, name := range spec.Names { + annotate(name.Name, name) + } + } + } + case *ast.FuncDecl: + if decl.Recv == nil { + annotate(decl.Name.Name, decl.Name) + } else { + recv := decl.Recv.List[0].Type + if s, ok := recv.(*ast.StarExpr); ok { + recv = s.X + } + if id, ok := recv.(*ast.Ident); ok { + annotate(id.Name+"."+decl.Name.Name, decl.Name) + } + } + } + } + for a := range g.annotations { + if !seenAnnotations[a] { + return "", fmt.Errorf("%v: no symbol matching annotation %q", g.filename, a) + } + } + + b, err := prototext.Marshal(info) + if err != nil { + return "", err + } + return string(b), nil +} + +// A GoIdent is a Go identifier, consisting of a name and import path. +// The name is a single identifier and may not be a dot-qualified selector. +type GoIdent struct { + GoName string + GoImportPath GoImportPath +} + +func (id GoIdent) String() string { return fmt.Sprintf("%q.%v", id.GoImportPath, id.GoName) } + +// newGoIdent returns the Go identifier for a descriptor. +func newGoIdent(f *File, d protoreflect.Descriptor) GoIdent { + name := strings.TrimPrefix(string(d.FullName()), string(f.Desc.Package())+".") + return GoIdent{ + GoName: strs.GoCamelCase(name), + GoImportPath: f.GoImportPath, + } +} + +// A GoImportPath is the import path of a Go package. +// For example: "google.golang.org/protobuf/compiler/protogen" +type GoImportPath string + +func (p GoImportPath) String() string { return strconv.Quote(string(p)) } + +// Ident returns a GoIdent with s as the GoName and p as the GoImportPath. +func (p GoImportPath) Ident(s string) GoIdent { + return GoIdent{GoName: s, GoImportPath: p} +} + +// A GoPackageName is the name of a Go package. e.g., "protobuf". +type GoPackageName string + +// cleanPackageName converts a string to a valid Go package name. +func cleanPackageName(name string) GoPackageName { + return GoPackageName(strs.GoSanitized(name)) +} + +type pathType int + +const ( + pathTypeImport pathType = iota + pathTypeSourceRelative +) + +// A Location is a location in a .proto source file. +// +// See the google.protobuf.SourceCodeInfo documentation in descriptor.proto +// for details. +type Location struct { + SourceFile string + Path protoreflect.SourcePath +} + +// appendPath add elements to a Location's path, returning a new Location. +func (loc Location) appendPath(num protoreflect.FieldNumber, idx int) Location { + loc.Path = append(protoreflect.SourcePath(nil), loc.Path...) // make copy + loc.Path = append(loc.Path, int32(num), int32(idx)) + return loc +} + +// CommentSet is a set of leading and trailing comments associated +// with a .proto descriptor declaration. +type CommentSet struct { + LeadingDetached []Comments + Leading Comments + Trailing Comments +} + +func makeCommentSet(loc protoreflect.SourceLocation) CommentSet { + var leadingDetached []Comments + for _, s := range loc.LeadingDetachedComments { + leadingDetached = append(leadingDetached, Comments(s)) + } + return CommentSet{ + LeadingDetached: leadingDetached, + Leading: Comments(loc.LeadingComments), + Trailing: Comments(loc.TrailingComments), + } +} + +// Comments is a comments string as provided by protoc. +type Comments string + +// String formats the comments by inserting // to the start of each line, +// ensuring that there is a trailing newline. +// An empty comment is formatted as an empty string. +func (c Comments) String() string { + if c == "" { + return "" + } + var b []byte + for _, line := range strings.Split(strings.TrimSuffix(string(c), "\n"), "\n") { + b = append(b, "//"...) + b = append(b, line...) + b = append(b, "\n"...) + } + return string(b) +} diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go index 07da5db34..5f28148d8 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go @@ -19,7 +19,7 @@ import ( "google.golang.org/protobuf/internal/pragma" "google.golang.org/protobuf/internal/set" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -113,7 +113,7 @@ func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { } // unmarshalMessage unmarshals a message into the given protoreflect.Message. -func (d decoder) unmarshalMessage(m pref.Message, skipTypeURL bool) error { +func (d decoder) unmarshalMessage(m protoreflect.Message, skipTypeURL bool) error { if unmarshal := wellKnownTypeUnmarshaler(m.Descriptor().FullName()); unmarshal != nil { return unmarshal(d, m) } @@ -159,10 +159,10 @@ func (d decoder) unmarshalMessage(m pref.Message, skipTypeURL bool) error { } // Get the FieldDescriptor. - var fd pref.FieldDescriptor + var fd protoreflect.FieldDescriptor if strings.HasPrefix(name, "[") && strings.HasSuffix(name, "]") { // Only extension names are in [name] format. - extName := pref.FullName(name[1 : len(name)-1]) + extName := protoreflect.FullName(name[1 : len(name)-1]) extType, err := d.opts.Resolver.FindExtensionByName(extName) if err != nil && err != protoregistry.NotFound { return d.newError(tok.Pos(), "unable to resolve %s: %v", tok.RawString(), err) @@ -240,23 +240,23 @@ func (d decoder) unmarshalMessage(m pref.Message, skipTypeURL bool) error { } } -func isKnownValue(fd pref.FieldDescriptor) bool { +func isKnownValue(fd protoreflect.FieldDescriptor) bool { md := fd.Message() return md != nil && md.FullName() == genid.Value_message_fullname } -func isNullValue(fd pref.FieldDescriptor) bool { +func isNullValue(fd protoreflect.FieldDescriptor) bool { ed := fd.Enum() return ed != nil && ed.FullName() == genid.NullValue_enum_fullname } // unmarshalSingular unmarshals to the non-repeated field specified // by the given FieldDescriptor. -func (d decoder) unmarshalSingular(m pref.Message, fd pref.FieldDescriptor) error { - var val pref.Value +func (d decoder) unmarshalSingular(m protoreflect.Message, fd protoreflect.FieldDescriptor) error { + var val protoreflect.Value var err error switch fd.Kind() { - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: val = m.NewField(fd) err = d.unmarshalMessage(val.Message(), false) default: @@ -272,63 +272,63 @@ func (d decoder) unmarshalSingular(m pref.Message, fd pref.FieldDescriptor) erro // unmarshalScalar unmarshals to a scalar/enum protoreflect.Value specified by // the given FieldDescriptor. -func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) { +func (d decoder) unmarshalScalar(fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { const b32 int = 32 const b64 int = 64 tok, err := d.Read() if err != nil { - return pref.Value{}, err + return protoreflect.Value{}, err } kind := fd.Kind() switch kind { - case pref.BoolKind: + case protoreflect.BoolKind: if tok.Kind() == json.Bool { - return pref.ValueOfBool(tok.Bool()), nil + return protoreflect.ValueOfBool(tok.Bool()), nil } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: if v, ok := unmarshalInt(tok, b32); ok { return v, nil } - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: if v, ok := unmarshalInt(tok, b64); ok { return v, nil } - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: if v, ok := unmarshalUint(tok, b32); ok { return v, nil } - case pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: if v, ok := unmarshalUint(tok, b64); ok { return v, nil } - case pref.FloatKind: + case protoreflect.FloatKind: if v, ok := unmarshalFloat(tok, b32); ok { return v, nil } - case pref.DoubleKind: + case protoreflect.DoubleKind: if v, ok := unmarshalFloat(tok, b64); ok { return v, nil } - case pref.StringKind: + case protoreflect.StringKind: if tok.Kind() == json.String { - return pref.ValueOfString(tok.ParsedString()), nil + return protoreflect.ValueOfString(tok.ParsedString()), nil } - case pref.BytesKind: + case protoreflect.BytesKind: if v, ok := unmarshalBytes(tok); ok { return v, nil } - case pref.EnumKind: + case protoreflect.EnumKind: if v, ok := unmarshalEnum(tok, fd); ok { return v, nil } @@ -337,10 +337,10 @@ func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) { panic(fmt.Sprintf("unmarshalScalar: invalid scalar kind %v", kind)) } - return pref.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) + return protoreflect.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) } -func unmarshalInt(tok json.Token, bitSize int) (pref.Value, bool) { +func unmarshalInt(tok json.Token, bitSize int) (protoreflect.Value, bool) { switch tok.Kind() { case json.Number: return getInt(tok, bitSize) @@ -349,30 +349,30 @@ func unmarshalInt(tok json.Token, bitSize int) (pref.Value, bool) { // Decode number from string. s := strings.TrimSpace(tok.ParsedString()) if len(s) != len(tok.ParsedString()) { - return pref.Value{}, false + return protoreflect.Value{}, false } dec := json.NewDecoder([]byte(s)) tok, err := dec.Read() if err != nil { - return pref.Value{}, false + return protoreflect.Value{}, false } return getInt(tok, bitSize) } - return pref.Value{}, false + return protoreflect.Value{}, false } -func getInt(tok json.Token, bitSize int) (pref.Value, bool) { +func getInt(tok json.Token, bitSize int) (protoreflect.Value, bool) { n, ok := tok.Int(bitSize) if !ok { - return pref.Value{}, false + return protoreflect.Value{}, false } if bitSize == 32 { - return pref.ValueOfInt32(int32(n)), true + return protoreflect.ValueOfInt32(int32(n)), true } - return pref.ValueOfInt64(n), true + return protoreflect.ValueOfInt64(n), true } -func unmarshalUint(tok json.Token, bitSize int) (pref.Value, bool) { +func unmarshalUint(tok json.Token, bitSize int) (protoreflect.Value, bool) { switch tok.Kind() { case json.Number: return getUint(tok, bitSize) @@ -381,30 +381,30 @@ func unmarshalUint(tok json.Token, bitSize int) (pref.Value, bool) { // Decode number from string. s := strings.TrimSpace(tok.ParsedString()) if len(s) != len(tok.ParsedString()) { - return pref.Value{}, false + return protoreflect.Value{}, false } dec := json.NewDecoder([]byte(s)) tok, err := dec.Read() if err != nil { - return pref.Value{}, false + return protoreflect.Value{}, false } return getUint(tok, bitSize) } - return pref.Value{}, false + return protoreflect.Value{}, false } -func getUint(tok json.Token, bitSize int) (pref.Value, bool) { +func getUint(tok json.Token, bitSize int) (protoreflect.Value, bool) { n, ok := tok.Uint(bitSize) if !ok { - return pref.Value{}, false + return protoreflect.Value{}, false } if bitSize == 32 { - return pref.ValueOfUint32(uint32(n)), true + return protoreflect.ValueOfUint32(uint32(n)), true } - return pref.ValueOfUint64(n), true + return protoreflect.ValueOfUint64(n), true } -func unmarshalFloat(tok json.Token, bitSize int) (pref.Value, bool) { +func unmarshalFloat(tok json.Token, bitSize int) (protoreflect.Value, bool) { switch tok.Kind() { case json.Number: return getFloat(tok, bitSize) @@ -414,49 +414,49 @@ func unmarshalFloat(tok json.Token, bitSize int) (pref.Value, bool) { switch s { case "NaN": if bitSize == 32 { - return pref.ValueOfFloat32(float32(math.NaN())), true + return protoreflect.ValueOfFloat32(float32(math.NaN())), true } - return pref.ValueOfFloat64(math.NaN()), true + return protoreflect.ValueOfFloat64(math.NaN()), true case "Infinity": if bitSize == 32 { - return pref.ValueOfFloat32(float32(math.Inf(+1))), true + return protoreflect.ValueOfFloat32(float32(math.Inf(+1))), true } - return pref.ValueOfFloat64(math.Inf(+1)), true + return protoreflect.ValueOfFloat64(math.Inf(+1)), true case "-Infinity": if bitSize == 32 { - return pref.ValueOfFloat32(float32(math.Inf(-1))), true + return protoreflect.ValueOfFloat32(float32(math.Inf(-1))), true } - return pref.ValueOfFloat64(math.Inf(-1)), true + return protoreflect.ValueOfFloat64(math.Inf(-1)), true } // Decode number from string. if len(s) != len(strings.TrimSpace(s)) { - return pref.Value{}, false + return protoreflect.Value{}, false } dec := json.NewDecoder([]byte(s)) tok, err := dec.Read() if err != nil { - return pref.Value{}, false + return protoreflect.Value{}, false } return getFloat(tok, bitSize) } - return pref.Value{}, false + return protoreflect.Value{}, false } -func getFloat(tok json.Token, bitSize int) (pref.Value, bool) { +func getFloat(tok json.Token, bitSize int) (protoreflect.Value, bool) { n, ok := tok.Float(bitSize) if !ok { - return pref.Value{}, false + return protoreflect.Value{}, false } if bitSize == 32 { - return pref.ValueOfFloat32(float32(n)), true + return protoreflect.ValueOfFloat32(float32(n)), true } - return pref.ValueOfFloat64(n), true + return protoreflect.ValueOfFloat64(n), true } -func unmarshalBytes(tok json.Token) (pref.Value, bool) { +func unmarshalBytes(tok json.Token) (protoreflect.Value, bool) { if tok.Kind() != json.String { - return pref.Value{}, false + return protoreflect.Value{}, false } s := tok.ParsedString() @@ -469,36 +469,36 @@ func unmarshalBytes(tok json.Token) (pref.Value, bool) { } b, err := enc.DecodeString(s) if err != nil { - return pref.Value{}, false + return protoreflect.Value{}, false } - return pref.ValueOfBytes(b), true + return protoreflect.ValueOfBytes(b), true } -func unmarshalEnum(tok json.Token, fd pref.FieldDescriptor) (pref.Value, bool) { +func unmarshalEnum(tok json.Token, fd protoreflect.FieldDescriptor) (protoreflect.Value, bool) { switch tok.Kind() { case json.String: // Lookup EnumNumber based on name. s := tok.ParsedString() - if enumVal := fd.Enum().Values().ByName(pref.Name(s)); enumVal != nil { - return pref.ValueOfEnum(enumVal.Number()), true + if enumVal := fd.Enum().Values().ByName(protoreflect.Name(s)); enumVal != nil { + return protoreflect.ValueOfEnum(enumVal.Number()), true } case json.Number: if n, ok := tok.Int(32); ok { - return pref.ValueOfEnum(pref.EnumNumber(n)), true + return protoreflect.ValueOfEnum(protoreflect.EnumNumber(n)), true } case json.Null: // This is only valid for google.protobuf.NullValue. if isNullValue(fd) { - return pref.ValueOfEnum(0), true + return protoreflect.ValueOfEnum(0), true } } - return pref.Value{}, false + return protoreflect.Value{}, false } -func (d decoder) unmarshalList(list pref.List, fd pref.FieldDescriptor) error { +func (d decoder) unmarshalList(list protoreflect.List, fd protoreflect.FieldDescriptor) error { tok, err := d.Read() if err != nil { return err @@ -508,7 +508,7 @@ func (d decoder) unmarshalList(list pref.List, fd pref.FieldDescriptor) error { } switch fd.Kind() { - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: for { tok, err := d.Peek() if err != nil { @@ -549,7 +549,7 @@ func (d decoder) unmarshalList(list pref.List, fd pref.FieldDescriptor) error { return nil } -func (d decoder) unmarshalMap(mmap pref.Map, fd pref.FieldDescriptor) error { +func (d decoder) unmarshalMap(mmap protoreflect.Map, fd protoreflect.FieldDescriptor) error { tok, err := d.Read() if err != nil { return err @@ -561,18 +561,18 @@ func (d decoder) unmarshalMap(mmap pref.Map, fd pref.FieldDescriptor) error { // Determine ahead whether map entry is a scalar type or a message type in // order to call the appropriate unmarshalMapValue func inside the for loop // below. - var unmarshalMapValue func() (pref.Value, error) + var unmarshalMapValue func() (protoreflect.Value, error) switch fd.MapValue().Kind() { - case pref.MessageKind, pref.GroupKind: - unmarshalMapValue = func() (pref.Value, error) { + case protoreflect.MessageKind, protoreflect.GroupKind: + unmarshalMapValue = func() (protoreflect.Value, error) { val := mmap.NewValue() if err := d.unmarshalMessage(val.Message(), false); err != nil { - return pref.Value{}, err + return protoreflect.Value{}, err } return val, nil } default: - unmarshalMapValue = func() (pref.Value, error) { + unmarshalMapValue = func() (protoreflect.Value, error) { return d.unmarshalScalar(fd.MapValue()) } } @@ -618,7 +618,7 @@ Loop: // unmarshalMapKey converts given token of Name kind into a protoreflect.MapKey. // A map key type is any integral or string type. -func (d decoder) unmarshalMapKey(tok json.Token, fd pref.FieldDescriptor) (pref.MapKey, error) { +func (d decoder) unmarshalMapKey(tok json.Token, fd protoreflect.FieldDescriptor) (protoreflect.MapKey, error) { const b32 = 32 const b64 = 64 const base10 = 10 @@ -626,40 +626,40 @@ func (d decoder) unmarshalMapKey(tok json.Token, fd pref.FieldDescriptor) (pref. name := tok.Name() kind := fd.Kind() switch kind { - case pref.StringKind: - return pref.ValueOfString(name).MapKey(), nil + case protoreflect.StringKind: + return protoreflect.ValueOfString(name).MapKey(), nil - case pref.BoolKind: + case protoreflect.BoolKind: switch name { case "true": - return pref.ValueOfBool(true).MapKey(), nil + return protoreflect.ValueOfBool(true).MapKey(), nil case "false": - return pref.ValueOfBool(false).MapKey(), nil + return protoreflect.ValueOfBool(false).MapKey(), nil } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: if n, err := strconv.ParseInt(name, base10, b32); err == nil { - return pref.ValueOfInt32(int32(n)).MapKey(), nil + return protoreflect.ValueOfInt32(int32(n)).MapKey(), nil } - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: if n, err := strconv.ParseInt(name, base10, b64); err == nil { - return pref.ValueOfInt64(int64(n)).MapKey(), nil + return protoreflect.ValueOfInt64(int64(n)).MapKey(), nil } - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: if n, err := strconv.ParseUint(name, base10, b32); err == nil { - return pref.ValueOfUint32(uint32(n)).MapKey(), nil + return protoreflect.ValueOfUint32(uint32(n)).MapKey(), nil } - case pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: if n, err := strconv.ParseUint(name, base10, b64); err == nil { - return pref.ValueOfUint64(uint64(n)).MapKey(), nil + return protoreflect.ValueOfUint64(uint64(n)).MapKey(), nil } default: panic(fmt.Sprintf("invalid kind for map key: %v", kind)) } - return pref.MapKey{}, d.newError(tok.Pos(), "invalid value for %v key: %s", kind, tok.RawString()) + return protoreflect.MapKey{}, d.newError(tok.Pos(), "invalid value for %v key: %s", kind, tok.RawString()) } diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/encode.go b/vendor/google.golang.org/protobuf/encoding/protojson/encode.go index ba971f078..d09d22e13 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/encode.go @@ -18,7 +18,6 @@ import ( "google.golang.org/protobuf/internal/pragma" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -164,8 +163,8 @@ type typeURLFieldRanger struct { typeURL string } -func (m typeURLFieldRanger) Range(f func(pref.FieldDescriptor, pref.Value) bool) { - if !f(typeFieldDesc, pref.ValueOfString(m.typeURL)) { +func (m typeURLFieldRanger) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if !f(typeFieldDesc, protoreflect.ValueOfString(m.typeURL)) { return } m.FieldRanger.Range(f) @@ -173,9 +172,9 @@ func (m typeURLFieldRanger) Range(f func(pref.FieldDescriptor, pref.Value) bool) // unpopulatedFieldRanger wraps a protoreflect.Message and modifies its Range // method to additionally iterate over unpopulated fields. -type unpopulatedFieldRanger struct{ pref.Message } +type unpopulatedFieldRanger struct{ protoreflect.Message } -func (m unpopulatedFieldRanger) Range(f func(pref.FieldDescriptor, pref.Value) bool) { +func (m unpopulatedFieldRanger) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { fds := m.Descriptor().Fields() for i := 0; i < fds.Len(); i++ { fd := fds.Get(i) @@ -184,10 +183,10 @@ func (m unpopulatedFieldRanger) Range(f func(pref.FieldDescriptor, pref.Value) b } v := m.Get(fd) - isProto2Scalar := fd.Syntax() == pref.Proto2 && fd.Default().IsValid() - isSingularMessage := fd.Cardinality() != pref.Repeated && fd.Message() != nil + isProto2Scalar := fd.Syntax() == protoreflect.Proto2 && fd.Default().IsValid() + isSingularMessage := fd.Cardinality() != protoreflect.Repeated && fd.Message() != nil if isProto2Scalar || isSingularMessage { - v = pref.Value{} // use invalid value to emit null + v = protoreflect.Value{} // use invalid value to emit null } if !f(fd, v) { return @@ -199,7 +198,7 @@ func (m unpopulatedFieldRanger) Range(f func(pref.FieldDescriptor, pref.Value) b // marshalMessage marshals the fields in the given protoreflect.Message. // If the typeURL is non-empty, then a synthetic "@type" field is injected // containing the URL as the value. -func (e encoder) marshalMessage(m pref.Message, typeURL string) error { +func (e encoder) marshalMessage(m protoreflect.Message, typeURL string) error { if !flags.ProtoLegacy && messageset.IsMessageSet(m.Descriptor()) { return errors.New("no support for proto1 MessageSets") } @@ -220,7 +219,7 @@ func (e encoder) marshalMessage(m pref.Message, typeURL string) error { } var err error - order.RangeFields(fields, order.IndexNameFieldOrder, func(fd pref.FieldDescriptor, v pref.Value) bool { + order.RangeFields(fields, order.IndexNameFieldOrder, func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { name := fd.JSONName() if e.opts.UseProtoNames { name = fd.TextName() @@ -238,7 +237,7 @@ func (e encoder) marshalMessage(m pref.Message, typeURL string) error { } // marshalValue marshals the given protoreflect.Value. -func (e encoder) marshalValue(val pref.Value, fd pref.FieldDescriptor) error { +func (e encoder) marshalValue(val protoreflect.Value, fd protoreflect.FieldDescriptor) error { switch { case fd.IsList(): return e.marshalList(val.List(), fd) @@ -251,44 +250,44 @@ func (e encoder) marshalValue(val pref.Value, fd pref.FieldDescriptor) error { // marshalSingular marshals the given non-repeated field value. This includes // all scalar types, enums, messages, and groups. -func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error { +func (e encoder) marshalSingular(val protoreflect.Value, fd protoreflect.FieldDescriptor) error { if !val.IsValid() { e.WriteNull() return nil } switch kind := fd.Kind(); kind { - case pref.BoolKind: + case protoreflect.BoolKind: e.WriteBool(val.Bool()) - case pref.StringKind: + case protoreflect.StringKind: if e.WriteString(val.String()) != nil { return errors.InvalidUTF8(string(fd.FullName())) } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: e.WriteInt(val.Int()) - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: e.WriteUint(val.Uint()) - case pref.Int64Kind, pref.Sint64Kind, pref.Uint64Kind, - pref.Sfixed64Kind, pref.Fixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Uint64Kind, + protoreflect.Sfixed64Kind, protoreflect.Fixed64Kind: // 64-bit integers are written out as JSON string. e.WriteString(val.String()) - case pref.FloatKind: + case protoreflect.FloatKind: // Encoder.WriteFloat handles the special numbers NaN and infinites. e.WriteFloat(val.Float(), 32) - case pref.DoubleKind: + case protoreflect.DoubleKind: // Encoder.WriteFloat handles the special numbers NaN and infinites. e.WriteFloat(val.Float(), 64) - case pref.BytesKind: + case protoreflect.BytesKind: e.WriteString(base64.StdEncoding.EncodeToString(val.Bytes())) - case pref.EnumKind: + case protoreflect.EnumKind: if fd.Enum().FullName() == genid.NullValue_enum_fullname { e.WriteNull() } else { @@ -300,7 +299,7 @@ func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error } } - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: if err := e.marshalMessage(val.Message(), ""); err != nil { return err } @@ -312,7 +311,7 @@ func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error } // marshalList marshals the given protoreflect.List. -func (e encoder) marshalList(list pref.List, fd pref.FieldDescriptor) error { +func (e encoder) marshalList(list protoreflect.List, fd protoreflect.FieldDescriptor) error { e.StartArray() defer e.EndArray() @@ -326,12 +325,12 @@ func (e encoder) marshalList(list pref.List, fd pref.FieldDescriptor) error { } // marshalMap marshals given protoreflect.Map. -func (e encoder) marshalMap(mmap pref.Map, fd pref.FieldDescriptor) error { +func (e encoder) marshalMap(mmap protoreflect.Map, fd protoreflect.FieldDescriptor) error { e.StartObject() defer e.EndObject() var err error - order.RangeEntries(mmap, order.GenericKeyOrder, func(k pref.MapKey, v pref.Value) bool { + order.RangeEntries(mmap, order.GenericKeyOrder, func(k protoreflect.MapKey, v protoreflect.Value) bool { if err = e.WriteName(k.String()); err != nil { return false } diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go index 72924a905..c85f84694 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go @@ -17,14 +17,14 @@ import ( "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) -type marshalFunc func(encoder, pref.Message) error +type marshalFunc func(encoder, protoreflect.Message) error // wellKnownTypeMarshaler returns a marshal function if the message type // has specialized serialization behavior. It returns nil otherwise. -func wellKnownTypeMarshaler(name pref.FullName) marshalFunc { +func wellKnownTypeMarshaler(name protoreflect.FullName) marshalFunc { if name.Parent() == genid.GoogleProtobuf_package { switch name.Name() { case genid.Any_message_name: @@ -58,11 +58,11 @@ func wellKnownTypeMarshaler(name pref.FullName) marshalFunc { return nil } -type unmarshalFunc func(decoder, pref.Message) error +type unmarshalFunc func(decoder, protoreflect.Message) error // wellKnownTypeUnmarshaler returns a unmarshal function if the message type // has specialized serialization behavior. It returns nil otherwise. -func wellKnownTypeUnmarshaler(name pref.FullName) unmarshalFunc { +func wellKnownTypeUnmarshaler(name protoreflect.FullName) unmarshalFunc { if name.Parent() == genid.GoogleProtobuf_package { switch name.Name() { case genid.Any_message_name: @@ -102,7 +102,7 @@ func wellKnownTypeUnmarshaler(name pref.FullName) unmarshalFunc { // custom JSON representation, that representation will be embedded adding a // field `value` which holds the custom JSON in addition to the `@type` field. -func (e encoder) marshalAny(m pref.Message) error { +func (e encoder) marshalAny(m protoreflect.Message) error { fds := m.Descriptor().Fields() fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) fdValue := fds.ByNumber(genid.Any_Value_field_number) @@ -163,7 +163,7 @@ func (e encoder) marshalAny(m pref.Message) error { return nil } -func (d decoder) unmarshalAny(m pref.Message) error { +func (d decoder) unmarshalAny(m protoreflect.Message) error { // Peek to check for json.ObjectOpen to avoid advancing a read. start, err := d.Peek() if err != nil { @@ -233,8 +233,8 @@ func (d decoder) unmarshalAny(m pref.Message) error { fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) fdValue := fds.ByNumber(genid.Any_Value_field_number) - m.Set(fdType, pref.ValueOfString(typeURL)) - m.Set(fdValue, pref.ValueOfBytes(b)) + m.Set(fdType, protoreflect.ValueOfString(typeURL)) + m.Set(fdValue, protoreflect.ValueOfBytes(b)) return nil } @@ -354,7 +354,7 @@ func (d decoder) skipJSONValue() error { // unmarshalAnyValue unmarshals the given custom-type message from the JSON // object's "value" field. -func (d decoder) unmarshalAnyValue(unmarshal unmarshalFunc, m pref.Message) error { +func (d decoder) unmarshalAnyValue(unmarshal unmarshalFunc, m protoreflect.Message) error { // Skip ObjectOpen, and start reading the fields. d.Read() @@ -402,13 +402,13 @@ func (d decoder) unmarshalAnyValue(unmarshal unmarshalFunc, m pref.Message) erro // Wrapper types are encoded as JSON primitives like string, number or boolean. -func (e encoder) marshalWrapperType(m pref.Message) error { +func (e encoder) marshalWrapperType(m protoreflect.Message) error { fd := m.Descriptor().Fields().ByNumber(genid.WrapperValue_Value_field_number) val := m.Get(fd) return e.marshalSingular(val, fd) } -func (d decoder) unmarshalWrapperType(m pref.Message) error { +func (d decoder) unmarshalWrapperType(m protoreflect.Message) error { fd := m.Descriptor().Fields().ByNumber(genid.WrapperValue_Value_field_number) val, err := d.unmarshalScalar(fd) if err != nil { @@ -420,13 +420,13 @@ func (d decoder) unmarshalWrapperType(m pref.Message) error { // The JSON representation for Empty is an empty JSON object. -func (e encoder) marshalEmpty(pref.Message) error { +func (e encoder) marshalEmpty(protoreflect.Message) error { e.StartObject() e.EndObject() return nil } -func (d decoder) unmarshalEmpty(pref.Message) error { +func (d decoder) unmarshalEmpty(protoreflect.Message) error { tok, err := d.Read() if err != nil { return err @@ -462,12 +462,12 @@ func (d decoder) unmarshalEmpty(pref.Message) error { // The JSON representation for Struct is a JSON object that contains the encoded // Struct.fields map and follows the serialization rules for a map. -func (e encoder) marshalStruct(m pref.Message) error { +func (e encoder) marshalStruct(m protoreflect.Message) error { fd := m.Descriptor().Fields().ByNumber(genid.Struct_Fields_field_number) return e.marshalMap(m.Get(fd).Map(), fd) } -func (d decoder) unmarshalStruct(m pref.Message) error { +func (d decoder) unmarshalStruct(m protoreflect.Message) error { fd := m.Descriptor().Fields().ByNumber(genid.Struct_Fields_field_number) return d.unmarshalMap(m.Mutable(fd).Map(), fd) } @@ -476,12 +476,12 @@ func (d decoder) unmarshalStruct(m pref.Message) error { // ListValue.values repeated field and follows the serialization rules for a // repeated field. -func (e encoder) marshalListValue(m pref.Message) error { +func (e encoder) marshalListValue(m protoreflect.Message) error { fd := m.Descriptor().Fields().ByNumber(genid.ListValue_Values_field_number) return e.marshalList(m.Get(fd).List(), fd) } -func (d decoder) unmarshalListValue(m pref.Message) error { +func (d decoder) unmarshalListValue(m protoreflect.Message) error { fd := m.Descriptor().Fields().ByNumber(genid.ListValue_Values_field_number) return d.unmarshalList(m.Mutable(fd).List(), fd) } @@ -490,7 +490,7 @@ func (d decoder) unmarshalListValue(m pref.Message) error { // set. Each of the field in the oneof has its own custom serialization rule. A // Value message needs to be a oneof field set, else it is an error. -func (e encoder) marshalKnownValue(m pref.Message) error { +func (e encoder) marshalKnownValue(m protoreflect.Message) error { od := m.Descriptor().Oneofs().ByName(genid.Value_Kind_oneof_name) fd := m.WhichOneof(od) if fd == nil { @@ -504,19 +504,19 @@ func (e encoder) marshalKnownValue(m pref.Message) error { return e.marshalSingular(m.Get(fd), fd) } -func (d decoder) unmarshalKnownValue(m pref.Message) error { +func (d decoder) unmarshalKnownValue(m protoreflect.Message) error { tok, err := d.Peek() if err != nil { return err } - var fd pref.FieldDescriptor - var val pref.Value + var fd protoreflect.FieldDescriptor + var val protoreflect.Value switch tok.Kind() { case json.Null: d.Read() fd = m.Descriptor().Fields().ByNumber(genid.Value_NullValue_field_number) - val = pref.ValueOfEnum(0) + val = protoreflect.ValueOfEnum(0) case json.Bool: tok, err := d.Read() @@ -524,7 +524,7 @@ func (d decoder) unmarshalKnownValue(m pref.Message) error { return err } fd = m.Descriptor().Fields().ByNumber(genid.Value_BoolValue_field_number) - val = pref.ValueOfBool(tok.Bool()) + val = protoreflect.ValueOfBool(tok.Bool()) case json.Number: tok, err := d.Read() @@ -550,7 +550,7 @@ func (d decoder) unmarshalKnownValue(m pref.Message) error { return err } fd = m.Descriptor().Fields().ByNumber(genid.Value_StringValue_field_number) - val = pref.ValueOfString(tok.ParsedString()) + val = protoreflect.ValueOfString(tok.ParsedString()) case json.ObjectOpen: fd = m.Descriptor().Fields().ByNumber(genid.Value_StructValue_field_number) @@ -591,7 +591,7 @@ const ( maxSecondsInDuration = 315576000000 ) -func (e encoder) marshalDuration(m pref.Message) error { +func (e encoder) marshalDuration(m protoreflect.Message) error { fds := m.Descriptor().Fields() fdSeconds := fds.ByNumber(genid.Duration_Seconds_field_number) fdNanos := fds.ByNumber(genid.Duration_Nanos_field_number) @@ -623,7 +623,7 @@ func (e encoder) marshalDuration(m pref.Message) error { return nil } -func (d decoder) unmarshalDuration(m pref.Message) error { +func (d decoder) unmarshalDuration(m protoreflect.Message) error { tok, err := d.Read() if err != nil { return err @@ -646,8 +646,8 @@ func (d decoder) unmarshalDuration(m pref.Message) error { fdSeconds := fds.ByNumber(genid.Duration_Seconds_field_number) fdNanos := fds.ByNumber(genid.Duration_Nanos_field_number) - m.Set(fdSeconds, pref.ValueOfInt64(secs)) - m.Set(fdNanos, pref.ValueOfInt32(nanos)) + m.Set(fdSeconds, protoreflect.ValueOfInt64(secs)) + m.Set(fdNanos, protoreflect.ValueOfInt32(nanos)) return nil } @@ -779,7 +779,7 @@ const ( minTimestampSeconds = -62135596800 ) -func (e encoder) marshalTimestamp(m pref.Message) error { +func (e encoder) marshalTimestamp(m protoreflect.Message) error { fds := m.Descriptor().Fields() fdSeconds := fds.ByNumber(genid.Timestamp_Seconds_field_number) fdNanos := fds.ByNumber(genid.Timestamp_Nanos_field_number) @@ -805,7 +805,7 @@ func (e encoder) marshalTimestamp(m pref.Message) error { return nil } -func (d decoder) unmarshalTimestamp(m pref.Message) error { +func (d decoder) unmarshalTimestamp(m protoreflect.Message) error { tok, err := d.Read() if err != nil { return err @@ -829,8 +829,8 @@ func (d decoder) unmarshalTimestamp(m pref.Message) error { fdSeconds := fds.ByNumber(genid.Timestamp_Seconds_field_number) fdNanos := fds.ByNumber(genid.Timestamp_Nanos_field_number) - m.Set(fdSeconds, pref.ValueOfInt64(secs)) - m.Set(fdNanos, pref.ValueOfInt32(int32(t.Nanosecond()))) + m.Set(fdSeconds, protoreflect.ValueOfInt64(secs)) + m.Set(fdNanos, protoreflect.ValueOfInt32(int32(t.Nanosecond()))) return nil } @@ -839,14 +839,14 @@ func (d decoder) unmarshalTimestamp(m pref.Message) error { // lower-camel naming conventions. Encoding should fail if the path name would // end up differently after a round-trip. -func (e encoder) marshalFieldMask(m pref.Message) error { +func (e encoder) marshalFieldMask(m protoreflect.Message) error { fd := m.Descriptor().Fields().ByNumber(genid.FieldMask_Paths_field_number) list := m.Get(fd).List() paths := make([]string, 0, list.Len()) for i := 0; i < list.Len(); i++ { s := list.Get(i).String() - if !pref.FullName(s).IsValid() { + if !protoreflect.FullName(s).IsValid() { return errors.New("%s contains invalid path: %q", genid.FieldMask_Paths_field_fullname, s) } // Return error if conversion to camelCase is not reversible. @@ -861,7 +861,7 @@ func (e encoder) marshalFieldMask(m pref.Message) error { return nil } -func (d decoder) unmarshalFieldMask(m pref.Message) error { +func (d decoder) unmarshalFieldMask(m protoreflect.Message) error { tok, err := d.Read() if err != nil { return err @@ -880,10 +880,10 @@ func (d decoder) unmarshalFieldMask(m pref.Message) error { for _, s0 := range paths { s := strs.JSONSnakeCase(s0) - if strings.Contains(s0, "_") || !pref.FullName(s).IsValid() { + if strings.Contains(s0, "_") || !protoreflect.FullName(s).IsValid() { return d.newError(tok.Pos(), "%v contains invalid path: %q", genid.FieldMask_Paths_field_fullname, s0) } - list.Append(pref.ValueOfString(s)) + list.Append(protoreflect.ValueOfString(s)) } return nil } diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go index 179d6e8fc..4921b2d4a 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go @@ -17,7 +17,7 @@ import ( "google.golang.org/protobuf/internal/set" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -103,7 +103,7 @@ func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { } // unmarshalMessage unmarshals into the given protoreflect.Message. -func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { +func (d decoder) unmarshalMessage(m protoreflect.Message, checkDelims bool) error { messageDesc := m.Descriptor() if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { return errors.New("no support for proto1 MessageSets") @@ -150,24 +150,24 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { } // Resolve the field descriptor. - var name pref.Name - var fd pref.FieldDescriptor - var xt pref.ExtensionType + var name protoreflect.Name + var fd protoreflect.FieldDescriptor + var xt protoreflect.ExtensionType var xtErr error var isFieldNumberName bool switch tok.NameKind() { case text.IdentName: - name = pref.Name(tok.IdentName()) + name = protoreflect.Name(tok.IdentName()) fd = fieldDescs.ByTextName(string(name)) case text.TypeName: // Handle extensions only. This code path is not for Any. - xt, xtErr = d.opts.Resolver.FindExtensionByName(pref.FullName(tok.TypeName())) + xt, xtErr = d.opts.Resolver.FindExtensionByName(protoreflect.FullName(tok.TypeName())) case text.FieldNumber: isFieldNumberName = true - num := pref.FieldNumber(tok.FieldNumber()) + num := protoreflect.FieldNumber(tok.FieldNumber()) if !num.IsValid() { return d.newError(tok.Pos(), "invalid field number: %d", num) } @@ -215,7 +215,7 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { switch { case fd.IsList(): kind := fd.Kind() - if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() { + if kind != protoreflect.MessageKind && kind != protoreflect.GroupKind && !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") } @@ -232,7 +232,7 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { default: kind := fd.Kind() - if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() { + if kind != protoreflect.MessageKind && kind != protoreflect.GroupKind && !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") } @@ -262,11 +262,11 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { // unmarshalSingular unmarshals a non-repeated field value specified by the // given FieldDescriptor. -func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, m pref.Message) error { - var val pref.Value +func (d decoder) unmarshalSingular(fd protoreflect.FieldDescriptor, m protoreflect.Message) error { + var val protoreflect.Value var err error switch fd.Kind() { - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: val = m.NewField(fd) err = d.unmarshalMessage(val.Message(), true) default: @@ -280,94 +280,94 @@ func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, m pref.Message) erro // unmarshalScalar unmarshals a scalar/enum protoreflect.Value specified by the // given FieldDescriptor. -func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) { +func (d decoder) unmarshalScalar(fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { tok, err := d.Read() if err != nil { - return pref.Value{}, err + return protoreflect.Value{}, err } if tok.Kind() != text.Scalar { - return pref.Value{}, d.unexpectedTokenError(tok) + return protoreflect.Value{}, d.unexpectedTokenError(tok) } kind := fd.Kind() switch kind { - case pref.BoolKind: + case protoreflect.BoolKind: if b, ok := tok.Bool(); ok { - return pref.ValueOfBool(b), nil + return protoreflect.ValueOfBool(b), nil } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: if n, ok := tok.Int32(); ok { - return pref.ValueOfInt32(n), nil + return protoreflect.ValueOfInt32(n), nil } - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: if n, ok := tok.Int64(); ok { - return pref.ValueOfInt64(n), nil + return protoreflect.ValueOfInt64(n), nil } - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: if n, ok := tok.Uint32(); ok { - return pref.ValueOfUint32(n), nil + return protoreflect.ValueOfUint32(n), nil } - case pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: if n, ok := tok.Uint64(); ok { - return pref.ValueOfUint64(n), nil + return protoreflect.ValueOfUint64(n), nil } - case pref.FloatKind: + case protoreflect.FloatKind: if n, ok := tok.Float32(); ok { - return pref.ValueOfFloat32(n), nil + return protoreflect.ValueOfFloat32(n), nil } - case pref.DoubleKind: + case protoreflect.DoubleKind: if n, ok := tok.Float64(); ok { - return pref.ValueOfFloat64(n), nil + return protoreflect.ValueOfFloat64(n), nil } - case pref.StringKind: + case protoreflect.StringKind: if s, ok := tok.String(); ok { if strs.EnforceUTF8(fd) && !utf8.ValidString(s) { - return pref.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") + return protoreflect.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") } - return pref.ValueOfString(s), nil + return protoreflect.ValueOfString(s), nil } - case pref.BytesKind: + case protoreflect.BytesKind: if b, ok := tok.String(); ok { - return pref.ValueOfBytes([]byte(b)), nil + return protoreflect.ValueOfBytes([]byte(b)), nil } - case pref.EnumKind: + case protoreflect.EnumKind: if lit, ok := tok.Enum(); ok { // Lookup EnumNumber based on name. - if enumVal := fd.Enum().Values().ByName(pref.Name(lit)); enumVal != nil { - return pref.ValueOfEnum(enumVal.Number()), nil + if enumVal := fd.Enum().Values().ByName(protoreflect.Name(lit)); enumVal != nil { + return protoreflect.ValueOfEnum(enumVal.Number()), nil } } if num, ok := tok.Int32(); ok { - return pref.ValueOfEnum(pref.EnumNumber(num)), nil + return protoreflect.ValueOfEnum(protoreflect.EnumNumber(num)), nil } default: panic(fmt.Sprintf("invalid scalar kind %v", kind)) } - return pref.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) + return protoreflect.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) } // unmarshalList unmarshals into given protoreflect.List. A list value can // either be in [] syntax or simply just a single scalar/message value. -func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error { +func (d decoder) unmarshalList(fd protoreflect.FieldDescriptor, list protoreflect.List) error { tok, err := d.Peek() if err != nil { return err } switch fd.Kind() { - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: switch tok.Kind() { case text.ListOpen: d.Read() @@ -441,22 +441,22 @@ func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error { // unmarshalMap unmarshals into given protoreflect.Map. A map value is a // textproto message containing {key: , value: }. -func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error { +func (d decoder) unmarshalMap(fd protoreflect.FieldDescriptor, mmap protoreflect.Map) error { // Determine ahead whether map entry is a scalar type or a message type in // order to call the appropriate unmarshalMapValue func inside // unmarshalMapEntry. - var unmarshalMapValue func() (pref.Value, error) + var unmarshalMapValue func() (protoreflect.Value, error) switch fd.MapValue().Kind() { - case pref.MessageKind, pref.GroupKind: - unmarshalMapValue = func() (pref.Value, error) { + case protoreflect.MessageKind, protoreflect.GroupKind: + unmarshalMapValue = func() (protoreflect.Value, error) { pval := mmap.NewValue() if err := d.unmarshalMessage(pval.Message(), true); err != nil { - return pref.Value{}, err + return protoreflect.Value{}, err } return pval, nil } default: - unmarshalMapValue = func() (pref.Value, error) { + unmarshalMapValue = func() (protoreflect.Value, error) { return d.unmarshalScalar(fd.MapValue()) } } @@ -494,9 +494,9 @@ func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error { // unmarshalMap unmarshals into given protoreflect.Map. A map value is a // textproto message containing {key: , value: }. -func (d decoder) unmarshalMapEntry(fd pref.FieldDescriptor, mmap pref.Map, unmarshalMapValue func() (pref.Value, error)) error { - var key pref.MapKey - var pval pref.Value +func (d decoder) unmarshalMapEntry(fd protoreflect.FieldDescriptor, mmap protoreflect.Map, unmarshalMapValue func() (protoreflect.Value, error)) error { + var key protoreflect.MapKey + var pval protoreflect.Value Loop: for { // Read field name. @@ -520,7 +520,7 @@ Loop: return d.unexpectedTokenError(tok) } - switch name := pref.Name(tok.IdentName()); name { + switch name := protoreflect.Name(tok.IdentName()); name { case genid.MapEntry_Key_field_name: if !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") @@ -535,7 +535,7 @@ Loop: key = val.MapKey() case genid.MapEntry_Value_field_name: - if kind := fd.MapValue().Kind(); (kind != pref.MessageKind) && (kind != pref.GroupKind) { + if kind := fd.MapValue().Kind(); (kind != protoreflect.MessageKind) && (kind != protoreflect.GroupKind) { if !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") } @@ -561,7 +561,7 @@ Loop: } if !pval.IsValid() { switch fd.MapValue().Kind() { - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: // If value field is not set for message/group types, construct an // empty one as default. pval = mmap.NewValue() @@ -575,7 +575,7 @@ Loop: // unmarshalAny unmarshals an Any textproto. It can either be in expanded form // or non-expanded form. -func (d decoder) unmarshalAny(m pref.Message, checkDelims bool) error { +func (d decoder) unmarshalAny(m protoreflect.Message, checkDelims bool) error { var typeURL string var bValue []byte var seenTypeUrl bool @@ -619,7 +619,7 @@ Loop: return d.syntaxError(tok.Pos(), "missing field separator :") } - switch name := pref.Name(tok.IdentName()); name { + switch name := protoreflect.Name(tok.IdentName()); name { case genid.Any_TypeUrl_field_name: if seenTypeUrl { return d.newError(tok.Pos(), "duplicate %v field", genid.Any_TypeUrl_field_fullname) @@ -686,10 +686,10 @@ Loop: fds := m.Descriptor().Fields() if len(typeURL) > 0 { - m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), pref.ValueOfString(typeURL)) + m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), protoreflect.ValueOfString(typeURL)) } if len(bValue) > 0 { - m.Set(fds.ByNumber(genid.Any_Value_field_number), pref.ValueOfBytes(bValue)) + m.Set(fds.ByNumber(genid.Any_Value_field_number), protoreflect.ValueOfBytes(bValue)) } return nil } diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go index 8d5304dc5..ebf6c6528 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go @@ -20,7 +20,6 @@ import ( "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -150,7 +149,7 @@ type encoder struct { } // marshalMessage marshals the given protoreflect.Message. -func (e encoder) marshalMessage(m pref.Message, inclDelims bool) error { +func (e encoder) marshalMessage(m protoreflect.Message, inclDelims bool) error { messageDesc := m.Descriptor() if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { return errors.New("no support for proto1 MessageSets") @@ -190,7 +189,7 @@ func (e encoder) marshalMessage(m pref.Message, inclDelims bool) error { } // marshalField marshals the given field with protoreflect.Value. -func (e encoder) marshalField(name string, val pref.Value, fd pref.FieldDescriptor) error { +func (e encoder) marshalField(name string, val protoreflect.Value, fd protoreflect.FieldDescriptor) error { switch { case fd.IsList(): return e.marshalList(name, val.List(), fd) @@ -204,40 +203,40 @@ func (e encoder) marshalField(name string, val pref.Value, fd pref.FieldDescript // marshalSingular marshals the given non-repeated field value. This includes // all scalar types, enums, messages, and groups. -func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error { +func (e encoder) marshalSingular(val protoreflect.Value, fd protoreflect.FieldDescriptor) error { kind := fd.Kind() switch kind { - case pref.BoolKind: + case protoreflect.BoolKind: e.WriteBool(val.Bool()) - case pref.StringKind: + case protoreflect.StringKind: s := val.String() if !e.opts.allowInvalidUTF8 && strs.EnforceUTF8(fd) && !utf8.ValidString(s) { return errors.InvalidUTF8(string(fd.FullName())) } e.WriteString(s) - case pref.Int32Kind, pref.Int64Kind, - pref.Sint32Kind, pref.Sint64Kind, - pref.Sfixed32Kind, pref.Sfixed64Kind: + case protoreflect.Int32Kind, protoreflect.Int64Kind, + protoreflect.Sint32Kind, protoreflect.Sint64Kind, + protoreflect.Sfixed32Kind, protoreflect.Sfixed64Kind: e.WriteInt(val.Int()) - case pref.Uint32Kind, pref.Uint64Kind, - pref.Fixed32Kind, pref.Fixed64Kind: + case protoreflect.Uint32Kind, protoreflect.Uint64Kind, + protoreflect.Fixed32Kind, protoreflect.Fixed64Kind: e.WriteUint(val.Uint()) - case pref.FloatKind: + case protoreflect.FloatKind: // Encoder.WriteFloat handles the special numbers NaN and infinites. e.WriteFloat(val.Float(), 32) - case pref.DoubleKind: + case protoreflect.DoubleKind: // Encoder.WriteFloat handles the special numbers NaN and infinites. e.WriteFloat(val.Float(), 64) - case pref.BytesKind: + case protoreflect.BytesKind: e.WriteString(string(val.Bytes())) - case pref.EnumKind: + case protoreflect.EnumKind: num := val.Enum() if desc := fd.Enum().Values().ByNumber(num); desc != nil { e.WriteLiteral(string(desc.Name())) @@ -246,7 +245,7 @@ func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error e.WriteInt(int64(num)) } - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: return e.marshalMessage(val.Message(), true) default: @@ -256,7 +255,7 @@ func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error } // marshalList marshals the given protoreflect.List as multiple name-value fields. -func (e encoder) marshalList(name string, list pref.List, fd pref.FieldDescriptor) error { +func (e encoder) marshalList(name string, list protoreflect.List, fd protoreflect.FieldDescriptor) error { size := list.Len() for i := 0; i < size; i++ { e.WriteName(name) @@ -268,9 +267,9 @@ func (e encoder) marshalList(name string, list pref.List, fd pref.FieldDescripto } // marshalMap marshals the given protoreflect.Map as multiple name-value fields. -func (e encoder) marshalMap(name string, mmap pref.Map, fd pref.FieldDescriptor) error { +func (e encoder) marshalMap(name string, mmap protoreflect.Map, fd protoreflect.FieldDescriptor) error { var err error - order.RangeEntries(mmap, order.GenericKeyOrder, func(key pref.MapKey, val pref.Value) bool { + order.RangeEntries(mmap, order.GenericKeyOrder, func(key protoreflect.MapKey, val protoreflect.Value) bool { e.WriteName(name) e.StartMessage() defer e.EndMessage() @@ -334,7 +333,7 @@ func (e encoder) marshalUnknown(b []byte) { // marshalAny marshals the given google.protobuf.Any message in expanded form. // It returns true if it was able to marshal, else false. -func (e encoder) marshalAny(any pref.Message) bool { +func (e encoder) marshalAny(any protoreflect.Message) bool { // Construct the embedded message. fds := any.Descriptor().Fields() fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) diff --git a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go index 9c61112f5..ce57f57eb 100644 --- a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +++ b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go @@ -516,6 +516,7 @@ func EncodeTag(num Number, typ Type) uint64 { } // DecodeZigZag decodes a zig-zag-encoded uint64 as an int64. +// // Input: {…, 5, 3, 1, 0, 2, 4, 6, …} // Output: {…, -3, -2, -1, 0, +1, +2, +3, …} func DecodeZigZag(x uint64) int64 { @@ -523,6 +524,7 @@ func DecodeZigZag(x uint64) int64 { } // EncodeZigZag encodes an int64 as a zig-zag-encoded uint64. +// // Input: {…, -3, -2, -1, 0, +1, +2, +3, …} // Output: {…, 5, 3, 1, 0, 2, 4, 6, …} func EncodeZigZag(x int64) uint64 { @@ -530,6 +532,7 @@ func EncodeZigZag(x int64) uint64 { } // DecodeBool decodes a uint64 as a bool. +// // Input: { 0, 1, 2, …} // Output: {false, true, true, …} func DecodeBool(x uint64) bool { @@ -537,6 +540,7 @@ func DecodeBool(x uint64) bool { } // EncodeBool encodes a bool as a uint64. +// // Input: {false, true} // Output: { 0, 1} func EncodeBool(x bool) uint64 { diff --git a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go index 360c63329..db5248e1b 100644 --- a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +++ b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go @@ -14,7 +14,7 @@ import ( "google.golang.org/protobuf/internal/detrand" "google.golang.org/protobuf/internal/pragma" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type list interface { @@ -30,17 +30,17 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { if isRoot { var name string switch vs.(type) { - case pref.Names: + case protoreflect.Names: name = "Names" - case pref.FieldNumbers: + case protoreflect.FieldNumbers: name = "FieldNumbers" - case pref.FieldRanges: + case protoreflect.FieldRanges: name = "FieldRanges" - case pref.EnumRanges: + case protoreflect.EnumRanges: name = "EnumRanges" - case pref.FileImports: + case protoreflect.FileImports: name = "FileImports" - case pref.Descriptor: + case protoreflect.Descriptor: name = reflect.ValueOf(vs).MethodByName("Get").Type().Out(0).Name() + "s" default: name = reflect.ValueOf(vs).Elem().Type().Name() @@ -50,17 +50,17 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { var ss []string switch vs := vs.(type) { - case pref.Names: + case protoreflect.Names: for i := 0; i < vs.Len(); i++ { ss = append(ss, fmt.Sprint(vs.Get(i))) } return start + joinStrings(ss, false) + end - case pref.FieldNumbers: + case protoreflect.FieldNumbers: for i := 0; i < vs.Len(); i++ { ss = append(ss, fmt.Sprint(vs.Get(i))) } return start + joinStrings(ss, false) + end - case pref.FieldRanges: + case protoreflect.FieldRanges: for i := 0; i < vs.Len(); i++ { r := vs.Get(i) if r[0]+1 == r[1] { @@ -70,7 +70,7 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { } } return start + joinStrings(ss, false) + end - case pref.EnumRanges: + case protoreflect.EnumRanges: for i := 0; i < vs.Len(); i++ { r := vs.Get(i) if r[0] == r[1] { @@ -80,7 +80,7 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { } } return start + joinStrings(ss, false) + end - case pref.FileImports: + case protoreflect.FileImports: for i := 0; i < vs.Len(); i++ { var rs records rs.Append(reflect.ValueOf(vs.Get(i)), "Path", "Package", "IsPublic", "IsWeak") @@ -88,11 +88,11 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { } return start + joinStrings(ss, allowMulti) + end default: - _, isEnumValue := vs.(pref.EnumValueDescriptors) + _, isEnumValue := vs.(protoreflect.EnumValueDescriptors) for i := 0; i < vs.Len(); i++ { m := reflect.ValueOf(vs).MethodByName("Get") v := m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface() - ss = append(ss, formatDescOpt(v.(pref.Descriptor), false, allowMulti && !isEnumValue)) + ss = append(ss, formatDescOpt(v.(protoreflect.Descriptor), false, allowMulti && !isEnumValue)) } return start + joinStrings(ss, allowMulti && isEnumValue) + end } @@ -106,20 +106,20 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { // // Using a list allows us to print the accessors in a sensible order. var descriptorAccessors = map[reflect.Type][]string{ - reflect.TypeOf((*pref.FileDescriptor)(nil)).Elem(): {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"}, - reflect.TypeOf((*pref.MessageDescriptor)(nil)).Elem(): {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"}, - reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"}, - reflect.TypeOf((*pref.OneofDescriptor)(nil)).Elem(): {"Fields"}, // not directly used; must keep in sync with formatDescOpt - reflect.TypeOf((*pref.EnumDescriptor)(nil)).Elem(): {"Values", "ReservedNames", "ReservedRanges"}, - reflect.TypeOf((*pref.EnumValueDescriptor)(nil)).Elem(): {"Number"}, - reflect.TypeOf((*pref.ServiceDescriptor)(nil)).Elem(): {"Methods"}, - reflect.TypeOf((*pref.MethodDescriptor)(nil)).Elem(): {"Input", "Output", "IsStreamingClient", "IsStreamingServer"}, + reflect.TypeOf((*protoreflect.FileDescriptor)(nil)).Elem(): {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"}, + reflect.TypeOf((*protoreflect.MessageDescriptor)(nil)).Elem(): {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"}, + reflect.TypeOf((*protoreflect.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"}, + reflect.TypeOf((*protoreflect.OneofDescriptor)(nil)).Elem(): {"Fields"}, // not directly used; must keep in sync with formatDescOpt + reflect.TypeOf((*protoreflect.EnumDescriptor)(nil)).Elem(): {"Values", "ReservedNames", "ReservedRanges"}, + reflect.TypeOf((*protoreflect.EnumValueDescriptor)(nil)).Elem(): {"Number"}, + reflect.TypeOf((*protoreflect.ServiceDescriptor)(nil)).Elem(): {"Methods"}, + reflect.TypeOf((*protoreflect.MethodDescriptor)(nil)).Elem(): {"Input", "Output", "IsStreamingClient", "IsStreamingServer"}, } -func FormatDesc(s fmt.State, r rune, t pref.Descriptor) { +func FormatDesc(s fmt.State, r rune, t protoreflect.Descriptor) { io.WriteString(s, formatDescOpt(t, true, r == 'v' && (s.Flag('+') || s.Flag('#')))) } -func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { +func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { rv := reflect.ValueOf(t) rt := rv.MethodByName("ProtoType").Type().In(0) @@ -128,7 +128,7 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { start = rt.Name() + "{" } - _, isFile := t.(pref.FileDescriptor) + _, isFile := t.(protoreflect.FileDescriptor) rs := records{allowMulti: allowMulti} if t.IsPlaceholder() { if isFile { @@ -146,7 +146,7 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { rs.Append(rv, "Name") } switch t := t.(type) { - case pref.FieldDescriptor: + case protoreflect.FieldDescriptor: for _, s := range descriptorAccessors[rt] { switch s { case "MapKey": @@ -156,9 +156,9 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { case "MapValue": if v := t.MapValue(); v != nil { switch v.Kind() { - case pref.EnumKind: + case protoreflect.EnumKind: rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Enum().FullName())}) - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Message().FullName())}) default: rs.recs = append(rs.recs, [2]string{"MapValue", v.Kind().String()}) @@ -180,7 +180,7 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { rs.Append(rv, s) } } - case pref.OneofDescriptor: + case protoreflect.OneofDescriptor: var ss []string fs := t.Fields() for i := 0; i < fs.Len(); i++ { @@ -216,7 +216,7 @@ func (rs *records) Append(v reflect.Value, accessors ...string) { if !rv.IsValid() { panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a)) } - if _, ok := rv.Interface().(pref.Value); ok { + if _, ok := rv.Interface().(protoreflect.Value); ok { rv = rv.MethodByName("Interface").Call(nil)[0] if !rv.IsNil() { rv = rv.Elem() @@ -250,9 +250,9 @@ func (rs *records) Append(v reflect.Value, accessors ...string) { switch v := v.(type) { case list: s = formatListOpt(v, false, rs.allowMulti) - case pref.FieldDescriptor, pref.OneofDescriptor, pref.EnumValueDescriptor, pref.MethodDescriptor: - s = string(v.(pref.Descriptor).Name()) - case pref.Descriptor: + case protoreflect.FieldDescriptor, protoreflect.OneofDescriptor, protoreflect.EnumValueDescriptor, protoreflect.MethodDescriptor: + s = string(v.(protoreflect.Descriptor).Name()) + case protoreflect.Descriptor: s = string(v.FullName()) case string: s = strconv.Quote(v) diff --git a/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go b/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go index fdd9b13f2..328dc733b 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go @@ -15,8 +15,8 @@ import ( "strconv" ptext "google.golang.org/protobuf/internal/encoding/text" - errors "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/internal/errors" + "google.golang.org/protobuf/reflect/protoreflect" ) // Format is the serialization format used to represent the default value. @@ -35,56 +35,56 @@ const ( // Unmarshal deserializes the default string s according to the given kind k. // When k is an enum, a list of enum value descriptors must be provided. -func Unmarshal(s string, k pref.Kind, evs pref.EnumValueDescriptors, f Format) (pref.Value, pref.EnumValueDescriptor, error) { +func Unmarshal(s string, k protoreflect.Kind, evs protoreflect.EnumValueDescriptors, f Format) (protoreflect.Value, protoreflect.EnumValueDescriptor, error) { switch k { - case pref.BoolKind: + case protoreflect.BoolKind: if f == GoTag { switch s { case "1": - return pref.ValueOfBool(true), nil, nil + return protoreflect.ValueOfBool(true), nil, nil case "0": - return pref.ValueOfBool(false), nil, nil + return protoreflect.ValueOfBool(false), nil, nil } } else { switch s { case "true": - return pref.ValueOfBool(true), nil, nil + return protoreflect.ValueOfBool(true), nil, nil case "false": - return pref.ValueOfBool(false), nil, nil + return protoreflect.ValueOfBool(false), nil, nil } } - case pref.EnumKind: + case protoreflect.EnumKind: if f == GoTag { // Go tags use the numeric form of the enum value. if n, err := strconv.ParseInt(s, 10, 32); err == nil { - if ev := evs.ByNumber(pref.EnumNumber(n)); ev != nil { - return pref.ValueOfEnum(ev.Number()), ev, nil + if ev := evs.ByNumber(protoreflect.EnumNumber(n)); ev != nil { + return protoreflect.ValueOfEnum(ev.Number()), ev, nil } } } else { // Descriptor default_value use the enum identifier. - ev := evs.ByName(pref.Name(s)) + ev := evs.ByName(protoreflect.Name(s)) if ev != nil { - return pref.ValueOfEnum(ev.Number()), ev, nil + return protoreflect.ValueOfEnum(ev.Number()), ev, nil } } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: if v, err := strconv.ParseInt(s, 10, 32); err == nil { - return pref.ValueOfInt32(int32(v)), nil, nil + return protoreflect.ValueOfInt32(int32(v)), nil, nil } - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: if v, err := strconv.ParseInt(s, 10, 64); err == nil { - return pref.ValueOfInt64(int64(v)), nil, nil + return protoreflect.ValueOfInt64(int64(v)), nil, nil } - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: if v, err := strconv.ParseUint(s, 10, 32); err == nil { - return pref.ValueOfUint32(uint32(v)), nil, nil + return protoreflect.ValueOfUint32(uint32(v)), nil, nil } - case pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: if v, err := strconv.ParseUint(s, 10, 64); err == nil { - return pref.ValueOfUint64(uint64(v)), nil, nil + return protoreflect.ValueOfUint64(uint64(v)), nil, nil } - case pref.FloatKind, pref.DoubleKind: + case protoreflect.FloatKind, protoreflect.DoubleKind: var v float64 var err error switch s { @@ -98,29 +98,29 @@ func Unmarshal(s string, k pref.Kind, evs pref.EnumValueDescriptors, f Format) ( v, err = strconv.ParseFloat(s, 64) } if err == nil { - if k == pref.FloatKind { - return pref.ValueOfFloat32(float32(v)), nil, nil + if k == protoreflect.FloatKind { + return protoreflect.ValueOfFloat32(float32(v)), nil, nil } else { - return pref.ValueOfFloat64(float64(v)), nil, nil + return protoreflect.ValueOfFloat64(float64(v)), nil, nil } } - case pref.StringKind: + case protoreflect.StringKind: // String values are already unescaped and can be used as is. - return pref.ValueOfString(s), nil, nil - case pref.BytesKind: + return protoreflect.ValueOfString(s), nil, nil + case protoreflect.BytesKind: if b, ok := unmarshalBytes(s); ok { - return pref.ValueOfBytes(b), nil, nil + return protoreflect.ValueOfBytes(b), nil, nil } } - return pref.Value{}, nil, errors.New("could not parse value for %v: %q", k, s) + return protoreflect.Value{}, nil, errors.New("could not parse value for %v: %q", k, s) } // Marshal serializes v as the default string according to the given kind k. // When specifying the Descriptor format for an enum kind, the associated // enum value descriptor must be provided. -func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) (string, error) { +func Marshal(v protoreflect.Value, ev protoreflect.EnumValueDescriptor, k protoreflect.Kind, f Format) (string, error) { switch k { - case pref.BoolKind: + case protoreflect.BoolKind: if f == GoTag { if v.Bool() { return "1", nil @@ -134,17 +134,17 @@ func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) ( return "false", nil } } - case pref.EnumKind: + case protoreflect.EnumKind: if f == GoTag { return strconv.FormatInt(int64(v.Enum()), 10), nil } else { return string(ev.Name()), nil } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind, pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: return strconv.FormatInt(v.Int(), 10), nil - case pref.Uint32Kind, pref.Fixed32Kind, pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind: return strconv.FormatUint(v.Uint(), 10), nil - case pref.FloatKind, pref.DoubleKind: + case protoreflect.FloatKind, protoreflect.DoubleKind: f := v.Float() switch { case math.IsInf(f, -1): @@ -154,16 +154,16 @@ func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) ( case math.IsNaN(f): return "nan", nil default: - if k == pref.FloatKind { + if k == protoreflect.FloatKind { return strconv.FormatFloat(f, 'g', -1, 32), nil } else { return strconv.FormatFloat(f, 'g', -1, 64), nil } } - case pref.StringKind: + case protoreflect.StringKind: // String values are serialized as is without any escaping. return v.String(), nil - case pref.BytesKind: + case protoreflect.BytesKind: if s, ok := marshalBytes(v.Bytes()); ok { return s, nil } diff --git a/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go b/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go index c1866f3c1..a6693f0a2 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // The MessageSet wire format is equivalent to a message defined as follows, @@ -33,6 +33,7 @@ const ( // ExtensionName is the field name for extensions of MessageSet. // // A valid MessageSet extension must be of the form: +// // message MyMessage { // extend proto2.bridge.MessageSet { // optional MyMessage message_set_extension = 1234; @@ -42,13 +43,13 @@ const ( const ExtensionName = "message_set_extension" // IsMessageSet returns whether the message uses the MessageSet wire format. -func IsMessageSet(md pref.MessageDescriptor) bool { +func IsMessageSet(md protoreflect.MessageDescriptor) bool { xmd, ok := md.(interface{ IsMessageSet() bool }) return ok && xmd.IsMessageSet() } // IsMessageSetExtension reports this field properly extends a MessageSet. -func IsMessageSetExtension(fd pref.FieldDescriptor) bool { +func IsMessageSetExtension(fd protoreflect.FieldDescriptor) bool { switch { case fd.Name() != ExtensionName: return false diff --git a/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go b/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go index 38f1931c6..373d20837 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go @@ -11,10 +11,10 @@ import ( "strconv" "strings" - defval "google.golang.org/protobuf/internal/encoding/defval" - fdesc "google.golang.org/protobuf/internal/filedesc" + "google.golang.org/protobuf/internal/encoding/defval" + "google.golang.org/protobuf/internal/filedesc" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) var byteType = reflect.TypeOf(byte(0)) @@ -29,9 +29,9 @@ var byteType = reflect.TypeOf(byte(0)) // This does not populate the Enum or Message (except for weak message). // // This function is a best effort attempt; parsing errors are ignored. -func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) pref.FieldDescriptor { - f := new(fdesc.Field) - f.L0.ParentFile = fdesc.SurrogateProto2 +func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescriptors) protoreflect.FieldDescriptor { + f := new(filedesc.Field) + f.L0.ParentFile = filedesc.SurrogateProto2 for len(tag) > 0 { i := strings.IndexByte(tag, ',') if i < 0 { @@ -39,68 +39,68 @@ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) p } switch s := tag[:i]; { case strings.HasPrefix(s, "name="): - f.L0.FullName = pref.FullName(s[len("name="):]) + f.L0.FullName = protoreflect.FullName(s[len("name="):]) case strings.Trim(s, "0123456789") == "": n, _ := strconv.ParseUint(s, 10, 32) - f.L1.Number = pref.FieldNumber(n) + f.L1.Number = protoreflect.FieldNumber(n) case s == "opt": - f.L1.Cardinality = pref.Optional + f.L1.Cardinality = protoreflect.Optional case s == "req": - f.L1.Cardinality = pref.Required + f.L1.Cardinality = protoreflect.Required case s == "rep": - f.L1.Cardinality = pref.Repeated + f.L1.Cardinality = protoreflect.Repeated case s == "varint": switch goType.Kind() { case reflect.Bool: - f.L1.Kind = pref.BoolKind + f.L1.Kind = protoreflect.BoolKind case reflect.Int32: - f.L1.Kind = pref.Int32Kind + f.L1.Kind = protoreflect.Int32Kind case reflect.Int64: - f.L1.Kind = pref.Int64Kind + f.L1.Kind = protoreflect.Int64Kind case reflect.Uint32: - f.L1.Kind = pref.Uint32Kind + f.L1.Kind = protoreflect.Uint32Kind case reflect.Uint64: - f.L1.Kind = pref.Uint64Kind + f.L1.Kind = protoreflect.Uint64Kind } case s == "zigzag32": if goType.Kind() == reflect.Int32 { - f.L1.Kind = pref.Sint32Kind + f.L1.Kind = protoreflect.Sint32Kind } case s == "zigzag64": if goType.Kind() == reflect.Int64 { - f.L1.Kind = pref.Sint64Kind + f.L1.Kind = protoreflect.Sint64Kind } case s == "fixed32": switch goType.Kind() { case reflect.Int32: - f.L1.Kind = pref.Sfixed32Kind + f.L1.Kind = protoreflect.Sfixed32Kind case reflect.Uint32: - f.L1.Kind = pref.Fixed32Kind + f.L1.Kind = protoreflect.Fixed32Kind case reflect.Float32: - f.L1.Kind = pref.FloatKind + f.L1.Kind = protoreflect.FloatKind } case s == "fixed64": switch goType.Kind() { case reflect.Int64: - f.L1.Kind = pref.Sfixed64Kind + f.L1.Kind = protoreflect.Sfixed64Kind case reflect.Uint64: - f.L1.Kind = pref.Fixed64Kind + f.L1.Kind = protoreflect.Fixed64Kind case reflect.Float64: - f.L1.Kind = pref.DoubleKind + f.L1.Kind = protoreflect.DoubleKind } case s == "bytes": switch { case goType.Kind() == reflect.String: - f.L1.Kind = pref.StringKind + f.L1.Kind = protoreflect.StringKind case goType.Kind() == reflect.Slice && goType.Elem() == byteType: - f.L1.Kind = pref.BytesKind + f.L1.Kind = protoreflect.BytesKind default: - f.L1.Kind = pref.MessageKind + f.L1.Kind = protoreflect.MessageKind } case s == "group": - f.L1.Kind = pref.GroupKind + f.L1.Kind = protoreflect.GroupKind case strings.HasPrefix(s, "enum="): - f.L1.Kind = pref.EnumKind + f.L1.Kind = protoreflect.EnumKind case strings.HasPrefix(s, "json="): jsonName := s[len("json="):] if jsonName != strs.JSONCamelCase(string(f.L0.FullName.Name())) { @@ -111,23 +111,23 @@ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) p f.L1.IsPacked = true case strings.HasPrefix(s, "weak="): f.L1.IsWeak = true - f.L1.Message = fdesc.PlaceholderMessage(pref.FullName(s[len("weak="):])) + f.L1.Message = filedesc.PlaceholderMessage(protoreflect.FullName(s[len("weak="):])) case strings.HasPrefix(s, "def="): // The default tag is special in that everything afterwards is the // default regardless of the presence of commas. s, i = tag[len("def="):], len(tag) v, ev, _ := defval.Unmarshal(s, f.L1.Kind, evs, defval.GoTag) - f.L1.Default = fdesc.DefaultValue(v, ev) + f.L1.Default = filedesc.DefaultValue(v, ev) case s == "proto3": - f.L0.ParentFile = fdesc.SurrogateProto3 + f.L0.ParentFile = filedesc.SurrogateProto3 } tag = strings.TrimPrefix(tag[i:], ",") } // The generator uses the group message name instead of the field name. // We obtain the real field name by lowercasing the group name. - if f.L1.Kind == pref.GroupKind { - f.L0.FullName = pref.FullName(strings.ToLower(string(f.L0.FullName))) + if f.L1.Kind == protoreflect.GroupKind { + f.L0.FullName = protoreflect.FullName(strings.ToLower(string(f.L0.FullName))) } return f } @@ -140,38 +140,38 @@ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) p // Depending on the context on how Marshal is called, there are different ways // through which that information is determined. As such it is the caller's // responsibility to provide a function to obtain that information. -func Marshal(fd pref.FieldDescriptor, enumName string) string { +func Marshal(fd protoreflect.FieldDescriptor, enumName string) string { var tag []string switch fd.Kind() { - case pref.BoolKind, pref.EnumKind, pref.Int32Kind, pref.Uint32Kind, pref.Int64Kind, pref.Uint64Kind: + case protoreflect.BoolKind, protoreflect.EnumKind, protoreflect.Int32Kind, protoreflect.Uint32Kind, protoreflect.Int64Kind, protoreflect.Uint64Kind: tag = append(tag, "varint") - case pref.Sint32Kind: + case protoreflect.Sint32Kind: tag = append(tag, "zigzag32") - case pref.Sint64Kind: + case protoreflect.Sint64Kind: tag = append(tag, "zigzag64") - case pref.Sfixed32Kind, pref.Fixed32Kind, pref.FloatKind: + case protoreflect.Sfixed32Kind, protoreflect.Fixed32Kind, protoreflect.FloatKind: tag = append(tag, "fixed32") - case pref.Sfixed64Kind, pref.Fixed64Kind, pref.DoubleKind: + case protoreflect.Sfixed64Kind, protoreflect.Fixed64Kind, protoreflect.DoubleKind: tag = append(tag, "fixed64") - case pref.StringKind, pref.BytesKind, pref.MessageKind: + case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind: tag = append(tag, "bytes") - case pref.GroupKind: + case protoreflect.GroupKind: tag = append(tag, "group") } tag = append(tag, strconv.Itoa(int(fd.Number()))) switch fd.Cardinality() { - case pref.Optional: + case protoreflect.Optional: tag = append(tag, "opt") - case pref.Required: + case protoreflect.Required: tag = append(tag, "req") - case pref.Repeated: + case protoreflect.Repeated: tag = append(tag, "rep") } if fd.IsPacked() { tag = append(tag, "packed") } name := string(fd.Name()) - if fd.Kind() == pref.GroupKind { + if fd.Kind() == protoreflect.GroupKind { // The name of the FieldDescriptor for a group field is // lowercased. To find the original capitalization, we // look in the field's MessageType. @@ -189,10 +189,10 @@ func Marshal(fd pref.FieldDescriptor, enumName string) string { // The previous implementation does not tag extension fields as proto3, // even when the field is defined in a proto3 file. Match that behavior // for consistency. - if fd.Syntax() == pref.Proto3 && !fd.IsExtension() { + if fd.Syntax() == protoreflect.Proto3 && !fd.IsExtension() { tag = append(tag, "proto3") } - if fd.Kind() == pref.EnumKind && enumName != "" { + if fd.Kind() == protoreflect.EnumKind && enumName != "" { tag = append(tag, "enum="+enumName) } if fd.ContainingOneof() != nil { diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go index 37803773f..427c62d03 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go @@ -8,7 +8,6 @@ import ( "bytes" "fmt" "io" - "regexp" "strconv" "unicode/utf8" @@ -421,7 +420,7 @@ func (d *Decoder) parseFieldName() (tok Token, err error) { return Token{}, d.newSyntaxError("invalid field number: %s", d.in[:num.size]) } - return Token{}, d.newSyntaxError("invalid field name: %s", errRegexp.Find(d.in)) + return Token{}, d.newSyntaxError("invalid field name: %s", errId(d.in)) } // parseTypeName parses Any type URL or extension field name. The name is @@ -571,7 +570,7 @@ func (d *Decoder) parseScalar() (Token, error) { return tok, nil } - return Token{}, d.newSyntaxError("invalid scalar value: %s", errRegexp.Find(d.in)) + return Token{}, d.newSyntaxError("invalid scalar value: %s", errId(d.in)) } // parseLiteralValue parses a literal value. A literal value is used for @@ -653,8 +652,29 @@ func consume(b []byte, n int) []byte { return b } -// Any sequence that looks like a non-delimiter (for error reporting). -var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9\/]+|.)`) +// errId extracts a byte sequence that looks like an invalid ID +// (for the purposes of error reporting). +func errId(seq []byte) []byte { + const maxLen = 32 + for i := 0; i < len(seq); { + if i > maxLen { + return append(seq[:i:i], "…"...) + } + r, size := utf8.DecodeRune(seq[i:]) + if r > utf8.RuneSelf || (r != '/' && isDelim(byte(r))) { + if i == 0 { + // Either the first byte is invalid UTF-8 or a + // delimiter, or the first rune is non-ASCII. + // Return it as-is. + i = size + } + return seq[:i:i] + } + i += size + } + // No delimiter found. + return seq +} // isDelim returns true if given byte is a delimiter character. func isDelim(c byte) bool { diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go index f2d90b789..81a5d8c86 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go @@ -50,8 +50,10 @@ type number struct { // parseNumber constructs a number object from given input. It allows for the // following patterns: -// integer: ^-?([1-9][0-9]*|0[xX][0-9a-fA-F]+|0[0-7]*) -// float: ^-?((0|[1-9][0-9]*)?([.][0-9]*)?([eE][+-]?[0-9]+)?[fF]?) +// +// integer: ^-?([1-9][0-9]*|0[xX][0-9a-fA-F]+|0[0-7]*) +// float: ^-?((0|[1-9][0-9]*)?([.][0-9]*)?([eE][+-]?[0-9]+)?[fF]?) +// // It also returns the number of parsed bytes for the given number, 0 if it is // not a number. func parseNumber(input []byte) number { diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go b/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go index 0ce8d6fb8..7ae6c2a3c 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go @@ -24,6 +24,6 @@ // the Go implementation should as well. // // The text format is almost a superset of JSON except: -// * message keys are not quoted strings, but identifiers -// * the top-level value must be a message without the delimiters +// - message keys are not quoted strings, but identifiers +// - the top-level value must be a message without the delimiters package text diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/build.go b/vendor/google.golang.org/protobuf/internal/filedesc/build.go index b293b6947..7cac1c190 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/build.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/build.go @@ -12,8 +12,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoregistry" ) // Builder construct a protoreflect.FileDescriptor from the raw descriptor. @@ -38,7 +37,7 @@ type Builder struct { // TypeResolver resolves extension field types for descriptor options. // If nil, it uses protoregistry.GlobalTypes. TypeResolver interface { - preg.ExtensionTypeResolver + protoregistry.ExtensionTypeResolver } // FileRegistry is use to lookup file, enum, and message dependencies. @@ -46,8 +45,8 @@ type Builder struct { // If nil, it uses protoregistry.GlobalFiles. FileRegistry interface { FindFileByPath(string) (protoreflect.FileDescriptor, error) - FindDescriptorByName(pref.FullName) (pref.Descriptor, error) - RegisterFile(pref.FileDescriptor) error + FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) + RegisterFile(protoreflect.FileDescriptor) error } } @@ -55,8 +54,8 @@ type Builder struct { // If so, it permits looking up an enum or message dependency based on the // sub-list and element index into filetype.Builder.DependencyIndexes. type resolverByIndex interface { - FindEnumByIndex(int32, int32, []Enum, []Message) pref.EnumDescriptor - FindMessageByIndex(int32, int32, []Enum, []Message) pref.MessageDescriptor + FindEnumByIndex(int32, int32, []Enum, []Message) protoreflect.EnumDescriptor + FindMessageByIndex(int32, int32, []Enum, []Message) protoreflect.MessageDescriptor } // Indexes of each sub-list in filetype.Builder.DependencyIndexes. @@ -70,7 +69,7 @@ const ( // Out is the output of the Builder. type Out struct { - File pref.FileDescriptor + File protoreflect.FileDescriptor // Enums is all enum descriptors in "flattened ordering". Enums []Enum @@ -97,10 +96,10 @@ func (db Builder) Build() (out Out) { // Initialize resolvers and registries if unpopulated. if db.TypeResolver == nil { - db.TypeResolver = preg.GlobalTypes + db.TypeResolver = protoregistry.GlobalTypes } if db.FileRegistry == nil { - db.FileRegistry = preg.GlobalFiles + db.FileRegistry = protoregistry.GlobalFiles } fd := newRawFile(db) diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index 98ab142ae..7c3689bae 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -17,7 +17,7 @@ import ( "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/pragma" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -43,9 +43,9 @@ type ( L2 *FileL2 } FileL1 struct { - Syntax pref.Syntax + Syntax protoreflect.Syntax Path string - Package pref.FullName + Package protoreflect.FullName Enums Enums Messages Messages @@ -53,36 +53,36 @@ type ( Services Services } FileL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Imports FileImports Locations SourceLocations } ) -func (fd *File) ParentFile() pref.FileDescriptor { return fd } -func (fd *File) Parent() pref.Descriptor { return nil } -func (fd *File) Index() int { return 0 } -func (fd *File) Syntax() pref.Syntax { return fd.L1.Syntax } -func (fd *File) Name() pref.Name { return fd.L1.Package.Name() } -func (fd *File) FullName() pref.FullName { return fd.L1.Package } -func (fd *File) IsPlaceholder() bool { return false } -func (fd *File) Options() pref.ProtoMessage { +func (fd *File) ParentFile() protoreflect.FileDescriptor { return fd } +func (fd *File) Parent() protoreflect.Descriptor { return nil } +func (fd *File) Index() int { return 0 } +func (fd *File) Syntax() protoreflect.Syntax { return fd.L1.Syntax } +func (fd *File) Name() protoreflect.Name { return fd.L1.Package.Name() } +func (fd *File) FullName() protoreflect.FullName { return fd.L1.Package } +func (fd *File) IsPlaceholder() bool { return false } +func (fd *File) Options() protoreflect.ProtoMessage { if f := fd.lazyInit().Options; f != nil { return f() } return descopts.File } -func (fd *File) Path() string { return fd.L1.Path } -func (fd *File) Package() pref.FullName { return fd.L1.Package } -func (fd *File) Imports() pref.FileImports { return &fd.lazyInit().Imports } -func (fd *File) Enums() pref.EnumDescriptors { return &fd.L1.Enums } -func (fd *File) Messages() pref.MessageDescriptors { return &fd.L1.Messages } -func (fd *File) Extensions() pref.ExtensionDescriptors { return &fd.L1.Extensions } -func (fd *File) Services() pref.ServiceDescriptors { return &fd.L1.Services } -func (fd *File) SourceLocations() pref.SourceLocations { return &fd.lazyInit().Locations } -func (fd *File) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } -func (fd *File) ProtoType(pref.FileDescriptor) {} -func (fd *File) ProtoInternal(pragma.DoNotImplement) {} +func (fd *File) Path() string { return fd.L1.Path } +func (fd *File) Package() protoreflect.FullName { return fd.L1.Package } +func (fd *File) Imports() protoreflect.FileImports { return &fd.lazyInit().Imports } +func (fd *File) Enums() protoreflect.EnumDescriptors { return &fd.L1.Enums } +func (fd *File) Messages() protoreflect.MessageDescriptors { return &fd.L1.Messages } +func (fd *File) Extensions() protoreflect.ExtensionDescriptors { return &fd.L1.Extensions } +func (fd *File) Services() protoreflect.ServiceDescriptors { return &fd.L1.Services } +func (fd *File) SourceLocations() protoreflect.SourceLocations { return &fd.lazyInit().Locations } +func (fd *File) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } +func (fd *File) ProtoType(protoreflect.FileDescriptor) {} +func (fd *File) ProtoInternal(pragma.DoNotImplement) {} func (fd *File) lazyInit() *FileL2 { if atomic.LoadUint32(&fd.once) == 0 { @@ -119,7 +119,7 @@ type ( eagerValues bool // controls whether EnumL2.Values is already populated } EnumL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Values EnumValues ReservedNames Names ReservedRanges EnumRanges @@ -130,41 +130,41 @@ type ( L1 EnumValueL1 } EnumValueL1 struct { - Options func() pref.ProtoMessage - Number pref.EnumNumber + Options func() protoreflect.ProtoMessage + Number protoreflect.EnumNumber } ) -func (ed *Enum) Options() pref.ProtoMessage { +func (ed *Enum) Options() protoreflect.ProtoMessage { if f := ed.lazyInit().Options; f != nil { return f() } return descopts.Enum } -func (ed *Enum) Values() pref.EnumValueDescriptors { +func (ed *Enum) Values() protoreflect.EnumValueDescriptors { if ed.L1.eagerValues { return &ed.L2.Values } return &ed.lazyInit().Values } -func (ed *Enum) ReservedNames() pref.Names { return &ed.lazyInit().ReservedNames } -func (ed *Enum) ReservedRanges() pref.EnumRanges { return &ed.lazyInit().ReservedRanges } -func (ed *Enum) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } -func (ed *Enum) ProtoType(pref.EnumDescriptor) {} +func (ed *Enum) ReservedNames() protoreflect.Names { return &ed.lazyInit().ReservedNames } +func (ed *Enum) ReservedRanges() protoreflect.EnumRanges { return &ed.lazyInit().ReservedRanges } +func (ed *Enum) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } +func (ed *Enum) ProtoType(protoreflect.EnumDescriptor) {} func (ed *Enum) lazyInit() *EnumL2 { ed.L0.ParentFile.lazyInit() // implicitly initializes L2 return ed.L2 } -func (ed *EnumValue) Options() pref.ProtoMessage { +func (ed *EnumValue) Options() protoreflect.ProtoMessage { if f := ed.L1.Options; f != nil { return f() } return descopts.EnumValue } -func (ed *EnumValue) Number() pref.EnumNumber { return ed.L1.Number } -func (ed *EnumValue) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } -func (ed *EnumValue) ProtoType(pref.EnumValueDescriptor) {} +func (ed *EnumValue) Number() protoreflect.EnumNumber { return ed.L1.Number } +func (ed *EnumValue) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } +func (ed *EnumValue) ProtoType(protoreflect.EnumValueDescriptor) {} type ( Message struct { @@ -180,14 +180,14 @@ type ( IsMessageSet bool // promoted from google.protobuf.MessageOptions } MessageL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Fields Fields Oneofs Oneofs ReservedNames Names ReservedRanges FieldRanges RequiredNumbers FieldNumbers // must be consistent with Fields.Cardinality ExtensionRanges FieldRanges - ExtensionRangeOptions []func() pref.ProtoMessage // must be same length as ExtensionRanges + ExtensionRangeOptions []func() protoreflect.ProtoMessage // must be same length as ExtensionRanges } Field struct { @@ -195,10 +195,10 @@ type ( L1 FieldL1 } FieldL1 struct { - Options func() pref.ProtoMessage - Number pref.FieldNumber - Cardinality pref.Cardinality // must be consistent with Message.RequiredNumbers - Kind pref.Kind + Options func() protoreflect.ProtoMessage + Number protoreflect.FieldNumber + Cardinality protoreflect.Cardinality // must be consistent with Message.RequiredNumbers + Kind protoreflect.Kind StringName stringName IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto IsWeak bool // promoted from google.protobuf.FieldOptions @@ -207,9 +207,9 @@ type ( HasEnforceUTF8 bool // promoted from google.protobuf.FieldOptions EnforceUTF8 bool // promoted from google.protobuf.FieldOptions Default defaultValue - ContainingOneof pref.OneofDescriptor // must be consistent with Message.Oneofs.Fields - Enum pref.EnumDescriptor - Message pref.MessageDescriptor + ContainingOneof protoreflect.OneofDescriptor // must be consistent with Message.Oneofs.Fields + Enum protoreflect.EnumDescriptor + Message protoreflect.MessageDescriptor } Oneof struct { @@ -217,35 +217,35 @@ type ( L1 OneofL1 } OneofL1 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Fields OneofFields // must be consistent with Message.Fields.ContainingOneof } ) -func (md *Message) Options() pref.ProtoMessage { +func (md *Message) Options() protoreflect.ProtoMessage { if f := md.lazyInit().Options; f != nil { return f() } return descopts.Message } -func (md *Message) IsMapEntry() bool { return md.L1.IsMapEntry } -func (md *Message) Fields() pref.FieldDescriptors { return &md.lazyInit().Fields } -func (md *Message) Oneofs() pref.OneofDescriptors { return &md.lazyInit().Oneofs } -func (md *Message) ReservedNames() pref.Names { return &md.lazyInit().ReservedNames } -func (md *Message) ReservedRanges() pref.FieldRanges { return &md.lazyInit().ReservedRanges } -func (md *Message) RequiredNumbers() pref.FieldNumbers { return &md.lazyInit().RequiredNumbers } -func (md *Message) ExtensionRanges() pref.FieldRanges { return &md.lazyInit().ExtensionRanges } -func (md *Message) ExtensionRangeOptions(i int) pref.ProtoMessage { +func (md *Message) IsMapEntry() bool { return md.L1.IsMapEntry } +func (md *Message) Fields() protoreflect.FieldDescriptors { return &md.lazyInit().Fields } +func (md *Message) Oneofs() protoreflect.OneofDescriptors { return &md.lazyInit().Oneofs } +func (md *Message) ReservedNames() protoreflect.Names { return &md.lazyInit().ReservedNames } +func (md *Message) ReservedRanges() protoreflect.FieldRanges { return &md.lazyInit().ReservedRanges } +func (md *Message) RequiredNumbers() protoreflect.FieldNumbers { return &md.lazyInit().RequiredNumbers } +func (md *Message) ExtensionRanges() protoreflect.FieldRanges { return &md.lazyInit().ExtensionRanges } +func (md *Message) ExtensionRangeOptions(i int) protoreflect.ProtoMessage { if f := md.lazyInit().ExtensionRangeOptions[i]; f != nil { return f() } return descopts.ExtensionRange } -func (md *Message) Enums() pref.EnumDescriptors { return &md.L1.Enums } -func (md *Message) Messages() pref.MessageDescriptors { return &md.L1.Messages } -func (md *Message) Extensions() pref.ExtensionDescriptors { return &md.L1.Extensions } -func (md *Message) ProtoType(pref.MessageDescriptor) {} -func (md *Message) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } +func (md *Message) Enums() protoreflect.EnumDescriptors { return &md.L1.Enums } +func (md *Message) Messages() protoreflect.MessageDescriptors { return &md.L1.Messages } +func (md *Message) Extensions() protoreflect.ExtensionDescriptors { return &md.L1.Extensions } +func (md *Message) ProtoType(protoreflect.MessageDescriptor) {} +func (md *Message) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } func (md *Message) lazyInit() *MessageL2 { md.L0.ParentFile.lazyInit() // implicitly initializes L2 return md.L2 @@ -260,28 +260,28 @@ func (md *Message) IsMessageSet() bool { return md.L1.IsMessageSet } -func (fd *Field) Options() pref.ProtoMessage { +func (fd *Field) Options() protoreflect.ProtoMessage { if f := fd.L1.Options; f != nil { return f() } return descopts.Field } -func (fd *Field) Number() pref.FieldNumber { return fd.L1.Number } -func (fd *Field) Cardinality() pref.Cardinality { return fd.L1.Cardinality } -func (fd *Field) Kind() pref.Kind { return fd.L1.Kind } -func (fd *Field) HasJSONName() bool { return fd.L1.StringName.hasJSON } -func (fd *Field) JSONName() string { return fd.L1.StringName.getJSON(fd) } -func (fd *Field) TextName() string { return fd.L1.StringName.getText(fd) } +func (fd *Field) Number() protoreflect.FieldNumber { return fd.L1.Number } +func (fd *Field) Cardinality() protoreflect.Cardinality { return fd.L1.Cardinality } +func (fd *Field) Kind() protoreflect.Kind { return fd.L1.Kind } +func (fd *Field) HasJSONName() bool { return fd.L1.StringName.hasJSON } +func (fd *Field) JSONName() string { return fd.L1.StringName.getJSON(fd) } +func (fd *Field) TextName() string { return fd.L1.StringName.getText(fd) } func (fd *Field) HasPresence() bool { - return fd.L1.Cardinality != pref.Repeated && (fd.L0.ParentFile.L1.Syntax == pref.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil) + return fd.L1.Cardinality != protoreflect.Repeated && (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil) } func (fd *Field) HasOptionalKeyword() bool { - return (fd.L0.ParentFile.L1.Syntax == pref.Proto2 && fd.L1.Cardinality == pref.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional + return (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional } func (fd *Field) IsPacked() bool { - if !fd.L1.HasPacked && fd.L0.ParentFile.L1.Syntax != pref.Proto2 && fd.L1.Cardinality == pref.Repeated { + if !fd.L1.HasPacked && fd.L0.ParentFile.L1.Syntax != protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Repeated { switch fd.L1.Kind { - case pref.StringKind, pref.BytesKind, pref.MessageKind, pref.GroupKind: + case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind: default: return true } @@ -290,40 +290,40 @@ func (fd *Field) IsPacked() bool { } func (fd *Field) IsExtension() bool { return false } func (fd *Field) IsWeak() bool { return fd.L1.IsWeak } -func (fd *Field) IsList() bool { return fd.Cardinality() == pref.Repeated && !fd.IsMap() } +func (fd *Field) IsList() bool { return fd.Cardinality() == protoreflect.Repeated && !fd.IsMap() } func (fd *Field) IsMap() bool { return fd.Message() != nil && fd.Message().IsMapEntry() } -func (fd *Field) MapKey() pref.FieldDescriptor { +func (fd *Field) MapKey() protoreflect.FieldDescriptor { if !fd.IsMap() { return nil } return fd.Message().Fields().ByNumber(genid.MapEntry_Key_field_number) } -func (fd *Field) MapValue() pref.FieldDescriptor { +func (fd *Field) MapValue() protoreflect.FieldDescriptor { if !fd.IsMap() { return nil } return fd.Message().Fields().ByNumber(genid.MapEntry_Value_field_number) } -func (fd *Field) HasDefault() bool { return fd.L1.Default.has } -func (fd *Field) Default() pref.Value { return fd.L1.Default.get(fd) } -func (fd *Field) DefaultEnumValue() pref.EnumValueDescriptor { return fd.L1.Default.enum } -func (fd *Field) ContainingOneof() pref.OneofDescriptor { return fd.L1.ContainingOneof } -func (fd *Field) ContainingMessage() pref.MessageDescriptor { - return fd.L0.Parent.(pref.MessageDescriptor) +func (fd *Field) HasDefault() bool { return fd.L1.Default.has } +func (fd *Field) Default() protoreflect.Value { return fd.L1.Default.get(fd) } +func (fd *Field) DefaultEnumValue() protoreflect.EnumValueDescriptor { return fd.L1.Default.enum } +func (fd *Field) ContainingOneof() protoreflect.OneofDescriptor { return fd.L1.ContainingOneof } +func (fd *Field) ContainingMessage() protoreflect.MessageDescriptor { + return fd.L0.Parent.(protoreflect.MessageDescriptor) } -func (fd *Field) Enum() pref.EnumDescriptor { +func (fd *Field) Enum() protoreflect.EnumDescriptor { return fd.L1.Enum } -func (fd *Field) Message() pref.MessageDescriptor { +func (fd *Field) Message() protoreflect.MessageDescriptor { if fd.L1.IsWeak { if d, _ := protoregistry.GlobalFiles.FindDescriptorByName(fd.L1.Message.FullName()); d != nil { - return d.(pref.MessageDescriptor) + return d.(protoreflect.MessageDescriptor) } } return fd.L1.Message } -func (fd *Field) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } -func (fd *Field) ProtoType(pref.FieldDescriptor) {} +func (fd *Field) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } +func (fd *Field) ProtoType(protoreflect.FieldDescriptor) {} // EnforceUTF8 is a pseudo-internal API to determine whether to enforce UTF-8 // validation for the string field. This exists for Google-internal use only @@ -336,21 +336,21 @@ func (fd *Field) EnforceUTF8() bool { if fd.L1.HasEnforceUTF8 { return fd.L1.EnforceUTF8 } - return fd.L0.ParentFile.L1.Syntax == pref.Proto3 + return fd.L0.ParentFile.L1.Syntax == protoreflect.Proto3 } func (od *Oneof) IsSynthetic() bool { - return od.L0.ParentFile.L1.Syntax == pref.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword() + return od.L0.ParentFile.L1.Syntax == protoreflect.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword() } -func (od *Oneof) Options() pref.ProtoMessage { +func (od *Oneof) Options() protoreflect.ProtoMessage { if f := od.L1.Options; f != nil { return f() } return descopts.Oneof } -func (od *Oneof) Fields() pref.FieldDescriptors { return &od.L1.Fields } -func (od *Oneof) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, od) } -func (od *Oneof) ProtoType(pref.OneofDescriptor) {} +func (od *Oneof) Fields() protoreflect.FieldDescriptors { return &od.L1.Fields } +func (od *Oneof) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, od) } +func (od *Oneof) ProtoType(protoreflect.OneofDescriptor) {} type ( Extension struct { @@ -359,55 +359,57 @@ type ( L2 *ExtensionL2 // protected by fileDesc.once } ExtensionL1 struct { - Number pref.FieldNumber - Extendee pref.MessageDescriptor - Cardinality pref.Cardinality - Kind pref.Kind + Number protoreflect.FieldNumber + Extendee protoreflect.MessageDescriptor + Cardinality protoreflect.Cardinality + Kind protoreflect.Kind } ExtensionL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage StringName stringName IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto IsPacked bool // promoted from google.protobuf.FieldOptions Default defaultValue - Enum pref.EnumDescriptor - Message pref.MessageDescriptor + Enum protoreflect.EnumDescriptor + Message protoreflect.MessageDescriptor } ) -func (xd *Extension) Options() pref.ProtoMessage { +func (xd *Extension) Options() protoreflect.ProtoMessage { if f := xd.lazyInit().Options; f != nil { return f() } return descopts.Field } -func (xd *Extension) Number() pref.FieldNumber { return xd.L1.Number } -func (xd *Extension) Cardinality() pref.Cardinality { return xd.L1.Cardinality } -func (xd *Extension) Kind() pref.Kind { return xd.L1.Kind } -func (xd *Extension) HasJSONName() bool { return xd.lazyInit().StringName.hasJSON } -func (xd *Extension) JSONName() string { return xd.lazyInit().StringName.getJSON(xd) } -func (xd *Extension) TextName() string { return xd.lazyInit().StringName.getText(xd) } -func (xd *Extension) HasPresence() bool { return xd.L1.Cardinality != pref.Repeated } +func (xd *Extension) Number() protoreflect.FieldNumber { return xd.L1.Number } +func (xd *Extension) Cardinality() protoreflect.Cardinality { return xd.L1.Cardinality } +func (xd *Extension) Kind() protoreflect.Kind { return xd.L1.Kind } +func (xd *Extension) HasJSONName() bool { return xd.lazyInit().StringName.hasJSON } +func (xd *Extension) JSONName() string { return xd.lazyInit().StringName.getJSON(xd) } +func (xd *Extension) TextName() string { return xd.lazyInit().StringName.getText(xd) } +func (xd *Extension) HasPresence() bool { return xd.L1.Cardinality != protoreflect.Repeated } func (xd *Extension) HasOptionalKeyword() bool { - return (xd.L0.ParentFile.L1.Syntax == pref.Proto2 && xd.L1.Cardinality == pref.Optional) || xd.lazyInit().IsProto3Optional -} -func (xd *Extension) IsPacked() bool { return xd.lazyInit().IsPacked } -func (xd *Extension) IsExtension() bool { return true } -func (xd *Extension) IsWeak() bool { return false } -func (xd *Extension) IsList() bool { return xd.Cardinality() == pref.Repeated } -func (xd *Extension) IsMap() bool { return false } -func (xd *Extension) MapKey() pref.FieldDescriptor { return nil } -func (xd *Extension) MapValue() pref.FieldDescriptor { return nil } -func (xd *Extension) HasDefault() bool { return xd.lazyInit().Default.has } -func (xd *Extension) Default() pref.Value { return xd.lazyInit().Default.get(xd) } -func (xd *Extension) DefaultEnumValue() pref.EnumValueDescriptor { return xd.lazyInit().Default.enum } -func (xd *Extension) ContainingOneof() pref.OneofDescriptor { return nil } -func (xd *Extension) ContainingMessage() pref.MessageDescriptor { return xd.L1.Extendee } -func (xd *Extension) Enum() pref.EnumDescriptor { return xd.lazyInit().Enum } -func (xd *Extension) Message() pref.MessageDescriptor { return xd.lazyInit().Message } -func (xd *Extension) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, xd) } -func (xd *Extension) ProtoType(pref.FieldDescriptor) {} -func (xd *Extension) ProtoInternal(pragma.DoNotImplement) {} + return (xd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && xd.L1.Cardinality == protoreflect.Optional) || xd.lazyInit().IsProto3Optional +} +func (xd *Extension) IsPacked() bool { return xd.lazyInit().IsPacked } +func (xd *Extension) IsExtension() bool { return true } +func (xd *Extension) IsWeak() bool { return false } +func (xd *Extension) IsList() bool { return xd.Cardinality() == protoreflect.Repeated } +func (xd *Extension) IsMap() bool { return false } +func (xd *Extension) MapKey() protoreflect.FieldDescriptor { return nil } +func (xd *Extension) MapValue() protoreflect.FieldDescriptor { return nil } +func (xd *Extension) HasDefault() bool { return xd.lazyInit().Default.has } +func (xd *Extension) Default() protoreflect.Value { return xd.lazyInit().Default.get(xd) } +func (xd *Extension) DefaultEnumValue() protoreflect.EnumValueDescriptor { + return xd.lazyInit().Default.enum +} +func (xd *Extension) ContainingOneof() protoreflect.OneofDescriptor { return nil } +func (xd *Extension) ContainingMessage() protoreflect.MessageDescriptor { return xd.L1.Extendee } +func (xd *Extension) Enum() protoreflect.EnumDescriptor { return xd.lazyInit().Enum } +func (xd *Extension) Message() protoreflect.MessageDescriptor { return xd.lazyInit().Message } +func (xd *Extension) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, xd) } +func (xd *Extension) ProtoType(protoreflect.FieldDescriptor) {} +func (xd *Extension) ProtoInternal(pragma.DoNotImplement) {} func (xd *Extension) lazyInit() *ExtensionL2 { xd.L0.ParentFile.lazyInit() // implicitly initializes L2 return xd.L2 @@ -421,7 +423,7 @@ type ( } ServiceL1 struct{} ServiceL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Methods Methods } @@ -430,48 +432,48 @@ type ( L1 MethodL1 } MethodL1 struct { - Options func() pref.ProtoMessage - Input pref.MessageDescriptor - Output pref.MessageDescriptor + Options func() protoreflect.ProtoMessage + Input protoreflect.MessageDescriptor + Output protoreflect.MessageDescriptor IsStreamingClient bool IsStreamingServer bool } ) -func (sd *Service) Options() pref.ProtoMessage { +func (sd *Service) Options() protoreflect.ProtoMessage { if f := sd.lazyInit().Options; f != nil { return f() } return descopts.Service } -func (sd *Service) Methods() pref.MethodDescriptors { return &sd.lazyInit().Methods } -func (sd *Service) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, sd) } -func (sd *Service) ProtoType(pref.ServiceDescriptor) {} -func (sd *Service) ProtoInternal(pragma.DoNotImplement) {} +func (sd *Service) Methods() protoreflect.MethodDescriptors { return &sd.lazyInit().Methods } +func (sd *Service) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, sd) } +func (sd *Service) ProtoType(protoreflect.ServiceDescriptor) {} +func (sd *Service) ProtoInternal(pragma.DoNotImplement) {} func (sd *Service) lazyInit() *ServiceL2 { sd.L0.ParentFile.lazyInit() // implicitly initializes L2 return sd.L2 } -func (md *Method) Options() pref.ProtoMessage { +func (md *Method) Options() protoreflect.ProtoMessage { if f := md.L1.Options; f != nil { return f() } return descopts.Method } -func (md *Method) Input() pref.MessageDescriptor { return md.L1.Input } -func (md *Method) Output() pref.MessageDescriptor { return md.L1.Output } -func (md *Method) IsStreamingClient() bool { return md.L1.IsStreamingClient } -func (md *Method) IsStreamingServer() bool { return md.L1.IsStreamingServer } -func (md *Method) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } -func (md *Method) ProtoType(pref.MethodDescriptor) {} -func (md *Method) ProtoInternal(pragma.DoNotImplement) {} +func (md *Method) Input() protoreflect.MessageDescriptor { return md.L1.Input } +func (md *Method) Output() protoreflect.MessageDescriptor { return md.L1.Output } +func (md *Method) IsStreamingClient() bool { return md.L1.IsStreamingClient } +func (md *Method) IsStreamingServer() bool { return md.L1.IsStreamingServer } +func (md *Method) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } +func (md *Method) ProtoType(protoreflect.MethodDescriptor) {} +func (md *Method) ProtoInternal(pragma.DoNotImplement) {} // Surrogate files are can be used to create standalone descriptors // where the syntax is only information derived from the parent file. var ( - SurrogateProto2 = &File{L1: FileL1{Syntax: pref.Proto2}, L2: &FileL2{}} - SurrogateProto3 = &File{L1: FileL1{Syntax: pref.Proto3}, L2: &FileL2{}} + SurrogateProto2 = &File{L1: FileL1{Syntax: protoreflect.Proto2}, L2: &FileL2{}} + SurrogateProto3 = &File{L1: FileL1{Syntax: protoreflect.Proto3}, L2: &FileL2{}} ) type ( @@ -479,24 +481,24 @@ type ( L0 BaseL0 } BaseL0 struct { - FullName pref.FullName // must be populated - ParentFile *File // must be populated - Parent pref.Descriptor + FullName protoreflect.FullName // must be populated + ParentFile *File // must be populated + Parent protoreflect.Descriptor Index int } ) -func (d *Base) Name() pref.Name { return d.L0.FullName.Name() } -func (d *Base) FullName() pref.FullName { return d.L0.FullName } -func (d *Base) ParentFile() pref.FileDescriptor { +func (d *Base) Name() protoreflect.Name { return d.L0.FullName.Name() } +func (d *Base) FullName() protoreflect.FullName { return d.L0.FullName } +func (d *Base) ParentFile() protoreflect.FileDescriptor { if d.L0.ParentFile == SurrogateProto2 || d.L0.ParentFile == SurrogateProto3 { return nil // surrogate files are not real parents } return d.L0.ParentFile } -func (d *Base) Parent() pref.Descriptor { return d.L0.Parent } +func (d *Base) Parent() protoreflect.Descriptor { return d.L0.Parent } func (d *Base) Index() int { return d.L0.Index } -func (d *Base) Syntax() pref.Syntax { return d.L0.ParentFile.Syntax() } +func (d *Base) Syntax() protoreflect.Syntax { return d.L0.ParentFile.Syntax() } func (d *Base) IsPlaceholder() bool { return false } func (d *Base) ProtoInternal(pragma.DoNotImplement) {} @@ -513,7 +515,7 @@ func (s *stringName) InitJSON(name string) { s.nameJSON = name } -func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { +func (s *stringName) lazyInit(fd protoreflect.FieldDescriptor) *stringName { s.once.Do(func() { if fd.IsExtension() { // For extensions, JSON and text are formatted the same way. @@ -533,7 +535,7 @@ func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { // Format the text name. s.nameText = string(fd.Name()) - if fd.Kind() == pref.GroupKind { + if fd.Kind() == protoreflect.GroupKind { s.nameText = string(fd.Message().Name()) } } @@ -541,10 +543,10 @@ func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { return s } -func (s *stringName) getJSON(fd pref.FieldDescriptor) string { return s.lazyInit(fd).nameJSON } -func (s *stringName) getText(fd pref.FieldDescriptor) string { return s.lazyInit(fd).nameText } +func (s *stringName) getJSON(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameJSON } +func (s *stringName) getText(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameText } -func DefaultValue(v pref.Value, ev pref.EnumValueDescriptor) defaultValue { +func DefaultValue(v protoreflect.Value, ev protoreflect.EnumValueDescriptor) defaultValue { dv := defaultValue{has: v.IsValid(), val: v, enum: ev} if b, ok := v.Interface().([]byte); ok { // Store a copy of the default bytes, so that we can detect @@ -554,9 +556,9 @@ func DefaultValue(v pref.Value, ev pref.EnumValueDescriptor) defaultValue { return dv } -func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) defaultValue { - var evs pref.EnumValueDescriptors - if k == pref.EnumKind { +func unmarshalDefault(b []byte, k protoreflect.Kind, pf *File, ed protoreflect.EnumDescriptor) defaultValue { + var evs protoreflect.EnumValueDescriptors + if k == protoreflect.EnumKind { // If the enum is declared within the same file, be careful not to // blindly call the Values method, lest we bind ourselves in a deadlock. if e, ok := ed.(*Enum); ok && e.L0.ParentFile == pf { @@ -567,9 +569,9 @@ func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) d // If we are unable to resolve the enum dependency, use a placeholder // enum value since we will not be able to parse the default value. - if ed.IsPlaceholder() && pref.Name(b).IsValid() { - v := pref.ValueOfEnum(0) - ev := PlaceholderEnumValue(ed.FullName().Parent().Append(pref.Name(b))) + if ed.IsPlaceholder() && protoreflect.Name(b).IsValid() { + v := protoreflect.ValueOfEnum(0) + ev := PlaceholderEnumValue(ed.FullName().Parent().Append(protoreflect.Name(b))) return DefaultValue(v, ev) } } @@ -583,41 +585,41 @@ func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) d type defaultValue struct { has bool - val pref.Value - enum pref.EnumValueDescriptor + val protoreflect.Value + enum protoreflect.EnumValueDescriptor bytes []byte } -func (dv *defaultValue) get(fd pref.FieldDescriptor) pref.Value { +func (dv *defaultValue) get(fd protoreflect.FieldDescriptor) protoreflect.Value { // Return the zero value as the default if unpopulated. if !dv.has { - if fd.Cardinality() == pref.Repeated { - return pref.Value{} + if fd.Cardinality() == protoreflect.Repeated { + return protoreflect.Value{} } switch fd.Kind() { - case pref.BoolKind: - return pref.ValueOfBool(false) - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: - return pref.ValueOfInt32(0) - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: - return pref.ValueOfInt64(0) - case pref.Uint32Kind, pref.Fixed32Kind: - return pref.ValueOfUint32(0) - case pref.Uint64Kind, pref.Fixed64Kind: - return pref.ValueOfUint64(0) - case pref.FloatKind: - return pref.ValueOfFloat32(0) - case pref.DoubleKind: - return pref.ValueOfFloat64(0) - case pref.StringKind: - return pref.ValueOfString("") - case pref.BytesKind: - return pref.ValueOfBytes(nil) - case pref.EnumKind: + case protoreflect.BoolKind: + return protoreflect.ValueOfBool(false) + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: + return protoreflect.ValueOfInt32(0) + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: + return protoreflect.ValueOfInt64(0) + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: + return protoreflect.ValueOfUint32(0) + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: + return protoreflect.ValueOfUint64(0) + case protoreflect.FloatKind: + return protoreflect.ValueOfFloat32(0) + case protoreflect.DoubleKind: + return protoreflect.ValueOfFloat64(0) + case protoreflect.StringKind: + return protoreflect.ValueOfString("") + case protoreflect.BytesKind: + return protoreflect.ValueOfBytes(nil) + case protoreflect.EnumKind: if evs := fd.Enum().Values(); evs.Len() > 0 { - return pref.ValueOfEnum(evs.Get(0).Number()) + return protoreflect.ValueOfEnum(evs.Get(0).Number()) } - return pref.ValueOfEnum(0) + return protoreflect.ValueOfEnum(0) } } diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go index 66e1fee52..4a1584c9d 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // fileRaw is a data struct used when initializing a file descriptor from @@ -95,7 +95,7 @@ func (fd *File) unmarshalSeed(b []byte) { sb := getBuilder() defer putBuilder(sb) - var prevField pref.FieldNumber + var prevField protoreflect.FieldNumber var numEnums, numMessages, numExtensions, numServices int var posEnums, posMessages, posExtensions, posServices int b0 := b @@ -110,16 +110,16 @@ func (fd *File) unmarshalSeed(b []byte) { case genid.FileDescriptorProto_Syntax_field_number: switch string(v) { case "proto2": - fd.L1.Syntax = pref.Proto2 + fd.L1.Syntax = protoreflect.Proto2 case "proto3": - fd.L1.Syntax = pref.Proto3 + fd.L1.Syntax = protoreflect.Proto3 default: panic("invalid syntax") } case genid.FileDescriptorProto_Name_field_number: fd.L1.Path = sb.MakeString(v) case genid.FileDescriptorProto_Package_field_number: - fd.L1.Package = pref.FullName(sb.MakeString(v)) + fd.L1.Package = protoreflect.FullName(sb.MakeString(v)) case genid.FileDescriptorProto_EnumType_field_number: if prevField != genid.FileDescriptorProto_EnumType_field_number { if numEnums > 0 { @@ -163,7 +163,7 @@ func (fd *File) unmarshalSeed(b []byte) { // If syntax is missing, it is assumed to be proto2. if fd.L1.Syntax == 0 { - fd.L1.Syntax = pref.Proto2 + fd.L1.Syntax = protoreflect.Proto2 } // Must allocate all declarations before parsing each descriptor type @@ -219,7 +219,7 @@ func (fd *File) unmarshalSeed(b []byte) { } } -func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { ed.L0.ParentFile = pf ed.L0.Parent = pd ed.L0.Index = i @@ -271,12 +271,12 @@ func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Desc } } -func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { md.L0.ParentFile = pf md.L0.Parent = pd md.L0.Index = i - var prevField pref.FieldNumber + var prevField protoreflect.FieldNumber var numEnums, numMessages, numExtensions int var posEnums, posMessages, posExtensions int b0 := b @@ -387,7 +387,7 @@ func (md *Message) unmarshalSeedOptions(b []byte) { } } -func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { xd.L0.ParentFile = pf xd.L0.Parent = pd xd.L0.Index = i @@ -401,11 +401,11 @@ func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref b = b[m:] switch num { case genid.FieldDescriptorProto_Number_field_number: - xd.L1.Number = pref.FieldNumber(v) + xd.L1.Number = protoreflect.FieldNumber(v) case genid.FieldDescriptorProto_Label_field_number: - xd.L1.Cardinality = pref.Cardinality(v) + xd.L1.Cardinality = protoreflect.Cardinality(v) case genid.FieldDescriptorProto_Type_field_number: - xd.L1.Kind = pref.Kind(v) + xd.L1.Kind = protoreflect.Kind(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) @@ -423,7 +423,7 @@ func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref } } -func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { sd.L0.ParentFile = pf sd.L0.Parent = pd sd.L0.Index = i @@ -459,13 +459,13 @@ func putBuilder(b *strs.Builder) { // makeFullName converts b to a protoreflect.FullName, // where b must start with a leading dot. -func makeFullName(sb *strs.Builder, b []byte) pref.FullName { +func makeFullName(sb *strs.Builder, b []byte) protoreflect.FullName { if len(b) == 0 || b[0] != '.' { panic("name reference must be fully qualified") } - return pref.FullName(sb.MakeString(b[1:])) + return protoreflect.FullName(sb.MakeString(b[1:])) } -func appendFullName(sb *strs.Builder, prefix pref.FullName, suffix []byte) pref.FullName { - return sb.AppendFullName(prefix, pref.Name(strs.UnsafeString(suffix))) +func appendFullName(sb *strs.Builder, prefix protoreflect.FullName, suffix []byte) protoreflect.FullName { + return sb.AppendFullName(prefix, protoreflect.Name(strs.UnsafeString(suffix))) } diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go index 198451e3e..736a19a75 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go @@ -13,7 +13,7 @@ import ( "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) func (fd *File) lazyRawInit() { @@ -39,10 +39,10 @@ func (file *File) resolveMessages() { // Resolve message field dependency. switch fd.L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: fd.L1.Enum = file.resolveEnumDependency(fd.L1.Enum, listFieldDeps, depIdx) depIdx++ - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: fd.L1.Message = file.resolveMessageDependency(fd.L1.Message, listFieldDeps, depIdx) depIdx++ } @@ -62,10 +62,10 @@ func (file *File) resolveExtensions() { // Resolve extension field dependency. switch xd.L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: xd.L2.Enum = file.resolveEnumDependency(xd.L2.Enum, listExtDeps, depIdx) depIdx++ - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: xd.L2.Message = file.resolveMessageDependency(xd.L2.Message, listExtDeps, depIdx) depIdx++ } @@ -92,7 +92,7 @@ func (file *File) resolveServices() { } } -func (file *File) resolveEnumDependency(ed pref.EnumDescriptor, i, j int32) pref.EnumDescriptor { +func (file *File) resolveEnumDependency(ed protoreflect.EnumDescriptor, i, j int32) protoreflect.EnumDescriptor { r := file.builder.FileRegistry if r, ok := r.(resolverByIndex); ok { if ed2 := r.FindEnumByIndex(i, j, file.allEnums, file.allMessages); ed2 != nil { @@ -105,12 +105,12 @@ func (file *File) resolveEnumDependency(ed pref.EnumDescriptor, i, j int32) pref } } if d, _ := r.FindDescriptorByName(ed.FullName()); d != nil { - return d.(pref.EnumDescriptor) + return d.(protoreflect.EnumDescriptor) } return ed } -func (file *File) resolveMessageDependency(md pref.MessageDescriptor, i, j int32) pref.MessageDescriptor { +func (file *File) resolveMessageDependency(md protoreflect.MessageDescriptor, i, j int32) protoreflect.MessageDescriptor { r := file.builder.FileRegistry if r, ok := r.(resolverByIndex); ok { if md2 := r.FindMessageByIndex(i, j, file.allEnums, file.allMessages); md2 != nil { @@ -123,7 +123,7 @@ func (file *File) resolveMessageDependency(md pref.MessageDescriptor, i, j int32 } } if d, _ := r.FindDescriptorByName(md.FullName()); d != nil { - return d.(pref.MessageDescriptor) + return d.(protoreflect.MessageDescriptor) } return md } @@ -158,7 +158,7 @@ func (fd *File) unmarshalFull(b []byte) { if imp == nil { imp = PlaceholderFile(path) } - fd.L2.Imports = append(fd.L2.Imports, pref.FileImport{FileDescriptor: imp}) + fd.L2.Imports = append(fd.L2.Imports, protoreflect.FileImport{FileDescriptor: imp}) case genid.FileDescriptorProto_EnumType_field_number: fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb) enumIdx++ @@ -199,7 +199,7 @@ func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { case genid.EnumDescriptorProto_Value_field_number: rawValues = append(rawValues, v) case genid.EnumDescriptorProto_ReservedName_field_number: - ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) + ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v))) case genid.EnumDescriptorProto_ReservedRange_field_number: ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v)) case genid.EnumDescriptorProto_Options_field_number: @@ -219,7 +219,7 @@ func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { ed.L2.Options = ed.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Enum, rawOptions) } -func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { +func unmarshalEnumReservedRange(b []byte) (r [2]protoreflect.EnumNumber) { for len(b) > 0 { num, typ, n := protowire.ConsumeTag(b) b = b[n:] @@ -229,9 +229,9 @@ func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { b = b[m:] switch num { case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number: - r[0] = pref.EnumNumber(v) + r[0] = protoreflect.EnumNumber(v) case genid.EnumDescriptorProto_EnumReservedRange_End_field_number: - r[1] = pref.EnumNumber(v) + r[1] = protoreflect.EnumNumber(v) } default: m := protowire.ConsumeFieldValue(num, typ, b) @@ -241,7 +241,7 @@ func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { return r } -func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { vd.L0.ParentFile = pf vd.L0.Parent = pd vd.L0.Index = i @@ -256,7 +256,7 @@ func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref b = b[m:] switch num { case genid.EnumValueDescriptorProto_Number_field_number: - vd.L1.Number = pref.EnumNumber(v) + vd.L1.Number = protoreflect.EnumNumber(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) @@ -294,7 +294,7 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { case genid.DescriptorProto_OneofDecl_field_number: rawOneofs = append(rawOneofs, v) case genid.DescriptorProto_ReservedName_field_number: - md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) + md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v))) case genid.DescriptorProto_ReservedRange_field_number: md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v)) case genid.DescriptorProto_ExtensionRange_field_number: @@ -326,7 +326,7 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { for i, b := range rawFields { fd := &md.L2.Fields.List[i] fd.unmarshalFull(b, sb, md.L0.ParentFile, md, i) - if fd.L1.Cardinality == pref.Required { + if fd.L1.Cardinality == protoreflect.Required { md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number) } } @@ -359,7 +359,7 @@ func (md *Message) unmarshalOptions(b []byte) { } } -func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { +func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) { for len(b) > 0 { num, typ, n := protowire.ConsumeTag(b) b = b[n:] @@ -369,9 +369,9 @@ func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { b = b[m:] switch num { case genid.DescriptorProto_ReservedRange_Start_field_number: - r[0] = pref.FieldNumber(v) + r[0] = protoreflect.FieldNumber(v) case genid.DescriptorProto_ReservedRange_End_field_number: - r[1] = pref.FieldNumber(v) + r[1] = protoreflect.FieldNumber(v) } default: m := protowire.ConsumeFieldValue(num, typ, b) @@ -381,7 +381,7 @@ func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { return r } -func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions []byte) { +func unmarshalMessageExtensionRange(b []byte) (r [2]protoreflect.FieldNumber, rawOptions []byte) { for len(b) > 0 { num, typ, n := protowire.ConsumeTag(b) b = b[n:] @@ -391,9 +391,9 @@ func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions b = b[m:] switch num { case genid.DescriptorProto_ExtensionRange_Start_field_number: - r[0] = pref.FieldNumber(v) + r[0] = protoreflect.FieldNumber(v) case genid.DescriptorProto_ExtensionRange_End_field_number: - r[1] = pref.FieldNumber(v) + r[1] = protoreflect.FieldNumber(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) @@ -410,7 +410,7 @@ func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions return r, rawOptions } -func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { fd.L0.ParentFile = pf fd.L0.Parent = pd fd.L0.Index = i @@ -426,11 +426,11 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des b = b[m:] switch num { case genid.FieldDescriptorProto_Number_field_number: - fd.L1.Number = pref.FieldNumber(v) + fd.L1.Number = protoreflect.FieldNumber(v) case genid.FieldDescriptorProto_Label_field_number: - fd.L1.Cardinality = pref.Cardinality(v) + fd.L1.Cardinality = protoreflect.Cardinality(v) case genid.FieldDescriptorProto_Type_field_number: - fd.L1.Kind = pref.Kind(v) + fd.L1.Kind = protoreflect.Kind(v) case genid.FieldDescriptorProto_OneofIndex_field_number: // In Message.unmarshalFull, we allocate slices for both // the field and oneof descriptors before unmarshaling either @@ -453,7 +453,7 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des case genid.FieldDescriptorProto_JsonName_field_number: fd.L1.StringName.InitJSON(sb.MakeString(v)) case genid.FieldDescriptorProto_DefaultValue_field_number: - fd.L1.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages + fd.L1.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages case genid.FieldDescriptorProto_TypeName_field_number: rawTypeName = v case genid.FieldDescriptorProto_Options_field_number: @@ -468,9 +468,9 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des if rawTypeName != nil { name := makeFullName(sb, rawTypeName) switch fd.L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: fd.L1.Enum = PlaceholderEnum(name) - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: fd.L1.Message = PlaceholderMessage(name) } } @@ -504,7 +504,7 @@ func (fd *Field) unmarshalOptions(b []byte) { } } -func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { od.L0.ParentFile = pf od.L0.Parent = pd od.L0.Index = i @@ -553,7 +553,7 @@ func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) { case genid.FieldDescriptorProto_JsonName_field_number: xd.L2.StringName.InitJSON(sb.MakeString(v)) case genid.FieldDescriptorProto_DefaultValue_field_number: - xd.L2.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions + xd.L2.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions case genid.FieldDescriptorProto_TypeName_field_number: rawTypeName = v case genid.FieldDescriptorProto_Options_field_number: @@ -568,9 +568,9 @@ func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) { if rawTypeName != nil { name := makeFullName(sb, rawTypeName) switch xd.L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: xd.L2.Enum = PlaceholderEnum(name) - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: xd.L2.Message = PlaceholderMessage(name) } } @@ -627,7 +627,7 @@ func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) { sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, rawOptions) } -func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { md.L0.ParentFile = pf md.L0.Parent = pd md.L0.Index = i @@ -680,18 +680,18 @@ func appendOptions(dst, src []byte) []byte { // // The type of message to unmarshal to is passed as a pointer since the // vars in descopts may not yet be populated at the time this function is called. -func (db *Builder) optionsUnmarshaler(p *pref.ProtoMessage, b []byte) func() pref.ProtoMessage { +func (db *Builder) optionsUnmarshaler(p *protoreflect.ProtoMessage, b []byte) func() protoreflect.ProtoMessage { if b == nil { return nil } - var opts pref.ProtoMessage + var opts protoreflect.ProtoMessage var once sync.Once - return func() pref.ProtoMessage { + return func() protoreflect.ProtoMessage { once.Do(func() { if *p == nil { panic("Descriptor.Options called without importing the descriptor package") } - opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(pref.ProtoMessage) + opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(protoreflect.ProtoMessage) if err := (proto.UnmarshalOptions{ AllowPartial: true, Resolver: db.TypeResolver, diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go index aa294fff9..e3b6587da 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go @@ -17,31 +17,30 @@ import ( "google.golang.org/protobuf/internal/errors" "google.golang.org/protobuf/internal/pragma" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" ) -type FileImports []pref.FileImport +type FileImports []protoreflect.FileImport func (p *FileImports) Len() int { return len(*p) } -func (p *FileImports) Get(i int) pref.FileImport { return (*p)[i] } +func (p *FileImports) Get(i int) protoreflect.FileImport { return (*p)[i] } func (p *FileImports) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } func (p *FileImports) ProtoInternal(pragma.DoNotImplement) {} type Names struct { - List []pref.Name + List []protoreflect.Name once sync.Once - has map[pref.Name]int // protected by once + has map[protoreflect.Name]int // protected by once } func (p *Names) Len() int { return len(p.List) } -func (p *Names) Get(i int) pref.Name { return p.List[i] } -func (p *Names) Has(s pref.Name) bool { return p.lazyInit().has[s] > 0 } +func (p *Names) Get(i int) protoreflect.Name { return p.List[i] } +func (p *Names) Has(s protoreflect.Name) bool { return p.lazyInit().has[s] > 0 } func (p *Names) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } func (p *Names) ProtoInternal(pragma.DoNotImplement) {} func (p *Names) lazyInit() *Names { p.once.Do(func() { if len(p.List) > 0 { - p.has = make(map[pref.Name]int, len(p.List)) + p.has = make(map[protoreflect.Name]int, len(p.List)) for _, s := range p.List { p.has[s] = p.has[s] + 1 } @@ -67,14 +66,14 @@ func (p *Names) CheckValid() error { } type EnumRanges struct { - List [][2]pref.EnumNumber // start inclusive; end inclusive + List [][2]protoreflect.EnumNumber // start inclusive; end inclusive once sync.Once - sorted [][2]pref.EnumNumber // protected by once + sorted [][2]protoreflect.EnumNumber // protected by once } -func (p *EnumRanges) Len() int { return len(p.List) } -func (p *EnumRanges) Get(i int) [2]pref.EnumNumber { return p.List[i] } -func (p *EnumRanges) Has(n pref.EnumNumber) bool { +func (p *EnumRanges) Len() int { return len(p.List) } +func (p *EnumRanges) Get(i int) [2]protoreflect.EnumNumber { return p.List[i] } +func (p *EnumRanges) Has(n protoreflect.EnumNumber) bool { for ls := p.lazyInit().sorted; len(ls) > 0; { i := len(ls) / 2 switch r := enumRange(ls[i]); { @@ -129,14 +128,14 @@ func (r enumRange) String() string { } type FieldRanges struct { - List [][2]pref.FieldNumber // start inclusive; end exclusive + List [][2]protoreflect.FieldNumber // start inclusive; end exclusive once sync.Once - sorted [][2]pref.FieldNumber // protected by once + sorted [][2]protoreflect.FieldNumber // protected by once } -func (p *FieldRanges) Len() int { return len(p.List) } -func (p *FieldRanges) Get(i int) [2]pref.FieldNumber { return p.List[i] } -func (p *FieldRanges) Has(n pref.FieldNumber) bool { +func (p *FieldRanges) Len() int { return len(p.List) } +func (p *FieldRanges) Get(i int) [2]protoreflect.FieldNumber { return p.List[i] } +func (p *FieldRanges) Has(n protoreflect.FieldNumber) bool { for ls := p.lazyInit().sorted; len(ls) > 0; { i := len(ls) / 2 switch r := fieldRange(ls[i]); { @@ -221,17 +220,17 @@ func (r fieldRange) String() string { } type FieldNumbers struct { - List []pref.FieldNumber + List []protoreflect.FieldNumber once sync.Once - has map[pref.FieldNumber]struct{} // protected by once + has map[protoreflect.FieldNumber]struct{} // protected by once } -func (p *FieldNumbers) Len() int { return len(p.List) } -func (p *FieldNumbers) Get(i int) pref.FieldNumber { return p.List[i] } -func (p *FieldNumbers) Has(n pref.FieldNumber) bool { +func (p *FieldNumbers) Len() int { return len(p.List) } +func (p *FieldNumbers) Get(i int) protoreflect.FieldNumber { return p.List[i] } +func (p *FieldNumbers) Has(n protoreflect.FieldNumber) bool { p.once.Do(func() { if len(p.List) > 0 { - p.has = make(map[pref.FieldNumber]struct{}, len(p.List)) + p.has = make(map[protoreflect.FieldNumber]struct{}, len(p.List)) for _, n := range p.List { p.has[n] = struct{}{} } @@ -244,30 +243,38 @@ func (p *FieldNumbers) Format(s fmt.State, r rune) { descfmt.FormatList func (p *FieldNumbers) ProtoInternal(pragma.DoNotImplement) {} type OneofFields struct { - List []pref.FieldDescriptor + List []protoreflect.FieldDescriptor once sync.Once - byName map[pref.Name]pref.FieldDescriptor // protected by once - byJSON map[string]pref.FieldDescriptor // protected by once - byText map[string]pref.FieldDescriptor // protected by once - byNum map[pref.FieldNumber]pref.FieldDescriptor // protected by once + byName map[protoreflect.Name]protoreflect.FieldDescriptor // protected by once + byJSON map[string]protoreflect.FieldDescriptor // protected by once + byText map[string]protoreflect.FieldDescriptor // protected by once + byNum map[protoreflect.FieldNumber]protoreflect.FieldDescriptor // protected by once } -func (p *OneofFields) Len() int { return len(p.List) } -func (p *OneofFields) Get(i int) pref.FieldDescriptor { return p.List[i] } -func (p *OneofFields) ByName(s pref.Name) pref.FieldDescriptor { return p.lazyInit().byName[s] } -func (p *OneofFields) ByJSONName(s string) pref.FieldDescriptor { return p.lazyInit().byJSON[s] } -func (p *OneofFields) ByTextName(s string) pref.FieldDescriptor { return p.lazyInit().byText[s] } -func (p *OneofFields) ByNumber(n pref.FieldNumber) pref.FieldDescriptor { return p.lazyInit().byNum[n] } -func (p *OneofFields) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } -func (p *OneofFields) ProtoInternal(pragma.DoNotImplement) {} +func (p *OneofFields) Len() int { return len(p.List) } +func (p *OneofFields) Get(i int) protoreflect.FieldDescriptor { return p.List[i] } +func (p *OneofFields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor { + return p.lazyInit().byName[s] +} +func (p *OneofFields) ByJSONName(s string) protoreflect.FieldDescriptor { + return p.lazyInit().byJSON[s] +} +func (p *OneofFields) ByTextName(s string) protoreflect.FieldDescriptor { + return p.lazyInit().byText[s] +} +func (p *OneofFields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor { + return p.lazyInit().byNum[n] +} +func (p *OneofFields) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } +func (p *OneofFields) ProtoInternal(pragma.DoNotImplement) {} func (p *OneofFields) lazyInit() *OneofFields { p.once.Do(func() { if len(p.List) > 0 { - p.byName = make(map[pref.Name]pref.FieldDescriptor, len(p.List)) - p.byJSON = make(map[string]pref.FieldDescriptor, len(p.List)) - p.byText = make(map[string]pref.FieldDescriptor, len(p.List)) - p.byNum = make(map[pref.FieldNumber]pref.FieldDescriptor, len(p.List)) + p.byName = make(map[protoreflect.Name]protoreflect.FieldDescriptor, len(p.List)) + p.byJSON = make(map[string]protoreflect.FieldDescriptor, len(p.List)) + p.byText = make(map[string]protoreflect.FieldDescriptor, len(p.List)) + p.byNum = make(map[protoreflect.FieldNumber]protoreflect.FieldDescriptor, len(p.List)) for _, f := range p.List { // Field names and numbers are guaranteed to be unique. p.byName[f.Name()] = f @@ -284,123 +291,123 @@ type SourceLocations struct { // List is a list of SourceLocations. // The SourceLocation.Next field does not need to be populated // as it will be lazily populated upon first need. - List []pref.SourceLocation + List []protoreflect.SourceLocation // File is the parent file descriptor that these locations are relative to. // If non-nil, ByDescriptor verifies that the provided descriptor // is a child of this file descriptor. - File pref.FileDescriptor + File protoreflect.FileDescriptor once sync.Once byPath map[pathKey]int } -func (p *SourceLocations) Len() int { return len(p.List) } -func (p *SourceLocations) Get(i int) pref.SourceLocation { return p.lazyInit().List[i] } -func (p *SourceLocations) byKey(k pathKey) pref.SourceLocation { +func (p *SourceLocations) Len() int { return len(p.List) } +func (p *SourceLocations) Get(i int) protoreflect.SourceLocation { return p.lazyInit().List[i] } +func (p *SourceLocations) byKey(k pathKey) protoreflect.SourceLocation { if i, ok := p.lazyInit().byPath[k]; ok { return p.List[i] } - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } -func (p *SourceLocations) ByPath(path pref.SourcePath) pref.SourceLocation { +func (p *SourceLocations) ByPath(path protoreflect.SourcePath) protoreflect.SourceLocation { return p.byKey(newPathKey(path)) } -func (p *SourceLocations) ByDescriptor(desc pref.Descriptor) pref.SourceLocation { +func (p *SourceLocations) ByDescriptor(desc protoreflect.Descriptor) protoreflect.SourceLocation { if p.File != nil && desc != nil && p.File != desc.ParentFile() { - return pref.SourceLocation{} // mismatching parent files + return protoreflect.SourceLocation{} // mismatching parent files } var pathArr [16]int32 path := pathArr[:0] for { switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: // Reverse the path since it was constructed in reverse. for i, j := 0, len(path)-1; i < j; i, j = i+1, j-1 { path[i], path[j] = path[j], path[i] } return p.byKey(newPathKey(path)) - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: path = append(path, int32(genid.FileDescriptorProto_MessageType_field_number)) - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_NestedType_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.FieldDescriptor: - isExtension := desc.(pref.FieldDescriptor).IsExtension() + case protoreflect.FieldDescriptor: + isExtension := desc.(protoreflect.FieldDescriptor).IsExtension() path = append(path, int32(desc.Index())) desc = desc.Parent() if isExtension { switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: path = append(path, int32(genid.FileDescriptorProto_Extension_field_number)) - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_Extension_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } } else { switch desc.(type) { - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_Field_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } } - case pref.OneofDescriptor: + case protoreflect.OneofDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_OneofDecl_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.EnumDescriptor: + case protoreflect.EnumDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: path = append(path, int32(genid.FileDescriptorProto_EnumType_field_number)) - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_EnumType_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.EnumValueDescriptor: + case protoreflect.EnumValueDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.EnumDescriptor: + case protoreflect.EnumDescriptor: path = append(path, int32(genid.EnumDescriptorProto_Value_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.ServiceDescriptor: + case protoreflect.ServiceDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: path = append(path, int32(genid.FileDescriptorProto_Service_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.MethodDescriptor: + case protoreflect.MethodDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.ServiceDescriptor: + case protoreflect.ServiceDescriptor: path = append(path, int32(genid.ServiceDescriptorProto_Method_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } } } @@ -435,7 +442,7 @@ type pathKey struct { str string // used if the path does not fit in arr } -func newPathKey(p pref.SourcePath) (k pathKey) { +func newPathKey(p protoreflect.SourcePath) (k pathKey) { if len(p) < len(k.arr) { for i, ps := range p { if ps < 0 || math.MaxUint8 <= ps { diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go b/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go index dbf2c605b..28240ebc5 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go @@ -7,7 +7,7 @@ package filedesc import ( "google.golang.org/protobuf/internal/descopts" "google.golang.org/protobuf/internal/pragma" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) var ( @@ -30,78 +30,80 @@ var ( // PlaceholderFile is a placeholder, representing only the file path. type PlaceholderFile string -func (f PlaceholderFile) ParentFile() pref.FileDescriptor { return f } -func (f PlaceholderFile) Parent() pref.Descriptor { return nil } -func (f PlaceholderFile) Index() int { return 0 } -func (f PlaceholderFile) Syntax() pref.Syntax { return 0 } -func (f PlaceholderFile) Name() pref.Name { return "" } -func (f PlaceholderFile) FullName() pref.FullName { return "" } -func (f PlaceholderFile) IsPlaceholder() bool { return true } -func (f PlaceholderFile) Options() pref.ProtoMessage { return descopts.File } -func (f PlaceholderFile) Path() string { return string(f) } -func (f PlaceholderFile) Package() pref.FullName { return "" } -func (f PlaceholderFile) Imports() pref.FileImports { return emptyFiles } -func (f PlaceholderFile) Messages() pref.MessageDescriptors { return emptyMessages } -func (f PlaceholderFile) Enums() pref.EnumDescriptors { return emptyEnums } -func (f PlaceholderFile) Extensions() pref.ExtensionDescriptors { return emptyExtensions } -func (f PlaceholderFile) Services() pref.ServiceDescriptors { return emptyServices } -func (f PlaceholderFile) SourceLocations() pref.SourceLocations { return emptySourceLocations } -func (f PlaceholderFile) ProtoType(pref.FileDescriptor) { return } -func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement) { return } +func (f PlaceholderFile) ParentFile() protoreflect.FileDescriptor { return f } +func (f PlaceholderFile) Parent() protoreflect.Descriptor { return nil } +func (f PlaceholderFile) Index() int { return 0 } +func (f PlaceholderFile) Syntax() protoreflect.Syntax { return 0 } +func (f PlaceholderFile) Name() protoreflect.Name { return "" } +func (f PlaceholderFile) FullName() protoreflect.FullName { return "" } +func (f PlaceholderFile) IsPlaceholder() bool { return true } +func (f PlaceholderFile) Options() protoreflect.ProtoMessage { return descopts.File } +func (f PlaceholderFile) Path() string { return string(f) } +func (f PlaceholderFile) Package() protoreflect.FullName { return "" } +func (f PlaceholderFile) Imports() protoreflect.FileImports { return emptyFiles } +func (f PlaceholderFile) Messages() protoreflect.MessageDescriptors { return emptyMessages } +func (f PlaceholderFile) Enums() protoreflect.EnumDescriptors { return emptyEnums } +func (f PlaceholderFile) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions } +func (f PlaceholderFile) Services() protoreflect.ServiceDescriptors { return emptyServices } +func (f PlaceholderFile) SourceLocations() protoreflect.SourceLocations { return emptySourceLocations } +func (f PlaceholderFile) ProtoType(protoreflect.FileDescriptor) { return } +func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement) { return } // PlaceholderEnum is a placeholder, representing only the full name. -type PlaceholderEnum pref.FullName +type PlaceholderEnum protoreflect.FullName -func (e PlaceholderEnum) ParentFile() pref.FileDescriptor { return nil } -func (e PlaceholderEnum) Parent() pref.Descriptor { return nil } -func (e PlaceholderEnum) Index() int { return 0 } -func (e PlaceholderEnum) Syntax() pref.Syntax { return 0 } -func (e PlaceholderEnum) Name() pref.Name { return pref.FullName(e).Name() } -func (e PlaceholderEnum) FullName() pref.FullName { return pref.FullName(e) } -func (e PlaceholderEnum) IsPlaceholder() bool { return true } -func (e PlaceholderEnum) Options() pref.ProtoMessage { return descopts.Enum } -func (e PlaceholderEnum) Values() pref.EnumValueDescriptors { return emptyEnumValues } -func (e PlaceholderEnum) ReservedNames() pref.Names { return emptyNames } -func (e PlaceholderEnum) ReservedRanges() pref.EnumRanges { return emptyEnumRanges } -func (e PlaceholderEnum) ProtoType(pref.EnumDescriptor) { return } -func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement) { return } +func (e PlaceholderEnum) ParentFile() protoreflect.FileDescriptor { return nil } +func (e PlaceholderEnum) Parent() protoreflect.Descriptor { return nil } +func (e PlaceholderEnum) Index() int { return 0 } +func (e PlaceholderEnum) Syntax() protoreflect.Syntax { return 0 } +func (e PlaceholderEnum) Name() protoreflect.Name { return protoreflect.FullName(e).Name() } +func (e PlaceholderEnum) FullName() protoreflect.FullName { return protoreflect.FullName(e) } +func (e PlaceholderEnum) IsPlaceholder() bool { return true } +func (e PlaceholderEnum) Options() protoreflect.ProtoMessage { return descopts.Enum } +func (e PlaceholderEnum) Values() protoreflect.EnumValueDescriptors { return emptyEnumValues } +func (e PlaceholderEnum) ReservedNames() protoreflect.Names { return emptyNames } +func (e PlaceholderEnum) ReservedRanges() protoreflect.EnumRanges { return emptyEnumRanges } +func (e PlaceholderEnum) ProtoType(protoreflect.EnumDescriptor) { return } +func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement) { return } // PlaceholderEnumValue is a placeholder, representing only the full name. -type PlaceholderEnumValue pref.FullName +type PlaceholderEnumValue protoreflect.FullName -func (e PlaceholderEnumValue) ParentFile() pref.FileDescriptor { return nil } -func (e PlaceholderEnumValue) Parent() pref.Descriptor { return nil } -func (e PlaceholderEnumValue) Index() int { return 0 } -func (e PlaceholderEnumValue) Syntax() pref.Syntax { return 0 } -func (e PlaceholderEnumValue) Name() pref.Name { return pref.FullName(e).Name() } -func (e PlaceholderEnumValue) FullName() pref.FullName { return pref.FullName(e) } -func (e PlaceholderEnumValue) IsPlaceholder() bool { return true } -func (e PlaceholderEnumValue) Options() pref.ProtoMessage { return descopts.EnumValue } -func (e PlaceholderEnumValue) Number() pref.EnumNumber { return 0 } -func (e PlaceholderEnumValue) ProtoType(pref.EnumValueDescriptor) { return } -func (e PlaceholderEnumValue) ProtoInternal(pragma.DoNotImplement) { return } +func (e PlaceholderEnumValue) ParentFile() protoreflect.FileDescriptor { return nil } +func (e PlaceholderEnumValue) Parent() protoreflect.Descriptor { return nil } +func (e PlaceholderEnumValue) Index() int { return 0 } +func (e PlaceholderEnumValue) Syntax() protoreflect.Syntax { return 0 } +func (e PlaceholderEnumValue) Name() protoreflect.Name { return protoreflect.FullName(e).Name() } +func (e PlaceholderEnumValue) FullName() protoreflect.FullName { return protoreflect.FullName(e) } +func (e PlaceholderEnumValue) IsPlaceholder() bool { return true } +func (e PlaceholderEnumValue) Options() protoreflect.ProtoMessage { return descopts.EnumValue } +func (e PlaceholderEnumValue) Number() protoreflect.EnumNumber { return 0 } +func (e PlaceholderEnumValue) ProtoType(protoreflect.EnumValueDescriptor) { return } +func (e PlaceholderEnumValue) ProtoInternal(pragma.DoNotImplement) { return } // PlaceholderMessage is a placeholder, representing only the full name. -type PlaceholderMessage pref.FullName +type PlaceholderMessage protoreflect.FullName -func (m PlaceholderMessage) ParentFile() pref.FileDescriptor { return nil } -func (m PlaceholderMessage) Parent() pref.Descriptor { return nil } -func (m PlaceholderMessage) Index() int { return 0 } -func (m PlaceholderMessage) Syntax() pref.Syntax { return 0 } -func (m PlaceholderMessage) Name() pref.Name { return pref.FullName(m).Name() } -func (m PlaceholderMessage) FullName() pref.FullName { return pref.FullName(m) } -func (m PlaceholderMessage) IsPlaceholder() bool { return true } -func (m PlaceholderMessage) Options() pref.ProtoMessage { return descopts.Message } -func (m PlaceholderMessage) IsMapEntry() bool { return false } -func (m PlaceholderMessage) Fields() pref.FieldDescriptors { return emptyFields } -func (m PlaceholderMessage) Oneofs() pref.OneofDescriptors { return emptyOneofs } -func (m PlaceholderMessage) ReservedNames() pref.Names { return emptyNames } -func (m PlaceholderMessage) ReservedRanges() pref.FieldRanges { return emptyFieldRanges } -func (m PlaceholderMessage) RequiredNumbers() pref.FieldNumbers { return emptyFieldNumbers } -func (m PlaceholderMessage) ExtensionRanges() pref.FieldRanges { return emptyFieldRanges } -func (m PlaceholderMessage) ExtensionRangeOptions(int) pref.ProtoMessage { panic("index out of range") } -func (m PlaceholderMessage) Messages() pref.MessageDescriptors { return emptyMessages } -func (m PlaceholderMessage) Enums() pref.EnumDescriptors { return emptyEnums } -func (m PlaceholderMessage) Extensions() pref.ExtensionDescriptors { return emptyExtensions } -func (m PlaceholderMessage) ProtoType(pref.MessageDescriptor) { return } -func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement) { return } +func (m PlaceholderMessage) ParentFile() protoreflect.FileDescriptor { return nil } +func (m PlaceholderMessage) Parent() protoreflect.Descriptor { return nil } +func (m PlaceholderMessage) Index() int { return 0 } +func (m PlaceholderMessage) Syntax() protoreflect.Syntax { return 0 } +func (m PlaceholderMessage) Name() protoreflect.Name { return protoreflect.FullName(m).Name() } +func (m PlaceholderMessage) FullName() protoreflect.FullName { return protoreflect.FullName(m) } +func (m PlaceholderMessage) IsPlaceholder() bool { return true } +func (m PlaceholderMessage) Options() protoreflect.ProtoMessage { return descopts.Message } +func (m PlaceholderMessage) IsMapEntry() bool { return false } +func (m PlaceholderMessage) Fields() protoreflect.FieldDescriptors { return emptyFields } +func (m PlaceholderMessage) Oneofs() protoreflect.OneofDescriptors { return emptyOneofs } +func (m PlaceholderMessage) ReservedNames() protoreflect.Names { return emptyNames } +func (m PlaceholderMessage) ReservedRanges() protoreflect.FieldRanges { return emptyFieldRanges } +func (m PlaceholderMessage) RequiredNumbers() protoreflect.FieldNumbers { return emptyFieldNumbers } +func (m PlaceholderMessage) ExtensionRanges() protoreflect.FieldRanges { return emptyFieldRanges } +func (m PlaceholderMessage) ExtensionRangeOptions(int) protoreflect.ProtoMessage { + panic("index out of range") +} +func (m PlaceholderMessage) Messages() protoreflect.MessageDescriptors { return emptyMessages } +func (m PlaceholderMessage) Enums() protoreflect.EnumDescriptors { return emptyEnums } +func (m PlaceholderMessage) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions } +func (m PlaceholderMessage) ProtoType(protoreflect.MessageDescriptor) { return } +func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement) { return } diff --git a/vendor/google.golang.org/protobuf/internal/filetype/build.go b/vendor/google.golang.org/protobuf/internal/filetype/build.go index 0a0dd35de..f0e38c4ef 100644 --- a/vendor/google.golang.org/protobuf/internal/filetype/build.go +++ b/vendor/google.golang.org/protobuf/internal/filetype/build.go @@ -10,17 +10,16 @@ import ( "reflect" "google.golang.org/protobuf/internal/descopts" - fdesc "google.golang.org/protobuf/internal/filedesc" + "google.golang.org/protobuf/internal/filedesc" pimpl "google.golang.org/protobuf/internal/impl" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" ) // Builder constructs type descriptors from a raw file descriptor // and associated Go types for each enum and message declaration. // -// -// Flattened Ordering +// # Flattened Ordering // // The protobuf type system represents declarations as a tree. Certain nodes in // the tree require us to either associate it with a concrete Go type or to @@ -52,7 +51,7 @@ import ( // that children themselves may have. type Builder struct { // File is the underlying file descriptor builder. - File fdesc.Builder + File filedesc.Builder // GoTypes is a unique set of the Go types for all declarations and // dependencies. Each type is represented as a zero value of the Go type. @@ -108,22 +107,22 @@ type Builder struct { // TypeRegistry is the registry to register each type descriptor. // If nil, it uses protoregistry.GlobalTypes. TypeRegistry interface { - RegisterMessage(pref.MessageType) error - RegisterEnum(pref.EnumType) error - RegisterExtension(pref.ExtensionType) error + RegisterMessage(protoreflect.MessageType) error + RegisterEnum(protoreflect.EnumType) error + RegisterExtension(protoreflect.ExtensionType) error } } // Out is the output of the builder. type Out struct { - File pref.FileDescriptor + File protoreflect.FileDescriptor } func (tb Builder) Build() (out Out) { // Replace the resolver with one that resolves dependencies by index, // which is faster and more reliable than relying on the global registry. if tb.File.FileRegistry == nil { - tb.File.FileRegistry = preg.GlobalFiles + tb.File.FileRegistry = protoregistry.GlobalFiles } tb.File.FileRegistry = &resolverByIndex{ goTypes: tb.GoTypes, @@ -133,7 +132,7 @@ func (tb Builder) Build() (out Out) { // Initialize registry if unpopulated. if tb.TypeRegistry == nil { - tb.TypeRegistry = preg.GlobalTypes + tb.TypeRegistry = protoregistry.GlobalTypes } fbOut := tb.File.Build() @@ -183,23 +182,23 @@ func (tb Builder) Build() (out Out) { for i := range fbOut.Messages { switch fbOut.Messages[i].Name() { case "FileOptions": - descopts.File = messageGoTypes[i].(pref.ProtoMessage) + descopts.File = messageGoTypes[i].(protoreflect.ProtoMessage) case "EnumOptions": - descopts.Enum = messageGoTypes[i].(pref.ProtoMessage) + descopts.Enum = messageGoTypes[i].(protoreflect.ProtoMessage) case "EnumValueOptions": - descopts.EnumValue = messageGoTypes[i].(pref.ProtoMessage) + descopts.EnumValue = messageGoTypes[i].(protoreflect.ProtoMessage) case "MessageOptions": - descopts.Message = messageGoTypes[i].(pref.ProtoMessage) + descopts.Message = messageGoTypes[i].(protoreflect.ProtoMessage) case "FieldOptions": - descopts.Field = messageGoTypes[i].(pref.ProtoMessage) + descopts.Field = messageGoTypes[i].(protoreflect.ProtoMessage) case "OneofOptions": - descopts.Oneof = messageGoTypes[i].(pref.ProtoMessage) + descopts.Oneof = messageGoTypes[i].(protoreflect.ProtoMessage) case "ExtensionRangeOptions": - descopts.ExtensionRange = messageGoTypes[i].(pref.ProtoMessage) + descopts.ExtensionRange = messageGoTypes[i].(protoreflect.ProtoMessage) case "ServiceOptions": - descopts.Service = messageGoTypes[i].(pref.ProtoMessage) + descopts.Service = messageGoTypes[i].(protoreflect.ProtoMessage) case "MethodOptions": - descopts.Method = messageGoTypes[i].(pref.ProtoMessage) + descopts.Method = messageGoTypes[i].(protoreflect.ProtoMessage) } } } @@ -216,11 +215,11 @@ func (tb Builder) Build() (out Out) { const listExtDeps = 2 var goType reflect.Type switch fbOut.Extensions[i].L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx) goType = reflect.TypeOf(tb.GoTypes[j]) depIdx++ - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx) goType = reflect.TypeOf(tb.GoTypes[j]) depIdx++ @@ -242,22 +241,22 @@ func (tb Builder) Build() (out Out) { return out } -var goTypeForPBKind = map[pref.Kind]reflect.Type{ - pref.BoolKind: reflect.TypeOf(bool(false)), - pref.Int32Kind: reflect.TypeOf(int32(0)), - pref.Sint32Kind: reflect.TypeOf(int32(0)), - pref.Sfixed32Kind: reflect.TypeOf(int32(0)), - pref.Int64Kind: reflect.TypeOf(int64(0)), - pref.Sint64Kind: reflect.TypeOf(int64(0)), - pref.Sfixed64Kind: reflect.TypeOf(int64(0)), - pref.Uint32Kind: reflect.TypeOf(uint32(0)), - pref.Fixed32Kind: reflect.TypeOf(uint32(0)), - pref.Uint64Kind: reflect.TypeOf(uint64(0)), - pref.Fixed64Kind: reflect.TypeOf(uint64(0)), - pref.FloatKind: reflect.TypeOf(float32(0)), - pref.DoubleKind: reflect.TypeOf(float64(0)), - pref.StringKind: reflect.TypeOf(string("")), - pref.BytesKind: reflect.TypeOf([]byte(nil)), +var goTypeForPBKind = map[protoreflect.Kind]reflect.Type{ + protoreflect.BoolKind: reflect.TypeOf(bool(false)), + protoreflect.Int32Kind: reflect.TypeOf(int32(0)), + protoreflect.Sint32Kind: reflect.TypeOf(int32(0)), + protoreflect.Sfixed32Kind: reflect.TypeOf(int32(0)), + protoreflect.Int64Kind: reflect.TypeOf(int64(0)), + protoreflect.Sint64Kind: reflect.TypeOf(int64(0)), + protoreflect.Sfixed64Kind: reflect.TypeOf(int64(0)), + protoreflect.Uint32Kind: reflect.TypeOf(uint32(0)), + protoreflect.Fixed32Kind: reflect.TypeOf(uint32(0)), + protoreflect.Uint64Kind: reflect.TypeOf(uint64(0)), + protoreflect.Fixed64Kind: reflect.TypeOf(uint64(0)), + protoreflect.FloatKind: reflect.TypeOf(float32(0)), + protoreflect.DoubleKind: reflect.TypeOf(float64(0)), + protoreflect.StringKind: reflect.TypeOf(string("")), + protoreflect.BytesKind: reflect.TypeOf([]byte(nil)), } type depIdxs []int32 @@ -274,13 +273,13 @@ type ( fileRegistry } fileRegistry interface { - FindFileByPath(string) (pref.FileDescriptor, error) - FindDescriptorByName(pref.FullName) (pref.Descriptor, error) - RegisterFile(pref.FileDescriptor) error + FindFileByPath(string) (protoreflect.FileDescriptor, error) + FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) + RegisterFile(protoreflect.FileDescriptor) error } ) -func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.EnumDescriptor { +func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []filedesc.Enum, ms []filedesc.Message) protoreflect.EnumDescriptor { if depIdx := int(r.depIdxs.Get(i, j)); int(depIdx) < len(es)+len(ms) { return &es[depIdx] } else { @@ -288,7 +287,7 @@ func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []fdesc.Enum, ms []fdes } } -func (r *resolverByIndex) FindMessageByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.MessageDescriptor { +func (r *resolverByIndex) FindMessageByIndex(i, j int32, es []filedesc.Enum, ms []filedesc.Message) protoreflect.MessageDescriptor { if depIdx := int(r.depIdxs.Get(i, j)); depIdx < len(es)+len(ms) { return &ms[depIdx-len(es)] } else { diff --git a/vendor/google.golang.org/protobuf/internal/impl/api_export.go b/vendor/google.golang.org/protobuf/internal/impl/api_export.go index abee5f30e..a371f98de 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/api_export.go +++ b/vendor/google.golang.org/protobuf/internal/impl/api_export.go @@ -12,8 +12,8 @@ import ( "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/internal/errors" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) // Export is a zero-length named type that exists only to export a set of @@ -32,11 +32,11 @@ type enum = interface{} // EnumOf returns the protoreflect.Enum interface over e. // It returns nil if e is nil. -func (Export) EnumOf(e enum) pref.Enum { +func (Export) EnumOf(e enum) protoreflect.Enum { switch e := e.(type) { case nil: return nil - case pref.Enum: + case protoreflect.Enum: return e default: return legacyWrapEnum(reflect.ValueOf(e)) @@ -45,11 +45,11 @@ func (Export) EnumOf(e enum) pref.Enum { // EnumDescriptorOf returns the protoreflect.EnumDescriptor for e. // It returns nil if e is nil. -func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor { +func (Export) EnumDescriptorOf(e enum) protoreflect.EnumDescriptor { switch e := e.(type) { case nil: return nil - case pref.Enum: + case protoreflect.Enum: return e.Descriptor() default: return LegacyLoadEnumDesc(reflect.TypeOf(e)) @@ -58,11 +58,11 @@ func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor { // EnumTypeOf returns the protoreflect.EnumType for e. // It returns nil if e is nil. -func (Export) EnumTypeOf(e enum) pref.EnumType { +func (Export) EnumTypeOf(e enum) protoreflect.EnumType { switch e := e.(type) { case nil: return nil - case pref.Enum: + case protoreflect.Enum: return e.Type() default: return legacyLoadEnumType(reflect.TypeOf(e)) @@ -71,7 +71,7 @@ func (Export) EnumTypeOf(e enum) pref.EnumType { // EnumStringOf returns the enum value as a string, either as the name if // the number is resolvable, or the number formatted as a string. -func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string { +func (Export) EnumStringOf(ed protoreflect.EnumDescriptor, n protoreflect.EnumNumber) string { ev := ed.Values().ByNumber(n) if ev != nil { return string(ev.Name()) @@ -84,7 +84,7 @@ func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string { type message = interface{} // legacyMessageWrapper wraps a v2 message as a v1 message. -type legacyMessageWrapper struct{ m pref.ProtoMessage } +type legacyMessageWrapper struct{ m protoreflect.ProtoMessage } func (m legacyMessageWrapper) Reset() { proto.Reset(m.m) } func (m legacyMessageWrapper) String() string { return Export{}.MessageStringOf(m.m) } @@ -92,30 +92,30 @@ func (m legacyMessageWrapper) ProtoMessage() {} // ProtoMessageV1Of converts either a v1 or v2 message to a v1 message. // It returns nil if m is nil. -func (Export) ProtoMessageV1Of(m message) piface.MessageV1 { +func (Export) ProtoMessageV1Of(m message) protoiface.MessageV1 { switch mv := m.(type) { case nil: return nil - case piface.MessageV1: + case protoiface.MessageV1: return mv case unwrapper: return Export{}.ProtoMessageV1Of(mv.protoUnwrap()) - case pref.ProtoMessage: + case protoreflect.ProtoMessage: return legacyMessageWrapper{mv} default: panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) } } -func (Export) protoMessageV2Of(m message) pref.ProtoMessage { +func (Export) protoMessageV2Of(m message) protoreflect.ProtoMessage { switch mv := m.(type) { case nil: return nil - case pref.ProtoMessage: + case protoreflect.ProtoMessage: return mv case legacyMessageWrapper: return mv.m - case piface.MessageV1: + case protoiface.MessageV1: return nil default: panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) @@ -124,7 +124,7 @@ func (Export) protoMessageV2Of(m message) pref.ProtoMessage { // ProtoMessageV2Of converts either a v1 or v2 message to a v2 message. // It returns nil if m is nil. -func (Export) ProtoMessageV2Of(m message) pref.ProtoMessage { +func (Export) ProtoMessageV2Of(m message) protoreflect.ProtoMessage { if m == nil { return nil } @@ -136,7 +136,7 @@ func (Export) ProtoMessageV2Of(m message) pref.ProtoMessage { // MessageOf returns the protoreflect.Message interface over m. // It returns nil if m is nil. -func (Export) MessageOf(m message) pref.Message { +func (Export) MessageOf(m message) protoreflect.Message { if m == nil { return nil } @@ -148,7 +148,7 @@ func (Export) MessageOf(m message) pref.Message { // MessageDescriptorOf returns the protoreflect.MessageDescriptor for m. // It returns nil if m is nil. -func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor { +func (Export) MessageDescriptorOf(m message) protoreflect.MessageDescriptor { if m == nil { return nil } @@ -160,7 +160,7 @@ func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor { // MessageTypeOf returns the protoreflect.MessageType for m. // It returns nil if m is nil. -func (Export) MessageTypeOf(m message) pref.MessageType { +func (Export) MessageTypeOf(m message) protoreflect.MessageType { if m == nil { return nil } @@ -172,6 +172,6 @@ func (Export) MessageTypeOf(m message) pref.MessageType { // MessageStringOf returns the message value as a string, // which is the message serialized in the protobuf text format. -func (Export) MessageStringOf(m pref.ProtoMessage) string { +func (Export) MessageStringOf(m protoreflect.ProtoMessage) string { return prototext.MarshalOptions{Multiline: false}.Format(m) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/checkinit.go b/vendor/google.golang.org/protobuf/internal/impl/checkinit.go index b82341e57..bff041edc 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/checkinit.go +++ b/vendor/google.golang.org/protobuf/internal/impl/checkinit.go @@ -8,18 +8,18 @@ import ( "sync" "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) -func (mi *MessageInfo) checkInitialized(in piface.CheckInitializedInput) (piface.CheckInitializedOutput, error) { +func (mi *MessageInfo) checkInitialized(in protoiface.CheckInitializedInput) (protoiface.CheckInitializedOutput, error) { var p pointer if ms, ok := in.Message.(*messageState); ok { p = ms.pointer() } else { p = in.Message.(*messageReflectWrapper).pointer() } - return piface.CheckInitializedOutput{}, mi.checkInitializedPointer(p) + return protoiface.CheckInitializedOutput{}, mi.checkInitializedPointer(p) } func (mi *MessageInfo) checkInitializedPointer(p pointer) error { @@ -90,7 +90,7 @@ var ( // needsInitCheck reports whether a message needs to be checked for partial initialization. // // It returns true if the message transitively includes any required or extension fields. -func needsInitCheck(md pref.MessageDescriptor) bool { +func needsInitCheck(md protoreflect.MessageDescriptor) bool { if v, ok := needsInitCheckMap.Load(md); ok { if has, ok := v.(bool); ok { return has @@ -101,7 +101,7 @@ func needsInitCheck(md pref.MessageDescriptor) bool { return needsInitCheckLocked(md) } -func needsInitCheckLocked(md pref.MessageDescriptor) (has bool) { +func needsInitCheckLocked(md protoreflect.MessageDescriptor) (has bool) { if v, ok := needsInitCheckMap.Load(md); ok { // If has is true, we've previously determined that this message // needs init checks. diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go b/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go index 08d35170b..e74cefdc5 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type extensionFieldInfo struct { @@ -23,7 +23,7 @@ type extensionFieldInfo struct { var legacyExtensionFieldInfoCache sync.Map // map[protoreflect.ExtensionType]*extensionFieldInfo -func getExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { +func getExtensionFieldInfo(xt protoreflect.ExtensionType) *extensionFieldInfo { if xi, ok := xt.(*ExtensionInfo); ok { xi.lazyInit() return xi.info @@ -32,7 +32,7 @@ func getExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { } // legacyLoadExtensionFieldInfo dynamically loads a *ExtensionInfo for xt. -func legacyLoadExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { +func legacyLoadExtensionFieldInfo(xt protoreflect.ExtensionType) *extensionFieldInfo { if xi, ok := legacyExtensionFieldInfoCache.Load(xt); ok { return xi.(*extensionFieldInfo) } @@ -43,7 +43,7 @@ func legacyLoadExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { return e } -func makeExtensionFieldInfo(xd pref.ExtensionDescriptor) *extensionFieldInfo { +func makeExtensionFieldInfo(xd protoreflect.ExtensionDescriptor) *extensionFieldInfo { var wiretag uint64 if !xd.IsPacked() { wiretag = protowire.EncodeTag(xd.Number(), wireTypes[xd.Kind()]) @@ -59,10 +59,10 @@ func makeExtensionFieldInfo(xd pref.ExtensionDescriptor) *extensionFieldInfo { // This is true for composite types, where we pass in a message, list, or map to fill in, // and for enums, where we pass in a prototype value to specify the concrete enum type. switch xd.Kind() { - case pref.MessageKind, pref.GroupKind, pref.EnumKind: + case protoreflect.MessageKind, protoreflect.GroupKind, protoreflect.EnumKind: e.unmarshalNeedsValue = true default: - if xd.Cardinality() == pref.Repeated { + if xd.Cardinality() == protoreflect.Repeated { e.unmarshalNeedsValue = true } } @@ -73,21 +73,21 @@ type lazyExtensionValue struct { atomicOnce uint32 // atomically set if value is valid mu sync.Mutex xi *extensionFieldInfo - value pref.Value + value protoreflect.Value b []byte - fn func() pref.Value + fn func() protoreflect.Value } type ExtensionField struct { - typ pref.ExtensionType + typ protoreflect.ExtensionType // value is either the value of GetValue, // or a *lazyExtensionValue that then returns the value of GetValue. - value pref.Value + value protoreflect.Value lazy *lazyExtensionValue } -func (f *ExtensionField) appendLazyBytes(xt pref.ExtensionType, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, b []byte) { +func (f *ExtensionField) appendLazyBytes(xt protoreflect.ExtensionType, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, b []byte) { if f.lazy == nil { f.lazy = &lazyExtensionValue{xi: xi} } @@ -97,7 +97,7 @@ func (f *ExtensionField) appendLazyBytes(xt pref.ExtensionType, xi *extensionFie f.lazy.b = append(f.lazy.b, b...) } -func (f *ExtensionField) canLazy(xt pref.ExtensionType) bool { +func (f *ExtensionField) canLazy(xt protoreflect.ExtensionType) bool { if f.typ == nil { return true } @@ -154,7 +154,7 @@ func (f *ExtensionField) lazyInit() { // Set sets the type and value of the extension field. // This must not be called concurrently. -func (f *ExtensionField) Set(t pref.ExtensionType, v pref.Value) { +func (f *ExtensionField) Set(t protoreflect.ExtensionType, v protoreflect.Value) { f.typ = t f.value = v f.lazy = nil @@ -162,14 +162,14 @@ func (f *ExtensionField) Set(t pref.ExtensionType, v pref.Value) { // SetLazy sets the type and a value that is to be lazily evaluated upon first use. // This must not be called concurrently. -func (f *ExtensionField) SetLazy(t pref.ExtensionType, fn func() pref.Value) { +func (f *ExtensionField) SetLazy(t protoreflect.ExtensionType, fn func() protoreflect.Value) { f.typ = t f.lazy = &lazyExtensionValue{fn: fn} } // Value returns the value of the extension field. // This may be called concurrently. -func (f *ExtensionField) Value() pref.Value { +func (f *ExtensionField) Value() protoreflect.Value { if f.lazy != nil { if atomic.LoadUint32(&f.lazy.atomicOnce) == 0 { f.lazyInit() @@ -181,7 +181,7 @@ func (f *ExtensionField) Value() pref.Value { // Type returns the type of the extension field. // This may be called concurrently. -func (f ExtensionField) Type() pref.ExtensionType { +func (f ExtensionField) Type() protoreflect.ExtensionType { return f.typ } @@ -193,7 +193,7 @@ func (f ExtensionField) IsSet() bool { // IsLazy reports whether a field is lazily encoded. // It is exported for testing. -func IsLazy(m pref.Message, fd pref.FieldDescriptor) bool { +func IsLazy(m protoreflect.Message, fd protoreflect.FieldDescriptor) bool { var mi *MessageInfo var p pointer switch m := m.(type) { @@ -206,7 +206,7 @@ func IsLazy(m pref.Message, fd pref.FieldDescriptor) bool { default: return false } - xd, ok := fd.(pref.ExtensionTypeDescriptor) + xd, ok := fd.(protoreflect.ExtensionTypeDescriptor) if !ok { return false } diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_field.go b/vendor/google.golang.org/protobuf/internal/impl/codec_field.go index cb4b482d1..3fadd241e 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_field.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_field.go @@ -12,9 +12,9 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/errors" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/runtime/protoiface" ) type errInvalidUTF8 struct{} @@ -30,7 +30,7 @@ func (errInvalidUTF8) Unwrap() error { return errors.Error } // to the appropriate field-specific function as necessary. // // The unmarshal function is set on each field individually as usual. -func (mi *MessageInfo) initOneofFieldCoders(od pref.OneofDescriptor, si structInfo) { +func (mi *MessageInfo) initOneofFieldCoders(od protoreflect.OneofDescriptor, si structInfo) { fs := si.oneofsByName[od.Name()] ft := fs.Type oneofFields := make(map[reflect.Type]*coderFieldInfo) @@ -118,13 +118,13 @@ func (mi *MessageInfo) initOneofFieldCoders(od pref.OneofDescriptor, si structIn } } -func makeWeakMessageFieldCoder(fd pref.FieldDescriptor) pointerCoderFuncs { +func makeWeakMessageFieldCoder(fd protoreflect.FieldDescriptor) pointerCoderFuncs { var once sync.Once - var messageType pref.MessageType + var messageType protoreflect.MessageType lazyInit := func() { once.Do(func() { messageName := fd.Message().FullName() - messageType, _ = preg.GlobalTypes.FindMessageByName(messageName) + messageType, _ = protoregistry.GlobalTypes.FindMessageByName(messageName) }) } @@ -190,7 +190,7 @@ func makeWeakMessageFieldCoder(fd pref.FieldDescriptor) pointerCoderFuncs { } } -func makeMessageFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { +func makeMessageFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { if mi := getMessageInfo(ft); mi != nil { funcs := pointerCoderFuncs{ size: sizeMessageInfo, @@ -280,7 +280,7 @@ func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarsh if n < 0 { return out, errDecode } - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: v, Message: m.ProtoReflect(), }) @@ -288,27 +288,27 @@ func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarsh return out, err } out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return out, nil } -func sizeMessageValue(v pref.Value, tagsize int, opts marshalOptions) int { +func sizeMessageValue(v protoreflect.Value, tagsize int, opts marshalOptions) int { m := v.Message().Interface() return sizeMessage(m, tagsize, opts) } -func appendMessageValue(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { +func appendMessageValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { m := v.Message().Interface() return appendMessage(b, m, wiretag, opts) } -func consumeMessageValue(b []byte, v pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) { +func consumeMessageValue(b []byte, v protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) { m := v.Message().Interface() out, err := consumeMessage(b, m, wtyp, opts) return v, out, err } -func isInitMessageValue(v pref.Value) error { +func isInitMessageValue(v protoreflect.Value) error { m := v.Message().Interface() return proto.CheckInitialized(m) } @@ -321,17 +321,17 @@ var coderMessageValue = valueCoderFuncs{ merge: mergeMessageValue, } -func sizeGroupValue(v pref.Value, tagsize int, opts marshalOptions) int { +func sizeGroupValue(v protoreflect.Value, tagsize int, opts marshalOptions) int { m := v.Message().Interface() return sizeGroup(m, tagsize, opts) } -func appendGroupValue(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { +func appendGroupValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { m := v.Message().Interface() return appendGroup(b, m, wiretag, opts) } -func consumeGroupValue(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) { +func consumeGroupValue(b []byte, v protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) { m := v.Message().Interface() out, err := consumeGroup(b, m, num, wtyp, opts) return v, out, err @@ -345,7 +345,7 @@ var coderGroupValue = valueCoderFuncs{ merge: mergeMessageValue, } -func makeGroupFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { +func makeGroupFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { num := fd.Number() if mi := getMessageInfo(ft); mi != nil { funcs := pointerCoderFuncs{ @@ -424,7 +424,7 @@ func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowir if n < 0 { return out, errDecode } - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: b, Message: m.ProtoReflect(), }) @@ -432,11 +432,11 @@ func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowir return out, err } out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return out, nil } -func makeMessageSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { +func makeMessageSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { if mi := getMessageInfo(ft); mi != nil { funcs := pointerCoderFuncs{ size: sizeMessageSliceInfo, @@ -555,7 +555,7 @@ func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowir return out, errDecode } mp := reflect.New(goType.Elem()) - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: v, Message: asMessage(mp).ProtoReflect(), }) @@ -564,7 +564,7 @@ func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowir } p.AppendPointerSlice(pointerOfValue(mp)) out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return out, nil } @@ -581,7 +581,7 @@ func isInitMessageSlice(p pointer, goType reflect.Type) error { // Slices of messages -func sizeMessageSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int { +func sizeMessageSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int { list := listv.List() n := 0 for i, llen := 0, list.Len(); i < llen; i++ { @@ -591,7 +591,7 @@ func sizeMessageSliceValue(listv pref.Value, tagsize int, opts marshalOptions) i return n } -func appendMessageSliceValue(b []byte, listv pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { +func appendMessageSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { list := listv.List() mopts := opts.Options() for i, llen := 0, list.Len(); i < llen; i++ { @@ -608,30 +608,30 @@ func appendMessageSliceValue(b []byte, listv pref.Value, wiretag uint64, opts ma return b, nil } -func consumeMessageSliceValue(b []byte, listv pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) { +func consumeMessageSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) { list := listv.List() if wtyp != protowire.BytesType { - return pref.Value{}, out, errUnknown + return protoreflect.Value{}, out, errUnknown } v, n := protowire.ConsumeBytes(b) if n < 0 { - return pref.Value{}, out, errDecode + return protoreflect.Value{}, out, errDecode } m := list.NewElement() - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: v, Message: m.Message(), }) if err != nil { - return pref.Value{}, out, err + return protoreflect.Value{}, out, err } list.Append(m) out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return listv, out, nil } -func isInitMessageSliceValue(listv pref.Value) error { +func isInitMessageSliceValue(listv protoreflect.Value) error { list := listv.List() for i, llen := 0, list.Len(); i < llen; i++ { m := list.Get(i).Message().Interface() @@ -650,7 +650,7 @@ var coderMessageSliceValue = valueCoderFuncs{ merge: mergeMessageListValue, } -func sizeGroupSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int { +func sizeGroupSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int { list := listv.List() n := 0 for i, llen := 0, list.Len(); i < llen; i++ { @@ -660,7 +660,7 @@ func sizeGroupSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int return n } -func appendGroupSliceValue(b []byte, listv pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { +func appendGroupSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { list := listv.List() mopts := opts.Options() for i, llen := 0, list.Len(); i < llen; i++ { @@ -676,26 +676,26 @@ func appendGroupSliceValue(b []byte, listv pref.Value, wiretag uint64, opts mars return b, nil } -func consumeGroupSliceValue(b []byte, listv pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) { +func consumeGroupSliceValue(b []byte, listv protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) { list := listv.List() if wtyp != protowire.StartGroupType { - return pref.Value{}, out, errUnknown + return protoreflect.Value{}, out, errUnknown } b, n := protowire.ConsumeGroup(num, b) if n < 0 { - return pref.Value{}, out, errDecode + return protoreflect.Value{}, out, errDecode } m := list.NewElement() - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: b, Message: m.Message(), }) if err != nil { - return pref.Value{}, out, err + return protoreflect.Value{}, out, err } list.Append(m) out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return listv, out, nil } @@ -707,7 +707,7 @@ var coderGroupSliceValue = valueCoderFuncs{ merge: mergeMessageListValue, } -func makeGroupSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { +func makeGroupSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { num := fd.Number() if mi := getMessageInfo(ft); mi != nil { funcs := pointerCoderFuncs{ @@ -772,7 +772,7 @@ func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire return out, errDecode } mp := reflect.New(goType.Elem()) - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: b, Message: asMessage(mp).ProtoReflect(), }) @@ -781,7 +781,7 @@ func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire } p.AppendPointerSlice(pointerOfValue(mp)) out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return out, nil } @@ -822,8 +822,8 @@ func consumeGroupSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFie return out, nil } -func asMessage(v reflect.Value) pref.ProtoMessage { - if m, ok := v.Interface().(pref.ProtoMessage); ok { +func asMessage(v reflect.Value) protoreflect.ProtoMessage { + if m, ok := v.Interface().(protoreflect.ProtoMessage); ok { return m } return legacyWrapMessage(v).Interface() diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go index c1245fef4..111b9d16f 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/genid" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type mapInfo struct { @@ -19,12 +19,12 @@ type mapInfo struct { valWiretag uint64 keyFuncs valueCoderFuncs valFuncs valueCoderFuncs - keyZero pref.Value - keyKind pref.Kind + keyZero protoreflect.Value + keyKind protoreflect.Kind conv *mapConverter } -func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) { +func encoderFuncsForMap(fd protoreflect.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) { // TODO: Consider generating specialized map coders. keyField := fd.MapKey() valField := fd.MapValue() @@ -44,7 +44,7 @@ func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage keyKind: keyField.Kind(), conv: conv, } - if valField.Kind() == pref.MessageKind { + if valField.Kind() == protoreflect.MessageKind { valueMessage = getMessageInfo(ft.Elem()) } @@ -68,9 +68,9 @@ func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage }, } switch valField.Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: funcs.merge = mergeMapOfMessage - case pref.BytesKind: + case protoreflect.BytesKind: funcs.merge = mergeMapOfBytes default: funcs.merge = mergeMap @@ -135,7 +135,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo err := errUnknown switch num { case genid.MapEntry_Key_field_number: - var v pref.Value + var v protoreflect.Value var o unmarshalOutput v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) if err != nil { @@ -144,7 +144,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo key = v n = o.n case genid.MapEntry_Value_field_number: - var v pref.Value + var v protoreflect.Value var o unmarshalOutput v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts) if err != nil { @@ -192,7 +192,7 @@ func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi err := errUnknown switch num { case 1: - var v pref.Value + var v protoreflect.Value var o unmarshalOutput v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) if err != nil { diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go index cd40527ff..6b2fdbb73 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go @@ -12,15 +12,15 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/encoding/messageset" "google.golang.org/protobuf/internal/order" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) // coderMessageInfo contains per-message information used by the fast-path functions. // This is a different type from MessageInfo to keep MessageInfo as general-purpose as // possible. type coderMessageInfo struct { - methods piface.Methods + methods protoiface.Methods orderedCoderFields []*coderFieldInfo denseCoderFields []*coderFieldInfo @@ -38,13 +38,13 @@ type coderFieldInfo struct { funcs pointerCoderFuncs // fast-path per-field functions mi *MessageInfo // field's message ft reflect.Type - validation validationInfo // information used by message validation - num pref.FieldNumber // field number - offset offset // struct field offset - wiretag uint64 // field tag (number + wire type) - tagsize int // size of the varint-encoded tag - isPointer bool // true if IsNil may be called on the struct field - isRequired bool // true if field is required + validation validationInfo // information used by message validation + num protoreflect.FieldNumber // field number + offset offset // struct field offset + wiretag uint64 // field tag (number + wire type) + tagsize int // size of the varint-encoded tag + isPointer bool // true if IsNil may be called on the struct field + isRequired bool // true if field is required } func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { @@ -125,8 +125,8 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { funcs: funcs, mi: childMessage, validation: newFieldValidationInfo(mi, si, fd, ft), - isPointer: fd.Cardinality() == pref.Repeated || fd.HasPresence(), - isRequired: fd.Cardinality() == pref.Required, + isPointer: fd.Cardinality() == protoreflect.Repeated || fd.HasPresence(), + isRequired: fd.Cardinality() == protoreflect.Required, } mi.orderedCoderFields = append(mi.orderedCoderFields, cf) mi.coderFields[cf.num] = cf @@ -149,7 +149,7 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { return mi.orderedCoderFields[i].num < mi.orderedCoderFields[j].num }) - var maxDense pref.FieldNumber + var maxDense protoreflect.FieldNumber for _, cf := range mi.orderedCoderFields { if cf.num >= 16 && cf.num >= 2*maxDense { break @@ -175,12 +175,12 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { mi.needsInitCheck = needsInitCheck(mi.Desc) if mi.methods.Marshal == nil && mi.methods.Size == nil { - mi.methods.Flags |= piface.SupportMarshalDeterministic + mi.methods.Flags |= protoiface.SupportMarshalDeterministic mi.methods.Marshal = mi.marshal mi.methods.Size = mi.size } if mi.methods.Unmarshal == nil { - mi.methods.Flags |= piface.SupportUnmarshalDiscardUnknown + mi.methods.Flags |= protoiface.SupportUnmarshalDiscardUnknown mi.methods.Unmarshal = mi.unmarshal } if mi.methods.CheckInitialized == nil { diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go b/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go index e89971238..576dcf3aa 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // pointerCoderFuncs is a set of pointer encoding functions. @@ -25,83 +25,83 @@ type pointerCoderFuncs struct { // valueCoderFuncs is a set of protoreflect.Value encoding functions. type valueCoderFuncs struct { - size func(v pref.Value, tagsize int, opts marshalOptions) int - marshal func(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) - unmarshal func(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) - isInit func(v pref.Value) error - merge func(dst, src pref.Value, opts mergeOptions) pref.Value + size func(v protoreflect.Value, tagsize int, opts marshalOptions) int + marshal func(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) + unmarshal func(b []byte, v protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) + isInit func(v protoreflect.Value) error + merge func(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value } // fieldCoder returns pointer functions for a field, used for operating on // struct fields. -func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) { +func fieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) { switch { case fd.IsMap(): return encoderFuncsForMap(fd, ft) - case fd.Cardinality() == pref.Repeated && !fd.IsPacked(): + case fd.Cardinality() == protoreflect.Repeated && !fd.IsPacked(): // Repeated fields (not packed). if ft.Kind() != reflect.Slice { break } ft := ft.Elem() switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBoolSlice } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnumSlice } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32Slice } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32Slice } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32Slice } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64Slice } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64Slice } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64Slice } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32Slice } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32Slice } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloatSlice } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64Slice } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64Slice } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDoubleSlice } - case pref.StringKind: + case protoreflect.StringKind: if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { return nil, coderStringSliceValidateUTF8 } @@ -114,19 +114,19 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { return nil, coderBytesSlice } - case pref.BytesKind: + case protoreflect.BytesKind: if ft.Kind() == reflect.String { return nil, coderStringSlice } if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { return nil, coderBytesSlice } - case pref.MessageKind: + case protoreflect.MessageKind: return getMessageInfo(ft), makeMessageSliceFieldCoder(fd, ft) - case pref.GroupKind: + case protoreflect.GroupKind: return getMessageInfo(ft), makeGroupSliceFieldCoder(fd, ft) } - case fd.Cardinality() == pref.Repeated && fd.IsPacked(): + case fd.Cardinality() == protoreflect.Repeated && fd.IsPacked(): // Packed repeated fields. // // Only repeated fields of primitive numeric types @@ -136,128 +136,128 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer } ft := ft.Elem() switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBoolPackedSlice } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnumPackedSlice } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32PackedSlice } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32PackedSlice } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32PackedSlice } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64PackedSlice } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64PackedSlice } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64PackedSlice } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32PackedSlice } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32PackedSlice } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloatPackedSlice } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64PackedSlice } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64PackedSlice } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDoublePackedSlice } } - case fd.Kind() == pref.MessageKind: + case fd.Kind() == protoreflect.MessageKind: return getMessageInfo(ft), makeMessageFieldCoder(fd, ft) - case fd.Kind() == pref.GroupKind: + case fd.Kind() == protoreflect.GroupKind: return getMessageInfo(ft), makeGroupFieldCoder(fd, ft) - case fd.Syntax() == pref.Proto3 && fd.ContainingOneof() == nil: + case fd.Syntax() == protoreflect.Proto3 && fd.ContainingOneof() == nil: // Populated oneof fields always encode even if set to the zero value, // which normally are not encoded in proto3. switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBoolNoZero } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnumNoZero } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32NoZero } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32NoZero } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32NoZero } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64NoZero } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64NoZero } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64NoZero } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32NoZero } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32NoZero } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloatNoZero } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64NoZero } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64NoZero } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDoubleNoZero } - case pref.StringKind: + case protoreflect.StringKind: if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { return nil, coderStringNoZeroValidateUTF8 } @@ -270,7 +270,7 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { return nil, coderBytesNoZero } - case pref.BytesKind: + case protoreflect.BytesKind: if ft.Kind() == reflect.String { return nil, coderStringNoZero } @@ -281,133 +281,133 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer case ft.Kind() == reflect.Ptr: ft := ft.Elem() switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBoolPtr } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnumPtr } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32Ptr } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32Ptr } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32Ptr } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64Ptr } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64Ptr } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64Ptr } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32Ptr } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32Ptr } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloatPtr } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64Ptr } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64Ptr } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDoublePtr } - case pref.StringKind: + case protoreflect.StringKind: if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { return nil, coderStringPtrValidateUTF8 } if ft.Kind() == reflect.String { return nil, coderStringPtr } - case pref.BytesKind: + case protoreflect.BytesKind: if ft.Kind() == reflect.String { return nil, coderStringPtr } } default: switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBool } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnum } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32 } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32 } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32 } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64 } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64 } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64 } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32 } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32 } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloat } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64 } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64 } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDouble } - case pref.StringKind: + case protoreflect.StringKind: if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { return nil, coderStringValidateUTF8 } @@ -420,7 +420,7 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { return nil, coderBytes } - case pref.BytesKind: + case protoreflect.BytesKind: if ft.Kind() == reflect.String { return nil, coderString } @@ -434,122 +434,122 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer // encoderFuncsForValue returns value functions for a field, used for // extension values and map encoding. -func encoderFuncsForValue(fd pref.FieldDescriptor) valueCoderFuncs { +func encoderFuncsForValue(fd protoreflect.FieldDescriptor) valueCoderFuncs { switch { - case fd.Cardinality() == pref.Repeated && !fd.IsPacked(): + case fd.Cardinality() == protoreflect.Repeated && !fd.IsPacked(): switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: return coderBoolSliceValue - case pref.EnumKind: + case protoreflect.EnumKind: return coderEnumSliceValue - case pref.Int32Kind: + case protoreflect.Int32Kind: return coderInt32SliceValue - case pref.Sint32Kind: + case protoreflect.Sint32Kind: return coderSint32SliceValue - case pref.Uint32Kind: + case protoreflect.Uint32Kind: return coderUint32SliceValue - case pref.Int64Kind: + case protoreflect.Int64Kind: return coderInt64SliceValue - case pref.Sint64Kind: + case protoreflect.Sint64Kind: return coderSint64SliceValue - case pref.Uint64Kind: + case protoreflect.Uint64Kind: return coderUint64SliceValue - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: return coderSfixed32SliceValue - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: return coderFixed32SliceValue - case pref.FloatKind: + case protoreflect.FloatKind: return coderFloatSliceValue - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: return coderSfixed64SliceValue - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: return coderFixed64SliceValue - case pref.DoubleKind: + case protoreflect.DoubleKind: return coderDoubleSliceValue - case pref.StringKind: + case protoreflect.StringKind: // We don't have a UTF-8 validating coder for repeated string fields. // Value coders are used for extensions and maps. // Extensions are never proto3, and maps never contain lists. return coderStringSliceValue - case pref.BytesKind: + case protoreflect.BytesKind: return coderBytesSliceValue - case pref.MessageKind: + case protoreflect.MessageKind: return coderMessageSliceValue - case pref.GroupKind: + case protoreflect.GroupKind: return coderGroupSliceValue } - case fd.Cardinality() == pref.Repeated && fd.IsPacked(): + case fd.Cardinality() == protoreflect.Repeated && fd.IsPacked(): switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: return coderBoolPackedSliceValue - case pref.EnumKind: + case protoreflect.EnumKind: return coderEnumPackedSliceValue - case pref.Int32Kind: + case protoreflect.Int32Kind: return coderInt32PackedSliceValue - case pref.Sint32Kind: + case protoreflect.Sint32Kind: return coderSint32PackedSliceValue - case pref.Uint32Kind: + case protoreflect.Uint32Kind: return coderUint32PackedSliceValue - case pref.Int64Kind: + case protoreflect.Int64Kind: return coderInt64PackedSliceValue - case pref.Sint64Kind: + case protoreflect.Sint64Kind: return coderSint64PackedSliceValue - case pref.Uint64Kind: + case protoreflect.Uint64Kind: return coderUint64PackedSliceValue - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: return coderSfixed32PackedSliceValue - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: return coderFixed32PackedSliceValue - case pref.FloatKind: + case protoreflect.FloatKind: return coderFloatPackedSliceValue - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: return coderSfixed64PackedSliceValue - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: return coderFixed64PackedSliceValue - case pref.DoubleKind: + case protoreflect.DoubleKind: return coderDoublePackedSliceValue } default: switch fd.Kind() { default: - case pref.BoolKind: + case protoreflect.BoolKind: return coderBoolValue - case pref.EnumKind: + case protoreflect.EnumKind: return coderEnumValue - case pref.Int32Kind: + case protoreflect.Int32Kind: return coderInt32Value - case pref.Sint32Kind: + case protoreflect.Sint32Kind: return coderSint32Value - case pref.Uint32Kind: + case protoreflect.Uint32Kind: return coderUint32Value - case pref.Int64Kind: + case protoreflect.Int64Kind: return coderInt64Value - case pref.Sint64Kind: + case protoreflect.Sint64Kind: return coderSint64Value - case pref.Uint64Kind: + case protoreflect.Uint64Kind: return coderUint64Value - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: return coderSfixed32Value - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: return coderFixed32Value - case pref.FloatKind: + case protoreflect.FloatKind: return coderFloatValue - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: return coderSfixed64Value - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: return coderFixed64Value - case pref.DoubleKind: + case protoreflect.DoubleKind: return coderDoubleValue - case pref.StringKind: + case protoreflect.StringKind: if strs.EnforceUTF8(fd) { return coderStringValueValidateUTF8 } return coderStringValue - case pref.BytesKind: + case protoreflect.BytesKind: return coderBytesValue - case pref.MessageKind: + case protoreflect.MessageKind: return coderMessageValue - case pref.GroupKind: + case protoreflect.GroupKind: return coderGroupValue } } diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert.go b/vendor/google.golang.org/protobuf/internal/impl/convert.go index acd61bb50..11a6128ba 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/convert.go +++ b/vendor/google.golang.org/protobuf/internal/impl/convert.go @@ -8,7 +8,7 @@ import ( "fmt" "reflect" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // unwrapper unwraps the value to the underlying value. @@ -20,13 +20,13 @@ type unwrapper interface { // A Converter coverts to/from Go reflect.Value types and protobuf protoreflect.Value types. type Converter interface { // PBValueOf converts a reflect.Value to a protoreflect.Value. - PBValueOf(reflect.Value) pref.Value + PBValueOf(reflect.Value) protoreflect.Value // GoValueOf converts a protoreflect.Value to a reflect.Value. - GoValueOf(pref.Value) reflect.Value + GoValueOf(protoreflect.Value) reflect.Value // IsValidPB returns whether a protoreflect.Value is compatible with this type. - IsValidPB(pref.Value) bool + IsValidPB(protoreflect.Value) bool // IsValidGo returns whether a reflect.Value is compatible with this type. IsValidGo(reflect.Value) bool @@ -34,12 +34,12 @@ type Converter interface { // New returns a new field value. // For scalars, it returns the default value of the field. // For composite types, it returns a new mutable value. - New() pref.Value + New() protoreflect.Value // Zero returns a new field value. // For scalars, it returns the default value of the field. // For composite types, it returns an immutable, empty value. - Zero() pref.Value + Zero() protoreflect.Value } // NewConverter matches a Go type with a protobuf field and returns a Converter @@ -50,7 +50,7 @@ type Converter interface { // This matcher deliberately supports a wider range of Go types than what // protoc-gen-go historically generated to be able to automatically wrap some // v1 messages generated by other forks of protoc-gen-go. -func NewConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { +func NewConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { switch { case fd.IsList(): return newListConverter(t, fd) @@ -76,68 +76,68 @@ var ( ) var ( - boolZero = pref.ValueOfBool(false) - int32Zero = pref.ValueOfInt32(0) - int64Zero = pref.ValueOfInt64(0) - uint32Zero = pref.ValueOfUint32(0) - uint64Zero = pref.ValueOfUint64(0) - float32Zero = pref.ValueOfFloat32(0) - float64Zero = pref.ValueOfFloat64(0) - stringZero = pref.ValueOfString("") - bytesZero = pref.ValueOfBytes(nil) + boolZero = protoreflect.ValueOfBool(false) + int32Zero = protoreflect.ValueOfInt32(0) + int64Zero = protoreflect.ValueOfInt64(0) + uint32Zero = protoreflect.ValueOfUint32(0) + uint64Zero = protoreflect.ValueOfUint64(0) + float32Zero = protoreflect.ValueOfFloat32(0) + float64Zero = protoreflect.ValueOfFloat64(0) + stringZero = protoreflect.ValueOfString("") + bytesZero = protoreflect.ValueOfBytes(nil) ) -func newSingularConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { - defVal := func(fd pref.FieldDescriptor, zero pref.Value) pref.Value { - if fd.Cardinality() == pref.Repeated { +func newSingularConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { + defVal := func(fd protoreflect.FieldDescriptor, zero protoreflect.Value) protoreflect.Value { + if fd.Cardinality() == protoreflect.Repeated { // Default isn't defined for repeated fields. return zero } return fd.Default() } switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if t.Kind() == reflect.Bool { return &boolConverter{t, defVal(fd, boolZero)} } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: if t.Kind() == reflect.Int32 { return &int32Converter{t, defVal(fd, int32Zero)} } - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: if t.Kind() == reflect.Int64 { return &int64Converter{t, defVal(fd, int64Zero)} } - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: if t.Kind() == reflect.Uint32 { return &uint32Converter{t, defVal(fd, uint32Zero)} } - case pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: if t.Kind() == reflect.Uint64 { return &uint64Converter{t, defVal(fd, uint64Zero)} } - case pref.FloatKind: + case protoreflect.FloatKind: if t.Kind() == reflect.Float32 { return &float32Converter{t, defVal(fd, float32Zero)} } - case pref.DoubleKind: + case protoreflect.DoubleKind: if t.Kind() == reflect.Float64 { return &float64Converter{t, defVal(fd, float64Zero)} } - case pref.StringKind: + case protoreflect.StringKind: if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) { return &stringConverter{t, defVal(fd, stringZero)} } - case pref.BytesKind: + case protoreflect.BytesKind: if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) { return &bytesConverter{t, defVal(fd, bytesZero)} } - case pref.EnumKind: + case protoreflect.EnumKind: // Handle enums, which must be a named int32 type. if t.Kind() == reflect.Int32 { return newEnumConverter(t, fd) } - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: return newMessageConverter(t) } panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) @@ -145,184 +145,184 @@ func newSingularConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { type boolConverter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *boolConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *boolConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfBool(v.Bool()) + return protoreflect.ValueOfBool(v.Bool()) } -func (c *boolConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *boolConverter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(v.Bool()).Convert(c.goType) } -func (c *boolConverter) IsValidPB(v pref.Value) bool { +func (c *boolConverter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(bool) return ok } func (c *boolConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *boolConverter) New() pref.Value { return c.def } -func (c *boolConverter) Zero() pref.Value { return c.def } +func (c *boolConverter) New() protoreflect.Value { return c.def } +func (c *boolConverter) Zero() protoreflect.Value { return c.def } type int32Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *int32Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *int32Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfInt32(int32(v.Int())) + return protoreflect.ValueOfInt32(int32(v.Int())) } -func (c *int32Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *int32Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(int32(v.Int())).Convert(c.goType) } -func (c *int32Converter) IsValidPB(v pref.Value) bool { +func (c *int32Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(int32) return ok } func (c *int32Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *int32Converter) New() pref.Value { return c.def } -func (c *int32Converter) Zero() pref.Value { return c.def } +func (c *int32Converter) New() protoreflect.Value { return c.def } +func (c *int32Converter) Zero() protoreflect.Value { return c.def } type int64Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *int64Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *int64Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfInt64(int64(v.Int())) + return protoreflect.ValueOfInt64(int64(v.Int())) } -func (c *int64Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *int64Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(int64(v.Int())).Convert(c.goType) } -func (c *int64Converter) IsValidPB(v pref.Value) bool { +func (c *int64Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(int64) return ok } func (c *int64Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *int64Converter) New() pref.Value { return c.def } -func (c *int64Converter) Zero() pref.Value { return c.def } +func (c *int64Converter) New() protoreflect.Value { return c.def } +func (c *int64Converter) Zero() protoreflect.Value { return c.def } type uint32Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *uint32Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *uint32Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfUint32(uint32(v.Uint())) + return protoreflect.ValueOfUint32(uint32(v.Uint())) } -func (c *uint32Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *uint32Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(uint32(v.Uint())).Convert(c.goType) } -func (c *uint32Converter) IsValidPB(v pref.Value) bool { +func (c *uint32Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(uint32) return ok } func (c *uint32Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *uint32Converter) New() pref.Value { return c.def } -func (c *uint32Converter) Zero() pref.Value { return c.def } +func (c *uint32Converter) New() protoreflect.Value { return c.def } +func (c *uint32Converter) Zero() protoreflect.Value { return c.def } type uint64Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *uint64Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *uint64Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfUint64(uint64(v.Uint())) + return protoreflect.ValueOfUint64(uint64(v.Uint())) } -func (c *uint64Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *uint64Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(uint64(v.Uint())).Convert(c.goType) } -func (c *uint64Converter) IsValidPB(v pref.Value) bool { +func (c *uint64Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(uint64) return ok } func (c *uint64Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *uint64Converter) New() pref.Value { return c.def } -func (c *uint64Converter) Zero() pref.Value { return c.def } +func (c *uint64Converter) New() protoreflect.Value { return c.def } +func (c *uint64Converter) Zero() protoreflect.Value { return c.def } type float32Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *float32Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *float32Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfFloat32(float32(v.Float())) + return protoreflect.ValueOfFloat32(float32(v.Float())) } -func (c *float32Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *float32Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(float32(v.Float())).Convert(c.goType) } -func (c *float32Converter) IsValidPB(v pref.Value) bool { +func (c *float32Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(float32) return ok } func (c *float32Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *float32Converter) New() pref.Value { return c.def } -func (c *float32Converter) Zero() pref.Value { return c.def } +func (c *float32Converter) New() protoreflect.Value { return c.def } +func (c *float32Converter) Zero() protoreflect.Value { return c.def } type float64Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *float64Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *float64Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfFloat64(float64(v.Float())) + return protoreflect.ValueOfFloat64(float64(v.Float())) } -func (c *float64Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *float64Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(float64(v.Float())).Convert(c.goType) } -func (c *float64Converter) IsValidPB(v pref.Value) bool { +func (c *float64Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(float64) return ok } func (c *float64Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *float64Converter) New() pref.Value { return c.def } -func (c *float64Converter) Zero() pref.Value { return c.def } +func (c *float64Converter) New() protoreflect.Value { return c.def } +func (c *float64Converter) Zero() protoreflect.Value { return c.def } type stringConverter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *stringConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *stringConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfString(v.Convert(stringType).String()) + return protoreflect.ValueOfString(v.Convert(stringType).String()) } -func (c *stringConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *stringConverter) GoValueOf(v protoreflect.Value) reflect.Value { // pref.Value.String never panics, so we go through an interface // conversion here to check the type. s := v.Interface().(string) @@ -331,71 +331,71 @@ func (c *stringConverter) GoValueOf(v pref.Value) reflect.Value { } return reflect.ValueOf(s).Convert(c.goType) } -func (c *stringConverter) IsValidPB(v pref.Value) bool { +func (c *stringConverter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(string) return ok } func (c *stringConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *stringConverter) New() pref.Value { return c.def } -func (c *stringConverter) Zero() pref.Value { return c.def } +func (c *stringConverter) New() protoreflect.Value { return c.def } +func (c *stringConverter) Zero() protoreflect.Value { return c.def } type bytesConverter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *bytesConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *bytesConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } if c.goType.Kind() == reflect.String && v.Len() == 0 { - return pref.ValueOfBytes(nil) // ensure empty string is []byte(nil) + return protoreflect.ValueOfBytes(nil) // ensure empty string is []byte(nil) } - return pref.ValueOfBytes(v.Convert(bytesType).Bytes()) + return protoreflect.ValueOfBytes(v.Convert(bytesType).Bytes()) } -func (c *bytesConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *bytesConverter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(v.Bytes()).Convert(c.goType) } -func (c *bytesConverter) IsValidPB(v pref.Value) bool { +func (c *bytesConverter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().([]byte) return ok } func (c *bytesConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *bytesConverter) New() pref.Value { return c.def } -func (c *bytesConverter) Zero() pref.Value { return c.def } +func (c *bytesConverter) New() protoreflect.Value { return c.def } +func (c *bytesConverter) Zero() protoreflect.Value { return c.def } type enumConverter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func newEnumConverter(goType reflect.Type, fd pref.FieldDescriptor) Converter { - var def pref.Value - if fd.Cardinality() == pref.Repeated { - def = pref.ValueOfEnum(fd.Enum().Values().Get(0).Number()) +func newEnumConverter(goType reflect.Type, fd protoreflect.FieldDescriptor) Converter { + var def protoreflect.Value + if fd.Cardinality() == protoreflect.Repeated { + def = protoreflect.ValueOfEnum(fd.Enum().Values().Get(0).Number()) } else { def = fd.Default() } return &enumConverter{goType, def} } -func (c *enumConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *enumConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfEnum(pref.EnumNumber(v.Int())) + return protoreflect.ValueOfEnum(protoreflect.EnumNumber(v.Int())) } -func (c *enumConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *enumConverter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(v.Enum()).Convert(c.goType) } -func (c *enumConverter) IsValidPB(v pref.Value) bool { - _, ok := v.Interface().(pref.EnumNumber) +func (c *enumConverter) IsValidPB(v protoreflect.Value) bool { + _, ok := v.Interface().(protoreflect.EnumNumber) return ok } @@ -403,11 +403,11 @@ func (c *enumConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *enumConverter) New() pref.Value { +func (c *enumConverter) New() protoreflect.Value { return c.def } -func (c *enumConverter) Zero() pref.Value { +func (c *enumConverter) Zero() protoreflect.Value { return c.def } @@ -419,7 +419,7 @@ func newMessageConverter(goType reflect.Type) Converter { return &messageConverter{goType} } -func (c *messageConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *messageConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } @@ -430,13 +430,13 @@ func (c *messageConverter) PBValueOf(v reflect.Value) pref.Value { v = reflect.Zero(reflect.PtrTo(v.Type())) } } - if m, ok := v.Interface().(pref.ProtoMessage); ok { - return pref.ValueOfMessage(m.ProtoReflect()) + if m, ok := v.Interface().(protoreflect.ProtoMessage); ok { + return protoreflect.ValueOfMessage(m.ProtoReflect()) } - return pref.ValueOfMessage(legacyWrapMessage(v)) + return protoreflect.ValueOfMessage(legacyWrapMessage(v)) } -func (c *messageConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *messageConverter) GoValueOf(v protoreflect.Value) reflect.Value { m := v.Message() var rv reflect.Value if u, ok := m.(unwrapper); ok { @@ -460,7 +460,7 @@ func (c *messageConverter) GoValueOf(v pref.Value) reflect.Value { return rv } -func (c *messageConverter) IsValidPB(v pref.Value) bool { +func (c *messageConverter) IsValidPB(v protoreflect.Value) bool { m := v.Message() var rv reflect.Value if u, ok := m.(unwrapper); ok { @@ -478,14 +478,14 @@ func (c *messageConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *messageConverter) New() pref.Value { +func (c *messageConverter) New() protoreflect.Value { if c.isNonPointer() { return c.PBValueOf(reflect.New(c.goType).Elem()) } return c.PBValueOf(reflect.New(c.goType.Elem())) } -func (c *messageConverter) Zero() pref.Value { +func (c *messageConverter) Zero() protoreflect.Value { return c.PBValueOf(reflect.Zero(c.goType)) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert_list.go b/vendor/google.golang.org/protobuf/internal/impl/convert_list.go index 6fccab520..f89136516 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/convert_list.go +++ b/vendor/google.golang.org/protobuf/internal/impl/convert_list.go @@ -8,10 +8,10 @@ import ( "fmt" "reflect" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) -func newListConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { +func newListConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { switch { case t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Slice: return &listPtrConverter{t, newSingularConverter(t.Elem().Elem(), fd)} @@ -26,16 +26,16 @@ type listConverter struct { c Converter } -func (c *listConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *listConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } pv := reflect.New(c.goType) pv.Elem().Set(v) - return pref.ValueOfList(&listReflect{pv, c.c}) + return protoreflect.ValueOfList(&listReflect{pv, c.c}) } -func (c *listConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *listConverter) GoValueOf(v protoreflect.Value) reflect.Value { rv := v.List().(*listReflect).v if rv.IsNil() { return reflect.Zero(c.goType) @@ -43,7 +43,7 @@ func (c *listConverter) GoValueOf(v pref.Value) reflect.Value { return rv.Elem() } -func (c *listConverter) IsValidPB(v pref.Value) bool { +func (c *listConverter) IsValidPB(v protoreflect.Value) bool { list, ok := v.Interface().(*listReflect) if !ok { return false @@ -55,12 +55,12 @@ func (c *listConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *listConverter) New() pref.Value { - return pref.ValueOfList(&listReflect{reflect.New(c.goType), c.c}) +func (c *listConverter) New() protoreflect.Value { + return protoreflect.ValueOfList(&listReflect{reflect.New(c.goType), c.c}) } -func (c *listConverter) Zero() pref.Value { - return pref.ValueOfList(&listReflect{reflect.Zero(reflect.PtrTo(c.goType)), c.c}) +func (c *listConverter) Zero() protoreflect.Value { + return protoreflect.ValueOfList(&listReflect{reflect.Zero(reflect.PtrTo(c.goType)), c.c}) } type listPtrConverter struct { @@ -68,18 +68,18 @@ type listPtrConverter struct { c Converter } -func (c *listPtrConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *listPtrConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfList(&listReflect{v, c.c}) + return protoreflect.ValueOfList(&listReflect{v, c.c}) } -func (c *listPtrConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *listPtrConverter) GoValueOf(v protoreflect.Value) reflect.Value { return v.List().(*listReflect).v } -func (c *listPtrConverter) IsValidPB(v pref.Value) bool { +func (c *listPtrConverter) IsValidPB(v protoreflect.Value) bool { list, ok := v.Interface().(*listReflect) if !ok { return false @@ -91,11 +91,11 @@ func (c *listPtrConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *listPtrConverter) New() pref.Value { +func (c *listPtrConverter) New() protoreflect.Value { return c.PBValueOf(reflect.New(c.goType.Elem())) } -func (c *listPtrConverter) Zero() pref.Value { +func (c *listPtrConverter) Zero() protoreflect.Value { return c.PBValueOf(reflect.Zero(c.goType)) } @@ -110,16 +110,16 @@ func (ls *listReflect) Len() int { } return ls.v.Elem().Len() } -func (ls *listReflect) Get(i int) pref.Value { +func (ls *listReflect) Get(i int) protoreflect.Value { return ls.conv.PBValueOf(ls.v.Elem().Index(i)) } -func (ls *listReflect) Set(i int, v pref.Value) { +func (ls *listReflect) Set(i int, v protoreflect.Value) { ls.v.Elem().Index(i).Set(ls.conv.GoValueOf(v)) } -func (ls *listReflect) Append(v pref.Value) { +func (ls *listReflect) Append(v protoreflect.Value) { ls.v.Elem().Set(reflect.Append(ls.v.Elem(), ls.conv.GoValueOf(v))) } -func (ls *listReflect) AppendMutable() pref.Value { +func (ls *listReflect) AppendMutable() protoreflect.Value { if _, ok := ls.conv.(*messageConverter); !ok { panic("invalid AppendMutable on list with non-message type") } @@ -130,7 +130,7 @@ func (ls *listReflect) AppendMutable() pref.Value { func (ls *listReflect) Truncate(i int) { ls.v.Elem().Set(ls.v.Elem().Slice(0, i)) } -func (ls *listReflect) NewElement() pref.Value { +func (ls *listReflect) NewElement() protoreflect.Value { return ls.conv.New() } func (ls *listReflect) IsValid() bool { diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert_map.go b/vendor/google.golang.org/protobuf/internal/impl/convert_map.go index de06b2593..f30b0a057 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/convert_map.go +++ b/vendor/google.golang.org/protobuf/internal/impl/convert_map.go @@ -8,7 +8,7 @@ import ( "fmt" "reflect" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type mapConverter struct { @@ -16,7 +16,7 @@ type mapConverter struct { keyConv, valConv Converter } -func newMapConverter(t reflect.Type, fd pref.FieldDescriptor) *mapConverter { +func newMapConverter(t reflect.Type, fd protoreflect.FieldDescriptor) *mapConverter { if t.Kind() != reflect.Map { panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) } @@ -27,18 +27,18 @@ func newMapConverter(t reflect.Type, fd pref.FieldDescriptor) *mapConverter { } } -func (c *mapConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *mapConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfMap(&mapReflect{v, c.keyConv, c.valConv}) + return protoreflect.ValueOfMap(&mapReflect{v, c.keyConv, c.valConv}) } -func (c *mapConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *mapConverter) GoValueOf(v protoreflect.Value) reflect.Value { return v.Map().(*mapReflect).v } -func (c *mapConverter) IsValidPB(v pref.Value) bool { +func (c *mapConverter) IsValidPB(v protoreflect.Value) bool { mapv, ok := v.Interface().(*mapReflect) if !ok { return false @@ -50,11 +50,11 @@ func (c *mapConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *mapConverter) New() pref.Value { +func (c *mapConverter) New() protoreflect.Value { return c.PBValueOf(reflect.MakeMap(c.goType)) } -func (c *mapConverter) Zero() pref.Value { +func (c *mapConverter) Zero() protoreflect.Value { return c.PBValueOf(reflect.Zero(c.goType)) } @@ -67,29 +67,29 @@ type mapReflect struct { func (ms *mapReflect) Len() int { return ms.v.Len() } -func (ms *mapReflect) Has(k pref.MapKey) bool { +func (ms *mapReflect) Has(k protoreflect.MapKey) bool { rk := ms.keyConv.GoValueOf(k.Value()) rv := ms.v.MapIndex(rk) return rv.IsValid() } -func (ms *mapReflect) Get(k pref.MapKey) pref.Value { +func (ms *mapReflect) Get(k protoreflect.MapKey) protoreflect.Value { rk := ms.keyConv.GoValueOf(k.Value()) rv := ms.v.MapIndex(rk) if !rv.IsValid() { - return pref.Value{} + return protoreflect.Value{} } return ms.valConv.PBValueOf(rv) } -func (ms *mapReflect) Set(k pref.MapKey, v pref.Value) { +func (ms *mapReflect) Set(k protoreflect.MapKey, v protoreflect.Value) { rk := ms.keyConv.GoValueOf(k.Value()) rv := ms.valConv.GoValueOf(v) ms.v.SetMapIndex(rk, rv) } -func (ms *mapReflect) Clear(k pref.MapKey) { +func (ms *mapReflect) Clear(k protoreflect.MapKey) { rk := ms.keyConv.GoValueOf(k.Value()) ms.v.SetMapIndex(rk, reflect.Value{}) } -func (ms *mapReflect) Mutable(k pref.MapKey) pref.Value { +func (ms *mapReflect) Mutable(k protoreflect.MapKey) protoreflect.Value { if _, ok := ms.valConv.(*messageConverter); !ok { panic("invalid Mutable on map with non-message value type") } @@ -100,7 +100,7 @@ func (ms *mapReflect) Mutable(k pref.MapKey) pref.Value { } return v } -func (ms *mapReflect) Range(f func(pref.MapKey, pref.Value) bool) { +func (ms *mapReflect) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) { iter := mapRange(ms.v) for iter.Next() { k := ms.keyConv.PBValueOf(iter.Key()).MapKey() @@ -110,7 +110,7 @@ func (ms *mapReflect) Range(f func(pref.MapKey, pref.Value) bool) { } } } -func (ms *mapReflect) NewValue() pref.Value { +func (ms *mapReflect) NewValue() protoreflect.Value { return ms.valConv.New() } func (ms *mapReflect) IsValid() bool { diff --git a/vendor/google.golang.org/protobuf/internal/impl/decode.go b/vendor/google.golang.org/protobuf/internal/impl/decode.go index c65b0325c..cda0520c2 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/decode.go +++ b/vendor/google.golang.org/protobuf/internal/impl/decode.go @@ -12,9 +12,8 @@ import ( "google.golang.org/protobuf/internal/flags" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoregistry" "google.golang.org/protobuf/runtime/protoiface" - piface "google.golang.org/protobuf/runtime/protoiface" ) var errDecode = errors.New("cannot parse invalid wire-format data") @@ -38,14 +37,16 @@ func (o unmarshalOptions) Options() proto.UnmarshalOptions { } } -func (o unmarshalOptions) DiscardUnknown() bool { return o.flags&piface.UnmarshalDiscardUnknown != 0 } +func (o unmarshalOptions) DiscardUnknown() bool { + return o.flags&protoiface.UnmarshalDiscardUnknown != 0 +} func (o unmarshalOptions) IsDefault() bool { - return o.flags == 0 && o.resolver == preg.GlobalTypes + return o.flags == 0 && o.resolver == protoregistry.GlobalTypes } var lazyUnmarshalOptions = unmarshalOptions{ - resolver: preg.GlobalTypes, + resolver: protoregistry.GlobalTypes, depth: protowire.DefaultRecursionLimit, } @@ -55,7 +56,7 @@ type unmarshalOutput struct { } // unmarshal is protoreflect.Methods.Unmarshal. -func (mi *MessageInfo) unmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutput, error) { +func (mi *MessageInfo) unmarshal(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { var p pointer if ms, ok := in.Message.(*messageState); ok { p = ms.pointer() @@ -67,11 +68,11 @@ func (mi *MessageInfo) unmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutp resolver: in.Resolver, depth: in.Depth, }) - var flags piface.UnmarshalOutputFlags + var flags protoiface.UnmarshalOutputFlags if out.initialized { - flags |= piface.UnmarshalInitialized + flags |= protoiface.UnmarshalInitialized } - return piface.UnmarshalOutput{ + return protoiface.UnmarshalOutput{ Flags: flags, }, err } @@ -210,7 +211,7 @@ func (mi *MessageInfo) unmarshalExtension(b []byte, num protowire.Number, wtyp p var err error xt, err = opts.resolver.FindExtensionByNumber(mi.Desc.FullName(), num) if err != nil { - if err == preg.NotFound { + if err == protoregistry.NotFound { return out, errUnknown } return out, errors.New("%v: unable to resolve extension %v: %v", mi.Desc.FullName(), num, err) diff --git a/vendor/google.golang.org/protobuf/internal/impl/enum.go b/vendor/google.golang.org/protobuf/internal/impl/enum.go index 8c1eab4bf..5f3ef5ad7 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/enum.go +++ b/vendor/google.golang.org/protobuf/internal/impl/enum.go @@ -7,15 +7,15 @@ package impl import ( "reflect" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type EnumInfo struct { GoReflectType reflect.Type // int32 kind - Desc pref.EnumDescriptor + Desc protoreflect.EnumDescriptor } -func (t *EnumInfo) New(n pref.EnumNumber) pref.Enum { - return reflect.ValueOf(n).Convert(t.GoReflectType).Interface().(pref.Enum) +func (t *EnumInfo) New(n protoreflect.EnumNumber) protoreflect.Enum { + return reflect.ValueOf(n).Convert(t.GoReflectType).Interface().(protoreflect.Enum) } -func (t *EnumInfo) Descriptor() pref.EnumDescriptor { return t.Desc } +func (t *EnumInfo) Descriptor() protoreflect.EnumDescriptor { return t.Desc } diff --git a/vendor/google.golang.org/protobuf/internal/impl/extension.go b/vendor/google.golang.org/protobuf/internal/impl/extension.go index e904fd993..cb25b0bae 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/extension.go +++ b/vendor/google.golang.org/protobuf/internal/impl/extension.go @@ -9,8 +9,8 @@ import ( "sync" "sync/atomic" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) // ExtensionInfo implements ExtensionType. @@ -45,7 +45,7 @@ type ExtensionInfo struct { // since the message may no longer implement the MessageV1 interface. // // Deprecated: Use the ExtendedType method instead. - ExtendedType piface.MessageV1 + ExtendedType protoiface.MessageV1 // ExtensionType is the zero value of the extension type. // @@ -83,31 +83,31 @@ const ( extensionInfoFullInit = 2 ) -func InitExtensionInfo(xi *ExtensionInfo, xd pref.ExtensionDescriptor, goType reflect.Type) { +func InitExtensionInfo(xi *ExtensionInfo, xd protoreflect.ExtensionDescriptor, goType reflect.Type) { xi.goType = goType xi.desc = extensionTypeDescriptor{xd, xi} xi.init = extensionInfoDescInit } -func (xi *ExtensionInfo) New() pref.Value { +func (xi *ExtensionInfo) New() protoreflect.Value { return xi.lazyInit().New() } -func (xi *ExtensionInfo) Zero() pref.Value { +func (xi *ExtensionInfo) Zero() protoreflect.Value { return xi.lazyInit().Zero() } -func (xi *ExtensionInfo) ValueOf(v interface{}) pref.Value { +func (xi *ExtensionInfo) ValueOf(v interface{}) protoreflect.Value { return xi.lazyInit().PBValueOf(reflect.ValueOf(v)) } -func (xi *ExtensionInfo) InterfaceOf(v pref.Value) interface{} { +func (xi *ExtensionInfo) InterfaceOf(v protoreflect.Value) interface{} { return xi.lazyInit().GoValueOf(v).Interface() } -func (xi *ExtensionInfo) IsValidValue(v pref.Value) bool { +func (xi *ExtensionInfo) IsValidValue(v protoreflect.Value) bool { return xi.lazyInit().IsValidPB(v) } func (xi *ExtensionInfo) IsValidInterface(v interface{}) bool { return xi.lazyInit().IsValidGo(reflect.ValueOf(v)) } -func (xi *ExtensionInfo) TypeDescriptor() pref.ExtensionTypeDescriptor { +func (xi *ExtensionInfo) TypeDescriptor() protoreflect.ExtensionTypeDescriptor { if atomic.LoadUint32(&xi.init) < extensionInfoDescInit { xi.lazyInitSlow() } @@ -144,13 +144,13 @@ func (xi *ExtensionInfo) lazyInitSlow() { } type extensionTypeDescriptor struct { - pref.ExtensionDescriptor + protoreflect.ExtensionDescriptor xi *ExtensionInfo } -func (xtd *extensionTypeDescriptor) Type() pref.ExtensionType { +func (xtd *extensionTypeDescriptor) Type() protoreflect.ExtensionType { return xtd.xi } -func (xtd *extensionTypeDescriptor) Descriptor() pref.ExtensionDescriptor { +func (xtd *extensionTypeDescriptor) Descriptor() protoreflect.ExtensionDescriptor { return xtd.ExtensionDescriptor } diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go index f7d7ffb51..c2a803bb2 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go @@ -13,13 +13,12 @@ import ( "google.golang.org/protobuf/internal/filedesc" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" ) // legacyEnumName returns the name of enums used in legacy code. // It is neither the protobuf full name nor the qualified Go name, // but rather an odd hybrid of both. -func legacyEnumName(ed pref.EnumDescriptor) string { +func legacyEnumName(ed protoreflect.EnumDescriptor) string { var protoPkg string enumName := string(ed.FullName()) if fd := ed.ParentFile(); fd != nil { @@ -34,68 +33,68 @@ func legacyEnumName(ed pref.EnumDescriptor) string { // legacyWrapEnum wraps v as a protoreflect.Enum, // where v must be a int32 kind and not implement the v2 API already. -func legacyWrapEnum(v reflect.Value) pref.Enum { +func legacyWrapEnum(v reflect.Value) protoreflect.Enum { et := legacyLoadEnumType(v.Type()) - return et.New(pref.EnumNumber(v.Int())) + return et.New(protoreflect.EnumNumber(v.Int())) } var legacyEnumTypeCache sync.Map // map[reflect.Type]protoreflect.EnumType // legacyLoadEnumType dynamically loads a protoreflect.EnumType for t, // where t must be an int32 kind and not implement the v2 API already. -func legacyLoadEnumType(t reflect.Type) pref.EnumType { +func legacyLoadEnumType(t reflect.Type) protoreflect.EnumType { // Fast-path: check if a EnumType is cached for this concrete type. if et, ok := legacyEnumTypeCache.Load(t); ok { - return et.(pref.EnumType) + return et.(protoreflect.EnumType) } // Slow-path: derive enum descriptor and initialize EnumType. - var et pref.EnumType + var et protoreflect.EnumType ed := LegacyLoadEnumDesc(t) et = &legacyEnumType{ desc: ed, goType: t, } if et, ok := legacyEnumTypeCache.LoadOrStore(t, et); ok { - return et.(pref.EnumType) + return et.(protoreflect.EnumType) } return et } type legacyEnumType struct { - desc pref.EnumDescriptor + desc protoreflect.EnumDescriptor goType reflect.Type m sync.Map // map[protoreflect.EnumNumber]proto.Enum } -func (t *legacyEnumType) New(n pref.EnumNumber) pref.Enum { +func (t *legacyEnumType) New(n protoreflect.EnumNumber) protoreflect.Enum { if e, ok := t.m.Load(n); ok { - return e.(pref.Enum) + return e.(protoreflect.Enum) } e := &legacyEnumWrapper{num: n, pbTyp: t, goTyp: t.goType} t.m.Store(n, e) return e } -func (t *legacyEnumType) Descriptor() pref.EnumDescriptor { +func (t *legacyEnumType) Descriptor() protoreflect.EnumDescriptor { return t.desc } type legacyEnumWrapper struct { - num pref.EnumNumber - pbTyp pref.EnumType + num protoreflect.EnumNumber + pbTyp protoreflect.EnumType goTyp reflect.Type } -func (e *legacyEnumWrapper) Descriptor() pref.EnumDescriptor { +func (e *legacyEnumWrapper) Descriptor() protoreflect.EnumDescriptor { return e.pbTyp.Descriptor() } -func (e *legacyEnumWrapper) Type() pref.EnumType { +func (e *legacyEnumWrapper) Type() protoreflect.EnumType { return e.pbTyp } -func (e *legacyEnumWrapper) Number() pref.EnumNumber { +func (e *legacyEnumWrapper) Number() protoreflect.EnumNumber { return e.num } -func (e *legacyEnumWrapper) ProtoReflect() pref.Enum { +func (e *legacyEnumWrapper) ProtoReflect() protoreflect.Enum { return e } func (e *legacyEnumWrapper) protoUnwrap() interface{} { @@ -105,8 +104,8 @@ func (e *legacyEnumWrapper) protoUnwrap() interface{} { } var ( - _ pref.Enum = (*legacyEnumWrapper)(nil) - _ unwrapper = (*legacyEnumWrapper)(nil) + _ protoreflect.Enum = (*legacyEnumWrapper)(nil) + _ unwrapper = (*legacyEnumWrapper)(nil) ) var legacyEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor @@ -115,15 +114,15 @@ var legacyEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor // which must be an int32 kind and not implement the v2 API already. // // This is exported for testing purposes. -func LegacyLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { +func LegacyLoadEnumDesc(t reflect.Type) protoreflect.EnumDescriptor { // Fast-path: check if an EnumDescriptor is cached for this concrete type. if ed, ok := legacyEnumDescCache.Load(t); ok { - return ed.(pref.EnumDescriptor) + return ed.(protoreflect.EnumDescriptor) } // Slow-path: initialize EnumDescriptor from the raw descriptor. ev := reflect.Zero(t).Interface() - if _, ok := ev.(pref.Enum); ok { + if _, ok := ev.(protoreflect.Enum); ok { panic(fmt.Sprintf("%v already implements proto.Enum", t)) } edV1, ok := ev.(enumV1) @@ -132,7 +131,7 @@ func LegacyLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { } b, idxs := edV1.EnumDescriptor() - var ed pref.EnumDescriptor + var ed protoreflect.EnumDescriptor if len(idxs) == 1 { ed = legacyLoadFileDesc(b).Enums().Get(idxs[0]) } else { @@ -158,10 +157,10 @@ var aberrantEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescript // We are unable to use the global enum registry since it is // unfortunately keyed by the protobuf full name, which we also do not know. // Thus, this produces some bogus enum descriptor based on the Go type name. -func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { +func aberrantLoadEnumDesc(t reflect.Type) protoreflect.EnumDescriptor { // Fast-path: check if an EnumDescriptor is cached for this concrete type. if ed, ok := aberrantEnumDescCache.Load(t); ok { - return ed.(pref.EnumDescriptor) + return ed.(protoreflect.EnumDescriptor) } // Slow-path: construct a bogus, but unique EnumDescriptor. @@ -182,7 +181,7 @@ func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { // An exhaustive query is clearly impractical, but can be best-effort. if ed, ok := aberrantEnumDescCache.LoadOrStore(t, ed); ok { - return ed.(pref.EnumDescriptor) + return ed.(protoreflect.EnumDescriptor) } return ed } @@ -192,7 +191,7 @@ func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { // It should be sufficiently unique within a program. // // This is exported for testing purposes. -func AberrantDeriveFullName(t reflect.Type) pref.FullName { +func AberrantDeriveFullName(t reflect.Type) protoreflect.FullName { sanitize := func(r rune) rune { switch { case r == '/': @@ -215,5 +214,5 @@ func AberrantDeriveFullName(t reflect.Type) pref.FullName { ss[i] = "x" + s } } - return pref.FullName(strings.Join(ss, ".")) + return protoreflect.FullName(strings.Join(ss, ".")) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go index e3fb0b578..9b64ad5bb 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go @@ -12,21 +12,21 @@ import ( "reflect" "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) // These functions exist to support exported APIs in generated protobufs. // While these are deprecated, they cannot be removed for compatibility reasons. // LegacyEnumName returns the name of enums used in legacy code. -func (Export) LegacyEnumName(ed pref.EnumDescriptor) string { +func (Export) LegacyEnumName(ed protoreflect.EnumDescriptor) string { return legacyEnumName(ed) } // LegacyMessageTypeOf returns the protoreflect.MessageType for m, // with name used as the message name if necessary. -func (Export) LegacyMessageTypeOf(m piface.MessageV1, name pref.FullName) pref.MessageType { +func (Export) LegacyMessageTypeOf(m protoiface.MessageV1, name protoreflect.FullName) protoreflect.MessageType { if mv := (Export{}).protoMessageV2Of(m); mv != nil { return mv.ProtoReflect().Type() } @@ -36,9 +36,9 @@ func (Export) LegacyMessageTypeOf(m piface.MessageV1, name pref.FullName) pref.M // UnmarshalJSONEnum unmarshals an enum from a JSON-encoded input. // The input can either be a string representing the enum value by name, // or a number representing the enum number itself. -func (Export) UnmarshalJSONEnum(ed pref.EnumDescriptor, b []byte) (pref.EnumNumber, error) { +func (Export) UnmarshalJSONEnum(ed protoreflect.EnumDescriptor, b []byte) (protoreflect.EnumNumber, error) { if b[0] == '"' { - var name pref.Name + var name protoreflect.Name if err := json.Unmarshal(b, &name); err != nil { return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) } @@ -48,7 +48,7 @@ func (Export) UnmarshalJSONEnum(ed pref.EnumDescriptor, b []byte) (pref.EnumNumb } return ev.Number(), nil } else { - var num pref.EnumNumber + var num protoreflect.EnumNumber if err := json.Unmarshal(b, &num); err != nil { return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) } @@ -81,8 +81,8 @@ func (Export) CompressGZIP(in []byte) (out []byte) { blockHeader[0] = 0x01 // final bit per RFC 1951, section 3.2.3. blockSize = len(in) } - binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize)^0x0000) - binary.LittleEndian.PutUint16(blockHeader[3:5], uint16(blockSize)^0xffff) + binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize)) + binary.LittleEndian.PutUint16(blockHeader[3:5], ^uint16(blockSize)) out = append(out, blockHeader[:]...) out = append(out, in[:blockSize]...) in = in[blockSize:] diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go index 49e723161..87b30d050 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go @@ -12,16 +12,16 @@ import ( ptag "google.golang.org/protobuf/internal/encoding/tag" "google.golang.org/protobuf/internal/filedesc" "google.golang.org/protobuf/internal/pragma" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/runtime/protoiface" ) func (xi *ExtensionInfo) initToLegacy() { xd := xi.desc - var parent piface.MessageV1 + var parent protoiface.MessageV1 messageName := xd.ContainingMessage().FullName() - if mt, _ := preg.GlobalTypes.FindMessageByName(messageName); mt != nil { + if mt, _ := protoregistry.GlobalTypes.FindMessageByName(messageName); mt != nil { // Create a new parent message and unwrap it if possible. mv := mt.New().Interface() t := reflect.TypeOf(mv) @@ -31,7 +31,7 @@ func (xi *ExtensionInfo) initToLegacy() { // Check whether the message implements the legacy v1 Message interface. mz := reflect.Zero(t).Interface() - if mz, ok := mz.(piface.MessageV1); ok { + if mz, ok := mz.(protoiface.MessageV1); ok { parent = mz } } @@ -46,7 +46,7 @@ func (xi *ExtensionInfo) initToLegacy() { // Reconstruct the legacy enum full name. var enumName string - if xd.Kind() == pref.EnumKind { + if xd.Kind() == protoreflect.EnumKind { enumName = legacyEnumName(xd.Enum()) } @@ -77,16 +77,16 @@ func (xi *ExtensionInfo) initFromLegacy() { // field number is specified. In such a case, use a placeholder. if xi.ExtendedType == nil || xi.ExtensionType == nil { xd := placeholderExtension{ - name: pref.FullName(xi.Name), - number: pref.FieldNumber(xi.Field), + name: protoreflect.FullName(xi.Name), + number: protoreflect.FieldNumber(xi.Field), } xi.desc = extensionTypeDescriptor{xd, xi} return } // Resolve enum or message dependencies. - var ed pref.EnumDescriptor - var md pref.MessageDescriptor + var ed protoreflect.EnumDescriptor + var md protoreflect.MessageDescriptor t := reflect.TypeOf(xi.ExtensionType) isOptional := t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct isRepeated := t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 @@ -94,18 +94,18 @@ func (xi *ExtensionInfo) initFromLegacy() { t = t.Elem() } switch v := reflect.Zero(t).Interface().(type) { - case pref.Enum: + case protoreflect.Enum: ed = v.Descriptor() case enumV1: ed = LegacyLoadEnumDesc(t) - case pref.ProtoMessage: + case protoreflect.ProtoMessage: md = v.ProtoReflect().Descriptor() case messageV1: md = LegacyLoadMessageDesc(t) } // Derive basic field information from the struct tag. - var evs pref.EnumValueDescriptors + var evs protoreflect.EnumValueDescriptors if ed != nil { evs = ed.Values() } @@ -114,8 +114,8 @@ func (xi *ExtensionInfo) initFromLegacy() { // Construct a v2 ExtensionType. xd := &filedesc.Extension{L2: new(filedesc.ExtensionL2)} xd.L0.ParentFile = filedesc.SurrogateProto2 - xd.L0.FullName = pref.FullName(xi.Name) - xd.L1.Number = pref.FieldNumber(xi.Field) + xd.L0.FullName = protoreflect.FullName(xi.Name) + xd.L1.Number = protoreflect.FieldNumber(xi.Field) xd.L1.Cardinality = fd.L1.Cardinality xd.L1.Kind = fd.L1.Kind xd.L2.IsPacked = fd.L1.IsPacked @@ -138,39 +138,39 @@ func (xi *ExtensionInfo) initFromLegacy() { } type placeholderExtension struct { - name pref.FullName - number pref.FieldNumber + name protoreflect.FullName + number protoreflect.FieldNumber } -func (x placeholderExtension) ParentFile() pref.FileDescriptor { return nil } -func (x placeholderExtension) Parent() pref.Descriptor { return nil } -func (x placeholderExtension) Index() int { return 0 } -func (x placeholderExtension) Syntax() pref.Syntax { return 0 } -func (x placeholderExtension) Name() pref.Name { return x.name.Name() } -func (x placeholderExtension) FullName() pref.FullName { return x.name } -func (x placeholderExtension) IsPlaceholder() bool { return true } -func (x placeholderExtension) Options() pref.ProtoMessage { return descopts.Field } -func (x placeholderExtension) Number() pref.FieldNumber { return x.number } -func (x placeholderExtension) Cardinality() pref.Cardinality { return 0 } -func (x placeholderExtension) Kind() pref.Kind { return 0 } -func (x placeholderExtension) HasJSONName() bool { return false } -func (x placeholderExtension) JSONName() string { return "[" + string(x.name) + "]" } -func (x placeholderExtension) TextName() string { return "[" + string(x.name) + "]" } -func (x placeholderExtension) HasPresence() bool { return false } -func (x placeholderExtension) HasOptionalKeyword() bool { return false } -func (x placeholderExtension) IsExtension() bool { return true } -func (x placeholderExtension) IsWeak() bool { return false } -func (x placeholderExtension) IsPacked() bool { return false } -func (x placeholderExtension) IsList() bool { return false } -func (x placeholderExtension) IsMap() bool { return false } -func (x placeholderExtension) MapKey() pref.FieldDescriptor { return nil } -func (x placeholderExtension) MapValue() pref.FieldDescriptor { return nil } -func (x placeholderExtension) HasDefault() bool { return false } -func (x placeholderExtension) Default() pref.Value { return pref.Value{} } -func (x placeholderExtension) DefaultEnumValue() pref.EnumValueDescriptor { return nil } -func (x placeholderExtension) ContainingOneof() pref.OneofDescriptor { return nil } -func (x placeholderExtension) ContainingMessage() pref.MessageDescriptor { return nil } -func (x placeholderExtension) Enum() pref.EnumDescriptor { return nil } -func (x placeholderExtension) Message() pref.MessageDescriptor { return nil } -func (x placeholderExtension) ProtoType(pref.FieldDescriptor) { return } -func (x placeholderExtension) ProtoInternal(pragma.DoNotImplement) { return } +func (x placeholderExtension) ParentFile() protoreflect.FileDescriptor { return nil } +func (x placeholderExtension) Parent() protoreflect.Descriptor { return nil } +func (x placeholderExtension) Index() int { return 0 } +func (x placeholderExtension) Syntax() protoreflect.Syntax { return 0 } +func (x placeholderExtension) Name() protoreflect.Name { return x.name.Name() } +func (x placeholderExtension) FullName() protoreflect.FullName { return x.name } +func (x placeholderExtension) IsPlaceholder() bool { return true } +func (x placeholderExtension) Options() protoreflect.ProtoMessage { return descopts.Field } +func (x placeholderExtension) Number() protoreflect.FieldNumber { return x.number } +func (x placeholderExtension) Cardinality() protoreflect.Cardinality { return 0 } +func (x placeholderExtension) Kind() protoreflect.Kind { return 0 } +func (x placeholderExtension) HasJSONName() bool { return false } +func (x placeholderExtension) JSONName() string { return "[" + string(x.name) + "]" } +func (x placeholderExtension) TextName() string { return "[" + string(x.name) + "]" } +func (x placeholderExtension) HasPresence() bool { return false } +func (x placeholderExtension) HasOptionalKeyword() bool { return false } +func (x placeholderExtension) IsExtension() bool { return true } +func (x placeholderExtension) IsWeak() bool { return false } +func (x placeholderExtension) IsPacked() bool { return false } +func (x placeholderExtension) IsList() bool { return false } +func (x placeholderExtension) IsMap() bool { return false } +func (x placeholderExtension) MapKey() protoreflect.FieldDescriptor { return nil } +func (x placeholderExtension) MapValue() protoreflect.FieldDescriptor { return nil } +func (x placeholderExtension) HasDefault() bool { return false } +func (x placeholderExtension) Default() protoreflect.Value { return protoreflect.Value{} } +func (x placeholderExtension) DefaultEnumValue() protoreflect.EnumValueDescriptor { return nil } +func (x placeholderExtension) ContainingOneof() protoreflect.OneofDescriptor { return nil } +func (x placeholderExtension) ContainingMessage() protoreflect.MessageDescriptor { return nil } +func (x placeholderExtension) Enum() protoreflect.EnumDescriptor { return nil } +func (x placeholderExtension) Message() protoreflect.MessageDescriptor { return nil } +func (x placeholderExtension) ProtoType(protoreflect.FieldDescriptor) { return } +func (x placeholderExtension) ProtoInternal(pragma.DoNotImplement) { return } diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go index 029feeefd..61c483fac 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go @@ -16,14 +16,12 @@ import ( "google.golang.org/protobuf/internal/filedesc" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/runtime/protoiface" - piface "google.golang.org/protobuf/runtime/protoiface" ) // legacyWrapMessage wraps v as a protoreflect.Message, // where v must be a *struct kind and not implement the v2 API already. -func legacyWrapMessage(v reflect.Value) pref.Message { +func legacyWrapMessage(v reflect.Value) protoreflect.Message { t := v.Type() if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { return aberrantMessage{v: v} @@ -35,7 +33,7 @@ func legacyWrapMessage(v reflect.Value) pref.Message { // legacyLoadMessageType dynamically loads a protoreflect.Type for t, // where t must be not implement the v2 API already. // The provided name is used if it cannot be determined from the message. -func legacyLoadMessageType(t reflect.Type, name pref.FullName) protoreflect.MessageType { +func legacyLoadMessageType(t reflect.Type, name protoreflect.FullName) protoreflect.MessageType { if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { return aberrantMessageType{t} } @@ -47,7 +45,7 @@ var legacyMessageTypeCache sync.Map // map[reflect.Type]*MessageInfo // legacyLoadMessageInfo dynamically loads a *MessageInfo for t, // where t must be a *struct kind and not implement the v2 API already. // The provided name is used if it cannot be determined from the message. -func legacyLoadMessageInfo(t reflect.Type, name pref.FullName) *MessageInfo { +func legacyLoadMessageInfo(t reflect.Type, name protoreflect.FullName) *MessageInfo { // Fast-path: check if a MessageInfo is cached for this concrete type. if mt, ok := legacyMessageTypeCache.Load(t); ok { return mt.(*MessageInfo) @@ -68,7 +66,7 @@ func legacyLoadMessageInfo(t reflect.Type, name pref.FullName) *MessageInfo { // supports deterministic serialization or not, but this // preserves the v1 implementation's behavior of always // calling Marshal methods when present. - mi.methods.Flags |= piface.SupportMarshalDeterministic + mi.methods.Flags |= protoiface.SupportMarshalDeterministic } if _, hasUnmarshal = v.(legacyUnmarshaler); hasUnmarshal { mi.methods.Unmarshal = legacyUnmarshal @@ -89,18 +87,18 @@ var legacyMessageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDesc // which should be a *struct kind and must not implement the v2 API already. // // This is exported for testing purposes. -func LegacyLoadMessageDesc(t reflect.Type) pref.MessageDescriptor { +func LegacyLoadMessageDesc(t reflect.Type) protoreflect.MessageDescriptor { return legacyLoadMessageDesc(t, "") } -func legacyLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDescriptor { +func legacyLoadMessageDesc(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor { // Fast-path: check if a MessageDescriptor is cached for this concrete type. if mi, ok := legacyMessageDescCache.Load(t); ok { - return mi.(pref.MessageDescriptor) + return mi.(protoreflect.MessageDescriptor) } // Slow-path: initialize MessageDescriptor from the raw descriptor. mv := reflect.Zero(t).Interface() - if _, ok := mv.(pref.ProtoMessage); ok { + if _, ok := mv.(protoreflect.ProtoMessage); ok { panic(fmt.Sprintf("%v already implements proto.Message", t)) } mdV1, ok := mv.(messageV1) @@ -164,7 +162,7 @@ var ( // // This is a best-effort derivation of the message descriptor using the protobuf // tags on the struct fields. -func aberrantLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDescriptor { +func aberrantLoadMessageDesc(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor { aberrantMessageDescLock.Lock() defer aberrantMessageDescLock.Unlock() if aberrantMessageDescCache == nil { @@ -172,7 +170,7 @@ func aberrantLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDes } return aberrantLoadMessageDescReentrant(t, name) } -func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.MessageDescriptor { +func aberrantLoadMessageDescReentrant(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor { // Fast-path: check if an MessageDescriptor is cached for this concrete type. if md, ok := aberrantMessageDescCache[t]; ok { return md @@ -225,9 +223,9 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.M vs := fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0] for i := 0; i < vs.Len(); i++ { v := vs.Index(i) - md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, [2]pref.FieldNumber{ - pref.FieldNumber(v.FieldByName("Start").Int()), - pref.FieldNumber(v.FieldByName("End").Int() + 1), + md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, [2]protoreflect.FieldNumber{ + protoreflect.FieldNumber(v.FieldByName("Start").Int()), + protoreflect.FieldNumber(v.FieldByName("End").Int() + 1), }) md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, nil) } @@ -245,7 +243,7 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.M n := len(md.L2.Oneofs.List) md.L2.Oneofs.List = append(md.L2.Oneofs.List, filedesc.Oneof{}) od := &md.L2.Oneofs.List[n] - od.L0.FullName = md.FullName().Append(pref.Name(tag)) + od.L0.FullName = md.FullName().Append(protoreflect.Name(tag)) od.L0.ParentFile = md.L0.ParentFile od.L0.Parent = md od.L0.Index = n @@ -267,14 +265,14 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.M return md } -func aberrantDeriveMessageName(t reflect.Type, name pref.FullName) pref.FullName { +func aberrantDeriveMessageName(t reflect.Type, name protoreflect.FullName) protoreflect.FullName { if name.IsValid() { return name } func() { defer func() { recover() }() // swallow possible nil panics if m, ok := reflect.Zero(t).Interface().(interface{ XXX_MessageName() string }); ok { - name = pref.FullName(m.XXX_MessageName()) + name = protoreflect.FullName(m.XXX_MessageName()) } }() if name.IsValid() { @@ -305,7 +303,7 @@ func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, fd.L0.Index = n if fd.L1.IsWeak || fd.L1.HasPacked { - fd.L1.Options = func() pref.ProtoMessage { + fd.L1.Options = func() protoreflect.ProtoMessage { opts := descopts.Field.ProtoReflect().New() if fd.L1.IsWeak { opts.Set(opts.Descriptor().Fields().ByName("weak"), protoreflect.ValueOfBool(true)) @@ -318,17 +316,17 @@ func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, } // Populate Enum and Message. - if fd.Enum() == nil && fd.Kind() == pref.EnumKind { + if fd.Enum() == nil && fd.Kind() == protoreflect.EnumKind { switch v := reflect.Zero(t).Interface().(type) { - case pref.Enum: + case protoreflect.Enum: fd.L1.Enum = v.Descriptor() default: fd.L1.Enum = LegacyLoadEnumDesc(t) } } - if fd.Message() == nil && (fd.Kind() == pref.MessageKind || fd.Kind() == pref.GroupKind) { + if fd.Message() == nil && (fd.Kind() == protoreflect.MessageKind || fd.Kind() == protoreflect.GroupKind) { switch v := reflect.Zero(t).Interface().(type) { - case pref.ProtoMessage: + case protoreflect.ProtoMessage: fd.L1.Message = v.ProtoReflect().Descriptor() case messageV1: fd.L1.Message = LegacyLoadMessageDesc(t) @@ -337,13 +335,13 @@ func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, n := len(md.L1.Messages.List) md.L1.Messages.List = append(md.L1.Messages.List, filedesc.Message{L2: new(filedesc.MessageL2)}) md2 := &md.L1.Messages.List[n] - md2.L0.FullName = md.FullName().Append(pref.Name(strs.MapEntryName(string(fd.Name())))) + md2.L0.FullName = md.FullName().Append(protoreflect.Name(strs.MapEntryName(string(fd.Name())))) md2.L0.ParentFile = md.L0.ParentFile md2.L0.Parent = md md2.L0.Index = n md2.L1.IsMapEntry = true - md2.L2.Options = func() pref.ProtoMessage { + md2.L2.Options = func() protoreflect.ProtoMessage { opts := descopts.Message.ProtoReflect().New() opts.Set(opts.Descriptor().Fields().ByName("map_entry"), protoreflect.ValueOfBool(true)) return opts.Interface() @@ -364,8 +362,8 @@ type placeholderEnumValues struct { protoreflect.EnumValueDescriptors } -func (placeholderEnumValues) ByNumber(n pref.EnumNumber) pref.EnumValueDescriptor { - return filedesc.PlaceholderEnumValue(pref.FullName(fmt.Sprintf("UNKNOWN_%d", n))) +func (placeholderEnumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor { + return filedesc.PlaceholderEnumValue(protoreflect.FullName(fmt.Sprintf("UNKNOWN_%d", n))) } // legacyMarshaler is the proto.Marshaler interface superseded by protoiface.Methoder. @@ -383,7 +381,7 @@ type legacyMerger interface { Merge(protoiface.MessageV1) } -var aberrantProtoMethods = &piface.Methods{ +var aberrantProtoMethods = &protoiface.Methods{ Marshal: legacyMarshal, Unmarshal: legacyUnmarshal, Merge: legacyMerge, @@ -392,40 +390,40 @@ var aberrantProtoMethods = &piface.Methods{ // supports deterministic serialization or not, but this // preserves the v1 implementation's behavior of always // calling Marshal methods when present. - Flags: piface.SupportMarshalDeterministic, + Flags: protoiface.SupportMarshalDeterministic, } -func legacyMarshal(in piface.MarshalInput) (piface.MarshalOutput, error) { +func legacyMarshal(in protoiface.MarshalInput) (protoiface.MarshalOutput, error) { v := in.Message.(unwrapper).protoUnwrap() marshaler, ok := v.(legacyMarshaler) if !ok { - return piface.MarshalOutput{}, errors.New("%T does not implement Marshal", v) + return protoiface.MarshalOutput{}, errors.New("%T does not implement Marshal", v) } out, err := marshaler.Marshal() if in.Buf != nil { out = append(in.Buf, out...) } - return piface.MarshalOutput{ + return protoiface.MarshalOutput{ Buf: out, }, err } -func legacyUnmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutput, error) { +func legacyUnmarshal(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { v := in.Message.(unwrapper).protoUnwrap() unmarshaler, ok := v.(legacyUnmarshaler) if !ok { - return piface.UnmarshalOutput{}, errors.New("%T does not implement Unmarshal", v) + return protoiface.UnmarshalOutput{}, errors.New("%T does not implement Unmarshal", v) } - return piface.UnmarshalOutput{}, unmarshaler.Unmarshal(in.Buf) + return protoiface.UnmarshalOutput{}, unmarshaler.Unmarshal(in.Buf) } -func legacyMerge(in piface.MergeInput) piface.MergeOutput { +func legacyMerge(in protoiface.MergeInput) protoiface.MergeOutput { // Check whether this supports the legacy merger. dstv := in.Destination.(unwrapper).protoUnwrap() merger, ok := dstv.(legacyMerger) if ok { merger.Merge(Export{}.ProtoMessageV1Of(in.Source)) - return piface.MergeOutput{Flags: piface.MergeComplete} + return protoiface.MergeOutput{Flags: protoiface.MergeComplete} } // If legacy merger is unavailable, implement merge in terms of @@ -433,29 +431,29 @@ func legacyMerge(in piface.MergeInput) piface.MergeOutput { srcv := in.Source.(unwrapper).protoUnwrap() marshaler, ok := srcv.(legacyMarshaler) if !ok { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } dstv = in.Destination.(unwrapper).protoUnwrap() unmarshaler, ok := dstv.(legacyUnmarshaler) if !ok { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } if !in.Source.IsValid() { // Legacy Marshal methods may not function on nil messages. // Check for a typed nil source only after we confirm that // legacy Marshal/Unmarshal methods are present, for // consistency. - return piface.MergeOutput{Flags: piface.MergeComplete} + return protoiface.MergeOutput{Flags: protoiface.MergeComplete} } b, err := marshaler.Marshal() if err != nil { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } err = unmarshaler.Unmarshal(b) if err != nil { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } - return piface.MergeOutput{Flags: piface.MergeComplete} + return protoiface.MergeOutput{Flags: protoiface.MergeComplete} } // aberrantMessageType implements MessageType for all types other than pointer-to-struct. @@ -463,19 +461,19 @@ type aberrantMessageType struct { t reflect.Type } -func (mt aberrantMessageType) New() pref.Message { +func (mt aberrantMessageType) New() protoreflect.Message { if mt.t.Kind() == reflect.Ptr { return aberrantMessage{reflect.New(mt.t.Elem())} } return aberrantMessage{reflect.Zero(mt.t)} } -func (mt aberrantMessageType) Zero() pref.Message { +func (mt aberrantMessageType) Zero() protoreflect.Message { return aberrantMessage{reflect.Zero(mt.t)} } func (mt aberrantMessageType) GoType() reflect.Type { return mt.t } -func (mt aberrantMessageType) Descriptor() pref.MessageDescriptor { +func (mt aberrantMessageType) Descriptor() protoreflect.MessageDescriptor { return LegacyLoadMessageDesc(mt.t) } @@ -499,56 +497,56 @@ func (m aberrantMessage) Reset() { } } -func (m aberrantMessage) ProtoReflect() pref.Message { +func (m aberrantMessage) ProtoReflect() protoreflect.Message { return m } -func (m aberrantMessage) Descriptor() pref.MessageDescriptor { +func (m aberrantMessage) Descriptor() protoreflect.MessageDescriptor { return LegacyLoadMessageDesc(m.v.Type()) } -func (m aberrantMessage) Type() pref.MessageType { +func (m aberrantMessage) Type() protoreflect.MessageType { return aberrantMessageType{m.v.Type()} } -func (m aberrantMessage) New() pref.Message { +func (m aberrantMessage) New() protoreflect.Message { if m.v.Type().Kind() == reflect.Ptr { return aberrantMessage{reflect.New(m.v.Type().Elem())} } return aberrantMessage{reflect.Zero(m.v.Type())} } -func (m aberrantMessage) Interface() pref.ProtoMessage { +func (m aberrantMessage) Interface() protoreflect.ProtoMessage { return m } -func (m aberrantMessage) Range(f func(pref.FieldDescriptor, pref.Value) bool) { +func (m aberrantMessage) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { return } -func (m aberrantMessage) Has(pref.FieldDescriptor) bool { +func (m aberrantMessage) Has(protoreflect.FieldDescriptor) bool { return false } -func (m aberrantMessage) Clear(pref.FieldDescriptor) { +func (m aberrantMessage) Clear(protoreflect.FieldDescriptor) { panic("invalid Message.Clear on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) Get(fd pref.FieldDescriptor) pref.Value { +func (m aberrantMessage) Get(fd protoreflect.FieldDescriptor) protoreflect.Value { if fd.Default().IsValid() { return fd.Default() } panic("invalid Message.Get on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) Set(pref.FieldDescriptor, pref.Value) { +func (m aberrantMessage) Set(protoreflect.FieldDescriptor, protoreflect.Value) { panic("invalid Message.Set on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) Mutable(pref.FieldDescriptor) pref.Value { +func (m aberrantMessage) Mutable(protoreflect.FieldDescriptor) protoreflect.Value { panic("invalid Message.Mutable on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) NewField(pref.FieldDescriptor) pref.Value { +func (m aberrantMessage) NewField(protoreflect.FieldDescriptor) protoreflect.Value { panic("invalid Message.NewField on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) WhichOneof(pref.OneofDescriptor) pref.FieldDescriptor { +func (m aberrantMessage) WhichOneof(protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { panic("invalid Message.WhichOneof descriptor on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) GetUnknown() pref.RawFields { +func (m aberrantMessage) GetUnknown() protoreflect.RawFields { return nil } -func (m aberrantMessage) SetUnknown(pref.RawFields) { +func (m aberrantMessage) SetUnknown(protoreflect.RawFields) { // SetUnknown discards its input on messages which don't support unknown field storage. } func (m aberrantMessage) IsValid() bool { @@ -557,7 +555,7 @@ func (m aberrantMessage) IsValid() bool { } return false } -func (m aberrantMessage) ProtoMethods() *piface.Methods { +func (m aberrantMessage) ProtoMethods() *protoiface.Methods { return aberrantProtoMethods } func (m aberrantMessage) protoUnwrap() interface{} { diff --git a/vendor/google.golang.org/protobuf/internal/impl/merge.go b/vendor/google.golang.org/protobuf/internal/impl/merge.go index c65bbc044..7e65f64f2 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/merge.go +++ b/vendor/google.golang.org/protobuf/internal/impl/merge.go @@ -9,8 +9,8 @@ import ( "reflect" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) type mergeOptions struct{} @@ -20,17 +20,17 @@ func (o mergeOptions) Merge(dst, src proto.Message) { } // merge is protoreflect.Methods.Merge. -func (mi *MessageInfo) merge(in piface.MergeInput) piface.MergeOutput { +func (mi *MessageInfo) merge(in protoiface.MergeInput) protoiface.MergeOutput { dp, ok := mi.getPointer(in.Destination) if !ok { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } sp, ok := mi.getPointer(in.Source) if !ok { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } mi.mergePointer(dp, sp, mergeOptions{}) - return piface.MergeOutput{Flags: piface.MergeComplete} + return protoiface.MergeOutput{Flags: protoiface.MergeComplete} } func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { @@ -64,7 +64,7 @@ func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { continue } dx := (*dext)[num] - var dv pref.Value + var dv protoreflect.Value if dx.Type() == sx.Type() { dv = dx.Value() } @@ -85,15 +85,15 @@ func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { } } -func mergeScalarValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeScalarValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { return src } -func mergeBytesValue(dst, src pref.Value, opts mergeOptions) pref.Value { - return pref.ValueOfBytes(append(emptyBuf[:], src.Bytes()...)) +func mergeBytesValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { + return protoreflect.ValueOfBytes(append(emptyBuf[:], src.Bytes()...)) } -func mergeListValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { dstl := dst.List() srcl := src.List() for i, llen := 0, srcl.Len(); i < llen; i++ { @@ -102,29 +102,29 @@ func mergeListValue(dst, src pref.Value, opts mergeOptions) pref.Value { return dst } -func mergeBytesListValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeBytesListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { dstl := dst.List() srcl := src.List() for i, llen := 0, srcl.Len(); i < llen; i++ { sb := srcl.Get(i).Bytes() db := append(emptyBuf[:], sb...) - dstl.Append(pref.ValueOfBytes(db)) + dstl.Append(protoreflect.ValueOfBytes(db)) } return dst } -func mergeMessageListValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeMessageListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { dstl := dst.List() srcl := src.List() for i, llen := 0, srcl.Len(); i < llen; i++ { sm := srcl.Get(i).Message() dm := proto.Clone(sm.Interface()).ProtoReflect() - dstl.Append(pref.ValueOfMessage(dm)) + dstl.Append(protoreflect.ValueOfMessage(dm)) } return dst } -func mergeMessageValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeMessageValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { opts.Merge(dst.Message().Interface(), src.Message().Interface()) return dst } diff --git a/vendor/google.golang.org/protobuf/internal/impl/message.go b/vendor/google.golang.org/protobuf/internal/impl/message.go index a104e28e8..4f5fb67a0 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message.go @@ -14,8 +14,7 @@ import ( "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoregistry" ) // MessageInfo provides protobuf related functionality for a given Go type @@ -29,7 +28,7 @@ type MessageInfo struct { GoReflectType reflect.Type // pointer to struct // Desc is the underlying message descriptor type and must be populated. - Desc pref.MessageDescriptor + Desc protoreflect.MessageDescriptor // Exporter must be provided in a purego environment in order to provide // access to unexported fields. @@ -54,7 +53,7 @@ type exporter func(v interface{}, i int) interface{} // is generated by our implementation of protoc-gen-go (for v2 and on). // If it is unable to obtain a MessageInfo, it returns nil. func getMessageInfo(mt reflect.Type) *MessageInfo { - m, ok := reflect.Zero(mt).Interface().(pref.ProtoMessage) + m, ok := reflect.Zero(mt).Interface().(protoreflect.ProtoMessage) if !ok { return nil } @@ -97,7 +96,7 @@ func (mi *MessageInfo) initOnce() { // getPointer returns the pointer for a message, which should be of // the type of the MessageInfo. If the message is of a different type, // it returns ok==false. -func (mi *MessageInfo) getPointer(m pref.Message) (p pointer, ok bool) { +func (mi *MessageInfo) getPointer(m protoreflect.Message) (p pointer, ok bool) { switch m := m.(type) { case *messageState: return m.pointer(), m.messageInfo() == mi @@ -134,10 +133,10 @@ type structInfo struct { extensionOffset offset extensionType reflect.Type - fieldsByNumber map[pref.FieldNumber]reflect.StructField - oneofsByName map[pref.Name]reflect.StructField - oneofWrappersByType map[reflect.Type]pref.FieldNumber - oneofWrappersByNumber map[pref.FieldNumber]reflect.Type + fieldsByNumber map[protoreflect.FieldNumber]reflect.StructField + oneofsByName map[protoreflect.Name]reflect.StructField + oneofWrappersByType map[reflect.Type]protoreflect.FieldNumber + oneofWrappersByNumber map[protoreflect.FieldNumber]reflect.Type } func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo { @@ -147,10 +146,10 @@ func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo { unknownOffset: invalidOffset, extensionOffset: invalidOffset, - fieldsByNumber: map[pref.FieldNumber]reflect.StructField{}, - oneofsByName: map[pref.Name]reflect.StructField{}, - oneofWrappersByType: map[reflect.Type]pref.FieldNumber{}, - oneofWrappersByNumber: map[pref.FieldNumber]reflect.Type{}, + fieldsByNumber: map[protoreflect.FieldNumber]reflect.StructField{}, + oneofsByName: map[protoreflect.Name]reflect.StructField{}, + oneofWrappersByType: map[reflect.Type]protoreflect.FieldNumber{}, + oneofWrappersByNumber: map[protoreflect.FieldNumber]reflect.Type{}, } fieldLoop: @@ -180,12 +179,12 @@ fieldLoop: for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") { if len(s) > 0 && strings.Trim(s, "0123456789") == "" { n, _ := strconv.ParseUint(s, 10, 64) - si.fieldsByNumber[pref.FieldNumber(n)] = f + si.fieldsByNumber[protoreflect.FieldNumber(n)] = f continue fieldLoop } } if s := f.Tag.Get("protobuf_oneof"); len(s) > 0 { - si.oneofsByName[pref.Name(s)] = f + si.oneofsByName[protoreflect.Name(s)] = f continue fieldLoop } } @@ -208,8 +207,8 @@ fieldLoop: for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") { if len(s) > 0 && strings.Trim(s, "0123456789") == "" { n, _ := strconv.ParseUint(s, 10, 64) - si.oneofWrappersByType[tf] = pref.FieldNumber(n) - si.oneofWrappersByNumber[pref.FieldNumber(n)] = tf + si.oneofWrappersByType[tf] = protoreflect.FieldNumber(n) + si.oneofWrappersByNumber[protoreflect.FieldNumber(n)] = tf break } } @@ -219,7 +218,11 @@ fieldLoop: } func (mi *MessageInfo) New() protoreflect.Message { - return mi.MessageOf(reflect.New(mi.GoReflectType.Elem()).Interface()) + m := reflect.New(mi.GoReflectType.Elem()).Interface() + if r, ok := m.(protoreflect.ProtoMessage); ok { + return r.ProtoReflect() + } + return mi.MessageOf(m) } func (mi *MessageInfo) Zero() protoreflect.Message { return mi.MessageOf(reflect.Zero(mi.GoReflectType).Interface()) @@ -237,7 +240,7 @@ func (mi *MessageInfo) Message(i int) protoreflect.MessageType { fd := mi.Desc.Fields().Get(i) switch { case fd.IsWeak(): - mt, _ := preg.GlobalTypes.FindMessageByName(fd.Message().FullName()) + mt, _ := protoregistry.GlobalTypes.FindMessageByName(fd.Message().FullName()) return mt case fd.IsMap(): return mapEntryType{fd.Message(), mi.fieldTypes[fd.Number()]} diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go index 9488b7261..d9ea010be 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go @@ -10,17 +10,17 @@ import ( "google.golang.org/protobuf/internal/detrand" "google.golang.org/protobuf/internal/pragma" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type reflectMessageInfo struct { - fields map[pref.FieldNumber]*fieldInfo - oneofs map[pref.Name]*oneofInfo + fields map[protoreflect.FieldNumber]*fieldInfo + oneofs map[protoreflect.Name]*oneofInfo // fieldTypes contains the zero value of an enum or message field. // For lists, it contains the element type. // For maps, it contains the entry value type. - fieldTypes map[pref.FieldNumber]interface{} + fieldTypes map[protoreflect.FieldNumber]interface{} // denseFields is a subset of fields where: // 0 < fieldDesc.Number() < len(denseFields) @@ -30,8 +30,8 @@ type reflectMessageInfo struct { // rangeInfos is a list of all fields (not belonging to a oneof) and oneofs. rangeInfos []interface{} // either *fieldInfo or *oneofInfo - getUnknown func(pointer) pref.RawFields - setUnknown func(pointer, pref.RawFields) + getUnknown func(pointer) protoreflect.RawFields + setUnknown func(pointer, protoreflect.RawFields) extensionMap func(pointer) *extensionMap nilMessage atomicNilMessage @@ -52,7 +52,7 @@ func (mi *MessageInfo) makeReflectFuncs(t reflect.Type, si structInfo) { // This code assumes that the struct is well-formed and panics if there are // any discrepancies. func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) { - mi.fields = map[pref.FieldNumber]*fieldInfo{} + mi.fields = map[protoreflect.FieldNumber]*fieldInfo{} md := mi.Desc fds := md.Fields() for i := 0; i < fds.Len(); i++ { @@ -82,7 +82,7 @@ func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) { mi.fields[fd.Number()] = &fi } - mi.oneofs = map[pref.Name]*oneofInfo{} + mi.oneofs = map[protoreflect.Name]*oneofInfo{} for i := 0; i < md.Oneofs().Len(); i++ { od := md.Oneofs().Get(i) mi.oneofs[od.Name()] = makeOneofInfo(od, si, mi.Exporter) @@ -117,13 +117,13 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { switch { case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsAType: // Handle as []byte. - mi.getUnknown = func(p pointer) pref.RawFields { + mi.getUnknown = func(p pointer) protoreflect.RawFields { if p.IsNil() { return nil } return *p.Apply(mi.unknownOffset).Bytes() } - mi.setUnknown = func(p pointer, b pref.RawFields) { + mi.setUnknown = func(p pointer, b protoreflect.RawFields) { if p.IsNil() { panic("invalid SetUnknown on nil Message") } @@ -131,7 +131,7 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { } case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsBType: // Handle as *[]byte. - mi.getUnknown = func(p pointer) pref.RawFields { + mi.getUnknown = func(p pointer) protoreflect.RawFields { if p.IsNil() { return nil } @@ -141,7 +141,7 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { } return **bp } - mi.setUnknown = func(p pointer, b pref.RawFields) { + mi.setUnknown = func(p pointer, b protoreflect.RawFields) { if p.IsNil() { panic("invalid SetUnknown on nil Message") } @@ -152,10 +152,10 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { **bp = b } default: - mi.getUnknown = func(pointer) pref.RawFields { + mi.getUnknown = func(pointer) protoreflect.RawFields { return nil } - mi.setUnknown = func(p pointer, _ pref.RawFields) { + mi.setUnknown = func(p pointer, _ protoreflect.RawFields) { if p.IsNil() { panic("invalid SetUnknown on nil Message") } @@ -224,7 +224,7 @@ func (mi *MessageInfo) makeFieldTypes(si structInfo) { } if ft != nil { if mi.fieldTypes == nil { - mi.fieldTypes = make(map[pref.FieldNumber]interface{}) + mi.fieldTypes = make(map[protoreflect.FieldNumber]interface{}) } mi.fieldTypes[fd.Number()] = reflect.Zero(ft).Interface() } @@ -233,7 +233,7 @@ func (mi *MessageInfo) makeFieldTypes(si structInfo) { type extensionMap map[int32]ExtensionField -func (m *extensionMap) Range(f func(pref.FieldDescriptor, pref.Value) bool) { +func (m *extensionMap) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { if m != nil { for _, x := range *m { xd := x.Type().TypeDescriptor() @@ -247,7 +247,7 @@ func (m *extensionMap) Range(f func(pref.FieldDescriptor, pref.Value) bool) { } } } -func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) { +func (m *extensionMap) Has(xt protoreflect.ExtensionType) (ok bool) { if m == nil { return false } @@ -266,10 +266,10 @@ func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) { } return true } -func (m *extensionMap) Clear(xt pref.ExtensionType) { +func (m *extensionMap) Clear(xt protoreflect.ExtensionType) { delete(*m, int32(xt.TypeDescriptor().Number())) } -func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value { +func (m *extensionMap) Get(xt protoreflect.ExtensionType) protoreflect.Value { xd := xt.TypeDescriptor() if m != nil { if x, ok := (*m)[int32(xd.Number())]; ok { @@ -278,7 +278,7 @@ func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value { } return xt.Zero() } -func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) { +func (m *extensionMap) Set(xt protoreflect.ExtensionType, v protoreflect.Value) { xd := xt.TypeDescriptor() isValid := true switch { @@ -302,9 +302,9 @@ func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) { x.Set(xt, v) (*m)[int32(xd.Number())] = x } -func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { +func (m *extensionMap) Mutable(xt protoreflect.ExtensionType) protoreflect.Value { xd := xt.TypeDescriptor() - if xd.Kind() != pref.MessageKind && xd.Kind() != pref.GroupKind && !xd.IsList() && !xd.IsMap() { + if xd.Kind() != protoreflect.MessageKind && xd.Kind() != protoreflect.GroupKind && !xd.IsList() && !xd.IsMap() { panic("invalid Mutable on field with non-composite type") } if x, ok := (*m)[int32(xd.Number())]; ok { @@ -320,7 +320,6 @@ func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { // in an allocation-free way without needing to have a shadow Go type generated // for every message type. This technique only works using unsafe. // -// // Example generated code: // // type M struct { @@ -351,12 +350,11 @@ func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { // It has access to the message info as its first field, and a pointer to the // MessageState is identical to a pointer to the concrete message value. // -// // Requirements: -// • The type M must implement protoreflect.ProtoMessage. -// • The address of m must not be nil. -// • The address of m and the address of m.state must be equal, -// even though they are different Go types. +// - The type M must implement protoreflect.ProtoMessage. +// - The address of m must not be nil. +// - The address of m and the address of m.state must be equal, +// even though they are different Go types. type MessageState struct { pragma.NoUnkeyedLiterals pragma.DoNotCompare @@ -368,8 +366,8 @@ type MessageState struct { type messageState MessageState var ( - _ pref.Message = (*messageState)(nil) - _ unwrapper = (*messageState)(nil) + _ protoreflect.Message = (*messageState)(nil) + _ unwrapper = (*messageState)(nil) ) // messageDataType is a tuple of a pointer to the message data and @@ -387,16 +385,16 @@ type ( ) var ( - _ pref.Message = (*messageReflectWrapper)(nil) - _ unwrapper = (*messageReflectWrapper)(nil) - _ pref.ProtoMessage = (*messageIfaceWrapper)(nil) - _ unwrapper = (*messageIfaceWrapper)(nil) + _ protoreflect.Message = (*messageReflectWrapper)(nil) + _ unwrapper = (*messageReflectWrapper)(nil) + _ protoreflect.ProtoMessage = (*messageIfaceWrapper)(nil) + _ unwrapper = (*messageIfaceWrapper)(nil) ) // MessageOf returns a reflective view over a message. The input must be a // pointer to a named Go struct. If the provided type has a ProtoReflect method, // it must be implemented by calling this method. -func (mi *MessageInfo) MessageOf(m interface{}) pref.Message { +func (mi *MessageInfo) MessageOf(m interface{}) protoreflect.Message { if reflect.TypeOf(m) != mi.GoReflectType { panic(fmt.Sprintf("type mismatch: got %T, want %v", m, mi.GoReflectType)) } @@ -421,7 +419,7 @@ func (m *messageIfaceWrapper) Reset() { rv.Elem().Set(reflect.Zero(rv.Type().Elem())) } } -func (m *messageIfaceWrapper) ProtoReflect() pref.Message { +func (m *messageIfaceWrapper) ProtoReflect() protoreflect.Message { return (*messageReflectWrapper)(m) } func (m *messageIfaceWrapper) protoUnwrap() interface{} { @@ -430,7 +428,7 @@ func (m *messageIfaceWrapper) protoUnwrap() interface{} { // checkField verifies that the provided field descriptor is valid. // Exactly one of the returned values is populated. -func (mi *MessageInfo) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.ExtensionType) { +func (mi *MessageInfo) checkField(fd protoreflect.FieldDescriptor) (*fieldInfo, protoreflect.ExtensionType) { var fi *fieldInfo if n := fd.Number(); 0 < n && int(n) < len(mi.denseFields) { fi = mi.denseFields[n] @@ -455,7 +453,7 @@ func (mi *MessageInfo) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.Ext if !mi.Desc.ExtensionRanges().Has(fd.Number()) { panic(fmt.Sprintf("extension %v extends %v outside the extension range", fd.FullName(), mi.Desc.FullName())) } - xtd, ok := fd.(pref.ExtensionTypeDescriptor) + xtd, ok := fd.(protoreflect.ExtensionTypeDescriptor) if !ok { panic(fmt.Sprintf("extension %v does not implement protoreflect.ExtensionTypeDescriptor", fd.FullName())) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go index 343cf8721..5e736c60e 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go @@ -11,24 +11,24 @@ import ( "sync" "google.golang.org/protobuf/internal/flags" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" ) type fieldInfo struct { - fieldDesc pref.FieldDescriptor + fieldDesc protoreflect.FieldDescriptor // These fields are used for protobuf reflection support. has func(pointer) bool clear func(pointer) - get func(pointer) pref.Value - set func(pointer, pref.Value) - mutable func(pointer) pref.Value - newMessage func() pref.Message - newField func() pref.Value + get func(pointer) protoreflect.Value + set func(pointer, protoreflect.Value) + mutable func(pointer) protoreflect.Value + newMessage func() protoreflect.Message + newField func() protoreflect.Value } -func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { +func fieldInfoForMissing(fd protoreflect.FieldDescriptor) fieldInfo { // This never occurs for generated message types. // It implies that a hand-crafted type has missing Go fields // for specific protobuf message fields. @@ -40,19 +40,19 @@ func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { clear: func(p pointer) { panic("missing Go struct field for " + string(fd.FullName())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { return fd.Default() }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { panic("missing Go struct field for " + string(fd.FullName())) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { panic("missing Go struct field for " + string(fd.FullName())) }, - newMessage: func() pref.Message { + newMessage: func() protoreflect.Message { panic("missing Go struct field for " + string(fd.FullName())) }, - newField: func() pref.Value { + newField: func() protoreflect.Value { if v := fd.Default(); v.IsValid() { return v } @@ -61,7 +61,7 @@ func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { } } -func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x exporter, ot reflect.Type) fieldInfo { +func fieldInfoForOneof(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter, ot reflect.Type) fieldInfo { ft := fs.Type if ft.Kind() != reflect.Interface { panic(fmt.Sprintf("field %v has invalid type: got %v, want interface kind", fd.FullName(), ft)) @@ -102,7 +102,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export } rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } @@ -113,7 +113,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export rv = rv.Elem().Elem().Field(0) return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() { rv.Set(reflect.New(ot)) @@ -121,7 +121,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export rv = rv.Elem().Elem().Field(0) rv.Set(conv.GoValueOf(v)) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { if !isMessage { panic(fmt.Sprintf("field %v with invalid Mutable call on field with non-composite type", fd.FullName())) } @@ -131,20 +131,20 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export } rv = rv.Elem().Elem().Field(0) if rv.Kind() == reflect.Ptr && rv.IsNil() { - rv.Set(conv.GoValueOf(pref.ValueOfMessage(conv.New().Message()))) + rv.Set(conv.GoValueOf(protoreflect.ValueOfMessage(conv.New().Message()))) } return conv.PBValueOf(rv) }, - newMessage: func() pref.Message { + newMessage: func() protoreflect.Message { return conv.New().Message() }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } } -func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { +func fieldInfoForMap(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type if ft.Kind() != reflect.Map { panic(fmt.Sprintf("field %v has invalid type: got %v, want map kind", fd.FullName(), ft)) @@ -166,7 +166,7 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } @@ -176,7 +176,7 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter } return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() pv := conv.GoValueOf(v) if pv.IsNil() { @@ -184,20 +184,20 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter } rv.Set(pv) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { v := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if v.IsNil() { v.Set(reflect.MakeMap(fs.Type)) } return conv.PBValueOf(v) }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } } -func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { +func fieldInfoForList(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type if ft.Kind() != reflect.Slice { panic(fmt.Sprintf("field %v has invalid type: got %v, want slice kind", fd.FullName(), ft)) @@ -219,7 +219,7 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } @@ -229,7 +229,7 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte } return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() pv := conv.GoValueOf(v) if pv.IsNil() { @@ -237,11 +237,11 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte } rv.Set(pv.Elem()) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { v := p.Apply(fieldOffset).AsValueOf(fs.Type) return conv.PBValueOf(v) }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } @@ -252,7 +252,7 @@ var ( emptyBytes = reflect.ValueOf([]byte{}) ) -func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { +func fieldInfoForScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type nullable := fd.HasPresence() isBytes := ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 @@ -300,7 +300,7 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } @@ -315,7 +315,7 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor } return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if nullable && rv.Kind() == reflect.Ptr { if rv.IsNil() { @@ -332,23 +332,23 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor } } }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } } -func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldInfo { +func fieldInfoForWeakMessage(fd protoreflect.FieldDescriptor, weakOffset offset) fieldInfo { if !flags.ProtoLegacy { panic("no support for proto1 weak fields") } var once sync.Once - var messageType pref.MessageType + var messageType protoreflect.MessageType lazyInit := func() { once.Do(func() { messageName := fd.Message().FullName() - messageType, _ = preg.GlobalTypes.FindMessageByName(messageName) + messageType, _ = protoregistry.GlobalTypes.FindMessageByName(messageName) if messageType == nil { panic(fmt.Sprintf("weak message %v for field %v is not linked in", messageName, fd.FullName())) } @@ -368,18 +368,18 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn clear: func(p pointer) { p.Apply(weakOffset).WeakFields().clear(num) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { lazyInit() if p.IsNil() { - return pref.ValueOfMessage(messageType.Zero()) + return protoreflect.ValueOfMessage(messageType.Zero()) } m, ok := p.Apply(weakOffset).WeakFields().get(num) if !ok { - return pref.ValueOfMessage(messageType.Zero()) + return protoreflect.ValueOfMessage(messageType.Zero()) } - return pref.ValueOfMessage(m.ProtoReflect()) + return protoreflect.ValueOfMessage(m.ProtoReflect()) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { lazyInit() m := v.Message() if m.Descriptor() != messageType.Descriptor() { @@ -390,7 +390,7 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn } p.Apply(weakOffset).WeakFields().set(num, m.Interface()) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { lazyInit() fs := p.Apply(weakOffset).WeakFields() m, ok := fs.get(num) @@ -398,20 +398,20 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn m = messageType.New().Interface() fs.set(num, m) } - return pref.ValueOfMessage(m.ProtoReflect()) + return protoreflect.ValueOfMessage(m.ProtoReflect()) }, - newMessage: func() pref.Message { + newMessage: func() protoreflect.Message { lazyInit() return messageType.New() }, - newField: func() pref.Value { + newField: func() protoreflect.Value { lazyInit() - return pref.ValueOfMessage(messageType.New()) + return protoreflect.ValueOfMessage(messageType.New()) }, } } -func fieldInfoForMessage(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { +func fieldInfoForMessage(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type conv := NewConverter(ft, fd) @@ -433,47 +433,47 @@ func fieldInfoForMessage(fd pref.FieldDescriptor, fs reflect.StructField, x expo rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(conv.GoValueOf(v)) if fs.Type.Kind() == reflect.Ptr && rv.IsNil() { panic(fmt.Sprintf("field %v has invalid nil pointer", fd.FullName())) } }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if fs.Type.Kind() == reflect.Ptr && rv.IsNil() { rv.Set(conv.GoValueOf(conv.New())) } return conv.PBValueOf(rv) }, - newMessage: func() pref.Message { + newMessage: func() protoreflect.Message { return conv.New().Message() }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } } type oneofInfo struct { - oneofDesc pref.OneofDescriptor - which func(pointer) pref.FieldNumber + oneofDesc protoreflect.OneofDescriptor + which func(pointer) protoreflect.FieldNumber } -func makeOneofInfo(od pref.OneofDescriptor, si structInfo, x exporter) *oneofInfo { +func makeOneofInfo(od protoreflect.OneofDescriptor, si structInfo, x exporter) *oneofInfo { oi := &oneofInfo{oneofDesc: od} if od.IsSynthetic() { fs := si.fieldsByNumber[od.Fields().Get(0).Number()] fieldOffset := offsetOf(fs, x) - oi.which = func(p pointer) pref.FieldNumber { + oi.which = func(p pointer) protoreflect.FieldNumber { if p.IsNil() { return 0 } @@ -486,7 +486,7 @@ func makeOneofInfo(od pref.OneofDescriptor, si structInfo, x exporter) *oneofInf } else { fs := si.oneofsByName[od.Name()] fieldOffset := offsetOf(fs, x) - oi.which = func(p pointer) pref.FieldNumber { + oi.which = func(p pointer) protoreflect.FieldNumber { if p.IsNil() { return 0 } diff --git a/vendor/google.golang.org/protobuf/internal/impl/validate.go b/vendor/google.golang.org/protobuf/internal/impl/validate.go index 08cfb6054..a24e6bbd7 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/validate.go +++ b/vendor/google.golang.org/protobuf/internal/impl/validate.go @@ -16,9 +16,9 @@ import ( "google.golang.org/protobuf/internal/flags" "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/runtime/protoiface" ) // ValidationStatus is the result of validating the wire-format encoding of a message. @@ -56,20 +56,20 @@ func (v ValidationStatus) String() string { // of the message type. // // This function is exposed for testing. -func Validate(mt pref.MessageType, in piface.UnmarshalInput) (out piface.UnmarshalOutput, _ ValidationStatus) { +func Validate(mt protoreflect.MessageType, in protoiface.UnmarshalInput) (out protoiface.UnmarshalOutput, _ ValidationStatus) { mi, ok := mt.(*MessageInfo) if !ok { return out, ValidationUnknown } if in.Resolver == nil { - in.Resolver = preg.GlobalTypes + in.Resolver = protoregistry.GlobalTypes } o, st := mi.validate(in.Buf, 0, unmarshalOptions{ flags: in.Flags, resolver: in.Resolver, }) if o.initialized { - out.Flags |= piface.UnmarshalInitialized + out.Flags |= protoiface.UnmarshalInitialized } return out, st } @@ -106,22 +106,22 @@ const ( validationTypeMessageSetItem ) -func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescriptor, ft reflect.Type) validationInfo { +func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd protoreflect.FieldDescriptor, ft reflect.Type) validationInfo { var vi validationInfo switch { case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic(): switch fd.Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: vi.typ = validationTypeMessage if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok { vi.mi = getMessageInfo(ot.Field(0).Type) } - case pref.GroupKind: + case protoreflect.GroupKind: vi.typ = validationTypeGroup if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok { vi.mi = getMessageInfo(ot.Field(0).Type) } - case pref.StringKind: + case protoreflect.StringKind: if strs.EnforceUTF8(fd) { vi.typ = validationTypeUTF8String } @@ -129,7 +129,7 @@ func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescrip default: vi = newValidationInfo(fd, ft) } - if fd.Cardinality() == pref.Required { + if fd.Cardinality() == protoreflect.Required { // Avoid overflow. The required field check is done with a 64-bit mask, with // any message containing more than 64 required fields always reported as // potentially uninitialized, so it is not important to get a precise count @@ -142,22 +142,22 @@ func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescrip return vi } -func newValidationInfo(fd pref.FieldDescriptor, ft reflect.Type) validationInfo { +func newValidationInfo(fd protoreflect.FieldDescriptor, ft reflect.Type) validationInfo { var vi validationInfo switch { case fd.IsList(): switch fd.Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: vi.typ = validationTypeMessage if ft.Kind() == reflect.Slice { vi.mi = getMessageInfo(ft.Elem()) } - case pref.GroupKind: + case protoreflect.GroupKind: vi.typ = validationTypeGroup if ft.Kind() == reflect.Slice { vi.mi = getMessageInfo(ft.Elem()) } - case pref.StringKind: + case protoreflect.StringKind: vi.typ = validationTypeBytes if strs.EnforceUTF8(fd) { vi.typ = validationTypeUTF8String @@ -175,33 +175,33 @@ func newValidationInfo(fd pref.FieldDescriptor, ft reflect.Type) validationInfo case fd.IsMap(): vi.typ = validationTypeMap switch fd.MapKey().Kind() { - case pref.StringKind: + case protoreflect.StringKind: if strs.EnforceUTF8(fd) { vi.keyType = validationTypeUTF8String } } switch fd.MapValue().Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: vi.valType = validationTypeMessage if ft.Kind() == reflect.Map { vi.mi = getMessageInfo(ft.Elem()) } - case pref.StringKind: + case protoreflect.StringKind: if strs.EnforceUTF8(fd) { vi.valType = validationTypeUTF8String } } default: switch fd.Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: vi.typ = validationTypeMessage if !fd.IsWeak() { vi.mi = getMessageInfo(ft) } - case pref.GroupKind: + case protoreflect.GroupKind: vi.typ = validationTypeGroup vi.mi = getMessageInfo(ft) - case pref.StringKind: + case protoreflect.StringKind: vi.typ = validationTypeBytes if strs.EnforceUTF8(fd) { vi.typ = validationTypeUTF8String @@ -314,11 +314,11 @@ State: break } messageName := fd.Message().FullName() - messageType, err := preg.GlobalTypes.FindMessageByName(messageName) + messageType, err := protoregistry.GlobalTypes.FindMessageByName(messageName) switch err { case nil: vi.mi, _ = messageType.(*MessageInfo) - case preg.NotFound: + case protoregistry.NotFound: vi.typ = validationTypeBytes default: return out, ValidationUnknown @@ -335,7 +335,7 @@ State: // unmarshaling to begin failing. Supporting this requires some way to // determine if the resolver is frozen. xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), num) - if err != nil && err != preg.NotFound { + if err != nil && err != protoregistry.NotFound { return out, ValidationUnknown } if err == nil { @@ -513,7 +513,7 @@ State: } xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), typeid) switch { - case err == preg.NotFound: + case err == protoregistry.NotFound: b = b[n:] case err != nil: return out, ValidationUnknown diff --git a/vendor/google.golang.org/protobuf/internal/impl/weak.go b/vendor/google.golang.org/protobuf/internal/impl/weak.go index 009cbefd1..eb79a7ba9 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/weak.go +++ b/vendor/google.golang.org/protobuf/internal/impl/weak.go @@ -7,7 +7,7 @@ package impl import ( "fmt" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -17,32 +17,32 @@ import ( // defined directly on it. type weakFields WeakFields -func (w weakFields) get(num pref.FieldNumber) (pref.ProtoMessage, bool) { +func (w weakFields) get(num protoreflect.FieldNumber) (protoreflect.ProtoMessage, bool) { m, ok := w[int32(num)] return m, ok } -func (w *weakFields) set(num pref.FieldNumber, m pref.ProtoMessage) { +func (w *weakFields) set(num protoreflect.FieldNumber, m protoreflect.ProtoMessage) { if *w == nil { *w = make(weakFields) } (*w)[int32(num)] = m } -func (w *weakFields) clear(num pref.FieldNumber) { +func (w *weakFields) clear(num protoreflect.FieldNumber) { delete(*w, int32(num)) } -func (Export) HasWeak(w WeakFields, num pref.FieldNumber) bool { +func (Export) HasWeak(w WeakFields, num protoreflect.FieldNumber) bool { _, ok := w[int32(num)] return ok } -func (Export) ClearWeak(w *WeakFields, num pref.FieldNumber) { +func (Export) ClearWeak(w *WeakFields, num protoreflect.FieldNumber) { delete(*w, int32(num)) } -func (Export) GetWeak(w WeakFields, num pref.FieldNumber, name pref.FullName) pref.ProtoMessage { +func (Export) GetWeak(w WeakFields, num protoreflect.FieldNumber, name protoreflect.FullName) protoreflect.ProtoMessage { if m, ok := w[int32(num)]; ok { return m } @@ -53,7 +53,7 @@ func (Export) GetWeak(w WeakFields, num pref.FieldNumber, name pref.FullName) pr return mt.Zero().Interface() } -func (Export) SetWeak(w *WeakFields, num pref.FieldNumber, name pref.FullName, m pref.ProtoMessage) { +func (Export) SetWeak(w *WeakFields, num protoreflect.FieldNumber, name protoreflect.FullName, m protoreflect.ProtoMessage) { if m != nil { mt, _ := protoregistry.GlobalTypes.FindMessageByName(name) if mt == nil { diff --git a/vendor/google.golang.org/protobuf/internal/order/order.go b/vendor/google.golang.org/protobuf/internal/order/order.go index 2a24953f6..33745ed06 100644 --- a/vendor/google.golang.org/protobuf/internal/order/order.go +++ b/vendor/google.golang.org/protobuf/internal/order/order.go @@ -5,12 +5,12 @@ package order import ( - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // FieldOrder specifies the ordering to visit message fields. // It is a function that reports whether x is ordered before y. -type FieldOrder func(x, y pref.FieldDescriptor) bool +type FieldOrder func(x, y protoreflect.FieldDescriptor) bool var ( // AnyFieldOrder specifies no specific field ordering. @@ -18,9 +18,9 @@ var ( // LegacyFieldOrder sorts fields in the same ordering as emitted by // wire serialization in the github.com/golang/protobuf implementation. - LegacyFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { + LegacyFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool { ox, oy := x.ContainingOneof(), y.ContainingOneof() - inOneof := func(od pref.OneofDescriptor) bool { + inOneof := func(od protoreflect.OneofDescriptor) bool { return od != nil && !od.IsSynthetic() } @@ -41,14 +41,14 @@ var ( } // NumberFieldOrder sorts fields by their field number. - NumberFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { + NumberFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool { return x.Number() < y.Number() } // IndexNameFieldOrder sorts non-extension fields before extension fields. // Non-extensions are sorted according to their declaration index. // Extensions are sorted according to their full name. - IndexNameFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { + IndexNameFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool { // Non-extension fields sort before extension fields. if x.IsExtension() != y.IsExtension() { return !x.IsExtension() && y.IsExtension() @@ -64,7 +64,7 @@ var ( // KeyOrder specifies the ordering to visit map entries. // It is a function that reports whether x is ordered before y. -type KeyOrder func(x, y pref.MapKey) bool +type KeyOrder func(x, y protoreflect.MapKey) bool var ( // AnyKeyOrder specifies no specific key ordering. @@ -72,7 +72,7 @@ var ( // GenericKeyOrder sorts false before true, numeric keys in ascending order, // and strings in lexicographical ordering according to UTF-8 codepoints. - GenericKeyOrder KeyOrder = func(x, y pref.MapKey) bool { + GenericKeyOrder KeyOrder = func(x, y protoreflect.MapKey) bool { switch x.Interface().(type) { case bool: return !x.Bool() && y.Bool() diff --git a/vendor/google.golang.org/protobuf/internal/order/range.go b/vendor/google.golang.org/protobuf/internal/order/range.go index c8090e0c5..1665a68e5 100644 --- a/vendor/google.golang.org/protobuf/internal/order/range.go +++ b/vendor/google.golang.org/protobuf/internal/order/range.go @@ -9,12 +9,12 @@ import ( "sort" "sync" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type messageField struct { - fd pref.FieldDescriptor - v pref.Value + fd protoreflect.FieldDescriptor + v protoreflect.Value } var messageFieldPool = sync.Pool{ @@ -25,8 +25,8 @@ type ( // FieldRnger is an interface for visiting all fields in a message. // The protoreflect.Message type implements this interface. FieldRanger interface{ Range(VisitField) } - // VisitField is called everytime a message field is visited. - VisitField = func(pref.FieldDescriptor, pref.Value) bool + // VisitField is called every time a message field is visited. + VisitField = func(protoreflect.FieldDescriptor, protoreflect.Value) bool ) // RangeFields iterates over the fields of fs according to the specified order. @@ -47,7 +47,7 @@ func RangeFields(fs FieldRanger, less FieldOrder, fn VisitField) { }() // Collect all fields in the message and sort them. - fs.Range(func(fd pref.FieldDescriptor, v pref.Value) bool { + fs.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { fields = append(fields, messageField{fd, v}) return true }) @@ -64,8 +64,8 @@ func RangeFields(fs FieldRanger, less FieldOrder, fn VisitField) { } type mapEntry struct { - k pref.MapKey - v pref.Value + k protoreflect.MapKey + v protoreflect.Value } var mapEntryPool = sync.Pool{ @@ -76,8 +76,8 @@ type ( // EntryRanger is an interface for visiting all fields in a message. // The protoreflect.Map type implements this interface. EntryRanger interface{ Range(VisitEntry) } - // VisitEntry is called everytime a map entry is visited. - VisitEntry = func(pref.MapKey, pref.Value) bool + // VisitEntry is called every time a map entry is visited. + VisitEntry = func(protoreflect.MapKey, protoreflect.Value) bool ) // RangeEntries iterates over the entries of es according to the specified order. @@ -98,7 +98,7 @@ func RangeEntries(es EntryRanger, less KeyOrder, fn VisitEntry) { }() // Collect all entries in the map and sort them. - es.Range(func(k pref.MapKey, v pref.Value) bool { + es.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { entries = append(entries, mapEntry{k, v}) return true }) diff --git a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go index 56a8a4ed3..fea589c45 100644 --- a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +++ b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go @@ -10,7 +10,7 @@ package strs import ( "unsafe" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type ( @@ -59,7 +59,7 @@ type Builder struct { // AppendFullName is equivalent to protoreflect.FullName.Append, // but optimized for large batches where each name has a shared lifetime. -func (sb *Builder) AppendFullName(prefix pref.FullName, name pref.Name) pref.FullName { +func (sb *Builder) AppendFullName(prefix protoreflect.FullName, name protoreflect.Name) protoreflect.FullName { n := len(prefix) + len(".") + len(name) if len(prefix) == 0 { n -= len(".") @@ -68,7 +68,7 @@ func (sb *Builder) AppendFullName(prefix pref.FullName, name pref.Name) pref.Ful sb.buf = append(sb.buf, prefix...) sb.buf = append(sb.buf, '.') sb.buf = append(sb.buf, name...) - return pref.FullName(sb.last(n)) + return protoreflect.FullName(sb.last(n)) } // MakeString is equivalent to string(b), but optimized for large batches diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 3d40d5249..b480c5010 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -12,54 +12,54 @@ import ( // These constants determine the current version of this module. // -// // For our release process, we enforce the following rules: -// * Tagged releases use a tag that is identical to String. -// * Tagged releases never reference a commit where the String -// contains "devel". -// * The set of all commits in this repository where String -// does not contain "devel" must have a unique String. -// +// - Tagged releases use a tag that is identical to String. +// - Tagged releases never reference a commit where the String +// contains "devel". +// - The set of all commits in this repository where String +// does not contain "devel" must have a unique String. // // Steps for tagging a new release: -// 1. Create a new CL. // -// 2. Update Minor, Patch, and/or PreRelease as necessary. -// PreRelease must not contain the string "devel". +// 1. Create a new CL. // -// 3. Since the last released minor version, have there been any changes to -// generator that relies on new functionality in the runtime? -// If yes, then increment RequiredGenerated. +// 2. Update Minor, Patch, and/or PreRelease as necessary. +// PreRelease must not contain the string "devel". // -// 4. Since the last released minor version, have there been any changes to -// the runtime that removes support for old .pb.go source code? -// If yes, then increment SupportMinimum. +// 3. Since the last released minor version, have there been any changes to +// generator that relies on new functionality in the runtime? +// If yes, then increment RequiredGenerated. // -// 5. Send out the CL for review and submit it. -// Note that the next CL in step 8 must be submitted after this CL -// without any other CLs in-between. +// 4. Since the last released minor version, have there been any changes to +// the runtime that removes support for old .pb.go source code? +// If yes, then increment SupportMinimum. // -// 6. Tag a new version, where the tag is is the current String. +// 5. Send out the CL for review and submit it. +// Note that the next CL in step 8 must be submitted after this CL +// without any other CLs in-between. // -// 7. Write release notes for all notable changes -// between this release and the last release. +// 6. Tag a new version, where the tag is is the current String. // -// 8. Create a new CL. +// 7. Write release notes for all notable changes +// between this release and the last release. // -// 9. Update PreRelease to include the string "devel". -// For example: "" -> "devel" or "rc.1" -> "rc.1.devel" +// 8. Create a new CL. // -// 10. Send out the CL for review and submit it. +// 9. Update PreRelease to include the string "devel". +// For example: "" -> "devel" or "rc.1" -> "rc.1.devel" +// +// 10. Send out the CL for review and submit it. const ( Major = 1 Minor = 28 - Patch = 0 + Patch = 1 PreRelease = "" ) // String formats the version string for this module in semver format. // // Examples: +// // v1.20.1 // v1.21.0-rc.1 func String() string { diff --git a/vendor/google.golang.org/protobuf/proto/decode.go b/vendor/google.golang.org/protobuf/proto/decode.go index 11bf7173b..48d47946b 100644 --- a/vendor/google.golang.org/protobuf/proto/decode.go +++ b/vendor/google.golang.org/protobuf/proto/decode.go @@ -19,7 +19,8 @@ import ( // UnmarshalOptions configures the unmarshaler. // // Example usage: -// err := UnmarshalOptions{DiscardUnknown: true}.Unmarshal(b, m) +// +// err := UnmarshalOptions{DiscardUnknown: true}.Unmarshal(b, m) type UnmarshalOptions struct { pragma.NoUnkeyedLiterals diff --git a/vendor/google.golang.org/protobuf/proto/doc.go b/vendor/google.golang.org/protobuf/proto/doc.go index c52d8c4ab..08d2a46f5 100644 --- a/vendor/google.golang.org/protobuf/proto/doc.go +++ b/vendor/google.golang.org/protobuf/proto/doc.go @@ -6,18 +6,17 @@ // // For documentation on protocol buffers in general, see: // -// https://developers.google.com/protocol-buffers +// https://developers.google.com/protocol-buffers // // For a tutorial on using protocol buffers with Go, see: // -// https://developers.google.com/protocol-buffers/docs/gotutorial +// https://developers.google.com/protocol-buffers/docs/gotutorial // // For a guide to generated Go protocol buffer code, see: // -// https://developers.google.com/protocol-buffers/docs/reference/go-generated +// https://developers.google.com/protocol-buffers/docs/reference/go-generated // -// -// Binary serialization +// # Binary serialization // // This package contains functions to convert to and from the wire format, // an efficient binary serialization of protocol buffers. @@ -30,8 +29,7 @@ // • Unmarshal converts a message from the wire format. // The UnmarshalOptions type provides more control over wire unmarshaling. // -// -// Basic message operations +// # Basic message operations // // • Clone makes a deep copy of a message. // @@ -45,8 +43,7 @@ // // • CheckInitialized reports whether all required fields in a message are set. // -// -// Optional scalar constructors +// # Optional scalar constructors // // The API for some generated messages represents optional scalar fields // as pointers to a value. For example, an optional string field has the @@ -61,16 +58,14 @@ // // Optional scalar fields are only supported in proto2. // -// -// Extension accessors +// # Extension accessors // // • HasExtension, GetExtension, SetExtension, and ClearExtension // access extension field values in a protocol buffer message. // // Extension fields are only supported in proto2. // -// -// Related packages +// # Related packages // // • Package "google.golang.org/protobuf/encoding/protojson" converts messages to // and from JSON. diff --git a/vendor/google.golang.org/protobuf/proto/encode.go b/vendor/google.golang.org/protobuf/proto/encode.go index d18239c23..bf7f816d0 100644 --- a/vendor/google.golang.org/protobuf/proto/encode.go +++ b/vendor/google.golang.org/protobuf/proto/encode.go @@ -16,7 +16,8 @@ import ( // MarshalOptions configures the marshaler. // // Example usage: -// b, err := MarshalOptions{Deterministic: true}.Marshal(m) +// +// b, err := MarshalOptions{Deterministic: true}.Marshal(m) type MarshalOptions struct { pragma.NoUnkeyedLiterals @@ -101,7 +102,9 @@ func (o MarshalOptions) Marshal(m Message) ([]byte, error) { // otherwise it returns a non-nil empty buffer. // // This is to assist the edge-case where user-code does the following: +// // m1.OptionalBytes, _ = proto.Marshal(m2) +// // where they expect the proto2 "optional_bytes" field to be populated // if any only if m2 is a valid message. func emptyBytesForMessage(m Message) []byte { diff --git a/vendor/google.golang.org/protobuf/proto/equal.go b/vendor/google.golang.org/protobuf/proto/equal.go index 4dba2b969..67948dd1d 100644 --- a/vendor/google.golang.org/protobuf/proto/equal.go +++ b/vendor/google.golang.org/protobuf/proto/equal.go @@ -10,7 +10,7 @@ import ( "reflect" "google.golang.org/protobuf/encoding/protowire" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // Equal reports whether two messages are equal. @@ -33,6 +33,10 @@ func Equal(x, y Message) bool { if x == nil || y == nil { return x == nil && y == nil } + if reflect.TypeOf(x).Kind() == reflect.Ptr && x == y { + // Avoid an expensive comparison if both inputs are identical pointers. + return true + } mx := x.ProtoReflect() my := y.ProtoReflect() if mx.IsValid() != my.IsValid() { @@ -42,14 +46,14 @@ func Equal(x, y Message) bool { } // equalMessage compares two messages. -func equalMessage(mx, my pref.Message) bool { +func equalMessage(mx, my protoreflect.Message) bool { if mx.Descriptor() != my.Descriptor() { return false } nx := 0 equal := true - mx.Range(func(fd pref.FieldDescriptor, vx pref.Value) bool { + mx.Range(func(fd protoreflect.FieldDescriptor, vx protoreflect.Value) bool { nx++ vy := my.Get(fd) equal = my.Has(fd) && equalField(fd, vx, vy) @@ -59,7 +63,7 @@ func equalMessage(mx, my pref.Message) bool { return false } ny := 0 - my.Range(func(fd pref.FieldDescriptor, vx pref.Value) bool { + my.Range(func(fd protoreflect.FieldDescriptor, vx protoreflect.Value) bool { ny++ return true }) @@ -71,7 +75,7 @@ func equalMessage(mx, my pref.Message) bool { } // equalField compares two fields. -func equalField(fd pref.FieldDescriptor, x, y pref.Value) bool { +func equalField(fd protoreflect.FieldDescriptor, x, y protoreflect.Value) bool { switch { case fd.IsList(): return equalList(fd, x.List(), y.List()) @@ -83,12 +87,12 @@ func equalField(fd pref.FieldDescriptor, x, y pref.Value) bool { } // equalMap compares two maps. -func equalMap(fd pref.FieldDescriptor, x, y pref.Map) bool { +func equalMap(fd protoreflect.FieldDescriptor, x, y protoreflect.Map) bool { if x.Len() != y.Len() { return false } equal := true - x.Range(func(k pref.MapKey, vx pref.Value) bool { + x.Range(func(k protoreflect.MapKey, vx protoreflect.Value) bool { vy := y.Get(k) equal = y.Has(k) && equalValue(fd.MapValue(), vx, vy) return equal @@ -97,7 +101,7 @@ func equalMap(fd pref.FieldDescriptor, x, y pref.Map) bool { } // equalList compares two lists. -func equalList(fd pref.FieldDescriptor, x, y pref.List) bool { +func equalList(fd protoreflect.FieldDescriptor, x, y protoreflect.List) bool { if x.Len() != y.Len() { return false } @@ -110,31 +114,31 @@ func equalList(fd pref.FieldDescriptor, x, y pref.List) bool { } // equalValue compares two singular values. -func equalValue(fd pref.FieldDescriptor, x, y pref.Value) bool { +func equalValue(fd protoreflect.FieldDescriptor, x, y protoreflect.Value) bool { switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: return x.Bool() == y.Bool() - case pref.EnumKind: + case protoreflect.EnumKind: return x.Enum() == y.Enum() - case pref.Int32Kind, pref.Sint32Kind, - pref.Int64Kind, pref.Sint64Kind, - pref.Sfixed32Kind, pref.Sfixed64Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, + protoreflect.Int64Kind, protoreflect.Sint64Kind, + protoreflect.Sfixed32Kind, protoreflect.Sfixed64Kind: return x.Int() == y.Int() - case pref.Uint32Kind, pref.Uint64Kind, - pref.Fixed32Kind, pref.Fixed64Kind: + case protoreflect.Uint32Kind, protoreflect.Uint64Kind, + protoreflect.Fixed32Kind, protoreflect.Fixed64Kind: return x.Uint() == y.Uint() - case pref.FloatKind, pref.DoubleKind: + case protoreflect.FloatKind, protoreflect.DoubleKind: fx := x.Float() fy := y.Float() if math.IsNaN(fx) || math.IsNaN(fy) { return math.IsNaN(fx) && math.IsNaN(fy) } return fx == fy - case pref.StringKind: + case protoreflect.StringKind: return x.String() == y.String() - case pref.BytesKind: + case protoreflect.BytesKind: return bytes.Equal(x.Bytes(), y.Bytes()) - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: return equalMessage(x.Message(), y.Message()) default: return x.Interface() == y.Interface() @@ -143,7 +147,7 @@ func equalValue(fd pref.FieldDescriptor, x, y pref.Value) bool { // equalUnknown compares unknown fields by direct comparison on the raw bytes // of each individual field number. -func equalUnknown(x, y pref.RawFields) bool { +func equalUnknown(x, y protoreflect.RawFields) bool { if len(x) != len(y) { return false } @@ -151,8 +155,8 @@ func equalUnknown(x, y pref.RawFields) bool { return true } - mx := make(map[pref.FieldNumber]pref.RawFields) - my := make(map[pref.FieldNumber]pref.RawFields) + mx := make(map[protoreflect.FieldNumber]protoreflect.RawFields) + my := make(map[protoreflect.FieldNumber]protoreflect.RawFields) for len(x) > 0 { fnum, _, n := protowire.ConsumeField(x) mx[fnum] = append(mx[fnum], x[:n]...) diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go index cebb36cda..27d7e3501 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go @@ -155,9 +155,9 @@ func (r *resolver) findTarget(k protoreflect.Kind, scope protoreflect.FullName, // // Suppose the scope was "fizz.buzz" and the reference was "Foo.Bar", // then the following full names are searched: -// * fizz.buzz.Foo.Bar -// * fizz.Foo.Bar -// * Foo.Bar +// - fizz.buzz.Foo.Bar +// - fizz.Foo.Bar +// - Foo.Bar func (r *resolver) findDescriptor(scope protoreflect.FullName, ref partialName) (protoreflect.Descriptor, error) { if !ref.IsValid() { return nil, errors.New("invalid name reference: %q", ref) diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go index dd85915bd..55aa14922 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go @@ -8,8 +8,7 @@ // defined in proto source files and value interfaces which provide the // ability to examine and manipulate the contents of messages. // -// -// Protocol Buffer Descriptors +// # Protocol Buffer Descriptors // // Protobuf descriptors (e.g., EnumDescriptor or MessageDescriptor) // are immutable objects that represent protobuf type information. @@ -26,8 +25,7 @@ // The "google.golang.org/protobuf/reflect/protodesc" package converts between // google.protobuf.DescriptorProto messages and protobuf descriptors. // -// -// Go Type Descriptors +// # Go Type Descriptors // // A type descriptor (e.g., EnumType or MessageType) is a constructor for // a concrete Go type that represents the associated protobuf descriptor. @@ -41,8 +39,7 @@ // The "google.golang.org/protobuf/types/dynamicpb" package can be used to // create Go type descriptors from protobuf descriptors. // -// -// Value Interfaces +// # Value Interfaces // // The Enum and Message interfaces provide a reflective view over an // enum or message instance. For enums, it provides the ability to retrieve @@ -55,13 +52,11 @@ // The "github.com/golang/protobuf/proto".MessageReflect function can be used // to obtain a reflective view on older messages. // -// -// Relationships +// # Relationships // // The following diagrams demonstrate the relationships between // various types declared in this package. // -// // ┌───────────────────────────────────┐ // V │ // ┌────────────── New(n) ─────────────┐ │ @@ -83,7 +78,6 @@ // // • An Enum is a concrete enum instance. Generated enums implement Enum. // -// // ┌──────────────── New() ─────────────────┐ // │ │ // │ ┌─── Descriptor() ─────┐ │ ┌── Interface() ───┐ @@ -98,12 +92,22 @@ // // • A MessageType describes a concrete Go message type. // It has a MessageDescriptor and can construct a Message instance. +// Just as how Go's reflect.Type is a reflective description of a Go type, +// a MessageType is a reflective description of a Go type for a protobuf message. // // • A MessageDescriptor describes an abstract protobuf message type. -// -// • A Message is a concrete message instance. Generated messages implement -// ProtoMessage, which can convert to/from a Message. -// +// It has no understanding of Go types. In order to construct a MessageType +// from just a MessageDescriptor, you can consider looking up the message type +// in the global registry using protoregistry.GlobalTypes.FindMessageByName +// or constructing a dynamic MessageType using dynamicpb.NewMessageType. +// +// • A Message is a reflective view over a concrete message instance. +// Generated messages implement ProtoMessage, which can convert to a Message. +// Just as how Go's reflect.Value is a reflective view over a Go value, +// a Message is a reflective view over a concrete protobuf message instance. +// Using Go reflection as an analogy, the ProtoReflect method is similar to +// calling reflect.ValueOf, and the Message.Interface method is similar to +// calling reflect.Value.Interface. // // ┌── TypeDescriptor() ──┐ ┌───── Descriptor() ─────┐ // │ V │ V diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go index 121ba3a07..0b9942885 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go @@ -87,6 +87,7 @@ func (p1 SourcePath) Equal(p2 SourcePath) bool { // in a future version of this module. // // Example output: +// // .message_type[6].nested_type[15].field[3] func (p SourcePath) String() string { b := p.appendFileDescriptorProto(nil) diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go index 8e53c44a9..3867470d3 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go @@ -480,6 +480,7 @@ type ExtensionDescriptors interface { // relative to the parent that it is declared within. // // For example: +// // syntax = "proto2"; // package example; // message FooMessage { diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go index eb7764c30..ca8e28c5b 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go @@ -50,6 +50,7 @@ import ( // always references the source object. // // For example: +// // // Append a 0 to a "repeated int32" field. // // Since the Value returned by Mutable is guaranteed to alias // // the source message, modifying the Value modifies the message. @@ -392,6 +393,7 @@ func (v Value) MapKey() MapKey { // ╚═════════╧═════════════════════════════════════╝ // // A MapKey is constructed and accessed through a Value: +// // k := ValueOf("hash").MapKey() // convert string to MapKey // s := k.String() // convert MapKey to string // diff --git a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go index 59f024c44..58352a697 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +++ b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go @@ -30,9 +30,11 @@ import ( // conflictPolicy configures the policy for handling registration conflicts. // // It can be over-written at compile time with a linker-initialized variable: +// // go build -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn" // // It can be over-written at program execution with an environment variable: +// // GOLANG_PROTOBUF_REGISTRATION_CONFLICT=warn ./main // // Neither of the above are covered by the compatibility promise and diff --git a/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go b/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go index ff094e1ba..a105cb23e 100644 --- a/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go +++ b/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go @@ -26,16 +26,19 @@ const ( // EnforceVersion is used by code generated by protoc-gen-go // to statically enforce minimum and maximum versions of this package. // A compilation failure implies either that: -// * the runtime package is too old and needs to be updated OR -// * the generated code is too old and needs to be regenerated. +// - the runtime package is too old and needs to be updated OR +// - the generated code is too old and needs to be regenerated. // // The runtime package can be upgraded by running: +// // go get google.golang.org/protobuf // // The generated code can be regenerated by running: +// // protoc --go_out=${PROTOC_GEN_GO_ARGS} ${PROTO_FILES} // // Example usage by generated code: +// // const ( // // Verify that this generated code is sufficiently up-to-date. // _ = protoimpl.EnforceVersion(genVersion - protoimpl.MinVersion) @@ -49,6 +52,7 @@ const ( type EnforceVersion uint // This enforces the following invariant: +// // MinVersion ≤ GenVersion ≤ MaxVersion const ( _ = EnforceVersion(GenVersion - MinVersion) diff --git a/vendor/google.golang.org/protobuf/types/dynamicpb/dynamic.go b/vendor/google.golang.org/protobuf/types/dynamicpb/dynamic.go index 900b9d287..f77ef0de1 100644 --- a/vendor/google.golang.org/protobuf/types/dynamicpb/dynamic.go +++ b/vendor/google.golang.org/protobuf/types/dynamicpb/dynamic.go @@ -9,24 +9,24 @@ import ( "math" "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/runtime/protoiface" "google.golang.org/protobuf/runtime/protoimpl" ) // enum is a dynamic protoreflect.Enum. type enum struct { - num pref.EnumNumber - typ pref.EnumType + num protoreflect.EnumNumber + typ protoreflect.EnumType } -func (e enum) Descriptor() pref.EnumDescriptor { return e.typ.Descriptor() } -func (e enum) Type() pref.EnumType { return e.typ } -func (e enum) Number() pref.EnumNumber { return e.num } +func (e enum) Descriptor() protoreflect.EnumDescriptor { return e.typ.Descriptor() } +func (e enum) Type() protoreflect.EnumType { return e.typ } +func (e enum) Number() protoreflect.EnumNumber { return e.num } // enumType is a dynamic protoreflect.EnumType. type enumType struct { - desc pref.EnumDescriptor + desc protoreflect.EnumDescriptor } // NewEnumType creates a new EnumType with the provided descriptor. @@ -35,12 +35,12 @@ type enumType struct { // That is, if ed1 == ed2, then NewEnumType(ed1) == NewEnumType(ed2). // // Enum values created by the EnumType are equal if their numbers are equal. -func NewEnumType(desc pref.EnumDescriptor) pref.EnumType { +func NewEnumType(desc protoreflect.EnumDescriptor) protoreflect.EnumType { return enumType{desc} } -func (et enumType) New(n pref.EnumNumber) pref.Enum { return enum{n, et} } -func (et enumType) Descriptor() pref.EnumDescriptor { return et.desc } +func (et enumType) New(n protoreflect.EnumNumber) protoreflect.Enum { return enum{n, et} } +func (et enumType) Descriptor() protoreflect.EnumDescriptor { return et.desc } // extensionType is a dynamic protoreflect.ExtensionType. type extensionType struct { @@ -64,23 +64,23 @@ type extensionType struct { // Operations which modify a Message are not safe for concurrent use. type Message struct { typ messageType - known map[pref.FieldNumber]pref.Value - ext map[pref.FieldNumber]pref.FieldDescriptor - unknown pref.RawFields + known map[protoreflect.FieldNumber]protoreflect.Value + ext map[protoreflect.FieldNumber]protoreflect.FieldDescriptor + unknown protoreflect.RawFields } var ( - _ pref.Message = (*Message)(nil) - _ pref.ProtoMessage = (*Message)(nil) - _ protoiface.MessageV1 = (*Message)(nil) + _ protoreflect.Message = (*Message)(nil) + _ protoreflect.ProtoMessage = (*Message)(nil) + _ protoiface.MessageV1 = (*Message)(nil) ) // NewMessage creates a new message with the provided descriptor. -func NewMessage(desc pref.MessageDescriptor) *Message { +func NewMessage(desc protoreflect.MessageDescriptor) *Message { return &Message{ typ: messageType{desc}, - known: make(map[pref.FieldNumber]pref.Value), - ext: make(map[pref.FieldNumber]pref.FieldDescriptor), + known: make(map[protoreflect.FieldNumber]protoreflect.Value), + ext: make(map[protoreflect.FieldNumber]protoreflect.FieldDescriptor), } } @@ -88,7 +88,7 @@ func NewMessage(desc pref.MessageDescriptor) *Message { func (m *Message) ProtoMessage() {} // ProtoReflect implements the protoreflect.ProtoMessage interface. -func (m *Message) ProtoReflect() pref.Message { +func (m *Message) ProtoReflect() protoreflect.Message { return m } @@ -99,30 +99,30 @@ func (m *Message) String() string { // Reset clears the message to be empty, but preserves the dynamic message type. func (m *Message) Reset() { - m.known = make(map[pref.FieldNumber]pref.Value) - m.ext = make(map[pref.FieldNumber]pref.FieldDescriptor) + m.known = make(map[protoreflect.FieldNumber]protoreflect.Value) + m.ext = make(map[protoreflect.FieldNumber]protoreflect.FieldDescriptor) m.unknown = nil } // Descriptor returns the message descriptor. -func (m *Message) Descriptor() pref.MessageDescriptor { +func (m *Message) Descriptor() protoreflect.MessageDescriptor { return m.typ.desc } // Type returns the message type. -func (m *Message) Type() pref.MessageType { +func (m *Message) Type() protoreflect.MessageType { return m.typ } // New returns a newly allocated empty message with the same descriptor. // See protoreflect.Message for details. -func (m *Message) New() pref.Message { +func (m *Message) New() protoreflect.Message { return m.Type().New() } // Interface returns the message. // See protoreflect.Message for details. -func (m *Message) Interface() pref.ProtoMessage { +func (m *Message) Interface() protoreflect.ProtoMessage { return m } @@ -134,7 +134,7 @@ func (m *Message) ProtoMethods() *protoiface.Methods { // Range visits every populated field in undefined order. // See protoreflect.Message for details. -func (m *Message) Range(f func(pref.FieldDescriptor, pref.Value) bool) { +func (m *Message) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { for num, v := range m.known { fd := m.ext[num] if fd == nil { @@ -151,7 +151,7 @@ func (m *Message) Range(f func(pref.FieldDescriptor, pref.Value) bool) { // Has reports whether a field is populated. // See protoreflect.Message for details. -func (m *Message) Has(fd pref.FieldDescriptor) bool { +func (m *Message) Has(fd protoreflect.FieldDescriptor) bool { m.checkField(fd) if fd.IsExtension() && m.ext[fd.Number()] != fd { return false @@ -165,7 +165,7 @@ func (m *Message) Has(fd pref.FieldDescriptor) bool { // Clear clears a field. // See protoreflect.Message for details. -func (m *Message) Clear(fd pref.FieldDescriptor) { +func (m *Message) Clear(fd protoreflect.FieldDescriptor) { m.checkField(fd) num := fd.Number() delete(m.known, num) @@ -174,12 +174,12 @@ func (m *Message) Clear(fd pref.FieldDescriptor) { // Get returns the value of a field. // See protoreflect.Message for details. -func (m *Message) Get(fd pref.FieldDescriptor) pref.Value { +func (m *Message) Get(fd protoreflect.FieldDescriptor) protoreflect.Value { m.checkField(fd) num := fd.Number() if fd.IsExtension() { if fd != m.ext[num] { - return fd.(pref.ExtensionTypeDescriptor).Type().Zero() + return fd.(protoreflect.ExtensionTypeDescriptor).Type().Zero() } return m.known[num] } @@ -199,13 +199,13 @@ func (m *Message) Get(fd pref.FieldDescriptor) pref.Value { } switch { case fd.IsMap(): - return pref.ValueOfMap(&dynamicMap{desc: fd}) + return protoreflect.ValueOfMap(&dynamicMap{desc: fd}) case fd.IsList(): - return pref.ValueOfList(emptyList{desc: fd}) + return protoreflect.ValueOfList(emptyList{desc: fd}) case fd.Message() != nil: - return pref.ValueOfMessage(&Message{typ: messageType{fd.Message()}}) - case fd.Kind() == pref.BytesKind: - return pref.ValueOfBytes(append([]byte(nil), fd.Default().Bytes()...)) + return protoreflect.ValueOfMessage(&Message{typ: messageType{fd.Message()}}) + case fd.Kind() == protoreflect.BytesKind: + return protoreflect.ValueOfBytes(append([]byte(nil), fd.Default().Bytes()...)) default: return fd.Default() } @@ -213,7 +213,7 @@ func (m *Message) Get(fd pref.FieldDescriptor) pref.Value { // Mutable returns a mutable reference to a repeated, map, or message field. // See protoreflect.Message for details. -func (m *Message) Mutable(fd pref.FieldDescriptor) pref.Value { +func (m *Message) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { m.checkField(fd) if !fd.IsMap() && !fd.IsList() && fd.Message() == nil { panic(errors.New("%v: getting mutable reference to non-composite type", fd.FullName())) @@ -225,7 +225,7 @@ func (m *Message) Mutable(fd pref.FieldDescriptor) pref.Value { if fd.IsExtension() { if fd != m.ext[num] { m.ext[num] = fd - m.known[num] = fd.(pref.ExtensionTypeDescriptor).Type().New() + m.known[num] = fd.(protoreflect.ExtensionTypeDescriptor).Type().New() } return m.known[num] } @@ -242,7 +242,7 @@ func (m *Message) Mutable(fd pref.FieldDescriptor) pref.Value { // Set stores a value in a field. // See protoreflect.Message for details. -func (m *Message) Set(fd pref.FieldDescriptor, v pref.Value) { +func (m *Message) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) { m.checkField(fd) if m.known == nil { panic(errors.New("%v: modification of read-only message", fd.FullName())) @@ -250,7 +250,7 @@ func (m *Message) Set(fd pref.FieldDescriptor, v pref.Value) { if fd.IsExtension() { isValid := true switch { - case !fd.(pref.ExtensionTypeDescriptor).Type().IsValidValue(v): + case !fd.(protoreflect.ExtensionTypeDescriptor).Type().IsValidValue(v): isValid = false case fd.IsList(): isValid = v.List().IsValid() @@ -270,7 +270,7 @@ func (m *Message) Set(fd pref.FieldDescriptor, v pref.Value) { m.known[fd.Number()] = v } -func (m *Message) clearOtherOneofFields(fd pref.FieldDescriptor) { +func (m *Message) clearOtherOneofFields(fd protoreflect.FieldDescriptor) { od := fd.ContainingOneof() if od == nil { return @@ -285,20 +285,20 @@ func (m *Message) clearOtherOneofFields(fd pref.FieldDescriptor) { // NewField returns a new value for assignable to the field of a given descriptor. // See protoreflect.Message for details. -func (m *Message) NewField(fd pref.FieldDescriptor) pref.Value { +func (m *Message) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { m.checkField(fd) switch { case fd.IsExtension(): - return fd.(pref.ExtensionTypeDescriptor).Type().New() + return fd.(protoreflect.ExtensionTypeDescriptor).Type().New() case fd.IsMap(): - return pref.ValueOfMap(&dynamicMap{ + return protoreflect.ValueOfMap(&dynamicMap{ desc: fd, - mapv: make(map[interface{}]pref.Value), + mapv: make(map[interface{}]protoreflect.Value), }) case fd.IsList(): - return pref.ValueOfList(&dynamicList{desc: fd}) + return protoreflect.ValueOfList(&dynamicList{desc: fd}) case fd.Message() != nil: - return pref.ValueOfMessage(NewMessage(fd.Message()).ProtoReflect()) + return protoreflect.ValueOfMessage(NewMessage(fd.Message()).ProtoReflect()) default: return fd.Default() } @@ -306,7 +306,7 @@ func (m *Message) NewField(fd pref.FieldDescriptor) pref.Value { // WhichOneof reports which field in a oneof is populated, returning nil if none are populated. // See protoreflect.Message for details. -func (m *Message) WhichOneof(od pref.OneofDescriptor) pref.FieldDescriptor { +func (m *Message) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { for i := 0; i < od.Fields().Len(); i++ { fd := od.Fields().Get(i) if m.Has(fd) { @@ -318,13 +318,13 @@ func (m *Message) WhichOneof(od pref.OneofDescriptor) pref.FieldDescriptor { // GetUnknown returns the raw unknown fields. // See protoreflect.Message for details. -func (m *Message) GetUnknown() pref.RawFields { +func (m *Message) GetUnknown() protoreflect.RawFields { return m.unknown } // SetUnknown sets the raw unknown fields. // See protoreflect.Message for details. -func (m *Message) SetUnknown(r pref.RawFields) { +func (m *Message) SetUnknown(r protoreflect.RawFields) { if m.known == nil { panic(errors.New("%v: modification of read-only message", m.typ.desc.FullName())) } @@ -337,9 +337,9 @@ func (m *Message) IsValid() bool { return m.known != nil } -func (m *Message) checkField(fd pref.FieldDescriptor) { +func (m *Message) checkField(fd protoreflect.FieldDescriptor) { if fd.IsExtension() && fd.ContainingMessage().FullName() == m.Descriptor().FullName() { - if _, ok := fd.(pref.ExtensionTypeDescriptor); !ok { + if _, ok := fd.(protoreflect.ExtensionTypeDescriptor); !ok { panic(errors.New("%v: extension field descriptor does not implement ExtensionTypeDescriptor", fd.FullName())) } return @@ -355,27 +355,27 @@ func (m *Message) checkField(fd pref.FieldDescriptor) { } type messageType struct { - desc pref.MessageDescriptor + desc protoreflect.MessageDescriptor } // NewMessageType creates a new MessageType with the provided descriptor. // // MessageTypes created by this package are equal if their descriptors are equal. // That is, if md1 == md2, then NewMessageType(md1) == NewMessageType(md2). -func NewMessageType(desc pref.MessageDescriptor) pref.MessageType { +func NewMessageType(desc protoreflect.MessageDescriptor) protoreflect.MessageType { return messageType{desc} } -func (mt messageType) New() pref.Message { return NewMessage(mt.desc) } -func (mt messageType) Zero() pref.Message { return &Message{typ: messageType{mt.desc}} } -func (mt messageType) Descriptor() pref.MessageDescriptor { return mt.desc } -func (mt messageType) Enum(i int) pref.EnumType { +func (mt messageType) New() protoreflect.Message { return NewMessage(mt.desc) } +func (mt messageType) Zero() protoreflect.Message { return &Message{typ: messageType{mt.desc}} } +func (mt messageType) Descriptor() protoreflect.MessageDescriptor { return mt.desc } +func (mt messageType) Enum(i int) protoreflect.EnumType { if ed := mt.desc.Fields().Get(i).Enum(); ed != nil { return NewEnumType(ed) } return nil } -func (mt messageType) Message(i int) pref.MessageType { +func (mt messageType) Message(i int) protoreflect.MessageType { if md := mt.desc.Fields().Get(i).Message(); md != nil { return NewMessageType(md) } @@ -383,42 +383,46 @@ func (mt messageType) Message(i int) pref.MessageType { } type emptyList struct { - desc pref.FieldDescriptor + desc protoreflect.FieldDescriptor } -func (x emptyList) Len() int { return 0 } -func (x emptyList) Get(n int) pref.Value { panic(errors.New("out of range")) } -func (x emptyList) Set(n int, v pref.Value) { panic(errors.New("modification of immutable list")) } -func (x emptyList) Append(v pref.Value) { panic(errors.New("modification of immutable list")) } -func (x emptyList) AppendMutable() pref.Value { panic(errors.New("modification of immutable list")) } -func (x emptyList) Truncate(n int) { panic(errors.New("modification of immutable list")) } -func (x emptyList) NewElement() pref.Value { return newListEntry(x.desc) } -func (x emptyList) IsValid() bool { return false } +func (x emptyList) Len() int { return 0 } +func (x emptyList) Get(n int) protoreflect.Value { panic(errors.New("out of range")) } +func (x emptyList) Set(n int, v protoreflect.Value) { + panic(errors.New("modification of immutable list")) +} +func (x emptyList) Append(v protoreflect.Value) { panic(errors.New("modification of immutable list")) } +func (x emptyList) AppendMutable() protoreflect.Value { + panic(errors.New("modification of immutable list")) +} +func (x emptyList) Truncate(n int) { panic(errors.New("modification of immutable list")) } +func (x emptyList) NewElement() protoreflect.Value { return newListEntry(x.desc) } +func (x emptyList) IsValid() bool { return false } type dynamicList struct { - desc pref.FieldDescriptor - list []pref.Value + desc protoreflect.FieldDescriptor + list []protoreflect.Value } func (x *dynamicList) Len() int { return len(x.list) } -func (x *dynamicList) Get(n int) pref.Value { +func (x *dynamicList) Get(n int) protoreflect.Value { return x.list[n] } -func (x *dynamicList) Set(n int, v pref.Value) { +func (x *dynamicList) Set(n int, v protoreflect.Value) { typecheckSingular(x.desc, v) x.list[n] = v } -func (x *dynamicList) Append(v pref.Value) { +func (x *dynamicList) Append(v protoreflect.Value) { typecheckSingular(x.desc, v) x.list = append(x.list, v) } -func (x *dynamicList) AppendMutable() pref.Value { +func (x *dynamicList) AppendMutable() protoreflect.Value { if x.desc.Message() == nil { panic(errors.New("%v: invalid AppendMutable on list with non-message type", x.desc.FullName())) } @@ -430,12 +434,12 @@ func (x *dynamicList) AppendMutable() pref.Value { func (x *dynamicList) Truncate(n int) { // Zero truncated elements to avoid keeping data live. for i := n; i < len(x.list); i++ { - x.list[i] = pref.Value{} + x.list[i] = protoreflect.Value{} } x.list = x.list[:n] } -func (x *dynamicList) NewElement() pref.Value { +func (x *dynamicList) NewElement() protoreflect.Value { return newListEntry(x.desc) } @@ -444,19 +448,19 @@ func (x *dynamicList) IsValid() bool { } type dynamicMap struct { - desc pref.FieldDescriptor - mapv map[interface{}]pref.Value + desc protoreflect.FieldDescriptor + mapv map[interface{}]protoreflect.Value } -func (x *dynamicMap) Get(k pref.MapKey) pref.Value { return x.mapv[k.Interface()] } -func (x *dynamicMap) Set(k pref.MapKey, v pref.Value) { +func (x *dynamicMap) Get(k protoreflect.MapKey) protoreflect.Value { return x.mapv[k.Interface()] } +func (x *dynamicMap) Set(k protoreflect.MapKey, v protoreflect.Value) { typecheckSingular(x.desc.MapKey(), k.Value()) typecheckSingular(x.desc.MapValue(), v) x.mapv[k.Interface()] = v } -func (x *dynamicMap) Has(k pref.MapKey) bool { return x.Get(k).IsValid() } -func (x *dynamicMap) Clear(k pref.MapKey) { delete(x.mapv, k.Interface()) } -func (x *dynamicMap) Mutable(k pref.MapKey) pref.Value { +func (x *dynamicMap) Has(k protoreflect.MapKey) bool { return x.Get(k).IsValid() } +func (x *dynamicMap) Clear(k protoreflect.MapKey) { delete(x.mapv, k.Interface()) } +func (x *dynamicMap) Mutable(k protoreflect.MapKey) protoreflect.Value { if x.desc.MapValue().Message() == nil { panic(errors.New("%v: invalid Mutable on map with non-message value type", x.desc.FullName())) } @@ -468,9 +472,9 @@ func (x *dynamicMap) Mutable(k pref.MapKey) pref.Value { return v } func (x *dynamicMap) Len() int { return len(x.mapv) } -func (x *dynamicMap) NewValue() pref.Value { +func (x *dynamicMap) NewValue() protoreflect.Value { if md := x.desc.MapValue().Message(); md != nil { - return pref.ValueOfMessage(NewMessage(md).ProtoReflect()) + return protoreflect.ValueOfMessage(NewMessage(md).ProtoReflect()) } return x.desc.MapValue().Default() } @@ -478,15 +482,15 @@ func (x *dynamicMap) IsValid() bool { return x.mapv != nil } -func (x *dynamicMap) Range(f func(pref.MapKey, pref.Value) bool) { +func (x *dynamicMap) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) { for k, v := range x.mapv { - if !f(pref.ValueOf(k).MapKey(), v) { + if !f(protoreflect.ValueOf(k).MapKey(), v) { return } } } -func isSet(fd pref.FieldDescriptor, v pref.Value) bool { +func isSet(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { switch { case fd.IsMap(): return v.Map().Len() > 0 @@ -494,34 +498,34 @@ func isSet(fd pref.FieldDescriptor, v pref.Value) bool { return v.List().Len() > 0 case fd.ContainingOneof() != nil: return true - case fd.Syntax() == pref.Proto3 && !fd.IsExtension(): + case fd.Syntax() == protoreflect.Proto3 && !fd.IsExtension(): switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: return v.Bool() - case pref.EnumKind: + case protoreflect.EnumKind: return v.Enum() != 0 - case pref.Int32Kind, pref.Sint32Kind, pref.Int64Kind, pref.Sint64Kind, pref.Sfixed32Kind, pref.Sfixed64Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed32Kind, protoreflect.Sfixed64Kind: return v.Int() != 0 - case pref.Uint32Kind, pref.Uint64Kind, pref.Fixed32Kind, pref.Fixed64Kind: + case protoreflect.Uint32Kind, protoreflect.Uint64Kind, protoreflect.Fixed32Kind, protoreflect.Fixed64Kind: return v.Uint() != 0 - case pref.FloatKind, pref.DoubleKind: + case protoreflect.FloatKind, protoreflect.DoubleKind: return v.Float() != 0 || math.Signbit(v.Float()) - case pref.StringKind: + case protoreflect.StringKind: return v.String() != "" - case pref.BytesKind: + case protoreflect.BytesKind: return len(v.Bytes()) > 0 } } return true } -func typecheck(fd pref.FieldDescriptor, v pref.Value) { +func typecheck(fd protoreflect.FieldDescriptor, v protoreflect.Value) { if err := typeIsValid(fd, v); err != nil { panic(err) } } -func typeIsValid(fd pref.FieldDescriptor, v pref.Value) error { +func typeIsValid(fd protoreflect.FieldDescriptor, v protoreflect.Value) error { switch { case !v.IsValid(): return errors.New("%v: assigning invalid value", fd.FullName()) @@ -547,40 +551,40 @@ func typeIsValid(fd pref.FieldDescriptor, v pref.Value) error { } } -func typecheckSingular(fd pref.FieldDescriptor, v pref.Value) { +func typecheckSingular(fd protoreflect.FieldDescriptor, v protoreflect.Value) { if err := singularTypeIsValid(fd, v); err != nil { panic(err) } } -func singularTypeIsValid(fd pref.FieldDescriptor, v pref.Value) error { +func singularTypeIsValid(fd protoreflect.FieldDescriptor, v protoreflect.Value) error { vi := v.Interface() var ok bool switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: _, ok = vi.(bool) - case pref.EnumKind: + case protoreflect.EnumKind: // We could check against the valid set of enum values, but do not. - _, ok = vi.(pref.EnumNumber) - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + _, ok = vi.(protoreflect.EnumNumber) + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: _, ok = vi.(int32) - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: _, ok = vi.(uint32) - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: _, ok = vi.(int64) - case pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: _, ok = vi.(uint64) - case pref.FloatKind: + case protoreflect.FloatKind: _, ok = vi.(float32) - case pref.DoubleKind: + case protoreflect.DoubleKind: _, ok = vi.(float64) - case pref.StringKind: + case protoreflect.StringKind: _, ok = vi.(string) - case pref.BytesKind: + case protoreflect.BytesKind: _, ok = vi.([]byte) - case pref.MessageKind, pref.GroupKind: - var m pref.Message - m, ok = vi.(pref.Message) + case protoreflect.MessageKind, protoreflect.GroupKind: + var m protoreflect.Message + m, ok = vi.(protoreflect.Message) if ok && m.Descriptor().FullName() != fd.Message().FullName() { return errors.New("%v: assigning invalid message type %v", fd.FullName(), m.Descriptor().FullName()) } @@ -594,30 +598,30 @@ func singularTypeIsValid(fd pref.FieldDescriptor, v pref.Value) error { return nil } -func newListEntry(fd pref.FieldDescriptor) pref.Value { +func newListEntry(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.Kind() { - case pref.BoolKind: - return pref.ValueOfBool(false) - case pref.EnumKind: - return pref.ValueOfEnum(fd.Enum().Values().Get(0).Number()) - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: - return pref.ValueOfInt32(0) - case pref.Uint32Kind, pref.Fixed32Kind: - return pref.ValueOfUint32(0) - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: - return pref.ValueOfInt64(0) - case pref.Uint64Kind, pref.Fixed64Kind: - return pref.ValueOfUint64(0) - case pref.FloatKind: - return pref.ValueOfFloat32(0) - case pref.DoubleKind: - return pref.ValueOfFloat64(0) - case pref.StringKind: - return pref.ValueOfString("") - case pref.BytesKind: - return pref.ValueOfBytes(nil) - case pref.MessageKind, pref.GroupKind: - return pref.ValueOfMessage(NewMessage(fd.Message()).ProtoReflect()) + case protoreflect.BoolKind: + return protoreflect.ValueOfBool(false) + case protoreflect.EnumKind: + return protoreflect.ValueOfEnum(fd.Enum().Values().Get(0).Number()) + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: + return protoreflect.ValueOfInt32(0) + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: + return protoreflect.ValueOfUint32(0) + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: + return protoreflect.ValueOfInt64(0) + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: + return protoreflect.ValueOfUint64(0) + case protoreflect.FloatKind: + return protoreflect.ValueOfFloat32(0) + case protoreflect.DoubleKind: + return protoreflect.ValueOfFloat64(0) + case protoreflect.StringKind: + return protoreflect.ValueOfString("") + case protoreflect.BytesKind: + return protoreflect.ValueOfBytes(nil) + case protoreflect.MessageKind, protoreflect.GroupKind: + return protoreflect.ValueOfMessage(NewMessage(fd.Message()).ProtoReflect()) } panic(errors.New("%v: unknown kind %v", fd.FullName(), fd.Kind())) } @@ -641,73 +645,73 @@ func newListEntry(fd pref.FieldDescriptor) pref.Value { // is determined by these methods, and is therefore equivalent to the Go type // used to represent a protoreflect.Value. See the protoreflect.Value // documentation for more details. -func NewExtensionType(desc pref.ExtensionDescriptor) pref.ExtensionType { - if xt, ok := desc.(pref.ExtensionTypeDescriptor); ok { +func NewExtensionType(desc protoreflect.ExtensionDescriptor) protoreflect.ExtensionType { + if xt, ok := desc.(protoreflect.ExtensionTypeDescriptor); ok { desc = xt.Descriptor() } return extensionType{extensionTypeDescriptor{desc}} } -func (xt extensionType) New() pref.Value { +func (xt extensionType) New() protoreflect.Value { switch { case xt.desc.IsMap(): - return pref.ValueOfMap(&dynamicMap{ + return protoreflect.ValueOfMap(&dynamicMap{ desc: xt.desc, - mapv: make(map[interface{}]pref.Value), + mapv: make(map[interface{}]protoreflect.Value), }) case xt.desc.IsList(): - return pref.ValueOfList(&dynamicList{desc: xt.desc}) + return protoreflect.ValueOfList(&dynamicList{desc: xt.desc}) case xt.desc.Message() != nil: - return pref.ValueOfMessage(NewMessage(xt.desc.Message())) + return protoreflect.ValueOfMessage(NewMessage(xt.desc.Message())) default: return xt.desc.Default() } } -func (xt extensionType) Zero() pref.Value { +func (xt extensionType) Zero() protoreflect.Value { switch { case xt.desc.IsMap(): - return pref.ValueOfMap(&dynamicMap{desc: xt.desc}) - case xt.desc.Cardinality() == pref.Repeated: - return pref.ValueOfList(emptyList{desc: xt.desc}) + return protoreflect.ValueOfMap(&dynamicMap{desc: xt.desc}) + case xt.desc.Cardinality() == protoreflect.Repeated: + return protoreflect.ValueOfList(emptyList{desc: xt.desc}) case xt.desc.Message() != nil: - return pref.ValueOfMessage(&Message{typ: messageType{xt.desc.Message()}}) + return protoreflect.ValueOfMessage(&Message{typ: messageType{xt.desc.Message()}}) default: return xt.desc.Default() } } -func (xt extensionType) TypeDescriptor() pref.ExtensionTypeDescriptor { +func (xt extensionType) TypeDescriptor() protoreflect.ExtensionTypeDescriptor { return xt.desc } -func (xt extensionType) ValueOf(iv interface{}) pref.Value { - v := pref.ValueOf(iv) +func (xt extensionType) ValueOf(iv interface{}) protoreflect.Value { + v := protoreflect.ValueOf(iv) typecheck(xt.desc, v) return v } -func (xt extensionType) InterfaceOf(v pref.Value) interface{} { +func (xt extensionType) InterfaceOf(v protoreflect.Value) interface{} { typecheck(xt.desc, v) return v.Interface() } func (xt extensionType) IsValidInterface(iv interface{}) bool { - return typeIsValid(xt.desc, pref.ValueOf(iv)) == nil + return typeIsValid(xt.desc, protoreflect.ValueOf(iv)) == nil } -func (xt extensionType) IsValidValue(v pref.Value) bool { +func (xt extensionType) IsValidValue(v protoreflect.Value) bool { return typeIsValid(xt.desc, v) == nil } type extensionTypeDescriptor struct { - pref.ExtensionDescriptor + protoreflect.ExtensionDescriptor } -func (xt extensionTypeDescriptor) Type() pref.ExtensionType { +func (xt extensionTypeDescriptor) Type() protoreflect.ExtensionType { return extensionType{xt} } -func (xt extensionTypeDescriptor) Descriptor() pref.ExtensionDescriptor { +func (xt extensionTypeDescriptor) Descriptor() protoreflect.ExtensionDescriptor { return xt.ExtensionDescriptor } diff --git a/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go b/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go index 7f94443d2..1b2085d46 100644 --- a/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go @@ -394,7 +394,7 @@ func numValidPaths(m proto.Message, paths []string) int { // Identify the next message to search within. md = fd.Message() // may be nil - // Repeated fields are only allowed at the last postion. + // Repeated fields are only allowed at the last position. if fd.IsList() || fd.IsMap() { md = nil } diff --git a/vendor/google.golang.org/protobuf/types/pluginpb/plugin.pb.go b/vendor/google.golang.org/protobuf/types/pluginpb/plugin.pb.go new file mode 100644 index 000000000..e511ad6f7 --- /dev/null +++ b/vendor/google.golang.org/protobuf/types/pluginpb/plugin.pb.go @@ -0,0 +1,653 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// WARNING: The plugin interface is currently EXPERIMENTAL and is subject to +// change. +// +// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is +// just a program that reads a CodeGeneratorRequest from stdin and writes a +// CodeGeneratorResponse to stdout. +// +// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead +// of dealing with the raw protocol defined here. +// +// A plugin executable needs only to be placed somewhere in the path. The +// plugin should be named "protoc-gen-$NAME", and will then be used when the +// flag "--${NAME}_out" is passed to protoc. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/compiler/plugin.proto + +package pluginpb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" + sync "sync" +) + +// Sync with code_generator.h. +type CodeGeneratorResponse_Feature int32 + +const ( + CodeGeneratorResponse_FEATURE_NONE CodeGeneratorResponse_Feature = 0 + CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL CodeGeneratorResponse_Feature = 1 +) + +// Enum value maps for CodeGeneratorResponse_Feature. +var ( + CodeGeneratorResponse_Feature_name = map[int32]string{ + 0: "FEATURE_NONE", + 1: "FEATURE_PROTO3_OPTIONAL", + } + CodeGeneratorResponse_Feature_value = map[string]int32{ + "FEATURE_NONE": 0, + "FEATURE_PROTO3_OPTIONAL": 1, + } +) + +func (x CodeGeneratorResponse_Feature) Enum() *CodeGeneratorResponse_Feature { + p := new(CodeGeneratorResponse_Feature) + *p = x + return p +} + +func (x CodeGeneratorResponse_Feature) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CodeGeneratorResponse_Feature) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_compiler_plugin_proto_enumTypes[0].Descriptor() +} + +func (CodeGeneratorResponse_Feature) Type() protoreflect.EnumType { + return &file_google_protobuf_compiler_plugin_proto_enumTypes[0] +} + +func (x CodeGeneratorResponse_Feature) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *CodeGeneratorResponse_Feature) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = CodeGeneratorResponse_Feature(num) + return nil +} + +// Deprecated: Use CodeGeneratorResponse_Feature.Descriptor instead. +func (CodeGeneratorResponse_Feature) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_compiler_plugin_proto_rawDescGZIP(), []int{2, 0} +} + +// The version number of protocol compiler. +type Version struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Major *int32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"` + Minor *int32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"` + Patch *int32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"` + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + Suffix *string `protobuf:"bytes,4,opt,name=suffix" json:"suffix,omitempty"` +} + +func (x *Version) Reset() { + *x = Version{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Version) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Version) ProtoMessage() {} + +func (x *Version) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Version.ProtoReflect.Descriptor instead. +func (*Version) Descriptor() ([]byte, []int) { + return file_google_protobuf_compiler_plugin_proto_rawDescGZIP(), []int{0} +} + +func (x *Version) GetMajor() int32 { + if x != nil && x.Major != nil { + return *x.Major + } + return 0 +} + +func (x *Version) GetMinor() int32 { + if x != nil && x.Minor != nil { + return *x.Minor + } + return 0 +} + +func (x *Version) GetPatch() int32 { + if x != nil && x.Patch != nil { + return *x.Patch + } + return 0 +} + +func (x *Version) GetSuffix() string { + if x != nil && x.Suffix != nil { + return *x.Suffix + } + return "" +} + +// An encoded CodeGeneratorRequest is written to the plugin's stdin. +type CodeGeneratorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The .proto files that were explicitly listed on the command-line. The + // code generator should generate code only for these files. Each file's + // descriptor will be included in proto_file, below. + FileToGenerate []string `protobuf:"bytes,1,rep,name=file_to_generate,json=fileToGenerate" json:"file_to_generate,omitempty"` + // The generator parameter passed on the command-line. + Parameter *string `protobuf:"bytes,2,opt,name=parameter" json:"parameter,omitempty"` + // FileDescriptorProtos for all files in files_to_generate and everything + // they import. The files will appear in topological order, so each file + // appears before any file that imports it. + // + // protoc guarantees that all proto_files will be written after + // the fields above, even though this is not technically guaranteed by the + // protobuf wire format. This theoretically could allow a plugin to stream + // in the FileDescriptorProtos and handle them one by one rather than read + // the entire set into memory at once. However, as of this writing, this + // is not similarly optimized on protoc's end -- it will store all fields in + // memory at once before sending them to the plugin. + // + // Type names of fields and extensions in the FileDescriptorProto are always + // fully qualified. + ProtoFile []*descriptorpb.FileDescriptorProto `protobuf:"bytes,15,rep,name=proto_file,json=protoFile" json:"proto_file,omitempty"` + // The version number of protocol compiler. + CompilerVersion *Version `protobuf:"bytes,3,opt,name=compiler_version,json=compilerVersion" json:"compiler_version,omitempty"` +} + +func (x *CodeGeneratorRequest) Reset() { + *x = CodeGeneratorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CodeGeneratorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CodeGeneratorRequest) ProtoMessage() {} + +func (x *CodeGeneratorRequest) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CodeGeneratorRequest.ProtoReflect.Descriptor instead. +func (*CodeGeneratorRequest) Descriptor() ([]byte, []int) { + return file_google_protobuf_compiler_plugin_proto_rawDescGZIP(), []int{1} +} + +func (x *CodeGeneratorRequest) GetFileToGenerate() []string { + if x != nil { + return x.FileToGenerate + } + return nil +} + +func (x *CodeGeneratorRequest) GetParameter() string { + if x != nil && x.Parameter != nil { + return *x.Parameter + } + return "" +} + +func (x *CodeGeneratorRequest) GetProtoFile() []*descriptorpb.FileDescriptorProto { + if x != nil { + return x.ProtoFile + } + return nil +} + +func (x *CodeGeneratorRequest) GetCompilerVersion() *Version { + if x != nil { + return x.CompilerVersion + } + return nil +} + +// The plugin writes an encoded CodeGeneratorResponse to stdout. +type CodeGeneratorResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Error message. If non-empty, code generation failed. The plugin process + // should exit with status code zero even if it reports an error in this way. + // + // This should be used to indicate errors in .proto files which prevent the + // code generator from generating correct code. Errors which indicate a + // problem in protoc itself -- such as the input CodeGeneratorRequest being + // unparseable -- should be reported by writing a message to stderr and + // exiting with a non-zero status code. + Error *string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` + // A bitmask of supported features that the code generator supports. + // This is a bitwise "or" of values from the Feature enum. + SupportedFeatures *uint64 `protobuf:"varint,2,opt,name=supported_features,json=supportedFeatures" json:"supported_features,omitempty"` + File []*CodeGeneratorResponse_File `protobuf:"bytes,15,rep,name=file" json:"file,omitempty"` +} + +func (x *CodeGeneratorResponse) Reset() { + *x = CodeGeneratorResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CodeGeneratorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CodeGeneratorResponse) ProtoMessage() {} + +func (x *CodeGeneratorResponse) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CodeGeneratorResponse.ProtoReflect.Descriptor instead. +func (*CodeGeneratorResponse) Descriptor() ([]byte, []int) { + return file_google_protobuf_compiler_plugin_proto_rawDescGZIP(), []int{2} +} + +func (x *CodeGeneratorResponse) GetError() string { + if x != nil && x.Error != nil { + return *x.Error + } + return "" +} + +func (x *CodeGeneratorResponse) GetSupportedFeatures() uint64 { + if x != nil && x.SupportedFeatures != nil { + return *x.SupportedFeatures + } + return 0 +} + +func (x *CodeGeneratorResponse) GetFile() []*CodeGeneratorResponse_File { + if x != nil { + return x.File + } + return nil +} + +// Represents a single generated file. +type CodeGeneratorResponse_File struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The file name, relative to the output directory. The name must not + // contain "." or ".." components and must be relative, not be absolute (so, + // the file cannot lie outside the output directory). "/" must be used as + // the path separator, not "\". + // + // If the name is omitted, the content will be appended to the previous + // file. This allows the generator to break large files into small chunks, + // and allows the generated text to be streamed back to protoc so that large + // files need not reside completely in memory at one time. Note that as of + // this writing protoc does not optimize for this -- it will read the entire + // CodeGeneratorResponse before writing files to disk. + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // If non-empty, indicates that the named file should already exist, and the + // content here is to be inserted into that file at a defined insertion + // point. This feature allows a code generator to extend the output + // produced by another code generator. The original generator may provide + // insertion points by placing special annotations in the file that look + // like: + // @@protoc_insertion_point(NAME) + // The annotation can have arbitrary text before and after it on the line, + // which allows it to be placed in a comment. NAME should be replaced with + // an identifier naming the point -- this is what other generators will use + // as the insertion_point. Code inserted at this point will be placed + // immediately above the line containing the insertion point (thus multiple + // insertions to the same point will come out in the order they were added). + // The double-@ is intended to make it unlikely that the generated code + // could contain things that look like insertion points by accident. + // + // For example, the C++ code generator places the following line in the + // .pb.h files that it generates: + // // @@protoc_insertion_point(namespace_scope) + // This line appears within the scope of the file's package namespace, but + // outside of any particular class. Another plugin can then specify the + // insertion_point "namespace_scope" to generate additional classes or + // other declarations that should be placed in this scope. + // + // Note that if the line containing the insertion point begins with + // whitespace, the same whitespace will be added to every line of the + // inserted text. This is useful for languages like Python, where + // indentation matters. In these languages, the insertion point comment + // should be indented the same amount as any inserted code will need to be + // in order to work correctly in that context. + // + // The code generator that generates the initial file and the one which + // inserts into it must both run as part of a single invocation of protoc. + // Code generators are executed in the order in which they appear on the + // command line. + // + // If |insertion_point| is present, |name| must also be present. + InsertionPoint *string `protobuf:"bytes,2,opt,name=insertion_point,json=insertionPoint" json:"insertion_point,omitempty"` + // The file contents. + Content *string `protobuf:"bytes,15,opt,name=content" json:"content,omitempty"` + // Information describing the file content being inserted. If an insertion + // point is used, this information will be appropriately offset and inserted + // into the code generation metadata for the generated files. + GeneratedCodeInfo *descriptorpb.GeneratedCodeInfo `protobuf:"bytes,16,opt,name=generated_code_info,json=generatedCodeInfo" json:"generated_code_info,omitempty"` +} + +func (x *CodeGeneratorResponse_File) Reset() { + *x = CodeGeneratorResponse_File{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CodeGeneratorResponse_File) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CodeGeneratorResponse_File) ProtoMessage() {} + +func (x *CodeGeneratorResponse_File) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CodeGeneratorResponse_File.ProtoReflect.Descriptor instead. +func (*CodeGeneratorResponse_File) Descriptor() ([]byte, []int) { + return file_google_protobuf_compiler_plugin_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *CodeGeneratorResponse_File) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *CodeGeneratorResponse_File) GetInsertionPoint() string { + if x != nil && x.InsertionPoint != nil { + return *x.InsertionPoint + } + return "" +} + +func (x *CodeGeneratorResponse_File) GetContent() string { + if x != nil && x.Content != nil { + return *x.Content + } + return "" +} + +func (x *CodeGeneratorResponse_File) GetGeneratedCodeInfo() *descriptorpb.GeneratedCodeInfo { + if x != nil { + return x.GeneratedCodeInfo + } + return nil +} + +var File_google_protobuf_compiler_plugin_proto protoreflect.FileDescriptor + +var file_google_protobuf_compiler_plugin_proto_rawDesc = []byte{ + 0x0a, 0x25, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x63, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, + 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, + 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x22, 0xf1, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x64, + 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, 0x6c, + 0x65, 0x54, 0x6f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x4c, + 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x03, 0x0a, + 0x15, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x04, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x04, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0xb1, 0x01, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x13, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, + 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x38, 0x0a, 0x07, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, + 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, + 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x33, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, + 0x4c, 0x10, 0x01, 0x42, 0x57, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x42, 0x0c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x5a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, + 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x70, 0x62, +} + +var ( + file_google_protobuf_compiler_plugin_proto_rawDescOnce sync.Once + file_google_protobuf_compiler_plugin_proto_rawDescData = file_google_protobuf_compiler_plugin_proto_rawDesc +) + +func file_google_protobuf_compiler_plugin_proto_rawDescGZIP() []byte { + file_google_protobuf_compiler_plugin_proto_rawDescOnce.Do(func() { + file_google_protobuf_compiler_plugin_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_protobuf_compiler_plugin_proto_rawDescData) + }) + return file_google_protobuf_compiler_plugin_proto_rawDescData +} + +var file_google_protobuf_compiler_plugin_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_google_protobuf_compiler_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_google_protobuf_compiler_plugin_proto_goTypes = []interface{}{ + (CodeGeneratorResponse_Feature)(0), // 0: google.protobuf.compiler.CodeGeneratorResponse.Feature + (*Version)(nil), // 1: google.protobuf.compiler.Version + (*CodeGeneratorRequest)(nil), // 2: google.protobuf.compiler.CodeGeneratorRequest + (*CodeGeneratorResponse)(nil), // 3: google.protobuf.compiler.CodeGeneratorResponse + (*CodeGeneratorResponse_File)(nil), // 4: google.protobuf.compiler.CodeGeneratorResponse.File + (*descriptorpb.FileDescriptorProto)(nil), // 5: google.protobuf.FileDescriptorProto + (*descriptorpb.GeneratedCodeInfo)(nil), // 6: google.protobuf.GeneratedCodeInfo +} +var file_google_protobuf_compiler_plugin_proto_depIdxs = []int32{ + 5, // 0: google.protobuf.compiler.CodeGeneratorRequest.proto_file:type_name -> google.protobuf.FileDescriptorProto + 1, // 1: google.protobuf.compiler.CodeGeneratorRequest.compiler_version:type_name -> google.protobuf.compiler.Version + 4, // 2: google.protobuf.compiler.CodeGeneratorResponse.file:type_name -> google.protobuf.compiler.CodeGeneratorResponse.File + 6, // 3: google.protobuf.compiler.CodeGeneratorResponse.File.generated_code_info:type_name -> google.protobuf.GeneratedCodeInfo + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_google_protobuf_compiler_plugin_proto_init() } +func file_google_protobuf_compiler_plugin_proto_init() { + if File_google_protobuf_compiler_plugin_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_google_protobuf_compiler_plugin_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Version); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_protobuf_compiler_plugin_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CodeGeneratorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_protobuf_compiler_plugin_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CodeGeneratorResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_protobuf_compiler_plugin_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CodeGeneratorResponse_File); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_google_protobuf_compiler_plugin_proto_rawDesc, + NumEnums: 1, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_google_protobuf_compiler_plugin_proto_goTypes, + DependencyIndexes: file_google_protobuf_compiler_plugin_proto_depIdxs, + EnumInfos: file_google_protobuf_compiler_plugin_proto_enumTypes, + MessageInfos: file_google_protobuf_compiler_plugin_proto_msgTypes, + }.Build() + File_google_protobuf_compiler_plugin_proto = out.File + file_google_protobuf_compiler_plugin_proto_rawDesc = nil + file_google_protobuf_compiler_plugin_proto_goTypes = nil + file_google_protobuf_compiler_plugin_proto_depIdxs = nil +} diff --git a/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.proto b/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.proto index 37ac0d326..63c45d54d 100644 --- a/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.proto @@ -44,7 +44,7 @@ message ServerStorageVersion { repeated string decodableVersions = 3; } -// Storage version of a specific resource. +// Storage version of a specific resource. message StorageVersion { // The name is .. optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; diff --git a/vendor/k8s.io/api/apiserverinternal/v1alpha1/types.go b/vendor/k8s.io/api/apiserverinternal/v1alpha1/types.go index bfa249e13..a0437b507 100644 --- a/vendor/k8s.io/api/apiserverinternal/v1alpha1/types.go +++ b/vendor/k8s.io/api/apiserverinternal/v1alpha1/types.go @@ -24,7 +24,7 @@ import ( // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// Storage version of a specific resource. +// Storage version of a specific resource. type StorageVersion struct { metav1.TypeMeta `json:",inline"` // The name is .. diff --git a/vendor/k8s.io/api/apiserverinternal/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/apiserverinternal/v1alpha1/types_swagger_doc_generated.go index 297ed08a7..6de934200 100644 --- a/vendor/k8s.io/api/apiserverinternal/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apiserverinternal/v1alpha1/types_swagger_doc_generated.go @@ -39,7 +39,7 @@ func (ServerStorageVersion) SwaggerDoc() map[string]string { } var map_StorageVersion = map[string]string{ - "": "\n Storage version of a specific resource.", + "": "Storage version of a specific resource.", "metadata": "The name is ..", "spec": "Spec is an empty spec. It is here to comply with Kubernetes API style.", "status": "API server instances report the version they can decode and the version they encode objects to when persisting objects in the backend.", diff --git a/vendor/k8s.io/api/apps/v1/generated.proto b/vendor/k8s.io/api/apps/v1/generated.proto index 1bdc400b9..5b27b92cf 100644 --- a/vendor/k8s.io/api/apps/v1/generated.proto +++ b/vendor/k8s.io/api/apps/v1/generated.proto @@ -513,7 +513,6 @@ message RollingUpdateDaemonSet { // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may // cause evictions during disruption. - // This is beta field and enabled/disabled by DaemonSetUpdateSurge feature gate. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; } @@ -570,8 +569,9 @@ message RollingUpdateStatefulSetStrategy { // StatefulSet represents a set of pods with consistent identities. // Identities are defined as: -// - Network: A single stable DNS and hostname. -// - Storage: As many VolumeClaims as requested. +// - Network: A single stable DNS and hostname. +// - Storage: As many VolumeClaims as requested. +// // The StatefulSet guarantees that a given network identity will always // map to the same storage identity. message StatefulSet { @@ -702,7 +702,6 @@ message StatefulSetSpec { // Minimum number of seconds for which a newly created pod should be ready // without any of its container crashing for it to be considered available. // Defaults to 0 (pod will be considered available as soon as it is ready) - // This is an alpha field and requires enabling StatefulSetMinReadySeconds feature gate. // +optional optional int32 minReadySeconds = 9; @@ -758,7 +757,6 @@ message StatefulSetStatus { repeated StatefulSetCondition conditions = 10; // Total number of available pods (ready for at least minReadySeconds) targeted by this statefulset. - // This is a beta field and enabled/disabled by StatefulSetMinReadySeconds feature gate. // +optional optional int32 availableReplicas = 11; } diff --git a/vendor/k8s.io/api/apps/v1/types.go b/vendor/k8s.io/api/apps/v1/types.go index 28474be7f..e541d63d7 100644 --- a/vendor/k8s.io/api/apps/v1/types.go +++ b/vendor/k8s.io/api/apps/v1/types.go @@ -39,8 +39,9 @@ const ( // StatefulSet represents a set of pods with consistent identities. // Identities are defined as: -// - Network: A single stable DNS and hostname. -// - Storage: As many VolumeClaims as requested. +// - Network: A single stable DNS and hostname. +// - Storage: As many VolumeClaims as requested. +// // The StatefulSet guarantees that a given network identity will always // map to the same storage identity. type StatefulSet struct { @@ -225,7 +226,6 @@ type StatefulSetSpec struct { // Minimum number of seconds for which a newly created pod should be ready // without any of its container crashing for it to be considered available. // Defaults to 0 (pod will be considered available as soon as it is ready) - // This is an alpha field and requires enabling StatefulSetMinReadySeconds feature gate. // +optional MinReadySeconds int32 `json:"minReadySeconds,omitempty" protobuf:"varint,9,opt,name=minReadySeconds"` @@ -281,7 +281,6 @@ type StatefulSetStatus struct { Conditions []StatefulSetCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,10,rep,name=conditions"` // Total number of available pods (ready for at least minReadySeconds) targeted by this statefulset. - // This is a beta field and enabled/disabled by StatefulSetMinReadySeconds feature gate. // +optional AvailableReplicas int32 `json:"availableReplicas" protobuf:"varint,11,opt,name=availableReplicas"` } @@ -598,7 +597,6 @@ type RollingUpdateDaemonSet struct { // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may // cause evictions during disruption. - // This is beta field and enabled/disabled by DaemonSetUpdateSurge feature gate. // +optional MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty" protobuf:"bytes,2,opt,name=maxSurge"` } diff --git a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go index f00d10aea..3cb5e4e76 100644 --- a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go @@ -263,7 +263,7 @@ func (ReplicaSetStatus) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", - "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is beta field and enabled/disabled by DaemonSetUpdateSurge feature gate.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { @@ -291,7 +291,7 @@ func (RollingUpdateStatefulSetStrategy) SwaggerDoc() map[string]string { } var map_StatefulSet = map[string]string{ - "": "StatefulSet represents a set of pods with consistent identities. Identities are defined as:\n - Network: A single stable DNS and hostname.\n - Storage: As many VolumeClaims as requested.\nThe StatefulSet guarantees that a given network identity will always map to the same storage identity.", + "": "StatefulSet represents a set of pods with consistent identities. Identities are defined as:\n - Network: A single stable DNS and hostname.\n - Storage: As many VolumeClaims as requested.\n\nThe StatefulSet guarantees that a given network identity will always map to the same storage identity.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", "spec": "Spec defines the desired identities of pods in this set.", "status": "Status is the current status of Pods in this StatefulSet. This data may be out of date by some window of time.", @@ -344,7 +344,7 @@ var map_StatefulSetSpec = map[string]string{ "podManagementPolicy": "podManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down. The default policy is `OrderedReady`, where pods are created in increasing order (pod-0, then pod-1, etc) and the controller will wait until each pod is ready before continuing. When scaling down, the pods are removed in the opposite order. The alternative policy is `Parallel` which will create pods in parallel to match the desired scale without waiting, and on scale down will delete all pods at once.", "updateStrategy": "updateStrategy indicates the StatefulSetUpdateStrategy that will be employed to update Pods in the StatefulSet when a revision is made to Template.", "revisionHistoryLimit": "revisionHistoryLimit is the maximum number of revisions that will be maintained in the StatefulSet's revision history. The revision history consists of all revisions not represented by a currently applied StatefulSetSpec version. The default value is 10.", - "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready) This is an alpha field and requires enabling StatefulSetMinReadySeconds feature gate.", + "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", "persistentVolumeClaimRetentionPolicy": "persistentVolumeClaimRetentionPolicy describes the lifecycle of persistent volume claims created from volumeClaimTemplates. By default, all persistent volume claims are created as needed and retained until manually deleted. This policy allows the lifecycle to be altered, for example by deleting persistent volume claims when their stateful set is deleted, or when their pod is scaled down. This requires the StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha. +optional", } @@ -363,7 +363,7 @@ var map_StatefulSetStatus = map[string]string{ "updateRevision": "updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)", "collisionCount": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", "conditions": "Represents the latest available observations of a statefulset's current state.", - "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this statefulset. This is a beta field and enabled/disabled by StatefulSetMinReadySeconds feature gate.", + "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this statefulset.", } func (StatefulSetStatus) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/apps/v1beta1/generated.proto b/vendor/k8s.io/api/apps/v1beta1/generated.proto index 53df96ee4..5823613ed 100644 --- a/vendor/k8s.io/api/apps/v1beta1/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta1/generated.proto @@ -332,8 +332,9 @@ message ScaleStatus { // more information. // StatefulSet represents a set of pods with consistent identities. // Identities are defined as: -// - Network: A single stable DNS and hostname. -// - Storage: As many VolumeClaims as requested. +// - Network: A single stable DNS and hostname. +// - Storage: As many VolumeClaims as requested. +// // The StatefulSet guarantees that a given network identity will always // map to the same storage identity. message StatefulSet { @@ -460,7 +461,6 @@ message StatefulSetSpec { // Minimum number of seconds for which a newly created pod should be ready // without any of its container crashing for it to be considered available. // Defaults to 0 (pod will be considered available as soon as it is ready) - // This is an alpha field and requires enabling StatefulSetMinReadySeconds feature gate. // +optional optional int32 minReadySeconds = 9; @@ -513,7 +513,6 @@ message StatefulSetStatus { repeated StatefulSetCondition conditions = 10; // Total number of available pods (ready for at least minReadySeconds) targeted by this StatefulSet. - // This is a beta field and enabled/disabled by StatefulSetMinReadySeconds feature gate. // +optional optional int32 availableReplicas = 11; } diff --git a/vendor/k8s.io/api/apps/v1beta1/types.go b/vendor/k8s.io/api/apps/v1beta1/types.go index cdc81c956..4632c63a7 100644 --- a/vendor/k8s.io/api/apps/v1beta1/types.go +++ b/vendor/k8s.io/api/apps/v1beta1/types.go @@ -88,8 +88,9 @@ type Scale struct { // more information. // StatefulSet represents a set of pods with consistent identities. // Identities are defined as: -// - Network: A single stable DNS and hostname. -// - Storage: As many VolumeClaims as requested. +// - Network: A single stable DNS and hostname. +// - Storage: As many VolumeClaims as requested. +// // The StatefulSet guarantees that a given network identity will always // map to the same storage identity. type StatefulSet struct { @@ -267,7 +268,6 @@ type StatefulSetSpec struct { // Minimum number of seconds for which a newly created pod should be ready // without any of its container crashing for it to be considered available. // Defaults to 0 (pod will be considered available as soon as it is ready) - // This is an alpha field and requires enabling StatefulSetMinReadySeconds feature gate. // +optional MinReadySeconds int32 `json:"minReadySeconds,omitempty" protobuf:"varint,9,opt,name=minReadySeconds"` @@ -320,7 +320,6 @@ type StatefulSetStatus struct { Conditions []StatefulSetCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,10,rep,name=conditions"` // Total number of available pods (ready for at least minReadySeconds) targeted by this StatefulSet. - // This is a beta field and enabled/disabled by StatefulSetMinReadySeconds feature gate. // +optional AvailableReplicas int32 `json:"availableReplicas" protobuf:"varint,11,opt,name=availableReplicas"` } diff --git a/vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go index f57b7b2ef..47f341453 100644 --- a/vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go @@ -198,7 +198,7 @@ func (ScaleStatus) SwaggerDoc() map[string]string { } var map_StatefulSet = map[string]string{ - "": "DEPRECATED - This group version of StatefulSet is deprecated by apps/v1beta2/StatefulSet. See the release notes for more information. StatefulSet represents a set of pods with consistent identities. Identities are defined as:\n - Network: A single stable DNS and hostname.\n - Storage: As many VolumeClaims as requested.\nThe StatefulSet guarantees that a given network identity will always map to the same storage identity.", + "": "DEPRECATED - This group version of StatefulSet is deprecated by apps/v1beta2/StatefulSet. See the release notes for more information. StatefulSet represents a set of pods with consistent identities. Identities are defined as:\n - Network: A single stable DNS and hostname.\n - Storage: As many VolumeClaims as requested.\n\nThe StatefulSet guarantees that a given network identity will always map to the same storage identity.", "spec": "Spec defines the desired identities of pods in this set.", "status": "Status is the current status of Pods in this StatefulSet. This data may be out of date by some window of time.", } @@ -248,7 +248,7 @@ var map_StatefulSetSpec = map[string]string{ "podManagementPolicy": "podManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down. The default policy is `OrderedReady`, where pods are created in increasing order (pod-0, then pod-1, etc) and the controller will wait until each pod is ready before continuing. When scaling down, the pods are removed in the opposite order. The alternative policy is `Parallel` which will create pods in parallel to match the desired scale without waiting, and on scale down will delete all pods at once.", "updateStrategy": "updateStrategy indicates the StatefulSetUpdateStrategy that will be employed to update Pods in the StatefulSet when a revision is made to Template.", "revisionHistoryLimit": "revisionHistoryLimit is the maximum number of revisions that will be maintained in the StatefulSet's revision history. The revision history consists of all revisions not represented by a currently applied StatefulSetSpec version. The default value is 10.", - "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready) This is an alpha field and requires enabling StatefulSetMinReadySeconds feature gate.", + "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", "persistentVolumeClaimRetentionPolicy": "PersistentVolumeClaimRetentionPolicy describes the policy used for PVCs created from the StatefulSet VolumeClaimTemplates. This requires the StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha.", } @@ -267,7 +267,7 @@ var map_StatefulSetStatus = map[string]string{ "updateRevision": "updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)", "collisionCount": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", "conditions": "Represents the latest available observations of a statefulset's current state.", - "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this StatefulSet. This is a beta field and enabled/disabled by StatefulSetMinReadySeconds feature gate.", + "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this StatefulSet.", } func (StatefulSetStatus) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/apps/v1beta2/generated.proto b/vendor/k8s.io/api/apps/v1beta2/generated.proto index b5bc8c0ca..9103c6ba1 100644 --- a/vendor/k8s.io/api/apps/v1beta2/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta2/generated.proto @@ -519,7 +519,6 @@ message RollingUpdateDaemonSet { // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may // cause evictions during disruption. - // This is beta field and enabled/disabled by DaemonSetUpdateSurge feature gate. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; } @@ -620,8 +619,9 @@ message ScaleStatus { // more information. // StatefulSet represents a set of pods with consistent identities. // Identities are defined as: -// - Network: A single stable DNS and hostname. -// - Storage: As many VolumeClaims as requested. +// - Network: A single stable DNS and hostname. +// - Storage: As many VolumeClaims as requested. +// // The StatefulSet guarantees that a given network identity will always // map to the same storage identity. message StatefulSet { @@ -747,7 +747,6 @@ message StatefulSetSpec { // Minimum number of seconds for which a newly created pod should be ready // without any of its container crashing for it to be considered available. // Defaults to 0 (pod will be considered available as soon as it is ready) - // This is an alpha field and requires enabling StatefulSetMinReadySeconds feature gate. // +optional optional int32 minReadySeconds = 9; @@ -800,7 +799,6 @@ message StatefulSetStatus { repeated StatefulSetCondition conditions = 10; // Total number of available pods (ready for at least minReadySeconds) targeted by this StatefulSet. - // This is a beta field and enabled/disabled by StatefulSetMinReadySeconds feature gate. // +optional optional int32 availableReplicas = 11; } diff --git a/vendor/k8s.io/api/apps/v1beta2/types.go b/vendor/k8s.io/api/apps/v1beta2/types.go index 6c2448869..4e21bb267 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types.go +++ b/vendor/k8s.io/api/apps/v1beta2/types.go @@ -94,8 +94,9 @@ type Scale struct { // more information. // StatefulSet represents a set of pods with consistent identities. // Identities are defined as: -// - Network: A single stable DNS and hostname. -// - Storage: As many VolumeClaims as requested. +// - Network: A single stable DNS and hostname. +// - Storage: As many VolumeClaims as requested. +// // The StatefulSet guarantees that a given network identity will always // map to the same storage identity. type StatefulSet struct { @@ -276,7 +277,6 @@ type StatefulSetSpec struct { // Minimum number of seconds for which a newly created pod should be ready // without any of its container crashing for it to be considered available. // Defaults to 0 (pod will be considered available as soon as it is ready) - // This is an alpha field and requires enabling StatefulSetMinReadySeconds feature gate. // +optional MinReadySeconds int32 `json:"minReadySeconds,omitempty" protobuf:"varint,9,opt,name=minReadySeconds"` @@ -329,7 +329,6 @@ type StatefulSetStatus struct { Conditions []StatefulSetCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,10,rep,name=conditions"` // Total number of available pods (ready for at least minReadySeconds) targeted by this StatefulSet. - // This is a beta field and enabled/disabled by StatefulSetMinReadySeconds feature gate. // +optional AvailableReplicas int32 `json:"availableReplicas" protobuf:"varint,11,opt,name=availableReplicas"` } @@ -650,7 +649,6 @@ type RollingUpdateDaemonSet struct { // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may // cause evictions during disruption. - // This is beta field and enabled/disabled by DaemonSetUpdateSurge feature gate. // +optional MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty" protobuf:"bytes,2,opt,name=maxSurge"` } diff --git a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go index ef1de63b2..29c746d0b 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go @@ -263,7 +263,7 @@ func (ReplicaSetStatus) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", - "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is beta field and enabled/disabled by DaemonSetUpdateSurge feature gate.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { @@ -322,7 +322,7 @@ func (ScaleStatus) SwaggerDoc() map[string]string { } var map_StatefulSet = map[string]string{ - "": "DEPRECATED - This group version of StatefulSet is deprecated by apps/v1/StatefulSet. See the release notes for more information. StatefulSet represents a set of pods with consistent identities. Identities are defined as:\n - Network: A single stable DNS and hostname.\n - Storage: As many VolumeClaims as requested.\nThe StatefulSet guarantees that a given network identity will always map to the same storage identity.", + "": "DEPRECATED - This group version of StatefulSet is deprecated by apps/v1/StatefulSet. See the release notes for more information. StatefulSet represents a set of pods with consistent identities. Identities are defined as:\n - Network: A single stable DNS and hostname.\n - Storage: As many VolumeClaims as requested.\n\nThe StatefulSet guarantees that a given network identity will always map to the same storage identity.", "spec": "Spec defines the desired identities of pods in this set.", "status": "Status is the current status of Pods in this StatefulSet. This data may be out of date by some window of time.", } @@ -372,7 +372,7 @@ var map_StatefulSetSpec = map[string]string{ "podManagementPolicy": "podManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down. The default policy is `OrderedReady`, where pods are created in increasing order (pod-0, then pod-1, etc) and the controller will wait until each pod is ready before continuing. When scaling down, the pods are removed in the opposite order. The alternative policy is `Parallel` which will create pods in parallel to match the desired scale without waiting, and on scale down will delete all pods at once.", "updateStrategy": "updateStrategy indicates the StatefulSetUpdateStrategy that will be employed to update Pods in the StatefulSet when a revision is made to Template.", "revisionHistoryLimit": "revisionHistoryLimit is the maximum number of revisions that will be maintained in the StatefulSet's revision history. The revision history consists of all revisions not represented by a currently applied StatefulSetSpec version. The default value is 10.", - "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready) This is an alpha field and requires enabling StatefulSetMinReadySeconds feature gate.", + "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", "persistentVolumeClaimRetentionPolicy": "PersistentVolumeClaimRetentionPolicy describes the policy used for PVCs created from the StatefulSet VolumeClaimTemplates. This requires the StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha.", } @@ -391,7 +391,7 @@ var map_StatefulSetStatus = map[string]string{ "updateRevision": "updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)", "collisionCount": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", "conditions": "Represents the latest available observations of a statefulset's current state.", - "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this StatefulSet. This is a beta field and enabled/disabled by StatefulSetMinReadySeconds feature gate.", + "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this StatefulSet.", } func (StatefulSetStatus) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/authentication/v1/generated.proto b/vendor/k8s.io/api/authentication/v1/generated.proto index d21584209..f4806a3c6 100644 --- a/vendor/k8s.io/api/authentication/v1/generated.proto +++ b/vendor/k8s.io/api/authentication/v1/generated.proto @@ -74,7 +74,7 @@ message TokenRequest { // TokenRequestSpec contains client provided parameters of a token request. message TokenRequestSpec { // Audiences are the intendend audiences of the token. A recipient of a - // token must identitfy themself with an identifier in the list of + // token must identify themself with an identifier in the list of // audiences of the token, and otherwise should reject the token. A // token issued for multiple audiences may be used to authenticate // against any of the audiences listed but implies a high degree of diff --git a/vendor/k8s.io/api/authentication/v1/types.go b/vendor/k8s.io/api/authentication/v1/types.go index 7ba247d63..4e221e58c 100644 --- a/vendor/k8s.io/api/authentication/v1/types.go +++ b/vendor/k8s.io/api/authentication/v1/types.go @@ -151,7 +151,7 @@ type TokenRequest struct { // TokenRequestSpec contains client provided parameters of a token request. type TokenRequestSpec struct { // Audiences are the intendend audiences of the token. A recipient of a - // token must identitfy themself with an identifier in the list of + // token must identify themself with an identifier in the list of // audiences of the token, and otherwise should reject the token. A // token issued for multiple audiences may be used to authenticate // against any of the audiences listed but implies a high degree of diff --git a/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go index f9a88a3df..5d37ac1f8 100644 --- a/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go @@ -52,7 +52,7 @@ func (TokenRequest) SwaggerDoc() map[string]string { var map_TokenRequestSpec = map[string]string{ "": "TokenRequestSpec contains client provided parameters of a token request.", - "audiences": "Audiences are the intendend audiences of the token. A recipient of a token must identitfy themself with an identifier in the list of audiences of the token, and otherwise should reject the token. A token issued for multiple audiences may be used to authenticate against any of the audiences listed but implies a high degree of trust between the target audiences.", + "audiences": "Audiences are the intendend audiences of the token. A recipient of a token must identify themself with an identifier in the list of audiences of the token, and otherwise should reject the token. A token issued for multiple audiences may be used to authenticate against any of the audiences listed but implies a high degree of trust between the target audiences.", "expirationSeconds": "ExpirationSeconds is the requested duration of validity of the request. The token issuer may return a token with a different validity duration so a client needs to check the 'expiration' field in a response.", "boundObjectRef": "BoundObjectRef is a reference to an object that the token will be bound to. The token will only be valid for as long as the bound object exists. NOTE: The API server's TokenReview endpoint will validate the BoundObjectRef, but other audiences may not. Keep ExpirationSeconds small if you want prompt revocation.", } diff --git a/vendor/k8s.io/api/batch/v1/generated.pb.go b/vendor/k8s.io/api/batch/v1/generated.pb.go index 483406d84..feafc23c2 100644 --- a/vendor/k8s.io/api/batch/v1/generated.pb.go +++ b/vendor/k8s.io/api/batch/v1/generated.pb.go @@ -328,10 +328,126 @@ func (m *JobTemplateSpec) XXX_DiscardUnknown() { var xxx_messageInfo_JobTemplateSpec proto.InternalMessageInfo +func (m *PodFailurePolicy) Reset() { *m = PodFailurePolicy{} } +func (*PodFailurePolicy) ProtoMessage() {} +func (*PodFailurePolicy) Descriptor() ([]byte, []int) { + return fileDescriptor_3b52da57c93de713, []int{10} +} +func (m *PodFailurePolicy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodFailurePolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodFailurePolicy) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodFailurePolicy.Merge(m, src) +} +func (m *PodFailurePolicy) XXX_Size() int { + return m.Size() +} +func (m *PodFailurePolicy) XXX_DiscardUnknown() { + xxx_messageInfo_PodFailurePolicy.DiscardUnknown(m) +} + +var xxx_messageInfo_PodFailurePolicy proto.InternalMessageInfo + +func (m *PodFailurePolicyOnExitCodesRequirement) Reset() { + *m = PodFailurePolicyOnExitCodesRequirement{} +} +func (*PodFailurePolicyOnExitCodesRequirement) ProtoMessage() {} +func (*PodFailurePolicyOnExitCodesRequirement) Descriptor() ([]byte, []int) { + return fileDescriptor_3b52da57c93de713, []int{11} +} +func (m *PodFailurePolicyOnExitCodesRequirement) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodFailurePolicyOnExitCodesRequirement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodFailurePolicyOnExitCodesRequirement) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodFailurePolicyOnExitCodesRequirement.Merge(m, src) +} +func (m *PodFailurePolicyOnExitCodesRequirement) XXX_Size() int { + return m.Size() +} +func (m *PodFailurePolicyOnExitCodesRequirement) XXX_DiscardUnknown() { + xxx_messageInfo_PodFailurePolicyOnExitCodesRequirement.DiscardUnknown(m) +} + +var xxx_messageInfo_PodFailurePolicyOnExitCodesRequirement proto.InternalMessageInfo + +func (m *PodFailurePolicyOnPodConditionsPattern) Reset() { + *m = PodFailurePolicyOnPodConditionsPattern{} +} +func (*PodFailurePolicyOnPodConditionsPattern) ProtoMessage() {} +func (*PodFailurePolicyOnPodConditionsPattern) Descriptor() ([]byte, []int) { + return fileDescriptor_3b52da57c93de713, []int{12} +} +func (m *PodFailurePolicyOnPodConditionsPattern) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodFailurePolicyOnPodConditionsPattern) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodFailurePolicyOnPodConditionsPattern) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodFailurePolicyOnPodConditionsPattern.Merge(m, src) +} +func (m *PodFailurePolicyOnPodConditionsPattern) XXX_Size() int { + return m.Size() +} +func (m *PodFailurePolicyOnPodConditionsPattern) XXX_DiscardUnknown() { + xxx_messageInfo_PodFailurePolicyOnPodConditionsPattern.DiscardUnknown(m) +} + +var xxx_messageInfo_PodFailurePolicyOnPodConditionsPattern proto.InternalMessageInfo + +func (m *PodFailurePolicyRule) Reset() { *m = PodFailurePolicyRule{} } +func (*PodFailurePolicyRule) ProtoMessage() {} +func (*PodFailurePolicyRule) Descriptor() ([]byte, []int) { + return fileDescriptor_3b52da57c93de713, []int{13} +} +func (m *PodFailurePolicyRule) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodFailurePolicyRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodFailurePolicyRule) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodFailurePolicyRule.Merge(m, src) +} +func (m *PodFailurePolicyRule) XXX_Size() int { + return m.Size() +} +func (m *PodFailurePolicyRule) XXX_DiscardUnknown() { + xxx_messageInfo_PodFailurePolicyRule.DiscardUnknown(m) +} + +var xxx_messageInfo_PodFailurePolicyRule proto.InternalMessageInfo + func (m *UncountedTerminatedPods) Reset() { *m = UncountedTerminatedPods{} } func (*UncountedTerminatedPods) ProtoMessage() {} func (*UncountedTerminatedPods) Descriptor() ([]byte, []int) { - return fileDescriptor_3b52da57c93de713, []int{10} + return fileDescriptor_3b52da57c93de713, []int{14} } func (m *UncountedTerminatedPods) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -367,6 +483,10 @@ func init() { proto.RegisterType((*JobSpec)(nil), "k8s.io.api.batch.v1.JobSpec") proto.RegisterType((*JobStatus)(nil), "k8s.io.api.batch.v1.JobStatus") proto.RegisterType((*JobTemplateSpec)(nil), "k8s.io.api.batch.v1.JobTemplateSpec") + proto.RegisterType((*PodFailurePolicy)(nil), "k8s.io.api.batch.v1.PodFailurePolicy") + proto.RegisterType((*PodFailurePolicyOnExitCodesRequirement)(nil), "k8s.io.api.batch.v1.PodFailurePolicyOnExitCodesRequirement") + proto.RegisterType((*PodFailurePolicyOnPodConditionsPattern)(nil), "k8s.io.api.batch.v1.PodFailurePolicyOnPodConditionsPattern") + proto.RegisterType((*PodFailurePolicyRule)(nil), "k8s.io.api.batch.v1.PodFailurePolicyRule") proto.RegisterType((*UncountedTerminatedPods)(nil), "k8s.io.api.batch.v1.UncountedTerminatedPods") } @@ -375,97 +495,113 @@ func init() { } var fileDescriptor_3b52da57c93de713 = []byte{ - // 1431 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x41, 0x6f, 0x1b, 0xc5, - 0x17, 0xcf, 0xc6, 0x71, 0x6c, 0x8f, 0x93, 0xd4, 0x9d, 0xfe, 0xdb, 0xfa, 0x6f, 0x2a, 0x6f, 0x6a, - 0x0a, 0x0a, 0xa8, 0xac, 0x49, 0x88, 0x10, 0x20, 0x40, 0xca, 0xa6, 0x2a, 0x34, 0x38, 0x6a, 0x18, - 0x3b, 0x42, 0x2a, 0x05, 0xb1, 0xde, 0x1d, 0x3b, 0xdb, 0xac, 0x77, 0xac, 0x9d, 0x71, 0x84, 0x6f, - 0x48, 0x7c, 0x01, 0xf8, 0x12, 0x1c, 0x11, 0x12, 0x9c, 0x39, 0xa2, 0x1e, 0x2b, 0x4e, 0x3d, 0xad, - 0xe8, 0xf2, 0x01, 0xb8, 0x87, 0x0b, 0x9a, 0xd9, 0xf1, 0xee, 0xda, 0xde, 0x0d, 0x49, 0x0f, 0x15, - 0xb7, 0xcc, 0x9b, 0xdf, 0xfb, 0xcd, 0xdb, 0x79, 0xbf, 0x79, 0xef, 0x39, 0xe0, 0xfd, 0xe3, 0x77, - 0xa8, 0x66, 0x93, 0xe6, 0xf1, 0xa8, 0x8b, 0x3d, 0x17, 0x33, 0x4c, 0x9b, 0x27, 0xd8, 0xb5, 0x88, - 0xd7, 0x94, 0x1b, 0xc6, 0xd0, 0x6e, 0x76, 0x0d, 0x66, 0x1e, 0x35, 0x4f, 0x36, 0x9b, 0x7d, 0xec, - 0x62, 0xcf, 0x60, 0xd8, 0xd2, 0x86, 0x1e, 0x61, 0x04, 0x5e, 0x09, 0x41, 0x9a, 0x31, 0xb4, 0x35, - 0x01, 0xd2, 0x4e, 0x36, 0x6b, 0x6f, 0xf4, 0x6d, 0x76, 0x34, 0xea, 0x6a, 0x26, 0x19, 0x34, 0xfb, - 0xa4, 0x4f, 0x9a, 0x02, 0xdb, 0x1d, 0xf5, 0xc4, 0x4a, 0x2c, 0xc4, 0x5f, 0x21, 0x47, 0xad, 0x91, - 0x38, 0xc8, 0x24, 0x1e, 0x4e, 0x39, 0xa7, 0xb6, 0x1d, 0x63, 0x06, 0x86, 0x79, 0x64, 0xbb, 0xd8, - 0x1b, 0x37, 0x87, 0xc7, 0x7d, 0x6e, 0xa0, 0xcd, 0x01, 0x66, 0x46, 0x9a, 0x57, 0x33, 0xcb, 0xcb, - 0x1b, 0xb9, 0xcc, 0x1e, 0xe0, 0x39, 0x87, 0xb7, 0xff, 0xcd, 0x81, 0x9a, 0x47, 0x78, 0x60, 0xcc, - 0xfa, 0x35, 0xfe, 0x56, 0x40, 0x61, 0xd7, 0x23, 0xee, 0x1e, 0xe9, 0xc2, 0xaf, 0x40, 0x91, 0xc7, - 0x63, 0x19, 0xcc, 0xa8, 0x2a, 0xeb, 0xca, 0x46, 0x79, 0xeb, 0x4d, 0x2d, 0xbe, 0xa5, 0x88, 0x56, - 0x1b, 0x1e, 0xf7, 0xb9, 0x81, 0x6a, 0x1c, 0xad, 0x9d, 0x6c, 0x6a, 0xf7, 0xbb, 0x8f, 0xb0, 0xc9, - 0xf6, 0x31, 0x33, 0x74, 0xf8, 0xd8, 0x57, 0x17, 0x02, 0x5f, 0x05, 0xb1, 0x0d, 0x45, 0xac, 0x50, - 0x07, 0x4b, 0x74, 0x88, 0xcd, 0xea, 0xa2, 0x60, 0x5f, 0xd7, 0x52, 0x72, 0xa0, 0xc9, 0x68, 0xda, - 0x43, 0x6c, 0xea, 0x2b, 0x92, 0x6d, 0x89, 0xaf, 0x90, 0xf0, 0x85, 0x7b, 0x60, 0x99, 0x32, 0x83, - 0x8d, 0x68, 0x35, 0x27, 0x58, 0x1a, 0x67, 0xb2, 0x08, 0xa4, 0xbe, 0x26, 0x79, 0x96, 0xc3, 0x35, - 0x92, 0x0c, 0x8d, 0x1f, 0x15, 0x50, 0x96, 0xc8, 0x96, 0x4d, 0x19, 0x7c, 0x38, 0x77, 0x03, 0xda, - 0xf9, 0x6e, 0x80, 0x7b, 0x8b, 0xef, 0xaf, 0xc8, 0x93, 0x8a, 0x13, 0x4b, 0xe2, 0xeb, 0x77, 0x40, - 0xde, 0x66, 0x78, 0x40, 0xab, 0x8b, 0xeb, 0xb9, 0x8d, 0xf2, 0xd6, 0x8d, 0xb3, 0x02, 0xd7, 0x57, - 0x25, 0x51, 0xfe, 0x1e, 0x77, 0x41, 0xa1, 0x67, 0xe3, 0xf7, 0xa5, 0x28, 0x60, 0x7e, 0x25, 0xf0, - 0x36, 0x28, 0xf2, 0xc4, 0x5a, 0x23, 0x07, 0x8b, 0x80, 0x4b, 0x71, 0x00, 0x6d, 0x69, 0x47, 0x11, - 0x02, 0x6e, 0x80, 0x22, 0xd7, 0xc2, 0x03, 0xe2, 0xe2, 0x6a, 0x51, 0xa0, 0x57, 0x38, 0xb2, 0x23, - 0x6d, 0x28, 0xda, 0x85, 0x87, 0xe0, 0x3a, 0x65, 0x86, 0xc7, 0x6c, 0xb7, 0x7f, 0x07, 0x1b, 0x96, - 0x63, 0xbb, 0xb8, 0x8d, 0x4d, 0xe2, 0x5a, 0x54, 0xe4, 0x2e, 0xa7, 0xbf, 0x14, 0xf8, 0xea, 0xf5, - 0x76, 0x3a, 0x04, 0x65, 0xf9, 0xc2, 0x87, 0xe0, 0xb2, 0x49, 0x5c, 0x73, 0xe4, 0x79, 0xd8, 0x35, - 0xc7, 0x07, 0xc4, 0xb1, 0xcd, 0xb1, 0x48, 0x63, 0x49, 0xd7, 0x64, 0xdc, 0x97, 0x77, 0x67, 0x01, - 0xa7, 0x69, 0x46, 0x34, 0x4f, 0x04, 0x5f, 0x01, 0x05, 0x3a, 0xa2, 0x43, 0xec, 0x5a, 0xd5, 0xa5, - 0x75, 0x65, 0xa3, 0xa8, 0x97, 0x03, 0x5f, 0x2d, 0xb4, 0x43, 0x13, 0x9a, 0xec, 0xc1, 0xcf, 0x41, - 0xf9, 0x11, 0xe9, 0x76, 0xf0, 0x60, 0xe8, 0x18, 0x0c, 0x57, 0xf3, 0x22, 0xcf, 0xb7, 0x52, 0x93, - 0xb1, 0x17, 0xe3, 0x84, 0x1e, 0xaf, 0xc8, 0x20, 0xcb, 0x89, 0x0d, 0x94, 0x64, 0x83, 0x5f, 0x82, - 0x1a, 0x1d, 0x99, 0x26, 0xa6, 0xb4, 0x37, 0x72, 0xf6, 0x48, 0x97, 0x7e, 0x6c, 0x53, 0x46, 0xbc, - 0x71, 0xcb, 0x1e, 0xd8, 0xac, 0xba, 0xbc, 0xae, 0x6c, 0xe4, 0xf5, 0x7a, 0xe0, 0xab, 0xb5, 0x76, - 0x26, 0x0a, 0x9d, 0xc1, 0x00, 0x11, 0xb8, 0xd6, 0x33, 0x6c, 0x07, 0x5b, 0x73, 0xdc, 0x05, 0xc1, - 0x5d, 0x0b, 0x7c, 0xf5, 0xda, 0xdd, 0x54, 0x04, 0xca, 0xf0, 0x6c, 0xfc, 0xba, 0x08, 0x56, 0xa7, - 0xde, 0x0b, 0xfc, 0x04, 0x2c, 0x1b, 0x26, 0xb3, 0x4f, 0xb8, 0xa8, 0xb8, 0x54, 0x5f, 0x4e, 0xde, - 0x0e, 0xaf, 0x74, 0xf1, 0xab, 0x47, 0xb8, 0x87, 0x79, 0x12, 0x70, 0xfc, 0xc8, 0x76, 0x84, 0x2b, - 0x92, 0x14, 0xd0, 0x01, 0x15, 0xc7, 0xa0, 0x6c, 0xa2, 0x47, 0xae, 0x36, 0x91, 0x9f, 0xf2, 0xd6, - 0xeb, 0xe7, 0x7b, 0x5c, 0xdc, 0x43, 0xff, 0x5f, 0xe0, 0xab, 0x95, 0xd6, 0x0c, 0x0f, 0x9a, 0x63, - 0x86, 0x1e, 0x80, 0xc2, 0x16, 0x5d, 0xa1, 0x38, 0x2f, 0x7f, 0xe1, 0xf3, 0xae, 0x05, 0xbe, 0x0a, - 0x5b, 0x73, 0x4c, 0x28, 0x85, 0xbd, 0xf1, 0x97, 0x02, 0x72, 0x2f, 0xa6, 0x80, 0x7e, 0x38, 0x55, - 0x40, 0x6f, 0x64, 0x89, 0x36, 0xb3, 0x78, 0xde, 0x9d, 0x29, 0x9e, 0xf5, 0x4c, 0x86, 0xb3, 0x0b, - 0xe7, 0x6f, 0x39, 0xb0, 0xb2, 0x47, 0xba, 0xbb, 0xc4, 0xb5, 0x6c, 0x66, 0x13, 0x17, 0x6e, 0x83, - 0x25, 0x36, 0x1e, 0x4e, 0x8a, 0xd0, 0xfa, 0xe4, 0xe8, 0xce, 0x78, 0x88, 0x4f, 0x7d, 0xb5, 0x92, - 0xc4, 0x72, 0x1b, 0x12, 0x68, 0xd8, 0x8a, 0xc2, 0x59, 0x14, 0x7e, 0xdb, 0xd3, 0xc7, 0x9d, 0xfa, - 0x6a, 0x4a, 0x8b, 0xd5, 0x22, 0xa6, 0xe9, 0xa0, 0x60, 0x1f, 0xac, 0xf2, 0xe4, 0x1c, 0x78, 0xa4, - 0x1b, 0xaa, 0x2c, 0x77, 0xe1, 0xac, 0x5f, 0x95, 0x01, 0xac, 0xb6, 0x92, 0x44, 0x68, 0x9a, 0x17, - 0x9e, 0x84, 0x1a, 0xeb, 0x78, 0x86, 0x4b, 0xc3, 0x4f, 0x7a, 0x3e, 0x4d, 0xd7, 0xe4, 0x69, 0x42, - 0x67, 0xd3, 0x6c, 0x28, 0xe5, 0x04, 0xf8, 0x2a, 0x58, 0xf6, 0xb0, 0x41, 0x89, 0x2b, 0xf4, 0x5c, - 0x8a, 0xb3, 0x83, 0x84, 0x15, 0xc9, 0x5d, 0xf8, 0x1a, 0x28, 0x0c, 0x30, 0xa5, 0x46, 0x1f, 0x8b, - 0x8a, 0x53, 0xd2, 0x2f, 0x49, 0x60, 0x61, 0x3f, 0x34, 0xa3, 0xc9, 0x7e, 0xe3, 0x07, 0x05, 0x14, - 0x5e, 0x4c, 0xf7, 0xfb, 0x60, 0xba, 0xfb, 0x55, 0xb3, 0x94, 0x97, 0xd1, 0xf9, 0x7e, 0xca, 0x8b, - 0x40, 0x45, 0xd7, 0xdb, 0x04, 0xe5, 0xa1, 0xe1, 0x19, 0x8e, 0x83, 0x1d, 0x9b, 0x0e, 0x44, 0xac, - 0x79, 0xfd, 0x12, 0xaf, 0xcb, 0x07, 0xb1, 0x19, 0x25, 0x31, 0xdc, 0xc5, 0x24, 0x83, 0xa1, 0x83, - 0xf9, 0x65, 0x86, 0x72, 0x93, 0x2e, 0xbb, 0xb1, 0x19, 0x25, 0x31, 0xf0, 0x3e, 0xb8, 0x1a, 0x56, - 0xb0, 0xd9, 0x0e, 0x98, 0x13, 0x1d, 0xf0, 0xff, 0x81, 0xaf, 0x5e, 0xdd, 0x49, 0x03, 0xa0, 0x74, - 0x3f, 0xb8, 0x0d, 0x56, 0xba, 0x86, 0x79, 0x4c, 0x7a, 0xbd, 0x64, 0xc5, 0xae, 0x04, 0xbe, 0xba, - 0xa2, 0x27, 0xec, 0x68, 0x0a, 0x05, 0xbf, 0x00, 0x45, 0x8a, 0x1d, 0x6c, 0x32, 0xe2, 0x49, 0x89, - 0xbd, 0x75, 0xce, 0xac, 0x18, 0x5d, 0xec, 0xb4, 0xa5, 0x6b, 0xd8, 0xe9, 0x27, 0x2b, 0x14, 0x51, - 0xc2, 0xf7, 0xc0, 0xda, 0xc0, 0x70, 0x47, 0x46, 0x84, 0x14, 0xda, 0x2a, 0xea, 0x30, 0xf0, 0xd5, - 0xb5, 0xfd, 0xa9, 0x1d, 0x34, 0x83, 0x84, 0x9f, 0x82, 0x22, 0x9b, 0xb4, 0xd1, 0x65, 0x11, 0x5a, - 0x6a, 0xa3, 0x38, 0x20, 0xd6, 0x54, 0x17, 0x8d, 0x54, 0x12, 0xb5, 0xd0, 0x88, 0x86, 0x0f, 0x1e, - 0x8c, 0x39, 0xf2, 0xc6, 0x76, 0x7a, 0x0c, 0x7b, 0x77, 0x6d, 0xd7, 0xa6, 0x47, 0xd8, 0x12, 0x13, - 0x4b, 0x3e, 0x1c, 0x3c, 0x3a, 0x9d, 0x56, 0x1a, 0x04, 0x65, 0xf9, 0xc2, 0x16, 0x58, 0x8b, 0x53, - 0xbb, 0x4f, 0x2c, 0x5c, 0x2d, 0x89, 0x87, 0x71, 0x8b, 0x7f, 0xe5, 0xee, 0xd4, 0xce, 0xe9, 0x9c, - 0x05, 0xcd, 0xf8, 0x26, 0x07, 0x0d, 0x90, 0x3d, 0x68, 0x34, 0xbe, 0xcf, 0x83, 0x52, 0xdc, 0x53, - 0x0f, 0x01, 0x30, 0x27, 0x85, 0x8b, 0xca, 0xbe, 0x7a, 0x33, 0xeb, 0x11, 0x44, 0x25, 0x2e, 0xee, - 0x07, 0x91, 0x89, 0xa2, 0x04, 0x11, 0xfc, 0x0c, 0x94, 0xc4, 0xb4, 0x25, 0x4a, 0xd0, 0xe2, 0x85, - 0x4b, 0xd0, 0x6a, 0xe0, 0xab, 0xa5, 0xf6, 0x84, 0x00, 0xc5, 0x5c, 0xb0, 0x97, 0xbc, 0xb2, 0xe7, - 0x2c, 0xa7, 0x70, 0xfa, 0x7a, 0xc5, 0x11, 0x33, 0xac, 0xbc, 0xa8, 0xc9, 0x59, 0x63, 0x49, 0x24, - 0x38, 0x6b, 0x8c, 0x68, 0x82, 0x92, 0x98, 0x8b, 0xb0, 0x85, 0x2d, 0xa1, 0xd1, 0xbc, 0x7e, 0x59, - 0x42, 0x4b, 0xed, 0xc9, 0x06, 0x8a, 0x31, 0x9c, 0x38, 0x1c, 0x78, 0xe4, 0xd8, 0x15, 0x11, 0x87, - 0xe3, 0x11, 0x92, 0xbb, 0xf0, 0x0e, 0xa8, 0xc8, 0x90, 0xb0, 0x75, 0xcf, 0xb5, 0xf0, 0xd7, 0x98, - 0x8a, 0xa7, 0x59, 0xd2, 0xab, 0xd2, 0xa3, 0xb2, 0x3b, 0xb3, 0x8f, 0xe6, 0x3c, 0xe0, 0xb7, 0x0a, - 0xb8, 0x3e, 0x72, 0x4d, 0x32, 0x72, 0x19, 0xb6, 0x3a, 0xd8, 0x1b, 0xd8, 0x2e, 0xff, 0x99, 0x75, - 0x40, 0x2c, 0x2a, 0x94, 0x5b, 0xde, 0xba, 0x9d, 0x9a, 0xec, 0xc3, 0x74, 0x9f, 0x50, 0xe7, 0x19, - 0x9b, 0x28, 0xeb, 0x24, 0xa8, 0x82, 0xbc, 0x87, 0x0d, 0x6b, 0x2c, 0xe4, 0x9d, 0xd7, 0x4b, 0xbc, - 0x8c, 0x22, 0x6e, 0x40, 0xa1, 0xbd, 0xf1, 0xb3, 0x02, 0x2e, 0xcd, 0x4c, 0xb5, 0xff, 0xfd, 0xb1, - 0xa5, 0xf1, 0x8b, 0x02, 0xb2, 0xee, 0x02, 0x1e, 0x24, 0x75, 0xc1, 0x9f, 0x55, 0x49, 0xdf, 0x9a, - 0xd2, 0xc4, 0xa9, 0xaf, 0xde, 0xcc, 0xfa, 0x75, 0xcc, 0xa7, 0x10, 0xaa, 0x1d, 0xde, 0xbb, 0x93, - 0x14, 0xce, 0x47, 0x91, 0x70, 0x16, 0x05, 0x5d, 0x33, 0x16, 0xcd, 0xf9, 0xb8, 0xa4, 0xbb, 0xfe, - 0xee, 0xe3, 0x67, 0xf5, 0x85, 0x27, 0xcf, 0xea, 0x0b, 0x4f, 0x9f, 0xd5, 0x17, 0xbe, 0x09, 0xea, - 0xca, 0xe3, 0xa0, 0xae, 0x3c, 0x09, 0xea, 0xca, 0xd3, 0xa0, 0xae, 0xfc, 0x11, 0xd4, 0x95, 0xef, - 0xfe, 0xac, 0x2f, 0x3c, 0xb8, 0x92, 0xf2, 0xef, 0x8a, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xae, - 0xfd, 0x54, 0xb2, 0xdd, 0x10, 0x00, 0x00, + // 1696 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4f, 0x73, 0xe3, 0x48, + 0x15, 0x8f, 0xe2, 0xd8, 0xb1, 0xdb, 0xc9, 0xc4, 0xd3, 0xb3, 0x33, 0x63, 0xc2, 0x96, 0x95, 0xd5, + 0xec, 0x6e, 0x65, 0xa9, 0x45, 0x66, 0xb2, 0x53, 0x2c, 0xff, 0x8b, 0x91, 0x87, 0x59, 0x26, 0x78, + 0x36, 0xa6, 0x9d, 0x40, 0xd5, 0xb2, 0x50, 0xc8, 0x52, 0xdb, 0xd1, 0x46, 0x56, 0x1b, 0x75, 0x2b, + 0xb5, 0xb9, 0x50, 0x54, 0xf1, 0x05, 0xe0, 0xc8, 0x17, 0xe0, 0xc8, 0x05, 0xce, 0x70, 0xa3, 0x72, + 0xdc, 0xe2, 0xb4, 0xc5, 0x41, 0xc5, 0x88, 0x0f, 0xc0, 0x3d, 0x5c, 0xa8, 0x6e, 0xb5, 0xf5, 0xcf, + 0x52, 0xc8, 0x6c, 0x15, 0x5b, 0xdc, 0xa2, 0xf7, 0x7e, 0xef, 0xd7, 0x4f, 0xfd, 0x9e, 0x7e, 0xef, + 0xc5, 0xe0, 0x5b, 0x67, 0x5f, 0xa3, 0xba, 0x43, 0xfa, 0x67, 0xc1, 0x04, 0xfb, 0x1e, 0x66, 0x98, + 0xf6, 0xcf, 0xb1, 0x67, 0x13, 0xbf, 0x2f, 0x1d, 0xe6, 0xc2, 0xe9, 0x4f, 0x4c, 0x66, 0x9d, 0xf6, + 0xcf, 0x1f, 0xf6, 0x67, 0xd8, 0xc3, 0xbe, 0xc9, 0xb0, 0xad, 0x2f, 0x7c, 0xc2, 0x08, 0xbc, 0x13, + 0x83, 0x74, 0x73, 0xe1, 0xe8, 0x02, 0xa4, 0x9f, 0x3f, 0xdc, 0xfd, 0xf2, 0xcc, 0x61, 0xa7, 0xc1, + 0x44, 0xb7, 0xc8, 0xbc, 0x3f, 0x23, 0x33, 0xd2, 0x17, 0xd8, 0x49, 0x30, 0x15, 0x4f, 0xe2, 0x41, + 0xfc, 0x15, 0x73, 0xec, 0x6a, 0x99, 0x83, 0x2c, 0xe2, 0xe3, 0x92, 0x73, 0x76, 0x1f, 0xa5, 0x98, + 0xb9, 0x69, 0x9d, 0x3a, 0x1e, 0xf6, 0x2f, 0xfa, 0x8b, 0xb3, 0x19, 0x37, 0xd0, 0xfe, 0x1c, 0x33, + 0xb3, 0x2c, 0xaa, 0x5f, 0x15, 0xe5, 0x07, 0x1e, 0x73, 0xe6, 0x78, 0x25, 0xe0, 0xab, 0xff, 0x2d, + 0x80, 0x5a, 0xa7, 0x78, 0x6e, 0x16, 0xe3, 0xb4, 0x7f, 0x2b, 0x60, 0x73, 0xe0, 0x13, 0xef, 0x90, + 0x4c, 0xe0, 0xcf, 0x41, 0x93, 0xe7, 0x63, 0x9b, 0xcc, 0xec, 0x2a, 0x7b, 0xca, 0x7e, 0xfb, 0xe0, + 0x2b, 0x7a, 0x7a, 0x4b, 0x09, 0xad, 0xbe, 0x38, 0x9b, 0x71, 0x03, 0xd5, 0x39, 0x5a, 0x3f, 0x7f, + 0xa8, 0x1f, 0x4d, 0x3e, 0xc2, 0x16, 0x7b, 0x8e, 0x99, 0x69, 0xc0, 0xcb, 0x50, 0x5d, 0x8b, 0x42, + 0x15, 0xa4, 0x36, 0x94, 0xb0, 0x42, 0x03, 0x6c, 0xd0, 0x05, 0xb6, 0xba, 0xeb, 0x82, 0x7d, 0x4f, + 0x2f, 0xa9, 0x81, 0x2e, 0xb3, 0x19, 0x2f, 0xb0, 0x65, 0x6c, 0x49, 0xb6, 0x0d, 0xfe, 0x84, 0x44, + 0x2c, 0x3c, 0x04, 0x0d, 0xca, 0x4c, 0x16, 0xd0, 0x6e, 0x4d, 0xb0, 0x68, 0xd7, 0xb2, 0x08, 0xa4, + 0x71, 0x4b, 0xf2, 0x34, 0xe2, 0x67, 0x24, 0x19, 0xb4, 0x3f, 0x28, 0xa0, 0x2d, 0x91, 0x43, 0x87, + 0x32, 0xf8, 0xe1, 0xca, 0x0d, 0xe8, 0x37, 0xbb, 0x01, 0x1e, 0x2d, 0xde, 0xbf, 0x23, 0x4f, 0x6a, + 0x2e, 0x2d, 0x99, 0xb7, 0x7f, 0x0c, 0xea, 0x0e, 0xc3, 0x73, 0xda, 0x5d, 0xdf, 0xab, 0xed, 0xb7, + 0x0f, 0x5e, 0xbd, 0x2e, 0x71, 0x63, 0x5b, 0x12, 0xd5, 0x9f, 0xf1, 0x10, 0x14, 0x47, 0x6a, 0x7f, + 0xdb, 0x48, 0x12, 0xe6, 0x57, 0x02, 0xdf, 0x06, 0x4d, 0x5e, 0x58, 0x3b, 0x70, 0xb1, 0x48, 0xb8, + 0x95, 0x26, 0x30, 0x96, 0x76, 0x94, 0x20, 0xe0, 0x3e, 0x68, 0xf2, 0x5e, 0xf8, 0x80, 0x78, 0xb8, + 0xdb, 0x14, 0xe8, 0x2d, 0x8e, 0x3c, 0x96, 0x36, 0x94, 0x78, 0xe1, 0x09, 0xb8, 0x4f, 0x99, 0xe9, + 0x33, 0xc7, 0x9b, 0x3d, 0xc1, 0xa6, 0xed, 0x3a, 0x1e, 0x1e, 0x63, 0x8b, 0x78, 0x36, 0x15, 0xb5, + 0xab, 0x19, 0x5f, 0x8c, 0x42, 0xf5, 0xfe, 0xb8, 0x1c, 0x82, 0xaa, 0x62, 0xe1, 0x87, 0xe0, 0xb6, + 0x45, 0x3c, 0x2b, 0xf0, 0x7d, 0xec, 0x59, 0x17, 0x23, 0xe2, 0x3a, 0xd6, 0x85, 0x28, 0x63, 0xcb, + 0xd0, 0x65, 0xde, 0xb7, 0x07, 0x45, 0xc0, 0x55, 0x99, 0x11, 0xad, 0x12, 0xc1, 0x37, 0xc0, 0x26, + 0x0d, 0xe8, 0x02, 0x7b, 0x76, 0x77, 0x63, 0x4f, 0xd9, 0x6f, 0x1a, 0xed, 0x28, 0x54, 0x37, 0xc7, + 0xb1, 0x09, 0x2d, 0x7d, 0xf0, 0x27, 0xa0, 0xfd, 0x11, 0x99, 0x1c, 0xe3, 0xf9, 0xc2, 0x35, 0x19, + 0xee, 0xd6, 0x45, 0x9d, 0x5f, 0x2f, 0x2d, 0xc6, 0x61, 0x8a, 0x13, 0xfd, 0x78, 0x47, 0x26, 0xd9, + 0xce, 0x38, 0x50, 0x96, 0x0d, 0xfe, 0x0c, 0xec, 0xd2, 0xc0, 0xb2, 0x30, 0xa5, 0xd3, 0xc0, 0x3d, + 0x24, 0x13, 0xfa, 0x7d, 0x87, 0x32, 0xe2, 0x5f, 0x0c, 0x9d, 0xb9, 0xc3, 0xba, 0x8d, 0x3d, 0x65, + 0xbf, 0x6e, 0xf4, 0xa2, 0x50, 0xdd, 0x1d, 0x57, 0xa2, 0xd0, 0x35, 0x0c, 0x10, 0x81, 0x7b, 0x53, + 0xd3, 0x71, 0xb1, 0xbd, 0xc2, 0xbd, 0x29, 0xb8, 0x77, 0xa3, 0x50, 0xbd, 0xf7, 0xb4, 0x14, 0x81, + 0x2a, 0x22, 0xb5, 0x3f, 0xaf, 0x83, 0xed, 0xdc, 0xf7, 0x02, 0x7f, 0x00, 0x1a, 0xa6, 0xc5, 0x9c, + 0x73, 0xde, 0x54, 0xbc, 0x55, 0x1f, 0x64, 0x6f, 0x87, 0x2b, 0x5d, 0xfa, 0xd5, 0x23, 0x3c, 0xc5, + 0xbc, 0x08, 0x38, 0xfd, 0xc8, 0x1e, 0x8b, 0x50, 0x24, 0x29, 0xa0, 0x0b, 0x3a, 0xae, 0x49, 0xd9, + 0xb2, 0x1f, 0x79, 0xb7, 0x89, 0xfa, 0xb4, 0x0f, 0xbe, 0x74, 0xb3, 0x8f, 0x8b, 0x47, 0x18, 0xaf, + 0x44, 0xa1, 0xda, 0x19, 0x16, 0x78, 0xd0, 0x0a, 0x33, 0xf4, 0x01, 0x14, 0xb6, 0xe4, 0x0a, 0xc5, + 0x79, 0xf5, 0x97, 0x3e, 0xef, 0x5e, 0x14, 0xaa, 0x70, 0xb8, 0xc2, 0x84, 0x4a, 0xd8, 0xb5, 0x7f, + 0x29, 0xa0, 0xf6, 0xf9, 0x08, 0xe8, 0x77, 0x72, 0x02, 0xfa, 0x6a, 0x55, 0xd3, 0x56, 0x8a, 0xe7, + 0xd3, 0x82, 0x78, 0xf6, 0x2a, 0x19, 0xae, 0x17, 0xce, 0xbf, 0xd6, 0xc0, 0xd6, 0x21, 0x99, 0x0c, + 0x88, 0x67, 0x3b, 0xcc, 0x21, 0x1e, 0x7c, 0x04, 0x36, 0xd8, 0xc5, 0x62, 0x29, 0x42, 0x7b, 0xcb, + 0xa3, 0x8f, 0x2f, 0x16, 0xf8, 0x2a, 0x54, 0x3b, 0x59, 0x2c, 0xb7, 0x21, 0x81, 0x86, 0xc3, 0x24, + 0x9d, 0x75, 0x11, 0xf7, 0x28, 0x7f, 0xdc, 0x55, 0xa8, 0x96, 0x8c, 0x58, 0x3d, 0x61, 0xca, 0x27, + 0x05, 0x67, 0x60, 0x9b, 0x17, 0x67, 0xe4, 0x93, 0x49, 0xdc, 0x65, 0xb5, 0x97, 0xae, 0xfa, 0x5d, + 0x99, 0xc0, 0xf6, 0x30, 0x4b, 0x84, 0xf2, 0xbc, 0xf0, 0x3c, 0xee, 0xb1, 0x63, 0xdf, 0xf4, 0x68, + 0xfc, 0x4a, 0x9f, 0xad, 0xa7, 0x77, 0xe5, 0x69, 0xa2, 0xcf, 0xf2, 0x6c, 0xa8, 0xe4, 0x04, 0xf8, + 0x26, 0x68, 0xf8, 0xd8, 0xa4, 0xc4, 0x13, 0xfd, 0xdc, 0x4a, 0xab, 0x83, 0x84, 0x15, 0x49, 0x2f, + 0x7c, 0x0b, 0x6c, 0xce, 0x31, 0xa5, 0xe6, 0x0c, 0x0b, 0xc5, 0x69, 0x19, 0x3b, 0x12, 0xb8, 0xf9, + 0x3c, 0x36, 0xa3, 0xa5, 0x5f, 0xfb, 0xbd, 0x02, 0x36, 0x3f, 0x9f, 0xe9, 0xf7, 0xed, 0xfc, 0xf4, + 0xeb, 0x56, 0x75, 0x5e, 0xc5, 0xe4, 0xfb, 0x5d, 0x43, 0x24, 0x2a, 0xa6, 0xde, 0x43, 0xd0, 0x5e, + 0x98, 0xbe, 0xe9, 0xba, 0xd8, 0x75, 0xe8, 0x5c, 0xe4, 0x5a, 0x37, 0x76, 0xb8, 0x2e, 0x8f, 0x52, + 0x33, 0xca, 0x62, 0x78, 0x88, 0x45, 0xe6, 0x0b, 0x17, 0xf3, 0xcb, 0x8c, 0xdb, 0x4d, 0x86, 0x0c, + 0x52, 0x33, 0xca, 0x62, 0xe0, 0x11, 0xb8, 0x1b, 0x2b, 0x58, 0x71, 0x02, 0xd6, 0xc4, 0x04, 0xfc, + 0x42, 0x14, 0xaa, 0x77, 0x1f, 0x97, 0x01, 0x50, 0x79, 0x1c, 0x9c, 0x81, 0xce, 0x82, 0xd8, 0x5c, + 0x9c, 0x03, 0x1f, 0xcb, 0xe1, 0xd7, 0x16, 0xf7, 0xfc, 0x46, 0xe9, 0x65, 0x8c, 0x0a, 0xe0, 0x58, + 0x03, 0x8b, 0x56, 0xb4, 0x42, 0x0a, 0x1f, 0x81, 0xad, 0x89, 0x69, 0x9d, 0x91, 0xe9, 0x34, 0x3b, + 0x1a, 0x3a, 0x51, 0xa8, 0x6e, 0x19, 0x19, 0x3b, 0xca, 0xa1, 0xe0, 0x4f, 0x41, 0x93, 0x62, 0x17, + 0x5b, 0x8c, 0xf8, 0xb2, 0x97, 0xdf, 0xb9, 0x61, 0xf9, 0xcd, 0x09, 0x76, 0xc7, 0x32, 0x34, 0x5e, + 0x29, 0x96, 0x4f, 0x28, 0xa1, 0x84, 0xdf, 0x00, 0xb7, 0xe6, 0xa6, 0x17, 0x98, 0x09, 0x52, 0x34, + 0x71, 0xd3, 0x80, 0x51, 0xa8, 0xde, 0x7a, 0x9e, 0xf3, 0xa0, 0x02, 0x12, 0xfe, 0x10, 0x34, 0xd9, + 0x72, 0x5e, 0x37, 0x44, 0x6a, 0xa5, 0x13, 0x69, 0x44, 0xec, 0xdc, 0xb8, 0x4e, 0xda, 0x31, 0x99, + 0xd5, 0x09, 0x0d, 0xdf, 0x70, 0x18, 0x73, 0x65, 0x69, 0x1e, 0x4f, 0x19, 0xf6, 0x9f, 0x3a, 0x9e, + 0x43, 0x4f, 0xb1, 0x2d, 0x56, 0xa3, 0x7a, 0xbc, 0xe1, 0x1c, 0x1f, 0x0f, 0xcb, 0x20, 0xa8, 0x2a, + 0x16, 0x0e, 0xc1, 0xad, 0xb4, 0x87, 0x9e, 0x13, 0x1b, 0x77, 0x5b, 0xe2, 0x0b, 0x7c, 0x9d, 0xbf, + 0xe5, 0x20, 0xe7, 0xb9, 0x5a, 0xb1, 0xa0, 0x42, 0x6c, 0x76, 0xa3, 0x01, 0xd5, 0x1b, 0x8d, 0xf6, + 0xdb, 0x3a, 0x68, 0xa5, 0xc3, 0xfb, 0x04, 0x00, 0x6b, 0xa9, 0x90, 0x54, 0x0e, 0xf0, 0xd7, 0xaa, + 0xbe, 0xb6, 0x44, 0x4b, 0xd3, 0xc1, 0x93, 0x98, 0x28, 0xca, 0x10, 0xc1, 0x1f, 0x83, 0x96, 0x58, + 0xeb, 0x84, 0xd6, 0xad, 0xbf, 0xb4, 0xd6, 0x6d, 0x47, 0xa1, 0xda, 0x1a, 0x2f, 0x09, 0x50, 0xca, + 0x05, 0xa7, 0xd9, 0x2b, 0xfb, 0x8c, 0xba, 0x0d, 0xf3, 0xd7, 0x2b, 0x8e, 0x28, 0xb0, 0x72, 0xf5, + 0x94, 0x4b, 0xcd, 0x86, 0x28, 0x70, 0xd5, 0xbe, 0xd2, 0x07, 0x2d, 0xb1, 0x80, 0x61, 0x1b, 0xdb, + 0xa2, 0x47, 0xeb, 0xc6, 0x6d, 0x09, 0x6d, 0x8d, 0x97, 0x0e, 0x94, 0x62, 0x38, 0x71, 0xbc, 0x59, + 0xc9, 0xfd, 0x2e, 0x21, 0x8e, 0xf7, 0x30, 0x24, 0xbd, 0xf0, 0x09, 0xe8, 0xc8, 0x94, 0xb0, 0xfd, + 0xcc, 0xb3, 0xf1, 0xc7, 0x98, 0x8a, 0x4f, 0xb3, 0x65, 0x74, 0x65, 0x44, 0x67, 0x50, 0xf0, 0xa3, + 0x95, 0x08, 0xf8, 0x6b, 0x05, 0xdc, 0x0f, 0x3c, 0x8b, 0x04, 0x1e, 0xc3, 0xf6, 0x31, 0xf6, 0xe7, + 0x8e, 0xc7, 0xff, 0x9f, 0x1b, 0x11, 0x9b, 0x8a, 0xce, 0x6d, 0x1f, 0xbc, 0x5d, 0x5a, 0xec, 0x93, + 0xf2, 0x98, 0xb8, 0xcf, 0x2b, 0x9c, 0xa8, 0xea, 0x24, 0xa8, 0x82, 0xba, 0x8f, 0x4d, 0xfb, 0x42, + 0xb4, 0x77, 0xdd, 0x68, 0x71, 0xbd, 0x46, 0xdc, 0x80, 0x62, 0xbb, 0xf6, 0x47, 0x05, 0xec, 0x14, + 0xd6, 0xe7, 0xff, 0xff, 0xfd, 0x48, 0x9b, 0x80, 0x15, 0x7d, 0x85, 0xef, 0x83, 0xba, 0x1f, 0xb8, + 0x78, 0xf9, 0x29, 0xbd, 0x75, 0x23, 0xad, 0x46, 0x81, 0x8b, 0xd3, 0x49, 0xc6, 0x9f, 0x28, 0x8a, + 0x69, 0xb4, 0xbf, 0x2b, 0xe0, 0xcd, 0x22, 0xfc, 0xc8, 0xfb, 0xde, 0xc7, 0x0e, 0x1b, 0x10, 0x1b, + 0x53, 0x84, 0x7f, 0x11, 0x38, 0x3e, 0x9e, 0x63, 0x8f, 0xc1, 0x77, 0xc1, 0xb6, 0x45, 0x3c, 0x66, + 0xf2, 0x6b, 0x79, 0xdf, 0x9c, 0x2f, 0xd7, 0xab, 0xdb, 0x7c, 0x43, 0x19, 0x64, 0x1d, 0x28, 0x8f, + 0x83, 0x63, 0xd0, 0x24, 0x0b, 0xfe, 0x8f, 0x3e, 0xf1, 0xe5, 0x6a, 0xf5, 0xee, 0x52, 0x0b, 0x8f, + 0xa4, 0xfd, 0x2a, 0x54, 0x1f, 0x5c, 0x93, 0xc6, 0x12, 0x86, 0x12, 0x22, 0xa8, 0x81, 0xc6, 0xb9, + 0xe9, 0x06, 0x98, 0x4f, 0xc0, 0xda, 0x7e, 0xdd, 0x00, 0xbc, 0xc7, 0x7f, 0x24, 0x2c, 0x48, 0x7a, + 0xb4, 0xbf, 0x94, 0xbe, 0xdc, 0x88, 0xd8, 0xa9, 0xaa, 0x8c, 0x4c, 0xc6, 0xb0, 0xef, 0xc1, 0xf7, + 0x72, 0x2b, 0xe3, 0x3b, 0x85, 0x95, 0xf1, 0x41, 0xc9, 0xe2, 0x97, 0xa5, 0xf9, 0x5f, 0x6d, 0x91, + 0xda, 0xe5, 0x3a, 0x78, 0xa5, 0xac, 0x9a, 0xf0, 0xbb, 0xb1, 0x7e, 0x10, 0x4f, 0x66, 0xbc, 0x9f, + 0xd5, 0x0f, 0xe2, 0x5d, 0x85, 0xea, 0xbd, 0x62, 0x5c, 0xec, 0x41, 0x32, 0x0e, 0x7a, 0xa0, 0x4d, + 0xd2, 0x1b, 0x96, 0x4d, 0xfa, 0xcd, 0x1b, 0xf5, 0x53, 0x79, 0x83, 0xc4, 0x1b, 0x4c, 0xd6, 0x97, + 0x3d, 0x00, 0xfe, 0x12, 0xec, 0x90, 0xfc, 0xdd, 0x8b, 0xca, 0xdd, 0xfc, 0xcc, 0xb2, 0xba, 0x19, + 0xf7, 0xe5, 0x7b, 0xef, 0x14, 0xfc, 0xa8, 0x78, 0x98, 0xf6, 0x27, 0x05, 0x54, 0x29, 0x0b, 0x1c, + 0x65, 0x55, 0x96, 0x7f, 0x59, 0x2d, 0xe3, 0x20, 0xa7, 0xb0, 0x57, 0xa1, 0xfa, 0x5a, 0xd5, 0x8f, + 0x5a, 0xbc, 0xec, 0x54, 0x3f, 0x79, 0xf6, 0x24, 0x2b, 0xc3, 0xef, 0x25, 0x32, 0xbc, 0x2e, 0xe8, + 0xfa, 0xa9, 0x04, 0xdf, 0x8c, 0x4b, 0x86, 0x1b, 0x5f, 0xbf, 0x7c, 0xd1, 0x5b, 0xfb, 0xe4, 0x45, + 0x6f, 0xed, 0xd3, 0x17, 0xbd, 0xb5, 0x5f, 0x45, 0x3d, 0xe5, 0x32, 0xea, 0x29, 0x9f, 0x44, 0x3d, + 0xe5, 0xd3, 0xa8, 0xa7, 0xfc, 0x23, 0xea, 0x29, 0xbf, 0xf9, 0x67, 0x6f, 0xed, 0x83, 0x3b, 0x25, + 0xbf, 0x32, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, 0xf2, 0x8e, 0x19, 0x59, 0x94, 0x14, 0x00, 0x00, } func (m *CronJob) Marshal() (dAtA []byte, err error) { @@ -887,6 +1023,18 @@ func (m *JobSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.PodFailurePolicy != nil { + { + size, err := m.PodFailurePolicy.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } if m.Suspend != nil { i-- if *m.Suspend { @@ -1099,6 +1247,172 @@ func (m *JobTemplateSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PodFailurePolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodFailurePolicy) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodFailurePolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Rules) > 0 { + for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *PodFailurePolicyOnExitCodesRequirement) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodFailurePolicyOnExitCodesRequirement) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodFailurePolicyOnExitCodesRequirement) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Values) > 0 { + for iNdEx := len(m.Values) - 1; iNdEx >= 0; iNdEx-- { + i = encodeVarintGenerated(dAtA, i, uint64(m.Values[iNdEx])) + i-- + dAtA[i] = 0x18 + } + } + i -= len(m.Operator) + copy(dAtA[i:], m.Operator) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Operator))) + i-- + dAtA[i] = 0x12 + if m.ContainerName != nil { + i -= len(*m.ContainerName) + copy(dAtA[i:], *m.ContainerName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ContainerName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PodFailurePolicyOnPodConditionsPattern) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodFailurePolicyOnPodConditionsPattern) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodFailurePolicyOnPodConditionsPattern) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PodFailurePolicyRule) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodFailurePolicyRule) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodFailurePolicyRule) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.OnPodConditions) > 0 { + for iNdEx := len(m.OnPodConditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OnPodConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.OnExitCodes != nil { + { + size, err := m.OnExitCodes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *UncountedTerminatedPods) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1327,6 +1641,10 @@ func (m *JobSpec) Size() (n int) { if m.Suspend != nil { n += 2 } + if m.PodFailurePolicy != nil { + l = m.PodFailurePolicy.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1378,47 +1696,116 @@ func (m *JobTemplateSpec) Size() (n int) { return n } -func (m *UncountedTerminatedPods) Size() (n int) { +func (m *PodFailurePolicy) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Succeeded) > 0 { - for _, s := range m.Succeeded { - l = len(s) + if len(m.Rules) > 0 { + for _, e := range m.Rules { + l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } } - if len(m.Failed) > 0 { - for _, s := range m.Failed { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *PodFailurePolicyOnExitCodesRequirement) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ContainerName != nil { + l = len(*m.ContainerName) + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.Operator) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Values) > 0 { + for _, e := range m.Values { + n += 1 + sovGenerated(uint64(e)) } } return n } -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *CronJob) String() string { - if this == nil { - return "nil" +func (m *PodFailurePolicyOnPodConditionsPattern) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&CronJob{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "CronJobSpec", "CronJobSpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "CronJobStatus", "CronJobStatus", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Status) + n += 1 + l + sovGenerated(uint64(l)) + return n } -func (this *CronJobList) String() string { - if this == nil { + +func (m *PodFailurePolicyRule) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Action) + n += 1 + l + sovGenerated(uint64(l)) + if m.OnExitCodes != nil { + l = m.OnExitCodes.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.OnPodConditions) > 0 { + for _, e := range m.OnPodConditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *UncountedTerminatedPods) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Succeeded) > 0 { + for _, s := range m.Succeeded { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Failed) > 0 { + for _, s := range m.Failed { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *CronJob) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CronJob{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "CronJobSpec", "CronJobSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "CronJobStatus", "CronJobStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *CronJobList) String() string { + if this == nil { return "nil" } repeatedStringForItems := "[]CronJob{" @@ -1525,6 +1912,7 @@ func (this *JobSpec) String() string { `TTLSecondsAfterFinished:` + valueToStringGenerated(this.TTLSecondsAfterFinished) + `,`, `CompletionMode:` + valueToStringGenerated(this.CompletionMode) + `,`, `Suspend:` + valueToStringGenerated(this.Suspend) + `,`, + `PodFailurePolicy:` + strings.Replace(this.PodFailurePolicy.String(), "PodFailurePolicy", "PodFailurePolicy", 1) + `,`, `}`, }, "") return s @@ -1563,6 +1951,61 @@ func (this *JobTemplateSpec) String() string { }, "") return s } +func (this *PodFailurePolicy) String() string { + if this == nil { + return "nil" + } + repeatedStringForRules := "[]PodFailurePolicyRule{" + for _, f := range this.Rules { + repeatedStringForRules += strings.Replace(strings.Replace(f.String(), "PodFailurePolicyRule", "PodFailurePolicyRule", 1), `&`, ``, 1) + "," + } + repeatedStringForRules += "}" + s := strings.Join([]string{`&PodFailurePolicy{`, + `Rules:` + repeatedStringForRules + `,`, + `}`, + }, "") + return s +} +func (this *PodFailurePolicyOnExitCodesRequirement) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodFailurePolicyOnExitCodesRequirement{`, + `ContainerName:` + valueToStringGenerated(this.ContainerName) + `,`, + `Operator:` + fmt.Sprintf("%v", this.Operator) + `,`, + `Values:` + fmt.Sprintf("%v", this.Values) + `,`, + `}`, + }, "") + return s +} +func (this *PodFailurePolicyOnPodConditionsPattern) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodFailurePolicyOnPodConditionsPattern{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Status:` + fmt.Sprintf("%v", this.Status) + `,`, + `}`, + }, "") + return s +} +func (this *PodFailurePolicyRule) String() string { + if this == nil { + return "nil" + } + repeatedStringForOnPodConditions := "[]PodFailurePolicyOnPodConditionsPattern{" + for _, f := range this.OnPodConditions { + repeatedStringForOnPodConditions += strings.Replace(strings.Replace(f.String(), "PodFailurePolicyOnPodConditionsPattern", "PodFailurePolicyOnPodConditionsPattern", 1), `&`, ``, 1) + "," + } + repeatedStringForOnPodConditions += "}" + s := strings.Join([]string{`&PodFailurePolicyRule{`, + `Action:` + fmt.Sprintf("%v", this.Action) + `,`, + `OnExitCodes:` + strings.Replace(this.OnExitCodes.String(), "PodFailurePolicyOnExitCodesRequirement", "PodFailurePolicyOnExitCodesRequirement", 1) + `,`, + `OnPodConditions:` + repeatedStringForOnPodConditions + `,`, + `}`, + }, "") + return s +} func (this *UncountedTerminatedPods) String() string { if this == nil { return "nil" @@ -3048,6 +3491,42 @@ func (m *JobSpec) Unmarshal(dAtA []byte) error { } b := bool(v != 0) m.Suspend = &b + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PodFailurePolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PodFailurePolicy == nil { + m.PodFailurePolicy = &PodFailurePolicy{} + } + if err := m.PodFailurePolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3486,6 +3965,547 @@ func (m *JobTemplateSpec) Unmarshal(dAtA []byte) error { } return nil } +func (m *PodFailurePolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodFailurePolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodFailurePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Rules = append(m.Rules, PodFailurePolicyRule{}) + if err := m.Rules[len(m.Rules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodFailurePolicyOnExitCodesRequirement) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodFailurePolicyOnExitCodesRequirement: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodFailurePolicyOnExitCodesRequirement: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ContainerName = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Operator = PodFailurePolicyOnExitCodesOperator(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType == 0 { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Values = append(m.Values, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.Values) == 0 { + m.Values = make([]int32, 0, elementCount) + } + for iNdEx < postIndex { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Values = append(m.Values, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodFailurePolicyOnPodConditionsPattern) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodFailurePolicyOnPodConditionsPattern: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodFailurePolicyOnPodConditionsPattern: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = k8s_io_api_core_v1.PodConditionType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = k8s_io_api_core_v1.ConditionStatus(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodFailurePolicyRule) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodFailurePolicyRule: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodFailurePolicyRule: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = PodFailurePolicyAction(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OnExitCodes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.OnExitCodes == nil { + m.OnExitCodes = &PodFailurePolicyOnExitCodesRequirement{} + } + if err := m.OnExitCodes.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OnPodConditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OnPodConditions = append(m.OnPodConditions, PodFailurePolicyOnPodConditionsPattern{}) + if err := m.OnPodConditions[len(m.OnPodConditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *UncountedTerminatedPods) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/vendor/k8s.io/api/batch/v1/generated.proto b/vendor/k8s.io/api/batch/v1/generated.proto index a57fef0b2..3a060f4be 100644 --- a/vendor/k8s.io/api/batch/v1/generated.proto +++ b/vendor/k8s.io/api/batch/v1/generated.proto @@ -63,9 +63,16 @@ message CronJobSpec { // The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. optional string schedule = 1; - // The time zone for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - // If not specified, this will rely on the time zone of the kube-controller-manager process. - // ALPHA: This field is in alpha and must be enabled via the `CronJobTimeZone` feature gate. + // The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. + // If not specified, this will default to the time zone of the kube-controller-manager process. + // The set of valid time zone names and the time zone offset is loaded from the system-wide time zone + // database by the API server during CronJob validation and the controller manager during execution. + // If no system-wide time zone database can be found a bundled version of the database is used instead. + // If the time zone name becomes invalid during the lifetime of a CronJob or due to a change in host + // configuration, the controller will stop creating new new Jobs and will create a system event with the + // reason UnknownTimeZone. + // More information can be found in https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones + // This is beta field and must be enabled via the `CronJobTimeZone` feature gate. // +optional optional string timeZone = 8; @@ -198,6 +205,19 @@ message JobSpec { // +optional optional int64 activeDeadlineSeconds = 3; + // Specifies the policy of handling failed pods. In particular, it allows to + // specify the set of actions and conditions which need to be + // satisfied to take the associated action. + // If empty, the default behaviour applies - the counter of failed pods, + // represented by the jobs's .status.failed field, is incremented and it is + // checked against the backoffLimit. This field cannot be used in combination + // with restartPolicy=OnFailure. + // + // This field is alpha-level. To use this field, you must enable the + // `JobPodFailurePolicy` feature gate (disabled by default). + // +optional + optional PodFailurePolicy podFailurePolicy = 11; + // Specifies the number of retries before marking this job failed. // Defaults to 6 // +optional @@ -364,6 +384,92 @@ message JobTemplateSpec { optional JobSpec spec = 2; } +// PodFailurePolicy describes how failed pods influence the backoffLimit. +message PodFailurePolicy { + // A list of pod failure policy rules. The rules are evaluated in order. + // Once a rule matches a Pod failure, the remaining of the rules are ignored. + // When no rule matches the Pod failure, the default handling applies - the + // counter of pod failures is incremented and it is checked against + // the backoffLimit. At most 20 elements are allowed. + // +listType=atomic + repeated PodFailurePolicyRule rules = 1; +} + +// PodFailurePolicyOnExitCodesRequirement describes the requirement for handling +// a failed pod based on its container exit codes. In particular, it lookups the +// .state.terminated.exitCode for each app container and init container status, +// represented by the .status.containerStatuses and .status.initContainerStatuses +// fields in the Pod status, respectively. Containers completed with success +// (exit code 0) are excluded from the requirement check. +message PodFailurePolicyOnExitCodesRequirement { + // Restricts the check for exit codes to the container with the + // specified name. When null, the rule applies to all containers. + // When specified, it should match one the container or initContainer + // names in the pod template. + // +optional + optional string containerName = 1; + + // Represents the relationship between the container exit code(s) and the + // specified values. Containers completed with success (exit code 0) are + // excluded from the requirement check. Possible values are: + // - In: the requirement is satisfied if at least one container exit code + // (might be multiple if there are multiple containers not restricted + // by the 'containerName' field) is in the set of specified values. + // - NotIn: the requirement is satisfied if at least one container exit code + // (might be multiple if there are multiple containers not restricted + // by the 'containerName' field) is not in the set of specified values. + // Additional values are considered to be added in the future. Clients should + // react to an unknown operator by assuming the requirement is not satisfied. + optional string operator = 2; + + // Specifies the set of values. Each returned container exit code (might be + // multiple in case of multiple containers) is checked against this set of + // values with respect to the operator. The list of values must be ordered + // and must not contain duplicates. Value '0' cannot be used for the In operator. + // At least one element is required. At most 255 elements are allowed. + // +listType=set + repeated int32 values = 3; +} + +// PodFailurePolicyOnPodConditionsPattern describes a pattern for matching +// an actual pod condition type. +message PodFailurePolicyOnPodConditionsPattern { + // Specifies the required Pod condition type. To match a pod condition + // it is required that specified type equals the pod condition type. + optional string type = 1; + + // Specifies the required Pod condition status. To match a pod condition + // it is required that the specified status equals the pod condition status. + // Defaults to True. + optional string status = 2; +} + +// PodFailurePolicyRule describes how a pod failure is handled when the requirements are met. +// One of OnExitCodes and onPodConditions, but not both, can be used in each rule. +message PodFailurePolicyRule { + // Specifies the action taken on a pod failure when the requirements are satisfied. + // Possible values are: + // - FailJob: indicates that the pod's job is marked as Failed and all + // running pods are terminated. + // - Ignore: indicates that the counter towards the .backoffLimit is not + // incremented and a replacement pod is created. + // - Count: indicates that the pod is handled in the default way - the + // counter towards the .backoffLimit is incremented. + // Additional values are considered to be added in the future. Clients should + // react to an unknown action by skipping the rule. + optional string action = 1; + + // Represents the requirement on the container exit codes. + // +optional + optional PodFailurePolicyOnExitCodesRequirement onExitCodes = 2; + + // Represents the requirement on the pod conditions. The requirement is represented + // as a list of pod condition patterns. The requirement is satisfied if at + // least one pattern matches an actual pod condition. At most 20 elements are allowed. + // +listType=atomic + repeated PodFailurePolicyOnPodConditionsPattern onPodConditions = 3; +} + // UncountedTerminatedPods holds UIDs of Pods that have terminated but haven't // been accounted in Job status counters. message UncountedTerminatedPods { diff --git a/vendor/k8s.io/api/batch/v1/types.go b/vendor/k8s.io/api/batch/v1/types.go index 110f974b7..0f85ce0a1 100644 --- a/vendor/k8s.io/api/batch/v1/types.go +++ b/vendor/k8s.io/api/batch/v1/types.go @@ -87,6 +87,120 @@ const ( IndexedCompletion CompletionMode = "Indexed" ) +// PodFailurePolicyAction specifies how a Pod failure is handled. +// +enum +type PodFailurePolicyAction string + +const ( + // This is an action which might be taken on a pod failure - mark the + // pod's job as Failed and terminate all running pods. + PodFailurePolicyActionFailJob PodFailurePolicyAction = "FailJob" + + // This is an action which might be taken on a pod failure - the counter towards + // .backoffLimit, represented by the job's .status.failed field, is not + // incremented and a replacement pod is created. + PodFailurePolicyActionIgnore PodFailurePolicyAction = "Ignore" + + // This is an action which might be taken on a pod failure - the pod failure + // is handled in the default way - the counter towards .backoffLimit, + // represented by the job's .status.failed field, is incremented. + PodFailurePolicyActionCount PodFailurePolicyAction = "Count" +) + +// +enum +type PodFailurePolicyOnExitCodesOperator string + +const ( + PodFailurePolicyOnExitCodesOpIn PodFailurePolicyOnExitCodesOperator = "In" + PodFailurePolicyOnExitCodesOpNotIn PodFailurePolicyOnExitCodesOperator = "NotIn" +) + +// PodFailurePolicyOnExitCodesRequirement describes the requirement for handling +// a failed pod based on its container exit codes. In particular, it lookups the +// .state.terminated.exitCode for each app container and init container status, +// represented by the .status.containerStatuses and .status.initContainerStatuses +// fields in the Pod status, respectively. Containers completed with success +// (exit code 0) are excluded from the requirement check. +type PodFailurePolicyOnExitCodesRequirement struct { + // Restricts the check for exit codes to the container with the + // specified name. When null, the rule applies to all containers. + // When specified, it should match one the container or initContainer + // names in the pod template. + // +optional + ContainerName *string `json:"containerName" protobuf:"bytes,1,opt,name=containerName"` + + // Represents the relationship between the container exit code(s) and the + // specified values. Containers completed with success (exit code 0) are + // excluded from the requirement check. Possible values are: + // - In: the requirement is satisfied if at least one container exit code + // (might be multiple if there are multiple containers not restricted + // by the 'containerName' field) is in the set of specified values. + // - NotIn: the requirement is satisfied if at least one container exit code + // (might be multiple if there are multiple containers not restricted + // by the 'containerName' field) is not in the set of specified values. + // Additional values are considered to be added in the future. Clients should + // react to an unknown operator by assuming the requirement is not satisfied. + Operator PodFailurePolicyOnExitCodesOperator `json:"operator" protobuf:"bytes,2,req,name=operator"` + + // Specifies the set of values. Each returned container exit code (might be + // multiple in case of multiple containers) is checked against this set of + // values with respect to the operator. The list of values must be ordered + // and must not contain duplicates. Value '0' cannot be used for the In operator. + // At least one element is required. At most 255 elements are allowed. + // +listType=set + Values []int32 `json:"values" protobuf:"varint,3,rep,name=values"` +} + +// PodFailurePolicyOnPodConditionsPattern describes a pattern for matching +// an actual pod condition type. +type PodFailurePolicyOnPodConditionsPattern struct { + // Specifies the required Pod condition type. To match a pod condition + // it is required that specified type equals the pod condition type. + Type corev1.PodConditionType `json:"type" protobuf:"bytes,1,req,name=type"` + + // Specifies the required Pod condition status. To match a pod condition + // it is required that the specified status equals the pod condition status. + // Defaults to True. + Status corev1.ConditionStatus `json:"status" protobuf:"bytes,2,req,name=status"` +} + +// PodFailurePolicyRule describes how a pod failure is handled when the requirements are met. +// One of OnExitCodes and onPodConditions, but not both, can be used in each rule. +type PodFailurePolicyRule struct { + // Specifies the action taken on a pod failure when the requirements are satisfied. + // Possible values are: + // - FailJob: indicates that the pod's job is marked as Failed and all + // running pods are terminated. + // - Ignore: indicates that the counter towards the .backoffLimit is not + // incremented and a replacement pod is created. + // - Count: indicates that the pod is handled in the default way - the + // counter towards the .backoffLimit is incremented. + // Additional values are considered to be added in the future. Clients should + // react to an unknown action by skipping the rule. + Action PodFailurePolicyAction `json:"action" protobuf:"bytes,1,req,name=action"` + + // Represents the requirement on the container exit codes. + // +optional + OnExitCodes *PodFailurePolicyOnExitCodesRequirement `json:"onExitCodes" protobuf:"bytes,2,opt,name=onExitCodes"` + + // Represents the requirement on the pod conditions. The requirement is represented + // as a list of pod condition patterns. The requirement is satisfied if at + // least one pattern matches an actual pod condition. At most 20 elements are allowed. + // +listType=atomic + OnPodConditions []PodFailurePolicyOnPodConditionsPattern `json:"onPodConditions" protobuf:"bytes,3,opt,name=onPodConditions"` +} + +// PodFailurePolicy describes how failed pods influence the backoffLimit. +type PodFailurePolicy struct { + // A list of pod failure policy rules. The rules are evaluated in order. + // Once a rule matches a Pod failure, the remaining of the rules are ignored. + // When no rule matches the Pod failure, the default handling applies - the + // counter of pod failures is incremented and it is checked against + // the backoffLimit. At most 20 elements are allowed. + // +listType=atomic + Rules []PodFailurePolicyRule `json:"rules" protobuf:"bytes,1,opt,name=rules"` +} + // JobSpec describes how the job execution will look like. type JobSpec struct { @@ -115,6 +229,19 @@ type JobSpec struct { // +optional ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty" protobuf:"varint,3,opt,name=activeDeadlineSeconds"` + // Specifies the policy of handling failed pods. In particular, it allows to + // specify the set of actions and conditions which need to be + // satisfied to take the associated action. + // If empty, the default behaviour applies - the counter of failed pods, + // represented by the jobs's .status.failed field, is incremented and it is + // checked against the backoffLimit. This field cannot be used in combination + // with restartPolicy=OnFailure. + // + // This field is alpha-level. To use this field, you must enable the + // `JobPodFailurePolicy` feature gate (disabled by default). + // +optional + PodFailurePolicy *PodFailurePolicy `json:"podFailurePolicy,omitempty" protobuf:"bytes,11,opt,name=podFailurePolicy"` + // Specifies the number of retries before marking this job failed. // Defaults to 6 // +optional @@ -297,6 +424,9 @@ const ( JobComplete JobConditionType = "Complete" // JobFailed means the job has failed its execution. JobFailed JobConditionType = "Failed" + // FailureTarget means the job is about to fail its execution. + // The constant is to be renamed once the name is accepted within the KEP-3329. + AlphaNoCompatGuaranteeJobFailureTarget JobConditionType = "FailureTarget" ) // JobCondition describes current state of a job. @@ -375,9 +505,16 @@ type CronJobSpec struct { // The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. Schedule string `json:"schedule" protobuf:"bytes,1,opt,name=schedule"` - // The time zone for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - // If not specified, this will rely on the time zone of the kube-controller-manager process. - // ALPHA: This field is in alpha and must be enabled via the `CronJobTimeZone` feature gate. + // The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. + // If not specified, this will default to the time zone of the kube-controller-manager process. + // The set of valid time zone names and the time zone offset is loaded from the system-wide time zone + // database by the API server during CronJob validation and the controller manager during execution. + // If no system-wide time zone database can be found a bundled version of the database is used instead. + // If the time zone name becomes invalid during the lifetime of a CronJob or due to a change in host + // configuration, the controller will stop creating new new Jobs and will create a system event with the + // reason UnknownTimeZone. + // More information can be found in https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones + // This is beta field and must be enabled via the `CronJobTimeZone` feature gate. // +optional TimeZone *string `json:"timeZone,omitempty" protobuf:"bytes,8,opt,name=timeZone"` diff --git a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go index df24723a8..5131dd048 100644 --- a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go @@ -51,7 +51,7 @@ func (CronJobList) SwaggerDoc() map[string]string { var map_CronJobSpec = map[string]string{ "": "CronJobSpec describes how the job execution will look like and when it will actually run.", "schedule": "The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.", - "timeZone": "The time zone for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. If not specified, this will rely on the time zone of the kube-controller-manager process. ALPHA: This field is in alpha and must be enabled via the `CronJobTimeZone` feature gate.", + "timeZone": "The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. If not specified, this will default to the time zone of the kube-controller-manager process. The set of valid time zone names and the time zone offset is loaded from the system-wide time zone database by the API server during CronJob validation and the controller manager during execution. If no system-wide time zone database can be found a bundled version of the database is used instead. If the time zone name becomes invalid during the lifetime of a CronJob or due to a change in host configuration, the controller will stop creating new new Jobs and will create a system event with the reason UnknownTimeZone. More information can be found in https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones This is beta field and must be enabled via the `CronJobTimeZone` feature gate.", "startingDeadlineSeconds": "Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.", "concurrencyPolicy": "Specifies how to treat concurrent executions of a Job. Valid values are: - \"Allow\" (default): allows CronJobs to run concurrently; - \"Forbid\": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - \"Replace\": cancels currently running job and replaces it with a new one", "suspend": "This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.", @@ -115,6 +115,7 @@ var map_JobSpec = map[string]string{ "parallelism": "Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) < .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", "completions": "Specifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", "activeDeadlineSeconds": "Specifies the duration in seconds relative to the startTime that the job may be continuously active before the system tries to terminate it; value must be positive integer. If a Job is suspended (at creation or through an update), this timer will effectively be stopped and reset when the Job is resumed again.", + "podFailurePolicy": "Specifies the policy of handling failed pods. In particular, it allows to specify the set of actions and conditions which need to be satisfied to take the associated action. If empty, the default behaviour applies - the counter of failed pods, represented by the jobs's .status.failed field, is incremented and it is checked against the backoffLimit. This field cannot be used in combination with restartPolicy=OnFailure.\n\nThis field is alpha-level. To use this field, you must enable the `JobPodFailurePolicy` feature gate (disabled by default).", "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6", "selector": "A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", "manualSelector": "manualSelector controls generation of pod labels and pod selectors. Leave `manualSelector` unset unless you are certain what you are doing. When false or unset, the system pick labels unique to this job and appends those labels to the pod template. When true, the user is responsible for picking unique labels and specifying the selector. Failure to pick a unique label may cause this and other jobs to not function correctly. However, You may see `manualSelector=true` in jobs that were created with the old `extensions/v1beta1` API. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector", @@ -155,6 +156,47 @@ func (JobTemplateSpec) SwaggerDoc() map[string]string { return map_JobTemplateSpec } +var map_PodFailurePolicy = map[string]string{ + "": "PodFailurePolicy describes how failed pods influence the backoffLimit.", + "rules": "A list of pod failure policy rules. The rules are evaluated in order. Once a rule matches a Pod failure, the remaining of the rules are ignored. When no rule matches the Pod failure, the default handling applies - the counter of pod failures is incremented and it is checked against the backoffLimit. At most 20 elements are allowed.", +} + +func (PodFailurePolicy) SwaggerDoc() map[string]string { + return map_PodFailurePolicy +} + +var map_PodFailurePolicyOnExitCodesRequirement = map[string]string{ + "": "PodFailurePolicyOnExitCodesRequirement describes the requirement for handling a failed pod based on its container exit codes. In particular, it lookups the .state.terminated.exitCode for each app container and init container status, represented by the .status.containerStatuses and .status.initContainerStatuses fields in the Pod status, respectively. Containers completed with success (exit code 0) are excluded from the requirement check.", + "containerName": "Restricts the check for exit codes to the container with the specified name. When null, the rule applies to all containers. When specified, it should match one the container or initContainer names in the pod template.", + "operator": "Represents the relationship between the container exit code(s) and the specified values. Containers completed with success (exit code 0) are excluded from the requirement check. Possible values are: - In: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is in the set of specified values.\n- NotIn: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is not in the set of specified values.\nAdditional values are considered to be added in the future. Clients should react to an unknown operator by assuming the requirement is not satisfied.", + "values": "Specifies the set of values. Each returned container exit code (might be multiple in case of multiple containers) is checked against this set of values with respect to the operator. The list of values must be ordered and must not contain duplicates. Value '0' cannot be used for the In operator. At least one element is required. At most 255 elements are allowed.", +} + +func (PodFailurePolicyOnExitCodesRequirement) SwaggerDoc() map[string]string { + return map_PodFailurePolicyOnExitCodesRequirement +} + +var map_PodFailurePolicyOnPodConditionsPattern = map[string]string{ + "": "PodFailurePolicyOnPodConditionsPattern describes a pattern for matching an actual pod condition type.", + "type": "Specifies the required Pod condition type. To match a pod condition it is required that specified type equals the pod condition type.", + "status": "Specifies the required Pod condition status. To match a pod condition it is required that the specified status equals the pod condition status. Defaults to True.", +} + +func (PodFailurePolicyOnPodConditionsPattern) SwaggerDoc() map[string]string { + return map_PodFailurePolicyOnPodConditionsPattern +} + +var map_PodFailurePolicyRule = map[string]string{ + "": "PodFailurePolicyRule describes how a pod failure is handled when the requirements are met. One of OnExitCodes and onPodConditions, but not both, can be used in each rule.", + "action": "Specifies the action taken on a pod failure when the requirements are satisfied. Possible values are: - FailJob: indicates that the pod's job is marked as Failed and all\n running pods are terminated.\n- Ignore: indicates that the counter towards the .backoffLimit is not\n incremented and a replacement pod is created.\n- Count: indicates that the pod is handled in the default way - the\n counter towards the .backoffLimit is incremented.\nAdditional values are considered to be added in the future. Clients should react to an unknown action by skipping the rule.", + "onExitCodes": "Represents the requirement on the container exit codes.", + "onPodConditions": "Represents the requirement on the pod conditions. The requirement is represented as a list of pod condition patterns. The requirement is satisfied if at least one pattern matches an actual pod condition. At most 20 elements are allowed.", +} + +func (PodFailurePolicyRule) SwaggerDoc() map[string]string { + return map_PodFailurePolicyRule +} + var map_UncountedTerminatedPods = map[string]string{ "": "UncountedTerminatedPods holds UIDs of Pods that have terminated but haven't been accounted in Job status counters.", "succeeded": "Succeeded holds UIDs of succeeded Pods.", diff --git a/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go index 4bc195a9f..2a901e9d0 100644 --- a/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go @@ -257,6 +257,11 @@ func (in *JobSpec) DeepCopyInto(out *JobSpec) { *out = new(int64) **out = **in } + if in.PodFailurePolicy != nil { + in, out := &in.PodFailurePolicy, &out.PodFailurePolicy + *out = new(PodFailurePolicy) + (*in).DeepCopyInto(*out) + } if in.BackoffLimit != nil { in, out := &in.BackoffLimit, &out.BackoffLimit *out = new(int32) @@ -360,6 +365,97 @@ func (in *JobTemplateSpec) DeepCopy() *JobTemplateSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodFailurePolicy) DeepCopyInto(out *PodFailurePolicy) { + *out = *in + if in.Rules != nil { + in, out := &in.Rules, &out.Rules + *out = make([]PodFailurePolicyRule, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodFailurePolicy. +func (in *PodFailurePolicy) DeepCopy() *PodFailurePolicy { + if in == nil { + return nil + } + out := new(PodFailurePolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodFailurePolicyOnExitCodesRequirement) DeepCopyInto(out *PodFailurePolicyOnExitCodesRequirement) { + *out = *in + if in.ContainerName != nil { + in, out := &in.ContainerName, &out.ContainerName + *out = new(string) + **out = **in + } + if in.Values != nil { + in, out := &in.Values, &out.Values + *out = make([]int32, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodFailurePolicyOnExitCodesRequirement. +func (in *PodFailurePolicyOnExitCodesRequirement) DeepCopy() *PodFailurePolicyOnExitCodesRequirement { + if in == nil { + return nil + } + out := new(PodFailurePolicyOnExitCodesRequirement) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodFailurePolicyOnPodConditionsPattern) DeepCopyInto(out *PodFailurePolicyOnPodConditionsPattern) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodFailurePolicyOnPodConditionsPattern. +func (in *PodFailurePolicyOnPodConditionsPattern) DeepCopy() *PodFailurePolicyOnPodConditionsPattern { + if in == nil { + return nil + } + out := new(PodFailurePolicyOnPodConditionsPattern) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodFailurePolicyRule) DeepCopyInto(out *PodFailurePolicyRule) { + *out = *in + if in.OnExitCodes != nil { + in, out := &in.OnExitCodes, &out.OnExitCodes + *out = new(PodFailurePolicyOnExitCodesRequirement) + (*in).DeepCopyInto(*out) + } + if in.OnPodConditions != nil { + in, out := &in.OnPodConditions, &out.OnPodConditions + *out = make([]PodFailurePolicyOnPodConditionsPattern, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodFailurePolicyRule. +func (in *PodFailurePolicyRule) DeepCopy() *PodFailurePolicyRule { + if in == nil { + return nil + } + out := new(PodFailurePolicyRule) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *UncountedTerminatedPods) DeepCopyInto(out *UncountedTerminatedPods) { *out = *in diff --git a/vendor/k8s.io/api/batch/v1beta1/generated.proto b/vendor/k8s.io/api/batch/v1beta1/generated.proto index c73b7a654..d8386a8f5 100644 --- a/vendor/k8s.io/api/batch/v1beta1/generated.proto +++ b/vendor/k8s.io/api/batch/v1beta1/generated.proto @@ -64,9 +64,16 @@ message CronJobSpec { // The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. optional string schedule = 1; - // The time zone for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - // If not specified, this will rely on the time zone of the kube-controller-manager process. - // ALPHA: This field is in alpha and must be enabled via the `CronJobTimeZone` feature gate. + // The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. + // If not specified, this will default to the time zone of the kube-controller-manager process. + // The set of valid time zone names and the time zone offset is loaded from the system-wide time zone + // database by the API server during CronJob validation and the controller manager during execution. + // If no system-wide time zone database can be found a bundled version of the database is used instead. + // If the time zone name becomes invalid during the lifetime of a CronJob or due to a change in host + // configuration, the controller will stop creating new new Jobs and will create a system event with the + // reason UnknownTimeZone. + // More information can be found in https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones + // This is beta field and must be enabled via the `CronJobTimeZone` feature gate. // +optional optional string timeZone = 8; diff --git a/vendor/k8s.io/api/batch/v1beta1/types.go b/vendor/k8s.io/api/batch/v1beta1/types.go index 54a2d1431..4c0d69dd6 100644 --- a/vendor/k8s.io/api/batch/v1beta1/types.go +++ b/vendor/k8s.io/api/batch/v1beta1/types.go @@ -104,9 +104,16 @@ type CronJobSpec struct { // The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. Schedule string `json:"schedule" protobuf:"bytes,1,opt,name=schedule"` - // The time zone for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - // If not specified, this will rely on the time zone of the kube-controller-manager process. - // ALPHA: This field is in alpha and must be enabled via the `CronJobTimeZone` feature gate. + // The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. + // If not specified, this will default to the time zone of the kube-controller-manager process. + // The set of valid time zone names and the time zone offset is loaded from the system-wide time zone + // database by the API server during CronJob validation and the controller manager during execution. + // If no system-wide time zone database can be found a bundled version of the database is used instead. + // If the time zone name becomes invalid during the lifetime of a CronJob or due to a change in host + // configuration, the controller will stop creating new new Jobs and will create a system event with the + // reason UnknownTimeZone. + // More information can be found in https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones + // This is beta field and must be enabled via the `CronJobTimeZone` feature gate. // +optional TimeZone *string `json:"timeZone,omitempty" protobuf:"bytes,8,opt,name=timeZone"` diff --git a/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go index 871948076..5716bbb86 100644 --- a/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go @@ -51,7 +51,7 @@ func (CronJobList) SwaggerDoc() map[string]string { var map_CronJobSpec = map[string]string{ "": "CronJobSpec describes how the job execution will look like and when it will actually run.", "schedule": "The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.", - "timeZone": "The time zone for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. If not specified, this will rely on the time zone of the kube-controller-manager process. ALPHA: This field is in alpha and must be enabled via the `CronJobTimeZone` feature gate.", + "timeZone": "The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. If not specified, this will default to the time zone of the kube-controller-manager process. The set of valid time zone names and the time zone offset is loaded from the system-wide time zone database by the API server during CronJob validation and the controller manager during execution. If no system-wide time zone database can be found a bundled version of the database is used instead. If the time zone name becomes invalid during the lifetime of a CronJob or due to a change in host configuration, the controller will stop creating new new Jobs and will create a system event with the reason UnknownTimeZone. More information can be found in https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones This is beta field and must be enabled via the `CronJobTimeZone` feature gate.", "startingDeadlineSeconds": "Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.", "concurrencyPolicy": "Specifies how to treat concurrent executions of a Job. Valid values are: - \"Allow\" (default): allows CronJobs to run concurrently; - \"Forbid\": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - \"Replace\": cancels currently running job and replaces it with a new one", "suspend": "This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.", diff --git a/vendor/k8s.io/api/certificates/v1/types.go b/vendor/k8s.io/api/certificates/v1/types.go index 752c66973..af5efb516 100644 --- a/vendor/k8s.io/api/certificates/v1/types.go +++ b/vendor/k8s.io/api/certificates/v1/types.go @@ -275,7 +275,9 @@ type CertificateSigningRequestList struct { // KeyUsage specifies valid usage contexts for keys. // See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 -// https://tools.ietf.org/html/rfc5280#section-4.2.1.12 +// +// https://tools.ietf.org/html/rfc5280#section-4.2.1.12 +// // +enum type KeyUsage string diff --git a/vendor/k8s.io/api/certificates/v1beta1/types.go b/vendor/k8s.io/api/certificates/v1beta1/types.go index 877312d97..fe7aab970 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/types.go +++ b/vendor/k8s.io/api/certificates/v1beta1/types.go @@ -230,7 +230,8 @@ type CertificateSigningRequestList struct { // KeyUsages specifies valid usage contexts for keys. // See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 -// https://tools.ietf.org/html/rfc5280#section-4.2.1.12 +// +// https://tools.ietf.org/html/rfc5280#section-4.2.1.12 type KeyUsage string const ( diff --git a/vendor/k8s.io/api/core/v1/generated.pb.go b/vendor/k8s.io/api/core/v1/generated.pb.go index 3f8aaf100..aa62ba138 100644 --- a/vendor/k8s.io/api/core/v1/generated.pb.go +++ b/vendor/k8s.io/api/core/v1/generated.pb.go @@ -6175,899 +6175,906 @@ func init() { } var fileDescriptor_83c10c24ec417dc9 = []byte{ - // 14260 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x69, 0x70, 0x24, 0xd7, - 0x79, 0x98, 0x7a, 0x06, 0xd7, 0x7c, 0xb8, 0xdf, 0x1e, 0xc4, 0x82, 0xdc, 0xc5, 0xb2, 0x29, 0x2d, - 0x97, 0x22, 0x89, 0xd5, 0xf2, 0x90, 0x68, 0x52, 0xa2, 0x05, 0x60, 0x80, 0x5d, 0x70, 0x17, 0xd8, - 0xe1, 0x1b, 0xec, 0xae, 0x24, 0x53, 0x2a, 0x35, 0x66, 0x1e, 0x80, 0x16, 0x66, 0xba, 0x87, 0xdd, - 0x3d, 0xd8, 0x05, 0x23, 0x57, 0x1c, 0xf9, 0x94, 0x8f, 0x94, 0x2a, 0xe5, 0x1c, 0x25, 0xbb, 0x5c, - 0x29, 0xc7, 0x89, 0xad, 0x28, 0x97, 0x23, 0xc7, 0x76, 0x2c, 0x27, 0x76, 0x6e, 0x27, 0x3f, 0x6c, - 0xc7, 0x55, 0xb1, 0x5c, 0xe5, 0x0a, 0x62, 0xaf, 0x53, 0xe5, 0x52, 0x55, 0x62, 0x3b, 0x71, 0xf2, - 0x23, 0x1b, 0x57, 0x9c, 0x7a, 0x67, 0xbf, 0xd7, 0xd7, 0x0c, 0x96, 0x58, 0x88, 0x52, 0xf1, 0xdf, - 0xcc, 0xfb, 0xbe, 0xf7, 0xbd, 0xd7, 0xef, 0xfc, 0xde, 0x77, 0xc2, 0x2b, 0xbb, 0x2f, 0x85, 0xf3, - 0xae, 0x7f, 0x69, 0xb7, 0xbb, 0x49, 0x02, 0x8f, 0x44, 0x24, 0xbc, 0xb4, 0x47, 0xbc, 0xa6, 0x1f, - 0x5c, 0x12, 0x00, 0xa7, 0xe3, 0x5e, 0x6a, 0xf8, 0x01, 0xb9, 0xb4, 0x77, 0xf9, 0xd2, 0x36, 0xf1, - 0x48, 0xe0, 0x44, 0xa4, 0x39, 0xdf, 0x09, 0xfc, 0xc8, 0x47, 0x88, 0xe3, 0xcc, 0x3b, 0x1d, 0x77, - 0x9e, 0xe2, 0xcc, 0xef, 0x5d, 0x9e, 0x7d, 0x76, 0xdb, 0x8d, 0x76, 0xba, 0x9b, 0xf3, 0x0d, 0xbf, - 0x7d, 0x69, 0xdb, 0xdf, 0xf6, 0x2f, 0x31, 0xd4, 0xcd, 0xee, 0x16, 0xfb, 0xc7, 0xfe, 0xb0, 0x5f, - 0x9c, 0xc4, 0xec, 0x0b, 0x71, 0x33, 0x6d, 0xa7, 0xb1, 0xe3, 0x7a, 0x24, 0xd8, 0xbf, 0xd4, 0xd9, - 0xdd, 0x66, 0xed, 0x06, 0x24, 0xf4, 0xbb, 0x41, 0x83, 0x24, 0x1b, 0x2e, 0xac, 0x15, 0x5e, 0x6a, - 0x93, 0xc8, 0xc9, 0xe8, 0xee, 0xec, 0xa5, 0xbc, 0x5a, 0x41, 0xd7, 0x8b, 0xdc, 0x76, 0xba, 0x99, - 0x0f, 0xf6, 0xaa, 0x10, 0x36, 0x76, 0x48, 0xdb, 0x49, 0xd5, 0x7b, 0x3e, 0xaf, 0x5e, 0x37, 0x72, - 0x5b, 0x97, 0x5c, 0x2f, 0x0a, 0xa3, 0x20, 0x59, 0xc9, 0xfe, 0x9a, 0x05, 0xe7, 0x17, 0x6e, 0xd7, - 0x97, 0x5b, 0x4e, 0x18, 0xb9, 0x8d, 0xc5, 0x96, 0xdf, 0xd8, 0xad, 0x47, 0x7e, 0x40, 0x6e, 0xf9, - 0xad, 0x6e, 0x9b, 0xd4, 0xd9, 0x40, 0xa0, 0x67, 0x60, 0x64, 0x8f, 0xfd, 0x5f, 0xad, 0xce, 0x58, - 0xe7, 0xad, 0x8b, 0x95, 0xc5, 0xa9, 0x5f, 0x3b, 0x98, 0x7b, 0xcf, 0xbd, 0x83, 0xb9, 0x91, 0x5b, - 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x01, 0x86, 0xb6, 0xc2, 0x8d, 0xfd, 0x0e, 0x99, 0x29, 0x31, 0xdc, - 0x09, 0x81, 0x3b, 0xb4, 0x52, 0xa7, 0xa5, 0x58, 0x40, 0xd1, 0x25, 0xa8, 0x74, 0x9c, 0x20, 0x72, - 0x23, 0xd7, 0xf7, 0x66, 0xca, 0xe7, 0xad, 0x8b, 0x83, 0x8b, 0xd3, 0x02, 0xb5, 0x52, 0x93, 0x00, - 0x1c, 0xe3, 0xd0, 0x6e, 0x04, 0xc4, 0x69, 0xde, 0xf0, 0x5a, 0xfb, 0x33, 0x03, 0xe7, 0xad, 0x8b, - 0x23, 0x71, 0x37, 0xb0, 0x28, 0xc7, 0x0a, 0xc3, 0xfe, 0x62, 0x09, 0x46, 0x16, 0xb6, 0xb6, 0x5c, - 0xcf, 0x8d, 0xf6, 0xd1, 0x2d, 0x18, 0xf3, 0xfc, 0x26, 0x91, 0xff, 0xd9, 0x57, 0x8c, 0x3e, 0x77, - 0x7e, 0x3e, 0xbd, 0x94, 0xe6, 0xd7, 0x35, 0xbc, 0xc5, 0xa9, 0x7b, 0x07, 0x73, 0x63, 0x7a, 0x09, - 0x36, 0xe8, 0x20, 0x0c, 0xa3, 0x1d, 0xbf, 0xa9, 0xc8, 0x96, 0x18, 0xd9, 0xb9, 0x2c, 0xb2, 0xb5, - 0x18, 0x6d, 0x71, 0xf2, 0xde, 0xc1, 0xdc, 0xa8, 0x56, 0x80, 0x75, 0x22, 0x68, 0x13, 0x26, 0xe9, - 0x5f, 0x2f, 0x72, 0x15, 0xdd, 0x32, 0xa3, 0xfb, 0x44, 0x1e, 0x5d, 0x0d, 0x75, 0xf1, 0xc4, 0xbd, - 0x83, 0xb9, 0xc9, 0x44, 0x21, 0x4e, 0x12, 0xb4, 0xdf, 0x82, 0x89, 0x85, 0x28, 0x72, 0x1a, 0x3b, - 0xa4, 0xc9, 0x67, 0x10, 0xbd, 0x00, 0x03, 0x9e, 0xd3, 0x26, 0x62, 0x7e, 0xcf, 0x8b, 0x81, 0x1d, - 0x58, 0x77, 0xda, 0xe4, 0xfe, 0xc1, 0xdc, 0xd4, 0x4d, 0xcf, 0x7d, 0xb3, 0x2b, 0x56, 0x05, 0x2d, - 0xc3, 0x0c, 0x1b, 0x3d, 0x07, 0xd0, 0x24, 0x7b, 0x6e, 0x83, 0xd4, 0x9c, 0x68, 0x47, 0xcc, 0x37, - 0x12, 0x75, 0xa1, 0xaa, 0x20, 0x58, 0xc3, 0xb2, 0xef, 0x42, 0x65, 0x61, 0xcf, 0x77, 0x9b, 0x35, - 0xbf, 0x19, 0xa2, 0x5d, 0x98, 0xec, 0x04, 0x64, 0x8b, 0x04, 0xaa, 0x68, 0xc6, 0x3a, 0x5f, 0xbe, - 0x38, 0xfa, 0xdc, 0xc5, 0xcc, 0x8f, 0x35, 0x51, 0x97, 0xbd, 0x28, 0xd8, 0x5f, 0x7c, 0x44, 0xb4, - 0x37, 0x99, 0x80, 0xe2, 0x24, 0x65, 0xfb, 0x5f, 0x97, 0xe0, 0xd4, 0xc2, 0x5b, 0xdd, 0x80, 0x54, - 0xdd, 0x70, 0x37, 0xb9, 0xc2, 0x9b, 0x6e, 0xb8, 0xbb, 0x1e, 0x8f, 0x80, 0x5a, 0x5a, 0x55, 0x51, - 0x8e, 0x15, 0x06, 0x7a, 0x16, 0x86, 0xe9, 0xef, 0x9b, 0x78, 0x55, 0x7c, 0xf2, 0x09, 0x81, 0x3c, - 0x5a, 0x75, 0x22, 0xa7, 0xca, 0x41, 0x58, 0xe2, 0xa0, 0x35, 0x18, 0x6d, 0xb0, 0x0d, 0xb9, 0xbd, - 0xe6, 0x37, 0x09, 0x9b, 0xcc, 0xca, 0xe2, 0xd3, 0x14, 0x7d, 0x29, 0x2e, 0xbe, 0x7f, 0x30, 0x37, - 0xc3, 0xfb, 0x26, 0x48, 0x68, 0x30, 0xac, 0xd7, 0x47, 0xb6, 0xda, 0x5f, 0x03, 0x8c, 0x12, 0x64, - 0xec, 0xad, 0x8b, 0xda, 0x56, 0x19, 0x64, 0x5b, 0x65, 0x2c, 0x7b, 0x9b, 0xa0, 0xcb, 0x30, 0xb0, - 0xeb, 0x7a, 0xcd, 0x99, 0x21, 0x46, 0xeb, 0x2c, 0x9d, 0xf3, 0x6b, 0xae, 0xd7, 0xbc, 0x7f, 0x30, - 0x37, 0x6d, 0x74, 0x87, 0x16, 0x62, 0x86, 0x6a, 0xff, 0xa9, 0x05, 0x73, 0x0c, 0xb6, 0xe2, 0xb6, - 0x48, 0x8d, 0x04, 0xa1, 0x1b, 0x46, 0xc4, 0x8b, 0x8c, 0x01, 0x7d, 0x0e, 0x20, 0x24, 0x8d, 0x80, - 0x44, 0xda, 0x90, 0xaa, 0x85, 0x51, 0x57, 0x10, 0xac, 0x61, 0xd1, 0x03, 0x21, 0xdc, 0x71, 0x02, - 0xb6, 0xbe, 0xc4, 0xc0, 0xaa, 0x03, 0xa1, 0x2e, 0x01, 0x38, 0xc6, 0x31, 0x0e, 0x84, 0x72, 0xaf, - 0x03, 0x01, 0x7d, 0x04, 0x26, 0xe3, 0xc6, 0xc2, 0x8e, 0xd3, 0x90, 0x03, 0xc8, 0xb6, 0x4c, 0xdd, - 0x04, 0xe1, 0x24, 0xae, 0xfd, 0x77, 0x2d, 0xb1, 0x78, 0xe8, 0x57, 0xbf, 0xc3, 0xbf, 0xd5, 0xfe, - 0x45, 0x0b, 0x86, 0x17, 0x5d, 0xaf, 0xe9, 0x7a, 0xdb, 0xe8, 0xd3, 0x30, 0x42, 0xef, 0xa6, 0xa6, - 0x13, 0x39, 0xe2, 0xdc, 0xfb, 0x80, 0xb6, 0xb7, 0xd4, 0x55, 0x31, 0xdf, 0xd9, 0xdd, 0xa6, 0x05, - 0xe1, 0x3c, 0xc5, 0xa6, 0xbb, 0xed, 0xc6, 0xe6, 0x67, 0x48, 0x23, 0x5a, 0x23, 0x91, 0x13, 0x7f, - 0x4e, 0x5c, 0x86, 0x15, 0x55, 0x74, 0x0d, 0x86, 0x22, 0x27, 0xd8, 0x26, 0x91, 0x38, 0x00, 0x33, - 0x0f, 0x2a, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xbc, 0x06, 0x89, 0xaf, 0x85, 0x0d, 0x56, 0x15, 0x0b, - 0x12, 0xf6, 0x8f, 0x0c, 0xc3, 0x99, 0xa5, 0xfa, 0x6a, 0xce, 0xba, 0xba, 0x00, 0x43, 0xcd, 0xc0, - 0xdd, 0x23, 0x81, 0x18, 0x67, 0x45, 0xa5, 0xca, 0x4a, 0xb1, 0x80, 0xa2, 0x97, 0x60, 0x8c, 0x5f, - 0x48, 0x57, 0x1d, 0xaf, 0xd9, 0x92, 0x43, 0x7c, 0x52, 0x60, 0x8f, 0xdd, 0xd2, 0x60, 0xd8, 0xc0, - 0x3c, 0xe4, 0xa2, 0xba, 0x90, 0xd8, 0x8c, 0x79, 0x97, 0xdd, 0xe7, 0x2d, 0x98, 0xe2, 0xcd, 0x2c, - 0x44, 0x51, 0xe0, 0x6e, 0x76, 0x23, 0x12, 0xce, 0x0c, 0xb2, 0x93, 0x6e, 0x29, 0x6b, 0xb4, 0x72, - 0x47, 0x60, 0xfe, 0x56, 0x82, 0x0a, 0x3f, 0x04, 0x67, 0x44, 0xbb, 0x53, 0x49, 0x30, 0x4e, 0x35, - 0x8b, 0xbe, 0xdb, 0x82, 0xd9, 0x86, 0xef, 0x45, 0x81, 0xdf, 0x6a, 0x91, 0xa0, 0xd6, 0xdd, 0x6c, - 0xb9, 0xe1, 0x0e, 0x5f, 0xa7, 0x98, 0x6c, 0xb1, 0x93, 0x20, 0x67, 0x0e, 0x15, 0x92, 0x98, 0xc3, - 0x73, 0xf7, 0x0e, 0xe6, 0x66, 0x97, 0x72, 0x49, 0xe1, 0x82, 0x66, 0xd0, 0x2e, 0x20, 0x7a, 0x95, - 0xd6, 0x23, 0x67, 0x9b, 0xc4, 0x8d, 0x0f, 0xf7, 0xdf, 0xf8, 0xe9, 0x7b, 0x07, 0x73, 0x68, 0x3d, - 0x45, 0x02, 0x67, 0x90, 0x45, 0x6f, 0xc2, 0x49, 0x5a, 0x9a, 0xfa, 0xd6, 0x91, 0xfe, 0x9b, 0x9b, - 0xb9, 0x77, 0x30, 0x77, 0x72, 0x3d, 0x83, 0x08, 0xce, 0x24, 0x8d, 0xbe, 0xcb, 0x82, 0x33, 0xf1, - 0xe7, 0x2f, 0xdf, 0xed, 0x38, 0x5e, 0x33, 0x6e, 0xb8, 0xd2, 0x7f, 0xc3, 0xf4, 0x4c, 0x3e, 0xb3, - 0x94, 0x47, 0x09, 0xe7, 0x37, 0x32, 0xbb, 0x04, 0xa7, 0x32, 0x57, 0x0b, 0x9a, 0x82, 0xf2, 0x2e, - 0xe1, 0x5c, 0x50, 0x05, 0xd3, 0x9f, 0xe8, 0x24, 0x0c, 0xee, 0x39, 0xad, 0xae, 0xd8, 0x28, 0x98, - 0xff, 0x79, 0xb9, 0xf4, 0x92, 0x65, 0xff, 0x9b, 0x32, 0x4c, 0x2e, 0xd5, 0x57, 0x1f, 0x68, 0x17, - 0xea, 0xd7, 0x50, 0xa9, 0xf0, 0x1a, 0x8a, 0x2f, 0xb5, 0x72, 0xee, 0xa5, 0xf6, 0x17, 0x33, 0xb6, - 0xd0, 0x00, 0xdb, 0x42, 0xdf, 0x96, 0xb3, 0x85, 0x8e, 0x78, 0xe3, 0xec, 0xe5, 0xac, 0xa2, 0x41, - 0x36, 0x99, 0x99, 0x1c, 0xcb, 0x75, 0xbf, 0xe1, 0xb4, 0x92, 0x47, 0xdf, 0x21, 0x97, 0xd2, 0xd1, - 0xcc, 0x63, 0x03, 0xc6, 0x96, 0x9c, 0x8e, 0xb3, 0xe9, 0xb6, 0xdc, 0xc8, 0x25, 0x21, 0x7a, 0x12, - 0xca, 0x4e, 0xb3, 0xc9, 0xb8, 0xad, 0xca, 0xe2, 0xa9, 0x7b, 0x07, 0x73, 0xe5, 0x85, 0x26, 0xbd, - 0xf6, 0x41, 0x61, 0xed, 0x63, 0x8a, 0x81, 0xde, 0x0f, 0x03, 0xcd, 0xc0, 0xef, 0xcc, 0x94, 0x18, - 0x26, 0xdd, 0x75, 0x03, 0xd5, 0xc0, 0xef, 0x24, 0x50, 0x19, 0x8e, 0xfd, 0xab, 0x25, 0x78, 0x6c, - 0x89, 0x74, 0x76, 0x56, 0xea, 0x39, 0xe7, 0xf7, 0x45, 0x18, 0x69, 0xfb, 0x9e, 0x1b, 0xf9, 0x41, - 0x28, 0x9a, 0x66, 0x2b, 0x62, 0x4d, 0x94, 0x61, 0x05, 0x45, 0xe7, 0x61, 0xa0, 0x13, 0x33, 0x95, - 0x63, 0x92, 0x21, 0x65, 0xec, 0x24, 0x83, 0x50, 0x8c, 0x6e, 0x48, 0x02, 0xb1, 0x62, 0x14, 0xc6, - 0xcd, 0x90, 0x04, 0x98, 0x41, 0xe2, 0x9b, 0x99, 0xde, 0xd9, 0xe2, 0x84, 0x4e, 0xdc, 0xcc, 0x14, - 0x82, 0x35, 0x2c, 0x54, 0x83, 0x4a, 0x98, 0x98, 0xd9, 0xbe, 0xb6, 0xe9, 0x38, 0xbb, 0xba, 0xd5, - 0x4c, 0xc6, 0x44, 0x8c, 0x1b, 0x65, 0xa8, 0xe7, 0xd5, 0xfd, 0xd5, 0x12, 0x20, 0x3e, 0x84, 0xdf, - 0x64, 0x03, 0x77, 0x33, 0x3d, 0x70, 0xfd, 0x6f, 0x89, 0xa3, 0x1a, 0xbd, 0xff, 0x65, 0xc1, 0x63, - 0x4b, 0xae, 0xd7, 0x24, 0x41, 0xce, 0x02, 0x7c, 0x38, 0x6f, 0xd9, 0xc3, 0x31, 0x0d, 0xc6, 0x12, - 0x1b, 0x38, 0x82, 0x25, 0x66, 0xff, 0xb1, 0x05, 0x88, 0x7f, 0xf6, 0x3b, 0xee, 0x63, 0x6f, 0xa6, - 0x3f, 0xf6, 0x08, 0x96, 0x85, 0x7d, 0x1d, 0x26, 0x96, 0x5a, 0x2e, 0xf1, 0xa2, 0xd5, 0xda, 0x92, - 0xef, 0x6d, 0xb9, 0xdb, 0xe8, 0x65, 0x98, 0x88, 0xdc, 0x36, 0xf1, 0xbb, 0x51, 0x9d, 0x34, 0x7c, - 0x8f, 0xbd, 0x24, 0xad, 0x8b, 0x83, 0x8b, 0xe8, 0xde, 0xc1, 0xdc, 0xc4, 0x86, 0x01, 0xc1, 0x09, - 0x4c, 0xfb, 0x77, 0xe9, 0xf8, 0xf9, 0xed, 0x8e, 0xef, 0x11, 0x2f, 0x5a, 0xf2, 0xbd, 0x26, 0x97, - 0x38, 0xbc, 0x0c, 0x03, 0x11, 0x1d, 0x0f, 0x3e, 0x76, 0x17, 0xe4, 0x46, 0xa1, 0xa3, 0x70, 0xff, - 0x60, 0xee, 0x74, 0xba, 0x06, 0x1b, 0x27, 0x56, 0x07, 0x7d, 0x1b, 0x0c, 0x85, 0x91, 0x13, 0x75, - 0x43, 0x31, 0x9a, 0x8f, 0xcb, 0xd1, 0xac, 0xb3, 0xd2, 0xfb, 0x07, 0x73, 0x93, 0xaa, 0x1a, 0x2f, - 0xc2, 0xa2, 0x02, 0x7a, 0x0a, 0x86, 0xdb, 0x24, 0x0c, 0x9d, 0x6d, 0x79, 0x1b, 0x4e, 0x8a, 0xba, - 0xc3, 0x6b, 0xbc, 0x18, 0x4b, 0x38, 0x7a, 0x02, 0x06, 0x49, 0x10, 0xf8, 0x81, 0xd8, 0xa3, 0xe3, - 0x02, 0x71, 0x70, 0x99, 0x16, 0x62, 0x0e, 0xb3, 0x7f, 0xc3, 0x82, 0x49, 0xd5, 0x57, 0xde, 0xd6, - 0x31, 0xbc, 0x0a, 0x3e, 0x01, 0xd0, 0x90, 0x1f, 0x18, 0xb2, 0xdb, 0x63, 0xf4, 0xb9, 0x0b, 0x99, - 0x17, 0x75, 0x6a, 0x18, 0x63, 0xca, 0xaa, 0x28, 0xc4, 0x1a, 0x35, 0xfb, 0x9f, 0x59, 0x70, 0x22, - 0xf1, 0x45, 0xd7, 0xdd, 0x30, 0x42, 0x6f, 0xa4, 0xbe, 0x6a, 0xbe, 0xbf, 0xaf, 0xa2, 0xb5, 0xd9, - 0x37, 0xa9, 0xa5, 0x2c, 0x4b, 0xb4, 0x2f, 0xba, 0x0a, 0x83, 0x6e, 0x44, 0xda, 0xf2, 0x63, 0x9e, - 0x28, 0xfc, 0x18, 0xde, 0xab, 0x78, 0x46, 0x56, 0x69, 0x4d, 0xcc, 0x09, 0xd8, 0xbf, 0x5a, 0x86, - 0x0a, 0x5f, 0xb6, 0x6b, 0x4e, 0xe7, 0x18, 0xe6, 0xe2, 0x69, 0xa8, 0xb8, 0xed, 0x76, 0x37, 0x72, - 0x36, 0xc5, 0x71, 0x3e, 0xc2, 0xb7, 0xd6, 0xaa, 0x2c, 0xc4, 0x31, 0x1c, 0xad, 0xc2, 0x00, 0xeb, - 0x0a, 0xff, 0xca, 0x27, 0xb3, 0xbf, 0x52, 0xf4, 0x7d, 0xbe, 0xea, 0x44, 0x0e, 0xe7, 0xa4, 0xd4, - 0x3d, 0x42, 0x8b, 0x30, 0x23, 0x81, 0x1c, 0x80, 0x4d, 0xd7, 0x73, 0x82, 0x7d, 0x5a, 0x36, 0x53, - 0x66, 0x04, 0x9f, 0x2d, 0x26, 0xb8, 0xa8, 0xf0, 0x39, 0x59, 0xf5, 0x61, 0x31, 0x00, 0x6b, 0x44, - 0x67, 0x3f, 0x04, 0x15, 0x85, 0x7c, 0x18, 0x86, 0x68, 0xf6, 0x23, 0x30, 0x99, 0x68, 0xab, 0x57, - 0xf5, 0x31, 0x9d, 0x9f, 0xfa, 0x25, 0x76, 0x64, 0x88, 0x5e, 0x2f, 0x7b, 0x7b, 0xe2, 0xc8, 0x7d, - 0x0b, 0x4e, 0xb6, 0x32, 0x4e, 0x32, 0x31, 0xaf, 0xfd, 0x9f, 0x7c, 0x8f, 0x89, 0xcf, 0x3e, 0x99, - 0x05, 0xc5, 0x99, 0x6d, 0x50, 0x1e, 0xc1, 0xef, 0xd0, 0x0d, 0xe2, 0xb4, 0x74, 0x76, 0xfb, 0x86, - 0x28, 0xc3, 0x0a, 0x4a, 0xcf, 0xbb, 0x93, 0xaa, 0xf3, 0xd7, 0xc8, 0x7e, 0x9d, 0xb4, 0x48, 0x23, - 0xf2, 0x83, 0x6f, 0x68, 0xf7, 0xcf, 0xf2, 0xd1, 0xe7, 0xc7, 0xe5, 0xa8, 0x20, 0x50, 0xbe, 0x46, - 0xf6, 0xf9, 0x54, 0xe8, 0x5f, 0x57, 0x2e, 0xfc, 0xba, 0x9f, 0xb5, 0x60, 0x5c, 0x7d, 0xdd, 0x31, - 0x9c, 0x0b, 0x8b, 0xe6, 0xb9, 0x70, 0xb6, 0x70, 0x81, 0xe7, 0x9c, 0x08, 0x5f, 0x2d, 0xc1, 0x19, - 0x85, 0x43, 0xdf, 0x06, 0xfc, 0x8f, 0x58, 0x55, 0x97, 0xa0, 0xe2, 0x29, 0xa9, 0x95, 0x65, 0x8a, - 0x8b, 0x62, 0x99, 0x55, 0x8c, 0x43, 0x59, 0x3c, 0x2f, 0x16, 0x2d, 0x8d, 0xe9, 0xe2, 0x5c, 0x21, - 0xba, 0x5d, 0x84, 0x72, 0xd7, 0x6d, 0x8a, 0x0b, 0xe6, 0x03, 0x72, 0xb4, 0x6f, 0xae, 0x56, 0xef, - 0x1f, 0xcc, 0x3d, 0x9e, 0xa7, 0x4a, 0xa0, 0x37, 0x5b, 0x38, 0x7f, 0x73, 0xb5, 0x8a, 0x69, 0x65, - 0xb4, 0x00, 0x93, 0x52, 0x5b, 0x72, 0x8b, 0xb2, 0x5b, 0xbe, 0x27, 0xee, 0x21, 0x25, 0x93, 0xc5, - 0x26, 0x18, 0x27, 0xf1, 0x51, 0x15, 0xa6, 0x76, 0xbb, 0x9b, 0xa4, 0x45, 0x22, 0xfe, 0xc1, 0xd7, - 0x08, 0x97, 0x58, 0x56, 0xe2, 0x97, 0xd9, 0xb5, 0x04, 0x1c, 0xa7, 0x6a, 0xd8, 0x7f, 0xce, 0xee, - 0x03, 0x31, 0x7a, 0xb5, 0xc0, 0xa7, 0x0b, 0x8b, 0x52, 0xff, 0x46, 0x2e, 0xe7, 0x7e, 0x56, 0xc5, - 0x35, 0xb2, 0xbf, 0xe1, 0x53, 0xce, 0x3c, 0x7b, 0x55, 0x18, 0x6b, 0x7e, 0xa0, 0x70, 0xcd, 0xff, - 0x5c, 0x09, 0x4e, 0xa9, 0x11, 0x30, 0x98, 0xc0, 0x6f, 0xf6, 0x31, 0xb8, 0x0c, 0xa3, 0x4d, 0xb2, - 0xe5, 0x74, 0x5b, 0x91, 0x12, 0x9f, 0x0f, 0x72, 0x15, 0x4a, 0x35, 0x2e, 0xc6, 0x3a, 0xce, 0x21, - 0x86, 0xed, 0x7f, 0x8f, 0xb2, 0x8b, 0x38, 0x72, 0xe8, 0x1a, 0x57, 0xbb, 0xc6, 0xca, 0xdd, 0x35, - 0x4f, 0xc0, 0xa0, 0xdb, 0xa6, 0x8c, 0x59, 0xc9, 0xe4, 0xb7, 0x56, 0x69, 0x21, 0xe6, 0x30, 0xf4, - 0x3e, 0x18, 0x6e, 0xf8, 0xed, 0xb6, 0xe3, 0x35, 0xd9, 0x95, 0x57, 0x59, 0x1c, 0xa5, 0xbc, 0xdb, - 0x12, 0x2f, 0xc2, 0x12, 0x86, 0x1e, 0x83, 0x01, 0x27, 0xd8, 0xe6, 0x32, 0x8c, 0xca, 0xe2, 0x08, - 0x6d, 0x69, 0x21, 0xd8, 0x0e, 0x31, 0x2b, 0xa5, 0x4f, 0xb0, 0x3b, 0x7e, 0xb0, 0xeb, 0x7a, 0xdb, - 0x55, 0x37, 0x10, 0x5b, 0x42, 0xdd, 0x85, 0xb7, 0x15, 0x04, 0x6b, 0x58, 0x68, 0x05, 0x06, 0x3b, - 0x7e, 0x10, 0x85, 0x33, 0x43, 0x6c, 0xb8, 0x1f, 0xcf, 0x39, 0x88, 0xf8, 0xd7, 0xd6, 0xfc, 0x20, - 0x8a, 0x3f, 0x80, 0xfe, 0x0b, 0x31, 0xaf, 0x8e, 0xae, 0xc3, 0x30, 0xf1, 0xf6, 0x56, 0x02, 0xbf, - 0x3d, 0x73, 0x22, 0x9f, 0xd2, 0x32, 0x47, 0xe1, 0xcb, 0x2c, 0xe6, 0x51, 0x45, 0x31, 0x96, 0x24, - 0xd0, 0xb7, 0x41, 0x99, 0x78, 0x7b, 0x33, 0xc3, 0x8c, 0xd2, 0x6c, 0x0e, 0xa5, 0x5b, 0x4e, 0x10, - 0x9f, 0xf9, 0xcb, 0xde, 0x1e, 0xa6, 0x75, 0xd0, 0xc7, 0xa1, 0x22, 0x0f, 0x8c, 0x50, 0x08, 0xeb, - 0x32, 0x17, 0xac, 0x3c, 0x66, 0x30, 0x79, 0xb3, 0xeb, 0x06, 0xa4, 0x4d, 0xbc, 0x28, 0x8c, 0x4f, - 0x48, 0x09, 0x0d, 0x71, 0x4c, 0x0d, 0x7d, 0x5c, 0x4a, 0x88, 0xd7, 0xfc, 0xae, 0x17, 0x85, 0x33, - 0x15, 0xd6, 0xbd, 0x4c, 0xdd, 0xdd, 0xad, 0x18, 0x2f, 0x29, 0x42, 0xe6, 0x95, 0xb1, 0x41, 0x0a, - 0x7d, 0x12, 0xc6, 0xf9, 0x7f, 0xae, 0x01, 0x0b, 0x67, 0x4e, 0x31, 0xda, 0xe7, 0xf3, 0x69, 0x73, - 0xc4, 0xc5, 0x53, 0x82, 0xf8, 0xb8, 0x5e, 0x1a, 0x62, 0x93, 0x1a, 0xc2, 0x30, 0xde, 0x72, 0xf7, - 0x88, 0x47, 0xc2, 0xb0, 0x16, 0xf8, 0x9b, 0x64, 0x06, 0xd8, 0xc0, 0x9c, 0xc9, 0xd6, 0x98, 0xf9, - 0x9b, 0x64, 0x71, 0x9a, 0xd2, 0xbc, 0xae, 0xd7, 0xc1, 0x26, 0x09, 0x74, 0x13, 0x26, 0xe8, 0x8b, - 0xcd, 0x8d, 0x89, 0x8e, 0xf6, 0x22, 0xca, 0xde, 0x55, 0xd8, 0xa8, 0x84, 0x13, 0x44, 0xd0, 0x0d, - 0x18, 0x0b, 0x23, 0x27, 0x88, 0xba, 0x1d, 0x4e, 0xf4, 0x74, 0x2f, 0xa2, 0x4c, 0xe1, 0x5a, 0xd7, - 0xaa, 0x60, 0x83, 0x00, 0x7a, 0x0d, 0x2a, 0x2d, 0x77, 0x8b, 0x34, 0xf6, 0x1b, 0x2d, 0x32, 0x33, - 0xc6, 0xa8, 0x65, 0x1e, 0x2a, 0xd7, 0x25, 0x12, 0xe7, 0x73, 0xd5, 0x5f, 0x1c, 0x57, 0x47, 0xb7, - 0xe0, 0x74, 0x44, 0x82, 0xb6, 0xeb, 0x39, 0xf4, 0x30, 0x10, 0x4f, 0x2b, 0xa6, 0xc8, 0x1c, 0x67, - 0xbb, 0xed, 0x9c, 0x98, 0x8d, 0xd3, 0x1b, 0x99, 0x58, 0x38, 0xa7, 0x36, 0xba, 0x0b, 0x33, 0x19, - 0x10, 0xbf, 0xe5, 0x36, 0xf6, 0x67, 0x4e, 0x32, 0xca, 0x1f, 0x16, 0x94, 0x67, 0x36, 0x72, 0xf0, - 0xee, 0x17, 0xc0, 0x70, 0x2e, 0x75, 0x74, 0x03, 0x26, 0xd9, 0x09, 0x54, 0xeb, 0xb6, 0x5a, 0xa2, - 0xc1, 0x09, 0xd6, 0xe0, 0xfb, 0xe4, 0x7d, 0xbc, 0x6a, 0x82, 0xef, 0x1f, 0xcc, 0x41, 0xfc, 0x0f, - 0x27, 0x6b, 0xa3, 0x4d, 0xa6, 0x33, 0xeb, 0x06, 0x6e, 0xb4, 0x4f, 0xcf, 0x0d, 0x72, 0x37, 0x9a, - 0x99, 0x2c, 0x94, 0x57, 0xe8, 0xa8, 0x4a, 0xb1, 0xa6, 0x17, 0xe2, 0x24, 0x41, 0x7a, 0xa4, 0x86, - 0x51, 0xd3, 0xf5, 0x66, 0xa6, 0xf8, 0xbb, 0x44, 0x9e, 0x48, 0x75, 0x5a, 0x88, 0x39, 0x8c, 0xe9, - 0xcb, 0xe8, 0x8f, 0x1b, 0xf4, 0xe6, 0x9a, 0x66, 0x88, 0xb1, 0xbe, 0x4c, 0x02, 0x70, 0x8c, 0x43, - 0x99, 0xc9, 0x28, 0xda, 0x9f, 0x41, 0x0c, 0x55, 0x1d, 0x2c, 0x1b, 0x1b, 0x1f, 0xc7, 0xb4, 0xdc, - 0xde, 0x84, 0x09, 0x75, 0x10, 0xb2, 0x31, 0x41, 0x73, 0x30, 0xc8, 0xd8, 0x27, 0x21, 0x5d, 0xab, - 0xd0, 0x2e, 0x30, 0xd6, 0x0a, 0xf3, 0x72, 0xd6, 0x05, 0xf7, 0x2d, 0xb2, 0xb8, 0x1f, 0x11, 0xfe, - 0xa6, 0x2f, 0x6b, 0x5d, 0x90, 0x00, 0x1c, 0xe3, 0xd8, 0xff, 0x8f, 0xb3, 0xa1, 0xf1, 0x69, 0xdb, - 0xc7, 0xfd, 0xf2, 0x0c, 0x8c, 0xec, 0xf8, 0x61, 0x44, 0xb1, 0x59, 0x1b, 0x83, 0x31, 0xe3, 0x79, - 0x55, 0x94, 0x63, 0x85, 0x81, 0x5e, 0x81, 0xf1, 0x86, 0xde, 0x80, 0xb8, 0x1c, 0xd5, 0x31, 0x62, - 0xb4, 0x8e, 0x4d, 0x5c, 0xf4, 0x12, 0x8c, 0x30, 0x1b, 0x90, 0x86, 0xdf, 0x12, 0x5c, 0x9b, 0xbc, - 0xe1, 0x47, 0x6a, 0xa2, 0xfc, 0xbe, 0xf6, 0x1b, 0x2b, 0x6c, 0x74, 0x01, 0x86, 0x68, 0x17, 0x56, - 0x6b, 0xe2, 0x5a, 0x52, 0x82, 0xa2, 0xab, 0xac, 0x14, 0x0b, 0xa8, 0xfd, 0x57, 0x4a, 0xda, 0x28, - 0xd3, 0xf7, 0x30, 0x41, 0x35, 0x18, 0xbe, 0xe3, 0xb8, 0x91, 0xeb, 0x6d, 0x0b, 0xfe, 0xe3, 0xa9, - 0xc2, 0x3b, 0x8a, 0x55, 0xba, 0xcd, 0x2b, 0xf0, 0x5b, 0x54, 0xfc, 0xc1, 0x92, 0x0c, 0xa5, 0x18, - 0x74, 0x3d, 0x8f, 0x52, 0x2c, 0xf5, 0x4b, 0x11, 0xf3, 0x0a, 0x9c, 0xa2, 0xf8, 0x83, 0x25, 0x19, - 0xf4, 0x06, 0x80, 0xdc, 0x61, 0xa4, 0x29, 0x6c, 0x2f, 0x9e, 0xe9, 0x4d, 0x74, 0x43, 0xd5, 0x59, - 0x9c, 0xa0, 0x77, 0x74, 0xfc, 0x1f, 0x6b, 0xf4, 0xec, 0x88, 0xf1, 0x69, 0xe9, 0xce, 0xa0, 0xef, - 0xa0, 0x4b, 0xdc, 0x09, 0x22, 0xd2, 0x5c, 0x88, 0xc4, 0xe0, 0xbc, 0xbf, 0xbf, 0x47, 0xca, 0x86, - 0xdb, 0x26, 0xfa, 0x76, 0x10, 0x44, 0x70, 0x4c, 0xcf, 0xfe, 0x85, 0x32, 0xcc, 0xe4, 0x75, 0x97, - 0x2e, 0x3a, 0x72, 0xd7, 0x8d, 0x96, 0x28, 0x7b, 0x65, 0x99, 0x8b, 0x6e, 0x59, 0x94, 0x63, 0x85, - 0x41, 0x67, 0x3f, 0x74, 0xb7, 0xe5, 0x1b, 0x73, 0x30, 0x9e, 0xfd, 0x3a, 0x2b, 0xc5, 0x02, 0x4a, - 0xf1, 0x02, 0xe2, 0x84, 0xc2, 0xb8, 0x47, 0x5b, 0x25, 0x98, 0x95, 0x62, 0x01, 0xd5, 0xa5, 0x5d, - 0x03, 0x3d, 0xa4, 0x5d, 0xc6, 0x10, 0x0d, 0x1e, 0xed, 0x10, 0xa1, 0x4f, 0x01, 0x6c, 0xb9, 0x9e, - 0x1b, 0xee, 0x30, 0xea, 0x43, 0x87, 0xa6, 0xae, 0x98, 0xb3, 0x15, 0x45, 0x05, 0x6b, 0x14, 0xd1, - 0x8b, 0x30, 0xaa, 0x36, 0xe0, 0x6a, 0x95, 0x69, 0x3a, 0x35, 0xcb, 0x91, 0xf8, 0x34, 0xaa, 0x62, - 0x1d, 0xcf, 0xfe, 0x4c, 0x72, 0xbd, 0x88, 0x1d, 0xa0, 0x8d, 0xaf, 0xd5, 0xef, 0xf8, 0x96, 0x8a, - 0xc7, 0xd7, 0xfe, 0x7a, 0x19, 0x26, 0x8d, 0xc6, 0xba, 0x61, 0x1f, 0x67, 0xd6, 0x15, 0x7a, 0x80, - 0x3b, 0x11, 0x11, 0xfb, 0xcf, 0xee, 0xbd, 0x55, 0xf4, 0x43, 0x9e, 0xee, 0x00, 0x5e, 0x1f, 0x7d, - 0x0a, 0x2a, 0x2d, 0x27, 0x64, 0x92, 0x33, 0x22, 0xf6, 0x5d, 0x3f, 0xc4, 0xe2, 0x87, 0x89, 0x13, - 0x46, 0xda, 0xad, 0xc9, 0x69, 0xc7, 0x24, 0xe9, 0x4d, 0x43, 0xf9, 0x13, 0x69, 0x3d, 0xa6, 0x3a, - 0x41, 0x99, 0x98, 0x7d, 0xcc, 0x61, 0xe8, 0x25, 0x18, 0x0b, 0x08, 0x5b, 0x15, 0x4b, 0x94, 0x9b, - 0x63, 0xcb, 0x6c, 0x30, 0x66, 0xfb, 0xb0, 0x06, 0xc3, 0x06, 0x66, 0xfc, 0x36, 0x18, 0x2a, 0x78, - 0x1b, 0x3c, 0x05, 0xc3, 0xec, 0x87, 0x5a, 0x01, 0x6a, 0x36, 0x56, 0x79, 0x31, 0x96, 0xf0, 0xe4, - 0x82, 0x19, 0xe9, 0x6f, 0xc1, 0xd0, 0xd7, 0x87, 0x58, 0xd4, 0x4c, 0xcb, 0x3c, 0xc2, 0x4f, 0x39, - 0xb1, 0xe4, 0xb1, 0x84, 0xd9, 0xef, 0x87, 0x89, 0xaa, 0x43, 0xda, 0xbe, 0xb7, 0xec, 0x35, 0x3b, - 0xbe, 0xeb, 0x45, 0x68, 0x06, 0x06, 0xd8, 0x25, 0xc2, 0x8f, 0x80, 0x01, 0xda, 0x10, 0x66, 0x25, - 0xf6, 0x36, 0x9c, 0xaa, 0xfa, 0x77, 0xbc, 0x3b, 0x4e, 0xd0, 0x5c, 0xa8, 0xad, 0x6a, 0xef, 0xeb, - 0x75, 0xf9, 0xbe, 0xe3, 0x46, 0x5b, 0x99, 0x47, 0xaf, 0x56, 0x93, 0xb3, 0xb5, 0x2b, 0x6e, 0x8b, - 0xe4, 0x48, 0x41, 0xfe, 0x7a, 0xc9, 0x68, 0x29, 0xc6, 0x57, 0x5a, 0x2d, 0x2b, 0x57, 0xab, 0xf5, - 0x3a, 0x8c, 0x6c, 0xb9, 0xa4, 0xd5, 0xc4, 0x64, 0x4b, 0xac, 0xc4, 0x27, 0xf3, 0xed, 0x50, 0x56, - 0x28, 0xa6, 0x94, 0x7a, 0xf1, 0xd7, 0xe1, 0x8a, 0xa8, 0x8c, 0x15, 0x19, 0xb4, 0x0b, 0x53, 0xf2, - 0xc1, 0x20, 0xa1, 0x62, 0x5d, 0x3e, 0x55, 0xf4, 0x0a, 0x31, 0x89, 0x9f, 0xbc, 0x77, 0x30, 0x37, - 0x85, 0x13, 0x64, 0x70, 0x8a, 0x30, 0x7d, 0x0e, 0xb6, 0xe9, 0x09, 0x3c, 0xc0, 0x86, 0x9f, 0x3d, - 0x07, 0xd9, 0xcb, 0x96, 0x95, 0xda, 0x3f, 0x6e, 0xc1, 0x23, 0xa9, 0x91, 0x11, 0x2f, 0xfc, 0x23, - 0x9e, 0x85, 0xe4, 0x8b, 0xbb, 0xd4, 0xfb, 0xc5, 0x6d, 0xff, 0x3d, 0x0b, 0x4e, 0x2e, 0xb7, 0x3b, - 0xd1, 0x7e, 0xd5, 0x35, 0x55, 0x50, 0x1f, 0x82, 0xa1, 0x36, 0x69, 0xba, 0xdd, 0xb6, 0x98, 0xb9, - 0x39, 0x79, 0x4a, 0xad, 0xb1, 0xd2, 0xfb, 0x07, 0x73, 0xe3, 0xf5, 0xc8, 0x0f, 0x9c, 0x6d, 0xc2, - 0x0b, 0xb0, 0x40, 0x67, 0x67, 0xbd, 0xfb, 0x16, 0xb9, 0xee, 0xb6, 0x5d, 0x69, 0x57, 0x54, 0x28, - 0xb3, 0x9b, 0x97, 0x03, 0x3a, 0xff, 0x7a, 0xd7, 0xf1, 0x22, 0x37, 0xda, 0x17, 0xda, 0x23, 0x49, - 0x04, 0xc7, 0xf4, 0xec, 0xaf, 0x59, 0x30, 0x29, 0xd7, 0xfd, 0x42, 0xb3, 0x19, 0x90, 0x30, 0x44, - 0xb3, 0x50, 0x72, 0x3b, 0xa2, 0x97, 0x20, 0x7a, 0x59, 0x5a, 0xad, 0xe1, 0x92, 0xdb, 0x91, 0x6c, - 0x19, 0x3b, 0x08, 0xcb, 0xa6, 0x22, 0xed, 0xaa, 0x28, 0xc7, 0x0a, 0x03, 0x5d, 0x84, 0x11, 0xcf, - 0x6f, 0x72, 0xdb, 0x2e, 0x7e, 0xa5, 0xb1, 0x05, 0xb6, 0x2e, 0xca, 0xb0, 0x82, 0xa2, 0x1a, 0x54, - 0xb8, 0xd9, 0x53, 0xbc, 0x68, 0xfb, 0x32, 0x9e, 0x62, 0x5f, 0xb6, 0x21, 0x6b, 0xe2, 0x98, 0x88, - 0xfd, 0x2b, 0x16, 0x8c, 0xc9, 0x2f, 0xeb, 0x93, 0xe7, 0xa4, 0x5b, 0x2b, 0xe6, 0x37, 0xe3, 0xad, - 0x45, 0x79, 0x46, 0x06, 0x31, 0x58, 0xc5, 0xf2, 0xa1, 0x58, 0xc5, 0xcb, 0x30, 0xea, 0x74, 0x3a, - 0x35, 0x93, 0xcf, 0x64, 0x4b, 0x69, 0x21, 0x2e, 0xc6, 0x3a, 0x8e, 0xfd, 0x63, 0x25, 0x98, 0x90, - 0x5f, 0x50, 0xef, 0x6e, 0x86, 0x24, 0x42, 0x1b, 0x50, 0x71, 0xf8, 0x2c, 0x11, 0xb9, 0xc8, 0x9f, - 0xc8, 0x96, 0x23, 0x18, 0x53, 0x1a, 0x5f, 0xf8, 0x0b, 0xb2, 0x36, 0x8e, 0x09, 0xa1, 0x16, 0x4c, - 0x7b, 0x7e, 0xc4, 0x0e, 0x7f, 0x05, 0x2f, 0x52, 0xed, 0x24, 0xa9, 0x9f, 0x11, 0xd4, 0xa7, 0xd7, - 0x93, 0x54, 0x70, 0x9a, 0x30, 0x5a, 0x96, 0xb2, 0x99, 0x72, 0xbe, 0x30, 0x40, 0x9f, 0xb8, 0x6c, - 0xd1, 0x8c, 0xfd, 0xcb, 0x16, 0x54, 0x24, 0xda, 0x71, 0x68, 0xf1, 0xd6, 0x60, 0x38, 0x64, 0x93, - 0x20, 0x87, 0xc6, 0x2e, 0xea, 0x38, 0x9f, 0xaf, 0xf8, 0x4e, 0xe3, 0xff, 0x43, 0x2c, 0x69, 0x30, - 0xd1, 0xbc, 0xea, 0xfe, 0x3b, 0x44, 0x34, 0xaf, 0xfa, 0x93, 0x73, 0x29, 0xfd, 0x21, 0xeb, 0xb3, - 0x26, 0xeb, 0xa2, 0xac, 0x57, 0x27, 0x20, 0x5b, 0xee, 0xdd, 0x24, 0xeb, 0x55, 0x63, 0xa5, 0x58, - 0x40, 0xd1, 0x1b, 0x30, 0xd6, 0x90, 0x32, 0xd9, 0x78, 0x87, 0x5f, 0x28, 0xd4, 0x0f, 0x28, 0x55, - 0x12, 0x97, 0x85, 0x2c, 0x69, 0xf5, 0xb1, 0x41, 0xcd, 0x34, 0x23, 0x28, 0xf7, 0x32, 0x23, 0x88, - 0xe9, 0xe6, 0x2b, 0xd5, 0x7f, 0xc2, 0x82, 0x21, 0x2e, 0x8b, 0xeb, 0x4f, 0x14, 0xaa, 0x69, 0xd6, - 0xe2, 0xb1, 0xbb, 0x45, 0x0b, 0x85, 0xa6, 0x0c, 0xad, 0x41, 0x85, 0xfd, 0x60, 0xb2, 0xc4, 0x72, - 0xbe, 0xd5, 0x3d, 0x6f, 0x55, 0xef, 0xe0, 0x2d, 0x59, 0x0d, 0xc7, 0x14, 0xec, 0x1f, 0x2d, 0xd3, - 0xd3, 0x2d, 0x46, 0x35, 0x2e, 0x7d, 0xeb, 0xe1, 0x5d, 0xfa, 0xa5, 0x87, 0x75, 0xe9, 0x6f, 0xc3, - 0x64, 0x43, 0xd3, 0xc3, 0xc5, 0x33, 0x79, 0xb1, 0x70, 0x91, 0x68, 0x2a, 0x3b, 0x2e, 0x65, 0x59, - 0x32, 0x89, 0xe0, 0x24, 0x55, 0xf4, 0x1d, 0x30, 0xc6, 0xe7, 0x59, 0xb4, 0xc2, 0x2d, 0x31, 0xde, - 0x97, 0xbf, 0x5e, 0xf4, 0x26, 0xb8, 0x54, 0x4e, 0xab, 0x8e, 0x0d, 0x62, 0xf6, 0x9f, 0x58, 0x80, - 0x96, 0x3b, 0x3b, 0xa4, 0x4d, 0x02, 0xa7, 0x15, 0x8b, 0xd3, 0x7f, 0xd0, 0x82, 0x19, 0x92, 0x2a, - 0x5e, 0xf2, 0xdb, 0x6d, 0xf1, 0x68, 0xc9, 0x79, 0x57, 0x2f, 0xe7, 0xd4, 0x51, 0x6e, 0x09, 0x33, - 0x79, 0x18, 0x38, 0xb7, 0x3d, 0xb4, 0x06, 0x27, 0xf8, 0x2d, 0xa9, 0x00, 0x9a, 0xed, 0xf5, 0xa3, - 0x82, 0xf0, 0x89, 0x8d, 0x34, 0x0a, 0xce, 0xaa, 0x67, 0x7f, 0xcf, 0x18, 0xe4, 0xf6, 0xe2, 0x5d, - 0x3d, 0xc2, 0xbb, 0x7a, 0x84, 0x77, 0xf5, 0x08, 0xef, 0xea, 0x11, 0xde, 0xd5, 0x23, 0x7c, 0xcb, - 0xeb, 0x11, 0xfe, 0xaa, 0x05, 0xa7, 0xd4, 0x35, 0x60, 0x3c, 0x7c, 0x3f, 0x0b, 0x27, 0xf8, 0x76, - 0x5b, 0x6a, 0x39, 0x6e, 0x7b, 0x83, 0xb4, 0x3b, 0x2d, 0x27, 0x92, 0x5a, 0xf7, 0xcb, 0x99, 0x2b, - 0x37, 0x61, 0xb1, 0x6a, 0x54, 0x5c, 0x7c, 0x84, 0x5e, 0x4f, 0x19, 0x00, 0x9c, 0xd5, 0x8c, 0xfd, - 0x0b, 0x23, 0x30, 0xb8, 0xbc, 0x47, 0xbc, 0xe8, 0x18, 0x9e, 0x08, 0x0d, 0x98, 0x70, 0xbd, 0x3d, - 0xbf, 0xb5, 0x47, 0x9a, 0x1c, 0x7e, 0x98, 0x97, 0xec, 0x69, 0x41, 0x7a, 0x62, 0xd5, 0x20, 0x81, - 0x13, 0x24, 0x1f, 0x86, 0x34, 0xf9, 0x0a, 0x0c, 0xf1, 0x43, 0x5c, 0x88, 0x92, 0x33, 0xcf, 0x6c, - 0x36, 0x88, 0xe2, 0x6a, 0x8a, 0x25, 0xdd, 0xfc, 0x92, 0x10, 0xd5, 0xd1, 0x67, 0x60, 0x62, 0xcb, - 0x0d, 0xc2, 0x68, 0xc3, 0x6d, 0x93, 0x30, 0x72, 0xda, 0x9d, 0x07, 0x90, 0x1e, 0xab, 0x71, 0x58, - 0x31, 0x28, 0xe1, 0x04, 0x65, 0xb4, 0x0d, 0xe3, 0x2d, 0x47, 0x6f, 0x6a, 0xf8, 0xd0, 0x4d, 0xa9, - 0xdb, 0xe1, 0xba, 0x4e, 0x08, 0x9b, 0x74, 0xe9, 0x76, 0x6a, 0x30, 0x01, 0xe8, 0x08, 0x13, 0x0b, - 0xa8, 0xed, 0xc4, 0x25, 0x9f, 0x1c, 0x46, 0x19, 0x1d, 0x66, 0x20, 0x5b, 0x31, 0x19, 0x1d, 0xcd, - 0x0c, 0xf6, 0xd3, 0x50, 0x21, 0x74, 0x08, 0x29, 0x61, 0x71, 0xc1, 0x5c, 0xea, 0xaf, 0xaf, 0x6b, - 0x6e, 0x23, 0xf0, 0x4d, 0xb9, 0xfd, 0xb2, 0xa4, 0x84, 0x63, 0xa2, 0x68, 0x09, 0x86, 0x42, 0x12, - 0xb8, 0x24, 0x14, 0x57, 0x4d, 0xc1, 0x34, 0x32, 0x34, 0xee, 0x5b, 0xc2, 0x7f, 0x63, 0x51, 0x95, - 0x2e, 0x2f, 0x87, 0x89, 0x34, 0xd9, 0x65, 0xa0, 0x2d, 0xaf, 0x05, 0x56, 0x8a, 0x05, 0x14, 0xbd, - 0x06, 0xc3, 0x01, 0x69, 0x31, 0xc5, 0xd0, 0x78, 0xff, 0x8b, 0x9c, 0xeb, 0x99, 0x78, 0x3d, 0x2c, - 0x09, 0xa0, 0x6b, 0x80, 0x02, 0x42, 0x19, 0x25, 0xd7, 0xdb, 0x56, 0x66, 0xa3, 0xe2, 0xa0, 0x55, - 0x0c, 0x29, 0x8e, 0x31, 0xa4, 0x9b, 0x0f, 0xce, 0xa8, 0x86, 0xae, 0xc0, 0xb4, 0x2a, 0x5d, 0xf5, - 0xc2, 0xc8, 0xa1, 0x07, 0xdc, 0x24, 0xa3, 0xa5, 0xe4, 0x14, 0x38, 0x89, 0x80, 0xd3, 0x75, 0xec, - 0x2f, 0x59, 0xc0, 0xc7, 0xf9, 0x18, 0x5e, 0xe7, 0xaf, 0x9a, 0xaf, 0xf3, 0x33, 0xb9, 0x33, 0x97, - 0xf3, 0x32, 0xff, 0x92, 0x05, 0xa3, 0xda, 0xcc, 0xc6, 0x6b, 0xd6, 0x2a, 0x58, 0xb3, 0x5d, 0x98, - 0xa2, 0x2b, 0xfd, 0xc6, 0x66, 0x48, 0x82, 0x3d, 0xd2, 0x64, 0x0b, 0xb3, 0xf4, 0x60, 0x0b, 0x53, - 0x99, 0xa8, 0x5d, 0x4f, 0x10, 0xc4, 0xa9, 0x26, 0xec, 0x4f, 0xcb, 0xae, 0x2a, 0x8b, 0xbe, 0x86, - 0x9a, 0xf3, 0x84, 0x45, 0x9f, 0x9a, 0x55, 0x1c, 0xe3, 0xd0, 0xad, 0xb6, 0xe3, 0x87, 0x51, 0xd2, - 0xa2, 0xef, 0xaa, 0x1f, 0x46, 0x98, 0x41, 0xec, 0xe7, 0x01, 0x96, 0xef, 0x92, 0x06, 0x5f, 0xb1, - 0xfa, 0xe3, 0xc1, 0xca, 0x7f, 0x3c, 0xd8, 0xbf, 0x65, 0xc1, 0xc4, 0xca, 0x92, 0x71, 0x73, 0xcd, - 0x03, 0xf0, 0x17, 0xcf, 0xed, 0xdb, 0xeb, 0x52, 0x1d, 0xce, 0x35, 0x9a, 0xaa, 0x14, 0x6b, 0x18, - 0xe8, 0x0c, 0x94, 0x5b, 0x5d, 0x4f, 0x88, 0x0f, 0x87, 0xe9, 0xf5, 0x78, 0xbd, 0xeb, 0x61, 0x5a, - 0xa6, 0xb9, 0x14, 0x94, 0xfb, 0x76, 0x29, 0xe8, 0xe9, 0xda, 0x8f, 0xe6, 0x60, 0xf0, 0xce, 0x1d, - 0xb7, 0xc9, 0x1d, 0x28, 0x85, 0xaa, 0xfe, 0xf6, 0xed, 0xd5, 0x6a, 0x88, 0x79, 0xb9, 0xfd, 0x85, - 0x32, 0xcc, 0xae, 0xb4, 0xc8, 0xdd, 0xb7, 0xe9, 0x44, 0xda, 0xaf, 0x43, 0xc4, 0xe1, 0x04, 0x31, - 0x87, 0x75, 0x7a, 0xe9, 0x3d, 0x1e, 0x5b, 0x30, 0xcc, 0x0d, 0xda, 0xa4, 0x4b, 0xe9, 0x2b, 0x59, - 0xad, 0xe7, 0x0f, 0xc8, 0x3c, 0x37, 0x8c, 0x13, 0x1e, 0x71, 0xea, 0xc2, 0x14, 0xa5, 0x58, 0x12, - 0x9f, 0x7d, 0x19, 0xc6, 0x74, 0xcc, 0x43, 0xb9, 0x9f, 0xfd, 0xa5, 0x32, 0x4c, 0xd1, 0x1e, 0x3c, - 0xd4, 0x89, 0xb8, 0x99, 0x9e, 0x88, 0xa3, 0x76, 0x41, 0xea, 0x3d, 0x1b, 0x6f, 0x24, 0x67, 0xe3, - 0x72, 0xde, 0x6c, 0x1c, 0xf7, 0x1c, 0x7c, 0xb7, 0x05, 0x27, 0x56, 0x5a, 0x7e, 0x63, 0x37, 0xe1, - 0x26, 0xf4, 0x22, 0x8c, 0xd2, 0xe3, 0x38, 0x34, 0x3c, 0xd8, 0x8d, 0x98, 0x06, 0x02, 0x84, 0x75, - 0x3c, 0xad, 0xda, 0xcd, 0x9b, 0xab, 0xd5, 0xac, 0x50, 0x08, 0x02, 0x84, 0x75, 0x3c, 0xfb, 0xd7, - 0x2d, 0x38, 0x7b, 0x65, 0x69, 0x39, 0x5e, 0x8a, 0xa9, 0x68, 0x0c, 0x17, 0x60, 0xa8, 0xd3, 0xd4, - 0xba, 0x12, 0x8b, 0x57, 0xab, 0xac, 0x17, 0x02, 0xfa, 0x4e, 0x89, 0x34, 0x72, 0x13, 0xe0, 0x0a, - 0xae, 0x2d, 0x89, 0x73, 0x57, 0x6a, 0x53, 0xac, 0x5c, 0x6d, 0xca, 0xfb, 0x60, 0x98, 0xde, 0x0b, - 0x6e, 0x43, 0xf6, 0x9b, 0x2b, 0x68, 0x79, 0x11, 0x96, 0x30, 0xfb, 0x67, 0x2c, 0x38, 0x71, 0xc5, - 0x8d, 0xe8, 0xa5, 0x9d, 0x0c, 0x37, 0x40, 0x6f, 0xed, 0xd0, 0x8d, 0xfc, 0x60, 0x3f, 0x19, 0x6e, - 0x00, 0x2b, 0x08, 0xd6, 0xb0, 0xf8, 0x07, 0xed, 0xb9, 0xcc, 0x42, 0xbb, 0x64, 0xea, 0xaf, 0xb0, - 0x28, 0xc7, 0x0a, 0x83, 0x8e, 0x57, 0xd3, 0x0d, 0x98, 0xe8, 0x6f, 0x5f, 0x1c, 0xdc, 0x6a, 0xbc, - 0xaa, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x8f, 0x2c, 0x98, 0xbb, 0xd2, 0xea, 0x86, 0x11, 0x09, 0xb6, - 0xc2, 0x9c, 0x43, 0xf7, 0x79, 0xa8, 0x10, 0x29, 0x68, 0x17, 0xbd, 0x56, 0x8c, 0xa8, 0x92, 0xc0, - 0xf3, 0xa8, 0x07, 0x0a, 0xaf, 0x0f, 0x5f, 0xc6, 0xc3, 0x39, 0xa3, 0xad, 0x00, 0x22, 0x7a, 0x5b, - 0x7a, 0x18, 0x08, 0xe6, 0x4f, 0xbe, 0x9c, 0x82, 0xe2, 0x8c, 0x1a, 0xf6, 0x8f, 0x5b, 0x70, 0x4a, - 0x7d, 0xf0, 0x3b, 0xee, 0x33, 0xed, 0xaf, 0x94, 0x60, 0xfc, 0xea, 0xc6, 0x46, 0xed, 0x0a, 0x89, - 0xb4, 0x55, 0x59, 0xac, 0x3e, 0xc7, 0x9a, 0x16, 0xb0, 0xe8, 0x8d, 0xd8, 0x8d, 0xdc, 0xd6, 0x3c, - 0x8f, 0x26, 0x34, 0xbf, 0xea, 0x45, 0x37, 0x82, 0x7a, 0x14, 0xb8, 0xde, 0x76, 0xe6, 0x4a, 0x97, - 0x3c, 0x4b, 0x39, 0x8f, 0x67, 0x41, 0xcf, 0xc3, 0x10, 0x0b, 0x67, 0x24, 0x27, 0xe1, 0x51, 0xf5, - 0xc4, 0x62, 0xa5, 0xf7, 0x0f, 0xe6, 0x2a, 0x37, 0xf1, 0x2a, 0xff, 0x83, 0x05, 0x2a, 0xba, 0x09, - 0xa3, 0x3b, 0x51, 0xd4, 0xb9, 0x4a, 0x9c, 0x26, 0x09, 0xe4, 0x29, 0x7b, 0x2e, 0xeb, 0x94, 0xa5, - 0x83, 0xc0, 0xd1, 0xe2, 0x83, 0x29, 0x2e, 0x0b, 0xb1, 0x4e, 0xc7, 0xae, 0x03, 0xc4, 0xb0, 0x23, - 0x52, 0x80, 0xd8, 0x1b, 0x50, 0xa1, 0x9f, 0xbb, 0xd0, 0x72, 0x9d, 0x62, 0x15, 0xf3, 0xd3, 0x50, - 0x91, 0x0a, 0xe4, 0x50, 0xf8, 0x5a, 0xb3, 0x1b, 0x49, 0xea, 0x97, 0x43, 0x1c, 0xc3, 0xed, 0x2d, - 0x38, 0xc9, 0xcc, 0x01, 0x9d, 0x68, 0xc7, 0x58, 0x7d, 0xbd, 0xa7, 0xf9, 0x19, 0xf1, 0x62, 0xe3, - 0x7d, 0x9e, 0xd1, 0xdc, 0x19, 0xc7, 0x24, 0xc5, 0xf8, 0xf5, 0x66, 0x7f, 0x7d, 0x00, 0x1e, 0x5d, - 0xad, 0xe7, 0x87, 0xe3, 0x78, 0x09, 0xc6, 0x38, 0x23, 0x48, 0x27, 0xdd, 0x69, 0x89, 0x76, 0x95, - 0x6c, 0x73, 0x43, 0x83, 0x61, 0x03, 0x13, 0x9d, 0x85, 0xb2, 0xfb, 0xa6, 0x97, 0x74, 0xf6, 0x59, - 0x7d, 0x7d, 0x1d, 0xd3, 0x72, 0x0a, 0xa6, 0x3c, 0x25, 0x3f, 0xac, 0x15, 0x58, 0xf1, 0x95, 0xaf, - 0xc2, 0x84, 0x1b, 0x36, 0x42, 0x77, 0xd5, 0xa3, 0x3b, 0x50, 0xdb, 0xc3, 0x4a, 0x9a, 0x40, 0x3b, - 0xad, 0xa0, 0x38, 0x81, 0xad, 0xdd, 0x1c, 0x83, 0x7d, 0xf3, 0xa5, 0x3d, 0x9d, 0x8f, 0xe9, 0xc1, - 0xde, 0x61, 0x5f, 0x17, 0x32, 0x21, 0xb5, 0x38, 0xd8, 0xf9, 0x07, 0x87, 0x58, 0xc2, 0xe8, 0x53, - 0xad, 0xb1, 0xe3, 0x74, 0x16, 0xba, 0xd1, 0x4e, 0xd5, 0x0d, 0x1b, 0xfe, 0x1e, 0x09, 0xf6, 0xd9, - 0x2b, 0x7b, 0x24, 0x7e, 0xaa, 0x29, 0xc0, 0xd2, 0xd5, 0x85, 0x1a, 0xc5, 0xc4, 0xe9, 0x3a, 0x68, - 0x01, 0x26, 0x65, 0x61, 0x9d, 0x84, 0xec, 0x70, 0x1f, 0x65, 0x64, 0x94, 0xfb, 0x8d, 0x28, 0x56, - 0x44, 0x92, 0xf8, 0x26, 0xeb, 0x0a, 0x47, 0xc1, 0xba, 0x7e, 0x08, 0xc6, 0x5d, 0xcf, 0x8d, 0x5c, - 0x27, 0xf2, 0xb9, 0x86, 0x85, 0x3f, 0xa8, 0x99, 0xe8, 0x78, 0x55, 0x07, 0x60, 0x13, 0xcf, 0xfe, - 0xaf, 0x03, 0x30, 0xcd, 0xa6, 0xed, 0xdd, 0x15, 0xf6, 0xad, 0xb4, 0xc2, 0x6e, 0xa6, 0x57, 0xd8, - 0x51, 0xf0, 0xe4, 0x0f, 0xbc, 0xcc, 0x3e, 0x03, 0x15, 0xe5, 0x71, 0x24, 0x5d, 0x0e, 0xad, 0x1c, - 0x97, 0xc3, 0xde, 0xf7, 0xb2, 0x34, 0xda, 0x2a, 0x67, 0x1a, 0x6d, 0x7d, 0xd9, 0x82, 0x58, 0x65, - 0x80, 0x5e, 0x87, 0x4a, 0xc7, 0x67, 0xb6, 0x88, 0x81, 0x34, 0xf0, 0x7d, 0x6f, 0xa1, 0xce, 0x81, - 0x47, 0x24, 0x0a, 0xf8, 0x28, 0xd4, 0x64, 0x55, 0x1c, 0x53, 0x41, 0xd7, 0x60, 0xb8, 0x13, 0x90, - 0x7a, 0xc4, 0xc2, 0x73, 0xf4, 0x4f, 0x90, 0xaf, 0x1a, 0x5e, 0x11, 0x4b, 0x0a, 0xf6, 0x7f, 0xb3, - 0x60, 0x2a, 0x89, 0x8a, 0x3e, 0x0c, 0x03, 0xe4, 0x2e, 0x69, 0x88, 0xfe, 0x66, 0x5e, 0xb2, 0xb1, - 0xd0, 0x81, 0x0f, 0x00, 0xfd, 0x8f, 0x59, 0x2d, 0x74, 0x15, 0x86, 0xe9, 0x0d, 0x7b, 0x45, 0x85, - 0x86, 0x7a, 0x3c, 0xef, 0x96, 0x56, 0xac, 0x0a, 0xef, 0x9c, 0x28, 0xc2, 0xb2, 0x3a, 0xb3, 0x94, - 0x6a, 0x74, 0xea, 0xf4, 0xf1, 0x12, 0x15, 0xbd, 0xb1, 0x37, 0x96, 0x6a, 0x1c, 0x49, 0x50, 0xe3, - 0x96, 0x52, 0xb2, 0x10, 0xc7, 0x44, 0xec, 0x9f, 0xb3, 0x00, 0xb8, 0x61, 0x98, 0xe3, 0x6d, 0x93, - 0x63, 0x90, 0x93, 0x57, 0x61, 0x20, 0xec, 0x90, 0x46, 0x91, 0x99, 0x6c, 0xdc, 0x9f, 0x7a, 0x87, - 0x34, 0xe2, 0x15, 0x47, 0xff, 0x61, 0x56, 0xdb, 0xfe, 0x5e, 0x80, 0x89, 0x18, 0x6d, 0x35, 0x22, - 0x6d, 0xf4, 0xac, 0x11, 0xa6, 0xe0, 0x4c, 0x22, 0x4c, 0x41, 0x85, 0x61, 0x6b, 0x22, 0xd9, 0xcf, - 0x40, 0xb9, 0xed, 0xdc, 0x15, 0x32, 0xb7, 0xa7, 0x8b, 0xbb, 0x41, 0xe9, 0xcf, 0xaf, 0x39, 0x77, - 0xf9, 0xb3, 0xf4, 0x69, 0xb9, 0x43, 0xd6, 0x9c, 0xbb, 0xf7, 0xb9, 0x31, 0x2c, 0x3b, 0xa5, 0xaf, - 0xbb, 0x61, 0xf4, 0xb9, 0xff, 0x12, 0xff, 0x67, 0xfb, 0x8e, 0x36, 0xc2, 0xda, 0x72, 0x3d, 0x61, - 0xf3, 0xd4, 0x57, 0x5b, 0xae, 0x97, 0x6c, 0xcb, 0xf5, 0xfa, 0x68, 0xcb, 0xf5, 0xd0, 0x5b, 0x30, - 0x2c, 0x4c, 0x12, 0x45, 0x58, 0xa0, 0x4b, 0x7d, 0xb4, 0x27, 0x2c, 0x1a, 0x79, 0x9b, 0x97, 0xe4, - 0xb3, 0x5b, 0x94, 0xf6, 0x6c, 0x57, 0x36, 0x88, 0xfe, 0x9a, 0x05, 0x13, 0xe2, 0x37, 0x26, 0x6f, - 0x76, 0x49, 0x18, 0x09, 0xb6, 0xf4, 0x83, 0xfd, 0xf7, 0x41, 0x54, 0xe4, 0x5d, 0xf9, 0xa0, 0xbc, - 0x67, 0x4c, 0x60, 0xcf, 0x1e, 0x25, 0x7a, 0x81, 0xfe, 0x81, 0x05, 0x27, 0xdb, 0xce, 0x5d, 0xde, - 0x22, 0x2f, 0xc3, 0x4e, 0xe4, 0xfa, 0x42, 0xb5, 0xff, 0xe1, 0xfe, 0xa6, 0x3f, 0x55, 0x9d, 0x77, - 0x52, 0xea, 0x1f, 0x4f, 0x66, 0xa1, 0xf4, 0xec, 0x6a, 0x66, 0xbf, 0x66, 0xb7, 0x60, 0x44, 0xae, - 0xb7, 0x0c, 0xe1, 0x46, 0x55, 0xe7, 0xb9, 0x0f, 0x6d, 0x11, 0xaa, 0xbb, 0xff, 0xd3, 0x76, 0xc4, - 0x5a, 0x7b, 0xa8, 0xed, 0x7c, 0x06, 0xc6, 0xf4, 0x35, 0xf6, 0x50, 0xdb, 0x7a, 0x13, 0x4e, 0x64, - 0xac, 0xa5, 0x87, 0xda, 0xe4, 0x1d, 0x38, 0x93, 0xbb, 0x3e, 0x1e, 0x66, 0xc3, 0xf6, 0x57, 0x2c, - 0xfd, 0x1c, 0x3c, 0x06, 0x65, 0xc5, 0x92, 0xa9, 0xac, 0x38, 0x57, 0xbc, 0x73, 0x72, 0x34, 0x16, - 0x6f, 0xe8, 0x9d, 0xa6, 0xa7, 0x3a, 0x7a, 0x0d, 0x86, 0x5a, 0xb4, 0x44, 0x1a, 0xb6, 0xda, 0xbd, - 0x77, 0x64, 0xcc, 0x4c, 0xb2, 0xf2, 0x10, 0x0b, 0x0a, 0xf6, 0x2f, 0x5a, 0x30, 0x70, 0x0c, 0x23, - 0x81, 0xcd, 0x91, 0x78, 0x36, 0x97, 0xb4, 0x88, 0x58, 0x3c, 0x8f, 0x9d, 0x3b, 0xcb, 0x77, 0x23, - 0xe2, 0x85, 0xec, 0x46, 0xce, 0x1c, 0x98, 0x9f, 0xb2, 0xe0, 0xc4, 0x75, 0xdf, 0x69, 0x2e, 0x3a, - 0x2d, 0xc7, 0x6b, 0x90, 0x60, 0xd5, 0xdb, 0x3e, 0x94, 0x55, 0x76, 0xa9, 0xa7, 0x55, 0xf6, 0x92, - 0x34, 0x6a, 0x1a, 0xc8, 0x9f, 0x3f, 0xca, 0x49, 0x27, 0x03, 0xb7, 0x18, 0xe6, 0xb7, 0x3b, 0x80, - 0xf4, 0x5e, 0x0a, 0x1f, 0x19, 0x0c, 0xc3, 0x2e, 0xef, 0xaf, 0x98, 0xc4, 0x27, 0xb3, 0x39, 0xdc, - 0xd4, 0xe7, 0x69, 0xde, 0x1f, 0xbc, 0x00, 0x4b, 0x42, 0xf6, 0x4b, 0x90, 0xe9, 0x68, 0xdf, 0x5b, - 0x2e, 0x61, 0x7f, 0x1c, 0xa6, 0x59, 0xcd, 0x43, 0x4a, 0x06, 0xec, 0x84, 0x34, 0x35, 0x23, 0x04, - 0x9f, 0xfd, 0x79, 0x0b, 0x26, 0xd7, 0x13, 0x91, 0xc9, 0x2e, 0x30, 0xfd, 0x6b, 0x86, 0x10, 0xbf, - 0xce, 0x4a, 0xb1, 0x80, 0x1e, 0xb9, 0x90, 0xeb, 0xcf, 0x2d, 0x88, 0x63, 0x5f, 0x1c, 0x03, 0xfb, - 0xb6, 0x64, 0xb0, 0x6f, 0x99, 0x8c, 0xac, 0xea, 0x4e, 0x1e, 0xf7, 0x86, 0xae, 0xa9, 0xa8, 0x50, - 0x05, 0x3c, 0x6c, 0x4c, 0x86, 0x2f, 0xc5, 0x09, 0x33, 0x74, 0x94, 0x8c, 0x13, 0x65, 0xff, 0x76, - 0x09, 0x90, 0xc2, 0xed, 0x3b, 0x6a, 0x55, 0xba, 0xc6, 0xd1, 0x44, 0xad, 0xda, 0x03, 0xc4, 0x2c, - 0x08, 0x02, 0xc7, 0x0b, 0x39, 0x59, 0x57, 0x88, 0xf5, 0x0e, 0x67, 0x9e, 0x30, 0x2b, 0x9a, 0x44, - 0xd7, 0x53, 0xd4, 0x70, 0x46, 0x0b, 0x9a, 0x65, 0xc8, 0x60, 0xbf, 0x96, 0x21, 0x43, 0x3d, 0xfc, - 0xe0, 0x7e, 0xd6, 0x82, 0x71, 0x35, 0x4c, 0xef, 0x10, 0x2b, 0x75, 0xd5, 0x9f, 0x9c, 0x03, 0xb4, - 0xa6, 0x75, 0x99, 0x5d, 0x2c, 0xdf, 0xce, 0xfc, 0x19, 0x9d, 0x96, 0xfb, 0x16, 0x51, 0x31, 0x03, - 0xe7, 0x84, 0x7f, 0xa2, 0x28, 0xbd, 0x7f, 0x30, 0x37, 0xae, 0xfe, 0xf1, 0x18, 0xc5, 0x71, 0x15, - 0x7a, 0x24, 0x4f, 0x26, 0x96, 0x22, 0x7a, 0x11, 0x06, 0x3b, 0x3b, 0x4e, 0x48, 0x12, 0xde, 0x3c, - 0x83, 0x35, 0x5a, 0x78, 0xff, 0x60, 0x6e, 0x42, 0x55, 0x60, 0x25, 0x98, 0x63, 0xf7, 0x1f, 0x0b, - 0x2c, 0xbd, 0x38, 0x7b, 0xc6, 0x02, 0xfb, 0x13, 0x0b, 0x06, 0xd6, 0xfd, 0xe6, 0x71, 0x1c, 0x01, - 0xaf, 0x1a, 0x47, 0xc0, 0x63, 0x79, 0xe1, 0xe3, 0x73, 0x77, 0xff, 0x4a, 0x62, 0xf7, 0x9f, 0xcb, - 0xa5, 0x50, 0xbc, 0xf1, 0xdb, 0x30, 0xca, 0x82, 0xd2, 0x0b, 0xcf, 0xa5, 0xe7, 0x8d, 0x0d, 0x3f, - 0x97, 0xd8, 0xf0, 0x93, 0x1a, 0xaa, 0xb6, 0xd3, 0x9f, 0x82, 0x61, 0xe1, 0x0a, 0x93, 0x74, 0x0b, - 0x15, 0xb8, 0x58, 0xc2, 0xed, 0x9f, 0x28, 0x83, 0x11, 0x04, 0x1f, 0xfd, 0xb2, 0x05, 0xf3, 0x01, - 0x37, 0x91, 0x6d, 0x56, 0xbb, 0x81, 0xeb, 0x6d, 0xd7, 0x1b, 0x3b, 0xa4, 0xd9, 0x6d, 0xb9, 0xde, - 0xf6, 0xea, 0xb6, 0xe7, 0xab, 0xe2, 0xe5, 0xbb, 0xa4, 0xd1, 0x65, 0x6a, 0xb7, 0x1e, 0x11, 0xf7, - 0x95, 0xa9, 0xf9, 0x73, 0xf7, 0x0e, 0xe6, 0xe6, 0xf1, 0xa1, 0x68, 0xe3, 0x43, 0xf6, 0x05, 0xfd, - 0xba, 0x05, 0x97, 0x78, 0x6c, 0xf8, 0xfe, 0xfb, 0x5f, 0xf0, 0x5a, 0xae, 0x49, 0x52, 0x31, 0x91, - 0x0d, 0x12, 0xb4, 0x17, 0x3f, 0x24, 0x06, 0xf4, 0x52, 0xed, 0x70, 0x6d, 0xe1, 0xc3, 0x76, 0xce, - 0xfe, 0x17, 0x65, 0x18, 0x17, 0x31, 0xa3, 0xc4, 0x1d, 0xf0, 0xa2, 0xb1, 0x24, 0x1e, 0x4f, 0x2c, - 0x89, 0x69, 0x03, 0xf9, 0x68, 0x8e, 0xff, 0x10, 0xa6, 0xe9, 0xe1, 0x7c, 0x95, 0x38, 0x41, 0xb4, - 0x49, 0x1c, 0x6e, 0xf0, 0x55, 0x3e, 0xf4, 0xe9, 0xaf, 0xe4, 0x93, 0xd7, 0x93, 0xc4, 0x70, 0x9a, - 0xfe, 0xb7, 0xd2, 0x9d, 0xe3, 0xc1, 0x54, 0x2a, 0xec, 0xd7, 0x27, 0xa0, 0xa2, 0xfc, 0x38, 0xc4, - 0xa1, 0x53, 0x1c, 0x3d, 0x2f, 0x49, 0x81, 0x8b, 0xbf, 0x62, 0x1f, 0xa2, 0x98, 0x9c, 0xfd, 0x8f, - 0x4a, 0x46, 0x83, 0x7c, 0x12, 0xd7, 0x61, 0xc4, 0x09, 0x43, 0x77, 0xdb, 0x23, 0xcd, 0x22, 0x09, - 0x65, 0xaa, 0x19, 0xe6, 0x4b, 0xb3, 0x20, 0x6a, 0x62, 0x45, 0x03, 0x5d, 0xe5, 0x66, 0x75, 0x7b, - 0xa4, 0x48, 0x3c, 0x99, 0xa2, 0x06, 0xd2, 0xf0, 0x6e, 0x8f, 0x60, 0x51, 0x1f, 0x7d, 0x92, 0xdb, - 0x3d, 0x5e, 0xf3, 0xfc, 0x3b, 0xde, 0x15, 0xdf, 0x97, 0x71, 0x19, 0xfa, 0x23, 0x38, 0x2d, 0xad, - 0x1d, 0x55, 0x75, 0x6c, 0x52, 0xeb, 0x2f, 0x8e, 0xe6, 0x67, 0xe1, 0x04, 0x25, 0x6d, 0xba, 0x4d, - 0x87, 0x88, 0xc0, 0xa4, 0x08, 0x48, 0x26, 0xcb, 0xc4, 0xd8, 0x65, 0x3e, 0xe5, 0xcc, 0xda, 0xb1, - 0x20, 0xfd, 0x9a, 0x49, 0x02, 0x27, 0x69, 0xda, 0x3f, 0x6d, 0x01, 0x73, 0x21, 0x3d, 0x06, 0x7e, - 0xe4, 0x23, 0x26, 0x3f, 0x32, 0x93, 0x37, 0xc8, 0x39, 0xac, 0xc8, 0x0b, 0x7c, 0x65, 0xd5, 0x02, - 0xff, 0xee, 0xbe, 0x30, 0x56, 0xe9, 0xfd, 0xfe, 0xb0, 0xff, 0xaf, 0xc5, 0x0f, 0x31, 0xe5, 0x65, - 0x81, 0xbe, 0x13, 0x46, 0x1a, 0x4e, 0xc7, 0x69, 0xf0, 0x8c, 0x2d, 0xb9, 0x12, 0x3d, 0xa3, 0xd2, - 0xfc, 0x92, 0xa8, 0xc1, 0x25, 0x54, 0x32, 0xb0, 0xdd, 0x88, 0x2c, 0xee, 0x29, 0x95, 0x52, 0x4d, - 0xce, 0xee, 0xc2, 0xb8, 0x41, 0xec, 0xa1, 0x8a, 0x33, 0xbe, 0x93, 0x5f, 0xb1, 0x2a, 0x10, 0x63, - 0x1b, 0xa6, 0x3d, 0xed, 0x3f, 0xbd, 0x50, 0xe4, 0xe3, 0xf2, 0xbd, 0xbd, 0x2e, 0x51, 0x76, 0xfb, - 0x68, 0xde, 0xa9, 0x09, 0x32, 0x38, 0x4d, 0xd9, 0xfe, 0x49, 0x0b, 0x1e, 0xd1, 0x11, 0x35, 0x07, - 0x98, 0x5e, 0x4a, 0x92, 0x2a, 0x8c, 0xf8, 0x1d, 0x12, 0x38, 0x91, 0x1f, 0x88, 0x5b, 0xe3, 0xa2, - 0x1c, 0xf4, 0x1b, 0xa2, 0xfc, 0xbe, 0x88, 0x77, 0x2e, 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0xd2, 0xd7, - 0x27, 0x1b, 0x8c, 0x50, 0xb8, 0x3a, 0xb1, 0x33, 0x80, 0x69, 0xd2, 0x43, 0x2c, 0x20, 0xf6, 0xd7, - 0x2d, 0xbe, 0xb0, 0xf4, 0xae, 0xa3, 0x37, 0x61, 0xaa, 0xed, 0x44, 0x8d, 0x9d, 0xe5, 0xbb, 0x9d, - 0x80, 0xab, 0x9c, 0xe4, 0x38, 0x3d, 0xdd, 0x6b, 0x9c, 0xb4, 0x8f, 0x8c, 0x4d, 0x39, 0xd7, 0x12, - 0xc4, 0x70, 0x8a, 0x3c, 0xda, 0x84, 0x51, 0x56, 0xc6, 0xbc, 0xf8, 0xc2, 0x22, 0xd6, 0x20, 0xaf, - 0x35, 0x65, 0x8c, 0xb0, 0x16, 0xd3, 0xc1, 0x3a, 0x51, 0xfb, 0xcb, 0x65, 0xbe, 0xdb, 0x19, 0x2b, - 0xff, 0x14, 0x0c, 0x77, 0xfc, 0xe6, 0xd2, 0x6a, 0x15, 0x8b, 0x59, 0x50, 0xd7, 0x48, 0x8d, 0x17, - 0x63, 0x09, 0x47, 0x17, 0x61, 0x44, 0xfc, 0x94, 0x2a, 0x42, 0x76, 0x36, 0x0b, 0xbc, 0x10, 0x2b, - 0x28, 0x7a, 0x0e, 0xa0, 0x13, 0xf8, 0x7b, 0x6e, 0x93, 0x45, 0x97, 0x28, 0x9b, 0x76, 0x44, 0x35, - 0x05, 0xc1, 0x1a, 0x16, 0x7a, 0x05, 0xc6, 0xbb, 0x5e, 0xc8, 0xd9, 0x11, 0x2d, 0x96, 0xac, 0xb2, - 0x70, 0xb9, 0xa9, 0x03, 0xb1, 0x89, 0x8b, 0x16, 0x60, 0x28, 0x72, 0x98, 0x5d, 0xcc, 0x60, 0xbe, - 0xb9, 0xef, 0x06, 0xc5, 0xd0, 0x93, 0x83, 0xd0, 0x0a, 0x58, 0x54, 0x44, 0x9f, 0x90, 0x0e, 0xb5, - 0xfc, 0x60, 0x17, 0x76, 0xf6, 0xfd, 0x5d, 0x02, 0x9a, 0x3b, 0xad, 0xb0, 0xdf, 0x37, 0x68, 0xa1, - 0x97, 0x01, 0xc8, 0xdd, 0x88, 0x04, 0x9e, 0xd3, 0x52, 0xd6, 0x6c, 0x8a, 0x2f, 0xa8, 0xfa, 0xeb, - 0x7e, 0x74, 0x33, 0x24, 0xcb, 0x0a, 0x03, 0x6b, 0xd8, 0xf6, 0xaf, 0x57, 0x00, 0x62, 0xbe, 0x1d, - 0xbd, 0x95, 0x3a, 0xb8, 0x9e, 0x29, 0xe6, 0xf4, 0x8f, 0xee, 0xd4, 0x42, 0xdf, 0x67, 0xc1, 0xa8, - 0xd3, 0x6a, 0xf9, 0x0d, 0x87, 0x47, 0xfb, 0x2d, 0x15, 0x1f, 0x9c, 0xa2, 0xfd, 0x85, 0xb8, 0x06, - 0xef, 0xc2, 0xf3, 0x72, 0x85, 0x6a, 0x90, 0x9e, 0xbd, 0xd0, 0x1b, 0x46, 0x1f, 0x90, 0x4f, 0xc5, - 0xb2, 0x31, 0x94, 0xea, 0xa9, 0x58, 0x61, 0x77, 0x84, 0xfe, 0x4a, 0xbc, 0x69, 0xbc, 0x12, 0x07, - 0xf2, 0x3d, 0x06, 0x0d, 0xf6, 0xb5, 0xd7, 0x03, 0x11, 0xd5, 0xf4, 0xe8, 0x01, 0x83, 0xf9, 0xee, - 0x79, 0xda, 0x3b, 0xa9, 0x47, 0xe4, 0x80, 0xcf, 0xc0, 0x64, 0xd3, 0x64, 0x02, 0xc4, 0x4a, 0x7c, - 0x32, 0x8f, 0x6e, 0x82, 0x67, 0x88, 0xaf, 0xfd, 0x04, 0x00, 0x27, 0x09, 0xa3, 0x1a, 0x0f, 0x26, - 0xb1, 0xea, 0x6d, 0xf9, 0xc2, 0xd7, 0xc3, 0xce, 0x9d, 0xcb, 0xfd, 0x30, 0x22, 0x6d, 0x8a, 0x19, - 0xdf, 0xee, 0xeb, 0xa2, 0x2e, 0x56, 0x54, 0xd0, 0x6b, 0x30, 0xc4, 0xfc, 0xb3, 0xc2, 0x99, 0x91, - 0x7c, 0x89, 0xb3, 0x19, 0x1d, 0x2d, 0xde, 0x90, 0xec, 0x6f, 0x88, 0x05, 0x05, 0x74, 0x55, 0x7a, - 0x3f, 0x86, 0xab, 0xde, 0xcd, 0x90, 0x30, 0xef, 0xc7, 0xca, 0xe2, 0x7b, 0x63, 0xc7, 0x46, 0x5e, - 0x9e, 0x99, 0x42, 0xcc, 0xa8, 0x49, 0xb9, 0x28, 0xf1, 0x5f, 0x66, 0x26, 0x9b, 0x81, 0xfc, 0xee, - 0x99, 0xd9, 0xcb, 0xe2, 0xe1, 0xbc, 0x65, 0x92, 0xc0, 0x49, 0x9a, 0x94, 0x23, 0xe5, 0xbb, 0x5e, - 0x78, 0x8b, 0xf4, 0x3a, 0x3b, 0xf8, 0x43, 0x9c, 0xdd, 0x46, 0xbc, 0x04, 0x8b, 0xfa, 0xc7, 0xca, - 0x1e, 0xcc, 0x7a, 0x30, 0x95, 0xdc, 0xa2, 0x0f, 0x95, 0x1d, 0xf9, 0x83, 0x01, 0x98, 0x30, 0x97, - 0x14, 0xba, 0x04, 0x15, 0x41, 0x44, 0x65, 0x13, 0x50, 0xbb, 0x64, 0x4d, 0x02, 0x70, 0x8c, 0xc3, - 0x92, 0x48, 0xb0, 0xea, 0x9a, 0x79, 0x70, 0x9c, 0x44, 0x42, 0x41, 0xb0, 0x86, 0x45, 0x1f, 0x56, - 0x9b, 0xbe, 0x1f, 0xa9, 0x0b, 0x49, 0xad, 0xbb, 0x45, 0x56, 0x8a, 0x05, 0x94, 0x5e, 0x44, 0xbb, - 0x24, 0xf0, 0x48, 0xcb, 0x8c, 0x3b, 0xac, 0x2e, 0xa2, 0x6b, 0x3a, 0x10, 0x9b, 0xb8, 0xf4, 0x3a, - 0xf5, 0x43, 0xb6, 0x90, 0xc5, 0xf3, 0x2d, 0x36, 0xb7, 0xae, 0x73, 0x07, 0x6c, 0x09, 0x47, 0x1f, - 0x87, 0x47, 0x54, 0x6c, 0x25, 0xcc, 0xb5, 0x19, 0xb2, 0xc5, 0x21, 0x43, 0xda, 0xf2, 0xc8, 0x52, - 0x36, 0x1a, 0xce, 0xab, 0x8f, 0x5e, 0x85, 0x09, 0xc1, 0xe2, 0x4b, 0x8a, 0xc3, 0xa6, 0x85, 0xd1, - 0x35, 0x03, 0x8a, 0x13, 0xd8, 0x32, 0x72, 0x32, 0xe3, 0xb2, 0x25, 0x85, 0x91, 0x74, 0xe4, 0x64, - 0x1d, 0x8e, 0x53, 0x35, 0xd0, 0x02, 0x4c, 0x72, 0x1e, 0xcc, 0xf5, 0xb6, 0xf9, 0x9c, 0x08, 0x67, - 0x2e, 0xb5, 0xa5, 0x6e, 0x98, 0x60, 0x9c, 0xc4, 0x47, 0x2f, 0xc1, 0x98, 0x13, 0x34, 0x76, 0xdc, - 0x88, 0x34, 0xa2, 0x6e, 0xc0, 0xbd, 0xbc, 0x34, 0x13, 0xad, 0x05, 0x0d, 0x86, 0x0d, 0x4c, 0xfb, - 0x2d, 0x38, 0x91, 0x11, 0x99, 0x81, 0x2e, 0x1c, 0xa7, 0xe3, 0xca, 0x6f, 0x4a, 0x58, 0x38, 0x2f, - 0xd4, 0x56, 0xe5, 0xd7, 0x68, 0x58, 0x74, 0x75, 0xb2, 0x08, 0x0e, 0x5a, 0x22, 0x42, 0xb5, 0x3a, - 0x57, 0x24, 0x00, 0xc7, 0x38, 0xf6, 0xff, 0x2c, 0xc1, 0x64, 0x86, 0x6e, 0x85, 0x25, 0xc3, 0x4b, - 0x3c, 0x52, 0xe2, 0xdc, 0x77, 0x66, 0x20, 0xee, 0xd2, 0x21, 0x02, 0x71, 0x97, 0x7b, 0x05, 0xe2, - 0x1e, 0x78, 0x3b, 0x81, 0xb8, 0xcd, 0x11, 0x1b, 0xec, 0x6b, 0xc4, 0x32, 0x82, 0x77, 0x0f, 0x1d, - 0x32, 0x78, 0xb7, 0x31, 0xe8, 0xc3, 0x7d, 0x0c, 0xfa, 0x8f, 0x96, 0x60, 0x2a, 0x69, 0x4a, 0x7a, - 0x0c, 0x72, 0xdb, 0xd7, 0x0c, 0xb9, 0xed, 0xc5, 0x7e, 0x9c, 0x6f, 0x73, 0x65, 0xb8, 0x38, 0x21, - 0xc3, 0x7d, 0x7f, 0x5f, 0xd4, 0x8a, 0xe5, 0xb9, 0x7f, 0xab, 0x04, 0xa7, 0x32, 0xbd, 0x7f, 0x8f, - 0x61, 0x6c, 0x6e, 0x18, 0x63, 0xf3, 0x6c, 0xdf, 0x8e, 0xc9, 0xb9, 0x03, 0x74, 0x3b, 0x31, 0x40, - 0x97, 0xfa, 0x27, 0x59, 0x3c, 0x4a, 0x5f, 0x2b, 0xc3, 0xb9, 0xcc, 0x7a, 0xb1, 0xd8, 0x73, 0xc5, - 0x10, 0x7b, 0x3e, 0x97, 0x10, 0x7b, 0xda, 0xc5, 0xb5, 0x8f, 0x46, 0x0e, 0x2a, 0x1c, 0x74, 0x59, - 0x98, 0x81, 0x07, 0x94, 0x81, 0x1a, 0x0e, 0xba, 0x8a, 0x10, 0x36, 0xe9, 0x7e, 0x2b, 0xc9, 0x3e, - 0xff, 0xbd, 0x05, 0x67, 0x32, 0xe7, 0xe6, 0x18, 0x64, 0x5d, 0xeb, 0xa6, 0xac, 0xeb, 0xa9, 0xbe, - 0x57, 0x6b, 0x8e, 0xf0, 0xeb, 0xcb, 0x83, 0x39, 0xdf, 0xc2, 0x5e, 0xf2, 0x37, 0x60, 0xd4, 0x69, - 0x34, 0x48, 0x18, 0xae, 0xf9, 0x4d, 0x15, 0x6b, 0xf8, 0x59, 0xf6, 0xce, 0x8a, 0x8b, 0xef, 0x1f, - 0xcc, 0xcd, 0x26, 0x49, 0xc4, 0x60, 0xac, 0x53, 0x40, 0x9f, 0x84, 0x91, 0x50, 0xdc, 0x9b, 0x62, - 0xee, 0x9f, 0xef, 0x73, 0x70, 0x9c, 0x4d, 0xd2, 0x32, 0x83, 0x21, 0x29, 0x49, 0x85, 0x22, 0x69, - 0x06, 0x4e, 0x29, 0x1d, 0x69, 0xe0, 0x94, 0xe7, 0x00, 0xf6, 0xd4, 0x63, 0x20, 0x29, 0x7f, 0xd0, - 0x9e, 0x09, 0x1a, 0x16, 0xfa, 0x28, 0x4c, 0x85, 0x3c, 0x5a, 0xe0, 0x52, 0xcb, 0x09, 0x99, 0x1f, - 0x8d, 0x58, 0x85, 0x2c, 0xe0, 0x52, 0x3d, 0x01, 0xc3, 0x29, 0x6c, 0xb4, 0x22, 0x5b, 0x65, 0xa1, - 0x0d, 0xf9, 0xc2, 0xbc, 0x10, 0xb7, 0x28, 0x52, 0xf1, 0x9e, 0x4c, 0x0e, 0x3f, 0x1b, 0x78, 0xad, - 0x26, 0xfa, 0x24, 0x00, 0x5d, 0x3e, 0x42, 0x0e, 0x31, 0x9c, 0x7f, 0x78, 0xd2, 0x53, 0xa5, 0x99, - 0x69, 0xdc, 0xcc, 0x7c, 0x6a, 0xab, 0x8a, 0x08, 0xd6, 0x08, 0xa2, 0x2d, 0x18, 0x8f, 0xff, 0xc5, - 0x99, 0x2a, 0x0f, 0xd9, 0x02, 0x93, 0x7b, 0x57, 0x75, 0x3a, 0xd8, 0x24, 0x6b, 0xff, 0xf8, 0x30, - 0x3c, 0x5a, 0x70, 0x16, 0xa3, 0x05, 0x53, 0xdf, 0xfb, 0x74, 0xf2, 0x11, 0x3f, 0x9b, 0x59, 0xd9, - 0x78, 0xd5, 0x27, 0x96, 0x7c, 0xe9, 0x6d, 0x2f, 0xf9, 0x1f, 0xb2, 0x34, 0xf1, 0x0a, 0xb7, 0x2c, - 0xfd, 0xc8, 0x21, 0xef, 0x98, 0x23, 0x94, 0xb7, 0x6c, 0x65, 0x08, 0x2d, 0x9e, 0xeb, 0xbb, 0x3b, - 0xfd, 0x4b, 0x31, 0xbe, 0x62, 0x01, 0x12, 0xe2, 0x15, 0xd2, 0x54, 0x1b, 0x4a, 0xc8, 0x33, 0xae, - 0x1c, 0xf6, 0xfb, 0x17, 0x52, 0x94, 0xf8, 0x48, 0xbc, 0x2c, 0x2f, 0x83, 0x34, 0x42, 0xcf, 0x31, - 0xc9, 0xe8, 0x1e, 0xfa, 0x38, 0x8b, 0xa6, 0xeb, 0xbe, 0x25, 0x38, 0x20, 0xb1, 0xe1, 0x5e, 0x14, - 0x91, 0x74, 0x55, 0x39, 0x65, 0x75, 0x33, 0xbb, 0xab, 0x23, 0x61, 0x83, 0xd4, 0xf1, 0xbe, 0xbf, - 0xbb, 0xf0, 0x48, 0xce, 0x90, 0x3d, 0xd4, 0x67, 0xf8, 0x6f, 0x59, 0x70, 0xb6, 0x30, 0x2c, 0xcc, - 0x37, 0x21, 0x83, 0x68, 0x7f, 0xce, 0x82, 0xec, 0xc9, 0x36, 0xcc, 0xca, 0x2e, 0x41, 0xa5, 0x41, - 0x0b, 0x35, 0x3f, 0xe0, 0x38, 0x40, 0x82, 0x04, 0xe0, 0x18, 0xc7, 0xb0, 0x1e, 0x2b, 0xf5, 0xb4, - 0x1e, 0xfb, 0x15, 0x0b, 0x52, 0x87, 0xfc, 0x31, 0x70, 0x1b, 0xab, 0x26, 0xb7, 0xf1, 0xde, 0x7e, - 0x46, 0x33, 0x87, 0xd1, 0xf8, 0xe3, 0x49, 0x38, 0x9d, 0xe3, 0x96, 0xb7, 0x07, 0xd3, 0xdb, 0x0d, - 0x62, 0x7a, 0x58, 0x17, 0x45, 0x1e, 0x2a, 0x74, 0xc7, 0x66, 0xc9, 0x61, 0xa7, 0x53, 0x28, 0x38, - 0xdd, 0x04, 0xfa, 0x9c, 0x05, 0x27, 0x9d, 0x3b, 0xe1, 0x32, 0xe5, 0x1a, 0xdd, 0xc6, 0x62, 0xcb, - 0x6f, 0xec, 0xd2, 0x2b, 0x59, 0x6e, 0x84, 0x17, 0x32, 0x25, 0x79, 0xb7, 0xeb, 0x29, 0x7c, 0xa3, - 0x79, 0x96, 0x2d, 0x37, 0x0b, 0x0b, 0x67, 0xb6, 0x85, 0xb0, 0x48, 0xa1, 0x40, 0xdf, 0xa4, 0x05, - 0x31, 0x00, 0xb2, 0xfc, 0x27, 0x39, 0x1b, 0x24, 0x21, 0x58, 0xd1, 0x41, 0x9f, 0x86, 0xca, 0xb6, - 0x74, 0xf7, 0xcd, 0x60, 0xb3, 0xe2, 0x81, 0x2c, 0x76, 0x82, 0xe6, 0xea, 0x78, 0x85, 0x84, 0x63, - 0xa2, 0xe8, 0x55, 0x28, 0x7b, 0x5b, 0x61, 0x51, 0xc2, 0xd9, 0x84, 0xdd, 0x25, 0x8f, 0xb4, 0xb1, - 0xbe, 0x52, 0xc7, 0xb4, 0x22, 0xba, 0x0a, 0xe5, 0x60, 0xb3, 0x29, 0xc4, 0xd0, 0x99, 0x9b, 0x14, - 0x2f, 0x56, 0x73, 0x7a, 0xc5, 0x28, 0xe1, 0xc5, 0x2a, 0xa6, 0x24, 0x50, 0x0d, 0x06, 0x99, 0x2f, - 0x9b, 0x60, 0x6a, 0x32, 0x9f, 0x6f, 0x05, 0x3e, 0xa1, 0x3c, 0x1c, 0x07, 0x43, 0xc0, 0x9c, 0x10, - 0xda, 0x80, 0xa1, 0x06, 0x4b, 0x4e, 0x2a, 0xb8, 0x98, 0x0f, 0x64, 0x0a, 0x9c, 0x0b, 0xb2, 0xb6, - 0x0a, 0xf9, 0x2b, 0xc3, 0xc0, 0x82, 0x16, 0xa3, 0x4a, 0x3a, 0x3b, 0x5b, 0xa1, 0x48, 0xa6, 0x9d, - 0x4d, 0xb5, 0x20, 0x19, 0xb1, 0xa0, 0xca, 0x30, 0xb0, 0xa0, 0x85, 0x5e, 0x86, 0xd2, 0x56, 0x43, - 0xf8, 0xa9, 0x65, 0x4a, 0x9e, 0xcd, 0x60, 0x29, 0x8b, 0x43, 0xf7, 0x0e, 0xe6, 0x4a, 0x2b, 0x4b, - 0xb8, 0xb4, 0xd5, 0x40, 0xeb, 0x30, 0xbc, 0xc5, 0xc3, 0x2b, 0x08, 0xe1, 0xf2, 0x93, 0xd9, 0x91, - 0x1f, 0x52, 0x11, 0x18, 0xb8, 0xcf, 0x93, 0x00, 0x60, 0x49, 0x84, 0x65, 0x24, 0x50, 0x61, 0x22, - 0x44, 0x94, 0xba, 0xf9, 0xc3, 0x85, 0xf6, 0xe0, 0x4c, 0x66, 0x1c, 0x6c, 0x02, 0x6b, 0x14, 0xe9, - 0xaa, 0x76, 0xde, 0xea, 0x06, 0x2c, 0x14, 0xb8, 0x08, 0x67, 0x94, 0xb9, 0xaa, 0x17, 0x24, 0x52, - 0xd1, 0xaa, 0x56, 0x48, 0x38, 0x26, 0x8a, 0x76, 0x61, 0x7c, 0x2f, 0xec, 0xec, 0x10, 0xb9, 0xa5, - 0x59, 0x74, 0xa3, 0x1c, 0xfe, 0xe8, 0x96, 0x40, 0x74, 0x83, 0xa8, 0xeb, 0xb4, 0x52, 0xa7, 0x10, - 0xe3, 0x65, 0x6f, 0xe9, 0xc4, 0xb0, 0x49, 0x9b, 0x0e, 0xff, 0x9b, 0x5d, 0x7f, 0x73, 0x3f, 0x22, - 0x22, 0xb8, 0x5c, 0xe6, 0xf0, 0xbf, 0xce, 0x51, 0xd2, 0xc3, 0x2f, 0x00, 0x58, 0x12, 0x41, 0xb7, - 0xc4, 0xf0, 0xb0, 0xd3, 0x73, 0x2a, 0x3f, 0x02, 0xec, 0x82, 0x44, 0xca, 0x19, 0x14, 0x76, 0x5a, - 0xc6, 0xa4, 0xd8, 0x29, 0xd9, 0xd9, 0xf1, 0x23, 0xdf, 0x4b, 0x9c, 0xd0, 0xd3, 0xf9, 0xa7, 0x64, - 0x2d, 0x03, 0x3f, 0x7d, 0x4a, 0x66, 0x61, 0xe1, 0xcc, 0xb6, 0x50, 0x13, 0x26, 0x3a, 0x7e, 0x10, - 0xdd, 0xf1, 0x03, 0xb9, 0xbe, 0x50, 0x81, 0x70, 0xcc, 0xc0, 0x14, 0x2d, 0xb2, 0xb8, 0x8d, 0x26, - 0x04, 0x27, 0x68, 0xa2, 0x8f, 0xc1, 0x70, 0xd8, 0x70, 0x5a, 0x64, 0xf5, 0xc6, 0xcc, 0x89, 0xfc, - 0xeb, 0xa7, 0xce, 0x51, 0x72, 0x56, 0x17, 0x8f, 0x8e, 0xc1, 0x51, 0xb0, 0x24, 0x87, 0x56, 0x60, - 0x90, 0x65, 0x9c, 0x63, 0x91, 0x10, 0x73, 0x02, 0xd9, 0xa6, 0xac, 0xe0, 0xf9, 0xd9, 0xc4, 0x8a, - 0x31, 0xaf, 0x4e, 0xf7, 0x80, 0x78, 0x23, 0xfa, 0xe1, 0xcc, 0xa9, 0xfc, 0x3d, 0x20, 0x9e, 0x96, - 0x37, 0xea, 0x45, 0x7b, 0x40, 0x21, 0xe1, 0x98, 0x28, 0x3d, 0x99, 0xe9, 0x69, 0x7a, 0xba, 0xc0, - 0x7c, 0x2b, 0xf7, 0x2c, 0x65, 0x27, 0x33, 0x3d, 0x49, 0x29, 0x09, 0xfb, 0xf7, 0x86, 0xd3, 0x3c, - 0x0b, 0x93, 0x2a, 0x7c, 0x8f, 0x95, 0x52, 0x38, 0x7f, 0xb0, 0x5f, 0x21, 0xe7, 0x11, 0x3e, 0x85, - 0x3e, 0x67, 0xc1, 0xe9, 0x4e, 0xe6, 0x87, 0x08, 0x06, 0xa0, 0x3f, 0x59, 0x29, 0xff, 0x74, 0x15, - 0x35, 0x33, 0x1b, 0x8e, 0x73, 0x5a, 0x4a, 0x3e, 0x37, 0xcb, 0x6f, 0xfb, 0xb9, 0xb9, 0x06, 0x23, - 0x0d, 0xfe, 0x14, 0x29, 0x4c, 0xd6, 0x9d, 0x7c, 0x7b, 0x33, 0x56, 0x42, 0xbc, 0x61, 0xb6, 0xb0, - 0x22, 0x81, 0x7e, 0xd8, 0x82, 0xb3, 0xc9, 0xae, 0x63, 0xc2, 0xc0, 0x22, 0xd4, 0x26, 0x17, 0x68, - 0xac, 0x88, 0xef, 0x4f, 0xf1, 0xff, 0x06, 0xf2, 0xfd, 0x5e, 0x08, 0xb8, 0xb8, 0x31, 0x54, 0xcd, - 0x90, 0xa8, 0x0c, 0x99, 0x5a, 0xa4, 0x3e, 0xa4, 0x2a, 0x2f, 0xc0, 0x58, 0xdb, 0xef, 0x7a, 0x91, - 0xb0, 0xf6, 0x12, 0x96, 0x27, 0xcc, 0xe2, 0x62, 0x4d, 0x2b, 0xc7, 0x06, 0x56, 0x42, 0x16, 0x33, - 0xf2, 0xc0, 0xb2, 0x98, 0x37, 0x60, 0xcc, 0xd3, 0xcc, 0x93, 0x05, 0x3f, 0x70, 0x21, 0x3f, 0x4c, - 0xae, 0x6e, 0xcc, 0xcc, 0x7b, 0xa9, 0x97, 0x60, 0x83, 0xda, 0xf1, 0x9a, 0x81, 0x7d, 0xc9, 0xca, - 0x60, 0xea, 0xb9, 0x28, 0xe6, 0xc3, 0xa6, 0x28, 0xe6, 0x42, 0x52, 0x14, 0x93, 0xd2, 0x20, 0x18, - 0x52, 0x98, 0xfe, 0xb3, 0x00, 0xf5, 0x1b, 0x6a, 0xd3, 0x6e, 0xc1, 0xf9, 0x5e, 0xd7, 0x12, 0x33, - 0xfb, 0x6b, 0x2a, 0x7d, 0x71, 0x6c, 0xf6, 0xd7, 0x5c, 0xad, 0x62, 0x06, 0xe9, 0x37, 0x88, 0x93, - 0xfd, 0xdf, 0x2d, 0x28, 0xd7, 0xfc, 0xe6, 0x31, 0x3c, 0x78, 0x3f, 0x62, 0x3c, 0x78, 0x1f, 0xcd, - 0xbe, 0x10, 0x9b, 0xb9, 0xfa, 0x8f, 0xe5, 0x84, 0xfe, 0xe3, 0x6c, 0x1e, 0x81, 0x62, 0x6d, 0xc7, - 0x4f, 0x95, 0x61, 0xb4, 0xe6, 0x37, 0x95, 0xcd, 0xfd, 0xbf, 0x7a, 0x10, 0x9b, 0xfb, 0xdc, 0x5c, - 0x16, 0x1a, 0x65, 0x66, 0x2d, 0x28, 0xdd, 0x8d, 0xbf, 0xc9, 0x4c, 0xef, 0x6f, 0x13, 0x77, 0x7b, - 0x27, 0x22, 0xcd, 0xe4, 0xe7, 0x1c, 0x9f, 0xe9, 0xfd, 0xef, 0x95, 0x60, 0x32, 0xd1, 0x3a, 0x6a, - 0xc1, 0x78, 0x4b, 0x97, 0xae, 0x8b, 0x75, 0xfa, 0x40, 0x82, 0x79, 0x61, 0xba, 0xac, 0x15, 0x61, - 0x93, 0x38, 0x9a, 0x07, 0x50, 0xea, 0x66, 0x29, 0x5e, 0x65, 0x5c, 0xbf, 0xd2, 0x47, 0x87, 0x58, - 0xc3, 0x40, 0x2f, 0xc2, 0x68, 0xe4, 0x77, 0xfc, 0x96, 0xbf, 0xbd, 0x7f, 0x8d, 0xc8, 0xf8, 0x5e, - 0xca, 0x20, 0x71, 0x23, 0x06, 0x61, 0x1d, 0x0f, 0xdd, 0x85, 0x69, 0x45, 0xa4, 0x7e, 0x04, 0x1a, - 0x07, 0x26, 0x55, 0x58, 0x4f, 0x52, 0xc4, 0xe9, 0x46, 0xec, 0x9f, 0x29, 0xf3, 0x21, 0xf6, 0x22, - 0xf7, 0xdd, 0xdd, 0xf0, 0xce, 0xde, 0x0d, 0x5f, 0xb3, 0x60, 0x8a, 0xb6, 0xce, 0xac, 0xad, 0xe4, - 0x35, 0xaf, 0x02, 0x73, 0x5b, 0x05, 0x81, 0xb9, 0x2f, 0xd0, 0x53, 0xb3, 0xe9, 0x77, 0x23, 0x21, - 0xbb, 0xd3, 0x8e, 0x45, 0x5a, 0x8a, 0x05, 0x54, 0xe0, 0x91, 0x20, 0x10, 0x1e, 0xa2, 0x3a, 0x1e, - 0x09, 0x02, 0x2c, 0xa0, 0x32, 0x6e, 0xf7, 0x40, 0x76, 0xdc, 0x6e, 0x1e, 0x7e, 0x55, 0xd8, 0xe5, - 0x08, 0x86, 0x4b, 0x0b, 0xbf, 0x2a, 0x0d, 0x76, 0x62, 0x1c, 0xfb, 0x2b, 0x65, 0x18, 0xab, 0xf9, - 0xcd, 0x58, 0xd5, 0xfc, 0x82, 0xa1, 0x6a, 0x3e, 0x9f, 0x50, 0x35, 0x4f, 0xe9, 0xb8, 0xef, 0x2a, - 0x96, 0xbf, 0x51, 0x8a, 0xe5, 0x7f, 0x6e, 0xb1, 0x59, 0xab, 0xae, 0xd7, 0xb9, 0xf1, 0x1e, 0xba, - 0x0c, 0xa3, 0xec, 0x80, 0x61, 0x2e, 0xc9, 0x52, 0xff, 0xca, 0xf2, 0x51, 0xad, 0xc7, 0xc5, 0x58, - 0xc7, 0x41, 0x17, 0x61, 0x24, 0x24, 0x4e, 0xd0, 0xd8, 0x51, 0xa7, 0xab, 0x50, 0x96, 0xf2, 0x32, - 0xac, 0xa0, 0xe8, 0xf5, 0x38, 0xf2, 0x67, 0x39, 0xdf, 0xc5, 0x51, 0xef, 0x0f, 0xdf, 0x22, 0xf9, - 0xe1, 0x3e, 0xed, 0xdb, 0x80, 0xd2, 0xf8, 0x7d, 0xc4, 0xa6, 0x9b, 0x33, 0x63, 0xd3, 0x55, 0x52, - 0x71, 0xe9, 0xfe, 0xcc, 0x82, 0x89, 0x9a, 0xdf, 0xa4, 0x5b, 0xf7, 0x5b, 0x69, 0x9f, 0xea, 0x61, - 0x8f, 0x87, 0x0a, 0xc2, 0x1e, 0x3f, 0x01, 0x83, 0x35, 0xbf, 0xb9, 0x5a, 0x2b, 0x8a, 0x2f, 0x60, - 0xff, 0x6d, 0x0b, 0x86, 0x6b, 0x7e, 0xf3, 0x18, 0xd4, 0x02, 0x1f, 0x36, 0xd5, 0x02, 0x8f, 0xe4, - 0xac, 0x9b, 0x1c, 0x4d, 0xc0, 0xdf, 0x1c, 0x80, 0x71, 0xda, 0x4f, 0x7f, 0x5b, 0x4e, 0xa5, 0x31, - 0x6c, 0x56, 0x1f, 0xc3, 0x46, 0xb9, 0x70, 0xbf, 0xd5, 0xf2, 0xef, 0x24, 0xa7, 0x75, 0x85, 0x95, - 0x62, 0x01, 0x45, 0xcf, 0xc0, 0x48, 0x27, 0x20, 0x7b, 0xae, 0x2f, 0xd8, 0x5b, 0x4d, 0xc9, 0x52, - 0x13, 0xe5, 0x58, 0x61, 0xd0, 0x67, 0x61, 0xe8, 0x7a, 0xf4, 0x2a, 0x6f, 0xf8, 0x5e, 0x93, 0x4b, - 0xce, 0xcb, 0x22, 0x37, 0x87, 0x56, 0x8e, 0x0d, 0x2c, 0x74, 0x1b, 0x2a, 0xec, 0x3f, 0x3b, 0x76, - 0x0e, 0x9f, 0xe5, 0x55, 0x64, 0xfd, 0x13, 0x04, 0x70, 0x4c, 0x0b, 0x3d, 0x07, 0x10, 0xc9, 0xf8, - 0xf6, 0xa1, 0x88, 0xb6, 0xa6, 0x9e, 0x02, 0x2a, 0xf2, 0x7d, 0x88, 0x35, 0x2c, 0xf4, 0x34, 0x54, - 0x22, 0xc7, 0x6d, 0x5d, 0x77, 0x3d, 0x12, 0x32, 0x89, 0x78, 0x59, 0x26, 0xdf, 0x13, 0x85, 0x38, - 0x86, 0x53, 0x56, 0x8c, 0x45, 0xe2, 0xe0, 0x39, 0xa2, 0x47, 0x18, 0x36, 0x63, 0xc5, 0xae, 0xab, - 0x52, 0xac, 0x61, 0xa0, 0x1d, 0x78, 0xcc, 0xf5, 0x58, 0x1e, 0x0b, 0x52, 0xdf, 0x75, 0x3b, 0x1b, - 0xd7, 0xeb, 0xb7, 0x48, 0xe0, 0x6e, 0xed, 0x2f, 0x3a, 0x8d, 0x5d, 0xe2, 0xc9, 0xfc, 0x9d, 0xef, - 0x15, 0x5d, 0x7c, 0x6c, 0xb5, 0x00, 0x17, 0x17, 0x52, 0xb2, 0x9f, 0x67, 0xeb, 0xfd, 0x46, 0x1d, - 0xbd, 0xdf, 0x38, 0x3a, 0x4e, 0xeb, 0x47, 0xc7, 0xfd, 0x83, 0xb9, 0xa1, 0x1b, 0x75, 0x2d, 0x90, - 0xc4, 0x4b, 0x70, 0xaa, 0xe6, 0x37, 0x6b, 0x7e, 0x10, 0xad, 0xf8, 0xc1, 0x1d, 0x27, 0x68, 0xca, - 0xe5, 0x35, 0x27, 0x43, 0x69, 0xd0, 0xf3, 0x73, 0x90, 0x9f, 0x2e, 0x46, 0x98, 0x8c, 0xe7, 0x19, - 0xc7, 0x76, 0x48, 0x07, 0xb0, 0x06, 0xe3, 0x1d, 0x54, 0x26, 0x98, 0x2b, 0x4e, 0x44, 0xd0, 0x0d, - 0x96, 0xe1, 0x3a, 0xbe, 0x46, 0x45, 0xf5, 0xa7, 0xb4, 0x0c, 0xd7, 0x31, 0x30, 0xf3, 0xde, 0x35, - 0xeb, 0xdb, 0xff, 0x63, 0x90, 0x9d, 0xa8, 0x89, 0x6c, 0x22, 0xe8, 0x53, 0x30, 0x11, 0x92, 0xeb, - 0xae, 0xd7, 0xbd, 0x2b, 0x45, 0x18, 0x05, 0x2e, 0x7c, 0xf5, 0x65, 0x1d, 0x93, 0x0b, 0x42, 0xcd, - 0x32, 0x9c, 0xa0, 0x86, 0xda, 0x30, 0x71, 0xc7, 0xf5, 0x9a, 0xfe, 0x9d, 0x50, 0xd2, 0x1f, 0xc9, - 0x97, 0x87, 0xde, 0xe6, 0x98, 0x89, 0x3e, 0x1a, 0xcd, 0xdd, 0x36, 0x88, 0xe1, 0x04, 0x71, 0xba, - 0x6a, 0x83, 0xae, 0xb7, 0x10, 0xde, 0x0c, 0x49, 0x20, 0x72, 0x95, 0xb3, 0x55, 0x8b, 0x65, 0x21, - 0x8e, 0xe1, 0x74, 0xd5, 0xb2, 0x3f, 0x57, 0x02, 0xbf, 0xcb, 0x53, 0x57, 0x88, 0x55, 0x8b, 0x55, - 0x29, 0xd6, 0x30, 0xe8, 0xae, 0x66, 0xff, 0xd6, 0x7d, 0x0f, 0xfb, 0x7e, 0x24, 0xcf, 0x01, 0xa6, - 0xd3, 0xd7, 0xca, 0xb1, 0x81, 0x85, 0x56, 0x00, 0x85, 0xdd, 0x4e, 0xa7, 0xc5, 0x6c, 0x83, 0x9c, - 0x16, 0x23, 0xc5, 0xed, 0x25, 0xca, 0x3c, 0xf4, 0x6e, 0x3d, 0x05, 0xc5, 0x19, 0x35, 0xe8, 0x01, - 0xbf, 0x25, 0xba, 0x3a, 0xc8, 0xba, 0xca, 0x75, 0x27, 0x75, 0xde, 0x4f, 0x09, 0x43, 0xcb, 0x30, - 0x1c, 0xee, 0x87, 0x8d, 0x48, 0x44, 0x4a, 0xcc, 0x49, 0x18, 0x55, 0x67, 0x28, 0x5a, 0xbe, 0x42, - 0x5e, 0x05, 0xcb, 0xba, 0xa8, 0x01, 0x27, 0x04, 0xc5, 0xa5, 0x1d, 0xc7, 0x53, 0xe9, 0x77, 0xb8, - 0x89, 0xf4, 0xe5, 0x7b, 0x07, 0x73, 0x27, 0x44, 0xcb, 0x3a, 0xf8, 0xfe, 0xc1, 0xdc, 0xe9, 0x9a, - 0xdf, 0xcc, 0x80, 0xe0, 0x2c, 0x6a, 0x7c, 0xf1, 0x35, 0x1a, 0x7e, 0xbb, 0x53, 0x0b, 0xfc, 0x2d, - 0xb7, 0x45, 0x8a, 0xf4, 0x4f, 0x75, 0x03, 0x53, 0x2c, 0x3e, 0xa3, 0x0c, 0x27, 0xa8, 0xd9, 0xdf, - 0xc9, 0x98, 0x20, 0x96, 0x9e, 0x3b, 0xea, 0x06, 0x04, 0xb5, 0x61, 0xbc, 0xc3, 0xb6, 0x89, 0x48, - 0x28, 0x21, 0xd6, 0xfa, 0x0b, 0x7d, 0xca, 0x51, 0xee, 0xd0, 0xbb, 0xc3, 0xb4, 0x31, 0xaa, 0xe9, - 0xe4, 0xb0, 0x49, 0xdd, 0xfe, 0x8d, 0x47, 0xd8, 0x35, 0x5a, 0xe7, 0xc2, 0x91, 0x61, 0xe1, 0x91, - 0x21, 0xde, 0x63, 0xb3, 0xf9, 0x52, 0xba, 0x78, 0x5a, 0x84, 0x57, 0x07, 0x96, 0x75, 0xd1, 0x27, - 0x61, 0x82, 0x3e, 0x6f, 0xd4, 0x55, 0x16, 0xce, 0x9c, 0xcc, 0x8f, 0x9c, 0xa1, 0xb0, 0xf4, 0x64, - 0x33, 0x7a, 0x65, 0x9c, 0x20, 0x86, 0x5e, 0x67, 0x36, 0x3d, 0x92, 0x74, 0xa9, 0x1f, 0xd2, 0xba, - 0xf9, 0x8e, 0x24, 0xab, 0x11, 0x41, 0x5d, 0x38, 0x91, 0x4e, 0x4d, 0x17, 0xce, 0xd8, 0xf9, 0x7c, - 0x62, 0x3a, 0xbb, 0x5c, 0x9c, 0x15, 0x24, 0x0d, 0x0b, 0x71, 0x16, 0x7d, 0x74, 0x1d, 0xc6, 0x45, - 0x8e, 0x6a, 0xb1, 0x72, 0xcb, 0x86, 0xf0, 0x70, 0x1c, 0xeb, 0xc0, 0xfb, 0xc9, 0x02, 0x6c, 0x56, - 0x46, 0xdb, 0x70, 0x56, 0xcb, 0x19, 0x75, 0x25, 0x70, 0x98, 0x05, 0x80, 0xcb, 0x8e, 0x53, 0xed, - 0x82, 0x7f, 0xfc, 0xde, 0xc1, 0xdc, 0xd9, 0x8d, 0x22, 0x44, 0x5c, 0x4c, 0x07, 0xdd, 0x80, 0x53, - 0xdc, 0xef, 0xbb, 0x4a, 0x9c, 0x66, 0xcb, 0xf5, 0x14, 0x07, 0xc1, 0xb7, 0xfc, 0x99, 0x7b, 0x07, - 0x73, 0xa7, 0x16, 0xb2, 0x10, 0x70, 0x76, 0x3d, 0xf4, 0x61, 0xa8, 0x34, 0xbd, 0x50, 0x8c, 0xc1, - 0x90, 0x91, 0x96, 0xab, 0x52, 0x5d, 0xaf, 0xab, 0xef, 0x8f, 0xff, 0xe0, 0xb8, 0x02, 0xda, 0xe6, - 0x02, 0x66, 0x25, 0xf6, 0x18, 0x4e, 0xc5, 0xbd, 0x4a, 0x4a, 0x06, 0x0d, 0xcf, 0x4f, 0xae, 0x59, - 0x51, 0x0e, 0x11, 0x86, 0x53, 0xa8, 0x41, 0x18, 0xbd, 0x06, 0x48, 0x84, 0x7f, 0x5f, 0x68, 0xb0, - 0x6c, 0x25, 0x4c, 0x1e, 0x3f, 0x62, 0xfa, 0x22, 0xd6, 0x53, 0x18, 0x38, 0xa3, 0x16, 0xba, 0x4a, - 0x4f, 0x15, 0xbd, 0x54, 0x9c, 0x5a, 0x2a, 0x89, 0x62, 0x95, 0x74, 0x02, 0xc2, 0x2c, 0x9a, 0x4c, - 0x8a, 0x38, 0x51, 0x0f, 0x35, 0xe1, 0x31, 0xa7, 0x1b, 0xf9, 0x4c, 0x76, 0x6f, 0xa2, 0x6e, 0xf8, - 0xbb, 0xc4, 0x63, 0x6a, 0xb3, 0x91, 0xc5, 0xf3, 0x94, 0x45, 0x59, 0x28, 0xc0, 0xc3, 0x85, 0x54, - 0x28, 0x6b, 0xa9, 0xb2, 0x26, 0x83, 0x19, 0xcd, 0x2b, 0x23, 0x73, 0xf2, 0x8b, 0x30, 0xba, 0xe3, - 0x87, 0xd1, 0x3a, 0x89, 0xee, 0xf8, 0xc1, 0xae, 0x88, 0x4a, 0x1b, 0xc7, 0xf8, 0x8e, 0x41, 0x58, - 0xc7, 0xa3, 0x6f, 0x47, 0x66, 0xd4, 0xb1, 0x5a, 0x65, 0xfa, 0xf4, 0x91, 0xf8, 0x8c, 0xb9, 0xca, - 0x8b, 0xb1, 0x84, 0x4b, 0xd4, 0xd5, 0xda, 0x12, 0xd3, 0x8d, 0x27, 0x50, 0x57, 0x6b, 0x4b, 0x58, - 0xc2, 0xe9, 0x72, 0x0d, 0x77, 0x9c, 0x80, 0xd4, 0x02, 0xbf, 0x41, 0x42, 0x2d, 0xb2, 0xfc, 0xa3, - 0x3c, 0xe6, 0x2e, 0x5d, 0xae, 0xf5, 0x2c, 0x04, 0x9c, 0x5d, 0x0f, 0x91, 0x74, 0xbe, 0xb4, 0x89, - 0x7c, 0xa5, 0x46, 0x9a, 0x9f, 0xe9, 0x33, 0x65, 0x9a, 0x07, 0x53, 0x2a, 0x53, 0x1b, 0x8f, 0xb2, - 0x1b, 0xce, 0x4c, 0xb2, 0xb5, 0xdd, 0x7f, 0x88, 0x5e, 0xa5, 0x26, 0x5a, 0x4d, 0x50, 0xc2, 0x29, - 0xda, 0x46, 0xc0, 0xb6, 0xa9, 0x9e, 0x01, 0xdb, 0x2e, 0x41, 0x25, 0xec, 0x6e, 0x36, 0xfd, 0xb6, - 0xe3, 0x7a, 0x4c, 0x37, 0xae, 0x3d, 0x62, 0xea, 0x12, 0x80, 0x63, 0x1c, 0xb4, 0x02, 0x23, 0x8e, - 0xd4, 0x01, 0xa1, 0xfc, 0x10, 0x3d, 0x4a, 0xf3, 0xc3, 0xa3, 0x56, 0x48, 0xad, 0x8f, 0xaa, 0x8b, - 0x5e, 0x81, 0x71, 0xe1, 0xb7, 0x2c, 0x92, 0x84, 0x9e, 0x30, 0x9d, 0xcb, 0xea, 0x3a, 0x10, 0x9b, - 0xb8, 0xe8, 0x26, 0x8c, 0x46, 0x7e, 0x8b, 0x79, 0x48, 0x51, 0x36, 0xef, 0x74, 0x7e, 0xb0, 0xb9, - 0x0d, 0x85, 0xa6, 0x8b, 0x5f, 0x55, 0x55, 0xac, 0xd3, 0x41, 0x1b, 0x7c, 0xbd, 0xb3, 0x38, 0xf2, - 0x24, 0x9c, 0x79, 0x24, 0xff, 0x4e, 0x52, 0xe1, 0xe6, 0xcd, 0xed, 0x20, 0x6a, 0x62, 0x9d, 0x0c, - 0xba, 0x02, 0xd3, 0x9d, 0xc0, 0xf5, 0xd9, 0x9a, 0x50, 0xea, 0xbf, 0x19, 0x33, 0x6b, 0x54, 0x2d, - 0x89, 0x80, 0xd3, 0x75, 0x98, 0xdb, 0xb9, 0x28, 0x9c, 0x39, 0xc3, 0x33, 0x5f, 0xf0, 0x37, 0x21, - 0x2f, 0xc3, 0x0a, 0x8a, 0xd6, 0xd8, 0x49, 0xcc, 0xc5, 0x19, 0x33, 0xb3, 0xf9, 0x51, 0x81, 0x74, - 0xb1, 0x07, 0x67, 0x5e, 0xd5, 0x5f, 0x1c, 0x53, 0x40, 0x4d, 0x2d, 0xe1, 0x24, 0x7d, 0x31, 0x84, - 0x33, 0x8f, 0x15, 0x58, 0xd6, 0x25, 0x9e, 0x17, 0x31, 0x43, 0x60, 0x14, 0x87, 0x38, 0x41, 0x13, - 0x7d, 0x14, 0xa6, 0x44, 0x2c, 0xc3, 0x78, 0x98, 0xce, 0xc6, 0x76, 0xe7, 0x38, 0x01, 0xc3, 0x29, - 0x6c, 0x9e, 0x79, 0xc2, 0xd9, 0x6c, 0x11, 0x71, 0xf4, 0x5d, 0x77, 0xbd, 0xdd, 0x70, 0xe6, 0x1c, - 0x3b, 0x1f, 0x44, 0xe6, 0x89, 0x24, 0x14, 0x67, 0xd4, 0x40, 0x1b, 0x30, 0xd5, 0x09, 0x08, 0x69, - 0x33, 0x46, 0x5f, 0xdc, 0x67, 0x73, 0x3c, 0xea, 0x02, 0xed, 0x49, 0x2d, 0x01, 0xbb, 0x9f, 0x51, - 0x86, 0x53, 0x14, 0xd0, 0x1d, 0x18, 0xf1, 0xf7, 0x48, 0xb0, 0x43, 0x9c, 0xe6, 0xcc, 0xf9, 0x02, - 0x3f, 0x08, 0x71, 0xb9, 0xdd, 0x10, 0xb8, 0x09, 0x93, 0x01, 0x59, 0xdc, 0xdb, 0x64, 0x40, 0x36, - 0x86, 0x7e, 0xc4, 0x82, 0x33, 0x52, 0xcb, 0x50, 0xef, 0xd0, 0x51, 0x5f, 0xf2, 0xbd, 0x30, 0x0a, - 0x78, 0x9c, 0x80, 0xc7, 0xf3, 0x7d, 0xe7, 0x37, 0x72, 0x2a, 0x29, 0x89, 0xea, 0x99, 0x3c, 0x8c, - 0x10, 0xe7, 0xb7, 0x88, 0x96, 0x60, 0x3a, 0x24, 0x91, 0x3c, 0x8c, 0x16, 0xc2, 0x95, 0xd7, 0xab, - 0xeb, 0x33, 0x4f, 0xf0, 0x20, 0x07, 0x74, 0x33, 0xd4, 0x93, 0x40, 0x9c, 0xc6, 0x47, 0x97, 0xa1, - 0xe4, 0x87, 0x33, 0xef, 0x2d, 0xc8, 0x51, 0x4a, 0x9f, 0xe2, 0xdc, 0x74, 0xec, 0x46, 0x1d, 0x97, - 0xfc, 0x70, 0xf6, 0xdb, 0x61, 0x3a, 0xc5, 0x31, 0x1c, 0x26, 0xb7, 0xcf, 0xec, 0x2e, 0x8c, 0x1b, - 0xb3, 0xf2, 0x50, 0xb5, 0xd4, 0xff, 0x76, 0x18, 0x2a, 0x4a, 0x83, 0x89, 0x2e, 0x99, 0x8a, 0xe9, - 0x33, 0x49, 0xc5, 0xf4, 0x48, 0xcd, 0x6f, 0x1a, 0xba, 0xe8, 0x8d, 0x8c, 0x68, 0x70, 0x79, 0x67, - 0x40, 0xff, 0x06, 0xf2, 0x9a, 0x58, 0xb8, 0xdc, 0xb7, 0x86, 0x7b, 0xa0, 0x50, 0xd2, 0x7c, 0x05, - 0xa6, 0x3d, 0x9f, 0xb1, 0xa9, 0xa4, 0x29, 0x79, 0x10, 0xc6, 0x6a, 0x54, 0xf4, 0xf0, 0x2a, 0x09, - 0x04, 0x9c, 0xae, 0x43, 0x1b, 0xe4, 0xbc, 0x42, 0x52, 0xb4, 0xcd, 0x59, 0x09, 0x2c, 0xa0, 0xe8, - 0x09, 0x18, 0xec, 0xf8, 0xcd, 0xd5, 0x9a, 0x60, 0x51, 0xb5, 0x18, 0xa4, 0xcd, 0xd5, 0x1a, 0xe6, - 0x30, 0xb4, 0x00, 0x43, 0xec, 0x47, 0x38, 0x33, 0x96, 0x1f, 0x47, 0x83, 0xd5, 0xd0, 0x32, 0x27, - 0xb1, 0x0a, 0x58, 0x54, 0x64, 0x22, 0x36, 0xca, 0xd7, 0x33, 0x11, 0xdb, 0xf0, 0x03, 0x8a, 0xd8, - 0x24, 0x01, 0x1c, 0xd3, 0x42, 0x77, 0xe1, 0x94, 0xf1, 0x96, 0xe2, 0x4b, 0x84, 0x84, 0xc2, 0x97, - 0xff, 0x89, 0xc2, 0x47, 0x94, 0xd0, 0x88, 0x9f, 0x15, 0x9d, 0x3e, 0xb5, 0x9a, 0x45, 0x09, 0x67, - 0x37, 0x80, 0x5a, 0x30, 0xdd, 0x48, 0xb5, 0x3a, 0xd2, 0x7f, 0xab, 0x6a, 0x42, 0xd3, 0x2d, 0xa6, - 0x09, 0xa3, 0x57, 0x60, 0xe4, 0x4d, 0x3f, 0x64, 0xc7, 0xbb, 0x60, 0xab, 0xa5, 0x23, 0xf8, 0xc8, - 0xeb, 0x37, 0xea, 0xac, 0xfc, 0xfe, 0xc1, 0xdc, 0x68, 0xcd, 0x6f, 0xca, 0xbf, 0x58, 0x55, 0x40, - 0xdf, 0x6f, 0xc1, 0x6c, 0xfa, 0xb1, 0xa6, 0x3a, 0x3d, 0xde, 0x7f, 0xa7, 0x6d, 0xd1, 0xe8, 0xec, - 0x72, 0x2e, 0x39, 0x5c, 0xd0, 0x94, 0xfd, 0x4b, 0x16, 0x13, 0xd4, 0x09, 0x4d, 0x13, 0x09, 0xbb, - 0xad, 0xe3, 0x48, 0x18, 0xbb, 0x6c, 0x28, 0xc1, 0x1e, 0xd8, 0x42, 0xe2, 0x5f, 0x5a, 0xcc, 0x42, - 0xe2, 0x18, 0x5d, 0x21, 0x5e, 0x87, 0x91, 0x48, 0x26, 0xf2, 0x2d, 0xc8, 0x71, 0xab, 0x75, 0x8a, - 0x59, 0x89, 0x28, 0x26, 0x57, 0xe5, 0xec, 0x55, 0x64, 0xec, 0x7f, 0xc2, 0x67, 0x40, 0x42, 0x8e, - 0x41, 0xd7, 0x50, 0x35, 0x75, 0x0d, 0x73, 0x3d, 0xbe, 0x20, 0x47, 0xe7, 0xf0, 0x8f, 0xcd, 0x7e, - 0x33, 0xe1, 0xce, 0x3b, 0xdd, 0x34, 0xc7, 0xfe, 0xbc, 0x05, 0x10, 0x87, 0x78, 0xee, 0x23, 0x55, - 0xdb, 0x4b, 0x94, 0xad, 0xf5, 0x23, 0xbf, 0xe1, 0xb7, 0x84, 0x26, 0xed, 0xb1, 0x58, 0xdd, 0xc1, - 0xcb, 0xef, 0x6b, 0xbf, 0xb1, 0xc2, 0x46, 0x73, 0x32, 0xa0, 0x5c, 0x39, 0x56, 0xc0, 0x19, 0xc1, - 0xe4, 0xbe, 0x68, 0xc1, 0xc9, 0x2c, 0xbb, 0x5a, 0xfa, 0x48, 0xe2, 0x62, 0x2e, 0x65, 0x36, 0xa5, - 0x66, 0xf3, 0x96, 0x28, 0xc7, 0x0a, 0xa3, 0xef, 0x1c, 0x78, 0x87, 0x8b, 0xad, 0x7c, 0x03, 0xc6, - 0x6b, 0x01, 0xd1, 0x2e, 0xd7, 0x57, 0x79, 0x90, 0x02, 0xde, 0x9f, 0x67, 0x0e, 0x1d, 0xa0, 0xc0, - 0xfe, 0x72, 0x09, 0x4e, 0x72, 0xeb, 0x83, 0x85, 0x3d, 0xdf, 0x6d, 0xd6, 0xfc, 0xa6, 0xf0, 0x9e, - 0xfa, 0x04, 0x8c, 0x75, 0x34, 0xd9, 0x64, 0x51, 0x9c, 0x50, 0x5d, 0x86, 0x19, 0x4b, 0x53, 0xf4, - 0x52, 0x6c, 0xd0, 0x42, 0x4d, 0x18, 0x23, 0x7b, 0x6e, 0x43, 0xa9, 0xb0, 0x4b, 0x87, 0xbe, 0xe8, - 0x54, 0x2b, 0xcb, 0x1a, 0x1d, 0x6c, 0x50, 0x7d, 0x08, 0x99, 0xa9, 0xed, 0x1f, 0xb3, 0xe0, 0x91, - 0x9c, 0xa8, 0xa2, 0xb4, 0xb9, 0x3b, 0xcc, 0xce, 0x43, 0x2c, 0x5b, 0xd5, 0x1c, 0xb7, 0xfe, 0xc0, - 0x02, 0x8a, 0x3e, 0x06, 0xc0, 0xad, 0x37, 0xe8, 0x2b, 0xbd, 0x57, 0xf8, 0x45, 0x23, 0x72, 0x9c, - 0x16, 0x04, 0x4c, 0xd6, 0xc7, 0x1a, 0x2d, 0xfb, 0x8b, 0x03, 0x30, 0xc8, 0xb3, 0xe8, 0xd7, 0x60, - 0x78, 0x87, 0xe7, 0x89, 0x29, 0x9c, 0x37, 0x8a, 0x2b, 0x53, 0xcf, 0xc4, 0xf3, 0xa6, 0x95, 0x62, - 0x49, 0x06, 0xad, 0xc1, 0x09, 0x9e, 0xae, 0xa7, 0x55, 0x25, 0x2d, 0x67, 0x5f, 0x8a, 0xfd, 0x78, - 0x6e, 0x59, 0x25, 0xfe, 0x5c, 0x4d, 0xa3, 0xe0, 0xac, 0x7a, 0xe8, 0x55, 0x98, 0xa0, 0xcf, 0x30, - 0xbf, 0x1b, 0x49, 0x4a, 0x3c, 0x51, 0x8f, 0x7a, 0xf7, 0x6d, 0x18, 0x50, 0x9c, 0xc0, 0x46, 0xaf, - 0xc0, 0x78, 0x27, 0x25, 0xe0, 0x1c, 0x8c, 0x25, 0x01, 0xa6, 0x50, 0xd3, 0xc4, 0x65, 0xa6, 0xb5, - 0x5d, 0x66, 0x48, 0xbc, 0xb1, 0x13, 0x90, 0x70, 0xc7, 0x6f, 0x35, 0x19, 0xfb, 0x37, 0xa8, 0x99, - 0xd6, 0x26, 0xe0, 0x38, 0x55, 0x83, 0x52, 0xd9, 0x72, 0xdc, 0x56, 0x37, 0x20, 0x31, 0x95, 0x21, - 0x93, 0xca, 0x4a, 0x02, 0x8e, 0x53, 0x35, 0x7a, 0x4b, 0x6e, 0x87, 0x8f, 0x46, 0x72, 0x6b, 0xff, - 0x9d, 0x12, 0x18, 0x53, 0xfb, 0xad, 0x9b, 0x40, 0x88, 0x7e, 0xd9, 0x76, 0xd0, 0x69, 0x08, 0xcb, - 0x98, 0xcc, 0x2f, 0x8b, 0xf3, 0x82, 0xf2, 0x2f, 0xa3, 0xff, 0x31, 0xab, 0x45, 0xf7, 0xf8, 0xa9, - 0x5a, 0xe0, 0xd3, 0x4b, 0x4e, 0x86, 0xb1, 0x52, 0x16, 0xec, 0xc3, 0xd2, 0xbb, 0xb7, 0x20, 0xe0, - 0xa3, 0xb0, 0xf1, 0xe5, 0x14, 0x0c, 0x23, 0x92, 0xba, 0xf0, 0xb5, 0x97, 0x54, 0xd0, 0x65, 0x18, - 0x15, 0x59, 0x61, 0x98, 0xa1, 0x35, 0xdf, 0x4c, 0xcc, 0xe8, 0xa5, 0x1a, 0x17, 0x63, 0x1d, 0xc7, - 0xfe, 0x81, 0x12, 0x9c, 0xc8, 0xf0, 0x94, 0xe1, 0xd7, 0xc8, 0xb6, 0x1b, 0x46, 0x2a, 0xf5, 0xa8, - 0x76, 0x8d, 0xf0, 0x72, 0xac, 0x30, 0xe8, 0x59, 0xc5, 0x2f, 0xaa, 0xe4, 0xe5, 0x24, 0x2c, 0xd1, - 0x05, 0xf4, 0x90, 0x49, 0x3c, 0xcf, 0xc3, 0x40, 0x37, 0x24, 0x32, 0x54, 0xab, 0xba, 0xb6, 0x99, - 0x5a, 0x93, 0x41, 0xe8, 0x33, 0x6a, 0x5b, 0x69, 0x08, 0xb5, 0x67, 0x14, 0xd7, 0x11, 0x72, 0x18, - 0xed, 0x5c, 0x44, 0x3c, 0xc7, 0x8b, 0xc4, 0x63, 0x2b, 0x8e, 0x39, 0xc8, 0x4a, 0xb1, 0x80, 0xda, - 0x5f, 0x28, 0xc3, 0x99, 0x5c, 0xdf, 0x39, 0xda, 0xf5, 0xb6, 0xef, 0xb9, 0x91, 0xaf, 0xac, 0x89, - 0x78, 0x9c, 0x41, 0xd2, 0xd9, 0x59, 0x13, 0xe5, 0x58, 0x61, 0xa0, 0x0b, 0x30, 0xc8, 0x84, 0xa2, - 0xa9, 0x24, 0xac, 0x8b, 0x55, 0x1e, 0x78, 0x8a, 0x83, 0xfb, 0xce, 0x9b, 0xfd, 0x04, 0xe5, 0x60, - 0xfc, 0x56, 0xf2, 0x42, 0xa1, 0xdd, 0xf5, 0xfd, 0x16, 0x66, 0x40, 0xf4, 0x3e, 0x31, 0x5e, 0x09, - 0xf3, 0x19, 0xec, 0x34, 0xfd, 0x50, 0x1b, 0xb4, 0xa7, 0x60, 0x78, 0x97, 0xec, 0x07, 0xae, 0xb7, - 0x9d, 0x34, 0xab, 0xba, 0xc6, 0x8b, 0xb1, 0x84, 0x9b, 0x59, 0x03, 0x87, 0x8f, 0x3a, 0xe1, 0xf5, - 0x48, 0x4f, 0xf6, 0xe4, 0x87, 0xca, 0x30, 0x89, 0x17, 0xab, 0xef, 0x4e, 0xc4, 0xcd, 0xf4, 0x44, - 0x1c, 0x75, 0xc2, 0xeb, 0xde, 0xb3, 0xf1, 0xf3, 0x16, 0x4c, 0xb2, 0xdc, 0x34, 0xc2, 0x43, 0xde, - 0xf5, 0xbd, 0x63, 0x78, 0x0a, 0x3c, 0x01, 0x83, 0x01, 0x6d, 0x34, 0x99, 0x7d, 0x95, 0xf5, 0x04, - 0x73, 0x18, 0x7a, 0x0c, 0x06, 0x58, 0x17, 0xe8, 0xe4, 0x8d, 0xf1, 0x23, 0xb8, 0xea, 0x44, 0x0e, - 0x66, 0xa5, 0x2c, 0xec, 0x12, 0x26, 0x9d, 0x96, 0xcb, 0x3b, 0x1d, 0xab, 0xac, 0xdf, 0x19, 0x5e, - 0xf5, 0x99, 0x5d, 0x7b, 0x7b, 0x61, 0x97, 0xb2, 0x49, 0x16, 0x3f, 0xb3, 0xff, 0xa8, 0x04, 0xe7, - 0x32, 0xeb, 0xf5, 0x1d, 0x76, 0xa9, 0xb8, 0xf6, 0xc3, 0xcc, 0x3e, 0x52, 0x3e, 0x46, 0xa3, 0xd5, - 0x81, 0x7e, 0xb9, 0xff, 0xc1, 0x3e, 0xa2, 0x21, 0x65, 0x0e, 0xd9, 0x3b, 0x24, 0x1a, 0x52, 0x66, - 0xdf, 0x72, 0xc4, 0x04, 0x7f, 0x5e, 0xca, 0xf9, 0x16, 0x26, 0x30, 0xb8, 0x48, 0xcf, 0x19, 0x06, - 0x0c, 0xe5, 0x23, 0x9c, 0x9f, 0x31, 0xbc, 0x0c, 0x2b, 0x28, 0x5a, 0x80, 0xc9, 0xb6, 0xeb, 0xd1, - 0xc3, 0x67, 0xdf, 0x64, 0xc5, 0x55, 0xb0, 0xba, 0x35, 0x13, 0x8c, 0x93, 0xf8, 0xc8, 0xd5, 0x22, - 0x25, 0xf1, 0xaf, 0x7b, 0xe5, 0x50, 0xbb, 0x6e, 0xde, 0x54, 0xe7, 0xab, 0x51, 0xcc, 0x88, 0x9a, - 0xb4, 0xa6, 0xc9, 0x89, 0xca, 0xfd, 0xcb, 0x89, 0xc6, 0xb2, 0x65, 0x44, 0xb3, 0xaf, 0xc0, 0xf8, - 0x03, 0x2b, 0x06, 0xec, 0xaf, 0x95, 0xe1, 0xd1, 0x82, 0x6d, 0xcf, 0xcf, 0x7a, 0x63, 0x0e, 0xb4, - 0xb3, 0x3e, 0x35, 0x0f, 0x35, 0x38, 0xb9, 0xd5, 0x6d, 0xb5, 0xf6, 0x99, 0x2f, 0x07, 0x69, 0x4a, - 0x0c, 0xc1, 0x53, 0x4a, 0xe1, 0xc8, 0xc9, 0x95, 0x0c, 0x1c, 0x9c, 0x59, 0x93, 0x3e, 0xb1, 0xe8, - 0x4d, 0xb2, 0xaf, 0x48, 0x25, 0x9e, 0x58, 0x58, 0x07, 0x62, 0x13, 0x17, 0x5d, 0x81, 0x69, 0x67, - 0xcf, 0x71, 0x79, 0xb8, 0x69, 0x49, 0x80, 0xbf, 0xb1, 0x94, 0x3c, 0x77, 0x21, 0x89, 0x80, 0xd3, - 0x75, 0xd0, 0x6b, 0x80, 0xfc, 0x4d, 0x66, 0xf1, 0xdd, 0xbc, 0x42, 0x3c, 0xa1, 0x75, 0x65, 0x73, - 0x57, 0x8e, 0x8f, 0x84, 0x1b, 0x29, 0x0c, 0x9c, 0x51, 0x2b, 0x11, 0x11, 0x68, 0x28, 0x3f, 0x22, - 0x50, 0xf1, 0xb9, 0xd8, 0x33, 0xf1, 0xcd, 0x7f, 0xb6, 0xe8, 0xf5, 0xc5, 0x99, 0x7c, 0x33, 0x80, - 0xe6, 0x2b, 0xcc, 0x6a, 0x92, 0xcb, 0x7a, 0xb5, 0xf8, 0x29, 0xa7, 0x34, 0xab, 0xc9, 0x18, 0x88, - 0x4d, 0x5c, 0xbe, 0x20, 0xc2, 0xd8, 0x6d, 0xd7, 0x60, 0xf1, 0x45, 0x94, 0x2f, 0x85, 0x81, 0x3e, - 0x0e, 0xc3, 0x4d, 0x77, 0xcf, 0x0d, 0x85, 0xa4, 0xeb, 0xd0, 0x6a, 0xa5, 0xf8, 0x1c, 0xac, 0x72, - 0x32, 0x58, 0xd2, 0xb3, 0x7f, 0xa8, 0x04, 0xe3, 0xb2, 0xc5, 0xd7, 0xbb, 0x7e, 0xe4, 0x1c, 0xc3, - 0xb5, 0x7c, 0xc5, 0xb8, 0x96, 0xdf, 0x57, 0x14, 0xea, 0x8c, 0x75, 0x29, 0xf7, 0x3a, 0xbe, 0x91, - 0xb8, 0x8e, 0x9f, 0xec, 0x4d, 0xaa, 0xf8, 0x1a, 0xfe, 0xa7, 0x16, 0x4c, 0x1b, 0xf8, 0xc7, 0x70, - 0x1b, 0xac, 0x98, 0xb7, 0xc1, 0xe3, 0x3d, 0xbf, 0x21, 0xe7, 0x16, 0xf8, 0xde, 0x72, 0xa2, 0xef, - 0xec, 0xf4, 0x7f, 0x13, 0x06, 0x76, 0x9c, 0xa0, 0x59, 0x94, 0xda, 0x21, 0x55, 0x69, 0xfe, 0xaa, - 0x13, 0x08, 0xb5, 0xf3, 0x33, 0x72, 0xd4, 0x69, 0x51, 0x4f, 0x95, 0x33, 0x6b, 0x0a, 0xbd, 0x04, - 0x43, 0x61, 0xc3, 0xef, 0x28, 0x4f, 0x8e, 0xf3, 0x6c, 0xa0, 0x59, 0xc9, 0xfd, 0x83, 0x39, 0x64, - 0x36, 0x47, 0x8b, 0xb1, 0xc0, 0x47, 0x9f, 0x80, 0x71, 0xf6, 0x4b, 0xd9, 0x80, 0x95, 0xf3, 0xc5, - 0x11, 0x75, 0x1d, 0x91, 0x1b, 0x48, 0x1a, 0x45, 0xd8, 0x24, 0x35, 0xbb, 0x0d, 0x15, 0xf5, 0x59, - 0x0f, 0x55, 0x6f, 0xfb, 0x1f, 0xcb, 0x70, 0x22, 0x63, 0xcd, 0xa1, 0xd0, 0x98, 0x89, 0xcb, 0x7d, - 0x2e, 0xd5, 0xb7, 0x39, 0x17, 0x21, 0x7b, 0x0d, 0x35, 0xc5, 0xda, 0xea, 0xbb, 0xd1, 0x9b, 0x21, - 0x49, 0x36, 0x4a, 0x8b, 0x7a, 0x37, 0x4a, 0x1b, 0x3b, 0xb6, 0xa1, 0xa6, 0x0d, 0xa9, 0x9e, 0x3e, - 0xd4, 0x39, 0xfd, 0xd3, 0x32, 0x9c, 0xcc, 0x8a, 0xbe, 0x88, 0x3e, 0x9b, 0x48, 0x2c, 0xfa, 0x42, - 0xbf, 0x71, 0x1b, 0x79, 0xb6, 0x51, 0x11, 0x10, 0x6e, 0xde, 0x4c, 0x35, 0xda, 0x73, 0x98, 0x45, - 0x9b, 0x2c, 0x24, 0x45, 0xc0, 0x13, 0xc2, 0xca, 0xe3, 0xe3, 0x83, 0x7d, 0x77, 0x40, 0x64, 0x92, - 0x0d, 0x13, 0xf6, 0x25, 0xb2, 0xb8, 0xb7, 0x7d, 0x89, 0x6c, 0x79, 0xd6, 0x85, 0x51, 0xed, 0x6b, - 0x1e, 0xea, 0x8c, 0xef, 0xd2, 0xdb, 0x4a, 0xeb, 0xf7, 0x43, 0x9d, 0xf5, 0x1f, 0xb3, 0x20, 0xe1, - 0x72, 0xa0, 0xc4, 0x62, 0x56, 0xae, 0x58, 0xec, 0x3c, 0x0c, 0x04, 0x7e, 0x8b, 0x24, 0x33, 0x70, - 0x62, 0xbf, 0x45, 0x30, 0x83, 0x50, 0x8c, 0x28, 0x16, 0x76, 0x8c, 0xe9, 0x0f, 0x39, 0xf1, 0x44, - 0x7b, 0x02, 0x06, 0x5b, 0x64, 0x8f, 0xb4, 0x92, 0x89, 0x92, 0xae, 0xd3, 0x42, 0xcc, 0x61, 0xf6, - 0xcf, 0x0f, 0xc0, 0xd9, 0xc2, 0xa0, 0x2e, 0xf4, 0x39, 0xb4, 0xed, 0x44, 0xe4, 0x8e, 0xb3, 0x9f, - 0xcc, 0x68, 0x72, 0x85, 0x17, 0x63, 0x09, 0x67, 0x9e, 0x64, 0x3c, 0x30, 0x79, 0x42, 0x88, 0x28, - 0xe2, 0x91, 0x0b, 0xa8, 0x29, 0x94, 0x2a, 0x1f, 0x85, 0x50, 0xea, 0x39, 0x80, 0x30, 0x6c, 0x71, - 0xc3, 0xac, 0xa6, 0x70, 0x51, 0x8b, 0x03, 0xd8, 0xd7, 0xaf, 0x0b, 0x08, 0xd6, 0xb0, 0x50, 0x15, - 0xa6, 0x3a, 0x81, 0x1f, 0x71, 0x99, 0x6c, 0x95, 0xdb, 0x2e, 0x0e, 0x9a, 0xf1, 0x34, 0x6a, 0x09, - 0x38, 0x4e, 0xd5, 0x40, 0x2f, 0xc2, 0xa8, 0x88, 0xb1, 0x51, 0xf3, 0xfd, 0x96, 0x10, 0x03, 0x29, - 0x73, 0xbe, 0x7a, 0x0c, 0xc2, 0x3a, 0x9e, 0x56, 0x8d, 0x09, 0x7a, 0x87, 0x33, 0xab, 0x71, 0x61, - 0xaf, 0x86, 0x97, 0x88, 0xc4, 0x3a, 0xd2, 0x57, 0x24, 0xd6, 0x58, 0x30, 0x56, 0xe9, 0x5b, 0xef, - 0x08, 0x3d, 0x45, 0x49, 0x3f, 0x3b, 0x00, 0x27, 0xc4, 0xc2, 0x79, 0xd8, 0xcb, 0xe5, 0x66, 0x7a, - 0xb9, 0x1c, 0x85, 0xe8, 0xec, 0xdd, 0x35, 0x73, 0xdc, 0x6b, 0xe6, 0x87, 0x2d, 0x30, 0xd9, 0x2b, - 0xf4, 0x17, 0x72, 0x53, 0x42, 0xbd, 0x98, 0xcb, 0xae, 0xa9, 0xa8, 0x9e, 0x6f, 0x33, 0x39, 0x94, - 0xfd, 0x9f, 0x2c, 0x78, 0xbc, 0x27, 0x45, 0xb4, 0x0c, 0x15, 0xc6, 0x03, 0x6a, 0xaf, 0xb3, 0x27, - 0x95, 0x6d, 0xb3, 0x04, 0xe4, 0xb0, 0xa4, 0x71, 0x4d, 0xb4, 0x9c, 0xca, 0xbd, 0xf5, 0x54, 0x46, - 0xee, 0xad, 0x53, 0xc6, 0xf0, 0x3c, 0x60, 0xf2, 0xad, 0x1f, 0xa4, 0x37, 0x8e, 0xe1, 0x57, 0x84, - 0x3e, 0x68, 0x88, 0xfd, 0xec, 0x84, 0xd8, 0x0f, 0x99, 0xd8, 0xda, 0x1d, 0xf2, 0x51, 0x98, 0x62, - 0xc1, 0xb7, 0x98, 0xa5, 0xbd, 0xf0, 0x78, 0x2a, 0xc5, 0xd6, 0xb4, 0xd7, 0x13, 0x30, 0x9c, 0xc2, - 0xb6, 0xff, 0xb0, 0x0c, 0x43, 0x7c, 0xfb, 0x1d, 0xc3, 0x9b, 0xf0, 0x69, 0xa8, 0xb8, 0xed, 0x76, - 0x97, 0xa7, 0x53, 0x1a, 0xe4, 0xbe, 0xd1, 0x74, 0x9e, 0x56, 0x65, 0x21, 0x8e, 0xe1, 0x68, 0x45, - 0x48, 0x9c, 0x0b, 0xe2, 0x7b, 0xf2, 0x8e, 0xcf, 0x57, 0x9d, 0xc8, 0xe1, 0x0c, 0x8e, 0xba, 0x67, - 0x63, 0xd9, 0x34, 0xfa, 0x14, 0x40, 0x18, 0x05, 0xae, 0xb7, 0x4d, 0xcb, 0x44, 0x58, 0xe1, 0xf7, - 0x17, 0x50, 0xab, 0x2b, 0x64, 0x4e, 0x33, 0x3e, 0x73, 0x14, 0x00, 0x6b, 0x14, 0xd1, 0xbc, 0x71, - 0xd3, 0xcf, 0x26, 0xe6, 0x0e, 0x38, 0xd5, 0x78, 0xce, 0x66, 0x3f, 0x04, 0x15, 0x45, 0xbc, 0x97, - 0xfc, 0x69, 0x4c, 0x67, 0x8b, 0x3e, 0x02, 0x93, 0x89, 0xbe, 0x1d, 0x4a, 0x7c, 0xf5, 0x0b, 0x16, - 0x4c, 0xf2, 0xce, 0x2c, 0x7b, 0x7b, 0xe2, 0x36, 0x78, 0x0b, 0x4e, 0xb6, 0x32, 0x4e, 0x65, 0x31, - 0xfd, 0xfd, 0x9f, 0xe2, 0x4a, 0x5c, 0x95, 0x05, 0xc5, 0x99, 0x6d, 0xa0, 0x8b, 0x74, 0xc7, 0xd1, - 0x53, 0xd7, 0x69, 0x09, 0x57, 0xe9, 0x31, 0xbe, 0xdb, 0x78, 0x19, 0x56, 0x50, 0xfb, 0x77, 0x2c, - 0x98, 0xe6, 0x3d, 0xbf, 0x46, 0xf6, 0xd5, 0xd9, 0xf4, 0x8d, 0xec, 0xbb, 0x48, 0xe4, 0x57, 0xca, - 0x49, 0xe4, 0xa7, 0x7f, 0x5a, 0xb9, 0xf0, 0xd3, 0xbe, 0x6c, 0x81, 0x58, 0x21, 0xc7, 0x20, 0x84, - 0xf8, 0x76, 0x53, 0x08, 0x31, 0x9b, 0xbf, 0x09, 0x72, 0xa4, 0x0f, 0x7f, 0x66, 0xc1, 0x14, 0x47, - 0x88, 0xb5, 0xe5, 0xdf, 0xd0, 0x79, 0xe8, 0x27, 0xdd, 0xf7, 0x35, 0xb2, 0xbf, 0xe1, 0xd7, 0x9c, - 0x68, 0x27, 0xfb, 0xa3, 0x8c, 0xc9, 0x1a, 0x28, 0x9c, 0xac, 0xa6, 0xdc, 0x40, 0x46, 0x9e, 0x9b, - 0x1e, 0xf1, 0x23, 0x0e, 0x9b, 0xe7, 0xc6, 0xfe, 0xba, 0x05, 0x88, 0x37, 0x63, 0x30, 0x6e, 0x94, - 0x1d, 0x62, 0xa5, 0xda, 0x45, 0x17, 0x1f, 0x4d, 0x0a, 0x82, 0x35, 0xac, 0x23, 0x19, 0x9e, 0x84, - 0xc9, 0x43, 0xb9, 0xb7, 0xc9, 0xc3, 0x21, 0x46, 0xf4, 0xdf, 0x0d, 0x41, 0xd2, 0xb7, 0x0a, 0xdd, - 0x82, 0xb1, 0x86, 0xd3, 0x71, 0x36, 0xdd, 0x96, 0x1b, 0xb9, 0x24, 0x2c, 0xb2, 0x87, 0x5a, 0xd2, - 0xf0, 0x84, 0x92, 0x5a, 0x2b, 0xc1, 0x06, 0x1d, 0x34, 0x0f, 0xd0, 0x09, 0xdc, 0x3d, 0xb7, 0x45, - 0xb6, 0x99, 0xac, 0x84, 0x05, 0x67, 0xe0, 0xc6, 0x59, 0xb2, 0x14, 0x6b, 0x18, 0x19, 0x8e, 0xec, - 0xe5, 0x87, 0xec, 0xc8, 0x0e, 0xc7, 0xe6, 0xc8, 0x3e, 0x70, 0x28, 0x47, 0xf6, 0x91, 0x43, 0x3b, - 0xb2, 0x0f, 0xf6, 0xe5, 0xc8, 0x8e, 0xe1, 0xb4, 0xe4, 0x3d, 0xe9, 0xff, 0x15, 0xb7, 0x45, 0xc4, - 0x83, 0x83, 0x47, 0x94, 0x98, 0xbd, 0x77, 0x30, 0x77, 0x1a, 0x67, 0x62, 0xe0, 0x9c, 0x9a, 0xe8, - 0x63, 0x30, 0xe3, 0xb4, 0x5a, 0xfe, 0x1d, 0x35, 0xa9, 0xcb, 0x61, 0xc3, 0x69, 0x71, 0x25, 0xc4, - 0x30, 0xa3, 0xfa, 0xd8, 0xbd, 0x83, 0xb9, 0x99, 0x85, 0x1c, 0x1c, 0x9c, 0x5b, 0x1b, 0x7d, 0x18, - 0x2a, 0x9d, 0xc0, 0x6f, 0xac, 0x69, 0x0e, 0xa0, 0xe7, 0xe8, 0x00, 0xd6, 0x64, 0xe1, 0xfd, 0x83, - 0xb9, 0x71, 0xf5, 0x87, 0x5d, 0xf8, 0x71, 0x85, 0x0c, 0xcf, 0xf4, 0xd1, 0x23, 0xf5, 0x4c, 0xdf, - 0x85, 0x13, 0x75, 0x12, 0xb8, 0x4e, 0xcb, 0x7d, 0x8b, 0xf2, 0xcb, 0xf2, 0x7c, 0xda, 0x80, 0x4a, - 0x90, 0x38, 0x91, 0xfb, 0x8a, 0xb9, 0xa9, 0x25, 0x1c, 0x91, 0x27, 0x70, 0x4c, 0xc8, 0xfe, 0x3f, - 0x16, 0x0c, 0x0b, 0x5f, 0xaa, 0x63, 0xe0, 0x1a, 0x17, 0x0c, 0x4d, 0xc2, 0x5c, 0xf6, 0x80, 0xb1, - 0xce, 0xe4, 0xea, 0x10, 0x56, 0x13, 0x3a, 0x84, 0xc7, 0x8b, 0x88, 0x14, 0x6b, 0x0f, 0xfe, 0x46, - 0x99, 0x72, 0xef, 0x86, 0x57, 0xef, 0xc3, 0x1f, 0x82, 0x75, 0x18, 0x0e, 0x85, 0x57, 0x69, 0x29, - 0xdf, 0xa7, 0x21, 0x39, 0x89, 0xb1, 0x1d, 0x9b, 0xf0, 0x23, 0x95, 0x44, 0x32, 0xdd, 0x55, 0xcb, - 0x0f, 0xd1, 0x5d, 0xb5, 0x97, 0xdf, 0xf3, 0xc0, 0x51, 0xf8, 0x3d, 0xdb, 0x5f, 0x65, 0x37, 0xa7, - 0x5e, 0x7e, 0x0c, 0x4c, 0xd5, 0x15, 0xf3, 0x8e, 0xb5, 0x0b, 0x56, 0x96, 0xe8, 0x54, 0x0e, 0x73, - 0xf5, 0x73, 0x16, 0x9c, 0xcd, 0xf8, 0x2a, 0x8d, 0xd3, 0x7a, 0x06, 0x46, 0x9c, 0x6e, 0xd3, 0x55, - 0x7b, 0x59, 0xd3, 0x27, 0x2e, 0x88, 0x72, 0xac, 0x30, 0xd0, 0x12, 0x4c, 0x93, 0xbb, 0x1d, 0x97, - 0xab, 0x52, 0x75, 0xf3, 0xdf, 0x32, 0x77, 0xc0, 0x5b, 0x4e, 0x02, 0x71, 0x1a, 0x5f, 0xc5, 0x9a, - 0x29, 0xe7, 0xc6, 0x9a, 0xf9, 0xfb, 0x16, 0x8c, 0x2a, 0xbf, 0xca, 0x87, 0x3e, 0xda, 0x1f, 0x35, - 0x47, 0xfb, 0xd1, 0x82, 0xd1, 0xce, 0x19, 0xe6, 0xdf, 0x2a, 0xa9, 0xfe, 0xd6, 0xfc, 0x20, 0xea, - 0x83, 0x83, 0x7b, 0x70, 0xd7, 0x85, 0xcb, 0x30, 0xea, 0x74, 0x3a, 0x12, 0x20, 0x6d, 0xd0, 0x58, - 0x04, 0xe5, 0xb8, 0x18, 0xeb, 0x38, 0xca, 0x93, 0xa2, 0x9c, 0xeb, 0x49, 0xd1, 0x04, 0x88, 0x9c, - 0x60, 0x9b, 0x44, 0xb4, 0x4c, 0x98, 0xcc, 0xe6, 0x9f, 0x37, 0xdd, 0xc8, 0x6d, 0xcd, 0xbb, 0x5e, - 0x14, 0x46, 0xc1, 0xfc, 0xaa, 0x17, 0xdd, 0x08, 0xf8, 0x13, 0x52, 0x8b, 0xd6, 0xa4, 0x68, 0x61, - 0x8d, 0xae, 0x8c, 0x21, 0xc0, 0xda, 0x18, 0x34, 0x8d, 0x19, 0xd6, 0x45, 0x39, 0x56, 0x18, 0xf6, - 0x87, 0xd8, 0xed, 0xc3, 0xc6, 0xf4, 0x70, 0x91, 0x8a, 0xfe, 0xe1, 0x98, 0x9a, 0x0d, 0xa6, 0xc9, - 0xac, 0xea, 0xf1, 0x90, 0x8a, 0x0f, 0x7b, 0xda, 0xb0, 0xee, 0xd7, 0x17, 0x07, 0x4d, 0x42, 0xdf, - 0x91, 0x32, 0x50, 0x79, 0xb6, 0xc7, 0xad, 0x71, 0x08, 0x93, 0x14, 0x96, 0x4e, 0x85, 0x25, 0x9b, - 0x58, 0xad, 0x89, 0x7d, 0xa1, 0xa5, 0x53, 0x11, 0x00, 0x1c, 0xe3, 0x50, 0x66, 0x4a, 0xfd, 0x09, - 0x67, 0x50, 0x1c, 0x56, 0x54, 0x61, 0x87, 0x58, 0xc3, 0x40, 0x97, 0x84, 0x40, 0x81, 0xeb, 0x05, - 0x1e, 0x4d, 0x08, 0x14, 0xe4, 0x70, 0x69, 0x52, 0xa0, 0xcb, 0x30, 0xaa, 0x32, 0x68, 0xd7, 0x78, - 0x22, 0x23, 0xb1, 0xcc, 0x96, 0xe3, 0x62, 0xac, 0xe3, 0xa0, 0x0d, 0x98, 0x0c, 0xb9, 0x9c, 0x4d, - 0xc5, 0x7a, 0xe6, 0xf2, 0xca, 0xf7, 0x4b, 0x2b, 0xa0, 0xba, 0x09, 0xbe, 0xcf, 0x8a, 0xf8, 0xe9, - 0x24, 0xfd, 0xfc, 0x93, 0x24, 0xd0, 0xab, 0x30, 0xd1, 0xf2, 0x9d, 0xe6, 0xa2, 0xd3, 0x72, 0xbc, - 0x06, 0x1b, 0x9f, 0x11, 0x33, 0x11, 0xeb, 0x75, 0x03, 0x8a, 0x13, 0xd8, 0x94, 0x79, 0xd3, 0x4b, - 0x44, 0x7c, 0x72, 0xc7, 0xdb, 0x26, 0xa1, 0xc8, 0x87, 0xcc, 0x98, 0xb7, 0xeb, 0x39, 0x38, 0x38, - 0xb7, 0x36, 0x7a, 0x09, 0xc6, 0xe4, 0xe7, 0x6b, 0x61, 0x31, 0x62, 0xa7, 0x14, 0x0d, 0x86, 0x0d, - 0x4c, 0x74, 0x07, 0x4e, 0xc9, 0xff, 0x1b, 0x81, 0xb3, 0xb5, 0xe5, 0x36, 0x84, 0xaf, 0x38, 0xf7, - 0x5e, 0x5d, 0x90, 0x2e, 0x96, 0xcb, 0x59, 0x48, 0xf7, 0x0f, 0xe6, 0xce, 0x8b, 0x51, 0xcb, 0x84, - 0xb3, 0x49, 0xcc, 0xa6, 0x8f, 0xd6, 0xe0, 0xc4, 0x0e, 0x71, 0x5a, 0xd1, 0xce, 0xd2, 0x0e, 0x69, - 0xec, 0xca, 0x4d, 0xc7, 0x82, 0x6d, 0x68, 0x0e, 0x1c, 0x57, 0xd3, 0x28, 0x38, 0xab, 0x1e, 0x7a, - 0x03, 0x66, 0x3a, 0xdd, 0xcd, 0x96, 0x1b, 0xee, 0xac, 0xfb, 0x11, 0x33, 0x05, 0x52, 0x09, 0xb9, - 0x45, 0x54, 0x0e, 0x15, 0xce, 0xa4, 0x96, 0x83, 0x87, 0x73, 0x29, 0xa0, 0xb7, 0xe0, 0x54, 0x62, - 0x31, 0x88, 0xb8, 0x04, 0x13, 0xf9, 0xd9, 0x1e, 0xea, 0x59, 0x15, 0x44, 0x88, 0x8f, 0x2c, 0x10, - 0xce, 0x6e, 0x02, 0xbd, 0x0c, 0xe0, 0x76, 0x56, 0x9c, 0xb6, 0xdb, 0xa2, 0xcf, 0xc5, 0x13, 0x6c, - 0x9d, 0xd0, 0xa7, 0x03, 0xac, 0xd6, 0x64, 0x29, 0x3d, 0x9f, 0xc5, 0xbf, 0x7d, 0xac, 0x61, 0xa3, - 0x1a, 0x4c, 0x88, 0x7f, 0xfb, 0x62, 0x5a, 0xa7, 0x55, 0x08, 0x80, 0x09, 0x59, 0x43, 0xcd, 0x25, - 0x32, 0x4b, 0xd8, 0xec, 0x25, 0xea, 0xa3, 0x6d, 0x38, 0x2b, 0xb3, 0x77, 0xe9, 0xeb, 0x54, 0xce, - 0x43, 0xc8, 0xd2, 0x2c, 0x8c, 0x70, 0xff, 0x90, 0x85, 0x22, 0x44, 0x5c, 0x4c, 0x87, 0xde, 0xef, - 0xfa, 0x72, 0xe7, 0x1e, 0xb4, 0xa7, 0xb8, 0x79, 0x12, 0xbd, 0xdf, 0xaf, 0x27, 0x81, 0x38, 0x8d, - 0x8f, 0x42, 0x38, 0xe5, 0x7a, 0x59, 0xab, 0xfb, 0x34, 0x23, 0xf4, 0x11, 0xee, 0x3c, 0x5c, 0xbc, - 0xb2, 0x33, 0xe1, 0x7c, 0x65, 0x67, 0xd2, 0x7e, 0x7b, 0x56, 0x78, 0xbf, 0x6d, 0xd1, 0xda, 0x1a, - 0xa7, 0x8e, 0x3e, 0x0d, 0x63, 0xfa, 0x87, 0x09, 0xae, 0xe3, 0x42, 0x36, 0x23, 0xab, 0x9d, 0x0f, - 0x9c, 0xcf, 0x57, 0x67, 0x80, 0x0e, 0xc3, 0x06, 0x45, 0xd4, 0xc8, 0x70, 0xb3, 0xbf, 0xd4, 0x1f, - 0x57, 0xd3, 0xbf, 0x11, 0x1a, 0x81, 0xec, 0x65, 0x8f, 0xae, 0xc3, 0x48, 0xa3, 0xe5, 0x12, 0x2f, - 0x5a, 0xad, 0x15, 0xc5, 0xd2, 0x5b, 0x12, 0x38, 0x62, 0x1f, 0x89, 0xac, 0x09, 0xbc, 0x0c, 0x2b, - 0x0a, 0xf6, 0xaf, 0x96, 0x60, 0xae, 0x47, 0x0a, 0x8e, 0x84, 0x4a, 0xca, 0xea, 0x4b, 0x25, 0xb5, - 0x20, 0xb3, 0xce, 0xaf, 0x27, 0xa4, 0x5d, 0x89, 0x8c, 0xf2, 0xb1, 0xcc, 0x2b, 0x89, 0xdf, 0xb7, - 0x8b, 0x80, 0xae, 0xd5, 0x1a, 0xe8, 0xe9, 0xe4, 0x62, 0x68, 0xb3, 0x07, 0xfb, 0x7f, 0x02, 0xe7, - 0x6a, 0x26, 0xed, 0xaf, 0x96, 0xe0, 0x94, 0x1a, 0xc2, 0x6f, 0xdd, 0x81, 0xbb, 0x99, 0x1e, 0xb8, - 0x23, 0xd0, 0xeb, 0xda, 0x37, 0x60, 0x88, 0x07, 0x07, 0xec, 0x83, 0xf5, 0x7e, 0xc2, 0x0c, 0xbe, - 0xab, 0xb8, 0x3d, 0x23, 0x00, 0xef, 0xf7, 0x5b, 0x30, 0x99, 0xf0, 0x35, 0x43, 0x58, 0x73, 0x48, - 0x7e, 0x10, 0xf6, 0x38, 0x8b, 0xf1, 0x3e, 0x0f, 0x03, 0x3b, 0x7e, 0x18, 0x25, 0x8d, 0x3e, 0xae, - 0xfa, 0x61, 0x84, 0x19, 0xc4, 0xfe, 0x5d, 0x0b, 0x06, 0x37, 0x1c, 0xd7, 0x8b, 0xa4, 0x82, 0xc0, - 0xca, 0x51, 0x10, 0xf4, 0xf3, 0x5d, 0xe8, 0x45, 0x18, 0x22, 0x5b, 0x5b, 0xa4, 0x11, 0x89, 0x59, - 0x95, 0xd1, 0x1c, 0x86, 0x96, 0x59, 0x29, 0xe5, 0x05, 0x59, 0x63, 0xfc, 0x2f, 0x16, 0xc8, 0xe8, - 0x36, 0x54, 0x22, 0xb7, 0x4d, 0x16, 0x9a, 0x4d, 0xa1, 0x36, 0x7f, 0x80, 0x88, 0x14, 0x1b, 0x92, - 0x00, 0x8e, 0x69, 0xd9, 0x5f, 0x28, 0x01, 0xc4, 0x51, 0x95, 0x7a, 0x7d, 0xe2, 0x62, 0x4a, 0xa1, - 0x7a, 0x21, 0x43, 0xa1, 0x8a, 0x62, 0x82, 0x19, 0xda, 0x54, 0x35, 0x4c, 0xe5, 0xbe, 0x86, 0x69, - 0xe0, 0x30, 0xc3, 0xb4, 0x04, 0xd3, 0x71, 0x54, 0x28, 0x33, 0x28, 0x1e, 0xbb, 0x3e, 0x37, 0x92, - 0x40, 0x9c, 0xc6, 0xb7, 0x09, 0x9c, 0x57, 0xc1, 0x71, 0xc4, 0x8d, 0xc6, 0xac, 0xb2, 0x75, 0x05, - 0x75, 0x8f, 0x71, 0x8a, 0x35, 0xc6, 0xa5, 0x5c, 0x8d, 0xf1, 0x4f, 0x5a, 0x70, 0x32, 0xd9, 0x0e, - 0x73, 0x61, 0xfe, 0xbc, 0x05, 0xa7, 0x98, 0xde, 0x9c, 0xb5, 0x9a, 0xd6, 0xd2, 0xbf, 0x50, 0x18, - 0xf0, 0x27, 0xa7, 0xc7, 0x71, 0xd8, 0x90, 0xb5, 0x2c, 0xd2, 0x38, 0xbb, 0x45, 0xfb, 0x7b, 0xca, - 0x30, 0x93, 0x17, 0x29, 0x88, 0x39, 0x6d, 0x38, 0x77, 0xeb, 0xbb, 0xe4, 0x8e, 0x30, 0x8d, 0x8f, - 0x9d, 0x36, 0x78, 0x31, 0x96, 0xf0, 0x64, 0x56, 0x85, 0x52, 0x9f, 0x59, 0x15, 0x76, 0x60, 0xfa, - 0xce, 0x0e, 0xf1, 0x6e, 0x7a, 0xa1, 0x13, 0xb9, 0xe1, 0x96, 0xcb, 0x74, 0xcc, 0x7c, 0xdd, 0xc8, - 0x54, 0xac, 0xd3, 0xb7, 0x93, 0x08, 0xf7, 0x0f, 0xe6, 0xce, 0x1a, 0x05, 0x71, 0x97, 0xf9, 0x41, - 0x82, 0xd3, 0x44, 0xd3, 0x49, 0x29, 0x06, 0x1e, 0x72, 0x52, 0x8a, 0xb6, 0x2b, 0x2c, 0x53, 0xa4, - 0x45, 0x3e, 0x7b, 0x3d, 0xae, 0xa9, 0x52, 0xac, 0x61, 0xd8, 0x9f, 0xb7, 0xe0, 0x4c, 0x6e, 0x1e, - 0x63, 0x74, 0x11, 0x46, 0x9c, 0x8e, 0xcb, 0xc5, 0xfa, 0xe2, 0xd8, 0x65, 0xe2, 0xa3, 0xda, 0x2a, - 0x17, 0xea, 0x2b, 0x28, 0x3d, 0xed, 0x76, 0x5d, 0xaf, 0x99, 0x3c, 0xed, 0xae, 0xb9, 0x5e, 0x13, - 0x33, 0x88, 0x3a, 0xbe, 0xcb, 0x79, 0xc7, 0xb7, 0xfd, 0x7d, 0x16, 0x08, 0x07, 0xd5, 0x3e, 0xce, - 0xfa, 0x4f, 0xc0, 0xd8, 0x5e, 0x3a, 0xd1, 0xd5, 0xf9, 0x7c, 0x8f, 0x5d, 0x91, 0xde, 0x4a, 0x31, - 0x70, 0x46, 0x52, 0x2b, 0x83, 0x96, 0xdd, 0x04, 0x01, 0xad, 0x12, 0x26, 0xb4, 0xee, 0xdd, 0x9b, - 0xe7, 0x00, 0x9a, 0x0c, 0x97, 0x65, 0xbf, 0x2c, 0x99, 0x37, 0x79, 0x55, 0x41, 0xb0, 0x86, 0x65, - 0xff, 0x87, 0x12, 0x8c, 0xca, 0xc4, 0x4a, 0x5d, 0xaf, 0x1f, 0xd1, 0xd2, 0xa1, 0x32, 0xad, 0xa2, - 0x4b, 0x50, 0x61, 0xb2, 0xcf, 0x5a, 0x2c, 0x91, 0x53, 0x92, 0x87, 0x35, 0x09, 0xc0, 0x31, 0x0e, - 0xdd, 0x75, 0x61, 0x77, 0x93, 0xa1, 0x27, 0xdc, 0x29, 0xeb, 0xbc, 0x18, 0x4b, 0x38, 0xfa, 0x18, - 0x4c, 0xf1, 0x7a, 0x81, 0xdf, 0x71, 0xb6, 0xb9, 0xbe, 0x64, 0x50, 0xc5, 0xa8, 0x98, 0x5a, 0x4b, - 0xc0, 0xee, 0x1f, 0xcc, 0x9d, 0x4c, 0x96, 0x31, 0x45, 0x60, 0x8a, 0x0a, 0x33, 0x8b, 0xe2, 0x8d, - 0xd0, 0xd3, 0x22, 0x65, 0x4d, 0x15, 0x83, 0xb0, 0x8e, 0x67, 0x7f, 0x1a, 0x50, 0x3a, 0xc5, 0x14, - 0x7a, 0x8d, 0xdb, 0xc2, 0xba, 0x01, 0x69, 0x16, 0x29, 0x06, 0xf5, 0x48, 0x0c, 0xd2, 0x13, 0x8a, - 0xd7, 0xc2, 0xaa, 0xbe, 0xfd, 0x97, 0xcb, 0x30, 0x95, 0xf4, 0xfd, 0x46, 0x57, 0x61, 0x88, 0xb3, - 0x2a, 0x82, 0x7c, 0x81, 0xdd, 0x89, 0xe6, 0x31, 0xce, 0x0e, 0x6d, 0xc1, 0xed, 0x88, 0xfa, 0xe8, - 0x0d, 0x18, 0x6d, 0xfa, 0x77, 0xbc, 0x3b, 0x4e, 0xd0, 0x5c, 0xa8, 0xad, 0x8a, 0xe5, 0x9c, 0xf9, - 0x10, 0xae, 0xc6, 0x68, 0xba, 0x17, 0x3a, 0xd3, 0xb1, 0xc6, 0x20, 0xac, 0x93, 0x43, 0x1b, 0x2c, - 0x2e, 0xfd, 0x96, 0xbb, 0xbd, 0xe6, 0x74, 0x8a, 0x1c, 0x23, 0x96, 0x24, 0x92, 0x46, 0x79, 0x5c, - 0x04, 0xaf, 0xe7, 0x00, 0x1c, 0x13, 0x42, 0x9f, 0x85, 0x13, 0x61, 0x8e, 0x78, 0x3e, 0x2f, 0xe3, - 0x60, 0x91, 0xc4, 0x7a, 0xf1, 0x91, 0x7b, 0x07, 0x73, 0x27, 0xb2, 0x04, 0xf9, 0x59, 0xcd, 0xd8, - 0x5f, 0x3c, 0x09, 0xc6, 0x26, 0x36, 0x12, 0xd0, 0x5a, 0x47, 0x94, 0x80, 0x16, 0xc3, 0x08, 0x69, - 0x77, 0xa2, 0xfd, 0xaa, 0x1b, 0x14, 0xa5, 0xe1, 0x5f, 0x16, 0x38, 0x69, 0x9a, 0x12, 0x82, 0x15, - 0x9d, 0xec, 0x2c, 0xc1, 0xe5, 0x6f, 0x60, 0x96, 0xe0, 0x81, 0x63, 0xcc, 0x12, 0xbc, 0x0e, 0xc3, - 0xdb, 0x6e, 0x84, 0x49, 0xc7, 0x17, 0x8f, 0x84, 0xcc, 0x75, 0x78, 0x85, 0xa3, 0xa4, 0xf3, 0x51, - 0x0a, 0x00, 0x96, 0x44, 0xd0, 0x6b, 0x6a, 0x07, 0x0e, 0xe5, 0x3f, 0xe4, 0xd3, 0x06, 0x12, 0x99, - 0x7b, 0x50, 0xe4, 0x02, 0x1e, 0x7e, 0xd0, 0x5c, 0xc0, 0x2b, 0x32, 0x83, 0xef, 0x48, 0xbe, 0x17, - 0x13, 0x4b, 0xd0, 0xdb, 0x23, 0x6f, 0xef, 0x2d, 0x3d, 0xeb, 0x71, 0x25, 0xff, 0x24, 0x50, 0x09, - 0x8d, 0xfb, 0xcc, 0x75, 0xfc, 0x7d, 0x16, 0x9c, 0xea, 0x64, 0x25, 0x00, 0x17, 0xb6, 0x04, 0x2f, - 0xf6, 0x9d, 0x63, 0xdc, 0x68, 0x90, 0xc9, 0xe0, 0xb2, 0xb3, 0xc8, 0x67, 0x37, 0x47, 0x07, 0x3a, - 0xd8, 0x6c, 0x0a, 0x9d, 0xf6, 0x13, 0x39, 0x49, 0x93, 0x0b, 0x52, 0x25, 0x6f, 0x64, 0x24, 0xe8, - 0x7d, 0x6f, 0x5e, 0x82, 0xde, 0xbe, 0xd3, 0xf2, 0xbe, 0xa6, 0xd2, 0x25, 0x8f, 0xe7, 0x2f, 0x25, - 0x9e, 0x0c, 0xb9, 0x67, 0x92, 0xe4, 0xd7, 0x54, 0x92, 0xe4, 0x82, 0xf8, 0xc1, 0x3c, 0x05, 0x72, - 0xcf, 0xd4, 0xc8, 0x5a, 0x7a, 0xe3, 0xc9, 0xa3, 0x49, 0x6f, 0x6c, 0x5c, 0x35, 0x3c, 0xc3, 0xee, - 0xd3, 0x3d, 0xae, 0x1a, 0x83, 0x6e, 0xf1, 0x65, 0xc3, 0x53, 0x39, 0x4f, 0x3f, 0x50, 0x2a, 0xe7, - 0x5b, 0x7a, 0x6a, 0x64, 0xd4, 0x23, 0xf7, 0x2f, 0x45, 0xea, 0x33, 0x21, 0xf2, 0x2d, 0xfd, 0x02, - 0x3c, 0x91, 0x4f, 0x57, 0xdd, 0x73, 0x69, 0xba, 0x99, 0x57, 0x60, 0x2a, 0xd1, 0xf2, 0xc9, 0xe3, - 0x49, 0xb4, 0x7c, 0xea, 0xc8, 0x13, 0x2d, 0x9f, 0x3e, 0x86, 0x44, 0xcb, 0x8f, 0x1c, 0x63, 0xa2, - 0xe5, 0x5b, 0xcc, 0x00, 0x87, 0x87, 0xf9, 0x11, 0xf1, 0x8e, 0x9f, 0xca, 0x89, 0x92, 0x95, 0x8e, - 0x05, 0xc4, 0x3f, 0x4e, 0x81, 0x70, 0x4c, 0x2a, 0x23, 0x81, 0xf3, 0xcc, 0x43, 0x48, 0xe0, 0xbc, - 0x1e, 0x27, 0x70, 0x3e, 0x93, 0x3f, 0xd5, 0x19, 0x2e, 0x1b, 0x39, 0x69, 0x9b, 0x6f, 0xe9, 0xe9, - 0x96, 0x1f, 0x2d, 0xd0, 0xb2, 0x64, 0x09, 0x2a, 0x0b, 0x92, 0x2c, 0xbf, 0xca, 0x93, 0x2c, 0x3f, - 0x96, 0x7f, 0x92, 0x27, 0xaf, 0x3b, 0x23, 0xb5, 0x32, 0xed, 0x97, 0x0a, 0x93, 0xc9, 0x22, 0x3b, - 0xe7, 0xf4, 0x4b, 0xc5, 0xd9, 0x4c, 0xf7, 0x4b, 0x81, 0x70, 0x4c, 0xca, 0xfe, 0x81, 0x12, 0x9c, - 0x2b, 0xde, 0x6f, 0xb1, 0xf4, 0xb5, 0x16, 0x2b, 0x9d, 0x13, 0xd2, 0x57, 0xfe, 0x66, 0x8b, 0xb1, - 0xfa, 0x8e, 0xfa, 0x77, 0x05, 0xa6, 0x95, 0xaf, 0x47, 0xcb, 0x6d, 0xec, 0xaf, 0xc7, 0x2f, 0x5f, - 0xe5, 0x1f, 0x5f, 0x4f, 0x22, 0xe0, 0x74, 0x1d, 0xb4, 0x00, 0x93, 0x46, 0xe1, 0x6a, 0x55, 0xbc, - 0xcd, 0x94, 0xb8, 0xb7, 0x6e, 0x82, 0x71, 0x12, 0xdf, 0xfe, 0x92, 0x05, 0x8f, 0xe4, 0x64, 0x28, - 0xec, 0x3b, 0xa8, 0xdd, 0x16, 0x4c, 0x76, 0xcc, 0xaa, 0x3d, 0xe2, 0x70, 0x1a, 0x79, 0x10, 0x55, - 0x5f, 0x13, 0x00, 0x9c, 0x24, 0x6a, 0xff, 0x74, 0x09, 0xce, 0x16, 0x1a, 0x2f, 0x22, 0x0c, 0xa7, - 0xb7, 0xdb, 0xa1, 0xb3, 0x14, 0x90, 0x26, 0xf1, 0x22, 0xd7, 0x69, 0xd5, 0x3b, 0xa4, 0xa1, 0xc9, - 0xcf, 0x99, 0x15, 0xe0, 0x95, 0xb5, 0xfa, 0x42, 0x1a, 0x03, 0xe7, 0xd4, 0x44, 0x2b, 0x80, 0xd2, - 0x10, 0x31, 0xc3, 0x2c, 0x46, 0x78, 0x9a, 0x1e, 0xce, 0xa8, 0x81, 0x3e, 0x04, 0xe3, 0xca, 0x28, - 0x52, 0x9b, 0x71, 0x76, 0xb0, 0x63, 0x1d, 0x80, 0x4d, 0x3c, 0x74, 0x99, 0x07, 0x99, 0x17, 0xe9, - 0x08, 0x84, 0xb0, 0x7d, 0x52, 0x46, 0x90, 0x17, 0xc5, 0x58, 0xc7, 0x59, 0x7c, 0xe9, 0xd7, 0x7e, - 0xff, 0xdc, 0x7b, 0x7e, 0xf3, 0xf7, 0xcf, 0xbd, 0xe7, 0x77, 0x7e, 0xff, 0xdc, 0x7b, 0xbe, 0xeb, - 0xde, 0x39, 0xeb, 0xd7, 0xee, 0x9d, 0xb3, 0x7e, 0xf3, 0xde, 0x39, 0xeb, 0x77, 0xee, 0x9d, 0xb3, - 0x7e, 0xef, 0xde, 0x39, 0xeb, 0x0b, 0x7f, 0x70, 0xee, 0x3d, 0x9f, 0x40, 0x71, 0x98, 0xc8, 0x4b, - 0x74, 0x76, 0x2e, 0xed, 0x5d, 0xfe, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1b, 0x9e, 0xe7, 0x8d, - 0x05, 0x08, 0x01, 0x00, + // 14376 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xd7, + 0x79, 0x18, 0xaa, 0x9e, 0xc1, 0x6b, 0x3e, 0xbc, 0x0f, 0x76, 0x97, 0x58, 0x90, 0xbb, 0xb3, 0x6c, + 0x52, 0xcb, 0xa5, 0x48, 0x62, 0xb5, 0x7c, 0x48, 0x34, 0x29, 0xd1, 0x02, 0x30, 0xc0, 0x2e, 0xb8, + 0x0b, 0xec, 0xf0, 0x0c, 0x76, 0x57, 0x92, 0x29, 0x95, 0x1a, 0x33, 0x07, 0x40, 0x0b, 0x33, 0xdd, + 0xc3, 0xee, 0x1e, 0xec, 0x82, 0x57, 0xae, 0xeb, 0x2b, 0x3f, 0x65, 0xfb, 0xde, 0x52, 0xdd, 0x72, + 0x1e, 0x25, 0xbb, 0x5c, 0x29, 0xc7, 0x89, 0xad, 0x28, 0x49, 0xc5, 0x91, 0x63, 0x3b, 0x96, 0x13, + 0x3b, 0x6f, 0x27, 0x3f, 0x1c, 0xc7, 0x55, 0xb1, 0x5c, 0xe5, 0x0a, 0x62, 0xaf, 0x53, 0xe5, 0x52, + 0x55, 0x62, 0x3b, 0x71, 0x52, 0x95, 0x20, 0x4e, 0x9c, 0x3a, 0xcf, 0x3e, 0xa7, 0x1f, 0x33, 0x83, + 0x25, 0x16, 0xa2, 0x54, 0xfc, 0x37, 0x73, 0xbe, 0xef, 0x7c, 0xe7, 0xf4, 0x79, 0x7e, 0xe7, 0x7b, + 0xc2, 0xab, 0xbb, 0x2f, 0x87, 0xf3, 0xae, 0x7f, 0x79, 0xb7, 0xb3, 0x49, 0x02, 0x8f, 0x44, 0x24, + 0xbc, 0xbc, 0x47, 0xbc, 0x86, 0x1f, 0x5c, 0x16, 0x00, 0xa7, 0xed, 0x5e, 0xae, 0xfb, 0x01, 0xb9, + 0xbc, 0x77, 0xe5, 0xf2, 0x36, 0xf1, 0x48, 0xe0, 0x44, 0xa4, 0x31, 0xdf, 0x0e, 0xfc, 0xc8, 0x47, + 0x88, 0xe3, 0xcc, 0x3b, 0x6d, 0x77, 0x9e, 0xe2, 0xcc, 0xef, 0x5d, 0x99, 0x7b, 0x6e, 0xdb, 0x8d, + 0x76, 0x3a, 0x9b, 0xf3, 0x75, 0xbf, 0x75, 0x79, 0xdb, 0xdf, 0xf6, 0x2f, 0x33, 0xd4, 0xcd, 0xce, + 0x16, 0xfb, 0xc7, 0xfe, 0xb0, 0x5f, 0x9c, 0xc4, 0xdc, 0x8b, 0x71, 0x33, 0x2d, 0xa7, 0xbe, 0xe3, + 0x7a, 0x24, 0xd8, 0xbf, 0xdc, 0xde, 0xdd, 0x66, 0xed, 0x06, 0x24, 0xf4, 0x3b, 0x41, 0x9d, 0x24, + 0x1b, 0xee, 0x5a, 0x2b, 0xbc, 0xdc, 0x22, 0x91, 0x93, 0xd1, 0xdd, 0xb9, 0xcb, 0x79, 0xb5, 0x82, + 0x8e, 0x17, 0xb9, 0xad, 0x74, 0x33, 0x1f, 0xea, 0x55, 0x21, 0xac, 0xef, 0x90, 0x96, 0x93, 0xaa, + 0xf7, 0x42, 0x5e, 0xbd, 0x4e, 0xe4, 0x36, 0x2f, 0xbb, 0x5e, 0x14, 0x46, 0x41, 0xb2, 0x92, 0xfd, + 0x75, 0x0b, 0x2e, 0x2c, 0xdc, 0xa9, 0x2d, 0x37, 0x9d, 0x30, 0x72, 0xeb, 0x8b, 0x4d, 0xbf, 0xbe, + 0x5b, 0x8b, 0xfc, 0x80, 0xdc, 0xf6, 0x9b, 0x9d, 0x16, 0xa9, 0xb1, 0x81, 0x40, 0xcf, 0xc2, 0xc8, + 0x1e, 0xfb, 0xbf, 0x5a, 0x99, 0xb5, 0x2e, 0x58, 0x97, 0x4a, 0x8b, 0x53, 0xbf, 0x7e, 0x50, 0x7e, + 0xdf, 0xfd, 0x83, 0xf2, 0xc8, 0x6d, 0x51, 0x8e, 0x15, 0x06, 0xba, 0x08, 0x43, 0x5b, 0xe1, 0xc6, + 0x7e, 0x9b, 0xcc, 0x16, 0x18, 0xee, 0x84, 0xc0, 0x1d, 0x5a, 0xa9, 0xd1, 0x52, 0x2c, 0xa0, 0xe8, + 0x32, 0x94, 0xda, 0x4e, 0x10, 0xb9, 0x91, 0xeb, 0x7b, 0xb3, 0xc5, 0x0b, 0xd6, 0xa5, 0xc1, 0xc5, + 0x69, 0x81, 0x5a, 0xaa, 0x4a, 0x00, 0x8e, 0x71, 0x68, 0x37, 0x02, 0xe2, 0x34, 0x6e, 0x7a, 0xcd, + 0xfd, 0xd9, 0x81, 0x0b, 0xd6, 0xa5, 0x91, 0xb8, 0x1b, 0x58, 0x94, 0x63, 0x85, 0x61, 0x7f, 0xa9, + 0x00, 0x23, 0x0b, 0x5b, 0x5b, 0xae, 0xe7, 0x46, 0xfb, 0xe8, 0x36, 0x8c, 0x79, 0x7e, 0x83, 0xc8, + 0xff, 0xec, 0x2b, 0x46, 0x9f, 0xbf, 0x30, 0x9f, 0x5e, 0x4a, 0xf3, 0xeb, 0x1a, 0xde, 0xe2, 0xd4, + 0xfd, 0x83, 0xf2, 0x98, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x68, 0xdb, 0x6f, 0x28, 0xb2, 0x05, + 0x46, 0xb6, 0x9c, 0x45, 0xb6, 0x1a, 0xa3, 0x2d, 0x4e, 0xde, 0x3f, 0x28, 0x8f, 0x6a, 0x05, 0x58, + 0x27, 0x82, 0x36, 0x61, 0x92, 0xfe, 0xf5, 0x22, 0x57, 0xd1, 0x2d, 0x32, 0xba, 0x4f, 0xe4, 0xd1, + 0xd5, 0x50, 0x17, 0x67, 0xee, 0x1f, 0x94, 0x27, 0x13, 0x85, 0x38, 0x49, 0xd0, 0x7e, 0x1b, 0x26, + 0x16, 0xa2, 0xc8, 0xa9, 0xef, 0x90, 0x06, 0x9f, 0x41, 0xf4, 0x22, 0x0c, 0x78, 0x4e, 0x8b, 0x88, + 0xf9, 0xbd, 0x20, 0x06, 0x76, 0x60, 0xdd, 0x69, 0x91, 0xc3, 0x83, 0xf2, 0xd4, 0x2d, 0xcf, 0x7d, + 0xab, 0x23, 0x56, 0x05, 0x2d, 0xc3, 0x0c, 0x1b, 0x3d, 0x0f, 0xd0, 0x20, 0x7b, 0x6e, 0x9d, 0x54, + 0x9d, 0x68, 0x47, 0xcc, 0x37, 0x12, 0x75, 0xa1, 0xa2, 0x20, 0x58, 0xc3, 0xb2, 0xef, 0x41, 0x69, + 0x61, 0xcf, 0x77, 0x1b, 0x55, 0xbf, 0x11, 0xa2, 0x5d, 0x98, 0x6c, 0x07, 0x64, 0x8b, 0x04, 0xaa, + 0x68, 0xd6, 0xba, 0x50, 0xbc, 0x34, 0xfa, 0xfc, 0xa5, 0xcc, 0x8f, 0x35, 0x51, 0x97, 0xbd, 0x28, + 0xd8, 0x5f, 0x7c, 0x44, 0xb4, 0x37, 0x99, 0x80, 0xe2, 0x24, 0x65, 0xfb, 0x9f, 0x16, 0xe0, 0xf4, + 0xc2, 0xdb, 0x9d, 0x80, 0x54, 0xdc, 0x70, 0x37, 0xb9, 0xc2, 0x1b, 0x6e, 0xb8, 0xbb, 0x1e, 0x8f, + 0x80, 0x5a, 0x5a, 0x15, 0x51, 0x8e, 0x15, 0x06, 0x7a, 0x0e, 0x86, 0xe9, 0xef, 0x5b, 0x78, 0x55, + 0x7c, 0xf2, 0x8c, 0x40, 0x1e, 0xad, 0x38, 0x91, 0x53, 0xe1, 0x20, 0x2c, 0x71, 0xd0, 0x1a, 0x8c, + 0xd6, 0xd9, 0x86, 0xdc, 0x5e, 0xf3, 0x1b, 0x84, 0x4d, 0x66, 0x69, 0xf1, 0x19, 0x8a, 0xbe, 0x14, + 0x17, 0x1f, 0x1e, 0x94, 0x67, 0x79, 0xdf, 0x04, 0x09, 0x0d, 0x86, 0xf5, 0xfa, 0xc8, 0x56, 0xfb, + 0x6b, 0x80, 0x51, 0x82, 0x8c, 0xbd, 0x75, 0x49, 0xdb, 0x2a, 0x83, 0x6c, 0xab, 0x8c, 0x65, 0x6f, + 0x13, 0x74, 0x05, 0x06, 0x76, 0x5d, 0xaf, 0x31, 0x3b, 0xc4, 0x68, 0x9d, 0xa3, 0x73, 0x7e, 0xdd, + 0xf5, 0x1a, 0x87, 0x07, 0xe5, 0x69, 0xa3, 0x3b, 0xb4, 0x10, 0x33, 0x54, 0xfb, 0x4f, 0x2d, 0x28, + 0x33, 0xd8, 0x8a, 0xdb, 0x24, 0x55, 0x12, 0x84, 0x6e, 0x18, 0x11, 0x2f, 0x32, 0x06, 0xf4, 0x79, + 0x80, 0x90, 0xd4, 0x03, 0x12, 0x69, 0x43, 0xaa, 0x16, 0x46, 0x4d, 0x41, 0xb0, 0x86, 0x45, 0x0f, + 0x84, 0x70, 0xc7, 0x09, 0xd8, 0xfa, 0x12, 0x03, 0xab, 0x0e, 0x84, 0x9a, 0x04, 0xe0, 0x18, 0xc7, + 0x38, 0x10, 0x8a, 0xbd, 0x0e, 0x04, 0xf4, 0x51, 0x98, 0x8c, 0x1b, 0x0b, 0xdb, 0x4e, 0x5d, 0x0e, + 0x20, 0xdb, 0x32, 0x35, 0x13, 0x84, 0x93, 0xb8, 0xf6, 0xdf, 0xb0, 0xc4, 0xe2, 0xa1, 0x5f, 0xfd, + 0x2e, 0xff, 0x56, 0xfb, 0x97, 0x2c, 0x18, 0x5e, 0x74, 0xbd, 0x86, 0xeb, 0x6d, 0xa3, 0xcf, 0xc0, + 0x08, 0xbd, 0x9b, 0x1a, 0x4e, 0xe4, 0x88, 0x73, 0xef, 0x83, 0xda, 0xde, 0x52, 0x57, 0xc5, 0x7c, + 0x7b, 0x77, 0x9b, 0x16, 0x84, 0xf3, 0x14, 0x9b, 0xee, 0xb6, 0x9b, 0x9b, 0x9f, 0x25, 0xf5, 0x68, + 0x8d, 0x44, 0x4e, 0xfc, 0x39, 0x71, 0x19, 0x56, 0x54, 0xd1, 0x75, 0x18, 0x8a, 0x9c, 0x60, 0x9b, + 0x44, 0xe2, 0x00, 0xcc, 0x3c, 0xa8, 0x78, 0x4d, 0x4c, 0x77, 0x24, 0xf1, 0xea, 0x24, 0xbe, 0x16, + 0x36, 0x58, 0x55, 0x2c, 0x48, 0xd8, 0xff, 0x6b, 0x18, 0xce, 0x2e, 0xd5, 0x56, 0x73, 0xd6, 0xd5, + 0x45, 0x18, 0x6a, 0x04, 0xee, 0x1e, 0x09, 0xc4, 0x38, 0x2b, 0x2a, 0x15, 0x56, 0x8a, 0x05, 0x14, + 0xbd, 0x0c, 0x63, 0xfc, 0x42, 0xba, 0xe6, 0x78, 0x8d, 0xa6, 0x1c, 0xe2, 0x53, 0x02, 0x7b, 0xec, + 0xb6, 0x06, 0xc3, 0x06, 0xe6, 0x11, 0x17, 0xd5, 0xc5, 0xc4, 0x66, 0xcc, 0xbb, 0xec, 0xbe, 0x60, + 0xc1, 0x14, 0x6f, 0x66, 0x21, 0x8a, 0x02, 0x77, 0xb3, 0x13, 0x91, 0x70, 0x76, 0x90, 0x9d, 0x74, + 0x4b, 0x59, 0xa3, 0x95, 0x3b, 0x02, 0xf3, 0xb7, 0x13, 0x54, 0xf8, 0x21, 0x38, 0x2b, 0xda, 0x9d, + 0x4a, 0x82, 0x71, 0xaa, 0x59, 0xf4, 0xbd, 0x16, 0xcc, 0xd5, 0x7d, 0x2f, 0x0a, 0xfc, 0x66, 0x93, + 0x04, 0xd5, 0xce, 0x66, 0xd3, 0x0d, 0x77, 0xf8, 0x3a, 0xc5, 0x64, 0x8b, 0x9d, 0x04, 0x39, 0x73, + 0xa8, 0x90, 0xc4, 0x1c, 0x9e, 0xbf, 0x7f, 0x50, 0x9e, 0x5b, 0xca, 0x25, 0x85, 0xbb, 0x34, 0x83, + 0x76, 0x01, 0xd1, 0xab, 0xb4, 0x16, 0x39, 0xdb, 0x24, 0x6e, 0x7c, 0xb8, 0xff, 0xc6, 0xcf, 0xdc, + 0x3f, 0x28, 0xa3, 0xf5, 0x14, 0x09, 0x9c, 0x41, 0x16, 0xbd, 0x05, 0xa7, 0x68, 0x69, 0xea, 0x5b, + 0x47, 0xfa, 0x6f, 0x6e, 0xf6, 0xfe, 0x41, 0xf9, 0xd4, 0x7a, 0x06, 0x11, 0x9c, 0x49, 0x1a, 0x7d, + 0x8f, 0x05, 0x67, 0xe3, 0xcf, 0x5f, 0xbe, 0xd7, 0x76, 0xbc, 0x46, 0xdc, 0x70, 0xa9, 0xff, 0x86, + 0xe9, 0x99, 0x7c, 0x76, 0x29, 0x8f, 0x12, 0xce, 0x6f, 0x04, 0x79, 0x30, 0x43, 0xbb, 0x96, 0x6c, + 0x1b, 0xfa, 0x6f, 0xfb, 0x91, 0xfb, 0x07, 0xe5, 0x99, 0xf5, 0x34, 0x0d, 0x9c, 0x45, 0x78, 0x6e, + 0x09, 0x4e, 0x67, 0xae, 0x4e, 0x34, 0x05, 0xc5, 0x5d, 0xc2, 0xb9, 0xae, 0x12, 0xa6, 0x3f, 0xd1, + 0x29, 0x18, 0xdc, 0x73, 0x9a, 0x1d, 0xb1, 0x31, 0x31, 0xff, 0xf3, 0x4a, 0xe1, 0x65, 0xcb, 0xfe, + 0x67, 0x45, 0x98, 0x5c, 0xaa, 0xad, 0x3e, 0xd0, 0xae, 0xd7, 0xaf, 0xbd, 0x42, 0xd7, 0x6b, 0x2f, + 0xbe, 0x44, 0x8b, 0xb9, 0x97, 0xe8, 0xff, 0x9d, 0xb1, 0x65, 0x07, 0xd8, 0x96, 0xfd, 0x8e, 0x9c, + 0x2d, 0x7b, 0xcc, 0x1b, 0x75, 0x2f, 0x67, 0xd5, 0x0e, 0xb2, 0x09, 0xcc, 0xe4, 0x90, 0x6e, 0xf8, + 0x75, 0xa7, 0x99, 0x3c, 0x6a, 0x8f, 0xb8, 0x74, 0x8f, 0x67, 0x1e, 0xeb, 0x30, 0xb6, 0xe4, 0xb4, + 0x9d, 0x4d, 0xb7, 0xe9, 0x46, 0x2e, 0x09, 0xd1, 0x53, 0x50, 0x74, 0x1a, 0x0d, 0xc6, 0xdd, 0x95, + 0x16, 0x4f, 0xdf, 0x3f, 0x28, 0x17, 0x17, 0x1a, 0x94, 0xcd, 0x00, 0x85, 0xb5, 0x8f, 0x29, 0x06, + 0xfa, 0x00, 0x0c, 0x34, 0x02, 0xbf, 0x3d, 0x5b, 0x60, 0x98, 0x74, 0x97, 0x0f, 0x54, 0x02, 0xbf, + 0x9d, 0x40, 0x65, 0x38, 0xf6, 0xaf, 0x15, 0xe0, 0xb1, 0x25, 0xd2, 0xde, 0x59, 0xa9, 0xe5, 0xdc, + 0x17, 0x97, 0x60, 0xa4, 0xe5, 0x7b, 0x6e, 0xe4, 0x07, 0xa1, 0x68, 0x9a, 0xad, 0x88, 0x35, 0x51, + 0x86, 0x15, 0x14, 0x5d, 0x80, 0x81, 0x76, 0xcc, 0xc4, 0x8e, 0x49, 0x06, 0x98, 0xb1, 0xaf, 0x0c, + 0x42, 0x31, 0x3a, 0x21, 0x09, 0xc4, 0x8a, 0x51, 0x18, 0xb7, 0x42, 0x12, 0x60, 0x06, 0x89, 0x39, + 0x01, 0xca, 0x23, 0x88, 0x1b, 0x21, 0xc1, 0x09, 0x50, 0x08, 0xd6, 0xb0, 0x50, 0x15, 0x4a, 0x61, + 0x62, 0x66, 0xfb, 0xda, 0x9a, 0xe3, 0x8c, 0x55, 0x50, 0x33, 0x19, 0x13, 0x31, 0x6e, 0xb0, 0xa1, + 0x9e, 0xac, 0xc2, 0xd7, 0x0a, 0x80, 0xf8, 0x10, 0x7e, 0x8b, 0x0d, 0xdc, 0xad, 0xf4, 0xc0, 0xf5, + 0xbf, 0x25, 0x8e, 0x6b, 0xf4, 0xfe, 0xab, 0x05, 0x8f, 0x2d, 0xb9, 0x5e, 0x83, 0x04, 0x39, 0x0b, + 0xf0, 0xe1, 0xbc, 0x9d, 0x8f, 0xc6, 0xa4, 0x18, 0x4b, 0x6c, 0xe0, 0x18, 0x96, 0x98, 0xfd, 0xc7, + 0x16, 0x20, 0xfe, 0xd9, 0xef, 0xba, 0x8f, 0xbd, 0x95, 0xfe, 0xd8, 0x63, 0x58, 0x16, 0xf6, 0x0d, + 0x98, 0x58, 0x6a, 0xba, 0xc4, 0x8b, 0x56, 0xab, 0x4b, 0xbe, 0xb7, 0xe5, 0x6e, 0xa3, 0x57, 0x60, + 0x22, 0x72, 0x5b, 0xc4, 0xef, 0x44, 0x35, 0x52, 0xf7, 0x3d, 0xf6, 0x72, 0xb5, 0x2e, 0x0d, 0x2e, + 0xa2, 0xfb, 0x07, 0xe5, 0x89, 0x0d, 0x03, 0x82, 0x13, 0x98, 0xf6, 0xef, 0xd2, 0xf1, 0xf3, 0x5b, + 0x6d, 0xdf, 0x23, 0x5e, 0xb4, 0xe4, 0x7b, 0x0d, 0x2e, 0xe1, 0x78, 0x05, 0x06, 0x22, 0x3a, 0x1e, + 0x7c, 0xec, 0x2e, 0xca, 0x8d, 0x42, 0x47, 0xe1, 0xf0, 0xa0, 0x7c, 0x26, 0x5d, 0x83, 0x8d, 0x13, + 0xab, 0x83, 0xbe, 0x03, 0x86, 0xc2, 0xc8, 0x89, 0x3a, 0xa1, 0x18, 0xcd, 0xc7, 0xe5, 0x68, 0xd6, + 0x58, 0xe9, 0xe1, 0x41, 0x79, 0x52, 0x55, 0xe3, 0x45, 0x58, 0x54, 0x40, 0x4f, 0xc3, 0x70, 0x8b, + 0x84, 0xa1, 0xb3, 0x2d, 0x6f, 0xc3, 0x49, 0x51, 0x77, 0x78, 0x8d, 0x17, 0x63, 0x09, 0x47, 0x4f, + 0xc0, 0x20, 0x09, 0x02, 0x3f, 0x10, 0x7b, 0x74, 0x5c, 0x20, 0x0e, 0x2e, 0xd3, 0x42, 0xcc, 0x61, + 0xf6, 0xbf, 0xb6, 0x60, 0x52, 0xf5, 0x95, 0xb7, 0x75, 0x02, 0xaf, 0x90, 0x4f, 0x02, 0xd4, 0xe5, + 0x07, 0x86, 0xec, 0xf6, 0x18, 0x7d, 0xfe, 0x62, 0xe6, 0x45, 0x9d, 0x1a, 0xc6, 0x98, 0xb2, 0x2a, + 0x0a, 0xb1, 0x46, 0xcd, 0xfe, 0x07, 0x16, 0xcc, 0x24, 0xbe, 0xe8, 0x86, 0x1b, 0x46, 0xe8, 0xcd, + 0xd4, 0x57, 0xcd, 0xf7, 0xf7, 0x55, 0xb4, 0x36, 0xfb, 0x26, 0xb5, 0x94, 0x65, 0x89, 0xf6, 0x45, + 0xd7, 0x60, 0xd0, 0x8d, 0x48, 0x4b, 0x7e, 0xcc, 0x13, 0x5d, 0x3f, 0x86, 0xf7, 0x2a, 0x9e, 0x91, + 0x55, 0x5a, 0x13, 0x73, 0x02, 0xf6, 0xaf, 0x15, 0xa1, 0xc4, 0x97, 0xed, 0x9a, 0xd3, 0x3e, 0x81, + 0xb9, 0x78, 0x06, 0x4a, 0x6e, 0xab, 0xd5, 0x89, 0x9c, 0x4d, 0x71, 0x9c, 0x8f, 0xf0, 0xad, 0xb5, + 0x2a, 0x0b, 0x71, 0x0c, 0x47, 0xab, 0x30, 0xc0, 0xba, 0xc2, 0xbf, 0xf2, 0xa9, 0xec, 0xaf, 0x14, + 0x7d, 0x9f, 0xaf, 0x38, 0x91, 0xc3, 0x39, 0x29, 0x75, 0x8f, 0xd0, 0x22, 0xcc, 0x48, 0x20, 0x07, + 0x60, 0xd3, 0xf5, 0x9c, 0x60, 0x9f, 0x96, 0xcd, 0x16, 0x19, 0xc1, 0xe7, 0xba, 0x13, 0x5c, 0x54, + 0xf8, 0x9c, 0xac, 0xfa, 0xb0, 0x18, 0x80, 0x35, 0xa2, 0x73, 0x1f, 0x86, 0x92, 0x42, 0x3e, 0x0a, + 0x43, 0x34, 0xf7, 0x51, 0x98, 0x4c, 0xb4, 0xd5, 0xab, 0xfa, 0x98, 0xce, 0x4f, 0xfd, 0x32, 0x3b, + 0x32, 0x44, 0xaf, 0x97, 0xbd, 0x3d, 0x71, 0xe4, 0xbe, 0x0d, 0xa7, 0x9a, 0x19, 0x27, 0x99, 0x98, + 0xd7, 0xfe, 0x4f, 0xbe, 0xc7, 0xc4, 0x67, 0x9f, 0xca, 0x82, 0xe2, 0xcc, 0x36, 0x28, 0x8f, 0xe0, + 0xb7, 0xe9, 0x06, 0x71, 0x9a, 0x3a, 0xbb, 0x7d, 0x53, 0x94, 0x61, 0x05, 0xa5, 0xe7, 0xdd, 0x29, + 0xd5, 0xf9, 0xeb, 0x64, 0xbf, 0x46, 0x9a, 0xa4, 0x1e, 0xf9, 0xc1, 0x37, 0xb5, 0xfb, 0xe7, 0xf8, + 0xe8, 0xf3, 0xe3, 0x72, 0x54, 0x10, 0x28, 0x5e, 0x27, 0xfb, 0x7c, 0x2a, 0xf4, 0xaf, 0x2b, 0x76, + 0xfd, 0xba, 0x9f, 0xb3, 0x60, 0x5c, 0x7d, 0xdd, 0x09, 0x9c, 0x0b, 0x8b, 0xe6, 0xb9, 0x70, 0xae, + 0xeb, 0x02, 0xcf, 0x39, 0x11, 0xbe, 0x56, 0x80, 0xb3, 0x0a, 0x87, 0xbe, 0x0d, 0xf8, 0x1f, 0xb1, + 0xaa, 0x2e, 0x43, 0xc9, 0x53, 0x52, 0x32, 0xcb, 0x14, 0x4f, 0xc5, 0x32, 0xb2, 0x18, 0x87, 0xb2, + 0x78, 0x5e, 0x2c, 0xca, 0x1a, 0xd3, 0xc5, 0xc7, 0x42, 0x54, 0xbc, 0x08, 0xc5, 0x8e, 0xdb, 0x10, + 0x17, 0xcc, 0x07, 0xe5, 0x68, 0xdf, 0x5a, 0xad, 0x1c, 0x1e, 0x94, 0x1f, 0xcf, 0x53, 0x5d, 0xd0, + 0x9b, 0x2d, 0x9c, 0xbf, 0xb5, 0x5a, 0xc1, 0xb4, 0x32, 0x5a, 0x80, 0x49, 0xa9, 0x9d, 0xb9, 0x4d, + 0xd9, 0x2d, 0xdf, 0x13, 0xf7, 0x90, 0x92, 0x01, 0x63, 0x13, 0x8c, 0x93, 0xf8, 0xa8, 0x02, 0x53, + 0xbb, 0x9d, 0x4d, 0xd2, 0x24, 0x11, 0xff, 0xe0, 0xeb, 0x84, 0x4b, 0x48, 0x4b, 0xf1, 0xcb, 0xec, + 0x7a, 0x02, 0x8e, 0x53, 0x35, 0xec, 0x3f, 0x67, 0xf7, 0x81, 0x18, 0xbd, 0x6a, 0xe0, 0xd3, 0x85, + 0x45, 0xa9, 0x7f, 0x33, 0x97, 0x73, 0x3f, 0xab, 0xe2, 0x3a, 0xd9, 0xdf, 0xf0, 0x29, 0x67, 0x9e, + 0xbd, 0x2a, 0x8c, 0x35, 0x3f, 0xd0, 0x75, 0xcd, 0xff, 0x7c, 0x01, 0x4e, 0xab, 0x11, 0x30, 0x98, + 0xc0, 0x6f, 0xf5, 0x31, 0xb8, 0x02, 0xa3, 0x0d, 0xb2, 0xe5, 0x74, 0x9a, 0x91, 0x12, 0xd7, 0x0f, + 0x72, 0x95, 0x4d, 0x25, 0x2e, 0xc6, 0x3a, 0xce, 0x11, 0x86, 0xed, 0xbf, 0x8d, 0xb2, 0x8b, 0x38, + 0x72, 0xe8, 0x1a, 0x57, 0xbb, 0xc6, 0xca, 0xdd, 0x35, 0x4f, 0xc0, 0xa0, 0xdb, 0xa2, 0x8c, 0x59, + 0xc1, 0xe4, 0xb7, 0x56, 0x69, 0x21, 0xe6, 0x30, 0xf4, 0x7e, 0x18, 0xae, 0xfb, 0xad, 0x96, 0xe3, + 0x35, 0xd8, 0x95, 0x57, 0x5a, 0x1c, 0xa5, 0xbc, 0xdb, 0x12, 0x2f, 0xc2, 0x12, 0x86, 0x1e, 0x83, + 0x01, 0x27, 0xd8, 0xe6, 0x32, 0x8c, 0xd2, 0xe2, 0x08, 0x6d, 0x69, 0x21, 0xd8, 0x0e, 0x31, 0x2b, + 0xa5, 0x4f, 0xb0, 0xbb, 0x7e, 0xb0, 0xeb, 0x7a, 0xdb, 0x15, 0x37, 0x10, 0x5b, 0x42, 0xdd, 0x85, + 0x77, 0x14, 0x04, 0x6b, 0x58, 0x68, 0x05, 0x06, 0xdb, 0x7e, 0x10, 0x85, 0xb3, 0x43, 0x6c, 0xb8, + 0x1f, 0xcf, 0x39, 0x88, 0xf8, 0xd7, 0x56, 0xfd, 0x20, 0x8a, 0x3f, 0x80, 0xfe, 0x0b, 0x31, 0xaf, + 0x8e, 0x6e, 0xc0, 0x30, 0xf1, 0xf6, 0x56, 0x02, 0xbf, 0x35, 0x3b, 0x93, 0x4f, 0x69, 0x99, 0xa3, + 0xf0, 0x65, 0x16, 0xf3, 0xa8, 0xa2, 0x18, 0x4b, 0x12, 0xe8, 0x3b, 0xa0, 0x48, 0xbc, 0xbd, 0xd9, + 0x61, 0x46, 0x69, 0x2e, 0x87, 0xd2, 0x6d, 0x27, 0x88, 0xcf, 0xfc, 0x65, 0x6f, 0x0f, 0xd3, 0x3a, + 0xe8, 0x13, 0x50, 0x92, 0x07, 0x46, 0x28, 0x84, 0x83, 0x99, 0x0b, 0x56, 0x1e, 0x33, 0x98, 0xbc, + 0xd5, 0x71, 0x03, 0xd2, 0x22, 0x5e, 0x14, 0xc6, 0x27, 0xa4, 0x84, 0x86, 0x38, 0xa6, 0x86, 0x3e, + 0x21, 0x25, 0xd2, 0x6b, 0x7e, 0xc7, 0x8b, 0xc2, 0xd9, 0x12, 0xeb, 0x5e, 0xa6, 0xae, 0xf0, 0x76, + 0x8c, 0x97, 0x14, 0x59, 0xf3, 0xca, 0xd8, 0x20, 0x85, 0x3e, 0x05, 0xe3, 0xfc, 0x3f, 0xd7, 0xb8, + 0x85, 0xb3, 0xa7, 0x19, 0xed, 0x0b, 0xf9, 0xb4, 0x39, 0xe2, 0xe2, 0x69, 0x41, 0x7c, 0x5c, 0x2f, + 0x0d, 0xb1, 0x49, 0x0d, 0x61, 0x18, 0x6f, 0xba, 0x7b, 0xc4, 0x23, 0x61, 0x58, 0x0d, 0xfc, 0x4d, + 0x22, 0x04, 0x88, 0x67, 0xb3, 0x35, 0x74, 0xfe, 0x26, 0x59, 0x9c, 0xa6, 0x34, 0x6f, 0xe8, 0x75, + 0xb0, 0x49, 0x02, 0xdd, 0x82, 0x09, 0xfa, 0x62, 0x73, 0x63, 0xa2, 0xa3, 0xbd, 0x88, 0xb2, 0x77, + 0x15, 0x36, 0x2a, 0xe1, 0x04, 0x11, 0x74, 0x13, 0xc6, 0xc2, 0xc8, 0x09, 0xa2, 0x4e, 0x9b, 0x13, + 0x3d, 0xd3, 0x8b, 0x28, 0x53, 0xf0, 0xd6, 0xb4, 0x2a, 0xd8, 0x20, 0x80, 0x5e, 0x87, 0x52, 0xd3, + 0xdd, 0x22, 0xf5, 0xfd, 0x7a, 0x93, 0xcc, 0x8e, 0x31, 0x6a, 0x99, 0x87, 0xca, 0x0d, 0x89, 0xc4, + 0xf9, 0x5c, 0xf5, 0x17, 0xc7, 0xd5, 0xd1, 0x6d, 0x38, 0x13, 0x91, 0xa0, 0xe5, 0x7a, 0x0e, 0x3d, + 0x0c, 0xc4, 0xd3, 0x8a, 0x29, 0x4e, 0xc7, 0xd9, 0x6e, 0x3b, 0x2f, 0x66, 0xe3, 0xcc, 0x46, 0x26, + 0x16, 0xce, 0xa9, 0x8d, 0xee, 0xc1, 0x6c, 0x06, 0xc4, 0x6f, 0xba, 0xf5, 0xfd, 0xd9, 0x53, 0x8c, + 0xf2, 0x47, 0x04, 0xe5, 0xd9, 0x8d, 0x1c, 0xbc, 0xc3, 0x2e, 0x30, 0x9c, 0x4b, 0x1d, 0xdd, 0x84, + 0x49, 0x76, 0x02, 0x55, 0x3b, 0xcd, 0xa6, 0x68, 0x70, 0x82, 0x35, 0xf8, 0x7e, 0x79, 0x1f, 0xaf, + 0x9a, 0xe0, 0xc3, 0x83, 0x32, 0xc4, 0xff, 0x70, 0xb2, 0x36, 0xda, 0x64, 0x3a, 0xba, 0x4e, 0xe0, + 0x46, 0xfb, 0xf4, 0xdc, 0x20, 0xf7, 0xa2, 0xd9, 0xc9, 0xae, 0xf2, 0x0a, 0x1d, 0x55, 0x29, 0xf2, + 0xf4, 0x42, 0x9c, 0x24, 0x48, 0x8f, 0xd4, 0x30, 0x6a, 0xb8, 0xde, 0xec, 0x14, 0x7f, 0x97, 0xc8, + 0x13, 0xa9, 0x46, 0x0b, 0x31, 0x87, 0x31, 0xfd, 0x1c, 0xfd, 0x71, 0x93, 0xde, 0x5c, 0xd3, 0x0c, + 0x31, 0xd6, 0xcf, 0x49, 0x00, 0x8e, 0x71, 0x28, 0x33, 0x19, 0x45, 0xfb, 0xb3, 0x88, 0xa1, 0xaa, + 0x83, 0x65, 0x63, 0xe3, 0x13, 0x98, 0x96, 0xdb, 0x9b, 0x30, 0xa1, 0x0e, 0x42, 0x36, 0x26, 0xa8, + 0x0c, 0x83, 0x8c, 0x7d, 0x12, 0xd2, 0xb5, 0x12, 0xed, 0x02, 0x63, 0xad, 0x30, 0x2f, 0x67, 0x5d, + 0x70, 0xdf, 0x26, 0x8b, 0xfb, 0x11, 0xe1, 0x6f, 0xfa, 0xa2, 0xd6, 0x05, 0x09, 0xc0, 0x31, 0x8e, + 0xfd, 0xbf, 0x39, 0x1b, 0x1a, 0x9f, 0xb6, 0x7d, 0xdc, 0x2f, 0xcf, 0xc2, 0xc8, 0x8e, 0x1f, 0x46, + 0x14, 0x9b, 0xb5, 0x31, 0x18, 0x33, 0x9e, 0xd7, 0x44, 0x39, 0x56, 0x18, 0xe8, 0x55, 0x18, 0xaf, + 0xeb, 0x0d, 0x88, 0xcb, 0x51, 0x1d, 0x23, 0x46, 0xeb, 0xd8, 0xc4, 0x45, 0x2f, 0xc3, 0x08, 0xb3, + 0x39, 0xa9, 0xfb, 0x4d, 0xc1, 0xb5, 0xc9, 0x1b, 0x7e, 0xa4, 0x2a, 0xca, 0x0f, 0xb5, 0xdf, 0x58, + 0x61, 0xa3, 0x8b, 0x30, 0x44, 0xbb, 0xb0, 0x5a, 0x15, 0xd7, 0x92, 0x12, 0x14, 0x5d, 0x63, 0xa5, + 0x58, 0x40, 0xed, 0xff, 0xbf, 0xa0, 0x8d, 0x32, 0x7d, 0x0f, 0x13, 0x54, 0x85, 0xe1, 0xbb, 0x8e, + 0x1b, 0xb9, 0xde, 0xb6, 0xe0, 0x3f, 0x9e, 0xee, 0x7a, 0x47, 0xb1, 0x4a, 0x77, 0x78, 0x05, 0x7e, + 0x8b, 0x8a, 0x3f, 0x58, 0x92, 0xa1, 0x14, 0x83, 0x8e, 0xe7, 0x51, 0x8a, 0x85, 0x7e, 0x29, 0x62, + 0x5e, 0x81, 0x53, 0x14, 0x7f, 0xb0, 0x24, 0x83, 0xde, 0x04, 0x90, 0x3b, 0x8c, 0x34, 0x84, 0xad, + 0xc7, 0xb3, 0xbd, 0x89, 0x6e, 0xa8, 0x3a, 0x8b, 0x13, 0xf4, 0x8e, 0x8e, 0xff, 0x63, 0x8d, 0x9e, + 0x1d, 0x31, 0x3e, 0x2d, 0xdd, 0x19, 0xf4, 0x5d, 0x74, 0x89, 0x3b, 0x41, 0x44, 0x1a, 0x0b, 0x91, + 0x18, 0x9c, 0x0f, 0xf4, 0xf7, 0x48, 0xd9, 0x70, 0x5b, 0x44, 0xdf, 0x0e, 0x82, 0x08, 0x8e, 0xe9, + 0xd9, 0xbf, 0x58, 0x84, 0xd9, 0xbc, 0xee, 0xd2, 0x45, 0x47, 0xee, 0xb9, 0xd1, 0x12, 0x65, 0xaf, + 0x2c, 0x73, 0xd1, 0x2d, 0x8b, 0x72, 0xac, 0x30, 0xe8, 0xec, 0x87, 0xee, 0xb6, 0x7c, 0x63, 0x0e, + 0xc6, 0xb3, 0x5f, 0x63, 0xa5, 0x58, 0x40, 0x29, 0x5e, 0x40, 0x9c, 0x50, 0x18, 0x13, 0x69, 0xab, + 0x04, 0xb3, 0x52, 0x2c, 0xa0, 0xba, 0xb4, 0x6b, 0xa0, 0x87, 0xb4, 0xcb, 0x18, 0xa2, 0xc1, 0xe3, + 0x1d, 0x22, 0xf4, 0x69, 0x80, 0x2d, 0xd7, 0x73, 0xc3, 0x1d, 0x46, 0x7d, 0xe8, 0xc8, 0xd4, 0x15, + 0x73, 0xb6, 0xa2, 0xa8, 0x60, 0x8d, 0x22, 0x7a, 0x09, 0x46, 0xd5, 0x06, 0x5c, 0xad, 0x30, 0xcd, + 0xaa, 0x66, 0xa9, 0x12, 0x9f, 0x46, 0x15, 0xac, 0xe3, 0xd9, 0x9f, 0x4d, 0xae, 0x17, 0xb1, 0x03, + 0xb4, 0xf1, 0xb5, 0xfa, 0x1d, 0xdf, 0x42, 0xf7, 0xf1, 0xb5, 0xbf, 0x51, 0x84, 0x49, 0xa3, 0xb1, + 0x4e, 0xd8, 0xc7, 0x99, 0x75, 0x95, 0x1e, 0xe0, 0x4e, 0x44, 0xc4, 0xfe, 0xb3, 0x7b, 0x6f, 0x15, + 0xfd, 0x90, 0xa7, 0x3b, 0x80, 0xd7, 0x47, 0x9f, 0x86, 0x52, 0xd3, 0x09, 0x99, 0xe4, 0x8c, 0x88, + 0x7d, 0xd7, 0x0f, 0xb1, 0xf8, 0x61, 0xe2, 0x84, 0x91, 0x76, 0x6b, 0x72, 0xda, 0x31, 0x49, 0x7a, + 0xd3, 0x50, 0xfe, 0x44, 0x5a, 0xab, 0xa9, 0x4e, 0x50, 0x26, 0x66, 0x1f, 0x73, 0x18, 0x7a, 0x19, + 0xc6, 0x02, 0xc2, 0x56, 0xc5, 0x12, 0xe5, 0xe6, 0xd8, 0x32, 0x1b, 0x8c, 0xd9, 0x3e, 0xac, 0xc1, + 0xb0, 0x81, 0x19, 0xbf, 0x0d, 0x86, 0xba, 0xbc, 0x0d, 0x9e, 0x86, 0x61, 0xf6, 0x43, 0xad, 0x00, + 0x35, 0x1b, 0xab, 0xbc, 0x18, 0x4b, 0x78, 0x72, 0xc1, 0x8c, 0xf4, 0xb7, 0x60, 0xe8, 0xeb, 0x43, + 0x2c, 0x6a, 0xa6, 0xd5, 0x1e, 0xe1, 0xa7, 0x9c, 0x58, 0xf2, 0x58, 0xc2, 0xec, 0x0f, 0xc0, 0x44, + 0xc5, 0x21, 0x2d, 0xdf, 0x5b, 0xf6, 0x1a, 0x6d, 0xdf, 0xf5, 0x22, 0x34, 0x0b, 0x03, 0xec, 0x12, + 0xe1, 0x47, 0xc0, 0x00, 0x6d, 0x08, 0xb3, 0x12, 0x7b, 0x1b, 0x4e, 0x57, 0xfc, 0xbb, 0xde, 0x5d, + 0x27, 0x68, 0x2c, 0x54, 0x57, 0xb5, 0xf7, 0xf5, 0xba, 0x7c, 0xdf, 0x71, 0x23, 0xb1, 0xcc, 0xa3, + 0x57, 0xab, 0xc9, 0xd9, 0xda, 0x15, 0xb7, 0x49, 0x72, 0xa4, 0x20, 0x7f, 0xa9, 0x60, 0xb4, 0x14, + 0xe3, 0x2b, 0xad, 0x96, 0x95, 0xab, 0xd5, 0x7a, 0x03, 0x46, 0xb6, 0x5c, 0xd2, 0x6c, 0x60, 0xb2, + 0x25, 0x56, 0xe2, 0x53, 0xf9, 0x76, 0x2f, 0x2b, 0x14, 0x53, 0x4a, 0xbd, 0xf8, 0xeb, 0x70, 0x45, + 0x54, 0xc6, 0x8a, 0x0c, 0xda, 0x85, 0x29, 0xf9, 0x60, 0x90, 0x50, 0xb1, 0x2e, 0x9f, 0xee, 0xf6, + 0x0a, 0x31, 0x89, 0x9f, 0xba, 0x7f, 0x50, 0x9e, 0xc2, 0x09, 0x32, 0x38, 0x45, 0x98, 0x3e, 0x07, + 0x5b, 0xf4, 0x04, 0x1e, 0x60, 0xc3, 0xcf, 0x9e, 0x83, 0xec, 0x65, 0xcb, 0x4a, 0xed, 0x9f, 0xb0, + 0xe0, 0x91, 0xd4, 0xc8, 0x88, 0x17, 0xfe, 0x31, 0xcf, 0x42, 0xf2, 0xc5, 0x5d, 0xe8, 0xfd, 0xe2, + 0xb6, 0xff, 0xa6, 0x05, 0xa7, 0x96, 0x5b, 0xed, 0x68, 0xbf, 0xe2, 0x9a, 0x2a, 0xa8, 0x0f, 0xc3, + 0x50, 0x8b, 0x34, 0xdc, 0x4e, 0x4b, 0xcc, 0x5c, 0x59, 0x9e, 0x52, 0x6b, 0xac, 0xf4, 0xf0, 0xa0, + 0x3c, 0x5e, 0x8b, 0xfc, 0xc0, 0xd9, 0x26, 0xbc, 0x00, 0x0b, 0x74, 0x76, 0xd6, 0xbb, 0x6f, 0x93, + 0x1b, 0x6e, 0xcb, 0x95, 0x76, 0x4c, 0x5d, 0x65, 0x76, 0xf3, 0x72, 0x40, 0xe7, 0xdf, 0xe8, 0x38, + 0x5e, 0xe4, 0x46, 0xfb, 0x42, 0x7b, 0x24, 0x89, 0xe0, 0x98, 0x9e, 0xfd, 0x75, 0x0b, 0x26, 0xe5, + 0xba, 0x5f, 0x68, 0x34, 0x02, 0x12, 0x86, 0x68, 0x0e, 0x0a, 0x6e, 0x5b, 0xf4, 0x12, 0x44, 0x2f, + 0x0b, 0xab, 0x55, 0x5c, 0x70, 0xdb, 0x92, 0x2d, 0x63, 0x07, 0x61, 0xd1, 0x54, 0xa4, 0x5d, 0x13, + 0xe5, 0x58, 0x61, 0xa0, 0x4b, 0x30, 0xe2, 0xf9, 0x0d, 0x6e, 0x4b, 0xc6, 0xaf, 0x34, 0xb6, 0xc0, + 0xd6, 0x45, 0x19, 0x56, 0x50, 0x54, 0x85, 0x12, 0x37, 0xb3, 0x8a, 0x17, 0x6d, 0x5f, 0xc6, 0x5a, + 0xec, 0xcb, 0x36, 0x64, 0x4d, 0x1c, 0x13, 0xb1, 0x7f, 0xd5, 0x82, 0x31, 0xf9, 0x65, 0x7d, 0xf2, + 0x9c, 0x74, 0x6b, 0xc5, 0xfc, 0x66, 0xbc, 0xb5, 0x28, 0xcf, 0xc8, 0x20, 0x06, 0xab, 0x58, 0x3c, + 0x12, 0xab, 0x78, 0x05, 0x46, 0x9d, 0x76, 0xbb, 0x6a, 0xf2, 0x99, 0x6c, 0x29, 0x2d, 0xc4, 0xc5, + 0x58, 0xc7, 0xb1, 0x7f, 0xbc, 0x00, 0x13, 0xf2, 0x0b, 0x6a, 0x9d, 0xcd, 0x90, 0x44, 0x68, 0x03, + 0x4a, 0x0e, 0x9f, 0x25, 0x22, 0x17, 0xf9, 0x13, 0xd9, 0x72, 0x04, 0x63, 0x4a, 0xe3, 0x0b, 0x7f, + 0x41, 0xd6, 0xc6, 0x31, 0x21, 0xd4, 0x84, 0x69, 0xcf, 0x8f, 0xd8, 0xe1, 0xaf, 0xe0, 0xdd, 0x54, + 0x3b, 0x49, 0xea, 0x67, 0x05, 0xf5, 0xe9, 0xf5, 0x24, 0x15, 0x9c, 0x26, 0x8c, 0x96, 0xa5, 0x6c, + 0xa6, 0x98, 0x2f, 0x0c, 0xd0, 0x27, 0x2e, 0x5b, 0x34, 0x63, 0xff, 0x8a, 0x05, 0x25, 0x89, 0x76, + 0x12, 0x5a, 0xbc, 0x35, 0x18, 0x0e, 0xd9, 0x24, 0xc8, 0xa1, 0xb1, 0xbb, 0x75, 0x9c, 0xcf, 0x57, + 0x7c, 0xa7, 0xf1, 0xff, 0x21, 0x96, 0x34, 0x98, 0x68, 0x5e, 0x75, 0xff, 0x5d, 0x22, 0x9a, 0x57, + 0xfd, 0xc9, 0xb9, 0x94, 0xfe, 0x90, 0xf5, 0x59, 0x93, 0x75, 0x51, 0xd6, 0xab, 0x1d, 0x90, 0x2d, + 0xf7, 0x5e, 0x92, 0xf5, 0xaa, 0xb2, 0x52, 0x2c, 0xa0, 0xe8, 0x4d, 0x18, 0xab, 0x4b, 0x99, 0x6c, + 0xbc, 0xc3, 0x2f, 0x76, 0xd5, 0x0f, 0x28, 0x55, 0x12, 0x97, 0x85, 0x2c, 0x69, 0xf5, 0xb1, 0x41, + 0xcd, 0x34, 0x23, 0x28, 0xf6, 0x32, 0x23, 0x88, 0xe9, 0xe6, 0x2b, 0xd5, 0x7f, 0xd2, 0x82, 0x21, + 0x2e, 0x8b, 0xeb, 0x4f, 0x14, 0xaa, 0x69, 0xd6, 0xe2, 0xb1, 0xbb, 0x4d, 0x0b, 0x85, 0xa6, 0x0c, + 0xad, 0x41, 0x89, 0xfd, 0x60, 0xb2, 0xc4, 0x62, 0xbe, 0x95, 0x3f, 0x6f, 0x55, 0xef, 0xe0, 0x6d, + 0x59, 0x0d, 0xc7, 0x14, 0xec, 0x1f, 0x2b, 0xd2, 0xd3, 0x2d, 0x46, 0x35, 0x2e, 0x7d, 0xeb, 0xe1, + 0x5d, 0xfa, 0x85, 0x87, 0x75, 0xe9, 0x6f, 0xc3, 0x64, 0x5d, 0xd3, 0xc3, 0xc5, 0x33, 0x79, 0xa9, + 0xeb, 0x22, 0xd1, 0x54, 0x76, 0x5c, 0xca, 0xb2, 0x64, 0x12, 0xc1, 0x49, 0xaa, 0xe8, 0xbb, 0x60, + 0x8c, 0xcf, 0xb3, 0x68, 0x85, 0x5b, 0x62, 0xbc, 0x3f, 0x7f, 0xbd, 0xe8, 0x4d, 0x70, 0xa9, 0x9c, + 0x56, 0x1d, 0x1b, 0xc4, 0xec, 0x3f, 0xb1, 0x00, 0x2d, 0xb7, 0x77, 0x48, 0x8b, 0x04, 0x4e, 0x33, + 0x16, 0xa7, 0xff, 0xb0, 0x05, 0xb3, 0x24, 0x55, 0xbc, 0xe4, 0xb7, 0x5a, 0xe2, 0xd1, 0x92, 0xf3, + 0xae, 0x5e, 0xce, 0xa9, 0xa3, 0xdc, 0x20, 0x66, 0xf3, 0x30, 0x70, 0x6e, 0x7b, 0x68, 0x0d, 0x66, + 0xf8, 0x2d, 0xa9, 0x00, 0x9a, 0xad, 0xf7, 0xa3, 0x82, 0xf0, 0xcc, 0x46, 0x1a, 0x05, 0x67, 0xd5, + 0xb3, 0xbf, 0x6f, 0x0c, 0x72, 0x7b, 0xf1, 0x9e, 0x1e, 0xe1, 0x3d, 0x3d, 0xc2, 0x7b, 0x7a, 0x84, + 0xf7, 0xf4, 0x08, 0xef, 0xe9, 0x11, 0xbe, 0xed, 0xf5, 0x08, 0x7f, 0xc1, 0x82, 0xd3, 0xea, 0x1a, + 0x30, 0x1e, 0xbe, 0x9f, 0x83, 0x19, 0xbe, 0xdd, 0x96, 0x9a, 0x8e, 0xdb, 0xda, 0x20, 0xad, 0x76, + 0xd3, 0x89, 0xa4, 0xd6, 0xfd, 0x4a, 0xe6, 0xca, 0x4d, 0x58, 0xac, 0x1a, 0x15, 0xb9, 0xe9, 0x7f, + 0x06, 0x00, 0x67, 0x35, 0x63, 0xff, 0xe2, 0x08, 0x0c, 0x2e, 0xef, 0x11, 0x2f, 0x3a, 0x81, 0x27, + 0x42, 0x1d, 0x26, 0x5c, 0x6f, 0xcf, 0x6f, 0xee, 0x91, 0x06, 0x87, 0x1f, 0xe5, 0x25, 0x7b, 0x46, + 0x90, 0x9e, 0x58, 0x35, 0x48, 0xe0, 0x04, 0xc9, 0x87, 0x21, 0x4d, 0xbe, 0x0a, 0x43, 0xfc, 0x10, + 0x17, 0xa2, 0xe4, 0xcc, 0x33, 0x9b, 0x0d, 0xa2, 0xb8, 0x9a, 0x62, 0x49, 0x37, 0xbf, 0x24, 0x44, + 0x75, 0xf4, 0x59, 0x98, 0xd8, 0x72, 0x83, 0x30, 0xda, 0x70, 0x5b, 0x24, 0x8c, 0x9c, 0x56, 0xfb, + 0x01, 0xa4, 0xc7, 0x6a, 0x1c, 0x56, 0x0c, 0x4a, 0x38, 0x41, 0x19, 0x6d, 0xc3, 0x78, 0xd3, 0xd1, + 0x9b, 0x1a, 0x3e, 0x72, 0x53, 0xea, 0x76, 0xb8, 0xa1, 0x13, 0xc2, 0x26, 0x5d, 0xba, 0x9d, 0xea, + 0x4c, 0x00, 0x3a, 0xc2, 0xc4, 0x02, 0x6a, 0x3b, 0x71, 0xc9, 0x27, 0x87, 0x51, 0x46, 0x87, 0x19, + 0xc8, 0x96, 0x4c, 0x46, 0x47, 0x33, 0x83, 0xfd, 0x0c, 0x94, 0x08, 0x1d, 0x42, 0x4a, 0x58, 0x5c, + 0x30, 0x97, 0xfb, 0xeb, 0xeb, 0x9a, 0x5b, 0x0f, 0x7c, 0x53, 0x6e, 0xbf, 0x2c, 0x29, 0xe1, 0x98, + 0x28, 0x5a, 0x82, 0xa1, 0x90, 0x04, 0x2e, 0x09, 0xc5, 0x55, 0xd3, 0x65, 0x1a, 0x19, 0x1a, 0xf7, + 0x2d, 0xe1, 0xbf, 0xb1, 0xa8, 0x4a, 0x97, 0x97, 0xc3, 0x44, 0x9a, 0xec, 0x32, 0xd0, 0x96, 0xd7, + 0x02, 0x2b, 0xc5, 0x02, 0x8a, 0x5e, 0x87, 0xe1, 0x80, 0x34, 0x99, 0x62, 0x68, 0xbc, 0xff, 0x45, + 0xce, 0xf5, 0x4c, 0xbc, 0x1e, 0x96, 0x04, 0xd0, 0x75, 0x40, 0x01, 0xa1, 0x8c, 0x92, 0xeb, 0x6d, + 0x2b, 0xb3, 0x51, 0x71, 0xd0, 0x2a, 0x86, 0x14, 0xc7, 0x18, 0xd2, 0xad, 0x08, 0x67, 0x54, 0x43, + 0x57, 0x61, 0x5a, 0x95, 0xae, 0x7a, 0x61, 0xe4, 0xd0, 0x03, 0x6e, 0x92, 0xd1, 0x52, 0x72, 0x0a, + 0x9c, 0x44, 0xc0, 0xe9, 0x3a, 0xf6, 0x97, 0x2d, 0xe0, 0xe3, 0x7c, 0x02, 0xaf, 0xf3, 0xd7, 0xcc, + 0xd7, 0xf9, 0xd9, 0xdc, 0x99, 0xcb, 0x79, 0x99, 0x7f, 0xd9, 0x82, 0x51, 0x6d, 0x66, 0xe3, 0x35, + 0x6b, 0x75, 0x59, 0xb3, 0x1d, 0x98, 0xa2, 0x2b, 0xfd, 0xe6, 0x66, 0x48, 0x82, 0x3d, 0xd2, 0x60, + 0x0b, 0xb3, 0xf0, 0x60, 0x0b, 0x53, 0x99, 0xa8, 0xdd, 0x48, 0x10, 0xc4, 0xa9, 0x26, 0xec, 0xcf, + 0xc8, 0xae, 0x2a, 0x8b, 0xbe, 0xba, 0x9a, 0xf3, 0x84, 0x45, 0x9f, 0x9a, 0x55, 0x1c, 0xe3, 0xd0, + 0xad, 0xb6, 0xe3, 0x87, 0x51, 0xd2, 0xa2, 0xef, 0x9a, 0x1f, 0x46, 0x98, 0x41, 0xec, 0x17, 0x00, + 0x96, 0xef, 0x91, 0x3a, 0x5f, 0xb1, 0xfa, 0xe3, 0xc1, 0xca, 0x7f, 0x3c, 0xd8, 0xbf, 0x65, 0xc1, + 0xc4, 0xca, 0x92, 0x71, 0x73, 0xcd, 0x03, 0xf0, 0x17, 0xcf, 0x9d, 0x3b, 0xeb, 0x52, 0x1d, 0xce, + 0x35, 0x9a, 0xaa, 0x14, 0x6b, 0x18, 0xe8, 0x2c, 0x14, 0x9b, 0x1d, 0x4f, 0x88, 0x0f, 0x87, 0xe9, + 0xf5, 0x78, 0xa3, 0xe3, 0x61, 0x5a, 0xa6, 0xb9, 0x14, 0x14, 0xfb, 0x76, 0x29, 0xe8, 0x19, 0x4a, + 0x00, 0x95, 0x61, 0xf0, 0xee, 0x5d, 0xb7, 0xc1, 0x1d, 0x36, 0x85, 0xaa, 0xfe, 0xce, 0x9d, 0xd5, + 0x4a, 0x88, 0x79, 0xb9, 0xfd, 0xc5, 0x22, 0xcc, 0xad, 0x34, 0xc9, 0xbd, 0x77, 0xe8, 0xb4, 0xda, + 0xaf, 0x43, 0xc4, 0xd1, 0x04, 0x31, 0x47, 0x75, 0x7a, 0xe9, 0x3d, 0x1e, 0x5b, 0x30, 0xcc, 0x0d, + 0xda, 0xa4, 0x0b, 0xeb, 0xab, 0x59, 0xad, 0xe7, 0x0f, 0xc8, 0x3c, 0x37, 0x8c, 0x13, 0x1e, 0x71, + 0xea, 0xc2, 0x14, 0xa5, 0x58, 0x12, 0x9f, 0x7b, 0x05, 0xc6, 0x74, 0xcc, 0x23, 0xb9, 0x9f, 0xfd, + 0x3f, 0x45, 0x98, 0xa2, 0x3d, 0x78, 0xa8, 0x13, 0x71, 0x2b, 0x3d, 0x11, 0xc7, 0xed, 0x82, 0xd4, + 0x7b, 0x36, 0xde, 0x4c, 0xce, 0xc6, 0x95, 0xbc, 0xd9, 0x38, 0xe9, 0x39, 0xf8, 0x5e, 0x0b, 0x66, + 0x56, 0x9a, 0x7e, 0x7d, 0x37, 0xe1, 0x26, 0xf4, 0x12, 0x8c, 0xd2, 0xe3, 0x38, 0x34, 0x3c, 0xe6, + 0x8d, 0x18, 0x0a, 0x02, 0x84, 0x75, 0x3c, 0xad, 0xda, 0xad, 0x5b, 0xab, 0x95, 0xac, 0xd0, 0x0b, + 0x02, 0x84, 0x75, 0x3c, 0xfb, 0x37, 0x2c, 0x38, 0x77, 0x75, 0x69, 0x39, 0x5e, 0x8a, 0xa9, 0xe8, + 0x0f, 0x17, 0x61, 0xa8, 0xdd, 0xd0, 0xba, 0x12, 0x8b, 0x57, 0x2b, 0xac, 0x17, 0x02, 0xfa, 0x6e, + 0x89, 0x6c, 0x72, 0x0b, 0xe0, 0x2a, 0xae, 0x2e, 0x89, 0x73, 0x57, 0x6a, 0x53, 0xac, 0x5c, 0x6d, + 0xca, 0xfb, 0x61, 0x98, 0xde, 0x0b, 0x6e, 0x5d, 0xf6, 0x9b, 0x2b, 0x68, 0x79, 0x11, 0x96, 0x30, + 0xfb, 0x67, 0x2d, 0x98, 0xb9, 0xea, 0x46, 0xf4, 0xd2, 0x4e, 0x86, 0x37, 0xa0, 0xb7, 0x76, 0xe8, + 0x46, 0x7e, 0xb0, 0x9f, 0x0c, 0x6f, 0x80, 0x15, 0x04, 0x6b, 0x58, 0xfc, 0x83, 0xf6, 0x5c, 0x66, + 0xa1, 0x5d, 0x30, 0xf5, 0x57, 0x58, 0x94, 0x63, 0x85, 0x41, 0xc7, 0xab, 0xe1, 0x06, 0x4c, 0xf4, + 0xb7, 0x2f, 0x0e, 0x6e, 0x35, 0x5e, 0x15, 0x09, 0xc0, 0x31, 0x8e, 0xfd, 0x47, 0x16, 0x94, 0xaf, + 0x36, 0x3b, 0x61, 0x44, 0x82, 0xad, 0x30, 0xe7, 0xd0, 0x7d, 0x01, 0x4a, 0x44, 0x0a, 0xda, 0x45, + 0xaf, 0x15, 0x23, 0xaa, 0x24, 0xf0, 0x3c, 0xca, 0x82, 0xc2, 0xeb, 0xc3, 0x97, 0xf1, 0x68, 0xce, + 0x68, 0x2b, 0x80, 0x88, 0xde, 0x96, 0x1e, 0x76, 0x82, 0xf9, 0xaf, 0x2f, 0xa7, 0xa0, 0x38, 0xa3, + 0x86, 0xfd, 0x13, 0x16, 0x9c, 0x56, 0x1f, 0xfc, 0xae, 0xfb, 0x4c, 0xfb, 0xab, 0x05, 0x18, 0xbf, + 0xb6, 0xb1, 0x51, 0xbd, 0x4a, 0x22, 0x6d, 0x55, 0x76, 0x57, 0x9f, 0x63, 0x4d, 0x0b, 0xd8, 0xed, + 0x8d, 0xd8, 0x89, 0xdc, 0xe6, 0x3c, 0x8f, 0x5e, 0x34, 0xbf, 0xea, 0x45, 0x37, 0x83, 0x5a, 0x14, + 0xb8, 0xde, 0x76, 0xe6, 0x4a, 0x97, 0x3c, 0x4b, 0x31, 0x8f, 0x67, 0x41, 0x2f, 0xc0, 0x10, 0x0b, + 0x9f, 0x24, 0x27, 0xe1, 0x51, 0xf5, 0xc4, 0x62, 0xa5, 0x87, 0x07, 0xe5, 0xd2, 0x2d, 0xbc, 0xca, + 0xff, 0x60, 0x81, 0x8a, 0x6e, 0xc1, 0xe8, 0x4e, 0x14, 0xb5, 0xaf, 0x11, 0xa7, 0x41, 0x02, 0x79, + 0xca, 0x9e, 0xcf, 0x3a, 0x65, 0xe9, 0x20, 0x70, 0xb4, 0xf8, 0x60, 0x8a, 0xcb, 0x42, 0xac, 0xd3, + 0xb1, 0x6b, 0x00, 0x31, 0xec, 0x98, 0x14, 0x20, 0xf6, 0x06, 0x94, 0xe8, 0xe7, 0x2e, 0x34, 0x5d, + 0xa7, 0xbb, 0x8a, 0xf9, 0x19, 0x28, 0x49, 0x05, 0x72, 0x28, 0x7c, 0xad, 0xd9, 0x8d, 0x24, 0xf5, + 0xcb, 0x21, 0x8e, 0xe1, 0xf6, 0x16, 0x9c, 0x62, 0xe6, 0x80, 0x4e, 0xb4, 0x63, 0xac, 0xbe, 0xde, + 0xd3, 0xfc, 0xac, 0x78, 0xb1, 0xf1, 0x3e, 0xcf, 0x6a, 0xee, 0x8c, 0x63, 0x92, 0x62, 0xfc, 0x7a, + 0xb3, 0xbf, 0x31, 0x00, 0x8f, 0xae, 0xd6, 0xf2, 0xc3, 0x7f, 0xbc, 0x0c, 0x63, 0x9c, 0x11, 0xa4, + 0x93, 0xee, 0x34, 0x45, 0xbb, 0x4a, 0xb6, 0xb9, 0xa1, 0xc1, 0xb0, 0x81, 0x89, 0xce, 0x41, 0xd1, + 0x7d, 0xcb, 0x4b, 0x3a, 0xfb, 0xac, 0xbe, 0xb1, 0x8e, 0x69, 0x39, 0x05, 0x53, 0x9e, 0x92, 0x1f, + 0xd6, 0x0a, 0xac, 0xf8, 0xca, 0xd7, 0x60, 0xc2, 0x0d, 0xeb, 0xa1, 0xbb, 0xea, 0xd1, 0x1d, 0xa8, + 0xed, 0x61, 0x25, 0x4d, 0xa0, 0x9d, 0x56, 0x50, 0x9c, 0xc0, 0xd6, 0x6e, 0x8e, 0xc1, 0xbe, 0xf9, + 0xd2, 0x9e, 0xce, 0xc7, 0xf4, 0x60, 0x6f, 0xb3, 0xaf, 0x0b, 0x99, 0x90, 0x5a, 0x1c, 0xec, 0xfc, + 0x83, 0x43, 0x2c, 0x61, 0xf4, 0xa9, 0x56, 0xdf, 0x71, 0xda, 0x0b, 0x9d, 0x68, 0xa7, 0xe2, 0x86, + 0x75, 0x7f, 0x8f, 0x04, 0xfb, 0xec, 0x95, 0x3d, 0x12, 0x3f, 0xd5, 0x14, 0x60, 0xe9, 0xda, 0x42, + 0x95, 0x62, 0xe2, 0x74, 0x1d, 0xb4, 0x00, 0x93, 0xb2, 0xb0, 0x46, 0x42, 0x76, 0xb8, 0x8f, 0x32, + 0x32, 0xca, 0xfd, 0x46, 0x14, 0x2b, 0x22, 0x49, 0x7c, 0x93, 0x75, 0x85, 0xe3, 0x60, 0x5d, 0x3f, + 0x0c, 0xe3, 0xae, 0xe7, 0x46, 0xae, 0x13, 0xf9, 0x5c, 0xc3, 0xc2, 0x1f, 0xd4, 0x4c, 0x74, 0xbc, + 0xaa, 0x03, 0xb0, 0x89, 0x67, 0xff, 0x87, 0x01, 0x98, 0x66, 0xd3, 0xf6, 0xde, 0x0a, 0xfb, 0x76, + 0x5a, 0x61, 0xb7, 0xd2, 0x2b, 0xec, 0x38, 0x78, 0xf2, 0x07, 0x5e, 0x66, 0x9f, 0x85, 0x92, 0xf2, + 0x38, 0x92, 0x2e, 0x87, 0x56, 0x8e, 0xcb, 0x61, 0xef, 0x7b, 0x59, 0x1a, 0x6d, 0x15, 0x33, 0x8d, + 0xb6, 0xbe, 0x62, 0x41, 0xac, 0x32, 0x40, 0x6f, 0x40, 0xa9, 0xed, 0x33, 0x5b, 0xc4, 0x40, 0x1a, + 0xf8, 0x3e, 0xd9, 0x55, 0xe7, 0xc0, 0x23, 0x20, 0x05, 0x7c, 0x14, 0xaa, 0xb2, 0x2a, 0x8e, 0xa9, + 0xa0, 0xeb, 0x30, 0xdc, 0x0e, 0x48, 0x2d, 0x62, 0xe1, 0x39, 0xfa, 0x27, 0xc8, 0x57, 0x0d, 0xaf, + 0x88, 0x25, 0x05, 0xfb, 0x3f, 0x5a, 0x30, 0x95, 0x44, 0x45, 0x1f, 0x81, 0x01, 0x72, 0x8f, 0xd4, + 0x45, 0x7f, 0x33, 0x2f, 0xd9, 0x58, 0xe8, 0xc0, 0x07, 0x80, 0xfe, 0xc7, 0xac, 0x16, 0xba, 0x06, + 0xc3, 0xf4, 0x86, 0xbd, 0xaa, 0x42, 0x51, 0x3d, 0x9e, 0x77, 0x4b, 0x2b, 0x56, 0x85, 0x77, 0x4e, + 0x14, 0x61, 0x59, 0x9d, 0x59, 0x4a, 0xd5, 0xdb, 0x35, 0xfa, 0x78, 0x89, 0xba, 0xbd, 0xb1, 0x37, + 0x96, 0xaa, 0x1c, 0x49, 0x50, 0xe3, 0x96, 0x52, 0xb2, 0x10, 0xc7, 0x44, 0xec, 0x9f, 0xb7, 0x00, + 0xb8, 0x61, 0x98, 0xe3, 0x6d, 0x93, 0x13, 0x90, 0x93, 0x57, 0x60, 0x20, 0x6c, 0x93, 0x7a, 0x37, + 0x33, 0xd9, 0xb8, 0x3f, 0xb5, 0x36, 0xa9, 0xc7, 0x2b, 0x8e, 0xfe, 0xc3, 0xac, 0xb6, 0xfd, 0xfd, + 0x00, 0x13, 0x31, 0xda, 0x6a, 0x44, 0x5a, 0xe8, 0x39, 0x23, 0x4c, 0xc1, 0xd9, 0x44, 0x98, 0x82, + 0x12, 0xc3, 0xd6, 0x44, 0xb2, 0x9f, 0x85, 0x62, 0xcb, 0xb9, 0x27, 0x64, 0x6e, 0xcf, 0x74, 0xef, + 0x06, 0xa5, 0x3f, 0xbf, 0xe6, 0xdc, 0xe3, 0xcf, 0xd2, 0x67, 0xe4, 0x0e, 0x59, 0x73, 0xee, 0x1d, + 0x72, 0x63, 0x58, 0x76, 0x4a, 0xdf, 0x70, 0xc3, 0xe8, 0xf3, 0xff, 0x3e, 0xfe, 0xcf, 0xf6, 0x1d, + 0x6d, 0x84, 0xb5, 0xe5, 0x7a, 0xc2, 0xe6, 0xa9, 0xaf, 0xb6, 0x5c, 0x2f, 0xd9, 0x96, 0xeb, 0xf5, + 0xd1, 0x96, 0xeb, 0xa1, 0xb7, 0x61, 0x58, 0x98, 0x24, 0x8a, 0xb0, 0x40, 0x97, 0xfb, 0x68, 0x4f, + 0x58, 0x34, 0xf2, 0x36, 0x2f, 0xcb, 0x67, 0xb7, 0x28, 0xed, 0xd9, 0xae, 0x6c, 0x10, 0xfd, 0x45, + 0x0b, 0x26, 0xc4, 0x6f, 0x4c, 0xde, 0xea, 0x90, 0x30, 0x12, 0x6c, 0xe9, 0x87, 0xfa, 0xef, 0x83, + 0xa8, 0xc8, 0xbb, 0xf2, 0x21, 0x79, 0xcf, 0x98, 0xc0, 0x9e, 0x3d, 0x4a, 0xf4, 0x02, 0xfd, 0x6d, + 0x0b, 0x4e, 0xb5, 0x9c, 0x7b, 0xbc, 0x45, 0x5e, 0x86, 0x9d, 0xc8, 0xf5, 0x85, 0x6a, 0xff, 0x23, + 0xfd, 0x4d, 0x7f, 0xaa, 0x3a, 0xef, 0xa4, 0xd4, 0x3f, 0x9e, 0xca, 0x42, 0xe9, 0xd9, 0xd5, 0xcc, + 0x7e, 0xcd, 0x6d, 0xc1, 0x88, 0x5c, 0x6f, 0x19, 0xc2, 0x8d, 0x8a, 0xce, 0x73, 0x1f, 0xd9, 0x22, + 0x54, 0x77, 0xff, 0xa7, 0xed, 0x88, 0xb5, 0xf6, 0x50, 0xdb, 0xf9, 0x2c, 0x8c, 0xe9, 0x6b, 0xec, + 0xa1, 0xb6, 0xf5, 0x16, 0xcc, 0x64, 0xac, 0xa5, 0x87, 0xda, 0xe4, 0x5d, 0x38, 0x9b, 0xbb, 0x3e, + 0x1e, 0x66, 0xc3, 0xf6, 0x57, 0x2d, 0xfd, 0x1c, 0x3c, 0x01, 0x65, 0xc5, 0x92, 0xa9, 0xac, 0x38, + 0xdf, 0x7d, 0xe7, 0xe4, 0x68, 0x2c, 0xde, 0xd4, 0x3b, 0x4d, 0x4f, 0x75, 0xf4, 0x3a, 0x0c, 0x35, + 0x69, 0x89, 0x34, 0x6c, 0xb5, 0x7b, 0xef, 0xc8, 0x98, 0x99, 0x64, 0xe5, 0x21, 0x16, 0x14, 0xec, + 0x5f, 0xb2, 0x60, 0xe0, 0x04, 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x5c, 0x2e, 0x69, 0x11, 0x21, 0x79, + 0x1e, 0x3b, 0x77, 0x97, 0xef, 0x45, 0xc4, 0x0b, 0xd9, 0x8d, 0x9c, 0x39, 0x30, 0x3f, 0x6d, 0xc1, + 0xcc, 0x0d, 0xdf, 0x69, 0x2c, 0x3a, 0x4d, 0xc7, 0xab, 0x93, 0x60, 0xd5, 0xdb, 0x3e, 0x92, 0x55, + 0x76, 0xa1, 0xa7, 0x55, 0xf6, 0x92, 0x34, 0x6a, 0x1a, 0xc8, 0x9f, 0x3f, 0xca, 0x49, 0x27, 0x03, + 0xb7, 0x18, 0xe6, 0xb7, 0x3b, 0x80, 0xf4, 0x5e, 0x0a, 0x1f, 0x19, 0x0c, 0xc3, 0x2e, 0xef, 0xaf, + 0x98, 0xc4, 0xa7, 0xb2, 0x39, 0xdc, 0xd4, 0xe7, 0x69, 0xde, 0x1f, 0xbc, 0x00, 0x4b, 0x42, 0xf6, + 0xcb, 0x90, 0xe9, 0x68, 0xdf, 0x5b, 0x2e, 0x61, 0x7f, 0x02, 0xa6, 0x59, 0xcd, 0x23, 0x4a, 0x06, + 0xec, 0x84, 0x34, 0x35, 0x23, 0x04, 0x9f, 0xfd, 0x05, 0x0b, 0x26, 0xd7, 0x13, 0x91, 0xc9, 0x2e, + 0x32, 0xfd, 0x6b, 0x86, 0x10, 0xbf, 0xc6, 0x4a, 0xb1, 0x80, 0x1e, 0xbb, 0x90, 0xeb, 0xcf, 0x2d, + 0x88, 0x63, 0x5f, 0x9c, 0x00, 0xfb, 0xb6, 0x64, 0xb0, 0x6f, 0x99, 0x8c, 0xac, 0xea, 0x4e, 0x1e, + 0xf7, 0x86, 0xae, 0xab, 0xa8, 0x50, 0x5d, 0x78, 0xd8, 0x98, 0x0c, 0x5f, 0x8a, 0x13, 0x66, 0xe8, + 0x28, 0x19, 0x27, 0xca, 0xfe, 0xed, 0x02, 0x20, 0x85, 0xdb, 0x77, 0xd4, 0xaa, 0x74, 0x8d, 0xe3, + 0x89, 0x5a, 0xb5, 0x07, 0x88, 0x59, 0x10, 0x04, 0x8e, 0x17, 0x72, 0xb2, 0xae, 0x10, 0xeb, 0x1d, + 0xcd, 0x3c, 0x61, 0x4e, 0x34, 0x89, 0x6e, 0xa4, 0xa8, 0xe1, 0x8c, 0x16, 0x34, 0xcb, 0x90, 0xc1, + 0x7e, 0x2d, 0x43, 0x86, 0x7a, 0xf8, 0xc1, 0xfd, 0x9c, 0x05, 0xe3, 0x6a, 0x98, 0xde, 0x25, 0x56, + 0xea, 0xaa, 0x3f, 0x39, 0x07, 0x68, 0x55, 0xeb, 0x32, 0xbb, 0x58, 0xbe, 0x93, 0xf9, 0x33, 0x3a, + 0x4d, 0xf7, 0x6d, 0xa2, 0x62, 0x06, 0x96, 0x85, 0x7f, 0xa2, 0x28, 0x3d, 0x3c, 0x28, 0x8f, 0xab, + 0x7f, 0x3c, 0x26, 0x72, 0x5c, 0x85, 0x1e, 0xc9, 0x93, 0x89, 0xa5, 0x88, 0x5e, 0x82, 0xc1, 0xf6, + 0x8e, 0x13, 0x92, 0x84, 0x37, 0xcf, 0x60, 0x95, 0x16, 0x1e, 0x1e, 0x94, 0x27, 0x54, 0x05, 0x56, + 0x82, 0x39, 0x76, 0xff, 0xb1, 0xc0, 0xd2, 0x8b, 0xb3, 0x67, 0x2c, 0xb0, 0x3f, 0xb1, 0x60, 0x60, + 0xdd, 0x6f, 0x9c, 0xc4, 0x11, 0xf0, 0x9a, 0x71, 0x04, 0x3c, 0x96, 0x17, 0xae, 0x3e, 0x77, 0xf7, + 0xaf, 0x24, 0x76, 0xff, 0xf9, 0x5c, 0x0a, 0xdd, 0x37, 0x7e, 0x0b, 0x46, 0x59, 0x10, 0x7c, 0xe1, + 0xb9, 0xf4, 0x82, 0xb1, 0xe1, 0xcb, 0x89, 0x0d, 0x3f, 0xa9, 0xa1, 0x6a, 0x3b, 0xfd, 0x69, 0x18, + 0x16, 0xae, 0x30, 0x49, 0xb7, 0x50, 0x81, 0x8b, 0x25, 0xdc, 0xfe, 0xc9, 0x22, 0x18, 0x41, 0xf7, + 0xd1, 0xaf, 0x58, 0x30, 0x1f, 0x70, 0x13, 0xd9, 0x46, 0xa5, 0x13, 0xb8, 0xde, 0x76, 0xad, 0xbe, + 0x43, 0x1a, 0x9d, 0xa6, 0xeb, 0x6d, 0xaf, 0x6e, 0x7b, 0xbe, 0x2a, 0x5e, 0xbe, 0x47, 0xea, 0x1d, + 0xa6, 0x76, 0xeb, 0x11, 0xe1, 0x5f, 0x99, 0x9a, 0x3f, 0x7f, 0xff, 0xa0, 0x3c, 0x8f, 0x8f, 0x44, + 0x1b, 0x1f, 0xb1, 0x2f, 0xe8, 0x37, 0x2c, 0xb8, 0xcc, 0x63, 0xd1, 0xf7, 0xdf, 0xff, 0x2e, 0xaf, + 0xe5, 0xaa, 0x24, 0x15, 0x13, 0xd9, 0x20, 0x41, 0x6b, 0xf1, 0xc3, 0x62, 0x40, 0x2f, 0x57, 0x8f, + 0xd6, 0x16, 0x3e, 0x6a, 0xe7, 0xec, 0x7f, 0x54, 0x84, 0x71, 0x11, 0x33, 0x4a, 0xdc, 0x01, 0x2f, + 0x19, 0x4b, 0xe2, 0xf1, 0xc4, 0x92, 0x98, 0x36, 0x90, 0x8f, 0xe7, 0xf8, 0x0f, 0x61, 0x9a, 0x1e, + 0xce, 0xd7, 0x88, 0x13, 0x44, 0x9b, 0xc4, 0xe1, 0x06, 0x5f, 0xc5, 0x23, 0x9f, 0xfe, 0x4a, 0x3e, + 0x79, 0x23, 0x49, 0x0c, 0xa7, 0xe9, 0x7f, 0x3b, 0xdd, 0x39, 0x1e, 0x4c, 0xa5, 0xc2, 0x7e, 0x7d, + 0x12, 0x4a, 0xca, 0x8f, 0x43, 0x1c, 0x3a, 0xdd, 0xa3, 0xe7, 0x25, 0x29, 0x70, 0xf1, 0x57, 0xec, + 0x43, 0x14, 0x93, 0xb3, 0xff, 0x4e, 0xc1, 0x68, 0x90, 0x4f, 0xe2, 0x3a, 0x8c, 0x38, 0x61, 0xe8, + 0x6e, 0x7b, 0xa4, 0xd1, 0x4d, 0x42, 0x99, 0x6a, 0x86, 0xf9, 0xd2, 0x2c, 0x88, 0x9a, 0x58, 0xd1, + 0x40, 0xd7, 0xb8, 0x59, 0xdd, 0x1e, 0xe9, 0x26, 0x9e, 0x4c, 0x51, 0x03, 0x69, 0x78, 0xb7, 0x47, + 0xb0, 0xa8, 0x8f, 0x3e, 0xc5, 0xed, 0x1e, 0xaf, 0x7b, 0xfe, 0x5d, 0xef, 0xaa, 0xef, 0xcb, 0xb8, + 0x0c, 0xfd, 0x11, 0x9c, 0x96, 0xd6, 0x8e, 0xaa, 0x3a, 0x36, 0xa9, 0xf5, 0x17, 0x47, 0xf3, 0x73, + 0xc0, 0x62, 0x6f, 0x9b, 0x6e, 0xd3, 0x21, 0x22, 0x30, 0x29, 0x02, 0x92, 0xc9, 0x32, 0x31, 0x76, + 0x99, 0x4f, 0x39, 0xb3, 0x76, 0x2c, 0x48, 0xbf, 0x6e, 0x92, 0xc0, 0x49, 0x9a, 0xf6, 0xcf, 0x58, + 0xc0, 0x5c, 0x48, 0x4f, 0x80, 0x1f, 0xf9, 0xa8, 0xc9, 0x8f, 0xcc, 0xe6, 0x0d, 0x72, 0x0e, 0x2b, + 0xf2, 0x22, 0x5f, 0x59, 0xd5, 0xc0, 0xbf, 0xb7, 0x2f, 0x8c, 0x55, 0x7a, 0xbf, 0x3f, 0xec, 0xff, + 0x69, 0xf1, 0x43, 0x4c, 0x79, 0x59, 0xa0, 0xef, 0x86, 0x91, 0xba, 0xd3, 0x76, 0xea, 0x3c, 0x43, + 0x4c, 0xae, 0x44, 0xcf, 0xa8, 0x34, 0xbf, 0x24, 0x6a, 0x70, 0x09, 0x95, 0x0c, 0x6c, 0x37, 0x22, + 0x8b, 0x7b, 0x4a, 0xa5, 0x54, 0x93, 0x73, 0xbb, 0x30, 0x6e, 0x10, 0x7b, 0xa8, 0xe2, 0x8c, 0xef, + 0xe6, 0x57, 0xac, 0x0a, 0xc4, 0xd8, 0x82, 0x69, 0x4f, 0xfb, 0x4f, 0x2f, 0x14, 0xf9, 0xb8, 0x7c, + 0xb2, 0xd7, 0x25, 0xca, 0x6e, 0x1f, 0xcd, 0x3b, 0x35, 0x41, 0x06, 0xa7, 0x29, 0xdb, 0x3f, 0x65, + 0xc1, 0x23, 0x3a, 0xa2, 0xe6, 0x00, 0xd3, 0x4b, 0x49, 0x52, 0x81, 0x11, 0xbf, 0x4d, 0x02, 0x27, + 0xf2, 0x03, 0x71, 0x6b, 0x5c, 0x92, 0x83, 0x7e, 0x53, 0x94, 0x1f, 0x8a, 0x78, 0xe7, 0x92, 0xba, + 0x2c, 0xc7, 0xaa, 0x26, 0x7d, 0x7d, 0xb2, 0xc1, 0x08, 0x85, 0xab, 0x13, 0x3b, 0x03, 0x98, 0x26, + 0x3d, 0xc4, 0x02, 0x62, 0x7f, 0xc3, 0xe2, 0x0b, 0x4b, 0xef, 0x3a, 0x7a, 0x0b, 0xa6, 0x5a, 0x4e, + 0x54, 0xdf, 0x59, 0xbe, 0xd7, 0x0e, 0xb8, 0xca, 0x49, 0x8e, 0xd3, 0x33, 0xbd, 0xc6, 0x49, 0xfb, + 0xc8, 0xd8, 0x94, 0x73, 0x2d, 0x41, 0x0c, 0xa7, 0xc8, 0xa3, 0x4d, 0x18, 0x65, 0x65, 0xcc, 0x8b, + 0x2f, 0xec, 0xc6, 0x1a, 0xe4, 0xb5, 0xa6, 0x8c, 0x11, 0xd6, 0x62, 0x3a, 0x58, 0x27, 0x6a, 0x7f, + 0xa5, 0xc8, 0x77, 0x3b, 0x63, 0xe5, 0x9f, 0x86, 0xe1, 0xb6, 0xdf, 0x58, 0x5a, 0xad, 0x60, 0x31, + 0x0b, 0xea, 0x1a, 0xa9, 0xf2, 0x62, 0x2c, 0xe1, 0xe8, 0x12, 0x8c, 0x88, 0x9f, 0x52, 0x45, 0xc8, + 0xce, 0x66, 0x81, 0x17, 0x62, 0x05, 0x45, 0xcf, 0x03, 0xb4, 0x03, 0x7f, 0xcf, 0x6d, 0xb0, 0xe8, + 0x12, 0x45, 0xd3, 0x8e, 0xa8, 0xaa, 0x20, 0x58, 0xc3, 0x42, 0xaf, 0xc2, 0x78, 0xc7, 0x0b, 0x39, + 0x3b, 0xa2, 0xc5, 0x92, 0x55, 0x16, 0x2e, 0xb7, 0x74, 0x20, 0x36, 0x71, 0xd1, 0x02, 0x0c, 0x45, + 0x0e, 0xb3, 0x8b, 0x19, 0xcc, 0x37, 0xf7, 0xdd, 0xa0, 0x18, 0x7a, 0x32, 0x12, 0x5a, 0x01, 0x8b, + 0x8a, 0xe8, 0x93, 0xd2, 0xa1, 0x96, 0x1f, 0xec, 0xc2, 0xce, 0xbe, 0xbf, 0x4b, 0x40, 0x73, 0xa7, + 0x15, 0xf6, 0xfb, 0x06, 0x2d, 0xf4, 0x0a, 0x00, 0xb9, 0x17, 0x91, 0xc0, 0x73, 0x9a, 0xca, 0x9a, + 0x4d, 0xf1, 0x05, 0x15, 0x7f, 0xdd, 0x8f, 0x6e, 0x85, 0x64, 0x59, 0x61, 0x60, 0x0d, 0xdb, 0xfe, + 0x8d, 0x12, 0x40, 0xcc, 0xb7, 0xa3, 0xb7, 0x53, 0x07, 0xd7, 0xb3, 0xdd, 0x39, 0xfd, 0xe3, 0x3b, + 0xb5, 0xd0, 0x0f, 0x58, 0x30, 0xea, 0x34, 0x9b, 0x7e, 0xdd, 0xe1, 0xd1, 0x7e, 0x0b, 0xdd, 0x0f, + 0x4e, 0xd1, 0xfe, 0x42, 0x5c, 0x83, 0x77, 0xe1, 0x05, 0xb9, 0x42, 0x35, 0x48, 0xcf, 0x5e, 0xe8, + 0x0d, 0xa3, 0x0f, 0xca, 0xa7, 0x62, 0xd1, 0x18, 0x4a, 0xf5, 0x54, 0x2c, 0xb1, 0x3b, 0x42, 0x7f, + 0x25, 0xde, 0x32, 0x5e, 0x89, 0x03, 0xf9, 0x1e, 0x83, 0x06, 0xfb, 0xda, 0xeb, 0x81, 0x88, 0xaa, + 0x7a, 0xf4, 0x80, 0xc1, 0x7c, 0xf7, 0x3c, 0xed, 0x9d, 0xd4, 0x23, 0x72, 0xc0, 0x67, 0x61, 0xb2, + 0x61, 0x32, 0x01, 0x62, 0x25, 0x3e, 0x95, 0x47, 0x37, 0xc1, 0x33, 0xc4, 0xd7, 0x7e, 0x02, 0x80, + 0x93, 0x84, 0x51, 0x95, 0x07, 0x93, 0x58, 0xf5, 0xb6, 0x7c, 0xe1, 0xeb, 0x61, 0xe7, 0xce, 0xe5, + 0x7e, 0x18, 0x91, 0x16, 0xc5, 0x8c, 0x6f, 0xf7, 0x75, 0x51, 0x17, 0x2b, 0x2a, 0xe8, 0x75, 0x18, + 0x62, 0xfe, 0x59, 0xe1, 0xec, 0x48, 0xbe, 0xc4, 0xd9, 0x8c, 0x8e, 0x16, 0x6f, 0x48, 0xf6, 0x37, + 0xc4, 0x82, 0x02, 0xba, 0x26, 0xbd, 0x1f, 0xc3, 0x55, 0xef, 0x56, 0x48, 0x98, 0xf7, 0x63, 0x69, + 0xf1, 0xc9, 0xd8, 0xb1, 0x91, 0x97, 0x67, 0xa6, 0x2c, 0x33, 0x6a, 0x52, 0x2e, 0x4a, 0xfc, 0x97, + 0x99, 0xd0, 0x66, 0x21, 0xbf, 0x7b, 0x66, 0xb6, 0xb4, 0x78, 0x38, 0x6f, 0x9b, 0x24, 0x70, 0x92, + 0x26, 0xe5, 0x48, 0xf9, 0xae, 0x17, 0xde, 0x22, 0xbd, 0xce, 0x0e, 0xfe, 0x10, 0x67, 0xb7, 0x11, + 0x2f, 0xc1, 0xa2, 0xfe, 0x89, 0xb2, 0x07, 0x73, 0x1e, 0x4c, 0x25, 0xb7, 0xe8, 0x43, 0x65, 0x47, + 0xfe, 0x60, 0x00, 0x26, 0xcc, 0x25, 0x85, 0x2e, 0x43, 0x49, 0x10, 0x51, 0xd9, 0x04, 0xd4, 0x2e, + 0x59, 0x93, 0x00, 0x1c, 0xe3, 0xb0, 0x24, 0x12, 0xac, 0xba, 0x66, 0x1e, 0x1c, 0x27, 0x91, 0x50, + 0x10, 0xac, 0x61, 0xd1, 0x87, 0xd5, 0xa6, 0xef, 0x47, 0xea, 0x42, 0x52, 0xeb, 0x6e, 0x91, 0x95, + 0x62, 0x01, 0xa5, 0x17, 0xd1, 0x2e, 0x09, 0x3c, 0xd2, 0x34, 0xe3, 0x0e, 0xab, 0x8b, 0xe8, 0xba, + 0x0e, 0xc4, 0x26, 0x2e, 0xbd, 0x4e, 0xfd, 0x90, 0x2d, 0x64, 0xf1, 0x7c, 0x8b, 0xcd, 0xad, 0x6b, + 0xdc, 0x01, 0x5b, 0xc2, 0xd1, 0x27, 0xe0, 0x11, 0x15, 0x5b, 0x09, 0x73, 0x6d, 0x86, 0x6c, 0x71, + 0xc8, 0x90, 0xb6, 0x3c, 0xb2, 0x94, 0x8d, 0x86, 0xf3, 0xea, 0xa3, 0xd7, 0x60, 0x42, 0xb0, 0xf8, + 0x92, 0xe2, 0xb0, 0x69, 0x61, 0x74, 0xdd, 0x80, 0xe2, 0x04, 0xb6, 0x8c, 0x9c, 0xcc, 0xb8, 0x6c, + 0x49, 0x61, 0x24, 0x1d, 0x39, 0x59, 0x87, 0xe3, 0x54, 0x0d, 0xb4, 0x00, 0x93, 0x9c, 0x07, 0x73, + 0xbd, 0x6d, 0x3e, 0x27, 0xc2, 0x99, 0x4b, 0x6d, 0xa9, 0x9b, 0x26, 0x18, 0x27, 0xf1, 0xd1, 0xcb, + 0x30, 0xe6, 0x04, 0xf5, 0x1d, 0x37, 0x22, 0xf5, 0xa8, 0x13, 0x70, 0x2f, 0x2f, 0xcd, 0x44, 0x6b, + 0x41, 0x83, 0x61, 0x03, 0xd3, 0x7e, 0x1b, 0x66, 0x32, 0x22, 0x33, 0xd0, 0x85, 0xe3, 0xb4, 0x5d, + 0xf9, 0x4d, 0x09, 0x0b, 0xe7, 0x85, 0xea, 0xaa, 0xfc, 0x1a, 0x0d, 0x8b, 0xae, 0x4e, 0x16, 0xc1, + 0x41, 0x4b, 0x7c, 0xa8, 0x56, 0xe7, 0x8a, 0x04, 0xe0, 0x18, 0xc7, 0xfe, 0x2f, 0x05, 0x98, 0xcc, + 0xd0, 0xad, 0xb0, 0xe4, 0x7b, 0x89, 0x47, 0x4a, 0x9c, 0x6b, 0xcf, 0x0c, 0xc4, 0x5d, 0x38, 0x42, + 0x20, 0xee, 0x62, 0xaf, 0x40, 0xdc, 0x03, 0xef, 0x24, 0x10, 0xb7, 0x39, 0x62, 0x83, 0x7d, 0x8d, + 0x58, 0x46, 0xf0, 0xee, 0xa1, 0x23, 0x06, 0xef, 0x36, 0x06, 0x7d, 0xb8, 0x8f, 0x41, 0xff, 0xb1, + 0x02, 0x4c, 0x25, 0x4d, 0x49, 0x4f, 0x40, 0x6e, 0xfb, 0xba, 0x21, 0xb7, 0xbd, 0xd4, 0x8f, 0xf3, + 0x6d, 0xae, 0x0c, 0x17, 0x27, 0x64, 0xb8, 0x1f, 0xe8, 0x8b, 0x5a, 0x77, 0x79, 0xee, 0x5f, 0x2d, + 0xc0, 0xe9, 0x4c, 0xef, 0xdf, 0x13, 0x18, 0x9b, 0x9b, 0xc6, 0xd8, 0x3c, 0xd7, 0xb7, 0x63, 0x72, + 0xee, 0x00, 0xdd, 0x49, 0x0c, 0xd0, 0xe5, 0xfe, 0x49, 0x76, 0x1f, 0xa5, 0xaf, 0x17, 0xe1, 0x7c, + 0x66, 0xbd, 0x58, 0xec, 0xb9, 0x62, 0x88, 0x3d, 0x9f, 0x4f, 0x88, 0x3d, 0xed, 0xee, 0xb5, 0x8f, + 0x47, 0x0e, 0x2a, 0x1c, 0x74, 0x59, 0x98, 0x81, 0x07, 0x94, 0x81, 0x1a, 0x0e, 0xba, 0x8a, 0x10, + 0x36, 0xe9, 0x7e, 0x3b, 0xc9, 0x3e, 0xff, 0xa5, 0x05, 0x67, 0x33, 0xe7, 0xe6, 0x04, 0x64, 0x5d, + 0xeb, 0xa6, 0xac, 0xeb, 0xe9, 0xbe, 0x57, 0x6b, 0x8e, 0xf0, 0xeb, 0x2b, 0x83, 0x39, 0xdf, 0xc2, + 0x5e, 0xf2, 0x37, 0x61, 0xd4, 0xa9, 0xd7, 0x49, 0x18, 0xae, 0xf9, 0x0d, 0x15, 0x6b, 0xf8, 0x39, + 0xf6, 0xce, 0x8a, 0x8b, 0x0f, 0x0f, 0xca, 0x73, 0x49, 0x12, 0x31, 0x18, 0xeb, 0x14, 0xd0, 0xa7, + 0x60, 0x24, 0x14, 0xf7, 0xa6, 0x98, 0xfb, 0x17, 0xfa, 0x1c, 0x1c, 0x67, 0x93, 0x34, 0xcd, 0x60, + 0x48, 0x4a, 0x52, 0xa1, 0x48, 0x9a, 0x81, 0x53, 0x0a, 0xc7, 0x1a, 0x38, 0xe5, 0x79, 0x80, 0x3d, + 0xf5, 0x18, 0x48, 0xca, 0x1f, 0xb4, 0x67, 0x82, 0x86, 0x85, 0x3e, 0x06, 0x53, 0x21, 0x8f, 0x16, + 0xb8, 0xd4, 0x74, 0x42, 0xe6, 0x47, 0x23, 0x56, 0x21, 0x0b, 0xb8, 0x54, 0x4b, 0xc0, 0x70, 0x0a, + 0x1b, 0xad, 0xc8, 0x56, 0x59, 0x68, 0x43, 0xbe, 0x30, 0x2f, 0xc6, 0x2d, 0x8a, 0xd4, 0xbf, 0xa7, + 0x92, 0xc3, 0xcf, 0x06, 0x5e, 0xab, 0x89, 0x3e, 0x05, 0x40, 0x97, 0x8f, 0x90, 0x43, 0x0c, 0xe7, + 0x1f, 0x9e, 0xf4, 0x54, 0x69, 0x64, 0x1a, 0x37, 0x33, 0x9f, 0xda, 0x8a, 0x22, 0x82, 0x35, 0x82, + 0x68, 0x0b, 0xc6, 0xe3, 0x7f, 0x71, 0x66, 0xcc, 0x23, 0xb6, 0xc0, 0xe4, 0xde, 0x15, 0x9d, 0x0e, + 0x36, 0xc9, 0xda, 0x3f, 0x31, 0x0c, 0x8f, 0x76, 0x39, 0x8b, 0xd1, 0x82, 0xa9, 0xef, 0x7d, 0x26, + 0xf9, 0x88, 0x9f, 0xcb, 0xac, 0x6c, 0xbc, 0xea, 0x13, 0x4b, 0xbe, 0xf0, 0x8e, 0x97, 0xfc, 0x8f, + 0x58, 0x9a, 0x78, 0x85, 0x5b, 0x96, 0x7e, 0xf4, 0x88, 0x77, 0xcc, 0x31, 0xca, 0x5b, 0xb6, 0x32, + 0x84, 0x16, 0xcf, 0xf7, 0xdd, 0x9d, 0xfe, 0xa5, 0x18, 0x5f, 0xb5, 0x00, 0x09, 0xf1, 0x0a, 0x69, + 0xa8, 0x0d, 0x25, 0xe4, 0x19, 0x57, 0x8f, 0xfa, 0xfd, 0x0b, 0x29, 0x4a, 0x7c, 0x24, 0x5e, 0x91, + 0x97, 0x41, 0x1a, 0xa1, 0xe7, 0x98, 0x64, 0x74, 0x0f, 0x7d, 0x82, 0x45, 0xd3, 0x75, 0xdf, 0x16, + 0x1c, 0x90, 0xd8, 0x70, 0x2f, 0x89, 0x48, 0xba, 0xaa, 0x9c, 0xb2, 0xba, 0x99, 0xdd, 0xd5, 0x91, + 0xb0, 0x41, 0xea, 0x64, 0xdf, 0xdf, 0x1d, 0x78, 0x24, 0x67, 0xc8, 0x1e, 0xea, 0x33, 0xfc, 0xb7, + 0x2c, 0x38, 0xd7, 0x35, 0x2c, 0xcc, 0xb7, 0x20, 0x83, 0x68, 0x7f, 0xde, 0x82, 0xec, 0xc9, 0x36, + 0xcc, 0xca, 0x2e, 0x43, 0xa9, 0x4e, 0x0b, 0x35, 0x3f, 0xe0, 0x38, 0x40, 0x82, 0x04, 0xe0, 0x18, + 0xc7, 0xb0, 0x1e, 0x2b, 0xf4, 0xb4, 0x1e, 0xfb, 0x55, 0x0b, 0x52, 0x87, 0xfc, 0x09, 0x70, 0x1b, + 0xab, 0x26, 0xb7, 0xf1, 0x64, 0x3f, 0xa3, 0x99, 0xc3, 0x68, 0xfc, 0xf1, 0x24, 0x9c, 0xc9, 0x71, + 0xcb, 0xdb, 0x83, 0xe9, 0xed, 0x3a, 0x31, 0x3d, 0xac, 0xbb, 0x45, 0x1e, 0xea, 0xea, 0x8e, 0xcd, + 0x92, 0xc3, 0x4e, 0xa7, 0x50, 0x70, 0xba, 0x09, 0xf4, 0x79, 0x0b, 0x4e, 0x39, 0x77, 0xc3, 0x65, + 0xca, 0x35, 0xba, 0xf5, 0xc5, 0xa6, 0x5f, 0xdf, 0xa5, 0x57, 0xb2, 0xdc, 0x08, 0x2f, 0x66, 0x4a, + 0xf2, 0xee, 0xd4, 0x52, 0xf8, 0x46, 0xf3, 0x2c, 0x5b, 0x6e, 0x16, 0x16, 0xce, 0x6c, 0x0b, 0x61, + 0x91, 0x42, 0x81, 0xbe, 0x49, 0xbb, 0xc4, 0x00, 0xc8, 0xf2, 0x9f, 0xe4, 0x6c, 0x90, 0x84, 0x60, + 0x45, 0x07, 0x7d, 0x06, 0x4a, 0xdb, 0xd2, 0xdd, 0x37, 0x83, 0xcd, 0x8a, 0x07, 0xb2, 0xbb, 0x13, + 0x34, 0x57, 0xc7, 0x2b, 0x24, 0x1c, 0x13, 0x45, 0xaf, 0x41, 0xd1, 0xdb, 0x0a, 0xbb, 0x25, 0x9c, + 0x4d, 0xd8, 0x5d, 0xf2, 0x48, 0x1b, 0xeb, 0x2b, 0x35, 0x4c, 0x2b, 0xa2, 0x6b, 0x50, 0x0c, 0x36, + 0x1b, 0x42, 0x0c, 0x9d, 0xb9, 0x49, 0xf1, 0x62, 0x25, 0xa7, 0x57, 0x8c, 0x12, 0x5e, 0xac, 0x60, + 0x4a, 0x02, 0x55, 0x61, 0x90, 0xf9, 0xb2, 0x09, 0xa6, 0x26, 0xf3, 0xf9, 0xd6, 0xc5, 0x27, 0x94, + 0x87, 0xe3, 0x60, 0x08, 0x98, 0x13, 0x42, 0x1b, 0x30, 0x54, 0x67, 0xc9, 0x49, 0x05, 0x17, 0xf3, + 0xc1, 0x4c, 0x81, 0x73, 0x97, 0xac, 0xad, 0x42, 0xfe, 0xca, 0x30, 0xb0, 0xa0, 0xc5, 0xa8, 0x92, + 0xf6, 0xce, 0x56, 0x28, 0x92, 0x77, 0x67, 0x53, 0xed, 0x92, 0x8c, 0x58, 0x50, 0x65, 0x18, 0x58, + 0xd0, 0x42, 0xaf, 0x40, 0x61, 0xab, 0x2e, 0xfc, 0xd4, 0x32, 0x25, 0xcf, 0x66, 0xb0, 0x94, 0xc5, + 0xa1, 0xfb, 0x07, 0xe5, 0xc2, 0xca, 0x12, 0x2e, 0x6c, 0xd5, 0xd1, 0x3a, 0x0c, 0x6f, 0xf1, 0xf0, + 0x0a, 0x42, 0xb8, 0xfc, 0x54, 0x76, 0xe4, 0x87, 0x54, 0x04, 0x06, 0xee, 0xf3, 0x24, 0x00, 0x58, + 0x12, 0x61, 0x19, 0x09, 0x54, 0x98, 0x08, 0x11, 0xa5, 0x6e, 0xfe, 0x68, 0xa1, 0x3d, 0x38, 0x93, + 0x19, 0x07, 0x9b, 0xc0, 0x1a, 0x45, 0xba, 0xaa, 0x9d, 0xb7, 0x3b, 0x01, 0x0b, 0x05, 0x2e, 0xc2, + 0x19, 0x65, 0xae, 0xea, 0x05, 0x89, 0xd4, 0x6d, 0x55, 0x2b, 0x24, 0x1c, 0x13, 0x45, 0xbb, 0x30, + 0xbe, 0x17, 0xb6, 0x77, 0x88, 0xdc, 0xd2, 0x2c, 0xba, 0x51, 0x0e, 0x7f, 0x74, 0x5b, 0x20, 0xba, + 0x41, 0xd4, 0x71, 0x9a, 0xa9, 0x53, 0x88, 0xf1, 0xb2, 0xb7, 0x75, 0x62, 0xd8, 0xa4, 0x4d, 0x87, + 0xff, 0xad, 0x8e, 0xbf, 0xb9, 0x1f, 0x11, 0x11, 0x5c, 0x2e, 0x73, 0xf8, 0xdf, 0xe0, 0x28, 0xe9, + 0xe1, 0x17, 0x00, 0x2c, 0x89, 0xa0, 0xdb, 0x62, 0x78, 0xd8, 0xe9, 0x39, 0x95, 0x1f, 0x01, 0x76, + 0x41, 0x22, 0xe5, 0x0c, 0x0a, 0x3b, 0x2d, 0x63, 0x52, 0xec, 0x94, 0x6c, 0xef, 0xf8, 0x91, 0xef, + 0x25, 0x4e, 0xe8, 0xe9, 0xfc, 0x53, 0xb2, 0x9a, 0x81, 0x9f, 0x3e, 0x25, 0xb3, 0xb0, 0x70, 0x66, + 0x5b, 0xa8, 0x01, 0x13, 0x6d, 0x3f, 0x88, 0xee, 0xfa, 0x81, 0x5c, 0x5f, 0xa8, 0x8b, 0x70, 0xcc, + 0xc0, 0x14, 0x2d, 0xb2, 0xb8, 0x8d, 0x26, 0x04, 0x27, 0x68, 0xa2, 0x8f, 0xc3, 0x70, 0x58, 0x77, + 0x9a, 0x64, 0xf5, 0xe6, 0xec, 0x4c, 0xfe, 0xf5, 0x53, 0xe3, 0x28, 0x39, 0xab, 0x8b, 0x47, 0xc7, + 0xe0, 0x28, 0x58, 0x92, 0x43, 0x2b, 0x30, 0xc8, 0x32, 0xce, 0xb1, 0x48, 0x88, 0x39, 0x81, 0x6c, + 0x53, 0x56, 0xf0, 0xfc, 0x6c, 0x62, 0xc5, 0x98, 0x57, 0xa7, 0x7b, 0x40, 0xbc, 0x11, 0xfd, 0x70, + 0xf6, 0x74, 0xfe, 0x1e, 0x10, 0x4f, 0xcb, 0x9b, 0xb5, 0x6e, 0x7b, 0x40, 0x21, 0xe1, 0x98, 0x28, + 0x3d, 0x99, 0xe9, 0x69, 0x7a, 0xa6, 0x8b, 0xf9, 0x56, 0xee, 0x59, 0xca, 0x4e, 0x66, 0x7a, 0x92, + 0x52, 0x12, 0xf6, 0xef, 0x0d, 0xa7, 0x79, 0x16, 0x26, 0x55, 0xf8, 0x3e, 0x2b, 0xa5, 0x70, 0xfe, + 0x50, 0xbf, 0x42, 0xce, 0x63, 0x7c, 0x0a, 0x7d, 0xde, 0x82, 0x33, 0xed, 0xcc, 0x0f, 0x11, 0x0c, + 0x40, 0x7f, 0xb2, 0x52, 0xfe, 0xe9, 0x2a, 0x6a, 0x66, 0x36, 0x1c, 0xe7, 0xb4, 0x94, 0x7c, 0x6e, + 0x16, 0xdf, 0xf1, 0x73, 0x73, 0x0d, 0x46, 0xea, 0xfc, 0x29, 0xd2, 0x35, 0x59, 0x77, 0xf2, 0xed, + 0xcd, 0x58, 0x09, 0xf1, 0x86, 0xd9, 0xc2, 0x8a, 0x04, 0xfa, 0x51, 0x0b, 0xce, 0x25, 0xbb, 0x8e, + 0x09, 0x03, 0x8b, 0x50, 0x9b, 0x5c, 0xa0, 0xb1, 0x22, 0xbe, 0x3f, 0xc5, 0xff, 0x1b, 0xc8, 0x87, + 0xbd, 0x10, 0x70, 0xf7, 0xc6, 0x50, 0x25, 0x43, 0xa2, 0x32, 0x64, 0x6a, 0x91, 0xfa, 0x90, 0xaa, + 0xbc, 0x08, 0x63, 0x2d, 0xbf, 0xe3, 0x45, 0xc2, 0xda, 0x4b, 0x58, 0x9e, 0x30, 0x8b, 0x8b, 0x35, + 0xad, 0x1c, 0x1b, 0x58, 0x09, 0x59, 0xcc, 0xc8, 0x03, 0xcb, 0x62, 0xde, 0x84, 0x31, 0x4f, 0x33, + 0x4f, 0x16, 0xfc, 0xc0, 0xc5, 0xfc, 0x30, 0xb9, 0xba, 0x31, 0x33, 0xef, 0xa5, 0x5e, 0x82, 0x0d, + 0x6a, 0x27, 0x6b, 0x06, 0xf6, 0x65, 0x2b, 0x83, 0xa9, 0xe7, 0xa2, 0x98, 0x8f, 0x98, 0xa2, 0x98, + 0x8b, 0x49, 0x51, 0x4c, 0x4a, 0x83, 0x60, 0x48, 0x61, 0xfa, 0xcf, 0x02, 0xd4, 0x6f, 0xa8, 0x4d, + 0xbb, 0x09, 0x17, 0x7a, 0x5d, 0x4b, 0xcc, 0xec, 0xaf, 0xa1, 0xf4, 0xc5, 0xb1, 0xd9, 0x5f, 0x63, + 0xb5, 0x82, 0x19, 0xa4, 0xdf, 0x20, 0x4e, 0xf6, 0x7f, 0xb2, 0xa0, 0x58, 0xf5, 0x1b, 0x27, 0xf0, + 0xe0, 0xfd, 0xa8, 0xf1, 0xe0, 0x7d, 0x34, 0xfb, 0x42, 0x6c, 0xe4, 0xea, 0x3f, 0x96, 0x13, 0xfa, + 0x8f, 0x73, 0x79, 0x04, 0xba, 0x6b, 0x3b, 0x7e, 0xba, 0x08, 0xa3, 0x55, 0xbf, 0xa1, 0x6c, 0xee, + 0xff, 0xc9, 0x83, 0xd8, 0xdc, 0xe7, 0xe6, 0xb2, 0xd0, 0x28, 0x33, 0x6b, 0x41, 0xe9, 0x6e, 0xfc, + 0x2d, 0x66, 0x7a, 0x7f, 0x87, 0xb8, 0xdb, 0x3b, 0x11, 0x69, 0x24, 0x3f, 0xe7, 0xe4, 0x4c, 0xef, + 0x7f, 0xaf, 0x00, 0x93, 0x89, 0xd6, 0x51, 0x13, 0xc6, 0x9b, 0xba, 0x74, 0x5d, 0xac, 0xd3, 0x07, + 0x12, 0xcc, 0x0b, 0xd3, 0x65, 0xad, 0x08, 0x9b, 0xc4, 0xd1, 0x3c, 0x80, 0x52, 0x37, 0x4b, 0xf1, + 0x2a, 0xe3, 0xfa, 0x95, 0x3e, 0x3a, 0xc4, 0x1a, 0x06, 0x7a, 0x09, 0x46, 0x23, 0xbf, 0xed, 0x37, + 0xfd, 0xed, 0xfd, 0xeb, 0x44, 0xc6, 0xf7, 0x52, 0x06, 0x89, 0x1b, 0x31, 0x08, 0xeb, 0x78, 0xe8, + 0x1e, 0x4c, 0x2b, 0x22, 0xb5, 0x63, 0xd0, 0x38, 0x30, 0xa9, 0xc2, 0x7a, 0x92, 0x22, 0x4e, 0x37, + 0x62, 0xff, 0x6c, 0x91, 0x0f, 0xb1, 0x17, 0xb9, 0xef, 0xed, 0x86, 0x77, 0xf7, 0x6e, 0xf8, 0xba, + 0x05, 0x53, 0xb4, 0x75, 0x66, 0x6d, 0x25, 0xaf, 0x79, 0x15, 0x98, 0xdb, 0xea, 0x12, 0x98, 0xfb, + 0x22, 0x3d, 0x35, 0x1b, 0x7e, 0x27, 0x12, 0xb2, 0x3b, 0xed, 0x58, 0xa4, 0xa5, 0x58, 0x40, 0x05, + 0x1e, 0x09, 0x02, 0xe1, 0x21, 0xaa, 0xe3, 0x91, 0x20, 0xc0, 0x02, 0x2a, 0xe3, 0x76, 0x0f, 0x64, + 0xc7, 0xed, 0xe6, 0xe1, 0x57, 0x85, 0x5d, 0x8e, 0x60, 0xb8, 0xb4, 0xf0, 0xab, 0xd2, 0x60, 0x27, + 0xc6, 0xb1, 0xbf, 0x5a, 0x84, 0xb1, 0xaa, 0xdf, 0x88, 0x55, 0xcd, 0x2f, 0x1a, 0xaa, 0xe6, 0x0b, + 0x09, 0x55, 0xf3, 0x94, 0x8e, 0xfb, 0x9e, 0x62, 0xf9, 0x9b, 0xa5, 0x58, 0xfe, 0x87, 0x16, 0x9b, + 0xb5, 0xca, 0x7a, 0x8d, 0x1b, 0xef, 0xa1, 0x2b, 0x30, 0xca, 0x0e, 0x18, 0xe6, 0x92, 0x2c, 0xf5, + 0xaf, 0x2c, 0x1f, 0xd5, 0x7a, 0x5c, 0x8c, 0x75, 0x1c, 0x74, 0x09, 0x46, 0x42, 0xe2, 0x04, 0xf5, + 0x1d, 0x75, 0xba, 0x0a, 0x65, 0x29, 0x2f, 0xc3, 0x0a, 0x8a, 0xde, 0x88, 0x23, 0x7f, 0x16, 0xf3, + 0x5d, 0x1c, 0xf5, 0xfe, 0xf0, 0x2d, 0x92, 0x1f, 0xee, 0xd3, 0xbe, 0x03, 0x28, 0x8d, 0xdf, 0x47, + 0x6c, 0xba, 0xb2, 0x19, 0x9b, 0xae, 0x94, 0x8a, 0x4b, 0xf7, 0x67, 0x16, 0x4c, 0x54, 0xfd, 0x06, + 0xdd, 0xba, 0xdf, 0x4e, 0xfb, 0x54, 0x0f, 0x7b, 0x3c, 0xd4, 0x25, 0xec, 0xf1, 0x13, 0x30, 0x58, + 0xf5, 0x1b, 0xab, 0xd5, 0x6e, 0xf1, 0x05, 0xec, 0xbf, 0x66, 0xc1, 0x70, 0xd5, 0x6f, 0x9c, 0x80, + 0x5a, 0xe0, 0x23, 0xa6, 0x5a, 0xe0, 0x91, 0x9c, 0x75, 0x93, 0xa3, 0x09, 0xf8, 0x2b, 0x03, 0x30, + 0x4e, 0xfb, 0xe9, 0x6f, 0xcb, 0xa9, 0x34, 0x86, 0xcd, 0xea, 0x63, 0xd8, 0x28, 0x17, 0xee, 0x37, + 0x9b, 0xfe, 0xdd, 0xe4, 0xb4, 0xae, 0xb0, 0x52, 0x2c, 0xa0, 0xe8, 0x59, 0x18, 0x69, 0x07, 0x64, + 0xcf, 0xf5, 0x05, 0x7b, 0xab, 0x29, 0x59, 0xaa, 0xa2, 0x1c, 0x2b, 0x0c, 0xfa, 0x2c, 0x0c, 0x5d, + 0x8f, 0x5e, 0xe5, 0x75, 0xdf, 0x6b, 0x70, 0xc9, 0x79, 0x51, 0xe4, 0xe6, 0xd0, 0xca, 0xb1, 0x81, + 0x85, 0xee, 0x40, 0x89, 0xfd, 0x67, 0xc7, 0xce, 0xd1, 0xb3, 0xbc, 0x8a, 0xac, 0x7f, 0x82, 0x00, + 0x8e, 0x69, 0xa1, 0xe7, 0x01, 0x22, 0x19, 0xdf, 0x3e, 0x14, 0xd1, 0xd6, 0xd4, 0x53, 0x40, 0x45, + 0xbe, 0x0f, 0xb1, 0x86, 0x85, 0x9e, 0x81, 0x52, 0xe4, 0xb8, 0xcd, 0x1b, 0xae, 0x47, 0x42, 0x26, + 0x11, 0x2f, 0xca, 0xe4, 0x7b, 0xa2, 0x10, 0xc7, 0x70, 0xca, 0x8a, 0xb1, 0x48, 0x1c, 0x3c, 0x47, + 0xf4, 0x08, 0xc3, 0x66, 0xac, 0xd8, 0x0d, 0x55, 0x8a, 0x35, 0x0c, 0xb4, 0x03, 0x8f, 0xb9, 0x1e, + 0xcb, 0x63, 0x41, 0x6a, 0xbb, 0x6e, 0x7b, 0xe3, 0x46, 0xed, 0x36, 0x09, 0xdc, 0xad, 0xfd, 0x45, + 0xa7, 0xbe, 0x4b, 0x3c, 0x99, 0xbf, 0xf3, 0x49, 0xd1, 0xc5, 0xc7, 0x56, 0xbb, 0xe0, 0xe2, 0xae, + 0x94, 0xec, 0x17, 0xd8, 0x7a, 0xbf, 0x59, 0x43, 0x1f, 0x30, 0x8e, 0x8e, 0x33, 0xfa, 0xd1, 0x71, + 0x78, 0x50, 0x1e, 0xba, 0x59, 0xd3, 0x02, 0x49, 0xbc, 0x0c, 0xa7, 0xab, 0x7e, 0xa3, 0xea, 0x07, + 0xd1, 0x8a, 0x1f, 0xdc, 0x75, 0x82, 0x86, 0x5c, 0x5e, 0x65, 0x19, 0x4a, 0x83, 0x9e, 0x9f, 0x83, + 0xfc, 0x74, 0x31, 0xc2, 0x64, 0xbc, 0xc0, 0x38, 0xb6, 0x23, 0x3a, 0x80, 0xd5, 0x19, 0xef, 0xa0, + 0x32, 0xc1, 0x5c, 0x75, 0x22, 0x82, 0x6e, 0xb2, 0x0c, 0xd7, 0xf1, 0x35, 0x2a, 0xaa, 0x3f, 0xad, + 0x65, 0xb8, 0x8e, 0x81, 0x99, 0xf7, 0xae, 0x59, 0xdf, 0xfe, 0xcf, 0x83, 0xec, 0x44, 0x4d, 0x64, + 0x13, 0x41, 0x9f, 0x86, 0x89, 0x90, 0xdc, 0x70, 0xbd, 0xce, 0x3d, 0x29, 0xc2, 0xe8, 0xe2, 0xc2, + 0x57, 0x5b, 0xd6, 0x31, 0xb9, 0x20, 0xd4, 0x2c, 0xc3, 0x09, 0x6a, 0xa8, 0x05, 0x13, 0x77, 0x5d, + 0xaf, 0xe1, 0xdf, 0x0d, 0x25, 0xfd, 0x91, 0x7c, 0x79, 0xe8, 0x1d, 0x8e, 0x99, 0xe8, 0xa3, 0xd1, + 0xdc, 0x1d, 0x83, 0x18, 0x4e, 0x10, 0xa7, 0xab, 0x36, 0xe8, 0x78, 0x0b, 0xe1, 0xad, 0x90, 0x04, + 0x22, 0x57, 0x39, 0x5b, 0xb5, 0x58, 0x16, 0xe2, 0x18, 0x4e, 0x57, 0x2d, 0xfb, 0x73, 0x35, 0xf0, + 0x3b, 0x3c, 0x75, 0x85, 0x58, 0xb5, 0x58, 0x95, 0x62, 0x0d, 0x83, 0xee, 0x6a, 0xf6, 0x6f, 0xdd, + 0xf7, 0xb0, 0xef, 0x47, 0xf2, 0x1c, 0x60, 0x3a, 0x7d, 0xad, 0x1c, 0x1b, 0x58, 0x68, 0x05, 0x50, + 0xd8, 0x69, 0xb7, 0x9b, 0xcc, 0x36, 0xc8, 0x69, 0x32, 0x52, 0xdc, 0x5e, 0xa2, 0xc8, 0x43, 0xef, + 0xd6, 0x52, 0x50, 0x9c, 0x51, 0x83, 0x1e, 0xf0, 0x5b, 0xa2, 0xab, 0x83, 0xac, 0xab, 0x5c, 0x77, + 0x52, 0xe3, 0xfd, 0x94, 0x30, 0xb4, 0x0c, 0xc3, 0xe1, 0x7e, 0x58, 0x8f, 0x44, 0xa4, 0xc4, 0x9c, + 0x84, 0x51, 0x35, 0x86, 0xa2, 0xe5, 0x2b, 0xe4, 0x55, 0xb0, 0xac, 0x8b, 0xea, 0x30, 0x23, 0x28, + 0x2e, 0xed, 0x38, 0x9e, 0x4a, 0xbf, 0xc3, 0x4d, 0xa4, 0xaf, 0xdc, 0x3f, 0x28, 0xcf, 0x88, 0x96, + 0x75, 0xf0, 0xe1, 0x41, 0xf9, 0x4c, 0xd5, 0x6f, 0x64, 0x40, 0x70, 0x16, 0x35, 0xbe, 0xf8, 0xea, + 0x75, 0xbf, 0xd5, 0xae, 0x06, 0xfe, 0x96, 0xdb, 0x24, 0xdd, 0xf4, 0x4f, 0x35, 0x03, 0x53, 0x2c, + 0x3e, 0xa3, 0x0c, 0x27, 0xa8, 0xd9, 0xdf, 0xcd, 0x98, 0x20, 0x96, 0x9e, 0x3b, 0xea, 0x04, 0x04, + 0xb5, 0x60, 0xbc, 0xcd, 0xb6, 0x89, 0x48, 0x28, 0x21, 0xd6, 0xfa, 0x8b, 0x7d, 0xca, 0x51, 0xee, + 0xd2, 0xbb, 0xc3, 0xb4, 0x31, 0xaa, 0xea, 0xe4, 0xb0, 0x49, 0xdd, 0xfe, 0xb3, 0x47, 0xd8, 0x35, + 0x5a, 0xe3, 0xc2, 0x91, 0x61, 0xe1, 0x91, 0x21, 0xde, 0x63, 0x73, 0xf9, 0x52, 0xba, 0x78, 0x5a, + 0x84, 0x57, 0x07, 0x96, 0x75, 0xd1, 0xa7, 0x60, 0x82, 0x3e, 0x6f, 0xd4, 0x55, 0x16, 0xce, 0x9e, + 0xca, 0x8f, 0x9c, 0xa1, 0xb0, 0xf4, 0x64, 0x33, 0x7a, 0x65, 0x9c, 0x20, 0x86, 0xde, 0x60, 0x36, + 0x3d, 0x92, 0x74, 0xa1, 0x1f, 0xd2, 0xba, 0xf9, 0x8e, 0x24, 0xab, 0x11, 0x41, 0x1d, 0x98, 0x49, + 0xa7, 0xa6, 0x0b, 0x67, 0xed, 0x7c, 0x3e, 0x31, 0x9d, 0x5d, 0x2e, 0xce, 0x0a, 0x92, 0x86, 0x85, + 0x38, 0x8b, 0x3e, 0xba, 0x01, 0xe3, 0x22, 0x47, 0xb5, 0x58, 0xb9, 0x45, 0x43, 0x78, 0x38, 0x8e, + 0x75, 0xe0, 0x61, 0xb2, 0x00, 0x9b, 0x95, 0xd1, 0x36, 0x9c, 0xd3, 0x72, 0x46, 0x5d, 0x0d, 0x1c, + 0x66, 0x01, 0xe0, 0xb2, 0xe3, 0x54, 0xbb, 0xe0, 0x1f, 0xbf, 0x7f, 0x50, 0x3e, 0xb7, 0xd1, 0x0d, + 0x11, 0x77, 0xa7, 0x83, 0x6e, 0xc2, 0x69, 0xee, 0xf7, 0x5d, 0x21, 0x4e, 0xa3, 0xe9, 0x7a, 0x8a, + 0x83, 0xe0, 0x5b, 0xfe, 0xec, 0xfd, 0x83, 0xf2, 0xe9, 0x85, 0x2c, 0x04, 0x9c, 0x5d, 0x0f, 0x7d, + 0x04, 0x4a, 0x0d, 0x2f, 0x14, 0x63, 0x30, 0x64, 0xa4, 0xe5, 0x2a, 0x55, 0xd6, 0x6b, 0xea, 0xfb, + 0xe3, 0x3f, 0x38, 0xae, 0x80, 0xb6, 0xb9, 0x80, 0x59, 0x89, 0x3d, 0x86, 0x53, 0x71, 0xaf, 0x92, + 0x92, 0x41, 0xc3, 0xf3, 0x93, 0x6b, 0x56, 0x94, 0x43, 0x84, 0xe1, 0x14, 0x6a, 0x10, 0x46, 0xaf, + 0x03, 0x12, 0xe1, 0xdf, 0x17, 0xea, 0x2c, 0x5b, 0x09, 0x93, 0xc7, 0x8f, 0x98, 0xbe, 0x88, 0xb5, + 0x14, 0x06, 0xce, 0xa8, 0x85, 0xae, 0xd1, 0x53, 0x45, 0x2f, 0x15, 0xa7, 0x96, 0x4a, 0xa2, 0x58, + 0x21, 0xed, 0x80, 0x30, 0x8b, 0x26, 0x93, 0x22, 0x4e, 0xd4, 0x43, 0x0d, 0x78, 0xcc, 0xe9, 0x44, + 0x3e, 0x93, 0xdd, 0x9b, 0xa8, 0x1b, 0xfe, 0x2e, 0xf1, 0x98, 0xda, 0x6c, 0x64, 0xf1, 0x02, 0x65, + 0x51, 0x16, 0xba, 0xe0, 0xe1, 0xae, 0x54, 0x28, 0x6b, 0xa9, 0xb2, 0x26, 0x83, 0x19, 0xcd, 0x2b, + 0x23, 0x73, 0xf2, 0x4b, 0x30, 0xba, 0xe3, 0x87, 0xd1, 0x3a, 0x89, 0xee, 0xfa, 0xc1, 0xae, 0x88, + 0x4a, 0x1b, 0xc7, 0xf8, 0x8e, 0x41, 0x58, 0xc7, 0xa3, 0x6f, 0x47, 0x66, 0xd4, 0xb1, 0x5a, 0x61, + 0xfa, 0xf4, 0x91, 0xf8, 0x8c, 0xb9, 0xc6, 0x8b, 0xb1, 0x84, 0x4b, 0xd4, 0xd5, 0xea, 0x12, 0xd3, + 0x8d, 0x27, 0x50, 0x57, 0xab, 0x4b, 0x58, 0xc2, 0xe9, 0x72, 0x0d, 0x77, 0x9c, 0x80, 0x54, 0x03, + 0xbf, 0x4e, 0x42, 0x2d, 0xb2, 0xfc, 0xa3, 0x3c, 0xe6, 0x2e, 0x5d, 0xae, 0xb5, 0x2c, 0x04, 0x9c, + 0x5d, 0x0f, 0x91, 0x74, 0xbe, 0xb4, 0x89, 0x7c, 0xa5, 0x46, 0x9a, 0x9f, 0xe9, 0x33, 0x65, 0x9a, + 0x07, 0x53, 0x2a, 0x53, 0x1b, 0x8f, 0xb2, 0x1b, 0xce, 0x4e, 0xb2, 0xb5, 0xdd, 0x7f, 0x88, 0x5e, + 0xa5, 0x26, 0x5a, 0x4d, 0x50, 0xc2, 0x29, 0xda, 0x46, 0xc0, 0xb6, 0xa9, 0x9e, 0x01, 0xdb, 0x2e, + 0x43, 0x29, 0xec, 0x6c, 0x36, 0xfc, 0x96, 0xe3, 0x7a, 0x4c, 0x37, 0xae, 0x3d, 0x62, 0x6a, 0x12, + 0x80, 0x63, 0x1c, 0xb4, 0x02, 0x23, 0x8e, 0xd4, 0x01, 0xa1, 0xfc, 0x10, 0x3d, 0x4a, 0xf3, 0xc3, + 0xa3, 0x56, 0x48, 0xad, 0x8f, 0xaa, 0x8b, 0x5e, 0x85, 0x71, 0xe1, 0xb7, 0x2c, 0x92, 0x84, 0xce, + 0x98, 0xce, 0x65, 0x35, 0x1d, 0x88, 0x4d, 0x5c, 0x74, 0x0b, 0x46, 0x23, 0xbf, 0xc9, 0x3c, 0xa4, + 0x28, 0x9b, 0x77, 0x26, 0x3f, 0xd8, 0xdc, 0x86, 0x42, 0xd3, 0xc5, 0xaf, 0xaa, 0x2a, 0xd6, 0xe9, + 0xa0, 0x0d, 0xbe, 0xde, 0x59, 0x1c, 0x79, 0x12, 0xce, 0x3e, 0x92, 0x7f, 0x27, 0xa9, 0x70, 0xf3, + 0xe6, 0x76, 0x10, 0x35, 0xb1, 0x4e, 0x06, 0x5d, 0x85, 0xe9, 0x76, 0xe0, 0xfa, 0x6c, 0x4d, 0x28, + 0xf5, 0xdf, 0xac, 0x99, 0x35, 0xaa, 0x9a, 0x44, 0xc0, 0xe9, 0x3a, 0xcc, 0xed, 0x5c, 0x14, 0xce, + 0x9e, 0xe5, 0x99, 0x2f, 0xf8, 0x9b, 0x90, 0x97, 0x61, 0x05, 0x45, 0x6b, 0xec, 0x24, 0xe6, 0xe2, + 0x8c, 0xd9, 0xb9, 0xfc, 0xa8, 0x40, 0xba, 0xd8, 0x83, 0x33, 0xaf, 0xea, 0x2f, 0x8e, 0x29, 0xa0, + 0x86, 0x96, 0x70, 0x92, 0xbe, 0x18, 0xc2, 0xd9, 0xc7, 0xba, 0x58, 0xd6, 0x25, 0x9e, 0x17, 0x31, + 0x43, 0x60, 0x14, 0x87, 0x38, 0x41, 0x13, 0x7d, 0x0c, 0xa6, 0x44, 0x2c, 0xc3, 0x78, 0x98, 0xce, + 0xc5, 0x76, 0xe7, 0x38, 0x01, 0xc3, 0x29, 0x6c, 0x9e, 0x79, 0xc2, 0xd9, 0x6c, 0x12, 0x71, 0xf4, + 0xdd, 0x70, 0xbd, 0xdd, 0x70, 0xf6, 0x3c, 0x3b, 0x1f, 0x44, 0xe6, 0x89, 0x24, 0x14, 0x67, 0xd4, + 0x40, 0x1b, 0x30, 0xd5, 0x0e, 0x08, 0x69, 0x31, 0x46, 0x5f, 0xdc, 0x67, 0x65, 0x1e, 0x75, 0x81, + 0xf6, 0xa4, 0x9a, 0x80, 0x1d, 0x66, 0x94, 0xe1, 0x14, 0x05, 0x74, 0x17, 0x46, 0xfc, 0x3d, 0x12, + 0xec, 0x10, 0xa7, 0x31, 0x7b, 0xa1, 0x8b, 0x1f, 0x84, 0xb8, 0xdc, 0x6e, 0x0a, 0xdc, 0x84, 0xc9, + 0x80, 0x2c, 0xee, 0x6d, 0x32, 0x20, 0x1b, 0x43, 0xff, 0xaf, 0x05, 0x67, 0xa5, 0x96, 0xa1, 0xd6, + 0xa6, 0xa3, 0xbe, 0xe4, 0x7b, 0x61, 0x14, 0xf0, 0x38, 0x01, 0x8f, 0xe7, 0xfb, 0xce, 0x6f, 0xe4, + 0x54, 0x52, 0x12, 0xd5, 0xb3, 0x79, 0x18, 0x21, 0xce, 0x6f, 0x11, 0x2d, 0xc1, 0x74, 0x48, 0x22, + 0x79, 0x18, 0x2d, 0x84, 0x2b, 0x6f, 0x54, 0xd6, 0x67, 0x9f, 0xe0, 0x41, 0x0e, 0xe8, 0x66, 0xa8, + 0x25, 0x81, 0x38, 0x8d, 0x8f, 0xae, 0x40, 0xc1, 0x0f, 0x67, 0x9f, 0xec, 0x92, 0xa3, 0x94, 0x3e, + 0xc5, 0xb9, 0xe9, 0xd8, 0xcd, 0x1a, 0x2e, 0xf8, 0xa1, 0xcc, 0xfe, 0x40, 0xdf, 0x63, 0xe1, 0xec, + 0xfb, 0xb9, 0xfc, 0x4d, 0x66, 0x7f, 0x60, 0x85, 0x38, 0x86, 0xcf, 0x7d, 0x27, 0x4c, 0xa7, 0xd8, + 0x8b, 0xa3, 0x24, 0x02, 0x9a, 0xdb, 0x85, 0x71, 0x63, 0x0a, 0x1f, 0xaa, 0x4a, 0xfb, 0x9f, 0x0f, + 0x43, 0x49, 0xa9, 0x3b, 0xd1, 0x65, 0x53, 0x8b, 0x7d, 0x36, 0xa9, 0xc5, 0x1e, 0xa9, 0xfa, 0x0d, + 0x43, 0x71, 0xbd, 0x91, 0x11, 0x3a, 0x2e, 0xef, 0xc0, 0xe8, 0xdf, 0x9a, 0x5e, 0x93, 0x21, 0x17, + 0xfb, 0x56, 0x87, 0x0f, 0x74, 0x15, 0x4b, 0x5f, 0x85, 0x69, 0xcf, 0x67, 0x3c, 0x2d, 0x69, 0x48, + 0x86, 0x85, 0xf1, 0x25, 0x25, 0x3d, 0x16, 0x4b, 0x02, 0x01, 0xa7, 0xeb, 0xd0, 0x06, 0x39, 0x63, + 0x91, 0x94, 0x83, 0x73, 0xbe, 0x03, 0x0b, 0x28, 0x7a, 0x02, 0x06, 0xdb, 0x7e, 0x63, 0xb5, 0x2a, + 0xf8, 0x59, 0x2d, 0x60, 0x69, 0x63, 0xb5, 0x8a, 0x39, 0x0c, 0x2d, 0xc0, 0x10, 0xfb, 0x11, 0xce, + 0x8e, 0xe5, 0x07, 0xdd, 0x60, 0x35, 0xb4, 0x34, 0x4b, 0xac, 0x02, 0x16, 0x15, 0x99, 0x3c, 0x8e, + 0x3e, 0x02, 0x98, 0x3c, 0x6e, 0xf8, 0x01, 0xe5, 0x71, 0x92, 0x00, 0x8e, 0x69, 0xa1, 0x7b, 0x70, + 0xda, 0x78, 0x78, 0xf1, 0x25, 0x42, 0x42, 0xe1, 0xf8, 0xff, 0x44, 0xd7, 0x17, 0x97, 0x50, 0x9f, + 0x9f, 0x13, 0x9d, 0x3e, 0xbd, 0x9a, 0x45, 0x09, 0x67, 0x37, 0x80, 0x9a, 0x30, 0x5d, 0x4f, 0xb5, + 0x3a, 0xd2, 0x7f, 0xab, 0x6a, 0x42, 0xd3, 0x2d, 0xa6, 0x09, 0xa3, 0x57, 0x61, 0xe4, 0x2d, 0x3f, + 0x64, 0x77, 0x81, 0xe0, 0xc1, 0xa5, 0xd7, 0xf8, 0xc8, 0x1b, 0x37, 0x6b, 0xac, 0xfc, 0xf0, 0xa0, + 0x3c, 0x5a, 0xf5, 0x1b, 0xf2, 0x2f, 0x56, 0x15, 0xd0, 0x0f, 0x5a, 0x30, 0x97, 0x7e, 0xd9, 0xa9, + 0x4e, 0x8f, 0xf7, 0xdf, 0x69, 0x5b, 0x34, 0x3a, 0xb7, 0x9c, 0x4b, 0x0e, 0x77, 0x69, 0xca, 0xfe, + 0x65, 0x8b, 0x49, 0xf5, 0x84, 0x5a, 0x8a, 0x84, 0x9d, 0xe6, 0x49, 0x64, 0x97, 0x5d, 0x36, 0x34, + 0x66, 0x0f, 0x6c, 0x4e, 0xf1, 0x8f, 0x2d, 0x66, 0x4e, 0x71, 0x82, 0x7e, 0x13, 0x6f, 0xc0, 0x48, + 0x24, 0xb3, 0xfe, 0x76, 0x49, 0x88, 0xab, 0x75, 0x8a, 0x99, 0x94, 0x28, 0x8e, 0x58, 0x25, 0xf8, + 0x55, 0x64, 0xec, 0xbf, 0xc7, 0x67, 0x40, 0x42, 0x4e, 0x40, 0x31, 0x51, 0x31, 0x15, 0x13, 0xe5, + 0x1e, 0x5f, 0x90, 0xa3, 0xa0, 0xf8, 0xbb, 0x66, 0xbf, 0x99, 0x24, 0xe8, 0xdd, 0x6e, 0xc7, 0x63, + 0x7f, 0xc1, 0x02, 0x88, 0xe3, 0x41, 0xf7, 0x91, 0xd7, 0xed, 0x65, 0xca, 0x03, 0xfb, 0x91, 0x5f, + 0xf7, 0x9b, 0x42, 0xed, 0xf6, 0x58, 0xac, 0x1b, 0xe1, 0xe5, 0x87, 0xda, 0x6f, 0xac, 0xb0, 0x51, + 0x59, 0x46, 0x9f, 0x2b, 0xc6, 0xda, 0x3a, 0x23, 0xf2, 0xdc, 0x97, 0x2c, 0x38, 0x95, 0x65, 0x84, + 0x4b, 0x5f, 0x54, 0x5c, 0x26, 0xa6, 0x6c, 0xac, 0xd4, 0x6c, 0xde, 0x16, 0xe5, 0x58, 0x61, 0xf4, + 0x9d, 0x30, 0xef, 0x68, 0x81, 0x98, 0x6f, 0xc2, 0x78, 0x35, 0x20, 0xda, 0xe5, 0xfa, 0x1a, 0x8f, + 0x68, 0xc0, 0xfb, 0xf3, 0xec, 0x91, 0xa3, 0x19, 0xd8, 0x5f, 0x29, 0xc0, 0x29, 0x6e, 0xaa, 0xb0, + 0xb0, 0xe7, 0xbb, 0x8d, 0xaa, 0xdf, 0x10, 0xae, 0x56, 0x9f, 0x84, 0xb1, 0xb6, 0x26, 0xc8, 0xec, + 0x16, 0x54, 0x54, 0x17, 0x78, 0xc6, 0xa2, 0x17, 0xbd, 0x14, 0x1b, 0xb4, 0x50, 0x03, 0xc6, 0xc8, + 0x9e, 0x5b, 0x57, 0xfa, 0xee, 0xc2, 0x91, 0x2f, 0x3a, 0xd5, 0xca, 0xb2, 0x46, 0x07, 0x1b, 0x54, + 0x1f, 0x42, 0x1a, 0x6b, 0xfb, 0xc7, 0x2d, 0x78, 0x24, 0x27, 0x04, 0x29, 0x6d, 0xee, 0x2e, 0x33, + 0x0a, 0x11, 0xcb, 0x56, 0x35, 0xc7, 0x4d, 0x45, 0xb0, 0x80, 0xa2, 0x8f, 0x03, 0x70, 0x53, 0x0f, + 0xfa, 0xa4, 0xef, 0x15, 0xab, 0xd1, 0x08, 0x33, 0xa7, 0x45, 0x0c, 0x93, 0xf5, 0xb1, 0x46, 0xcb, + 0xfe, 0xd2, 0x00, 0x0c, 0xf2, 0x94, 0xfb, 0x55, 0x18, 0xde, 0xe1, 0x49, 0x65, 0xba, 0xce, 0x1b, + 0xc5, 0x95, 0x79, 0x6a, 0xe2, 0x79, 0xd3, 0x4a, 0xb1, 0x24, 0x83, 0xd6, 0x60, 0x86, 0xe7, 0xf6, + 0x69, 0x56, 0x48, 0xd3, 0xd9, 0x97, 0x32, 0x42, 0x9e, 0x88, 0x56, 0xc9, 0x4a, 0x57, 0xd3, 0x28, + 0x38, 0xab, 0x1e, 0x7a, 0x0d, 0x26, 0xe8, 0x9b, 0xcd, 0xef, 0x44, 0x92, 0x12, 0xcf, 0xea, 0xa3, + 0x1e, 0x89, 0x1b, 0x06, 0x14, 0x27, 0xb0, 0xd1, 0xab, 0x30, 0xde, 0x4e, 0x49, 0x43, 0x07, 0x63, + 0xb1, 0x81, 0x29, 0x01, 0x35, 0x71, 0x99, 0x1d, 0x6e, 0x87, 0x59, 0x1d, 0x6f, 0xec, 0x04, 0x24, + 0xdc, 0xf1, 0x9b, 0x0d, 0xc6, 0xfe, 0x0d, 0x6a, 0x76, 0xb8, 0x09, 0x38, 0x4e, 0xd5, 0xa0, 0x54, + 0xb6, 0x1c, 0xb7, 0xd9, 0x09, 0x48, 0x4c, 0x65, 0xc8, 0xa4, 0xb2, 0x92, 0x80, 0xe3, 0x54, 0x8d, + 0xde, 0x62, 0xde, 0xe1, 0xe3, 0x11, 0xf3, 0xda, 0x7f, 0xbd, 0x00, 0xc6, 0xd4, 0x7e, 0xfb, 0x66, + 0x1b, 0xa2, 0x5f, 0xb6, 0x1d, 0xb4, 0xeb, 0xc2, 0x8c, 0x26, 0xf3, 0xcb, 0xe2, 0x24, 0xa2, 0xfc, + 0xcb, 0xe8, 0x7f, 0xcc, 0x6a, 0xd1, 0x3d, 0x7e, 0xba, 0x1a, 0xf8, 0xf4, 0x92, 0x93, 0x31, 0xaf, + 0x94, 0xb9, 0xfb, 0xb0, 0x74, 0x05, 0xee, 0x12, 0x1d, 0x52, 0x18, 0x04, 0x73, 0x0a, 0x86, 0xc5, + 0x49, 0x4d, 0x38, 0xe6, 0x4b, 0x2a, 0xe8, 0x0a, 0x8c, 0x8a, 0x14, 0x32, 0xcc, 0x2a, 0x9b, 0x6f, + 0x26, 0x66, 0x21, 0x53, 0x89, 0x8b, 0xb1, 0x8e, 0x63, 0xff, 0x50, 0x01, 0x66, 0x32, 0xdc, 0x6a, + 0xf8, 0x35, 0xb2, 0xed, 0x86, 0x91, 0xca, 0x53, 0xaa, 0x5d, 0x23, 0xbc, 0x1c, 0x2b, 0x0c, 0x7a, + 0x56, 0xf1, 0x8b, 0x2a, 0x79, 0x39, 0x09, 0xb3, 0x75, 0x01, 0x3d, 0x62, 0xc6, 0xcf, 0x0b, 0x30, + 0xd0, 0x09, 0x89, 0x8c, 0xeb, 0xaa, 0xae, 0x6d, 0xa6, 0x03, 0x65, 0x10, 0xfa, 0x8c, 0xda, 0x56, + 0xea, 0x44, 0xed, 0x19, 0xc5, 0x15, 0x8a, 0x1c, 0x46, 0x3b, 0x17, 0x11, 0xcf, 0xf1, 0x22, 0xf1, + 0xd8, 0x8a, 0x03, 0x14, 0xb2, 0x52, 0x2c, 0xa0, 0xf6, 0x17, 0x8b, 0x70, 0x36, 0xd7, 0xd1, 0x8e, + 0x76, 0xbd, 0xe5, 0x7b, 0x6e, 0xe4, 0x2b, 0xd3, 0x23, 0x1e, 0x94, 0x90, 0xb4, 0x77, 0xd6, 0x44, + 0x39, 0x56, 0x18, 0xe8, 0x22, 0x0c, 0x32, 0x09, 0x6a, 0x2a, 0x63, 0xeb, 0x62, 0x85, 0x47, 0xa9, + 0xe2, 0xe0, 0xbe, 0x93, 0x6c, 0x3f, 0x41, 0x39, 0x18, 0xbf, 0x99, 0xbc, 0x50, 0x68, 0x77, 0x7d, + 0xbf, 0x89, 0x19, 0x10, 0xbd, 0x5f, 0x8c, 0x57, 0xc2, 0xd6, 0x06, 0x3b, 0x0d, 0x3f, 0xd4, 0x06, + 0xed, 0x69, 0x18, 0xde, 0x25, 0xfb, 0x81, 0xeb, 0x6d, 0x27, 0x6d, 0xb0, 0xae, 0xf3, 0x62, 0x2c, + 0xe1, 0x66, 0x8a, 0xc1, 0xe1, 0xe3, 0xce, 0x8e, 0x3d, 0xd2, 0x93, 0x3d, 0xf9, 0x91, 0x22, 0x4c, + 0xe2, 0xc5, 0xca, 0x7b, 0x13, 0x71, 0x2b, 0x3d, 0x11, 0xc7, 0x9d, 0x1d, 0xbb, 0xf7, 0x6c, 0xfc, + 0x82, 0x05, 0x93, 0x2c, 0x91, 0x8d, 0x70, 0xa7, 0x77, 0x7d, 0xef, 0x04, 0x9e, 0x02, 0x4f, 0xc0, + 0x60, 0x40, 0x1b, 0x4d, 0xa6, 0x6a, 0x65, 0x3d, 0xc1, 0x1c, 0x86, 0x1e, 0x83, 0x01, 0xd6, 0x05, + 0x3a, 0x79, 0x63, 0xfc, 0x08, 0xae, 0x38, 0x91, 0x83, 0x59, 0x29, 0x8b, 0xd1, 0x84, 0x49, 0xbb, + 0xe9, 0xf2, 0x4e, 0xc7, 0xfa, 0xed, 0x77, 0x87, 0x0b, 0x7e, 0x66, 0xd7, 0xde, 0x59, 0x8c, 0xa6, + 0x6c, 0x92, 0xdd, 0x9f, 0xd9, 0x7f, 0x54, 0x80, 0xf3, 0x99, 0xf5, 0xfa, 0x8e, 0xd1, 0xd4, 0xbd, + 0xf6, 0xc3, 0x4c, 0x55, 0x52, 0x3c, 0x41, 0x0b, 0xd7, 0x81, 0x7e, 0xb9, 0xff, 0xc1, 0x3e, 0x42, + 0x27, 0x65, 0x0e, 0xd9, 0xbb, 0x24, 0x74, 0x52, 0x66, 0xdf, 0x72, 0xc4, 0x04, 0x7f, 0x5e, 0xc8, + 0xf9, 0x16, 0x26, 0x30, 0xb8, 0x44, 0xcf, 0x19, 0x06, 0x0c, 0xe5, 0x23, 0x9c, 0x9f, 0x31, 0xbc, + 0x0c, 0x2b, 0x28, 0x5a, 0x80, 0xc9, 0x96, 0xeb, 0xd1, 0xc3, 0x67, 0xdf, 0x64, 0xc5, 0x55, 0x64, + 0xbb, 0x35, 0x13, 0x8c, 0x93, 0xf8, 0xc8, 0xd5, 0xc2, 0x2a, 0xf1, 0xaf, 0x7b, 0xf5, 0x48, 0xbb, + 0x6e, 0xde, 0xd4, 0xfd, 0xab, 0x51, 0xcc, 0x08, 0xb1, 0xb4, 0xa6, 0xc9, 0x89, 0x8a, 0xfd, 0xcb, + 0x89, 0xc6, 0xb2, 0x65, 0x44, 0x73, 0xaf, 0xc2, 0xf8, 0x03, 0x2b, 0x06, 0xec, 0xaf, 0x17, 0xe1, + 0xd1, 0x2e, 0xdb, 0x9e, 0x9f, 0xf5, 0xc6, 0x1c, 0x68, 0x67, 0x7d, 0x6a, 0x1e, 0xaa, 0x70, 0x6a, + 0xab, 0xd3, 0x6c, 0xee, 0x33, 0xc7, 0x0f, 0xd2, 0x90, 0x18, 0x82, 0xa7, 0x94, 0xc2, 0x91, 0x53, + 0x2b, 0x19, 0x38, 0x38, 0xb3, 0x26, 0x7d, 0x62, 0xd1, 0x9b, 0x64, 0x5f, 0x91, 0x4a, 0x3c, 0xb1, + 0xb0, 0x0e, 0xc4, 0x26, 0x2e, 0xba, 0x0a, 0xd3, 0xce, 0x9e, 0xe3, 0xf2, 0xd8, 0xd4, 0x92, 0x00, + 0x7f, 0x63, 0x29, 0x79, 0xee, 0x42, 0x12, 0x01, 0xa7, 0xeb, 0xa0, 0xd7, 0x01, 0xf9, 0x9b, 0xcc, + 0x3c, 0xbc, 0x71, 0x95, 0x78, 0x42, 0x45, 0xcb, 0xe6, 0xae, 0x18, 0x1f, 0x09, 0x37, 0x53, 0x18, + 0x38, 0xa3, 0x56, 0x22, 0x7c, 0xd0, 0x50, 0x7e, 0xf8, 0xa0, 0xee, 0xe7, 0x62, 0xcf, 0x2c, 0x39, + 0xff, 0xce, 0xa2, 0xd7, 0x17, 0x67, 0xf2, 0xcd, 0x68, 0x9b, 0xaf, 0x32, 0x13, 0x4b, 0x2e, 0xeb, + 0xd5, 0x82, 0xad, 0x9c, 0xd6, 0x4c, 0x2c, 0x63, 0x20, 0x36, 0x71, 0xf9, 0x82, 0x08, 0x63, 0x1f, + 0x5f, 0x83, 0xc5, 0x17, 0x21, 0xc1, 0x14, 0x06, 0xfa, 0x04, 0x0c, 0x37, 0xdc, 0x3d, 0x37, 0x14, + 0x92, 0xae, 0x23, 0xab, 0x95, 0xe2, 0x73, 0xb0, 0xc2, 0xc9, 0x60, 0x49, 0xcf, 0xfe, 0x91, 0x02, + 0x8c, 0xcb, 0x16, 0xdf, 0xe8, 0xf8, 0x91, 0x73, 0x02, 0xd7, 0xf2, 0x55, 0xe3, 0x5a, 0x7e, 0x7f, + 0xb7, 0xb8, 0x68, 0xac, 0x4b, 0xb9, 0xd7, 0xf1, 0xcd, 0xc4, 0x75, 0xfc, 0x54, 0x6f, 0x52, 0xdd, + 0xaf, 0xe1, 0xbf, 0x6f, 0xc1, 0xb4, 0x81, 0x7f, 0x02, 0xb7, 0xc1, 0x8a, 0x79, 0x1b, 0x3c, 0xde, + 0xf3, 0x1b, 0x72, 0x6e, 0x81, 0xef, 0x2f, 0x26, 0xfa, 0xce, 0x4e, 0xff, 0xb7, 0x60, 0x60, 0xc7, + 0x09, 0x1a, 0xdd, 0xf2, 0x40, 0xa4, 0x2a, 0xcd, 0x5f, 0x73, 0x02, 0xa1, 0xa3, 0x7e, 0x56, 0x8e, + 0x3a, 0x2d, 0xea, 0xa9, 0x9f, 0x66, 0x4d, 0xa1, 0x97, 0x61, 0x28, 0xac, 0xfb, 0x6d, 0xe5, 0xf6, + 0x71, 0x81, 0x0d, 0x34, 0x2b, 0x39, 0x3c, 0x28, 0x23, 0xb3, 0x39, 0x5a, 0x8c, 0x05, 0x3e, 0xfa, + 0x24, 0x8c, 0xb3, 0x5f, 0xca, 0x60, 0xac, 0x98, 0x2f, 0x8e, 0xa8, 0xe9, 0x88, 0xdc, 0x9a, 0xd2, + 0x28, 0xc2, 0x26, 0xa9, 0xb9, 0x6d, 0x28, 0xa9, 0xcf, 0x7a, 0xa8, 0x7a, 0xdb, 0x7f, 0x53, 0x84, + 0x99, 0x8c, 0x35, 0x87, 0x42, 0x63, 0x26, 0xae, 0xf4, 0xb9, 0x54, 0xdf, 0xe1, 0x5c, 0x84, 0xec, + 0x35, 0xd4, 0x10, 0x6b, 0xab, 0xef, 0x46, 0x6f, 0x85, 0x24, 0xd9, 0x28, 0x2d, 0xea, 0xdd, 0x28, + 0x6d, 0xec, 0xc4, 0x86, 0x9a, 0x36, 0xa4, 0x7a, 0xfa, 0x50, 0xe7, 0xf4, 0x4f, 0x8b, 0x70, 0x2a, + 0x2b, 0x54, 0x23, 0xfa, 0x5c, 0x22, 0x0b, 0xe9, 0x8b, 0xfd, 0x06, 0x79, 0xe4, 0xa9, 0x49, 0x45, + 0xf4, 0xb8, 0x79, 0x33, 0x2f, 0x69, 0xcf, 0x61, 0x16, 0x6d, 0xb2, 0xf8, 0x15, 0x01, 0xcf, 0x1e, + 0x2b, 0x8f, 0x8f, 0x0f, 0xf5, 0xdd, 0x01, 0x91, 0x76, 0x36, 0x4c, 0x18, 0xa3, 0xc8, 0xe2, 0xde, + 0xc6, 0x28, 0xb2, 0xe5, 0x39, 0x17, 0x46, 0xb5, 0xaf, 0x79, 0xa8, 0x33, 0xbe, 0x4b, 0x6f, 0x2b, + 0xad, 0xdf, 0x0f, 0x75, 0xd6, 0x7f, 0xdc, 0x82, 0x84, 0x7f, 0x82, 0x12, 0x8b, 0x59, 0xb9, 0x62, + 0xb1, 0x0b, 0x30, 0x10, 0xf8, 0x4d, 0x92, 0x4c, 0xd7, 0x89, 0xfd, 0x26, 0xc1, 0x0c, 0x42, 0x31, + 0xa2, 0x58, 0xd8, 0x31, 0xa6, 0x3f, 0xe4, 0xc4, 0x13, 0xed, 0x09, 0x18, 0x6c, 0x92, 0x3d, 0xd2, + 0x4c, 0x66, 0x55, 0xba, 0x41, 0x0b, 0x31, 0x87, 0xd9, 0xbf, 0x30, 0x00, 0xe7, 0xba, 0x46, 0x80, + 0xa1, 0xcf, 0xa1, 0x6d, 0x27, 0x22, 0x77, 0x9d, 0xfd, 0x64, 0xfa, 0x93, 0xab, 0xbc, 0x18, 0x4b, + 0x38, 0x73, 0x3b, 0xe3, 0x51, 0xcc, 0x13, 0x42, 0x44, 0x11, 0xbc, 0x5c, 0x40, 0x4d, 0xa1, 0x54, + 0xf1, 0x38, 0x84, 0x52, 0xcf, 0x03, 0x84, 0x61, 0x93, 0x5b, 0x71, 0x35, 0x84, 0x3f, 0x5b, 0x1c, + 0xed, 0xbe, 0x76, 0x43, 0x40, 0xb0, 0x86, 0x85, 0x2a, 0x30, 0xd5, 0x0e, 0xfc, 0x88, 0xcb, 0x64, + 0x2b, 0xdc, 0xd0, 0x71, 0xd0, 0x0c, 0xbe, 0x51, 0x4d, 0xc0, 0x71, 0xaa, 0x06, 0x7a, 0x09, 0x46, + 0x45, 0x40, 0x8e, 0xaa, 0xef, 0x37, 0x85, 0x18, 0x48, 0xd9, 0xfe, 0xd5, 0x62, 0x10, 0xd6, 0xf1, + 0xb4, 0x6a, 0x4c, 0xd0, 0x3b, 0x9c, 0x59, 0x8d, 0x0b, 0x7b, 0x35, 0xbc, 0x44, 0xd8, 0xd6, 0x91, + 0xbe, 0xc2, 0xb6, 0xc6, 0x82, 0xb1, 0x52, 0xdf, 0x7a, 0x47, 0xe8, 0x29, 0x4a, 0xfa, 0xb9, 0x01, + 0x98, 0x11, 0x0b, 0xe7, 0x61, 0x2f, 0x97, 0x5b, 0xe9, 0xe5, 0x72, 0x1c, 0xa2, 0xb3, 0xf7, 0xd6, + 0xcc, 0x49, 0xaf, 0x99, 0x1f, 0xb5, 0xc0, 0x64, 0xaf, 0xd0, 0xff, 0x95, 0x9b, 0x3f, 0xea, 0xa5, + 0x5c, 0x76, 0x4d, 0x85, 0x00, 0x7d, 0x87, 0x99, 0xa4, 0xec, 0x7f, 0x6b, 0xc1, 0xe3, 0x3d, 0x29, + 0xa2, 0x65, 0x28, 0x31, 0x1e, 0x50, 0x7b, 0x9d, 0x3d, 0xa5, 0x0c, 0xa1, 0x25, 0x20, 0x87, 0x25, + 0x8d, 0x6b, 0xa2, 0xe5, 0x54, 0xa2, 0xae, 0xa7, 0x33, 0x12, 0x75, 0x9d, 0x36, 0x86, 0xe7, 0x01, + 0x33, 0x75, 0xfd, 0x30, 0xbd, 0x71, 0x0c, 0x27, 0x24, 0xf4, 0x21, 0x43, 0xec, 0x67, 0x27, 0xc4, + 0x7e, 0xc8, 0xc4, 0xd6, 0xee, 0x90, 0x8f, 0xc1, 0x14, 0x8b, 0xd4, 0xc5, 0xcc, 0xf2, 0x85, 0x7b, + 0x54, 0x21, 0x36, 0xbd, 0xbd, 0x91, 0x80, 0xe1, 0x14, 0xb6, 0xfd, 0x87, 0x45, 0x18, 0xe2, 0xdb, + 0xef, 0x04, 0xde, 0x84, 0xcf, 0x40, 0xc9, 0x6d, 0xb5, 0x3a, 0x3c, 0xf7, 0xd2, 0x60, 0x6c, 0xc8, + 0xb9, 0x2a, 0x0b, 0x71, 0x0c, 0x47, 0x2b, 0x42, 0xe2, 0xdc, 0x25, 0x18, 0x28, 0xef, 0xf8, 0x7c, + 0xc5, 0x89, 0x1c, 0xce, 0xe0, 0xa8, 0x7b, 0x36, 0x96, 0x4d, 0xa3, 0x4f, 0x03, 0x84, 0x51, 0xe0, + 0x7a, 0xdb, 0xb4, 0x4c, 0xc4, 0x20, 0xfe, 0x40, 0x17, 0x6a, 0x35, 0x85, 0xcc, 0x69, 0xc6, 0x67, + 0x8e, 0x02, 0x60, 0x8d, 0x22, 0x9a, 0x37, 0x6e, 0xfa, 0xb9, 0xc4, 0xdc, 0x01, 0xa7, 0x1a, 0xcf, + 0xd9, 0xdc, 0x87, 0xa1, 0xa4, 0x88, 0xf7, 0x92, 0x3f, 0x8d, 0xe9, 0x6c, 0xd1, 0x47, 0x61, 0x32, + 0xd1, 0xb7, 0x23, 0x89, 0xaf, 0x7e, 0xd1, 0x82, 0x49, 0xde, 0x99, 0x65, 0x6f, 0x4f, 0xdc, 0x06, + 0x6f, 0xc3, 0xa9, 0x66, 0xc6, 0xa9, 0x2c, 0xa6, 0xbf, 0xff, 0x53, 0x5c, 0x89, 0xab, 0xb2, 0xa0, + 0x38, 0xb3, 0x0d, 0x74, 0x89, 0xee, 0x38, 0x7a, 0xea, 0x3a, 0x4d, 0xe1, 0x57, 0x3d, 0xc6, 0x77, + 0x1b, 0x2f, 0xc3, 0x0a, 0x6a, 0xff, 0x8e, 0x05, 0xd3, 0xbc, 0xe7, 0xd7, 0xc9, 0xbe, 0x3a, 0x9b, + 0xbe, 0x99, 0x7d, 0x17, 0x59, 0xff, 0x0a, 0x39, 0x59, 0xff, 0xf4, 0x4f, 0x2b, 0x76, 0xfd, 0xb4, + 0xaf, 0x58, 0x20, 0x56, 0xc8, 0x09, 0x08, 0x21, 0xbe, 0xd3, 0x14, 0x42, 0xcc, 0xe5, 0x6f, 0x82, + 0x1c, 0xe9, 0xc3, 0x9f, 0x59, 0x30, 0xc5, 0x11, 0x62, 0x6d, 0xf9, 0x37, 0x75, 0x1e, 0xfa, 0xc9, + 0x0d, 0x7e, 0x9d, 0xec, 0x6f, 0xf8, 0x55, 0x27, 0xda, 0xc9, 0xfe, 0x28, 0x63, 0xb2, 0x06, 0xba, + 0x4e, 0x56, 0x43, 0x6e, 0x20, 0x23, 0x29, 0x4e, 0x8f, 0x60, 0x13, 0x47, 0x4d, 0x8a, 0x63, 0x7f, + 0xc3, 0x02, 0xc4, 0x9b, 0x31, 0x18, 0x37, 0xca, 0x0e, 0xb1, 0x52, 0xed, 0xa2, 0x8b, 0x8f, 0x26, + 0x05, 0xc1, 0x1a, 0xd6, 0xb1, 0x0c, 0x4f, 0xc2, 0xe4, 0xa1, 0xd8, 0xdb, 0xe4, 0xe1, 0x08, 0x23, + 0xfa, 0x2f, 0x86, 0x20, 0xe9, 0x88, 0x85, 0x6e, 0xc3, 0x58, 0xdd, 0x69, 0x3b, 0x9b, 0x6e, 0xd3, + 0x8d, 0x5c, 0x12, 0x76, 0xb3, 0x87, 0x5a, 0xd2, 0xf0, 0x84, 0x92, 0x5a, 0x2b, 0xc1, 0x06, 0x1d, + 0x34, 0x0f, 0xd0, 0x0e, 0xdc, 0x3d, 0xb7, 0x49, 0xb6, 0x99, 0xac, 0x84, 0x45, 0x72, 0xe0, 0xc6, + 0x59, 0xb2, 0x14, 0x6b, 0x18, 0x19, 0x5e, 0xef, 0xc5, 0x87, 0xec, 0xf5, 0x0e, 0x27, 0xe6, 0xf5, + 0x3e, 0x70, 0x24, 0xaf, 0xf7, 0x91, 0x23, 0x7b, 0xbd, 0x0f, 0xf6, 0xe5, 0xf5, 0x8e, 0xe1, 0x8c, + 0xe4, 0x3d, 0xe9, 0xff, 0x15, 0xb7, 0x49, 0xc4, 0x83, 0x83, 0x87, 0x9f, 0x98, 0xbb, 0x7f, 0x50, + 0x3e, 0x83, 0x33, 0x31, 0x70, 0x4e, 0x4d, 0xf4, 0x71, 0x98, 0x75, 0x9a, 0x4d, 0xff, 0xae, 0x9a, + 0xd4, 0xe5, 0xb0, 0xee, 0x34, 0xb9, 0x12, 0x62, 0x98, 0x51, 0x7d, 0xec, 0xfe, 0x41, 0x79, 0x76, + 0x21, 0x07, 0x07, 0xe7, 0xd6, 0x46, 0x1f, 0x81, 0x52, 0x3b, 0xf0, 0xeb, 0x6b, 0x9a, 0xb7, 0xe8, + 0x79, 0x3a, 0x80, 0x55, 0x59, 0x78, 0x78, 0x50, 0x1e, 0x57, 0x7f, 0xd8, 0x85, 0x1f, 0x57, 0xc8, + 0x70, 0x63, 0x1f, 0x3d, 0x56, 0x37, 0xf6, 0x5d, 0x98, 0xa9, 0x91, 0xc0, 0x75, 0x9a, 0xee, 0xdb, + 0x94, 0x5f, 0x96, 0xe7, 0xd3, 0x06, 0x94, 0x82, 0xc4, 0x89, 0xdc, 0x57, 0x80, 0x4e, 0x2d, 0x3b, + 0x89, 0x3c, 0x81, 0x63, 0x42, 0xf6, 0xff, 0xb0, 0x60, 0x58, 0x38, 0x5e, 0x9d, 0x00, 0xd7, 0xb8, + 0x60, 0x68, 0x12, 0xca, 0xd9, 0x03, 0xc6, 0x3a, 0x93, 0xab, 0x43, 0x58, 0x4d, 0xe8, 0x10, 0x1e, + 0xef, 0x46, 0xa4, 0xbb, 0xf6, 0xe0, 0x2f, 0x17, 0x29, 0xf7, 0x6e, 0xb8, 0x00, 0x3f, 0xfc, 0x21, + 0x58, 0x87, 0xe1, 0x50, 0xb8, 0xa0, 0x16, 0xf2, 0x7d, 0x1a, 0x92, 0x93, 0x18, 0xdb, 0xb1, 0x09, + 0xa7, 0x53, 0x49, 0x24, 0xd3, 0xb7, 0xb5, 0xf8, 0x10, 0x7d, 0x5b, 0x7b, 0x39, 0x49, 0x0f, 0x1c, + 0x87, 0x93, 0xb4, 0xfd, 0x35, 0x76, 0x73, 0xea, 0xe5, 0x27, 0xc0, 0x54, 0x5d, 0x35, 0xef, 0x58, + 0xbb, 0xcb, 0xca, 0x12, 0x9d, 0xca, 0x61, 0xae, 0x7e, 0xde, 0x82, 0x73, 0x19, 0x5f, 0xa5, 0x71, + 0x5a, 0xcf, 0xc2, 0x88, 0xd3, 0x69, 0xb8, 0x6a, 0x2f, 0x6b, 0xfa, 0xc4, 0x05, 0x51, 0x8e, 0x15, + 0x06, 0x5a, 0x82, 0x69, 0x72, 0xaf, 0xed, 0x72, 0x55, 0xaa, 0x6e, 0xfe, 0x5b, 0xe4, 0xde, 0x7a, + 0xcb, 0x49, 0x20, 0x4e, 0xe3, 0xab, 0xc0, 0x34, 0xc5, 0xdc, 0xc0, 0x34, 0x7f, 0xcb, 0x82, 0x51, + 0xe5, 0x84, 0xf9, 0xd0, 0x47, 0xfb, 0x63, 0xe6, 0x68, 0x3f, 0xda, 0x65, 0xb4, 0x73, 0x86, 0xf9, + 0xb7, 0x0a, 0xaa, 0xbf, 0x55, 0x3f, 0x88, 0xfa, 0xe0, 0xe0, 0x1e, 0xdc, 0x75, 0xe1, 0x0a, 0x8c, + 0x3a, 0xed, 0xb6, 0x04, 0x48, 0x1b, 0x34, 0x16, 0x6e, 0x39, 0x2e, 0xc6, 0x3a, 0x8e, 0xf2, 0xa4, + 0x28, 0xe6, 0x7a, 0x52, 0x34, 0x00, 0x22, 0x27, 0xd8, 0x26, 0x11, 0x2d, 0x13, 0x26, 0xb3, 0xf9, + 0xe7, 0x4d, 0x27, 0x72, 0x9b, 0xf3, 0xae, 0x17, 0x85, 0x51, 0x30, 0xbf, 0xea, 0x45, 0x37, 0x03, + 0xfe, 0x84, 0xd4, 0x42, 0x3b, 0x29, 0x5a, 0x58, 0xa3, 0x2b, 0x03, 0x0e, 0xb0, 0x36, 0x06, 0x4d, + 0x63, 0x86, 0x75, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x61, 0x76, 0xfb, 0xb0, 0x31, 0x3d, 0x5a, 0x58, + 0xa3, 0xaf, 0x8c, 0xa9, 0xd9, 0x60, 0x9a, 0xcc, 0x8a, 0x1e, 0x3c, 0xa9, 0xfb, 0x61, 0x4f, 0x1b, + 0xd6, 0xfd, 0xfa, 0xe2, 0x08, 0x4b, 0xe8, 0xbb, 0x52, 0x06, 0x2a, 0xcf, 0xf5, 0xb8, 0x35, 0x8e, + 0x60, 0x92, 0xc2, 0x72, 0xaf, 0xb0, 0xcc, 0x14, 0xab, 0x55, 0xb1, 0x2f, 0xb4, 0xdc, 0x2b, 0x02, + 0x80, 0x63, 0x1c, 0xca, 0x4c, 0xa9, 0x3f, 0xe1, 0x2c, 0x8a, 0x63, 0x90, 0x2a, 0xec, 0x10, 0x6b, + 0x18, 0xe8, 0xb2, 0x10, 0x28, 0x70, 0xbd, 0xc0, 0xa3, 0x09, 0x81, 0x82, 0x1c, 0x2e, 0x4d, 0x0a, + 0x74, 0x05, 0x46, 0x55, 0xba, 0xed, 0x2a, 0xcf, 0x7a, 0x24, 0x96, 0xd9, 0x72, 0x5c, 0x8c, 0x75, + 0x1c, 0xb4, 0x01, 0x93, 0x21, 0x97, 0xb3, 0xa9, 0xc0, 0xd0, 0x5c, 0x5e, 0xf9, 0x01, 0x69, 0x05, + 0x54, 0x33, 0xc1, 0x87, 0xac, 0x88, 0x9f, 0x4e, 0x32, 0x28, 0x40, 0x92, 0x04, 0x7a, 0x0d, 0x26, + 0x9a, 0xbe, 0xd3, 0x58, 0x74, 0x9a, 0x8e, 0x57, 0x67, 0xe3, 0x33, 0x62, 0x66, 0x6d, 0xbd, 0x61, + 0x40, 0x71, 0x02, 0x9b, 0x32, 0x6f, 0x7a, 0x89, 0x08, 0x66, 0xee, 0x78, 0xdb, 0x24, 0x14, 0xc9, + 0x93, 0x19, 0xf3, 0x76, 0x23, 0x07, 0x07, 0xe7, 0xd6, 0x46, 0x2f, 0xc3, 0x98, 0xfc, 0x7c, 0x2d, + 0x86, 0x46, 0xec, 0x94, 0xa2, 0xc1, 0xb0, 0x81, 0x89, 0xee, 0xc2, 0x69, 0xf9, 0x7f, 0x23, 0x70, + 0xb6, 0xb6, 0xdc, 0xba, 0x70, 0x2c, 0xe7, 0xde, 0xab, 0x0b, 0xd2, 0xc5, 0x72, 0x39, 0x0b, 0xe9, + 0xf0, 0xa0, 0x7c, 0x41, 0x8c, 0x5a, 0x26, 0x9c, 0x4d, 0x62, 0x36, 0x7d, 0xb4, 0x06, 0x33, 0x3b, + 0xc4, 0x69, 0x46, 0x3b, 0x4b, 0x3b, 0xa4, 0xbe, 0x2b, 0x37, 0x1d, 0x8b, 0xcc, 0xa1, 0x39, 0x70, + 0x5c, 0x4b, 0xa3, 0xe0, 0xac, 0x7a, 0xe8, 0x4d, 0x98, 0x6d, 0x77, 0x36, 0x9b, 0x6e, 0xb8, 0xb3, + 0xee, 0x47, 0xcc, 0x14, 0x48, 0x65, 0xef, 0x16, 0x21, 0x3c, 0x54, 0xec, 0x93, 0x6a, 0x0e, 0x1e, + 0xce, 0xa5, 0x80, 0xde, 0x86, 0xd3, 0x89, 0xc5, 0x20, 0x82, 0x18, 0x4c, 0xe4, 0xa7, 0x86, 0xa8, + 0x65, 0x55, 0x10, 0xf1, 0x40, 0xb2, 0x40, 0x38, 0xbb, 0x09, 0xf4, 0x0a, 0x80, 0xdb, 0x5e, 0x71, + 0x5a, 0x6e, 0x93, 0x3e, 0x17, 0x67, 0xd8, 0x3a, 0xa1, 0x4f, 0x07, 0x58, 0xad, 0xca, 0x52, 0x7a, + 0x3e, 0x8b, 0x7f, 0xfb, 0x58, 0xc3, 0x46, 0x37, 0x60, 0x42, 0xfc, 0xdb, 0x17, 0xd3, 0xca, 0x63, + 0x69, 0x3c, 0xc9, 0x02, 0x21, 0x55, 0x75, 0xc8, 0x61, 0xaa, 0x04, 0x27, 0xea, 0xa2, 0x6d, 0x38, + 0x27, 0xd3, 0x7c, 0xe9, 0x6b, 0x54, 0xce, 0x41, 0xc8, 0xf2, 0x31, 0x8c, 0x70, 0xdf, 0x90, 0x85, + 0x6e, 0x88, 0xb8, 0x3b, 0x1d, 0x7a, 0xb7, 0xeb, 0x4b, 0x9d, 0x7b, 0xcf, 0x9e, 0xe6, 0xa6, 0x49, + 0xf4, 0x6e, 0xbf, 0x91, 0x04, 0xe2, 0x34, 0x3e, 0x0a, 0xe1, 0xb4, 0xeb, 0x65, 0xad, 0xec, 0x33, + 0x8c, 0xd0, 0x47, 0xb9, 0xe3, 0x70, 0xf7, 0x55, 0x9d, 0x09, 0xe7, 0xab, 0x3a, 0x93, 0xf6, 0x3b, + 0xb3, 0xc0, 0xfb, 0x6d, 0x8b, 0xd6, 0xd6, 0xb8, 0x74, 0xf4, 0x19, 0x18, 0xd3, 0x3f, 0x4c, 0x70, + 0x1c, 0x17, 0xb3, 0x99, 0x58, 0xed, 0x6c, 0xe0, 0x3c, 0xbe, 0xda, 0xff, 0x3a, 0x0c, 0x1b, 0x14, + 0x51, 0x3d, 0xc3, 0xc5, 0xfe, 0x72, 0x7f, 0x1c, 0x4d, 0xff, 0x06, 0x68, 0x04, 0xb2, 0x97, 0x3c, + 0xba, 0x01, 0x23, 0xf5, 0xa6, 0x4b, 0xbc, 0x68, 0xb5, 0xda, 0x2d, 0xe8, 0xde, 0x92, 0xc0, 0x11, + 0x7b, 0x48, 0xa4, 0x57, 0xe0, 0x65, 0x58, 0x51, 0xb0, 0x7f, 0xad, 0x00, 0xe5, 0x1e, 0xb9, 0x3a, + 0x12, 0xea, 0x28, 0xab, 0x2f, 0x75, 0xd4, 0x82, 0x4c, 0x4f, 0xbf, 0x9e, 0x90, 0x74, 0x25, 0x52, + 0xcf, 0xc7, 0xf2, 0xae, 0x24, 0x7e, 0xdf, 0xee, 0x01, 0xba, 0x46, 0x6b, 0xa0, 0xa7, 0x83, 0x8b, + 0xa1, 0xc9, 0x1e, 0xec, 0xff, 0xf9, 0x9b, 0xab, 0x95, 0xb4, 0xbf, 0x56, 0x80, 0xd3, 0x6a, 0x08, + 0xbf, 0x7d, 0x07, 0xee, 0x56, 0x7a, 0xe0, 0x8e, 0x41, 0xa7, 0x6b, 0xdf, 0x84, 0x21, 0x1e, 0x45, + 0xb0, 0x0f, 0xb6, 0xfb, 0x09, 0x33, 0x4a, 0xaf, 0xe2, 0xf4, 0x8c, 0x48, 0xbd, 0x3f, 0x68, 0xc1, + 0x64, 0xc2, 0xcf, 0x0c, 0x61, 0xcd, 0x19, 0xf9, 0x41, 0x58, 0xe3, 0x2c, 0xa6, 0xfb, 0x02, 0x0c, + 0xec, 0xf8, 0x61, 0x94, 0x34, 0xf8, 0xb8, 0xe6, 0x87, 0x11, 0x66, 0x10, 0xfb, 0x77, 0x2d, 0x18, + 0xdc, 0x70, 0x5c, 0x2f, 0x92, 0xca, 0x01, 0x2b, 0x47, 0x39, 0xd0, 0xcf, 0x77, 0xa1, 0x97, 0x60, + 0x88, 0x6c, 0x6d, 0x91, 0x7a, 0x24, 0x66, 0x55, 0x46, 0x72, 0x18, 0x5a, 0x66, 0xa5, 0x94, 0x0f, + 0x64, 0x8d, 0xf1, 0xbf, 0x58, 0x20, 0xa3, 0x3b, 0x50, 0x8a, 0xdc, 0x16, 0x59, 0x68, 0x34, 0x84, + 0xca, 0xfc, 0x01, 0xa2, 0x51, 0x6c, 0x48, 0x02, 0x38, 0xa6, 0x65, 0x7f, 0xb1, 0x00, 0x10, 0x87, + 0x5f, 0xea, 0xf5, 0x89, 0x8b, 0x29, 0x65, 0xea, 0xc5, 0x0c, 0x65, 0x2a, 0x8a, 0x09, 0x66, 0x68, + 0x52, 0xd5, 0x30, 0x15, 0xfb, 0x1a, 0xa6, 0x81, 0xa3, 0x0c, 0xd3, 0x12, 0x4c, 0xc7, 0xe1, 0xa3, + 0xcc, 0xe8, 0x79, 0xec, 0xfa, 0xdc, 0x48, 0x02, 0x71, 0x1a, 0xdf, 0x26, 0x70, 0x41, 0x45, 0xd1, + 0x11, 0x37, 0x1a, 0xb3, 0xc8, 0xd6, 0x95, 0xd3, 0x3d, 0xc6, 0x29, 0xd6, 0x16, 0x17, 0x72, 0xb5, + 0xc5, 0x3f, 0x65, 0xc1, 0xa9, 0x64, 0x3b, 0xcc, 0x7d, 0xf9, 0x0b, 0x16, 0x9c, 0x66, 0x3a, 0x73, + 0xd6, 0x6a, 0x5a, 0x43, 0xff, 0x62, 0xd7, 0xc8, 0x40, 0x39, 0x3d, 0x8e, 0x43, 0x86, 0xac, 0x65, + 0x91, 0xc6, 0xd9, 0x2d, 0xda, 0xff, 0x7d, 0x00, 0x66, 0xf3, 0x42, 0x0a, 0x31, 0x87, 0x0d, 0xe7, + 0x5e, 0x6d, 0x97, 0xdc, 0x15, 0x66, 0xf1, 0xb1, 0xc3, 0x06, 0x2f, 0xc6, 0x12, 0x9e, 0x4c, 0xbf, + 0x50, 0xe8, 0x33, 0xfd, 0xc2, 0x0e, 0x4c, 0xdf, 0xdd, 0x21, 0xde, 0x2d, 0x2f, 0x74, 0x22, 0x37, + 0xdc, 0x72, 0x99, 0x7e, 0x99, 0xaf, 0x1b, 0x99, 0xb3, 0x75, 0xfa, 0x4e, 0x12, 0xe1, 0xf0, 0xa0, + 0x7c, 0xce, 0x28, 0x88, 0xbb, 0xcc, 0x0f, 0x12, 0x9c, 0x26, 0x9a, 0xce, 0x5e, 0x31, 0xf0, 0x90, + 0xb3, 0x57, 0xb4, 0x5c, 0x61, 0x95, 0x22, 0xad, 0xf1, 0xd9, 0xcb, 0x71, 0x4d, 0x95, 0x62, 0x0d, + 0x03, 0x7d, 0x0a, 0x90, 0x9e, 0x9d, 0xc7, 0x88, 0xe8, 0xf8, 0xdc, 0xfd, 0x83, 0x32, 0x5a, 0x4f, + 0x41, 0x0f, 0x0f, 0xca, 0x33, 0xb4, 0x74, 0xd5, 0xa3, 0x2f, 0xd0, 0x38, 0x0c, 0x56, 0x06, 0x21, + 0x74, 0x07, 0xa6, 0x68, 0x29, 0xdb, 0x51, 0x32, 0x5c, 0x24, 0x7f, 0x35, 0x3e, 0x73, 0xff, 0xa0, + 0x3c, 0xb5, 0x9e, 0x80, 0xe5, 0x91, 0x4e, 0x11, 0x41, 0xaf, 0xc0, 0x44, 0xbc, 0xae, 0xae, 0x93, + 0x7d, 0x1e, 0x6e, 0xa6, 0xc4, 0x05, 0xdf, 0x6b, 0x06, 0x04, 0x27, 0x30, 0xed, 0x2f, 0x58, 0x70, + 0x36, 0x37, 0xc9, 0x33, 0xba, 0x04, 0x23, 0x4e, 0xdb, 0xe5, 0x6a, 0x0c, 0x71, 0xd5, 0x30, 0x71, + 0x59, 0x75, 0x95, 0x2b, 0x31, 0x14, 0x94, 0x9e, 0xf0, 0xbb, 0xae, 0xd7, 0x48, 0x9e, 0xf0, 0xd7, + 0x5d, 0xaf, 0x81, 0x19, 0x44, 0x5d, 0x59, 0xc5, 0xbc, 0x2b, 0xcb, 0xfe, 0x01, 0x0b, 0x84, 0x43, + 0x6e, 0x1f, 0xf7, 0xdb, 0x27, 0x61, 0x6c, 0x2f, 0x9d, 0x05, 0xec, 0x42, 0xbe, 0x87, 0xb2, 0xc8, + 0xfd, 0xa5, 0x98, 0x56, 0x23, 0xe3, 0x97, 0x41, 0xcb, 0x6e, 0x80, 0x80, 0x56, 0x08, 0x13, 0xd2, + 0xf7, 0xee, 0xcd, 0xf3, 0x00, 0x0d, 0x86, 0xcb, 0x52, 0x83, 0x16, 0x4c, 0xee, 0xa5, 0xa2, 0x20, + 0x58, 0xc3, 0xb2, 0xff, 0x55, 0x01, 0x46, 0x65, 0xd6, 0xa9, 0x8e, 0xd7, 0x8f, 0x28, 0xed, 0x48, + 0x69, 0x68, 0xd1, 0x65, 0x28, 0x31, 0x59, 0x6f, 0x35, 0x96, 0x40, 0x2a, 0x49, 0xcb, 0x9a, 0x04, + 0xe0, 0x18, 0x87, 0x9e, 0x34, 0x61, 0x67, 0x93, 0xa1, 0x27, 0xdc, 0x47, 0x6b, 0xbc, 0x18, 0x4b, + 0x38, 0xfa, 0x38, 0x4c, 0xf1, 0x7a, 0x81, 0xdf, 0x76, 0xb6, 0xb9, 0x7e, 0x68, 0x50, 0xc5, 0xe4, + 0x98, 0x5a, 0x4b, 0xc0, 0x0e, 0x0f, 0xca, 0xa7, 0x92, 0x65, 0x4c, 0xf1, 0x99, 0xa2, 0xc2, 0xcc, + 0xc0, 0x78, 0x23, 0xf4, 0x84, 0x4c, 0x59, 0x8f, 0xc5, 0x20, 0xac, 0xe3, 0xd9, 0x9f, 0x01, 0x94, + 0xce, 0xbf, 0x85, 0x5e, 0xe7, 0xb6, 0xbf, 0x6e, 0x40, 0x1a, 0xdd, 0x14, 0xa1, 0x7a, 0xe4, 0x09, + 0xe9, 0xf9, 0xc5, 0x6b, 0x61, 0x55, 0xdf, 0xfe, 0xff, 0x8a, 0x30, 0x95, 0xf4, 0x75, 0x47, 0xd7, + 0x60, 0x88, 0xb3, 0x67, 0x82, 0x7c, 0x17, 0x3b, 0x1b, 0xcd, 0x43, 0x9e, 0x5d, 0x54, 0x82, 0xc3, + 0x13, 0xf5, 0xd1, 0x9b, 0x30, 0xda, 0xf0, 0xef, 0x7a, 0x77, 0x9d, 0xa0, 0xb1, 0x50, 0x5d, 0x15, + 0xcb, 0x39, 0xf3, 0xe1, 0x5f, 0x89, 0xd1, 0x74, 0xaf, 0x7b, 0xa6, 0x53, 0x8e, 0x41, 0x58, 0x27, + 0x87, 0x36, 0x58, 0xd0, 0xfe, 0x2d, 0x77, 0x7b, 0xcd, 0x69, 0x77, 0x73, 0x04, 0x59, 0x92, 0x48, + 0x1a, 0xe5, 0x71, 0x11, 0xd9, 0x9f, 0x03, 0x70, 0x4c, 0x08, 0x7d, 0x0e, 0x66, 0xc2, 0x1c, 0x75, + 0x44, 0x5e, 0x3a, 0xc6, 0x6e, 0x12, 0xfa, 0xc5, 0x47, 0xee, 0x1f, 0x94, 0x67, 0xb2, 0x14, 0x17, + 0x59, 0xcd, 0xd8, 0x5f, 0x3a, 0x05, 0xc6, 0x26, 0x36, 0xb2, 0xf3, 0x5a, 0xc7, 0x94, 0x9d, 0x17, + 0xc3, 0x08, 0x69, 0xb5, 0xa3, 0xfd, 0x8a, 0x1b, 0x88, 0x39, 0xc9, 0xa4, 0xb9, 0x2c, 0x70, 0xd2, + 0x34, 0x25, 0x04, 0x2b, 0x3a, 0xd9, 0x29, 0x94, 0x8b, 0xdf, 0xc4, 0x14, 0xca, 0x03, 0x27, 0x98, + 0x42, 0x79, 0x1d, 0x86, 0xb7, 0xdd, 0x08, 0x93, 0xb6, 0x2f, 0x1e, 0x46, 0x99, 0xeb, 0xf0, 0x2a, + 0x47, 0x49, 0x27, 0xeb, 0x14, 0x00, 0x2c, 0x89, 0xa0, 0xd7, 0xd5, 0x0e, 0x1c, 0xca, 0x17, 0x5e, + 0xa4, 0x0d, 0x42, 0x32, 0xf7, 0xa0, 0x48, 0x94, 0x3c, 0xfc, 0xa0, 0x89, 0x92, 0x57, 0x64, 0x7a, + 0xe3, 0x91, 0x7c, 0xaf, 0x2d, 0x96, 0xbd, 0xb8, 0x47, 0x52, 0xe3, 0xdb, 0x7a, 0x4a, 0xe8, 0x52, + 0xfe, 0x49, 0xa0, 0xb2, 0x3d, 0xf7, 0x99, 0x08, 0xfa, 0x07, 0x2c, 0x38, 0xdd, 0xce, 0xca, 0x8e, + 0x2e, 0x6c, 0x27, 0x5e, 0xea, 0x3b, 0x01, 0xbb, 0xd1, 0x20, 0x93, 0x39, 0x66, 0xa7, 0xd8, 0xcf, + 0x6e, 0x8e, 0x0e, 0x74, 0xb0, 0xd9, 0x10, 0x3a, 0xfc, 0x27, 0x72, 0x32, 0x4a, 0x77, 0xc9, 0x23, + 0xbd, 0x91, 0x91, 0xbd, 0xf8, 0xc9, 0xbc, 0xec, 0xc5, 0x7d, 0xe7, 0x2c, 0x7e, 0x5d, 0xe5, 0x92, + 0x1e, 0xcf, 0x5f, 0x4a, 0x3c, 0x53, 0x74, 0xcf, 0x0c, 0xd2, 0xaf, 0xab, 0x0c, 0xd2, 0x5d, 0x82, + 0x2b, 0xf3, 0xfc, 0xd0, 0x3d, 0xf3, 0x46, 0x6b, 0xb9, 0x9f, 0x27, 0x8f, 0x27, 0xf7, 0xb3, 0x71, + 0xd5, 0xf0, 0xf4, 0xc3, 0xcf, 0xf4, 0xb8, 0x6a, 0x0c, 0xba, 0xdd, 0x2f, 0x1b, 0x9e, 0xe7, 0x7a, + 0xfa, 0x81, 0xf2, 0x5c, 0xdf, 0xd6, 0xf3, 0x46, 0xa3, 0x1e, 0x89, 0x91, 0x29, 0x52, 0x9f, 0xd9, + 0xa2, 0x6f, 0xeb, 0x17, 0xe0, 0x4c, 0x3e, 0x5d, 0x75, 0xcf, 0xa5, 0xe9, 0x66, 0x5e, 0x81, 0xa9, + 0x2c, 0xd4, 0xa7, 0x4e, 0x26, 0x0b, 0xf5, 0xe9, 0x63, 0xcf, 0x42, 0x7d, 0xe6, 0x04, 0xb2, 0x50, + 0x3f, 0x72, 0x82, 0x59, 0xa8, 0x6f, 0x33, 0x83, 0x23, 0x1e, 0xd6, 0x48, 0x04, 0x83, 0x7e, 0x3a, + 0x27, 0x2a, 0x58, 0x3a, 0xf6, 0x11, 0xff, 0x38, 0x05, 0xc2, 0x31, 0xa9, 0x8c, 0xec, 0xd6, 0xb3, + 0x0f, 0x21, 0xbb, 0xf5, 0x7a, 0x9c, 0xdd, 0xfa, 0x6c, 0xfe, 0x54, 0x67, 0xb8, 0xa8, 0xe4, 0xe4, + 0xb4, 0xbe, 0xad, 0xe7, 0xa2, 0x7e, 0xb4, 0x8b, 0x56, 0x29, 0x4b, 0x38, 0xdb, 0x25, 0x03, 0xf5, + 0x6b, 0x3c, 0x03, 0xf5, 0x63, 0xf9, 0x27, 0x79, 0xf2, 0xba, 0x33, 0xf2, 0x4e, 0xd3, 0x7e, 0xa9, + 0xb0, 0xa0, 0x2c, 0xec, 0x75, 0x4e, 0xbf, 0x54, 0x5c, 0xd1, 0x74, 0xbf, 0x14, 0x08, 0xc7, 0xa4, + 0xec, 0x1f, 0x2a, 0xc0, 0xf9, 0xee, 0xfb, 0x2d, 0x96, 0x38, 0x57, 0x63, 0x25, 0x7b, 0x42, 0xe2, + 0xcc, 0xdf, 0x6c, 0x31, 0x56, 0xdf, 0x51, 0x0e, 0xaf, 0xc2, 0xb4, 0xf2, 0x6d, 0xa1, 0x6f, 0xf4, + 0xf5, 0xf8, 0xe5, 0xab, 0xe2, 0x01, 0xd4, 0x92, 0x08, 0x38, 0x5d, 0x07, 0x2d, 0xc0, 0xa4, 0x51, + 0xb8, 0x5a, 0x11, 0x6f, 0x33, 0x25, 0xe2, 0xae, 0x99, 0x60, 0x9c, 0xc4, 0xb7, 0xbf, 0x6c, 0xc1, + 0x23, 0x39, 0xe9, 0x1b, 0xfb, 0x0e, 0xe2, 0xb7, 0x05, 0x93, 0x6d, 0xb3, 0x6a, 0x8f, 0xb8, 0xa3, + 0x46, 0x92, 0x48, 0xd5, 0xd7, 0x04, 0x00, 0x27, 0x89, 0xda, 0x3f, 0x53, 0x80, 0x73, 0x5d, 0x8d, + 0x35, 0x11, 0x86, 0x33, 0xdb, 0xad, 0xd0, 0x59, 0x0a, 0x48, 0x83, 0x78, 0x91, 0xeb, 0x34, 0x6b, + 0x6d, 0x52, 0xd7, 0x74, 0x06, 0xcc, 0xea, 0xf1, 0xea, 0x5a, 0x6d, 0x21, 0x8d, 0x81, 0x73, 0x6a, + 0xa2, 0x15, 0x40, 0x69, 0x88, 0x98, 0x61, 0x16, 0x40, 0x3d, 0x4d, 0x0f, 0x67, 0xd4, 0x40, 0x1f, + 0x86, 0x71, 0x65, 0x04, 0xaa, 0xcd, 0x38, 0x3b, 0xd8, 0xb1, 0x0e, 0xc0, 0x26, 0x1e, 0xba, 0xc2, + 0x23, 0xf0, 0x8b, 0x5c, 0x0d, 0x42, 0xc1, 0x30, 0x29, 0xc3, 0xeb, 0x8b, 0x62, 0xac, 0xe3, 0x2c, + 0xbe, 0xfc, 0xeb, 0xbf, 0x7f, 0xfe, 0x7d, 0xbf, 0xf9, 0xfb, 0xe7, 0xdf, 0xf7, 0x3b, 0xbf, 0x7f, + 0xfe, 0x7d, 0xdf, 0x73, 0xff, 0xbc, 0xf5, 0xeb, 0xf7, 0xcf, 0x5b, 0xbf, 0x79, 0xff, 0xbc, 0xf5, + 0x3b, 0xf7, 0xcf, 0x5b, 0xbf, 0x77, 0xff, 0xbc, 0xf5, 0xc5, 0x3f, 0x38, 0xff, 0xbe, 0x4f, 0xa2, + 0x38, 0x2c, 0xe6, 0x65, 0x3a, 0x3b, 0x97, 0xf7, 0xae, 0xfc, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x04, 0xa7, 0x88, 0x7f, 0x92, 0x09, 0x01, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -7459,6 +7466,18 @@ func (m *CSIPersistentVolumeSource) MarshalToSizedBuffer(dAtA []byte) (int, erro _ = i var l int _ = l + if m.NodeExpandSecretRef != nil { + { + size, err := m.NodeExpandSecretRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } if m.ControllerExpandSecretRef != nil { { size, err := m.ControllerExpandSecretRef.MarshalToSizedBuffer(dAtA[:i]) @@ -15040,6 +15059,18 @@ func (m *PodSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.HostUsers != nil { + i-- + if *m.HostUsers { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xa8 + } if m.OS != nil { { size, err := m.OS.MarshalToSizedBuffer(dAtA[:i]) @@ -18902,6 +18933,29 @@ func (m *TopologySpreadConstraint) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if len(m.MatchLabelKeys) > 0 { + for iNdEx := len(m.MatchLabelKeys) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.MatchLabelKeys[iNdEx]) + copy(dAtA[i:], m.MatchLabelKeys[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.MatchLabelKeys[iNdEx]))) + i-- + dAtA[i] = 0x42 + } + } + if m.NodeTaintsPolicy != nil { + i -= len(*m.NodeTaintsPolicy) + copy(dAtA[i:], *m.NodeTaintsPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.NodeTaintsPolicy))) + i-- + dAtA[i] = 0x3a + } + if m.NodeAffinityPolicy != nil { + i -= len(*m.NodeAffinityPolicy) + copy(dAtA[i:], *m.NodeAffinityPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.NodeAffinityPolicy))) + i-- + dAtA[i] = 0x32 + } if m.MinDomains != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.MinDomains)) i-- @@ -19927,6 +19981,10 @@ func (m *CSIPersistentVolumeSource) Size() (n int) { l = m.ControllerExpandSecretRef.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.NodeExpandSecretRef != nil { + l = m.NodeExpandSecretRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -22812,6 +22870,9 @@ func (m *PodSpec) Size() (n int) { l = m.OS.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.HostUsers != nil { + n += 3 + } return n } @@ -24093,6 +24154,20 @@ func (m *TopologySpreadConstraint) Size() (n int) { if m.MinDomains != nil { n += 1 + sovGenerated(uint64(*m.MinDomains)) } + if m.NodeAffinityPolicy != nil { + l = len(*m.NodeAffinityPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NodeTaintsPolicy != nil { + l = len(*m.NodeTaintsPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.MatchLabelKeys) > 0 { + for _, s := range m.MatchLabelKeys { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -24509,6 +24584,7 @@ func (this *CSIPersistentVolumeSource) String() string { `NodeStageSecretRef:` + strings.Replace(this.NodeStageSecretRef.String(), "SecretReference", "SecretReference", 1) + `,`, `NodePublishSecretRef:` + strings.Replace(this.NodePublishSecretRef.String(), "SecretReference", "SecretReference", 1) + `,`, `ControllerExpandSecretRef:` + strings.Replace(this.ControllerExpandSecretRef.String(), "SecretReference", "SecretReference", 1) + `,`, + `NodeExpandSecretRef:` + strings.Replace(this.NodeExpandSecretRef.String(), "SecretReference", "SecretReference", 1) + `,`, `}`, }, "") return s @@ -26684,6 +26760,7 @@ func (this *PodSpec) String() string { `EphemeralContainers:` + repeatedStringForEphemeralContainers + `,`, `SetHostnameAsFQDN:` + valueToStringGenerated(this.SetHostnameAsFQDN) + `,`, `OS:` + strings.Replace(this.OS.String(), "PodOS", "PodOS", 1) + `,`, + `HostUsers:` + valueToStringGenerated(this.HostUsers) + `,`, `}`, }, "") return s @@ -27681,6 +27758,9 @@ func (this *TopologySpreadConstraint) String() string { `WhenUnsatisfiable:` + fmt.Sprintf("%v", this.WhenUnsatisfiable) + `,`, `LabelSelector:` + strings.Replace(fmt.Sprintf("%v", this.LabelSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, `MinDomains:` + valueToStringGenerated(this.MinDomains) + `,`, + `NodeAffinityPolicy:` + valueToStringGenerated(this.NodeAffinityPolicy) + `,`, + `NodeTaintsPolicy:` + valueToStringGenerated(this.NodeTaintsPolicy) + `,`, + `MatchLabelKeys:` + fmt.Sprintf("%v", this.MatchLabelKeys) + `,`, `}`, }, "") return s @@ -29416,6 +29496,42 @@ func (m *CSIPersistentVolumeSource) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeExpandSecretRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NodeExpandSecretRef == nil { + m.NodeExpandSecretRef = &SecretReference{} + } + if err := m.NodeExpandSecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -54337,6 +54453,27 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 37: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HostUsers", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.HostUsers = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -63945,7 +64082,7 @@ func (m *ServiceSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := IPFamilyPolicyType(dAtA[iNdEx:postIndex]) + s := IPFamilyPolicy(dAtA[iNdEx:postIndex]) m.IPFamilyPolicy = &s iNdEx = postIndex case 18: @@ -65702,6 +65839,104 @@ func (m *TopologySpreadConstraint) Unmarshal(dAtA []byte) error { } } m.MinDomains = &v + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeAffinityPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := NodeInclusionPolicy(dAtA[iNdEx:postIndex]) + m.NodeAffinityPolicy = &s + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeTaintsPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := NodeInclusionPolicy(dAtA[iNdEx:postIndex]) + m.NodeTaintsPolicy = &s + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchLabelKeys", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchLabelKeys = append(m.MatchLabelKeys, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index 41423f45f..256f5da32 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -220,11 +220,20 @@ message CSIPersistentVolumeSource { // controllerExpandSecretRef is a reference to the secret object containing // sensitive information to pass to the CSI driver to complete the CSI // ControllerExpandVolume call. - // This is an alpha field and requires enabling ExpandCSIVolumes feature gate. + // This is an beta field and requires enabling ExpandCSIVolumes feature gate. // This field is optional, and may be empty if no secret is required. If the // secret object contains more than one secret, all secrets are passed. // +optional optional SecretReference controllerExpandSecretRef = 9; + + // nodeExpandSecretRef is a reference to the secret object containing + // sensitive information to pass to the CSI driver to complete the CSI + // NodeExpandVolume call. + // This is an alpha field and requires enabling CSINodeExpandSecret feature gate. + // This field is optional, may be omitted if no secret is required. If the + // secret object contains more than one secret, all secrets are passed. + // +optional + optional SecretReference nodeExpandSecretRef = 10; } // Represents a source location of a volume to mount, managed by an external CSI driver @@ -647,12 +656,12 @@ message Container { // +optional optional string workingDir = 5; - // List of ports to expose from the container. Exposing a port here gives - // the system additional information about the network connections a - // container uses, but is primarily informational. Not specifying a port here + // List of ports to expose from the container. Not specifying a port here // DOES NOT prevent that port from being exposed. Any port which is // listening on the default "0.0.0.0" address inside a container will be // accessible from the network. + // Modifying this array with strategic merge patch may corrupt the data. + // For more information See https://github.com/kubernetes/kubernetes/issues/108255. // Cannot be updated. // +optional // +patchMergeKey=containerPort @@ -785,7 +794,7 @@ message Container { // Describe a container image message ContainerImage { // Names by which this image is known. - // e.g. ["k8s.gcr.io/hyperkube:v1.0.7", "dockerhub.io/google_containers/hyperkube:v1.0.7"] + // e.g. ["kubernetes.example/hyperkube:v1.0.7", "cloud-vendor.registry.example/cloud-vendor/hyperkube:v1.0.7"] // +optional repeated string names = 1; @@ -1062,13 +1071,16 @@ message EndpointPort { // EndpointSubset is a group of addresses with a common set of ports. The // expanded set of endpoints is the Cartesian product of Addresses x Ports. // For example, given: -// { -// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], -// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] -// } +// +// { +// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], +// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] +// } +// // The resulting set of endpoints can be viewed as: -// a: [ 10.10.1.1:8675, 10.10.2.2:8675 ], -// b: [ 10.10.1.1:309, 10.10.2.2:309 ] +// +// a: [ 10.10.1.1:8675, 10.10.2.2:8675 ], +// b: [ 10.10.1.1:309, 10.10.2.2:309 ] message EndpointSubset { // IP addresses which offer the related ports that are marked as ready. These endpoints // should be considered safe for load balancers and clients to utilize. @@ -1087,17 +1099,18 @@ message EndpointSubset { } // Endpoints is a collection of endpoints that implement the actual service. Example: -// Name: "mysvc", -// Subsets: [ -// { -// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], -// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] -// }, -// { -// Addresses: [{"ip": "10.10.3.3"}], -// Ports: [{"name": "a", "port": 93}, {"name": "b", "port": 76}] -// }, -// ] +// +// Name: "mysvc", +// Subsets: [ +// { +// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], +// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] +// }, +// { +// Addresses: [{"ip": "10.10.3.3"}], +// Ports: [{"name": "a", "port": 93}, {"name": "b", "port": 76}] +// }, +// ] message Endpoints { // Standard object's metadata. // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata @@ -1192,8 +1205,6 @@ message EnvVarSource { // // To add an ephemeral container, use the ephemeralcontainers subresource of an existing // Pod. Ephemeral containers may not be removed or restarted. -// -// This is a beta feature available on clusters that haven't disabled the EphemeralContainers feature gate. message EphemeralContainer { // Ephemeral containers have all of the fields of Container, plus additional fields // specific to ephemeral containers. Fields in common with Container are in the @@ -2535,6 +2546,7 @@ message ObjectFieldSelector { // and the version of the actual struct is irrelevant. // 5. We cannot easily change it. Because this type is embedded in many locations, updates to this type // will affect numerous schemas. Don't make new APIs embed an underspecified API type they do not control. +// // Instead of using this type, create a locally provided and used type that is well-focused on your reference. // For example, ServiceReferences for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 . // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -2939,6 +2951,7 @@ message PersistentVolumeSpec { // claim.VolumeName is the authoritative bind between PV and PVC. // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#binding // +optional + // +structType=granular optional ObjectReference claimRef = 4; // persistentVolumeReclaimPolicy defines what happens to a persistent volume when released from its claim. @@ -3232,7 +3245,8 @@ message PodExecOptions { // IP address information for entries in the (plural) PodIPs field. // Each entry includes: -// IP: An IP address allocated to the pod. Routable at least within the cluster. +// +// IP: An IP address allocated to the pod. Routable at least within the cluster. message PodIP { // ip is an IP address (IPv4 or IPv6) assigned to the pod optional string ip = 1; @@ -3474,7 +3488,6 @@ message PodSpec { // pod to perform user-initiated actions such as debugging. This list cannot be specified when // creating a pod, and it cannot be modified by updating the pod spec. In order to add an // ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. - // This field is beta-level and available on clusters that haven't disabled the EphemeralContainers feature gate. // +optional // +patchMergeKey=name // +patchStrategy=merge @@ -3700,6 +3713,7 @@ message PodSpec { // If the OS field is set to windows, following fields must be unset: // - spec.hostPID // - spec.hostIPC + // - spec.hostUsers // - spec.securityContext.seLinuxOptions // - spec.securityContext.seccompProfile // - spec.securityContext.fsGroup @@ -3719,8 +3733,20 @@ message PodSpec { // - spec.containers[*].securityContext.runAsUser // - spec.containers[*].securityContext.runAsGroup // +optional - // This is a beta field and requires the IdentifyPodOS feature optional PodOS os = 36; + + // Use the host's user namespace. + // Optional: Default to true. + // If set to true or not present, the pod will be run in the host user namespace, useful + // for when the pod needs a feature only available to the host user namespace, such as + // loading a kernel module with CAP_SYS_MODULE. + // When set to false, a new userns is created for the pod. Setting false is useful for + // mitigating container breakout vulnerabilities even allowing users to run their + // containers as root without actually having root privileges on the host. + // This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature. + // +k8s:conversion-gen=false + // +optional + optional bool hostUsers = 37; } // PodStatus represents information about the status of a pod. Status may trail the actual @@ -3814,7 +3840,6 @@ message PodStatus { optional string qosClass = 9; // Status for any ephemeral containers that have run in this pod. - // This field is beta-level and available on clusters that haven't disabled the EphemeralContainers feature gate. // +optional repeated ContainerStatus ephemeralContainerStatuses = 13; } @@ -5083,12 +5108,19 @@ message ServiceSpec { // +optional optional string externalName = 10; - // externalTrafficPolicy denotes if this Service desires to route external - // traffic to node-local or cluster-wide endpoints. "Local" preserves the - // client source IP and avoids a second hop for LoadBalancer and Nodeport - // type services, but risks potentially imbalanced traffic spreading. - // "Cluster" obscures the client source IP and may cause a second hop to - // another node, but should have good overall load-spreading. + // externalTrafficPolicy describes how nodes distribute service traffic they + // receive on one of the Service's "externally-facing" addresses (NodePorts, + // ExternalIPs, and LoadBalancer IPs). If set to "Local", the proxy will configure + // the service in a way that assumes that external load balancers will take care + // of balancing the service traffic between nodes, and so each node will deliver + // traffic only to the node-local endpoints of the service, without masquerading + // the client source IP. (Traffic mistakenly sent to a node with no endpoints will + // be dropped.) The default value, "Cluster", uses the standard behavior of + // routing to all endpoints evenly (possibly modified by topology and other + // features). Note that traffic sent to an External IP or LoadBalancer IP from + // within the cluster will always get "Cluster" semantics, but clients sending to + // a NodePort from within the cluster may need to take traffic policy into account + // when picking a node. // +optional optional string externalTrafficPolicy = 11; @@ -5101,6 +5133,7 @@ message ServiceSpec { // service or not. If this field is specified when creating a Service // which does not need it, creation will fail. This field will be wiped // when updating a Service to no longer need it (e.g. changing type). + // This field cannot be updated once set. // +optional optional int32 healthCheckNodePort = 12; @@ -5174,12 +5207,12 @@ message ServiceSpec { // +optional optional string loadBalancerClass = 21; - // InternalTrafficPolicy specifies if the cluster internal traffic - // should be routed to all endpoints or node-local endpoints only. - // "Cluster" routes internal traffic to a Service to all endpoints. - // "Local" routes traffic to node-local endpoints only, traffic is - // dropped if no node-local endpoints are ready. - // The default value is "Cluster". + // InternalTrafficPolicy describes how nodes distribute service traffic they + // receive on the ClusterIP. If set to "Local", the proxy will assume that pods + // only want to talk to endpoints of the service on the same node as the pod, + // dropping the traffic if there are no local endpoints. The default value, + // "Cluster", uses the standard behavior of routing to all endpoints evenly + // (possibly modified by topology and other features). // +featureGate=ServiceInternalTrafficPolicy // +optional optional string internalTrafficPolicy = 22; @@ -5399,7 +5432,8 @@ message TopologySpreadConstraint { // We consider each as a "bucket", and try to put balanced number // of pods into each bucket. // We define a domain as a particular instance of a topology. - // Also, we define an eligible domain as a domain whose nodes match the node selector. + // Also, we define an eligible domain as a domain whose nodes meet the requirements of + // nodeAffinityPolicy and nodeTaintsPolicy. // e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. // And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. // It's a required field. @@ -5457,9 +5491,40 @@ message TopologySpreadConstraint { // because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, // it will violate MaxSkew. // - // This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate. + // This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default). // +optional optional int32 minDomains = 5; + + // NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector + // when calculating pod topology spread skew. Options are: + // - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. + // - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. + // + // If this value is nil, the behavior is equivalent to the Honor policy. + // This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. + // +optional + optional string nodeAffinityPolicy = 6; + + // NodeTaintsPolicy indicates how we will treat node taints when calculating + // pod topology spread skew. Options are: + // - Honor: nodes without taints, along with tainted nodes for which the incoming pod + // has a toleration, are included. + // - Ignore: node taints are ignored. All nodes are included. + // + // If this value is nil, the behavior is equivalent to the Ignore policy. + // This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. + // +optional + optional string nodeTaintsPolicy = 7; + + // MatchLabelKeys is a set of pod label keys to select the pods over which + // spreading will be calculated. The keys are used to lookup values from the + // incoming pod labels, those key-value labels are ANDed with labelSelector + // to select the group of existing pods over which spreading will be calculated + // for the incoming pod. Keys that don't exist in the incoming pod labels will + // be ignored. A null or empty list means only match against labelSelector. + // +listType=atomic + // +optional + repeated string matchLabelKeys = 8; } // TypedLocalObjectReference contains enough information to let you locate the diff --git a/vendor/k8s.io/api/core/v1/toleration.go b/vendor/k8s.io/api/core/v1/toleration.go index b203d335b..9341abf89 100644 --- a/vendor/k8s.io/api/core/v1/toleration.go +++ b/vendor/k8s.io/api/core/v1/toleration.go @@ -29,11 +29,14 @@ func (t *Toleration) MatchToleration(tolerationToMatch *Toleration) bool { // ToleratesTaint checks if the toleration tolerates the taint. // The matching follows the rules below: // (1) Empty toleration.effect means to match all taint effects, -// otherwise taint effect must equal to toleration.effect. +// +// otherwise taint effect must equal to toleration.effect. +// // (2) If toleration.operator is 'Exists', it means to match all taint values. // (3) Empty toleration.key means to match all taint keys. -// If toleration.key is empty, toleration.operator must be 'Exists'; -// this combination means to match all taint values and all taint keys. +// +// If toleration.key is empty, toleration.operator must be 'Exists'; +// this combination means to match all taint values and all taint keys. func (t *Toleration) ToleratesTaint(taint *Taint) bool { if len(t.Effect) > 0 && t.Effect != taint.Effect { return false diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index c2a3c67b2..754a23613 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -337,6 +337,7 @@ type PersistentVolumeSpec struct { // claim.VolumeName is the authoritative bind between PV and PVC. // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#binding // +optional + // +structType=granular ClaimRef *ObjectReference `json:"claimRef,omitempty" protobuf:"bytes,4,opt,name=claimRef"` // persistentVolumeReclaimPolicy defines what happens to a persistent volume when released from its claim. // Valid options are Retain (default for manually created PersistentVolumes), Delete (default @@ -1800,11 +1801,20 @@ type CSIPersistentVolumeSource struct { // controllerExpandSecretRef is a reference to the secret object containing // sensitive information to pass to the CSI driver to complete the CSI // ControllerExpandVolume call. - // This is an alpha field and requires enabling ExpandCSIVolumes feature gate. + // This is an beta field and requires enabling ExpandCSIVolumes feature gate. // This field is optional, and may be empty if no secret is required. If the // secret object contains more than one secret, all secrets are passed. // +optional ControllerExpandSecretRef *SecretReference `json:"controllerExpandSecretRef,omitempty" protobuf:"bytes,9,opt,name=controllerExpandSecretRef"` + + // nodeExpandSecretRef is a reference to the secret object containing + // sensitive information to pass to the CSI driver to complete the CSI + // NodeExpandVolume call. + // This is an alpha field and requires enabling CSINodeExpandSecret feature gate. + // This field is optional, may be omitted if no secret is required. If the + // secret object contains more than one secret, all secrets are passed. + // +optional + NodeExpandSecretRef *SecretReference `json:"nodeExpandSecretRef,omitempty" protobuf:"bytes,10,opt,name=nodeExpandSecretRef"` } // Represents a source location of a volume to mount, managed by an external CSI driver @@ -2324,12 +2334,12 @@ type Container struct { // Cannot be updated. // +optional WorkingDir string `json:"workingDir,omitempty" protobuf:"bytes,5,opt,name=workingDir"` - // List of ports to expose from the container. Exposing a port here gives - // the system additional information about the network connections a - // container uses, but is primarily informational. Not specifying a port here + // List of ports to expose from the container. Not specifying a port here // DOES NOT prevent that port from being exposed. Any port which is // listening on the default "0.0.0.0" address inside a container will be // accessible from the network. + // Modifying this array with strategic merge patch may corrupt the data. + // For more information See https://github.com/kubernetes/kubernetes/issues/108255. // Cannot be updated. // +optional // +patchMergeKey=containerPort @@ -2644,6 +2654,10 @@ const ( PodReady PodConditionType = "Ready" // PodScheduled represents status of the scheduling process for this pod. PodScheduled PodConditionType = "PodScheduled" + // AlphaNoCompatGuaranteeDisruptionTarget indicates the pod is about to be deleted due to a + // disruption (such as preemption, eviction API or garbage-collection). + // The constant is to be renamed once the name is accepted within the KEP-3329. + AlphaNoCompatGuaranteeDisruptionTarget PodConditionType = "DisruptionTarget" ) // These are reasons for a pod's transition to a condition. @@ -3081,7 +3095,6 @@ type PodSpec struct { // pod to perform user-initiated actions such as debugging. This list cannot be specified when // creating a pod, and it cannot be modified by updating the pod spec. In order to add an // ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. - // This field is beta-level and available on clusters that haven't disabled the EphemeralContainers feature gate. // +optional // +patchMergeKey=name // +patchStrategy=merge @@ -3277,6 +3290,7 @@ type PodSpec struct { // If the OS field is set to windows, following fields must be unset: // - spec.hostPID // - spec.hostIPC + // - spec.hostUsers // - spec.securityContext.seLinuxOptions // - spec.securityContext.seccompProfile // - spec.securityContext.fsGroup @@ -3296,8 +3310,19 @@ type PodSpec struct { // - spec.containers[*].securityContext.runAsUser // - spec.containers[*].securityContext.runAsGroup // +optional - // This is a beta field and requires the IdentifyPodOS feature OS *PodOS `json:"os,omitempty" protobuf:"bytes,36,opt,name=os"` + // Use the host's user namespace. + // Optional: Default to true. + // If set to true or not present, the pod will be run in the host user namespace, useful + // for when the pod needs a feature only available to the host user namespace, such as + // loading a kernel module with CAP_SYS_MODULE. + // When set to false, a new userns is created for the pod. Setting false is useful for + // mitigating container breakout vulnerabilities even allowing users to run their + // containers as root without actually having root privileges on the host. + // This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature. + // +k8s:conversion-gen=false + // +optional + HostUsers *bool `json:"hostUsers,omitempty" protobuf:"bytes,37,opt,name=hostUsers"` } // OSName is the set of OS'es that can be used in OS. @@ -3330,6 +3355,17 @@ const ( ScheduleAnyway UnsatisfiableConstraintAction = "ScheduleAnyway" ) +// NodeInclusionPolicy defines the type of node inclusion policy +// +enum +type NodeInclusionPolicy string + +const ( + // NodeInclusionPolicyIgnore means ignore this scheduling directive when calculating pod topology spread skew. + NodeInclusionPolicyIgnore NodeInclusionPolicy = "Ignore" + // NodeInclusionPolicyHonor means use this scheduling directive when calculating pod topology spread skew. + NodeInclusionPolicyHonor NodeInclusionPolicy = "Honor" +) + // TopologySpreadConstraint specifies how to spread matching pods among the given topology. type TopologySpreadConstraint struct { // MaxSkew describes the degree to which pods may be unevenly distributed. @@ -3358,7 +3394,8 @@ type TopologySpreadConstraint struct { // We consider each as a "bucket", and try to put balanced number // of pods into each bucket. // We define a domain as a particular instance of a topology. - // Also, we define an eligible domain as a domain whose nodes match the node selector. + // Also, we define an eligible domain as a domain whose nodes meet the requirements of + // nodeAffinityPolicy and nodeTaintsPolicy. // e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. // And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. // It's a required field. @@ -3413,9 +3450,37 @@ type TopologySpreadConstraint struct { // because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, // it will violate MaxSkew. // - // This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate. + // This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default). // +optional MinDomains *int32 `json:"minDomains,omitempty" protobuf:"varint,5,opt,name=minDomains"` + // NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector + // when calculating pod topology spread skew. Options are: + // - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. + // - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. + // + // If this value is nil, the behavior is equivalent to the Honor policy. + // This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. + // +optional + NodeAffinityPolicy *NodeInclusionPolicy `json:"nodeAffinityPolicy,omitempty" protobuf:"bytes,6,opt,name=nodeAffinityPolicy"` + // NodeTaintsPolicy indicates how we will treat node taints when calculating + // pod topology spread skew. Options are: + // - Honor: nodes without taints, along with tainted nodes for which the incoming pod + // has a toleration, are included. + // - Ignore: node taints are ignored. All nodes are included. + // + // If this value is nil, the behavior is equivalent to the Ignore policy. + // This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. + // +optional + NodeTaintsPolicy *NodeInclusionPolicy `json:"nodeTaintsPolicy,omitempty" protobuf:"bytes,7,opt,name=nodeTaintsPolicy"` + // MatchLabelKeys is a set of pod label keys to select the pods over which + // spreading will be calculated. The keys are used to lookup values from the + // incoming pod labels, those key-value labels are ANDed with labelSelector + // to select the group of existing pods over which spreading will be calculated + // for the incoming pod. Keys that don't exist in the incoming pod labels will + // be ignored. A null or empty list means only match against labelSelector. + // +listType=atomic + // +optional + MatchLabelKeys []string `json:"matchLabelKeys,omitempty" protobuf:"bytes,8,opt,name=matchLabelKeys"` } const ( @@ -3607,7 +3672,8 @@ type PodDNSConfigOption struct { // IP address information for entries in the (plural) PodIPs field. // Each entry includes: -// IP: An IP address allocated to the pod. Routable at least within the cluster. +// +// IP: An IP address allocated to the pod. Routable at least within the cluster. type PodIP struct { // ip is an IP address (IPv4 or IPv6) assigned to the pod IP string `json:"ip,omitempty" protobuf:"bytes,1,opt,name=ip"` @@ -3764,8 +3830,6 @@ var _ = Container(EphemeralContainerCommon{}) // // To add an ephemeral container, use the ephemeralcontainers subresource of an existing // Pod. Ephemeral containers may not be removed or restarted. -// -// This is a beta feature available on clusters that haven't disabled the EphemeralContainers feature gate. type EphemeralContainer struct { // Ephemeral containers have all of the fields of Container, plus additional fields // specific to ephemeral containers. Fields in common with Container are in the @@ -3867,7 +3931,6 @@ type PodStatus struct { // +optional QOSClass PodQOSClass `json:"qosClass,omitempty" protobuf:"bytes,9,rep,name=qosClass"` // Status for any ephemeral containers that have run in this pod. - // This field is beta-level and available on clusters that haven't disabled the EphemeralContainers feature gate. // +optional EphemeralContainerStatuses []ContainerStatus `json:"ephemeralContainerStatuses,omitempty" protobuf:"bytes,13,rep,name=ephemeralContainerStatuses"` } @@ -4168,29 +4231,34 @@ const ( ServiceTypeExternalName ServiceType = "ExternalName" ) -// ServiceInternalTrafficPolicyType describes the type of traffic routing for -// internal traffic +// ServiceInternalTrafficPolicyType describes how nodes distribute service traffic they +// receive on the ClusterIP. // +enum type ServiceInternalTrafficPolicyType string const ( - // ServiceInternalTrafficPolicyCluster routes traffic to all endpoints + // ServiceInternalTrafficPolicyCluster routes traffic to all endpoints. ServiceInternalTrafficPolicyCluster ServiceInternalTrafficPolicyType = "Cluster" - // ServiceInternalTrafficPolicyLocal only routes to node-local - // endpoints, otherwise drops the traffic + // ServiceInternalTrafficPolicyLocal routes traffic only to endpoints on the same + // node as the client pod (dropping the traffic if there are no local endpoints). ServiceInternalTrafficPolicyLocal ServiceInternalTrafficPolicyType = "Local" ) -// Service External Traffic Policy Type string +// ServiceExternalTrafficPolicyType describes how nodes distribute service traffic they +// receive on one of the Service's "externally-facing" addresses (NodePorts, ExternalIPs, +// and LoadBalancer IPs). // +enum type ServiceExternalTrafficPolicyType string const ( - // ServiceExternalTrafficPolicyTypeLocal specifies node-local endpoints behavior. - ServiceExternalTrafficPolicyTypeLocal ServiceExternalTrafficPolicyType = "Local" - // ServiceExternalTrafficPolicyTypeCluster specifies node-global (legacy) behavior. + // ServiceExternalTrafficPolicyTypeCluster routes traffic to all endpoints. ServiceExternalTrafficPolicyTypeCluster ServiceExternalTrafficPolicyType = "Cluster" + + // ServiceExternalTrafficPolicyTypeLocal preserves the source IP of the traffic by + // routing only to endpoints on the same node as the traffic was received on + // (dropping the traffic if there are no local endpoints). + ServiceExternalTrafficPolicyTypeLocal ServiceExternalTrafficPolicyType = "Local" ) // These are the valid conditions of a service. @@ -4255,30 +4323,34 @@ const ( IPv6Protocol IPFamily = "IPv6" ) -// IPFamilyPolicyType represents the dual-stack-ness requested or required by a Service +// IPFamilyPolicy represents the dual-stack-ness requested or required by a Service // +enum -type IPFamilyPolicyType string +type IPFamilyPolicy string const ( // IPFamilyPolicySingleStack indicates that this service is required to have a single IPFamily. // The IPFamily assigned is based on the default IPFamily used by the cluster // or as identified by service.spec.ipFamilies field - IPFamilyPolicySingleStack IPFamilyPolicyType = "SingleStack" + IPFamilyPolicySingleStack IPFamilyPolicy = "SingleStack" // IPFamilyPolicyPreferDualStack indicates that this service prefers dual-stack when // the cluster is configured for dual-stack. If the cluster is not configured // for dual-stack the service will be assigned a single IPFamily. If the IPFamily is not // set in service.spec.ipFamilies then the service will be assigned the default IPFamily // configured on the cluster - IPFamilyPolicyPreferDualStack IPFamilyPolicyType = "PreferDualStack" + IPFamilyPolicyPreferDualStack IPFamilyPolicy = "PreferDualStack" // IPFamilyPolicyRequireDualStack indicates that this service requires dual-stack. Using // IPFamilyPolicyRequireDualStack on a single stack cluster will result in validation errors. The // IPFamilies (and their order) assigned to this service is based on service.spec.ipFamilies. If // service.spec.ipFamilies was not provided then it will be assigned according to how they are // configured on the cluster. If service.spec.ipFamilies has only one entry then the alternative // IPFamily will be added by apiserver - IPFamilyPolicyRequireDualStack IPFamilyPolicyType = "RequireDualStack" + IPFamilyPolicyRequireDualStack IPFamilyPolicy = "RequireDualStack" ) +// for backwards compat +// +enum +type IPFamilyPolicyType = IPFamilyPolicy + // ServiceSpec describes the attributes that a user creates on a service. type ServiceSpec struct { // The list of ports that are exposed by this service. @@ -4405,12 +4477,19 @@ type ServiceSpec struct { // +optional ExternalName string `json:"externalName,omitempty" protobuf:"bytes,10,opt,name=externalName"` - // externalTrafficPolicy denotes if this Service desires to route external - // traffic to node-local or cluster-wide endpoints. "Local" preserves the - // client source IP and avoids a second hop for LoadBalancer and Nodeport - // type services, but risks potentially imbalanced traffic spreading. - // "Cluster" obscures the client source IP and may cause a second hop to - // another node, but should have good overall load-spreading. + // externalTrafficPolicy describes how nodes distribute service traffic they + // receive on one of the Service's "externally-facing" addresses (NodePorts, + // ExternalIPs, and LoadBalancer IPs). If set to "Local", the proxy will configure + // the service in a way that assumes that external load balancers will take care + // of balancing the service traffic between nodes, and so each node will deliver + // traffic only to the node-local endpoints of the service, without masquerading + // the client source IP. (Traffic mistakenly sent to a node with no endpoints will + // be dropped.) The default value, "Cluster", uses the standard behavior of + // routing to all endpoints evenly (possibly modified by topology and other + // features). Note that traffic sent to an External IP or LoadBalancer IP from + // within the cluster will always get "Cluster" semantics, but clients sending to + // a NodePort from within the cluster may need to take traffic policy into account + // when picking a node. // +optional ExternalTrafficPolicy ServiceExternalTrafficPolicyType `json:"externalTrafficPolicy,omitempty" protobuf:"bytes,11,opt,name=externalTrafficPolicy"` @@ -4423,6 +4502,7 @@ type ServiceSpec struct { // service or not. If this field is specified when creating a Service // which does not need it, creation will fail. This field will be wiped // when updating a Service to no longer need it (e.g. changing type). + // This field cannot be updated once set. // +optional HealthCheckNodePort int32 `json:"healthCheckNodePort,omitempty" protobuf:"bytes,12,opt,name=healthCheckNodePort"` @@ -4476,7 +4556,7 @@ type ServiceSpec struct { // ipFamilies and clusterIPs fields depend on the value of this field. This // field will be wiped when updating a service to type ExternalName. // +optional - IPFamilyPolicy *IPFamilyPolicyType `json:"ipFamilyPolicy,omitempty" protobuf:"bytes,17,opt,name=ipFamilyPolicy,casttype=IPFamilyPolicyType"` + IPFamilyPolicy *IPFamilyPolicy `json:"ipFamilyPolicy,omitempty" protobuf:"bytes,17,opt,name=ipFamilyPolicy,casttype=IPFamilyPolicy"` // allocateLoadBalancerNodePorts defines if NodePorts will be automatically // allocated for services with type LoadBalancer. Default is "true". It @@ -4502,12 +4582,12 @@ type ServiceSpec struct { // +optional LoadBalancerClass *string `json:"loadBalancerClass,omitempty" protobuf:"bytes,21,opt,name=loadBalancerClass"` - // InternalTrafficPolicy specifies if the cluster internal traffic - // should be routed to all endpoints or node-local endpoints only. - // "Cluster" routes internal traffic to a Service to all endpoints. - // "Local" routes traffic to node-local endpoints only, traffic is - // dropped if no node-local endpoints are ready. - // The default value is "Cluster". + // InternalTrafficPolicy describes how nodes distribute service traffic they + // receive on the ClusterIP. If set to "Local", the proxy will assume that pods + // only want to talk to endpoints of the service on the same node as the pod, + // dropping the traffic if there are no local endpoints. The default value, + // "Cluster", uses the standard behavior of routing to all endpoints evenly + // (possibly modified by topology and other features). // +featureGate=ServiceInternalTrafficPolicy // +optional InternalTrafficPolicy *ServiceInternalTrafficPolicyType `json:"internalTrafficPolicy,omitempty" protobuf:"bytes,22,opt,name=internalTrafficPolicy"` @@ -4669,17 +4749,18 @@ type ServiceAccountList struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Endpoints is a collection of endpoints that implement the actual service. Example: -// Name: "mysvc", -// Subsets: [ -// { -// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], -// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] -// }, -// { -// Addresses: [{"ip": "10.10.3.3"}], -// Ports: [{"name": "a", "port": 93}, {"name": "b", "port": 76}] -// }, -// ] +// +// Name: "mysvc", +// Subsets: [ +// { +// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], +// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] +// }, +// { +// Addresses: [{"ip": "10.10.3.3"}], +// Ports: [{"name": "a", "port": 93}, {"name": "b", "port": 76}] +// }, +// ] type Endpoints struct { metav1.TypeMeta `json:",inline"` // Standard object's metadata. @@ -4701,13 +4782,16 @@ type Endpoints struct { // EndpointSubset is a group of addresses with a common set of ports. The // expanded set of endpoints is the Cartesian product of Addresses x Ports. // For example, given: -// { -// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], -// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] -// } +// +// { +// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}], +// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}] +// } +// // The resulting set of endpoints can be viewed as: -// a: [ 10.10.1.1:8675, 10.10.2.2:8675 ], -// b: [ 10.10.1.1:309, 10.10.2.2:309 ] +// +// a: [ 10.10.1.1:8675, 10.10.2.2:8675 ], +// b: [ 10.10.1.1:309, 10.10.2.2:309 ] type EndpointSubset struct { // IP addresses which offer the related ports that are marked as ready. These endpoints // should be considered safe for load balancers and clients to utilize. @@ -5058,7 +5142,7 @@ type PodSignature struct { // Describe a container image type ContainerImage struct { // Names by which this image is known. - // e.g. ["k8s.gcr.io/hyperkube:v1.0.7", "dockerhub.io/google_containers/hyperkube:v1.0.7"] + // e.g. ["kubernetes.example/hyperkube:v1.0.7", "cloud-vendor.registry.example/cloud-vendor/hyperkube:v1.0.7"] // +optional Names []string `json:"names" protobuf:"bytes,1,rep,name=names"` // The size of the image in bytes. @@ -5580,6 +5664,7 @@ type ServiceProxyOptions struct { // and the version of the actual struct is irrelevant. // 5. We cannot easily change it. Because this type is embedded in many locations, updates to this type // will affect numerous schemas. Don't make new APIs embed an underspecified API type they do not control. +// // Instead of using this type, create a locally provided and used type that is well-focused on your reference. // For example, ServiceReferences for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 . // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index 53a06b945..6bae4bb76 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -126,7 +126,8 @@ var map_CSIPersistentVolumeSource = map[string]string{ "controllerPublishSecretRef": "controllerPublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerPublishVolume and ControllerUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.", "nodeStageSecretRef": "nodeStageSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodeStageVolume and NodeStageVolume and NodeUnstageVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.", "nodePublishSecretRef": "nodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.", - "controllerExpandSecretRef": "controllerExpandSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerExpandVolume call. This is an alpha field and requires enabling ExpandCSIVolumes feature gate. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.", + "controllerExpandSecretRef": "controllerExpandSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerExpandVolume call. This is an beta field and requires enabling ExpandCSIVolumes feature gate. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.", + "nodeExpandSecretRef": "nodeExpandSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodeExpandVolume call. This is an alpha field and requires enabling CSINodeExpandSecret feature gate. This field is optional, may be omitted if no secret is required. If the secret object contains more than one secret, all secrets are passed.", } func (CSIPersistentVolumeSource) SwaggerDoc() map[string]string { @@ -331,7 +332,7 @@ var map_Container = map[string]string{ "command": "Entrypoint array. Not executed within a shell. The container image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", "args": "Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", "workingDir": "Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.", - "ports": "List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", + "ports": "List of ports to expose from the container. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Modifying this array with strategic merge patch may corrupt the data. For more information See https://github.com/kubernetes/kubernetes/issues/108255. Cannot be updated.", "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "env": "List of environment variables to set in the container. Cannot be updated.", "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", @@ -356,7 +357,7 @@ func (Container) SwaggerDoc() map[string]string { var map_ContainerImage = map[string]string{ "": "Describe a container image", - "names": "Names by which this image is known. e.g. [\"k8s.gcr.io/hyperkube:v1.0.7\", \"dockerhub.io/google_containers/hyperkube:v1.0.7\"]", + "names": "Names by which this image is known. e.g. [\"kubernetes.example/hyperkube:v1.0.7\", \"cloud-vendor.registry.example/cloud-vendor/hyperkube:v1.0.7\"]", "sizeBytes": "The size of the image in bytes.", } @@ -514,7 +515,7 @@ func (EndpointPort) SwaggerDoc() map[string]string { } var map_EndpointSubset = map[string]string{ - "": "EndpointSubset is a group of addresses with a common set of ports. The expanded set of endpoints is the Cartesian product of Addresses x Ports. For example, given:\n {\n Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n Ports: [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n }\nThe resulting set of endpoints can be viewed as:\n a: [ 10.10.1.1:8675, 10.10.2.2:8675 ],\n b: [ 10.10.1.1:309, 10.10.2.2:309 ]", + "": "EndpointSubset is a group of addresses with a common set of ports. The expanded set of endpoints is the Cartesian product of Addresses x Ports. For example, given:\n\n\t{\n\t Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n\t Ports: [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n\t}\n\nThe resulting set of endpoints can be viewed as:\n\n\ta: [ 10.10.1.1:8675, 10.10.2.2:8675 ],\n\tb: [ 10.10.1.1:309, 10.10.2.2:309 ]", "addresses": "IP addresses which offer the related ports that are marked as ready. These endpoints should be considered safe for load balancers and clients to utilize.", "notReadyAddresses": "IP addresses which offer the related ports but are not currently marked as ready because they have not yet finished starting, have recently failed a readiness check, or have recently failed a liveness check.", "ports": "Port numbers available on the related IP addresses.", @@ -525,7 +526,7 @@ func (EndpointSubset) SwaggerDoc() map[string]string { } var map_Endpoints = map[string]string{ - "": "Endpoints is a collection of endpoints that implement the actual service. Example:\n Name: \"mysvc\",\n Subsets: [\n {\n Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n Ports: [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n },\n {\n Addresses: [{\"ip\": \"10.10.3.3\"}],\n Ports: [{\"name\": \"a\", \"port\": 93}, {\"name\": \"b\", \"port\": 76}]\n },\n ]", + "": "Endpoints is a collection of endpoints that implement the actual service. Example:\n\n\t Name: \"mysvc\",\n\t Subsets: [\n\t {\n\t Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n\t Ports: [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n\t },\n\t {\n\t Addresses: [{\"ip\": \"10.10.3.3\"}],\n\t Ports: [{\"name\": \"a\", \"port\": 93}, {\"name\": \"b\", \"port\": 76}]\n\t },\n\t]", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", "subsets": "The set of all endpoints is the union of all subsets. Addresses are placed into subsets according to the IPs they share. A single address with multiple ports, some of which are ready and some of which are not (because they come from different containers) will result in the address being displayed in different subsets for the different ports. No address will appear in both Addresses and NotReadyAddresses in the same subset. Sets of addresses and ports that comprise a service.", } @@ -579,7 +580,7 @@ func (EnvVarSource) SwaggerDoc() map[string]string { } var map_EphemeralContainer = map[string]string{ - "": "An EphemeralContainer is a temporary container that you may add to an existing Pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a Pod is removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the Pod to exceed its resource allocation.\n\nTo add an ephemeral container, use the ephemeralcontainers subresource of an existing Pod. Ephemeral containers may not be removed or restarted.\n\nThis is a beta feature available on clusters that haven't disabled the EphemeralContainers feature gate.", + "": "An EphemeralContainer is a temporary container that you may add to an existing Pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a Pod is removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the Pod to exceed its resource allocation.\n\nTo add an ephemeral container, use the ephemeralcontainers subresource of an existing Pod. Ephemeral containers may not be removed or restarted.", "targetContainerName": "If set, the name of the container from PodSpec that this ephemeral container targets. The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container. If not set then the ephemeral container uses the namespaces configured in the Pod spec.\n\nThe container runtime must implement support for this feature. If the runtime does not support namespace targeting then the result of setting this field is undefined.", } @@ -1534,7 +1535,7 @@ func (PodExecOptions) SwaggerDoc() map[string]string { } var map_PodIP = map[string]string{ - "": "IP address information for entries in the (plural) PodIPs field. Each entry includes:\n IP: An IP address allocated to the pod. Routable at least within the cluster.", + "": "IP address information for entries in the (plural) PodIPs field. Each entry includes:\n\n\tIP: An IP address allocated to the pod. Routable at least within the cluster.", "ip": "ip is an IP address (IPv4 or IPv6) assigned to the pod", } @@ -1637,7 +1638,7 @@ var map_PodSpec = map[string]string{ "volumes": "List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes", "initContainers": "List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/", "containers": "List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated.", - "ephemeralContainers": "List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is beta-level and available on clusters that haven't disabled the EphemeralContainers feature gate.", + "ephemeralContainers": "List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.", "restartPolicy": "Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy", "terminationGracePeriodSeconds": "Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds.", "activeDeadlineSeconds": "Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer.", @@ -1669,7 +1670,8 @@ var map_PodSpec = map[string]string{ "overhead": "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/688-pod-overhead/README.md", "topologySpreadConstraints": "TopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed.", "setHostnameAsFQDN": "If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false.", - "os": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup This is a beta field and requires the IdentifyPodOS feature", + "os": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", + "hostUsers": "Use the host's user namespace. Optional: Default to true. If set to true or not present, the pod will be run in the host user namespace, useful for when the pod needs a feature only available to the host user namespace, such as loading a kernel module with CAP_SYS_MODULE. When set to false, a new userns is created for the pod. Setting false is useful for mitigating container breakout vulnerabilities even allowing users to run their containers as root without actually having root privileges on the host. This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.", } func (PodSpec) SwaggerDoc() map[string]string { @@ -1690,7 +1692,7 @@ var map_PodStatus = map[string]string{ "initContainerStatuses": "The list has one entry per init container in the manifest. The most recent successful init container will have ready = true, the most recently started container will have startTime set. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", "containerStatuses": "The list has one entry per container in the manifest. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", "qosClass": "The Quality of Service (QOS) classification assigned to the pod based on resource requirements See PodQOSClass type for available QOS classes More info: https://git.k8s.io/community/contributors/design-proposals/node/resource-qos.md", - "ephemeralContainerStatuses": "Status for any ephemeral containers that have run in this pod. This field is beta-level and available on clusters that haven't disabled the EphemeralContainers feature gate.", + "ephemeralContainerStatuses": "Status for any ephemeral containers that have run in this pod.", } func (PodStatus) SwaggerDoc() map[string]string { @@ -2274,15 +2276,15 @@ var map_ServiceSpec = map[string]string{ "loadBalancerIP": "Only applies to Service Type: LoadBalancer. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature. Deprecated: This field was under-specified and its meaning varies across implementations, and it cannot support dual-stack. As of Kubernetes v1.24, users are encouraged to use implementation-specific annotations when available. This field may be removed in a future API version.", "loadBalancerSourceRanges": "If specified and supported by the platform, this will restrict traffic through the cloud-provider load-balancer will be restricted to the specified client IPs. This field will be ignored if the cloud-provider does not support the feature.\" More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/", "externalName": "externalName is the external reference that discovery mechanisms will return as an alias for this service (e.g. a DNS CNAME record). No proxying will be involved. Must be a lowercase RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".", - "externalTrafficPolicy": "externalTrafficPolicy denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. \"Local\" preserves the client source IP and avoids a second hop for LoadBalancer and Nodeport type services, but risks potentially imbalanced traffic spreading. \"Cluster\" obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.", - "healthCheckNodePort": "healthCheckNodePort specifies the healthcheck nodePort for the service. This only applies when type is set to LoadBalancer and externalTrafficPolicy is set to Local. If a value is specified, is in-range, and is not in use, it will be used. If not specified, a value will be automatically allocated. External systems (e.g. load-balancers) can use this port to determine if a given node holds endpoints for this service or not. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type).", + "externalTrafficPolicy": "externalTrafficPolicy describes how nodes distribute service traffic they receive on one of the Service's \"externally-facing\" addresses (NodePorts, ExternalIPs, and LoadBalancer IPs). If set to \"Local\", the proxy will configure the service in a way that assumes that external load balancers will take care of balancing the service traffic between nodes, and so each node will deliver traffic only to the node-local endpoints of the service, without masquerading the client source IP. (Traffic mistakenly sent to a node with no endpoints will be dropped.) The default value, \"Cluster\", uses the standard behavior of routing to all endpoints evenly (possibly modified by topology and other features). Note that traffic sent to an External IP or LoadBalancer IP from within the cluster will always get \"Cluster\" semantics, but clients sending to a NodePort from within the cluster may need to take traffic policy into account when picking a node.", + "healthCheckNodePort": "healthCheckNodePort specifies the healthcheck nodePort for the service. This only applies when type is set to LoadBalancer and externalTrafficPolicy is set to Local. If a value is specified, is in-range, and is not in use, it will be used. If not specified, a value will be automatically allocated. External systems (e.g. load-balancers) can use this port to determine if a given node holds endpoints for this service or not. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type). This field cannot be updated once set.", "publishNotReadyAddresses": "publishNotReadyAddresses indicates that any agent which deals with endpoints for this Service should disregard any indications of ready/not-ready. The primary use case for setting this field is for a StatefulSet's Headless Service to propagate SRV DNS records for its Pods for the purpose of peer discovery. The Kubernetes controllers that generate Endpoints and EndpointSlice resources for Services interpret this to mean that all endpoints are considered \"ready\" even if the Pods themselves are not. Agents which consume only Kubernetes generated endpoints through the Endpoints or EndpointSlice resources can safely assume this behavior.", "sessionAffinityConfig": "sessionAffinityConfig contains the configurations of session affinity.", "ipFamilies": "IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this service. This field is usually assigned automatically based on cluster configuration and the ipFamilyPolicy field. If this field is specified manually, the requested family is available in the cluster, and ipFamilyPolicy allows it, it will be used; otherwise creation of the service will fail. This field is conditionally mutable: it allows for adding or removing a secondary IP family, but it does not allow changing the primary IP family of the Service. Valid values are \"IPv4\" and \"IPv6\". This field only applies to Services of types ClusterIP, NodePort, and LoadBalancer, and does apply to \"headless\" services. This field will be wiped when updating a Service to type ExternalName.\n\nThis field may hold a maximum of two entries (dual-stack families, in either order). These families must correspond to the values of the clusterIPs field, if specified. Both clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.", "ipFamilyPolicy": "IPFamilyPolicy represents the dual-stack-ness requested or required by this Service. If there is no value provided, then this field will be set to SingleStack. Services can be \"SingleStack\" (a single IP family), \"PreferDualStack\" (two IP families on dual-stack configured clusters or a single IP family on single-stack clusters), or \"RequireDualStack\" (two IP families on dual-stack configured clusters, otherwise fail). The ipFamilies and clusterIPs fields depend on the value of this field. This field will be wiped when updating a service to type ExternalName.", "allocateLoadBalancerNodePorts": "allocateLoadBalancerNodePorts defines if NodePorts will be automatically allocated for services with type LoadBalancer. Default is \"true\". It may be set to \"false\" if the cluster load-balancer does not rely on NodePorts. If the caller requests specific NodePorts (by specifying a value), those requests will be respected, regardless of this field. This field may only be set for services with type LoadBalancer and will be cleared if the type is changed to any other type.", "loadBalancerClass": "loadBalancerClass is the class of the load balancer implementation this Service belongs to. If specified, the value of this field must be a label-style identifier, with an optional prefix, e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users. This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load balancer implementation is used, today this is typically done through the cloud provider integration, but should apply for any default implementation. If set, it is assumed that a load balancer implementation is watching for Services with a matching class. Any default load balancer implementation (e.g. cloud providers) should ignore Services that set this field. This field can only be set when creating or updating a Service to type 'LoadBalancer'. Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.", - "internalTrafficPolicy": "InternalTrafficPolicy specifies if the cluster internal traffic should be routed to all endpoints or node-local endpoints only. \"Cluster\" routes internal traffic to a Service to all endpoints. \"Local\" routes traffic to node-local endpoints only, traffic is dropped if no node-local endpoints are ready. The default value is \"Cluster\".", + "internalTrafficPolicy": "InternalTrafficPolicy describes how nodes distribute service traffic they receive on the ClusterIP. If set to \"Local\", the proxy will assume that pods only want to talk to endpoints of the service on the same node as the pod, dropping the traffic if there are no local endpoints. The default value, \"Cluster\", uses the standard behavior of routing to all endpoints evenly (possibly modified by topology and other features).", } func (ServiceSpec) SwaggerDoc() map[string]string { @@ -2399,12 +2401,15 @@ func (TopologySelectorTerm) SwaggerDoc() map[string]string { } var map_TopologySpreadConstraint = map[string]string{ - "": "TopologySpreadConstraint specifies how to spread matching pods among the given topology.", - "maxSkew": "MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. ", - "topologyKey": "TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a \"bucket\", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology. And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology. It's a required field.", - "whenUnsatisfiable": "WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n but giving higher precedence to topologies that would help reduce the\n skew.\nA constraint is considered \"Unsatisfiable\" for an incoming pod if and only if every possible node assignment for that pod would violate \"MaxSkew\" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: ", - "labelSelector": "LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.", - "minDomains": "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\nFor example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: ", + "": "TopologySpreadConstraint specifies how to spread matching pods among the given topology.", + "maxSkew": "MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. ", + "topologyKey": "TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a \"bucket\", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy and nodeTaintsPolicy. e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology. And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology. It's a required field.", + "whenUnsatisfiable": "WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n but giving higher precedence to topologies that would help reduce the\n skew.\nA constraint is considered \"Unsatisfiable\" for an incoming pod if and only if every possible node assignment for that pod would violate \"MaxSkew\" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: ", + "labelSelector": "LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.", + "minDomains": "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\nFor example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: ", + "nodeAffinityPolicy": "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\nIf this value is nil, the behavior is equivalent to the Honor policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.", + "nodeTaintsPolicy": "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included.\n\nIf this value is nil, the behavior is equivalent to the Ignore policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.", + "matchLabelKeys": "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector.", } func (TopologySpreadConstraint) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go index a3fbd14c6..e5a644ead 100644 --- a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -243,6 +243,11 @@ func (in *CSIPersistentVolumeSource) DeepCopyInto(out *CSIPersistentVolumeSource *out = new(SecretReference) **out = **in } + if in.NodeExpandSecretRef != nil { + in, out := &in.NodeExpandSecretRef, &out.NodeExpandSecretRef + *out = new(SecretReference) + **out = **in + } return } @@ -3949,6 +3954,11 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { *out = new(PodOS) **out = **in } + if in.HostUsers != nil { + in, out := &in.HostUsers, &out.HostUsers + *out = new(bool) + **out = **in + } return } @@ -5400,7 +5410,7 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { } if in.IPFamilyPolicy != nil { in, out := &in.IPFamilyPolicy, &out.IPFamilyPolicy - *out = new(IPFamilyPolicyType) + *out = new(IPFamilyPolicy) **out = **in } if in.AllocateLoadBalancerNodePorts != nil { @@ -5649,6 +5659,21 @@ func (in *TopologySpreadConstraint) DeepCopyInto(out *TopologySpreadConstraint) *out = new(int32) **out = **in } + if in.NodeAffinityPolicy != nil { + in, out := &in.NodeAffinityPolicy, &out.NodeAffinityPolicy + *out = new(NodeInclusionPolicy) + **out = **in + } + if in.NodeTaintsPolicy != nil { + in, out := &in.NodeTaintsPolicy, &out.NodeTaintsPolicy + *out = new(NodeInclusionPolicy) + **out = **in + } + if in.MatchLabelKeys != nil { + in, out := &in.MatchLabelKeys, &out.MatchLabelKeys + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/vendor/k8s.io/api/discovery/v1/generated.proto b/vendor/k8s.io/api/discovery/v1/generated.proto index 44d9d19e2..7ef2a871e 100644 --- a/vendor/k8s.io/api/discovery/v1/generated.proto +++ b/vendor/k8s.io/api/discovery/v1/generated.proto @@ -66,8 +66,7 @@ message Endpoint { map deprecatedTopology = 5; // nodeName represents the name of the Node hosting this endpoint. This can - // be used to determine endpoints local to a Node. This field can be enabled - // with the EndpointSliceNodeName feature gate. + // be used to determine endpoints local to a Node. // +optional optional string nodeName = 6; diff --git a/vendor/k8s.io/api/discovery/v1/types.go b/vendor/k8s.io/api/discovery/v1/types.go index 13591436d..0757a6b84 100644 --- a/vendor/k8s.io/api/discovery/v1/types.go +++ b/vendor/k8s.io/api/discovery/v1/types.go @@ -101,8 +101,7 @@ type Endpoint struct { DeprecatedTopology map[string]string `json:"deprecatedTopology,omitempty" protobuf:"bytes,5,opt,name=deprecatedTopology"` // nodeName represents the name of the Node hosting this endpoint. This can - // be used to determine endpoints local to a Node. This field can be enabled - // with the EndpointSliceNodeName feature gate. + // be used to determine endpoints local to a Node. // +optional NodeName *string `json:"nodeName,omitempty" protobuf:"bytes,6,opt,name=nodeName"` // zone is the name of the Zone this endpoint exists in. diff --git a/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go index bb3c8769f..c83bb014c 100644 --- a/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go @@ -34,7 +34,7 @@ var map_Endpoint = map[string]string{ "hostname": "hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.", "targetRef": "targetRef is a reference to a Kubernetes object that represents this endpoint.", "deprecatedTopology": "deprecatedTopology contains topology information part of the v1beta1 API. This field is deprecated, and will be removed when the v1beta1 API is removed (no sooner than kubernetes v1.24). While this field can hold values, it is not writable through the v1 API, and any attempts to write to it will be silently ignored. Topology information can be found in the zone and nodeName fields instead.", - "nodeName": "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.", + "nodeName": "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node.", "zone": "zone is the name of the Zone this endpoint exists in.", "hints": "hints contains information associated with how an endpoint should be consumed.", } diff --git a/vendor/k8s.io/api/discovery/v1beta1/generated.proto b/vendor/k8s.io/api/discovery/v1beta1/generated.proto index 84bdf075a..6f76bb2c6 100644 --- a/vendor/k8s.io/api/discovery/v1beta1/generated.proto +++ b/vendor/k8s.io/api/discovery/v1beta1/generated.proto @@ -73,8 +73,7 @@ message Endpoint { map topology = 5; // nodeName represents the name of the Node hosting this endpoint. This can - // be used to determine endpoints local to a Node. This field can be enabled - // with the EndpointSliceNodeName feature gate. + // be used to determine endpoints local to a Node. // +optional optional string nodeName = 6; diff --git a/vendor/k8s.io/api/discovery/v1beta1/types.go b/vendor/k8s.io/api/discovery/v1beta1/types.go index 8620004f4..3bc780fad 100644 --- a/vendor/k8s.io/api/discovery/v1beta1/types.go +++ b/vendor/k8s.io/api/discovery/v1beta1/types.go @@ -109,8 +109,7 @@ type Endpoint struct { // +optional Topology map[string]string `json:"topology,omitempty" protobuf:"bytes,5,opt,name=topology"` // nodeName represents the name of the Node hosting this endpoint. This can - // be used to determine endpoints local to a Node. This field can be enabled - // with the EndpointSliceNodeName feature gate. + // be used to determine endpoints local to a Node. // +optional NodeName *string `json:"nodeName,omitempty" protobuf:"bytes,6,opt,name=nodeName"` // hints contains information associated with how an endpoint should be diff --git a/vendor/k8s.io/api/discovery/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/discovery/v1beta1/types_swagger_doc_generated.go index 96e6d13ef..122da0620 100644 --- a/vendor/k8s.io/api/discovery/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/discovery/v1beta1/types_swagger_doc_generated.go @@ -34,7 +34,7 @@ var map_Endpoint = map[string]string{ "hostname": "hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.", "targetRef": "targetRef is a reference to a Kubernetes object that represents this endpoint.", "topology": "topology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node\n where the endpoint is located. This should match the corresponding\n node label.\n* topology.kubernetes.io/zone: the value indicates the zone where the\n endpoint is located. This should match the corresponding node label.\n* topology.kubernetes.io/region: the value indicates the region where the\n endpoint is located. This should match the corresponding node label.\nThis field is deprecated and will be removed in future api versions.", - "nodeName": "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.", + "nodeName": "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node.", "hints": "hints contains information associated with how an endpoint should be consumed.", } diff --git a/vendor/k8s.io/api/extensions/v1beta1/generated.proto b/vendor/k8s.io/api/extensions/v1beta1/generated.proto index eaa63b59f..8923b1860 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/generated.proto +++ b/vendor/k8s.io/api/extensions/v1beta1/generated.proto @@ -769,8 +769,6 @@ message NetworkPolicyPort { // should be allowed by the policy. This field cannot be defined if the port field // is not defined or if the port field is defined as a named (string) port. // The endPort must be equal or greater than port. - // This feature is in Beta state and is enabled by default. - // It can be disabled using the Feature Gate "NetworkPolicyEndPort". // +optional optional int32 endPort = 3; } diff --git a/vendor/k8s.io/api/extensions/v1beta1/types.go b/vendor/k8s.io/api/extensions/v1beta1/types.go index c63cf0d67..0674dae8b 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types.go @@ -1498,8 +1498,6 @@ type NetworkPolicyPort struct { // should be allowed by the policy. This field cannot be defined if the port field // is not defined or if the port field is defined as a named (string) port. // The endPort must be equal or greater than port. - // This feature is in Beta state and is enabled by default. - // It can be disabled using the Feature Gate "NetworkPolicyEndPort". // +optional EndPort *int32 `json:"endPort,omitempty" protobuf:"bytes,3,opt,name=endPort"` } diff --git a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index cf924b589..a3457813a 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -417,7 +417,7 @@ var map_NetworkPolicyPort = map[string]string{ "": "DEPRECATED 1.9 - This group version of NetworkPolicyPort is deprecated by networking/v1/NetworkPolicyPort.", "protocol": "Optional. The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this field defaults to TCP.", "port": "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched.", - "endPort": "If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port. This feature is in Beta state and is enabled by default. It can be disabled using the Feature Gate \"NetworkPolicyEndPort\".", + "endPort": "If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port.", } func (NetworkPolicyPort) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.proto b/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.proto index 347c9d3fa..455a0fcaf 100644 --- a/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.proto @@ -153,8 +153,8 @@ message LimitResponse { // LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. // It addresses two issues: -// * How are requests for this priority level limited? -// * What should be done with requests that exceed the limit? +// - How are requests for this priority level limited? +// - What should be done with requests that exceed the limit? message LimitedPriorityLevelConfiguration { // `assuredConcurrencyShares` (ACS) configures the execution // limit, which is a limit on the number of requests of this diff --git a/vendor/k8s.io/api/flowcontrol/v1alpha1/types.go b/vendor/k8s.io/api/flowcontrol/v1alpha1/types.go index 5af677e2f..c52c9aa7b 100644 --- a/vendor/k8s.io/api/flowcontrol/v1alpha1/types.go +++ b/vendor/k8s.io/api/flowcontrol/v1alpha1/types.go @@ -415,8 +415,8 @@ const ( // LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. // It addresses two issues: -// * How are requests for this priority level limited? -// * What should be done with requests that exceed the limit? +// - How are requests for this priority level limited? +// - What should be done with requests that exceed the limit? type LimitedPriorityLevelConfiguration struct { // `assuredConcurrencyShares` (ACS) configures the execution // limit, which is a limit on the number of requests of this diff --git a/vendor/k8s.io/api/flowcontrol/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/flowcontrol/v1alpha1/types_swagger_doc_generated.go index 1827be02d..aebb7f64c 100644 --- a/vendor/k8s.io/api/flowcontrol/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/flowcontrol/v1alpha1/types_swagger_doc_generated.go @@ -111,7 +111,7 @@ func (LimitResponse) SwaggerDoc() map[string]string { } var map_LimitedPriorityLevelConfiguration = map[string]string{ - "": "LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues:\n * How are requests for this priority level limited?\n * What should be done with requests that exceed the limit?", + "": "LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues:\n - How are requests for this priority level limited?\n - What should be done with requests that exceed the limit?", "assuredConcurrencyShares": "`assuredConcurrencyShares` (ACS) configures the execution limit, which is a limit on the number of requests of this priority level that may be exeucting at a given time. ACS must be a positive number. The server's concurrency limit (SCL) is divided among the concurrency-controlled priority levels in proportion to their assured concurrency shares. This produces the assured concurrency value (ACV) ", "limitResponse": "`limitResponse` indicates what to do with requests that can not be executed right now", } diff --git a/vendor/k8s.io/api/flowcontrol/v1beta1/generated.proto b/vendor/k8s.io/api/flowcontrol/v1beta1/generated.proto index 474d520df..743274525 100644 --- a/vendor/k8s.io/api/flowcontrol/v1beta1/generated.proto +++ b/vendor/k8s.io/api/flowcontrol/v1beta1/generated.proto @@ -153,8 +153,8 @@ message LimitResponse { // LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. // It addresses two issues: -// * How are requests for this priority level limited? -// * What should be done with requests that exceed the limit? +// - How are requests for this priority level limited? +// - What should be done with requests that exceed the limit? message LimitedPriorityLevelConfiguration { // `assuredConcurrencyShares` (ACS) configures the execution // limit, which is a limit on the number of requests of this diff --git a/vendor/k8s.io/api/flowcontrol/v1beta1/types.go b/vendor/k8s.io/api/flowcontrol/v1beta1/types.go index b45732642..d6744f6f6 100644 --- a/vendor/k8s.io/api/flowcontrol/v1beta1/types.go +++ b/vendor/k8s.io/api/flowcontrol/v1beta1/types.go @@ -451,8 +451,8 @@ const ( // LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. // It addresses two issues: -// * How are requests for this priority level limited? -// * What should be done with requests that exceed the limit? +// - How are requests for this priority level limited? +// - What should be done with requests that exceed the limit? type LimitedPriorityLevelConfiguration struct { // `assuredConcurrencyShares` (ACS) configures the execution // limit, which is a limit on the number of requests of this diff --git a/vendor/k8s.io/api/flowcontrol/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/flowcontrol/v1beta1/types_swagger_doc_generated.go index b3752b6fb..9f8eacead 100644 --- a/vendor/k8s.io/api/flowcontrol/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/flowcontrol/v1beta1/types_swagger_doc_generated.go @@ -111,7 +111,7 @@ func (LimitResponse) SwaggerDoc() map[string]string { } var map_LimitedPriorityLevelConfiguration = map[string]string{ - "": "LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues:\n * How are requests for this priority level limited?\n * What should be done with requests that exceed the limit?", + "": "LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues:\n - How are requests for this priority level limited?\n - What should be done with requests that exceed the limit?", "assuredConcurrencyShares": "`assuredConcurrencyShares` (ACS) configures the execution limit, which is a limit on the number of requests of this priority level that may be exeucting at a given time. ACS must be a positive number. The server's concurrency limit (SCL) is divided among the concurrency-controlled priority levels in proportion to their assured concurrency shares. This produces the assured concurrency value (ACV) ", "limitResponse": "`limitResponse` indicates what to do with requests that can not be executed right now", } diff --git a/vendor/k8s.io/api/flowcontrol/v1beta2/generated.proto b/vendor/k8s.io/api/flowcontrol/v1beta2/generated.proto index 80bbaedea..ed57cda8e 100644 --- a/vendor/k8s.io/api/flowcontrol/v1beta2/generated.proto +++ b/vendor/k8s.io/api/flowcontrol/v1beta2/generated.proto @@ -153,8 +153,8 @@ message LimitResponse { // LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. // It addresses two issues: -// * How are requests for this priority level limited? -// * What should be done with requests that exceed the limit? +// - How are requests for this priority level limited? +// - What should be done with requests that exceed the limit? message LimitedPriorityLevelConfiguration { // `assuredConcurrencyShares` (ACS) configures the execution // limit, which is a limit on the number of requests of this diff --git a/vendor/k8s.io/api/flowcontrol/v1beta2/types.go b/vendor/k8s.io/api/flowcontrol/v1beta2/types.go index 408681e99..3ee00f293 100644 --- a/vendor/k8s.io/api/flowcontrol/v1beta2/types.go +++ b/vendor/k8s.io/api/flowcontrol/v1beta2/types.go @@ -447,8 +447,8 @@ const ( // LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. // It addresses two issues: -// * How are requests for this priority level limited? -// * What should be done with requests that exceed the limit? +// - How are requests for this priority level limited? +// - What should be done with requests that exceed the limit? type LimitedPriorityLevelConfiguration struct { // `assuredConcurrencyShares` (ACS) configures the execution // limit, which is a limit on the number of requests of this diff --git a/vendor/k8s.io/api/flowcontrol/v1beta2/types_swagger_doc_generated.go b/vendor/k8s.io/api/flowcontrol/v1beta2/types_swagger_doc_generated.go index 4775a8e99..7efe477d2 100644 --- a/vendor/k8s.io/api/flowcontrol/v1beta2/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/flowcontrol/v1beta2/types_swagger_doc_generated.go @@ -111,7 +111,7 @@ func (LimitResponse) SwaggerDoc() map[string]string { } var map_LimitedPriorityLevelConfiguration = map[string]string{ - "": "LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues:\n * How are requests for this priority level limited?\n * What should be done with requests that exceed the limit?", + "": "LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues:\n - How are requests for this priority level limited?\n - What should be done with requests that exceed the limit?", "assuredConcurrencyShares": "`assuredConcurrencyShares` (ACS) configures the execution limit, which is a limit on the number of requests of this priority level that may be exeucting at a given time. ACS must be a positive number. The server's concurrency limit (SCL) is divided among the concurrency-controlled priority levels in proportion to their assured concurrency shares. This produces the assured concurrency value (ACV) ", "limitResponse": "`limitResponse` indicates what to do with requests that can not be executed right now", } diff --git a/vendor/k8s.io/api/networking/v1/generated.proto b/vendor/k8s.io/api/networking/v1/generated.proto index ec8066396..a0926dbb2 100644 --- a/vendor/k8s.io/api/networking/v1/generated.proto +++ b/vendor/k8s.io/api/networking/v1/generated.proto @@ -265,16 +265,16 @@ message IngressServiceBackend { // IngressSpec describes the Ingress the user wishes to exist. message IngressSpec { - // IngressClassName is the name of the IngressClass cluster resource. The - // associated IngressClass defines which controller will implement the - // resource. This replaces the deprecated `kubernetes.io/ingress.class` - // annotation. For backwards compatibility, when that annotation is set, it - // must be given precedence over this field. The controller may emit a - // warning if the field and annotation have different values. - // Implementations of this API should ignore Ingresses without a class - // specified. An IngressClass resource may be marked as default, which can - // be used to set a default value for this field. For more information, - // refer to the IngressClass documentation. + // IngressClassName is the name of an IngressClass cluster resource. Ingress + // controller implementations use this field to know whether they should be + // serving this Ingress resource, by a transitive connection + // (controller -> IngressClass -> Ingress resource). Although the + // `kubernetes.io/ingress.class` annotation (simple constant name) was never + // formally defined, it was widely supported by Ingress controllers to create + // a direct binding between Ingress controller and Ingress resources. Newly + // created Ingress resources should prefer using the field. However, even + // though the annotation is officially deprecated, for backwards compatibility + // reasons, ingress controllers should still honor that annotation if present. // +optional optional string ingressClassName = 4; @@ -441,8 +441,6 @@ message NetworkPolicyPort { // should be allowed by the policy. This field cannot be defined if the port field // is not defined or if the port field is defined as a named (string) port. // The endPort must be equal or greater than port. - // This feature is in Beta state and is enabled by default. - // It can be disabled using the Feature Gate "NetworkPolicyEndPort". // +optional optional int32 endPort = 3; } diff --git a/vendor/k8s.io/api/networking/v1/types.go b/vendor/k8s.io/api/networking/v1/types.go index bb6da4098..0c67aa2fd 100644 --- a/vendor/k8s.io/api/networking/v1/types.go +++ b/vendor/k8s.io/api/networking/v1/types.go @@ -158,8 +158,6 @@ type NetworkPolicyPort struct { // should be allowed by the policy. This field cannot be defined if the port field // is not defined or if the port field is defined as a named (string) port. // The endPort must be equal or greater than port. - // This feature is in Beta state and is enabled by default. - // It can be disabled using the Feature Gate "NetworkPolicyEndPort". // +optional EndPort *int32 `json:"endPort,omitempty" protobuf:"bytes,3,opt,name=endPort"` } @@ -302,16 +300,16 @@ type IngressList struct { // IngressSpec describes the Ingress the user wishes to exist. type IngressSpec struct { - // IngressClassName is the name of the IngressClass cluster resource. The - // associated IngressClass defines which controller will implement the - // resource. This replaces the deprecated `kubernetes.io/ingress.class` - // annotation. For backwards compatibility, when that annotation is set, it - // must be given precedence over this field. The controller may emit a - // warning if the field and annotation have different values. - // Implementations of this API should ignore Ingresses without a class - // specified. An IngressClass resource may be marked as default, which can - // be used to set a default value for this field. For more information, - // refer to the IngressClass documentation. + // IngressClassName is the name of an IngressClass cluster resource. Ingress + // controller implementations use this field to know whether they should be + // serving this Ingress resource, by a transitive connection + // (controller -> IngressClass -> Ingress resource). Although the + // `kubernetes.io/ingress.class` annotation (simple constant name) was never + // formally defined, it was widely supported by Ingress controllers to create + // a direct binding between Ingress controller and Ingress resources. Newly + // created Ingress resources should prefer using the field. However, even + // though the annotation is officially deprecated, for backwards compatibility + // reasons, ingress controllers should still honor that annotation if present. // +optional IngressClassName *string `json:"ingressClassName,omitempty" protobuf:"bytes,4,opt,name=ingressClassName"` @@ -564,7 +562,7 @@ const ( // IngressClassParametersReferenceScopeNamespace indicates that the // referenced Parameters resource is namespace-scoped. IngressClassParametersReferenceScopeNamespace = "Namespace" - // IngressClassParametersReferenceScopeNamespace indicates that the + // IngressClassParametersReferenceScopeCluster indicates that the // referenced Parameters resource is cluster-scoped. IngressClassParametersReferenceScopeCluster = "Cluster" ) diff --git a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go index 8e7870dae..a3105ae51 100644 --- a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go @@ -160,7 +160,7 @@ func (IngressServiceBackend) SwaggerDoc() map[string]string { var map_IngressSpec = map[string]string{ "": "IngressSpec describes the Ingress the user wishes to exist.", - "ingressClassName": "IngressClassName is the name of the IngressClass cluster resource. The associated IngressClass defines which controller will implement the resource. This replaces the deprecated `kubernetes.io/ingress.class` annotation. For backwards compatibility, when that annotation is set, it must be given precedence over this field. The controller may emit a warning if the field and annotation have different values. Implementations of this API should ignore Ingresses without a class specified. An IngressClass resource may be marked as default, which can be used to set a default value for this field. For more information, refer to the IngressClass documentation.", + "ingressClassName": "IngressClassName is the name of an IngressClass cluster resource. Ingress controller implementations use this field to know whether they should be serving this Ingress resource, by a transitive connection (controller -> IngressClass -> Ingress resource). Although the `kubernetes.io/ingress.class` annotation (simple constant name) was never formally defined, it was widely supported by Ingress controllers to create a direct binding between Ingress controller and Ingress resources. Newly created Ingress resources should prefer using the field. However, even though the annotation is officially deprecated, for backwards compatibility reasons, ingress controllers should still honor that annotation if present.", "defaultBackend": "DefaultBackend is the backend that should handle requests that don't match any rule. If Rules are not specified, DefaultBackend must be specified. If DefaultBackend is not set, the handling of requests that do not match any of the rules will be up to the Ingress controller.", "tls": "TLS configuration. Currently the Ingress only supports a single TLS port, 443. If multiple members of this list specify different hosts, they will be multiplexed on the same port according to the hostname specified through the SNI TLS extension, if the ingress controller fulfilling the ingress supports SNI.", "rules": "A list of host rules used to configure the Ingress. If unspecified, or no rule matches, all traffic is sent to the default backend.", @@ -245,7 +245,7 @@ var map_NetworkPolicyPort = map[string]string{ "": "NetworkPolicyPort describes a port to allow traffic on", "protocol": "The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this field defaults to TCP.", "port": "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched.", - "endPort": "If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port. This feature is in Beta state and is enabled by default. It can be disabled using the Feature Gate \"NetworkPolicyEndPort\".", + "endPort": "If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port.", } func (NetworkPolicyPort) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/networking/v1alpha1/doc.go b/vendor/k8s.io/api/networking/v1alpha1/doc.go new file mode 100644 index 000000000..3827b0418 --- /dev/null +++ b/vendor/k8s.io/api/networking/v1alpha1/doc.go @@ -0,0 +1,23 @@ +/* +Copyright 2022 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. +*/ + +// +k8s:deepcopy-gen=package +// +k8s:protobuf-gen=package +// +k8s:openapi-gen=true +// +k8s:prerelease-lifecycle-gen=true +// +groupName=networking.k8s.io + +package v1alpha1 // import "k8s.io/api/networking/v1alpha1" diff --git a/vendor/k8s.io/api/networking/v1alpha1/generated.pb.go b/vendor/k8s.io/api/networking/v1alpha1/generated.pb.go new file mode 100644 index 000000000..48d401db8 --- /dev/null +++ b/vendor/k8s.io/api/networking/v1alpha1/generated.pb.go @@ -0,0 +1,913 @@ +/* +Copyright 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. +*/ + +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: k8s.io/kubernetes/vendor/k8s.io/api/networking/v1alpha1/generated.proto + +package v1alpha1 + +import ( + fmt "fmt" + + io "io" + + proto "github.com/gogo/protobuf/proto" + v11 "k8s.io/api/core/v1" + + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +func (m *ClusterCIDR) Reset() { *m = ClusterCIDR{} } +func (*ClusterCIDR) ProtoMessage() {} +func (*ClusterCIDR) Descriptor() ([]byte, []int) { + return fileDescriptor_c1b7ac8d7d97acec, []int{0} +} +func (m *ClusterCIDR) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ClusterCIDR) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ClusterCIDR) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClusterCIDR.Merge(m, src) +} +func (m *ClusterCIDR) XXX_Size() int { + return m.Size() +} +func (m *ClusterCIDR) XXX_DiscardUnknown() { + xxx_messageInfo_ClusterCIDR.DiscardUnknown(m) +} + +var xxx_messageInfo_ClusterCIDR proto.InternalMessageInfo + +func (m *ClusterCIDRList) Reset() { *m = ClusterCIDRList{} } +func (*ClusterCIDRList) ProtoMessage() {} +func (*ClusterCIDRList) Descriptor() ([]byte, []int) { + return fileDescriptor_c1b7ac8d7d97acec, []int{1} +} +func (m *ClusterCIDRList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ClusterCIDRList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ClusterCIDRList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClusterCIDRList.Merge(m, src) +} +func (m *ClusterCIDRList) XXX_Size() int { + return m.Size() +} +func (m *ClusterCIDRList) XXX_DiscardUnknown() { + xxx_messageInfo_ClusterCIDRList.DiscardUnknown(m) +} + +var xxx_messageInfo_ClusterCIDRList proto.InternalMessageInfo + +func (m *ClusterCIDRSpec) Reset() { *m = ClusterCIDRSpec{} } +func (*ClusterCIDRSpec) ProtoMessage() {} +func (*ClusterCIDRSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_c1b7ac8d7d97acec, []int{2} +} +func (m *ClusterCIDRSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ClusterCIDRSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ClusterCIDRSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClusterCIDRSpec.Merge(m, src) +} +func (m *ClusterCIDRSpec) XXX_Size() int { + return m.Size() +} +func (m *ClusterCIDRSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ClusterCIDRSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ClusterCIDRSpec proto.InternalMessageInfo + +func init() { + proto.RegisterType((*ClusterCIDR)(nil), "k8s.io.api.networking.v1alpha1.ClusterCIDR") + proto.RegisterType((*ClusterCIDRList)(nil), "k8s.io.api.networking.v1alpha1.ClusterCIDRList") + proto.RegisterType((*ClusterCIDRSpec)(nil), "k8s.io.api.networking.v1alpha1.ClusterCIDRSpec") +} + +func init() { + proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/networking/v1alpha1/generated.proto", fileDescriptor_c1b7ac8d7d97acec) +} + +var fileDescriptor_c1b7ac8d7d97acec = []byte{ + // 506 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0x4f, 0x8f, 0xd2, 0x40, + 0x18, 0xc6, 0xe9, 0x2e, 0x24, 0x6b, 0xc1, 0xb0, 0xe9, 0x45, 0xc2, 0x61, 0x20, 0x9c, 0x48, 0x8c, + 0x33, 0xb2, 0x21, 0xc4, 0xab, 0xdd, 0x4d, 0x94, 0xc4, 0x3f, 0xd8, 0x4d, 0x3c, 0x18, 0x0f, 0x0e, + 0xe5, 0xb5, 0x8c, 0xd0, 0xce, 0x64, 0x66, 0xa8, 0xf1, 0xe6, 0x47, 0xf0, 0x2b, 0xe9, 0x89, 0xe3, + 0x1e, 0xf7, 0x44, 0xa4, 0x7e, 0x01, 0x3f, 0x82, 0x99, 0xa1, 0xbb, 0x94, 0x45, 0x57, 0xbd, 0x75, + 0xde, 0xf9, 0x3d, 0xcf, 0xfb, 0x3e, 0x7d, 0x5b, 0xf7, 0xc9, 0xec, 0x91, 0xc2, 0x8c, 0x93, 0xd9, + 0x62, 0x0c, 0x32, 0x01, 0x0d, 0x8a, 0xa4, 0x90, 0x4c, 0xb8, 0x24, 0xf9, 0x05, 0x15, 0x8c, 0x24, + 0xa0, 0x3f, 0x72, 0x39, 0x63, 0x49, 0x44, 0xd2, 0x1e, 0x9d, 0x8b, 0x29, 0xed, 0x91, 0x08, 0x12, + 0x90, 0x54, 0xc3, 0x04, 0x0b, 0xc9, 0x35, 0xf7, 0xd0, 0x86, 0xc7, 0x54, 0x30, 0xbc, 0xe5, 0xf1, + 0x15, 0xdf, 0x7c, 0x10, 0x31, 0x3d, 0x5d, 0x8c, 0x71, 0xc8, 0x63, 0x12, 0xf1, 0x88, 0x13, 0x2b, + 0x1b, 0x2f, 0xde, 0xdb, 0x93, 0x3d, 0xd8, 0xa7, 0x8d, 0x5d, 0xb3, 0x53, 0x68, 0x1f, 0x72, 0x09, + 0x24, 0xdd, 0x6b, 0xd9, 0xec, 0x6f, 0x99, 0x98, 0x86, 0x53, 0x96, 0x80, 0xfc, 0x44, 0xc4, 0x2c, + 0x32, 0x05, 0x45, 0x62, 0xd0, 0xf4, 0x77, 0x2a, 0xf2, 0x27, 0x95, 0x5c, 0x24, 0x9a, 0xc5, 0xb0, + 0x27, 0x18, 0xfc, 0x4d, 0xa0, 0xc2, 0x29, 0xc4, 0xf4, 0xa6, 0xae, 0xf3, 0xcd, 0x71, 0xab, 0xa7, + 0xf3, 0x85, 0xd2, 0x20, 0x4f, 0x87, 0x67, 0x81, 0xf7, 0xce, 0x3d, 0x32, 0x33, 0x4d, 0xa8, 0xa6, + 0x0d, 0xa7, 0xed, 0x74, 0xab, 0x27, 0x0f, 0xf1, 0xf6, 0xa5, 0x5d, 0x5b, 0x63, 0x31, 0x8b, 0x4c, + 0x41, 0x61, 0x43, 0xe3, 0xb4, 0x87, 0x5f, 0x8e, 0x3f, 0x40, 0xa8, 0x9f, 0x83, 0xa6, 0xbe, 0xb7, + 0x5c, 0xb5, 0x4a, 0xd9, 0xaa, 0xe5, 0x6e, 0x6b, 0xc1, 0xb5, 0xab, 0xf7, 0xca, 0x2d, 0x2b, 0x01, + 0x61, 0xe3, 0xc0, 0xba, 0x13, 0x7c, 0xfb, 0x4a, 0x70, 0x61, 0xb8, 0x73, 0x01, 0xa1, 0x5f, 0xcb, + 0xcd, 0xcb, 0xe6, 0x14, 0x58, 0xab, 0xce, 0x57, 0xc7, 0xad, 0x17, 0xb8, 0x67, 0x4c, 0x69, 0xef, + 0xed, 0x5e, 0x10, 0xfc, 0x6f, 0x41, 0x8c, 0xda, 0xc6, 0x38, 0xce, 0x3b, 0x1d, 0x5d, 0x55, 0x0a, + 0x21, 0x46, 0x6e, 0x85, 0x69, 0x88, 0x55, 0xe3, 0xa0, 0x7d, 0xd8, 0xad, 0x9e, 0xdc, 0xff, 0x8f, + 0x14, 0xfe, 0xdd, 0xdc, 0xb7, 0x32, 0x34, 0x0e, 0xc1, 0xc6, 0xa8, 0xf3, 0x73, 0x37, 0x83, 0x49, + 0xe7, 0xbd, 0x76, 0x6b, 0x09, 0x9f, 0xc0, 0x39, 0xcc, 0x21, 0xd4, 0x5c, 0xe6, 0x39, 0xda, 0xc5, + 0x66, 0xe6, 0xb3, 0x33, 0x53, 0xbf, 0x28, 0x70, 0xfe, 0x71, 0xb6, 0x6a, 0xd5, 0x8a, 0x95, 0x60, + 0xc7, 0xc7, 0x7b, 0xec, 0xd6, 0x05, 0x48, 0x03, 0x3c, 0xe5, 0x4a, 0xfb, 0x4c, 0x2b, 0xbb, 0x8d, + 0x8a, 0x7f, 0x2f, 0x1f, 0xad, 0x3e, 0xda, 0xbd, 0x0e, 0x6e, 0xf2, 0x5e, 0xdb, 0x2d, 0x33, 0x91, + 0xf6, 0x1b, 0x87, 0x6d, 0xa7, 0x7b, 0x67, 0xbb, 0x94, 0xe1, 0x28, 0xed, 0x07, 0xf6, 0x26, 0x27, + 0x06, 0x8d, 0xf2, 0x1e, 0x31, 0xb0, 0xc4, 0xc0, 0x3f, 0x5b, 0xae, 0x51, 0xe9, 0x62, 0x8d, 0x4a, + 0x97, 0x6b, 0x54, 0xfa, 0x9c, 0x21, 0x67, 0x99, 0x21, 0xe7, 0x22, 0x43, 0xce, 0x65, 0x86, 0x9c, + 0xef, 0x19, 0x72, 0xbe, 0xfc, 0x40, 0xa5, 0x37, 0xe8, 0xf6, 0x7f, 0xfc, 0x57, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xdf, 0x1d, 0xe9, 0x86, 0x1d, 0x04, 0x00, 0x00, +} + +func (m *ClusterCIDR) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterCIDR) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ClusterCIDR) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ClusterCIDRList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterCIDRList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ClusterCIDRList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ClusterCIDRSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClusterCIDRSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ClusterCIDRSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.IPv6) + copy(dAtA[i:], m.IPv6) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.IPv6))) + i-- + dAtA[i] = 0x22 + i -= len(m.IPv4) + copy(dAtA[i:], m.IPv4) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.IPv4))) + i-- + dAtA[i] = 0x1a + i = encodeVarintGenerated(dAtA, i, uint64(m.PerNodeHostBits)) + i-- + dAtA[i] = 0x10 + if m.NodeSelector != nil { + { + size, err := m.NodeSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ClusterCIDR) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ClusterCIDRList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ClusterCIDRSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NodeSelector != nil { + l = m.NodeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + n += 1 + sovGenerated(uint64(m.PerNodeHostBits)) + l = len(m.IPv4) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.IPv6) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *ClusterCIDR) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClusterCIDR{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ClusterCIDRSpec", "ClusterCIDRSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ClusterCIDRList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ClusterCIDR{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ClusterCIDR", "ClusterCIDR", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ClusterCIDRList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ClusterCIDRSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClusterCIDRSpec{`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, + `PerNodeHostBits:` + fmt.Sprintf("%v", this.PerNodeHostBits) + `,`, + `IPv4:` + fmt.Sprintf("%v", this.IPv4) + `,`, + `IPv6:` + fmt.Sprintf("%v", this.IPv6) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *ClusterCIDR) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterCIDR: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterCIDR: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterCIDRList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterCIDRList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterCIDRList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ClusterCIDR{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterCIDRSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClusterCIDRSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterCIDRSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NodeSelector == nil { + m.NodeSelector = &v11.NodeSelector{} + } + if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PerNodeHostBits", wireType) + } + m.PerNodeHostBits = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PerNodeHostBits |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPv4", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IPv4 = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPv6", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IPv6 = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenerated + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenerated + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/k8s.io/api/networking/v1alpha1/generated.proto b/vendor/k8s.io/api/networking/v1alpha1/generated.proto new file mode 100644 index 000000000..51779369b --- /dev/null +++ b/vendor/k8s.io/api/networking/v1alpha1/generated.proto @@ -0,0 +1,94 @@ +/* +Copyright 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. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = "proto2"; + +package k8s.io.api.networking.v1alpha1; + +import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "k8s.io/api/networking/v1alpha1"; + +// ClusterCIDR represents a single configuration for per-Node Pod CIDR +// allocations when the MultiCIDRRangeAllocator is enabled (see the config for +// kube-controller-manager). A cluster may have any number of ClusterCIDR +// resources, all of which will be considered when allocating a CIDR for a +// Node. A ClusterCIDR is eligible to be used for a given Node when the node +// selector matches the node in question and has free CIDRs to allocate. In +// case of multiple matching ClusterCIDR resources, the allocator will attempt +// to break ties using internal heuristics, but any ClusterCIDR whose node +// selector matches the Node may be used. +message ClusterCIDR { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Spec is the desired state of the ClusterCIDR. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + // +optional + optional ClusterCIDRSpec spec = 2; +} + +// ClusterCIDRList contains a list of ClusterCIDR. +message ClusterCIDRList { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is the list of ClusterCIDRs. + repeated ClusterCIDR items = 2; +} + +// ClusterCIDRSpec defines the desired state of ClusterCIDR. +message ClusterCIDRSpec { + // NodeSelector defines which nodes the config is applicable to. + // An empty or nil NodeSelector selects all nodes. + // This field is immutable. + // +optional + optional k8s.io.api.core.v1.NodeSelector nodeSelector = 1; + + // PerNodeHostBits defines the number of host bits to be configured per node. + // A subnet mask determines how much of the address is used for network bits + // and host bits. For example an IPv4 address of 192.168.0.0/24, splits the + // address into 24 bits for the network portion and 8 bits for the host portion. + // To allocate 256 IPs, set this field to 8 (a /24 mask for IPv4 or a /120 for IPv6). + // Minimum value is 4 (16 IPs). + // This field is immutable. + // +required + optional int32 perNodeHostBits = 2; + + // IPv4 defines an IPv4 IP block in CIDR notation(e.g. "10.0.0.0/8"). + // At least one of IPv4 and IPv6 must be specified. + // This field is immutable. + // +optional + optional string ipv4 = 3; + + // IPv6 defines an IPv6 IP block in CIDR notation(e.g. "fd12:3456:789a:1::/64"). + // At least one of IPv4 and IPv6 must be specified. + // This field is immutable. + // +optional + optional string ipv6 = 4; +} + diff --git a/vendor/k8s.io/api/networking/v1alpha1/register.go b/vendor/k8s.io/api/networking/v1alpha1/register.go new file mode 100644 index 000000000..12c0cf7bd --- /dev/null +++ b/vendor/k8s.io/api/networking/v1alpha1/register.go @@ -0,0 +1,56 @@ +/* +Copyright 2022 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 v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// GroupName is the group name use in this package. +const GroupName = "networking.k8s.io" + +// SchemeGroupVersion is group version used to register these objects. +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource. +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + // SchemeBuilder holds functions that add things to a scheme. + // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. + // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + localSchemeBuilder = &SchemeBuilder + + // AddToScheme adds the types of this group into the given scheme. + AddToScheme = localSchemeBuilder.AddToScheme +) + +// Adds the list of known types to the given scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &ClusterCIDR{}, + &ClusterCIDRList{}, + ) + // Add the watch version that applies. + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/vendor/k8s.io/api/networking/v1alpha1/types.go b/vendor/k8s.io/api/networking/v1alpha1/types.go new file mode 100644 index 000000000..645b08903 --- /dev/null +++ b/vendor/k8s.io/api/networking/v1alpha1/types.go @@ -0,0 +1,95 @@ +/* +Copyright 2022 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 v1alpha1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.25 + +// ClusterCIDR represents a single configuration for per-Node Pod CIDR +// allocations when the MultiCIDRRangeAllocator is enabled (see the config for +// kube-controller-manager). A cluster may have any number of ClusterCIDR +// resources, all of which will be considered when allocating a CIDR for a +// Node. A ClusterCIDR is eligible to be used for a given Node when the node +// selector matches the node in question and has free CIDRs to allocate. In +// case of multiple matching ClusterCIDR resources, the allocator will attempt +// to break ties using internal heuristics, but any ClusterCIDR whose node +// selector matches the Node may be used. +type ClusterCIDR struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Spec is the desired state of the ClusterCIDR. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + // +optional + Spec ClusterCIDRSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` +} + +// ClusterCIDRSpec defines the desired state of ClusterCIDR. +type ClusterCIDRSpec struct { + // NodeSelector defines which nodes the config is applicable to. + // An empty or nil NodeSelector selects all nodes. + // This field is immutable. + // +optional + NodeSelector *v1.NodeSelector `json:"nodeSelector,omitempty" protobuf:"bytes,1,opt,name=nodeSelector"` + + // PerNodeHostBits defines the number of host bits to be configured per node. + // A subnet mask determines how much of the address is used for network bits + // and host bits. For example an IPv4 address of 192.168.0.0/24, splits the + // address into 24 bits for the network portion and 8 bits for the host portion. + // To allocate 256 IPs, set this field to 8 (a /24 mask for IPv4 or a /120 for IPv6). + // Minimum value is 4 (16 IPs). + // This field is immutable. + // +required + PerNodeHostBits int32 `json:"perNodeHostBits" protobuf:"varint,2,opt,name=perNodeHostBits"` + + // IPv4 defines an IPv4 IP block in CIDR notation(e.g. "10.0.0.0/8"). + // At least one of IPv4 and IPv6 must be specified. + // This field is immutable. + // +optional + IPv4 string `json:"ipv4" protobuf:"bytes,3,opt,name=ipv4"` + + // IPv6 defines an IPv6 IP block in CIDR notation(e.g. "fd12:3456:789a:1::/64"). + // At least one of IPv4 and IPv6 must be specified. + // This field is immutable. + // +optional + IPv6 string `json:"ipv6" protobuf:"bytes,4,opt,name=ipv6"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.25 + +// ClusterCIDRList contains a list of ClusterCIDR. +type ClusterCIDRList struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Items is the list of ClusterCIDRs. + Items []ClusterCIDR `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go new file mode 100644 index 000000000..0e2213d9e --- /dev/null +++ b/vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go @@ -0,0 +1,62 @@ +/* +Copyright 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 v1alpha1 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-generated-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_ClusterCIDR = map[string]string{ + "": "ClusterCIDR represents a single configuration for per-Node Pod CIDR allocations when the MultiCIDRRangeAllocator is enabled (see the config for kube-controller-manager). A cluster may have any number of ClusterCIDR resources, all of which will be considered when allocating a CIDR for a Node. A ClusterCIDR is eligible to be used for a given Node when the node selector matches the node in question and has free CIDRs to allocate. In case of multiple matching ClusterCIDR resources, the allocator will attempt to break ties using internal heuristics, but any ClusterCIDR whose node selector matches the Node may be used.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "Spec is the desired state of the ClusterCIDR. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", +} + +func (ClusterCIDR) SwaggerDoc() map[string]string { + return map_ClusterCIDR +} + +var map_ClusterCIDRList = map[string]string{ + "": "ClusterCIDRList contains a list of ClusterCIDR.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "Items is the list of ClusterCIDRs.", +} + +func (ClusterCIDRList) SwaggerDoc() map[string]string { + return map_ClusterCIDRList +} + +var map_ClusterCIDRSpec = map[string]string{ + "": "ClusterCIDRSpec defines the desired state of ClusterCIDR.", + "nodeSelector": "NodeSelector defines which nodes the config is applicable to. An empty or nil NodeSelector selects all nodes. This field is immutable.", + "perNodeHostBits": "PerNodeHostBits defines the number of host bits to be configured per node. A subnet mask determines how much of the address is used for network bits and host bits. For example an IPv4 address of 192.168.0.0/24, splits the address into 24 bits for the network portion and 8 bits for the host portion. To allocate 256 IPs, set this field to 8 (a /24 mask for IPv4 or a /120 for IPv6). Minimum value is 4 (16 IPs). This field is immutable.", + "ipv4": "IPv4 defines an IPv4 IP block in CIDR notation(e.g. \"10.0.0.0/8\"). At least one of IPv4 and IPv6 must be specified. This field is immutable.", + "ipv6": "IPv6 defines an IPv6 IP block in CIDR notation(e.g. \"fd12:3456:789a:1::/64\"). At least one of IPv4 and IPv6 must be specified. This field is immutable.", +} + +func (ClusterCIDRSpec) SwaggerDoc() map[string]string { + return map_ClusterCIDRSpec +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/networking/v1alpha1/zz_generated.deepcopy.go new file mode 100644 index 000000000..e549f3166 --- /dev/null +++ b/vendor/k8s.io/api/networking/v1alpha1/zz_generated.deepcopy.go @@ -0,0 +1,108 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright 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. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/api/core/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterCIDR) DeepCopyInto(out *ClusterCIDR) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterCIDR. +func (in *ClusterCIDR) DeepCopy() *ClusterCIDR { + if in == nil { + return nil + } + out := new(ClusterCIDR) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterCIDR) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterCIDRList) DeepCopyInto(out *ClusterCIDRList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ClusterCIDR, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterCIDRList. +func (in *ClusterCIDRList) DeepCopy() *ClusterCIDRList { + if in == nil { + return nil + } + out := new(ClusterCIDRList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterCIDRList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterCIDRSpec) DeepCopyInto(out *ClusterCIDRSpec) { + *out = *in + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = new(v1.NodeSelector) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterCIDRSpec. +func (in *ClusterCIDRSpec) DeepCopy() *ClusterCIDRSpec { + if in == nil { + return nil + } + out := new(ClusterCIDRSpec) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go new file mode 100644 index 000000000..dd6e3b26c --- /dev/null +++ b/vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go @@ -0,0 +1,58 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright 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. +*/ + +// Code generated by prerelease-lifecycle-gen. DO NOT EDIT. + +package v1alpha1 + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *ClusterCIDR) APILifecycleIntroduced() (major, minor int) { + return 1, 25 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *ClusterCIDR) APILifecycleDeprecated() (major, minor int) { + return 1, 28 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *ClusterCIDR) APILifecycleRemoved() (major, minor int) { + return 1, 31 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *ClusterCIDRList) APILifecycleIntroduced() (major, minor int) { + return 1, 25 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *ClusterCIDRList) APILifecycleDeprecated() (major, minor int) { + return 1, 28 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *ClusterCIDRList) APILifecycleRemoved() (major, minor int) { + return 1, 31 +} diff --git a/vendor/k8s.io/api/networking/v1beta1/types.go b/vendor/k8s.io/api/networking/v1beta1/types.go index 1bfdcd091..09cf827fa 100644 --- a/vendor/k8s.io/api/networking/v1beta1/types.go +++ b/vendor/k8s.io/api/networking/v1beta1/types.go @@ -318,7 +318,7 @@ const ( // IngressClassParametersReferenceScopeNamespace indicates that the // referenced Parameters resource is namespace-scoped. IngressClassParametersReferenceScopeNamespace = "Namespace" - // IngressClassParametersReferenceScopeNamespace indicates that the + // IngressClassParametersReferenceScopeCluster indicates that the // referenced Parameters resource is cluster-scoped. IngressClassParametersReferenceScopeCluster = "Cluster" ) diff --git a/vendor/k8s.io/api/policy/v1beta1/generated.proto b/vendor/k8s.io/api/policy/v1beta1/generated.proto index 09dbdde98..f54a87e0d 100644 --- a/vendor/k8s.io/api/policy/v1beta1/generated.proto +++ b/vendor/k8s.io/api/policy/v1beta1/generated.proto @@ -329,7 +329,6 @@ message PodSecurityPolicySpec { // AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. // An empty value indicates that any CSI driver can be used for inline ephemeral volumes. - // This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate. // +optional repeated AllowedCSIDriver allowedCSIDrivers = 23; diff --git a/vendor/k8s.io/api/policy/v1beta1/types.go b/vendor/k8s.io/api/policy/v1beta1/types.go index 486f93461..222b4664b 100644 --- a/vendor/k8s.io/api/policy/v1beta1/types.go +++ b/vendor/k8s.io/api/policy/v1beta1/types.go @@ -278,7 +278,6 @@ type PodSecurityPolicySpec struct { AllowedFlexVolumes []AllowedFlexVolume `json:"allowedFlexVolumes,omitempty" protobuf:"bytes,18,rep,name=allowedFlexVolumes"` // AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. // An empty value indicates that any CSI driver can be used for inline ephemeral volumes. - // This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate. // +optional AllowedCSIDrivers []AllowedCSIDriver `json:"allowedCSIDrivers,omitempty" protobuf:"bytes,23,rep,name=allowedCSIDrivers"` // allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. diff --git a/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go index ef81d43af..916951d4b 100644 --- a/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go @@ -183,7 +183,7 @@ var map_PodSecurityPolicySpec = map[string]string{ "allowPrivilegeEscalation": "allowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.", "allowedHostPaths": "allowedHostPaths is an allowlist of host paths. Empty indicates that all host paths may be used.", "allowedFlexVolumes": "allowedFlexVolumes is an allowlist of Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"volumes\" field.", - "allowedCSIDrivers": "AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. An empty value indicates that any CSI driver can be used for inline ephemeral volumes. This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate.", + "allowedCSIDrivers": "AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. An empty value indicates that any CSI driver can be used for inline ephemeral volumes.", "allowedUnsafeSysctls": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to allowlist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", "forbiddenSysctls": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc.", "allowedProcMountTypes": "AllowedProcMountTypes is an allowlist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.", diff --git a/vendor/k8s.io/api/rbac/v1/generated.proto b/vendor/k8s.io/api/rbac/v1/generated.proto index 1cb19d5da..222f2b905 100644 --- a/vendor/k8s.io/api/rbac/v1/generated.proto +++ b/vendor/k8s.io/api/rbac/v1/generated.proto @@ -96,7 +96,7 @@ message PolicyRule { repeated string verbs = 1; // APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of - // the enumerated resources in any API group will be allowed. + // the enumerated resources in any API group will be allowed. "" represents the core API group and "*" represents all API groups. // +optional repeated string apiGroups = 2; diff --git a/vendor/k8s.io/api/rbac/v1/types.go b/vendor/k8s.io/api/rbac/v1/types.go index 067b6f15e..5a8e4a85c 100644 --- a/vendor/k8s.io/api/rbac/v1/types.go +++ b/vendor/k8s.io/api/rbac/v1/types.go @@ -51,7 +51,7 @@ type PolicyRule struct { Verbs []string `json:"verbs" protobuf:"bytes,1,rep,name=verbs"` // APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of - // the enumerated resources in any API group will be allowed. + // the enumerated resources in any API group will be allowed. "" represents the core API group and "*" represents all API groups. // +optional APIGroups []string `json:"apiGroups,omitempty" protobuf:"bytes,2,rep,name=apiGroups"` // Resources is a list of resources this rule applies to. '*' represents all resources. diff --git a/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go index 228ee54c0..63aa4ed7b 100644 --- a/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go @@ -81,7 +81,7 @@ func (ClusterRoleList) SwaggerDoc() map[string]string { var map_PolicyRule = map[string]string{ "": "PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.", "verbs": "Verbs is a list of Verbs that apply to ALL the ResourceKinds contained in this rule. '*' represents all verbs.", - "apiGroups": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.", + "apiGroups": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. \"\" represents the core API group and \"*\" represents all API groups.", "resources": "Resources is a list of resources this rule applies to. '*' represents all resources.", "resourceNames": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", "nonResourceURLs": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"), but not both.", diff --git a/vendor/k8s.io/api/rbac/v1alpha1/generated.proto b/vendor/k8s.io/api/rbac/v1alpha1/generated.proto index bc0da93ce..d5ceaa0e8 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/rbac/v1alpha1/generated.proto @@ -100,7 +100,7 @@ message PolicyRule { repeated string verbs = 1; // APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of - // the enumerated resources in any API group will be allowed. + // the enumerated resources in any API group will be allowed. "" represents the core API group and "*" represents all API groups. // +optional repeated string apiGroups = 3; diff --git a/vendor/k8s.io/api/rbac/v1alpha1/types.go b/vendor/k8s.io/api/rbac/v1alpha1/types.go index 13a0a1f0a..e0e75b150 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/types.go +++ b/vendor/k8s.io/api/rbac/v1alpha1/types.go @@ -51,7 +51,7 @@ type PolicyRule struct { Verbs []string `json:"verbs" protobuf:"bytes,1,rep,name=verbs"` // APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of - // the enumerated resources in any API group will be allowed. + // the enumerated resources in any API group will be allowed. "" represents the core API group and "*" represents all API groups. // +optional APIGroups []string `json:"apiGroups,omitempty" protobuf:"bytes,3,rep,name=apiGroups"` // Resources is a list of resources this rule applies to. '*' represents all resources. diff --git a/vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go index 46b8b9ee6..08578aba9 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go @@ -81,7 +81,7 @@ func (ClusterRoleList) SwaggerDoc() map[string]string { var map_PolicyRule = map[string]string{ "": "PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.", "verbs": "Verbs is a list of Verbs that apply to ALL the ResourceKinds contained in this rule. '*' represents all verbs.", - "apiGroups": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.", + "apiGroups": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. \"\" represents the core API group and \"*\" represents all API groups.", "resources": "Resources is a list of resources this rule applies to. '*' represents all resources.", "resourceNames": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", "nonResourceURLs": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"), but not both.", diff --git a/vendor/k8s.io/api/rbac/v1beta1/generated.proto b/vendor/k8s.io/api/rbac/v1beta1/generated.proto index c0988d1b6..f6b2f0dde 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/generated.proto +++ b/vendor/k8s.io/api/rbac/v1beta1/generated.proto @@ -100,7 +100,7 @@ message PolicyRule { repeated string verbs = 1; // APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of - // the enumerated resources in any API group will be allowed. + // the enumerated resources in any API group will be allowed. "" represents the core API group and "*" represents all API groups. // +optional repeated string apiGroups = 2; diff --git a/vendor/k8s.io/api/rbac/v1beta1/types.go b/vendor/k8s.io/api/rbac/v1beta1/types.go index 96e6b18f5..4941cd2ab 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/types.go +++ b/vendor/k8s.io/api/rbac/v1beta1/types.go @@ -51,7 +51,7 @@ type PolicyRule struct { Verbs []string `json:"verbs" protobuf:"bytes,1,rep,name=verbs"` // APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of - // the enumerated resources in any API group will be allowed. + // the enumerated resources in any API group will be allowed. "" represents the core API group and "*" represents all API groups. // +optional APIGroups []string `json:"apiGroups,omitempty" protobuf:"bytes,2,rep,name=apiGroups"` // Resources is a list of resources this rule applies to. '*' represents all resources in the specified apiGroups. diff --git a/vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go index 5d57cb348..db9525832 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go @@ -81,7 +81,7 @@ func (ClusterRoleList) SwaggerDoc() map[string]string { var map_PolicyRule = map[string]string{ "": "PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.", "verbs": "Verbs is a list of Verbs that apply to ALL the ResourceKinds contained in this rule. '*' represents all verbs.", - "apiGroups": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.", + "apiGroups": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. \"\" represents the core API group and \"*\" represents all API groups.", "resources": "Resources is a list of resources this rule applies to. '*' represents all resources in the specified apiGroups. '*/foo' represents the subresource 'foo' for all resources in the specified apiGroups.", "resourceNames": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", "nonResourceURLs": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"), but not both.", diff --git a/vendor/k8s.io/api/storage/v1/generated.pb.go b/vendor/k8s.io/api/storage/v1/generated.pb.go index a648c426a..d36497432 100644 --- a/vendor/k8s.io/api/storage/v1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1/generated.pb.go @@ -609,111 +609,112 @@ func init() { } var fileDescriptor_3b530c1983504d8d = []byte{ - // 1651 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xbd, 0x6f, 0x1b, 0xcb, - 0x11, 0xd7, 0x89, 0xd4, 0xd7, 0x52, 0xb2, 0xa4, 0x95, 0xe4, 0x30, 0x2a, 0x48, 0xe1, 0x6c, 0x24, - 0xb2, 0x13, 0x1f, 0x6d, 0xd9, 0x31, 0x0c, 0x07, 0x0e, 0xa0, 0x93, 0xe8, 0x58, 0x88, 0x28, 0x29, - 0x4b, 0xc5, 0x30, 0x82, 0x24, 0xf0, 0xea, 0x6e, 0x45, 0xad, 0xc5, 0xfb, 0xf0, 0xed, 0x92, 0x31, - 0x53, 0x25, 0x4d, 0xba, 0x00, 0x49, 0x1b, 0xe4, 0x8f, 0x48, 0x80, 0xa4, 0x49, 0x99, 0x22, 0x70, - 0x3a, 0x23, 0x95, 0x2b, 0xe2, 0x99, 0xaf, 0x7e, 0xaf, 0x7c, 0x85, 0xaa, 0x87, 0xdd, 0x5b, 0xf2, - 0x3e, 0x78, 0x94, 0xa5, 0x86, 0x1d, 0x77, 0x67, 0xe6, 0x37, 0xb3, 0x3b, 0xbf, 0x99, 0x9d, 0x23, - 0xf8, 0xc9, 0xf9, 0x13, 0x66, 0x50, 0xaf, 0x72, 0xde, 0x3a, 0x21, 0x81, 0x4b, 0x38, 0x61, 0x95, - 0x36, 0x71, 0x6d, 0x2f, 0xa8, 0x28, 0x01, 0xf6, 0x69, 0x85, 0x71, 0x2f, 0xc0, 0x0d, 0x52, 0x69, - 0x3f, 0xa8, 0x34, 0x88, 0x4b, 0x02, 0xcc, 0x89, 0x6d, 0xf8, 0x81, 0xc7, 0x3d, 0xb8, 0x16, 0xaa, - 0x19, 0xd8, 0xa7, 0x86, 0x52, 0x33, 0xda, 0x0f, 0xd6, 0xef, 0x35, 0x28, 0x3f, 0x6b, 0x9d, 0x18, - 0x96, 0xe7, 0x54, 0x1a, 0x5e, 0xc3, 0xab, 0x48, 0xed, 0x93, 0xd6, 0xa9, 0x5c, 0xc9, 0x85, 0xfc, - 0x15, 0xa2, 0xac, 0xeb, 0x31, 0x67, 0x96, 0x17, 0x64, 0x79, 0x5a, 0x7f, 0x14, 0xe9, 0x38, 0xd8, - 0x3a, 0xa3, 0x2e, 0x09, 0x3a, 0x15, 0xff, 0xbc, 0x21, 0x8d, 0x02, 0xc2, 0xbc, 0x56, 0x60, 0x91, - 0x6b, 0x59, 0xb1, 0x8a, 0x43, 0x38, 0xce, 0xf2, 0x55, 0x19, 0x65, 0x15, 0xb4, 0x5c, 0x4e, 0x9d, - 0x61, 0x37, 0x8f, 0x3f, 0x67, 0xc0, 0xac, 0x33, 0xe2, 0xe0, 0xb4, 0x9d, 0xfe, 0x2f, 0x0d, 0xcc, - 0xed, 0xd4, 0xf7, 0x76, 0x03, 0xda, 0x26, 0x01, 0x7c, 0x0d, 0x66, 0x45, 0x44, 0x36, 0xe6, 0xb8, - 0xa8, 0x6d, 0x68, 0x9b, 0x85, 0xad, 0xfb, 0x46, 0x74, 0xbf, 0x03, 0x60, 0xc3, 0x3f, 0x6f, 0x88, - 0x0d, 0x66, 0x08, 0x6d, 0xa3, 0xfd, 0xc0, 0x38, 0x3c, 0x79, 0x43, 0x2c, 0x5e, 0x23, 0x1c, 0x9b, - 0xf0, 0x7d, 0xb7, 0x3c, 0xd1, 0xeb, 0x96, 0x41, 0xb4, 0x87, 0x06, 0xa8, 0xf0, 0x39, 0xc8, 0x33, - 0x9f, 0x58, 0xc5, 0x49, 0x89, 0x7e, 0xdb, 0xc8, 0xcc, 0x9e, 0x31, 0x88, 0xa8, 0xee, 0x13, 0xcb, - 0x9c, 0x57, 0x88, 0x79, 0xb1, 0x42, 0xd2, 0x5e, 0xff, 0xa7, 0x06, 0x16, 0x06, 0x5a, 0xfb, 0x94, - 0x71, 0xf8, 0xab, 0xa1, 0xd8, 0x8d, 0xab, 0xc5, 0x2e, 0xac, 0x65, 0xe4, 0x4b, 0xca, 0xcf, 0x6c, - 0x7f, 0x27, 0x16, 0x77, 0x15, 0x4c, 0x51, 0x4e, 0x1c, 0x56, 0x9c, 0xdc, 0xc8, 0x6d, 0x16, 0xb6, - 0x36, 0x3e, 0x17, 0xb8, 0xb9, 0xa0, 0xc0, 0xa6, 0xf6, 0x84, 0x19, 0x0a, 0xad, 0xf5, 0xbf, 0xe5, - 0x63, 0x61, 0x8b, 0xe3, 0xc0, 0xa7, 0xe0, 0x06, 0xe6, 0x1c, 0x5b, 0x67, 0x88, 0xbc, 0x6d, 0xd1, - 0x80, 0xd8, 0x32, 0xf8, 0x59, 0x13, 0xf6, 0xba, 0xe5, 0x1b, 0xdb, 0x09, 0x09, 0x4a, 0x69, 0x0a, - 0x5b, 0xdf, 0xb3, 0xf7, 0xdc, 0x53, 0xef, 0xd0, 0xad, 0x79, 0x2d, 0x97, 0xcb, 0x6b, 0x55, 0xb6, - 0x47, 0x09, 0x09, 0x4a, 0x69, 0x42, 0x0b, 0xac, 0xb6, 0xbd, 0x66, 0xcb, 0x21, 0xfb, 0xf4, 0x94, - 0x58, 0x1d, 0xab, 0x49, 0x6a, 0x9e, 0x4d, 0x58, 0x31, 0xb7, 0x91, 0xdb, 0x9c, 0x33, 0x2b, 0xbd, - 0x6e, 0x79, 0xf5, 0x65, 0x86, 0xfc, 0xa2, 0x5b, 0x5e, 0xc9, 0xd8, 0x47, 0x99, 0x60, 0xf0, 0x19, - 0x58, 0x54, 0x97, 0xb3, 0x83, 0x7d, 0x6c, 0x51, 0xde, 0x29, 0xe6, 0x65, 0x84, 0x2b, 0xbd, 0x6e, - 0x79, 0xb1, 0x9e, 0x14, 0xa1, 0xb4, 0x2e, 0x7c, 0x01, 0x16, 0x4e, 0xd9, 0x4f, 0x03, 0xaf, 0xe5, - 0x1f, 0x79, 0x4d, 0x6a, 0x75, 0x8a, 0x53, 0x1b, 0xda, 0xe6, 0x9c, 0xa9, 0xf7, 0xba, 0xe5, 0x85, - 0xe7, 0xf5, 0x98, 0xe0, 0x22, 0xbd, 0x81, 0x92, 0x86, 0xf0, 0x35, 0x58, 0xe0, 0xde, 0x39, 0x71, - 0xc5, 0xd5, 0x11, 0xc6, 0x59, 0x71, 0x5a, 0xa6, 0xf1, 0xd6, 0x88, 0x34, 0x1e, 0xc7, 0x74, 0xcd, - 0x35, 0x95, 0xc9, 0x85, 0xf8, 0x2e, 0x43, 0x49, 0x40, 0xb8, 0x03, 0x96, 0x83, 0x30, 0x2f, 0x0c, - 0x11, 0xbf, 0x75, 0xd2, 0xa4, 0xec, 0xac, 0x38, 0x23, 0x0f, 0xbb, 0xd6, 0xeb, 0x96, 0x97, 0x51, - 0x5a, 0x88, 0x86, 0xf5, 0xf5, 0x7f, 0x68, 0x60, 0x66, 0xa7, 0xbe, 0x77, 0xe0, 0xd9, 0x64, 0x0c, - 0xb5, 0xb8, 0x9b, 0xa8, 0x45, 0x7d, 0x34, 0xa5, 0x45, 0x3c, 0x23, 0x2b, 0xf1, 0xeb, 0xb0, 0x12, - 0x85, 0x8e, 0xea, 0x22, 0x1b, 0x20, 0xef, 0x62, 0x87, 0xc8, 0xa8, 0xe7, 0x22, 0x9b, 0x03, 0xec, - 0x10, 0x24, 0x25, 0xf0, 0x7b, 0x60, 0xda, 0xf5, 0x6c, 0xb2, 0xb7, 0x2b, 0x7d, 0xcf, 0x99, 0x37, - 0x94, 0xce, 0xf4, 0x81, 0xdc, 0x45, 0x4a, 0x0a, 0x1f, 0x81, 0x79, 0xee, 0xf9, 0x5e, 0xd3, 0x6b, - 0x74, 0x7e, 0x46, 0x3a, 0x7d, 0x72, 0x2e, 0xf5, 0xba, 0xe5, 0xf9, 0xe3, 0xd8, 0x3e, 0x4a, 0x68, - 0xc1, 0x5f, 0x83, 0x02, 0x6e, 0x36, 0x3d, 0x0b, 0x73, 0x7c, 0xd2, 0x24, 0x92, 0x71, 0x85, 0xad, - 0xbb, 0x23, 0x8e, 0x17, 0x92, 0x59, 0xf8, 0x45, 0xaa, 0x85, 0x33, 0x73, 0xb1, 0xd7, 0x2d, 0x17, - 0xb6, 0x23, 0x08, 0x14, 0xc7, 0xd3, 0xff, 0xae, 0x81, 0x82, 0x3a, 0xf0, 0x18, 0x1a, 0xcf, 0x4e, - 0xb2, 0xf1, 0x94, 0x2e, 0xcf, 0xd2, 0x88, 0xb6, 0xf3, 0x9b, 0x41, 0xc4, 0xb2, 0xe7, 0x1c, 0x82, - 0x19, 0x5b, 0xa6, 0x8a, 0x15, 0x35, 0x89, 0x7a, 0xfb, 0x72, 0x54, 0xd5, 0xd2, 0x16, 0x15, 0xf6, - 0x4c, 0xb8, 0x66, 0xa8, 0x8f, 0xa2, 0x7f, 0x93, 0x03, 0x70, 0xa7, 0xbe, 0x97, 0x2a, 0xe8, 0x31, - 0x50, 0x98, 0x82, 0x79, 0x41, 0x95, 0x3e, 0x19, 0x14, 0x95, 0x1f, 0x5e, 0xf1, 0xfe, 0xf1, 0x09, - 0x69, 0xd6, 0x49, 0x93, 0x58, 0xdc, 0x0b, 0x42, 0x56, 0x1d, 0xc4, 0xc0, 0x50, 0x02, 0x1a, 0xee, - 0x82, 0xa5, 0x7e, 0x7f, 0x6a, 0x62, 0xc6, 0x04, 0x9b, 0x8b, 0x39, 0xc9, 0xde, 0xa2, 0x0a, 0x71, - 0xa9, 0x9e, 0x92, 0xa3, 0x21, 0x0b, 0xf8, 0x0a, 0xcc, 0x5a, 0xf1, 0x56, 0xf8, 0x19, 0xb2, 0x18, - 0xfd, 0xb9, 0xc2, 0xf8, 0x79, 0x0b, 0xbb, 0x9c, 0xf2, 0x8e, 0x39, 0x2f, 0x88, 0x32, 0xe8, 0x99, - 0x03, 0x34, 0xc8, 0xc0, 0xb2, 0x83, 0xdf, 0x51, 0xa7, 0xe5, 0x84, 0x94, 0xae, 0xd3, 0xdf, 0x11, - 0xd9, 0x30, 0xaf, 0xef, 0x42, 0x36, 0xac, 0x5a, 0x1a, 0x0c, 0x0d, 0xe3, 0xeb, 0xff, 0xd5, 0xc0, - 0xcd, 0xe1, 0xc4, 0x8f, 0xa1, 0x2c, 0x0e, 0x92, 0x65, 0x71, 0x67, 0x34, 0x81, 0x53, 0xb1, 0x8d, - 0xa8, 0x90, 0x3f, 0x4d, 0x83, 0xf9, 0x78, 0xfa, 0xc6, 0xc0, 0xdd, 0x1f, 0x81, 0x82, 0x1f, 0x78, - 0x6d, 0xca, 0xa8, 0xe7, 0x92, 0x40, 0x75, 0xc2, 0x15, 0x65, 0x52, 0x38, 0x8a, 0x44, 0x28, 0xae, - 0x07, 0x1b, 0x00, 0xf8, 0x38, 0xc0, 0x0e, 0xe1, 0xa2, 0x7e, 0x73, 0xf2, 0xf8, 0x0f, 0x47, 0x1c, - 0x3f, 0x7e, 0x22, 0xe3, 0x68, 0x60, 0x55, 0x75, 0x79, 0xd0, 0x89, 0xa2, 0x8b, 0x04, 0x28, 0x06, - 0x0d, 0xcf, 0xc1, 0x42, 0x40, 0xac, 0x26, 0xa6, 0x8e, 0x7a, 0x7d, 0xf3, 0x32, 0xc2, 0xaa, 0x78, - 0x0a, 0x51, 0x5c, 0x70, 0xd1, 0x2d, 0xdf, 0x1f, 0x9e, 0x9f, 0x8d, 0x23, 0x12, 0x30, 0xca, 0x38, - 0x71, 0x79, 0x48, 0x98, 0x84, 0x0d, 0x4a, 0x62, 0x8b, 0x4e, 0xef, 0x88, 0xb9, 0xe4, 0xd0, 0xe7, - 0xd4, 0x73, 0x59, 0x71, 0x2a, 0xea, 0xf4, 0xb5, 0xd8, 0x3e, 0x4a, 0x68, 0xc1, 0x7d, 0xb0, 0x2a, - 0x3a, 0xf3, 0x6f, 0x43, 0x07, 0xd5, 0x77, 0x3e, 0x76, 0xc5, 0x2d, 0x15, 0xa7, 0xe5, 0xbb, 0x5b, - 0x14, 0x43, 0xcc, 0x76, 0x86, 0x1c, 0x65, 0x5a, 0xc1, 0x57, 0x60, 0x39, 0x9c, 0x62, 0x4c, 0xea, - 0xda, 0xd4, 0x6d, 0x88, 0x19, 0x46, 0x3e, 0xe1, 0x73, 0xe6, 0x5d, 0x51, 0x11, 0x2f, 0xd3, 0xc2, - 0x8b, 0xac, 0x4d, 0x34, 0x0c, 0x02, 0xdf, 0x82, 0x65, 0xe9, 0x91, 0xd8, 0xaa, 0x9d, 0x50, 0xc2, - 0x8a, 0xb3, 0x32, 0x75, 0x9b, 0xf1, 0xd4, 0x89, 0xab, 0x0b, 0xe7, 0x8f, 0xb0, 0xe9, 0xf4, 0x9b, - 0xd3, 0x31, 0x09, 0x1c, 0xf3, 0xbb, 0x2a, 0x5f, 0xcb, 0xdb, 0x69, 0x28, 0x34, 0x8c, 0xbe, 0xfe, - 0x0c, 0x2c, 0xa6, 0x12, 0x0e, 0x97, 0x40, 0xee, 0x9c, 0x74, 0xc2, 0x67, 0x19, 0x89, 0x9f, 0x70, - 0x15, 0x4c, 0xb5, 0x71, 0xb3, 0x45, 0x42, 0xf2, 0xa1, 0x70, 0xf1, 0x74, 0xf2, 0x89, 0xa6, 0xff, - 0x5b, 0x03, 0x89, 0x76, 0x36, 0x86, 0x92, 0x7e, 0x91, 0x2c, 0xe9, 0x5b, 0x57, 0xe0, 0xf4, 0x88, - 0x62, 0xfe, 0x83, 0x06, 0xe6, 0xe3, 0xc3, 0x1a, 0xfc, 0x21, 0x98, 0xc5, 0x2d, 0x9b, 0x12, 0xd7, - 0xea, 0x4f, 0x25, 0x83, 0x40, 0xb6, 0xd5, 0x3e, 0x1a, 0x68, 0x88, 0x51, 0x8e, 0xbc, 0xf3, 0x69, - 0x80, 0x05, 0xc9, 0xea, 0xc4, 0xf2, 0x5c, 0x9b, 0xc9, 0x1b, 0xca, 0x85, 0x9d, 0xb1, 0x9a, 0x16, - 0xa2, 0x61, 0x7d, 0xfd, 0xaf, 0x93, 0x60, 0x29, 0xe4, 0x46, 0x38, 0xc4, 0x3b, 0xc4, 0xe5, 0x63, - 0x68, 0x2a, 0xb5, 0xc4, 0x4c, 0xf7, 0x83, 0x4b, 0x87, 0x9e, 0x28, 0xb0, 0x51, 0xc3, 0x1d, 0xfc, - 0x05, 0x98, 0x66, 0x1c, 0xf3, 0x16, 0x93, 0x4f, 0x5d, 0x61, 0xeb, 0xde, 0x55, 0x01, 0xa5, 0x51, - 0x34, 0xd7, 0x85, 0x6b, 0xa4, 0xc0, 0xf4, 0xff, 0x68, 0x60, 0x35, 0x6d, 0x32, 0x06, 0x86, 0xed, - 0x27, 0x19, 0xf6, 0xfd, 0x2b, 0x1e, 0x66, 0x04, 0xcb, 0xfe, 0xaf, 0x81, 0x9b, 0x43, 0xe7, 0x96, - 0x2f, 0xa9, 0xe8, 0x4b, 0x7e, 0xaa, 0xfb, 0x1d, 0x44, 0x13, 0xb1, 0xec, 0x4b, 0x47, 0x19, 0x72, - 0x94, 0x69, 0x05, 0xdf, 0x80, 0x25, 0xea, 0x36, 0xa9, 0x4b, 0xd4, 0xc3, 0x1b, 0xe5, 0x37, 0xb3, - 0x79, 0xa4, 0x91, 0x65, 0x72, 0x57, 0xc5, 0x7c, 0xb2, 0x97, 0x42, 0x41, 0x43, 0xb8, 0xfa, 0xff, - 0x32, 0x32, 0x23, 0x67, 0x46, 0x51, 0x42, 0x72, 0x87, 0x04, 0x43, 0x25, 0xa4, 0xf6, 0xd1, 0x40, - 0x43, 0xf2, 0x46, 0x5e, 0x85, 0x0a, 0xf4, 0xca, 0xbc, 0x91, 0x46, 0x31, 0xde, 0xc8, 0x35, 0x52, - 0x60, 0x22, 0x08, 0x31, 0x93, 0xc5, 0x66, 0xaf, 0x41, 0x10, 0x07, 0x6a, 0x1f, 0x0d, 0x34, 0xf4, - 0xaf, 0x72, 0x19, 0x09, 0x92, 0x04, 0x8c, 0x9d, 0xa6, 0xff, 0xbd, 0x9d, 0x3e, 0x8d, 0x3d, 0x38, - 0x8d, 0x0d, 0xff, 0xa2, 0x01, 0x88, 0x07, 0x10, 0xb5, 0x3e, 0x41, 0x43, 0x16, 0x55, 0xaf, 0x55, - 0x12, 0xc6, 0xf6, 0x10, 0x4e, 0xf8, 0x1a, 0xaf, 0x2b, 0xff, 0x70, 0x58, 0x01, 0x65, 0x38, 0x87, - 0x36, 0x28, 0x84, 0xbb, 0xd5, 0x20, 0xf0, 0x02, 0x55, 0x9e, 0xfa, 0xa5, 0xb1, 0x48, 0x4d, 0xb3, - 0x24, 0x3f, 0x6e, 0x22, 0xd3, 0x8b, 0x6e, 0xb9, 0x10, 0x93, 0xa3, 0x38, 0xac, 0xf0, 0x62, 0x93, - 0xc8, 0x4b, 0xfe, 0x7a, 0x5e, 0x76, 0xc9, 0x68, 0x2f, 0x31, 0xd8, 0xf5, 0x2a, 0xf8, 0xce, 0x88, - 0x6b, 0xb9, 0xd6, 0x9b, 0xf5, 0x47, 0x0d, 0xc4, 0x7d, 0xc0, 0x7d, 0x90, 0xe7, 0x54, 0x55, 0x5d, - 0xf2, 0x03, 0xf0, 0x92, 0x46, 0x72, 0x4c, 0x1d, 0x12, 0xb5, 0x42, 0xb1, 0x42, 0x12, 0x05, 0xde, - 0x01, 0x33, 0x0e, 0x61, 0x0c, 0x37, 0x94, 0xe7, 0xe8, 0x73, 0xa8, 0x16, 0x6e, 0xa3, 0xbe, 0x5c, - 0x7f, 0x0c, 0x56, 0x32, 0x3e, 0x2b, 0x61, 0x19, 0x4c, 0x59, 0xf2, 0x5f, 0x1a, 0x11, 0xd0, 0x94, - 0x39, 0x27, 0x3a, 0xca, 0x8e, 0xfc, 0x73, 0x26, 0xdc, 0x37, 0x7f, 0xfc, 0xfe, 0x53, 0x69, 0xe2, - 0xc3, 0xa7, 0xd2, 0xc4, 0xc7, 0x4f, 0xa5, 0x89, 0xdf, 0xf7, 0x4a, 0xda, 0xfb, 0x5e, 0x49, 0xfb, - 0xd0, 0x2b, 0x69, 0x1f, 0x7b, 0x25, 0xed, 0x8b, 0x5e, 0x49, 0xfb, 0xf3, 0x97, 0xa5, 0x89, 0x5f, - 0xae, 0x65, 0xfe, 0x31, 0xfa, 0x6d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x6e, 0x72, 0x7b, 0x49, - 0x15, 0x00, 0x00, + // 1670 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcd, 0x73, 0x1b, 0x4b, + 0x11, 0xf7, 0x5a, 0xf2, 0xd7, 0xc8, 0x8e, 0xed, 0xb1, 0xfd, 0x10, 0x3e, 0x48, 0xae, 0x7d, 0xaf, + 0xc0, 0xef, 0xc1, 0x5b, 0xbd, 0x38, 0x21, 0x95, 0x0a, 0x15, 0xaa, 0xbc, 0xb6, 0x42, 0x5c, 0x58, + 0xb6, 0x19, 0x99, 0x54, 0x8a, 0x02, 0x2a, 0xe3, 0xdd, 0xb1, 0x3c, 0xb1, 0xf6, 0x23, 0x3b, 0xb3, + 0xc2, 0xe2, 0x04, 0x17, 0x6e, 0x54, 0xc1, 0x95, 0xbf, 0x02, 0xaa, 0xe0, 0xc2, 0x91, 0x03, 0x15, + 0x6e, 0x29, 0x4e, 0x39, 0xa9, 0x88, 0x38, 0xc3, 0x91, 0x83, 0x4f, 0xaf, 0x66, 0x76, 0xa4, 0xfd, + 0xd0, 0xca, 0xb1, 0x2f, 0xba, 0x69, 0xa6, 0xbb, 0x7f, 0xdd, 0x33, 0xdd, 0xfd, 0x9b, 0x5e, 0x81, + 0x1f, 0x5c, 0x3e, 0x66, 0x06, 0xf5, 0x6a, 0x97, 0xe1, 0x19, 0x09, 0x5c, 0xc2, 0x09, 0xab, 0x75, + 0x88, 0x6b, 0x7b, 0x41, 0x4d, 0x09, 0xb0, 0x4f, 0x6b, 0x8c, 0x7b, 0x01, 0x6e, 0x91, 0x5a, 0xe7, + 0x7e, 0xad, 0x45, 0x5c, 0x12, 0x60, 0x4e, 0x6c, 0xc3, 0x0f, 0x3c, 0xee, 0xc1, 0x8d, 0x48, 0xcd, + 0xc0, 0x3e, 0x35, 0x94, 0x9a, 0xd1, 0xb9, 0xbf, 0xf9, 0x65, 0x8b, 0xf2, 0x8b, 0xf0, 0xcc, 0xb0, + 0x3c, 0xa7, 0xd6, 0xf2, 0x5a, 0x5e, 0x4d, 0x6a, 0x9f, 0x85, 0xe7, 0x72, 0x25, 0x17, 0xf2, 0x57, + 0x84, 0xb2, 0xa9, 0x27, 0x9c, 0x59, 0x5e, 0x90, 0xe7, 0x69, 0xf3, 0x61, 0xac, 0xe3, 0x60, 0xeb, + 0x82, 0xba, 0x24, 0xe8, 0xd6, 0xfc, 0xcb, 0x96, 0x34, 0x0a, 0x08, 0xf3, 0xc2, 0xc0, 0x22, 0x77, + 0xb2, 0x62, 0x35, 0x87, 0x70, 0x9c, 0xe7, 0xab, 0x36, 0xce, 0x2a, 0x08, 0x5d, 0x4e, 0x9d, 0x51, + 0x37, 0x8f, 0x3e, 0x66, 0xc0, 0xac, 0x0b, 0xe2, 0xe0, 0xac, 0x9d, 0xfe, 0x57, 0x0d, 0x2c, 0xec, + 0x35, 0x0f, 0xf6, 0x03, 0xda, 0x21, 0x01, 0x7c, 0x05, 0xe6, 0x45, 0x44, 0x36, 0xe6, 0xb8, 0xac, + 0x6d, 0x69, 0xdb, 0xa5, 0x9d, 0xaf, 0x8c, 0xf8, 0x7e, 0x87, 0xc0, 0x86, 0x7f, 0xd9, 0x12, 0x1b, + 0xcc, 0x10, 0xda, 0x46, 0xe7, 0xbe, 0x71, 0x7c, 0xf6, 0x9a, 0x58, 0xbc, 0x41, 0x38, 0x36, 0xe1, + 0xdb, 0x5e, 0x75, 0xaa, 0xdf, 0xab, 0x82, 0x78, 0x0f, 0x0d, 0x51, 0xe1, 0x33, 0x50, 0x64, 0x3e, + 0xb1, 0xca, 0xd3, 0x12, 0xfd, 0x33, 0x23, 0x37, 0x7b, 0xc6, 0x30, 0xa2, 0xa6, 0x4f, 0x2c, 0x73, + 0x51, 0x21, 0x16, 0xc5, 0x0a, 0x49, 0x7b, 0xfd, 0x2f, 0x1a, 0x58, 0x1a, 0x6a, 0x1d, 0x52, 0xc6, + 0xe1, 0xcf, 0x46, 0x62, 0x37, 0x6e, 0x17, 0xbb, 0xb0, 0x96, 0x91, 0xaf, 0x28, 0x3f, 0xf3, 0x83, + 0x9d, 0x44, 0xdc, 0x75, 0x30, 0x43, 0x39, 0x71, 0x58, 0x79, 0x7a, 0xab, 0xb0, 0x5d, 0xda, 0xd9, + 0xfa, 0x58, 0xe0, 0xe6, 0x92, 0x02, 0x9b, 0x39, 0x10, 0x66, 0x28, 0xb2, 0xd6, 0xff, 0x55, 0x4c, + 0x84, 0x2d, 0x8e, 0x03, 0x9f, 0x80, 0x7b, 0x98, 0x73, 0x6c, 0x5d, 0x20, 0xf2, 0x26, 0xa4, 0x01, + 0xb1, 0x65, 0xf0, 0xf3, 0x26, 0xec, 0xf7, 0xaa, 0xf7, 0x76, 0x53, 0x12, 0x94, 0xd1, 0x14, 0xb6, + 0xbe, 0x67, 0x1f, 0xb8, 0xe7, 0xde, 0xb1, 0xdb, 0xf0, 0x42, 0x97, 0xcb, 0x6b, 0x55, 0xb6, 0x27, + 0x29, 0x09, 0xca, 0x68, 0x42, 0x0b, 0xac, 0x77, 0xbc, 0x76, 0xe8, 0x90, 0x43, 0x7a, 0x4e, 0xac, + 0xae, 0xd5, 0x26, 0x0d, 0xcf, 0x26, 0xac, 0x5c, 0xd8, 0x2a, 0x6c, 0x2f, 0x98, 0xb5, 0x7e, 0xaf, + 0xba, 0xfe, 0x22, 0x47, 0x7e, 0xdd, 0xab, 0xae, 0xe5, 0xec, 0xa3, 0x5c, 0x30, 0xf8, 0x14, 0x2c, + 0xab, 0xcb, 0xd9, 0xc3, 0x3e, 0xb6, 0x28, 0xef, 0x96, 0x8b, 0x32, 0xc2, 0xb5, 0x7e, 0xaf, 0xba, + 0xdc, 0x4c, 0x8b, 0x50, 0x56, 0x17, 0x3e, 0x07, 0x4b, 0xe7, 0xec, 0x87, 0x81, 0x17, 0xfa, 0x27, + 0x5e, 0x9b, 0x5a, 0xdd, 0xf2, 0xcc, 0x96, 0xb6, 0xbd, 0x60, 0xea, 0xfd, 0x5e, 0x75, 0xe9, 0x59, + 0x33, 0x21, 0xb8, 0xce, 0x6e, 0xa0, 0xb4, 0x21, 0x7c, 0x05, 0x96, 0xb8, 0x77, 0x49, 0x5c, 0x71, + 0x75, 0x84, 0x71, 0x56, 0x9e, 0x95, 0x69, 0xfc, 0x74, 0x4c, 0x1a, 0x4f, 0x13, 0xba, 0xe6, 0x86, + 0xca, 0xe4, 0x52, 0x72, 0x97, 0xa1, 0x34, 0x20, 0xdc, 0x03, 0xab, 0x41, 0x94, 0x17, 0x86, 0x88, + 0x1f, 0x9e, 0xb5, 0x29, 0xbb, 0x28, 0xcf, 0xc9, 0xc3, 0x6e, 0xf4, 0x7b, 0xd5, 0x55, 0x94, 0x15, + 0xa2, 0x51, 0x7d, 0xf8, 0x10, 0x2c, 0x32, 0x72, 0x48, 0xdd, 0xf0, 0x2a, 0x4a, 0xe7, 0xbc, 0xb4, + 0x5f, 0xe9, 0xf7, 0xaa, 0x8b, 0xcd, 0x7a, 0xbc, 0x8f, 0x52, 0x5a, 0xfa, 0x9f, 0x35, 0x30, 0xb7, + 0xd7, 0x3c, 0x38, 0xf2, 0x6c, 0x32, 0x81, 0x0e, 0xde, 0x4f, 0x75, 0xb0, 0x3e, 0xbe, 0x11, 0x44, + 0x3c, 0x63, 0xfb, 0xf7, 0x7f, 0x51, 0xff, 0x0a, 0x1d, 0xc5, 0x3d, 0x5b, 0xa0, 0xe8, 0x62, 0x87, + 0xc8, 0xa8, 0x17, 0x62, 0x9b, 0x23, 0xec, 0x10, 0x24, 0x25, 0xf0, 0x5b, 0x60, 0xd6, 0xf5, 0x6c, + 0x72, 0xb0, 0x2f, 0x7d, 0x2f, 0x98, 0xf7, 0x94, 0xce, 0xec, 0x91, 0xdc, 0x45, 0x4a, 0x2a, 0x6e, + 0x91, 0x7b, 0xbe, 0xd7, 0xf6, 0x5a, 0xdd, 0x1f, 0x91, 0xee, 0xa0, 0xa4, 0xe5, 0x2d, 0x9e, 0x26, + 0xf6, 0x51, 0x4a, 0x0b, 0xfe, 0x1c, 0x94, 0x70, 0xbb, 0xed, 0x59, 0x98, 0xe3, 0xb3, 0x36, 0x91, + 0x75, 0x5a, 0xda, 0xf9, 0x62, 0xcc, 0xf1, 0xa2, 0x16, 0x10, 0x7e, 0x91, 0x22, 0x7e, 0x66, 0x2e, + 0xf7, 0x7b, 0xd5, 0xd2, 0x6e, 0x0c, 0x81, 0x92, 0x78, 0xfa, 0x9f, 0x34, 0x50, 0x52, 0x07, 0x9e, + 0x00, 0x5d, 0xed, 0xa5, 0xe9, 0xaa, 0x72, 0x73, 0x96, 0xc6, 0x90, 0xd5, 0x2f, 0x86, 0x11, 0x4b, + 0xa6, 0x3a, 0x06, 0x73, 0xb6, 0x4c, 0x15, 0x2b, 0x6b, 0x12, 0xf5, 0xb3, 0x9b, 0x51, 0x15, 0x11, + 0x2e, 0x2b, 0xec, 0xb9, 0x68, 0xcd, 0xd0, 0x00, 0x45, 0xff, 0x7f, 0x01, 0xc0, 0xbd, 0xe6, 0x41, + 0x86, 0x06, 0x26, 0x50, 0xc2, 0x14, 0x2c, 0x8a, 0x52, 0x19, 0x14, 0x83, 0x2a, 0xe5, 0x07, 0xb7, + 0xbc, 0x7f, 0x7c, 0x46, 0xda, 0x4d, 0xd2, 0x26, 0x16, 0xf7, 0x82, 0xa8, 0xaa, 0x8e, 0x12, 0x60, + 0x28, 0x05, 0x0d, 0xf7, 0xc1, 0xca, 0x80, 0xd5, 0xda, 0x98, 0x31, 0x51, 0xcd, 0xe5, 0x82, 0xac, + 0xde, 0xb2, 0x0a, 0x71, 0xa5, 0x99, 0x91, 0xa3, 0x11, 0x0b, 0xf8, 0x12, 0xcc, 0x5b, 0x49, 0x02, + 0xfd, 0x48, 0xb1, 0x18, 0x83, 0x69, 0xc4, 0xf8, 0x71, 0x88, 0x5d, 0x4e, 0x79, 0xd7, 0x5c, 0x14, + 0x85, 0x32, 0x64, 0xda, 0x21, 0x1a, 0x64, 0x60, 0xd5, 0xc1, 0x57, 0xd4, 0x09, 0x9d, 0xa8, 0xa4, + 0x9b, 0xf4, 0x57, 0x44, 0xd2, 0xec, 0xdd, 0x5d, 0x48, 0x9a, 0x6b, 0x64, 0xc1, 0xd0, 0x28, 0xbe, + 0xfe, 0x0f, 0x0d, 0x7c, 0x32, 0x9a, 0xf8, 0x09, 0xb4, 0xc5, 0x51, 0xba, 0x2d, 0x3e, 0x1f, 0x5f, + 0xc0, 0x99, 0xd8, 0xc6, 0x74, 0xc8, 0xef, 0x66, 0xc1, 0x62, 0x32, 0x7d, 0x13, 0xa8, 0xdd, 0xef, + 0x81, 0x92, 0x1f, 0x78, 0x1d, 0xca, 0xa8, 0xe7, 0x92, 0x40, 0x31, 0xe1, 0x9a, 0x32, 0x29, 0x9d, + 0xc4, 0x22, 0x94, 0xd4, 0x83, 0x2d, 0x00, 0x7c, 0x1c, 0x60, 0x87, 0x70, 0xd1, 0xbf, 0x05, 0x79, + 0xfc, 0x07, 0x63, 0x8e, 0x9f, 0x3c, 0x91, 0x71, 0x32, 0xb4, 0xaa, 0xbb, 0x3c, 0xe8, 0xc6, 0xd1, + 0xc5, 0x02, 0x94, 0x80, 0x86, 0x97, 0x60, 0x29, 0x20, 0x56, 0x1b, 0x53, 0x47, 0xbd, 0xd9, 0x45, + 0x19, 0x61, 0x5d, 0x3c, 0xa0, 0x28, 0x29, 0xb8, 0xee, 0x55, 0xbf, 0x1a, 0x9d, 0xba, 0x8d, 0x13, + 0x12, 0x30, 0xca, 0x38, 0x71, 0x79, 0x54, 0x30, 0x29, 0x1b, 0x94, 0xc6, 0x16, 0x4c, 0xef, 0x88, + 0x27, 0xf0, 0xd8, 0xe7, 0xd4, 0x73, 0x59, 0x79, 0x26, 0x66, 0xfa, 0x46, 0x62, 0x1f, 0xa5, 0xb4, + 0xe0, 0x21, 0x58, 0x17, 0xcc, 0xfc, 0xcb, 0xc8, 0x41, 0xfd, 0xca, 0xc7, 0xae, 0xb8, 0xa5, 0xf2, + 0xac, 0x7c, 0x6d, 0xcb, 0x62, 0xf4, 0xd9, 0xcd, 0x91, 0xa3, 0x5c, 0x2b, 0xf8, 0x12, 0xac, 0x46, + 0xb3, 0x8f, 0x49, 0x5d, 0x9b, 0xba, 0x2d, 0x31, 0xf9, 0xc8, 0x87, 0x7f, 0xc1, 0xfc, 0x42, 0x74, + 0xc4, 0x8b, 0xac, 0xf0, 0x3a, 0x6f, 0x13, 0x8d, 0x82, 0xc0, 0x37, 0x60, 0x55, 0x7a, 0x24, 0xb6, + 0xa2, 0x13, 0x4a, 0x58, 0x79, 0x5e, 0xa6, 0x6e, 0x3b, 0x99, 0x3a, 0x71, 0x75, 0xd1, 0xd4, 0x12, + 0x91, 0xce, 0x80, 0x9c, 0x4e, 0x49, 0xe0, 0x98, 0xdf, 0x54, 0xf9, 0x5a, 0xdd, 0xcd, 0x42, 0xa1, + 0x51, 0xf4, 0xcd, 0xa7, 0x60, 0x39, 0x93, 0x70, 0xb8, 0x02, 0x0a, 0x97, 0xa4, 0x1b, 0x3d, 0xcb, + 0x48, 0xfc, 0x84, 0xeb, 0x60, 0xa6, 0x83, 0xdb, 0x21, 0x89, 0x8a, 0x0f, 0x45, 0x8b, 0x27, 0xd3, + 0x8f, 0x35, 0xfd, 0x6f, 0x1a, 0x48, 0xd1, 0xd9, 0x04, 0x5a, 0xfa, 0x79, 0xba, 0xa5, 0x3f, 0xbd, + 0x45, 0x4d, 0x8f, 0x69, 0xe6, 0xdf, 0x68, 0x60, 0x31, 0x39, 0xe2, 0xc1, 0xef, 0x82, 0x79, 0x1c, + 0xda, 0x94, 0xb8, 0xd6, 0x60, 0x2a, 0x19, 0x06, 0xb2, 0xab, 0xf6, 0xd1, 0x50, 0x43, 0x0c, 0x80, + 0xe4, 0xca, 0xa7, 0x01, 0x16, 0x45, 0xd6, 0x24, 0x96, 0xe7, 0xda, 0x4c, 0xde, 0x50, 0x21, 0x62, + 0xc6, 0x7a, 0x56, 0x88, 0x46, 0xf5, 0xf5, 0x3f, 0x4e, 0x83, 0x95, 0xa8, 0x36, 0xa2, 0xd1, 0xdf, + 0x21, 0x2e, 0x9f, 0x00, 0xa9, 0x34, 0x52, 0x33, 0xdd, 0x77, 0x6e, 0x1c, 0x7a, 0xe2, 0xc0, 0xc6, + 0x0d, 0x77, 0xf0, 0x27, 0x60, 0x96, 0x71, 0xcc, 0x43, 0x26, 0x9f, 0xba, 0xd2, 0xce, 0x97, 0xb7, + 0x05, 0x94, 0x46, 0xf1, 0x5c, 0x17, 0xad, 0x91, 0x02, 0xd3, 0xff, 0xae, 0x81, 0xf5, 0xac, 0xc9, + 0x04, 0x2a, 0xec, 0x30, 0x5d, 0x61, 0xdf, 0xbe, 0xe5, 0x61, 0xc6, 0x7d, 0x01, 0x6a, 0xe0, 0x93, + 0x91, 0x73, 0xcb, 0x97, 0x54, 0xf0, 0x92, 0x9f, 0x61, 0xbf, 0xa3, 0x78, 0x22, 0x96, 0xbc, 0x74, + 0x92, 0x23, 0x47, 0xb9, 0x56, 0xf0, 0x35, 0x58, 0xa1, 0x6e, 0x9b, 0xba, 0x44, 0x3d, 0xbc, 0x71, + 0x7e, 0x73, 0xc9, 0x23, 0x8b, 0x2c, 0x93, 0xbb, 0x2e, 0xe6, 0x93, 0x83, 0x0c, 0x0a, 0x1a, 0xc1, + 0xd5, 0xff, 0x99, 0x93, 0x19, 0x39, 0x33, 0x8a, 0x16, 0x92, 0x3b, 0x24, 0x18, 0x69, 0x21, 0xb5, + 0x8f, 0x86, 0x1a, 0xb2, 0x6e, 0xe4, 0x55, 0xa8, 0x40, 0x6f, 0x5d, 0x37, 0xd2, 0x28, 0x51, 0x37, + 0x72, 0x8d, 0x14, 0x98, 0x08, 0x42, 0xcc, 0x64, 0x89, 0xd9, 0x6b, 0x18, 0xc4, 0x91, 0xda, 0x47, + 0x43, 0x0d, 0xfd, 0xbf, 0x85, 0x9c, 0x04, 0xc9, 0x02, 0x4c, 0x9c, 0x66, 0xf0, 0x95, 0x9e, 0x3d, + 0x8d, 0x3d, 0x3c, 0x8d, 0x0d, 0xff, 0xa0, 0x01, 0x88, 0x87, 0x10, 0x8d, 0x41, 0x81, 0x46, 0x55, + 0x54, 0xbf, 0x53, 0x4b, 0x18, 0xbb, 0x23, 0x38, 0xd1, 0x6b, 0xbc, 0xa9, 0xfc, 0xc3, 0x51, 0x05, + 0x94, 0xe3, 0x1c, 0xda, 0xa0, 0x14, 0xed, 0xd6, 0x83, 0xc0, 0x0b, 0x54, 0x7b, 0xea, 0x37, 0xc6, + 0x22, 0x35, 0xcd, 0x8a, 0xfc, 0xb8, 0x89, 0x4d, 0xaf, 0x7b, 0xd5, 0x52, 0x42, 0x8e, 0x92, 0xb0, + 0xc2, 0x8b, 0x4d, 0x62, 0x2f, 0xc5, 0xbb, 0x79, 0xd9, 0x27, 0xe3, 0xbd, 0x24, 0x60, 0x37, 0xeb, + 0xe0, 0x1b, 0x63, 0xae, 0xe5, 0x4e, 0x6f, 0xd6, 0x6f, 0x35, 0x90, 0xf4, 0x01, 0x0f, 0x41, 0x91, + 0x53, 0xd5, 0x75, 0xe9, 0x0f, 0xc0, 0x1b, 0x88, 0xe4, 0x94, 0x3a, 0x24, 0xa6, 0x42, 0xb1, 0x42, + 0x12, 0x05, 0x7e, 0x0e, 0xe6, 0x1c, 0xc2, 0x18, 0x6e, 0x29, 0xcf, 0xf1, 0xe7, 0x50, 0x23, 0xda, + 0x46, 0x03, 0xb9, 0xfe, 0x08, 0xac, 0xe5, 0x7c, 0x56, 0xc2, 0x2a, 0x98, 0xb1, 0xe4, 0x9f, 0x01, + 0x22, 0xa0, 0x19, 0x73, 0x41, 0x30, 0xca, 0x9e, 0xfc, 0x17, 0x20, 0xda, 0x37, 0xbf, 0xff, 0xf6, + 0x43, 0x65, 0xea, 0xdd, 0x87, 0xca, 0xd4, 0xfb, 0x0f, 0x95, 0xa9, 0x5f, 0xf7, 0x2b, 0xda, 0xdb, + 0x7e, 0x45, 0x7b, 0xd7, 0xaf, 0x68, 0xef, 0xfb, 0x15, 0xed, 0xdf, 0xfd, 0x8a, 0xf6, 0xfb, 0xff, + 0x54, 0xa6, 0x7e, 0xba, 0x91, 0xfb, 0x77, 0xea, 0xd7, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0d, 0xf9, + 0xe3, 0xd5, 0x7f, 0x15, 0x00, 0x00, } func (m *CSIDriver) Marshal() (dAtA []byte, err error) { @@ -826,6 +827,16 @@ func (m *CSIDriverSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.SELinuxMount != nil { + i-- + if *m.SELinuxMount { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } if m.RequiresRepublish != nil { i-- if *m.RequiresRepublish { @@ -1795,6 +1806,9 @@ func (m *CSIDriverSpec) Size() (n int) { if m.RequiresRepublish != nil { n += 2 } + if m.SELinuxMount != nil { + n += 2 + } return n } @@ -2148,6 +2162,7 @@ func (this *CSIDriverSpec) String() string { `FSGroupPolicy:` + valueToStringGenerated(this.FSGroupPolicy) + `,`, `TokenRequests:` + repeatedStringForTokenRequests + `,`, `RequiresRepublish:` + valueToStringGenerated(this.RequiresRepublish) + `,`, + `SELinuxMount:` + valueToStringGenerated(this.SELinuxMount) + `,`, `}`, }, "") return s @@ -2844,6 +2859,27 @@ func (m *CSIDriverSpec) Unmarshal(dAtA []byte) error { } b := bool(v != 0) m.RequiresRepublish = &b + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SELinuxMount", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.SELinuxMount = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/k8s.io/api/storage/v1/generated.proto b/vendor/k8s.io/api/storage/v1/generated.proto index 45417116a..d3c425c04 100644 --- a/vendor/k8s.io/api/storage/v1/generated.proto +++ b/vendor/k8s.io/api/storage/v1/generated.proto @@ -192,6 +192,27 @@ message CSIDriverSpec { // // +optional optional bool requiresRepublish = 7; + + // SELinuxMount specifies if the CSI driver supports "-o context" + // mount option. + // + // When "true", the CSI driver must ensure that all volumes provided by this CSI + // driver can be mounted separately with different `-o context` options. This is + // typical for storage backends that provide volumes as filesystems on block + // devices or as independent shared volumes. + // Kubernetes will call NodeStage / NodePublish with "-o context=xyz" mount + // option when mounting a ReadWriteOncePod volume used in Pod that has + // explicitly set SELinux context. In the future, it may be expanded to other + // volume AccessModes. In any case, Kubernetes will ensure that the volume is + // mounted only with a single SELinux context. + // + // When "false", Kubernetes won't pass any special SELinux mount options to the driver. + // This is typical for volumes that represent subdirectories of a bigger shared filesystem. + // + // Default is "false". + // + // +optional + optional bool seLinuxMount = 8; } // CSINode holds information about all CSI drivers installed on a node. diff --git a/vendor/k8s.io/api/storage/v1/types.go b/vendor/k8s.io/api/storage/v1/types.go index 4812287ab..f57099df6 100644 --- a/vendor/k8s.io/api/storage/v1/types.go +++ b/vendor/k8s.io/api/storage/v1/types.go @@ -392,6 +392,27 @@ type CSIDriverSpec struct { // // +optional RequiresRepublish *bool `json:"requiresRepublish,omitempty" protobuf:"varint,7,opt,name=requiresRepublish"` + + // SELinuxMount specifies if the CSI driver supports "-o context" + // mount option. + // + // When "true", the CSI driver must ensure that all volumes provided by this CSI + // driver can be mounted separately with different `-o context` options. This is + // typical for storage backends that provide volumes as filesystems on block + // devices or as independent shared volumes. + // Kubernetes will call NodeStage / NodePublish with "-o context=xyz" mount + // option when mounting a ReadWriteOncePod volume used in Pod that has + // explicitly set SELinux context. In the future, it may be expanded to other + // volume AccessModes. In any case, Kubernetes will ensure that the volume is + // mounted only with a single SELinux context. + // + // When "false", Kubernetes won't pass any special SELinux mount options to the driver. + // This is typical for volumes that represent subdirectories of a bigger shared filesystem. + // + // Default is "false". + // + // +optional + SELinuxMount *bool `json:"seLinuxMount,omitempty" protobuf:"varint,8,opt,name=seLinuxMount"` } // FSGroupPolicy specifies if a CSI Driver supports modifying diff --git a/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go index 7a407db46..1a069bb40 100644 --- a/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go @@ -56,6 +56,7 @@ var map_CSIDriverSpec = map[string]string{ "fsGroupPolicy": "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details.\n\nThis field is immutable.\n\nDefaults to ReadWriteOnceWithFSType, which will examine each volume to determine if Kubernetes should modify ownership and permissions of the volume. With the default policy the defined fsGroup will only be applied if a fstype is defined and the volume's access mode contains ReadWriteOnce.", "tokenRequests": "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.", "requiresRepublish": "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.", + "seLinuxMount": "SELinuxMount specifies if the CSI driver supports \"-o context\" mount option.\n\nWhen \"true\", the CSI driver must ensure that all volumes provided by this CSI driver can be mounted separately with different `-o context` options. This is typical for storage backends that provide volumes as filesystems on block devices or as independent shared volumes. Kubernetes will call NodeStage / NodePublish with \"-o context=xyz\" mount option when mounting a ReadWriteOncePod volume used in Pod that has explicitly set SELinux context. In the future, it may be expanded to other volume AccessModes. In any case, Kubernetes will ensure that the volume is mounted only with a single SELinux context.\n\nWhen \"false\", Kubernetes won't pass any special SELinux mount options to the driver. This is typical for volumes that represent subdirectories of a bigger shared filesystem.\n\nDefault is \"false\".", } func (CSIDriverSpec) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go index b14b7fbcd..74ae83bca 100644 --- a/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go @@ -127,6 +127,11 @@ func (in *CSIDriverSpec) DeepCopyInto(out *CSIDriverSpec) { *out = new(bool) **out = **in } + if in.SELinuxMount != nil { + in, out := &in.SELinuxMount, &out.SELinuxMount + *out = new(bool) + **out = **in + } return } diff --git a/vendor/k8s.io/api/storage/v1beta1/generated.pb.go b/vendor/k8s.io/api/storage/v1beta1/generated.pb.go index 379ce8f18..42ef65ca0 100644 --- a/vendor/k8s.io/api/storage/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1beta1/generated.pb.go @@ -609,111 +609,112 @@ func init() { } var fileDescriptor_7d2980599fd0de80 = []byte{ - // 1654 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcd, 0x6f, 0x1b, 0x37, - 0x16, 0xf7, 0x58, 0xf2, 0x17, 0x65, 0xc7, 0x36, 0xed, 0x64, 0xb5, 0x3a, 0x48, 0x86, 0x16, 0xbb, - 0x71, 0x82, 0xec, 0x28, 0xf1, 0x66, 0x83, 0x20, 0x40, 0x80, 0xf5, 0xd8, 0xde, 0x8d, 0x12, 0xcb, - 0x71, 0x28, 0x23, 0x08, 0x82, 0x3d, 0x2c, 0x35, 0x43, 0xcb, 0x8c, 0x35, 0x1f, 0x19, 0x52, 0xde, - 0xa8, 0xa7, 0xf6, 0xd2, 0x73, 0xd1, 0x43, 0xef, 0x05, 0xfa, 0x2f, 0xb4, 0x40, 0x7b, 0xe9, 0xb1, - 0x01, 0x0a, 0x14, 0x41, 0x4f, 0x39, 0x09, 0x8d, 0xfa, 0x27, 0x14, 0xe8, 0xc1, 0xe8, 0xa1, 0x20, - 0x87, 0xd2, 0x7c, 0x49, 0xb1, 0xdd, 0x83, 0x6e, 0xe2, 0xfb, 0xf8, 0xbd, 0x47, 0xf2, 0xf7, 0x1e, - 0xdf, 0x08, 0x6c, 0x1d, 0xdf, 0x65, 0x3a, 0x75, 0x2b, 0xc7, 0xed, 0x06, 0xf1, 0x1d, 0xc2, 0x09, - 0xab, 0x9c, 0x10, 0xc7, 0x72, 0xfd, 0x8a, 0x52, 0x60, 0x8f, 0x56, 0x18, 0x77, 0x7d, 0xdc, 0x24, - 0x95, 0x93, 0x5b, 0x0d, 0xc2, 0xf1, 0xad, 0x4a, 0x93, 0x38, 0xc4, 0xc7, 0x9c, 0x58, 0xba, 0xe7, - 0xbb, 0xdc, 0x85, 0x85, 0xc0, 0x56, 0xc7, 0x1e, 0xd5, 0x95, 0xad, 0xae, 0x6c, 0x0b, 0x7f, 0x6f, - 0x52, 0x7e, 0xd4, 0x6e, 0xe8, 0xa6, 0x6b, 0x57, 0x9a, 0x6e, 0xd3, 0xad, 0x48, 0x97, 0x46, 0xfb, - 0x50, 0xae, 0xe4, 0x42, 0xfe, 0x0a, 0xa0, 0x0a, 0xe5, 0x48, 0x58, 0xd3, 0xf5, 0x45, 0xcc, 0x64, - 0xb8, 0xc2, 0xed, 0xd0, 0xc6, 0xc6, 0xe6, 0x11, 0x75, 0x88, 0xdf, 0xa9, 0x78, 0xc7, 0x4d, 0xe9, - 0xe4, 0x13, 0xe6, 0xb6, 0x7d, 0x93, 0x5c, 0xc8, 0x8b, 0x55, 0x6c, 0xc2, 0xf1, 0xb0, 0x58, 0x95, - 0x51, 0x5e, 0x7e, 0xdb, 0xe1, 0xd4, 0x4e, 0x87, 0xb9, 0x73, 0x96, 0x03, 0x33, 0x8f, 0x88, 0x8d, - 0x93, 0x7e, 0xe5, 0x6f, 0x34, 0x30, 0xb7, 0x55, 0xaf, 0x6e, 0xfb, 0xf4, 0x84, 0xf8, 0xf0, 0x7f, - 0x60, 0x56, 0x64, 0x64, 0x61, 0x8e, 0xf3, 0xda, 0x9a, 0xb6, 0x9e, 0xdb, 0xb8, 0xa9, 0x87, 0x87, - 0x3c, 0x00, 0xd6, 0xbd, 0xe3, 0xa6, 0x10, 0x30, 0x5d, 0x58, 0xeb, 0x27, 0xb7, 0xf4, 0xc7, 0x8d, - 0x17, 0xc4, 0xe4, 0x35, 0xc2, 0xb1, 0x01, 0x5f, 0x77, 0x4b, 0x13, 0xbd, 0x6e, 0x09, 0x84, 0x32, - 0x34, 0x40, 0x85, 0x8f, 0x40, 0x96, 0x79, 0xc4, 0xcc, 0x4f, 0x4a, 0xf4, 0x6b, 0xfa, 0xe8, 0x2b, - 0xd4, 0x07, 0x69, 0xd5, 0x3d, 0x62, 0x1a, 0xf3, 0x0a, 0x36, 0x2b, 0x56, 0x48, 0x82, 0x94, 0xbf, - 0xd6, 0xc0, 0xc2, 0xc0, 0x6a, 0x97, 0x32, 0x0e, 0xff, 0x9b, 0xda, 0x80, 0x7e, 0xbe, 0x0d, 0x08, - 0x6f, 0x99, 0xfe, 0x92, 0x8a, 0x33, 0xdb, 0x97, 0x44, 0x92, 0x7f, 0x08, 0xa6, 0x28, 0x27, 0x36, - 0xcb, 0x4f, 0xae, 0x65, 0xd6, 0x73, 0x1b, 0x7f, 0x3d, 0x57, 0xf6, 0xc6, 0x82, 0x42, 0x9c, 0xaa, - 0x0a, 0x5f, 0x14, 0x40, 0x94, 0x3f, 0xcf, 0x46, 0x72, 0x17, 0x7b, 0x82, 0xf7, 0xc0, 0x25, 0xcc, - 0x39, 0x36, 0x8f, 0x10, 0x79, 0xd9, 0xa6, 0x3e, 0xb1, 0xe4, 0x0e, 0x66, 0x0d, 0xd8, 0xeb, 0x96, - 0x2e, 0x6d, 0xc6, 0x34, 0x28, 0x61, 0x29, 0x7c, 0x3d, 0xd7, 0xaa, 0x3a, 0x87, 0xee, 0x63, 0xa7, - 0xe6, 0xb6, 0x1d, 0x2e, 0x0f, 0x58, 0xf9, 0xee, 0xc7, 0x34, 0x28, 0x61, 0x09, 0x4d, 0xb0, 0x7a, - 0xe2, 0xb6, 0xda, 0x36, 0xd9, 0xa5, 0x87, 0xc4, 0xec, 0x98, 0x2d, 0x52, 0x73, 0x2d, 0xc2, 0xf2, - 0x99, 0xb5, 0xcc, 0xfa, 0x9c, 0x51, 0xe9, 0x75, 0x4b, 0xab, 0x4f, 0x87, 0xe8, 0x4f, 0xbb, 0xa5, - 0x95, 0x21, 0x72, 0x34, 0x14, 0x0c, 0xde, 0x07, 0x8b, 0xea, 0x84, 0xb6, 0xb0, 0x87, 0x4d, 0xca, - 0x3b, 0xf9, 0xac, 0xcc, 0x70, 0xa5, 0xd7, 0x2d, 0x2d, 0xd6, 0xe3, 0x2a, 0x94, 0xb4, 0x85, 0x0f, - 0xc0, 0xc2, 0x21, 0xfb, 0x8f, 0xef, 0xb6, 0xbd, 0x7d, 0xb7, 0x45, 0xcd, 0x4e, 0x7e, 0x6a, 0x4d, - 0x5b, 0x9f, 0x33, 0xca, 0xbd, 0x6e, 0x69, 0xe1, 0xdf, 0xf5, 0x88, 0xe2, 0x34, 0x29, 0x40, 0x71, - 0x47, 0x48, 0xc0, 0x02, 0x77, 0x8f, 0x89, 0x23, 0x8e, 0x8e, 0x30, 0xce, 0xf2, 0xd3, 0xf2, 0x2e, - 0xd7, 0xdf, 0x77, 0x97, 0x07, 0x11, 0x07, 0xe3, 0xb2, 0xba, 0xce, 0x85, 0xa8, 0x94, 0xa1, 0x38, - 0x2a, 0xdc, 0x02, 0xcb, 0x7e, 0x70, 0x39, 0x0c, 0x11, 0xaf, 0xdd, 0x68, 0x51, 0x76, 0x94, 0x9f, - 0x91, 0x3b, 0xbe, 0xdc, 0xeb, 0x96, 0x96, 0x51, 0x52, 0x89, 0xd2, 0xf6, 0xe5, 0xaf, 0x34, 0x30, - 0xb3, 0x55, 0xaf, 0xee, 0xb9, 0x16, 0x19, 0x43, 0x69, 0x56, 0x63, 0xa5, 0x79, 0xf5, 0x0c, 0x72, - 0x8b, 0xa4, 0x46, 0x16, 0xe6, 0x2f, 0x41, 0x61, 0x0a, 0x1b, 0xd5, 0x59, 0xd6, 0x40, 0xd6, 0xc1, - 0x36, 0x91, 0xa9, 0xcf, 0x85, 0x3e, 0x7b, 0xd8, 0x26, 0x48, 0x6a, 0xe0, 0xdf, 0xc0, 0xb4, 0xe3, - 0x5a, 0xa4, 0xba, 0x2d, 0x13, 0x98, 0x33, 0x2e, 0x29, 0x9b, 0xe9, 0x3d, 0x29, 0x45, 0x4a, 0x0b, - 0x6f, 0x83, 0x79, 0xee, 0x7a, 0x6e, 0xcb, 0x6d, 0x76, 0x1e, 0x91, 0x4e, 0x9f, 0xa6, 0x4b, 0xbd, - 0x6e, 0x69, 0xfe, 0x20, 0x22, 0x47, 0x31, 0x2b, 0xd8, 0x00, 0x39, 0xdc, 0x6a, 0xb9, 0x26, 0xe6, - 0xb8, 0xd1, 0x22, 0x92, 0x7b, 0xb9, 0x8d, 0xca, 0xfb, 0xf6, 0x18, 0x70, 0x5b, 0x04, 0x47, 0xaa, - 0xb7, 0x33, 0x63, 0xb1, 0xd7, 0x2d, 0xe5, 0x36, 0x43, 0x1c, 0x14, 0x05, 0x2d, 0x7f, 0xa9, 0x81, - 0x9c, 0xda, 0xf5, 0x18, 0x9a, 0xd1, 0x83, 0x78, 0x33, 0xfa, 0xcb, 0x39, 0xee, 0x6b, 0x44, 0x2b, - 0x32, 0x07, 0x69, 0xcb, 0x3e, 0x74, 0x00, 0x66, 0x2c, 0x79, 0x69, 0x2c, 0xaf, 0x49, 0xe8, 0x6b, - 0xe7, 0x80, 0x56, 0xbd, 0x6e, 0x51, 0x05, 0x98, 0x09, 0xd6, 0x0c, 0xf5, 0xa1, 0xca, 0xbf, 0x66, - 0x00, 0xdc, 0xaa, 0x57, 0x13, 0x95, 0x3e, 0x06, 0x5a, 0x53, 0x30, 0x2f, 0x98, 0xd3, 0xe7, 0x86, - 0xa2, 0xf7, 0x3f, 0xce, 0x79, 0x13, 0xb8, 0x41, 0x5a, 0x75, 0xd2, 0x22, 0x26, 0x77, 0xfd, 0x80, - 0x64, 0x7b, 0x11, 0x30, 0x14, 0x83, 0x86, 0xdb, 0x60, 0xa9, 0xdf, 0xb8, 0x5a, 0x98, 0x31, 0x41, - 0xee, 0x7c, 0x46, 0x92, 0x39, 0xaf, 0x52, 0x5c, 0xaa, 0x27, 0xf4, 0x28, 0xe5, 0x01, 0x9f, 0x81, - 0x59, 0x33, 0xda, 0x23, 0xcf, 0xa0, 0x8d, 0xde, 0x1f, 0x3d, 0xf4, 0x27, 0x6d, 0xec, 0x70, 0xca, - 0x3b, 0xc6, 0xbc, 0xa0, 0xcc, 0xa0, 0x99, 0x0e, 0xd0, 0x20, 0x03, 0xcb, 0x36, 0x7e, 0x45, 0xed, - 0xb6, 0x1d, 0x90, 0xbb, 0x4e, 0x3f, 0x20, 0xb2, 0x93, 0x5e, 0x3c, 0x84, 0x6c, 0x62, 0xb5, 0x24, - 0x18, 0x4a, 0xe3, 0x97, 0xbf, 0xd7, 0xc0, 0x95, 0xf4, 0xc5, 0x8f, 0xa1, 0x40, 0xea, 0xf1, 0x02, - 0xd1, 0xcf, 0x60, 0x71, 0x22, 0xc1, 0x11, 0xb5, 0xf2, 0xe9, 0x34, 0x98, 0x8f, 0xde, 0xe1, 0x18, - 0x08, 0xfc, 0x4f, 0x90, 0xf3, 0x7c, 0xf7, 0x84, 0x32, 0xea, 0x3a, 0xc4, 0x57, 0xdd, 0x71, 0x45, - 0xb9, 0xe4, 0xf6, 0x43, 0x15, 0x8a, 0xda, 0xc1, 0x16, 0x00, 0x1e, 0xf6, 0xb1, 0x4d, 0xb8, 0xa8, - 0xe4, 0x8c, 0x3c, 0x83, 0xbb, 0xef, 0x3b, 0x83, 0xe8, 0xb6, 0xf4, 0xfd, 0x81, 0xeb, 0x8e, 0xc3, - 0xfd, 0x4e, 0x98, 0x62, 0xa8, 0x40, 0x11, 0x7c, 0x78, 0x0c, 0x16, 0x7c, 0x62, 0xb6, 0x30, 0xb5, - 0xd5, 0x03, 0x9d, 0x95, 0x69, 0xee, 0x88, 0x87, 0x12, 0x45, 0x15, 0xa7, 0xdd, 0xd2, 0xcd, 0xf4, - 0xb0, 0xad, 0xef, 0x13, 0x9f, 0x51, 0xc6, 0x89, 0xc3, 0x03, 0xea, 0xc4, 0x7c, 0x50, 0x1c, 0x5b, - 0x3c, 0x01, 0xb6, 0x18, 0x5d, 0x1e, 0x7b, 0x9c, 0xba, 0x0e, 0xcb, 0x4f, 0x85, 0x4f, 0x40, 0x2d, - 0x22, 0x47, 0x31, 0x2b, 0xb8, 0x0b, 0x56, 0x45, 0xb7, 0xfe, 0x7f, 0x10, 0x60, 0xe7, 0x95, 0x87, - 0x1d, 0x71, 0x54, 0xf9, 0x69, 0xf9, 0x2a, 0xe7, 0xc5, 0x9c, 0xb3, 0x39, 0x44, 0x8f, 0x86, 0x7a, - 0xc1, 0x67, 0x60, 0x39, 0x18, 0x74, 0x0c, 0xea, 0x58, 0xd4, 0x69, 0x8a, 0x31, 0x47, 0x3e, 0xf0, - 0x73, 0xc6, 0x75, 0x51, 0x1b, 0x4f, 0x93, 0xca, 0xd3, 0x61, 0x42, 0x94, 0x06, 0x81, 0x2f, 0xc1, - 0xb2, 0x8c, 0x48, 0x2c, 0xd5, 0x58, 0x28, 0x61, 0xf9, 0xd9, 0xf4, 0x94, 0x22, 0x8e, 0x4e, 0x10, - 0xa9, 0xdf, 0x7e, 0xfa, 0x6d, 0xea, 0x80, 0xf8, 0xb6, 0xf1, 0x67, 0x75, 0x5f, 0xcb, 0x9b, 0x49, - 0x28, 0x94, 0x46, 0x2f, 0xdc, 0x07, 0x8b, 0x89, 0x0b, 0x87, 0x4b, 0x20, 0x73, 0x4c, 0x3a, 0xc1, - 0x7b, 0x8d, 0xc4, 0x4f, 0xb8, 0x0a, 0xa6, 0x4e, 0x70, 0xab, 0x4d, 0x02, 0x06, 0xa2, 0x60, 0x71, - 0x6f, 0xf2, 0xae, 0x56, 0xfe, 0x56, 0x03, 0xb1, 0xc6, 0x36, 0x86, 0xe2, 0xae, 0xc5, 0x8b, 0x7b, - 0xfd, 0xbc, 0xc4, 0x1e, 0x51, 0xd6, 0x1f, 0x69, 0x60, 0x3e, 0x3a, 0xcf, 0xc1, 0x1b, 0x60, 0x16, - 0xb7, 0x2d, 0x4a, 0x1c, 0xb3, 0x3f, 0xb3, 0x0c, 0xb2, 0xd9, 0x54, 0x72, 0x34, 0xb0, 0x10, 0xd3, - 0x1e, 0x79, 0xe5, 0x51, 0x1f, 0x0b, 0xa6, 0xd5, 0x89, 0xe9, 0x3a, 0x16, 0x93, 0xc7, 0x94, 0x09, - 0x1a, 0xe5, 0x4e, 0x52, 0x89, 0xd2, 0xf6, 0xe5, 0x2f, 0x26, 0xc1, 0x52, 0x40, 0x90, 0x60, 0xd8, - 0xb7, 0x89, 0xc3, 0xc7, 0xd0, 0x5e, 0x50, 0x6c, 0xec, 0xbb, 0x79, 0xf6, 0x48, 0x14, 0x66, 0x37, - 0x6a, 0xfe, 0x83, 0xcf, 0xc1, 0x34, 0xe3, 0x98, 0xb7, 0x99, 0x7c, 0xfe, 0x72, 0x1b, 0x1b, 0x17, - 0x42, 0x95, 0x9e, 0xe1, 0xfc, 0x17, 0xac, 0x91, 0x42, 0x2c, 0x7f, 0xa7, 0x81, 0xd5, 0xa4, 0xcb, - 0x18, 0x08, 0xf7, 0x24, 0x4e, 0xb8, 0x1b, 0x17, 0xd9, 0xd1, 0x08, 0xd2, 0xfd, 0xa8, 0x81, 0x2b, - 0xa9, 0xcd, 0xcb, 0x77, 0x56, 0xf4, 0x2a, 0x2f, 0xd1, 0x11, 0xf7, 0xc2, 0xf1, 0x59, 0xf6, 0xaa, - 0xfd, 0x21, 0x7a, 0x34, 0xd4, 0x0b, 0xbe, 0x00, 0x4b, 0xd4, 0x69, 0x51, 0x87, 0xa8, 0x67, 0x39, - 0xbc, 0xee, 0xa1, 0x0d, 0x25, 0x89, 0x2c, 0xaf, 0x79, 0x55, 0x4c, 0x2f, 0xd5, 0x04, 0x0a, 0x4a, - 0xe1, 0x96, 0x7f, 0x18, 0x72, 0x3d, 0x72, 0xac, 0x14, 0x15, 0x25, 0x25, 0xc4, 0x4f, 0x55, 0x94, - 0x92, 0xa3, 0x81, 0x85, 0x64, 0x90, 0x3c, 0x0a, 0x95, 0xe8, 0xc5, 0x18, 0x24, 0x3d, 0x23, 0x0c, - 0x92, 0x6b, 0xa4, 0x10, 0x45, 0x26, 0x62, 0x6c, 0x8b, 0x8c, 0x67, 0x83, 0x4c, 0xf6, 0x94, 0x1c, - 0x0d, 0x2c, 0xca, 0xbf, 0x65, 0x86, 0xdc, 0x92, 0xa4, 0x62, 0x64, 0x4b, 0xfd, 0x6f, 0xf5, 0xe4, - 0x96, 0xac, 0xc1, 0x96, 0x2c, 0xf8, 0x99, 0x06, 0x20, 0x1e, 0x40, 0xd4, 0xfa, 0x54, 0x0d, 0xf8, - 0xf4, 0xf0, 0xe2, 0x15, 0xa2, 0x6f, 0xa6, 0xc0, 0x82, 0xb7, 0xba, 0xa0, 0x92, 0x80, 0x69, 0x03, - 0x34, 0x24, 0x03, 0x48, 0x41, 0x2e, 0x90, 0xee, 0xf8, 0xbe, 0xeb, 0xab, 0x92, 0xbd, 0x7a, 0x76, - 0x42, 0xd2, 0xdc, 0x28, 0xca, 0x6f, 0xa2, 0xd0, 0xff, 0xb4, 0x5b, 0xca, 0x45, 0xf4, 0x28, 0x8a, - 0x2d, 0x42, 0x59, 0x24, 0x0c, 0x95, 0xfd, 0x03, 0xa1, 0xb6, 0xc9, 0xe8, 0x50, 0x11, 0xec, 0xc2, - 0x0e, 0xf8, 0xd3, 0x88, 0x03, 0xba, 0xd0, 0xdb, 0xf6, 0xb1, 0x06, 0xa2, 0x31, 0xe0, 0x2e, 0xc8, - 0x72, 0xaa, 0x2a, 0x31, 0xb7, 0x71, 0xfd, 0x7c, 0x1d, 0xe6, 0x80, 0xda, 0x24, 0x6c, 0x94, 0x62, - 0x85, 0x24, 0x0a, 0xbc, 0x06, 0x66, 0x6c, 0xc2, 0x18, 0x6e, 0xaa, 0xc8, 0xe1, 0x07, 0x54, 0x2d, - 0x10, 0xa3, 0xbe, 0xbe, 0x7c, 0x07, 0xac, 0x0c, 0xf9, 0x24, 0x85, 0x25, 0x30, 0x65, 0xca, 0x3f, - 0x7c, 0x44, 0x42, 0x53, 0xc6, 0x9c, 0xe8, 0x32, 0x5b, 0xf2, 0x7f, 0x9e, 0x40, 0x6e, 0xfc, 0xeb, - 0xf5, 0xbb, 0xe2, 0xc4, 0x9b, 0x77, 0xc5, 0x89, 0xb7, 0xef, 0x8a, 0x13, 0x1f, 0xf6, 0x8a, 0xda, - 0xeb, 0x5e, 0x51, 0x7b, 0xd3, 0x2b, 0x6a, 0x6f, 0x7b, 0x45, 0xed, 0xa7, 0x5e, 0x51, 0xfb, 0xe4, - 0xe7, 0xe2, 0xc4, 0xf3, 0xc2, 0xe8, 0xff, 0x5d, 0x7f, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x91, 0x4f, - 0x2f, 0xc0, 0xad, 0x15, 0x00, 0x00, + // 1672 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcd, 0x6f, 0x1b, 0x4d, + 0x19, 0xcf, 0xc6, 0xce, 0xd7, 0x38, 0x69, 0x92, 0x49, 0x5a, 0x8c, 0x0f, 0x76, 0x64, 0x04, 0x4d, + 0xab, 0xb2, 0x6e, 0x43, 0xa9, 0xaa, 0x4a, 0x95, 0xc8, 0x26, 0x81, 0xba, 0x8d, 0xd3, 0x74, 0x1c, + 0x55, 0x55, 0xc5, 0x81, 0xf1, 0xee, 0xc4, 0x99, 0xc6, 0xfb, 0xd1, 0x9d, 0xd9, 0x10, 0x73, 0x82, + 0x0b, 0x67, 0xc4, 0x81, 0xbf, 0x80, 0x7f, 0x01, 0x24, 0xb8, 0x70, 0xa4, 0x12, 0x12, 0xaa, 0xb8, + 0xd0, 0x93, 0x45, 0xcd, 0x9f, 0xf0, 0x4a, 0xef, 0x21, 0x7a, 0x0f, 0xaf, 0x66, 0x76, 0xec, 0xfd, + 0xb2, 0x9b, 0xe4, 0x3d, 0xf8, 0xe6, 0x79, 0x3e, 0x7e, 0xcf, 0x33, 0xf3, 0x7c, 0xae, 0xc1, 0xce, + 0xe9, 0x63, 0xa6, 0x53, 0xb7, 0x76, 0x1a, 0xb4, 0x88, 0xef, 0x10, 0x4e, 0x58, 0xed, 0x8c, 0x38, + 0x96, 0xeb, 0xd7, 0x14, 0x03, 0x7b, 0xb4, 0xc6, 0xb8, 0xeb, 0xe3, 0x36, 0xa9, 0x9d, 0x3d, 0x68, + 0x11, 0x8e, 0x1f, 0xd4, 0xda, 0xc4, 0x21, 0x3e, 0xe6, 0xc4, 0xd2, 0x3d, 0xdf, 0xe5, 0x2e, 0x2c, + 0x85, 0xb2, 0x3a, 0xf6, 0xa8, 0xae, 0x64, 0x75, 0x25, 0x5b, 0xfa, 0x71, 0x9b, 0xf2, 0x93, 0xa0, + 0xa5, 0x9b, 0xae, 0x5d, 0x6b, 0xbb, 0x6d, 0xb7, 0x26, 0x55, 0x5a, 0xc1, 0xb1, 0x3c, 0xc9, 0x83, + 0xfc, 0x15, 0x42, 0x95, 0xaa, 0x31, 0xb3, 0xa6, 0xeb, 0x0b, 0x9b, 0x69, 0x73, 0xa5, 0x87, 0x91, + 0x8c, 0x8d, 0xcd, 0x13, 0xea, 0x10, 0xbf, 0x5b, 0xf3, 0x4e, 0xdb, 0x52, 0xc9, 0x27, 0xcc, 0x0d, + 0x7c, 0x93, 0x5c, 0x4b, 0x8b, 0xd5, 0x6c, 0xc2, 0xf1, 0x28, 0x5b, 0xb5, 0x71, 0x5a, 0x7e, 0xe0, + 0x70, 0x6a, 0x67, 0xcd, 0x3c, 0xba, 0x4c, 0x81, 0x99, 0x27, 0xc4, 0xc6, 0x69, 0xbd, 0xea, 0xdf, + 0x35, 0xb0, 0xb0, 0xd3, 0xac, 0xef, 0xfa, 0xf4, 0x8c, 0xf8, 0xf0, 0x57, 0x60, 0x5e, 0x78, 0x64, + 0x61, 0x8e, 0x8b, 0xda, 0x86, 0xb6, 0x59, 0xd8, 0xba, 0xaf, 0x47, 0x8f, 0x3c, 0x04, 0xd6, 0xbd, + 0xd3, 0xb6, 0x20, 0x30, 0x5d, 0x48, 0xeb, 0x67, 0x0f, 0xf4, 0x97, 0xad, 0x77, 0xc4, 0xe4, 0x0d, + 0xc2, 0xb1, 0x01, 0x3f, 0xf4, 0x2a, 0x53, 0xfd, 0x5e, 0x05, 0x44, 0x34, 0x34, 0x44, 0x85, 0x2f, + 0x40, 0x9e, 0x79, 0xc4, 0x2c, 0x4e, 0x4b, 0xf4, 0x3b, 0xfa, 0xf8, 0x10, 0xea, 0x43, 0xb7, 0x9a, + 0x1e, 0x31, 0x8d, 0x45, 0x05, 0x9b, 0x17, 0x27, 0x24, 0x41, 0xaa, 0x7f, 0xd3, 0xc0, 0xd2, 0x50, + 0x6a, 0x9f, 0x32, 0x0e, 0x7f, 0x99, 0xb9, 0x80, 0x7e, 0xb5, 0x0b, 0x08, 0x6d, 0xe9, 0xfe, 0x8a, + 0xb2, 0x33, 0x3f, 0xa0, 0xc4, 0x9c, 0x7f, 0x0e, 0x66, 0x28, 0x27, 0x36, 0x2b, 0x4e, 0x6f, 0xe4, + 0x36, 0x0b, 0x5b, 0x3f, 0xbc, 0x92, 0xf7, 0xc6, 0x92, 0x42, 0x9c, 0xa9, 0x0b, 0x5d, 0x14, 0x42, + 0x54, 0xff, 0x9b, 0x8f, 0xf9, 0x2e, 0xee, 0x04, 0x9f, 0x80, 0x1b, 0x98, 0x73, 0x6c, 0x9e, 0x20, + 0xf2, 0x3e, 0xa0, 0x3e, 0xb1, 0xe4, 0x0d, 0xe6, 0x0d, 0xd8, 0xef, 0x55, 0x6e, 0x6c, 0x27, 0x38, + 0x28, 0x25, 0x29, 0x74, 0x3d, 0xd7, 0xaa, 0x3b, 0xc7, 0xee, 0x4b, 0xa7, 0xe1, 0x06, 0x0e, 0x97, + 0x0f, 0xac, 0x74, 0x0f, 0x13, 0x1c, 0x94, 0x92, 0x84, 0x26, 0x58, 0x3f, 0x73, 0x3b, 0x81, 0x4d, + 0xf6, 0xe9, 0x31, 0x31, 0xbb, 0x66, 0x87, 0x34, 0x5c, 0x8b, 0xb0, 0x62, 0x6e, 0x23, 0xb7, 0xb9, + 0x60, 0xd4, 0xfa, 0xbd, 0xca, 0xfa, 0xeb, 0x11, 0xfc, 0x8b, 0x5e, 0x65, 0x6d, 0x04, 0x1d, 0x8d, + 0x04, 0x83, 0x4f, 0xc1, 0xb2, 0x7a, 0xa1, 0x1d, 0xec, 0x61, 0x93, 0xf2, 0x6e, 0x31, 0x2f, 0x3d, + 0x5c, 0xeb, 0xf7, 0x2a, 0xcb, 0xcd, 0x24, 0x0b, 0xa5, 0x65, 0xe1, 0x33, 0xb0, 0x74, 0xcc, 0x7e, + 0xe1, 0xbb, 0x81, 0x77, 0xe8, 0x76, 0xa8, 0xd9, 0x2d, 0xce, 0x6c, 0x68, 0x9b, 0x0b, 0x46, 0xb5, + 0xdf, 0xab, 0x2c, 0xfd, 0xbc, 0x19, 0x63, 0x5c, 0xa4, 0x09, 0x28, 0xa9, 0x08, 0x09, 0x58, 0xe2, + 0xee, 0x29, 0x71, 0xc4, 0xd3, 0x11, 0xc6, 0x59, 0x71, 0x56, 0xc6, 0x72, 0xf3, 0x4b, 0xb1, 0x3c, + 0x8a, 0x29, 0x18, 0x37, 0x55, 0x38, 0x97, 0xe2, 0x54, 0x86, 0x92, 0xa8, 0x70, 0x07, 0xac, 0xfa, + 0x61, 0x70, 0x18, 0x22, 0x5e, 0xd0, 0xea, 0x50, 0x76, 0x52, 0x9c, 0x93, 0x37, 0xbe, 0xd9, 0xef, + 0x55, 0x56, 0x51, 0x9a, 0x89, 0xb2, 0xf2, 0xf0, 0x21, 0x58, 0x64, 0x64, 0x9f, 0x3a, 0xc1, 0x79, + 0x18, 0xd3, 0x79, 0xa9, 0xbf, 0xd2, 0xef, 0x55, 0x16, 0x9b, 0x7b, 0x11, 0x1d, 0x25, 0xa4, 0xaa, + 0x7f, 0xd5, 0xc0, 0xdc, 0x4e, 0xb3, 0x7e, 0xe0, 0x5a, 0x64, 0x02, 0x05, 0x5d, 0x4f, 0x14, 0xf4, + 0xed, 0x4b, 0x4a, 0x42, 0x38, 0x35, 0xb6, 0x9c, 0xbf, 0x0a, 0xcb, 0x59, 0xc8, 0xa8, 0x7e, 0xb4, + 0x01, 0xf2, 0x0e, 0xb6, 0x89, 0x74, 0x7d, 0x21, 0xd2, 0x39, 0xc0, 0x36, 0x41, 0x92, 0x03, 0x7f, + 0x04, 0x66, 0x1d, 0xd7, 0x22, 0xf5, 0x5d, 0xe9, 0xc0, 0x82, 0x71, 0x43, 0xc9, 0xcc, 0x1e, 0x48, + 0x2a, 0x52, 0x5c, 0xf1, 0x94, 0xdc, 0xf5, 0xdc, 0x8e, 0xdb, 0xee, 0xbe, 0x20, 0xdd, 0x41, 0x72, + 0xcb, 0xa7, 0x3c, 0x8a, 0xd1, 0x51, 0x42, 0x0a, 0xb6, 0x40, 0x01, 0x77, 0x3a, 0xae, 0x89, 0x39, + 0x6e, 0x75, 0x88, 0xcc, 0xd8, 0xc2, 0x56, 0xed, 0x4b, 0x77, 0x0c, 0x2b, 0x42, 0x18, 0x47, 0x6a, + 0x22, 0x30, 0x63, 0xb9, 0xdf, 0xab, 0x14, 0xb6, 0x23, 0x1c, 0x14, 0x07, 0xad, 0xfe, 0x45, 0x03, + 0x05, 0x75, 0xeb, 0x09, 0xb4, 0xb0, 0x67, 0xc9, 0x16, 0xf6, 0x83, 0x2b, 0xc4, 0x6b, 0x4c, 0x03, + 0x33, 0x87, 0x6e, 0xcb, 0xee, 0x75, 0x04, 0xe6, 0x2c, 0x19, 0x34, 0x56, 0xd4, 0x24, 0xf4, 0x9d, + 0x2b, 0x40, 0xab, 0x0e, 0xb9, 0xac, 0x0c, 0xcc, 0x85, 0x67, 0x86, 0x06, 0x50, 0xd5, 0xaf, 0x73, + 0x00, 0xee, 0x34, 0xeb, 0xa9, 0xfe, 0x30, 0x81, 0xb4, 0xa6, 0x60, 0x51, 0x64, 0xce, 0x20, 0x37, + 0x54, 0x7a, 0xff, 0xe4, 0x8a, 0x91, 0xc0, 0x2d, 0xd2, 0x69, 0x92, 0x0e, 0x31, 0xb9, 0xeb, 0x87, + 0x49, 0x76, 0x10, 0x03, 0x43, 0x09, 0x68, 0xb8, 0x0b, 0x56, 0x06, 0xed, 0xae, 0x83, 0x19, 0x13, + 0xc9, 0x5d, 0xcc, 0xc9, 0x64, 0x2e, 0x2a, 0x17, 0x57, 0x9a, 0x29, 0x3e, 0xca, 0x68, 0xc0, 0x37, + 0x60, 0xde, 0x8c, 0x77, 0xd6, 0x4b, 0xd2, 0x46, 0x1f, 0x2c, 0x2c, 0xfa, 0xab, 0x00, 0x3b, 0x9c, + 0xf2, 0xae, 0xb1, 0x28, 0x52, 0x66, 0xd8, 0x82, 0x87, 0x68, 0x90, 0x81, 0x55, 0x1b, 0x9f, 0x53, + 0x3b, 0xb0, 0xc3, 0xe4, 0x6e, 0xd2, 0xdf, 0x10, 0xd9, 0x7f, 0xaf, 0x6f, 0x42, 0xb6, 0xbe, 0x46, + 0x1a, 0x0c, 0x65, 0xf1, 0xab, 0xff, 0xd2, 0xc0, 0xad, 0x6c, 0xe0, 0x27, 0x50, 0x20, 0xcd, 0x64, + 0x81, 0xe8, 0x97, 0x64, 0x71, 0xca, 0xc1, 0x31, 0xb5, 0xf2, 0xc7, 0x59, 0xb0, 0x18, 0x8f, 0xe1, + 0x04, 0x12, 0xf8, 0xa7, 0xa0, 0xe0, 0xf9, 0xee, 0x19, 0x65, 0xd4, 0x75, 0x88, 0xaf, 0xba, 0xe3, + 0x9a, 0x52, 0x29, 0x1c, 0x46, 0x2c, 0x14, 0x97, 0x83, 0x1d, 0x00, 0x3c, 0xec, 0x63, 0x9b, 0x70, + 0x51, 0xc9, 0x39, 0xf9, 0x06, 0x8f, 0xbf, 0xf4, 0x06, 0xf1, 0x6b, 0xe9, 0x87, 0x43, 0xd5, 0x3d, + 0x87, 0xfb, 0xdd, 0xc8, 0xc5, 0x88, 0x81, 0x62, 0xf8, 0xf0, 0x14, 0x2c, 0xf9, 0xc4, 0xec, 0x60, + 0x6a, 0xab, 0xb1, 0x9e, 0x97, 0x6e, 0xee, 0x89, 0xf1, 0x8a, 0xe2, 0x8c, 0x8b, 0x5e, 0xe5, 0x7e, + 0x76, 0x45, 0xd7, 0x0f, 0x89, 0xcf, 0x28, 0xe3, 0xc4, 0xe1, 0x61, 0xea, 0x24, 0x74, 0x50, 0x12, + 0x5b, 0x8c, 0x00, 0x5b, 0x0c, 0xc8, 0x97, 0x1e, 0xa7, 0xae, 0xc3, 0x8a, 0x33, 0xd1, 0x08, 0x68, + 0xc4, 0xe8, 0x28, 0x21, 0x05, 0xf7, 0xc1, 0xba, 0xe8, 0xd6, 0xbf, 0x0e, 0x0d, 0xec, 0x9d, 0x7b, + 0xd8, 0x11, 0x4f, 0x55, 0x9c, 0x95, 0xb3, 0xb8, 0x28, 0xb6, 0xa3, 0xed, 0x11, 0x7c, 0x34, 0x52, + 0x0b, 0xbe, 0x01, 0xab, 0xe1, 0x7a, 0x64, 0x50, 0xc7, 0xa2, 0x4e, 0x5b, 0x2c, 0x47, 0x72, 0x2d, + 0x58, 0x30, 0xee, 0x8a, 0xda, 0x78, 0x9d, 0x66, 0x5e, 0x8c, 0x22, 0xa2, 0x2c, 0x08, 0x7c, 0x0f, + 0x56, 0xa5, 0x45, 0x62, 0xa9, 0xc6, 0x42, 0x09, 0x2b, 0xce, 0x67, 0x77, 0x1b, 0xf1, 0x74, 0x22, + 0x91, 0x06, 0xed, 0x67, 0xd0, 0xa6, 0x8e, 0x88, 0x6f, 0x1b, 0xdf, 0x57, 0xf1, 0x5a, 0xdd, 0x4e, + 0x43, 0xa1, 0x2c, 0x7a, 0xe9, 0x29, 0x58, 0x4e, 0x05, 0x1c, 0xae, 0x80, 0xdc, 0x29, 0xe9, 0x86, + 0xf3, 0x1a, 0x89, 0x9f, 0x70, 0x1d, 0xcc, 0x9c, 0xe1, 0x4e, 0x40, 0xc2, 0x0c, 0x44, 0xe1, 0xe1, + 0xc9, 0xf4, 0x63, 0xad, 0xfa, 0x0f, 0x0d, 0x24, 0x1a, 0xdb, 0x04, 0x8a, 0xbb, 0x91, 0x2c, 0xee, + 0xcd, 0xab, 0x26, 0xf6, 0x98, 0xb2, 0xfe, 0x9d, 0x06, 0x16, 0xe3, 0x5b, 0x20, 0xbc, 0x07, 0xe6, + 0x71, 0x60, 0x51, 0xe2, 0x98, 0x83, 0x9d, 0x65, 0xe8, 0xcd, 0xb6, 0xa2, 0xa3, 0xa1, 0x84, 0xd8, + 0x11, 0xc9, 0xb9, 0x47, 0x7d, 0x2c, 0x32, 0xad, 0x49, 0x4c, 0xd7, 0xb1, 0x98, 0x7c, 0xa6, 0x5c, + 0xd8, 0x28, 0xf7, 0xd2, 0x4c, 0x94, 0x95, 0xaf, 0xfe, 0x79, 0x1a, 0xac, 0x84, 0x09, 0x12, 0x7e, + 0x22, 0xd8, 0xc4, 0xe1, 0x13, 0x68, 0x2f, 0x28, 0xb1, 0xf6, 0xdd, 0xbf, 0x7c, 0x25, 0x8a, 0xbc, + 0x1b, 0xb7, 0xff, 0xc1, 0xb7, 0x60, 0x96, 0x71, 0xcc, 0x03, 0x26, 0xc7, 0x5f, 0x61, 0x6b, 0xeb, + 0x5a, 0xa8, 0x52, 0x33, 0xda, 0xff, 0xc2, 0x33, 0x52, 0x88, 0xd5, 0x7f, 0x6a, 0x60, 0x3d, 0xad, + 0x32, 0x81, 0x84, 0x7b, 0x95, 0x4c, 0xb8, 0x7b, 0xd7, 0xb9, 0xd1, 0x98, 0xa4, 0xfb, 0x8f, 0x06, + 0x6e, 0x65, 0x2e, 0x2f, 0xe7, 0xac, 0xe8, 0x55, 0x5e, 0xaa, 0x23, 0x1e, 0x44, 0xeb, 0xb3, 0xec, + 0x55, 0x87, 0x23, 0xf8, 0x68, 0xa4, 0x16, 0x7c, 0x07, 0x56, 0xa8, 0xd3, 0xa1, 0x0e, 0x51, 0x63, + 0x39, 0x0a, 0xf7, 0xc8, 0x86, 0x92, 0x46, 0x96, 0x61, 0x5e, 0x17, 0xdb, 0x4b, 0x3d, 0x85, 0x82, + 0x32, 0xb8, 0xd5, 0x7f, 0x8f, 0x08, 0x8f, 0x5c, 0x2b, 0x45, 0x45, 0x49, 0x0a, 0xf1, 0x33, 0x15, + 0xa5, 0xe8, 0x68, 0x28, 0x21, 0x33, 0x48, 0x3e, 0x85, 0x72, 0xf4, 0x7a, 0x19, 0x24, 0x35, 0x63, + 0x19, 0x24, 0xcf, 0x48, 0x21, 0x0a, 0x4f, 0xc4, 0xda, 0x16, 0x5b, 0xcf, 0x86, 0x9e, 0x1c, 0x28, + 0x3a, 0x1a, 0x4a, 0x54, 0xbf, 0xc9, 0x8d, 0x88, 0x92, 0x4c, 0xc5, 0xd8, 0x95, 0x06, 0x5f, 0xf8, + 0xe9, 0x2b, 0x59, 0xc3, 0x2b, 0x59, 0xf0, 0x4f, 0x1a, 0x80, 0x78, 0x08, 0xd1, 0x18, 0xa4, 0x6a, + 0x98, 0x4f, 0xcf, 0xaf, 0x5f, 0x21, 0xfa, 0x76, 0x06, 0x2c, 0x9c, 0xd5, 0x25, 0xe5, 0x04, 0xcc, + 0x0a, 0xa0, 0x11, 0x1e, 0x40, 0x0a, 0x0a, 0x21, 0x75, 0xcf, 0xf7, 0x5d, 0x5f, 0x95, 0xec, 0xed, + 0xcb, 0x1d, 0x92, 0xe2, 0x46, 0x59, 0x7e, 0x13, 0x45, 0xfa, 0x17, 0xbd, 0x4a, 0x21, 0xc6, 0x47, + 0x71, 0x6c, 0x61, 0xca, 0x22, 0x91, 0xa9, 0xfc, 0x77, 0x30, 0xb5, 0x4b, 0xc6, 0x9b, 0x8a, 0x61, + 0x97, 0xf6, 0xc0, 0xf7, 0xc6, 0x3c, 0xd0, 0xb5, 0x66, 0xdb, 0xef, 0x35, 0x10, 0xb7, 0x01, 0xf7, + 0x41, 0x9e, 0x53, 0x55, 0x89, 0x85, 0xad, 0xbb, 0x57, 0xeb, 0x30, 0x47, 0xd4, 0x26, 0x51, 0xa3, + 0x14, 0x27, 0x24, 0x51, 0xe0, 0x1d, 0x30, 0x67, 0x13, 0xc6, 0x70, 0x5b, 0x59, 0x8e, 0x3e, 0xa0, + 0x1a, 0x21, 0x19, 0x0d, 0xf8, 0xd5, 0x47, 0x60, 0x6d, 0xc4, 0x27, 0x29, 0xac, 0x80, 0x19, 0x53, + 0xfe, 0xa5, 0x20, 0x1c, 0x9a, 0x31, 0x16, 0x44, 0x97, 0xd9, 0x91, 0xff, 0x25, 0x84, 0x74, 0xe3, + 0x67, 0x1f, 0x3e, 0x97, 0xa7, 0x3e, 0x7e, 0x2e, 0x4f, 0x7d, 0xfa, 0x5c, 0x9e, 0xfa, 0x6d, 0xbf, + 0xac, 0x7d, 0xe8, 0x97, 0xb5, 0x8f, 0xfd, 0xb2, 0xf6, 0xa9, 0x5f, 0xd6, 0xfe, 0xd7, 0x2f, 0x6b, + 0x7f, 0xf8, 0x7f, 0x79, 0xea, 0x6d, 0x69, 0xfc, 0xbf, 0xb5, 0xdf, 0x06, 0x00, 0x00, 0xff, 0xff, + 0xee, 0x44, 0x0b, 0xed, 0xe3, 0x15, 0x00, 0x00, } func (m *CSIDriver) Marshal() (dAtA []byte, err error) { @@ -826,6 +827,16 @@ func (m *CSIDriverSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.SELinuxMount != nil { + i-- + if *m.SELinuxMount { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } if m.RequiresRepublish != nil { i-- if *m.RequiresRepublish { @@ -1795,6 +1806,9 @@ func (m *CSIDriverSpec) Size() (n int) { if m.RequiresRepublish != nil { n += 2 } + if m.SELinuxMount != nil { + n += 2 + } return n } @@ -2148,6 +2162,7 @@ func (this *CSIDriverSpec) String() string { `FSGroupPolicy:` + valueToStringGenerated(this.FSGroupPolicy) + `,`, `TokenRequests:` + repeatedStringForTokenRequests + `,`, `RequiresRepublish:` + valueToStringGenerated(this.RequiresRepublish) + `,`, + `SELinuxMount:` + valueToStringGenerated(this.SELinuxMount) + `,`, `}`, }, "") return s @@ -2844,6 +2859,27 @@ func (m *CSIDriverSpec) Unmarshal(dAtA []byte) error { } b := bool(v != 0) m.RequiresRepublish = &b + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SELinuxMount", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.SELinuxMount = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/k8s.io/api/storage/v1beta1/generated.proto b/vendor/k8s.io/api/storage/v1beta1/generated.proto index 943900fa6..bedbd3183 100644 --- a/vendor/k8s.io/api/storage/v1beta1/generated.proto +++ b/vendor/k8s.io/api/storage/v1beta1/generated.proto @@ -192,6 +192,27 @@ message CSIDriverSpec { // // +optional optional bool requiresRepublish = 7; + + // SELinuxMount specifies if the CSI driver supports "-o context" + // mount option. + // + // When "true", the CSI driver must ensure that all volumes provided by this CSI + // driver can be mounted separately with different `-o context` options. This is + // typical for storage backends that provide volumes as filesystems on block + // devices or as independent shared volumes. + // Kubernetes will call NodeStage / NodePublish with "-o context=xyz" mount + // option when mounting a ReadWriteOncePod volume used in Pod that has + // explicitly set SELinux context. In the future, it may be expanded to other + // volume AccessModes. In any case, Kubernetes will ensure that the volume is + // mounted only with a single SELinux context. + // + // When "false", Kubernetes won't pass any special SELinux mount options to the driver. + // This is typical for volumes that represent subdirectories of a bigger shared filesystem. + // + // Default is "false". + // + // +optional + optional bool seLinuxMount = 8; } // DEPRECATED - This group version of CSINode is deprecated by storage/v1/CSINode. diff --git a/vendor/k8s.io/api/storage/v1beta1/types.go b/vendor/k8s.io/api/storage/v1beta1/types.go index b39414b96..f4d09b641 100644 --- a/vendor/k8s.io/api/storage/v1beta1/types.go +++ b/vendor/k8s.io/api/storage/v1beta1/types.go @@ -410,6 +410,27 @@ type CSIDriverSpec struct { // // +optional RequiresRepublish *bool `json:"requiresRepublish,omitempty" protobuf:"varint,7,opt,name=requiresRepublish"` + + // SELinuxMount specifies if the CSI driver supports "-o context" + // mount option. + // + // When "true", the CSI driver must ensure that all volumes provided by this CSI + // driver can be mounted separately with different `-o context` options. This is + // typical for storage backends that provide volumes as filesystems on block + // devices or as independent shared volumes. + // Kubernetes will call NodeStage / NodePublish with "-o context=xyz" mount + // option when mounting a ReadWriteOncePod volume used in Pod that has + // explicitly set SELinux context. In the future, it may be expanded to other + // volume AccessModes. In any case, Kubernetes will ensure that the volume is + // mounted only with a single SELinux context. + // + // When "false", Kubernetes won't pass any special SELinux mount options to the driver. + // This is typical for volumes that represent subdirectories of a bigger shared filesystem. + // + // Default is "false". + // + // +optional + SELinuxMount *bool `json:"seLinuxMount,omitempty" protobuf:"varint,8,opt,name=seLinuxMount"` } // FSGroupPolicy specifies if a CSI Driver supports modifying diff --git a/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go index d810b4e4c..ea3c1e4c2 100644 --- a/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go @@ -56,6 +56,7 @@ var map_CSIDriverSpec = map[string]string{ "fsGroupPolicy": "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details.\n\nThis field is immutable.\n\nDefaults to ReadWriteOnceWithFSType, which will examine each volume to determine if Kubernetes should modify ownership and permissions of the volume. With the default policy the defined fsGroup will only be applied if a fstype is defined and the volume's access mode contains ReadWriteOnce.", "tokenRequests": "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.", "requiresRepublish": "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.", + "seLinuxMount": "SELinuxMount specifies if the CSI driver supports \"-o context\" mount option.\n\nWhen \"true\", the CSI driver must ensure that all volumes provided by this CSI driver can be mounted separately with different `-o context` options. This is typical for storage backends that provide volumes as filesystems on block devices or as independent shared volumes. Kubernetes will call NodeStage / NodePublish with \"-o context=xyz\" mount option when mounting a ReadWriteOncePod volume used in Pod that has explicitly set SELinux context. In the future, it may be expanded to other volume AccessModes. In any case, Kubernetes will ensure that the volume is mounted only with a single SELinux context.\n\nWhen \"false\", Kubernetes won't pass any special SELinux mount options to the driver. This is typical for volumes that represent subdirectories of a bigger shared filesystem.\n\nDefault is \"false\".", } func (CSIDriverSpec) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go index 5411ed8c0..f0450182b 100644 --- a/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go @@ -127,6 +127,11 @@ func (in *CSIDriverSpec) DeepCopyInto(out *CSIDriverSpec) { *out = new(bool) **out = **in } + if in.SELinuxMount != nil { + in, out := &in.SELinuxMount, &out.SELinuxMount + *out = new(bool) + **out = **in + } return } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/cel_validation.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/cel_validation.go new file mode 100644 index 000000000..a529e7abf --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/cel_validation.go @@ -0,0 +1,335 @@ +/* +Copyright 2022 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 validation + +import ( + "fmt" + "math" + "sort" + + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" + "k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model" + "k8s.io/apimachinery/pkg/util/validation/field" +) + +// unbounded uses nil to represent an unbounded cardinality value. +var unbounded *uint64 = nil + +// CELSchemaContext keeps track of data used by x-kubernetes-validations rules for a specific schema node. +type CELSchemaContext struct { + // withinValidationRuleScope is true if the schema at the current level or above have x-kubernetes-validations rules. typeInfo + // should only be populated for schema nodes where this is true. + withinValidationRuleScope bool + + // typeInfo is lazily loaded for schema nodes withinValidationRuleScope and may be + // populated one of two possible ways: + // 1. Using a typeInfoAccessor to access it from the parent's type info. This is a cheap operation and should be + // used when a schema at a higher level already has type info. + // 2. Using a converter to construct type info from the jsonSchema. This is an expensive operation. + typeInfo *CELTypeInfo + // typeInfoErr is any cached error resulting from an attempt to lazily load typeInfo. + typeInfoErr error + + // parent is the context of the parent schema node, or nil if this is the context for the root schema node. + parent *CELSchemaContext + // typeInfoAccessor provides a way to access the type info of this schema node from the parent CELSchemaContext. + // nil if not extraction is possible, or the parent is nil. + typeInfoAccessor typeInfoAccessor + + // jsonSchema is the schema for this CELSchemaContext node. It must be non-nil. + jsonSchema *apiextensions.JSONSchemaProps + // converter converts a JSONSchemaProps to CELTypeInfo. + // Tests that check how many conversions are performed during CRD validation wrap DefaultConverter + // with a converter that counts how many conversion operations. + converter converter + + // MaxCardinality represents a limit to the number of data elements that can exist for the current + // schema based on MaxProperties or MaxItems limits present on parent schemas, If all parent + // map and array schemas have MaxProperties or MaxItems limits declared MaxCardinality is + // an int pointer representing the product of these limits. If least one parent map or list schema + // does not have a MaxProperties or MaxItems limits set, the MaxCardinality is nil, indicating + // that the parent schemas offer no bound to the number of times a data element for the current + // schema can exist. + MaxCardinality *uint64 + // TotalCost accumulates the x-kubernetes-validators estimated rule cost total for an entire custom resource + // definition. A single TotalCost is allocated for each CustomResourceDefinition and passed through the stack as the + // CustomResourceDefinition's OpenAPIv3 schema is recursively validated. + TotalCost *TotalCost +} + +// TypeInfo returns the CELTypeInfo for this CELSchemaContext node. Returns nil, nil if this CELSchemaContext is nil, +// or if current level or above does not have x-kubernetes-validations rules. The returned type info is shared and +// should not be modified by the caller. +func (c *CELSchemaContext) TypeInfo() (*CELTypeInfo, error) { + if c == nil || !c.withinValidationRuleScope { + return nil, nil + } + if c.typeInfo != nil || c.typeInfoErr != nil { + return c.typeInfo, c.typeInfoErr // return already computed result if available + } + + // If able to get the type info from the parent's type info, prefer this approach + // since it is more efficient. + if c.parent != nil { + parentTypeInfo, parentErr := c.parent.TypeInfo() + if parentErr != nil { + c.typeInfoErr = parentErr + return nil, parentErr + } + if parentTypeInfo != nil && c.typeInfoAccessor != nil { + c.typeInfo = c.typeInfoAccessor.accessTypeInfo(parentTypeInfo) + if c.typeInfo != nil { + return c.typeInfo, nil + } + } + } + // If unable to get the type info from the parent, convert the jsonSchema to type info. + // This is expensive for large schemas. + c.typeInfo, c.typeInfoErr = c.converter(c.jsonSchema, c.parent == nil || c.jsonSchema.XEmbeddedResource) + return c.typeInfo, c.typeInfoErr +} + +// CELTypeInfo represents all the typeInfo needed by CEL to compile x-kubernetes-validations rules for a schema node. +type CELTypeInfo struct { + // Schema is a structural schema for this CELSchemaContext node. It must be non-nil. + Schema *structuralschema.Structural + // DeclType is a CEL declaration representation of Schema of this CELSchemaContext node. It must be non-nil. + DeclType *model.DeclType +} + +// converter converts from JSON schema to a structural schema and a CEL declType, or returns an error if the conversion +// fails. This should be defaultConverter except in tests where it is useful to wrap it with a converter that tracks +// how many conversions have been performed. +type converter func(schema *apiextensions.JSONSchemaProps, isRoot bool) (*CELTypeInfo, error) + +func defaultConverter(schema *apiextensions.JSONSchemaProps, isRoot bool) (*CELTypeInfo, error) { + structural, err := structuralschema.NewStructural(schema) + if err != nil { + return nil, err + } + declType := model.SchemaDeclType(structural, isRoot) + if declType == nil { + return nil, fmt.Errorf("unable to convert structural schema to CEL declarations") + } + return &CELTypeInfo{structural, declType}, nil +} + +// RootCELContext constructs CELSchemaContext for the given root schema. +func RootCELContext(schema *apiextensions.JSONSchemaProps) *CELSchemaContext { + rootCardinality := uint64(1) + r := &CELSchemaContext{ + jsonSchema: schema, + withinValidationRuleScope: len(schema.XValidations) > 0, + MaxCardinality: &rootCardinality, + TotalCost: &TotalCost{}, + converter: defaultConverter, + } + return r +} + +// ChildPropertyContext returns nil, nil if this CELSchemaContext is nil, otherwise constructs and returns a +// CELSchemaContext for propertyName. +func (c *CELSchemaContext) ChildPropertyContext(propSchema *apiextensions.JSONSchemaProps, propertyName string) *CELSchemaContext { + if c == nil { + return nil + } + return c.childContext(propSchema, propertyTypeInfoAccessor{propertyName: propertyName}) +} + +// ChildAdditionalPropertiesContext returns nil, nil if this CELSchemaContext is nil, otherwise it constructs and returns +// a CELSchemaContext for the properties of an object if this CELSchemaContext is an object. +// schema must be non-nil and have a non-nil schema.AdditionalProperties. +func (c *CELSchemaContext) ChildAdditionalPropertiesContext(propsSchema *apiextensions.JSONSchemaProps) *CELSchemaContext { + if c == nil { + return nil + } + return c.childContext(propsSchema, additionalItemsTypeInfoAccessor{}) +} + +// ChildItemsContext returns nil, nil if this CELSchemaContext is nil, otherwise it constructs and returns a CELSchemaContext +// for the items of an array if this CELSchemaContext is an array. +func (c *CELSchemaContext) ChildItemsContext(itemsSchema *apiextensions.JSONSchemaProps) *CELSchemaContext { + if c == nil { + return nil + } + return c.childContext(itemsSchema, itemsTypeInfoAccessor{}) +} + +// childContext returns nil, nil if this CELSchemaContext is nil, otherwise it constructs a new CELSchemaContext for the +// given child schema of the current schema context. +// accessor optionally provides a way to access CELTypeInfo of the child from the current schema context's CELTypeInfo. +// childContext returns a CELSchemaContext where the MaxCardinality is multiplied by the +// factor that the schema increases the cardinality of its children. If the CELSchemaContext's +// MaxCardinality is unbounded (nil) or the factor that the schema increase the cardinality +// is unbounded, the resulting CELSchemaContext's MaxCardinality is also unbounded. +func (c *CELSchemaContext) childContext(child *apiextensions.JSONSchemaProps, accessor typeInfoAccessor) *CELSchemaContext { + result := &CELSchemaContext{ + parent: c, + typeInfoAccessor: accessor, + withinValidationRuleScope: c.withinValidationRuleScope, + TotalCost: c.TotalCost, + MaxCardinality: unbounded, + converter: c.converter, + } + if child != nil { + result.jsonSchema = child + if len(child.XValidations) > 0 { + result.withinValidationRuleScope = true + } + } + if c.jsonSchema == nil { + // nil schemas can be passed since we call ChildSchemaContext + // before ValidateCustomResourceDefinitionOpenAPISchema performs its nil check + return result + } + if c.MaxCardinality == unbounded { + return result + } + maxElements := extractMaxElements(c.jsonSchema) + if maxElements == unbounded { + return result + } + result.MaxCardinality = uint64ptr(multiplyWithOverflowGuard(*c.MaxCardinality, *maxElements)) + return result +} + +type typeInfoAccessor interface { + // accessTypeInfo looks up type information for a child schema from a non-nil parentTypeInfo and returns it, + // or returns nil if the child schema information is not accessible. For example, a nil + // return value is expected when a property name is unescapable in CEL. + // The caller MUST ensure the provided parentTypeInfo is non-nil. + accessTypeInfo(parentTypeInfo *CELTypeInfo) *CELTypeInfo +} + +type propertyTypeInfoAccessor struct { + // propertyName is the property name in the parent schema that this schema is declared at. + propertyName string +} + +func (c propertyTypeInfoAccessor) accessTypeInfo(parentTypeInfo *CELTypeInfo) *CELTypeInfo { + if parentTypeInfo.Schema.Properties != nil { + propSchema := parentTypeInfo.Schema.Properties[c.propertyName] + if escapedPropName, ok := model.Escape(c.propertyName); ok { + if fieldDeclType, ok := parentTypeInfo.DeclType.Fields[escapedPropName]; ok { + return &CELTypeInfo{Schema: &propSchema, DeclType: fieldDeclType.Type} + } // else fields with unknown types are omitted from CEL validation entirely + } // fields with unescapable names are expected to be absent + } + return nil +} + +type itemsTypeInfoAccessor struct{} + +func (c itemsTypeInfoAccessor) accessTypeInfo(parentTypeInfo *CELTypeInfo) *CELTypeInfo { + if parentTypeInfo.Schema.Items != nil { + itemsSchema := parentTypeInfo.Schema.Items + itemsDeclType := parentTypeInfo.DeclType.ElemType + return &CELTypeInfo{Schema: itemsSchema, DeclType: itemsDeclType} + } + return nil +} + +type additionalItemsTypeInfoAccessor struct{} + +func (c additionalItemsTypeInfoAccessor) accessTypeInfo(parentTypeInfo *CELTypeInfo) *CELTypeInfo { + if parentTypeInfo.Schema.AdditionalProperties != nil { + propsSchema := parentTypeInfo.Schema.AdditionalProperties.Structural + valuesDeclType := parentTypeInfo.DeclType.ElemType + return &CELTypeInfo{Schema: propsSchema, DeclType: valuesDeclType} + } + return nil +} + +// TotalCost tracks the total cost of evaluating all the x-kubernetes-validations rules of a CustomResourceDefinition. +type TotalCost struct { + // Total accumulates the x-kubernetes-validations estimated rule cost total. + Total uint64 + // MostExpensive accumulates the top 4 most expensive rules contributing to the Total. Only rules + // that accumulate at least 1% of total cost limit are included. + MostExpensive []RuleCost +} + +// ObserveExpressionCost accumulates the cost of evaluating a -kubernetes-validations rule. +func (c *TotalCost) ObserveExpressionCost(path *field.Path, cost uint64) { + if math.MaxUint64-c.Total < cost { + c.Total = math.MaxUint64 + } else { + c.Total += cost + } + + if cost < StaticEstimatedCRDCostLimit/100 { // ignore rules that contribute < 1% of total cost limit + return + } + c.MostExpensive = append(c.MostExpensive, RuleCost{Path: path, Cost: cost}) + sort.Slice(c.MostExpensive, func(i, j int) bool { + // sort in descending order so the most expensive rule is first + return c.MostExpensive[i].Cost > c.MostExpensive[j].Cost + }) + if len(c.MostExpensive) > 4 { + c.MostExpensive = c.MostExpensive[:4] + } +} + +// RuleCost represents the cost of evaluating a single x-kubernetes-validations rule. +type RuleCost struct { + Path *field.Path + Cost uint64 +} + +// extractMaxElements returns the factor by which the schema increases the cardinality +// (number of possible data elements) of its children. If schema is a map and has +// MaxProperties or an array has MaxItems, the int pointer of the max value is returned. +// If schema is a map or array and does not have MaxProperties or MaxItems, +// unbounded (nil) is returned to indicate that there is no limit to the possible +// number of data elements imposed by the current schema. If the schema is an object, 1 is +// returned to indicate that there is no increase to the number of possible data elements +// for its children. Primitives do not have children, but 1 is returned for simplicity. +func extractMaxElements(schema *apiextensions.JSONSchemaProps) *uint64 { + switch schema.Type { + case "object": + if schema.AdditionalProperties != nil { + if schema.MaxProperties != nil { + maxProps := uint64(zeroIfNegative(*schema.MaxProperties)) + return &maxProps + } + return unbounded + } + // return 1 to indicate that all fields of an object exist at most one for + // each occurrence of the object they are fields of + return uint64ptr(1) + case "array": + if schema.MaxItems != nil { + maxItems := uint64(zeroIfNegative(*schema.MaxItems)) + return &maxItems + } + return unbounded + default: + return uint64ptr(1) + } +} + +func zeroIfNegative(v int64) int64 { + if v < 0 { + return 0 + } + return v +} + +func uint64ptr(i uint64) *uint64 { + return &i +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go index b97493d04..c5abb19f0 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go @@ -22,7 +22,6 @@ import ( "math" "reflect" "regexp" - "sort" "strings" "unicode" "unicode/utf8" @@ -723,34 +722,43 @@ func validateCustomResourceDefinitionValidation(ctx context.Context, customResou requireValidPropertyType: opts.requireValidPropertyType, } - costInfo := rootCostInfo() - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema, fldPath.Child("openAPIV3Schema"), openAPIV3Schema, true, &opts, costInfo)...) - - if costInfo.TotalCost != nil { - if costInfo.TotalCost.totalCost > StaticEstimatedCRDCostLimit { - for _, expensive := range costInfo.TotalCost.mostExpensive { - costErrorMsg := fmt.Sprintf("contributed to estimated rule cost total exceeding cost limit for entire OpenAPIv3 schema") - allErrs = append(allErrs, field.Forbidden(expensive.path, costErrorMsg)) - } - - costErrorMsg := getCostErrorMessage("x-kubernetes-validations estimated rule cost total for entire OpenAPIv3 schema", costInfo.TotalCost.totalCost, StaticEstimatedCRDCostLimit) - allErrs = append(allErrs, field.Forbidden(fldPath.Child("openAPIV3Schema"), costErrorMsg)) - } - } - + var celContext *CELSchemaContext + var structuralSchemaInitErrs field.ErrorList if opts.requireStructuralSchema { if ss, err := structuralschema.NewStructural(schema); err != nil { - // if the generic schema validation did its job, we should never get an error here. Hence, we hide it if there are validation errors already. - if len(allErrs) == 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("openAPIV3Schema"), "", err.Error())) - } + // These validation errors overlap with OpenAPISchema validation errors so we keep track of them + // separately and only show them if OpenAPISchema validation does not report any errors. + structuralSchemaInitErrs = append(structuralSchemaInitErrs, field.Invalid(fldPath.Child("openAPIV3Schema"), "", err.Error())) } else if validationErrors := structuralschema.ValidateStructural(fldPath.Child("openAPIV3Schema"), ss); len(validationErrors) > 0 { allErrs = append(allErrs, validationErrors...) } else if validationErrors, err := structuraldefaulting.ValidateDefaults(ctx, fldPath.Child("openAPIV3Schema"), ss, true, opts.requirePrunedDefaults); err != nil { // this should never happen allErrs = append(allErrs, field.Invalid(fldPath.Child("openAPIV3Schema"), "", err.Error())) - } else { + } else if len(validationErrors) > 0 { allErrs = append(allErrs, validationErrors...) + } else { + // Only initialize CEL rule validation context if the structural schemas are valid. + // A nil CELSchemaContext indicates that no CEL validation should be attempted. + celContext = RootCELContext(schema) + } + } + allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema, fldPath.Child("openAPIV3Schema"), openAPIV3Schema, true, &opts, celContext).AllErrors()...) + + if len(allErrs) == 0 && len(structuralSchemaInitErrs) > 0 { + // Structural schema initialization errors overlap with OpenAPISchema validation errors so we only show them + // if there are no OpenAPISchema validation errors. + allErrs = append(allErrs, structuralSchemaInitErrs...) + } + + if celContext != nil && celContext.TotalCost != nil { + if celContext.TotalCost.Total > StaticEstimatedCRDCostLimit { + for _, expensive := range celContext.TotalCost.MostExpensive { + costErrorMsg := fmt.Sprintf("contributed to estimated rule cost total exceeding cost limit for entire OpenAPIv3 schema") + allErrs = append(allErrs, field.Forbidden(expensive.Path, costErrorMsg)) + } + + costErrorMsg := getCostErrorMessage("x-kubernetes-validations estimated rule cost total for entire OpenAPIv3 schema", celContext.TotalCost.Total, StaticEstimatedCRDCostLimit) + allErrs = append(allErrs, field.Forbidden(fldPath.Child("openAPIV3Schema"), costErrorMsg)) } } } @@ -764,143 +772,43 @@ func validateCustomResourceDefinitionValidation(ctx context.Context, customResou return allErrs } -// unbounded uses nil to represent an unbounded cardinality value. -var unbounded *uint64 = nil - -type costInfo struct { - // MaxCardinality represents a limit to the number of data elements that can exist for the current - // schema based on MaxProperties or MaxItems limits present on parent schemas, If all parent - // map and array schemas have MaxProperties or MaxItems limits declared MaxCardinality is - // an int pointer representing the product of these limits. If least one parent map or list schema - // does not have a MaxProperties or MaxItems limits set, the MaxCardinality is nil, indicating - // that the parent schemas offer no bound to the number of times a data element for the current - // schema can exist. - MaxCardinality *uint64 - // TotalCost accumulates the x-kubernetes-validators estimated rule cost total for an entire custom resource - // definition. A single totalCost is allocated for each validation call and passed through the stack as the - // custom resource definition's OpenAPIv3 schema is recursively validated. - TotalCost *totalCost -} +var metaFields = sets.NewString("metadata", "kind", "apiVersion") -type totalCost struct { - // totalCost accumulates the x-kubernetes-validators estimated rule cost total. - totalCost uint64 - // mostExpensive accumulates the top 4 most expensive rules contributing to the totalCost. Only rules - // that accumulate at least 1% of total cost limit are included. - mostExpensive []ruleCost +// OpenAPISchemaErrorList tracks all validation errors reported ValidateCustomResourceDefinitionOpenAPISchema +// with CEL related errors kept separate from schema related errors. +type OpenAPISchemaErrorList struct { + SchemaErrors field.ErrorList + CELErrors field.ErrorList } -func (c *totalCost) observeExpressionCost(path *field.Path, cost uint64) { - if math.MaxUint64-c.totalCost < cost { - c.totalCost = math.MaxUint64 - } else { - c.totalCost += cost - } - - if cost < StaticEstimatedCRDCostLimit/100 { // ignore rules that contribute < 1% of total cost limit +// AppendErrors appends all errors in the provided list with the errors of this list. +func (o *OpenAPISchemaErrorList) AppendErrors(list *OpenAPISchemaErrorList) { + if o == nil || list == nil { return } - c.mostExpensive = append(c.mostExpensive, ruleCost{path: path, cost: cost}) - sort.Slice(c.mostExpensive, func(i, j int) bool { - // sort in descending order so the most expensive rule is first - return c.mostExpensive[i].cost > c.mostExpensive[j].cost - }) - if len(c.mostExpensive) > 4 { - c.mostExpensive = c.mostExpensive[:4] - } -} - -type ruleCost struct { - path *field.Path - cost uint64 -} - -// MultiplyByElementCost returns a costInfo where the MaxCardinality is multiplied by the -// factor that the schema increases the cardinality of its children. If the costInfo's -// MaxCardinality is unbounded (nil) or the factor that the schema increase the cardinality -// is unbounded, the resulting costInfo's MaxCardinality is also unbounded. -func (c *costInfo) MultiplyByElementCost(schema *apiextensions.JSONSchemaProps) costInfo { - result := costInfo{TotalCost: c.TotalCost, MaxCardinality: unbounded} - if schema == nil { - // nil schemas can be passed since we call MultiplyByElementCost - // before ValidateCustomResourceDefinitionOpenAPISchema performs its nil check - return result - } - if c.MaxCardinality == unbounded { - return result - } - maxElements := extractMaxElements(schema) - if maxElements == unbounded { - return result - } - result.MaxCardinality = uint64ptr(multiplyWithOverflowGuard(*c.MaxCardinality, *maxElements)) - return result -} - -// extractMaxElements returns the factor by which the schema increases the cardinality -// (number of possible data elements) of its children. If schema is a map and has -// MaxProperties or an array has MaxItems, the int pointer of the max value is returned. -// If schema is a map or array and does not have MaxProperties or MaxItems, -// unbounded (nil) is returned to indicate that there is no limit to the possible -// number of data elements imposed by the current schema. If the schema is an object, 1 is -// returned to indicate that there is no increase to the number of possible data elements -// for its children. Primitives do not have children, but 1 is returned for simplicity. -func extractMaxElements(schema *apiextensions.JSONSchemaProps) *uint64 { - switch schema.Type { - case "object": - if schema.AdditionalProperties != nil { - if schema.MaxProperties != nil { - maxProps := uint64(zeroIfNegative(*schema.MaxProperties)) - return &maxProps - } - return unbounded - } - // return 1 to indicate that all fields of an object exist at most one for - // each occurrence of the object they are fields of - return uint64ptr(1) - case "array": - if schema.MaxItems != nil { - maxItems := uint64(zeroIfNegative(*schema.MaxItems)) - return &maxItems - } - return unbounded - default: - return uint64ptr(1) - } + o.SchemaErrors = append(o.SchemaErrors, list.SchemaErrors...) + o.CELErrors = append(o.CELErrors, list.CELErrors...) } -func zeroIfNegative(v int64) int64 { - if v < 0 { - return 0 - } - return v -} - -func uint64ptr(i uint64) *uint64 { - return &i -} - -func rootCostInfo() costInfo { - rootCardinality := uint64(1) - return costInfo{ - MaxCardinality: &rootCardinality, - TotalCost: &totalCost{}, +// AllErrors returns a list containing both schema and CEL errors. +func (o *OpenAPISchemaErrorList) AllErrors() field.ErrorList { + if o == nil { + return field.ErrorList{} } + return append(o.SchemaErrors, o.CELErrors...) } -var metaFields = sets.NewString("metadata", "kind", "apiVersion") - // ValidateCustomResourceDefinitionOpenAPISchema statically validates -func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSchemaProps, fldPath *field.Path, ssv specStandardValidator, isRoot bool, opts *validationOptions, nodeCostInfo costInfo) field.ErrorList { - allErrs := field.ErrorList{} +func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSchemaProps, fldPath *field.Path, ssv specStandardValidator, isRoot bool, opts *validationOptions, celContext *CELSchemaContext) *OpenAPISchemaErrorList { + allErrs := &OpenAPISchemaErrorList{SchemaErrors: field.ErrorList{}, CELErrors: field.ErrorList{}} if schema == nil { return allErrs } - allErrs = append(allErrs, ssv.validate(schema, fldPath)...) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, ssv.validate(schema, fldPath)...) if schema.UniqueItems == true { - allErrs = append(allErrs, field.Forbidden(fldPath.Child("uniqueItems"), "uniqueItems cannot be set to true since the runtime complexity becomes quadratic")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Forbidden(fldPath.Child("uniqueItems"), "uniqueItems cannot be set to true since the runtime complexity becomes quadratic")) } // additionalProperties and properties are mutual exclusive because otherwise they @@ -915,7 +823,7 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch if schema.AdditionalProperties != nil { if len(schema.Properties) != 0 { if schema.AdditionalProperties.Allows == false || schema.AdditionalProperties.Schema != nil { - allErrs = append(allErrs, field.Forbidden(fldPath.Child("additionalProperties"), "additionalProperties and properties are mutual exclusive")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Forbidden(fldPath.Child("additionalProperties"), "additionalProperties and properties are mutual exclusive")) } } // Note: we forbid additionalProperties at resource root, both embedded and top-level. @@ -925,7 +833,7 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch // we have to forbid defaults inside additionalProperties because pruning without actual value is ambiguous subSsv = ssv.withForbiddenDefaults("inside additionalProperties applying to object metadata") } - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.AdditionalProperties.Schema, fldPath.Child("additionalProperties"), subSsv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(schema.AdditionalProperties.Schema, fldPath.Child("additionalProperties"), subSsv, false, opts, celContext.ChildAdditionalPropertiesContext(schema.AdditionalProperties.Schema))) } if len(schema.Properties) != 0 { @@ -943,33 +851,38 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch subSsv = subSsv.withForbiddenDefaults(fmt.Sprintf("in top-level %s", property)) } } - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("properties").Key(property), subSsv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + propertySchema := jsonSchema + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(&propertySchema, fldPath.Child("properties").Key(property), subSsv, false, opts, celContext.ChildPropertyContext(&propertySchema, property))) } } - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.Not, fldPath.Child("not"), ssv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(schema.Not, fldPath.Child("not"), ssv, false, opts, nil)) if len(schema.AllOf) != 0 { for i, jsonSchema := range schema.AllOf { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("allOf").Index(i), ssv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + allOfSchema := jsonSchema + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(&allOfSchema, fldPath.Child("allOf").Index(i), ssv, false, opts, nil)) } } if len(schema.OneOf) != 0 { for i, jsonSchema := range schema.OneOf { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("oneOf").Index(i), ssv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + oneOfSchema := jsonSchema + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(&oneOfSchema, fldPath.Child("oneOf").Index(i), ssv, false, opts, nil)) } } if len(schema.AnyOf) != 0 { for i, jsonSchema := range schema.AnyOf { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("anyOf").Index(i), ssv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + anyOfSchema := jsonSchema + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(&anyOfSchema, fldPath.Child("anyOf").Index(i), ssv, false, opts, nil)) } } if len(schema.Definitions) != 0 { for definition, jsonSchema := range schema.Definitions { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("definitions").Key(definition), ssv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + definitionSchema := jsonSchema + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(&definitionSchema, fldPath.Child("definitions").Key(definition), ssv, false, opts, nil)) } } @@ -983,83 +896,84 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch subSsv = subSsv.withForbidOldSelfValidations(fldPath) } - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.Items.Schema, fldPath.Child("items"), subSsv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(schema.Items.Schema, fldPath.Child("items"), subSsv, false, opts, celContext.ChildItemsContext(schema.Items.Schema))) if len(schema.Items.JSONSchemas) != 0 { for i, jsonSchema := range schema.Items.JSONSchemas { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("items").Index(i), subSsv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + itemsSchema := jsonSchema + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(&itemsSchema, fldPath.Child("items").Index(i), subSsv, false, opts, celContext.ChildItemsContext(&itemsSchema))) } } } if schema.Dependencies != nil { for dependency, jsonSchemaPropsOrStringArray := range schema.Dependencies { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(jsonSchemaPropsOrStringArray.Schema, fldPath.Child("dependencies").Key(dependency), ssv, false, opts, nodeCostInfo.MultiplyByElementCost(schema))...) + allErrs.AppendErrors(ValidateCustomResourceDefinitionOpenAPISchema(jsonSchemaPropsOrStringArray.Schema, fldPath.Child("dependencies").Key(dependency), ssv, false, opts, nil)) } } if schema.XPreserveUnknownFields != nil && *schema.XPreserveUnknownFields == false { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-preserve-unknown-fields"), *schema.XPreserveUnknownFields, "must be true or undefined")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("x-kubernetes-preserve-unknown-fields"), *schema.XPreserveUnknownFields, "must be true or undefined")) } if schema.XMapType != nil && schema.Type != "object" { if len(schema.Type) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("type"), "must be object if x-kubernetes-map-type is specified")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Required(fldPath.Child("type"), "must be object if x-kubernetes-map-type is specified")) } else { - allErrs = append(allErrs, field.Invalid(fldPath.Child("type"), schema.Type, "must be object if x-kubernetes-map-type is specified")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("type"), schema.Type, "must be object if x-kubernetes-map-type is specified")) } } if schema.XMapType != nil && *schema.XMapType != "atomic" && *schema.XMapType != "granular" { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("x-kubernetes-map-type"), *schema.XMapType, []string{"atomic", "granular"})) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.NotSupported(fldPath.Child("x-kubernetes-map-type"), *schema.XMapType, []string{"atomic", "granular"})) } if schema.XListType != nil && schema.Type != "array" { if len(schema.Type) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("type"), "must be array if x-kubernetes-list-type is specified")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Required(fldPath.Child("type"), "must be array if x-kubernetes-list-type is specified")) } else { - allErrs = append(allErrs, field.Invalid(fldPath.Child("type"), schema.Type, "must be array if x-kubernetes-list-type is specified")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("type"), schema.Type, "must be array if x-kubernetes-list-type is specified")) } } else if opts.requireAtomicSetType && schema.XListType != nil && *schema.XListType == "set" && schema.Items != nil && schema.Items.Schema != nil { // by structural schema items are present is := schema.Items.Schema switch is.Type { case "array": if is.XListType != nil && *is.XListType != "atomic" { // atomic is the implicit default behaviour if unset, hence != atomic is wrong - allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("x-kubernetes-list-type"), is.XListType, "must be atomic as item of a list with x-kubernetes-list-type=set")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("items").Child("x-kubernetes-list-type"), is.XListType, "must be atomic as item of a list with x-kubernetes-list-type=set")) } case "object": if is.XMapType == nil || *is.XMapType != "atomic" { // granular is the implicit default behaviour if unset, hence nil and != atomic are wrong - allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("x-kubernetes-map-type"), is.XListType, "must be atomic as item of a list with x-kubernetes-list-type=set")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("items").Child("x-kubernetes-map-type"), is.XListType, "must be atomic as item of a list with x-kubernetes-list-type=set")) } } } if schema.XListType != nil && *schema.XListType != "atomic" && *schema.XListType != "set" && *schema.XListType != "map" { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, []string{"atomic", "set", "map"})) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.NotSupported(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, []string{"atomic", "set", "map"})) } if len(schema.XListMapKeys) > 0 { if schema.XListType == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-list-type"), "must be map if x-kubernetes-list-map-keys is non-empty")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Required(fldPath.Child("x-kubernetes-list-type"), "must be map if x-kubernetes-list-map-keys is non-empty")) } else if *schema.XListType != "map" { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, "must be map if x-kubernetes-list-map-keys is non-empty")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, "must be map if x-kubernetes-list-map-keys is non-empty")) } } if schema.XListType != nil && *schema.XListType == "map" { if len(schema.XListMapKeys) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-list-map-keys"), "must not be empty if x-kubernetes-list-type is map")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Required(fldPath.Child("x-kubernetes-list-map-keys"), "must not be empty if x-kubernetes-list-type is map")) } if schema.Items == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("items"), "must have a schema if x-kubernetes-list-type is map")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Required(fldPath.Child("items"), "must have a schema if x-kubernetes-list-type is map")) } if schema.Items != nil && schema.Items.Schema == nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("items"), schema.Items, "must only have a single schema if x-kubernetes-list-type is map")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("items"), schema.Items, "must only have a single schema if x-kubernetes-list-type is map")) } if schema.Items != nil && schema.Items.Schema != nil && schema.Items.Schema.Type != "object" { - allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("type"), schema.Items.Schema.Type, "must be object if parent array's x-kubernetes-list-type is map")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("items").Child("type"), schema.Items.Schema.Type, "must be object if parent array's x-kubernetes-list-type is map")) } if schema.Items != nil && schema.Items.Schema != nil && schema.Items.Schema.Type == "object" { @@ -1067,59 +981,73 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch for _, k := range schema.XListMapKeys { if s, ok := schema.Items.Schema.Properties[k]; ok { if s.Type == "array" || s.Type == "object" { - allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("properties").Key(k).Child("type"), schema.Items.Schema.Type, "must be a scalar type if parent array's x-kubernetes-list-type is map")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("items").Child("properties").Key(k).Child("type"), schema.Items.Schema.Type, "must be a scalar type if parent array's x-kubernetes-list-type is map")) } } else { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "entries must all be names of item properties")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "entries must all be names of item properties")) } if _, ok := keys[k]; ok { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "must not contain duplicate entries")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "must not contain duplicate entries")) } keys[k] = struct{}{} } } } + if opts.requireMapListKeysMapSetValidation { + allErrs.SchemaErrors = append(allErrs.SchemaErrors, validateMapListKeysMapSet(schema, fldPath)...) + } + if len(schema.XValidations) > 0 { for i, rule := range schema.XValidations { trimmedRule := strings.TrimSpace(rule.Rule) trimmedMsg := strings.TrimSpace(rule.Message) if len(trimmedRule) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), "rule is not specified")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Required(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), "rule is not specified")) } else if len(rule.Message) > 0 && len(trimmedMsg) == 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("message"), rule.Message, "message must be non-empty if specified")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("message"), rule.Message, "message must be non-empty if specified")) } else if hasNewlines(trimmedMsg) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("message"), rule.Message, "message must not contain line breaks")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("message"), rule.Message, "message must not contain line breaks")) } else if hasNewlines(trimmedRule) && len(trimmedMsg) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-validations").Index(i).Child("message"), "message must be specified if rule contains line breaks")) + allErrs.SchemaErrors = append(allErrs.SchemaErrors, field.Required(fldPath.Child("x-kubernetes-validations").Index(i).Child("message"), "message must be specified if rule contains line breaks")) } } - structural, err := structuralschema.NewStructural(schema) - if err == nil { - compResults, err := cel.Compile(structural, isRoot, cel.PerCallLimit) + // If any schema related validation errors have been found at this level or deeper, skip CEL expression validation. + // Invalid OpenAPISchemas are not always possible to convert into valid CEL DeclTypes, and can lead to CEL + // validation error messages that are not actionable (will go away once the schema errors are resolved) and that + // are difficult for CEL expression authors to understand. + if len(allErrs.SchemaErrors) == 0 && celContext != nil { + typeInfo, err := celContext.TypeInfo() if err != nil { - allErrs = append(allErrs, field.InternalError(fldPath.Child("x-kubernetes-validations"), err)) + allErrs.CELErrors = append(allErrs.CELErrors, field.InternalError(fldPath.Child("x-kubernetes-validations"), fmt.Errorf("internal error: failed to construct type information for x-kubernetes-validations rules: %s", err))) + } else if typeInfo == nil { + allErrs.CELErrors = append(allErrs.CELErrors, field.InternalError(fldPath.Child("x-kubernetes-validations"), fmt.Errorf("internal error: failed to retrieve type information for x-kubernetes-validations"))) } else { - for i, cr := range compResults { - expressionCost := getExpressionCost(cr, nodeCostInfo) - if expressionCost > StaticEstimatedCostLimit { - costErrorMsg := getCostErrorMessage("estimated rule cost", expressionCost, StaticEstimatedCostLimit) - allErrs = append(allErrs, field.Forbidden(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), costErrorMsg)) - } - if nodeCostInfo.TotalCost != nil { - nodeCostInfo.TotalCost.observeExpressionCost(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), expressionCost) - } - if cr.Error != nil { - if cr.Error.Type == cel.ErrorTypeRequired { - allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), cr.Error.Detail)) - } else { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), schema.XValidations[i], cr.Error.Detail)) + compResults, err := cel.Compile(typeInfo.Schema, typeInfo.DeclType, cel.PerCallLimit) + if err != nil { + allErrs.CELErrors = append(allErrs.CELErrors, field.InternalError(fldPath.Child("x-kubernetes-validations"), err)) + } else { + for i, cr := range compResults { + expressionCost := getExpressionCost(cr, celContext) + if expressionCost > StaticEstimatedCostLimit { + costErrorMsg := getCostErrorMessage("estimated rule cost", expressionCost, StaticEstimatedCostLimit) + allErrs.CELErrors = append(allErrs.CELErrors, field.Forbidden(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), costErrorMsg)) } - } - if cr.TransitionRule { - if uncorrelatablePath := ssv.forbidOldSelfValidations(); uncorrelatablePath != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), schema.XValidations[i].Rule, fmt.Sprintf("oldSelf cannot be used on the uncorrelatable portion of the schema within %v", uncorrelatablePath))) + if celContext.TotalCost != nil { + celContext.TotalCost.ObserveExpressionCost(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), expressionCost) + } + if cr.Error != nil { + if cr.Error.Type == cel.ErrorTypeRequired { + allErrs.CELErrors = append(allErrs.CELErrors, field.Required(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), cr.Error.Detail)) + } else { + allErrs.CELErrors = append(allErrs.CELErrors, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), schema.XValidations[i], cr.Error.Detail)) + } + } + if cr.TransitionRule { + if uncorrelatablePath := ssv.forbidOldSelfValidations(); uncorrelatablePath != nil { + allErrs.CELErrors = append(allErrs.CELErrors, field.Invalid(fldPath.Child("x-kubernetes-validations").Index(i).Child("rule"), schema.XValidations[i].Rule, fmt.Sprintf("oldSelf cannot be used on the uncorrelatable portion of the schema within %v", uncorrelatablePath))) + } } } } @@ -1127,10 +1055,6 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch } } - if opts.requireMapListKeysMapSetValidation { - allErrs = append(allErrs, validateMapListKeysMapSet(schema, fldPath)...) - } - return allErrs } @@ -1146,7 +1070,7 @@ func multiplyWithOverflowGuard(baseCost, cardinality uint64) uint64 { return baseCost * cardinality } -func getExpressionCost(cr cel.CompilationResult, cardinalityCost costInfo) uint64 { +func getExpressionCost(cr cel.CompilationResult, cardinalityCost *CELSchemaContext) uint64 { if cardinalityCost.MaxCardinality != unbounded { return multiplyWithOverflowGuard(cr.MaxCost, *cardinalityCost.MaxCardinality) } @@ -1681,7 +1605,7 @@ func validatePreserveUnknownFields(crd, oldCRD *apiextensions.CustomResourceDefi var errs field.ErrorList if crd != nil && crd.Spec.PreserveUnknownFields != nil && *crd.Spec.PreserveUnknownFields { // disallow changing spec.preserveUnknownFields=false to spec.preserveUnknownFields=true - errs = append(errs, field.Invalid(field.NewPath("spec").Child("preserveUnknownFields"), crd.Spec.PreserveUnknownFields, "cannot set to true, set x-preserve-unknown-fields to true in spec.versions[*].schema instead")) + errs = append(errs, field.Invalid(field.NewPath("spec").Child("preserveUnknownFields"), crd.Spec.PreserveUnknownFields, "cannot set to true, set x-kubernetes-preserve-unknown-fields to true in spec.versions[*].schema instead")) } return errs } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/compilation.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/compilation.go index 61b0eee06..775744143 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/compilation.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/compilation.go @@ -19,17 +19,15 @@ package cel import ( "fmt" "strings" + "sync" "time" "github.com/google/cel-go/cel" "github.com/google/cel-go/checker" - "github.com/google/cel-go/checker/decls" - expr "google.golang.org/genproto/googleapis/api/expr/v1alpha1" - "google.golang.org/protobuf/proto" - apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library" + "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/metrics" celmodel "k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model" ) @@ -69,61 +67,82 @@ type CompilationResult struct { MaxCardinality uint64 } +var ( + initEnvOnce sync.Once + initEnv *cel.Env + initEnvErr error +) + +func getBaseEnv() (*cel.Env, error) { + initEnvOnce.Do(func() { + var opts []cel.EnvOption + opts = append(opts, cel.HomogeneousAggregateLiterals()) + // Validate function declarations once during base env initialization, + // so they don't need to be evaluated each time a CEL rule is compiled. + // This is a relatively expensive operation. + opts = append(opts, cel.EagerlyValidateDeclarations(true), cel.DefaultUTCTimeZone(true)) + opts = append(opts, library.ExtensionLibs...) + + initEnv, initEnvErr = cel.NewEnv(opts...) + }) + return initEnv, initEnvErr +} + // Compile compiles all the XValidations rules (without recursing into the schema) and returns a slice containing a -// CompilationResult for each ValidationRule, or an error. +// CompilationResult for each ValidationRule, or an error. declType is expected to be a CEL DeclType corresponding +// to the structural schema. // Each CompilationResult may contain: -/// - non-nil Program, nil Error: The program was compiled successfully -// - nil Program, non-nil Error: Compilation resulted in an error -// - nil Program, nil Error: The provided rule was empty so compilation was not attempted +// / - non-nil Program, nil Error: The program was compiled successfully +// - nil Program, non-nil Error: Compilation resulted in an error +// - nil Program, nil Error: The provided rule was empty so compilation was not attempted +// // perCallLimit was added for testing purpose only. Callers should always use const PerCallLimit as input. -func Compile(s *schema.Structural, isResourceRoot bool, perCallLimit uint64) ([]CompilationResult, error) { +func Compile(s *schema.Structural, declType *celmodel.DeclType, perCallLimit uint64) ([]CompilationResult, error) { + t := time.Now() + defer metrics.Metrics.ObserveCompilation(time.Since(t)) if len(s.Extensions.XValidations) == 0 { return nil, nil } celRules := s.Extensions.XValidations - var propDecls []*expr.Decl + var propDecls []cel.EnvOption var root *celmodel.DeclType var ok bool - env, err := cel.NewEnv( - cel.HomogeneousAggregateLiterals(), - ) + baseEnv, err := getBaseEnv() if err != nil { return nil, err } - reg := celmodel.NewRegistry(env) + reg := celmodel.NewRegistry(baseEnv) scopedTypeName := generateUniqueSelfTypeName() - rt, err := celmodel.NewRuleTypes(scopedTypeName, s, isResourceRoot, reg) + rt, err := celmodel.NewRuleTypes(scopedTypeName, declType, reg) if err != nil { return nil, err } if rt == nil { return nil, nil } - opts, err := rt.EnvOptions(env.TypeProvider()) + opts, err := rt.EnvOptions(baseEnv.TypeProvider()) if err != nil { return nil, err } root, ok = rt.FindDeclType(scopedTypeName) if !ok { - rootDecl := celmodel.SchemaDeclType(s, isResourceRoot) - if rootDecl == nil { + if declType == nil { return nil, fmt.Errorf("rule declared on schema that does not support validation rules type: '%s' x-kubernetes-preserve-unknown-fields: '%t'", s.Type, s.XPreserveUnknownFields) } - root = rootDecl.MaybeAssignTypeName(scopedTypeName) + root = declType.MaybeAssignTypeName(scopedTypeName) } - propDecls = append(propDecls, decls.NewVar(ScopedVarName, root.ExprType())) - propDecls = append(propDecls, decls.NewVar(OldScopedVarName, root.ExprType())) - opts = append(opts, cel.Declarations(propDecls...), cel.HomogeneousAggregateLiterals()) - opts = append(opts, library.ExtensionLibs...) - env, err = env.Extend(opts...) + propDecls = append(propDecls, cel.Variable(ScopedVarName, root.CelType())) + propDecls = append(propDecls, cel.Variable(OldScopedVarName, root.CelType())) + opts = append(opts, propDecls...) + env, err := baseEnv.Extend(opts...) if err != nil { return nil, err } estimator := newCostEstimator(root) // compResults is the return value which saves a list of compilation results in the same order as x-kubernetes-validations rules. compResults := make([]CompilationResult, len(celRules)) - maxCardinality := celmodel.MaxCardinality(s) + maxCardinality := celmodel.MaxCardinality(root.MinSerializedSize) for i, rule := range celRules { compResults[i] = compileRule(rule, env, perCallLimit, estimator, maxCardinality) } @@ -142,7 +161,7 @@ func compileRule(rule apiextensions.ValidationRule, env *cel.Env, perCallLimit u compilationResult.Error = &Error{ErrorTypeInvalid, "compilation failed: " + issues.String()} return } - if !proto.Equal(ast.ResultType(), decls.Bool) { + if ast.OutputType() != cel.BoolType { compilationResult.Error = &Error{ErrorTypeInvalid, "cel expression must evaluate to a bool"} return } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/lists.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/lists.go index 1c0f60b5b..fe51dc87f 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/lists.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/lists.go @@ -20,12 +20,10 @@ import ( "fmt" "github.com/google/cel-go/cel" - "github.com/google/cel-go/checker/decls" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/common/types/traits" "github.com/google/cel-go/interpreter/functions" - exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" ) // Lists provides a CEL function library extension of list utility functions. @@ -34,65 +32,61 @@ import ( // // Returns true if the provided list of comparable elements is sorted, else returns false. // -// >.isSorted() , T must be a comparable type +// >.isSorted() , T must be a comparable type // // Examples: // -// [1, 2, 3].isSorted() // return true -// ['a', 'b', 'b', 'c'].isSorted() // return true -// [2.0, 1.0].isSorted() // return false -// [1].isSorted() // return true -// [].isSorted() // return true -// +// [1, 2, 3].isSorted() // return true +// ['a', 'b', 'b', 'c'].isSorted() // return true +// [2.0, 1.0].isSorted() // return false +// [1].isSorted() // return true +// [].isSorted() // return true // // sum // // Returns the sum of the elements of the provided list. Supports CEL number (int, uint, double) and duration types. // -// >.sum() , T must be a numeric type or a duration +// >.sum() , T must be a numeric type or a duration // // Examples: // -// [1, 3].sum() // returns 4 -// [1.0, 3.0].sum() // returns 4.0 -// ['1m', '1s'].sum() // returns '1m1s' -// emptyIntList.sum() // returns 0 -// emptyDoubleList.sum() // returns 0.0 -// [].sum() // returns 0 -// +// [1, 3].sum() // returns 4 +// [1.0, 3.0].sum() // returns 4.0 +// ['1m', '1s'].sum() // returns '1m1s' +// emptyIntList.sum() // returns 0 +// emptyDoubleList.sum() // returns 0.0 +// [].sum() // returns 0 // // min / max // // Returns the minimum/maximum valued element of the provided list. Supports all comparable types. // If the list is empty, an error is returned. // -// >.min() , T must be a comparable type -// >.max() , T must be a comparable type +// >.min() , T must be a comparable type +// >.max() , T must be a comparable type // // Examples: // -// [1, 3].min() // returns 1 -// [1, 3].max() // returns 3 -// [].min() // error -// [1].min() // returns 1 -// ([0] + emptyList).min() // returns 0 -// +// [1, 3].min() // returns 1 +// [1, 3].max() // returns 3 +// [].min() // error +// [1].min() // returns 1 +// ([0] + emptyList).min() // returns 0 // // indexOf / lastIndexOf // // Returns either the first or last positional index of the provided element in the list. // If the element is not found, -1 is returned. Supports all equatable types. // -// >.indexOf() , T must be an equatable type -// >.lastIndexOf() , T must be an equatable type +// >.indexOf() , T must be an equatable type +// >.lastIndexOf() , T must be an equatable type // // Examples: // -// [1, 2, 2, 3].indexOf(2) // returns 1 -// ['a', 'b', 'b', 'c'].lastIndexOf('b') // returns 2 -// [1.0].indexOf(1.1) // returns -1 -// [].indexOf('string') // returns -1 -// +// [1, 2, 2, 3].indexOf(2) // returns 1 +// ['a', 'b', 'b', 'c'].lastIndexOf('b') // returns 2 +// [1.0].indexOf(1.1) // returns -1 +// [].indexOf('string') // returns -1 func Lists() cel.EnvOption { return cel.Lib(listsLib) } @@ -101,120 +95,84 @@ var listsLib = &lists{} type lists struct{} -var paramA = decls.NewTypeParamType("A") +var paramA = cel.TypeParamType("A") // CEL typeParams can be used to constraint to a specific trait (e.g. traits.ComparableType) if the 1st operand is the type to constrain. // But the functions we need to constrain are >, not just . -var summableTypes = map[string]*exprpb.Type{"int": decls.Int, "uint": decls.Uint, "double": decls.Double, "duration": decls.Duration} -var comparableTypes = map[string]*exprpb.Type{"bool": decls.Bool, "int": decls.Int, "uint": decls.Uint, "double": decls.Double, - "duration": decls.Duration, "timestamp": decls.Timestamp, "string": decls.String, "bytes": decls.Bytes} +// Make sure the order of overload set is deterministic +type namedCELType struct { + typeName string + celType *cel.Type +} + +var summableTypes = []namedCELType{ + {typeName: "int", celType: cel.IntType}, + {typeName: "uint", celType: cel.UintType}, + {typeName: "double", celType: cel.DoubleType}, + {typeName: "duration", celType: cel.DurationType}, +} + +var zeroValuesOfSummableTypes = map[string]ref.Val{ + "int": types.Int(0), + "uint": types.Uint(0), + "double": types.Double(0.0), + "duration": types.Duration{Duration: 0}, +} +var comparableTypes = []namedCELType{ + {typeName: "int", celType: cel.IntType}, + {typeName: "uint", celType: cel.UintType}, + {typeName: "double", celType: cel.DoubleType}, + {typeName: "bool", celType: cel.BoolType}, + {typeName: "duration", celType: cel.DurationType}, + {typeName: "timestamp", celType: cel.TimestampType}, + {typeName: "string", celType: cel.StringType}, + {typeName: "bytes", celType: cel.BytesType}, +} // WARNING: All library additions or modifications must follow // https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/2876-crd-validation-expression-language#function-library-updates -var listsLibraryDecls = []*exprpb.Decl{ - decls.NewFunction("isSorted", - templatedOverloads(comparableTypes, func(name string, paramType *exprpb.Type) *exprpb.Decl_FunctionDecl_Overload { - return decls.NewInstanceOverload(fmt.Sprintf("list_%s_is_sorted_bool", name), - []*exprpb.Type{decls.NewListType(paramType)}, - decls.Bool) - })..., - ), - decls.NewFunction("sum", - templatedOverloads(summableTypes, func(name string, paramType *exprpb.Type) *exprpb.Decl_FunctionDecl_Overload { - return decls.NewInstanceOverload(fmt.Sprintf("list_%s_sum_%s", name, name), - []*exprpb.Type{decls.NewListType(paramType)}, - paramType) - })..., - ), - decls.NewFunction("max", - templatedOverloads(comparableTypes, func(name string, paramType *exprpb.Type) *exprpb.Decl_FunctionDecl_Overload { - return decls.NewInstanceOverload(fmt.Sprintf("list_%s_max_%s", name, name), - []*exprpb.Type{decls.NewListType(paramType)}, - paramType) - })..., - ), - decls.NewFunction("min", - templatedOverloads(comparableTypes, func(name string, paramType *exprpb.Type) *exprpb.Decl_FunctionDecl_Overload { - return decls.NewInstanceOverload(fmt.Sprintf("list_%s_min_%s", name, name), - []*exprpb.Type{decls.NewListType(paramType)}, - paramType) - })..., - ), - decls.NewFunction("indexOf", - decls.NewInstanceOverload("list_a_index_of_int", - []*exprpb.Type{decls.NewListType(paramA), paramA}, - decls.Int), - ), - decls.NewFunction("lastIndexOf", - decls.NewInstanceOverload("list_a_last_index_of_int", - []*exprpb.Type{decls.NewListType(paramA), paramA}, - decls.Int), - ), +var listsLibraryDecls = map[string][]cel.FunctionOpt{ + "isSorted": templatedOverloads(comparableTypes, func(name string, paramType *cel.Type) cel.FunctionOpt { + return cel.MemberOverload(fmt.Sprintf("list_%s_is_sorted_bool", name), + []*cel.Type{cel.ListType(paramType)}, cel.BoolType, cel.UnaryBinding(isSorted)) + }), + "sum": templatedOverloads(summableTypes, func(name string, paramType *cel.Type) cel.FunctionOpt { + return cel.MemberOverload(fmt.Sprintf("list_%s_sum_%s", name, name), + []*cel.Type{cel.ListType(paramType)}, paramType, cel.UnaryBinding(func(list ref.Val) ref.Val { + return sum( + func() ref.Val { + return zeroValuesOfSummableTypes[name] + })(list) + })) + }), + "max": templatedOverloads(comparableTypes, func(name string, paramType *cel.Type) cel.FunctionOpt { + return cel.MemberOverload(fmt.Sprintf("list_%s_max_%s", name, name), + []*cel.Type{cel.ListType(paramType)}, paramType, cel.UnaryBinding(max())) + }), + "min": templatedOverloads(comparableTypes, func(name string, paramType *cel.Type) cel.FunctionOpt { + return cel.MemberOverload(fmt.Sprintf("list_%s_min_%s", name, name), + []*cel.Type{cel.ListType(paramType)}, paramType, cel.UnaryBinding(min())) + }), + "indexOf": { + cel.MemberOverload("list_a_index_of_int", []*cel.Type{cel.ListType(paramA), paramA}, cel.IntType, + cel.BinaryBinding(indexOf)), + }, + "lastIndexOf": { + cel.MemberOverload("list_a_last_index_of_int", []*cel.Type{cel.ListType(paramA), paramA}, cel.IntType, + cel.BinaryBinding(lastIndexOf)), + }, } func (*lists) CompileOptions() []cel.EnvOption { - return []cel.EnvOption{ - cel.Declarations(listsLibraryDecls...), + options := []cel.EnvOption{} + for name, overloads := range listsLibraryDecls { + options = append(options, cel.Function(name, overloads...)) } + return options } func (*lists) ProgramOptions() []cel.ProgramOption { - return []cel.ProgramOption{ - cel.Functions( - &functions.Overload{ - Operator: "isSorted", - Unary: isSorted, - }, - // if 'sum' is called directly, it is via dynamic dispatch, and we infer the type from the 1st element of the - // list if it has one, otherwise we return int64(0) - &functions.Overload{ - Operator: "sum", - Unary: dynSum(), - }, - // use overload names for sum so an initial accumulator value can be assigned to each - &functions.Overload{ - Operator: "list_int_sum_int", - Unary: sum(func() ref.Val { - return types.Int(0) - }), - }, - &functions.Overload{ - Operator: "list_uint_sum_uint", - Unary: sum(func() ref.Val { - return types.Uint(0) - }), - }, - &functions.Overload{ - Operator: "list_double_sum_double", - Unary: sum(func() ref.Val { - return types.Double(0.0) - }), - }, - &functions.Overload{ - Operator: "list_duration_sum_duration", - Unary: sum(func() ref.Val { - return types.Duration{Duration: 0} - }), - }, - &functions.Overload{ - Operator: "max", - Unary: max(), - }, - &functions.Overload{ - Operator: "min", - Unary: min(), - }, - // use overload names for indexOf and lastIndexOf to de-conflict with function of same name in strings extension library - &functions.Overload{ - Operator: "list_a_index_of_int", - Binary: indexOf, - }, - &functions.Overload{ - Operator: "list_a_last_index_of_int", - Binary: lastIndexOf, - }, - ), - } + return []cel.ProgramOption{} } func isSorted(val ref.Val) ref.Val { @@ -240,38 +198,6 @@ func isSorted(val ref.Val) ref.Val { return types.True } -func dynSum() functions.UnaryOp { - return func(val ref.Val) ref.Val { - iterable, ok := val.(traits.Iterable) - if !ok { - return types.MaybeNoSuchOverloadErr(val) - } - it := iterable.Iterator() - var initval ref.Val - if it.HasNext() == types.True { - first := it.Next() - switch first.Type() { - case types.IntType: - initval = types.Int(0) - case types.UintType: - initval = types.Uint(0) - case types.DoubleType: - initval = types.Double(0.0) - case types.DurationType: - initval = types.Duration{Duration: 0} - default: - return types.MaybeNoSuchOverloadErr(first) - } - } else { - initval = types.Int(0) - } - initFn := func() ref.Val { - return initval - } - return sum(initFn)(val) - } -} - func sum(init func() ref.Val) functions.UnaryOp { return func(val ref.Val) ref.Val { i := init() @@ -375,11 +301,11 @@ func lastIndexOf(list ref.Val, item ref.Val) ref.Val { // templatedOverloads returns overloads for each of the provided types. The template function is called with each type // name (map key) and type to construct the overloads. -func templatedOverloads(types map[string]*exprpb.Type, template func(name string, t *exprpb.Type) *exprpb.Decl_FunctionDecl_Overload) []*exprpb.Decl_FunctionDecl_Overload { - overloads := make([]*exprpb.Decl_FunctionDecl_Overload, len(types)) +func templatedOverloads(types []namedCELType, template func(name string, t *cel.Type) cel.FunctionOpt) []cel.FunctionOpt { + overloads := make([]cel.FunctionOpt, len(types)) i := 0 - for name, t := range types { - overloads[i] = template(name, t) + for _, t := range types { + overloads[i] = template(t.typeName, t.celType) i++ } return overloads diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/regex.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/regex.go index e44f82090..6db5ef195 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/regex.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/regex.go @@ -20,12 +20,9 @@ import ( "regexp" "github.com/google/cel-go/cel" - "github.com/google/cel-go/checker/decls" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/interpreter" - "github.com/google/cel-go/interpreter/functions" - exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" ) // Regex provides a CEL function library extension of regex utility functions. @@ -35,18 +32,17 @@ import ( // Returns substrings that match the provided regular expression. find returns the first match. findAll may optionally // be provided a limit. If the limit is set and >= 0, no more than the limit number of matches are returned. // -// .find() -// .findAll() > -// .findAll(, ) > +// .find() +// .findAll() > +// .findAll(, ) > // // Examples: // -// "abc 123".find('[0-9]*') // returns '123' -// "abc 123".find('xyz') // returns '' -// "123 abc 456".findAll('[0-9]*') // returns ['123', '456'] -// "123 abc 456".findAll('[0-9]*', 1) // returns ['123'] -// "123 abc 456".findAll('xyz') // returns [] -// +// "abc 123".find('[0-9]*') // returns '123' +// "abc 123".find('xyz') // returns '' +// "123 abc 456".findAll('[0-9]*') // returns ['123', '456'] +// "123 abc 456".findAll('[0-9]*', 1) // returns ['123'] +// "123 abc 456".findAll('xyz') // returns [] func Regex() cel.EnvOption { return cel.Lib(regexLib) } @@ -55,59 +51,33 @@ var regexLib = ®ex{} type regex struct{} -var regexLibraryDecls = []*exprpb.Decl{ - - decls.NewFunction("find", - decls.NewInstanceOverload("string_find_string", - []*exprpb.Type{decls.String, decls.String}, - decls.String), - ), - decls.NewFunction("findAll", - decls.NewInstanceOverload("string_find_all_string", - []*exprpb.Type{decls.String, decls.String}, - decls.NewListType(decls.String)), - decls.NewInstanceOverload("string_find_all_string_int", - []*exprpb.Type{decls.String, decls.String, decls.Int}, - decls.NewListType(decls.String)), - ), +var regexLibraryDecls = map[string][]cel.FunctionOpt{ + "find": { + cel.MemberOverload("string_find_string", []*cel.Type{cel.StringType, cel.StringType}, cel.StringType, + cel.BinaryBinding(find))}, + "findAll": { + cel.MemberOverload("string_find_all_string", []*cel.Type{cel.StringType, cel.StringType}, + cel.ListType(cel.StringType), + cel.BinaryBinding(func(str, regex ref.Val) ref.Val { + return findAll(str, regex, types.Int(-1)) + })), + cel.MemberOverload("string_find_all_string_int", + []*cel.Type{cel.StringType, cel.StringType, cel.IntType}, + cel.ListType(cel.StringType), + cel.FunctionBinding(findAll)), + }, } func (*regex) CompileOptions() []cel.EnvOption { - return []cel.EnvOption{ - cel.Declarations(regexLibraryDecls...), + options := []cel.EnvOption{} + for name, overloads := range regexLibraryDecls { + options = append(options, cel.Function(name, overloads...)) } + return options } func (*regex) ProgramOptions() []cel.ProgramOption { - return []cel.ProgramOption{ - cel.Functions( - &functions.Overload{ - Operator: "find", - Binary: find, - }, - &functions.Overload{ - Operator: "string_find_string", - Binary: find, - }, - &functions.Overload{ - Operator: "findAll", - Binary: func(str, regex ref.Val) ref.Val { - return findAll(str, regex, types.Int(-1)) - }, - Function: findAll, - }, - &functions.Overload{ - Operator: "string_find_all_string", - Binary: func(str, regex ref.Val) ref.Val { - return findAll(str, regex, types.Int(-1)) - }, - }, - &functions.Overload{ - Operator: "string_find_all_string_int", - Function: findAll, - }, - ), - } + return []cel.ProgramOption{} } func find(strVal ref.Val, regexVal ref.Val) ref.Val { diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/urls.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/urls.go index 8e47bb45a..d2c8483be 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/urls.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library/urls.go @@ -20,12 +20,8 @@ import ( "net/url" "github.com/google/cel-go/cel" - "github.com/google/cel-go/checker/decls" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" - "github.com/google/cel-go/interpreter/functions" - exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" - "k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model" ) @@ -36,41 +32,46 @@ import ( // Converts a string to a URL or results in an error if the string is not a valid URL. The URL must be an absolute URI // or an absolute path. // -// url() +// url() // // Examples: // -// url('https://user:pass@example.com:80/path?query=val#fragment') // returns a URL -// url('/absolute-path') // returns a URL -// url('https://a:b:c/') // error -// url('../relative-path') // error +// url('https://user:pass@example.com:80/path?query=val#fragment') // returns a URL +// url('/absolute-path') // returns a URL +// url('https://a:b:c/') // error +// url('../relative-path') // error // // isURL // // Returns true if a string is a valid URL. The URL must be an absolute URI or an absolute path. // -// isURL( ) +// isURL( ) // // Examples: // -// isURL('https://user:pass@example.com:80/path?query=val#fragment') // returns true -// isURL('/absolute-path') // returns true -// isURL('https://a:b:c/') // returns false -// isURL('../relative-path') // returns false -// +// isURL('https://user:pass@example.com:80/path?query=val#fragment') // returns true +// isURL('/absolute-path') // returns true +// isURL('https://a:b:c/') // returns false +// isURL('../relative-path') // returns false // // getScheme / getHost / getHostname / getPort / getEscapedPath / getQuery // // Return the parsed components of a URL. -// - getScheme: If absent in the URL, returns an empty string. -// - getHostname: IPv6 addresses are returned with braces, e.g. "[::1]". If absent in the URL, returns an empty string. -// - getHost: IPv6 addresses are returned without braces, e.g. "::1". If absent in the URL, returns an empty string. -// - getEscapedPath: The string returned by getEscapedPath is URL escaped, e.g. "with space" becomes "with%20space". -// If absent in the URL, returns an empty string. -// - getPort: If absent in the URL, returns an empty string. -// - getQuery: Returns the query parameters in "matrix" form where a repeated query key is interpreted to -// mean that there are multiple values for that key. The keys and values are returned unescaped. -// If absent in the URL, returns an empty map. +// +// - getScheme: If absent in the URL, returns an empty string. +// +// - getHostname: IPv6 addresses are returned with braces, e.g. "[::1]". If absent in the URL, returns an empty string. +// +// - getHost: IPv6 addresses are returned without braces, e.g. "::1". If absent in the URL, returns an empty string. +// +// - getEscapedPath: The string returned by getEscapedPath is URL escaped, e.g. "with space" becomes "with%20space". +// If absent in the URL, returns an empty string. +// +// - getPort: If absent in the URL, returns an empty string. +// +// - getQuery: Returns the query parameters in "matrix" form where a repeated query key is interpreted to +// mean that there are multiple values for that key. The keys and values are returned unescaped. +// If absent in the URL, returns an empty map. // // .getScheme() // .getHost() @@ -81,28 +82,27 @@ import ( // // Examples: // -// url('/path').getScheme() // returns '' -// url('https://example.com/').getScheme() // returns 'https' -// url('https://example.com:80/').getHost() // returns 'example.com:80' -// url('https://example.com/').getHost() // returns 'example.com' -// url('https://[::1]:80/').getHost() // returns '[::1]:80' -// url('https://[::1]/').getHost() // returns '[::1]' -// url('/path').getHost() // returns '' -// url('https://example.com:80/').getHostname() // returns 'example.com' -// url('https://127.0.0.1:80/').getHostname() // returns '127.0.0.1' -// url('https://[::1]:80/').getHostname() // returns '::1' -// url('/path').getHostname() // returns '' -// url('https://example.com:80/').getPort() // returns '80' -// url('https://example.com/').getPort() // returns '' -// url('/path').getPort() // returns '' -// url('https://example.com/path').getEscapedPath() // returns '/path' -// url('https://example.com/path with spaces/').getEscapedPath() // returns '/path%20with%20spaces/' -// url('https://example.com').getEscapedPath() // returns '' -// url('https://example.com/path?k1=a&k2=b&k2=c').getQuery() // returns { 'k1': ['a'], 'k2': ['b', 'c']} -// url('https://example.com/path?key with spaces=value with spaces').getQuery() // returns { 'key with spaces': ['value with spaces']} -// url('https://example.com/path?').getQuery() // returns {} -// url('https://example.com/path').getQuery() // returns {} -// +// url('/path').getScheme() // returns '' +// url('https://example.com/').getScheme() // returns 'https' +// url('https://example.com:80/').getHost() // returns 'example.com:80' +// url('https://example.com/').getHost() // returns 'example.com' +// url('https://[::1]:80/').getHost() // returns '[::1]:80' +// url('https://[::1]/').getHost() // returns '[::1]' +// url('/path').getHost() // returns '' +// url('https://example.com:80/').getHostname() // returns 'example.com' +// url('https://127.0.0.1:80/').getHostname() // returns '127.0.0.1' +// url('https://[::1]:80/').getHostname() // returns '::1' +// url('/path').getHostname() // returns '' +// url('https://example.com:80/').getPort() // returns '80' +// url('https://example.com/').getPort() // returns '' +// url('/path').getPort() // returns '' +// url('https://example.com/path').getEscapedPath() // returns '/path' +// url('https://example.com/path with spaces/').getEscapedPath() // returns '/path%20with%20spaces/' +// url('https://example.com').getEscapedPath() // returns '' +// url('https://example.com/path?k1=a&k2=b&k2=c').getQuery() // returns { 'k1': ['a'], 'k2': ['b', 'c']} +// url('https://example.com/path?key with spaces=value with spaces').getQuery() // returns { 'key with spaces': ['value with spaces']} +// url('https://example.com/path?').getQuery() // returns {} +// url('https://example.com/path').getQuery() // returns {} func URLs() cel.EnvOption { return cel.Lib(urlsLib) } @@ -111,124 +111,44 @@ var urlsLib = &urls{} type urls struct{} -var urlLibraryDecls = []*exprpb.Decl{ - decls.NewFunction("url", - decls.NewOverload("string_to_url", - []*exprpb.Type{decls.String}, - model.URLObject), - ), - decls.NewFunction("getScheme", - decls.NewInstanceOverload("url_get_scheme", - []*exprpb.Type{model.URLObject}, - decls.String), - ), - decls.NewFunction("getHost", - decls.NewInstanceOverload("url_get_host", - []*exprpb.Type{model.URLObject}, - decls.String), - ), - decls.NewFunction("getHostname", - decls.NewInstanceOverload("url_get_hostname", - []*exprpb.Type{model.URLObject}, - decls.String), - ), - decls.NewFunction("getPort", - decls.NewInstanceOverload("url_get_port", - []*exprpb.Type{model.URLObject}, - decls.String), - ), - decls.NewFunction("getEscapedPath", - decls.NewInstanceOverload("url_get_escaped_path", - []*exprpb.Type{model.URLObject}, - decls.String), - ), - decls.NewFunction("getQuery", - decls.NewInstanceOverload("url_get_query", - []*exprpb.Type{model.URLObject}, - decls.NewMapType(decls.String, decls.NewListType(decls.String))), - ), - decls.NewFunction("isURL", - decls.NewOverload("is_url_string", - []*exprpb.Type{decls.String}, - decls.Bool), - ), +var urlLibraryDecls = map[string][]cel.FunctionOpt{ + "url": { + cel.Overload("string_to_url", []*cel.Type{cel.StringType}, model.URLType, + cel.UnaryBinding(stringToUrl))}, + "getScheme": { + cel.MemberOverload("url_get_scheme", []*cel.Type{model.URLType}, cel.StringType, + cel.UnaryBinding(getScheme))}, + "getHost": { + cel.MemberOverload("url_get_host", []*cel.Type{model.URLType}, cel.StringType, + cel.UnaryBinding(getHost))}, + "getHostname": { + cel.MemberOverload("url_get_hostname", []*cel.Type{model.URLType}, cel.StringType, + cel.UnaryBinding(getHostname))}, + "getPort": { + cel.MemberOverload("url_get_port", []*cel.Type{model.URLType}, cel.StringType, + cel.UnaryBinding(getPort))}, + "getEscapedPath": { + cel.MemberOverload("url_get_escaped_path", []*cel.Type{model.URLType}, cel.StringType, + cel.UnaryBinding(getEscapedPath))}, + "getQuery": { + cel.MemberOverload("url_get_query", []*cel.Type{model.URLType}, + cel.MapType(cel.StringType, cel.ListType(cel.StringType)), + cel.UnaryBinding(getQuery))}, + "isURL": { + cel.Overload("is_url_string", []*cel.Type{cel.StringType}, cel.BoolType, + cel.UnaryBinding(isURL))}, } func (*urls) CompileOptions() []cel.EnvOption { - return []cel.EnvOption{ - cel.Declarations(urlLibraryDecls...), + options := []cel.EnvOption{} + for name, overloads := range urlLibraryDecls { + options = append(options, cel.Function(name, overloads...)) } + return options } func (*urls) ProgramOptions() []cel.ProgramOption { - return []cel.ProgramOption{ - cel.Functions( - &functions.Overload{ - Operator: "url", - Unary: stringToUrl, - }, - &functions.Overload{ - Operator: "string_to_url", - Unary: stringToUrl, - }, - &functions.Overload{ - Operator: "getScheme", - Unary: getScheme, - }, - &functions.Overload{ - Operator: "url_get_scheme", - Unary: getScheme, - }, - &functions.Overload{ - Operator: "getHost", - Unary: getHost, - }, - &functions.Overload{ - Operator: "url_get_host", - Unary: getHost, - }, - &functions.Overload{ - Operator: "getHostname", - Unary: getHostname, - }, - &functions.Overload{ - Operator: "url_get_hostname", - Unary: getHostname, - }, - &functions.Overload{ - Operator: "getPort", - Unary: getPort, - }, - &functions.Overload{ - Operator: "url_get_port", - Unary: getPort, - }, - &functions.Overload{ - Operator: "getEscapedPath", - Unary: getEscapedPath, - }, - &functions.Overload{ - Operator: "url_get_escaped_path", - Unary: getEscapedPath, - }, - &functions.Overload{ - Operator: "getQuery", - Unary: getQuery, - }, - &functions.Overload{ - Operator: "url_get_query", - Unary: getQuery, - }, - &functions.Overload{ - Operator: "isURL", - Unary: isURL, - }, - &functions.Overload{ - Operator: "is_url_string", - Unary: isURL, - }, - ), - } + return []cel.ProgramOption{} } func stringToUrl(arg ref.Val) ref.Val { diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/metrics/metrics.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/metrics/metrics.go new file mode 100644 index 000000000..3ddb76cdf --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/metrics/metrics.go @@ -0,0 +1,72 @@ +/* +Copyright 2022 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 metrics + +import ( + "time" + + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" +) + +// TODO(jiahuif) CEL is to be used in multiple components, revise naming when that happens. +const ( + namespace = "apiserver" + subsystem = "cel" +) + +// Metrics provides access to CEL metrics. +var Metrics = newCelMetrics() + +type CelMetrics struct { + compilationTime *metrics.Histogram + evaluationTime *metrics.Histogram +} + +func newCelMetrics() *CelMetrics { + m := &CelMetrics{ + compilationTime: metrics.NewHistogram(&metrics.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "compilation_duration_seconds", + StabilityLevel: metrics.ALPHA, + }), + evaluationTime: metrics.NewHistogram(&metrics.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "evaluation_duration_seconds", + StabilityLevel: metrics.ALPHA, + }), + } + + legacyregistry.MustRegister(m.compilationTime) + legacyregistry.MustRegister(m.evaluationTime) + + return m +} + +// ObserveCompilation records a CEL compilation with the time the compilation took. +func (m *CelMetrics) ObserveCompilation(elapsed time.Duration) { + seconds := elapsed.Seconds() + m.compilationTime.Observe(seconds) +} + +// ObserveEvaluation records a CEL evaluation with the time the evaluation took. +func (m *CelMetrics) ObserveEvaluation(elapsed time.Duration) { + seconds := elapsed.Seconds() + m.evaluationTime.Observe(seconds) +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/validation.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/validation.go index e3562b7c9..73fc451fd 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/validation.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/validation.go @@ -22,6 +22,7 @@ import ( "math" "reflect" "strings" + "time" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" @@ -29,6 +30,7 @@ import ( apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" + "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/metrics" "k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model" "k8s.io/apimachinery/pkg/util/validation/field" ) @@ -51,37 +53,71 @@ type Validator struct { // isResourceRoot is true if this validator node is for the root of a resource. Either the root of the // custom resource being validated, or the root of an XEmbeddedResource object. isResourceRoot bool + + // celActivationFactory produces an Activation, which resolves identifiers (e.g. self and + // oldSelf) to CEL values. + celActivationFactory func(sts *schema.Structural, obj, oldObj interface{}) interpreter.Activation } // NewValidator returns compiles all the CEL programs defined in x-kubernetes-validations extensions // of the Structural schema and returns a custom resource validator that contains nested // validators for all items, properties and additionalProperties that transitively contain validator rules. -// Returns nil only if there no validator rules in the Structural schema. May return a validator containing -// only errors. +// Returns nil if there are no validator rules in the Structural schema. May return a validator containing only errors. // Adding perCallLimit as input arg for testing purpose only. Callers should always use const PerCallLimit as input -func NewValidator(s *schema.Structural, perCallLimit uint64) *Validator { - return validator(s, true, perCallLimit) +func NewValidator(s *schema.Structural, isResourceRoot bool, perCallLimit uint64) *Validator { + if !hasXValidations(s) { + return nil + } + return validator(s, isResourceRoot, model.SchemaDeclType(s, isResourceRoot), perCallLimit) } -func validator(s *schema.Structural, isResourceRoot bool, perCallLimit uint64) *Validator { - compiledRules, err := Compile(s, isResourceRoot, perCallLimit) +// validator creates a Validator for all x-kubernetes-validations at the level of the provided schema and lower and +// returns the Validator if any x-kubernetes-validations exist in the schema, or nil if no x-kubernetes-validations +// exist. declType is expected to be a CEL DeclType corresponding to the structural schema. +func validator(s *schema.Structural, isResourceRoot bool, declType *model.DeclType, perCallLimit uint64) *Validator { + compiledRules, err := Compile(s, declType, perCallLimit) var itemsValidator, additionalPropertiesValidator *Validator var propertiesValidators map[string]Validator if s.Items != nil { - itemsValidator = validator(s.Items, s.Items.XEmbeddedResource, perCallLimit) + itemsValidator = validator(s.Items, s.Items.XEmbeddedResource, declType.ElemType, perCallLimit) } if len(s.Properties) > 0 { propertiesValidators = make(map[string]Validator, len(s.Properties)) - for k, prop := range s.Properties { - if p := validator(&prop, prop.XEmbeddedResource, perCallLimit); p != nil { + for k, p := range s.Properties { + prop := p + var fieldType *model.DeclType + if escapedPropName, ok := model.Escape(k); ok { + if f, ok := declType.Fields[escapedPropName]; ok { + fieldType = f.Type + } else { + // fields with unknown types are omitted from CEL validation entirely + continue + } + } else { + // field may be absent from declType if the property name is unescapable, in which case we should convert + // the field value type to a DeclType. + fieldType = model.SchemaDeclType(&prop, prop.XEmbeddedResource) + if fieldType == nil { + continue + } + } + if p := validator(&prop, prop.XEmbeddedResource, fieldType, perCallLimit); p != nil { propertiesValidators[k] = *p } } } if s.AdditionalProperties != nil && s.AdditionalProperties.Structural != nil { - additionalPropertiesValidator = validator(s.AdditionalProperties.Structural, s.AdditionalProperties.Structural.XEmbeddedResource, perCallLimit) + additionalPropertiesValidator = validator(s.AdditionalProperties.Structural, s.AdditionalProperties.Structural.XEmbeddedResource, declType.ElemType, perCallLimit) } if len(compiledRules) > 0 || err != nil || itemsValidator != nil || additionalPropertiesValidator != nil || len(propertiesValidators) > 0 { + var activationFactory func(*schema.Structural, interface{}, interface{}) interpreter.Activation = validationActivationWithoutOldSelf + for _, rule := range compiledRules { + if rule.TransitionRule { + activationFactory = validationActivationWithOldSelf + break + } + } + return &Validator{ compiledRules: compiledRules, compilationErr: err, @@ -89,6 +125,7 @@ func validator(s *schema.Structural, isResourceRoot bool, perCallLimit uint64) * Items: itemsValidator, AdditionalProperties: additionalPropertiesValidator, Properties: propertiesValidators, + celActivationFactory: activationFactory, } } @@ -100,6 +137,8 @@ func validator(s *schema.Structural, isResourceRoot bool, perCallLimit uint64) * // Most callers can ignore the returned remainingBudget value unless another validate call is going to be made // context is passed for supporting context cancellation during cel validation func (s *Validator) Validate(ctx context.Context, fldPath *field.Path, sts *schema.Structural, obj, oldObj interface{}, costBudget int64) (errs field.ErrorList, remainingBudget int64) { + t := time.Now() + defer metrics.Metrics.ObserveEvaluation(time.Since(t)) remainingBudget = costBudget if s == nil || obj == nil { return nil, remainingBudget @@ -131,7 +170,7 @@ func (s *Validator) validateExpressions(ctx context.Context, fldPath *field.Path if oldObj != nil { v := reflect.ValueOf(oldObj) switch v.Kind() { - case reflect.Map, reflect.Ptr, reflect.Interface, reflect.Slice: + case reflect.Map, reflect.Pointer, reflect.Interface, reflect.Slice: if v.IsNil() { oldObj = nil // +k8s:verify-mutation:reason=clone } @@ -159,7 +198,7 @@ func (s *Validator) validateExpressions(ctx context.Context, fldPath *field.Path if s.isResourceRoot { sts = model.WithTypeAndObjectMeta(sts) } - var activation interpreter.Activation = NewValidationActivation(obj, oldObj, sts) + activation := s.celActivationFactory(sts, obj, oldObj) for i, compiled := range s.compiledRules { rule := sts.XValidations[i] if compiled.Error != nil { @@ -231,17 +270,23 @@ type validationActivation struct { hasOldSelf bool } -func NewValidationActivation(obj, oldObj interface{}, structural *schema.Structural) *validationActivation { +func validationActivationWithOldSelf(sts *schema.Structural, obj, oldObj interface{}) interpreter.Activation { va := &validationActivation{ - self: UnstructuredToVal(obj, structural), + self: UnstructuredToVal(obj, sts), } if oldObj != nil { - va.oldSelf = UnstructuredToVal(oldObj, structural) // +k8s:verify-mutation:reason=clone - va.hasOldSelf = true // +k8s:verify-mutation:reason=clone + va.oldSelf = UnstructuredToVal(oldObj, sts) // +k8s:verify-mutation:reason=clone + va.hasOldSelf = true // +k8s:verify-mutation:reason=clone } return va } +func validationActivationWithoutOldSelf(sts *schema.Structural, obj, _ interface{}) interpreter.Activation { + return &validationActivation{ + self: UnstructuredToVal(obj, sts), + } +} + func (a *validationActivation) ResolveName(name string) (interface{}, bool) { switch name { case ScopedVarName: @@ -335,3 +380,26 @@ func MapIsCorrelatable(mapType *string) bool { // if a third map type is introduced, assume it's not correlatable. granular is the default if unspecified. return mapType == nil || *mapType == "granular" || *mapType == "atomic" } + +func hasXValidations(s *schema.Structural) bool { + if s == nil { + return false + } + if len(s.XValidations) > 0 { + return true + } + if hasXValidations(s.Items) { + return true + } + if s.AdditionalProperties != nil && hasXValidations(s.AdditionalProperties.Structural) { + return true + } + if s.Properties != nil { + for _, prop := range s.Properties { + if hasXValidations(&prop) { + return true + } + } + } + return false +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/values.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/values.go index 4fa90ab10..f012ffdc4 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/values.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/values.go @@ -84,7 +84,7 @@ func UnstructuredToVal(unstructured interface{}, schema *structuralschema.Struct }, } } - // A object with x-preserve-unknown-fields but no properties or additionalProperties is treated + // A object with x-kubernetes-preserve-unknown-fields but no properties or additionalProperties is treated // as an empty object. if schema.XPreserveUnknownFields { return &unstructuredMap{ diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/surroundingobject.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/surroundingobject.go index cb75c2b9f..fba2b75af 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/surroundingobject.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/surroundingobject.go @@ -34,8 +34,8 @@ type AccessorFunc func(obj map[string]interface{}) (x interface{}, found bool, e // // With obj, acc, _ := someSurroundingObjectFunc(x) we get: // -// acc(obj) == x -// reflect.DeepEqual(acc(DeepCopy(obj), x) == x +// acc(obj) == x +// reflect.DeepEqual(acc(DeepCopy(obj), x) == x // // where x is the original instance for slices and maps. // @@ -44,19 +44,19 @@ type AccessorFunc func(obj map[string]interface{}) (x interface{}, found bool, e // // Example (ignoring the last two return values): // -// NewRootObjectFunc()(x) == x -// NewRootObjectFunc().Index()(x) == [x] -// NewRootObjectFunc().Index().Child("foo") == [{"foo": x}] -// NewRootObjectFunc().Index().Child("foo").Child("bar") == [{"foo": {"bar":x}}] -// NewRootObjectFunc().Index().Child("foo").Child("bar").Index() == [{"foo": {"bar":[x]}}] +// NewRootObjectFunc()(x) == x +// NewRootObjectFunc().Index()(x) == [x] +// NewRootObjectFunc().Index().Child("foo") == [{"foo": x}] +// NewRootObjectFunc().Index().Child("foo").Child("bar") == [{"foo": {"bar":x}}] +// NewRootObjectFunc().Index().Child("foo").Child("bar").Index() == [{"foo": {"bar":[x]}}] // // and: // -// NewRootObjectFunc(), then acc(x) == x -// NewRootObjectFunc().Index(), then acc([x]) == x -// NewRootObjectFunc().Index().Child("foo"), then acc([{"foo": x}]) == x -// NewRootObjectFunc().Index().Child("foo").Child("bar"), then acc([{"foo": {"bar":x}}]) == x -// NewRootObjectFunc().Index().Child("foo").Child("bar").Index(), then acc([{"foo": {"bar":[x]}}]) == x +// NewRootObjectFunc(), then acc(x) == x +// NewRootObjectFunc().Index(), then acc([x]) == x +// NewRootObjectFunc().Index().Child("foo"), then acc([{"foo": x}]) == x +// NewRootObjectFunc().Index().Child("foo").Child("bar"), then acc([{"foo": {"bar":x}}]) == x +// NewRootObjectFunc().Index().Child("foo").Child("bar").Index(), then acc([{"foo": {"bar":[x]}}]) == x type SurroundingObjectFunc func(focus interface{}) (map[string]interface{}, AccessorFunc, error) // NewRootObjectFunc returns the identity function. The passed focus value diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/validation.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/validation.go index 40e1218c2..f89500b60 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/validation.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/validation.go @@ -70,6 +70,8 @@ func validate(ctx context.Context, pth *field.Path, s *structuralschema.Structur rootSchema = s } + isResourceRoot := s == rootSchema + if s.Default.Object != nil { validator := kubeopenapivalidate.NewSchemaValidator(s.ToKubeOpenAPI(), nil, "", strfmt.Default) @@ -89,7 +91,7 @@ func validate(ctx context.Context, pth *field.Path, s *structuralschema.Structur allErrs = append(allErrs, field.Invalid(pth.Child("default"), s.Default.Object, fmt.Sprintf("must result in valid metadata: %v", errs.ToAggregate()))) } else if errs := apiservervalidation.ValidateCustomResource(pth.Child("default"), s.Default.Object, validator); len(errs) > 0 { allErrs = append(allErrs, errs...) - } else if celValidator := cel.NewValidator(s, cel.PerCallLimit); celValidator != nil { + } else if celValidator := cel.NewValidator(s, isResourceRoot, cel.PerCallLimit); celValidator != nil { celErrs, rmCost := celValidator.Validate(ctx, pth.Child("default"), s, s.Default.Object, s.Default.Object, remainingCost) remainingCost = rmCost allErrs = append(allErrs, celErrs...) @@ -114,7 +116,7 @@ func validate(ctx context.Context, pth *field.Path, s *structuralschema.Structur allErrs = append(allErrs, errs...) } else if errs := apiservervalidation.ValidateCustomResource(pth.Child("default"), s.Default.Object, validator); len(errs) > 0 { allErrs = append(allErrs, errs...) - } else if celValidator := cel.NewValidator(s, cel.PerCallLimit); celValidator != nil { + } else if celValidator := cel.NewValidator(s, isResourceRoot, cel.PerCallLimit); celValidator != nil { celErrs, rmCost := celValidator.Validate(ctx, pth.Child("default"), s, s.Default.Object, s.Default.Object, remainingCost) remainingCost = rmCost allErrs = append(allErrs, celErrs...) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/algorithm.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/algorithm.go index 4cd32c129..811c38377 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/algorithm.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/algorithm.go @@ -17,15 +17,34 @@ limitations under the License. package objectmeta import ( + "sort" + structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/validation/field" ) +// CoerceOptions gives the ability to ReturnUnknownFieldPaths for fields +// unrecognized by the schema or DropInvalidFields for fields that are a part +// of the schema, but are malformed. +type CoerceOptions struct { + // DropInvalidFields discards malformed serialized metadata fields that + // cannot be successfully decoded to the corresponding ObjectMeta field. + // This only applies to fields that are recognized as part of the schema, + // but of an invalid type (i.e. cause an error when unmarshaling, rather + // than being dropped or causing a strictErr). + DropInvalidFields bool + // ReturnUnknownFieldPaths will return the paths to fields that are not + // recognized as part of the schema. + ReturnUnknownFieldPaths bool +} + // Coerce checks types of embedded ObjectMeta and TypeMeta and prunes unknown fields inside the former. // It does coerce ObjectMeta and TypeMeta at the root if isResourceRoot is true. -// If dropInvalidFields is true, fields of wrong type will be dropped. -func Coerce(pth *field.Path, obj interface{}, s *structuralschema.Structural, isResourceRoot, dropInvalidFields bool) *field.Error { +// If opts.ReturnUnknownFieldPaths is true, it will return the paths of any fields that are not a part of the +// schema that are dropped when unmarshaling. +// If opts.DropInvalidFields is true, fields of wrong type will be dropped. +func CoerceWithOptions(pth *field.Path, obj interface{}, s *structuralschema.Structural, isResourceRoot bool, opts CoerceOptions) (*field.Error, []string) { if isResourceRoot { if s == nil { s = &structuralschema.Structural{} @@ -36,36 +55,57 @@ func Coerce(pth *field.Path, obj interface{}, s *structuralschema.Structural, is s = &clone } } - c := coercer{dropInvalidFields: dropInvalidFields} - return c.coerce(pth, obj, s) + c := coercer{DropInvalidFields: opts.DropInvalidFields, ReturnUnknownFieldPaths: opts.ReturnUnknownFieldPaths} + schemaOpts := &structuralschema.UnknownFieldPathOptions{ + TrackUnknownFieldPaths: opts.ReturnUnknownFieldPaths, + } + fieldErr := c.coerce(pth, obj, s, schemaOpts) + sort.Strings(schemaOpts.UnknownFieldPaths) + return fieldErr, schemaOpts.UnknownFieldPaths +} + +// Coerce calls CoerceWithOptions without returning unknown field paths. +func Coerce(pth *field.Path, obj interface{}, s *structuralschema.Structural, isResourceRoot, dropInvalidFields bool) *field.Error { + fieldErr, _ := CoerceWithOptions(pth, obj, s, isResourceRoot, CoerceOptions{DropInvalidFields: dropInvalidFields}) + return fieldErr } type coercer struct { - dropInvalidFields bool + DropInvalidFields bool + ReturnUnknownFieldPaths bool } -func (c *coercer) coerce(pth *field.Path, x interface{}, s *structuralschema.Structural) *field.Error { +func (c *coercer) coerce(pth *field.Path, x interface{}, s *structuralschema.Structural, opts *structuralschema.UnknownFieldPathOptions) *field.Error { if s == nil { return nil } + origPathLen := len(opts.ParentPath) + defer func() { + opts.ParentPath = opts.ParentPath[:origPathLen] + }() switch x := x.(type) { case map[string]interface{}: for k, v := range x { if s.XEmbeddedResource { switch k { case "apiVersion", "kind": - if _, ok := v.(string); !ok && c.dropInvalidFields { + if _, ok := v.(string); !ok && c.DropInvalidFields { delete(x, k) } else if !ok { return field.Invalid(pth.Child(k), v, "must be a string") } case "metadata": - meta, found, err := GetObjectMeta(x, c.dropInvalidFields) + meta, found, unknownFields, err := GetObjectMetaWithOptions(x, ObjectMetaOptions{ + DropMalformedFields: c.DropInvalidFields, + ReturnUnknownFieldPaths: c.ReturnUnknownFieldPaths, + ParentPath: pth, + }) + opts.UnknownFieldPaths = append(opts.UnknownFieldPaths, unknownFields...) if err != nil { - if !c.dropInvalidFields { + if !c.DropInvalidFields { return field.Invalid(pth.Child("metadata"), v, err.Error()) } - // pass through on error if dropInvalidFields is true + // pass through on error if DropInvalidFields is true } else if found { if err := SetObjectMeta(x, meta); err != nil { return field.Invalid(pth.Child("metadata"), v, err.Error()) @@ -78,20 +118,26 @@ func (c *coercer) coerce(pth *field.Path, x interface{}, s *structuralschema.Str } prop, ok := s.Properties[k] if ok { - if err := c.coerce(pth.Child(k), v, &prop); err != nil { + opts.AppendKey(k) + if err := c.coerce(pth.Child(k), v, &prop, opts); err != nil { return err } + opts.ParentPath = opts.ParentPath[:origPathLen] } else if s.AdditionalProperties != nil { - if err := c.coerce(pth.Key(k), v, s.AdditionalProperties.Structural); err != nil { + opts.AppendKey(k) + if err := c.coerce(pth.Key(k), v, s.AdditionalProperties.Structural, opts); err != nil { return err } + opts.ParentPath = opts.ParentPath[:origPathLen] } } case []interface{}: for i, v := range x { - if err := c.coerce(pth.Index(i), v, s.Items); err != nil { + opts.AppendIndex(i) + if err := c.coerce(pth.Index(i), v, s.Items, opts); err != nil { return err } + opts.ParentPath = opts.ParentPath[:origPathLen] } default: // scalars, do nothing diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/coerce.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/coerce.go index d9c486c37..42b968b8a 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/coerce.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/coerce.go @@ -23,35 +23,83 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" utiljson "k8s.io/apimachinery/pkg/util/json" + "k8s.io/apimachinery/pkg/util/validation/field" + kjson "sigs.k8s.io/json" ) -// GetObjectMeta does conversion of JSON to ObjectMeta. It first tries json.Unmarshal into a metav1.ObjectMeta -// type. If that does not work and dropMalformedFields is true, it does field-by-field best-effort conversion -// throwing away fields which lead to errors. +// GetObjectMeta calls GetObjectMetaWithOptions without returning unknown field paths. func GetObjectMeta(obj map[string]interface{}, dropMalformedFields bool) (*metav1.ObjectMeta, bool, error) { + meta, found, _, err := GetObjectMetaWithOptions(obj, ObjectMetaOptions{ + DropMalformedFields: dropMalformedFields, + }) + return meta, found, err +} + +// ObjectMetaOptions provides the options for how GetObjectMeta should retrieve the object meta. +type ObjectMetaOptions struct { + // DropMalformedFields discards malformed serialized metadata fields that + // cannot be successfully decoded to the corresponding ObjectMeta field. + // This only applies to fields that are recognized as part of the schema, + // but of an invalid type (i.e. cause an error when unmarshaling, rather + // than being dropped or causing a strictErr). + DropMalformedFields bool + // ReturnUnknownFieldPaths will return the paths to fields that are not + // recognized as part of the schema. + ReturnUnknownFieldPaths bool + // ParentPath provides the current path up to the given ObjectMeta. + // If nil, the metadata is assumed to be at the root of the object. + ParentPath *field.Path +} + +// GetObjectMetaWithOptions does conversion of JSON to ObjectMeta. +// It first tries json.Unmarshal into a metav1.ObjectMeta +// type. If that does not work and opts.DropMalformedFields is true, it does field-by-field best-effort conversion +// throwing away fields which lead to errors. +// If opts.ReturnedUnknownFields is true, it will UnmarshalStrict instead, returning the paths of any unknown fields +// it encounters (i.e. paths returned as strict errs from UnmarshalStrict) +func GetObjectMetaWithOptions(obj map[string]interface{}, opts ObjectMetaOptions) (*metav1.ObjectMeta, bool, []string, error) { metadata, found := obj["metadata"] if !found { - return nil, false, nil + return nil, false, nil, nil } // round-trip through JSON first, hoping that unmarshalling just works objectMeta := &metav1.ObjectMeta{} metadataBytes, err := utiljson.Marshal(metadata) if err != nil { - return nil, false, err + return nil, false, nil, err } - if err = utiljson.Unmarshal(metadataBytes, objectMeta); err == nil { - // if successful, return - return objectMeta, true, nil + var unmarshalErr error + if opts.ReturnUnknownFieldPaths { + var strictErrs []error + strictErrs, unmarshalErr = kjson.UnmarshalStrict(metadataBytes, objectMeta) + if unmarshalErr == nil { + if len(strictErrs) > 0 { + unknownPaths := []string{} + prefix := opts.ParentPath.Child("metadata").String() + for _, err := range strictErrs { + if fieldPathErr, ok := err.(kjson.FieldError); ok { + unknownPaths = append(unknownPaths, prefix+"."+fieldPathErr.FieldPath()) + } + } + return objectMeta, true, unknownPaths, nil + } + return objectMeta, true, nil, nil + } + } else { + if unmarshalErr = utiljson.Unmarshal(metadataBytes, objectMeta); unmarshalErr == nil { + // if successful, return + return objectMeta, true, nil, nil + } } - if !dropMalformedFields { + if !opts.DropMalformedFields { // if we're not trying to drop malformed fields, return the error - return nil, true, err + return nil, true, nil, unmarshalErr } metadataMap, ok := metadata.(map[string]interface{}) if !ok { - return nil, false, fmt.Errorf("invalid metadata: expected object, got %T", metadata) + return nil, false, nil, fmt.Errorf("invalid metadata: expected object, got %T", metadata) } // Go field by field accumulating into the metadata object. @@ -59,18 +107,31 @@ func GetObjectMeta(obj map[string]interface{}, dropMalformedFields bool) (*metav // each iteration preserving the old key-values. accumulatedObjectMeta := &metav1.ObjectMeta{} testObjectMeta := &metav1.ObjectMeta{} + var unknownFields []string for k, v := range metadataMap { // serialize a single field if singleFieldBytes, err := utiljson.Marshal(map[string]interface{}{k: v}); err == nil { // do a test unmarshal if utiljson.Unmarshal(singleFieldBytes, testObjectMeta) == nil { // if that succeeds, unmarshal for real - utiljson.Unmarshal(singleFieldBytes, accumulatedObjectMeta) + if opts.ReturnUnknownFieldPaths { + strictErrs, _ := kjson.UnmarshalStrict(singleFieldBytes, accumulatedObjectMeta) + if len(strictErrs) > 0 { + prefix := opts.ParentPath.Child("metadata").String() + for _, err := range strictErrs { + if fieldPathErr, ok := err.(kjson.FieldError); ok { + unknownFields = append(unknownFields, prefix+"."+fieldPathErr.FieldPath()) + } + } + } + } else { + utiljson.Unmarshal(singleFieldBytes, accumulatedObjectMeta) + } } } } - return accumulatedObjectMeta, true, nil + return accumulatedObjectMeta, true, unknownFields, nil } // SetObjectMeta writes back ObjectMeta into a JSON data structure. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/options.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/options.go new file mode 100644 index 000000000..547e59175 --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/options.go @@ -0,0 +1,67 @@ +/* +Copyright 2022 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 schema + +import ( + "strconv" + "strings" +) + +// UnknownFieldPathOptions allow for tracking paths to unknown fields. +type UnknownFieldPathOptions struct { + // TrackUnknownFieldPaths determines whether or not unknown field + // paths should be stored or not. + TrackUnknownFieldPaths bool + // ParentPath builds the path to unknown fields as the object + // is recursively traversed. + ParentPath []string + // UnknownFieldPaths is the list of all unknown fields identified. + UnknownFieldPaths []string +} + +// RecordUnknownFields adds a path to an unknown field to the +// record of UnknownFieldPaths, if TrackUnknownFieldPaths is true +func (o *UnknownFieldPathOptions) RecordUnknownField(field string) { + if !o.TrackUnknownFieldPaths { + return + } + l := len(o.ParentPath) + o.AppendKey(field) + o.UnknownFieldPaths = append(o.UnknownFieldPaths, strings.Join(o.ParentPath, "")) + o.ParentPath = o.ParentPath[:l] +} + +// AppendKey adds a key (i.e. field) to the current parent +// path, if TrackUnknownFieldPaths is true. +func (o *UnknownFieldPathOptions) AppendKey(key string) { + if !o.TrackUnknownFieldPaths { + return + } + if len(o.ParentPath) > 0 { + o.ParentPath = append(o.ParentPath, ".") + } + o.ParentPath = append(o.ParentPath, key) +} + +// AppendIndex adds an index to the most recent field of +// the current parent path, if TrackUnknownFieldPaths is true. +func (o *UnknownFieldPathOptions) AppendIndex(index int) { + if !o.TrackUnknownFieldPaths { + return + } + o.ParentPath = append(o.ParentPath, "[", strconv.Itoa(index), "]") +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/algorithm.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/algorithm.go index b2b1bf81f..a929e5252 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/algorithm.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/algorithm.go @@ -18,37 +18,15 @@ package pruning import ( "sort" - "strconv" - "strings" structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" ) -// PruneOptions sets options for pruning -// unknown fields -type PruneOptions struct { - // parentPath collects the path that the pruning - // takes as it traverses the object. - // It is used to report the full path to any unknown - // fields that the pruning encounters. - // It is only populated if ReturnPruned is true. - parentPath []string - - // prunedPaths collects pruned field paths resulting from - // calls to recordPrunedKey. - // It is only populated if ReturnPruned is true. - prunedPaths []string - - // ReturnPruned defines whether we want to track the - // fields that are pruned - ReturnPruned bool -} - // PruneWithOptions removes object fields in obj which are not specified in s. It skips TypeMeta // and ObjectMeta fields if XEmbeddedResource is set to true, or for the root if isResourceRoot=true, // i.e. it does not prune unknown metadata fields. -// It returns the set of fields that it prunes if opts.ReturnPruned is true -func PruneWithOptions(obj interface{}, s *structuralschema.Structural, isResourceRoot bool, opts PruneOptions) []string { +// It returns the set of fields that it prunes if opts.TrackUnknownFieldPaths is true +func PruneWithOptions(obj interface{}, s *structuralschema.Structural, isResourceRoot bool, opts structuralschema.UnknownFieldPathOptions) []string { if isResourceRoot { if s == nil { s = &structuralschema.Structural{} @@ -60,14 +38,14 @@ func PruneWithOptions(obj interface{}, s *structuralschema.Structural, isResourc } } prune(obj, s, &opts) - sort.Strings(opts.prunedPaths) - return opts.prunedPaths + sort.Strings(opts.UnknownFieldPaths) + return opts.UnknownFieldPaths } // Prune is equivalent to -// PruneWithOptions(obj, s, isResourceRoot, PruneOptions{}) +// PruneWithOptions(obj, s, isResourceRoot, structuralschema.UnknownFieldPathOptions{}) func Prune(obj interface{}, s *structuralschema.Structural, isResourceRoot bool) { - PruneWithOptions(obj, s, isResourceRoot, PruneOptions{}) + PruneWithOptions(obj, s, isResourceRoot, structuralschema.UnknownFieldPathOptions{}) } var metaFields = map[string]bool{ @@ -76,48 +54,21 @@ var metaFields = map[string]bool{ "metadata": true, } -func (p *PruneOptions) recordPrunedKey(key string) { - if !p.ReturnPruned { - return - } - l := len(p.parentPath) - p.appendKey(key) - p.prunedPaths = append(p.prunedPaths, strings.Join(p.parentPath, "")) - p.parentPath = p.parentPath[:l] -} - -func (p *PruneOptions) appendKey(key string) { - if !p.ReturnPruned { - return - } - if len(p.parentPath) > 0 { - p.parentPath = append(p.parentPath, ".") - } - p.parentPath = append(p.parentPath, key) -} - -func (p *PruneOptions) appendIndex(index int) { - if !p.ReturnPruned { - return - } - p.parentPath = append(p.parentPath, "[", strconv.Itoa(index), "]") -} - -func prune(x interface{}, s *structuralschema.Structural, opts *PruneOptions) { +func prune(x interface{}, s *structuralschema.Structural, opts *structuralschema.UnknownFieldPathOptions) { if s != nil && s.XPreserveUnknownFields { skipPrune(x, s, opts) return } - origPathLen := len(opts.parentPath) + origPathLen := len(opts.ParentPath) defer func() { - opts.parentPath = opts.parentPath[:origPathLen] + opts.ParentPath = opts.ParentPath[:origPathLen] }() switch x := x.(type) { case map[string]interface{}: if s == nil { for k := range x { - opts.recordPrunedKey(k) + opts.RecordUnknownField(k) delete(x, k) } return @@ -128,16 +79,16 @@ func prune(x interface{}, s *structuralschema.Structural, opts *PruneOptions) { } prop, ok := s.Properties[k] if ok { - opts.appendKey(k) + opts.AppendKey(k) prune(v, &prop, opts) - opts.parentPath = opts.parentPath[:origPathLen] + opts.ParentPath = opts.ParentPath[:origPathLen] } else if s.AdditionalProperties != nil { - opts.appendKey(k) + opts.AppendKey(k) prune(v, s.AdditionalProperties.Structural, opts) - opts.parentPath = opts.parentPath[:origPathLen] + opts.ParentPath = opts.ParentPath[:origPathLen] } else { - if !metaFields[k] || len(opts.parentPath) > 0 { - opts.recordPrunedKey(k) + if !metaFields[k] || len(opts.ParentPath) > 0 { + opts.RecordUnknownField(k) } delete(x, k) } @@ -145,29 +96,29 @@ func prune(x interface{}, s *structuralschema.Structural, opts *PruneOptions) { case []interface{}: if s == nil { for i, v := range x { - opts.appendIndex(i) + opts.AppendIndex(i) prune(v, nil, opts) - opts.parentPath = opts.parentPath[:origPathLen] + opts.ParentPath = opts.ParentPath[:origPathLen] } return } for i, v := range x { - opts.appendIndex(i) + opts.AppendIndex(i) prune(v, s.Items, opts) - opts.parentPath = opts.parentPath[:origPathLen] + opts.ParentPath = opts.ParentPath[:origPathLen] } default: // scalars, do nothing } } -func skipPrune(x interface{}, s *structuralschema.Structural, opts *PruneOptions) { +func skipPrune(x interface{}, s *structuralschema.Structural, opts *structuralschema.UnknownFieldPathOptions) { if s == nil { return } - origPathLen := len(opts.parentPath) + origPathLen := len(opts.ParentPath) defer func() { - opts.parentPath = opts.parentPath[:origPathLen] + opts.ParentPath = opts.ParentPath[:origPathLen] }() switch x := x.(type) { @@ -177,20 +128,20 @@ func skipPrune(x interface{}, s *structuralschema.Structural, opts *PruneOptions continue } if prop, ok := s.Properties[k]; ok { - opts.appendKey(k) + opts.AppendKey(k) prune(v, &prop, opts) - opts.parentPath = opts.parentPath[:origPathLen] + opts.ParentPath = opts.ParentPath[:origPathLen] } else if s.AdditionalProperties != nil { - opts.appendKey(k) + opts.AppendKey(k) prune(v, s.AdditionalProperties.Structural, opts) - opts.parentPath = opts.parentPath[:origPathLen] + opts.ParentPath = opts.ParentPath[:origPathLen] } } case []interface{}: for i, v := range x { - opts.appendIndex(i) + opts.AppendIndex(i) skipPrune(v, s.Items, opts) - opts.parentPath = opts.parentPath[:origPathLen] + opts.ParentPath = opts.ParentPath[:origPathLen] } default: // scalars, do nothing diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation.go index e2966341a..f7f29e70c 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation.go @@ -48,14 +48,14 @@ const ( // * RawExtension: for every schema with `x-kubernetes-embedded-resource: true`, `x-kubernetes-preserve-unknown-fields: true` and `type: object` are set // * IntOrString: for `x-kubernetes-int-or-string: true` either `type` is empty under `anyOf` and `allOf` or the schema structure is one of these: // -// 1) anyOf: -// - type: integer -// - type: string -// 2) allOf: -// - anyOf: -// - type: integer -// - type: string -// - ... zero or more +// 1. anyOf: +// - type: integer +// - type: string +// 2. allOf: +// - anyOf: +// - type: integer +// - type: string +// - ... zero or more // // * every specified field or array in s is also specified outside of value validation. // * metadata at the root can only restrict the name and generateName, and not be specified at all in nested contexts. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/register.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/register.go index 144c20666..25fca9917 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/register.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/register.go @@ -39,14 +39,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // AddToScheme adds all types of this clientset into the given scheme. This allows composition // of clientsets, like in: // -// import ( -// "k8s.io/client-go/kubernetes" -// clientsetscheme "k8s.io/client-go/kubernetes/scheme" -// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" -// ) +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) // -// kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. diff --git a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/escaping.go b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/escaping.go index 2f841b58b..60571202d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/escaping.go +++ b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/escaping.go @@ -36,6 +36,57 @@ var celReservedSymbols = sets.NewString( // expandMatcher matches the escape sequence, characters that are escaped, and characters that are unsupported var expandMatcher = regexp.MustCompile(`(__|[-./]|[^a-zA-Z0-9-./_])`) +// newCharacterFilter returns a boolean array to indicate the allowed characters +func newCharacterFilter(characters string) []bool { + maxChar := 0 + for _, c := range characters { + if maxChar < int(c) { + maxChar = int(c) + } + } + filter := make([]bool, maxChar+1) + + for _, c := range characters { + filter[int(c)] = true + } + + return filter +} + +type escapeCheck struct { + canSkipRegex bool + invalidCharFound bool +} + +// skipRegexCheck checks if escape would be skipped. +// if invalidCharFound is true, it must have invalid character; if invalidCharFound is false, not sure if it has invalid character or not +func skipRegexCheck(ident string) escapeCheck { + escapeCheck := escapeCheck{canSkipRegex: true, invalidCharFound: false} + // skip escape if possible + previous_underscore := false + for _, c := range ident { + if c == '/' || c == '-' || c == '.' { + escapeCheck.canSkipRegex = false + return escapeCheck + } + intc := int(c) + if intc < 0 || intc >= len(validCharacterFilter) || !validCharacterFilter[intc] { + escapeCheck.invalidCharFound = true + return escapeCheck + } + if c == '_' && previous_underscore { + escapeCheck.canSkipRegex = false + return escapeCheck + } + + previous_underscore = c == '_' + } + return escapeCheck +} + +// validCharacterFilter indicates the allowed characters. +var validCharacterFilter = newCharacterFilter("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_") + // Escape escapes ident and returns a CEL identifier (of the form '[a-zA-Z_][a-zA-Z0-9_]*'), or returns // false if the ident does not match the supported input format of `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*`. // Escaping Rules: @@ -53,6 +104,15 @@ func Escape(ident string) (string, bool) { if celReservedSymbols.Has(ident) { return "__" + ident + "__", true } + + escapeCheck := skipRegexCheck(ident) + if escapeCheck.invalidCharFound { + return "", false + } + if escapeCheck.canSkipRegex { + return ident, true + } + ok := true ident = expandMatcher.ReplaceAllStringFunc(ident, func(s string) string { switch s { diff --git a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/schemas.go b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/schemas.go index b6a92a938..0a907519b 100644 --- a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/schemas.go +++ b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/schemas.go @@ -17,7 +17,7 @@ package model import ( "time" - "github.com/google/cel-go/checker/decls" + "github.com/google/cel-go/cel" "github.com/google/cel-go/common/types" "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" @@ -44,6 +44,12 @@ const ( // RFC 3339 datetimes require a full date (YYYY-MM-DD) and full time (HH:MM:SS), and we add 3 for // quotation marks like always in addition to the capital T that separates the date and time minDatetimeSizeJSON = 21 + // "" + minStringSize = 2 + // true + minBoolSize = 4 + // 0 + minNumberSize = 1 ) // SchemaDeclType converts the structural schema to a CEL declaration, or returns nil if the @@ -72,8 +78,8 @@ func SchemaDeclType(s *schema.Structural, isResourceRoot bool) *DeclType { // To validate requirements on both the int and string representation: // `type(intOrStringField) == int ? intOrStringField < 5 : double(intOrStringField.replace('%', '')) < 0.5 // - dyn := newSimpleType("dyn", decls.Dyn, nil) - // handle x-kubernetes-int-or-string by returning the max length of the largest possible string + dyn := newSimpleTypeWithMinSize("dyn", cel.DynType, nil, 1) // smallest value for a serialied x-kubernetes-int-or-string is 0 + // handle x-kubernetes-int-or-string by returning the max length/min serialized size of the largest possible string dyn.MaxElements = maxRequestSizeBytes - 2 return dyn } @@ -92,15 +98,16 @@ func SchemaDeclType(s *schema.Structural, isResourceRoot bool) *DeclType { case "array": if s.Items != nil { itemsType := SchemaDeclType(s.Items, s.Items.XEmbeddedResource) + if itemsType == nil { + return nil + } var maxItems int64 if s.ValueValidation != nil && s.ValueValidation.MaxItems != nil { maxItems = zeroIfNegative(*s.ValueValidation.MaxItems) } else { - maxItems = estimateMaxArrayItemsPerRequest(s.Items) - } - if itemsType != nil { - return NewListType(itemsType, maxItems) + maxItems = estimateMaxArrayItemsFromMinSize(itemsType.MinSerializedSize) } + return NewListType(itemsType, maxItems) } return nil case "object": @@ -111,7 +118,7 @@ func SchemaDeclType(s *schema.Structural, isResourceRoot bool) *DeclType { if s.ValueValidation != nil && s.ValueValidation.MaxProperties != nil { maxProperties = zeroIfNegative(*s.ValueValidation.MaxProperties) } else { - maxProperties = estimateMaxAdditionalPropertiesPerRequest(s.AdditionalProperties.Structural) + maxProperties = estimateMaxAdditionalPropertiesFromMinSize(propsType.MinSerializedSize) } return NewMapType(StringType, propsType, maxProperties) } @@ -125,6 +132,8 @@ func SchemaDeclType(s *schema.Structural, isResourceRoot bool) *DeclType { required[f] = true } } + // an object will always be serialized at least as {}, so account for that + minSerializedSize := int64(2) for name, prop := range s.Properties { var enumValues []interface{} if prop.ValueValidation != nil { @@ -142,14 +151,23 @@ func SchemaDeclType(s *schema.Structural, isResourceRoot bool) *DeclType { enumValues: enumValues, // Enum values are represented as strings in CEL } } + // the min serialized size for an object is 2 (for {}) plus the min size of all its required + // properties + // only include required properties without a default value; default values are filled in + // server-side + if required[name] && prop.Default.Object == nil { + minSerializedSize += int64(len(name)) + fieldType.MinSerializedSize + 4 + } } } - return NewObjectType("object", fields) + objType := NewObjectType("object", fields) + objType.MinSerializedSize = minSerializedSize + return objType case "string": if s.ValueValidation != nil { switch s.ValueValidation.Format { case "byte": - byteWithMaxLength := newSimpleType("bytes", decls.Bytes, types.Bytes([]byte{})) + byteWithMaxLength := newSimpleTypeWithMinSize("bytes", cel.BytesType, types.Bytes([]byte{}), minStringSize) if s.ValueValidation.MaxLength != nil { byteWithMaxLength.MaxElements = zeroIfNegative(*s.ValueValidation.MaxLength) } else { @@ -157,16 +175,20 @@ func SchemaDeclType(s *schema.Structural, isResourceRoot bool) *DeclType { } return byteWithMaxLength case "duration": - durationWithMaxLength := newSimpleType("duration", decls.Duration, types.Duration{Duration: time.Duration(0)}) + durationWithMaxLength := newSimpleTypeWithMinSize("duration", cel.DurationType, types.Duration{Duration: time.Duration(0)}, int64(minDurationSizeJSON)) durationWithMaxLength.MaxElements = estimateMaxStringLengthPerRequest(s) return durationWithMaxLength - case "date", "date-time": - timestampWithMaxLength := newSimpleType("timestamp", decls.Timestamp, types.Timestamp{Time: time.Time{}}) + case "date": + timestampWithMaxLength := newSimpleTypeWithMinSize("timestamp", cel.TimestampType, types.Timestamp{Time: time.Time{}}, int64(dateSizeJSON)) + timestampWithMaxLength.MaxElements = estimateMaxStringLengthPerRequest(s) + return timestampWithMaxLength + case "date-time": + timestampWithMaxLength := newSimpleTypeWithMinSize("timestamp", cel.TimestampType, types.Timestamp{Time: time.Time{}}, int64(minDatetimeSizeJSON)) timestampWithMaxLength.MaxElements = estimateMaxStringLengthPerRequest(s) return timestampWithMaxLength } } - strWithMaxLength := newSimpleType("string", decls.String, types.String("")) + strWithMaxLength := newSimpleTypeWithMinSize("string", cel.StringType, types.String(""), minStringSize) if s.ValueValidation != nil && s.ValueValidation.MaxLength != nil { // multiply the user-provided max length by 4 in the case of an otherwise-untyped string // we do this because the OpenAPIv3 spec indicates that maxLength is specified in runes/code points, @@ -230,81 +252,17 @@ func WithTypeAndObjectMeta(s *schema.Structural) *schema.Structural { return result } -// MaxCardinality returns the maximum number of times data conforming to the schema could possibly exist in +// MaxCardinality returns the maximum number of times data conforming to the minimum size given could possibly exist in // an object serialized to JSON. For cases where a schema is contained under map or array schemas of unbounded // size, this can be used as an estimate as the worst case number of times data matching the schema could be repeated. // Note that this only assumes a single comma between data elements, so if the schema is contained under only maps, -// this estimates a higher cardinality that would be possible. -func MaxCardinality(s *schema.Structural) uint64 { - sz := estimateMinSizeJSON(s) + 1 // assume at least one comma between elements +// this estimates a higher cardinality that would be possible. DeclType.MinSerializedSize is meant to be passed to +// this function. +func MaxCardinality(minSize int64) uint64 { + sz := minSize + 1 // assume at least one comma between elements return uint64(maxRequestSizeBytes / sz) } -// estimateMinSizeJSON estimates the minimum size in bytes of the given schema when serialized in JSON. -// minLength/minProperties/minItems are not currently taken into account, so if these limits are set the -// minimum size might be higher than what estimateMinSizeJSON returns. -func estimateMinSizeJSON(s *schema.Structural) int64 { - if s == nil { - // minimum valid JSON token has length 1 (single-digit number like `0`) - return 1 - } - switch s.Type { - case "boolean": - // true - return 4 - case "number", "integer": - // 0 - return 1 - case "string": - if s.ValueValidation != nil { - switch s.ValueValidation.Format { - case "duration": - return minDurationSizeJSON - case "date": - return dateSizeJSON - case "date-time": - return minDatetimeSizeJSON - } - } - // "" - return 2 - case "array": - // [] - return 2 - case "object": - // {} - objSize := int64(2) - // exclude optional fields since the request can omit them - if s.ValueValidation != nil { - for _, propName := range s.ValueValidation.Required { - if prop, ok := s.Properties[propName]; ok { - if prop.Default.Object != nil { - // exclude fields with a default, those are filled in server-side - continue - } - // add 4, 2 for quotations around the property name, 1 for the colon, and 1 for a comma - objSize += int64(len(propName)) + estimateMinSizeJSON(&prop) + 4 - } - } - } - return objSize - } - if s.XIntOrString { - // 0 - return 1 - } - // this code should be unreachable, so return the safest possible value considering this can be used as - // a divisor - return 1 -} - -// estimateMaxArrayItemsPerRequest estimates the maximum number of array items with -// the provided schema that can fit into a single request. -func estimateMaxArrayItemsPerRequest(itemSchema *schema.Structural) int64 { - // subtract 2 to account for [ and ] - return (maxRequestSizeBytes - 2) / (estimateMinSizeJSON(itemSchema) + 1) -} - // estimateMaxStringLengthPerRequest estimates the maximum string length (in characters) // of a string compatible with the format requirements in the provided schema. // must only be called on schemas of type "string" or x-kubernetes-int-or-string: true @@ -326,12 +284,19 @@ func estimateMaxStringLengthPerRequest(s *schema.Structural) int64 { } } +// estimateMaxArrayItemsPerRequest estimates the maximum number of array items with +// the provided minimum serialized size that can fit into a single request. +func estimateMaxArrayItemsFromMinSize(minSize int64) int64 { + // subtract 2 to account for [ and ] + return (maxRequestSizeBytes - 2) / (minSize + 1) +} + // estimateMaxAdditionalPropertiesPerRequest estimates the maximum number of additional properties -// with the provided schema that can fit into a single request. -func estimateMaxAdditionalPropertiesPerRequest(additionalPropertiesSchema *schema.Structural) int64 { +// with the provided minimum serialized size that can fit into a single request. +func estimateMaxAdditionalPropertiesFromMinSize(minSize int64) int64 { // 2 bytes for key + "" + colon + comma + smallest possible value, realistically the actual keys // will all vary in length - keyValuePairSize := estimateMinSizeJSON(additionalPropertiesSchema) + 6 + keyValuePairSize := minSize + 6 // subtract 2 to account for { and } return (maxRequestSizeBytes - 2) / keyValuePairSize } diff --git a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/types.go b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/types.go index 2f0a5b59d..7c77a3247 100644 --- a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/types.go +++ b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/types.go @@ -20,15 +20,12 @@ import ( "time" "github.com/google/cel-go/cel" - "github.com/google/cel-go/checker/decls" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/common/types/traits" exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" "google.golang.org/protobuf/proto" - - "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" ) const ( @@ -41,8 +38,11 @@ func NewListType(elem *DeclType, maxItems int64) *DeclType { name: "list", ElemType: elem, MaxElements: maxItems, - exprType: decls.NewListType(elem.ExprType()), + celType: cel.ListType(elem.CelType()), defaultValue: NewListValue(), + // a list can always be represented as [] in JSON, so hardcode the min size + // to 2 + MinSerializedSize: 2, } } @@ -53,8 +53,11 @@ func NewMapType(key, elem *DeclType, maxProperties int64) *DeclType { KeyType: key, ElemType: elem, MaxElements: maxProperties, - exprType: decls.NewMapType(key.ExprType(), elem.ExprType()), + celType: cel.MapType(key.CelType(), elem.CelType()), defaultValue: NewMapValue(), + // a map can always be represented as {} in JSON, so hardcode the min size + // to 2 + MinSerializedSize: 2, } } @@ -63,40 +66,23 @@ func NewObjectType(name string, fields map[string]*DeclField) *DeclType { t := &DeclType{ name: name, Fields: fields, - exprType: decls.NewObjectType(name), + celType: cel.ObjectType(name), traitMask: traits.FieldTesterType | traits.IndexerType, + // an object could potentially be larger than the min size we default to here ({}), + // but we rely upon the caller to change MinSerializedSize accordingly if they add + // properties to the object + MinSerializedSize: 2, } t.defaultValue = NewObjectValue(t) return t } -// NewObjectTypeRef returns a reference to an object type by name -func NewObjectTypeRef(name string) *DeclType { - t := &DeclType{ - name: name, - exprType: decls.NewObjectType(name), - traitMask: traits.FieldTesterType | traits.IndexerType, - } - return t -} - -// NewTypeParam creates a type parameter type with a simple name. -// -// Type parameters are resolved at compilation time to concrete types, or CEL 'dyn' type if no -// type assignment can be inferred. -func NewTypeParam(name string) *DeclType { - return &DeclType{ - name: name, - TypeParam: true, - exprType: decls.NewTypeParamType(name), - } -} - -func newSimpleType(name string, exprType *exprpb.Type, zeroVal ref.Val) *DeclType { +func newSimpleTypeWithMinSize(name string, celType *cel.Type, zeroVal ref.Val, minSize int64) *DeclType { return &DeclType{ - name: name, - exprType: exprType, + name: name, + celType: celType, defaultValue: zeroVal, + MinSerializedSize: minSize, } } @@ -104,15 +90,19 @@ func newSimpleType(name string, exprType *exprpb.Type, zeroVal ref.Val) *DeclTyp type DeclType struct { fmt.Stringer - name string + name string + // Fields contains a map of escaped CEL identifier field names to field declarations. Fields map[string]*DeclField KeyType *DeclType ElemType *DeclType TypeParam bool Metadata map[string]string MaxElements int64 + // MinSerializedSize represents the smallest possible size in bytes that + // the DeclType could be serialized to in JSON. + MinSerializedSize int64 - exprType *exprpb.Type + celType *cel.Type traitMask int defaultValue ref.Val } @@ -151,15 +141,16 @@ func (t *DeclType) MaybeAssignTypeName(name string) *DeclType { return t } return &DeclType{ - name: name, - Fields: fieldMap, - KeyType: t.KeyType, - ElemType: t.ElemType, - TypeParam: t.TypeParam, - Metadata: t.Metadata, - exprType: decls.NewObjectType(name), - traitMask: t.traitMask, - defaultValue: t.defaultValue, + name: name, + Fields: fieldMap, + KeyType: t.KeyType, + ElemType: t.ElemType, + TypeParam: t.TypeParam, + Metadata: t.Metadata, + celType: cel.ObjectType(name), + traitMask: t.traitMask, + defaultValue: t.defaultValue, + MinSerializedSize: t.MinSerializedSize, } } if t.IsMap() { @@ -182,8 +173,13 @@ func (t *DeclType) MaybeAssignTypeName(name string) *DeclType { } // ExprType returns the CEL expression type of this declaration. -func (t *DeclType) ExprType() *exprpb.Type { - return t.exprType +func (t *DeclType) ExprType() (*exprpb.Type, error) { + return cel.TypeToExprType(t.celType) +} + +// CelType returns the CEL type of this declaration. +func (t *DeclType) CelType() *cel.Type { + return t.celType } // FindField returns the DeclField with the given name if present. @@ -313,14 +309,13 @@ func (f *DeclField) EnumValues() []ref.Val { // NewRuleTypes returns an Open API Schema-based type-system which is CEL compatible. func NewRuleTypes(kind string, - schema *schema.Structural, - isResourceRoot bool, + declType *DeclType, res Resolver) (*RuleTypes, error) { // Note, if the schema indicates that it's actually based on another proto // then prefer the proto definition. For expressions in the proto, a new field // annotation will be needed to indicate the expected environment and type of // the expression. - schemaTypes, err := newSchemaTypeProvider(kind, schema, isResourceRoot) + schemaTypes, err := newSchemaTypeProvider(kind, declType) if err != nil { return nil, err } @@ -328,7 +323,6 @@ func NewRuleTypes(kind string, return nil, nil } return &RuleTypes{ - Schema: schema, ruleSchemaDeclTypes: schemaTypes, resolver: res, }, nil @@ -338,7 +332,6 @@ func NewRuleTypes(kind string, // type-system. type RuleTypes struct { ref.TypeProvider - Schema *schema.Structural ruleSchemaDeclTypes *schemaTypeProvider typeAdapter ref.TypeAdapter resolver Resolver @@ -363,13 +356,16 @@ func (rt *RuleTypes) EnvOptions(tp ref.TypeProvider) ([]cel.EnvOption, error) { rtWithTypes := &RuleTypes{ TypeProvider: tp, typeAdapter: ta, - Schema: rt.Schema, ruleSchemaDeclTypes: rt.ruleSchemaDeclTypes, resolver: rt.resolver, } for name, declType := range rt.ruleSchemaDeclTypes.types { tpType, found := tp.FindType(name) - if found && !proto.Equal(tpType, declType.ExprType()) { + expT, err := declType.ExprType() + if err != nil { + return nil, fmt.Errorf("fail to get cel type: %s", err) + } + if found && !proto.Equal(tpType, expT) { return nil, fmt.Errorf( "type %s definition differs between CEL environment and rule", name) } @@ -377,9 +373,7 @@ func (rt *RuleTypes) EnvOptions(tp ref.TypeProvider) ([]cel.EnvOption, error) { return []cel.EnvOption{ cel.CustomTypeProvider(rtWithTypes), cel.CustomTypeAdapter(rtWithTypes), - cel.Declarations( - decls.NewVar("rule", rt.ruleSchemaDeclTypes.root.ExprType()), - ), + cel.Variable("rule", rt.ruleSchemaDeclTypes.root.CelType()), }, nil } @@ -396,7 +390,11 @@ func (rt *RuleTypes) FindType(typeName string) (*exprpb.Type, bool) { } declType, found := rt.findDeclType(typeName) if found { - return declType.ExprType(), found + expT, err := declType.ExprType() + if err != nil { + return expT, false + } + return expT, found } return rt.TypeProvider.FindType(typeName) } @@ -424,15 +422,23 @@ func (rt *RuleTypes) FindFieldType(typeName, fieldName string) (*ref.FieldType, f, found := st.Fields[fieldName] if found { ft := f.Type + expT, err := ft.ExprType() + if err != nil { + return nil, false + } return &ref.FieldType{ - Type: ft.ExprType(), + Type: expT, }, true } // This could be a dynamic map. if st.IsMap() { et := st.ElemType + expT, err := et.ExprType() + if err != nil { + return nil, false + } return &ref.FieldType{ - Type: et.ExprType(), + Type: expT, }, true } return nil, false @@ -496,12 +502,11 @@ func (rt *RuleTypes) convertToCustomType(dyn *DynValue, declType *DeclType) *Dyn } } -func newSchemaTypeProvider(kind string, schema *schema.Structural, isResourceRoot bool) (*schemaTypeProvider, error) { - delType := SchemaDeclType(schema, isResourceRoot) - if delType == nil { +func newSchemaTypeProvider(kind string, declType *DeclType) (*schemaTypeProvider, error) { + if declType == nil { return nil, nil } - root := delType.MaybeAssignTypeName(kind) + root := declType.MaybeAssignTypeName(kind) types := FieldTypeMap(kind, root) return &schemaTypeProvider{ root: root, @@ -517,42 +522,44 @@ type schemaTypeProvider struct { var ( // AnyType is equivalent to the CEL 'protobuf.Any' type in that the value may have any of the // types supported. - AnyType = newSimpleType("any", decls.Any, nil) + AnyType = newSimpleTypeWithMinSize("any", cel.AnyType, nil, 1) // BoolType is equivalent to the CEL 'bool' type. - BoolType = newSimpleType("bool", decls.Bool, types.False) + BoolType = newSimpleTypeWithMinSize("bool", cel.BoolType, types.False, minBoolSize) // BytesType is equivalent to the CEL 'bytes' type. - BytesType = newSimpleType("bytes", decls.Bytes, types.Bytes([]byte{})) + BytesType = newSimpleTypeWithMinSize("bytes", cel.BytesType, types.Bytes([]byte{}), minStringSize) // DoubleType is equivalent to the CEL 'double' type which is a 64-bit floating point value. - DoubleType = newSimpleType("double", decls.Double, types.Double(0)) + DoubleType = newSimpleTypeWithMinSize("double", cel.DoubleType, types.Double(0), minNumberSize) // DurationType is equivalent to the CEL 'duration' type. - DurationType = newSimpleType("duration", decls.Duration, types.Duration{Duration: time.Duration(0)}) + DurationType = newSimpleTypeWithMinSize("duration", cel.DurationType, types.Duration{Duration: time.Duration(0)}, minDurationSizeJSON) // DateType is equivalent to the CEL 'date' type. - DateType = newSimpleType("date", decls.Timestamp, types.Timestamp{Time: time.Time{}}) + DateType = newSimpleTypeWithMinSize("date", cel.TimestampType, types.Timestamp{Time: time.Time{}}, dateSizeJSON) // DynType is the equivalent of the CEL 'dyn' concept which indicates that the type will be // determined at runtime rather than compile time. - DynType = newSimpleType("dyn", decls.Dyn, nil) + DynType = newSimpleTypeWithMinSize("dyn", cel.DynType, nil, 1) // IntType is equivalent to the CEL 'int' type which is a 64-bit signed int. - IntType = newSimpleType("int", decls.Int, types.IntZero) + IntType = newSimpleTypeWithMinSize("int", cel.IntType, types.IntZero, minNumberSize) // NullType is equivalent to the CEL 'null_type'. - NullType = newSimpleType("null_type", decls.Null, types.NullValue) + NullType = newSimpleTypeWithMinSize("null_type", cel.NullType, types.NullValue, 4) // StringType is equivalent to the CEL 'string' type which is expected to be a UTF-8 string. // StringType values may either be string literals or expression strings. - StringType = newSimpleType("string", decls.String, types.String("")) + StringType = newSimpleTypeWithMinSize("string", cel.StringType, types.String(""), minStringSize) // TimestampType corresponds to the well-known protobuf.Timestamp type supported within CEL. - TimestampType = newSimpleType("timestamp", decls.Timestamp, types.Timestamp{Time: time.Time{}}) + // Note that both the OpenAPI date and date-time types map onto TimestampType, so not all types + // labeled as Timestamp will necessarily have the same MinSerializedSize. + TimestampType = newSimpleTypeWithMinSize("timestamp", cel.TimestampType, types.Timestamp{Time: time.Time{}}, dateSizeJSON) // UintType is equivalent to the CEL 'uint' type. - UintType = newSimpleType("uint", decls.Uint, types.Uint(0)) + UintType = newSimpleTypeWithMinSize("uint", cel.UintType, types.Uint(0), 1) // ListType is equivalent to the CEL 'list' type. ListType = NewListType(AnyType, noMaxLength) diff --git a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/url.go b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/url.go index 34d2d0eab..5e2eba7e3 100644 --- a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/url.go +++ b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/url.go @@ -19,6 +19,7 @@ import ( "net/url" "reflect" + "github.com/google/cel-go/cel" "github.com/google/cel-go/checker/decls" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" @@ -32,6 +33,7 @@ type URL struct { var ( URLObject = decls.NewObjectType("kubernetes.URL") typeValue = types.NewTypeValue("kubernetes.URL") + URLType = cel.ObjectType("kubernetes.URL") ) // ConvertToNative implements ref.Val.ConvertToNative. diff --git a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/value.go b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/value.go index eb827893b..9a537aba9 100644 --- a/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/value.go +++ b/vendor/k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model/value.go @@ -200,17 +200,17 @@ func (sv *structValue) AddField(field *Field) { func (sv *structValue) ConvertToNative(typeDesc reflect.Type) (interface{}, error) { if typeDesc.Kind() != reflect.Map && typeDesc.Kind() != reflect.Struct && - typeDesc.Kind() != reflect.Ptr && + typeDesc.Kind() != reflect.Pointer && typeDesc.Kind() != reflect.Interface { return nil, fmt.Errorf("type conversion error from object to '%v'", typeDesc) } // Unwrap pointers, but track their use. isPtr := false - if typeDesc.Kind() == reflect.Ptr { + if typeDesc.Kind() == reflect.Pointer { tk := typeDesc typeDesc = typeDesc.Elem() - if typeDesc.Kind() == reflect.Ptr { + if typeDesc.Kind() == reflect.Pointer { return nil, fmt.Errorf("unsupported type conversion to '%v'", tk) } isPtr = true @@ -766,4 +766,4 @@ func celBool(pred bool) ref.Val { return types.False } -var unknownType = &DeclType{name: "unknown"} +var unknownType = &DeclType{name: "unknown", MinSerializedSize: 1} diff --git a/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go b/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go index fab187a6a..57e0e71f6 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go +++ b/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go @@ -87,21 +87,21 @@ func (e *StatusError) DebugError() (string, []interface{}) { // HasStatusCause returns true if the provided error has a details cause // with the provided type name. +// It supports wrapped errors and returns false when the error is nil. func HasStatusCause(err error, name metav1.CauseType) bool { _, ok := StatusCause(err, name) return ok } // StatusCause returns the named cause from the provided error if it exists and -// the error is of the type APIStatus. Otherwise it returns false. +// the error unwraps to the type APIStatus. Otherwise it returns false. func StatusCause(err error, name metav1.CauseType) (metav1.StatusCause, bool) { - apierr, ok := err.(APIStatus) - if !ok || apierr == nil || apierr.Status().Details == nil { - return metav1.StatusCause{}, false - } - for _, cause := range apierr.Status().Details.Causes { - if cause.Type == name { - return cause, true + status, ok := err.(APIStatus) + if (ok || errors.As(err, &status)) && status.Status().Details != nil { + for _, cause := range status.Status().Details.Causes { + if cause.Type == name { + return cause, true + } } } return metav1.StatusCause{}, false @@ -757,7 +757,8 @@ func IsRequestEntityTooLargeError(err error) bool { // and may be the result of another HTTP actor. // It supports wrapped errors and returns false when the error is nil. func IsUnexpectedServerError(err error) bool { - if status := APIStatus(nil); errors.As(err, &status) && status.Status().Details != nil { + status, ok := err.(APIStatus) + if (ok || errors.As(err, &status)) && status.Status().Details != nil { for _, cause := range status.Status().Details.Causes { if cause.Type == metav1.CauseTypeUnexpectedServerResponse { return true @@ -770,8 +771,8 @@ func IsUnexpectedServerError(err error) bool { // IsUnexpectedObjectError determines if err is due to an unexpected object from the master. // It supports wrapped errors and returns false when the error is nil. func IsUnexpectedObjectError(err error) bool { - uoe := &UnexpectedObjectError{} - return err != nil && errors.As(err, &uoe) + uoe, ok := err.(*UnexpectedObjectError) + return err != nil && (ok || errors.As(err, &uoe)) } // SuggestsClientDelay returns true if this error suggests a client delay as well as the @@ -780,7 +781,8 @@ func IsUnexpectedObjectError(err error) bool { // request delay without retry. // It supports wrapped errors and returns false when the error is nil. func SuggestsClientDelay(err error) (int, bool) { - if t := APIStatus(nil); errors.As(err, &t) && t.Status().Details != nil { + t, ok := err.(APIStatus) + if (ok || errors.As(err, &t)) && t.Status().Details != nil { switch t.Status().Reason { // this StatusReason explicitly requests the caller to delay the action case metav1.StatusReasonServerTimeout: @@ -798,14 +800,14 @@ func SuggestsClientDelay(err error) (int, bool) { // It supports wrapped errors and returns StatusReasonUnknown when // the error is nil or doesn't have a status. func ReasonForError(err error) metav1.StatusReason { - if status := APIStatus(nil); errors.As(err, &status) { + if status, ok := err.(APIStatus); ok || errors.As(err, &status) { return status.Status().Reason } return metav1.StatusReasonUnknown } func reasonAndCodeForError(err error) (metav1.StatusReason, int32) { - if status := APIStatus(nil); errors.As(err, &status) { + if status, ok := err.(APIStatus); ok || errors.As(err, &status) { return status.Status().Reason, status.Status().Code } return metav1.StatusReasonUnknown, 0 diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/conditions.go b/vendor/k8s.io/apimachinery/pkg/api/meta/conditions.go index 00874f89c..60c8209de 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/conditions.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/conditions.go @@ -24,9 +24,9 @@ import ( // SetStatusCondition sets the corresponding condition in conditions to newCondition. // conditions must be non-nil. -// 1. if the condition of the specified type already exists (all fields of the existing condition are updated to -// newCondition, LastTransitionTime is set to now if the new status differs from the old status) -// 2. if a condition of the specified type does not exist (LastTransitionTime is set to now() if unset, and newCondition is appended) +// 1. if the condition of the specified type already exists (all fields of the existing condition are updated to +// newCondition, LastTransitionTime is set to now if the new status differs from the old status) +// 2. if a condition of the specified type does not exist (LastTransitionTime is set to now() if unset, and newCondition is appended) func SetStatusCondition(conditions *[]metav1.Condition, newCondition metav1.Condition) { if conditions == nil { return diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/help.go b/vendor/k8s.io/apimachinery/pkg/api/meta/help.go index 50468b533..899d3e8a6 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/help.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/help.go @@ -40,7 +40,8 @@ var ( // IsListType returns true if the provided Object has a slice called Items. // TODO: Replace the code in this check with an interface comparison by -// creating and enforcing that lists implement a list accessor. +// +// creating and enforcing that lists implement a list accessor. func IsListType(obj runtime.Object) bool { switch t := obj.(type) { case runtime.Unstructured: @@ -97,7 +98,7 @@ func getItemsPtr(list runtime.Object) (interface{}, error) { return nil, errExpectFieldItems } switch items.Kind() { - case reflect.Interface, reflect.Ptr: + case reflect.Interface, reflect.Pointer: target := reflect.TypeOf(items.Interface()).Elem() if target.Kind() != reflect.Slice { return nil, errExpectSliceItems @@ -130,7 +131,7 @@ func EachListItem(obj runtime.Object, fn func(runtime.Object) error) error { return nil } takeAddr := false - if elemType := items.Type().Elem(); elemType.Kind() != reflect.Ptr && elemType.Kind() != reflect.Interface { + if elemType := items.Type().Elem(); elemType.Kind() != reflect.Pointer && elemType.Kind() != reflect.Interface { if !items.Index(0).CanAddr() { return fmt.Errorf("unable to take address of items in %T for EachListItem", obj) } diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go b/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go index 81403393f..2551f07f5 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go @@ -130,7 +130,6 @@ func AsPartialObjectMetadata(m metav1.Object) *metav1.PartialObjectMetadata { Annotations: m.GetAnnotations(), OwnerReferences: m.GetOwnerReferences(), Finalizers: m.GetFinalizers(), - ZZZ_DeprecatedClusterName: m.GetZZZ_DeprecatedClusterName(), ManagedFields: m.GetManagedFields(), }, } @@ -600,7 +599,7 @@ func (a genericAccessor) SetFinalizers(finalizers []string) { func (a genericAccessor) GetOwnerReferences() []metav1.OwnerReference { var ret []metav1.OwnerReference s := a.ownerReferences - if s.Kind() != reflect.Ptr || s.Elem().Kind() != reflect.Slice { + if s.Kind() != reflect.Pointer || s.Elem().Kind() != reflect.Slice { klog.Errorf("expect %v to be a pointer to slice", s) return ret } @@ -618,7 +617,7 @@ func (a genericAccessor) GetOwnerReferences() []metav1.OwnerReference { func (a genericAccessor) SetOwnerReferences(references []metav1.OwnerReference) { s := a.ownerReferences - if s.Kind() != reflect.Ptr || s.Elem().Kind() != reflect.Slice { + if s.Kind() != reflect.Pointer || s.Elem().Kind() != reflect.Slice { klog.Errorf("expect %v to be a pointer to slice", s) } s = s.Elem() diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto index 79abc0ff5..ddd0db8fb 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto @@ -30,8 +30,11 @@ option go_package = "k8s.io/apimachinery/pkg/api/resource"; // // The serialization format is: // +// ``` // ::= -// (Note that may be empty, from the "" case in .) +// +// (Note that may be empty, from the "" case in .) +// // ::= 0 | 1 | ... | 9 // ::= | // ::= | . | . | . @@ -39,10 +42,15 @@ option go_package = "k8s.io/apimachinery/pkg/api/resource"; // ::= | // ::= | | // ::= Ki | Mi | Gi | Ti | Pi | Ei -// (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html) +// +// (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html) +// // ::= m | "" | k | M | G | T | P | E -// (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.) +// +// (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.) +// // ::= "e" | "E" +// ``` // // No matter which of the three exponent forms is used, no quantity may represent // a number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal @@ -56,14 +64,17 @@ option go_package = "k8s.io/apimachinery/pkg/api/resource"; // Before serializing, Quantity will be put in "canonical form". // This means that Exponent/suffix will be adjusted up or down (with a // corresponding increase or decrease in Mantissa) such that: -// a. No precision is lost -// b. No fractional digits will be emitted -// c. The exponent (or suffix) is as large as possible. +// +// - No precision is lost +// - No fractional digits will be emitted +// - The exponent (or suffix) is as large as possible. +// // The sign will be omitted unless the number is negative. // // Examples: -// 1.5 will be serialized as "1500m" -// 1.5Gi will be serialized as "1536Mi" +// +// - 1.5 will be serialized as "1500m" +// - 1.5Gi will be serialized as "1536Mi" // // Note that the quantity will NEVER be internally represented by a // floating point number. That is the whole point of this exercise. diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go index 1ca31d8ca..b47d554b3 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go @@ -34,8 +34,11 @@ import ( // // The serialization format is: // +// ``` // ::= -// (Note that may be empty, from the "" case in .) +// +// (Note that may be empty, from the "" case in .) +// // ::= 0 | 1 | ... | 9 // ::= | // ::= | . | . | . @@ -43,10 +46,15 @@ import ( // ::= | // ::= | | // ::= Ki | Mi | Gi | Ti | Pi | Ei -// (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html) +// +// (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html) +// // ::= m | "" | k | M | G | T | P | E -// (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.) +// +// (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.) +// // ::= "e" | "E" +// ``` // // No matter which of the three exponent forms is used, no quantity may represent // a number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal @@ -60,14 +68,17 @@ import ( // Before serializing, Quantity will be put in "canonical form". // This means that Exponent/suffix will be adjusted up or down (with a // corresponding increase or decrease in Mantissa) such that: -// a. No precision is lost -// b. No fractional digits will be emitted -// c. The exponent (or suffix) is as large as possible. +// +// - No precision is lost +// - No fractional digits will be emitted +// - The exponent (or suffix) is as large as possible. +// // The sign will be omitted unless the number is negative. // // Examples: -// 1.5 will be serialized as "1500m" -// 1.5Gi will be serialized as "1536Mi" +// +// - 1.5 will be serialized as "1500m" +// - 1.5Gi will be serialized as "1536Mi" // // Note that the quantity will NEVER be internally represented by a // floating point number. That is the whole point of this exercise. @@ -404,10 +415,10 @@ func (Quantity) OpenAPIV3OneOfTypes() []string { return []string{"string", "numb // CanonicalizeBytes returns the canonical form of q and its suffix (see comment on Quantity). // // Note about BinarySI: -// * If q.Format is set to BinarySI and q.Amount represents a non-zero value between -// -1 and +1, it will be emitted as if q.Format were DecimalSI. -// * Otherwise, if q.Format is set to BinarySI, fractional parts of q.Amount will be -// rounded up. (1.1i becomes 2i.) +// - If q.Format is set to BinarySI and q.Amount represents a non-zero value between +// -1 and +1, it will be emitted as if q.Format were DecimalSI. +// - Otherwise, if q.Format is set to BinarySI, fractional parts of q.Amount will be +// rounded up. (1.1i becomes 2i.) func (q *Quantity) CanonicalizeBytes(out []byte) (result, suffix []byte) { if q.IsZero() { return zeroBytes, nil @@ -643,7 +654,7 @@ func (q Quantity) MarshalJSON() ([]byte, error) { copy(out[1:], q.s) return out, nil } - result := make([]byte, int64QuantityExpectedBytes, int64QuantityExpectedBytes) + result := make([]byte, int64QuantityExpectedBytes) result[0] = '"' number, suffix := q.CanonicalizeBytes(result[1:1]) // if the same slice was returned to us that we passed in, avoid another allocation by copying number into diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/suffix.go b/vendor/k8s.io/apimachinery/pkg/api/resource/suffix.go index 5ed7abe66..6ec527f9c 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/suffix.go +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/suffix.go @@ -165,7 +165,7 @@ func (sh *suffixHandler) constructBytes(base, exponent int32, format Format) (s if exponent == 0 { return nil, true } - result := make([]byte, 8, 8) + result := make([]byte, 8) result[0] = 'e' number := strconv.AppendInt(result[1:1], int64(exponent), 10) if &result[1] == &number[0] { diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go index 9a1fe0731..7c1c69054 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go +++ b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go @@ -40,13 +40,11 @@ var BannedOwners = map[schema.GroupVersionKind]struct{}{ {Group: "", Version: "v1", Kind: "Event"}: {}, } -// ValidateZZZ_DeprecatedClusterName can be used to check whether the given cluster name is valid. -var ValidateZZZ_DeprecatedClusterName = NameIsDNS1035Label - // ValidateAnnotations validates that a set of annotations are correctly defined. func ValidateAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} for k := range annotations { + // The rule is QualifiedName except that case doesn't matter, so convert to lowercase before checking. for _, msg := range validation.IsQualifiedName(strings.ToLower(k)) { allErrs = append(allErrs, field.Invalid(fldPath, k, msg)) } @@ -184,11 +182,6 @@ func ValidateObjectMetaAccessor(meta metav1.Object, requiresNamespace bool, name allErrs = append(allErrs, field.Forbidden(fldPath.Child("namespace"), "not allowed on this type")) } } - if len(meta.GetZZZ_DeprecatedClusterName()) != 0 { - for _, msg := range ValidateZZZ_DeprecatedClusterName(meta.GetZZZ_DeprecatedClusterName(), false) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("clusterName"), meta.GetZZZ_DeprecatedClusterName(), msg)) - } - } allErrs = append(allErrs, ValidateNonnegativeField(meta.GetGeneration(), fldPath.Child("generation"))...) allErrs = append(allErrs, v1validation.ValidateLabels(meta.GetLabels(), fldPath.Child("labels"))...) @@ -261,7 +254,6 @@ func ValidateObjectMetaAccessorUpdate(newMeta, oldMeta metav1.Object, fldPath *f allErrs = append(allErrs, ValidateImmutableField(newMeta.GetCreationTimestamp(), oldMeta.GetCreationTimestamp(), fldPath.Child("creationTimestamp"))...) allErrs = append(allErrs, ValidateImmutableField(newMeta.GetDeletionTimestamp(), oldMeta.GetDeletionTimestamp(), fldPath.Child("deletionTimestamp"))...) allErrs = append(allErrs, ValidateImmutableField(newMeta.GetDeletionGracePeriodSeconds(), oldMeta.GetDeletionGracePeriodSeconds(), fldPath.Child("deletionGracePeriodSeconds"))...) - allErrs = append(allErrs, ValidateImmutableField(newMeta.GetZZZ_DeprecatedClusterName(), oldMeta.GetZZZ_DeprecatedClusterName(), fldPath.Child("clusterName"))...) allErrs = append(allErrs, v1validation.ValidateLabels(newMeta.GetLabels(), fldPath.Child("labels"))...) allErrs = append(allErrs, ValidateAnnotations(newMeta.GetAnnotations(), fldPath.Child("annotations"))...) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go index 6e5f5e61b..7e00eb7d9 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go @@ -1326,187 +1326,185 @@ func init() { } var fileDescriptor_cf52fa777ced5367 = []byte{ - // 2879 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3a, 0xcd, 0x6f, 0x24, 0x47, - 0xbd, 0xee, 0x19, 0x8f, 0x3d, 0xf3, 0x1b, 0x8f, 0x3f, 0x6a, 0xbd, 0xef, 0xcd, 0xfa, 0xe9, 0x79, - 0x9c, 0x4e, 0x14, 0x6d, 0xde, 0x4b, 0xc6, 0xd9, 0x25, 0x44, 0x9b, 0x0d, 0x09, 0x78, 0x3c, 0xeb, - 0x8d, 0x93, 0x75, 0x6c, 0x95, 0x77, 0x17, 0x58, 0x22, 0x48, 0xbb, 0xbb, 0x3c, 0x6e, 0xdc, 0xd3, - 0x3d, 0xa9, 0xea, 0xf1, 0x66, 0xe0, 0x40, 0x0e, 0x20, 0x82, 0x84, 0xa2, 0x70, 0xe3, 0x84, 0x12, - 0xc1, 0x1f, 0x80, 0xb8, 0xc0, 0x1f, 0x80, 0x44, 0x8e, 0x41, 0x5c, 0x22, 0x81, 0x46, 0x89, 0x39, - 0x70, 0x44, 0x5c, 0x7d, 0x01, 0xd5, 0x47, 0x77, 0x57, 0xcf, 0xc7, 0xba, 0x27, 0xbb, 0x44, 0xdc, - 0xa6, 0x7f, 0xdf, 0x55, 0xf5, 0xab, 0xdf, 0x57, 0x0d, 0xec, 0x1c, 0x5f, 0x63, 0x75, 0x37, 0x58, - 0x3f, 0xee, 0x1e, 0x10, 0xea, 0x93, 0x90, 0xb0, 0xf5, 0x13, 0xe2, 0x3b, 0x01, 0x5d, 0x57, 0x08, - 0xab, 0xe3, 0xb6, 0x2d, 0xfb, 0xc8, 0xf5, 0x09, 0xed, 0xad, 0x77, 0x8e, 0x5b, 0x1c, 0xc0, 0xd6, - 0xdb, 0x24, 0xb4, 0xd6, 0x4f, 0xae, 0xac, 0xb7, 0x88, 0x4f, 0xa8, 0x15, 0x12, 0xa7, 0xde, 0xa1, - 0x41, 0x18, 0xa0, 0x27, 0x24, 0x57, 0x5d, 0xe7, 0xaa, 0x77, 0x8e, 0x5b, 0x1c, 0xc0, 0xea, 0x9c, - 0xab, 0x7e, 0x72, 0x65, 0xe5, 0x99, 0x96, 0x1b, 0x1e, 0x75, 0x0f, 0xea, 0x76, 0xd0, 0x5e, 0x6f, - 0x05, 0xad, 0x60, 0x5d, 0x30, 0x1f, 0x74, 0x0f, 0xc5, 0x97, 0xf8, 0x10, 0xbf, 0xa4, 0xd0, 0x95, - 0xb1, 0xa6, 0xd0, 0xae, 0x1f, 0xba, 0x6d, 0x32, 0x68, 0xc5, 0xca, 0xf3, 0xe7, 0x31, 0x30, 0xfb, - 0x88, 0xb4, 0xad, 0x41, 0x3e, 0xf3, 0x0f, 0x79, 0x28, 0x6e, 0xec, 0x6d, 0xdf, 0xa4, 0x41, 0xb7, - 0x83, 0xd6, 0x60, 0xda, 0xb7, 0xda, 0xa4, 0x6a, 0xac, 0x19, 0x97, 0x4b, 0x8d, 0xb9, 0x8f, 0xfa, - 0xb5, 0xa9, 0xd3, 0x7e, 0x6d, 0xfa, 0x75, 0xab, 0x4d, 0xb0, 0xc0, 0x20, 0x0f, 0x8a, 0x27, 0x84, - 0x32, 0x37, 0xf0, 0x59, 0x35, 0xb7, 0x96, 0xbf, 0x5c, 0xbe, 0xfa, 0x72, 0x3d, 0xcb, 0xfa, 0xeb, - 0x42, 0xc1, 0x5d, 0xc9, 0xba, 0x15, 0xd0, 0xa6, 0xcb, 0xec, 0xe0, 0x84, 0xd0, 0x5e, 0x63, 0x51, - 0x69, 0x29, 0x2a, 0x24, 0xc3, 0xb1, 0x06, 0xf4, 0x43, 0x03, 0x16, 0x3b, 0x94, 0x1c, 0x12, 0x4a, - 0x89, 0xa3, 0xf0, 0xd5, 0xfc, 0x9a, 0xf1, 0x08, 0xd4, 0x56, 0x95, 0xda, 0xc5, 0xbd, 0x01, 0xf9, - 0x78, 0x48, 0x23, 0xfa, 0xa5, 0x01, 0x2b, 0x8c, 0xd0, 0x13, 0x42, 0x37, 0x1c, 0x87, 0x12, 0xc6, - 0x1a, 0xbd, 0x4d, 0xcf, 0x25, 0x7e, 0xb8, 0xb9, 0xdd, 0xc4, 0xac, 0x3a, 0x2d, 0xf6, 0xe1, 0xab, - 0xd9, 0x0c, 0xda, 0x1f, 0x27, 0xa7, 0x61, 0x2a, 0x8b, 0x56, 0xc6, 0x92, 0x30, 0xfc, 0x00, 0x33, - 0xcc, 0x43, 0x98, 0x8b, 0x0e, 0xf2, 0x96, 0xcb, 0x42, 0x74, 0x17, 0x66, 0x5a, 0xfc, 0x83, 0x55, - 0x0d, 0x61, 0x60, 0x3d, 0x9b, 0x81, 0x91, 0x8c, 0xc6, 0xbc, 0xb2, 0x67, 0x46, 0x7c, 0x32, 0xac, - 0xa4, 0x99, 0x3f, 0x99, 0x86, 0xf2, 0xc6, 0xde, 0x36, 0x26, 0x2c, 0xe8, 0x52, 0x9b, 0x64, 0x70, - 0x9a, 0x6b, 0x30, 0xc7, 0x5c, 0xbf, 0xd5, 0xf5, 0x2c, 0xca, 0xa1, 0xd5, 0x19, 0x41, 0xb9, 0xac, - 0x28, 0xe7, 0xf6, 0x35, 0x1c, 0x4e, 0x51, 0xa2, 0xab, 0x00, 0x5c, 0x02, 0xeb, 0x58, 0x36, 0x71, - 0xaa, 0xb9, 0x35, 0xe3, 0x72, 0xb1, 0x81, 0x14, 0x1f, 0xbc, 0x1e, 0x63, 0xb0, 0x46, 0x85, 0x1e, - 0x87, 0x82, 0xb0, 0xb4, 0x5a, 0x14, 0x6a, 0x2a, 0x8a, 0xbc, 0x20, 0x96, 0x81, 0x25, 0x0e, 0x3d, - 0x05, 0xb3, 0xca, 0xcb, 0xaa, 0x25, 0x41, 0xb6, 0xa0, 0xc8, 0x66, 0x23, 0x37, 0x88, 0xf0, 0x7c, - 0x7d, 0xc7, 0xae, 0xef, 0x08, 0xbf, 0xd3, 0xd6, 0xf7, 0x9a, 0xeb, 0x3b, 0x58, 0x60, 0xd0, 0x2d, - 0x28, 0x9c, 0x10, 0x7a, 0xc0, 0x3d, 0x81, 0xbb, 0xe6, 0xff, 0x67, 0xdb, 0xe8, 0xbb, 0x9c, 0xa5, - 0x51, 0xe2, 0xa6, 0x89, 0x9f, 0x58, 0x0a, 0x41, 0x75, 0x00, 0x76, 0x14, 0xd0, 0x50, 0x2c, 0xaf, - 0x5a, 0x58, 0xcb, 0x5f, 0x2e, 0x35, 0xe6, 0xf9, 0x7a, 0xf7, 0x63, 0x28, 0xd6, 0x28, 0x38, 0xbd, - 0x6d, 0x85, 0xa4, 0x15, 0x50, 0x97, 0xb0, 0xea, 0x6c, 0x42, 0xbf, 0x19, 0x43, 0xb1, 0x46, 0x81, - 0x5e, 0x05, 0xc4, 0xc2, 0x80, 0x5a, 0x2d, 0xa2, 0x96, 0xfa, 0x8a, 0xc5, 0x8e, 0xaa, 0x20, 0x56, - 0xb7, 0xa2, 0x56, 0x87, 0xf6, 0x87, 0x28, 0xf0, 0x08, 0x2e, 0xf3, 0x37, 0x06, 0x2c, 0x68, 0xbe, - 0x20, 0xfc, 0xee, 0x1a, 0xcc, 0xb5, 0xb4, 0x5b, 0xa7, 0xfc, 0x22, 0x3e, 0x6d, 0xfd, 0x46, 0xe2, - 0x14, 0x25, 0x22, 0x50, 0xa2, 0x4a, 0x52, 0x14, 0x5d, 0xae, 0x64, 0x76, 0xda, 0xc8, 0x86, 0x44, - 0x93, 0x06, 0x64, 0x38, 0x91, 0x6c, 0xfe, 0xcd, 0x10, 0x0e, 0x1c, 0xc5, 0x1b, 0x74, 0x59, 0x8b, - 0x69, 0x86, 0xd8, 0xbe, 0xb9, 0x31, 0xf1, 0xe8, 0x9c, 0x40, 0x90, 0xfb, 0x8f, 0x08, 0x04, 0xd7, - 0x8b, 0x3f, 0xff, 0xa0, 0x36, 0xf5, 0xce, 0x5f, 0xd6, 0xa6, 0xcc, 0x9f, 0x19, 0x30, 0xb7, 0xd1, - 0xe9, 0x78, 0xbd, 0xdd, 0x4e, 0x28, 0x16, 0x60, 0xc2, 0x8c, 0x43, 0x7b, 0xb8, 0xeb, 0xab, 0x85, - 0x02, 0xbf, 0xdf, 0x4d, 0x01, 0xc1, 0x0a, 0xc3, 0xef, 0xcf, 0x61, 0x40, 0x6d, 0xa2, 0xae, 0x5b, - 0x7c, 0x7f, 0xb6, 0x38, 0x10, 0x4b, 0x1c, 0x3f, 0xe4, 0x43, 0x97, 0x78, 0xce, 0x8e, 0xe5, 0x5b, - 0x2d, 0x42, 0xd5, 0xe5, 0x88, 0xb7, 0x7e, 0x4b, 0xc3, 0xe1, 0x14, 0xa5, 0xf9, 0xcf, 0x1c, 0x94, - 0x36, 0x03, 0xdf, 0x71, 0x43, 0x75, 0xb9, 0xc2, 0x5e, 0x67, 0x28, 0x78, 0xdc, 0xee, 0x75, 0x08, - 0x16, 0x18, 0xf4, 0x02, 0xcc, 0xb0, 0xd0, 0x0a, 0xbb, 0x4c, 0xd8, 0x53, 0x6a, 0x3c, 0x16, 0x85, - 0xa5, 0x7d, 0x01, 0x3d, 0xeb, 0xd7, 0x16, 0x62, 0x71, 0x12, 0x84, 0x15, 0x03, 0xf7, 0xf4, 0xe0, - 0x40, 0x6c, 0x94, 0x73, 0x53, 0xa6, 0xbd, 0x28, 0x7f, 0xe4, 0x13, 0x4f, 0xdf, 0x1d, 0xa2, 0xc0, - 0x23, 0xb8, 0xd0, 0x09, 0x20, 0xcf, 0x62, 0xe1, 0x6d, 0x6a, 0xf9, 0x4c, 0xe8, 0xba, 0xed, 0xb6, - 0x89, 0xba, 0xf0, 0xff, 0x97, 0xed, 0xc4, 0x39, 0x47, 0xa2, 0xf7, 0xd6, 0x90, 0x34, 0x3c, 0x42, - 0x03, 0x7a, 0x12, 0x66, 0x28, 0xb1, 0x58, 0xe0, 0x57, 0x0b, 0x62, 0xf9, 0x71, 0x54, 0xc6, 0x02, - 0x8a, 0x15, 0x96, 0x07, 0xb4, 0x36, 0x61, 0xcc, 0x6a, 0x45, 0xe1, 0x35, 0x0e, 0x68, 0x3b, 0x12, - 0x8c, 0x23, 0xbc, 0xf9, 0x6b, 0x03, 0x2a, 0x9b, 0x94, 0x58, 0x21, 0x99, 0xc4, 0x2d, 0x3e, 0xf7, - 0x89, 0xa3, 0x0d, 0x58, 0x10, 0xdf, 0x77, 0x2d, 0xcf, 0x75, 0xe4, 0x19, 0x4c, 0x0b, 0xe6, 0xff, - 0x56, 0xcc, 0x0b, 0x5b, 0x69, 0x34, 0x1e, 0xa4, 0x37, 0x7f, 0x9c, 0x87, 0x4a, 0x93, 0x78, 0x24, - 0x31, 0x79, 0x0b, 0x50, 0x8b, 0x5a, 0x36, 0xd9, 0x23, 0xd4, 0x0d, 0x9c, 0x7d, 0x62, 0x07, 0xbe, - 0xc3, 0x84, 0x1b, 0xe5, 0x1b, 0xff, 0xc5, 0xf7, 0xf7, 0xe6, 0x10, 0x16, 0x8f, 0xe0, 0x40, 0x1e, - 0x54, 0x3a, 0x54, 0xfc, 0x16, 0x7b, 0x2e, 0xbd, 0xac, 0x7c, 0xf5, 0x4b, 0xd9, 0x8e, 0x74, 0x4f, - 0x67, 0x6d, 0x2c, 0x9d, 0xf6, 0x6b, 0x95, 0x14, 0x08, 0xa7, 0x85, 0xa3, 0xaf, 0xc1, 0x62, 0x40, - 0x3b, 0x47, 0x96, 0xdf, 0x24, 0x1d, 0xe2, 0x3b, 0xc4, 0x0f, 0x99, 0xd8, 0xc8, 0x62, 0x63, 0x99, - 0xd7, 0x22, 0xbb, 0x03, 0x38, 0x3c, 0x44, 0x8d, 0xee, 0xc1, 0x52, 0x87, 0x06, 0x1d, 0xab, 0x25, - 0x36, 0x66, 0x2f, 0xf0, 0x5c, 0xbb, 0xa7, 0xb6, 0xf3, 0xe9, 0xd3, 0x7e, 0x6d, 0x69, 0x6f, 0x10, - 0x79, 0xd6, 0xaf, 0x5d, 0x10, 0x5b, 0xc7, 0x21, 0x09, 0x12, 0x0f, 0x8b, 0xd1, 0xdc, 0xa0, 0x30, - 0xce, 0x0d, 0xcc, 0x6d, 0x28, 0x36, 0xbb, 0xea, 0x4e, 0xbc, 0x04, 0x45, 0x47, 0xfd, 0x56, 0x3b, - 0x1f, 0x5d, 0xce, 0x98, 0xe6, 0xac, 0x5f, 0xab, 0xf0, 0xf2, 0xb3, 0x1e, 0x01, 0x70, 0xcc, 0x62, - 0x3e, 0x09, 0x45, 0x71, 0xf0, 0xec, 0xee, 0x15, 0xb4, 0x08, 0x79, 0x6c, 0xdd, 0x17, 0x52, 0xe6, - 0x30, 0xff, 0xa9, 0x45, 0xb1, 0x5d, 0x80, 0x9b, 0x24, 0x8c, 0x0e, 0x7e, 0x03, 0x16, 0xa2, 0x50, - 0x9e, 0xce, 0x30, 0xb1, 0x37, 0xe1, 0x34, 0x1a, 0x0f, 0xd2, 0x9b, 0x6f, 0x40, 0x49, 0x64, 0x21, - 0x9e, 0xc2, 0x93, 0x72, 0xc1, 0x78, 0x40, 0xb9, 0x10, 0xd5, 0x00, 0xb9, 0x71, 0x35, 0x80, 0x66, - 0xae, 0x07, 0x15, 0xc9, 0x1b, 0x15, 0x48, 0x99, 0x34, 0x3c, 0x0d, 0xc5, 0xc8, 0x4c, 0xa5, 0x25, - 0x2e, 0x8c, 0x23, 0x41, 0x38, 0xa6, 0xd0, 0xb4, 0x1d, 0x41, 0x2a, 0xa3, 0x66, 0x53, 0xa6, 0x55, - 0x3f, 0xb9, 0x07, 0x57, 0x3f, 0x9a, 0xa6, 0x1f, 0x40, 0x75, 0x5c, 0x35, 0xfd, 0x10, 0x39, 0x3f, - 0xbb, 0x29, 0xe6, 0x7b, 0x06, 0x2c, 0xea, 0x92, 0xb2, 0x1f, 0x5f, 0x76, 0x25, 0xe7, 0x57, 0x7b, - 0xda, 0x8e, 0xfc, 0xc2, 0x80, 0xe5, 0xd4, 0xd2, 0x26, 0x3a, 0xf1, 0x09, 0x8c, 0xd2, 0x9d, 0x23, - 0x3f, 0x81, 0x73, 0xfc, 0x29, 0x07, 0x95, 0x5b, 0xd6, 0x01, 0xf1, 0xf6, 0x89, 0x47, 0xec, 0x30, - 0xa0, 0xe8, 0xfb, 0x50, 0x6e, 0x5b, 0xa1, 0x7d, 0x24, 0xa0, 0x51, 0x67, 0xd0, 0xcc, 0x16, 0xec, - 0x52, 0x92, 0xea, 0x3b, 0x89, 0x98, 0x1b, 0x7e, 0x48, 0x7b, 0x8d, 0x0b, 0xca, 0xa4, 0xb2, 0x86, - 0xc1, 0xba, 0x36, 0xd1, 0xce, 0x89, 0xef, 0x1b, 0x6f, 0x77, 0x78, 0xd9, 0x32, 0x79, 0x17, 0x99, - 0x32, 0x01, 0x93, 0xb7, 0xba, 0x2e, 0x25, 0x6d, 0xe2, 0x87, 0x49, 0x3b, 0xb7, 0x33, 0x20, 0x1f, - 0x0f, 0x69, 0x5c, 0x79, 0x19, 0x16, 0x07, 0x8d, 0xe7, 0xf1, 0xe7, 0x98, 0xf4, 0xe4, 0x79, 0x61, - 0xfe, 0x13, 0x2d, 0x43, 0xe1, 0xc4, 0xf2, 0xba, 0xea, 0x36, 0x62, 0xf9, 0x71, 0x3d, 0x77, 0xcd, - 0x30, 0x7f, 0x65, 0x40, 0x75, 0x9c, 0x21, 0xe8, 0x7f, 0x35, 0x41, 0x8d, 0xb2, 0xb2, 0x2a, 0xff, - 0x1a, 0xe9, 0x49, 0xa9, 0x37, 0xa0, 0x18, 0x74, 0x78, 0x4d, 0x11, 0x50, 0x75, 0xea, 0x4f, 0x45, - 0x27, 0xb9, 0xab, 0xe0, 0x67, 0xfd, 0xda, 0xc5, 0x94, 0xf8, 0x08, 0x81, 0x63, 0x56, 0x1e, 0xa9, - 0x85, 0x3d, 0x3c, 0x7b, 0xc4, 0x91, 0xfa, 0xae, 0x80, 0x60, 0x85, 0x31, 0x7f, 0x67, 0xc0, 0xb4, - 0x28, 0xc8, 0xdf, 0x80, 0x22, 0xdf, 0x3f, 0xc7, 0x0a, 0x2d, 0x61, 0x57, 0xe6, 0x56, 0x90, 0x73, - 0xef, 0x90, 0xd0, 0x4a, 0xbc, 0x2d, 0x82, 0xe0, 0x58, 0x22, 0xc2, 0x50, 0x70, 0x43, 0xd2, 0x8e, - 0x0e, 0xf2, 0x99, 0xb1, 0xa2, 0xd5, 0x20, 0xa2, 0x8e, 0xad, 0xfb, 0x37, 0xde, 0x0e, 0x89, 0xcf, - 0x0f, 0x23, 0xb9, 0x1a, 0xdb, 0x5c, 0x06, 0x96, 0xa2, 0xcc, 0x7f, 0x18, 0x10, 0xab, 0xe2, 0xce, - 0xcf, 0x88, 0x77, 0x78, 0xcb, 0xf5, 0x8f, 0xd5, 0xb6, 0xc6, 0xe6, 0xec, 0x2b, 0x38, 0x8e, 0x29, - 0x46, 0xa5, 0x87, 0xdc, 0x64, 0xe9, 0x81, 0x2b, 0xb4, 0x03, 0x3f, 0x74, 0xfd, 0xee, 0xd0, 0x6d, - 0xdb, 0x54, 0x70, 0x1c, 0x53, 0xf0, 0x42, 0x84, 0x92, 0xb6, 0xe5, 0xfa, 0xae, 0xdf, 0xe2, 0x8b, - 0xd8, 0x0c, 0xba, 0x7e, 0x28, 0x32, 0xb2, 0x2a, 0x44, 0xf0, 0x10, 0x16, 0x8f, 0xe0, 0x30, 0x7f, - 0x3b, 0x0d, 0x65, 0xbe, 0xe6, 0x28, 0xcf, 0xbd, 0x08, 0x15, 0x4f, 0xf7, 0x02, 0xb5, 0xf6, 0x8b, - 0xca, 0x94, 0xf4, 0xbd, 0xc6, 0x69, 0x5a, 0xce, 0x2c, 0x4a, 0xa8, 0x98, 0x39, 0x97, 0x66, 0xde, - 0xd2, 0x91, 0x38, 0x4d, 0xcb, 0xa3, 0xd7, 0x7d, 0x7e, 0x3f, 0x54, 0x65, 0x12, 0x1f, 0xd1, 0xd7, - 0x39, 0x10, 0x4b, 0x1c, 0xda, 0x81, 0x0b, 0x96, 0xe7, 0x05, 0xf7, 0x05, 0xb0, 0x11, 0x04, 0xc7, - 0x6d, 0x8b, 0x1e, 0x33, 0xd1, 0x4c, 0x17, 0x1b, 0xff, 0xa3, 0x58, 0x2e, 0x6c, 0x0c, 0x93, 0xe0, - 0x51, 0x7c, 0xa3, 0x8e, 0x6d, 0x7a, 0xc2, 0x63, 0x3b, 0x82, 0xe5, 0x01, 0x90, 0xb8, 0xe5, 0xaa, - 0xb3, 0x7d, 0x4e, 0xc9, 0x59, 0xc6, 0x23, 0x68, 0xce, 0xc6, 0xc0, 0xf1, 0x48, 0x89, 0xe8, 0x3a, - 0xcc, 0x73, 0x4f, 0x0e, 0xba, 0x61, 0x54, 0x77, 0x16, 0xc4, 0x71, 0xa3, 0xd3, 0x7e, 0x6d, 0xfe, - 0x76, 0x0a, 0x83, 0x07, 0x28, 0xf9, 0xe6, 0x7a, 0x6e, 0xdb, 0x0d, 0xab, 0xb3, 0x82, 0x25, 0xde, - 0xdc, 0x5b, 0x1c, 0x88, 0x25, 0x2e, 0xe5, 0x81, 0xc5, 0xf3, 0x3c, 0xd0, 0xfc, 0x63, 0x1e, 0x90, - 0xac, 0xb5, 0x1d, 0x59, 0x4f, 0xc9, 0x90, 0xc6, 0x3b, 0x02, 0x55, 0xab, 0x1b, 0x03, 0x1d, 0x81, - 0x2a, 0xd3, 0x23, 0x3c, 0xda, 0x81, 0x92, 0x0c, 0x2d, 0xc9, 0x75, 0x59, 0x57, 0xc4, 0xa5, 0xdd, - 0x08, 0x71, 0xd6, 0xaf, 0xad, 0xa4, 0xd4, 0xc4, 0x18, 0xd1, 0xad, 0x25, 0x12, 0xd0, 0x55, 0x00, - 0xab, 0xe3, 0xea, 0xf3, 0xba, 0x52, 0x32, 0xb5, 0x49, 0x3a, 0x6f, 0xac, 0x51, 0xa1, 0x57, 0x60, - 0x3a, 0xfc, 0x7c, 0x1d, 0x55, 0x51, 0x34, 0x8c, 0xbc, 0x7f, 0x12, 0x12, 0xb8, 0x76, 0xe1, 0xcf, - 0x8c, 0x9b, 0xa5, 0x9a, 0xa1, 0x58, 0xfb, 0x56, 0x8c, 0xc1, 0x1a, 0x15, 0xfa, 0x06, 0x14, 0x0f, - 0x55, 0x29, 0x2a, 0x0e, 0x26, 0x73, 0x88, 0x8c, 0x0a, 0x58, 0x39, 0x32, 0x88, 0xbe, 0x70, 0x2c, - 0x0d, 0x7d, 0x19, 0xca, 0xac, 0x7b, 0x10, 0x67, 0x6f, 0x79, 0x9a, 0x71, 0xaa, 0xdc, 0x4f, 0x50, - 0x58, 0xa7, 0x33, 0xdf, 0x82, 0xd2, 0x8e, 0x6b, 0xd3, 0x40, 0xf4, 0x80, 0x4f, 0xc1, 0x2c, 0x4b, - 0x35, 0x38, 0xf1, 0x49, 0x46, 0x5e, 0x16, 0xe1, 0xb9, 0x7b, 0xf9, 0x96, 0x1f, 0xc8, 0x36, 0xa6, - 0x90, 0xb8, 0xd7, 0xeb, 0x1c, 0x88, 0x25, 0xee, 0xfa, 0x32, 0x2f, 0x10, 0xde, 0xfd, 0xb0, 0x36, - 0xf5, 0xfe, 0x87, 0xb5, 0xa9, 0x0f, 0x3e, 0x54, 0xc5, 0xc2, 0xbb, 0x65, 0x80, 0xdd, 0x83, 0xef, - 0x12, 0x5b, 0x86, 0xdd, 0x4c, 0x63, 0xbd, 0x68, 0x9a, 0x2c, 0xc6, 0x7a, 0xb9, 0x81, 0xa2, 0x4f, - 0xc3, 0xe1, 0x14, 0x25, 0x5a, 0x87, 0x52, 0x3c, 0xb0, 0x53, 0xfe, 0xb1, 0x14, 0xf9, 0x5b, 0x3c, - 0xd5, 0xc3, 0x09, 0x4d, 0x2a, 0x07, 0x4c, 0x9f, 0x9b, 0x03, 0x1a, 0x90, 0xef, 0xba, 0x8e, 0x6a, - 0x98, 0x9f, 0x8d, 0x72, 0xf0, 0x9d, 0xed, 0xe6, 0x59, 0xbf, 0xf6, 0xd8, 0xb8, 0x39, 0x79, 0xd8, - 0xeb, 0x10, 0x56, 0xbf, 0xb3, 0xdd, 0xc4, 0x9c, 0x79, 0x54, 0x40, 0x9a, 0x99, 0x30, 0x20, 0x5d, - 0x05, 0x68, 0x25, 0x63, 0x07, 0x79, 0xdf, 0x63, 0x47, 0xd4, 0xc6, 0x0d, 0x1a, 0x15, 0x62, 0xb0, - 0x64, 0xf3, 0xd6, 0x5c, 0xb5, 0xff, 0x2c, 0xb4, 0xda, 0x72, 0x90, 0x39, 0xd9, 0x9d, 0xb8, 0xa4, - 0xd4, 0x2c, 0x6d, 0x0e, 0x0a, 0xc3, 0xc3, 0xf2, 0x51, 0x00, 0x4b, 0x8e, 0xea, 0x10, 0x13, 0xa5, - 0xa5, 0x89, 0x95, 0x5e, 0xe4, 0x0a, 0x9b, 0x83, 0x82, 0xf0, 0xb0, 0x6c, 0xf4, 0x6d, 0x58, 0x89, - 0x80, 0xc3, 0x6d, 0xba, 0x08, 0xd8, 0xf9, 0xc6, 0xea, 0x69, 0xbf, 0xb6, 0xd2, 0x1c, 0x4b, 0x85, - 0x1f, 0x20, 0x01, 0x39, 0x30, 0xe3, 0xc9, 0x02, 0xb7, 0x2c, 0x8a, 0x92, 0xaf, 0x64, 0x5b, 0x45, - 0xe2, 0xfd, 0x75, 0xbd, 0xb0, 0x8d, 0x47, 0x2e, 0xaa, 0xa6, 0x55, 0xb2, 0xd1, 0xdb, 0x50, 0xb6, - 0x7c, 0x3f, 0x08, 0x2d, 0x39, 0x38, 0x98, 0x13, 0xaa, 0x36, 0x26, 0x56, 0xb5, 0x91, 0xc8, 0x18, - 0x28, 0xa4, 0x35, 0x0c, 0xd6, 0x55, 0xa1, 0xfb, 0xb0, 0x10, 0xdc, 0xf7, 0x09, 0xc5, 0xe4, 0x90, - 0x50, 0xe2, 0xdb, 0x84, 0x55, 0x2b, 0x42, 0xfb, 0x73, 0x19, 0xb5, 0xa7, 0x98, 0x13, 0x97, 0x4e, - 0xc3, 0x19, 0x1e, 0xd4, 0x82, 0xea, 0x3c, 0xb6, 0xfa, 0x96, 0xe7, 0x7e, 0x8f, 0x50, 0x56, 0x9d, - 0x4f, 0x66, 0xcd, 0x5b, 0x31, 0x14, 0x6b, 0x14, 0x68, 0x13, 0xca, 0xb6, 0xd7, 0x65, 0x21, 0x91, - 0x83, 0xff, 0x85, 0xd4, 0x04, 0xef, 0xd2, 0xbd, 0x7b, 0xf7, 0xbe, 0xd3, 0x24, 0x1d, 0x4a, 0x6c, - 0x2b, 0x24, 0xce, 0x66, 0x42, 0x88, 0x75, 0x2e, 0xd4, 0x85, 0x4a, 0x5b, 0xcf, 0x3b, 0xd5, 0x25, - 0xb1, 0xd6, 0x6b, 0xd9, 0xd6, 0x3a, 0x9c, 0x19, 0x93, 0x32, 0x28, 0x85, 0xc3, 0x69, 0x2d, 0x2b, - 0x2f, 0x40, 0xf9, 0x73, 0x76, 0x08, 0xbc, 0xc3, 0x18, 0x3c, 0xd5, 0x89, 0x3a, 0x8c, 0xdf, 0xe7, - 0x60, 0x3e, 0x7d, 0x16, 0x03, 0x39, 0xb5, 0x90, 0x29, 0xa7, 0x46, 0xbd, 0xac, 0x31, 0xf6, 0xe5, - 0x22, 0x0a, 0xf2, 0xf9, 0xb1, 0x41, 0x5e, 0xc5, 0xd2, 0xe9, 0x87, 0x89, 0xa5, 0x75, 0x00, 0x5e, - 0xac, 0xd0, 0xc0, 0xf3, 0x08, 0x15, 0x61, 0xb4, 0xa8, 0x5e, 0x28, 0x62, 0x28, 0xd6, 0x28, 0x78, - 0x49, 0x7d, 0xe0, 0x05, 0xf6, 0xb1, 0xd8, 0x82, 0x28, 0x04, 0x88, 0x00, 0x5a, 0x94, 0x25, 0x75, - 0x63, 0x08, 0x8b, 0x47, 0x70, 0x98, 0x3d, 0xb8, 0xb8, 0x67, 0xd1, 0xd0, 0xb5, 0xbc, 0xe4, 0xba, - 0x89, 0x9e, 0xe5, 0xcd, 0xa1, 0x8e, 0xe8, 0xd9, 0x49, 0xaf, 0x6d, 0xb2, 0xf9, 0x09, 0x2c, 0xe9, - 0x8a, 0xcc, 0x3f, 0x1b, 0x70, 0x69, 0xa4, 0xee, 0x2f, 0xa0, 0x23, 0x7b, 0x33, 0xdd, 0x91, 0xbd, - 0x98, 0x71, 0x94, 0x39, 0xca, 0xda, 0x31, 0xfd, 0xd9, 0x2c, 0x14, 0xf6, 0x78, 0x25, 0x6c, 0x7e, - 0x6c, 0xc0, 0x9c, 0xf8, 0x35, 0xc9, 0x24, 0xb9, 0x96, 0x7e, 0x60, 0x28, 0x3d, 0xba, 0xc7, 0x85, - 0x47, 0x31, 0x6a, 0x7e, 0xcf, 0x80, 0xf4, 0x0c, 0x17, 0xbd, 0x2c, 0xaf, 0x80, 0x11, 0x0f, 0x59, - 0x27, 0x74, 0xff, 0x97, 0xc6, 0xb5, 0xa4, 0x17, 0x32, 0x4d, 0x2b, 0x9f, 0x86, 0x12, 0x0e, 0x82, - 0x70, 0xcf, 0x0a, 0x8f, 0x18, 0xdf, 0xbb, 0x0e, 0xff, 0xa1, 0xb6, 0x57, 0xec, 0x9d, 0xc0, 0x60, - 0x09, 0x37, 0x7f, 0x6a, 0xc0, 0xa5, 0xb1, 0xef, 0x46, 0x3c, 0x8a, 0xd8, 0xf1, 0x97, 0x5a, 0x51, - 0xec, 0xc8, 0x09, 0x1d, 0xd6, 0xa8, 0x78, 0x2f, 0x99, 0x7a, 0x6c, 0x1a, 0xec, 0x25, 0x53, 0xda, - 0x70, 0x9a, 0xd6, 0xfc, 0x7b, 0x0e, 0xd4, 0x43, 0xcd, 0xbf, 0xd9, 0xe9, 0x9f, 0x1c, 0x78, 0x26, - 0x9a, 0x4f, 0x3f, 0x13, 0xc5, 0x6f, 0x42, 0xda, 0x3b, 0x49, 0xfe, 0xc1, 0xef, 0x24, 0xe8, 0xf9, - 0xf8, 0xe9, 0x45, 0xfa, 0xd0, 0x6a, 0xfa, 0xe9, 0xe5, 0xac, 0x5f, 0x9b, 0x53, 0xc2, 0xd3, 0x4f, - 0x31, 0xf7, 0x60, 0xd6, 0x21, 0xa1, 0xe5, 0x7a, 0xb2, 0x2f, 0xcc, 0xfc, 0x98, 0x20, 0x85, 0x35, - 0x25, 0x6b, 0xa3, 0xcc, 0x6d, 0x52, 0x1f, 0x38, 0x12, 0xc8, 0x03, 0xb6, 0x1d, 0x38, 0xb2, 0xad, - 0x29, 0x24, 0x01, 0x7b, 0x33, 0x70, 0x08, 0x16, 0x18, 0xf3, 0x7d, 0x03, 0xca, 0x52, 0xd2, 0xa6, - 0xd5, 0x65, 0x04, 0x5d, 0x89, 0x57, 0x21, 0x8f, 0xfb, 0x92, 0xfe, 0xc6, 0x76, 0xd6, 0xaf, 0x95, - 0x04, 0x99, 0xe8, 0x88, 0x46, 0xbc, 0x25, 0xe5, 0xce, 0xd9, 0xa3, 0xc7, 0xa1, 0x20, 0x2e, 0x90, - 0xda, 0xcc, 0xe4, 0xb1, 0x90, 0x03, 0xb1, 0xc4, 0x99, 0x9f, 0xe6, 0xa0, 0x92, 0x5a, 0x5c, 0x86, - 0xe6, 0x22, 0x1e, 0xa1, 0xe6, 0x32, 0x8c, 0xe5, 0xc7, 0x3f, 0xcd, 0xab, 0xf4, 0x35, 0xf3, 0x30, - 0xe9, 0xeb, 0x9b, 0x30, 0x63, 0xf3, 0x3d, 0x8a, 0xfe, 0xe9, 0x71, 0x65, 0x92, 0xe3, 0x14, 0xbb, - 0x9b, 0x78, 0xa3, 0xf8, 0x64, 0x58, 0x09, 0x44, 0x37, 0x61, 0x89, 0x92, 0x90, 0xf6, 0x36, 0x0e, - 0x43, 0x42, 0xf5, 0x61, 0x42, 0x21, 0x29, 0xe1, 0xf1, 0x20, 0x01, 0x1e, 0xe6, 0x31, 0x0f, 0x60, - 0xee, 0xb6, 0x75, 0xe0, 0xc5, 0xcf, 0x63, 0x18, 0x2a, 0xae, 0x6f, 0x7b, 0x5d, 0x87, 0xc8, 0x80, - 0x1e, 0x45, 0xaf, 0xe8, 0xd2, 0x6e, 0xeb, 0xc8, 0xb3, 0x7e, 0xed, 0x42, 0x0a, 0x20, 0xdf, 0x83, - 0x70, 0x5a, 0x84, 0xe9, 0xc1, 0xf4, 0x17, 0xd8, 0x8e, 0x7e, 0x0b, 0x4a, 0x49, 0xc3, 0xf0, 0x88, - 0x55, 0x9a, 0x6f, 0x42, 0x91, 0x7b, 0x7c, 0xd4, 0xe8, 0x9e, 0x53, 0x25, 0xa5, 0x6b, 0xaf, 0x5c, - 0x96, 0xda, 0x4b, 0x3c, 0xb2, 0xde, 0xe9, 0x38, 0x0f, 0xf9, 0xc8, 0x9a, 0x7b, 0x98, 0xcc, 0x97, - 0x9f, 0x30, 0xf3, 0x5d, 0x05, 0xf9, 0x47, 0x14, 0x9e, 0x64, 0x64, 0x01, 0xa1, 0x25, 0x19, 0x3d, - 0xff, 0x6b, 0x2f, 0x0c, 0x3f, 0x32, 0x00, 0xc4, 0x28, 0xef, 0xc6, 0x09, 0xf1, 0xc3, 0x0c, 0xcf, - 0xf9, 0x77, 0x60, 0x26, 0x90, 0x1e, 0x29, 0x1f, 0x5a, 0x27, 0x9c, 0x17, 0xc7, 0x17, 0x49, 0xfa, - 0x24, 0x56, 0xc2, 0x1a, 0xaf, 0x7e, 0xf4, 0xd9, 0xea, 0xd4, 0xc7, 0x9f, 0xad, 0x4e, 0x7d, 0xf2, - 0xd9, 0xea, 0xd4, 0x3b, 0xa7, 0xab, 0xc6, 0x47, 0xa7, 0xab, 0xc6, 0xc7, 0xa7, 0xab, 0xc6, 0x27, - 0xa7, 0xab, 0xc6, 0xa7, 0xa7, 0xab, 0xc6, 0xfb, 0x7f, 0x5d, 0x9d, 0xba, 0xf7, 0x44, 0x96, 0x3f, - 0xf8, 0xfd, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x24, 0x60, 0xec, 0x20, 0x28, 0x00, 0x00, + // 2842 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x1a, 0x4b, 0x6f, 0x24, 0x47, + 0xd9, 0x3d, 0x0f, 0x7b, 0xe6, 0x9b, 0x19, 0x3f, 0x6a, 0xbd, 0x30, 0x6b, 0x84, 0xc7, 0xe9, 0x44, + 0xd1, 0x06, 0x92, 0x71, 0x76, 0x09, 0xd1, 0x66, 0x43, 0x02, 0x1e, 0xcf, 0x7a, 0xe3, 0x64, 0x1d, + 0x5b, 0xe5, 0xdd, 0x05, 0x42, 0x84, 0xd2, 0x9e, 0x2e, 0x8f, 0x1b, 0xf7, 0x74, 0x4f, 0xaa, 0x7a, + 0xbc, 0x19, 0x38, 0x90, 0x03, 0x08, 0x90, 0x50, 0x14, 0x6e, 0x9c, 0x50, 0x22, 0xf8, 0x01, 0x88, + 0x0b, 0xdc, 0x41, 0x22, 0xc7, 0x20, 0x2e, 0x91, 0x40, 0xa3, 0xc4, 0x1c, 0x38, 0x22, 0xae, 0xbe, + 0x80, 0xea, 0xd1, 0xdd, 0xd5, 0xf3, 0x58, 0xf7, 0x64, 0x97, 0x88, 0xdb, 0xf4, 0xf7, 0xae, 0xaa, + 0xaf, 0xbe, 0x47, 0x7d, 0x03, 0x3b, 0xc7, 0xd7, 0x58, 0xdd, 0xf1, 0xd7, 0x8f, 0x7b, 0x07, 0x84, + 0x7a, 0x24, 0x20, 0x6c, 0xfd, 0x84, 0x78, 0xb6, 0x4f, 0xd7, 0x15, 0xc2, 0xea, 0x3a, 0x1d, 0xab, + 0x75, 0xe4, 0x78, 0x84, 0xf6, 0xd7, 0xbb, 0xc7, 0x6d, 0x0e, 0x60, 0xeb, 0x1d, 0x12, 0x58, 0xeb, + 0x27, 0x57, 0xd6, 0xdb, 0xc4, 0x23, 0xd4, 0x0a, 0x88, 0x5d, 0xef, 0x52, 0x3f, 0xf0, 0xd1, 0x63, + 0x92, 0xab, 0xae, 0x73, 0xd5, 0xbb, 0xc7, 0x6d, 0x0e, 0x60, 0x75, 0xce, 0x55, 0x3f, 0xb9, 0xb2, + 0xf2, 0x54, 0xdb, 0x09, 0x8e, 0x7a, 0x07, 0xf5, 0x96, 0xdf, 0x59, 0x6f, 0xfb, 0x6d, 0x7f, 0x5d, + 0x30, 0x1f, 0xf4, 0x0e, 0xc5, 0x97, 0xf8, 0x10, 0xbf, 0xa4, 0xd0, 0x95, 0x89, 0xa6, 0xd0, 0x9e, + 0x17, 0x38, 0x1d, 0x32, 0x6c, 0xc5, 0xca, 0xb3, 0xe7, 0x31, 0xb0, 0xd6, 0x11, 0xe9, 0x58, 0xc3, + 0x7c, 0xe6, 0x9f, 0xb3, 0x50, 0xd8, 0xd8, 0xdb, 0xbe, 0x49, 0xfd, 0x5e, 0x17, 0xad, 0x41, 0xce, + 0xb3, 0x3a, 0xa4, 0x6a, 0xac, 0x19, 0x97, 0x8b, 0x8d, 0xf2, 0x07, 0x83, 0xda, 0xcc, 0xe9, 0xa0, + 0x96, 0x7b, 0xd5, 0xea, 0x10, 0x2c, 0x30, 0xc8, 0x85, 0xc2, 0x09, 0xa1, 0xcc, 0xf1, 0x3d, 0x56, + 0xcd, 0xac, 0x65, 0x2f, 0x97, 0xae, 0xbe, 0x58, 0x4f, 0xb3, 0xfe, 0xba, 0x50, 0x70, 0x57, 0xb2, + 0x6e, 0xf9, 0xb4, 0xe9, 0xb0, 0x96, 0x7f, 0x42, 0x68, 0xbf, 0xb1, 0xa8, 0xb4, 0x14, 0x14, 0x92, + 0xe1, 0x48, 0x03, 0xfa, 0x91, 0x01, 0x8b, 0x5d, 0x4a, 0x0e, 0x09, 0xa5, 0xc4, 0x56, 0xf8, 0x6a, + 0x76, 0xcd, 0x78, 0x08, 0x6a, 0xab, 0x4a, 0xed, 0xe2, 0xde, 0x90, 0x7c, 0x3c, 0xa2, 0x11, 0xfd, + 0xda, 0x80, 0x15, 0x46, 0xe8, 0x09, 0xa1, 0x1b, 0xb6, 0x4d, 0x09, 0x63, 0x8d, 0xfe, 0xa6, 0xeb, + 0x10, 0x2f, 0xd8, 0xdc, 0x6e, 0x62, 0x56, 0xcd, 0x89, 0x7d, 0xf8, 0x7a, 0x3a, 0x83, 0xf6, 0x27, + 0xc9, 0x69, 0x98, 0xca, 0xa2, 0x95, 0x89, 0x24, 0x0c, 0xdf, 0xc7, 0x0c, 0xf3, 0x10, 0xca, 0xe1, + 0x41, 0xde, 0x72, 0x58, 0x80, 0xee, 0xc2, 0x6c, 0x9b, 0x7f, 0xb0, 0xaa, 0x21, 0x0c, 0xac, 0xa7, + 0x33, 0x30, 0x94, 0xd1, 0x98, 0x57, 0xf6, 0xcc, 0x8a, 0x4f, 0x86, 0x95, 0x34, 0xf3, 0x67, 0x39, + 0x28, 0x6d, 0xec, 0x6d, 0x63, 0xc2, 0xfc, 0x1e, 0x6d, 0x91, 0x14, 0x4e, 0x73, 0x0d, 0xca, 0xcc, + 0xf1, 0xda, 0x3d, 0xd7, 0xa2, 0x1c, 0x5a, 0x9d, 0x15, 0x94, 0xcb, 0x8a, 0xb2, 0xbc, 0xaf, 0xe1, + 0x70, 0x82, 0x12, 0x5d, 0x05, 0xe0, 0x12, 0x58, 0xd7, 0x6a, 0x11, 0xbb, 0x9a, 0x59, 0x33, 0x2e, + 0x17, 0x1a, 0x48, 0xf1, 0xc1, 0xab, 0x11, 0x06, 0x6b, 0x54, 0xe8, 0x51, 0xc8, 0x0b, 0x4b, 0xab, + 0x05, 0xa1, 0xa6, 0xa2, 0xc8, 0xf3, 0x62, 0x19, 0x58, 0xe2, 0xd0, 0x13, 0x30, 0xa7, 0xbc, 0xac, + 0x5a, 0x14, 0x64, 0x0b, 0x8a, 0x6c, 0x2e, 0x74, 0x83, 0x10, 0xcf, 0xd7, 0x77, 0xec, 0x78, 0xb6, + 0xf0, 0x3b, 0x6d, 0x7d, 0xaf, 0x38, 0x9e, 0x8d, 0x05, 0x06, 0xdd, 0x82, 0xfc, 0x09, 0xa1, 0x07, + 0xdc, 0x13, 0xb8, 0x6b, 0x7e, 0x39, 0xdd, 0x46, 0xdf, 0xe5, 0x2c, 0x8d, 0x22, 0x37, 0x4d, 0xfc, + 0xc4, 0x52, 0x08, 0xaa, 0x03, 0xb0, 0x23, 0x9f, 0x06, 0x62, 0x79, 0xd5, 0xfc, 0x5a, 0xf6, 0x72, + 0xb1, 0x31, 0xcf, 0xd7, 0xbb, 0x1f, 0x41, 0xb1, 0x46, 0xc1, 0xe9, 0x5b, 0x56, 0x40, 0xda, 0x3e, + 0x75, 0x08, 0xab, 0xce, 0xc5, 0xf4, 0x9b, 0x11, 0x14, 0x6b, 0x14, 0xe8, 0x65, 0x40, 0x2c, 0xf0, + 0xa9, 0xd5, 0x26, 0x6a, 0xa9, 0x2f, 0x59, 0xec, 0xa8, 0x0a, 0x62, 0x75, 0x2b, 0x6a, 0x75, 0x68, + 0x7f, 0x84, 0x02, 0x8f, 0xe1, 0x32, 0x7f, 0x67, 0xc0, 0x82, 0xe6, 0x0b, 0xc2, 0xef, 0xae, 0x41, + 0xb9, 0xad, 0xdd, 0x3a, 0xe5, 0x17, 0xd1, 0x69, 0xeb, 0x37, 0x12, 0x27, 0x28, 0x11, 0x81, 0x22, + 0x55, 0x92, 0xc2, 0xe8, 0x72, 0x25, 0xb5, 0xd3, 0x86, 0x36, 0xc4, 0x9a, 0x34, 0x20, 0xc3, 0xb1, + 0x64, 0xf3, 0x9f, 0x86, 0x70, 0xe0, 0x30, 0xde, 0xa0, 0xcb, 0x5a, 0x4c, 0x33, 0xc4, 0xf6, 0x95, + 0x27, 0xc4, 0xa3, 0x73, 0x02, 0x41, 0xe6, 0xff, 0x22, 0x10, 0x5c, 0x2f, 0xfc, 0xf2, 0xbd, 0xda, + 0xcc, 0xdb, 0x7f, 0x5f, 0x9b, 0x31, 0x7f, 0x61, 0x40, 0x79, 0xa3, 0xdb, 0x75, 0xfb, 0xbb, 0xdd, + 0x40, 0x2c, 0xc0, 0x84, 0x59, 0x9b, 0xf6, 0x71, 0xcf, 0x53, 0x0b, 0x05, 0x7e, 0xbf, 0x9b, 0x02, + 0x82, 0x15, 0x86, 0xdf, 0x9f, 0x43, 0x9f, 0xb6, 0x88, 0xba, 0x6e, 0xd1, 0xfd, 0xd9, 0xe2, 0x40, + 0x2c, 0x71, 0xfc, 0x90, 0x0f, 0x1d, 0xe2, 0xda, 0x3b, 0x96, 0x67, 0xb5, 0x09, 0x55, 0x97, 0x23, + 0xda, 0xfa, 0x2d, 0x0d, 0x87, 0x13, 0x94, 0xe6, 0x7f, 0x32, 0x50, 0xdc, 0xf4, 0x3d, 0xdb, 0x09, + 0xd4, 0xe5, 0x0a, 0xfa, 0xdd, 0x91, 0xe0, 0x71, 0xbb, 0xdf, 0x25, 0x58, 0x60, 0xd0, 0x73, 0x30, + 0xcb, 0x02, 0x2b, 0xe8, 0x31, 0x61, 0x4f, 0xb1, 0xf1, 0x48, 0x18, 0x96, 0xf6, 0x05, 0xf4, 0x6c, + 0x50, 0x5b, 0x88, 0xc4, 0x49, 0x10, 0x56, 0x0c, 0xdc, 0xd3, 0xfd, 0x03, 0xb1, 0x51, 0xf6, 0x4d, + 0x99, 0xf6, 0xc2, 0xfc, 0x91, 0x8d, 0x3d, 0x7d, 0x77, 0x84, 0x02, 0x8f, 0xe1, 0x42, 0x27, 0x80, + 0x5c, 0x8b, 0x05, 0xb7, 0xa9, 0xe5, 0x31, 0xa1, 0xeb, 0xb6, 0xd3, 0x21, 0xea, 0xc2, 0x7f, 0x29, + 0xdd, 0x89, 0x73, 0x8e, 0x58, 0xef, 0xad, 0x11, 0x69, 0x78, 0x8c, 0x06, 0xf4, 0x38, 0xcc, 0x52, + 0x62, 0x31, 0xdf, 0xab, 0xe6, 0xc5, 0xf2, 0xa3, 0xa8, 0x8c, 0x05, 0x14, 0x2b, 0x2c, 0x0f, 0x68, + 0x1d, 0xc2, 0x98, 0xd5, 0x0e, 0xc3, 0x6b, 0x14, 0xd0, 0x76, 0x24, 0x18, 0x87, 0x78, 0xf3, 0xb7, + 0x06, 0x54, 0x36, 0x29, 0xb1, 0x02, 0x32, 0x8d, 0x5b, 0x7c, 0xea, 0x13, 0x47, 0x1b, 0xb0, 0x20, + 0xbe, 0xef, 0x5a, 0xae, 0x63, 0xcb, 0x33, 0xc8, 0x09, 0xe6, 0xcf, 0x2b, 0xe6, 0x85, 0xad, 0x24, + 0x1a, 0x0f, 0xd3, 0x9b, 0x3f, 0xc9, 0x42, 0xa5, 0x49, 0x5c, 0x12, 0x9b, 0xbc, 0x05, 0xa8, 0x4d, + 0xad, 0x16, 0xd9, 0x23, 0xd4, 0xf1, 0xed, 0x7d, 0xd2, 0xf2, 0x3d, 0x9b, 0x09, 0x37, 0xca, 0x36, + 0x3e, 0xc7, 0xf7, 0xf7, 0xe6, 0x08, 0x16, 0x8f, 0xe1, 0x40, 0x2e, 0x54, 0xba, 0x54, 0xfc, 0x16, + 0x7b, 0x2e, 0xbd, 0xac, 0x74, 0xf5, 0x2b, 0xe9, 0x8e, 0x74, 0x4f, 0x67, 0x6d, 0x2c, 0x9d, 0x0e, + 0x6a, 0x95, 0x04, 0x08, 0x27, 0x85, 0xa3, 0x6f, 0xc0, 0xa2, 0x4f, 0xbb, 0x47, 0x96, 0xd7, 0x24, + 0x5d, 0xe2, 0xd9, 0xc4, 0x0b, 0x98, 0xd8, 0xc8, 0x42, 0x63, 0x99, 0xd7, 0x22, 0xbb, 0x43, 0x38, + 0x3c, 0x42, 0x8d, 0x5e, 0x83, 0xa5, 0x2e, 0xf5, 0xbb, 0x56, 0x5b, 0x6c, 0xcc, 0x9e, 0xef, 0x3a, + 0xad, 0xbe, 0xda, 0xce, 0x27, 0x4f, 0x07, 0xb5, 0xa5, 0xbd, 0x61, 0xe4, 0xd9, 0xa0, 0x76, 0x41, + 0x6c, 0x1d, 0x87, 0xc4, 0x48, 0x3c, 0x2a, 0x46, 0x73, 0x83, 0xfc, 0x24, 0x37, 0x30, 0xb7, 0xa1, + 0xd0, 0xec, 0xa9, 0x3b, 0xf1, 0x02, 0x14, 0x6c, 0xf5, 0x5b, 0xed, 0x7c, 0x78, 0x39, 0x23, 0x9a, + 0xb3, 0x41, 0xad, 0xc2, 0xcb, 0xcf, 0x7a, 0x08, 0xc0, 0x11, 0x8b, 0xf9, 0x38, 0x14, 0xc4, 0xc1, + 0xb3, 0xbb, 0x57, 0xd0, 0x22, 0x64, 0xb1, 0x75, 0x4f, 0x48, 0x29, 0x63, 0xfe, 0x53, 0x8b, 0x62, + 0xbb, 0x00, 0x37, 0x49, 0x10, 0x1e, 0xfc, 0x06, 0x2c, 0x84, 0xa1, 0x3c, 0x99, 0x61, 0x22, 0x6f, + 0xc2, 0x49, 0x34, 0x1e, 0xa6, 0x37, 0x5f, 0x87, 0xa2, 0xc8, 0x42, 0x3c, 0x85, 0xc7, 0xe5, 0x82, + 0x71, 0x9f, 0x72, 0x21, 0xac, 0x01, 0x32, 0x93, 0x6a, 0x00, 0xcd, 0x5c, 0x17, 0x2a, 0x92, 0x37, + 0x2c, 0x90, 0x52, 0x69, 0x78, 0x12, 0x0a, 0xa1, 0x99, 0x4a, 0x4b, 0x54, 0x18, 0x87, 0x82, 0x70, + 0x44, 0xa1, 0x69, 0x3b, 0x82, 0x44, 0x46, 0x4d, 0xa7, 0x4c, 0xab, 0x7e, 0x32, 0xf7, 0xaf, 0x7e, + 0x34, 0x4d, 0x3f, 0x84, 0xea, 0xa4, 0x6a, 0xfa, 0x01, 0x72, 0x7e, 0x7a, 0x53, 0xcc, 0x77, 0x0c, + 0x58, 0xd4, 0x25, 0xa5, 0x3f, 0xbe, 0xf4, 0x4a, 0xce, 0xaf, 0xf6, 0xb4, 0x1d, 0xf9, 0x95, 0x01, + 0xcb, 0x89, 0xa5, 0x4d, 0x75, 0xe2, 0x53, 0x18, 0xa5, 0x3b, 0x47, 0x76, 0x0a, 0xe7, 0xf8, 0x6b, + 0x06, 0x2a, 0xb7, 0xac, 0x03, 0xe2, 0xee, 0x13, 0x97, 0xb4, 0x02, 0x9f, 0xa2, 0x1f, 0x40, 0xa9, + 0x63, 0x05, 0xad, 0x23, 0x01, 0x0d, 0x3b, 0x83, 0x66, 0xba, 0x60, 0x97, 0x90, 0x54, 0xdf, 0x89, + 0xc5, 0xdc, 0xf0, 0x02, 0xda, 0x6f, 0x5c, 0x50, 0x26, 0x95, 0x34, 0x0c, 0xd6, 0xb5, 0x89, 0x76, + 0x4e, 0x7c, 0xdf, 0x78, 0xab, 0xcb, 0xcb, 0x96, 0xe9, 0xbb, 0xc8, 0x84, 0x09, 0x98, 0xbc, 0xd9, + 0x73, 0x28, 0xe9, 0x10, 0x2f, 0x88, 0xdb, 0xb9, 0x9d, 0x21, 0xf9, 0x78, 0x44, 0xe3, 0xca, 0x8b, + 0xb0, 0x38, 0x6c, 0x3c, 0x8f, 0x3f, 0xc7, 0xa4, 0x2f, 0xcf, 0x0b, 0xf3, 0x9f, 0x68, 0x19, 0xf2, + 0x27, 0x96, 0xdb, 0x53, 0xb7, 0x11, 0xcb, 0x8f, 0xeb, 0x99, 0x6b, 0x86, 0xf9, 0x1b, 0x03, 0xaa, + 0x93, 0x0c, 0x41, 0x5f, 0xd4, 0x04, 0x35, 0x4a, 0xca, 0xaa, 0xec, 0x2b, 0xa4, 0x2f, 0xa5, 0xde, + 0x80, 0x82, 0xdf, 0xe5, 0x35, 0x85, 0x4f, 0xd5, 0xa9, 0x3f, 0x11, 0x9e, 0xe4, 0xae, 0x82, 0x9f, + 0x0d, 0x6a, 0x17, 0x13, 0xe2, 0x43, 0x04, 0x8e, 0x58, 0x79, 0xa4, 0x16, 0xf6, 0xf0, 0xec, 0x11, + 0x45, 0xea, 0xbb, 0x02, 0x82, 0x15, 0xc6, 0xfc, 0x83, 0x01, 0x39, 0x51, 0x90, 0xbf, 0x0e, 0x05, + 0xbe, 0x7f, 0xb6, 0x15, 0x58, 0xc2, 0xae, 0xd4, 0xad, 0x20, 0xe7, 0xde, 0x21, 0x81, 0x15, 0x7b, + 0x5b, 0x08, 0xc1, 0x91, 0x44, 0x84, 0x21, 0xef, 0x04, 0xa4, 0x13, 0x1e, 0xe4, 0x53, 0x13, 0x45, + 0xab, 0x87, 0x88, 0x3a, 0xb6, 0xee, 0xdd, 0x78, 0x2b, 0x20, 0x1e, 0x3f, 0x8c, 0xf8, 0x6a, 0x6c, + 0x73, 0x19, 0x58, 0x8a, 0x32, 0xff, 0x6d, 0x40, 0xa4, 0x8a, 0x3b, 0x3f, 0x23, 0xee, 0xe1, 0x2d, + 0xc7, 0x3b, 0x56, 0xdb, 0x1a, 0x99, 0xb3, 0xaf, 0xe0, 0x38, 0xa2, 0x18, 0x97, 0x1e, 0x32, 0xd3, + 0xa5, 0x07, 0xae, 0xb0, 0xe5, 0x7b, 0x81, 0xe3, 0xf5, 0x46, 0x6e, 0xdb, 0xa6, 0x82, 0xe3, 0x88, + 0x82, 0x17, 0x22, 0x94, 0x74, 0x2c, 0xc7, 0x73, 0xbc, 0x36, 0x5f, 0xc4, 0xa6, 0xdf, 0xf3, 0x02, + 0x91, 0x91, 0x55, 0x21, 0x82, 0x47, 0xb0, 0x78, 0x0c, 0x87, 0xf9, 0xfb, 0x1c, 0x94, 0xf8, 0x9a, + 0xc3, 0x3c, 0xf7, 0x3c, 0x54, 0x5c, 0xdd, 0x0b, 0xd4, 0xda, 0x2f, 0x2a, 0x53, 0x92, 0xf7, 0x1a, + 0x27, 0x69, 0x39, 0xb3, 0x28, 0xa1, 0x22, 0xe6, 0x4c, 0x92, 0x79, 0x4b, 0x47, 0xe2, 0x24, 0x2d, + 0x8f, 0x5e, 0xf7, 0xf8, 0xfd, 0x50, 0x95, 0x49, 0x74, 0x44, 0xdf, 0xe4, 0x40, 0x2c, 0x71, 0x68, + 0x07, 0x2e, 0x58, 0xae, 0xeb, 0xdf, 0x13, 0xc0, 0x86, 0xef, 0x1f, 0x77, 0x2c, 0x7a, 0xcc, 0x44, + 0x33, 0x5d, 0x68, 0x7c, 0x41, 0xb1, 0x5c, 0xd8, 0x18, 0x25, 0xc1, 0xe3, 0xf8, 0xc6, 0x1d, 0x5b, + 0x6e, 0xca, 0x63, 0x3b, 0x82, 0xe5, 0x21, 0x90, 0xb8, 0xe5, 0xaa, 0xb3, 0x7d, 0x46, 0xc9, 0x59, + 0xc6, 0x63, 0x68, 0xce, 0x26, 0xc0, 0xf1, 0x58, 0x89, 0xe8, 0x3a, 0xcc, 0x73, 0x4f, 0xf6, 0x7b, + 0x41, 0x58, 0x77, 0xe6, 0xc5, 0x71, 0xa3, 0xd3, 0x41, 0x6d, 0xfe, 0x76, 0x02, 0x83, 0x87, 0x28, + 0xf9, 0xe6, 0xba, 0x4e, 0xc7, 0x09, 0xaa, 0x73, 0x82, 0x25, 0xda, 0xdc, 0x5b, 0x1c, 0x88, 0x25, + 0x2e, 0xe1, 0x81, 0x85, 0xf3, 0x3c, 0xd0, 0xfc, 0x4b, 0x16, 0x90, 0xac, 0xb5, 0x6d, 0x59, 0x4f, + 0xc9, 0x90, 0xc6, 0x3b, 0x02, 0x55, 0xab, 0x1b, 0x43, 0x1d, 0x81, 0x2a, 0xd3, 0x43, 0x3c, 0xda, + 0x81, 0xa2, 0x0c, 0x2d, 0xf1, 0x75, 0x59, 0x57, 0xc4, 0xc5, 0xdd, 0x10, 0x71, 0x36, 0xa8, 0xad, + 0x24, 0xd4, 0x44, 0x18, 0xd1, 0xad, 0xc5, 0x12, 0xd0, 0x55, 0x00, 0xab, 0xeb, 0xe8, 0xef, 0x75, + 0xc5, 0xf8, 0xd5, 0x26, 0xee, 0xbc, 0xb1, 0x46, 0x85, 0x5e, 0x82, 0x5c, 0xf0, 0xe9, 0x3a, 0xaa, + 0x82, 0x68, 0x18, 0x79, 0xff, 0x24, 0x24, 0x70, 0xed, 0xc2, 0x9f, 0x19, 0x37, 0x4b, 0x35, 0x43, + 0x91, 0xf6, 0xad, 0x08, 0x83, 0x35, 0x2a, 0xf4, 0x2d, 0x28, 0x1c, 0xaa, 0x52, 0x54, 0x1c, 0x4c, + 0xea, 0x10, 0x19, 0x16, 0xb0, 0xf2, 0xc9, 0x20, 0xfc, 0xc2, 0x91, 0x34, 0xf4, 0x55, 0x28, 0xb1, + 0xde, 0x41, 0x94, 0xbd, 0xe5, 0x69, 0x46, 0xa9, 0x72, 0x3f, 0x46, 0x61, 0x9d, 0xce, 0x7c, 0x13, + 0x8a, 0x3b, 0x4e, 0x8b, 0xfa, 0xa2, 0x07, 0x7c, 0x02, 0xe6, 0x58, 0xa2, 0xc1, 0x89, 0x4e, 0x32, + 0xf4, 0xb2, 0x10, 0xcf, 0xdd, 0xcb, 0xb3, 0x3c, 0x5f, 0xb6, 0x31, 0xf9, 0xd8, 0xbd, 0x5e, 0xe5, + 0x40, 0x2c, 0x71, 0xd7, 0x97, 0x79, 0x81, 0xf0, 0xd3, 0xf7, 0x6b, 0x33, 0xef, 0xbe, 0x5f, 0x9b, + 0x79, 0xef, 0x7d, 0x55, 0x2c, 0xfc, 0x11, 0x00, 0x76, 0x0f, 0xbe, 0x47, 0x5a, 0x32, 0xec, 0xa6, + 0x7a, 0xd6, 0x0b, 0x5f, 0x93, 0xc5, 0xb3, 0x5e, 0x66, 0xa8, 0xe8, 0xd3, 0x70, 0x38, 0x41, 0x89, + 0xd6, 0xa1, 0x18, 0x3d, 0xd8, 0x29, 0xff, 0x58, 0x0a, 0xfd, 0x2d, 0x7a, 0xd5, 0xc3, 0x31, 0x4d, + 0x22, 0x07, 0xe4, 0xce, 0xcd, 0x01, 0x0d, 0xc8, 0xf6, 0x1c, 0x5b, 0x35, 0xcc, 0x4f, 0x87, 0x39, + 0xf8, 0xce, 0x76, 0xf3, 0x6c, 0x50, 0x7b, 0x64, 0xd2, 0x3b, 0x79, 0xd0, 0xef, 0x12, 0x56, 0xbf, + 0xb3, 0xdd, 0xc4, 0x9c, 0x79, 0x5c, 0x40, 0x9a, 0x9d, 0x32, 0x20, 0x5d, 0x05, 0x68, 0xc7, 0xcf, + 0x0e, 0xf2, 0xbe, 0x47, 0x8e, 0xa8, 0x3d, 0x37, 0x68, 0x54, 0x88, 0xc1, 0x52, 0x8b, 0xb7, 0xe6, + 0xaa, 0xfd, 0x67, 0x81, 0xd5, 0x91, 0x0f, 0x99, 0xd3, 0xdd, 0x89, 0x4b, 0x4a, 0xcd, 0xd2, 0xe6, + 0xb0, 0x30, 0x3c, 0x2a, 0x1f, 0xf9, 0xb0, 0x64, 0xab, 0x0e, 0x31, 0x56, 0x5a, 0x9c, 0x5a, 0xe9, + 0x45, 0xae, 0xb0, 0x39, 0x2c, 0x08, 0x8f, 0xca, 0x46, 0xdf, 0x85, 0x95, 0x10, 0x38, 0xda, 0xa6, + 0x8b, 0x80, 0x9d, 0x6d, 0xac, 0x9e, 0x0e, 0x6a, 0x2b, 0xcd, 0x89, 0x54, 0xf8, 0x3e, 0x12, 0x90, + 0x0d, 0xb3, 0xae, 0x2c, 0x70, 0x4b, 0xa2, 0x28, 0xf9, 0x5a, 0xba, 0x55, 0xc4, 0xde, 0x5f, 0xd7, + 0x0b, 0xdb, 0xe8, 0xc9, 0x45, 0xd5, 0xb4, 0x4a, 0x36, 0x7a, 0x0b, 0x4a, 0x96, 0xe7, 0xf9, 0x81, + 0x25, 0x1f, 0x0e, 0xca, 0x42, 0xd5, 0xc6, 0xd4, 0xaa, 0x36, 0x62, 0x19, 0x43, 0x85, 0xb4, 0x86, + 0xc1, 0xba, 0x2a, 0x74, 0x0f, 0x16, 0xfc, 0x7b, 0x1e, 0xa1, 0x98, 0x1c, 0x12, 0x4a, 0xbc, 0x16, + 0x61, 0xd5, 0x8a, 0xd0, 0xfe, 0x4c, 0x4a, 0xed, 0x09, 0xe6, 0xd8, 0xa5, 0x93, 0x70, 0x86, 0x87, + 0xb5, 0xa0, 0x3a, 0x8f, 0xad, 0x9e, 0xe5, 0x3a, 0xdf, 0x27, 0x94, 0x55, 0xe7, 0xe3, 0xb7, 0xe6, + 0xad, 0x08, 0x8a, 0x35, 0x0a, 0xd4, 0x83, 0x4a, 0x47, 0x4f, 0x19, 0xd5, 0x25, 0x61, 0xe6, 0xb5, + 0x74, 0x66, 0x8e, 0x26, 0xb5, 0xb8, 0x82, 0x49, 0xe0, 0x70, 0x52, 0xcb, 0xca, 0x73, 0x50, 0xfa, + 0x94, 0xc5, 0x3d, 0x6f, 0x0e, 0x86, 0x0f, 0x64, 0xaa, 0xe6, 0xe0, 0x4f, 0x19, 0x98, 0x4f, 0x6e, + 0xe3, 0x50, 0x3a, 0xcc, 0xa7, 0x4a, 0x87, 0x61, 0x1b, 0x6a, 0x4c, 0x1c, 0x3a, 0x84, 0xf1, 0x39, + 0x3b, 0x31, 0x3e, 0xab, 0x30, 0x98, 0x7b, 0x90, 0x30, 0x58, 0x07, 0xe0, 0x75, 0x06, 0xf5, 0x5d, + 0x97, 0x50, 0x11, 0x01, 0x0b, 0x6a, 0xb8, 0x10, 0x41, 0xb1, 0x46, 0xc1, 0xab, 0xe1, 0x03, 0xd7, + 0x6f, 0x1d, 0x8b, 0x2d, 0x08, 0x6f, 0xaf, 0x88, 0x7d, 0x05, 0x59, 0x0d, 0x37, 0x46, 0xb0, 0x78, + 0x0c, 0x87, 0xd9, 0x87, 0x8b, 0x7b, 0x16, 0x0d, 0x1c, 0xcb, 0x8d, 0x6f, 0x8a, 0x68, 0x37, 0xde, + 0x18, 0x69, 0x66, 0x9e, 0x9e, 0xf6, 0xc6, 0xc5, 0x9b, 0x1f, 0xc3, 0xe2, 0x86, 0xc6, 0xfc, 0x9b, + 0x01, 0x97, 0xc6, 0xea, 0xfe, 0x0c, 0x9a, 0xa9, 0x37, 0x92, 0xcd, 0xd4, 0xf3, 0x29, 0x5f, 0x21, + 0xc7, 0x59, 0x3b, 0xa1, 0xb5, 0x9a, 0x83, 0xfc, 0x1e, 0x2f, 0x62, 0xcd, 0x0f, 0x0d, 0x28, 0x8b, + 0x5f, 0xd3, 0x3c, 0x02, 0xd7, 0x92, 0xb3, 0x81, 0xe2, 0xc3, 0x9b, 0x0b, 0x3c, 0x8c, 0x57, 0xe2, + 0x77, 0x0c, 0x48, 0x3e, 0xbf, 0xa2, 0x17, 0xe5, 0x15, 0x30, 0xa2, 0xf7, 0xd1, 0x29, 0xdd, 0xff, + 0x85, 0x49, 0xdd, 0xe4, 0x85, 0x54, 0x0f, 0x8d, 0x4f, 0x42, 0x11, 0xfb, 0x7e, 0xb0, 0x67, 0x05, + 0x47, 0x8c, 0xef, 0x5d, 0x97, 0xff, 0x50, 0xdb, 0x2b, 0xf6, 0x4e, 0x60, 0xb0, 0x84, 0x9b, 0x3f, + 0x37, 0xe0, 0xd2, 0xc4, 0x91, 0x0f, 0x8f, 0x22, 0xad, 0xe8, 0x4b, 0xad, 0x28, 0x72, 0xe4, 0x98, + 0x0e, 0x6b, 0x54, 0xbc, 0x0d, 0x4c, 0xcc, 0x89, 0x86, 0xdb, 0xc0, 0x84, 0x36, 0x9c, 0xa4, 0x35, + 0xff, 0x95, 0x01, 0x35, 0x63, 0xf9, 0x1f, 0x3b, 0xfd, 0xe3, 0x43, 0x13, 0x9e, 0xf9, 0xe4, 0x84, + 0x27, 0x1a, 0xe7, 0x68, 0x23, 0x8e, 0xec, 0xfd, 0x47, 0x1c, 0xe8, 0xd9, 0x68, 0x6a, 0x22, 0x7d, + 0x68, 0x35, 0x39, 0x35, 0x39, 0x1b, 0xd4, 0xca, 0x4a, 0x78, 0x72, 0x8a, 0xf2, 0x1a, 0xcc, 0xd9, + 0x24, 0xb0, 0x1c, 0x57, 0xb6, 0x74, 0xa9, 0xe7, 0x00, 0x52, 0x58, 0x53, 0xb2, 0x36, 0x4a, 0xdc, + 0x26, 0xf5, 0x81, 0x43, 0x81, 0x3c, 0x60, 0xb7, 0x7c, 0x5b, 0x76, 0x24, 0xf9, 0x38, 0x60, 0x6f, + 0xfa, 0x36, 0xc1, 0x02, 0x63, 0xbe, 0x6b, 0x40, 0x49, 0x4a, 0xda, 0xb4, 0x7a, 0x8c, 0xa0, 0x2b, + 0xd1, 0x2a, 0xe4, 0x71, 0x5f, 0xd2, 0xc7, 0x63, 0x67, 0x83, 0x5a, 0x51, 0x90, 0x89, 0x66, 0x66, + 0xcc, 0x18, 0x28, 0x73, 0xce, 0x1e, 0x3d, 0x0a, 0x79, 0x71, 0x81, 0xd4, 0x66, 0xc6, 0x73, 0x3e, + 0x0e, 0xc4, 0x12, 0x67, 0x7e, 0x9c, 0x81, 0x4a, 0x62, 0x71, 0x29, 0xfa, 0x82, 0xe8, 0xf5, 0x33, + 0x93, 0xe2, 0x45, 0x7d, 0xf2, 0x54, 0x5d, 0xa5, 0xaf, 0xd9, 0x07, 0x49, 0x5f, 0xdf, 0x86, 0xd9, + 0x16, 0xdf, 0xa3, 0xf0, 0x4f, 0x1a, 0x57, 0xa6, 0x39, 0x4e, 0xb1, 0xbb, 0xb1, 0x37, 0x8a, 0x4f, + 0x86, 0x95, 0x40, 0x74, 0x13, 0x96, 0x28, 0x09, 0x68, 0x7f, 0xe3, 0x30, 0x20, 0x54, 0x7f, 0x07, + 0xc8, 0xc7, 0xd5, 0x37, 0x1e, 0x26, 0xc0, 0xa3, 0x3c, 0xe6, 0x01, 0x94, 0x6f, 0x5b, 0x07, 0x6e, + 0x34, 0xd9, 0xc2, 0x50, 0x71, 0xbc, 0x96, 0xdb, 0xb3, 0x89, 0x0c, 0xe8, 0x61, 0xf4, 0x0a, 0x2f, + 0xed, 0xb6, 0x8e, 0x3c, 0x1b, 0xd4, 0x2e, 0x24, 0x00, 0x72, 0x94, 0x83, 0x93, 0x22, 0x4c, 0x17, + 0x72, 0x9f, 0x61, 0x27, 0xf9, 0x1d, 0x28, 0xc6, 0xb5, 0xfe, 0x43, 0x56, 0x69, 0xbe, 0x01, 0x05, + 0xee, 0xf1, 0x61, 0x8f, 0x7a, 0x4e, 0x95, 0x94, 0xac, 0xbd, 0x32, 0x69, 0x6a, 0x2f, 0x31, 0x1f, + 0xbd, 0xd3, 0xb5, 0x1f, 0x70, 0x3e, 0x9a, 0x79, 0x90, 0xcc, 0x97, 0x9d, 0x32, 0xf3, 0x5d, 0x05, + 0xf9, 0x1f, 0x12, 0x9e, 0x64, 0x64, 0x01, 0xa1, 0x25, 0x19, 0x3d, 0xff, 0x6b, 0xc3, 0x81, 0x1f, + 0x1b, 0x00, 0xe2, 0x15, 0xee, 0xc6, 0x09, 0xf1, 0x82, 0x14, 0x93, 0xf8, 0x3b, 0x30, 0xeb, 0x4b, + 0x8f, 0x94, 0x33, 0xd2, 0x29, 0x9f, 0x7a, 0xa3, 0x8b, 0x24, 0x7d, 0x12, 0x2b, 0x61, 0x8d, 0x97, + 0x3f, 0xf8, 0x64, 0x75, 0xe6, 0xc3, 0x4f, 0x56, 0x67, 0x3e, 0xfa, 0x64, 0x75, 0xe6, 0xed, 0xd3, + 0x55, 0xe3, 0x83, 0xd3, 0x55, 0xe3, 0xc3, 0xd3, 0x55, 0xe3, 0xa3, 0xd3, 0x55, 0xe3, 0xe3, 0xd3, + 0x55, 0xe3, 0xdd, 0x7f, 0xac, 0xce, 0xbc, 0xf6, 0x58, 0x9a, 0xff, 0xe6, 0xfd, 0x37, 0x00, 0x00, + 0xff, 0xff, 0x0b, 0x4d, 0x51, 0xc5, 0xdb, 0x27, 0x00, 0x00, } func (m *APIGroup) Marshal() (dAtA []byte, err error) { @@ -2665,11 +2663,6 @@ func (m *ObjectMeta) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x8a } } - i -= len(m.ZZZ_DeprecatedClusterName) - copy(dAtA[i:], m.ZZZ_DeprecatedClusterName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ZZZ_DeprecatedClusterName))) - i-- - dAtA[i] = 0x7a if len(m.Finalizers) > 0 { for iNdEx := len(m.Finalizers) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Finalizers[iNdEx]) @@ -4001,8 +3994,6 @@ func (m *ObjectMeta) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } - l = len(m.ZZZ_DeprecatedClusterName) - n += 1 + l + sovGenerated(uint64(l)) if len(m.ManagedFields) > 0 { for _, e := range m.ManagedFields { l = e.Size() @@ -4595,7 +4586,6 @@ func (this *ObjectMeta) String() string { `Annotations:` + mapStringForAnnotations + `,`, `OwnerReferences:` + repeatedStringForOwnerReferences + `,`, `Finalizers:` + fmt.Sprintf("%v", this.Finalizers) + `,`, - `ZZZ_DeprecatedClusterName:` + fmt.Sprintf("%v", this.ZZZ_DeprecatedClusterName) + `,`, `ManagedFields:` + repeatedStringForManagedFields + `,`, `}`, }, "") @@ -9212,38 +9202,6 @@ func (m *ObjectMeta) Unmarshal(dAtA []byte) error { } m.Finalizers = append(m.Finalizers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 15: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ZZZ_DeprecatedClusterName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ZZZ_DeprecatedClusterName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 17: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ManagedFields", wireType) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto index b6c773515..2be188a6a 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto @@ -162,17 +162,18 @@ message ApplyOptions { // Condition contains details for one aspect of the current state of this API Resource. // --- // This struct is intended for direct use as an array at the field path .status.conditions. For example, -// type FooStatus struct{ -// // Represents the observations of a foo's current state. -// // Known .status.conditions.type are: "Available", "Progressing", and "Degraded" -// // +patchMergeKey=type -// // +patchStrategy=merge -// // +listType=map -// // +listMapKey=type -// Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` // -// // other fields -// } +// type FooStatus struct{ +// // Represents the observations of a foo's current state. +// // Known .status.conditions.type are: "Available", "Progressing", and "Degraded" +// // +patchMergeKey=type +// // +patchStrategy=merge +// // +listType=map +// // +listMapKey=type +// Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` +// +// // other fields +// } message Condition { // type of condition in CamelCase or in foo.example.com/CamelCase. // --- @@ -785,15 +786,6 @@ message ObjectMeta { // +patchStrategy=merge repeated string finalizers = 14; - // Deprecated: ClusterName is a legacy field that was always cleared by - // the system and never used; it will be removed completely in 1.25. - // - // The name in the go struct is changed to help clients detect - // accidental use. - // - // +optional - optional string clusterName = 15; - // ManagedFields maps workflow-id and version to the set of fields // that are managed by that workflow. This is mostly for internal // housekeeping, and users typically shouldn't need to set or diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go index 1ea90de1e..92d3ed5e0 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go @@ -59,8 +59,6 @@ type Object interface { SetFinalizers(finalizers []string) GetOwnerReferences() []OwnerReference SetOwnerReferences([]OwnerReference) - GetZZZ_DeprecatedClusterName() string - SetZZZ_DeprecatedClusterName(clusterName string) GetManagedFields() []ManagedFieldsEntry SetManagedFields(managedFields []ManagedFieldsEntry) } @@ -172,10 +170,6 @@ func (meta *ObjectMeta) GetOwnerReferences() []OwnerReference { return m func (meta *ObjectMeta) SetOwnerReferences(references []OwnerReference) { meta.OwnerReferences = references } -func (meta *ObjectMeta) GetZZZ_DeprecatedClusterName() string { return meta.ZZZ_DeprecatedClusterName } -func (meta *ObjectMeta) SetZZZ_DeprecatedClusterName(clusterName string) { - meta.ZZZ_DeprecatedClusterName = clusterName -} func (meta *ObjectMeta) GetManagedFields() []ManagedFieldsEntry { return meta.ManagedFields } func (meta *ObjectMeta) SetManagedFields(managedFields []ManagedFieldsEntry) { meta.ManagedFields = managedFields diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index eb071d410..152f99296 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -17,10 +17,11 @@ limitations under the License. // Package v1 contains API types that are common to all versions. // // The package contains two categories of types: -// - external (serialized) types that lack their own version (e.g TypeMeta) -// - internal (never-serialized) types that are needed by several different -// api groups, and so live here, to avoid duplication and/or import loops -// (e.g. LabelSelector). +// - external (serialized) types that lack their own version (e.g TypeMeta) +// - internal (never-serialized) types that are needed by several different +// api groups, and so live here, to avoid duplication and/or import loops +// (e.g. LabelSelector). +// // In the future, we will probably move these categories of objects into // separate packages. package v1 @@ -254,14 +255,9 @@ type ObjectMeta struct { // +patchStrategy=merge Finalizers []string `json:"finalizers,omitempty" patchStrategy:"merge" protobuf:"bytes,14,rep,name=finalizers"` - // Deprecated: ClusterName is a legacy field that was always cleared by - // the system and never used; it will be removed completely in 1.25. - // - // The name in the go struct is changed to help clients detect - // accidental use. - // - // +optional - ZZZ_DeprecatedClusterName string `json:"clusterName,omitempty" protobuf:"bytes,15,opt,name=clusterName"` + // Tombstone: ClusterName was a legacy field that was always cleared by + // the system and never used. + // ClusterName string `json:"clusterName,omitempty" protobuf:"bytes,15,opt,name=clusterName"` // ManagedFields maps workflow-id and version to the set of fields // that are managed by that workflow. This is mostly for internal @@ -1453,17 +1449,18 @@ type PartialObjectMetadataList struct { // Condition contains details for one aspect of the current state of this API Resource. // --- // This struct is intended for direct use as an array at the field path .status.conditions. For example, -// type FooStatus struct{ -// // Represents the observations of a foo's current state. -// // Known .status.conditions.type are: "Available", "Progressing", and "Degraded" -// // +patchMergeKey=type -// // +patchStrategy=merge -// // +listType=map -// // +listMapKey=type -// Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` // -// // other fields -// } +// type FooStatus struct{ +// // Represents the observations of a foo's current state. +// // Known .status.conditions.type are: "Available", "Progressing", and "Degraded" +// // +patchMergeKey=type +// // +patchStrategy=merge +// // +listType=map +// // +listMapKey=type +// Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` +// +// // other fields +// } type Condition struct { // type of condition in CamelCase or in foo.example.com/CamelCase. // --- diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go index d002b03c8..9570726a0 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go @@ -253,7 +253,6 @@ var map_ObjectMeta = map[string]string{ "annotations": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations", "ownerReferences": "List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.", "finalizers": "Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed. Finalizers may be processed and removed in any order. Order is NOT enforced because it introduces significant risk of stuck finalizers. finalizers is a shared field, any actor with permission can reorder it. If the finalizer list is processed in order, then this can lead to a situation in which the component responsible for the first finalizer in the list is waiting for a signal (field value, external system, or other) produced by a component responsible for a finalizer later in the list, resulting in a deadlock. Without enforced ordering finalizers are free to order amongst themselves and are not vulnerable to ordering changes in the list.", - "clusterName": "Deprecated: ClusterName is a legacy field that was always cleared by the system and never used; it will be removed completely in 1.25.\n\nThe name in the go struct is changed to help clients detect accidental use.", "managedFields": "ManagedFields maps workflow-id and version to the set of fields that are managed by that workflow. This is mostly for internal housekeeping, and users typically shouldn't need to set or understand this field. A workflow can be the user's name, a controller's name, or the name of a specific apply path like \"ci-cd\". The set of fields is always in the version that the workflow used when modifying the object.", } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go index f0fad90fd..a499eee8e 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go @@ -444,18 +444,6 @@ func (u *Unstructured) SetFinalizers(finalizers []string) { u.setNestedStringSlice(finalizers, "metadata", "finalizers") } -func (u *Unstructured) GetZZZ_DeprecatedClusterName() string { - return getNestedString(u.Object, "metadata", "clusterName") -} - -func (u *Unstructured) SetZZZ_DeprecatedClusterName(clusterName string) { - if len(clusterName) == 0 { - RemoveNestedField(u.Object, "metadata", "clusterName") - return - } - u.setNestedField(clusterName, "metadata", "clusterName") -} - func (u *Unstructured) GetManagedFields() []metav1.ManagedFieldsEntry { items, found, err := NestedSlice(u.Object, "metadata", "managedFields") if !found || err != nil { diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/converter.go b/vendor/k8s.io/apimachinery/pkg/conversion/converter.go index d9b577227..76b76247c 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/converter.go +++ b/vendor/k8s.io/apimachinery/pkg/conversion/converter.go @@ -115,10 +115,10 @@ type ConversionFuncs struct { // previously defined functions. func (c ConversionFuncs) AddUntyped(a, b interface{}, fn ConversionFunc) error { tA, tB := reflect.TypeOf(a), reflect.TypeOf(b) - if tA.Kind() != reflect.Ptr { + if tA.Kind() != reflect.Pointer { return fmt.Errorf("the type %T must be a pointer to register as an untyped conversion", a) } - if tB.Kind() != reflect.Ptr { + if tB.Kind() != reflect.Pointer { return fmt.Errorf("the type %T must be a pointer to register as an untyped conversion", b) } c.untyped[typePair{tA, tB}] = fn @@ -179,10 +179,10 @@ func (c *Converter) RegisterGeneratedUntypedConversionFunc(a, b interface{}, fn func (c *Converter) RegisterIgnoredConversion(from, to interface{}) error { typeFrom := reflect.TypeOf(from) typeTo := reflect.TypeOf(to) - if typeFrom.Kind() != reflect.Ptr { + if typeFrom.Kind() != reflect.Pointer { return fmt.Errorf("expected pointer arg for 'from' param 0, got: %v", typeFrom) } - if typeTo.Kind() != reflect.Ptr { + if typeTo.Kind() != reflect.Pointer { return fmt.Errorf("expected pointer arg for 'to' param 1, got: %v", typeTo) } c.ignoredUntypedConversions[typePair{typeFrom, typeTo}] = struct{}{} diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/deep_equal.go b/vendor/k8s.io/apimachinery/pkg/conversion/deep_equal.go index f21abe1e5..25b2923f2 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/deep_equal.go +++ b/vendor/k8s.io/apimachinery/pkg/conversion/deep_equal.go @@ -34,3 +34,14 @@ func EqualitiesOrDie(funcs ...interface{}) Equalities { } return e } + +// Performs a shallow copy of the equalities map +func (e Equalities) Copy() Equalities { + result := Equalities{reflect.Equalities{}} + + for key, value := range e.Equalities { + result.Equalities[key] = value + } + + return result +} diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/helper.go b/vendor/k8s.io/apimachinery/pkg/conversion/helper.go index 4ebc1ebc5..7fadd27a4 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/helper.go +++ b/vendor/k8s.io/apimachinery/pkg/conversion/helper.go @@ -26,7 +26,7 @@ import ( // Returns an error if this is not possible. func EnforcePtr(obj interface{}) (reflect.Value, error) { v := reflect.ValueOf(obj) - if v.Kind() != reflect.Ptr { + if v.Kind() != reflect.Pointer { if v.Kind() == reflect.Invalid { return reflect.Value{}, fmt.Errorf("expected pointer, but got invalid kind") } diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go index 2f0dd0074..b0a9246d9 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go +++ b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go @@ -55,7 +55,7 @@ func jsonTag(field reflect.StructField) (string, bool) { } func isPointerKind(kind reflect.Kind) bool { - return kind == reflect.Ptr + return kind == reflect.Pointer } func isStructKind(kind reflect.Kind) bool { @@ -139,7 +139,7 @@ func Convert(obj interface{}) (url.Values, error) { } var sv reflect.Value switch reflect.TypeOf(obj).Kind() { - case reflect.Ptr, reflect.Interface: + case reflect.Pointer, reflect.Interface: sv = reflect.ValueOf(obj).Elem() default: return nil, fmt.Errorf("expecting a pointer or interface") diff --git a/vendor/k8s.io/apimachinery/pkg/labels/selector.go b/vendor/k8s.io/apimachinery/pkg/labels/selector.go index 2434429b9..6d6f562ad 100644 --- a/vendor/k8s.io/apimachinery/pkg/labels/selector.go +++ b/vendor/k8s.io/apimachinery/pkg/labels/selector.go @@ -149,7 +149,8 @@ type Requirement struct { // (4) If the operator is Exists or DoesNotExist, the value set must be empty. // (5) If the operator is Gt or Lt, the values set must contain only one value, which will be interpreted as an integer. // (6) The key is invalid due to its length, or sequence -// of characters. See validateLabelKey for more details. +// +// of characters. See validateLabelKey for more details. // // The empty string is a valid value in the input values set. // Returned error, if not nil, is guaranteed to be an aggregated field.ErrorList @@ -208,13 +209,20 @@ func (r *Requirement) hasValue(value string) bool { // There is a match in the following cases: // (1) The operator is Exists and Labels has the Requirement's key. // (2) The operator is In, Labels has the Requirement's key and Labels' -// value for that key is in Requirement's value set. +// +// value for that key is in Requirement's value set. +// // (3) The operator is NotIn, Labels has the Requirement's key and -// Labels' value for that key is not in Requirement's value set. +// +// Labels' value for that key is not in Requirement's value set. +// // (4) The operator is DoesNotExist or NotIn and Labels does not have the -// Requirement's key. +// +// Requirement's key. +// // (5) The operator is GreaterThanOperator or LessThanOperator, and Labels has -// the Requirement's key and the corresponding value satisfies mathematical inequality. +// +// the Requirement's key and the corresponding value satisfies mathematical inequality. func (r *Requirement) Matches(ls Labels) bool { switch r.operator { case selection.In, selection.Equals, selection.DoubleEquals: @@ -840,32 +848,33 @@ func (p *Parser) parseExactValue() (sets.String, error) { // as they parse different selectors with different syntaxes. // The input will cause an error if it does not follow this form: // -// ::= | "," -// ::= [!] KEY [ | ] -// ::= "" | -// ::= | -// ::= "notin" -// ::= "in" -// ::= "(" ")" -// ::= VALUE | VALUE "," -// ::= ["="|"=="|"!="] VALUE +// ::= | "," +// ::= [!] KEY [ | ] +// ::= "" | +// ::= | +// ::= "notin" +// ::= "in" +// ::= "(" ")" +// ::= VALUE | VALUE "," +// ::= ["="|"=="|"!="] VALUE // // KEY is a sequence of one or more characters following [ DNS_SUBDOMAIN "/" ] DNS_LABEL. Max length is 63 characters. // VALUE is a sequence of zero or more characters "([A-Za-z0-9_-\.])". Max length is 63 characters. // Delimiter is white space: (' ', '\t') // Example of valid syntax: -// "x in (foo,,baz),y,z notin ()" +// +// "x in (foo,,baz),y,z notin ()" // // Note: -// (1) Inclusion - " in " - denotes that the KEY exists and is equal to any of the -// VALUEs in its requirement -// (2) Exclusion - " notin " - denotes that the KEY is not equal to any -// of the VALUEs in its requirement or does not exist -// (3) The empty string is a valid VALUE -// (4) A requirement with just a KEY - as in "y" above - denotes that -// the KEY exists and can be any VALUE. -// (5) A requirement with just !KEY requires that the KEY not exist. // +// (1) Inclusion - " in " - denotes that the KEY exists and is equal to any of the +// VALUEs in its requirement +// (2) Exclusion - " notin " - denotes that the KEY is not equal to any +// of the VALUEs in its requirement or does not exist +// (3) The empty string is a valid VALUE +// (4) A requirement with just a KEY - as in "y" above - denotes that +// the KEY exists and can be any VALUE. +// (5) A requirement with just !KEY requires that the KEY not exist. func Parse(selector string, opts ...field.PathOption) (Selector, error) { parsedSelector, err := parse(selector, field.ToPath(opts...)) if err == nil { diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/allocator.go b/vendor/k8s.io/apimachinery/pkg/runtime/allocator.go index 0d00d8c3a..8bf22ae8a 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/allocator.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/allocator.go @@ -24,12 +24,14 @@ import ( // by caching created but unused items for later reuse, relieving pressure on the garbage collector. // // Usage: -// memoryAllocator := runtime.AllocatorPool.Get().(*runtime.Allocator) -// defer runtime.AllocatorPool.Put(memoryAllocator) +// +// memoryAllocator := runtime.AllocatorPool.Get().(*runtime.Allocator) +// defer runtime.AllocatorPool.Put(memoryAllocator) // // A note for future: -// consider introducing multiple pools for storing buffers of different sizes -// perhaps this could allow us to be more efficient. +// +// consider introducing multiple pools for storing buffers of different sizes +// perhaps this could allow us to be more efficient. var AllocatorPool = sync.Pool{ New: func() interface{} { return &Allocator{} @@ -58,7 +60,7 @@ func (a *Allocator) Allocate(n uint64) []byte { } // grow the buffer size := uint64(2*cap(a.buf)) + n - a.buf = make([]byte, size, size) + a.buf = make([]byte, size) a.buf = a.buf[:n] return a.buf } @@ -70,5 +72,5 @@ type SimpleAllocator struct{} var _ MemoryAllocator = &SimpleAllocator{} func (sa *SimpleAllocator) Allocate(n uint64) []byte { - return make([]byte, n, n) + return make([]byte, n) } diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/codec.go b/vendor/k8s.io/apimachinery/pkg/runtime/codec.go index a92863139..7fc513dd0 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/codec.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/codec.go @@ -344,14 +344,15 @@ func NewMultiGroupVersioner(gv schema.GroupVersion, groupKinds ...schema.GroupKi // Incoming kinds that match the provided groupKinds are preferred. // Kind may be empty in the provided group kind, in which case any kind will match. // Examples: -// gv=mygroup/__internal, groupKinds=mygroup/Foo, anothergroup/Bar -// KindForGroupVersionKinds(yetanother/v1/Baz, anothergroup/v1/Bar) -> mygroup/__internal/Bar (matched preferred group/kind) // -// gv=mygroup/__internal, groupKinds=mygroup, anothergroup -// KindForGroupVersionKinds(yetanother/v1/Baz, anothergroup/v1/Bar) -> mygroup/__internal/Bar (matched preferred group) +// gv=mygroup/__internal, groupKinds=mygroup/Foo, anothergroup/Bar +// KindForGroupVersionKinds(yetanother/v1/Baz, anothergroup/v1/Bar) -> mygroup/__internal/Bar (matched preferred group/kind) // -// gv=mygroup/__internal, groupKinds=mygroup, anothergroup -// KindForGroupVersionKinds(yetanother/v1/Baz, yetanother/v1/Bar) -> mygroup/__internal/Baz (no preferred group/kind match, uses first kind in list) +// gv=mygroup/__internal, groupKinds=mygroup, anothergroup +// KindForGroupVersionKinds(yetanother/v1/Baz, anothergroup/v1/Bar) -> mygroup/__internal/Bar (matched preferred group) +// +// gv=mygroup/__internal, groupKinds=mygroup, anothergroup +// KindForGroupVersionKinds(yetanother/v1/Baz, yetanother/v1/Bar) -> mygroup/__internal/Baz (no preferred group/kind match, uses first kind in list) func NewCoercingMultiGroupVersioner(gv schema.GroupVersion, groupKinds ...schema.GroupKind) GroupVersioner { return multiGroupVersioner{target: gv, acceptedGroupKinds: groupKinds, coerce: true} } diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go b/vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go index 000228061..e88400776 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go @@ -30,7 +30,7 @@ import ( // TODO: verify that the correct external version is chosen on encode... func CheckCodec(c Codec, internalType Object, externalTypes ...schema.GroupVersionKind) error { if _, err := Encode(c, internalType); err != nil { - return fmt.Errorf("Internal type not encodable: %v", err) + return fmt.Errorf("internal type not encodable: %v", err) } for _, et := range externalTypes { typeMeta := TypeMeta{ diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/converter.go b/vendor/k8s.io/apimachinery/pkg/runtime/converter.go index b640a9e76..90bf487e3 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/converter.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/converter.go @@ -237,7 +237,7 @@ func (c *fromUnstructuredContext) pushKey(key string) { func (c *unstructuredConverter) FromUnstructuredWithValidation(u map[string]interface{}, obj interface{}, returnUnknownFields bool) error { t := reflect.TypeOf(obj) value := reflect.ValueOf(obj) - if t.Kind() != reflect.Ptr || value.IsNil() { + if t.Kind() != reflect.Pointer || value.IsNil() { return fmt.Errorf("FromUnstructured requires a non-nil pointer to an object, got %v", t) } @@ -291,7 +291,7 @@ func fromUnstructured(sv, dv reflect.Value, ctx *fromUnstructuredContext) error st, dt := sv.Type(), dv.Type() switch dt.Kind() { - case reflect.Map, reflect.Slice, reflect.Ptr, reflect.Struct, reflect.Interface: + case reflect.Map, reflect.Slice, reflect.Pointer, reflect.Struct, reflect.Interface: // Those require non-trivial conversion. default: // This should handle all simple types. @@ -353,7 +353,7 @@ func fromUnstructured(sv, dv reflect.Value, ctx *fromUnstructuredContext) error return mapFromUnstructured(sv, dv, ctx) case reflect.Slice: return sliceFromUnstructured(sv, dv, ctx) - case reflect.Ptr: + case reflect.Pointer: return pointerFromUnstructured(sv, dv, ctx) case reflect.Struct: return structFromUnstructured(sv, dv, ctx) @@ -496,13 +496,13 @@ func sliceFromUnstructured(sv, dv reflect.Value, ctx *fromUnstructuredContext) e func pointerFromUnstructured(sv, dv reflect.Value, ctx *fromUnstructuredContext) error { st, dt := sv.Type(), dv.Type() - if st.Kind() == reflect.Ptr && sv.IsNil() { + if st.Kind() == reflect.Pointer && sv.IsNil() { dv.Set(reflect.Zero(dt)) return nil } dv.Set(reflect.New(dt.Elem())) switch st.Kind() { - case reflect.Ptr, reflect.Interface: + case reflect.Pointer, reflect.Interface: return fromUnstructured(sv.Elem(), dv.Elem(), ctx) default: return fromUnstructured(sv, dv.Elem(), ctx) @@ -579,7 +579,7 @@ func (c *unstructuredConverter) ToUnstructured(obj interface{}) (map[string]inte } else { t := reflect.TypeOf(obj) value := reflect.ValueOf(obj) - if t.Kind() != reflect.Ptr || value.IsNil() { + if t.Kind() != reflect.Pointer || value.IsNil() { return nil, fmt.Errorf("ToUnstructured requires a non-nil pointer to an object, got %v", t) } u = map[string]interface{}{} @@ -686,7 +686,7 @@ func toUnstructured(sv, dv reflect.Value) error { return mapToUnstructured(sv, dv) case reflect.Slice: return sliceToUnstructured(sv, dv) - case reflect.Ptr: + case reflect.Pointer: return pointerToUnstructured(sv, dv) case reflect.Struct: return structToUnstructured(sv, dv) @@ -790,7 +790,7 @@ func isZero(v reflect.Value) bool { case reflect.Map, reflect.Slice: // TODO: It seems that 0-len maps are ignored in it. return v.IsNil() || v.Len() == 0 - case reflect.Ptr, reflect.Interface: + case reflect.Pointer, reflect.Interface: return v.IsNil() } return false diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto b/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto index de634e2c6..5f06cc574 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto @@ -31,32 +31,37 @@ option go_package = "k8s.io/apimachinery/pkg/runtime"; // various plugin types. // // // Internal package: -// type MyAPIObject struct { -// runtime.TypeMeta `json:",inline"` -// MyPlugin runtime.Object `json:"myPlugin"` -// } -// type PluginA struct { -// AOption string `json:"aOption"` -// } +// +// type MyAPIObject struct { +// runtime.TypeMeta `json:",inline"` +// MyPlugin runtime.Object `json:"myPlugin"` +// } +// +// type PluginA struct { +// AOption string `json:"aOption"` +// } // // // External package: -// type MyAPIObject struct { -// runtime.TypeMeta `json:",inline"` -// MyPlugin runtime.RawExtension `json:"myPlugin"` -// } -// type PluginA struct { -// AOption string `json:"aOption"` -// } +// +// type MyAPIObject struct { +// runtime.TypeMeta `json:",inline"` +// MyPlugin runtime.RawExtension `json:"myPlugin"` +// } +// +// type PluginA struct { +// AOption string `json:"aOption"` +// } // // // On the wire, the JSON will look something like this: -// { -// "kind":"MyAPIObject", -// "apiVersion":"v1", -// "myPlugin": { -// "kind":"PluginA", -// "aOption":"foo", -// }, -// } +// +// { +// "kind":"MyAPIObject", +// "apiVersion":"v1", +// "myPlugin": { +// "kind":"PluginA", +// "aOption":"foo", +// }, +// } // // So what happens? Decode first uses json or yaml to unmarshal the serialized data into // your external MyAPIObject. That causes the raw JSON to be stored, but not unpacked. @@ -78,10 +83,12 @@ message RawExtension { // TypeMeta is shared by all top level objects. The proper way to use it is to inline it in your type, // like this: -// type MyAwesomeAPIObject struct { -// runtime.TypeMeta `json:",inline"` -// ... // other fields -// } +// +// type MyAwesomeAPIObject struct { +// runtime.TypeMeta `json:",inline"` +// ... // other fields +// } +// // func (obj *MyAwesomeAPIObject) SetGroupVersionKind(gvk *metav1.GroupVersionKind) { metav1.UpdateTypeMeta(obj,gvk) }; GroupVersionKind() *GroupVersionKind // // TypeMeta is provided here for convenience. You may use it directly from this package or define diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go b/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go index 994a3e3fa..b21eb664e 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go @@ -191,7 +191,8 @@ func (gv GroupVersion) Identifier() string { // if none of the options match the group. It prefers a match to group and version over just group. // TODO: Move GroupVersion to a package under pkg/runtime, since it's used by scheme. // TODO: Introduce an adapter type between GroupVersion and runtime.GroupVersioner, and use LegacyCodec(GroupVersion) -// in fewer places. +// +// in fewer places. func (gv GroupVersion) KindForGroupVersionKinds(kinds []GroupVersionKind) (target GroupVersionKind, ok bool) { for _, gvk := range kinds { if gvk.Group == gv.Group && gvk.Version == gv.Version { @@ -239,7 +240,8 @@ func (gv GroupVersion) WithResource(resource string) GroupVersionResource { // GroupVersions can be used to represent a set of desired group versions. // TODO: Move GroupVersions to a package under pkg/runtime, since it's used by scheme. // TODO: Introduce an adapter type between GroupVersions and runtime.GroupVersioner, and use LegacyCodec(GroupVersion) -// in fewer places. +// +// in fewer places. type GroupVersions []GroupVersion // Identifier implements runtime.GroupVersioner interface. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go index a9d656f8e..18b25a994 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go @@ -118,7 +118,8 @@ func (s *Scheme) Converter() *conversion.Converter { // API group and version that would never be updated. // // TODO: there is discussion about removing unversioned and replacing it with objects that are manifest into -// every version with particular schemas. Resolve this method at that point. +// +// every version with particular schemas. Resolve this method at that point. func (s *Scheme) AddUnversionedTypes(version schema.GroupVersion, types ...Object) { s.addObservedVersion(version) s.AddKnownTypes(version, types...) @@ -141,7 +142,7 @@ func (s *Scheme) AddKnownTypes(gv schema.GroupVersion, types ...Object) { s.addObservedVersion(gv) for _, obj := range types { t := reflect.TypeOf(obj) - if t.Kind() != reflect.Ptr { + if t.Kind() != reflect.Pointer { panic("All types must be pointers to structs.") } t = t.Elem() @@ -159,7 +160,7 @@ func (s *Scheme) AddKnownTypeWithName(gvk schema.GroupVersionKind, obj Object) { if len(gvk.Version) == 0 { panic(fmt.Sprintf("version is required on all types: %s %v", gvk, t)) } - if t.Kind() != reflect.Ptr { + if t.Kind() != reflect.Pointer { panic("All types must be pointers to structs.") } t = t.Elem() @@ -462,7 +463,7 @@ func (s *Scheme) convertToVersion(copy bool, in Object, target GroupVersioner) ( } else { // determine the incoming kinds with as few allocations as possible. t = reflect.TypeOf(in) - if t.Kind() != reflect.Ptr { + if t.Kind() != reflect.Pointer { return nil, fmt.Errorf("only pointer types may be converted: %v", t) } t = t.Elem() diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go index 9de35e791..21944f2d8 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go @@ -259,7 +259,8 @@ func (f CodecFactory) SupportedMediaTypes() []runtime.SerializerInfo { // invoke CodecForVersions. Callers that need only to read data should use UniversalDecoder(). // // TODO: make this call exist only in pkg/api, and initialize it with the set of default versions. -// All other callers will be forced to request a Codec directly. +// +// All other callers will be forced to request a Codec directly. func (f CodecFactory) LegacyCodec(version ...schema.GroupVersion) runtime.Codec { return versioning.NewDefaultingCodecForScheme(f.scheme, f.legacySerializer, f.universal, schema.GroupVersions(version), runtime.InternalGroupVersioner) } diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/types.go b/vendor/k8s.io/apimachinery/pkg/runtime/types.go index 31359f35f..3dc9a5a2f 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/types.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/types.go @@ -21,10 +21,12 @@ package runtime // TypeMeta is shared by all top level objects. The proper way to use it is to inline it in your type, // like this: -// type MyAwesomeAPIObject struct { -// runtime.TypeMeta `json:",inline"` -// ... // other fields -// } +// +// type MyAwesomeAPIObject struct { +// runtime.TypeMeta `json:",inline"` +// ... // other fields +// } +// // func (obj *MyAwesomeAPIObject) SetGroupVersionKind(gvk *metav1.GroupVersionKind) { metav1.UpdateTypeMeta(obj,gvk) }; GroupVersionKind() *GroupVersionKind // // TypeMeta is provided here for convenience. You may use it directly from this package or define @@ -53,32 +55,37 @@ const ( // various plugin types. // // // Internal package: -// type MyAPIObject struct { -// runtime.TypeMeta `json:",inline"` -// MyPlugin runtime.Object `json:"myPlugin"` -// } -// type PluginA struct { -// AOption string `json:"aOption"` -// } +// +// type MyAPIObject struct { +// runtime.TypeMeta `json:",inline"` +// MyPlugin runtime.Object `json:"myPlugin"` +// } +// +// type PluginA struct { +// AOption string `json:"aOption"` +// } // // // External package: -// type MyAPIObject struct { -// runtime.TypeMeta `json:",inline"` -// MyPlugin runtime.RawExtension `json:"myPlugin"` -// } -// type PluginA struct { -// AOption string `json:"aOption"` -// } +// +// type MyAPIObject struct { +// runtime.TypeMeta `json:",inline"` +// MyPlugin runtime.RawExtension `json:"myPlugin"` +// } +// +// type PluginA struct { +// AOption string `json:"aOption"` +// } // // // On the wire, the JSON will look something like this: -// { -// "kind":"MyAPIObject", -// "apiVersion":"v1", -// "myPlugin": { -// "kind":"PluginA", -// "aOption":"foo", -// }, -// } +// +// { +// "kind":"MyAPIObject", +// "apiVersion":"v1", +// "myPlugin": { +// "kind":"PluginA", +// "aOption":"foo", +// }, +// } // // So what happens? Decode first uses json or yaml to unmarshal the serialized data into // your external MyAPIObject. That causes the raw JSON to be stored, but not unpacked. diff --git a/vendor/k8s.io/apimachinery/pkg/types/nodename.go b/vendor/k8s.io/apimachinery/pkg/types/nodename.go index fee348d7e..cff9ca671 100644 --- a/vendor/k8s.io/apimachinery/pkg/types/nodename.go +++ b/vendor/k8s.io/apimachinery/pkg/types/nodename.go @@ -23,21 +23,21 @@ package types // // To clarify the various types: // -// * Node.Name is the Name field of the Node in the API. This should be stored in a NodeName. -// Unfortunately, because Name is part of ObjectMeta, we can't store it as a NodeName at the API level. +// - Node.Name is the Name field of the Node in the API. This should be stored in a NodeName. +// Unfortunately, because Name is part of ObjectMeta, we can't store it as a NodeName at the API level. // -// * Hostname is the hostname of the local machine (from uname -n). -// However, some components allow the user to pass in a --hostname-override flag, -// which will override this in most places. In the absence of anything more meaningful, -// kubelet will use Hostname as the Node.Name when it creates the Node. +// - Hostname is the hostname of the local machine (from uname -n). +// However, some components allow the user to pass in a --hostname-override flag, +// which will override this in most places. In the absence of anything more meaningful, +// kubelet will use Hostname as the Node.Name when it creates the Node. // // * The cloudproviders have the own names: GCE has InstanceName, AWS has InstanceId. // -// For GCE, InstanceName is the Name of an Instance object in the GCE API. On GCE, Instance.Name becomes the -// Hostname, and thus it makes sense also to use it as the Node.Name. But that is GCE specific, and it is up -// to the cloudprovider how to do this mapping. +// For GCE, InstanceName is the Name of an Instance object in the GCE API. On GCE, Instance.Name becomes the +// Hostname, and thus it makes sense also to use it as the Node.Name. But that is GCE specific, and it is up +// to the cloudprovider how to do this mapping. // -// For AWS, the InstanceID is not yet suitable for use as a Node.Name, so we actually use the -// PrivateDnsName for the Node.Name. And this is _not_ always the same as the hostname: if -// we are using a custom DHCP domain it won't be. +// For AWS, the InstanceID is not yet suitable for use as a Node.Name, so we actually use the +// PrivateDnsName for the Node.Name. And this is _not_ always the same as the hostname: if +// we are using a custom DHCP domain it won't be. type NodeName string diff --git a/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go b/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go index fa9ffa51b..ec4002e38 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go +++ b/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go @@ -135,7 +135,7 @@ func IgnoreUnset() cmp.Option { if v2.Len() == 0 { return true } - case reflect.Interface, reflect.Ptr: + case reflect.Interface, reflect.Pointer: if v2.IsNil() { return true } diff --git a/vendor/k8s.io/apimachinery/pkg/util/duration/duration.go b/vendor/k8s.io/apimachinery/pkg/util/duration/duration.go index 1bc1e3c81..c31b2a0cb 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/duration/duration.go +++ b/vendor/k8s.io/apimachinery/pkg/util/duration/duration.go @@ -27,9 +27,9 @@ func ShortHumanDuration(d time.Duration) string { // Allow deviation no more than 2 seconds(excluded) to tolerate machine time // inconsistence, it can be considered as almost now. if seconds := int(d.Seconds()); seconds < -1 { - return fmt.Sprintf("") + return "" } else if seconds < 0 { - return fmt.Sprintf("0s") + return "0s" } else if seconds < 60 { return fmt.Sprintf("%ds", seconds) } else if minutes := int(d.Minutes()); minutes < 60 { @@ -49,9 +49,9 @@ func HumanDuration(d time.Duration) string { // Allow deviation no more than 2 seconds(excluded) to tolerate machine time // inconsistence, it can be considered as almost now. if seconds := int(d.Seconds()); seconds < -1 { - return fmt.Sprintf("") + return "" } else if seconds < 0 { - return fmt.Sprintf("0s") + return "0s" } else if seconds < 60*2 { return fmt.Sprintf("%ds", seconds) } diff --git a/vendor/k8s.io/apimachinery/pkg/util/framer/framer.go b/vendor/k8s.io/apimachinery/pkg/util/framer/framer.go index 10df0d99c..ca08f8561 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/framer/framer.go +++ b/vendor/k8s.io/apimachinery/pkg/util/framer/framer.go @@ -56,10 +56,10 @@ type lengthDelimitedFrameReader struct { // // The protocol is: // -// stream: message ... -// message: prefix body -// prefix: 4 byte uint32 in BigEndian order, denotes length of body -// body: bytes (0..prefix) +// stream: message ... +// message: prefix body +// prefix: 4 byte uint32 in BigEndian order, denotes length of body +// body: bytes (0..prefix) // // If the buffer passed to Read is not long enough to contain an entire frame, io.ErrShortRead // will be returned along with the number of bytes read. diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go index 9ec368501..ea0481799 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go @@ -18,13 +18,11 @@ package spdy import ( "bufio" - "bytes" "context" "crypto/tls" "encoding/base64" "errors" "fmt" - "io" "io/ioutil" "net" "net/http" @@ -264,17 +262,8 @@ func (s *SpdyRoundTripper) tlsConn(ctx context.Context, rwc net.Conn, targetHost tlsConn := tls.Client(rwc, tlsConfig) - // need to manually call Handshake() so we can call VerifyHostname() below if err := tlsConn.HandshakeContext(ctx); err != nil { - return nil, err - } - - // Return if we were configured to skip validation - if tlsConfig.InsecureSkipVerify { - return tlsConn, nil - } - - if err := tlsConn.VerifyHostname(tlsConfig.ServerName); err != nil { + tlsConn.Close() return nil, err } @@ -284,46 +273,20 @@ func (s *SpdyRoundTripper) tlsConn(ctx context.Context, rwc net.Conn, targetHost // dialWithoutProxy dials the host specified by url, using TLS if appropriate. func (s *SpdyRoundTripper) dialWithoutProxy(ctx context.Context, url *url.URL) (net.Conn, error) { dialAddr := netutil.CanonicalAddr(url) - - if url.Scheme == "http" { - if s.Dialer == nil { - var d net.Dialer - return d.DialContext(ctx, "tcp", dialAddr) - } else { - return s.Dialer.DialContext(ctx, "tcp", dialAddr) - } - } - - // TODO validate the TLSClientConfig is set up? - var conn *tls.Conn - var err error - if s.Dialer == nil { - conn, err = tls.Dial("tcp", dialAddr, s.tlsConfig) - } else { - conn, err = tls.DialWithDialer(s.Dialer, "tcp", dialAddr, s.tlsConfig) - } - if err != nil { - return nil, err + dialer := s.Dialer + if dialer == nil { + dialer = &net.Dialer{} } - // Return if we were configured to skip validation - if s.tlsConfig != nil && s.tlsConfig.InsecureSkipVerify { - return conn, nil + if url.Scheme == "http" { + return dialer.DialContext(ctx, "tcp", dialAddr) } - host, _, err := net.SplitHostPort(dialAddr) - if err != nil { - return nil, err - } - if s.tlsConfig != nil && len(s.tlsConfig.ServerName) > 0 { - host = s.tlsConfig.ServerName - } - err = conn.VerifyHostname(host) - if err != nil { - return nil, err + tlsDialer := tls.Dialer{ + NetDialer: dialer, + Config: s.tlsConfig, } - - return conn, nil + return tlsDialer.DialContext(ctx, "tcp", dialAddr) } // proxyAuth returns, for a given proxy URL, the value to be used for the Proxy-Authorization header @@ -340,35 +303,20 @@ func (s *SpdyRoundTripper) proxyAuth(proxyURL *url.URL) string { // clients may call SpdyRoundTripper.Connection() to retrieve the upgraded // connection. func (s *SpdyRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - header := utilnet.CloneHeader(req.Header) - header.Add(httpstream.HeaderConnection, httpstream.HeaderUpgrade) - header.Add(httpstream.HeaderUpgrade, HeaderSpdy31) - - var ( - conn net.Conn - rawResponse []byte - err error - ) + req = utilnet.CloneRequest(req) + req.Header.Add(httpstream.HeaderConnection, httpstream.HeaderUpgrade) + req.Header.Add(httpstream.HeaderUpgrade, HeaderSpdy31) - clone := utilnet.CloneRequest(req) - clone.Header = header - conn, err = s.Dial(clone) + conn, err := s.Dial(req) if err != nil { return nil, err } - responseReader := bufio.NewReader( - io.MultiReader( - bytes.NewBuffer(rawResponse), - conn, - ), - ) + responseReader := bufio.NewReader(conn) resp, err := http.ReadResponse(responseReader, nil) if err != nil { - if conn != nil { - conn.Close() - } + conn.Close() return nil, err } diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go index f17eb09e9..d30ae2fa3 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go @@ -94,7 +94,7 @@ func (u responseUpgrader) UpgradeResponse(w http.ResponseWriter, req *http.Reque hijacker, ok := w.(http.Hijacker) if !ok { - errorMsg := fmt.Sprintf("unable to upgrade: unable to hijack response") + errorMsg := "unable to upgrade: unable to hijack response" http.Error(w, errorMsg, http.StatusInternalServerError) return nil } diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go b/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go index c27380c19..5e8009704 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go +++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go @@ -145,7 +145,7 @@ func ValueOrDefault(intOrPercent *IntOrString, defaultValue IntOrString) *IntOrS // GetScaledValueFromIntOrPercent is meant to replace GetValueFromIntOrPercent. // This method returns a scaled value from an IntOrString type. If the IntOrString // is a percentage string value it's treated as a percentage and scaled appropriately -// in accordance to the total, if it's an int value it's treated as a a simple value and +// in accordance to the total, if it's an int value it's treated as a simple value and // if it is a string value which is either non-numeric or numeric but lacking a trailing '%' it returns an error. func GetScaledValueFromIntOrPercent(intOrPercent *IntOrString, total int, roundUp bool) (int, error) { if intOrPercent == nil { diff --git a/vendor/k8s.io/apimachinery/pkg/util/managedfields/extract.go b/vendor/k8s.io/apimachinery/pkg/util/managedfields/extract.go index 792badbc3..d2ce66c1b 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/managedfields/extract.go +++ b/vendor/k8s.io/apimachinery/pkg/util/managedfields/extract.go @@ -45,7 +45,7 @@ import ( // and their field paths and types are exactly the same, then ExtractInto can be // called with the root resource as the object and the subresource as the // applyConfiguration. This works for "status", obviously, because status is -// represented by the exact same object as the root resource. This this does NOT +// represented by the exact same object as the root resource. This does NOT // work, for example, with the "scale" subresources of Deployment, ReplicaSet and // StatefulSet. While the spec.replicas, status.replicas fields are in the same // exact field path locations as they are in autoscaling.Scale, the selector diff --git a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go index 990fa0d43..e39627568 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go +++ b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go @@ -88,7 +88,8 @@ func toYAML(v interface{}) (string, error) { // supports JSON merge patch semantics. // // NOTE: Numbers with different types (e.g. int(0) vs int64(0)) will be detected as conflicts. -// Make sure the unmarshaling of left and right are consistent (e.g. use the same library). +// +// Make sure the unmarshaling of left and right are consistent (e.g. use the same library). func HasConflicts(left, right interface{}) (bool, error) { switch typedLeft := left.(type) { case map[string]interface{}: diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/interface.go b/vendor/k8s.io/apimachinery/pkg/util/net/interface.go index 822416806..01d028e72 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/interface.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/interface.go @@ -339,7 +339,7 @@ func chooseIPFromHostInterfaces(nw networkInterfacer, addressFamilies AddressFam for _, addr := range addrs { ip, _, err := netutils.ParseCIDRSloppy(addr.String()) if err != nil { - return nil, fmt.Errorf("Unable to parse CIDR for interface %q: %s", intf.Name, err) + return nil, fmt.Errorf("unable to parse CIDR for interface %q: %s", intf.Name, err) } if !memberOf(ip, family) { klog.V(4).Infof("Skipping: no address family match for %q on interface %q.", ip, intf.Name) diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/port_split.go b/vendor/k8s.io/apimachinery/pkg/util/net/port_split.go index c0fd4e20f..f54bb1e71 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/port_split.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/port_split.go @@ -25,9 +25,9 @@ import ( var validSchemes = sets.NewString("http", "https", "") // SplitSchemeNamePort takes a string of the following forms: -// * "", returns "", "","", true -// * ":", returns "", "","",true -// * "::", returns "","","",true +// - "", returns "", "","", true +// - ":", returns "", "","",true +// - "::", returns "","","",true // // Name must be non-empty or valid will be returned false. // Scheme must be "http" or "https" if specified @@ -57,9 +57,10 @@ func SplitSchemeNamePort(id string) (scheme, name, port string, valid bool) { } // JoinSchemeNamePort returns a string that specifies the scheme, name, and port: -// * "" -// * ":" -// * "::" +// - "" +// - ":" +// - "::" +// // None of the parameters may contain a ':' character // Name is required // Scheme must be "", "http", or "https" diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/util.go b/vendor/k8s.io/apimachinery/pkg/util/net/util.go index 5950087e0..1c2aba55f 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/util.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/util.go @@ -25,6 +25,7 @@ import ( // IPNetEqual checks if the two input IPNets are representing the same subnet. // For example, +// // 10.0.0.1/24 and 10.0.0.0/24 are the same subnet. // 10.0.0.1/24 and 10.0.0.0/25 are not the same subnet. func IPNetEqual(ipnet1, ipnet2 *net.IPNet) bool { diff --git a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go index 9f834fa53..d738725ca 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go +++ b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go @@ -142,7 +142,7 @@ func GetCaller() string { runtime.Callers(3, pc[:]) f := runtime.FuncForPC(pc[0]) if f == nil { - return fmt.Sprintf("Unable to find caller") + return "Unable to find caller" } return f.Name() } diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go b/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go index 9bfa85d43..5d280dd37 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go @@ -28,7 +28,7 @@ type Byte map[byte]Empty // NewByte creates a Byte from a list of values. func NewByte(items ...byte) Byte { - ss := Byte{} + ss := make(Byte, len(items)) ss.Insert(items...) return ss } @@ -87,6 +87,15 @@ func (s Byte) HasAny(items ...byte) bool { return false } +// Clone returns a new set which is a copy of the current set. +func (s Byte) Clone() Byte { + result := make(Byte, len(s)) + for key := range s { + result.Insert(key) + } + return result +} + // Difference returns a set of objects that are not in s2 // For example: // s1 = {a1, a2, a3} @@ -110,10 +119,7 @@ func (s Byte) Difference(s2 Byte) Byte { // s1.Union(s2) = {a1, a2, a3, a4} // s2.Union(s1) = {a1, a2, a3, a4} func (s1 Byte) Union(s2 Byte) Byte { - result := NewByte() - for key := range s1 { - result.Insert(key) - } + result := s1.Clone() for key := range s2 { result.Insert(key) } diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/int.go b/vendor/k8s.io/apimachinery/pkg/util/sets/int.go index 88bd70967..f9a79d981 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/int.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/int.go @@ -28,7 +28,7 @@ type Int map[int]Empty // NewInt creates a Int from a list of values. func NewInt(items ...int) Int { - ss := Int{} + ss := make(Int, len(items)) ss.Insert(items...) return ss } @@ -87,6 +87,15 @@ func (s Int) HasAny(items ...int) bool { return false } +// Clone returns a new set which is a copy of the current set. +func (s Int) Clone() Int { + result := make(Int, len(s)) + for key := range s { + result.Insert(key) + } + return result +} + // Difference returns a set of objects that are not in s2 // For example: // s1 = {a1, a2, a3} @@ -110,10 +119,7 @@ func (s Int) Difference(s2 Int) Int { // s1.Union(s2) = {a1, a2, a3, a4} // s2.Union(s1) = {a1, a2, a3, a4} func (s1 Int) Union(s2 Int) Int { - result := NewInt() - for key := range s1 { - result.Insert(key) - } + result := s1.Clone() for key := range s2 { result.Insert(key) } diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/int32.go b/vendor/k8s.io/apimachinery/pkg/util/sets/int32.go index 96a485554..fc416c55a 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/int32.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/int32.go @@ -28,7 +28,7 @@ type Int32 map[int32]Empty // NewInt32 creates a Int32 from a list of values. func NewInt32(items ...int32) Int32 { - ss := Int32{} + ss := make(Int32, len(items)) ss.Insert(items...) return ss } @@ -87,6 +87,15 @@ func (s Int32) HasAny(items ...int32) bool { return false } +// Clone returns a new set which is a copy of the current set. +func (s Int32) Clone() Int32 { + result := make(Int32, len(s)) + for key := range s { + result.Insert(key) + } + return result +} + // Difference returns a set of objects that are not in s2 // For example: // s1 = {a1, a2, a3} @@ -110,10 +119,7 @@ func (s Int32) Difference(s2 Int32) Int32 { // s1.Union(s2) = {a1, a2, a3, a4} // s2.Union(s1) = {a1, a2, a3, a4} func (s1 Int32) Union(s2 Int32) Int32 { - result := NewInt32() - for key := range s1 { - result.Insert(key) - } + result := s1.Clone() for key := range s2 { result.Insert(key) } diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go b/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go index b375a1b06..03ecb5f1f 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go @@ -28,7 +28,7 @@ type Int64 map[int64]Empty // NewInt64 creates a Int64 from a list of values. func NewInt64(items ...int64) Int64 { - ss := Int64{} + ss := make(Int64, len(items)) ss.Insert(items...) return ss } @@ -87,6 +87,15 @@ func (s Int64) HasAny(items ...int64) bool { return false } +// Clone returns a new set which is a copy of the current set. +func (s Int64) Clone() Int64 { + result := make(Int64, len(s)) + for key := range s { + result.Insert(key) + } + return result +} + // Difference returns a set of objects that are not in s2 // For example: // s1 = {a1, a2, a3} @@ -110,10 +119,7 @@ func (s Int64) Difference(s2 Int64) Int64 { // s1.Union(s2) = {a1, a2, a3, a4} // s2.Union(s1) = {a1, a2, a3, a4} func (s1 Int64) Union(s2 Int64) Int64 { - result := NewInt64() - for key := range s1 { - result.Insert(key) - } + result := s1.Clone() for key := range s2 { result.Insert(key) } diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/string.go b/vendor/k8s.io/apimachinery/pkg/util/sets/string.go index e6f37db88..99b4cab32 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/string.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/string.go @@ -28,7 +28,7 @@ type String map[string]Empty // NewString creates a String from a list of values. func NewString(items ...string) String { - ss := String{} + ss := make(String, len(items)) ss.Insert(items...) return ss } @@ -87,6 +87,15 @@ func (s String) HasAny(items ...string) bool { return false } +// Clone returns a new set which is a copy of the current set. +func (s String) Clone() String { + result := make(String, len(s)) + for key := range s { + result.Insert(key) + } + return result +} + // Difference returns a set of objects that are not in s2 // For example: // s1 = {a1, a2, a3} @@ -110,10 +119,7 @@ func (s String) Difference(s2 String) String { // s1.Union(s2) = {a1, a2, a3, a4} // s2.Union(s1) = {a1, a2, a3, a4} func (s1 String) Union(s2 String) String { - result := NewString() - for key := range s1 { - result.Insert(key) - } + result := s1.Clone() for key := range s2 { result.Insert(key) } diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go index d49a56536..df305b712 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go +++ b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go @@ -105,7 +105,7 @@ func (s PatchMetaFromStruct) LookupPatchMetadataForSlice(key string) (LookupPatc // If the underlying element is neither an array nor a slice, the pointer is pointing to a slice, // e.g. https://github.com/kubernetes/kubernetes/blob/bc22e206c79282487ea0bf5696d5ccec7e839a76/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go#L2782-L2822 // If the underlying element is either an array or a slice, return its element type. - case reflect.Ptr: + case reflect.Pointer: t = t.Elem() if t.Kind() == reflect.Array || t.Kind() == reflect.Slice { t = t.Elem() @@ -129,7 +129,7 @@ func getTagStructType(dataStruct interface{}) (reflect.Type, error) { t := reflect.TypeOf(dataStruct) // Get the underlying type for pointers - if t.Kind() == reflect.Ptr { + if t.Kind() == reflect.Pointer { t = t.Elem() } diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go b/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go index b7abf39b5..ae73bda96 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go @@ -42,9 +42,9 @@ func (v *Error) Error() string { return fmt.Sprintf("%s: %s", v.Field, v.ErrorBody()) } -type omitValueType struct{} +type OmitValueType struct{} -var omitValue = omitValueType{} +var omitValue = OmitValueType{} // ErrorBody returns the error message without the field name. This is useful // for building nice-looking higher-level error reporting. @@ -66,7 +66,7 @@ func (v *Error) ErrorBody() string { valueType := reflect.TypeOf(value) if value == nil || valueType == nil { value = "null" - } else if valueType.Kind() == reflect.Ptr { + } else if valueType.Kind() == reflect.Pointer { if reflectValue := reflect.ValueOf(value); reflectValue.IsNil() { value = "null" } else { diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go b/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go index 83df4fb8d..e767092dd 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go @@ -334,7 +334,7 @@ func IsValidPortName(port string) []string { errs = append(errs, "must contain only alpha-numeric characters (a-z, 0-9), and hyphens (-)") } if !portNameOneLetterRegexp.MatchString(port) { - errs = append(errs, "must contain at least one letter or number (a-z, 0-9)") + errs = append(errs, "must contain at least one letter (a-z)") } if strings.Contains(port, "--") { errs = append(errs, "must not contain consecutive hyphens") diff --git a/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go b/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go index ec5be90b8..137627b40 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go +++ b/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go @@ -29,9 +29,11 @@ import ( ) // For any test of the style: -// ... -// <- time.After(timeout): -// t.Errorf("Timed out") +// +// ... +// <- time.After(timeout): +// t.Errorf("Timed out") +// // The value for timeout should effectively be "forever." Obviously we don't want our tests to truly lock up forever, but 30s // is long enough that it is effectively forever for the things that can slow down a run on a heavily contended machine // (GC, seeks, etc), but not so long as to make a developer ctrl-c a test run if they do happen to break that test. @@ -288,13 +290,13 @@ func (b *Backoff) Step() time.Duration { return duration } -// contextForChannel derives a child context from a parent channel. +// ContextForChannel derives a child context from a parent channel. // // The derived context's Done channel is closed when the returned cancel function // is called or when the parent channel is closed, whichever happens first. // // Note the caller must *always* call the CancelFunc, otherwise resources may be leaked. -func contextForChannel(parentCh <-chan struct{}) (context.Context, context.CancelFunc) { +func ContextForChannel(parentCh <-chan struct{}) (context.Context, context.CancelFunc) { ctx, cancel := context.WithCancel(context.Background()) go func() { @@ -464,7 +466,7 @@ func PollWithContext(ctx context.Context, interval, timeout time.Duration, condi // PollUntil always waits interval before the first run of 'condition'. // 'condition' will always be invoked at least once. func PollUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error { - ctx, cancel := contextForChannel(stopCh) + ctx, cancel := ContextForChannel(stopCh) defer cancel() return PollUntilWithContext(ctx, interval, condition.WithContext()) } @@ -531,7 +533,7 @@ func PollImmediateWithContext(ctx context.Context, interval, timeout time.Durati // PollImmediateUntil runs the 'condition' before waiting for the interval. // 'condition' will always be invoked at least once. func PollImmediateUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error { - ctx, cancel := contextForChannel(stopCh) + ctx, cancel := ContextForChannel(stopCh) defer cancel() return PollImmediateUntilWithContext(ctx, interval, condition.WithContext()) } @@ -566,7 +568,7 @@ func PollImmediateInfiniteWithContext(ctx context.Context, interval time.Duratio return poll(ctx, true, poller(interval, 0), condition) } -// Internally used, each of the the public 'Poll*' function defined in this +// Internally used, each of the public 'Poll*' function defined in this // package should invoke this internal function with appropriate parameters. // ctx: the context specified by the caller, for infinite polling pass // a context that never gets cancelled or expired. @@ -615,7 +617,7 @@ type WaitWithContextFunc func(ctx context.Context) <-chan struct{} // WaitFor continually checks 'fn' as driven by 'wait'. // -// WaitFor gets a channel from 'wait()'', and then invokes 'fn' once for every value +// WaitFor gets a channel from 'wait()”, and then invokes 'fn' once for every value // placed on the channel and once more when the channel is closed. If the channel is closed // and 'fn' returns false without error, WaitFor returns ErrWaitTimeout. // @@ -629,14 +631,14 @@ type WaitWithContextFunc func(ctx context.Context) <-chan struct{} // "uniform pseudo-random", the `fn` might still run one or multiple time, // though eventually `WaitFor` will return. func WaitFor(wait WaitFunc, fn ConditionFunc, done <-chan struct{}) error { - ctx, cancel := contextForChannel(done) + ctx, cancel := ContextForChannel(done) defer cancel() return WaitForWithContext(ctx, wait.WithContext(), fn.WithContext()) } // WaitForWithContext continually checks 'fn' as driven by 'wait'. // -// WaitForWithContext gets a channel from 'wait()'', and then invokes 'fn' +// WaitForWithContext gets a channel from 'wait()”, and then invokes 'fn' // once for every value placed on the channel and once more when the // channel is closed. If the channel is closed and 'fn' // returns false without error, WaitForWithContext returns ErrWaitTimeout. diff --git a/vendor/k8s.io/apimachinery/pkg/watch/filter.go b/vendor/k8s.io/apimachinery/pkg/watch/filter.go index 22c9449f5..a5735a0b4 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/filter.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/filter.go @@ -32,7 +32,6 @@ type FilterFunc func(in Event) (out Event, keep bool) // WARNING: filter has a fatal flaw, in that it can't properly update the // Type field (Add/Modified/Deleted) to reflect items beginning to pass the // filter when they previously didn't. -// func Filter(w Interface, f FilterFunc) Interface { fw := &filteredWatch{ incoming: w, diff --git a/vendor/k8s.io/apimachinery/pkg/watch/mux.go b/vendor/k8s.io/apimachinery/pkg/watch/mux.go index e01d51906..d51f9567e 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/mux.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/mux.go @@ -17,6 +17,7 @@ limitations under the License. package watch import ( + "fmt" "sync" "k8s.io/apimachinery/pkg/runtime" @@ -44,8 +45,11 @@ type Broadcaster struct { nextWatcher int64 distributing sync.WaitGroup - incoming chan Event - stopped chan struct{} + // incomingBlock allows us to ensure we don't race and end up sending events + // to a closed channel following a broadcaster shutdown. + incomingBlock sync.Mutex + incoming chan Event + stopped chan struct{} // How large to make watcher's channel. watchQueueLength int @@ -111,6 +115,8 @@ func (obj functionFakeRuntimeObject) DeepCopyObject() runtime.Object { // won't ever see that event, and will always see any event after they are // added. func (m *Broadcaster) blockQueue(f func()) { + m.incomingBlock.Lock() + defer m.incomingBlock.Unlock() select { case <-m.stopped: return @@ -132,7 +138,7 @@ func (m *Broadcaster) blockQueue(f func()) { // Note: new watchers will only receive new events. They won't get an entire history // of previous events. It will block until the watcher is actually added to the // broadcaster. -func (m *Broadcaster) Watch() Interface { +func (m *Broadcaster) Watch() (Interface, error) { var w *broadcasterWatcher m.blockQueue(func() { id := m.nextWatcher @@ -146,11 +152,9 @@ func (m *Broadcaster) Watch() Interface { m.watchers[id] = w }) if w == nil { - // The panic here is to be consistent with the previous interface behavior - // we are willing to re-evaluate in the future. - panic("broadcaster already stopped") + return nil, fmt.Errorf("broadcaster already stopped") } - return w + return w, nil } // WatchWithPrefix adds a new watcher to the list and returns an Interface for it. It sends @@ -158,7 +162,7 @@ func (m *Broadcaster) Watch() Interface { // The returned watch will have a queue length that is at least large enough to accommodate // all of the items in queuedEvents. It will block until the watcher is actually added to // the broadcaster. -func (m *Broadcaster) WatchWithPrefix(queuedEvents []Event) Interface { +func (m *Broadcaster) WatchWithPrefix(queuedEvents []Event) (Interface, error) { var w *broadcasterWatcher m.blockQueue(func() { id := m.nextWatcher @@ -179,11 +183,9 @@ func (m *Broadcaster) WatchWithPrefix(queuedEvents []Event) Interface { } }) if w == nil { - // The panic here is to be consistent with the previous interface behavior - // we are willing to re-evaluate in the future. - panic("broadcaster already stopped") + return nil, fmt.Errorf("broadcaster already stopped") } - return w + return w, nil } // stopWatching stops the given watcher and removes it from the list. @@ -210,19 +212,38 @@ func (m *Broadcaster) closeAll() { } // Action distributes the given event among all watchers. -func (m *Broadcaster) Action(action EventType, obj runtime.Object) { +func (m *Broadcaster) Action(action EventType, obj runtime.Object) error { + m.incomingBlock.Lock() + defer m.incomingBlock.Unlock() + select { + case <-m.stopped: + return fmt.Errorf("broadcaster already stopped") + default: + } + m.incoming <- Event{action, obj} + return nil } // Action distributes the given event among all watchers, or drops it on the floor // if too many incoming actions are queued up. Returns true if the action was sent, // false if dropped. -func (m *Broadcaster) ActionOrDrop(action EventType, obj runtime.Object) bool { +func (m *Broadcaster) ActionOrDrop(action EventType, obj runtime.Object) (bool, error) { + m.incomingBlock.Lock() + defer m.incomingBlock.Unlock() + + // Ensure that if the broadcaster is stopped we do not send events to it. + select { + case <-m.stopped: + return false, fmt.Errorf("broadcaster already stopped") + default: + } + select { case m.incoming <- Event{action, obj}: - return true + return true, nil default: - return false + return false, nil } } diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go index 8205a4dd1..5b8514b3f 100644 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go @@ -28,7 +28,7 @@ const ( // TODO: fix the returned errors to be introspectable. func LookupPatchMetadataForStruct(t reflect.Type, jsonField string) ( elemType reflect.Type, patchStrategies []string, patchMergeKey string, e error) { - if t.Kind() == reflect.Ptr { + if t.Kind() == reflect.Pointer { t = t.Elem() } @@ -183,7 +183,7 @@ func typeFields(t reflect.Type) []field { index[len(f.index)] = i ft := sf.Type - if ft.Name() == "" && ft.Kind() == reflect.Ptr { + if ft.Name() == "" && ft.Kind() == reflect.Pointer { // Follow pointer. ft = ft.Elem() } diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go index 6be80349a..511e625b6 100644 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go @@ -100,7 +100,8 @@ func makeUsefulPanic(v reflect.Value) { // Tests for deep equality using reflected types. The map argument tracks // comparisons that have already been seen, which allows short circuiting on // recursive types. -func (e Equalities) deepValueEqual(v1, v2 reflect.Value, visited map[visit]bool, depth int) bool { +// equateNilAndEmpty controls whether empty maps/slices are equivalent to nil +func (e Equalities) deepValueEqual(v1, v2 reflect.Value, visited map[visit]bool, equateNilAndEmpty bool, depth int) bool { defer makeUsefulPanic(v1) if !v1.IsValid() || !v2.IsValid() { @@ -150,17 +151,36 @@ func (e Equalities) deepValueEqual(v1, v2 reflect.Value, visited map[visit]bool, // We don't need to check length here because length is part of // an array's type, which has already been filtered for. for i := 0; i < v1.Len(); i++ { - if !e.deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) { + if !e.deepValueEqual(v1.Index(i), v2.Index(i), visited, equateNilAndEmpty, depth+1) { return false } } return true case reflect.Slice: - if (v1.IsNil() || v1.Len() == 0) != (v2.IsNil() || v2.Len() == 0) { - return false - } - if v1.IsNil() || v1.Len() == 0 { - return true + if equateNilAndEmpty { + if (v1.IsNil() || v1.Len() == 0) != (v2.IsNil() || v2.Len() == 0) { + return false + } + + if v1.IsNil() || v1.Len() == 0 { + return true + } + } else { + if v1.IsNil() != v2.IsNil() { + return false + } + + // Optimize nil and empty cases + // Two lists that are BOTH nil are equal + // No need to check v2 is nil since v1.IsNil == v2.IsNil from above + if v1.IsNil() { + return true + } + + // Two lists that are both empty and both non nil are equal + if v1.Len() == 0 || v2.Len() == 0 { + return true + } } if v1.Len() != v2.Len() { return false @@ -169,7 +189,7 @@ func (e Equalities) deepValueEqual(v1, v2 reflect.Value, visited map[visit]bool, return true } for i := 0; i < v1.Len(); i++ { - if !e.deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) { + if !e.deepValueEqual(v1.Index(i), v2.Index(i), visited, equateNilAndEmpty, depth+1) { return false } } @@ -178,22 +198,40 @@ func (e Equalities) deepValueEqual(v1, v2 reflect.Value, visited map[visit]bool, if v1.IsNil() || v2.IsNil() { return v1.IsNil() == v2.IsNil() } - return e.deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1) + return e.deepValueEqual(v1.Elem(), v2.Elem(), visited, equateNilAndEmpty, depth+1) case reflect.Ptr: - return e.deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1) + return e.deepValueEqual(v1.Elem(), v2.Elem(), visited, equateNilAndEmpty, depth+1) case reflect.Struct: for i, n := 0, v1.NumField(); i < n; i++ { - if !e.deepValueEqual(v1.Field(i), v2.Field(i), visited, depth+1) { + if !e.deepValueEqual(v1.Field(i), v2.Field(i), visited, equateNilAndEmpty, depth+1) { return false } } return true case reflect.Map: - if (v1.IsNil() || v1.Len() == 0) != (v2.IsNil() || v2.Len() == 0) { - return false - } - if v1.IsNil() || v1.Len() == 0 { - return true + if equateNilAndEmpty { + if (v1.IsNil() || v1.Len() == 0) != (v2.IsNil() || v2.Len() == 0) { + return false + } + if v1.IsNil() || v1.Len() == 0 { + return true + } + } else { + if v1.IsNil() != v2.IsNil() { + return false + } + + // Optimize nil and empty cases + // Two maps that are BOTH nil are equal + // No need to check v2 is nil since v1.IsNil == v2.IsNil from above + if v1.IsNil() { + return true + } + + // Two maps that are both empty and both non nil are equal + if v1.Len() == 0 || v2.Len() == 0 { + return true + } } if v1.Len() != v2.Len() { return false @@ -202,7 +240,7 @@ func (e Equalities) deepValueEqual(v1, v2 reflect.Value, visited map[visit]bool, return true } for _, k := range v1.MapKeys() { - if !e.deepValueEqual(v1.MapIndex(k), v2.MapIndex(k), visited, depth+1) { + if !e.deepValueEqual(v1.MapIndex(k), v2.MapIndex(k), visited, equateNilAndEmpty, depth+1) { return false } } @@ -232,6 +270,14 @@ func (e Equalities) deepValueEqual(v1, v2 reflect.Value, visited map[visit]bool, // Unexported field members cannot be compared and will cause an informative panic; you must add an Equality // function for these types. func (e Equalities) DeepEqual(a1, a2 interface{}) bool { + return e.deepEqual(a1, a2, true) +} + +func (e Equalities) DeepEqualWithNilDifferentFromEmpty(a1, a2 interface{}) bool { + return e.deepEqual(a1, a2, false) +} + +func (e Equalities) deepEqual(a1, a2 interface{}, equateNilAndEmpty bool) bool { if a1 == nil || a2 == nil { return a1 == a2 } @@ -240,7 +286,7 @@ func (e Equalities) DeepEqual(a1, a2 interface{}) bool { if v1.Type() != v2.Type() { return false } - return e.deepValueEqual(v1, v2, make(map[visit]bool), 0) + return e.deepValueEqual(v1, v2, make(map[visit]bool), equateNilAndEmpty, 0) } func (e Equalities) deepValueDerive(v1, v2 reflect.Value, visited map[visit]bool, depth int) bool { @@ -327,7 +373,7 @@ func (e Equalities) deepValueDerive(v1, v2 reflect.Value, visited map[visit]bool return true } return e.deepValueDerive(v1.Elem(), v2.Elem(), visited, depth+1) - case reflect.Ptr: + case reflect.Pointer: if v1.IsNil() { return true } diff --git a/vendor/k8s.io/apiserver/pkg/audit/request.go b/vendor/k8s.io/apiserver/pkg/audit/request.go index 57a10e62b..30755a8a5 100644 --- a/vendor/k8s.io/apiserver/pkg/audit/request.go +++ b/vendor/k8s.io/apiserver/pkg/audit/request.go @@ -239,7 +239,7 @@ func encodeObject(obj runtime.Object, gv schema.GroupVersion, serializer runtime return &runtime.Unknown{ Raw: buf.Bytes(), - ContentType: runtime.ContentTypeJSON, + ContentType: mediaType, }, nil } diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/deprecation/deprecation.go b/vendor/k8s.io/apiserver/pkg/endpoints/deprecation/deprecation.go index 3d0123b23..7f8986fae 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/deprecation/deprecation.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/deprecation/deprecation.go @@ -43,8 +43,9 @@ var leadingDigits = regexp.MustCompile(`^(\d+)`) // MajorMinor parses a numeric major/minor version from the provided version info. // The minor version drops all characters after the first non-digit character: -// version.Info{Major:"1", Minor:"2+"} -> 1,2 -// version.Info{Major:"1", Minor:"2.3-build4"} -> 1,2 +// +// version.Info{Major:"1", Minor:"2+"} -> 1,2 +// version.Info{Major:"1", Minor:"2.3-build4"} -> 1,2 func MajorMinor(v version.Info) (int, int, error) { major, err := strconv.Atoi(v.Major) if err != nil { diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/request/auditid.go b/vendor/k8s.io/apiserver/pkg/endpoints/request/auditid.go index a7b3d84ad..536b25b84 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/request/auditid.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/request/auditid.go @@ -18,7 +18,6 @@ package request import ( "context" - "net/http" "k8s.io/apimachinery/pkg/types" ) @@ -45,12 +44,12 @@ func AuditIDFrom(ctx context.Context) (types.UID, bool) { return auditID, ok } -// GetAuditIDTruncated returns the audit ID (truncated) associated with a request. +// GetAuditIDTruncated returns the audit ID (truncated) from the request context. // If the length of the Audit-ID value exceeds the limit, we truncate it to keep // the first N (maxAuditIDLength) characters. // This is intended to be used in logging only. -func GetAuditIDTruncated(req *http.Request) string { - auditID, ok := AuditIDFrom(req.Context()) +func GetAuditIDTruncated(ctx context.Context) string { + auditID, ok := AuditIDFrom(ctx) if !ok { return "" } diff --git a/vendor/k8s.io/apiserver/pkg/features/kube_features.go b/vendor/k8s.io/apiserver/pkg/features/kube_features.go index 01820d127..4debb7bed 100644 --- a/vendor/k8s.io/apiserver/pkg/features/kube_features.go +++ b/vendor/k8s.io/apiserver/pkg/features/kube_features.go @@ -28,24 +28,12 @@ const ( // // // owner: @username // // alpha: v1.4 - // MyFeature() bool - - // owner: @tallclair - // alpha: v1.7 - // beta: v1.8 - // GA: v1.12 - // - // AdvancedAuditing enables a much more general API auditing pipeline, which includes support for - // pluggable output backends and an audit policy specifying how different requests should be - // audited. - AdvancedAuditing featuregate.Feature = "AdvancedAuditing" - - // owner: @ilackams - // alpha: v1.7 - // beta: v1.16 + // MyFeature featuregate.Feature = "MyFeature" // - // Enables compression of REST responses (GET and LIST only) - APIResponseCompression featuregate.Feature = "APIResponseCompression" + // Feature gates should be listed in alphabetical, case-sensitive + // (upper before any lower case character) order. This reduces the risk + // of code conflicts because changes are more likely to be scattered + // across the file. // owner: @smarterclayton // alpha: v1.8 @@ -55,78 +43,61 @@ const ( // all at once. APIListChunking featuregate.Feature = "APIListChunking" - // owner: @apelisse - // alpha: v1.12 - // beta: v1.13 - // stable: v1.18 - // - // Allow requests to be processed but not stored, so that - // validation, merging, mutation can be tested without - // committing. - DryRun featuregate.Feature = "DryRun" - - // owner: @caesarxuchao - // alpha: v1.15 - // beta: v1.16 + // owner: @MikeSpreitzer @yue9944882 + // alpha: v1.18 + // beta: v1.20 // - // Allow apiservers to show a count of remaining items in the response - // to a chunking list request. - RemainingItemCount featuregate.Feature = "RemainingItemCount" + // Enables managing request concurrency with prioritization and fairness at each server. + // The FeatureGate was introduced in release 1.15 but the feature + // was not really implemented before 1.18. + APIPriorityAndFairness featuregate.Feature = "APIPriorityAndFairness" - // owner: @apelisse, @lavalamp - // alpha: v1.14 + // owner: @ilackams + // alpha: v1.7 // beta: v1.16 - // stable: v1.22 // - // Server-side apply. Merging happens on the server. - ServerSideApply featuregate.Feature = "ServerSideApply" - - // owner: @caesarxuchao - // alpha: v1.14 - // beta: v1.15 - // - // Allow apiservers to expose the storage version hash in the discovery - // document. - StorageVersionHash featuregate.Feature = "StorageVersionHash" + // Enables compression of REST responses (GET and LIST only) + APIResponseCompression featuregate.Feature = "APIResponseCompression" - // owner: @caesarxuchao @roycaihw + // owner: @roycaihw // alpha: v1.20 // - // Enable the storage version API. - StorageVersionAPI featuregate.Feature = "StorageVersionAPI" + // Assigns each kube-apiserver an ID in a cluster. + APIServerIdentity featuregate.Feature = "APIServerIdentity" - // owner: @wojtek-t - // alpha: v1.15 - // beta: v1.16 - // GA: v1.17 + // owner: @dashpole + // alpha: v1.22 // - // Enables support for watch bookmark events. - WatchBookmark featuregate.Feature = "WatchBookmark" + // Add support for distributed tracing in the API Server + APIServerTracing featuregate.Feature = "APIServerTracing" - // owner: @MikeSpreitzer @yue9944882 - // alpha: v1.18 - // beta: v1.20 + // owner: @tallclair + // alpha: v1.7 + // beta: v1.8 + // GA: v1.12 // - // Enables managing request concurrency with prioritization and fairness at each server. - // The FeatureGate was introduced in release 1.15 but the feature - // was not really implemented before 1.18. - APIPriorityAndFairness featuregate.Feature = "APIPriorityAndFairness" + // AdvancedAuditing enables a much more general API auditing pipeline, which includes support for + // pluggable output backends and an audit policy specifying how different requests should be + // audited. + AdvancedAuditing featuregate.Feature = "AdvancedAuditing" - // owner: @wojtek-t - // alpha: v1.16 - // beta: v1.20 - // GA: v1.24 + // owner: @cici37 + // kep: http://kep.k8s.io/2876 + // alpha: v1.23 + // beta: v1.25 // - // Deprecates and removes SelfLink from ObjectMeta and ListMeta. - RemoveSelfLink featuregate.Feature = "RemoveSelfLink" + // Enables expression validation for Custom Resource + CustomResourceValidationExpressions featuregate.Feature = "CustomResourceValidationExpressions" - // owner: @shaloulcy, @wojtek-t - // alpha: v1.18 - // beta: v1.19 - // GA: v1.20 + // owner: @apelisse + // alpha: v1.12 + // beta: v1.13 + // stable: v1.18 // - // Allows label and field based indexes in apiserver watch cache to accelerate list operations. - SelectorIndex featuregate.Feature = "SelectorIndex" + // Allow requests to be processed but not stored, so that + // validation, merging, mutation can be tested without + // committing. + DryRun featuregate.Feature = "DryRun" // owner: @wojtek-t // alpha: v1.20 @@ -136,17 +107,12 @@ const ( // Allows for updating watchcache resource version with progress notify events. EfficientWatchResumption featuregate.Feature = "EfficientWatchResumption" - // owner: @roycaihw - // alpha: v1.20 - // - // Assigns each kube-apiserver an ID in a cluster. - APIServerIdentity featuregate.Feature = "APIServerIdentity" - - // owner: @dashpole - // alpha: v1.22 + // owner: @aramase + // kep: http://kep.k8s.io/3299 + // alpha: v1.25 // - // Add support for distributed tracing in the API Server - APIServerTracing featuregate.Feature = "APIServerTracing" + // Enables KMS v2 API for encryption at rest. + KMSv2 featuregate.Feature = "KMSv2" // owner: @jiahuif // kep: http://kep.k8s.io/2887 @@ -157,13 +123,6 @@ const ( // in the spec returned from kube-apiserver. OpenAPIEnums featuregate.Feature = "OpenAPIEnums" - // owner: @cici37 - // kep: http://kep.k8s.io/2876 - // alpha: v1.23 - // - // Enables expression validation for Custom Resource - CustomResourceValidationExpressions featuregate.Feature = "CustomResourceValidationExpressions" - // owner: @jefftree // kep: http://kep.k8s.io/2896 // alpha: v1.23 @@ -172,12 +131,59 @@ const ( // Enables kubernetes to publish OpenAPI v3 OpenAPIV3 featuregate.Feature = "OpenAPIV3" + // owner: @caesarxuchao + // alpha: v1.15 + // beta: v1.16 + // + // Allow apiservers to show a count of remaining items in the response + // to a chunking list request. + RemainingItemCount featuregate.Feature = "RemainingItemCount" + + // owner: @wojtek-t + // alpha: v1.16 + // beta: v1.20 + // GA: v1.24 + // + // Deprecates and removes SelfLink from ObjectMeta and ListMeta. + RemoveSelfLink featuregate.Feature = "RemoveSelfLink" + + // owner: @apelisse, @lavalamp + // alpha: v1.14 + // beta: v1.16 + // stable: v1.22 + // + // Server-side apply. Merging happens on the server. + ServerSideApply featuregate.Feature = "ServerSideApply" + // owner: @kevindelgado // kep: http://kep.k8s.io/2885 // alpha: v1.23 + // beta: v1.24 // // Enables server-side field validation. ServerSideFieldValidation featuregate.Feature = "ServerSideFieldValidation" + + // owner: @caesarxuchao @roycaihw + // alpha: v1.20 + // + // Enable the storage version API. + StorageVersionAPI featuregate.Feature = "StorageVersionAPI" + + // owner: @caesarxuchao + // alpha: v1.14 + // beta: v1.15 + // + // Allow apiservers to expose the storage version hash in the discovery + // document. + StorageVersionHash featuregate.Feature = "StorageVersionHash" + + // owner: @wojtek-t + // alpha: v1.15 + // beta: v1.16 + // GA: v1.17 + // + // Enables support for watch bookmark events. + WatchBookmark featuregate.Feature = "WatchBookmark" ) func init() { @@ -188,23 +194,41 @@ func init() { // To add a new feature, define a key for it above and add it here. The features will be // available throughout Kubernetes binaries. var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{ - AdvancedAuditing: {Default: true, PreRelease: featuregate.GA}, - APIResponseCompression: {Default: true, PreRelease: featuregate.Beta}, - APIListChunking: {Default: true, PreRelease: featuregate.Beta}, - DryRun: {Default: true, PreRelease: featuregate.GA}, - RemainingItemCount: {Default: true, PreRelease: featuregate.Beta}, - ServerSideApply: {Default: true, PreRelease: featuregate.GA}, - StorageVersionHash: {Default: true, PreRelease: featuregate.Beta}, - StorageVersionAPI: {Default: false, PreRelease: featuregate.Alpha}, - WatchBookmark: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - APIPriorityAndFairness: {Default: true, PreRelease: featuregate.Beta}, - RemoveSelfLink: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - SelectorIndex: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - EfficientWatchResumption: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - APIServerIdentity: {Default: false, PreRelease: featuregate.Alpha}, - APIServerTracing: {Default: false, PreRelease: featuregate.Alpha}, - OpenAPIEnums: {Default: true, PreRelease: featuregate.Beta}, - CustomResourceValidationExpressions: {Default: false, PreRelease: featuregate.Alpha}, - OpenAPIV3: {Default: true, PreRelease: featuregate.Beta}, - ServerSideFieldValidation: {Default: false, PreRelease: featuregate.Alpha}, + APIListChunking: {Default: true, PreRelease: featuregate.Beta}, + + APIPriorityAndFairness: {Default: true, PreRelease: featuregate.Beta}, + + APIResponseCompression: {Default: true, PreRelease: featuregate.Beta}, + + APIServerIdentity: {Default: false, PreRelease: featuregate.Alpha}, + + APIServerTracing: {Default: false, PreRelease: featuregate.Alpha}, + + AdvancedAuditing: {Default: true, PreRelease: featuregate.GA}, + + CustomResourceValidationExpressions: {Default: true, PreRelease: featuregate.Beta}, + + DryRun: {Default: true, PreRelease: featuregate.GA}, + + EfficientWatchResumption: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, + + KMSv2: {Default: false, PreRelease: featuregate.Alpha}, + + OpenAPIEnums: {Default: true, PreRelease: featuregate.Beta}, + + OpenAPIV3: {Default: true, PreRelease: featuregate.Beta}, + + RemainingItemCount: {Default: true, PreRelease: featuregate.Beta}, + + RemoveSelfLink: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, + + ServerSideApply: {Default: true, PreRelease: featuregate.GA}, + + ServerSideFieldValidation: {Default: true, PreRelease: featuregate.Beta}, + + StorageVersionAPI: {Default: false, PreRelease: featuregate.Alpha}, + + StorageVersionHash: {Default: true, PreRelease: featuregate.Beta}, + + WatchBookmark: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, } diff --git a/vendor/k8s.io/apiserver/pkg/server/egressselector/egress_selector.go b/vendor/k8s.io/apiserver/pkg/server/egressselector/egress_selector.go index 9da0e2a09..3f7bd4ad5 100644 --- a/vendor/k8s.io/apiserver/pkg/server/egressselector/egress_selector.go +++ b/vendor/k8s.io/apiserver/pkg/server/egressselector/egress_selector.go @@ -30,6 +30,7 @@ import ( "time" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apiserver/pkg/apis/apiserver" @@ -157,7 +158,11 @@ func (g *grpcProxier) proxy(ctx context.Context, addr string) (net.Conn, error) type proxyServerConnector interface { // connect establishes connection to the proxy server, and returns a // proxier based on the connection. - connect() (proxier, error) + // + // The provided Context must be non-nil. The context is used for connecting to the proxy only. + // If the context expires before the connection is complete, an error is returned. + // Once successfully connected to the proxy, any expiration of the context will not affect the connection. + connect(context.Context) (proxier, error) } type tcpHTTPConnectConnector struct { @@ -165,8 +170,11 @@ type tcpHTTPConnectConnector struct { tlsConfig *tls.Config } -func (t *tcpHTTPConnectConnector) connect() (proxier, error) { - conn, err := tls.Dial("tcp", t.proxyAddress, t.tlsConfig) +func (t *tcpHTTPConnectConnector) connect(ctx context.Context) (proxier, error) { + d := tls.Dialer{ + Config: t.tlsConfig, + } + conn, err := d.DialContext(ctx, "tcp", t.proxyAddress) if err != nil { return nil, err } @@ -177,8 +185,9 @@ type udsHTTPConnectConnector struct { udsName string } -func (u *udsHTTPConnectConnector) connect() (proxier, error) { - conn, err := net.Dial("unix", u.udsName) +func (u *udsHTTPConnectConnector) connect(ctx context.Context) (proxier, error) { + var d net.Dialer + conn, err := d.DialContext(ctx, "unix", u.udsName) if err != nil { return nil, err } @@ -189,18 +198,25 @@ type udsGRPCConnector struct { udsName string } -func (u *udsGRPCConnector) connect() (proxier, error) { +// connect establishes a connection to a proxy over gRPC. +// TODO At the moment, it does not use the provided context. +func (u *udsGRPCConnector) connect(_ context.Context) (proxier, error) { udsName := u.udsName - dialOption := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { - c, err := net.Dial("unix", udsName) + dialOption := grpc.WithContextDialer(func(ctx context.Context, addr string) (net.Conn, error) { + var d net.Dialer + c, err := d.DialContext(ctx, "unix", udsName) if err != nil { klog.Errorf("failed to create connection to uds name %s, error: %v", udsName, err) } return c, err }) - ctx := context.TODO() - tunnel, err := client.CreateSingleUseGrpcTunnel(ctx, udsName, dialOption, grpc.WithInsecure()) + // CreateSingleUseGrpcTunnel() unfortunately couples dial and connection contexts. Because of that, + // we cannot use ctx just for dialing and control the connection lifetime separately. + // See https://github.com/kubernetes-sigs/apiserver-network-proxy/issues/357. + tunnelCtx := context.TODO() + tunnel, err := client.CreateSingleUseGrpcTunnel(tunnelCtx, udsName, dialOption, + grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { return nil, err } @@ -226,7 +242,7 @@ func (d *dialerCreator) createDialer() utilnet.DialFunc { trace := utiltrace.New(fmt.Sprintf("Proxy via %s protocol over %s", d.options.protocol, d.options.transport), utiltrace.Field{Key: "address", Value: addr}) defer trace.LogIfLong(500 * time.Millisecond) start := egressmetrics.Metrics.Clock().Now() - proxier, err := d.connector.connect() + proxier, err := d.connector.connect(ctx) if err != nil { egressmetrics.Metrics.ObserveDialFailure(d.options.protocol, d.options.transport, egressmetrics.StageConnect) return nil, err diff --git a/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go b/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go index d61e46aaf..a69506de6 100644 --- a/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go +++ b/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go @@ -35,7 +35,7 @@ import ( "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - "k8s.io/component-base/traces" + tracing "k8s.io/component-base/tracing" ) // AuthenticationInfoResolverWrapper can be used to inject Dial function to the @@ -47,7 +47,7 @@ func NewDefaultAuthenticationInfoResolverWrapper( proxyTransport *http.Transport, egressSelector *egressselector.EgressSelector, kubeapiserverClientConfig *rest.Config, - tp *trace.TracerProvider) AuthenticationInfoResolverWrapper { + tp trace.TracerProvider) AuthenticationInfoResolverWrapper { webhookAuthResolverWrapper := func(delegate AuthenticationInfoResolver) AuthenticationInfoResolver { return &AuthenticationInfoResolverDelegator{ @@ -60,7 +60,7 @@ func NewDefaultAuthenticationInfoResolverWrapper( return nil, err } if feature.DefaultFeatureGate.Enabled(features.APIServerTracing) { - ret.Wrap(traces.WrapperFor(tp)) + ret.Wrap(tracing.WrapperFor(tp)) } if egressSelector != nil { @@ -85,7 +85,7 @@ func NewDefaultAuthenticationInfoResolverWrapper( return nil, err } if feature.DefaultFeatureGate.Enabled(features.APIServerTracing) { - ret.Wrap(traces.WrapperFor(tp)) + ret.Wrap(tracing.WrapperFor(tp)) } if egressSelector != nil { diff --git a/vendor/k8s.io/apiserver/pkg/util/webhook/serviceresolver.go b/vendor/k8s.io/apiserver/pkg/util/webhook/serviceresolver.go index da140b1f0..fcd953da3 100644 --- a/vendor/k8s.io/apiserver/pkg/util/webhook/serviceresolver.go +++ b/vendor/k8s.io/apiserver/pkg/util/webhook/serviceresolver.go @@ -38,7 +38,8 @@ func NewDefaultServiceResolver() ServiceResolver { // note that the name, namespace, and port are required and by default all // created addresses use HTTPS scheme. // for example: -// name=ross namespace=andromeda resolves to https://ross.andromeda.svc:443 +// +// name=ross namespace=andromeda resolves to https://ross.andromeda.svc:443 func (sr defaultServiceResolver) ResolveEndpoint(namespace, name string, port int32) (*url.URL, error) { if len(name) == 0 || len(namespace) == 0 || port == 0 { return nil, errors.New("cannot resolve an empty service name or namespace or port") diff --git a/vendor/k8s.io/apiserver/pkg/util/x509metrics/server_cert_deprecations.go b/vendor/k8s.io/apiserver/pkg/util/x509metrics/server_cert_deprecations.go index 9f1e34c4d..464510ea8 100644 --- a/vendor/k8s.io/apiserver/pkg/util/x509metrics/server_cert_deprecations.go +++ b/vendor/k8s.io/apiserver/pkg/util/x509metrics/server_cert_deprecations.go @@ -75,17 +75,17 @@ func (c *counterRaiser) IncreaseMetricsCounter(req *http.Request) { // NewDeprecatedCertificateRoundTripperWrapperConstructor returns a RoundTripper wrapper that's usable within ClientConfig.Wrap. // // It increases the `missingSAN` counter whenever: -// 1. we get a x509.HostnameError with string `x509: certificate relies on legacy Common Name field` -// which indicates an error caused by the deprecation of Common Name field when veryfing remote -// hostname -// 2. the server certificate in response contains no SAN. This indicates that this binary run -// with the GODEBUG=x509ignoreCN=0 in env +// 1. we get a x509.HostnameError with string `x509: certificate relies on legacy Common Name field` +// which indicates an error caused by the deprecation of Common Name field when veryfing remote +// hostname +// 2. the server certificate in response contains no SAN. This indicates that this binary run +// with the GODEBUG=x509ignoreCN=0 in env // // It increases the `sha1` counter whenever: -// 1. we get a x509.InsecureAlgorithmError with string `SHA1` -// which indicates an error caused by an insecure SHA1 signature -// 2. the server certificate in response contains a SHA1WithRSA or ECDSAWithSHA1 signature. -// This indicates that this binary run with the GODEBUG=x509sha1=1 in env +// 1. we get a x509.InsecureAlgorithmError with string `SHA1` +// which indicates an error caused by an insecure SHA1 signature +// 2. the server certificate in response contains a SHA1WithRSA or ECDSAWithSHA1 signature. +// This indicates that this binary run with the GODEBUG=x509sha1=1 in env func NewDeprecatedCertificateRoundTripperWrapperConstructor(missingSAN, sha1 *metrics.Counter) func(rt http.RoundTripper) http.RoundTripper { return func(rt http.RoundTripper) http.RoundTripper { return &x509DeprecatedCertificateMetricsRTWrapper{ diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go index e14244889..839d88b64 100644 --- a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go @@ -21,7 +21,7 @@ package v1 import ( batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/client-go/applyconfigurations/core/v1" - v1 "k8s.io/client-go/applyconfigurations/meta/v1" + metav1 "k8s.io/client-go/applyconfigurations/meta/v1" ) // JobSpecApplyConfiguration represents an declarative configuration of the JobSpec type for use @@ -30,8 +30,9 @@ type JobSpecApplyConfiguration struct { Parallelism *int32 `json:"parallelism,omitempty"` Completions *int32 `json:"completions,omitempty"` ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"` + PodFailurePolicy *PodFailurePolicyApplyConfiguration `json:"podFailurePolicy,omitempty"` BackoffLimit *int32 `json:"backoffLimit,omitempty"` - Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Selector *metav1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` ManualSelector *bool `json:"manualSelector,omitempty"` Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` TTLSecondsAfterFinished *int32 `json:"ttlSecondsAfterFinished,omitempty"` @@ -69,6 +70,14 @@ func (b *JobSpecApplyConfiguration) WithActiveDeadlineSeconds(value int64) *JobS return b } +// WithPodFailurePolicy sets the PodFailurePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodFailurePolicy field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithPodFailurePolicy(value *PodFailurePolicyApplyConfiguration) *JobSpecApplyConfiguration { + b.PodFailurePolicy = value + return b +} + // WithBackoffLimit sets the BackoffLimit field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the BackoffLimit field is set to the value of the last call. @@ -80,7 +89,7 @@ func (b *JobSpecApplyConfiguration) WithBackoffLimit(value int32) *JobSpecApplyC // WithSelector sets the Selector field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Selector field is set to the value of the last call. -func (b *JobSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *JobSpecApplyConfiguration { +func (b *JobSpecApplyConfiguration) WithSelector(value *metav1.LabelSelectorApplyConfiguration) *JobSpecApplyConfiguration { b.Selector = value return b } diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicy.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicy.go new file mode 100644 index 000000000..6da98386c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicy.go @@ -0,0 +1,44 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PodFailurePolicyApplyConfiguration represents an declarative configuration of the PodFailurePolicy type for use +// with apply. +type PodFailurePolicyApplyConfiguration struct { + Rules []PodFailurePolicyRuleApplyConfiguration `json:"rules,omitempty"` +} + +// PodFailurePolicyApplyConfiguration constructs an declarative configuration of the PodFailurePolicy type for use with +// apply. +func PodFailurePolicy() *PodFailurePolicyApplyConfiguration { + return &PodFailurePolicyApplyConfiguration{} +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *PodFailurePolicyApplyConfiguration) WithRules(values ...*PodFailurePolicyRuleApplyConfiguration) *PodFailurePolicyApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonexitcodesrequirement.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonexitcodesrequirement.go new file mode 100644 index 000000000..65f625181 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonexitcodesrequirement.go @@ -0,0 +1,63 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/batch/v1" +) + +// PodFailurePolicyOnExitCodesRequirementApplyConfiguration represents an declarative configuration of the PodFailurePolicyOnExitCodesRequirement type for use +// with apply. +type PodFailurePolicyOnExitCodesRequirementApplyConfiguration struct { + ContainerName *string `json:"containerName,omitempty"` + Operator *v1.PodFailurePolicyOnExitCodesOperator `json:"operator,omitempty"` + Values []int32 `json:"values,omitempty"` +} + +// PodFailurePolicyOnExitCodesRequirementApplyConfiguration constructs an declarative configuration of the PodFailurePolicyOnExitCodesRequirement type for use with +// apply. +func PodFailurePolicyOnExitCodesRequirement() *PodFailurePolicyOnExitCodesRequirementApplyConfiguration { + return &PodFailurePolicyOnExitCodesRequirementApplyConfiguration{} +} + +// WithContainerName sets the ContainerName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerName field is set to the value of the last call. +func (b *PodFailurePolicyOnExitCodesRequirementApplyConfiguration) WithContainerName(value string) *PodFailurePolicyOnExitCodesRequirementApplyConfiguration { + b.ContainerName = &value + return b +} + +// WithOperator sets the Operator field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Operator field is set to the value of the last call. +func (b *PodFailurePolicyOnExitCodesRequirementApplyConfiguration) WithOperator(value v1.PodFailurePolicyOnExitCodesOperator) *PodFailurePolicyOnExitCodesRequirementApplyConfiguration { + b.Operator = &value + return b +} + +// WithValues adds the given value to the Values field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Values field. +func (b *PodFailurePolicyOnExitCodesRequirementApplyConfiguration) WithValues(values ...int32) *PodFailurePolicyOnExitCodesRequirementApplyConfiguration { + for i := range values { + b.Values = append(b.Values, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonpodconditionspattern.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonpodconditionspattern.go new file mode 100644 index 000000000..da1556ff8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonpodconditionspattern.go @@ -0,0 +1,52 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// PodFailurePolicyOnPodConditionsPatternApplyConfiguration represents an declarative configuration of the PodFailurePolicyOnPodConditionsPattern type for use +// with apply. +type PodFailurePolicyOnPodConditionsPatternApplyConfiguration struct { + Type *v1.PodConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` +} + +// PodFailurePolicyOnPodConditionsPatternApplyConfiguration constructs an declarative configuration of the PodFailurePolicyOnPodConditionsPattern type for use with +// apply. +func PodFailurePolicyOnPodConditionsPattern() *PodFailurePolicyOnPodConditionsPatternApplyConfiguration { + return &PodFailurePolicyOnPodConditionsPatternApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *PodFailurePolicyOnPodConditionsPatternApplyConfiguration) WithType(value v1.PodConditionType) *PodFailurePolicyOnPodConditionsPatternApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PodFailurePolicyOnPodConditionsPatternApplyConfiguration) WithStatus(value v1.ConditionStatus) *PodFailurePolicyOnPodConditionsPatternApplyConfiguration { + b.Status = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyrule.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyrule.go new file mode 100644 index 000000000..d43524353 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyrule.go @@ -0,0 +1,66 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/batch/v1" +) + +// PodFailurePolicyRuleApplyConfiguration represents an declarative configuration of the PodFailurePolicyRule type for use +// with apply. +type PodFailurePolicyRuleApplyConfiguration struct { + Action *v1.PodFailurePolicyAction `json:"action,omitempty"` + OnExitCodes *PodFailurePolicyOnExitCodesRequirementApplyConfiguration `json:"onExitCodes,omitempty"` + OnPodConditions []PodFailurePolicyOnPodConditionsPatternApplyConfiguration `json:"onPodConditions,omitempty"` +} + +// PodFailurePolicyRuleApplyConfiguration constructs an declarative configuration of the PodFailurePolicyRule type for use with +// apply. +func PodFailurePolicyRule() *PodFailurePolicyRuleApplyConfiguration { + return &PodFailurePolicyRuleApplyConfiguration{} +} + +// WithAction sets the Action field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Action field is set to the value of the last call. +func (b *PodFailurePolicyRuleApplyConfiguration) WithAction(value v1.PodFailurePolicyAction) *PodFailurePolicyRuleApplyConfiguration { + b.Action = &value + return b +} + +// WithOnExitCodes sets the OnExitCodes field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the OnExitCodes field is set to the value of the last call. +func (b *PodFailurePolicyRuleApplyConfiguration) WithOnExitCodes(value *PodFailurePolicyOnExitCodesRequirementApplyConfiguration) *PodFailurePolicyRuleApplyConfiguration { + b.OnExitCodes = value + return b +} + +// WithOnPodConditions adds the given value to the OnPodConditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OnPodConditions field. +func (b *PodFailurePolicyRuleApplyConfiguration) WithOnPodConditions(values ...*PodFailurePolicyOnPodConditionsPatternApplyConfiguration) *PodFailurePolicyRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOnPodConditions") + } + b.OnPodConditions = append(b.OnPodConditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/csipersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/csipersistentvolumesource.go index b8165445d..2fc681604 100644 --- a/vendor/k8s.io/client-go/applyconfigurations/core/v1/csipersistentvolumesource.go +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/csipersistentvolumesource.go @@ -30,6 +30,7 @@ type CSIPersistentVolumeSourceApplyConfiguration struct { NodeStageSecretRef *SecretReferenceApplyConfiguration `json:"nodeStageSecretRef,omitempty"` NodePublishSecretRef *SecretReferenceApplyConfiguration `json:"nodePublishSecretRef,omitempty"` ControllerExpandSecretRef *SecretReferenceApplyConfiguration `json:"controllerExpandSecretRef,omitempty"` + NodeExpandSecretRef *SecretReferenceApplyConfiguration `json:"nodeExpandSecretRef,omitempty"` } // CSIPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the CSIPersistentVolumeSource type for use with @@ -115,3 +116,11 @@ func (b *CSIPersistentVolumeSourceApplyConfiguration) WithControllerExpandSecret b.ControllerExpandSecretRef = value return b } + +// WithNodeExpandSecretRef sets the NodeExpandSecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeExpandSecretRef field is set to the value of the last call. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithNodeExpandSecretRef(value *SecretReferenceApplyConfiguration) *CSIPersistentVolumeSourceApplyConfiguration { + b.NodeExpandSecretRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podspec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podspec.go index 015859e9a..f638b5d91 100644 --- a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podspec.go +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podspec.go @@ -61,6 +61,7 @@ type PodSpecApplyConfiguration struct { TopologySpreadConstraints []TopologySpreadConstraintApplyConfiguration `json:"topologySpreadConstraints,omitempty"` SetHostnameAsFQDN *bool `json:"setHostnameAsFQDN,omitempty"` OS *PodOSApplyConfiguration `json:"os,omitempty"` + HostUsers *bool `json:"hostUsers,omitempty"` } // PodSpecApplyConfiguration constructs an declarative configuration of the PodSpec type for use with @@ -407,3 +408,11 @@ func (b *PodSpecApplyConfiguration) WithOS(value *PodOSApplyConfiguration) *PodS b.OS = value return b } + +// WithHostUsers sets the HostUsers field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostUsers field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithHostUsers(value bool) *PodSpecApplyConfiguration { + b.HostUsers = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go index 856cd4f9d..db376b941 100644 --- a/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go @@ -40,7 +40,7 @@ type ServiceSpecApplyConfiguration struct { PublishNotReadyAddresses *bool `json:"publishNotReadyAddresses,omitempty"` SessionAffinityConfig *SessionAffinityConfigApplyConfiguration `json:"sessionAffinityConfig,omitempty"` IPFamilies []corev1.IPFamily `json:"ipFamilies,omitempty"` - IPFamilyPolicy *corev1.IPFamilyPolicyType `json:"ipFamilyPolicy,omitempty"` + IPFamilyPolicy *corev1.IPFamilyPolicy `json:"ipFamilyPolicy,omitempty"` AllocateLoadBalancerNodePorts *bool `json:"allocateLoadBalancerNodePorts,omitempty"` LoadBalancerClass *string `json:"loadBalancerClass,omitempty"` InternalTrafficPolicy *corev1.ServiceInternalTrafficPolicyType `json:"internalTrafficPolicy,omitempty"` @@ -194,7 +194,7 @@ func (b *ServiceSpecApplyConfiguration) WithIPFamilies(values ...corev1.IPFamily // WithIPFamilyPolicy sets the IPFamilyPolicy field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the IPFamilyPolicy field is set to the value of the last call. -func (b *ServiceSpecApplyConfiguration) WithIPFamilyPolicy(value corev1.IPFamilyPolicyType) *ServiceSpecApplyConfiguration { +func (b *ServiceSpecApplyConfiguration) WithIPFamilyPolicy(value corev1.IPFamilyPolicy) *ServiceSpecApplyConfiguration { b.IPFamilyPolicy = &value return b } diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go index 867cc89f2..fbfa8fa88 100644 --- a/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go @@ -26,11 +26,14 @@ import ( // TopologySpreadConstraintApplyConfiguration represents an declarative configuration of the TopologySpreadConstraint type for use // with apply. type TopologySpreadConstraintApplyConfiguration struct { - MaxSkew *int32 `json:"maxSkew,omitempty"` - TopologyKey *string `json:"topologyKey,omitempty"` - WhenUnsatisfiable *v1.UnsatisfiableConstraintAction `json:"whenUnsatisfiable,omitempty"` - LabelSelector *metav1.LabelSelectorApplyConfiguration `json:"labelSelector,omitempty"` - MinDomains *int32 `json:"minDomains,omitempty"` + MaxSkew *int32 `json:"maxSkew,omitempty"` + TopologyKey *string `json:"topologyKey,omitempty"` + WhenUnsatisfiable *v1.UnsatisfiableConstraintAction `json:"whenUnsatisfiable,omitempty"` + LabelSelector *metav1.LabelSelectorApplyConfiguration `json:"labelSelector,omitempty"` + MinDomains *int32 `json:"minDomains,omitempty"` + NodeAffinityPolicy *v1.NodeInclusionPolicy `json:"nodeAffinityPolicy,omitempty"` + NodeTaintsPolicy *v1.NodeInclusionPolicy `json:"nodeTaintsPolicy,omitempty"` + MatchLabelKeys []string `json:"matchLabelKeys,omitempty"` } // TopologySpreadConstraintApplyConfiguration constructs an declarative configuration of the TopologySpreadConstraint type for use with @@ -78,3 +81,29 @@ func (b *TopologySpreadConstraintApplyConfiguration) WithMinDomains(value int32) b.MinDomains = &value return b } + +// WithNodeAffinityPolicy sets the NodeAffinityPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeAffinityPolicy field is set to the value of the last call. +func (b *TopologySpreadConstraintApplyConfiguration) WithNodeAffinityPolicy(value v1.NodeInclusionPolicy) *TopologySpreadConstraintApplyConfiguration { + b.NodeAffinityPolicy = &value + return b +} + +// WithNodeTaintsPolicy sets the NodeTaintsPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeTaintsPolicy field is set to the value of the last call. +func (b *TopologySpreadConstraintApplyConfiguration) WithNodeTaintsPolicy(value v1.NodeInclusionPolicy) *TopologySpreadConstraintApplyConfiguration { + b.NodeTaintsPolicy = &value + return b +} + +// WithMatchLabelKeys adds the given value to the MatchLabelKeys field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MatchLabelKeys field. +func (b *TopologySpreadConstraintApplyConfiguration) WithMatchLabelKeys(values ...string) *TopologySpreadConstraintApplyConfiguration { + for i := range values { + b.MatchLabelKeys = append(b.MatchLabelKeys, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go b/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go index f8e9eec8f..6fa25411c 100644 --- a/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go +++ b/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go @@ -3041,6 +3041,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: parallelism type: scalar: numeric + - name: podFailurePolicy + type: + namedType: io.k8s.api.batch.v1.PodFailurePolicy - name: selector type: namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector @@ -3098,6 +3101,58 @@ var schemaYAML = typed.YAMLObject(`types: type: namedType: io.k8s.api.batch.v1.JobSpec default: {} +- name: io.k8s.api.batch.v1.PodFailurePolicy + map: + fields: + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.batch.v1.PodFailurePolicyRule + elementRelationship: atomic +- name: io.k8s.api.batch.v1.PodFailurePolicyOnExitCodesRequirement + map: + fields: + - name: containerName + type: + scalar: string + - name: operator + type: + scalar: string + default: "" + - name: values + type: + list: + elementType: + scalar: numeric + elementRelationship: associative +- name: io.k8s.api.batch.v1.PodFailurePolicyOnPodConditionsPattern + map: + fields: + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.batch.v1.PodFailurePolicyRule + map: + fields: + - name: action + type: + scalar: string + default: "" + - name: onExitCodes + type: + namedType: io.k8s.api.batch.v1.PodFailurePolicyOnExitCodesRequirement + - name: onPodConditions + type: + list: + elementType: + namedType: io.k8s.api.batch.v1.PodFailurePolicyOnPodConditionsPattern + elementRelationship: atomic - name: io.k8s.api.batch.v1.UncountedTerminatedPods map: fields: @@ -3565,6 +3620,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: fsType type: scalar: string + - name: nodeExpandSecretRef + type: + namedType: io.k8s.api.core.v1.SecretReference - name: nodePublishSecretRef type: namedType: io.k8s.api.core.v1.SecretReference @@ -5430,6 +5488,7 @@ var schemaYAML = typed.YAMLObject(`types: - name: claimRef type: namedType: io.k8s.api.core.v1.ObjectReference + elementRelationship: separable - name: csi type: namedType: io.k8s.api.core.v1.CSIPersistentVolumeSource @@ -5759,6 +5818,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: hostPID type: scalar: boolean + - name: hostUsers + type: + scalar: boolean - name: hostname type: scalar: string @@ -6855,6 +6917,12 @@ var schemaYAML = typed.YAMLObject(`types: - name: labelSelector type: namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: matchLabelKeys + type: + list: + elementType: + scalar: string + elementRelationship: atomic - name: maxSkew type: scalar: numeric @@ -6862,6 +6930,12 @@ var schemaYAML = typed.YAMLObject(`types: - name: minDomains type: scalar: numeric + - name: nodeAffinityPolicy + type: + scalar: string + - name: nodeTaintsPolicy + type: + scalar: string - name: topologyKey type: scalar: string @@ -9519,6 +9593,41 @@ var schemaYAML = typed.YAMLObject(`types: - name: number type: scalar: numeric +- name: io.k8s.api.networking.v1alpha1.ClusterCIDR + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.networking.v1alpha1.ClusterCIDRSpec + default: {} +- name: io.k8s.api.networking.v1alpha1.ClusterCIDRSpec + map: + fields: + - name: ipv4 + type: + scalar: string + default: "" + - name: ipv6 + type: + scalar: string + default: "" + - name: nodeSelector + type: + namedType: io.k8s.api.core.v1.NodeSelector + - name: perNodeHostBits + type: + scalar: numeric + default: 0 - name: io.k8s.api.networking.v1beta1.HTTPIngressPath map: fields: @@ -10824,6 +10933,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: requiresRepublish type: scalar: boolean + - name: seLinuxMount + type: + scalar: boolean - name: storageCapacity type: scalar: boolean @@ -11176,6 +11288,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: requiresRepublish type: scalar: boolean + - name: seLinuxMount + type: + scalar: boolean - name: storageCapacity type: scalar: boolean @@ -11530,9 +11645,6 @@ var schemaYAML = typed.YAMLObject(`types: map: elementType: scalar: string - - name: clusterName - type: - scalar: string - name: creationTimestamp type: namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/listmeta.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/listmeta.go new file mode 100644 index 000000000..5cadee335 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/listmeta.go @@ -0,0 +1,66 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ListMetaApplyConfiguration represents an declarative configuration of the ListMeta type for use +// with apply. +type ListMetaApplyConfiguration struct { + SelfLink *string `json:"selfLink,omitempty"` + ResourceVersion *string `json:"resourceVersion,omitempty"` + Continue *string `json:"continue,omitempty"` + RemainingItemCount *int64 `json:"remainingItemCount,omitempty"` +} + +// ListMetaApplyConfiguration constructs an declarative configuration of the ListMeta type for use with +// apply. +func ListMeta() *ListMetaApplyConfiguration { + return &ListMetaApplyConfiguration{} +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ListMetaApplyConfiguration) WithSelfLink(value string) *ListMetaApplyConfiguration { + b.SelfLink = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ListMetaApplyConfiguration) WithResourceVersion(value string) *ListMetaApplyConfiguration { + b.ResourceVersion = &value + return b +} + +// WithContinue sets the Continue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Continue field is set to the value of the last call. +func (b *ListMetaApplyConfiguration) WithContinue(value string) *ListMetaApplyConfiguration { + b.Continue = &value + return b +} + +// WithRemainingItemCount sets the RemainingItemCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RemainingItemCount field is set to the value of the last call. +func (b *ListMetaApplyConfiguration) WithRemainingItemCount(value int64) *ListMetaApplyConfiguration { + b.RemainingItemCount = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidr.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidr.go new file mode 100644 index 000000000..ad0eae919 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidr.go @@ -0,0 +1,247 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + networkingv1alpha1 "k8s.io/api/networking/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ClusterCIDRApplyConfiguration represents an declarative configuration of the ClusterCIDR type for use +// with apply. +type ClusterCIDRApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *ClusterCIDRSpecApplyConfiguration `json:"spec,omitempty"` +} + +// ClusterCIDR constructs an declarative configuration of the ClusterCIDR type for use with +// apply. +func ClusterCIDR(name string) *ClusterCIDRApplyConfiguration { + b := &ClusterCIDRApplyConfiguration{} + b.WithName(name) + b.WithKind("ClusterCIDR") + b.WithAPIVersion("networking.k8s.io/v1alpha1") + return b +} + +// ExtractClusterCIDR extracts the applied configuration owned by fieldManager from +// clusterCIDR. If no managedFields are found in clusterCIDR for fieldManager, a +// ClusterCIDRApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. It is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// clusterCIDR must be a unmodified ClusterCIDR API object that was retrieved from the Kubernetes API. +// ExtractClusterCIDR provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractClusterCIDR(clusterCIDR *networkingv1alpha1.ClusterCIDR, fieldManager string) (*ClusterCIDRApplyConfiguration, error) { + return extractClusterCIDR(clusterCIDR, fieldManager, "") +} + +// ExtractClusterCIDRStatus is the same as ExtractClusterCIDR except +// that it extracts the status subresource applied configuration. +// Experimental! +func ExtractClusterCIDRStatus(clusterCIDR *networkingv1alpha1.ClusterCIDR, fieldManager string) (*ClusterCIDRApplyConfiguration, error) { + return extractClusterCIDR(clusterCIDR, fieldManager, "status") +} + +func extractClusterCIDR(clusterCIDR *networkingv1alpha1.ClusterCIDR, fieldManager string, subresource string) (*ClusterCIDRApplyConfiguration, error) { + b := &ClusterCIDRApplyConfiguration{} + err := managedfields.ExtractInto(clusterCIDR, internal.Parser().Type("io.k8s.api.networking.v1alpha1.ClusterCIDR"), fieldManager, b, subresource) + if err != nil { + return nil, err + } + b.WithName(clusterCIDR.Name) + + b.WithKind("ClusterCIDR") + b.WithAPIVersion("networking.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithKind(value string) *ClusterCIDRApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithAPIVersion(value string) *ClusterCIDRApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithName(value string) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithGenerateName(value string) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithNamespace(value string) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithUID(value types.UID) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithResourceVersion(value string) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithGeneration(value int64) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ClusterCIDRApplyConfiguration) WithLabels(entries map[string]string) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ClusterCIDRApplyConfiguration) WithAnnotations(entries map[string]string) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ClusterCIDRApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ClusterCIDRApplyConfiguration) WithFinalizers(values ...string) *ClusterCIDRApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +func (b *ClusterCIDRApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ClusterCIDRApplyConfiguration) WithSpec(value *ClusterCIDRSpecApplyConfiguration) *ClusterCIDRApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidrspec.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidrspec.go new file mode 100644 index 000000000..8d5fa406b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidrspec.go @@ -0,0 +1,70 @@ +/* +Copyright 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. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// ClusterCIDRSpecApplyConfiguration represents an declarative configuration of the ClusterCIDRSpec type for use +// with apply. +type ClusterCIDRSpecApplyConfiguration struct { + NodeSelector *v1.NodeSelectorApplyConfiguration `json:"nodeSelector,omitempty"` + PerNodeHostBits *int32 `json:"perNodeHostBits,omitempty"` + IPv4 *string `json:"ipv4,omitempty"` + IPv6 *string `json:"ipv6,omitempty"` +} + +// ClusterCIDRSpecApplyConfiguration constructs an declarative configuration of the ClusterCIDRSpec type for use with +// apply. +func ClusterCIDRSpec() *ClusterCIDRSpecApplyConfiguration { + return &ClusterCIDRSpecApplyConfiguration{} +} + +// WithNodeSelector sets the NodeSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeSelector field is set to the value of the last call. +func (b *ClusterCIDRSpecApplyConfiguration) WithNodeSelector(value *v1.NodeSelectorApplyConfiguration) *ClusterCIDRSpecApplyConfiguration { + b.NodeSelector = value + return b +} + +// WithPerNodeHostBits sets the PerNodeHostBits field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PerNodeHostBits field is set to the value of the last call. +func (b *ClusterCIDRSpecApplyConfiguration) WithPerNodeHostBits(value int32) *ClusterCIDRSpecApplyConfiguration { + b.PerNodeHostBits = &value + return b +} + +// WithIPv4 sets the IPv4 field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IPv4 field is set to the value of the last call. +func (b *ClusterCIDRSpecApplyConfiguration) WithIPv4(value string) *ClusterCIDRSpecApplyConfiguration { + b.IPv4 = &value + return b +} + +// WithIPv6 sets the IPv6 field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IPv6 field is set to the value of the last call. +func (b *ClusterCIDRSpecApplyConfiguration) WithIPv6(value string) *ClusterCIDRSpecApplyConfiguration { + b.IPv6 = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriverspec.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriverspec.go index 1dc17ce96..a1ef00656 100644 --- a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriverspec.go +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriverspec.go @@ -32,6 +32,7 @@ type CSIDriverSpecApplyConfiguration struct { FSGroupPolicy *v1.FSGroupPolicy `json:"fsGroupPolicy,omitempty"` TokenRequests []TokenRequestApplyConfiguration `json:"tokenRequests,omitempty"` RequiresRepublish *bool `json:"requiresRepublish,omitempty"` + SELinuxMount *bool `json:"seLinuxMount,omitempty"` } // CSIDriverSpecApplyConfiguration constructs an declarative configuration of the CSIDriverSpec type for use with @@ -102,3 +103,11 @@ func (b *CSIDriverSpecApplyConfiguration) WithRequiresRepublish(value bool) *CSI b.RequiresRepublish = &value return b } + +// WithSELinuxMount sets the SELinuxMount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SELinuxMount field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithSELinuxMount(value bool) *CSIDriverSpecApplyConfiguration { + b.SELinuxMount = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriverspec.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriverspec.go index 1d943cbff..6097a615b 100644 --- a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriverspec.go +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriverspec.go @@ -32,6 +32,7 @@ type CSIDriverSpecApplyConfiguration struct { FSGroupPolicy *v1beta1.FSGroupPolicy `json:"fsGroupPolicy,omitempty"` TokenRequests []TokenRequestApplyConfiguration `json:"tokenRequests,omitempty"` RequiresRepublish *bool `json:"requiresRepublish,omitempty"` + SELinuxMount *bool `json:"seLinuxMount,omitempty"` } // CSIDriverSpecApplyConfiguration constructs an declarative configuration of the CSIDriverSpec type for use with @@ -102,3 +103,11 @@ func (b *CSIDriverSpecApplyConfiguration) WithRequiresRepublish(value bool) *CSI b.RequiresRepublish = &value return b } + +// WithSELinuxMount sets the SELinuxMount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SELinuxMount field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithSELinuxMount(value bool) *CSIDriverSpecApplyConfiguration { + b.SELinuxMount = &value + return b +} diff --git a/vendor/k8s.io/client-go/discovery/cached/disk/round_tripper.go b/vendor/k8s.io/client-go/discovery/cached/disk/round_tripper.go index bda2e5cf4..f3a4b2947 100644 --- a/vendor/k8s.io/client-go/discovery/cached/disk/round_tripper.go +++ b/vendor/k8s.io/client-go/discovery/cached/disk/round_tripper.go @@ -17,12 +17,14 @@ limitations under the License. package disk import ( + "bytes" + "crypto/sha256" + "fmt" "net/http" "os" "path/filepath" "github.com/gregjones/httpcache" - "github.com/gregjones/httpcache/diskcache" "github.com/peterbourgon/diskv" "k8s.io/klog/v2" ) @@ -41,7 +43,7 @@ func newCacheRoundTripper(cacheDir string, rt http.RoundTripper) http.RoundTripp BasePath: cacheDir, TempDir: filepath.Join(cacheDir, ".diskv-temp"), }) - t := httpcache.NewTransport(diskcache.NewWithDiskv(d)) + t := httpcache.NewTransport(&sumDiskCache{disk: d}) t.Transport = rt return &cacheRoundTripper{rt: t} @@ -63,3 +65,56 @@ func (rt *cacheRoundTripper) CancelRequest(req *http.Request) { } func (rt *cacheRoundTripper) WrappedRoundTripper() http.RoundTripper { return rt.rt.Transport } + +// A sumDiskCache is a cache backend for github.com/gregjones/httpcache. It is +// similar to httpcache's diskcache package, but uses SHA256 sums to ensure +// cache integrity at read time rather than fsyncing each cache entry to +// increase the likelihood they will be persisted at write time. This avoids +// significant performance degradation on MacOS. +// +// See https://github.com/kubernetes/kubernetes/issues/110753 for more. +type sumDiskCache struct { + disk *diskv.Diskv +} + +// Get the requested key from the cache on disk. If Get encounters an error, or +// the returned value is not a SHA256 sum followed by bytes with a matching +// checksum it will return false to indicate a cache miss. +func (c *sumDiskCache) Get(key string) ([]byte, bool) { + b, err := c.disk.Read(sanitize(key)) + if err != nil || len(b) < sha256.Size { + return []byte{}, false + } + + response := b[sha256.Size:] + want := b[:sha256.Size] // The first 32 bytes of the file should be the SHA256 sum. + got := sha256.Sum256(response) + if !bytes.Equal(want, got[:]) { + return []byte{}, false + } + + return response, true +} + +// Set writes the response to a file on disk. The filename will be the SHA256 +// sum of the key. The file will contain a SHA256 sum of the response bytes, +// followed by said response bytes. +func (c *sumDiskCache) Set(key string, response []byte) { + s := sha256.Sum256(response) + _ = c.disk.Write(sanitize(key), append(s[:], response...)) // Nothing we can do with this error. +} + +func (c *sumDiskCache) Delete(key string) { + _ = c.disk.Erase(sanitize(key)) // Nothing we can do with this error. +} + +// Sanitize an httpcache key such that it can be used as a diskv key, which must +// be a valid filename. The httpcache key will either be the requested URL (if +// the request method was GET) or " " for other methods, per the +// httpcache.cacheKey function. +func sanitize(key string) string { + // These keys are not sensitive. We use sha256 to avoid a (potentially + // malicious) collision causing the wrong cache data to be written or + // accessed. + return fmt.Sprintf("%x", sha256.Sum256([]byte(key))) +} diff --git a/vendor/k8s.io/client-go/discovery/discovery_client.go b/vendor/k8s.io/client-go/discovery/discovery_client.go index baf878846..ec7ebf051 100644 --- a/vendor/k8s.io/client-go/discovery/discovery_client.go +++ b/vendor/k8s.io/client-go/discovery/discovery_client.go @@ -52,6 +52,9 @@ const ( // defaultTimeout is the maximum amount of time per request when no timeout has been set on a RESTClient. // Defaults to 32s in order to have a distinguishable length of time, relative to other timeouts that exist. defaultTimeout = 32 * time.Second + + // defaultBurst is the default burst to be used with the discovery client's token bucket rate limiter + defaultBurst = 300 ) // DiscoveryInterface holds the methods that discover server-supported API groups, @@ -456,12 +459,13 @@ func setDiscoveryDefaults(config *restclient.Config) error { if config.Timeout == 0 { config.Timeout = defaultTimeout } - if config.Burst == 0 && config.QPS < 100 { + // if a burst limit is not already configured + if config.Burst == 0 { // discovery is expected to be bursty, increase the default burst // to accommodate looking up resource info for many API groups. // matches burst set by ConfigFlags#ToDiscoveryClient(). // see https://issue.k8s.io/86149 - config.Burst = 100 + config.Burst = defaultBurst } codec := runtime.NoopEncoder{Decoder: scheme.Codecs.UniversalDecoder()} config.NegotiatedSerializer = serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{Serializer: codec}) diff --git a/vendor/k8s.io/client-go/dynamic/interface.go b/vendor/k8s.io/client-go/dynamic/interface.go index b08067c34..a310b63e5 100644 --- a/vendor/k8s.io/client-go/dynamic/interface.go +++ b/vendor/k8s.io/client-go/dynamic/interface.go @@ -40,6 +40,8 @@ type ResourceInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*unstructured.UnstructuredList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, options metav1.PatchOptions, subresources ...string) (*unstructured.Unstructured, error) + Apply(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions, subresources ...string) (*unstructured.Unstructured, error) + ApplyStatus(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions) (*unstructured.Unstructured, error) } type NamespaceableResourceInterface interface { diff --git a/vendor/k8s.io/client-go/dynamic/simple.go b/vendor/k8s.io/client-go/dynamic/simple.go index 87594bf2e..9dc0fb5c0 100644 --- a/vendor/k8s.io/client-go/dynamic/simple.go +++ b/vendor/k8s.io/client-go/dynamic/simple.go @@ -324,6 +324,48 @@ func (c *dynamicResourceClient) Patch(ctx context.Context, name string, pt types return uncastObj.(*unstructured.Unstructured), nil } +func (c *dynamicResourceClient) Apply(ctx context.Context, name string, obj *unstructured.Unstructured, opts metav1.ApplyOptions, subresources ...string) (*unstructured.Unstructured, error) { + if len(name) == 0 { + return nil, fmt.Errorf("name is required") + } + outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) + if err != nil { + return nil, err + } + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + managedFields := accessor.GetManagedFields() + if len(managedFields) > 0 { + return nil, fmt.Errorf(`cannot apply an object with managed fields already set. + Use the client-go/applyconfigurations "UnstructructuredExtractor" to obtain the unstructured ApplyConfiguration for the given field manager that you can use/modify here to apply`) + } + patchOpts := opts.ToPatchOptions() + + result := c.client.client. + Patch(types.ApplyPatchType). + AbsPath(append(c.makeURLSegments(name), subresources...)...). + Body(outBytes). + SpecificallyVersionedParams(&patchOpts, dynamicParameterCodec, versionV1). + Do(ctx) + if err := result.Error(); err != nil { + return nil, err + } + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} +func (c *dynamicResourceClient) ApplyStatus(ctx context.Context, name string, obj *unstructured.Unstructured, opts metav1.ApplyOptions) (*unstructured.Unstructured, error) { + return c.Apply(ctx, name, obj, opts, "status") +} + func (c *dynamicResourceClient) makeURLSegments(name string) []string { url := []string{} if len(c.resource.Group) == 0 { diff --git a/vendor/k8s.io/client-go/kubernetes/clientset.go b/vendor/k8s.io/client-go/kubernetes/clientset.go index e46c0537f..0ea0c3c4c 100644 --- a/vendor/k8s.io/client-go/kubernetes/clientset.go +++ b/vendor/k8s.io/client-go/kubernetes/clientset.go @@ -53,6 +53,7 @@ import ( flowcontrolv1beta1 "k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1" flowcontrolv1beta2 "k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta2" networkingv1 "k8s.io/client-go/kubernetes/typed/networking/v1" + networkingv1alpha1 "k8s.io/client-go/kubernetes/typed/networking/v1alpha1" networkingv1beta1 "k8s.io/client-go/kubernetes/typed/networking/v1beta1" nodev1 "k8s.io/client-go/kubernetes/typed/node/v1" nodev1alpha1 "k8s.io/client-go/kubernetes/typed/node/v1alpha1" @@ -104,6 +105,7 @@ type Interface interface { FlowcontrolV1beta1() flowcontrolv1beta1.FlowcontrolV1beta1Interface FlowcontrolV1beta2() flowcontrolv1beta2.FlowcontrolV1beta2Interface NetworkingV1() networkingv1.NetworkingV1Interface + NetworkingV1alpha1() networkingv1alpha1.NetworkingV1alpha1Interface NetworkingV1beta1() networkingv1beta1.NetworkingV1beta1Interface NodeV1() nodev1.NodeV1Interface NodeV1alpha1() nodev1alpha1.NodeV1alpha1Interface @@ -155,6 +157,7 @@ type Clientset struct { flowcontrolV1beta1 *flowcontrolv1beta1.FlowcontrolV1beta1Client flowcontrolV1beta2 *flowcontrolv1beta2.FlowcontrolV1beta2Client networkingV1 *networkingv1.NetworkingV1Client + networkingV1alpha1 *networkingv1alpha1.NetworkingV1alpha1Client networkingV1beta1 *networkingv1beta1.NetworkingV1beta1Client nodeV1 *nodev1.NodeV1Client nodeV1alpha1 *nodev1alpha1.NodeV1alpha1Client @@ -322,6 +325,11 @@ func (c *Clientset) NetworkingV1() networkingv1.NetworkingV1Interface { return c.networkingV1 } +// NetworkingV1alpha1 retrieves the NetworkingV1alpha1Client +func (c *Clientset) NetworkingV1alpha1() networkingv1alpha1.NetworkingV1alpha1Interface { + return c.networkingV1alpha1 +} + // NetworkingV1beta1 retrieves the NetworkingV1beta1Client func (c *Clientset) NetworkingV1beta1() networkingv1beta1.NetworkingV1beta1Interface { return c.networkingV1beta1 @@ -561,6 +569,10 @@ func NewForConfigAndClient(c *rest.Config, httpClient *http.Client) (*Clientset, if err != nil { return nil, err } + cs.networkingV1alpha1, err = networkingv1alpha1.NewForConfigAndClient(&configShallowCopy, httpClient) + if err != nil { + return nil, err + } cs.networkingV1beta1, err = networkingv1beta1.NewForConfigAndClient(&configShallowCopy, httpClient) if err != nil { return nil, err @@ -672,6 +684,7 @@ func New(c rest.Interface) *Clientset { cs.flowcontrolV1beta1 = flowcontrolv1beta1.New(c) cs.flowcontrolV1beta2 = flowcontrolv1beta2.New(c) cs.networkingV1 = networkingv1.New(c) + cs.networkingV1alpha1 = networkingv1alpha1.New(c) cs.networkingV1beta1 = networkingv1beta1.New(c) cs.nodeV1 = nodev1.New(c) cs.nodeV1alpha1 = nodev1alpha1.New(c) diff --git a/vendor/k8s.io/client-go/kubernetes/scheme/register.go b/vendor/k8s.io/client-go/kubernetes/scheme/register.go index b41466151..ea01840ef 100644 --- a/vendor/k8s.io/client-go/kubernetes/scheme/register.go +++ b/vendor/k8s.io/client-go/kubernetes/scheme/register.go @@ -49,6 +49,7 @@ import ( flowcontrolv1beta1 "k8s.io/api/flowcontrol/v1beta1" flowcontrolv1beta2 "k8s.io/api/flowcontrol/v1beta2" networkingv1 "k8s.io/api/networking/v1" + networkingv1alpha1 "k8s.io/api/networking/v1alpha1" networkingv1beta1 "k8s.io/api/networking/v1beta1" nodev1 "k8s.io/api/node/v1" nodev1alpha1 "k8s.io/api/node/v1alpha1" @@ -105,6 +106,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{ flowcontrolv1beta1.AddToScheme, flowcontrolv1beta2.AddToScheme, networkingv1.AddToScheme, + networkingv1alpha1.AddToScheme, networkingv1beta1.AddToScheme, nodev1.AddToScheme, nodev1alpha1.AddToScheme, @@ -125,14 +127,14 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // AddToScheme adds all types of this clientset into the given scheme. This allows composition // of clientsets, like in: // -// import ( -// "k8s.io/client-go/kubernetes" -// clientsetscheme "k8s.io/client-go/kubernetes/scheme" -// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" -// ) +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) // -// kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event_expansion.go index 7213193bf..464fff911 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event_expansion.go @@ -82,7 +82,8 @@ func (e *events) UpdateWithEventNamespace(event *v1beta1.Event) (*v1beta1.Event, // It returns the copy of the event that the server returns, or an error. // The namespace and name of the target event is deduced from the event. // The namespace must either match this event client's namespace, or this event client must -// have been created with the "" namespace. +// +// have been created with the "" namespace. func (e *events) PatchWithEventNamespace(event *v1beta1.Event, data []byte) (*v1beta1.Event, error) { if e.ns != "" && event.Namespace != e.ns { return nil, fmt.Errorf("can't patch an event with namespace '%v' in namespace '%v'", event.Namespace, e.ns) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/clustercidr.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/clustercidr.go new file mode 100644 index 000000000..9df76351d --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/clustercidr.go @@ -0,0 +1,197 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "context" + json "encoding/json" + "fmt" + "time" + + v1alpha1 "k8s.io/api/networking/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + networkingv1alpha1 "k8s.io/client-go/applyconfigurations/networking/v1alpha1" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// ClusterCIDRsGetter has a method to return a ClusterCIDRInterface. +// A group's client should implement this interface. +type ClusterCIDRsGetter interface { + ClusterCIDRs() ClusterCIDRInterface +} + +// ClusterCIDRInterface has methods to work with ClusterCIDR resources. +type ClusterCIDRInterface interface { + Create(ctx context.Context, clusterCIDR *v1alpha1.ClusterCIDR, opts v1.CreateOptions) (*v1alpha1.ClusterCIDR, error) + Update(ctx context.Context, clusterCIDR *v1alpha1.ClusterCIDR, opts v1.UpdateOptions) (*v1alpha1.ClusterCIDR, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.ClusterCIDR, error) + List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.ClusterCIDRList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ClusterCIDR, err error) + Apply(ctx context.Context, clusterCIDR *networkingv1alpha1.ClusterCIDRApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.ClusterCIDR, err error) + ClusterCIDRExpansion +} + +// clusterCIDRs implements ClusterCIDRInterface +type clusterCIDRs struct { + client rest.Interface +} + +// newClusterCIDRs returns a ClusterCIDRs +func newClusterCIDRs(c *NetworkingV1alpha1Client) *clusterCIDRs { + return &clusterCIDRs{ + client: c.RESTClient(), + } +} + +// Get takes name of the clusterCIDR, and returns the corresponding clusterCIDR object, and an error if there is any. +func (c *clusterCIDRs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ClusterCIDR, err error) { + result = &v1alpha1.ClusterCIDR{} + err = c.client.Get(). + Resource("clustercidrs"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of ClusterCIDRs that match those selectors. +func (c *clusterCIDRs) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.ClusterCIDRList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1alpha1.ClusterCIDRList{} + err = c.client.Get(). + Resource("clustercidrs"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested clusterCIDRs. +func (c *clusterCIDRs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Resource("clustercidrs"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a clusterCIDR and creates it. Returns the server's representation of the clusterCIDR, and an error, if there is any. +func (c *clusterCIDRs) Create(ctx context.Context, clusterCIDR *v1alpha1.ClusterCIDR, opts v1.CreateOptions) (result *v1alpha1.ClusterCIDR, err error) { + result = &v1alpha1.ClusterCIDR{} + err = c.client.Post(). + Resource("clustercidrs"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(clusterCIDR). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a clusterCIDR and updates it. Returns the server's representation of the clusterCIDR, and an error, if there is any. +func (c *clusterCIDRs) Update(ctx context.Context, clusterCIDR *v1alpha1.ClusterCIDR, opts v1.UpdateOptions) (result *v1alpha1.ClusterCIDR, err error) { + result = &v1alpha1.ClusterCIDR{} + err = c.client.Put(). + Resource("clustercidrs"). + Name(clusterCIDR.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(clusterCIDR). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the clusterCIDR and deletes it. Returns an error if one occurs. +func (c *clusterCIDRs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Resource("clustercidrs"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *clusterCIDRs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Resource("clustercidrs"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched clusterCIDR. +func (c *clusterCIDRs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ClusterCIDR, err error) { + result = &v1alpha1.ClusterCIDR{} + err = c.client.Patch(pt). + Resource("clustercidrs"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterCIDR. +func (c *clusterCIDRs) Apply(ctx context.Context, clusterCIDR *networkingv1alpha1.ClusterCIDRApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.ClusterCIDR, err error) { + if clusterCIDR == nil { + return nil, fmt.Errorf("clusterCIDR provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(clusterCIDR) + if err != nil { + return nil, err + } + name := clusterCIDR.Name + if name == nil { + return nil, fmt.Errorf("clusterCIDR.Name must be provided to Apply") + } + result = &v1alpha1.ClusterCIDR{} + err = c.client.Patch(types.ApplyPatchType). + Resource("clustercidrs"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/doc.go new file mode 100644 index 000000000..df51baa4d --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v1alpha1 diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/generated_expansion.go new file mode 100644 index 000000000..ab41abb7d --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/generated_expansion.go @@ -0,0 +1,21 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +type ClusterCIDRExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/networking_client.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/networking_client.go new file mode 100644 index 000000000..ccb593316 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/networking_client.go @@ -0,0 +1,107 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "net/http" + + v1alpha1 "k8s.io/api/networking/v1alpha1" + "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +type NetworkingV1alpha1Interface interface { + RESTClient() rest.Interface + ClusterCIDRsGetter +} + +// NetworkingV1alpha1Client is used to interact with features provided by the networking.k8s.io group. +type NetworkingV1alpha1Client struct { + restClient rest.Interface +} + +func (c *NetworkingV1alpha1Client) ClusterCIDRs() ClusterCIDRInterface { + return newClusterCIDRs(c) +} + +// NewForConfig creates a new NetworkingV1alpha1Client for the given config. +// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), +// where httpClient was generated with rest.HTTPClientFor(c). +func NewForConfig(c *rest.Config) (*NetworkingV1alpha1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + httpClient, err := rest.HTTPClientFor(&config) + if err != nil { + return nil, err + } + return NewForConfigAndClient(&config, httpClient) +} + +// NewForConfigAndClient creates a new NetworkingV1alpha1Client for the given config and http client. +// Note the http client provided takes precedence over the configured transport values. +func NewForConfigAndClient(c *rest.Config, h *http.Client) (*NetworkingV1alpha1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientForConfigAndClient(&config, h) + if err != nil { + return nil, err + } + return &NetworkingV1alpha1Client{client}, nil +} + +// NewForConfigOrDie creates a new NetworkingV1alpha1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *NetworkingV1alpha1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new NetworkingV1alpha1Client for the given RESTClient. +func New(c rest.Interface) *NetworkingV1alpha1Client { + return &NetworkingV1alpha1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1alpha1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *NetworkingV1alpha1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go index 5b679b16d..455854c0c 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go @@ -89,7 +89,7 @@ var warnOnce sync.Once func newAzureAuthProvider(_ string, cfg map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { // deprecated in v1.22, remove in v1.25 warnOnce.Do(func() { - klog.Warningf(`WARNING: the azure auth plugin is deprecated in v1.22+, unavailable in v1.25+; use https://github.com/Azure/kubelogin instead. + klog.Warningf(`WARNING: the azure auth plugin is deprecated in v1.22+, unavailable in v1.26+; use https://github.com/Azure/kubelogin instead. To learn more, consult https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins`) }) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go index 209376bc2..ee7c4948c 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go @@ -59,55 +59,54 @@ var ( // tokens for kubectl to authenticate itself to the apiserver. A sample json config // is provided below with all recognized options described. // -// { -// 'auth-provider': { -// # Required -// "name": "gcp", +// { +// 'auth-provider': { +// # Required +// "name": "gcp", // -// 'config': { -// # Authentication options -// # These options are used while getting a token. +// 'config': { +// # Authentication options +// # These options are used while getting a token. // -// # comma-separated list of GCP API scopes. default value of this field -// # is "https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email". -// # to override the API scopes, specify this field explicitly. -// "scopes": "https://www.googleapis.com/auth/cloud-platform" +// # comma-separated list of GCP API scopes. default value of this field +// # is "https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email". +// # to override the API scopes, specify this field explicitly. +// "scopes": "https://www.googleapis.com/auth/cloud-platform" // -// # Caching options +// # Caching options // -// # Raw string data representing cached access token. -// "access-token": "ya29.CjWdA4GiBPTt", -// # RFC3339Nano expiration timestamp for cached access token. -// "expiry": "2016-10-31 22:31:9.123", +// # Raw string data representing cached access token. +// "access-token": "ya29.CjWdA4GiBPTt", +// # RFC3339Nano expiration timestamp for cached access token. +// "expiry": "2016-10-31 22:31:9.123", // -// # Command execution options -// # These options direct the plugin to execute a specified command and parse -// # token and expiry time from the output of the command. +// # Command execution options +// # These options direct the plugin to execute a specified command and parse +// # token and expiry time from the output of the command. // -// # Command to execute for access token. Command output will be parsed as JSON. -// # If "cmd-args" is not present, this value will be split on whitespace, with -// # the first element interpreted as the command, remaining elements as args. -// "cmd-path": "/usr/bin/gcloud", +// # Command to execute for access token. Command output will be parsed as JSON. +// # If "cmd-args" is not present, this value will be split on whitespace, with +// # the first element interpreted as the command, remaining elements as args. +// "cmd-path": "/usr/bin/gcloud", // -// # Arguments to pass to command to execute for access token. -// "cmd-args": "config config-helper --output=json" +// # Arguments to pass to command to execute for access token. +// "cmd-args": "config config-helper --output=json" // -// # JSONPath to the string field that represents the access token in -// # command output. If omitted, defaults to "{.access_token}". -// "token-key": "{.credential.access_token}", +// # JSONPath to the string field that represents the access token in +// # command output. If omitted, defaults to "{.access_token}". +// "token-key": "{.credential.access_token}", // -// # JSONPath to the string field that represents expiration timestamp -// # of the access token in the command output. If omitted, defaults to -// # "{.token_expiry}" -// "expiry-key": ""{.credential.token_expiry}", -// -// # golang reference time in the format that the expiration timestamp uses. -// # If omitted, defaults to time.RFC3339Nano -// "time-fmt": "2006-01-02 15:04:05.999999999" -// } -// } -// } +// # JSONPath to the string field that represents expiration timestamp +// # of the access token in the command output. If omitted, defaults to +// # "{.token_expiry}" +// "expiry-key": ""{.credential.token_expiry}", // +// # golang reference time in the format that the expiration timestamp uses. +// # If omitted, defaults to time.RFC3339Nano +// "time-fmt": "2006-01-02 15:04:05.999999999" +// } +// } +// } type gcpAuthProvider struct { tokenSource oauth2.TokenSource persister restclient.AuthProviderConfigPersister @@ -117,7 +116,7 @@ var warnOnce sync.Once func newGCPAuthProvider(_ string, gcpConfig map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { warnOnce.Do(func() { - klog.Warningf(`WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead. + klog.Warningf(`WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.26+; use gcloud instead. To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke`) }) diff --git a/vendor/k8s.io/client-go/rest/client.go b/vendor/k8s.io/client-go/rest/client.go index c96930049..2cf821bcd 100644 --- a/vendor/k8s.io/client-go/rest/client.go +++ b/vendor/k8s.io/client-go/rest/client.go @@ -52,7 +52,8 @@ type Interface interface { // ClientContentConfig controls how RESTClient communicates with the server. // // TODO: ContentConfig will be updated to accept a Negotiator instead of a -// NegotiatedSerializer and NegotiatedSerializer will be removed. +// +// NegotiatedSerializer and NegotiatedSerializer will be removed. type ClientContentConfig struct { // AcceptContentTypes specifies the types the client will accept and is optional. // If not set, ContentType will be used to define the Accept header @@ -159,13 +160,14 @@ func readExpBackoffConfig() BackoffManager { // c, err := NewRESTClient(...) // if err != nil { ... } // resp, err := c.Verb("GET"). -// Path("pods"). -// SelectorParam("labels", "area=staging"). -// Timeout(10*time.Second). -// Do() +// +// Path("pods"). +// SelectorParam("labels", "area=staging"). +// Timeout(10*time.Second). +// Do() +// // if err != nil { ... } // list, ok := resp.(*api.PodList) -// func (c *RESTClient) Verb(verb string) *Request { return NewRequest(c).Verb(verb) } diff --git a/vendor/k8s.io/client-go/rest/exec.go b/vendor/k8s.io/client-go/rest/exec.go index 5f3b43c55..8539d5530 100644 --- a/vendor/k8s.io/client-go/rest/exec.go +++ b/vendor/k8s.io/client-go/rest/exec.go @@ -21,7 +21,6 @@ import ( "net/http" "net/url" - "k8s.io/client-go/pkg/apis/clientauthentication" clientauthenticationapi "k8s.io/client-go/pkg/apis/clientauthentication" ) @@ -50,7 +49,7 @@ func ConfigToExecCluster(config *Config) (*clientauthenticationapi.Cluster, erro } } - return &clientauthentication.Cluster{ + return &clientauthenticationapi.Cluster{ Server: config.Host, TLSServerName: config.ServerName, InsecureSkipTLSVerify: config.Insecure, @@ -63,7 +62,7 @@ func ConfigToExecCluster(config *Config) (*clientauthenticationapi.Cluster, erro // ExecClusterToConfig creates a Config with the corresponding fields from the provided // clientauthenticationapi.Cluster. The returned Config will be anonymous (i.e., it will not have // any authentication-related fields set). -func ExecClusterToConfig(cluster *clientauthentication.Cluster) (*Config, error) { +func ExecClusterToConfig(cluster *clientauthenticationapi.Cluster) (*Config, error) { var proxy func(*http.Request) (*url.URL, error) if cluster.ProxyURL != "" { proxyURL, err := url.Parse(cluster.ProxyURL) diff --git a/vendor/k8s.io/client-go/rest/plugin.go b/vendor/k8s.io/client-go/rest/plugin.go index c2b3dfc0f..ae5cbdc2c 100644 --- a/vendor/k8s.io/client-go/rest/plugin.go +++ b/vendor/k8s.io/client-go/rest/plugin.go @@ -36,9 +36,10 @@ type AuthProvider interface { } // Factory generates an AuthProvider plugin. -// clusterAddress is the address of the current cluster. -// config is the initial configuration for this plugin. -// persister allows the plugin to save updated configuration. +// +// clusterAddress is the address of the current cluster. +// config is the initial configuration for this plugin. +// persister allows the plugin to save updated configuration. type Factory func(clusterAddress string, config map[string]string, persister AuthProviderConfigPersister) (AuthProvider, error) // AuthProviderConfigPersister allows a plugin to persist configuration info diff --git a/vendor/k8s.io/client-go/rest/request.go b/vendor/k8s.io/client-go/rest/request.go index 3a1560df0..dba933f7d 100644 --- a/vendor/k8s.io/client-go/rest/request.go +++ b/vendor/k8s.io/client-go/rest/request.go @@ -710,7 +710,7 @@ func updateURLMetrics(ctx context.Context, req *Request, resp *http.Response, er if err != nil { metrics.RequestResult.Increment(ctx, "", req.verb, url) } else { - //Metrics for failure codes + // Metrics for failure codes metrics.RequestResult.Increment(ctx, strconv.Itoa(resp.StatusCode), req.verb, url) } } @@ -823,7 +823,7 @@ func (r *Request) newHTTPRequest(ctx context.Context) (*http.Request, error) { // fn at most once. It will return an error if a problem occurred prior to connecting to the // server - the provided function is responsible for handling server errors. func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Response)) error { - //Metrics for total request latency + // Metrics for total request latency start := time.Now() defer func() { metrics.RequestLatency.Observe(ctx, r.verb, *r.URL(), time.Since(start)) @@ -892,7 +892,7 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp done := func() bool { defer readAndCloseResponseBody(resp) - // if the the server returns an error in err, the response will be nil. + // if the server returns an error in err, the response will be nil. f := func(req *http.Request, resp *http.Response) { if resp == nil { return @@ -917,8 +917,8 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp // processing. // // Error type: -// * If the server responds with a status: *errors.StatusError or *errors.UnexpectedObjectError -// * http.Client.Do errors are returned directly. +// - If the server responds with a status: *errors.StatusError or *errors.UnexpectedObjectError +// - http.Client.Do errors are returned directly. func (r *Request) Do(ctx context.Context) Result { var result Result err := r.request(ctx, func(req *http.Request, resp *http.Response) { @@ -1085,15 +1085,15 @@ const maxUnstructuredResponseTextBytes = 2048 // unexpected responses. The rough structure is: // // 1. Assume the server sends you something sane - JSON + well defined error objects + proper codes -// - this is the happy path -// - when you get this output, trust what the server sends -// 2. Guard against empty fields / bodies in received JSON and attempt to cull sufficient info from them to -// generate a reasonable facsimile of the original failure. -// - Be sure to use a distinct error type or flag that allows a client to distinguish between this and error 1 above -// 3. Handle true disconnect failures / completely malformed data by moving up to a more generic client error -// 4. Distinguish between various connection failures like SSL certificates, timeouts, proxy errors, unexpected -// initial contact, the presence of mismatched body contents from posted content types -// - Give these a separate distinct error type and capture as much as possible of the original message +// - this is the happy path +// - when you get this output, trust what the server sends +// 2. Guard against empty fields / bodies in received JSON and attempt to cull sufficient info from them to +// generate a reasonable facsimile of the original failure. +// - Be sure to use a distinct error type or flag that allows a client to distinguish between this and error 1 above +// 3. Handle true disconnect failures / completely malformed data by moving up to a more generic client error +// 4. Distinguish between various connection failures like SSL certificates, timeouts, proxy errors, unexpected +// initial contact, the presence of mismatched body contents from posted content types +// - Give these a separate distinct error type and capture as much as possible of the original message // // TODO: introduce transformation of generic http.Client.Do() errors that separates 4. func (r *Request) transformUnstructuredResponseError(resp *http.Response, req *http.Request, body []byte) error { diff --git a/vendor/k8s.io/client-go/rest/warnings.go b/vendor/k8s.io/client-go/rest/warnings.go index 18476f5ff..ad493659f 100644 --- a/vendor/k8s.io/client-go/rest/warnings.go +++ b/vendor/k8s.io/client-go/rest/warnings.go @@ -40,9 +40,9 @@ var ( // SetDefaultWarningHandler sets the default handler clients use when warning headers are encountered. // By default, warnings are logged. Several built-in implementations are provided: -// - NoWarnings suppresses warnings. -// - WarningLogger logs warnings. -// - NewWarningWriter() outputs warnings to the provided writer. +// - NoWarnings suppresses warnings. +// - WarningLogger logs warnings. +// - NewWarningWriter() outputs warnings to the provided writer. func SetDefaultWarningHandler(l WarningHandler) { defaultWarningHandlerLock.Lock() defer defaultWarningHandlerLock.Unlock() diff --git a/vendor/k8s.io/client-go/rest/with_retry.go b/vendor/k8s.io/client-go/rest/with_retry.go index 497d2608f..bdcc6f3a9 100644 --- a/vendor/k8s.io/client-go/rest/with_retry.go +++ b/vendor/k8s.io/client-go/rest/with_retry.go @@ -204,7 +204,9 @@ func (r *withRetry) Before(ctx context.Context, request *Request) error { if r.retryAfter == nil { // we do a backoff sleep before the first attempt is made, // (preserving current behavior). - request.backoff.Sleep(request.backoff.CalculateBackoff(url)) + if request.backoff != nil { + request.backoff.Sleep(request.backoff.CalculateBackoff(url)) + } return nil } @@ -220,14 +222,13 @@ func (r *withRetry) Before(ctx context.Context, request *Request) error { } } - // if we are here, we have made attempt(s) al least once before. + // if we are here, we have made attempt(s) at least once before. if request.backoff != nil { - // TODO(tkashem) with default set to use exponential backoff - // we can merge these two sleeps: - // BackOffManager.Sleep(max(backoffManager.CalculateBackoff(), retryAfter)) - // see https://github.com/kubernetes/kubernetes/issues/108302 - request.backoff.Sleep(r.retryAfter.Wait) - request.backoff.Sleep(request.backoff.CalculateBackoff(url)) + delay := request.backoff.CalculateBackoff(url) + if r.retryAfter.Wait > delay { + delay = r.retryAfter.Wait + } + request.backoff.Sleep(delay) } // We are retrying the request that we already send to @@ -349,8 +350,12 @@ func readAndCloseResponseBody(resp *http.Response) { } func retryAfterResponse() *http.Response { + return retryAfterResponseWithDelay("1") +} + +func retryAfterResponseWithDelay(delay string) *http.Response { return &http.Response{ StatusCode: http.StatusInternalServerError, - Header: http.Header{"Retry-After": []string{"1"}}, + Header: http.Header{"Retry-After": []string{delay}}, } } diff --git a/vendor/k8s.io/client-go/restmapper/shortcut.go b/vendor/k8s.io/client-go/restmapper/shortcut.go index 714ba90a7..7ab3cd46f 100644 --- a/vendor/k8s.io/client-go/restmapper/shortcut.go +++ b/vendor/k8s.io/client-go/restmapper/shortcut.go @@ -43,7 +43,18 @@ func NewShortcutExpander(delegate meta.RESTMapper, client discovery.DiscoveryInt // KindFor fulfills meta.RESTMapper func (e shortcutExpander) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) { - return e.RESTMapper.KindFor(e.expandResourceShortcut(resource)) + // expandResourceShortcut works with current API resources as read from discovery cache. + // In case of new CRDs this means we potentially don't have current state of discovery. + // In the current wiring in k8s.io/cli-runtime/pkg/genericclioptions/config_flags.go#toRESTMapper, + // we are using DeferredDiscoveryRESTMapper which on KindFor failure will clear the + // cache and fetch all data from a cluster (see vendor/k8s.io/client-go/restmapper/discovery.go#KindFor). + // Thus another call to expandResourceShortcut, after a NoMatchError should successfully + // read Kind to the user or an error. + gvk, err := e.RESTMapper.KindFor(e.expandResourceShortcut(resource)) + if meta.IsNoMatchError(err) { + return e.RESTMapper.KindFor(e.expandResourceShortcut(resource)) + } + return gvk, err } // KindsFor fulfills meta.RESTMapper diff --git a/vendor/k8s.io/client-go/testing/actions.go b/vendor/k8s.io/client-go/testing/actions.go new file mode 100644 index 000000000..c8ae0aaf5 --- /dev/null +++ b/vendor/k8s.io/client-go/testing/actions.go @@ -0,0 +1,698 @@ +/* +Copyright 2015 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 testing + +import ( + "fmt" + "path" + "strings" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" +) + +func NewRootGetAction(resource schema.GroupVersionResource, name string) GetActionImpl { + action := GetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Name = name + + return action +} + +func NewGetAction(resource schema.GroupVersionResource, namespace, name string) GetActionImpl { + action := GetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Namespace = namespace + action.Name = name + + return action +} + +func NewGetSubresourceAction(resource schema.GroupVersionResource, namespace, subresource, name string) GetActionImpl { + action := GetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Subresource = subresource + action.Namespace = namespace + action.Name = name + + return action +} + +func NewRootGetSubresourceAction(resource schema.GroupVersionResource, subresource, name string) GetActionImpl { + action := GetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Subresource = subresource + action.Name = name + + return action +} + +func NewRootListAction(resource schema.GroupVersionResource, kind schema.GroupVersionKind, opts interface{}) ListActionImpl { + action := ListActionImpl{} + action.Verb = "list" + action.Resource = resource + action.Kind = kind + labelSelector, fieldSelector, _ := ExtractFromListOptions(opts) + action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} + + return action +} + +func NewListAction(resource schema.GroupVersionResource, kind schema.GroupVersionKind, namespace string, opts interface{}) ListActionImpl { + action := ListActionImpl{} + action.Verb = "list" + action.Resource = resource + action.Kind = kind + action.Namespace = namespace + labelSelector, fieldSelector, _ := ExtractFromListOptions(opts) + action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} + + return action +} + +func NewRootCreateAction(resource schema.GroupVersionResource, object runtime.Object) CreateActionImpl { + action := CreateActionImpl{} + action.Verb = "create" + action.Resource = resource + action.Object = object + + return action +} + +func NewCreateAction(resource schema.GroupVersionResource, namespace string, object runtime.Object) CreateActionImpl { + action := CreateActionImpl{} + action.Verb = "create" + action.Resource = resource + action.Namespace = namespace + action.Object = object + + return action +} + +func NewRootCreateSubresourceAction(resource schema.GroupVersionResource, name, subresource string, object runtime.Object) CreateActionImpl { + action := CreateActionImpl{} + action.Verb = "create" + action.Resource = resource + action.Subresource = subresource + action.Name = name + action.Object = object + + return action +} + +func NewCreateSubresourceAction(resource schema.GroupVersionResource, name, subresource, namespace string, object runtime.Object) CreateActionImpl { + action := CreateActionImpl{} + action.Verb = "create" + action.Resource = resource + action.Namespace = namespace + action.Subresource = subresource + action.Name = name + action.Object = object + + return action +} + +func NewRootUpdateAction(resource schema.GroupVersionResource, object runtime.Object) UpdateActionImpl { + action := UpdateActionImpl{} + action.Verb = "update" + action.Resource = resource + action.Object = object + + return action +} + +func NewUpdateAction(resource schema.GroupVersionResource, namespace string, object runtime.Object) UpdateActionImpl { + action := UpdateActionImpl{} + action.Verb = "update" + action.Resource = resource + action.Namespace = namespace + action.Object = object + + return action +} + +func NewRootPatchAction(resource schema.GroupVersionResource, name string, pt types.PatchType, patch []byte) PatchActionImpl { + action := PatchActionImpl{} + action.Verb = "patch" + action.Resource = resource + action.Name = name + action.PatchType = pt + action.Patch = patch + + return action +} + +func NewPatchAction(resource schema.GroupVersionResource, namespace string, name string, pt types.PatchType, patch []byte) PatchActionImpl { + action := PatchActionImpl{} + action.Verb = "patch" + action.Resource = resource + action.Namespace = namespace + action.Name = name + action.PatchType = pt + action.Patch = patch + + return action +} + +func NewRootPatchSubresourceAction(resource schema.GroupVersionResource, name string, pt types.PatchType, patch []byte, subresources ...string) PatchActionImpl { + action := PatchActionImpl{} + action.Verb = "patch" + action.Resource = resource + action.Subresource = path.Join(subresources...) + action.Name = name + action.PatchType = pt + action.Patch = patch + + return action +} + +func NewPatchSubresourceAction(resource schema.GroupVersionResource, namespace, name string, pt types.PatchType, patch []byte, subresources ...string) PatchActionImpl { + action := PatchActionImpl{} + action.Verb = "patch" + action.Resource = resource + action.Subresource = path.Join(subresources...) + action.Namespace = namespace + action.Name = name + action.PatchType = pt + action.Patch = patch + + return action +} + +func NewRootUpdateSubresourceAction(resource schema.GroupVersionResource, subresource string, object runtime.Object) UpdateActionImpl { + action := UpdateActionImpl{} + action.Verb = "update" + action.Resource = resource + action.Subresource = subresource + action.Object = object + + return action +} +func NewUpdateSubresourceAction(resource schema.GroupVersionResource, subresource string, namespace string, object runtime.Object) UpdateActionImpl { + action := UpdateActionImpl{} + action.Verb = "update" + action.Resource = resource + action.Subresource = subresource + action.Namespace = namespace + action.Object = object + + return action +} + +func NewRootDeleteAction(resource schema.GroupVersionResource, name string) DeleteActionImpl { + return NewRootDeleteActionWithOptions(resource, name, metav1.DeleteOptions{}) +} + +func NewRootDeleteActionWithOptions(resource schema.GroupVersionResource, name string, opts metav1.DeleteOptions) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Name = name + action.DeleteOptions = opts + + return action +} + +func NewRootDeleteSubresourceAction(resource schema.GroupVersionResource, subresource string, name string) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Subresource = subresource + action.Name = name + + return action +} + +func NewDeleteAction(resource schema.GroupVersionResource, namespace, name string) DeleteActionImpl { + return NewDeleteActionWithOptions(resource, namespace, name, metav1.DeleteOptions{}) +} + +func NewDeleteActionWithOptions(resource schema.GroupVersionResource, namespace, name string, opts metav1.DeleteOptions) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Namespace = namespace + action.Name = name + action.DeleteOptions = opts + + return action +} + +func NewDeleteSubresourceAction(resource schema.GroupVersionResource, subresource, namespace, name string) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Subresource = subresource + action.Namespace = namespace + action.Name = name + + return action +} + +func NewRootDeleteCollectionAction(resource schema.GroupVersionResource, opts interface{}) DeleteCollectionActionImpl { + action := DeleteCollectionActionImpl{} + action.Verb = "delete-collection" + action.Resource = resource + labelSelector, fieldSelector, _ := ExtractFromListOptions(opts) + action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} + + return action +} + +func NewDeleteCollectionAction(resource schema.GroupVersionResource, namespace string, opts interface{}) DeleteCollectionActionImpl { + action := DeleteCollectionActionImpl{} + action.Verb = "delete-collection" + action.Resource = resource + action.Namespace = namespace + labelSelector, fieldSelector, _ := ExtractFromListOptions(opts) + action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} + + return action +} + +func NewRootWatchAction(resource schema.GroupVersionResource, opts interface{}) WatchActionImpl { + action := WatchActionImpl{} + action.Verb = "watch" + action.Resource = resource + labelSelector, fieldSelector, resourceVersion := ExtractFromListOptions(opts) + action.WatchRestrictions = WatchRestrictions{labelSelector, fieldSelector, resourceVersion} + + return action +} + +func ExtractFromListOptions(opts interface{}) (labelSelector labels.Selector, fieldSelector fields.Selector, resourceVersion string) { + var err error + switch t := opts.(type) { + case metav1.ListOptions: + labelSelector, err = labels.Parse(t.LabelSelector) + if err != nil { + panic(fmt.Errorf("invalid selector %q: %v", t.LabelSelector, err)) + } + fieldSelector, err = fields.ParseSelector(t.FieldSelector) + if err != nil { + panic(fmt.Errorf("invalid selector %q: %v", t.FieldSelector, err)) + } + resourceVersion = t.ResourceVersion + default: + panic(fmt.Errorf("expect a ListOptions %T", opts)) + } + if labelSelector == nil { + labelSelector = labels.Everything() + } + if fieldSelector == nil { + fieldSelector = fields.Everything() + } + return labelSelector, fieldSelector, resourceVersion +} + +func NewWatchAction(resource schema.GroupVersionResource, namespace string, opts interface{}) WatchActionImpl { + action := WatchActionImpl{} + action.Verb = "watch" + action.Resource = resource + action.Namespace = namespace + labelSelector, fieldSelector, resourceVersion := ExtractFromListOptions(opts) + action.WatchRestrictions = WatchRestrictions{labelSelector, fieldSelector, resourceVersion} + + return action +} + +func NewProxyGetAction(resource schema.GroupVersionResource, namespace, scheme, name, port, path string, params map[string]string) ProxyGetActionImpl { + action := ProxyGetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Namespace = namespace + action.Scheme = scheme + action.Name = name + action.Port = port + action.Path = path + action.Params = params + return action +} + +type ListRestrictions struct { + Labels labels.Selector + Fields fields.Selector +} +type WatchRestrictions struct { + Labels labels.Selector + Fields fields.Selector + ResourceVersion string +} + +type Action interface { + GetNamespace() string + GetVerb() string + GetResource() schema.GroupVersionResource + GetSubresource() string + Matches(verb, resource string) bool + + // DeepCopy is used to copy an action to avoid any risk of accidental mutation. Most people never need to call this + // because the invocation logic deep copies before calls to storage and reactors. + DeepCopy() Action +} + +type GenericAction interface { + Action + GetValue() interface{} +} + +type GetAction interface { + Action + GetName() string +} + +type ListAction interface { + Action + GetListRestrictions() ListRestrictions +} + +type CreateAction interface { + Action + GetObject() runtime.Object +} + +type UpdateAction interface { + Action + GetObject() runtime.Object +} + +type DeleteAction interface { + Action + GetName() string + GetDeleteOptions() metav1.DeleteOptions +} + +type DeleteCollectionAction interface { + Action + GetListRestrictions() ListRestrictions +} + +type PatchAction interface { + Action + GetName() string + GetPatchType() types.PatchType + GetPatch() []byte +} + +type WatchAction interface { + Action + GetWatchRestrictions() WatchRestrictions +} + +type ProxyGetAction interface { + Action + GetScheme() string + GetName() string + GetPort() string + GetPath() string + GetParams() map[string]string +} + +type ActionImpl struct { + Namespace string + Verb string + Resource schema.GroupVersionResource + Subresource string +} + +func (a ActionImpl) GetNamespace() string { + return a.Namespace +} +func (a ActionImpl) GetVerb() string { + return a.Verb +} +func (a ActionImpl) GetResource() schema.GroupVersionResource { + return a.Resource +} +func (a ActionImpl) GetSubresource() string { + return a.Subresource +} +func (a ActionImpl) Matches(verb, resource string) bool { + // Stay backwards compatible. + if !strings.Contains(resource, "/") { + return strings.EqualFold(verb, a.Verb) && + strings.EqualFold(resource, a.Resource.Resource) + } + + parts := strings.SplitN(resource, "/", 2) + topresource, subresource := parts[0], parts[1] + + return strings.EqualFold(verb, a.Verb) && + strings.EqualFold(topresource, a.Resource.Resource) && + strings.EqualFold(subresource, a.Subresource) +} +func (a ActionImpl) DeepCopy() Action { + ret := a + return ret +} + +type GenericActionImpl struct { + ActionImpl + Value interface{} +} + +func (a GenericActionImpl) GetValue() interface{} { + return a.Value +} + +func (a GenericActionImpl) DeepCopy() Action { + return GenericActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + // TODO this is wrong, but no worse than before + Value: a.Value, + } +} + +type GetActionImpl struct { + ActionImpl + Name string +} + +func (a GetActionImpl) GetName() string { + return a.Name +} + +func (a GetActionImpl) DeepCopy() Action { + return GetActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + } +} + +type ListActionImpl struct { + ActionImpl + Kind schema.GroupVersionKind + Name string + ListRestrictions ListRestrictions +} + +func (a ListActionImpl) GetKind() schema.GroupVersionKind { + return a.Kind +} + +func (a ListActionImpl) GetListRestrictions() ListRestrictions { + return a.ListRestrictions +} + +func (a ListActionImpl) DeepCopy() Action { + return ListActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Kind: a.Kind, + Name: a.Name, + ListRestrictions: ListRestrictions{ + Labels: a.ListRestrictions.Labels.DeepCopySelector(), + Fields: a.ListRestrictions.Fields.DeepCopySelector(), + }, + } +} + +type CreateActionImpl struct { + ActionImpl + Name string + Object runtime.Object +} + +func (a CreateActionImpl) GetObject() runtime.Object { + return a.Object +} + +func (a CreateActionImpl) DeepCopy() Action { + return CreateActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + Object: a.Object.DeepCopyObject(), + } +} + +type UpdateActionImpl struct { + ActionImpl + Object runtime.Object +} + +func (a UpdateActionImpl) GetObject() runtime.Object { + return a.Object +} + +func (a UpdateActionImpl) DeepCopy() Action { + return UpdateActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Object: a.Object.DeepCopyObject(), + } +} + +type PatchActionImpl struct { + ActionImpl + Name string + PatchType types.PatchType + Patch []byte +} + +func (a PatchActionImpl) GetName() string { + return a.Name +} + +func (a PatchActionImpl) GetPatch() []byte { + return a.Patch +} + +func (a PatchActionImpl) GetPatchType() types.PatchType { + return a.PatchType +} + +func (a PatchActionImpl) DeepCopy() Action { + patch := make([]byte, len(a.Patch)) + copy(patch, a.Patch) + return PatchActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + PatchType: a.PatchType, + Patch: patch, + } +} + +type DeleteActionImpl struct { + ActionImpl + Name string + DeleteOptions metav1.DeleteOptions +} + +func (a DeleteActionImpl) GetName() string { + return a.Name +} + +func (a DeleteActionImpl) GetDeleteOptions() metav1.DeleteOptions { + return a.DeleteOptions +} + +func (a DeleteActionImpl) DeepCopy() Action { + return DeleteActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + DeleteOptions: *a.DeleteOptions.DeepCopy(), + } +} + +type DeleteCollectionActionImpl struct { + ActionImpl + ListRestrictions ListRestrictions +} + +func (a DeleteCollectionActionImpl) GetListRestrictions() ListRestrictions { + return a.ListRestrictions +} + +func (a DeleteCollectionActionImpl) DeepCopy() Action { + return DeleteCollectionActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + ListRestrictions: ListRestrictions{ + Labels: a.ListRestrictions.Labels.DeepCopySelector(), + Fields: a.ListRestrictions.Fields.DeepCopySelector(), + }, + } +} + +type WatchActionImpl struct { + ActionImpl + WatchRestrictions WatchRestrictions +} + +func (a WatchActionImpl) GetWatchRestrictions() WatchRestrictions { + return a.WatchRestrictions +} + +func (a WatchActionImpl) DeepCopy() Action { + return WatchActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + WatchRestrictions: WatchRestrictions{ + Labels: a.WatchRestrictions.Labels.DeepCopySelector(), + Fields: a.WatchRestrictions.Fields.DeepCopySelector(), + ResourceVersion: a.WatchRestrictions.ResourceVersion, + }, + } +} + +type ProxyGetActionImpl struct { + ActionImpl + Scheme string + Name string + Port string + Path string + Params map[string]string +} + +func (a ProxyGetActionImpl) GetScheme() string { + return a.Scheme +} + +func (a ProxyGetActionImpl) GetName() string { + return a.Name +} + +func (a ProxyGetActionImpl) GetPort() string { + return a.Port +} + +func (a ProxyGetActionImpl) GetPath() string { + return a.Path +} + +func (a ProxyGetActionImpl) GetParams() map[string]string { + return a.Params +} + +func (a ProxyGetActionImpl) DeepCopy() Action { + params := map[string]string{} + for k, v := range a.Params { + params[k] = v + } + return ProxyGetActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Scheme: a.Scheme, + Name: a.Name, + Port: a.Port, + Path: a.Path, + Params: params, + } +} diff --git a/vendor/k8s.io/client-go/testing/fake.go b/vendor/k8s.io/client-go/testing/fake.go new file mode 100644 index 000000000..3ab9c1b07 --- /dev/null +++ b/vendor/k8s.io/client-go/testing/fake.go @@ -0,0 +1,220 @@ +/* +Copyright 2016 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 testing + +import ( + "fmt" + "sync" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + restclient "k8s.io/client-go/rest" +) + +// Fake implements client.Interface. Meant to be embedded into a struct to get +// a default implementation. This makes faking out just the method you want to +// test easier. +type Fake struct { + sync.RWMutex + actions []Action // these may be castable to other types, but "Action" is the minimum + + // ReactionChain is the list of reactors that will be attempted for every + // request in the order they are tried. + ReactionChain []Reactor + // WatchReactionChain is the list of watch reactors that will be attempted + // for every request in the order they are tried. + WatchReactionChain []WatchReactor + // ProxyReactionChain is the list of proxy reactors that will be attempted + // for every request in the order they are tried. + ProxyReactionChain []ProxyReactor + + Resources []*metav1.APIResourceList +} + +// Reactor is an interface to allow the composition of reaction functions. +type Reactor interface { + // Handles indicates whether or not this Reactor deals with a given + // action. + Handles(action Action) bool + // React handles the action and returns results. It may choose to + // delegate by indicated handled=false. + React(action Action) (handled bool, ret runtime.Object, err error) +} + +// WatchReactor is an interface to allow the composition of watch functions. +type WatchReactor interface { + // Handles indicates whether or not this Reactor deals with a given + // action. + Handles(action Action) bool + // React handles a watch action and returns results. It may choose to + // delegate by indicating handled=false. + React(action Action) (handled bool, ret watch.Interface, err error) +} + +// ProxyReactor is an interface to allow the composition of proxy get +// functions. +type ProxyReactor interface { + // Handles indicates whether or not this Reactor deals with a given + // action. + Handles(action Action) bool + // React handles a watch action and returns results. It may choose to + // delegate by indicating handled=false. + React(action Action) (handled bool, ret restclient.ResponseWrapper, err error) +} + +// ReactionFunc is a function that returns an object or error for a given +// Action. If "handled" is false, then the test client will ignore the +// results and continue to the next ReactionFunc. A ReactionFunc can describe +// reactions on subresources by testing the result of the action's +// GetSubresource() method. +type ReactionFunc func(action Action) (handled bool, ret runtime.Object, err error) + +// WatchReactionFunc is a function that returns a watch interface. If +// "handled" is false, then the test client will ignore the results and +// continue to the next ReactionFunc. +type WatchReactionFunc func(action Action) (handled bool, ret watch.Interface, err error) + +// ProxyReactionFunc is a function that returns a ResponseWrapper interface +// for a given Action. If "handled" is false, then the test client will +// ignore the results and continue to the next ProxyReactionFunc. +type ProxyReactionFunc func(action Action) (handled bool, ret restclient.ResponseWrapper, err error) + +// AddReactor appends a reactor to the end of the chain. +func (c *Fake) AddReactor(verb, resource string, reaction ReactionFunc) { + c.ReactionChain = append(c.ReactionChain, &SimpleReactor{verb, resource, reaction}) +} + +// PrependReactor adds a reactor to the beginning of the chain. +func (c *Fake) PrependReactor(verb, resource string, reaction ReactionFunc) { + c.ReactionChain = append([]Reactor{&SimpleReactor{verb, resource, reaction}}, c.ReactionChain...) +} + +// AddWatchReactor appends a reactor to the end of the chain. +func (c *Fake) AddWatchReactor(resource string, reaction WatchReactionFunc) { + c.Lock() + defer c.Unlock() + c.WatchReactionChain = append(c.WatchReactionChain, &SimpleWatchReactor{resource, reaction}) +} + +// PrependWatchReactor adds a reactor to the beginning of the chain. +func (c *Fake) PrependWatchReactor(resource string, reaction WatchReactionFunc) { + c.Lock() + defer c.Unlock() + c.WatchReactionChain = append([]WatchReactor{&SimpleWatchReactor{resource, reaction}}, c.WatchReactionChain...) +} + +// AddProxyReactor appends a reactor to the end of the chain. +func (c *Fake) AddProxyReactor(resource string, reaction ProxyReactionFunc) { + c.ProxyReactionChain = append(c.ProxyReactionChain, &SimpleProxyReactor{resource, reaction}) +} + +// PrependProxyReactor adds a reactor to the beginning of the chain. +func (c *Fake) PrependProxyReactor(resource string, reaction ProxyReactionFunc) { + c.ProxyReactionChain = append([]ProxyReactor{&SimpleProxyReactor{resource, reaction}}, c.ProxyReactionChain...) +} + +// Invokes records the provided Action and then invokes the ReactionFunc that +// handles the action if one exists. defaultReturnObj is expected to be of the +// same type a normal call would return. +func (c *Fake) Invokes(action Action, defaultReturnObj runtime.Object) (runtime.Object, error) { + c.Lock() + defer c.Unlock() + + actionCopy := action.DeepCopy() + c.actions = append(c.actions, action.DeepCopy()) + for _, reactor := range c.ReactionChain { + if !reactor.Handles(actionCopy) { + continue + } + + handled, ret, err := reactor.React(actionCopy) + if !handled { + continue + } + + return ret, err + } + + return defaultReturnObj, nil +} + +// InvokesWatch records the provided Action and then invokes the ReactionFunc +// that handles the action if one exists. +func (c *Fake) InvokesWatch(action Action) (watch.Interface, error) { + c.Lock() + defer c.Unlock() + + actionCopy := action.DeepCopy() + c.actions = append(c.actions, action.DeepCopy()) + for _, reactor := range c.WatchReactionChain { + if !reactor.Handles(actionCopy) { + continue + } + + handled, ret, err := reactor.React(actionCopy) + if !handled { + continue + } + + return ret, err + } + + return nil, fmt.Errorf("unhandled watch: %#v", action) +} + +// InvokesProxy records the provided Action and then invokes the ReactionFunc +// that handles the action if one exists. +func (c *Fake) InvokesProxy(action Action) restclient.ResponseWrapper { + c.Lock() + defer c.Unlock() + + actionCopy := action.DeepCopy() + c.actions = append(c.actions, action.DeepCopy()) + for _, reactor := range c.ProxyReactionChain { + if !reactor.Handles(actionCopy) { + continue + } + + handled, ret, err := reactor.React(actionCopy) + if !handled || err != nil { + continue + } + + return ret + } + + return nil +} + +// ClearActions clears the history of actions called on the fake client. +func (c *Fake) ClearActions() { + c.Lock() + defer c.Unlock() + + c.actions = make([]Action, 0) +} + +// Actions returns a chronologically ordered slice fake actions called on the +// fake client. +func (c *Fake) Actions() []Action { + c.RLock() + defer c.RUnlock() + fa := make([]Action, len(c.actions)) + copy(fa, c.actions) + return fa +} diff --git a/vendor/k8s.io/client-go/testing/fixture.go b/vendor/k8s.io/client-go/testing/fixture.go new file mode 100644 index 000000000..85444f9d0 --- /dev/null +++ b/vendor/k8s.io/client-go/testing/fixture.go @@ -0,0 +1,581 @@ +/* +Copyright 2015 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 testing + +import ( + "fmt" + "reflect" + "sort" + "strings" + "sync" + + jsonpatch "github.com/evanphx/json-patch" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/json" + "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/apimachinery/pkg/watch" + restclient "k8s.io/client-go/rest" +) + +// ObjectTracker keeps track of objects. It is intended to be used to +// fake calls to a server by returning objects based on their kind, +// namespace and name. +type ObjectTracker interface { + // Add adds an object to the tracker. If object being added + // is a list, its items are added separately. + Add(obj runtime.Object) error + + // Get retrieves the object by its kind, namespace and name. + Get(gvr schema.GroupVersionResource, ns, name string) (runtime.Object, error) + + // Create adds an object to the tracker in the specified namespace. + Create(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error + + // Update updates an existing object in the tracker in the specified namespace. + Update(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error + + // List retrieves all objects of a given kind in the given + // namespace. Only non-List kinds are accepted. + List(gvr schema.GroupVersionResource, gvk schema.GroupVersionKind, ns string) (runtime.Object, error) + + // Delete deletes an existing object from the tracker. If object + // didn't exist in the tracker prior to deletion, Delete returns + // no error. + Delete(gvr schema.GroupVersionResource, ns, name string) error + + // Watch watches objects from the tracker. Watch returns a channel + // which will push added / modified / deleted object. + Watch(gvr schema.GroupVersionResource, ns string) (watch.Interface, error) +} + +// ObjectScheme abstracts the implementation of common operations on objects. +type ObjectScheme interface { + runtime.ObjectCreater + runtime.ObjectTyper +} + +// ObjectReaction returns a ReactionFunc that applies core.Action to +// the given tracker. +func ObjectReaction(tracker ObjectTracker) ReactionFunc { + return func(action Action) (bool, runtime.Object, error) { + ns := action.GetNamespace() + gvr := action.GetResource() + // Here and below we need to switch on implementation types, + // not on interfaces, as some interfaces are identical + // (e.g. UpdateAction and CreateAction), so if we use them, + // updates and creates end up matching the same case branch. + switch action := action.(type) { + + case ListActionImpl: + obj, err := tracker.List(gvr, action.GetKind(), ns) + return true, obj, err + + case GetActionImpl: + obj, err := tracker.Get(gvr, ns, action.GetName()) + return true, obj, err + + case CreateActionImpl: + objMeta, err := meta.Accessor(action.GetObject()) + if err != nil { + return true, nil, err + } + if action.GetSubresource() == "" { + err = tracker.Create(gvr, action.GetObject(), ns) + } else { + oldObj, getOldObjErr := tracker.Get(gvr, ns, objMeta.GetName()) + if getOldObjErr != nil { + return true, nil, getOldObjErr + } + // Check whether the existing historical object type is the same as the current operation object type that needs to be updated, and if it is the same, perform the update operation. + if reflect.TypeOf(oldObj) == reflect.TypeOf(action.GetObject()) { + // TODO: Currently we're handling subresource creation as an update + // on the enclosing resource. This works for some subresources but + // might not be generic enough. + err = tracker.Update(gvr, action.GetObject(), ns) + } else { + // If the historical object type is different from the current object type, need to make sure we return the object submitted,don't persist the submitted object in the tracker. + return true, action.GetObject(), nil + } + } + if err != nil { + return true, nil, err + } + obj, err := tracker.Get(gvr, ns, objMeta.GetName()) + return true, obj, err + + case UpdateActionImpl: + objMeta, err := meta.Accessor(action.GetObject()) + if err != nil { + return true, nil, err + } + err = tracker.Update(gvr, action.GetObject(), ns) + if err != nil { + return true, nil, err + } + obj, err := tracker.Get(gvr, ns, objMeta.GetName()) + return true, obj, err + + case DeleteActionImpl: + err := tracker.Delete(gvr, ns, action.GetName()) + if err != nil { + return true, nil, err + } + return true, nil, nil + + case PatchActionImpl: + obj, err := tracker.Get(gvr, ns, action.GetName()) + if err != nil { + return true, nil, err + } + + old, err := json.Marshal(obj) + if err != nil { + return true, nil, err + } + + // reset the object in preparation to unmarshal, since unmarshal does not guarantee that fields + // in obj that are removed by patch are cleared + value := reflect.ValueOf(obj) + value.Elem().Set(reflect.New(value.Type().Elem()).Elem()) + + switch action.GetPatchType() { + case types.JSONPatchType: + patch, err := jsonpatch.DecodePatch(action.GetPatch()) + if err != nil { + return true, nil, err + } + modified, err := patch.Apply(old) + if err != nil { + return true, nil, err + } + + if err = json.Unmarshal(modified, obj); err != nil { + return true, nil, err + } + case types.MergePatchType: + modified, err := jsonpatch.MergePatch(old, action.GetPatch()) + if err != nil { + return true, nil, err + } + + if err := json.Unmarshal(modified, obj); err != nil { + return true, nil, err + } + case types.StrategicMergePatchType: + mergedByte, err := strategicpatch.StrategicMergePatch(old, action.GetPatch(), obj) + if err != nil { + return true, nil, err + } + if err = json.Unmarshal(mergedByte, obj); err != nil { + return true, nil, err + } + default: + return true, nil, fmt.Errorf("PatchType is not supported") + } + + if err = tracker.Update(gvr, obj, ns); err != nil { + return true, nil, err + } + + return true, obj, nil + + default: + return false, nil, fmt.Errorf("no reaction implemented for %s", action) + } + } +} + +type tracker struct { + scheme ObjectScheme + decoder runtime.Decoder + lock sync.RWMutex + objects map[schema.GroupVersionResource]map[types.NamespacedName]runtime.Object + // The value type of watchers is a map of which the key is either a namespace or + // all/non namespace aka "" and its value is list of fake watchers. + // Manipulations on resources will broadcast the notification events into the + // watchers' channel. Note that too many unhandled events (currently 100, + // see apimachinery/pkg/watch.DefaultChanSize) will cause a panic. + watchers map[schema.GroupVersionResource]map[string][]*watch.RaceFreeFakeWatcher +} + +var _ ObjectTracker = &tracker{} + +// NewObjectTracker returns an ObjectTracker that can be used to keep track +// of objects for the fake clientset. Mostly useful for unit tests. +func NewObjectTracker(scheme ObjectScheme, decoder runtime.Decoder) ObjectTracker { + return &tracker{ + scheme: scheme, + decoder: decoder, + objects: make(map[schema.GroupVersionResource]map[types.NamespacedName]runtime.Object), + watchers: make(map[schema.GroupVersionResource]map[string][]*watch.RaceFreeFakeWatcher), + } +} + +func (t *tracker) List(gvr schema.GroupVersionResource, gvk schema.GroupVersionKind, ns string) (runtime.Object, error) { + // Heuristic for list kind: original kind + List suffix. Might + // not always be true but this tracker has a pretty limited + // understanding of the actual API model. + listGVK := gvk + listGVK.Kind = listGVK.Kind + "List" + // GVK does have the concept of "internal version". The scheme recognizes + // the runtime.APIVersionInternal, but not the empty string. + if listGVK.Version == "" { + listGVK.Version = runtime.APIVersionInternal + } + + list, err := t.scheme.New(listGVK) + if err != nil { + return nil, err + } + + if !meta.IsListType(list) { + return nil, fmt.Errorf("%q is not a list type", listGVK.Kind) + } + + t.lock.RLock() + defer t.lock.RUnlock() + + objs, ok := t.objects[gvr] + if !ok { + return list, nil + } + + matchingObjs, err := filterByNamespace(objs, ns) + if err != nil { + return nil, err + } + if err := meta.SetList(list, matchingObjs); err != nil { + return nil, err + } + return list.DeepCopyObject(), nil +} + +func (t *tracker) Watch(gvr schema.GroupVersionResource, ns string) (watch.Interface, error) { + t.lock.Lock() + defer t.lock.Unlock() + + fakewatcher := watch.NewRaceFreeFake() + + if _, exists := t.watchers[gvr]; !exists { + t.watchers[gvr] = make(map[string][]*watch.RaceFreeFakeWatcher) + } + t.watchers[gvr][ns] = append(t.watchers[gvr][ns], fakewatcher) + return fakewatcher, nil +} + +func (t *tracker) Get(gvr schema.GroupVersionResource, ns, name string) (runtime.Object, error) { + errNotFound := errors.NewNotFound(gvr.GroupResource(), name) + + t.lock.RLock() + defer t.lock.RUnlock() + + objs, ok := t.objects[gvr] + if !ok { + return nil, errNotFound + } + + matchingObj, ok := objs[types.NamespacedName{Namespace: ns, Name: name}] + if !ok { + return nil, errNotFound + } + + // Only one object should match in the tracker if it works + // correctly, as Add/Update methods enforce kind/namespace/name + // uniqueness. + obj := matchingObj.DeepCopyObject() + if status, ok := obj.(*metav1.Status); ok { + if status.Status != metav1.StatusSuccess { + return nil, &errors.StatusError{ErrStatus: *status} + } + } + + return obj, nil +} + +func (t *tracker) Add(obj runtime.Object) error { + if meta.IsListType(obj) { + return t.addList(obj, false) + } + objMeta, err := meta.Accessor(obj) + if err != nil { + return err + } + gvks, _, err := t.scheme.ObjectKinds(obj) + if err != nil { + return err + } + + if partial, ok := obj.(*metav1.PartialObjectMetadata); ok && len(partial.TypeMeta.APIVersion) > 0 { + gvks = []schema.GroupVersionKind{partial.TypeMeta.GroupVersionKind()} + } + + if len(gvks) == 0 { + return fmt.Errorf("no registered kinds for %v", obj) + } + for _, gvk := range gvks { + // NOTE: UnsafeGuessKindToResource is a heuristic and default match. The + // actual registration in apiserver can specify arbitrary route for a + // gvk. If a test uses such objects, it cannot preset the tracker with + // objects via Add(). Instead, it should trigger the Create() function + // of the tracker, where an arbitrary gvr can be specified. + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + // Resource doesn't have the concept of "__internal" version, just set it to "". + if gvr.Version == runtime.APIVersionInternal { + gvr.Version = "" + } + + err := t.add(gvr, obj, objMeta.GetNamespace(), false) + if err != nil { + return err + } + } + return nil +} + +func (t *tracker) Create(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error { + return t.add(gvr, obj, ns, false) +} + +func (t *tracker) Update(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error { + return t.add(gvr, obj, ns, true) +} + +func (t *tracker) getWatches(gvr schema.GroupVersionResource, ns string) []*watch.RaceFreeFakeWatcher { + watches := []*watch.RaceFreeFakeWatcher{} + if t.watchers[gvr] != nil { + if w := t.watchers[gvr][ns]; w != nil { + watches = append(watches, w...) + } + if ns != metav1.NamespaceAll { + if w := t.watchers[gvr][metav1.NamespaceAll]; w != nil { + watches = append(watches, w...) + } + } + } + return watches +} + +func (t *tracker) add(gvr schema.GroupVersionResource, obj runtime.Object, ns string, replaceExisting bool) error { + t.lock.Lock() + defer t.lock.Unlock() + + gr := gvr.GroupResource() + + // To avoid the object from being accidentally modified by caller + // after it's been added to the tracker, we always store the deep + // copy. + obj = obj.DeepCopyObject() + + newMeta, err := meta.Accessor(obj) + if err != nil { + return err + } + + // Propagate namespace to the new object if hasn't already been set. + if len(newMeta.GetNamespace()) == 0 { + newMeta.SetNamespace(ns) + } + + if ns != newMeta.GetNamespace() { + msg := fmt.Sprintf("request namespace does not match object namespace, request: %q object: %q", ns, newMeta.GetNamespace()) + return errors.NewBadRequest(msg) + } + + _, ok := t.objects[gvr] + if !ok { + t.objects[gvr] = make(map[types.NamespacedName]runtime.Object) + } + + namespacedName := types.NamespacedName{Namespace: newMeta.GetNamespace(), Name: newMeta.GetName()} + if _, ok = t.objects[gvr][namespacedName]; ok { + if replaceExisting { + for _, w := range t.getWatches(gvr, ns) { + // To avoid the object from being accidentally modified by watcher + w.Modify(obj.DeepCopyObject()) + } + t.objects[gvr][namespacedName] = obj + return nil + } + return errors.NewAlreadyExists(gr, newMeta.GetName()) + } + + if replaceExisting { + // Tried to update but no matching object was found. + return errors.NewNotFound(gr, newMeta.GetName()) + } + + t.objects[gvr][namespacedName] = obj + + for _, w := range t.getWatches(gvr, ns) { + // To avoid the object from being accidentally modified by watcher + w.Add(obj.DeepCopyObject()) + } + + return nil +} + +func (t *tracker) addList(obj runtime.Object, replaceExisting bool) error { + list, err := meta.ExtractList(obj) + if err != nil { + return err + } + errs := runtime.DecodeList(list, t.decoder) + if len(errs) > 0 { + return errs[0] + } + for _, obj := range list { + if err := t.Add(obj); err != nil { + return err + } + } + return nil +} + +func (t *tracker) Delete(gvr schema.GroupVersionResource, ns, name string) error { + t.lock.Lock() + defer t.lock.Unlock() + + objs, ok := t.objects[gvr] + if !ok { + return errors.NewNotFound(gvr.GroupResource(), name) + } + + namespacedName := types.NamespacedName{Namespace: ns, Name: name} + obj, ok := objs[namespacedName] + if !ok { + return errors.NewNotFound(gvr.GroupResource(), name) + } + + delete(objs, namespacedName) + for _, w := range t.getWatches(gvr, ns) { + w.Delete(obj.DeepCopyObject()) + } + return nil +} + +// filterByNamespace returns all objects in the collection that +// match provided namespace. Empty namespace matches +// non-namespaced objects. +func filterByNamespace(objs map[types.NamespacedName]runtime.Object, ns string) ([]runtime.Object, error) { + var res []runtime.Object + + for _, obj := range objs { + acc, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + if ns != "" && acc.GetNamespace() != ns { + continue + } + res = append(res, obj) + } + + // Sort res to get deterministic order. + sort.Slice(res, func(i, j int) bool { + acc1, _ := meta.Accessor(res[i]) + acc2, _ := meta.Accessor(res[j]) + if acc1.GetNamespace() != acc2.GetNamespace() { + return acc1.GetNamespace() < acc2.GetNamespace() + } + return acc1.GetName() < acc2.GetName() + }) + return res, nil +} + +func DefaultWatchReactor(watchInterface watch.Interface, err error) WatchReactionFunc { + return func(action Action) (bool, watch.Interface, error) { + return true, watchInterface, err + } +} + +// SimpleReactor is a Reactor. Each reaction function is attached to a given verb,resource tuple. "*" in either field matches everything for that value. +// For instance, *,pods matches all verbs on pods. This allows for easier composition of reaction functions +type SimpleReactor struct { + Verb string + Resource string + + Reaction ReactionFunc +} + +func (r *SimpleReactor) Handles(action Action) bool { + verbCovers := r.Verb == "*" || r.Verb == action.GetVerb() + if !verbCovers { + return false + } + + return resourceCovers(r.Resource, action) +} + +func (r *SimpleReactor) React(action Action) (bool, runtime.Object, error) { + return r.Reaction(action) +} + +// SimpleWatchReactor is a WatchReactor. Each reaction function is attached to a given resource. "*" matches everything for that value. +// For instance, *,pods matches all verbs on pods. This allows for easier composition of reaction functions +type SimpleWatchReactor struct { + Resource string + + Reaction WatchReactionFunc +} + +func (r *SimpleWatchReactor) Handles(action Action) bool { + return resourceCovers(r.Resource, action) +} + +func (r *SimpleWatchReactor) React(action Action) (bool, watch.Interface, error) { + return r.Reaction(action) +} + +// SimpleProxyReactor is a ProxyReactor. Each reaction function is attached to a given resource. "*" matches everything for that value. +// For instance, *,pods matches all verbs on pods. This allows for easier composition of reaction functions. +type SimpleProxyReactor struct { + Resource string + + Reaction ProxyReactionFunc +} + +func (r *SimpleProxyReactor) Handles(action Action) bool { + return resourceCovers(r.Resource, action) +} + +func (r *SimpleProxyReactor) React(action Action) (bool, restclient.ResponseWrapper, error) { + return r.Reaction(action) +} + +func resourceCovers(resource string, action Action) bool { + if resource == "*" { + return true + } + + if resource == action.GetResource().Resource { + return true + } + + if index := strings.Index(resource, "/"); index != -1 && + resource[:index] == action.GetResource().Resource && + resource[index+1:] == action.GetSubresource() { + return true + } + + return false +} diff --git a/vendor/k8s.io/client-go/testing/interface.go b/vendor/k8s.io/client-go/testing/interface.go new file mode 100644 index 000000000..266c6ba3f --- /dev/null +++ b/vendor/k8s.io/client-go/testing/interface.go @@ -0,0 +1,66 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package testing + +import ( + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + restclient "k8s.io/client-go/rest" +) + +type FakeClient interface { + // Tracker gives access to the ObjectTracker internal to the fake client. + Tracker() ObjectTracker + + // AddReactor appends a reactor to the end of the chain. + AddReactor(verb, resource string, reaction ReactionFunc) + + // PrependReactor adds a reactor to the beginning of the chain. + PrependReactor(verb, resource string, reaction ReactionFunc) + + // AddWatchReactor appends a reactor to the end of the chain. + AddWatchReactor(resource string, reaction WatchReactionFunc) + + // PrependWatchReactor adds a reactor to the beginning of the chain. + PrependWatchReactor(resource string, reaction WatchReactionFunc) + + // AddProxyReactor appends a reactor to the end of the chain. + AddProxyReactor(resource string, reaction ProxyReactionFunc) + + // PrependProxyReactor adds a reactor to the beginning of the chain. + PrependProxyReactor(resource string, reaction ProxyReactionFunc) + + // Invokes records the provided Action and then invokes the ReactionFunc that + // handles the action if one exists. defaultReturnObj is expected to be of the + // same type a normal call would return. + Invokes(action Action, defaultReturnObj runtime.Object) (runtime.Object, error) + + // InvokesWatch records the provided Action and then invokes the ReactionFunc + // that handles the action if one exists. + InvokesWatch(action Action) (watch.Interface, error) + + // InvokesProxy records the provided Action and then invokes the ReactionFunc + // that handles the action if one exists. + InvokesProxy(action Action) restclient.ResponseWrapper + + // ClearActions clears the history of actions called on the fake client. + ClearActions() + + // Actions returns a chronologically ordered slice fake actions called on the + // fake client. + Actions() []Action +} diff --git a/vendor/k8s.io/client-go/third_party/forked/golang/template/exec.go b/vendor/k8s.io/client-go/third_party/forked/golang/template/exec.go index 739fd3509..7cf29524c 100644 --- a/vendor/k8s.io/client-go/third_party/forked/golang/template/exec.go +++ b/vendor/k8s.io/client-go/third_party/forked/golang/template/exec.go @@ -8,19 +8,16 @@ import ( "reflect" ) -var Indirect = indirect -var PrintableValue = printableValue - var ( errorType = reflect.TypeOf((*error)(nil)).Elem() fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() ) -// indirect returns the item at the end of indirection, and a bool to indicate if it's nil. +// Indirect returns the item at the end of indirection, and a bool to indicate if it's nil. // We indirect through pointers and empty interfaces (only) because // non-empty interfaces have methods we might need. -func indirect(v reflect.Value) (rv reflect.Value, isNil bool) { - for ; v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface; v = v.Elem() { +func Indirect(v reflect.Value) (rv reflect.Value, isNil bool) { + for ; v.Kind() == reflect.Pointer || v.Kind() == reflect.Interface; v = v.Elem() { if v.IsNil() { return v, true } @@ -31,18 +28,18 @@ func indirect(v reflect.Value) (rv reflect.Value, isNil bool) { return v, false } -// printableValue returns the, possibly indirected, interface value inside v that +// PrintableValue returns the, possibly indirected, interface value inside v that // is best for a call to formatted printer. -func printableValue(v reflect.Value) (interface{}, bool) { - if v.Kind() == reflect.Ptr { - v, _ = indirect(v) // fmt.Fprint handles nil. +func PrintableValue(v reflect.Value) (interface{}, bool) { + if v.Kind() == reflect.Pointer { + v, _ = Indirect(v) // fmt.Fprint handles nil. } if !v.IsValid() { return "", true } if !v.Type().Implements(errorType) && !v.Type().Implements(fmtStringerType) { - if v.CanAddr() && (reflect.PtrTo(v.Type()).Implements(errorType) || reflect.PtrTo(v.Type()).Implements(fmtStringerType)) { + if v.CanAddr() && (reflect.PointerTo(v.Type()).Implements(errorType) || reflect.PointerTo(v.Type()).Implements(fmtStringerType)) { v = v.Addr() } else { switch v.Kind() { @@ -53,42 +50,3 @@ func printableValue(v reflect.Value) (interface{}, bool) { } return v.Interface(), true } - -// canBeNil reports whether an untyped nil can be assigned to the type. See reflect.Zero. -func canBeNil(typ reflect.Type) bool { - switch typ.Kind() { - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return true - } - return false -} - -// isTrue reports whether the value is 'true', in the sense of not the zero of its type, -// and whether the value has a meaningful truth value. -func isTrue(val reflect.Value) (truth, ok bool) { - if !val.IsValid() { - // Something like var x interface{}, never set. It's a form of nil. - return false, true - } - switch val.Kind() { - case reflect.Array, reflect.Map, reflect.Slice, reflect.String: - truth = val.Len() > 0 - case reflect.Bool: - truth = val.Bool() - case reflect.Complex64, reflect.Complex128: - truth = val.Complex() != 0 - case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Interface: - truth = !val.IsNil() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - truth = val.Int() != 0 - case reflect.Float32, reflect.Float64: - truth = val.Float() != 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - truth = val.Uint() != 0 - case reflect.Struct: - truth = true // Struct values are always true. - default: - return - } - return truth, true -} diff --git a/vendor/k8s.io/client-go/third_party/forked/golang/template/funcs.go b/vendor/k8s.io/client-go/third_party/forked/golang/template/funcs.go index 27a008b0a..f0c8e712c 100644 --- a/vendor/k8s.io/client-go/third_party/forked/golang/template/funcs.go +++ b/vendor/k8s.io/client-go/third_party/forked/golang/template/funcs.go @@ -4,264 +4,10 @@ package template import ( - "bytes" "errors" - "fmt" - "io" - "net/url" "reflect" - "strings" - "unicode" - "unicode/utf8" ) -var Equal = eq -var GreaterEqual = ge -var Greater = gt -var LessEqual = le -var Less = lt -var NotEqual = ne - -// FuncMap is the type of the map defining the mapping from names to functions. -// Each function must have either a single return value, or two return values of -// which the second has type error. In that case, if the second (error) -// return value evaluates to non-nil during execution, execution terminates and -// Execute returns that error. -type FuncMap map[string]interface{} - -var builtins = FuncMap{ - "and": and, - "call": call, - "html": HTMLEscaper, - "index": index, - "js": JSEscaper, - "len": length, - "not": not, - "or": or, - "print": fmt.Sprint, - "printf": fmt.Sprintf, - "println": fmt.Sprintln, - "urlquery": URLQueryEscaper, - - // Comparisons - "eq": eq, // == - "ge": ge, // >= - "gt": gt, // > - "le": le, // <= - "lt": lt, // < - "ne": ne, // != -} - -var builtinFuncs = createValueFuncs(builtins) - -// createValueFuncs turns a FuncMap into a map[string]reflect.Value -func createValueFuncs(funcMap FuncMap) map[string]reflect.Value { - m := make(map[string]reflect.Value) - addValueFuncs(m, funcMap) - return m -} - -// addValueFuncs adds to values the functions in funcs, converting them to reflect.Values. -func addValueFuncs(out map[string]reflect.Value, in FuncMap) { - for name, fn := range in { - v := reflect.ValueOf(fn) - if v.Kind() != reflect.Func { - panic("value for " + name + " not a function") - } - if !goodFunc(v.Type()) { - panic(fmt.Errorf("can't install method/function %q with %d results", name, v.Type().NumOut())) - } - out[name] = v - } -} - -// AddFuncs adds to values the functions in funcs. It does no checking of the input - -// call addValueFuncs first. -func addFuncs(out, in FuncMap) { - for name, fn := range in { - out[name] = fn - } -} - -// goodFunc checks that the function or method has the right result signature. -func goodFunc(typ reflect.Type) bool { - // We allow functions with 1 result or 2 results where the second is an error. - switch { - case typ.NumOut() == 1: - return true - case typ.NumOut() == 2 && typ.Out(1) == errorType: - return true - } - return false -} - -// findFunction looks for a function in the template, and global map. -func findFunction(name string) (reflect.Value, bool) { - if fn := builtinFuncs[name]; fn.IsValid() { - return fn, true - } - return reflect.Value{}, false -} - -// Indexing. - -// index returns the result of indexing its first argument by the following -// arguments. Thus "index x 1 2 3" is, in Go syntax, x[1][2][3]. Each -// indexed item must be a map, slice, or array. -func index(item interface{}, indices ...interface{}) (interface{}, error) { - v := reflect.ValueOf(item) - for _, i := range indices { - index := reflect.ValueOf(i) - var isNil bool - if v, isNil = indirect(v); isNil { - return nil, fmt.Errorf("index of nil pointer") - } - switch v.Kind() { - case reflect.Array, reflect.Slice, reflect.String: - var x int64 - switch index.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - x = index.Int() - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - x = int64(index.Uint()) - default: - return nil, fmt.Errorf("cannot index slice/array with type %s", index.Type()) - } - if x < 0 || x >= int64(v.Len()) { - return nil, fmt.Errorf("index out of range: %d", x) - } - v = v.Index(int(x)) - case reflect.Map: - if !index.IsValid() { - index = reflect.Zero(v.Type().Key()) - } - if !index.Type().AssignableTo(v.Type().Key()) { - return nil, fmt.Errorf("%s is not index type for %s", index.Type(), v.Type()) - } - if x := v.MapIndex(index); x.IsValid() { - v = x - } else { - v = reflect.Zero(v.Type().Elem()) - } - default: - return nil, fmt.Errorf("can't index item of type %s", v.Type()) - } - } - return v.Interface(), nil -} - -// Length - -// length returns the length of the item, with an error if it has no defined length. -func length(item interface{}) (int, error) { - v, isNil := indirect(reflect.ValueOf(item)) - if isNil { - return 0, fmt.Errorf("len of nil pointer") - } - switch v.Kind() { - case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: - return v.Len(), nil - } - return 0, fmt.Errorf("len of type %s", v.Type()) -} - -// Function invocation - -// call returns the result of evaluating the first argument as a function. -// The function must return 1 result, or 2 results, the second of which is an error. -func call(fn interface{}, args ...interface{}) (interface{}, error) { - v := reflect.ValueOf(fn) - typ := v.Type() - if typ.Kind() != reflect.Func { - return nil, fmt.Errorf("non-function of type %s", typ) - } - if !goodFunc(typ) { - return nil, fmt.Errorf("function called with %d args; should be 1 or 2", typ.NumOut()) - } - numIn := typ.NumIn() - var dddType reflect.Type - if typ.IsVariadic() { - if len(args) < numIn-1 { - return nil, fmt.Errorf("wrong number of args: got %d want at least %d", len(args), numIn-1) - } - dddType = typ.In(numIn - 1).Elem() - } else { - if len(args) != numIn { - return nil, fmt.Errorf("wrong number of args: got %d want %d", len(args), numIn) - } - } - argv := make([]reflect.Value, len(args)) - for i, arg := range args { - value := reflect.ValueOf(arg) - // Compute the expected type. Clumsy because of variadics. - var argType reflect.Type - if !typ.IsVariadic() || i < numIn-1 { - argType = typ.In(i) - } else { - argType = dddType - } - if !value.IsValid() && canBeNil(argType) { - value = reflect.Zero(argType) - } - if !value.Type().AssignableTo(argType) { - return nil, fmt.Errorf("arg %d has type %s; should be %s", i, value.Type(), argType) - } - argv[i] = value - } - result := v.Call(argv) - if len(result) == 2 && !result[1].IsNil() { - return result[0].Interface(), result[1].Interface().(error) - } - return result[0].Interface(), nil -} - -// Boolean logic. - -func truth(a interface{}) bool { - t, _ := isTrue(reflect.ValueOf(a)) - return t -} - -// and computes the Boolean AND of its arguments, returning -// the first false argument it encounters, or the last argument. -func and(arg0 interface{}, args ...interface{}) interface{} { - if !truth(arg0) { - return arg0 - } - for i := range args { - arg0 = args[i] - if !truth(arg0) { - break - } - } - return arg0 -} - -// or computes the Boolean OR of its arguments, returning -// the first true argument it encounters, or the last argument. -func or(arg0 interface{}, args ...interface{}) interface{} { - if truth(arg0) { - return arg0 - } - for i := range args { - arg0 = args[i] - if truth(arg0) { - break - } - } - return arg0 -} - -// not returns the Boolean negation of its argument. -func not(arg interface{}) (truth bool) { - truth, _ = isTrue(reflect.ValueOf(arg)) - return !truth -} - -// Comparison. - -// TODO: Perhaps allow comparison between signed and unsigned integers. - var ( errBadComparisonType = errors.New("invalid type for comparison") errBadComparison = errors.New("incompatible types for comparison") @@ -299,8 +45,8 @@ func basicKind(v reflect.Value) (kind, error) { return invalidKind, errBadComparisonType } -// eq evaluates the comparison a == b || a == c || ... -func eq(arg1 interface{}, arg2 ...interface{}) (bool, error) { +// Equal evaluates the comparison a == b || a == c || ... +func Equal(arg1 interface{}, arg2 ...interface{}) (bool, error) { v1 := reflect.ValueOf(arg1) k1, err := basicKind(v1) if err != nil { @@ -351,15 +97,15 @@ func eq(arg1 interface{}, arg2 ...interface{}) (bool, error) { return false, nil } -// ne evaluates the comparison a != b. -func ne(arg1, arg2 interface{}) (bool, error) { +// NotEqual evaluates the comparison a != b. +func NotEqual(arg1, arg2 interface{}) (bool, error) { // != is the inverse of ==. - equal, err := eq(arg1, arg2) + equal, err := Equal(arg1, arg2) return !equal, err } -// lt evaluates the comparison a < b. -func lt(arg1, arg2 interface{}) (bool, error) { +// Less evaluates the comparison a < b. +func Less(arg1, arg2 interface{}) (bool, error) { v1 := reflect.ValueOf(arg1) k1, err := basicKind(v1) if err != nil { @@ -400,200 +146,32 @@ func lt(arg1, arg2 interface{}) (bool, error) { return truth, nil } -// le evaluates the comparison <= b. -func le(arg1, arg2 interface{}) (bool, error) { +// LessEqual evaluates the comparison <= b. +func LessEqual(arg1, arg2 interface{}) (bool, error) { // <= is < or ==. - lessThan, err := lt(arg1, arg2) + lessThan, err := Less(arg1, arg2) if lessThan || err != nil { return lessThan, err } - return eq(arg1, arg2) + return Equal(arg1, arg2) } -// gt evaluates the comparison a > b. -func gt(arg1, arg2 interface{}) (bool, error) { +// Greater evaluates the comparison a > b. +func Greater(arg1, arg2 interface{}) (bool, error) { // > is the inverse of <=. - lessOrEqual, err := le(arg1, arg2) + lessOrEqual, err := LessEqual(arg1, arg2) if err != nil { return false, err } return !lessOrEqual, nil } -// ge evaluates the comparison a >= b. -func ge(arg1, arg2 interface{}) (bool, error) { +// GreaterEqual evaluates the comparison a >= b. +func GreaterEqual(arg1, arg2 interface{}) (bool, error) { // >= is the inverse of <. - lessThan, err := lt(arg1, arg2) + lessThan, err := Less(arg1, arg2) if err != nil { return false, err } return !lessThan, nil } - -// HTML escaping. - -var ( - htmlQuot = []byte(""") // shorter than """ - htmlApos = []byte("'") // shorter than "'" and apos was not in HTML until HTML5 - htmlAmp = []byte("&") - htmlLt = []byte("<") - htmlGt = []byte(">") -) - -// HTMLEscape writes to w the escaped HTML equivalent of the plain text data b. -func HTMLEscape(w io.Writer, b []byte) { - last := 0 - for i, c := range b { - var html []byte - switch c { - case '"': - html = htmlQuot - case '\'': - html = htmlApos - case '&': - html = htmlAmp - case '<': - html = htmlLt - case '>': - html = htmlGt - default: - continue - } - w.Write(b[last:i]) - w.Write(html) - last = i + 1 - } - w.Write(b[last:]) -} - -// HTMLEscapeString returns the escaped HTML equivalent of the plain text data s. -func HTMLEscapeString(s string) string { - // Avoid allocation if we can. - if strings.IndexAny(s, `'"&<>`) < 0 { - return s - } - var b bytes.Buffer - HTMLEscape(&b, []byte(s)) - return b.String() -} - -// HTMLEscaper returns the escaped HTML equivalent of the textual -// representation of its arguments. -func HTMLEscaper(args ...interface{}) string { - return HTMLEscapeString(evalArgs(args)) -} - -// JavaScript escaping. - -var ( - jsLowUni = []byte(`\u00`) - hex = []byte("0123456789ABCDEF") - - jsBackslash = []byte(`\\`) - jsApos = []byte(`\'`) - jsQuot = []byte(`\"`) - jsLt = []byte(`\x3C`) - jsGt = []byte(`\x3E`) -) - -// JSEscape writes to w the escaped JavaScript equivalent of the plain text data b. -func JSEscape(w io.Writer, b []byte) { - last := 0 - for i := 0; i < len(b); i++ { - c := b[i] - - if !jsIsSpecial(rune(c)) { - // fast path: nothing to do - continue - } - w.Write(b[last:i]) - - if c < utf8.RuneSelf { - // Quotes, slashes and angle brackets get quoted. - // Control characters get written as \u00XX. - switch c { - case '\\': - w.Write(jsBackslash) - case '\'': - w.Write(jsApos) - case '"': - w.Write(jsQuot) - case '<': - w.Write(jsLt) - case '>': - w.Write(jsGt) - default: - w.Write(jsLowUni) - t, b := c>>4, c&0x0f - w.Write(hex[t : t+1]) - w.Write(hex[b : b+1]) - } - } else { - // Unicode rune. - r, size := utf8.DecodeRune(b[i:]) - if unicode.IsPrint(r) { - w.Write(b[i : i+size]) - } else { - fmt.Fprintf(w, "\\u%04X", r) - } - i += size - 1 - } - last = i + 1 - } - w.Write(b[last:]) -} - -// JSEscapeString returns the escaped JavaScript equivalent of the plain text data s. -func JSEscapeString(s string) string { - // Avoid allocation if we can. - if strings.IndexFunc(s, jsIsSpecial) < 0 { - return s - } - var b bytes.Buffer - JSEscape(&b, []byte(s)) - return b.String() -} - -func jsIsSpecial(r rune) bool { - switch r { - case '\\', '\'', '"', '<', '>': - return true - } - return r < ' ' || utf8.RuneSelf <= r -} - -// JSEscaper returns the escaped JavaScript equivalent of the textual -// representation of its arguments. -func JSEscaper(args ...interface{}) string { - return JSEscapeString(evalArgs(args)) -} - -// URLQueryEscaper returns the escaped value of the textual representation of -// its arguments in a form suitable for embedding in a URL query. -func URLQueryEscaper(args ...interface{}) string { - return url.QueryEscape(evalArgs(args)) -} - -// evalArgs formats the list of arguments into a string. It is therefore equivalent to -// fmt.Sprint(args...) -// except that each argument is indirected (if a pointer), as required, -// using the same rules as the default string evaluation during template -// execution. -func evalArgs(args []interface{}) string { - ok := false - var s string - // Fast path for simple common case. - if len(args) == 1 { - s, ok = args[0].(string) - } - if !ok { - for i, arg := range args { - a, ok := printableValue(reflect.ValueOf(arg)) - if ok { - args[i] = a - } // else left fmt do its thing - } - s = fmt.Sprint(args...) - } - return s -} diff --git a/vendor/k8s.io/client-go/tools/auth/clientauth.go b/vendor/k8s.io/client-go/tools/auth/clientauth.go index 4c24f7997..ac30271fe 100644 --- a/vendor/k8s.io/client-go/tools/auth/clientauth.go +++ b/vendor/k8s.io/client-go/tools/auth/clientauth.go @@ -45,20 +45,20 @@ client.Client from an authcfg.Info. Example: - import ( - "pkg/client" - "pkg/client/auth" - ) - - info, err := auth.LoadFromFile(filename) - if err != nil { - // handle error - } - clientConfig = client.Config{} - clientConfig.Host = "example.com:4901" - clientConfig = info.MergeWithConfig() - client := client.New(clientConfig) - client.Pods(ns).List() + import ( + "pkg/client" + "pkg/client/auth" + ) + + info, err := auth.LoadFromFile(filename) + if err != nil { + // handle error + } + clientConfig = client.Config{} + clientConfig.Host = "example.com:4901" + clientConfig = info.MergeWithConfig() + client := client.New(clientConfig) + client.Pods(ns).List() */ package auth diff --git a/vendor/k8s.io/client-go/tools/cache/controller.go b/vendor/k8s.io/client-go/tools/cache/controller.go index ff4c22de0..0762da3be 100644 --- a/vendor/k8s.io/client-go/tools/cache/controller.go +++ b/vendor/k8s.io/client-go/tools/cache/controller.go @@ -199,17 +199,17 @@ func (c *controller) processLoop() { // can't return an error. The handlers MUST NOT modify the objects // received; this concerns not only the top level of structure but all // the data structures reachable from it. -// * OnAdd is called when an object is added. -// * OnUpdate is called when an object is modified. Note that oldObj is the -// last known state of the object-- it is possible that several changes -// were combined together, so you can't use this to see every single -// change. OnUpdate is also called when a re-list happens, and it will -// get called even if nothing changed. This is useful for periodically -// evaluating or syncing something. -// * OnDelete will get the final state of the item if it is known, otherwise -// it will get an object of type DeletedFinalStateUnknown. This can -// happen if the watch is closed and misses the delete event and we don't -// notice the deletion until the subsequent re-list. +// - OnAdd is called when an object is added. +// - OnUpdate is called when an object is modified. Note that oldObj is the +// last known state of the object-- it is possible that several changes +// were combined together, so you can't use this to see every single +// change. OnUpdate is also called when a re-list happens, and it will +// get called even if nothing changed. This is useful for periodically +// evaluating or syncing something. +// - OnDelete will get the final state of the item if it is known, otherwise +// it will get an object of type DeletedFinalStateUnknown. This can +// happen if the watch is closed and misses the delete event and we don't +// notice the deletion until the subsequent re-list. type ResourceEventHandler interface { OnAdd(obj interface{}) OnUpdate(oldObj, newObj interface{}) @@ -305,15 +305,14 @@ func DeletionHandlingMetaNamespaceKeyFunc(obj interface{}) (string, error) { // notifications to be faulty. // // Parameters: -// * lw is list and watch functions for the source of the resource you want to -// be informed of. -// * objType is an object of the type that you expect to receive. -// * resyncPeriod: if non-zero, will re-list this often (you will get OnUpdate -// calls, even if nothing changed). Otherwise, re-list will be delayed as -// long as possible (until the upstream source closes the watch or times out, -// or you stop the controller). -// * h is the object you want notifications sent to. -// +// - lw is list and watch functions for the source of the resource you want to +// be informed of. +// - objType is an object of the type that you expect to receive. +// - resyncPeriod: if non-zero, will re-list this often (you will get OnUpdate +// calls, even if nothing changed). Otherwise, re-list will be delayed as +// long as possible (until the upstream source closes the watch or times out, +// or you stop the controller). +// - h is the object you want notifications sent to. func NewInformer( lw ListerWatcher, objType runtime.Object, @@ -332,16 +331,15 @@ func NewInformer( // notifications to be faulty. // // Parameters: -// * lw is list and watch functions for the source of the resource you want to -// be informed of. -// * objType is an object of the type that you expect to receive. -// * resyncPeriod: if non-zero, will re-list this often (you will get OnUpdate -// calls, even if nothing changed). Otherwise, re-list will be delayed as -// long as possible (until the upstream source closes the watch or times out, -// or you stop the controller). -// * h is the object you want notifications sent to. -// * indexers is the indexer for the received object type. -// +// - lw is list and watch functions for the source of the resource you want to +// be informed of. +// - objType is an object of the type that you expect to receive. +// - resyncPeriod: if non-zero, will re-list this often (you will get OnUpdate +// calls, even if nothing changed). Otherwise, re-list will be delayed as +// long as possible (until the upstream source closes the watch or times out, +// or you stop the controller). +// - h is the object you want notifications sent to. +// - indexers is the indexer for the received object type. func NewIndexerInformer( lw ListerWatcher, objType runtime.Object, @@ -454,16 +452,15 @@ func processDeltas( // providing event notifications. // // Parameters -// * lw is list and watch functions for the source of the resource you want to -// be informed of. -// * objType is an object of the type that you expect to receive. -// * resyncPeriod: if non-zero, will re-list this often (you will get OnUpdate -// calls, even if nothing changed). Otherwise, re-list will be delayed as -// long as possible (until the upstream source closes the watch or times out, -// or you stop the controller). -// * h is the object you want notifications sent to. -// * clientState is the store you want to populate -// +// - lw is list and watch functions for the source of the resource you want to +// be informed of. +// - objType is an object of the type that you expect to receive. +// - resyncPeriod: if non-zero, will re-list this often (you will get OnUpdate +// calls, even if nothing changed). Otherwise, re-list will be delayed as +// long as possible (until the upstream source closes the watch or times out, +// or you stop the controller). +// - h is the object you want notifications sent to. +// - clientState is the store you want to populate func newInformer( lw ListerWatcher, objType runtime.Object, diff --git a/vendor/k8s.io/client-go/tools/cache/delta_fifo.go b/vendor/k8s.io/client-go/tools/cache/delta_fifo.go index 2da2933ab..0c13a41f0 100644 --- a/vendor/k8s.io/client-go/tools/cache/delta_fifo.go +++ b/vendor/k8s.io/client-go/tools/cache/delta_fifo.go @@ -74,11 +74,11 @@ type DeltaFIFOOptions struct { // the Pop() method. // // DeltaFIFO solves this use case: -// * You want to process every object change (delta) at most once. -// * When you process an object, you want to see everything -// that's happened to it since you last processed it. -// * You want to process the deletion of some of the objects. -// * You might want to periodically reprocess objects. +// - You want to process every object change (delta) at most once. +// - When you process an object, you want to see everything +// that's happened to it since you last processed it. +// - You want to process the deletion of some of the objects. +// - You might want to periodically reprocess objects. // // DeltaFIFO's Pop(), Get(), and GetByKey() methods return // interface{} to satisfy the Store/Queue interfaces, but they @@ -179,21 +179,21 @@ type Deltas []Delta // "known" keys when Pop() is called. Have to think about how that // affects error retrying. // -// NOTE: It is possible to misuse this and cause a race when using an -// external known object source. -// Whether there is a potential race depends on how the consumer -// modifies knownObjects. In Pop(), process function is called under -// lock, so it is safe to update data structures in it that need to be -// in sync with the queue (e.g. knownObjects). +// NOTE: It is possible to misuse this and cause a race when using an +// external known object source. +// Whether there is a potential race depends on how the consumer +// modifies knownObjects. In Pop(), process function is called under +// lock, so it is safe to update data structures in it that need to be +// in sync with the queue (e.g. knownObjects). // -// Example: -// In case of sharedIndexInformer being a consumer -// (https://github.com/kubernetes/kubernetes/blob/0cdd940f/staging/src/k8s.io/client-go/tools/cache/shared_informer.go#L192), -// there is no race as knownObjects (s.indexer) is modified safely -// under DeltaFIFO's lock. The only exceptions are GetStore() and -// GetIndexer() methods, which expose ways to modify the underlying -// storage. Currently these two methods are used for creating Lister -// and internal tests. +// Example: +// In case of sharedIndexInformer being a consumer +// (https://github.com/kubernetes/kubernetes/blob/0cdd940f/staging/src/k8s.io/client-go/tools/cache/shared_informer.go#L192), +// there is no race as knownObjects (s.indexer) is modified safely +// under DeltaFIFO's lock. The only exceptions are GetStore() and +// GetIndexer() methods, which expose ways to modify the underlying +// storage. Currently these two methods are used for creating Lister +// and internal tests. // // Also see the comment on DeltaFIFO. // diff --git a/vendor/k8s.io/client-go/tools/cache/expiration_cache.go b/vendor/k8s.io/client-go/tools/cache/expiration_cache.go index 7abdae737..3f272b80b 100644 --- a/vendor/k8s.io/client-go/tools/cache/expiration_cache.go +++ b/vendor/k8s.io/client-go/tools/cache/expiration_cache.go @@ -25,13 +25,14 @@ import ( ) // ExpirationCache implements the store interface -// 1. All entries are automatically time stamped on insert -// a. The key is computed based off the original item/keyFunc -// b. The value inserted under that key is the timestamped item -// 2. Expiration happens lazily on read based on the expiration policy -// a. No item can be inserted into the store while we're expiring -// *any* item in the cache. -// 3. Time-stamps are stripped off unexpired entries before return +// 1. All entries are automatically time stamped on insert +// a. The key is computed based off the original item/keyFunc +// b. The value inserted under that key is the timestamped item +// 2. Expiration happens lazily on read based on the expiration policy +// a. No item can be inserted into the store while we're expiring +// *any* item in the cache. +// 3. Time-stamps are stripped off unexpired entries before return +// // Note that the ExpirationCache is inherently slower than a normal // threadSafeStore because it takes a write lock every time it checks if // an item has expired. diff --git a/vendor/k8s.io/client-go/tools/cache/fifo.go b/vendor/k8s.io/client-go/tools/cache/fifo.go index 5c9255027..8f3313783 100644 --- a/vendor/k8s.io/client-go/tools/cache/fifo.go +++ b/vendor/k8s.io/client-go/tools/cache/fifo.go @@ -103,10 +103,11 @@ func Pop(queue Queue) interface{} { // recent version will be processed. This can't be done with a channel // // FIFO solves this use case: -// * You want to process every object (exactly) once. -// * You want to process the most recent version of the object when you process it. -// * You do not want to process deleted objects, they should be removed from the queue. -// * You do not want to periodically reprocess objects. +// - You want to process every object (exactly) once. +// - You want to process the most recent version of the object when you process it. +// - You do not want to process deleted objects, they should be removed from the queue. +// - You do not want to periodically reprocess objects. +// // Compare with DeltaFIFO for other use cases. type FIFO struct { lock sync.RWMutex diff --git a/vendor/k8s.io/client-go/tools/cache/index.go b/vendor/k8s.io/client-go/tools/cache/index.go index 1d6aae560..b78d3086b 100644 --- a/vendor/k8s.io/client-go/tools/cache/index.go +++ b/vendor/k8s.io/client-go/tools/cache/index.go @@ -28,10 +28,10 @@ import ( // Delete). // // There are three kinds of strings here: -// 1. a storage key, as defined in the Store interface, -// 2. a name of an index, and -// 3. an "indexed value", which is produced by an IndexFunc and -// can be a field value or any other string computed from the object. +// 1. a storage key, as defined in the Store interface, +// 2. a name of an index, and +// 3. an "indexed value", which is produced by an IndexFunc and +// can be a field value or any other string computed from the object. type Indexer interface { Store // Index returns the stored objects whose set of indexed values @@ -47,7 +47,7 @@ type Indexer interface { // ByIndex returns the stored objects whose set of indexed values // for the named index includes the given indexed value ByIndex(indexName, indexedValue string) ([]interface{}, error) - // GetIndexer return the indexers + // GetIndexers return the indexers GetIndexers() Indexers // AddIndexers adds more indexers to this store. If you call this after you already have data diff --git a/vendor/k8s.io/client-go/tools/cache/reflector.go b/vendor/k8s.io/client-go/tools/cache/reflector.go index 84f242116..9cd476be8 100644 --- a/vendor/k8s.io/client-go/tools/cache/reflector.go +++ b/vendor/k8s.io/client-go/tools/cache/reflector.go @@ -71,6 +71,8 @@ type Reflector struct { backoffManager wait.BackoffManager // initConnBackoffManager manages backoff the initial connection with the Watch call of ListAndWatch. initConnBackoffManager wait.BackoffManager + // MaxInternalErrorRetryDuration defines how long we should retry internal errors returned by watch. + MaxInternalErrorRetryDuration time.Duration resyncPeriod time.Duration // ShouldResync is invoked periodically and whenever it returns `true` the Store's Resync operation is invoked @@ -253,112 +255,9 @@ func (r *Reflector) resyncChan() (<-chan time.Time, func() bool) { // It returns error if ListAndWatch didn't even try to initialize watch. func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { klog.V(3).Infof("Listing and watching %v from %s", r.expectedTypeName, r.name) - var resourceVersion string - - options := metav1.ListOptions{ResourceVersion: r.relistResourceVersion()} - - if err := func() error { - initTrace := trace.New("Reflector ListAndWatch", trace.Field{Key: "name", Value: r.name}) - defer initTrace.LogIfLong(10 * time.Second) - var list runtime.Object - var paginatedResult bool - var err error - listCh := make(chan struct{}, 1) - panicCh := make(chan interface{}, 1) - go func() { - defer func() { - if r := recover(); r != nil { - panicCh <- r - } - }() - // Attempt to gather list in chunks, if supported by listerWatcher, if not, the first - // list request will return the full response. - pager := pager.New(pager.SimplePageFunc(func(opts metav1.ListOptions) (runtime.Object, error) { - return r.listerWatcher.List(opts) - })) - switch { - case r.WatchListPageSize != 0: - pager.PageSize = r.WatchListPageSize - case r.paginatedResult: - // We got a paginated result initially. Assume this resource and server honor - // paging requests (i.e. watch cache is probably disabled) and leave the default - // pager size set. - case options.ResourceVersion != "" && options.ResourceVersion != "0": - // User didn't explicitly request pagination. - // - // With ResourceVersion != "", we have a possibility to list from watch cache, - // but we do that (for ResourceVersion != "0") only if Limit is unset. - // To avoid thundering herd on etcd (e.g. on master upgrades), we explicitly - // switch off pagination to force listing from watch cache (if enabled). - // With the existing semantic of RV (result is at least as fresh as provided RV), - // this is correct and doesn't lead to going back in time. - // - // We also don't turn off pagination for ResourceVersion="0", since watch cache - // is ignoring Limit in that case anyway, and if watch cache is not enabled - // we don't introduce regression. - pager.PageSize = 0 - } - - list, paginatedResult, err = pager.List(context.Background(), options) - if isExpiredError(err) || isTooLargeResourceVersionError(err) { - r.setIsLastSyncResourceVersionUnavailable(true) - // Retry immediately if the resource version used to list is unavailable. - // The pager already falls back to full list if paginated list calls fail due to an "Expired" error on - // continuation pages, but the pager might not be enabled, the full list might fail because the - // resource version it is listing at is expired or the cache may not yet be synced to the provided - // resource version. So we need to fallback to resourceVersion="" in all to recover and ensure - // the reflector makes forward progress. - list, paginatedResult, err = pager.List(context.Background(), metav1.ListOptions{ResourceVersion: r.relistResourceVersion()}) - } - close(listCh) - }() - select { - case <-stopCh: - return nil - case r := <-panicCh: - panic(r) - case <-listCh: - } - initTrace.Step("Objects listed", trace.Field{Key: "error", Value: err}) - if err != nil { - klog.Warningf("%s: failed to list %v: %v", r.name, r.expectedTypeName, err) - return fmt.Errorf("failed to list %v: %v", r.expectedTypeName, err) - } - // We check if the list was paginated and if so set the paginatedResult based on that. - // However, we want to do that only for the initial list (which is the only case - // when we set ResourceVersion="0"). The reasoning behind it is that later, in some - // situations we may force listing directly from etcd (by setting ResourceVersion="") - // which will return paginated result, even if watch cache is enabled. However, in - // that case, we still want to prefer sending requests to watch cache if possible. - // - // Paginated result returned for request with ResourceVersion="0" mean that watch - // cache is disabled and there are a lot of objects of a given type. In such case, - // there is no need to prefer listing from watch cache. - if options.ResourceVersion == "0" && paginatedResult { - r.paginatedResult = true - } - - r.setIsLastSyncResourceVersionUnavailable(false) // list was successful - listMetaInterface, err := meta.ListAccessor(list) - if err != nil { - return fmt.Errorf("unable to understand list result %#v: %v", list, err) - } - resourceVersion = listMetaInterface.GetResourceVersion() - initTrace.Step("Resource version extracted") - items, err := meta.ExtractList(list) - if err != nil { - return fmt.Errorf("unable to understand list result %#v (%v)", list, err) - } - initTrace.Step("Objects extracted") - if err := r.syncWith(items, resourceVersion); err != nil { - return fmt.Errorf("unable to sync list result: %v", err) - } - initTrace.Step("SyncWith done") - r.setLastSyncResourceVersion(resourceVersion) - initTrace.Step("Resource version updated") - return nil - }(); err != nil { + err := r.list(stopCh) + if err != nil { return err } @@ -390,6 +289,7 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { } }() + retry := NewRetryWithDeadline(r.MaxInternalErrorRetryDuration, time.Minute, apierrors.IsInternalError, r.clock) for { // give the stopCh a chance to stop the loop, even in case of continue statements further down on errors select { @@ -399,8 +299,8 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { } timeoutSeconds := int64(minWatchTimeout.Seconds() * (rand.Float64() + 1.0)) - options = metav1.ListOptions{ - ResourceVersion: resourceVersion, + options := metav1.ListOptions{ + ResourceVersion: r.LastSyncResourceVersion(), // We want to avoid situations of hanging watchers. Stop any watchers that do not // receive any events within the timeout window. TimeoutSeconds: &timeoutSeconds, @@ -426,7 +326,9 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { return err } - if err := r.watchHandler(start, w, &resourceVersion, resyncerrc, stopCh); err != nil { + err = watchHandler(start, w, r.store, r.expectedType, r.expectedGVK, r.name, r.expectedTypeName, r.setLastSyncResourceVersion, r.clock, resyncerrc, stopCh) + retry.After(err) + if err != nil { if err != errorStopRequested { switch { case isExpiredError(err): @@ -438,6 +340,9 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { klog.V(2).Infof("%s: watch of %v returned 429 - backing off", r.name, r.expectedTypeName) <-r.initConnBackoffManager.Backoff().C() continue + case apierrors.IsInternalError(err) && retry.ShouldRetry(): + klog.V(2).Infof("%s: retrying watch of %v internal error: %v", r.name, r.expectedTypeName, err) + continue default: klog.Warningf("%s: watch of %v ended with: %v", r.name, r.expectedTypeName, err) } @@ -447,6 +352,114 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { } } +// list simply lists all items and records a resource version obtained from the server at the moment of the call. +// the resource version can be used for further progress notification (aka. watch). +func (r *Reflector) list(stopCh <-chan struct{}) error { + var resourceVersion string + options := metav1.ListOptions{ResourceVersion: r.relistResourceVersion()} + + initTrace := trace.New("Reflector ListAndWatch", trace.Field{Key: "name", Value: r.name}) + defer initTrace.LogIfLong(10 * time.Second) + var list runtime.Object + var paginatedResult bool + var err error + listCh := make(chan struct{}, 1) + panicCh := make(chan interface{}, 1) + go func() { + defer func() { + if r := recover(); r != nil { + panicCh <- r + } + }() + // Attempt to gather list in chunks, if supported by listerWatcher, if not, the first + // list request will return the full response. + pager := pager.New(pager.SimplePageFunc(func(opts metav1.ListOptions) (runtime.Object, error) { + return r.listerWatcher.List(opts) + })) + switch { + case r.WatchListPageSize != 0: + pager.PageSize = r.WatchListPageSize + case r.paginatedResult: + // We got a paginated result initially. Assume this resource and server honor + // paging requests (i.e. watch cache is probably disabled) and leave the default + // pager size set. + case options.ResourceVersion != "" && options.ResourceVersion != "0": + // User didn't explicitly request pagination. + // + // With ResourceVersion != "", we have a possibility to list from watch cache, + // but we do that (for ResourceVersion != "0") only if Limit is unset. + // To avoid thundering herd on etcd (e.g. on master upgrades), we explicitly + // switch off pagination to force listing from watch cache (if enabled). + // With the existing semantic of RV (result is at least as fresh as provided RV), + // this is correct and doesn't lead to going back in time. + // + // We also don't turn off pagination for ResourceVersion="0", since watch cache + // is ignoring Limit in that case anyway, and if watch cache is not enabled + // we don't introduce regression. + pager.PageSize = 0 + } + + list, paginatedResult, err = pager.List(context.Background(), options) + if isExpiredError(err) || isTooLargeResourceVersionError(err) { + r.setIsLastSyncResourceVersionUnavailable(true) + // Retry immediately if the resource version used to list is unavailable. + // The pager already falls back to full list if paginated list calls fail due to an "Expired" error on + // continuation pages, but the pager might not be enabled, the full list might fail because the + // resource version it is listing at is expired or the cache may not yet be synced to the provided + // resource version. So we need to fallback to resourceVersion="" in all to recover and ensure + // the reflector makes forward progress. + list, paginatedResult, err = pager.List(context.Background(), metav1.ListOptions{ResourceVersion: r.relistResourceVersion()}) + } + close(listCh) + }() + select { + case <-stopCh: + return nil + case r := <-panicCh: + panic(r) + case <-listCh: + } + initTrace.Step("Objects listed", trace.Field{Key: "error", Value: err}) + if err != nil { + klog.Warningf("%s: failed to list %v: %v", r.name, r.expectedTypeName, err) + return fmt.Errorf("failed to list %v: %w", r.expectedTypeName, err) + } + + // We check if the list was paginated and if so set the paginatedResult based on that. + // However, we want to do that only for the initial list (which is the only case + // when we set ResourceVersion="0"). The reasoning behind it is that later, in some + // situations we may force listing directly from etcd (by setting ResourceVersion="") + // which will return paginated result, even if watch cache is enabled. However, in + // that case, we still want to prefer sending requests to watch cache if possible. + // + // Paginated result returned for request with ResourceVersion="0" mean that watch + // cache is disabled and there are a lot of objects of a given type. In such case, + // there is no need to prefer listing from watch cache. + if options.ResourceVersion == "0" && paginatedResult { + r.paginatedResult = true + } + + r.setIsLastSyncResourceVersionUnavailable(false) // list was successful + listMetaInterface, err := meta.ListAccessor(list) + if err != nil { + return fmt.Errorf("unable to understand list result %#v: %v", list, err) + } + resourceVersion = listMetaInterface.GetResourceVersion() + initTrace.Step("Resource version extracted") + items, err := meta.ExtractList(list) + if err != nil { + return fmt.Errorf("unable to understand list result %#v (%v)", list, err) + } + initTrace.Step("Objects extracted") + if err := r.syncWith(items, resourceVersion); err != nil { + return fmt.Errorf("unable to sync list result: %v", err) + } + initTrace.Step("SyncWith done") + r.setLastSyncResourceVersion(resourceVersion) + initTrace.Step("Resource version updated") + return nil +} + // syncWith replaces the store's items with the given list. func (r *Reflector) syncWith(items []runtime.Object, resourceVersion string) error { found := make([]interface{}, 0, len(items)) @@ -456,8 +469,19 @@ func (r *Reflector) syncWith(items []runtime.Object, resourceVersion string) err return r.store.Replace(found, resourceVersion) } -// watchHandler watches w and keeps *resourceVersion up to date. -func (r *Reflector) watchHandler(start time.Time, w watch.Interface, resourceVersion *string, errc chan error, stopCh <-chan struct{}) error { +// watchHandler watches w and sets setLastSyncResourceVersion +func watchHandler(start time.Time, + w watch.Interface, + store Store, + expectedType reflect.Type, + expectedGVK *schema.GroupVersionKind, + name string, + expectedTypeName string, + setLastSyncResourceVersion func(string), + clock clock.Clock, + errc chan error, + stopCh <-chan struct{}, +) error { eventCount := 0 // Stopping the watcher should be idempotent and if we return from this function there's no way @@ -478,62 +502,61 @@ loop: if event.Type == watch.Error { return apierrors.FromObject(event.Object) } - if r.expectedType != nil { - if e, a := r.expectedType, reflect.TypeOf(event.Object); e != a { - utilruntime.HandleError(fmt.Errorf("%s: expected type %v, but watch event object had type %v", r.name, e, a)) + if expectedType != nil { + if e, a := expectedType, reflect.TypeOf(event.Object); e != a { + utilruntime.HandleError(fmt.Errorf("%s: expected type %v, but watch event object had type %v", name, e, a)) continue } } - if r.expectedGVK != nil { - if e, a := *r.expectedGVK, event.Object.GetObjectKind().GroupVersionKind(); e != a { - utilruntime.HandleError(fmt.Errorf("%s: expected gvk %v, but watch event object had gvk %v", r.name, e, a)) + if expectedGVK != nil { + if e, a := *expectedGVK, event.Object.GetObjectKind().GroupVersionKind(); e != a { + utilruntime.HandleError(fmt.Errorf("%s: expected gvk %v, but watch event object had gvk %v", name, e, a)) continue } } meta, err := meta.Accessor(event.Object) if err != nil { - utilruntime.HandleError(fmt.Errorf("%s: unable to understand watch event %#v", r.name, event)) + utilruntime.HandleError(fmt.Errorf("%s: unable to understand watch event %#v", name, event)) continue } - newResourceVersion := meta.GetResourceVersion() + resourceVersion := meta.GetResourceVersion() switch event.Type { case watch.Added: - err := r.store.Add(event.Object) + err := store.Add(event.Object) if err != nil { - utilruntime.HandleError(fmt.Errorf("%s: unable to add watch event object (%#v) to store: %v", r.name, event.Object, err)) + utilruntime.HandleError(fmt.Errorf("%s: unable to add watch event object (%#v) to store: %v", name, event.Object, err)) } case watch.Modified: - err := r.store.Update(event.Object) + err := store.Update(event.Object) if err != nil { - utilruntime.HandleError(fmt.Errorf("%s: unable to update watch event object (%#v) to store: %v", r.name, event.Object, err)) + utilruntime.HandleError(fmt.Errorf("%s: unable to update watch event object (%#v) to store: %v", name, event.Object, err)) } case watch.Deleted: // TODO: Will any consumers need access to the "last known // state", which is passed in event.Object? If so, may need // to change this. - err := r.store.Delete(event.Object) + err := store.Delete(event.Object) if err != nil { - utilruntime.HandleError(fmt.Errorf("%s: unable to delete watch event object (%#v) from store: %v", r.name, event.Object, err)) + utilruntime.HandleError(fmt.Errorf("%s: unable to delete watch event object (%#v) from store: %v", name, event.Object, err)) } case watch.Bookmark: // A `Bookmark` means watch has synced here, just update the resourceVersion default: - utilruntime.HandleError(fmt.Errorf("%s: unable to understand watch event %#v", r.name, event)) + utilruntime.HandleError(fmt.Errorf("%s: unable to understand watch event %#v", name, event)) } - *resourceVersion = newResourceVersion - r.setLastSyncResourceVersion(newResourceVersion) - if rvu, ok := r.store.(ResourceVersionUpdater); ok { - rvu.UpdateResourceVersion(newResourceVersion) + setLastSyncResourceVersion(resourceVersion) + if rvu, ok := store.(ResourceVersionUpdater); ok { + rvu.UpdateResourceVersion(resourceVersion) } eventCount++ } } - watchDuration := r.clock.Since(start) + watchDuration := clock.Since(start) if watchDuration < 1*time.Second && eventCount == 0 { - return fmt.Errorf("very short watch: %s: Unexpected watch close - watch lasted less than a second and no items received", r.name) + return fmt.Errorf("very short watch: %s: Unexpected watch close - watch lasted less than a second and no items received", name) } - klog.V(4).Infof("%s: Watch close - %v total %v items received", r.name, r.expectedTypeName, eventCount) + klog.V(4).Infof("%s: Watch close - %v total %v items received", name, expectedTypeName, eventCount) return nil } diff --git a/vendor/k8s.io/client-go/tools/cache/retry_with_deadline.go b/vendor/k8s.io/client-go/tools/cache/retry_with_deadline.go new file mode 100644 index 000000000..8201fb153 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/retry_with_deadline.go @@ -0,0 +1,78 @@ +/* +Copyright 2022 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 cache + +import ( + "k8s.io/utils/clock" + "time" +) + +type RetryWithDeadline interface { + After(error) + ShouldRetry() bool +} + +type retryWithDeadlineImpl struct { + firstErrorTime time.Time + lastErrorTime time.Time + maxRetryDuration time.Duration + minResetPeriod time.Duration + isRetryable func(error) bool + clock clock.Clock +} + +func NewRetryWithDeadline(maxRetryDuration, minResetPeriod time.Duration, isRetryable func(error) bool, clock clock.Clock) RetryWithDeadline { + return &retryWithDeadlineImpl{ + firstErrorTime: time.Time{}, + lastErrorTime: time.Time{}, + maxRetryDuration: maxRetryDuration, + minResetPeriod: minResetPeriod, + isRetryable: isRetryable, + clock: clock, + } +} + +func (r *retryWithDeadlineImpl) reset() { + r.firstErrorTime = time.Time{} + r.lastErrorTime = time.Time{} +} + +func (r *retryWithDeadlineImpl) After(err error) { + if r.isRetryable(err) { + if r.clock.Now().Sub(r.lastErrorTime) >= r.minResetPeriod { + r.reset() + } + + if r.firstErrorTime.IsZero() { + r.firstErrorTime = r.clock.Now() + } + r.lastErrorTime = r.clock.Now() + } +} + +func (r *retryWithDeadlineImpl) ShouldRetry() bool { + if r.maxRetryDuration <= time.Duration(0) { + return false + } + + if r.clock.Now().Sub(r.firstErrorTime) <= r.maxRetryDuration { + return true + } + + r.reset() + return false +} diff --git a/vendor/k8s.io/client-go/tools/cache/store.go b/vendor/k8s.io/client-go/tools/cache/store.go index 24ffabab7..5308ea748 100644 --- a/vendor/k8s.io/client-go/tools/cache/store.go +++ b/vendor/k8s.io/client-go/tools/cache/store.go @@ -199,8 +199,11 @@ func (c *cache) Index(indexName string, obj interface{}) ([]interface{}, error) return c.cacheStorage.Index(indexName, obj) } -func (c *cache) IndexKeys(indexName, indexKey string) ([]string, error) { - return c.cacheStorage.IndexKeys(indexName, indexKey) +// IndexKeys returns the storage keys of the stored objects whose set of +// indexed values for the named index includes the given indexed value. +// The returned keys are suitable to pass to GetByKey(). +func (c *cache) IndexKeys(indexName, indexedValue string) ([]string, error) { + return c.cacheStorage.IndexKeys(indexName, indexedValue) } // ListIndexFuncValues returns the list of generated values of an Index func @@ -208,8 +211,10 @@ func (c *cache) ListIndexFuncValues(indexName string) []string { return c.cacheStorage.ListIndexFuncValues(indexName) } -func (c *cache) ByIndex(indexName, indexKey string) ([]interface{}, error) { - return c.cacheStorage.ByIndex(indexName, indexKey) +// ByIndex returns the stored objects whose set of indexed values +// for the named index includes the given indexed value. +func (c *cache) ByIndex(indexName, indexedValue string) ([]interface{}, error) { + return c.cacheStorage.ByIndex(indexName, indexedValue) } func (c *cache) AddIndexers(newIndexers Indexers) error { diff --git a/vendor/k8s.io/client-go/tools/cache/thread_safe_store.go b/vendor/k8s.io/client-go/tools/cache/thread_safe_store.go index 6d58c0d69..1182ea144 100644 --- a/vendor/k8s.io/client-go/tools/cache/thread_safe_store.go +++ b/vendor/k8s.io/client-go/tools/cache/thread_safe_store.go @@ -47,9 +47,9 @@ type ThreadSafeStore interface { ListKeys() []string Replace(map[string]interface{}, string) Index(indexName string, obj interface{}) ([]interface{}, error) - IndexKeys(indexName, indexKey string) ([]string, error) + IndexKeys(indexName, indexedValue string) ([]string, error) ListIndexFuncValues(name string) []string - ByIndex(indexName, indexKey string) ([]interface{}, error) + ByIndex(indexName, indexedValue string) ([]interface{}, error) GetIndexers() Indexers // AddIndexers adds more indexers to this store. If you call this after you already have data diff --git a/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go b/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go index 0e4127762..5153a95a2 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go @@ -51,10 +51,10 @@ func (a *PromptingAuthLoader) LoadAuth(path string) (*clientauth.Info, error) { // Prompt for user/pass and write a file if none exists. if _, err := os.Stat(path); os.IsNotExist(err) { authPtr, err := a.Prompt() - auth := *authPtr if err != nil { return nil, err } + auth := *authPtr data, err := json.Marshal(auth) if err != nil { return &auth, err diff --git a/vendor/k8s.io/client-go/tools/clientcmd/loader.go b/vendor/k8s.io/client-go/tools/clientcmd/loader.go index 78bd9ed8d..4e301332d 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/loader.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/loader.go @@ -160,8 +160,10 @@ func NewDefaultClientConfigLoadingRules() *ClientConfigLoadingRules { // Load starts by running the MigrationRules and then // takes the loading rules and returns a Config object based on following rules. -// if the ExplicitPath, return the unmerged explicit file -// Otherwise, return a merged config based on the Precedence slice +// +// if the ExplicitPath, return the unmerged explicit file +// Otherwise, return a merged config based on the Precedence slice +// // A missing ExplicitPath file produces an error. Empty filenames or other missing files are ignored. // Read errors or files with non-deserializable content produce errors. // The first file to set a particular map key wins and map key's value is never changed. diff --git a/vendor/k8s.io/client-go/tools/clientcmd/validation.go b/vendor/k8s.io/client-go/tools/clientcmd/validation.go index 2ae1eb706..088972ef6 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/validation.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/validation.go @@ -204,8 +204,19 @@ func ConfirmUsable(config clientcmdapi.Config, passedContextName string) error { if exists { validationErrors = append(validationErrors, validateContext(contextName, *context, config)...) - validationErrors = append(validationErrors, validateAuthInfo(context.AuthInfo, *config.AuthInfos[context.AuthInfo])...) - validationErrors = append(validationErrors, validateClusterInfo(context.Cluster, *config.Clusters[context.Cluster])...) + + // Default to empty users and clusters and let the validation function report an error. + authInfo := config.AuthInfos[context.AuthInfo] + if authInfo == nil { + authInfo = &clientcmdapi.AuthInfo{} + } + validationErrors = append(validationErrors, validateAuthInfo(context.AuthInfo, *authInfo)...) + + cluster := config.Clusters[context.Cluster] + if cluster == nil { + cluster = &clientcmdapi.Cluster{} + } + validationErrors = append(validationErrors, validateClusterInfo(context.Cluster, *cluster)...) } return newErrConfigurationInvalid(validationErrors) diff --git a/vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go b/vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go index 03a13e6b6..c64ba9b26 100644 --- a/vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go +++ b/vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go @@ -161,7 +161,7 @@ type LeaderElectionConfig struct { // lifecycle events of the LeaderElector. These are invoked asynchronously. // // possible future callbacks: -// * OnChallenge() +// - OnChallenge() type LeaderCallbacks struct { // OnStartedLeading is called when a LeaderElector client starts leading OnStartedLeading func(context.Context) diff --git a/vendor/k8s.io/client-go/tools/record/event.go b/vendor/k8s.io/client-go/tools/record/event.go index b901d2e8a..998bf8dfb 100644 --- a/vendor/k8s.io/client-go/tools/record/event.go +++ b/vendor/k8s.io/client-go/tools/record/event.go @@ -92,7 +92,7 @@ type EventRecorder interface { // Event constructs an event from the given information and puts it in the queue for sending. // 'object' is the object this event is about. Event will make a reference-- or you may also // pass a reference to the object directly. - // 'type' of this event, and can be one of Normal, Warning. New types could be added in future + // 'eventtype' of this event, and can be one of Normal, Warning. New types could be added in future // 'reason' is the reason this event is generated. 'reason' should be short and unique; it // should be in UpperCamelCase format (starting with a capital letter). "reason" will be used // to automate handling of events, so imagine people writing switch statements to handle them. @@ -298,7 +298,10 @@ func (e *eventBroadcasterImpl) StartStructuredLogging(verbosity klog.Level) watc // StartEventWatcher starts sending events received from this EventBroadcaster to the given event handler function. // The return value can be ignored or used to stop recording, if desired. func (e *eventBroadcasterImpl) StartEventWatcher(eventHandler func(*v1.Event)) watch.Interface { - watcher := e.Watch() + watcher, err := e.Watch() + if err != nil { + klog.Errorf("Unable start event watcher: '%v' (will not retry!)", err) + } go func() { defer utilruntime.HandleCrash() for watchEvent := range watcher.ResultChan() { @@ -346,7 +349,12 @@ func (recorder *recorderImpl) generateEvent(object runtime.Object, annotations m // when we go to shut down this broadcaster. Just drop events if we get overloaded, // and log an error if that happens (we've configured the broadcaster to drop // outgoing events anyway). - if sent := recorder.ActionOrDrop(watch.Added, event); !sent { + sent, err := recorder.ActionOrDrop(watch.Added, event) + if err != nil { + klog.Errorf("unable to record event: %v (will not retry!)", err) + return + } + if !sent { klog.Errorf("unable to record event: too many queued events, dropped event %#v", event) } } diff --git a/vendor/k8s.io/client-go/tools/record/events_cache.go b/vendor/k8s.io/client-go/tools/record/events_cache.go index 4f041e8fd..abba06362 100644 --- a/vendor/k8s.io/client-go/tools/record/events_cache.go +++ b/vendor/k8s.io/client-go/tools/record/events_cache.go @@ -235,10 +235,10 @@ type aggregateRecord struct { // EventAggregate checks if a similar event has been seen according to the // aggregation configuration (max events, max interval, etc) and returns: // -// - The (potentially modified) event that should be created -// - The cache key for the event, for correlation purposes. This will be set to -// the full key for normal events, and to the result of -// EventAggregatorMessageFunc for aggregate events. +// - The (potentially modified) event that should be created +// - The cache key for the event, for correlation purposes. This will be set to +// the full key for normal events, and to the result of +// EventAggregatorMessageFunc for aggregate events. func (e *EventAggregator) EventAggregate(newEvent *v1.Event) (*v1.Event, string) { now := metav1.NewTime(e.clock.Now()) var record aggregateRecord @@ -427,14 +427,14 @@ type EventCorrelateResult struct { // prior to interacting with the API server to record the event. // // The default behavior is as follows: -// * Aggregation is performed if a similar event is recorded 10 times +// - Aggregation is performed if a similar event is recorded 10 times // in a 10 minute rolling interval. A similar event is an event that varies only by // the Event.Message field. Rather than recording the precise event, aggregation // will create a new event whose message reports that it has combined events with // the same reason. -// * Events are incrementally counted if the exact same event is encountered multiple +// - Events are incrementally counted if the exact same event is encountered multiple // times. -// * A source may burst 25 events about an object, but has a refill rate budget +// - A source may burst 25 events about an object, but has a refill rate budget // per object of 1 event every 5 minutes to control long-tail of spam. func NewEventCorrelator(clock clock.PassiveClock) *EventCorrelator { cacheSize := maxLruCacheEntries diff --git a/vendor/k8s.io/client-go/tools/watch/until.go b/vendor/k8s.io/client-go/tools/watch/until.go index bf74837d3..81d4ff0dd 100644 --- a/vendor/k8s.io/client-go/tools/watch/until.go +++ b/vendor/k8s.io/client-go/tools/watch/until.go @@ -101,7 +101,9 @@ func UntilWithoutRetry(ctx context.Context, watcher watch.Interface, conditions // It guarantees you to see all events and in the order they happened. // Due to this guarantee there is no way it can deal with 'Resource version too old error'. It will fail in this case. // (See `UntilWithSync` if you'd prefer to recover from all the errors including RV too old by re-listing -// those items. In normal code you should care about being level driven so you'd not care about not seeing all the edges.) +// +// those items. In normal code you should care about being level driven so you'd not care about not seeing all the edges.) +// // The most frequent usage for Until would be a test where you want to verify exact order of events ("edges"). func Until(ctx context.Context, initialResourceVersion string, watcherClient cache.Watcher, conditions ...ConditionFunc) (*watch.Event, error) { w, err := NewRetryWatcher(initialResourceVersion, watcherClient) diff --git a/vendor/k8s.io/client-go/transport/cache.go b/vendor/k8s.io/client-go/transport/cache.go index 5fe768ed5..214f0a79c 100644 --- a/vendor/k8s.io/client-go/transport/cache.go +++ b/vendor/k8s.io/client-go/transport/cache.go @@ -36,6 +36,11 @@ type tlsTransportCache struct { transports map[tlsCacheKey]*http.Transport } +// DialerStopCh is stop channel that is passed down to dynamic cert dialer. +// It's exposed as variable for testing purposes to avoid testing for goroutine +// leakages. +var DialerStopCh = wait.NeverStop + const idleConnsPerHost = 25 var tlsCache = &tlsTransportCache{transports: make(map[tlsCacheKey]*http.Transport)} @@ -101,7 +106,7 @@ func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) { dynamicCertDialer := certRotatingDialer(tlsConfig.GetClientCertificate, dial) tlsConfig.GetClientCertificate = dynamicCertDialer.GetClientCertificate dial = dynamicCertDialer.connDialer.DialContext - go dynamicCertDialer.Run(wait.NeverStop) + go dynamicCertDialer.Run(DialerStopCh) } proxy := http.ProxyFromEnvironment diff --git a/vendor/k8s.io/client-go/transport/round_trippers.go b/vendor/k8s.io/client-go/transport/round_trippers.go index 26a89f93b..e2d1dcc9a 100644 --- a/vendor/k8s.io/client-go/transport/round_trippers.go +++ b/vendor/k8s.io/client-go/transport/round_trippers.go @@ -491,7 +491,7 @@ func (rt *debuggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, e DNSDone: func(info httptrace.DNSDoneInfo) { reqInfo.muTrace.Lock() defer reqInfo.muTrace.Unlock() - reqInfo.DNSLookup = time.Now().Sub(dnsStart) + reqInfo.DNSLookup = time.Since(dnsStart) klog.Infof("HTTP Trace: DNS Lookup for %s resolved to %v", host, info.Addrs) }, // Dial @@ -503,7 +503,7 @@ func (rt *debuggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, e ConnectDone: func(network, addr string, err error) { reqInfo.muTrace.Lock() defer reqInfo.muTrace.Unlock() - reqInfo.Dialing = time.Now().Sub(dialStart) + reqInfo.Dialing = time.Since(dialStart) if err != nil { klog.Infof("HTTP Trace: Dial to %s:%s failed: %v", network, addr, err) } else { @@ -517,7 +517,7 @@ func (rt *debuggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, e TLSHandshakeDone: func(_ tls.ConnectionState, _ error) { reqInfo.muTrace.Lock() defer reqInfo.muTrace.Unlock() - reqInfo.TLSHandshake = time.Now().Sub(tlsStart) + reqInfo.TLSHandshake = time.Since(tlsStart) }, // Connection (it can be DNS + Dial or just the time to get one from the connection pool) GetConn: func(hostPort string) { @@ -526,7 +526,7 @@ func (rt *debuggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, e GotConn: func(info httptrace.GotConnInfo) { reqInfo.muTrace.Lock() defer reqInfo.muTrace.Unlock() - reqInfo.GetConnection = time.Now().Sub(getConn) + reqInfo.GetConnection = time.Since(getConn) reqInfo.ConnectionReused = info.Reused }, // Server Processing (time since we wrote the request until first byte is received) @@ -538,7 +538,7 @@ func (rt *debuggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, e GotFirstResponseByte: func() { reqInfo.muTrace.Lock() defer reqInfo.muTrace.Unlock() - reqInfo.ServerProcessing = time.Now().Sub(serverStart) + reqInfo.ServerProcessing = time.Since(serverStart) }, } req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace)) diff --git a/vendor/k8s.io/client-go/util/jsonpath/parser.go b/vendor/k8s.io/client-go/util/jsonpath/parser.go index b84016a9f..40bab188d 100644 --- a/vendor/k8s.io/client-go/util/jsonpath/parser.go +++ b/vendor/k8s.io/client-go/util/jsonpath/parser.go @@ -478,7 +478,7 @@ func isBool(s string) bool { return s == "true" || s == "false" } -//UnquoteExtend is almost same as strconv.Unquote(), but it support parse single quotes as a string +// UnquoteExtend is almost same as strconv.Unquote(), but it support parse single quotes as a string func UnquoteExtend(s string) (string, error) { n := len(s) if n < 2 { diff --git a/vendor/k8s.io/client-go/util/retry/util.go b/vendor/k8s.io/client-go/util/retry/util.go index 772f5bd7a..0c6e504a6 100644 --- a/vendor/k8s.io/client-go/util/retry/util.go +++ b/vendor/k8s.io/client-go/util/retry/util.go @@ -74,30 +74,30 @@ func OnError(backoff wait.Backoff, retriable func(error) bool, fn func() error) // backoff, and then try again. On a non-"Conflict" error, or if it retries too many times // and gives up, RetryOnConflict will return an error to the caller. // -// err := retry.RetryOnConflict(retry.DefaultRetry, func() error { -// // Fetch the resource here; you need to refetch it on every try, since -// // if you got a conflict on the last update attempt then you need to get -// // the current version before making your own changes. -// pod, err := c.Pods("mynamespace").Get(name, metav1.GetOptions{}) -// if err != nil { -// return err -// } +// err := retry.RetryOnConflict(retry.DefaultRetry, func() error { +// // Fetch the resource here; you need to refetch it on every try, since +// // if you got a conflict on the last update attempt then you need to get +// // the current version before making your own changes. +// pod, err := c.Pods("mynamespace").Get(name, metav1.GetOptions{}) +// if err != nil { +// return err +// } // -// // Make whatever updates to the resource are needed -// pod.Status.Phase = v1.PodFailed +// // Make whatever updates to the resource are needed +// pod.Status.Phase = v1.PodFailed // -// // Try to update -// _, err = c.Pods("mynamespace").UpdateStatus(pod) -// // You have to return err itself here (not wrapped inside another error) -// // so that RetryOnConflict can identify it correctly. -// return err -// }) -// if err != nil { -// // May be conflict if max retries were hit, or may be something unrelated -// // like permissions or a network error -// return err -// } -// ... +// // Try to update +// _, err = c.Pods("mynamespace").UpdateStatus(pod) +// // You have to return err itself here (not wrapped inside another error) +// // so that RetryOnConflict can identify it correctly. +// return err +// }) +// if err != nil { +// // May be conflict if max retries were hit, or may be something unrelated +// // like permissions or a network error +// return err +// } +// ... // // TODO: Make Backoff an interface? func RetryOnConflict(backoff wait.Backoff, fn func() error) error { diff --git a/vendor/k8s.io/client-go/util/workqueue/doc.go b/vendor/k8s.io/client-go/util/workqueue/doc.go index a5c976e0f..8555aa95f 100644 --- a/vendor/k8s.io/client-go/util/workqueue/doc.go +++ b/vendor/k8s.io/client-go/util/workqueue/doc.go @@ -16,11 +16,11 @@ limitations under the License. // Package workqueue provides a simple queue that supports the following // features: -// * Fair: items processed in the order in which they are added. -// * Stingy: a single item will not be processed multiple times concurrently, -// and if an item is added multiple times before it can be processed, it -// will only be processed once. -// * Multiple consumers and producers. In particular, it is allowed for an -// item to be reenqueued while it is being processed. -// * Shutdown notifications. +// - Fair: items processed in the order in which they are added. +// - Stingy: a single item will not be processed multiple times concurrently, +// and if an item is added multiple times before it can be processed, it +// will only be processed once. +// - Multiple consumers and producers. In particular, it is allowed for an +// item to be reenqueued while it is being processed. +// - Shutdown notifications. package workqueue // import "k8s.io/client-go/util/workqueue" diff --git a/vendor/k8s.io/client-go/util/workqueue/rate_limiting_queue.go b/vendor/k8s.io/client-go/util/workqueue/rate_limiting_queue.go index 267f4ff40..91cd33f19 100644 --- a/vendor/k8s.io/client-go/util/workqueue/rate_limiting_queue.go +++ b/vendor/k8s.io/client-go/util/workqueue/rate_limiting_queue.go @@ -50,6 +50,13 @@ func NewNamedRateLimitingQueue(rateLimiter RateLimiter, name string) RateLimitin } } +func NewRateLimitingQueueWithDelayingInterface(di DelayingInterface, rateLimiter RateLimiter) RateLimitingInterface { + return &rateLimitingType{ + DelayingInterface: di, + rateLimiter: rateLimiter, + } +} + // rateLimitingType wraps an Interface and provides rateLimited re-enquing type rateLimitingType struct { DelayingInterface diff --git a/vendor/k8s.io/component-base/config/types.go b/vendor/k8s.io/component-base/config/types.go index 4a4c13a5d..aad605eee 100644 --- a/vendor/k8s.io/component-base/config/types.go +++ b/vendor/k8s.io/component-base/config/types.go @@ -17,14 +17,6 @@ limitations under the License. package config import ( - "fmt" - "strconv" - "strings" - "time" - - "github.com/spf13/pflag" - - "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -86,127 +78,3 @@ type DebuggingConfiguration struct { // enableProfiling is true. EnableContentionProfiling bool } - -// LoggingConfiguration contains logging options -// Refer [Logs Options](https://github.com/kubernetes/component-base/blob/master/logs/options.go) for more information. -type LoggingConfiguration struct { - // Format Flag specifies the structure of log messages. - // default value of format is `text` - Format string - // Maximum number of nanoseconds (i.e. 1s = 1000000000) between log - // flushes. Ignored if the selected logging backend writes log - // messages without buffering. - FlushFrequency time.Duration - // Verbosity is the threshold that determines which log messages are - // logged. Default is zero which logs only the most important - // messages. Higher values enable additional messages. Error messages - // are always logged. - Verbosity VerbosityLevel - // VModule overrides the verbosity threshold for individual files. - // Only supported for "text" log format. - VModule VModuleConfiguration - // [Experimental] Options holds additional parameters that are specific - // to the different logging formats. Only the options for the selected - // format get used, but all of them get validated. - Options FormatOptions -} - -// FormatOptions contains options for the different logging formats. -type FormatOptions struct { - // [Experimental] JSON contains options for logging format "json". - JSON JSONOptions -} - -// JSONOptions contains options for logging format "json". -type JSONOptions struct { - // [Experimental] SplitStream redirects error messages to stderr while - // info messages go to stdout, with buffering. The default is to write - // both to stdout, without buffering. - SplitStream bool - // [Experimental] InfoBufferSize sets the size of the info stream when - // using split streams. The default is zero, which disables buffering. - InfoBufferSize resource.QuantityValue -} - -// VModuleConfiguration is a collection of individual file names or patterns -// and the corresponding verbosity threshold. -type VModuleConfiguration []VModuleItem - -var _ pflag.Value = &VModuleConfiguration{} - -// VModuleItem defines verbosity for one or more files which match a certain -// glob pattern. -type VModuleItem struct { - // FilePattern is a base file name (i.e. minus the ".go" suffix and - // directory) or a "glob" pattern for such a name. It must not contain - // comma and equal signs because those are separators for the - // corresponding klog command line argument. - FilePattern string - // Verbosity is the threshold for log messages emitted inside files - // that match the pattern. - Verbosity VerbosityLevel -} - -// String returns the -vmodule parameter (comma-separated list of pattern=N). -func (vmodule *VModuleConfiguration) String() string { - var patterns []string - for _, item := range *vmodule { - patterns = append(patterns, fmt.Sprintf("%s=%d", item.FilePattern, item.Verbosity)) - } - return strings.Join(patterns, ",") -} - -// Set parses the -vmodule parameter (comma-separated list of pattern=N). -func (vmodule *VModuleConfiguration) Set(value string) error { - // This code mirrors https://github.com/kubernetes/klog/blob/9ad246211af1ed84621ee94a26fcce0038b69cd1/klog.go#L287-L313 - - for _, pat := range strings.Split(value, ",") { - if len(pat) == 0 { - // Empty strings such as from a trailing comma can be ignored. - continue - } - patLev := strings.Split(pat, "=") - if len(patLev) != 2 || len(patLev[0]) == 0 || len(patLev[1]) == 0 { - return fmt.Errorf("%q does not have the pattern=N format", pat) - } - pattern := patLev[0] - // 31 instead of 32 to ensure that it also fits into int32. - v, err := strconv.ParseUint(patLev[1], 10, 31) - if err != nil { - return fmt.Errorf("parsing verbosity in %q: %v", pat, err) - } - *vmodule = append(*vmodule, VModuleItem{FilePattern: pattern, Verbosity: VerbosityLevel(v)}) - } - return nil -} - -func (vmodule *VModuleConfiguration) Type() string { - return "pattern=N,..." -} - -// VerbosityLevel represents a klog or logr verbosity threshold. -type VerbosityLevel uint32 - -var _ pflag.Value = new(VerbosityLevel) - -func (l *VerbosityLevel) String() string { - return strconv.FormatInt(int64(*l), 10) -} - -func (l *VerbosityLevel) Get() interface{} { - return *l -} - -func (l *VerbosityLevel) Set(value string) error { - // Limited to int32 for compatibility with klog. - v, err := strconv.ParseUint(value, 10, 31) - if err != nil { - return err - } - *l = VerbosityLevel(v) - return nil -} - -func (l *VerbosityLevel) Type() string { - return "Level" -} diff --git a/vendor/k8s.io/component-base/config/v1alpha1/conversion.go b/vendor/k8s.io/component-base/config/v1alpha1/conversion.go index abf35c6d9..e2951e310 100644 --- a/vendor/k8s.io/component-base/config/v1alpha1/conversion.go +++ b/vendor/k8s.io/component-base/config/v1alpha1/conversion.go @@ -51,11 +51,3 @@ func Convert_v1alpha1_LeaderElectionConfiguration_To_config_LeaderElectionConfig func Convert_config_LeaderElectionConfiguration_To_v1alpha1_LeaderElectionConfiguration(in *config.LeaderElectionConfiguration, out *LeaderElectionConfiguration, s conversion.Scope) error { return autoConvert_config_LeaderElectionConfiguration_To_v1alpha1_LeaderElectionConfiguration(in, out, s) } - -func Convert_v1alpha1_LoggingConfiguration_To_config_LoggingConfiguration(in *LoggingConfiguration, out *config.LoggingConfiguration, s conversion.Scope) error { - return autoConvert_v1alpha1_LoggingConfiguration_To_config_LoggingConfiguration(in, out, s) -} - -func Convert_config_LoggingConfiguration_To_v1alpha1_LoggingConfiguration(in *config.LoggingConfiguration, out *LoggingConfiguration, s conversion.Scope) error { - return autoConvert_config_LoggingConfiguration_To_v1alpha1_LoggingConfiguration(in, out, s) -} diff --git a/vendor/k8s.io/component-base/config/v1alpha1/defaults.go b/vendor/k8s.io/component-base/config/v1alpha1/defaults.go index 57d066eda..cd7f820e9 100644 --- a/vendor/k8s.io/component-base/config/v1alpha1/defaults.go +++ b/vendor/k8s.io/component-base/config/v1alpha1/defaults.go @@ -19,7 +19,6 @@ package v1alpha1 import ( "time" - "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilpointer "k8s.io/utils/pointer" ) @@ -97,32 +96,3 @@ func NewRecommendedDebuggingConfiguration() *DebuggingConfiguration { RecommendedDebuggingConfiguration(ret) return ret } - -// RecommendedLoggingConfiguration defaults logging configuration. -// This will set the recommended default -// values, but they may be subject to change between API versions. This function -// is intentionally not registered in the scheme as a "normal" `SetDefaults_Foo` -// function to allow consumers of this type to set whatever defaults for their -// embedded configs. Forcing consumers to use these defaults would be problematic -// as defaulting in the scheme is done as part of the conversion, and there would -// be no easy way to opt-out. Instead, if you want to use this defaulting method -// run it in your wrapper struct of this type in its `SetDefaults_` method. -func RecommendedLoggingConfiguration(obj *LoggingConfiguration) { - if obj.Format == "" { - obj.Format = "text" - } - var empty resource.QuantityValue - if obj.Options.JSON.InfoBufferSize == empty { - obj.Options.JSON.InfoBufferSize = resource.QuantityValue{ - // This is similar, but not quite the same as a default - // constructed instance. - Quantity: *resource.NewQuantity(0, resource.DecimalSI), - } - // This sets the unexported Quantity.s which will be compared - // by reflect.DeepEqual in some tests. - _ = obj.Options.JSON.InfoBufferSize.String() - } - if obj.FlushFrequency == 0 { - obj.FlushFrequency = 5 * time.Second - } -} diff --git a/vendor/k8s.io/component-base/config/v1alpha1/types.go b/vendor/k8s.io/component-base/config/v1alpha1/types.go index 71a2e9e88..c9d05525d 100644 --- a/vendor/k8s.io/component-base/config/v1alpha1/types.go +++ b/vendor/k8s.io/component-base/config/v1alpha1/types.go @@ -17,9 +17,6 @@ limitations under the License. package v1alpha1 import ( - "time" - - "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -83,61 +80,3 @@ type ClientConnectionConfiguration struct { // burst allows extra queries to accumulate when a client is exceeding its rate. Burst int32 `json:"burst"` } - -// LoggingConfiguration contains logging options -// Refer [Logs Options](https://github.com/kubernetes/component-base/blob/master/logs/options.go) for more information. -type LoggingConfiguration struct { - // Format Flag specifies the structure of log messages. - // default value of format is `text` - Format string `json:"format,omitempty"` - // Maximum number of nanoseconds (i.e. 1s = 1000000000) between log - // flushes. Ignored if the selected logging backend writes log - // messages without buffering. - FlushFrequency time.Duration `json:"flushFrequency"` - // Verbosity is the threshold that determines which log messages are - // logged. Default is zero which logs only the most important - // messages. Higher values enable additional messages. Error messages - // are always logged. - Verbosity uint32 `json:"verbosity"` - // VModule overrides the verbosity threshold for individual files. - // Only supported for "text" log format. - VModule VModuleConfiguration `json:"vmodule,omitempty"` - // [Experimental] Options holds additional parameters that are specific - // to the different logging formats. Only the options for the selected - // format get used, but all of them get validated. - Options FormatOptions `json:"options,omitempty"` -} - -// FormatOptions contains options for the different logging formats. -type FormatOptions struct { - // [Experimental] JSON contains options for logging format "json". - JSON JSONOptions `json:"json,omitempty"` -} - -// JSONOptions contains options for logging format "json". -type JSONOptions struct { - // [Experimental] SplitStream redirects error messages to stderr while - // info messages go to stdout, with buffering. The default is to write - // both to stdout, without buffering. - SplitStream bool `json:"splitStream,omitempty"` - // [Experimental] InfoBufferSize sets the size of the info stream when - // using split streams. The default is zero, which disables buffering. - InfoBufferSize resource.QuantityValue `json:"infoBufferSize,omitempty"` -} - -// VModuleConfiguration is a collection of individual file names or patterns -// and the corresponding verbosity threshold. -type VModuleConfiguration []VModuleItem - -// VModuleItem defines verbosity for one or more files which match a certain -// glob pattern. -type VModuleItem struct { - // FilePattern is a base file name (i.e. minus the ".go" suffix and - // directory) or a "glob" pattern for such a name. It must not contain - // comma and equal signs because those are separators for the - // corresponding klog command line argument. - FilePattern string `json:"filePattern"` - // Verbosity is the threshold for log messages emitted inside files - // that match the pattern. - Verbosity uint32 `json:"verbosity"` -} diff --git a/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.conversion.go b/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.conversion.go index 4162e095d..a911bb50d 100644 --- a/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.conversion.go +++ b/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.conversion.go @@ -22,9 +22,6 @@ limitations under the License. package v1alpha1 import ( - time "time" - unsafe "unsafe" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" @@ -38,36 +35,6 @@ func init() { // RegisterConversions adds conversion functions to the given scheme. // Public to allow building arbitrary schemes. func RegisterConversions(s *runtime.Scheme) error { - if err := s.AddGeneratedConversionFunc((*FormatOptions)(nil), (*config.FormatOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_FormatOptions_To_config_FormatOptions(a.(*FormatOptions), b.(*config.FormatOptions), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*config.FormatOptions)(nil), (*FormatOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_config_FormatOptions_To_v1alpha1_FormatOptions(a.(*config.FormatOptions), b.(*FormatOptions), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*JSONOptions)(nil), (*config.JSONOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_JSONOptions_To_config_JSONOptions(a.(*JSONOptions), b.(*config.JSONOptions), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*config.JSONOptions)(nil), (*JSONOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_config_JSONOptions_To_v1alpha1_JSONOptions(a.(*config.JSONOptions), b.(*JSONOptions), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*VModuleItem)(nil), (*config.VModuleItem)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_VModuleItem_To_config_VModuleItem(a.(*VModuleItem), b.(*config.VModuleItem), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*config.VModuleItem)(nil), (*VModuleItem)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_config_VModuleItem_To_v1alpha1_VModuleItem(a.(*config.VModuleItem), b.(*VModuleItem), scope) - }); err != nil { - return err - } if err := s.AddConversionFunc((*config.ClientConnectionConfiguration)(nil), (*ClientConnectionConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_config_ClientConnectionConfiguration_To_v1alpha1_ClientConnectionConfiguration(a.(*config.ClientConnectionConfiguration), b.(*ClientConnectionConfiguration), scope) }); err != nil { @@ -83,11 +50,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddConversionFunc((*config.LoggingConfiguration)(nil), (*LoggingConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_config_LoggingConfiguration_To_v1alpha1_LoggingConfiguration(a.(*config.LoggingConfiguration), b.(*LoggingConfiguration), scope) - }); err != nil { - return err - } if err := s.AddConversionFunc((*ClientConnectionConfiguration)(nil), (*config.ClientConnectionConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_ClientConnectionConfiguration_To_config_ClientConnectionConfiguration(a.(*ClientConnectionConfiguration), b.(*config.ClientConnectionConfiguration), scope) }); err != nil { @@ -103,11 +65,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddConversionFunc((*LoggingConfiguration)(nil), (*config.LoggingConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_LoggingConfiguration_To_config_LoggingConfiguration(a.(*LoggingConfiguration), b.(*config.LoggingConfiguration), scope) - }); err != nil { - return err - } return nil } @@ -149,52 +106,6 @@ func autoConvert_config_DebuggingConfiguration_To_v1alpha1_DebuggingConfiguratio return nil } -func autoConvert_v1alpha1_FormatOptions_To_config_FormatOptions(in *FormatOptions, out *config.FormatOptions, s conversion.Scope) error { - if err := Convert_v1alpha1_JSONOptions_To_config_JSONOptions(&in.JSON, &out.JSON, s); err != nil { - return err - } - return nil -} - -// Convert_v1alpha1_FormatOptions_To_config_FormatOptions is an autogenerated conversion function. -func Convert_v1alpha1_FormatOptions_To_config_FormatOptions(in *FormatOptions, out *config.FormatOptions, s conversion.Scope) error { - return autoConvert_v1alpha1_FormatOptions_To_config_FormatOptions(in, out, s) -} - -func autoConvert_config_FormatOptions_To_v1alpha1_FormatOptions(in *config.FormatOptions, out *FormatOptions, s conversion.Scope) error { - if err := Convert_config_JSONOptions_To_v1alpha1_JSONOptions(&in.JSON, &out.JSON, s); err != nil { - return err - } - return nil -} - -// Convert_config_FormatOptions_To_v1alpha1_FormatOptions is an autogenerated conversion function. -func Convert_config_FormatOptions_To_v1alpha1_FormatOptions(in *config.FormatOptions, out *FormatOptions, s conversion.Scope) error { - return autoConvert_config_FormatOptions_To_v1alpha1_FormatOptions(in, out, s) -} - -func autoConvert_v1alpha1_JSONOptions_To_config_JSONOptions(in *JSONOptions, out *config.JSONOptions, s conversion.Scope) error { - out.SplitStream = in.SplitStream - out.InfoBufferSize = in.InfoBufferSize - return nil -} - -// Convert_v1alpha1_JSONOptions_To_config_JSONOptions is an autogenerated conversion function. -func Convert_v1alpha1_JSONOptions_To_config_JSONOptions(in *JSONOptions, out *config.JSONOptions, s conversion.Scope) error { - return autoConvert_v1alpha1_JSONOptions_To_config_JSONOptions(in, out, s) -} - -func autoConvert_config_JSONOptions_To_v1alpha1_JSONOptions(in *config.JSONOptions, out *JSONOptions, s conversion.Scope) error { - out.SplitStream = in.SplitStream - out.InfoBufferSize = in.InfoBufferSize - return nil -} - -// Convert_config_JSONOptions_To_v1alpha1_JSONOptions is an autogenerated conversion function. -func Convert_config_JSONOptions_To_v1alpha1_JSONOptions(in *config.JSONOptions, out *JSONOptions, s conversion.Scope) error { - return autoConvert_config_JSONOptions_To_v1alpha1_JSONOptions(in, out, s) -} - func autoConvert_v1alpha1_LeaderElectionConfiguration_To_config_LeaderElectionConfiguration(in *LeaderElectionConfiguration, out *config.LeaderElectionConfiguration, s conversion.Scope) error { if err := v1.Convert_Pointer_bool_To_bool(&in.LeaderElect, &out.LeaderElect, s); err != nil { return err @@ -220,47 +131,3 @@ func autoConvert_config_LeaderElectionConfiguration_To_v1alpha1_LeaderElectionCo out.ResourceNamespace = in.ResourceNamespace return nil } - -func autoConvert_v1alpha1_LoggingConfiguration_To_config_LoggingConfiguration(in *LoggingConfiguration, out *config.LoggingConfiguration, s conversion.Scope) error { - out.Format = in.Format - out.FlushFrequency = time.Duration(in.FlushFrequency) - out.Verbosity = config.VerbosityLevel(in.Verbosity) - out.VModule = *(*config.VModuleConfiguration)(unsafe.Pointer(&in.VModule)) - if err := Convert_v1alpha1_FormatOptions_To_config_FormatOptions(&in.Options, &out.Options, s); err != nil { - return err - } - return nil -} - -func autoConvert_config_LoggingConfiguration_To_v1alpha1_LoggingConfiguration(in *config.LoggingConfiguration, out *LoggingConfiguration, s conversion.Scope) error { - out.Format = in.Format - out.FlushFrequency = time.Duration(in.FlushFrequency) - out.Verbosity = uint32(in.Verbosity) - out.VModule = *(*VModuleConfiguration)(unsafe.Pointer(&in.VModule)) - if err := Convert_config_FormatOptions_To_v1alpha1_FormatOptions(&in.Options, &out.Options, s); err != nil { - return err - } - return nil -} - -func autoConvert_v1alpha1_VModuleItem_To_config_VModuleItem(in *VModuleItem, out *config.VModuleItem, s conversion.Scope) error { - out.FilePattern = in.FilePattern - out.Verbosity = config.VerbosityLevel(in.Verbosity) - return nil -} - -// Convert_v1alpha1_VModuleItem_To_config_VModuleItem is an autogenerated conversion function. -func Convert_v1alpha1_VModuleItem_To_config_VModuleItem(in *VModuleItem, out *config.VModuleItem, s conversion.Scope) error { - return autoConvert_v1alpha1_VModuleItem_To_config_VModuleItem(in, out, s) -} - -func autoConvert_config_VModuleItem_To_v1alpha1_VModuleItem(in *config.VModuleItem, out *VModuleItem, s conversion.Scope) error { - out.FilePattern = in.FilePattern - out.Verbosity = uint32(in.Verbosity) - return nil -} - -// Convert_config_VModuleItem_To_v1alpha1_VModuleItem is an autogenerated conversion function. -func Convert_config_VModuleItem_To_v1alpha1_VModuleItem(in *config.VModuleItem, out *VModuleItem, s conversion.Scope) error { - return autoConvert_config_VModuleItem_To_v1alpha1_VModuleItem(in, out, s) -} diff --git a/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.deepcopy.go index 5503e7a86..92176d994 100644 --- a/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.deepcopy.go @@ -63,40 +63,6 @@ func (in *DebuggingConfiguration) DeepCopy() *DebuggingConfiguration { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *FormatOptions) DeepCopyInto(out *FormatOptions) { - *out = *in - in.JSON.DeepCopyInto(&out.JSON) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FormatOptions. -func (in *FormatOptions) DeepCopy() *FormatOptions { - if in == nil { - return nil - } - out := new(FormatOptions) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *JSONOptions) DeepCopyInto(out *JSONOptions) { - *out = *in - in.InfoBufferSize.DeepCopyInto(&out.InfoBufferSize) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JSONOptions. -func (in *JSONOptions) DeepCopy() *JSONOptions { - if in == nil { - return nil - } - out := new(JSONOptions) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LeaderElectionConfiguration) DeepCopyInto(out *LeaderElectionConfiguration) { *out = *in @@ -120,61 +86,3 @@ func (in *LeaderElectionConfiguration) DeepCopy() *LeaderElectionConfiguration { in.DeepCopyInto(out) return out } - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LoggingConfiguration) DeepCopyInto(out *LoggingConfiguration) { - *out = *in - if in.VModule != nil { - in, out := &in.VModule, &out.VModule - *out = make(VModuleConfiguration, len(*in)) - copy(*out, *in) - } - in.Options.DeepCopyInto(&out.Options) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoggingConfiguration. -func (in *LoggingConfiguration) DeepCopy() *LoggingConfiguration { - if in == nil { - return nil - } - out := new(LoggingConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in VModuleConfiguration) DeepCopyInto(out *VModuleConfiguration) { - { - in := &in - *out = make(VModuleConfiguration, len(*in)) - copy(*out, *in) - return - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VModuleConfiguration. -func (in VModuleConfiguration) DeepCopy() VModuleConfiguration { - if in == nil { - return nil - } - out := new(VModuleConfiguration) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VModuleItem) DeepCopyInto(out *VModuleItem) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VModuleItem. -func (in *VModuleItem) DeepCopy() *VModuleItem { - if in == nil { - return nil - } - out := new(VModuleItem) - in.DeepCopyInto(out) - return out -} diff --git a/vendor/k8s.io/component-base/config/zz_generated.deepcopy.go b/vendor/k8s.io/component-base/config/zz_generated.deepcopy.go index ede25cd32..fb0c1f1e6 100644 --- a/vendor/k8s.io/component-base/config/zz_generated.deepcopy.go +++ b/vendor/k8s.io/component-base/config/zz_generated.deepcopy.go @@ -53,40 +53,6 @@ func (in *DebuggingConfiguration) DeepCopy() *DebuggingConfiguration { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *FormatOptions) DeepCopyInto(out *FormatOptions) { - *out = *in - in.JSON.DeepCopyInto(&out.JSON) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FormatOptions. -func (in *FormatOptions) DeepCopy() *FormatOptions { - if in == nil { - return nil - } - out := new(FormatOptions) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *JSONOptions) DeepCopyInto(out *JSONOptions) { - *out = *in - in.InfoBufferSize.DeepCopyInto(&out.InfoBufferSize) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JSONOptions. -func (in *JSONOptions) DeepCopy() *JSONOptions { - if in == nil { - return nil - } - out := new(JSONOptions) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LeaderElectionConfiguration) DeepCopyInto(out *LeaderElectionConfiguration) { *out = *in @@ -105,61 +71,3 @@ func (in *LeaderElectionConfiguration) DeepCopy() *LeaderElectionConfiguration { in.DeepCopyInto(out) return out } - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LoggingConfiguration) DeepCopyInto(out *LoggingConfiguration) { - *out = *in - if in.VModule != nil { - in, out := &in.VModule, &out.VModule - *out = make(VModuleConfiguration, len(*in)) - copy(*out, *in) - } - in.Options.DeepCopyInto(&out.Options) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoggingConfiguration. -func (in *LoggingConfiguration) DeepCopy() *LoggingConfiguration { - if in == nil { - return nil - } - out := new(LoggingConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in VModuleConfiguration) DeepCopyInto(out *VModuleConfiguration) { - { - in := &in - *out = make(VModuleConfiguration, len(*in)) - copy(*out, *in) - return - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VModuleConfiguration. -func (in VModuleConfiguration) DeepCopy() VModuleConfiguration { - if in == nil { - return nil - } - out := new(VModuleConfiguration) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VModuleItem) DeepCopyInto(out *VModuleItem) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VModuleItem. -func (in *VModuleItem) DeepCopy() *VModuleItem { - if in == nil { - return nil - } - out := new(VModuleItem) - in.DeepCopyInto(out) - return out -} diff --git a/vendor/k8s.io/component-base/metrics/counter.go b/vendor/k8s.io/component-base/metrics/counter.go index 7342dc37d..78c211a0e 100644 --- a/vendor/k8s.io/component-base/metrics/counter.go +++ b/vendor/k8s.io/component-base/metrics/counter.go @@ -18,6 +18,7 @@ package metrics import ( "context" + "github.com/blang/semver/v4" "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" @@ -106,9 +107,14 @@ type CounterVec struct { originalLabels []string } -// NewCounterVec returns an object which satisfies the kubeCollector and CounterVecMetric interfaces. +var _ kubeCollector = &CounterVec{} + +// TODO: make this true: var _ CounterVecMetric = &CounterVec{} + +// NewCounterVec returns an object which satisfies the kubeCollector and (almost) CounterVecMetric interfaces. // However, the object returned will not measure anything unless the collector is first -// registered, since the metric is lazily instantiated. +// registered, since the metric is lazily instantiated, and only members extracted after +// registration will actually measure anything. func NewCounterVec(opts *CounterOpts, labels []string) *CounterVec { opts.StabilityLevel.setDefaults() @@ -149,13 +155,16 @@ func (v *CounterVec) initializeDeprecatedMetric() { v.initializeMetric() } -// Default Prometheus behavior actually results in the creation of a new metric -// if a metric with the unique label values is not found in the underlying stored metricMap. +// Default Prometheus Vec behavior is that member extraction results in creation of a new element +// if one with the unique label values is not found in the underlying stored metricMap. // This means that if this function is called but the underlying metric is not registered // (which means it will never be exposed externally nor consumed), the metric will exist in memory // for perpetuity (i.e. throughout application lifecycle). // // For reference: https://github.com/prometheus/client_golang/blob/v0.9.2/prometheus/counter.go#L179-L197 +// +// In contrast, the Vec behavior in this package is that member extraction before registration +// returns a permanent noop object. // WithLabelValues returns the Counter for the given slice of label // values (same order as the VariableLabels in Desc). If that combination of diff --git a/vendor/k8s.io/component-base/metrics/desc.go b/vendor/k8s.io/component-base/metrics/desc.go index 50eefd587..2ca9cfa7c 100644 --- a/vendor/k8s.io/component-base/metrics/desc.go +++ b/vendor/k8s.io/component-base/metrics/desc.go @@ -218,8 +218,8 @@ func (d *Desc) initializeDeprecatedDesc() { // GetRawDesc will returns a new *Desc with original parameters provided to NewDesc(). // // It will be useful in testing scenario that the same Desc be registered to different registry. -// 1. Desc `D` is registered to registry 'A' in TestA (Note: `D` maybe created) -// 2. Desc `D` is registered to registry 'B' in TestB (Note: since 'D' has been created once, thus will be ignored by registry 'B') +// 1. Desc `D` is registered to registry 'A' in TestA (Note: `D` maybe created) +// 2. Desc `D` is registered to registry 'B' in TestB (Note: since 'D' has been created once, thus will be ignored by registry 'B') func (d *Desc) GetRawDesc() *Desc { return NewDesc(d.fqName, d.help, d.variableLabels, d.constLabels, d.stabilityLevel, d.deprecatedVersion) } diff --git a/vendor/k8s.io/component-base/metrics/gauge.go b/vendor/k8s.io/component-base/metrics/gauge.go index 168221ecd..04041bab6 100644 --- a/vendor/k8s.io/component-base/metrics/gauge.go +++ b/vendor/k8s.io/component-base/metrics/gauge.go @@ -18,6 +18,7 @@ package metrics import ( "context" + "github.com/blang/semver/v4" "github.com/prometheus/client_golang/prometheus" @@ -33,7 +34,11 @@ type Gauge struct { selfCollector } -// NewGauge returns an object which satisfies the kubeCollector and KubeGauge interfaces. +var _ GaugeMetric = &Gauge{} +var _ Registerable = &Gauge{} +var _ kubeCollector = &Gauge{} + +// NewGauge returns an object which satisfies the kubeCollector, Registerable, and Gauge interfaces. // However, the object returned will not measure anything unless the collector is first // registered, since the metric is lazily instantiated. func NewGauge(opts *GaugeOpts) *Gauge { @@ -88,9 +93,14 @@ type GaugeVec struct { originalLabels []string } -// NewGaugeVec returns an object which satisfies the kubeCollector and KubeGaugeVec interfaces. +var _ GaugeVecMetric = &GaugeVec{} +var _ Registerable = &GaugeVec{} +var _ kubeCollector = &GaugeVec{} + +// NewGaugeVec returns an object which satisfies the kubeCollector, Registerable, and GaugeVecMetric interfaces. // However, the object returned will not measure anything unless the collector is first -// registered, since the metric is lazily instantiated. +// registered, since the metric is lazily instantiated, and only members extracted after +// registration will actually measure anything. func NewGaugeVec(opts *GaugeOpts, labels []string) *GaugeVec { opts.StabilityLevel.setDefaults() @@ -130,26 +140,55 @@ func (v *GaugeVec) initializeDeprecatedMetric() { v.initializeMetric() } -// Default Prometheus behavior actually results in the creation of a new metric -// if a metric with the unique label values is not found in the underlying stored metricMap. +func (v *GaugeVec) WithLabelValuesChecked(lvs ...string) (GaugeMetric, error) { + if !v.IsCreated() { + if v.IsHidden() { + return noop, nil + } + return noop, errNotRegistered // return no-op gauge + } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) + } + elt, err := v.GaugeVec.GetMetricWithLabelValues(lvs...) + return elt, err +} + +// Default Prometheus Vec behavior is that member extraction results in creation of a new element +// if one with the unique label values is not found in the underlying stored metricMap. // This means that if this function is called but the underlying metric is not registered // (which means it will never be exposed externally nor consumed), the metric will exist in memory // for perpetuity (i.e. throughout application lifecycle). // // For reference: https://github.com/prometheus/client_golang/blob/v0.9.2/prometheus/gauge.go#L190-L208 +// +// In contrast, the Vec behavior in this package is that member extraction before registration +// returns a permanent noop object. // WithLabelValues returns the GaugeMetric for the given slice of label // values (same order as the VariableLabels in Desc). If that combination of // label values is accessed for the first time, a new GaugeMetric is created IFF the gaugeVec // has been registered to a metrics registry. func (v *GaugeVec) WithLabelValues(lvs ...string) GaugeMetric { + ans, err := v.WithLabelValuesChecked(lvs...) + if err == nil || ErrIsNotRegistered(err) { + return ans + } + panic(err) +} + +func (v *GaugeVec) WithChecked(labels map[string]string) (GaugeMetric, error) { if !v.IsCreated() { - return noop // return no-op gauge + if v.IsHidden() { + return noop, nil + } + return noop, errNotRegistered // return no-op gauge } if v.LabelValueAllowLists != nil { - v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) + v.LabelValueAllowLists.ConstrainLabelMap(labels) } - return v.GaugeVec.WithLabelValues(lvs...) + elt, err := v.GaugeVec.GetMetricWith(labels) + return elt, err } // With returns the GaugeMetric for the given Labels map (the label names @@ -157,13 +196,11 @@ func (v *GaugeVec) WithLabelValues(lvs ...string) GaugeMetric { // accessed for the first time, a new GaugeMetric is created IFF the gaugeVec has // been registered to a metrics registry. func (v *GaugeVec) With(labels map[string]string) GaugeMetric { - if !v.IsCreated() { - return noop // return no-op gauge + ans, err := v.WithChecked(labels) + if err == nil || ErrIsNotRegistered(err) { + return ans } - if v.LabelValueAllowLists != nil { - v.LabelValueAllowLists.ConstrainLabelMap(labels) - } - return v.GaugeVec.With(labels) + panic(err) } // Delete deletes the metric where the variable labels are the same as those @@ -219,6 +256,10 @@ func (v *GaugeVec) WithContext(ctx context.Context) *GaugeVecWithContext { } } +func (v *GaugeVec) InterfaceWithContext(ctx context.Context) GaugeVecMetric { + return v.WithContext(ctx) +} + // GaugeVecWithContext is the wrapper of GaugeVec with context. type GaugeVecWithContext struct { *GaugeVec diff --git a/vendor/k8s.io/component-base/metrics/histogram.go b/vendor/k8s.io/component-base/metrics/histogram.go index e93c7a4b3..838f09e17 100644 --- a/vendor/k8s.io/component-base/metrics/histogram.go +++ b/vendor/k8s.io/component-base/metrics/histogram.go @@ -18,6 +18,7 @@ package metrics import ( "context" + "github.com/blang/semver/v4" "github.com/prometheus/client_golang/prometheus" ) @@ -100,7 +101,10 @@ type HistogramVec struct { // NewHistogramVec returns an object which satisfies kubeCollector and wraps the // prometheus.HistogramVec object. However, the object returned will not measure -// anything unless the collector is first registered, since the metric is lazily instantiated. +// anything unless the collector is first registered, since the metric is lazily instantiated, +// and only members extracted after +// registration will actually measure anything. + func NewHistogramVec(opts *HistogramOpts, labels []string) *HistogramVec { opts.StabilityLevel.setDefaults() @@ -136,13 +140,16 @@ func (v *HistogramVec) initializeDeprecatedMetric() { v.initializeMetric() } -// Default Prometheus behavior actually results in the creation of a new metric -// if a metric with the unique label values is not found in the underlying stored metricMap. +// Default Prometheus Vec behavior is that member extraction results in creation of a new element +// if one with the unique label values is not found in the underlying stored metricMap. // This means that if this function is called but the underlying metric is not registered // (which means it will never be exposed externally nor consumed), the metric will exist in memory // for perpetuity (i.e. throughout application lifecycle). // // For reference: https://github.com/prometheus/client_golang/blob/v0.9.2/prometheus/histogram.go#L460-L470 +// +// In contrast, the Vec behavior in this package is that member extraction before registration +// returns a permanent noop object. // WithLabelValues returns the ObserverMetric for the given slice of label // values (same order as the VariableLabels in Desc). If that combination of diff --git a/vendor/k8s.io/component-base/metrics/metric.go b/vendor/k8s.io/component-base/metrics/metric.go index c72aecfc6..2980a9723 100644 --- a/vendor/k8s.io/component-base/metrics/metric.go +++ b/vendor/k8s.io/component-base/metrics/metric.go @@ -22,6 +22,7 @@ import ( "github.com/blang/semver/v4" "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" + promext "k8s.io/component-base/metrics/prometheusextension" "k8s.io/klog/v2" ) @@ -90,13 +91,14 @@ func (r *lazyMetric) lazyInit(self kubeCollector, fqName string) { // preprocessMetric figures out whether the lazy metric should be hidden or not. // This method takes a Version argument which should be the version of the binary in which // this code is currently being executed. A metric can be hidden under two conditions: -// 1. if the metric is deprecated and is outside the grace period (i.e. has been -// deprecated for more than one release -// 2. if the metric is manually disabled via a CLI flag. +// 1. if the metric is deprecated and is outside the grace period (i.e. has been +// deprecated for more than one release +// 2. if the metric is manually disabled via a CLI flag. // // Disclaimer: disabling a metric via a CLI flag has higher precedence than -// deprecation and will override show-hidden-metrics for the explicitly -// disabled metric. +// +// deprecation and will override show-hidden-metrics for the explicitly +// disabled metric. func (r *lazyMetric) preprocessMetric(version semver.Version) { disabledMetricsLock.RLock() defer disabledMetricsLock.RUnlock() @@ -203,6 +205,7 @@ func (c *selfCollector) Collect(ch chan<- prometheus.Metric) { // no-op vecs for convenience var noopCounterVec = &prometheus.CounterVec{} var noopHistogramVec = &prometheus.HistogramVec{} +var noopTimingHistogramVec = &promext.TimingHistogramVec{} var noopGaugeVec = &prometheus.GaugeVec{} var noopObserverVec = &noopObserverVector{} @@ -211,17 +214,18 @@ var noop = &noopMetric{} type noopMetric struct{} -func (noopMetric) Inc() {} -func (noopMetric) Add(float64) {} -func (noopMetric) Dec() {} -func (noopMetric) Set(float64) {} -func (noopMetric) Sub(float64) {} -func (noopMetric) Observe(float64) {} -func (noopMetric) SetToCurrentTime() {} -func (noopMetric) Desc() *prometheus.Desc { return nil } -func (noopMetric) Write(*dto.Metric) error { return nil } -func (noopMetric) Describe(chan<- *prometheus.Desc) {} -func (noopMetric) Collect(chan<- prometheus.Metric) {} +func (noopMetric) Inc() {} +func (noopMetric) Add(float64) {} +func (noopMetric) Dec() {} +func (noopMetric) Set(float64) {} +func (noopMetric) Sub(float64) {} +func (noopMetric) Observe(float64) {} +func (noopMetric) ObserveWithWeight(float64, uint64) {} +func (noopMetric) SetToCurrentTime() {} +func (noopMetric) Desc() *prometheus.Desc { return nil } +func (noopMetric) Write(*dto.Metric) error { return nil } +func (noopMetric) Describe(chan<- *prometheus.Desc) {} +func (noopMetric) Collect(chan<- prometheus.Metric) {} type noopObserverVector struct{} diff --git a/vendor/k8s.io/component-base/metrics/opts.go b/vendor/k8s.io/component-base/metrics/opts.go index 04203b74e..9d359d6ac 100644 --- a/vendor/k8s.io/component-base/metrics/opts.go +++ b/vendor/k8s.io/component-base/metrics/opts.go @@ -24,6 +24,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "k8s.io/apimachinery/pkg/util/sets" + promext "k8s.io/component-base/metrics/prometheusextension" ) var ( @@ -189,6 +190,54 @@ func (o *HistogramOpts) toPromHistogramOpts() prometheus.HistogramOpts { } } +// TimingHistogramOpts bundles the options for creating a TimingHistogram metric. It is +// mandatory to set Name to a non-empty string. All other fields are optional +// and can safely be left at their zero value, although it is strongly +// encouraged to set a Help string. +type TimingHistogramOpts struct { + Namespace string + Subsystem string + Name string + Help string + ConstLabels map[string]string + Buckets []float64 + InitialValue float64 + DeprecatedVersion string + deprecateOnce sync.Once + annotateOnce sync.Once + StabilityLevel StabilityLevel + LabelValueAllowLists *MetricLabelAllowList +} + +// Modify help description on the metric description. +func (o *TimingHistogramOpts) markDeprecated() { + o.deprecateOnce.Do(func() { + o.Help = fmt.Sprintf("(Deprecated since %v) %v", o.DeprecatedVersion, o.Help) + }) +} + +// annotateStabilityLevel annotates help description on the metric description with the stability level +// of the metric +func (o *TimingHistogramOpts) annotateStabilityLevel() { + o.annotateOnce.Do(func() { + o.Help = fmt.Sprintf("[%v] %v", o.StabilityLevel, o.Help) + }) +} + +// convenience function to allow easy transformation to the prometheus +// counterpart. This will do more once we have a proper label abstraction +func (o *TimingHistogramOpts) toPromHistogramOpts() promext.TimingHistogramOpts { + return promext.TimingHistogramOpts{ + Namespace: o.Namespace, + Subsystem: o.Subsystem, + Name: o.Name, + Help: o.Help, + ConstLabels: o.ConstLabels, + Buckets: o.Buckets, + InitialValue: o.InitialValue, + } +} + // SummaryOpts bundles the options for creating a Summary metric. It is // mandatory to set Name to a non-empty string. While all other fields are // optional and can safely be left at their zero value, it is recommended to set diff --git a/vendor/k8s.io/component-base/metrics/prometheusextension/timing_histogram.go b/vendor/k8s.io/component-base/metrics/prometheusextension/timing_histogram.go new file mode 100644 index 000000000..be07977e2 --- /dev/null +++ b/vendor/k8s.io/component-base/metrics/prometheusextension/timing_histogram.go @@ -0,0 +1,189 @@ +/* +Copyright 2022 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 prometheusextension + +import ( + "errors" + "time" + + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" +) + +// GaugeOps is the part of `prometheus.Gauge` that is relevant to +// instrumented code. +// This factoring should be in prometheus, analogous to the way +// it already factors out the Observer interface for histograms and summaries. +type GaugeOps interface { + // Set is the same as Gauge.Set + Set(float64) + // Inc is the same as Gauge.inc + Inc() + // Dec is the same as Gauge.Dec + Dec() + // Add is the same as Gauge.Add + Add(float64) + // Sub is the same as Gauge.Sub + Sub(float64) + + // SetToCurrentTime the same as Gauge.SetToCurrentTime + SetToCurrentTime() +} + +// A TimingHistogram tracks how long a `float64` variable spends in +// ranges defined by buckets. Time is counted in nanoseconds. The +// histogram's sum is the integral over time (in nanoseconds, from +// creation of the histogram) of the variable's value. +type TimingHistogram interface { + prometheus.Metric + prometheus.Collector + GaugeOps +} + +// TimingHistogramOpts is the parameters of the TimingHistogram constructor +type TimingHistogramOpts struct { + Namespace string + Subsystem string + Name string + Help string + ConstLabels prometheus.Labels + + // Buckets defines the buckets into which observations are + // accumulated. Each element in the slice is the upper + // inclusive bound of a bucket. The values must be sorted in + // strictly increasing order. There is no need to add a + // highest bucket with +Inf bound. The default value is + // prometheus.DefBuckets. + Buckets []float64 + + // The initial value of the variable. + InitialValue float64 +} + +// NewTimingHistogram creates a new TimingHistogram +func NewTimingHistogram(opts TimingHistogramOpts) (TimingHistogram, error) { + return NewTestableTimingHistogram(time.Now, opts) +} + +// NewTestableTimingHistogram creates a TimingHistogram that uses a mockable clock +func NewTestableTimingHistogram(nowFunc func() time.Time, opts TimingHistogramOpts) (TimingHistogram, error) { + desc := prometheus.NewDesc( + prometheus.BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + wrapTimingHelp(opts.Help), + nil, + opts.ConstLabels, + ) + return newTimingHistogram(nowFunc, desc, opts) +} + +func wrapTimingHelp(given string) string { + return "EXPERIMENTAL: " + given +} + +func newTimingHistogram(nowFunc func() time.Time, desc *prometheus.Desc, opts TimingHistogramOpts, variableLabelValues ...string) (TimingHistogram, error) { + allLabelsM := prometheus.Labels{} + allLabelsS := prometheus.MakeLabelPairs(desc, variableLabelValues) + for _, pair := range allLabelsS { + if pair == nil || pair.Name == nil || pair.Value == nil { + return nil, errors.New("prometheus.MakeLabelPairs returned a nil") + } + allLabelsM[*pair.Name] = *pair.Value + } + weighted, err := newWeightedHistogram(desc, WeightedHistogramOpts{ + Namespace: opts.Namespace, + Subsystem: opts.Subsystem, + Name: opts.Name, + Help: opts.Help, + ConstLabels: allLabelsM, + Buckets: opts.Buckets, + }, variableLabelValues...) + if err != nil { + return nil, err + } + return &timingHistogram{ + nowFunc: nowFunc, + weighted: weighted, + lastSetTime: nowFunc(), + value: opts.InitialValue, + }, nil +} + +type timingHistogram struct { + nowFunc func() time.Time + weighted *weightedHistogram + + // The following fields must only be accessed with weighted's lock held + + lastSetTime time.Time // identifies when value was last set + value float64 +} + +var _ TimingHistogram = &timingHistogram{} + +func (th *timingHistogram) Set(newValue float64) { + th.update(func(float64) float64 { return newValue }) +} + +func (th *timingHistogram) Inc() { + th.update(func(oldValue float64) float64 { return oldValue + 1 }) +} + +func (th *timingHistogram) Dec() { + th.update(func(oldValue float64) float64 { return oldValue - 1 }) +} + +func (th *timingHistogram) Add(delta float64) { + th.update(func(oldValue float64) float64 { return oldValue + delta }) +} + +func (th *timingHistogram) Sub(delta float64) { + th.update(func(oldValue float64) float64 { return oldValue - delta }) +} + +func (th *timingHistogram) SetToCurrentTime() { + th.update(func(oldValue float64) float64 { return th.nowFunc().Sub(time.Unix(0, 0)).Seconds() }) +} + +func (th *timingHistogram) update(updateFn func(float64) float64) { + th.weighted.lock.Lock() + defer th.weighted.lock.Unlock() + now := th.nowFunc() + delta := now.Sub(th.lastSetTime) + value := th.value + if delta > 0 { + th.weighted.observeWithWeightLocked(value, uint64(delta)) + th.lastSetTime = now + } + th.value = updateFn(value) +} + +func (th *timingHistogram) Desc() *prometheus.Desc { + return th.weighted.Desc() +} + +func (th *timingHistogram) Write(dest *dto.Metric) error { + th.Add(0) // account for time since last update + return th.weighted.Write(dest) +} + +func (th *timingHistogram) Describe(ch chan<- *prometheus.Desc) { + ch <- th.weighted.Desc() +} + +func (th *timingHistogram) Collect(ch chan<- prometheus.Metric) { + ch <- th +} diff --git a/vendor/k8s.io/component-base/metrics/prometheusextension/timing_histogram_vec.go b/vendor/k8s.io/component-base/metrics/prometheusextension/timing_histogram_vec.go new file mode 100644 index 000000000..7af1a4586 --- /dev/null +++ b/vendor/k8s.io/component-base/metrics/prometheusextension/timing_histogram_vec.go @@ -0,0 +1,111 @@ +/* +Copyright 2022 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 prometheusextension + +import ( + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +// GaugeVecOps is a bunch of Gauge that have the same +// Desc and are distinguished by the values for their variable labels. +type GaugeVecOps interface { + GetMetricWith(prometheus.Labels) (GaugeOps, error) + GetMetricWithLabelValues(lvs ...string) (GaugeOps, error) + With(prometheus.Labels) GaugeOps + WithLabelValues(...string) GaugeOps + CurryWith(prometheus.Labels) (GaugeVecOps, error) + MustCurryWith(prometheus.Labels) GaugeVecOps +} + +type TimingHistogramVec struct { + *prometheus.MetricVec +} + +var _ GaugeVecOps = &TimingHistogramVec{} +var _ prometheus.Collector = &TimingHistogramVec{} + +func NewTimingHistogramVec(opts TimingHistogramOpts, labelNames ...string) *TimingHistogramVec { + return NewTestableTimingHistogramVec(time.Now, opts, labelNames...) +} + +func NewTestableTimingHistogramVec(nowFunc func() time.Time, opts TimingHistogramOpts, labelNames ...string) *TimingHistogramVec { + desc := prometheus.NewDesc( + prometheus.BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + wrapTimingHelp(opts.Help), + labelNames, + opts.ConstLabels, + ) + return &TimingHistogramVec{ + MetricVec: prometheus.NewMetricVec(desc, func(lvs ...string) prometheus.Metric { + metric, err := newTimingHistogram(nowFunc, desc, opts, lvs...) + if err != nil { + panic(err) // like in prometheus.newHistogram + } + return metric + }), + } +} + +func (hv *TimingHistogramVec) GetMetricWith(labels prometheus.Labels) (GaugeOps, error) { + metric, err := hv.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(GaugeOps), err + } + return nil, err +} + +func (hv *TimingHistogramVec) GetMetricWithLabelValues(lvs ...string) (GaugeOps, error) { + metric, err := hv.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(GaugeOps), err + } + return nil, err +} + +func (hv *TimingHistogramVec) With(labels prometheus.Labels) GaugeOps { + h, err := hv.GetMetricWith(labels) + if err != nil { + panic(err) + } + return h +} + +func (hv *TimingHistogramVec) WithLabelValues(lvs ...string) GaugeOps { + h, err := hv.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return h +} + +func (hv *TimingHistogramVec) CurryWith(labels prometheus.Labels) (GaugeVecOps, error) { + vec, err := hv.MetricVec.CurryWith(labels) + if vec != nil { + return &TimingHistogramVec{MetricVec: vec}, err + } + return nil, err +} + +func (hv *TimingHistogramVec) MustCurryWith(labels prometheus.Labels) GaugeVecOps { + vec, err := hv.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} diff --git a/vendor/k8s.io/component-base/metrics/prometheusextension/weighted_histogram.go b/vendor/k8s.io/component-base/metrics/prometheusextension/weighted_histogram.go new file mode 100644 index 000000000..a060019b2 --- /dev/null +++ b/vendor/k8s.io/component-base/metrics/prometheusextension/weighted_histogram.go @@ -0,0 +1,203 @@ +/* +Copyright 2022 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 prometheusextension + +import ( + "fmt" + "math" + "sort" + "sync" + + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" +) + +// WeightedHistogram generalizes Histogram: each observation has +// an associated _weight_. For a given `x` and `N`, +// `1` call on `ObserveWithWeight(x, N)` has the same meaning as +// `N` calls on `ObserveWithWeight(x, 1)`. +// The weighted sum might differ slightly due to the use of +// floating point, although the implementation takes some steps +// to mitigate that. +// If every weight were 1, +// this would be the same as the existing Histogram abstraction. +type WeightedHistogram interface { + prometheus.Metric + prometheus.Collector + WeightedObserver +} + +// WeightedObserver generalizes the Observer interface. +type WeightedObserver interface { + // Set the variable to the given value with the given weight. + ObserveWithWeight(value float64, weight uint64) +} + +// WeightedHistogramOpts is the same as for an ordinary Histogram +type WeightedHistogramOpts = prometheus.HistogramOpts + +// NewWeightedHistogram creates a new WeightedHistogram +func NewWeightedHistogram(opts WeightedHistogramOpts) (WeightedHistogram, error) { + desc := prometheus.NewDesc( + prometheus.BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + wrapWeightedHelp(opts.Help), + nil, + opts.ConstLabels, + ) + return newWeightedHistogram(desc, opts) +} + +func wrapWeightedHelp(given string) string { + return "EXPERIMENTAL: " + given +} + +func newWeightedHistogram(desc *prometheus.Desc, opts WeightedHistogramOpts, variableLabelValues ...string) (*weightedHistogram, error) { + if len(opts.Buckets) == 0 { + opts.Buckets = prometheus.DefBuckets + } + + for i, upperBound := range opts.Buckets { + if i < len(opts.Buckets)-1 { + if upperBound >= opts.Buckets[i+1] { + return nil, fmt.Errorf( + "histogram buckets must be in increasing order: %f >= %f", + upperBound, opts.Buckets[i+1], + ) + } + } else { + if math.IsInf(upperBound, +1) { + // The +Inf bucket is implicit. Remove it here. + opts.Buckets = opts.Buckets[:i] + } + } + } + upperBounds := make([]float64, len(opts.Buckets)) + copy(upperBounds, opts.Buckets) + + return &weightedHistogram{ + desc: desc, + variableLabelValues: variableLabelValues, + upperBounds: upperBounds, + buckets: make([]uint64, len(upperBounds)+1), + hotCount: initialHotCount, + }, nil +} + +type weightedHistogram struct { + desc *prometheus.Desc + variableLabelValues []string + upperBounds []float64 // exclusive of +Inf + + lock sync.Mutex // applies to all the following + + // buckets is longer by one than upperBounds. + // For 0 <= idx < len(upperBounds), buckets[idx] holds the + // accumulated time.Duration that value has been <= + // upperBounds[idx] but not <= upperBounds[idx-1]. + // buckets[len(upperBounds)] holds the accumulated + // time.Duration when value fit in no other bucket. + buckets []uint64 + + // sumHot + sumCold is the weighted sum of value. + // Rather than risk loss of precision in one + // float64, we do this sum hierarchically. Many successive + // increments are added into sumHot; once in a while + // the magnitude of sumHot is compared to the magnitude + // of sumCold and, if the ratio is high enough, + // sumHot is transferred into sumCold. + sumHot float64 + sumCold float64 + + transferThreshold float64 // = math.Abs(sumCold) / 2^26 (that's about half of the bits of precision in a float64) + + // hotCount is used to decide when to consider dumping sumHot into sumCold. + // hotCount counts upward from initialHotCount to zero. + hotCount int +} + +// initialHotCount is the negative of the number of terms +// that are summed into sumHot before considering whether +// to transfer to sumCold. This only has to be big enough +// to make the extra floating point operations occur in a +// distinct minority of cases. +const initialHotCount = -15 + +var _ WeightedHistogram = &weightedHistogram{} +var _ prometheus.Metric = &weightedHistogram{} +var _ prometheus.Collector = &weightedHistogram{} + +func (sh *weightedHistogram) ObserveWithWeight(value float64, weight uint64) { + idx := sort.SearchFloat64s(sh.upperBounds, value) + sh.lock.Lock() + defer sh.lock.Unlock() + sh.updateLocked(idx, value, weight) +} + +func (sh *weightedHistogram) observeWithWeightLocked(value float64, weight uint64) { + idx := sort.SearchFloat64s(sh.upperBounds, value) + sh.updateLocked(idx, value, weight) +} + +func (sh *weightedHistogram) updateLocked(idx int, value float64, weight uint64) { + sh.buckets[idx] += weight + newSumHot := sh.sumHot + float64(weight)*value + sh.hotCount++ + if sh.hotCount >= 0 { + sh.hotCount = initialHotCount + if math.Abs(newSumHot) > sh.transferThreshold { + newSumCold := sh.sumCold + newSumHot + sh.sumCold = newSumCold + sh.transferThreshold = math.Abs(newSumCold / 67108864) + sh.sumHot = 0 + return + } + } + sh.sumHot = newSumHot +} + +func (sh *weightedHistogram) Desc() *prometheus.Desc { + return sh.desc +} + +func (sh *weightedHistogram) Write(dest *dto.Metric) error { + count, sum, buckets := func() (uint64, float64, map[float64]uint64) { + sh.lock.Lock() + defer sh.lock.Unlock() + nBounds := len(sh.upperBounds) + buckets := make(map[float64]uint64, nBounds) + var count uint64 + for idx, upperBound := range sh.upperBounds { + count += sh.buckets[idx] + buckets[upperBound] = count + } + count += sh.buckets[nBounds] + return count, sh.sumHot + sh.sumCold, buckets + }() + metric, err := prometheus.NewConstHistogram(sh.desc, count, sum, buckets, sh.variableLabelValues...) + if err != nil { + return err + } + return metric.Write(dest) +} + +func (sh *weightedHistogram) Describe(ch chan<- *prometheus.Desc) { + ch <- sh.desc +} + +func (sh *weightedHistogram) Collect(ch chan<- prometheus.Metric) { + ch <- sh +} diff --git a/vendor/k8s.io/component-base/metrics/prometheusextension/weighted_histogram_vec.go b/vendor/k8s.io/component-base/metrics/prometheusextension/weighted_histogram_vec.go new file mode 100644 index 000000000..2ca95f0a7 --- /dev/null +++ b/vendor/k8s.io/component-base/metrics/prometheusextension/weighted_histogram_vec.go @@ -0,0 +1,106 @@ +/* +Copyright 2022 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 prometheusextension + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +// WeightedObserverVec is a bunch of WeightedObservers that have the same +// Desc and are distinguished by the values for their variable labels. +type WeightedObserverVec interface { + GetMetricWith(prometheus.Labels) (WeightedObserver, error) + GetMetricWithLabelValues(lvs ...string) (WeightedObserver, error) + With(prometheus.Labels) WeightedObserver + WithLabelValues(...string) WeightedObserver + CurryWith(prometheus.Labels) (WeightedObserverVec, error) + MustCurryWith(prometheus.Labels) WeightedObserverVec +} + +// WeightedHistogramVec implements WeightedObserverVec +type WeightedHistogramVec struct { + *prometheus.MetricVec +} + +var _ WeightedObserverVec = &WeightedHistogramVec{} +var _ prometheus.Collector = &WeightedHistogramVec{} + +func NewWeightedHistogramVec(opts WeightedHistogramOpts, labelNames ...string) *WeightedHistogramVec { + desc := prometheus.NewDesc( + prometheus.BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + wrapWeightedHelp(opts.Help), + labelNames, + opts.ConstLabels, + ) + return &WeightedHistogramVec{ + MetricVec: prometheus.NewMetricVec(desc, func(lvs ...string) prometheus.Metric { + metric, err := newWeightedHistogram(desc, opts, lvs...) + if err != nil { + panic(err) // like in prometheus.newHistogram + } + return metric + }), + } +} + +func (hv *WeightedHistogramVec) GetMetricWith(labels prometheus.Labels) (WeightedObserver, error) { + metric, err := hv.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(WeightedObserver), err + } + return nil, err +} + +func (hv *WeightedHistogramVec) GetMetricWithLabelValues(lvs ...string) (WeightedObserver, error) { + metric, err := hv.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(WeightedObserver), err + } + return nil, err +} + +func (hv *WeightedHistogramVec) With(labels prometheus.Labels) WeightedObserver { + h, err := hv.GetMetricWith(labels) + if err != nil { + panic(err) + } + return h +} + +func (hv *WeightedHistogramVec) WithLabelValues(lvs ...string) WeightedObserver { + h, err := hv.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return h +} + +func (hv *WeightedHistogramVec) CurryWith(labels prometheus.Labels) (WeightedObserverVec, error) { + vec, err := hv.MetricVec.CurryWith(labels) + if vec != nil { + return &WeightedHistogramVec{MetricVec: vec}, err + } + return nil, err +} + +func (hv *WeightedHistogramVec) MustCurryWith(labels prometheus.Labels) WeightedObserverVec { + vec, err := hv.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} diff --git a/vendor/k8s.io/component-base/metrics/summary.go b/vendor/k8s.io/component-base/metrics/summary.go index fb1108f92..0198f7248 100644 --- a/vendor/k8s.io/component-base/metrics/summary.go +++ b/vendor/k8s.io/component-base/metrics/summary.go @@ -18,10 +18,17 @@ package metrics import ( "context" + "github.com/blang/semver/v4" "github.com/prometheus/client_golang/prometheus" ) +const ( + DefAgeBuckets = prometheus.DefAgeBuckets + DefBufCap = prometheus.DefBufCap + DefMaxAge = prometheus.DefMaxAge +) + // Summary is our internal representation for our wrapping struct around prometheus // summaries. Summary implements both kubeCollector and ObserverMetric // @@ -93,7 +100,9 @@ type SummaryVec struct { // NewSummaryVec returns an object which satisfies kubeCollector and wraps the // prometheus.SummaryVec object. However, the object returned will not measure -// anything unless the collector is first registered, since the metric is lazily instantiated. +// anything unless the collector is first registered, since the metric is lazily instantiated, +// and only members extracted after +// registration will actually measure anything. // // DEPRECATED: as per the metrics overhaul KEP func NewSummaryVec(opts *SummaryOpts, labels []string) *SummaryVec { @@ -130,13 +139,16 @@ func (v *SummaryVec) initializeDeprecatedMetric() { v.initializeMetric() } -// Default Prometheus behavior actually results in the creation of a new metric -// if a metric with the unique label values is not found in the underlying stored metricMap. +// Default Prometheus Vec behavior is that member extraction results in creation of a new element +// if one with the unique label values is not found in the underlying stored metricMap. // This means that if this function is called but the underlying metric is not registered // (which means it will never be exposed externally nor consumed), the metric will exist in memory // for perpetuity (i.e. throughout application lifecycle). // -// For reference: https://github.com/prometheus/client_golang/blob/v0.9.2/prometheus/summary.go#L485-L495 +// For reference: https://github.com/prometheus/client_golang/blob/v0.9.2/prometheus/histogram.go#L460-L470 +// +// In contrast, the Vec behavior in this package is that member extraction before registration +// returns a permanent noop object. // WithLabelValues returns the ObserverMetric for the given slice of label // values (same order as the VariableLabels in Desc). If that combination of diff --git a/vendor/k8s.io/component-base/metrics/timing_histogram.go b/vendor/k8s.io/component-base/metrics/timing_histogram.go new file mode 100644 index 000000000..c015a04ea --- /dev/null +++ b/vendor/k8s.io/component-base/metrics/timing_histogram.go @@ -0,0 +1,267 @@ +/* +Copyright 2019 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 metrics + +import ( + "context" + "time" + + "github.com/blang/semver/v4" + promext "k8s.io/component-base/metrics/prometheusextension" +) + +// PrometheusTimingHistogram is the abstraction of the underlying histogram +// that we want to promote from the wrapper. +type PrometheusTimingHistogram interface { + GaugeMetric +} + +// TimingHistogram is our internal representation for our wrapping struct around +// timing histograms. It implements both kubeCollector and GaugeMetric +type TimingHistogram struct { + PrometheusTimingHistogram + *TimingHistogramOpts + nowFunc func() time.Time + lazyMetric + selfCollector +} + +var _ GaugeMetric = &TimingHistogram{} +var _ Registerable = &TimingHistogram{} +var _ kubeCollector = &TimingHistogram{} + +// NewTimingHistogram returns an object which is TimingHistogram-like. However, nothing +// will be measured until the histogram is registered somewhere. +func NewTimingHistogram(opts *TimingHistogramOpts) *TimingHistogram { + return NewTestableTimingHistogram(time.Now, opts) +} + +// NewTestableTimingHistogram adds injection of the clock +func NewTestableTimingHistogram(nowFunc func() time.Time, opts *TimingHistogramOpts) *TimingHistogram { + opts.StabilityLevel.setDefaults() + + h := &TimingHistogram{ + TimingHistogramOpts: opts, + nowFunc: nowFunc, + lazyMetric: lazyMetric{}, + } + h.setPrometheusHistogram(noopMetric{}) + h.lazyInit(h, BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)) + return h +} + +// setPrometheusHistogram sets the underlying KubeGauge object, i.e. the thing that does the measurement. +func (h *TimingHistogram) setPrometheusHistogram(histogram promext.TimingHistogram) { + h.PrometheusTimingHistogram = histogram + h.initSelfCollection(histogram) +} + +// DeprecatedVersion returns a pointer to the Version or nil +func (h *TimingHistogram) DeprecatedVersion() *semver.Version { + return parseSemver(h.TimingHistogramOpts.DeprecatedVersion) +} + +// initializeMetric invokes the actual prometheus.Histogram object instantiation +// and stores a reference to it +func (h *TimingHistogram) initializeMetric() { + h.TimingHistogramOpts.annotateStabilityLevel() + // this actually creates the underlying prometheus gauge. + histogram, err := promext.NewTestableTimingHistogram(h.nowFunc, h.TimingHistogramOpts.toPromHistogramOpts()) + if err != nil { + panic(err) // handle as for regular histograms + } + h.setPrometheusHistogram(histogram) +} + +// initializeDeprecatedMetric invokes the actual prometheus.Histogram object instantiation +// but modifies the Help description prior to object instantiation. +func (h *TimingHistogram) initializeDeprecatedMetric() { + h.TimingHistogramOpts.markDeprecated() + h.initializeMetric() +} + +// WithContext allows the normal TimingHistogram metric to pass in context. The context is no-op now. +func (h *TimingHistogram) WithContext(ctx context.Context) GaugeMetric { + return h.PrometheusTimingHistogram +} + +// TimingHistogramVec is the internal representation of our wrapping struct around prometheus +// TimingHistogramVecs. +type TimingHistogramVec struct { + *promext.TimingHistogramVec + *TimingHistogramOpts + nowFunc func() time.Time + lazyMetric + originalLabels []string +} + +var _ GaugeVecMetric = &TimingHistogramVec{} +var _ Registerable = &TimingHistogramVec{} +var _ kubeCollector = &TimingHistogramVec{} + +// NewTimingHistogramVec returns an object which satisfies the kubeCollector, Registerable, and GaugeVecMetric interfaces +// and wraps an underlying promext.TimingHistogramVec object. Note well the way that +// behavior depends on registration and whether this is hidden. +func NewTimingHistogramVec(opts *TimingHistogramOpts, labels []string) *TimingHistogramVec { + return NewTestableTimingHistogramVec(time.Now, opts, labels) +} + +// NewTestableTimingHistogramVec adds injection of the clock. +func NewTestableTimingHistogramVec(nowFunc func() time.Time, opts *TimingHistogramOpts, labels []string) *TimingHistogramVec { + opts.StabilityLevel.setDefaults() + + fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) + allowListLock.RLock() + if allowList, ok := labelValueAllowLists[fqName]; ok { + opts.LabelValueAllowLists = allowList + } + allowListLock.RUnlock() + + v := &TimingHistogramVec{ + TimingHistogramVec: noopTimingHistogramVec, + TimingHistogramOpts: opts, + nowFunc: nowFunc, + originalLabels: labels, + lazyMetric: lazyMetric{}, + } + v.lazyInit(v, fqName) + return v +} + +// DeprecatedVersion returns a pointer to the Version or nil +func (v *TimingHistogramVec) DeprecatedVersion() *semver.Version { + return parseSemver(v.TimingHistogramOpts.DeprecatedVersion) +} + +func (v *TimingHistogramVec) initializeMetric() { + v.TimingHistogramOpts.annotateStabilityLevel() + v.TimingHistogramVec = promext.NewTestableTimingHistogramVec(v.nowFunc, v.TimingHistogramOpts.toPromHistogramOpts(), v.originalLabels...) +} + +func (v *TimingHistogramVec) initializeDeprecatedMetric() { + v.TimingHistogramOpts.markDeprecated() + v.initializeMetric() +} + +// WithLabelValuesChecked, if called before this vector has been registered in +// at least one registry, will return a noop gauge and +// an error that passes ErrIsNotRegistered. +// If called on a hidden vector, +// will return a noop gauge and a nil error. +// If called with a syntactic problem in the labels, will +// return a noop gauge and an error about the labels. +// If none of the above apply, this method will return +// the appropriate vector member and a nil error. +func (v *TimingHistogramVec) WithLabelValuesChecked(lvs ...string) (GaugeMetric, error) { + if !v.IsCreated() { + if v.IsHidden() { + return noop, nil + } + return noop, errNotRegistered + } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) + } + ops, err := v.TimingHistogramVec.GetMetricWithLabelValues(lvs...) + return ops.(GaugeMetric), err +} + +// WithLabelValues calls WithLabelValuesChecked +// and handles errors as follows. +// An error that passes ErrIsNotRegistered is ignored +// and the noop gauge is returned; +// all other errors cause a panic. +func (v *TimingHistogramVec) WithLabelValues(lvs ...string) GaugeMetric { + ans, err := v.WithLabelValuesChecked(lvs...) + if err == nil || ErrIsNotRegistered(err) { + return ans + } + panic(err) +} + +// WithChecked, if called before this vector has been registered in +// at least one registry, will return a noop gauge and +// an error that passes ErrIsNotRegistered. +// If called on a hidden vector, +// will return a noop gauge and a nil error. +// If called with a syntactic problem in the labels, will +// return a noop gauge and an error about the labels. +// If none of the above apply, this method will return +// the appropriate vector member and a nil error. +func (v *TimingHistogramVec) WithChecked(labels map[string]string) (GaugeMetric, error) { + if !v.IsCreated() { + if v.IsHidden() { + return noop, nil + } + return noop, errNotRegistered + } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainLabelMap(labels) + } + ops, err := v.TimingHistogramVec.GetMetricWith(labels) + return ops.(GaugeMetric), err +} + +// With calls WithChecked and handles errors as follows. +// An error that passes ErrIsNotRegistered is ignored +// and the noop gauge is returned; +// all other errors cause a panic. +func (v *TimingHistogramVec) With(labels map[string]string) GaugeMetric { + ans, err := v.WithChecked(labels) + if err == nil || ErrIsNotRegistered(err) { + return ans + } + panic(err) +} + +// Delete deletes the metric where the variable labels are the same as those +// passed in as labels. It returns true if a metric was deleted. +// +// It is not an error if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc. However, such inconsistent Labels +// can never match an actual metric, so the method will always return false in +// that case. +func (v *TimingHistogramVec) Delete(labels map[string]string) bool { + if !v.IsCreated() { + return false // since we haven't created the metric, we haven't deleted a metric with the passed in values + } + return v.TimingHistogramVec.Delete(labels) +} + +// Reset deletes all metrics in this vector. +func (v *TimingHistogramVec) Reset() { + if !v.IsCreated() { + return + } + + v.TimingHistogramVec.Reset() +} + +// WithContext returns wrapped TimingHistogramVec with context +func (v *TimingHistogramVec) InterfaceWithContext(ctx context.Context) GaugeVecMetric { + return &TimingHistogramVecWithContext{ + ctx: ctx, + TimingHistogramVec: v, + } +} + +// TimingHistogramVecWithContext is the wrapper of TimingHistogramVec with context. +// Currently the context is ignored. +type TimingHistogramVecWithContext struct { + *TimingHistogramVec + ctx context.Context +} diff --git a/vendor/k8s.io/component-base/metrics/value.go b/vendor/k8s.io/component-base/metrics/value.go index 4a19aaa3b..bf8a6b8f6 100644 --- a/vendor/k8s.io/component-base/metrics/value.go +++ b/vendor/k8s.io/component-base/metrics/value.go @@ -50,7 +50,8 @@ func NewLazyConstMetric(desc *Desc, valueType ValueType, value float64, labelVal // NewLazyMetricWithTimestamp is a helper of NewMetricWithTimestamp. // // Warning: the Metric 'm' must be the one created by NewLazyConstMetric(), -// otherwise, no stability guarantees would be offered. +// +// otherwise, no stability guarantees would be offered. func NewLazyMetricWithTimestamp(t time.Time, m Metric) Metric { if m == nil { return nil diff --git a/vendor/k8s.io/component-base/metrics/wrappers.go b/vendor/k8s.io/component-base/metrics/wrappers.go index 6ae8a458a..06a8eec50 100644 --- a/vendor/k8s.io/component-base/metrics/wrappers.go +++ b/vendor/k8s.io/component-base/metrics/wrappers.go @@ -17,6 +17,8 @@ limitations under the License. package metrics import ( + "errors" + "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" ) @@ -65,6 +67,64 @@ type GaugeMetric interface { SetToCurrentTime() } +// GaugeVecMetric is a collection of Gauges that differ only in label values. +type GaugeVecMetric interface { + // Default Prometheus Vec behavior is that member extraction results in creation of a new element + // if one with the unique label values is not found in the underlying stored metricMap. + // This means that if this function is called but the underlying metric is not registered + // (which means it will never be exposed externally nor consumed), the metric would exist in memory + // for perpetuity (i.e. throughout application lifecycle). + // + // For reference: https://github.com/prometheus/client_golang/blob/v0.9.2/prometheus/gauge.go#L190-L208 + // + // In contrast, the Vec behavior in this package is that member extraction before registration + // returns a permanent noop object. + + // WithLabelValuesChecked, if called before this vector has been registered in + // at least one registry, will return a noop gauge and + // an error that passes ErrIsNotRegistered. + // If called on a hidden vector, + // will return a noop gauge and a nil error. + // If called with a syntactic problem in the labels, will + // return a noop gauge and an error about the labels. + // If none of the above apply, this method will return + // the appropriate vector member and a nil error. + WithLabelValuesChecked(labelValues ...string) (GaugeMetric, error) + + // WithLabelValues calls WithLabelValuesChecked + // and handles errors as follows. + // An error that passes ErrIsNotRegistered is ignored + // and the noop gauge is returned; + // all other errors cause a panic. + WithLabelValues(labelValues ...string) GaugeMetric + + // WithChecked, if called before this vector has been registered in + // at least one registry, will return a noop gauge and + // an error that passes ErrIsNotRegistered. + // If called on a hidden vector, + // will return a noop gauge and a nil error. + // If called with a syntactic problem in the labels, will + // return a noop gauge and an error about the labels. + // If none of the above apply, this method will return + // the appropriate vector member and a nil error. + WithChecked(labels map[string]string) (GaugeMetric, error) + + // With calls WithChecked and handles errors as follows. + // An error that passes ErrIsNotRegistered is ignored + // and the noop gauge is returned; + // all other errors cause a panic. + With(labels map[string]string) GaugeMetric + + // Delete asserts that the vec should have no member for the given label set. + // The returned bool indicates whether there was a change. + // The return will certainly be `false` if the given label set has the wrong + // set of label names. + Delete(map[string]string) bool + + // Reset removes all the members + Reset() +} + // ObserverMetric captures individual observations. type ObserverMetric interface { Observe(float64) @@ -93,3 +153,9 @@ type GaugeFunc interface { Metric Collector } + +func ErrIsNotRegistered(err error) bool { + return err == errNotRegistered +} + +var errNotRegistered = errors.New("metric vec is not registered yet") diff --git a/vendor/k8s.io/component-base/traces/utils.go b/vendor/k8s.io/component-base/traces/utils.go deleted file mode 100644 index 5b271fd1a..000000000 --- a/vendor/k8s.io/component-base/traces/utils.go +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright 2021 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package traces - -import ( - "context" - "net/http" - - "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" - "go.opentelemetry.io/otel/exporters/otlp" - "go.opentelemetry.io/otel/exporters/otlp/otlpgrpc" - "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/resource" - sdktrace "go.opentelemetry.io/otel/sdk/trace" - "go.opentelemetry.io/otel/trace" - - "k8s.io/client-go/transport" - "k8s.io/klog/v2" -) - -// NewProvider initializes tracing in the component, and enforces recommended tracing behavior. -func NewProvider(ctx context.Context, baseSampler sdktrace.Sampler, resourceOpts []resource.Option, opts ...otlpgrpc.Option) trace.TracerProvider { - opts = append(opts, otlpgrpc.WithInsecure()) - driver := otlpgrpc.NewDriver(opts...) - exporter, err := otlp.NewExporter(ctx, driver) - if err != nil { - klog.Fatalf("Failed to create OTLP exporter: %v", err) - } - - res, err := resource.New(ctx, resourceOpts...) - if err != nil { - klog.Fatalf("Failed to create resource: %v", err) - } - - bsp := sdktrace.NewBatchSpanProcessor(exporter) - - return sdktrace.NewTracerProvider( - sdktrace.WithSampler(sdktrace.ParentBased(baseSampler)), - sdktrace.WithSpanProcessor(bsp), - sdktrace.WithResource(res), - ) -} - -// WrapperFor can be used to add tracing to a *rest.Config. Example usage: -// tp := traces.NewProvider(...) -// config, _ := rest.InClusterConfig() -// config.Wrap(traces.WrapperFor(&tp)) -// kubeclient, _ := clientset.NewForConfig(config) -func WrapperFor(tp *trace.TracerProvider) transport.WrapperFunc { - return func(rt http.RoundTripper) http.RoundTripper { - opts := []otelhttp.Option{ - otelhttp.WithPropagators(Propagators()), - } - if tp != nil { - opts = append(opts, otelhttp.WithTracerProvider(*tp)) - } - // Even if there is no TracerProvider, the otelhttp still handles context propagation. - // See https://github.com/open-telemetry/opentelemetry-go/tree/main/example/passthrough - return otelhttp.NewTransport(rt, opts...) - } -} - -// Propagators returns the recommended set of propagators. -func Propagators() propagation.TextMapPropagator { - return propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}) -} diff --git a/vendor/k8s.io/component-base/traces/OWNERS b/vendor/k8s.io/component-base/tracing/OWNERS similarity index 100% rename from vendor/k8s.io/component-base/traces/OWNERS rename to vendor/k8s.io/component-base/tracing/OWNERS diff --git a/vendor/k8s.io/component-base/tracing/api/v1/config.go b/vendor/k8s.io/component-base/tracing/api/v1/config.go new file mode 100644 index 000000000..ae9bbbfc0 --- /dev/null +++ b/vendor/k8s.io/component-base/tracing/api/v1/config.go @@ -0,0 +1,88 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "fmt" + "net/url" + "strings" + + "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/component-base/featuregate" +) + +var ( + maxSamplingRatePerMillion = int32(1000000) +) + +// ValidateTracingConfiguration validates the tracing configuration +func ValidateTracingConfiguration(traceConfig *TracingConfiguration, featureGate featuregate.FeatureGate, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if traceConfig == nil { + return allErrs + } + if traceConfig.SamplingRatePerMillion != nil { + allErrs = append(allErrs, validateSamplingRate(*traceConfig.SamplingRatePerMillion, fldPath.Child("samplingRatePerMillion"))...) + } + if traceConfig.Endpoint != nil { + allErrs = append(allErrs, validateEndpoint(*traceConfig.Endpoint, fldPath.Child("endpoint"))...) + } + return allErrs +} + +func validateSamplingRate(rate int32, fldPath *field.Path) field.ErrorList { + errs := field.ErrorList{} + if rate < 0 { + errs = append(errs, field.Invalid( + fldPath, rate, + "sampling rate must be positive", + )) + } + if rate > maxSamplingRatePerMillion { + errs = append(errs, field.Invalid( + fldPath, rate, + "sampling rate per million must be less than or equal to one million", + )) + } + return errs +} + +func validateEndpoint(endpoint string, fldPath *field.Path) field.ErrorList { + errs := field.ErrorList{} + if !strings.Contains(endpoint, "//") { + endpoint = "dns://" + endpoint + } + url, err := url.Parse(endpoint) + if err != nil { + errs = append(errs, field.Invalid( + fldPath, endpoint, + err.Error(), + )) + return errs + } + switch url.Scheme { + case "dns": + case "unix": + case "unix-abstract": + default: + errs = append(errs, field.Invalid( + fldPath, endpoint, + fmt.Sprintf("unsupported scheme: %v. Options are none, dns, unix, or unix-abstract. See https://github.com/grpc/grpc/blob/master/doc/naming.md", url.Scheme), + )) + } + return errs +} diff --git a/vendor/k8s.io/component-base/tracing/api/v1/doc.go b/vendor/k8s.io/component-base/tracing/api/v1/doc.go new file mode 100644 index 000000000..ffe36aef6 --- /dev/null +++ b/vendor/k8s.io/component-base/tracing/api/v1/doc.go @@ -0,0 +1,29 @@ +/* +Copyright 2022 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. +*/ + +// +k8s:deepcopy-gen=package + +// Package v1 contains the configuration API for tracing. +// +// The intention is to only have a single version of this API, potentially with +// new fields added over time in a backwards-compatible manner. Fields for +// alpha or beta features are allowed as long as they are defined so that not +// changing the defaults leaves those features disabled. +// +// The "v1" package name is just a reminder that API compatibility rules apply, +// not an indication of the stability of all features covered by it. + +package v1 // import "k8s.io/component-base/tracing/api/v1" diff --git a/vendor/k8s.io/component-base/tracing/api/v1/types.go b/vendor/k8s.io/component-base/tracing/api/v1/types.go new file mode 100644 index 000000000..a59d56405 --- /dev/null +++ b/vendor/k8s.io/component-base/tracing/api/v1/types.go @@ -0,0 +1,32 @@ +/* +Copyright 2022 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 v1 + +// TracingConfiguration provides versioned configuration for OpenTelemetry tracing clients. +type TracingConfiguration struct { + // Endpoint of the collector this component will report traces to. + // The connection is insecure, and does not currently support TLS. + // Recommended is unset, and endpoint is the otlp grpc default, localhost:4317. + // +optional + Endpoint *string `json:"endpoint,omitempty"` + + // SamplingRatePerMillion is the number of samples to collect per million spans. + // Recommended is unset. If unset, sampler respects its parent span's sampling + // rate, but otherwise never samples. + // +optional + SamplingRatePerMillion *int32 `json:"samplingRatePerMillion,omitempty"` +} diff --git a/vendor/k8s.io/component-base/tracing/api/v1/zz_generated.deepcopy.go b/vendor/k8s.io/component-base/tracing/api/v1/zz_generated.deepcopy.go new file mode 100644 index 000000000..2afc68117 --- /dev/null +++ b/vendor/k8s.io/component-base/tracing/api/v1/zz_generated.deepcopy.go @@ -0,0 +1,48 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright 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. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1 + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TracingConfiguration) DeepCopyInto(out *TracingConfiguration) { + *out = *in + if in.Endpoint != nil { + in, out := &in.Endpoint, &out.Endpoint + *out = new(string) + **out = **in + } + if in.SamplingRatePerMillion != nil { + in, out := &in.SamplingRatePerMillion, &out.SamplingRatePerMillion + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TracingConfiguration. +func (in *TracingConfiguration) DeepCopy() *TracingConfiguration { + if in == nil { + return nil + } + out := new(TracingConfiguration) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/component-base/tracing/utils.go b/vendor/k8s.io/component-base/tracing/utils.go new file mode 100644 index 000000000..8c7ec983c --- /dev/null +++ b/vendor/k8s.io/component-base/tracing/utils.go @@ -0,0 +1,108 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package tracing + +import ( + "context" + "net/http" + + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" + "go.opentelemetry.io/otel/exporters/otlp" + "go.opentelemetry.io/otel/exporters/otlp/otlpgrpc" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + oteltrace "go.opentelemetry.io/otel/trace" + + "k8s.io/client-go/transport" + "k8s.io/component-base/tracing/api/v1" +) + +// NewProvider creates a TracerProvider in a component, and enforces recommended tracing behavior +func NewProvider(ctx context.Context, + tracingConfig *v1.TracingConfiguration, + addedOpts []otlpgrpc.Option, + resourceOpts []resource.Option, +) (oteltrace.TracerProvider, error) { + if tracingConfig == nil { + return oteltrace.NewNoopTracerProvider(), nil + } + opts := append([]otlpgrpc.Option{}, addedOpts...) + if tracingConfig.Endpoint != nil { + opts = append(opts, otlpgrpc.WithEndpoint(*tracingConfig.Endpoint)) + } + opts = append(opts, otlpgrpc.WithInsecure()) + driver := otlpgrpc.NewDriver(opts...) + exporter, err := otlp.NewExporter(ctx, driver) + if err != nil { + return nil, err + } + res, err := resource.New(ctx, resourceOpts...) + if err != nil { + return nil, err + } + + // sampler respects parent span's sampling rate or + // otherwise never samples. + sampler := sdktrace.NeverSample() + // Or, emit spans for a fraction of transactions + if tracingConfig.SamplingRatePerMillion != nil && *tracingConfig.SamplingRatePerMillion > 0 { + sampler = sdktrace.TraceIDRatioBased(float64(*tracingConfig.SamplingRatePerMillion) / float64(1000000)) + } + // batch span processor to aggregate spans before export. + bsp := sdktrace.NewBatchSpanProcessor(exporter) + tp := sdktrace.NewTracerProvider( + sdktrace.WithSampler(sdktrace.ParentBased(sampler)), + sdktrace.WithSpanProcessor(bsp), + sdktrace.WithResource(res), + ) + return tp, nil +} + +// WithTracing adds tracing to requests if the incoming request is sampled +func WithTracing(handler http.Handler, tp oteltrace.TracerProvider, serviceName string) http.Handler { + opts := []otelhttp.Option{ + otelhttp.WithPropagators(Propagators()), + otelhttp.WithTracerProvider(tp), + } + // With Noop TracerProvider, the otelhttp still handles context propagation. + // See https://github.com/open-telemetry/opentelemetry-go/tree/main/example/passthrough + return otelhttp.NewHandler(handler, serviceName, opts...) +} + +// WrapperFor can be used to add tracing to a *rest.Config. +// Example usage: +// tp := NewProvider(...) +// config, _ := rest.InClusterConfig() +// config.Wrap(WrapperFor(&tp)) +// kubeclient, _ := clientset.NewForConfig(config) +func WrapperFor(tp oteltrace.TracerProvider) transport.WrapperFunc { + return func(rt http.RoundTripper) http.RoundTripper { + opts := []otelhttp.Option{ + otelhttp.WithPropagators(Propagators()), + otelhttp.WithTracerProvider(tp), + } + // With Noop TracerProvider, the otelhttp still handles context propagation. + // See https://github.com/open-telemetry/opentelemetry-go/tree/main/example/passthrough + return otelhttp.NewTransport(rt, opts...) + } +} + +// Propagators returns the recommended set of propagators. +func Propagators() propagation.TextMapPropagator { + return propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}) +} diff --git a/vendor/k8s.io/klog/v2/OWNERS b/vendor/k8s.io/klog/v2/OWNERS index 8cccebf2e..a2fe8f351 100644 --- a/vendor/k8s.io/klog/v2/OWNERS +++ b/vendor/k8s.io/klog/v2/OWNERS @@ -1,5 +1,6 @@ # See the OWNERS docs at https://go.k8s.io/owners reviewers: + - harshanarayana - pohly approvers: - dims diff --git a/vendor/k8s.io/klog/v2/contextual.go b/vendor/k8s.io/klog/v2/contextual.go index 65ac479ab..2428963c0 100644 --- a/vendor/k8s.io/klog/v2/contextual.go +++ b/vendor/k8s.io/klog/v2/contextual.go @@ -47,8 +47,9 @@ var ( // If set, all log lines will be suppressed from the regular output, and // redirected to the logr implementation. // Use as: -// ... -// klog.SetLogger(zapr.NewLogger(zapLog)) +// +// ... +// klog.SetLogger(zapr.NewLogger(zapLog)) // // To remove a backing logr implemention, use ClearLogger. Setting an // empty logger with SetLogger(logr.Logger{}) does not work. diff --git a/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go b/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go index f85d7ccf8..ad6bf1116 100644 --- a/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go +++ b/vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go @@ -145,7 +145,7 @@ func KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) { case string: writeStringValue(b, true, value) default: - writeStringValue(b, false, fmt.Sprintf("%+v", v)) + writeStringValue(b, false, fmt.Sprintf("%+v", value)) } case []byte: // In https://github.com/kubernetes/klog/pull/237 it was decided diff --git a/vendor/k8s.io/klog/v2/klog.go b/vendor/k8s.io/klog/v2/klog.go index 652fadcd4..1bd11b675 100644 --- a/vendor/k8s.io/klog/v2/klog.go +++ b/vendor/k8s.io/klog/v2/klog.go @@ -39,39 +39,38 @@ // This package provides several flags that modify this behavior. // As a result, flag.Parse must be called before any logging is done. // -// -logtostderr=true -// Logs are written to standard error instead of to files. -// This shortcuts most of the usual output routing: -// -alsologtostderr, -stderrthreshold and -log_dir have no -// effect and output redirection at runtime with SetOutput is -// ignored. -// -alsologtostderr=false -// Logs are written to standard error as well as to files. -// -stderrthreshold=ERROR -// Log events at or above this severity are logged to standard -// error as well as to files. -// -log_dir="" -// Log files will be written to this directory instead of the -// default temporary directory. +// -logtostderr=true +// Logs are written to standard error instead of to files. +// This shortcuts most of the usual output routing: +// -alsologtostderr, -stderrthreshold and -log_dir have no +// effect and output redirection at runtime with SetOutput is +// ignored. +// -alsologtostderr=false +// Logs are written to standard error as well as to files. +// -stderrthreshold=ERROR +// Log events at or above this severity are logged to standard +// error as well as to files. +// -log_dir="" +// Log files will be written to this directory instead of the +// default temporary directory. // -// Other flags provide aids to debugging. -// -// -log_backtrace_at="" -// When set to a file and line number holding a logging statement, -// such as -// -log_backtrace_at=gopherflakes.go:234 -// a stack trace will be written to the Info log whenever execution -// hits that statement. (Unlike with -vmodule, the ".go" must be -// present.) -// -v=0 -// Enable V-leveled logging at the specified level. -// -vmodule="" -// The syntax of the argument is a comma-separated list of pattern=N, -// where pattern is a literal file name (minus the ".go" suffix) or -// "glob" pattern and N is a V level. For instance, -// -vmodule=gopher*=3 -// sets the V level to 3 in all Go files whose names begin "gopher". +// Other flags provide aids to debugging. // +// -log_backtrace_at="" +// When set to a file and line number holding a logging statement, +// such as +// -log_backtrace_at=gopherflakes.go:234 +// a stack trace will be written to the Info log whenever execution +// hits that statement. (Unlike with -vmodule, the ".go" must be +// present.) +// -v=0 +// Enable V-leveled logging at the specified level. +// -vmodule="" +// The syntax of the argument is a comma-separated list of pattern=N, +// where pattern is a literal file name (minus the ".go" suffix) or +// "glob" pattern and N is a V level. For instance, +// -vmodule=gopher*=3 +// sets the V level to 3 in all Go files whose names begin "gopher". package klog import ( @@ -397,45 +396,48 @@ type flushSyncWriter interface { io.Writer } -// init sets up the defaults. +var logging loggingT +var commandLine flag.FlagSet + +// init sets up the defaults and creates command line flags. func init() { + commandLine.StringVar(&logging.logDir, "log_dir", "", "If non-empty, write log files in this directory (no effect when -logtostderr=true)") + commandLine.StringVar(&logging.logFile, "log_file", "", "If non-empty, use this log file (no effect when -logtostderr=true)") + commandLine.Uint64Var(&logging.logFileMaxSizeMB, "log_file_max_size", 1800, + "Defines the maximum size a log file can grow to (no effect when -logtostderr=true). Unit is megabytes. "+ + "If the value is 0, the maximum file size is unlimited.") + commandLine.BoolVar(&logging.toStderr, "logtostderr", true, "log to standard error instead of files") + commandLine.BoolVar(&logging.alsoToStderr, "alsologtostderr", false, "log to standard error as well as files (no effect when -logtostderr=true)") + logging.setVState(0, nil, false) + commandLine.Var(&logging.verbosity, "v", "number for the log level verbosity") + commandLine.BoolVar(&logging.addDirHeader, "add_dir_header", false, "If true, adds the file directory to the header of the log messages") + commandLine.BoolVar(&logging.skipHeaders, "skip_headers", false, "If true, avoid header prefixes in the log messages") + commandLine.BoolVar(&logging.oneOutput, "one_output", false, "If true, only write logs to their native severity level (vs also writing to each lower severity level; no effect when -logtostderr=true)") + commandLine.BoolVar(&logging.skipLogHeaders, "skip_log_headers", false, "If true, avoid headers when opening log files (no effect when -logtostderr=true)") logging.stderrThreshold = severityValue{ Severity: severity.ErrorLog, // Default stderrThreshold is ERROR. } - logging.setVState(0, nil, false) - logging.logDir = "" - logging.logFile = "" - logging.logFileMaxSizeMB = 1800 - logging.toStderr = true - logging.alsoToStderr = false - logging.skipHeaders = false - logging.addDirHeader = false - logging.skipLogHeaders = false - logging.oneOutput = false + commandLine.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr when writing to files and stderr (no effect when -logtostderr=true or -alsologtostderr=false)") + commandLine.Var(&logging.vmodule, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging") + commandLine.Var(&logging.traceLocation, "log_backtrace_at", "when logging hits line file:N, emit a stack trace") + + logging.settings.contextualLoggingEnabled = true logging.flushD = newFlushDaemon(logging.lockAndFlushAll, nil) } // InitFlags is for explicitly initializing the flags. +// It may get called repeatedly for different flagsets, but not +// twice for the same one. May get called concurrently +// to other goroutines using klog. However, only some flags +// may get set concurrently (see implementation). func InitFlags(flagset *flag.FlagSet) { if flagset == nil { flagset = flag.CommandLine } - flagset.StringVar(&logging.logDir, "log_dir", logging.logDir, "If non-empty, write log files in this directory (no effect when -logtostderr=true)") - flagset.StringVar(&logging.logFile, "log_file", logging.logFile, "If non-empty, use this log file (no effect when -logtostderr=true)") - flagset.Uint64Var(&logging.logFileMaxSizeMB, "log_file_max_size", logging.logFileMaxSizeMB, - "Defines the maximum size a log file can grow to (no effect when -logtostderr=true). Unit is megabytes. "+ - "If the value is 0, the maximum file size is unlimited.") - 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 (no effect when -logtostderr=true)") - flagset.Var(&logging.verbosity, "v", "number for the log level verbosity") - flagset.BoolVar(&logging.addDirHeader, "add_dir_header", logging.addDirHeader, "If true, adds the file directory to the header of the log messages") - flagset.BoolVar(&logging.skipHeaders, "skip_headers", logging.skipHeaders, "If true, avoid header prefixes in the log messages") - flagset.BoolVar(&logging.oneOutput, "one_output", logging.oneOutput, "If true, only write logs to their native severity level (vs also writing to each lower severity level; no effect when -logtostderr=true)") - flagset.BoolVar(&logging.skipLogHeaders, "skip_log_headers", logging.skipLogHeaders, "If true, avoid headers when opening log files (no effect when -logtostderr=true)") - flagset.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr when writing to files and stderr (no effect when -logtostderr=true or -alsologtostderr=false)") - 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") + commandLine.VisitAll(func(f *flag.Flag) { + flagset.Var(f.Value, f.Name, f.Usage) + }) } // Flush flushes all pending log I/O. @@ -550,12 +552,6 @@ type loggingT struct { vmap map[uintptr]Level } -var logging = loggingT{ - settings: settings{ - contextualLoggingEnabled: true, - }, -} - // setVState sets a consistent state for V logging. // l.mu is held. func (l *loggingT) setVState(verbosity Level, filter []modulePat, setFilter bool) { @@ -633,8 +629,11 @@ It returns a buffer containing the formatted header and the user's file and line The depth specifies how many stack frames above lives the source line to be identified in the log message. Log lines have this form: + Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg... + where the fields are defined as follows: + L A single character, representing the log level (eg 'I' for INFO) mm The month (zero padded; ie May is '05') dd The day (zero padded) @@ -1298,9 +1297,13 @@ func newVerbose(level Level, b bool) Verbose { // The returned value is a struct 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 klog.V(2).Enabled() { klog.Info("log this") } +// // or +// // klog.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. // @@ -1582,10 +1585,10 @@ func ErrorSDepth(depth int, err error, msg string, keysAndValues ...interface{}) // // Callers who want more control over handling of fatal events may instead use a // combination of different functions: -// - some info or error logging function, optionally with a stack trace -// value generated by github.com/go-logr/lib/dbg.Backtrace -// - Flush to flush pending log data -// - panic, os.Exit or returning to the caller with an error +// - some info or error logging function, optionally with a stack trace +// value generated by github.com/go-logr/lib/dbg.Backtrace +// - Flush to flush pending log data +// - panic, os.Exit or returning to the caller with an error // // Arguments are handled in the manner of fmt.Print; a newline is appended if missing. func Fatal(args ...interface{}) { diff --git a/vendor/k8s.io/kube-openapi/pkg/common/common.go b/vendor/k8s.io/kube-openapi/pkg/common/common.go index c84ca7031..24f2b0e88 100644 --- a/vendor/k8s.io/kube-openapi/pkg/common/common.go +++ b/vendor/k8s.io/kube-openapi/pkg/common/common.go @@ -20,7 +20,7 @@ import ( "net/http" "strings" - "github.com/emicklei/go-restful" + "github.com/emicklei/go-restful/v3" "k8s.io/kube-openapi/pkg/openapiconv" "k8s.io/kube-openapi/pkg/spec3" diff --git a/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go b/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go index 35241fde6..bec0e7809 100644 --- a/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go +++ b/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go @@ -167,6 +167,20 @@ func (c *convert) makeRef(model proto.Schema, preserveUnknownFields bool) schema // reference a named type _, n := path.Split(r.Reference()) tr.NamedType = &n + + ext := model.GetExtensions() + if val, ok := ext["x-kubernetes-map-type"]; ok { + switch val { + case "atomic": + relationship := schema.Atomic + tr.ElementRelationship = &relationship + case "granular": + relationship := schema.Separable + tr.ElementRelationship = &relationship + default: + c.reportError("unknown map type %v", val) + } + } } else { // compute the type inline c2 := c.push("inlined in "+c.currentName, &tr.Inlined) diff --git a/vendor/k8s.io/kubectl/pkg/util/templates/templater.go b/vendor/k8s.io/kubectl/pkg/util/templates/templater.go index 3ef297c85..2e9f942a5 100644 --- a/vendor/k8s.io/kubectl/pkg/util/templates/templater.go +++ b/vendor/k8s.io/kubectl/pkg/util/templates/templater.go @@ -223,7 +223,7 @@ func flagsUsages(f *flag.FlagSet) (string, error) { flagBuf := new(bytes.Buffer) wrapLimit, err := term.GetWordWrapperLimit() if err != nil { - return "", err + wrapLimit = 0 } printer := NewHelpFlagPrinter(flagBuf, wrapLimit) diff --git a/vendor/k8s.io/utils/exec/exec.go b/vendor/k8s.io/utils/exec/exec.go index 96bec01ca..d9c91e3ca 100644 --- a/vendor/k8s.io/utils/exec/exec.go +++ b/vendor/k8s.io/utils/exec/exec.go @@ -19,6 +19,7 @@ package exec import ( "context" "io" + "io/fs" osexec "os/exec" "syscall" "time" @@ -98,17 +99,18 @@ func New() Interface { // Command is part of the Interface interface. func (executor *executor) Command(cmd string, args ...string) Cmd { - return (*cmdWrapper)(osexec.Command(cmd, args...)) + return (*cmdWrapper)(maskErrDotCmd(osexec.Command(cmd, args...))) } // CommandContext is part of the Interface interface. func (executor *executor) CommandContext(ctx context.Context, cmd string, args ...string) Cmd { - return (*cmdWrapper)(osexec.CommandContext(ctx, cmd, args...)) + return (*cmdWrapper)(maskErrDotCmd(osexec.CommandContext(ctx, cmd, args...))) } // LookPath is part of the Interface interface func (executor *executor) LookPath(file string) (string, error) { - return osexec.LookPath(file) + path, err := osexec.LookPath(file) + return path, handleError(maskErrDot(err)) } // Wraps exec.Cmd so we can capture errors. @@ -198,6 +200,8 @@ func handleError(err error) error { switch e := err.(type) { case *osexec.ExitError: return &ExitErrorWrapper{e} + case *fs.PathError: + return ErrExecutableNotFound case *osexec.Error: if e.Err == osexec.ErrNotFound { return ErrExecutableNotFound diff --git a/vendor/k8s.io/utils/exec/fixup_go118.go b/vendor/k8s.io/utils/exec/fixup_go118.go new file mode 100644 index 000000000..acf45f1cd --- /dev/null +++ b/vendor/k8s.io/utils/exec/fixup_go118.go @@ -0,0 +1,32 @@ +//go:build !go1.19 +// +build !go1.19 + +/* +Copyright 2022 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 exec + +import ( + osexec "os/exec" +) + +func maskErrDotCmd(cmd *osexec.Cmd) *osexec.Cmd { + return cmd +} + +func maskErrDot(err error) error { + return err +} diff --git a/vendor/k8s.io/utils/exec/fixup_go119.go b/vendor/k8s.io/utils/exec/fixup_go119.go new file mode 100644 index 000000000..55874c929 --- /dev/null +++ b/vendor/k8s.io/utils/exec/fixup_go119.go @@ -0,0 +1,40 @@ +//go:build go1.19 +// +build go1.19 + +/* +Copyright 2022 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 exec + +import ( + "errors" + osexec "os/exec" +) + +// maskErrDotCmd reverts the behavior of osexec.Cmd to what it was before go1.19 +// specifically set the Err field to nil (LookPath returns a new error when the file +// is resolved to the current directory. +func maskErrDotCmd(cmd *osexec.Cmd) *osexec.Cmd { + cmd.Err = maskErrDot(cmd.Err) + return cmd +} + +func maskErrDot(err error) error { + if err != nil && errors.Is(err, osexec.ErrDot) { + return nil + } + return err +} diff --git a/vendor/k8s.io/utils/pointer/pointer.go b/vendor/k8s.io/utils/pointer/pointer.go index f5802d2e8..638e27d41 100644 --- a/vendor/k8s.io/utils/pointer/pointer.go +++ b/vendor/k8s.io/utils/pointer/pointer.go @@ -52,6 +52,8 @@ func Int(i int) *int { return &i } +// IntPtr is a function variable referring to Int. +// Deprecated: Use Int instead. var IntPtr = Int // for back-compat // IntDeref dereferences the int ptr and returns it if not nil, or else @@ -63,6 +65,8 @@ func IntDeref(ptr *int, def int) int { return def } +// IntPtrDerefOr is a function variable referring to IntDeref. +// Deprecated: Use IntDeref instead. var IntPtrDerefOr = IntDeref // for back-compat // Int32 returns a pointer to an int32. @@ -70,6 +74,8 @@ func Int32(i int32) *int32 { return &i } +// Int32Ptr is a function variable referring to Int32. +// Deprecated: Use Int32 instead. var Int32Ptr = Int32 // for back-compat // Int32Deref dereferences the int32 ptr and returns it if not nil, or else @@ -81,6 +87,8 @@ func Int32Deref(ptr *int32, def int32) int32 { return def } +// Int32PtrDerefOr is a function variable referring to Int32Deref. +// Deprecated: Use Int32Deref instead. var Int32PtrDerefOr = Int32Deref // for back-compat // Int32Equal returns true if both arguments are nil or both arguments @@ -95,11 +103,69 @@ func Int32Equal(a, b *int32) bool { return *a == *b } +// Uint returns a pointer to an uint +func Uint(i uint) *uint { + return &i +} + +// UintPtr is a function variable referring to Uint. +// Deprecated: Use Uint instead. +var UintPtr = Uint // for back-compat + +// UintDeref dereferences the uint ptr and returns it if not nil, or else +// returns def. +func UintDeref(ptr *uint, def uint) uint { + if ptr != nil { + return *ptr + } + return def +} + +// UintPtrDerefOr is a function variable referring to UintDeref. +// Deprecated: Use UintDeref instead. +var UintPtrDerefOr = UintDeref // for back-compat + +// Uint32 returns a pointer to an uint32. +func Uint32(i uint32) *uint32 { + return &i +} + +// Uint32Ptr is a function variable referring to Uint32. +// Deprecated: Use Uint32 instead. +var Uint32Ptr = Uint32 // for back-compat + +// Uint32Deref dereferences the uint32 ptr and returns it if not nil, or else +// returns def. +func Uint32Deref(ptr *uint32, def uint32) uint32 { + if ptr != nil { + return *ptr + } + return def +} + +// Uint32PtrDerefOr is a function variable referring to Uint32Deref. +// Deprecated: Use Uint32Deref instead. +var Uint32PtrDerefOr = Uint32Deref // for back-compat + +// Uint32Equal returns true if both arguments are nil or both arguments +// dereference to the same value. +func Uint32Equal(a, b *uint32) bool { + if (a == nil) != (b == nil) { + return false + } + if a == nil { + return true + } + return *a == *b +} + // Int64 returns a pointer to an int64. func Int64(i int64) *int64 { return &i } +// Int64Ptr is a function variable referring to Int64. +// Deprecated: Use Int64 instead. var Int64Ptr = Int64 // for back-compat // Int64Deref dereferences the int64 ptr and returns it if not nil, or else @@ -111,6 +177,8 @@ func Int64Deref(ptr *int64, def int64) int64 { return def } +// Int64PtrDerefOr is a function variable referring to Int64Deref. +// Deprecated: Use Int64Deref instead. var Int64PtrDerefOr = Int64Deref // for back-compat // Int64Equal returns true if both arguments are nil or both arguments @@ -125,11 +193,47 @@ func Int64Equal(a, b *int64) bool { return *a == *b } +// Uint64 returns a pointer to an uint64. +func Uint64(i uint64) *uint64 { + return &i +} + +// Uint64Ptr is a function variable referring to Uint64. +// Deprecated: Use Uint64 instead. +var Uint64Ptr = Uint64 // for back-compat + +// Uint64Deref dereferences the uint64 ptr and returns it if not nil, or else +// returns def. +func Uint64Deref(ptr *uint64, def uint64) uint64 { + if ptr != nil { + return *ptr + } + return def +} + +// Uint64PtrDerefOr is a function variable referring to Uint64Deref. +// Deprecated: Use Uint64Deref instead. +var Uint64PtrDerefOr = Uint64Deref // for back-compat + +// Uint64Equal returns true if both arguments are nil or both arguments +// dereference to the same value. +func Uint64Equal(a, b *uint64) bool { + if (a == nil) != (b == nil) { + return false + } + if a == nil { + return true + } + return *a == *b +} + // Bool returns a pointer to a bool. func Bool(b bool) *bool { return &b } +// BoolPtr is a function variable referring to Bool. +// Deprecated: Use Bool instead. var BoolPtr = Bool // for back-compat // BoolDeref dereferences the bool ptr and returns it if not nil, or else @@ -141,6 +245,8 @@ func BoolDeref(ptr *bool, def bool) bool { return def } +// BoolPtrDerefOr is a function variable referring to BoolDeref. +// Deprecated: Use BoolDeref instead. var BoolPtrDerefOr = BoolDeref // for back-compat // BoolEqual returns true if both arguments are nil or both arguments @@ -160,6 +266,8 @@ func String(s string) *string { return &s } +// StringPtr is a function variable referring to String. +// Deprecated: Use String instead. var StringPtr = String // for back-compat // StringDeref dereferences the string ptr and returns it if not nil, or else @@ -171,6 +279,8 @@ func StringDeref(ptr *string, def string) string { return def } +// StringPtrDerefOr is a function variable referring to StringDeref. +// Deprecated: Use StringDeref instead. var StringPtrDerefOr = StringDeref // for back-compat // StringEqual returns true if both arguments are nil or both arguments @@ -190,6 +300,8 @@ func Float32(i float32) *float32 { return &i } +// Float32Ptr is a function variable referring to Float32. +// Deprecated: Use Float32 instead. var Float32Ptr = Float32 // Float32Deref dereferences the float32 ptr and returns it if not nil, or else @@ -201,6 +313,8 @@ func Float32Deref(ptr *float32, def float32) float32 { return def } +// Float32PtrDerefOr is a function variable referring to Float32Deref. +// Deprecated: Use Float32Deref instead. var Float32PtrDerefOr = Float32Deref // for back-compat // Float32Equal returns true if both arguments are nil or both arguments @@ -220,6 +334,8 @@ func Float64(i float64) *float64 { return &i } +// Float64Ptr is a function variable referring to Float64. +// Deprecated: Use Float64 instead. var Float64Ptr = Float64 // Float64Deref dereferences the float64 ptr and returns it if not nil, or else @@ -231,6 +347,8 @@ func Float64Deref(ptr *float64, def float64) float64 { return def } +// Float64PtrDerefOr is a function variable referring to Float64Deref. +// Deprecated: Use Float64Deref instead. var Float64PtrDerefOr = Float64Deref // for back-compat // Float64Equal returns true if both arguments are nil or both arguments diff --git a/vendor/modules.txt b/vendor/modules.txt index 26add7a86..40dc9a983 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,5 +1,5 @@ -# cloud.google.com/go v0.99.0 -## explicit; go 1.11 +# cloud.google.com/go/compute v1.9.0 +## explicit; go 1.17 cloud.google.com/go/compute/metadata # github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 ## explicit; go 1.16 @@ -8,11 +8,11 @@ github.com/Azure/go-ansiterm/winterm # github.com/Azure/go-autorest v14.2.0+incompatible ## explicit github.com/Azure/go-autorest -# github.com/Azure/go-autorest/autorest v0.11.20 +# github.com/Azure/go-autorest/autorest v0.11.28 ## explicit; go 1.15 github.com/Azure/go-autorest/autorest github.com/Azure/go-autorest/autorest/azure -# github.com/Azure/go-autorest/autorest/adal v0.9.15 +# github.com/Azure/go-autorest/autorest/adal v0.9.21 ## explicit; go 1.15 github.com/Azure/go-autorest/autorest/adal # github.com/Azure/go-autorest/autorest/date v0.3.0 @@ -71,17 +71,11 @@ github.com/Microsoft/hcsshim/internal/vmcompute github.com/Microsoft/hcsshim/internal/wclayer github.com/Microsoft/hcsshim/internal/winapi github.com/Microsoft/hcsshim/osversion -# github.com/PuerkitoBio/purell v1.1.1 -## explicit -github.com/PuerkitoBio/purell -# github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 -## explicit -github.com/PuerkitoBio/urlesc # github.com/adrg/xdg v0.4.0 ## explicit; go 1.14 github.com/adrg/xdg github.com/adrg/xdg/internal/pathutil -# github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e +# github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed ## explicit; go 1.16 github.com/antlr/antlr4/runtime/Go/antlr # github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 @@ -172,11 +166,12 @@ github.com/containerd/stargz-snapshotter/estargz/errorutil # github.com/containerd/ttrpc v1.1.0 ## explicit; go 1.13 github.com/containerd/ttrpc -# github.com/csi-addons/spec v0.1.2-0.20211220115741-32fa508dadbe +# github.com/csi-addons/spec v0.1.2-0.20221101132540-98eff76b0ff8 ## explicit github.com/csi-addons/spec/lib/go/fence github.com/csi-addons/spec/lib/go/identity github.com/csi-addons/spec/lib/go/reclaimspace +github.com/csi-addons/spec/lib/go/replication # github.com/cyphar/filepath-securejoin v0.2.3 ## explicit; go 1.13 github.com/cyphar/filepath-securejoin @@ -238,13 +233,16 @@ github.com/docker/go-metrics # github.com/docker/go-units v0.4.0 ## explicit github.com/docker/go-units -# github.com/emicklei/go-restful v2.9.5+incompatible -## explicit -github.com/emicklei/go-restful -github.com/emicklei/go-restful/log -# github.com/evanphx/json-patch v4.12.0+incompatible +# github.com/emicklei/go-restful/v3 v3.9.0 +## explicit; go 1.13 +github.com/emicklei/go-restful/v3 +github.com/emicklei/go-restful/v3/log +# github.com/evanphx/json-patch v5.6.0+incompatible ## explicit github.com/evanphx/json-patch +# github.com/evanphx/json-patch/v5 v5.6.0 +## explicit; go 1.12 +github.com/evanphx/json-patch/v5 # github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d ## explicit github.com/exponent-io/jsonpath @@ -257,8 +255,8 @@ github.com/fatih/structtag # github.com/felixge/httpsnoop v1.0.1 ## explicit; go 1.13 github.com/felixge/httpsnoop -# github.com/fsnotify/fsnotify v1.5.1 -## explicit; go 1.13 +# github.com/fsnotify/fsnotify v1.5.4 +## explicit; go 1.16 github.com/fsnotify/fsnotify # github.com/ghodss/yaml v1.0.0 ## explicit @@ -286,17 +284,20 @@ github.com/go-gorp/gorp/v3 # github.com/go-logr/logr v1.2.3 ## explicit; go 1.16 github.com/go-logr/logr -# github.com/go-logr/zapr v1.2.0 +github.com/go-logr/logr/funcr +github.com/go-logr/logr/testr +# github.com/go-logr/zapr v1.2.3 ## explicit; go 1.16 github.com/go-logr/zapr # github.com/go-openapi/jsonpointer v0.19.5 ## explicit; go 1.13 github.com/go-openapi/jsonpointer -# github.com/go-openapi/jsonreference v0.19.5 +# github.com/go-openapi/jsonreference v0.20.0 ## explicit; go 1.13 github.com/go-openapi/jsonreference -# github.com/go-openapi/swag v0.19.14 -## explicit; go 1.11 +github.com/go-openapi/jsonreference/internal +# github.com/go-openapi/swag v0.22.3 +## explicit; go 1.18 github.com/go-openapi/swag # github.com/gobuffalo/envy v1.7.1 ## explicit; go 1.13 @@ -321,8 +322,8 @@ github.com/gogo/protobuf/proto github.com/gogo/protobuf/protoc-gen-gogo/descriptor github.com/gogo/protobuf/sortkeys github.com/gogo/protobuf/types -# github.com/golang-jwt/jwt/v4 v4.0.0 -## explicit; go 1.15 +# github.com/golang-jwt/jwt/v4 v4.4.2 +## explicit; go 1.16 github.com/golang-jwt/jwt/v4 # github.com/golang-migrate/migrate/v4 v4.6.2 ## explicit @@ -345,8 +346,8 @@ github.com/golang/protobuf/ptypes/wrappers # github.com/google/btree v1.0.1 ## explicit; go 1.12 github.com/google/btree -# github.com/google/cel-go v0.10.1 -## explicit; go 1.16 +# github.com/google/cel-go v0.12.4 +## explicit; go 1.17 github.com/google/cel-go/cel github.com/google/cel-go/checker github.com/google/cel-go/checker/decls @@ -375,7 +376,7 @@ github.com/google/certificate-transparency-go/jsonclient github.com/google/certificate-transparency-go/tls github.com/google/certificate-transparency-go/x509 github.com/google/certificate-transparency-go/x509/pkix -# github.com/google/gnostic v0.5.7-v3refs +# github.com/google/gnostic v0.6.9 ## explicit; go 1.12 github.com/google/gnostic/compiler github.com/google/gnostic/extensions @@ -424,7 +425,7 @@ github.com/google/gofuzz/bytesource # github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 ## explicit; go 1.13 github.com/google/shlex -# github.com/google/uuid v1.2.0 +# github.com/google/uuid v1.3.0 ## explicit github.com/google/uuid # github.com/gorilla/mux v1.8.0 @@ -438,7 +439,6 @@ github.com/gosuri/uitable/util/wordwrap # github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 ## explicit github.com/gregjones/httpcache -github.com/gregjones/httpcache/diskcache # github.com/grpc-ecosystem/grpc-gateway v1.16.0 ## explicit; go 1.14 github.com/grpc-ecosystem/grpc-gateway/internal @@ -471,7 +471,7 @@ github.com/huandu/xstrings # github.com/iancoleman/strcase v0.2.0 ## explicit; go 1.16 github.com/iancoleman/strcase -# github.com/imdario/mergo v0.3.12 +# github.com/imdario/mergo v0.3.13 ## explicit; go 1.13 github.com/imdario/mergo # github.com/inconshreveable/mousetrap v1.0.0 @@ -531,7 +531,7 @@ github.com/liggitt/tabwriter # github.com/magiconair/properties v1.8.5 ## explicit; go 1.13 github.com/magiconair/properties -# github.com/mailru/easyjson v0.7.6 +# github.com/mailru/easyjson v0.7.7 ## explicit; go 1.12 github.com/mailru/easyjson/buffer github.com/mailru/easyjson/jlexer @@ -627,7 +627,7 @@ github.com/onsi/ginkgo/reporters/stenographer github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty github.com/onsi/ginkgo/types -# github.com/onsi/gomega v1.20.0 +# github.com/onsi/gomega v1.20.2 ## explicit; go 1.18 github.com/onsi/gomega github.com/onsi/gomega/format @@ -647,7 +647,7 @@ github.com/opencontainers/go-digest ## explicit github.com/opencontainers/image-spec/specs-go github.com/opencontainers/image-spec/specs-go/v1 -# github.com/operator-framework/api v0.15.0 +# github.com/operator-framework/api v0.15.1-0.20220624132056-decf74800a17 ## explicit; go 1.17 github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3 github.com/operator-framework/api/pkg/constraints @@ -704,7 +704,7 @@ github.com/operator-framework/operator-registry/pkg/lib/validation github.com/operator-framework/operator-registry/pkg/registry github.com/operator-framework/operator-registry/pkg/sqlite github.com/operator-framework/operator-registry/pkg/sqlite/migrations -# github.com/operator-framework/operator-sdk v1.22.2 +# github.com/operator-framework/operator-sdk v1.23.0 ## explicit; go 1.18 github.com/operator-framework/operator-sdk/cmd/operator-sdk github.com/operator-framework/operator-sdk/internal/annotations/metrics @@ -796,8 +796,8 @@ github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 ## explicit github.com/pmezard/go-difflib/difflib -# github.com/prometheus/client_golang v1.12.1 -## explicit; go 1.13 +# github.com/prometheus/client_golang v1.13.0 +## explicit; go 1.17 github.com/prometheus/client_golang/prometheus github.com/prometheus/client_golang/prometheus/collectors github.com/prometheus/client_golang/prometheus/internal @@ -805,13 +805,13 @@ github.com/prometheus/client_golang/prometheus/promhttp # github.com/prometheus/client_model v0.2.0 ## explicit; go 1.9 github.com/prometheus/client_model/go -# github.com/prometheus/common v0.32.1 -## explicit; go 1.13 +# github.com/prometheus/common v0.37.0 +## explicit; go 1.16 github.com/prometheus/common/expfmt github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg github.com/prometheus/common/model -# github.com/prometheus/procfs v0.7.3 -## explicit; go 1.13 +# github.com/prometheus/procfs v0.8.0 +## explicit; go 1.17 github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/util @@ -888,8 +888,8 @@ github.com/xeipuuv/gojsonreference # github.com/xeipuuv/gojsonschema v1.2.0 ## explicit github.com/xeipuuv/gojsonschema -# github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca -## explicit +# github.com/xlab/treeprint v1.1.0 +## explicit; go 1.13 github.com/xlab/treeprint # github.com/zmap/zcrypto v0.0.0-20200911161511-43ff0ea04f21 ## explicit; go 1.13 @@ -993,21 +993,22 @@ go.starlark.net/resolve go.starlark.net/starlark go.starlark.net/starlarkstruct go.starlark.net/syntax -# go.uber.org/atomic v1.7.0 -## explicit; go 1.13 +# go.uber.org/atomic v1.10.0 +## explicit; go 1.18 go.uber.org/atomic -# go.uber.org/multierr v1.6.0 -## explicit; go 1.12 +# go.uber.org/multierr v1.8.0 +## explicit; go 1.14 go.uber.org/multierr -# go.uber.org/zap v1.19.1 -## explicit; go 1.13 +# go.uber.org/zap v1.23.0 +## explicit; go 1.18 go.uber.org/zap go.uber.org/zap/buffer +go.uber.org/zap/internal go.uber.org/zap/internal/bufferpool go.uber.org/zap/internal/color go.uber.org/zap/internal/exit go.uber.org/zap/zapcore -# golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 +# golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 ## explicit; go 1.17 golang.org/x/crypto/bcrypt golang.org/x/crypto/blowfish @@ -1033,7 +1034,7 @@ golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile golang.org/x/mod/module golang.org/x/mod/semver -# golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 +# golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b ## explicit; go 1.17 golang.org/x/net/context golang.org/x/net/context/ctxhttp @@ -1048,8 +1049,8 @@ golang.org/x/net/internal/socks golang.org/x/net/internal/timeseries golang.org/x/net/proxy golang.org/x/net/trace -# golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 -## explicit; go 1.11 +# golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 +## explicit; go 1.17 golang.org/x/oauth2 golang.org/x/oauth2/authhandler golang.org/x/oauth2/google @@ -1057,18 +1058,18 @@ golang.org/x/oauth2/google/internal/externalaccount golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt -# golang.org/x/sync v0.0.0-20210220032951-036812b2e83c +# golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 ## explicit golang.org/x/sync/errgroup golang.org/x/sync/semaphore -# golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 +# golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 ## explicit; go 1.17 golang.org/x/sys/execabs golang.org/x/sys/internal/unsafeheader golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 +# golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 ## explicit; go 1.17 golang.org/x/term # golang.org/x/text v0.3.7 @@ -1096,15 +1097,16 @@ golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm golang.org/x/text/width -# golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 +# golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 ## explicit golang.org/x/time/rate -# golang.org/x/tools v0.1.11 -## explicit; go 1.17 +# golang.org/x/tools v0.1.12 +## explicit; go 1.18 golang.org/x/tools/go/ast/astutil golang.org/x/tools/go/gcexportdata golang.org/x/tools/go/internal/gcimporter golang.org/x/tools/go/internal/packagesdriver +golang.org/x/tools/go/internal/pkgbits golang.org/x/tools/go/packages golang.org/x/tools/imports golang.org/x/tools/internal/event @@ -1133,14 +1135,14 @@ google.golang.org/appengine/internal/modules google.golang.org/appengine/internal/remote_api google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/urlfetch -# google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac -## explicit; go 1.15 +# google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf +## explicit; go 1.19 google.golang.org/genproto/googleapis/api/expr/v1alpha1 google.golang.org/genproto/googleapis/api/httpbody google.golang.org/genproto/googleapis/rpc/status google.golang.org/genproto/protobuf/field_mask -# google.golang.org/grpc v1.48.0 -## explicit; go 1.14 +# google.golang.org/grpc v1.49.0 +## explicit; go 1.17 google.golang.org/grpc google.golang.org/grpc/attributes google.golang.org/grpc/backoff @@ -1190,8 +1192,14 @@ google.golang.org/grpc/serviceconfig google.golang.org/grpc/stats google.golang.org/grpc/status google.golang.org/grpc/tap -# google.golang.org/protobuf v1.28.0 +# google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 +## explicit; go 1.9 +google.golang.org/grpc/cmd/protoc-gen-go-grpc +# google.golang.org/protobuf v1.28.1 ## explicit; go 1.11 +google.golang.org/protobuf/cmd/protoc-gen-go +google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo +google.golang.org/protobuf/compiler/protogen google.golang.org/protobuf/encoding/protojson google.golang.org/protobuf/encoding/prototext google.golang.org/protobuf/encoding/protowire @@ -1229,6 +1237,7 @@ google.golang.org/protobuf/types/known/fieldmaskpb google.golang.org/protobuf/types/known/structpb google.golang.org/protobuf/types/known/timestamppb google.golang.org/protobuf/types/known/wrapperspb +google.golang.org/protobuf/types/pluginpb # gopkg.in/inf.v0 v0.9.1 ## explicit gopkg.in/inf.v0 @@ -1285,8 +1294,8 @@ helm.sh/helm/v3/pkg/storage helm.sh/helm/v3/pkg/storage/driver helm.sh/helm/v3/pkg/time helm.sh/helm/v3/pkg/uploader -# k8s.io/api v0.24.3 -## explicit; go 1.16 +# k8s.io/api v0.25.0 +## explicit; go 1.19 k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 k8s.io/api/admissionregistration/v1 @@ -1320,6 +1329,7 @@ k8s.io/api/flowcontrol/v1beta1 k8s.io/api/flowcontrol/v1beta2 k8s.io/api/imagepolicy/v1alpha1 k8s.io/api/networking/v1 +k8s.io/api/networking/v1alpha1 k8s.io/api/networking/v1beta1 k8s.io/api/node/v1 k8s.io/api/node/v1alpha1 @@ -1335,8 +1345,8 @@ k8s.io/api/scheduling/v1beta1 k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 -# k8s.io/apiextensions-apiserver v0.24.2 -## explicit; go 1.16 +# k8s.io/apiextensions-apiserver v0.25.0 +## explicit; go 1.19 k8s.io/apiextensions-apiserver/pkg/apihelpers k8s.io/apiextensions-apiserver/pkg/apis/apiextensions k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install @@ -1346,6 +1356,7 @@ k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation k8s.io/apiextensions-apiserver/pkg/apiserver/schema k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/library +k8s.io/apiextensions-apiserver/pkg/apiserver/schema/cel/metrics k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning @@ -1355,8 +1366,8 @@ k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1 k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1 k8s.io/apiextensions-apiserver/third_party/forked/celopenapi/model -# k8s.io/apimachinery v0.24.3 -## explicit; go 1.16 +# k8s.io/apimachinery v0.25.0 +## explicit; go 1.19 k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/errors k8s.io/apimachinery/pkg/api/meta @@ -1413,8 +1424,8 @@ k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json k8s.io/apimachinery/third_party/forked/golang/netutil k8s.io/apimachinery/third_party/forked/golang/reflect -# k8s.io/apiserver v0.24.2 -## explicit; go 1.16 +# k8s.io/apiserver v0.25.0 +## explicit; go 1.19 k8s.io/apiserver/pkg/apis/apiserver k8s.io/apiserver/pkg/apis/apiserver/install k8s.io/apiserver/pkg/apis/apiserver/v1 @@ -1433,13 +1444,13 @@ k8s.io/apiserver/pkg/server/egressselector/metrics k8s.io/apiserver/pkg/util/feature k8s.io/apiserver/pkg/util/webhook k8s.io/apiserver/pkg/util/x509metrics -# k8s.io/cli-runtime v0.24.0 +# k8s.io/cli-runtime v0.24.1 ## explicit; go 1.16 k8s.io/cli-runtime/pkg/genericclioptions k8s.io/cli-runtime/pkg/printers k8s.io/cli-runtime/pkg/resource -# k8s.io/client-go v0.24.3 -## explicit; go 1.16 +# k8s.io/client-go v0.25.0 +## explicit; go 1.19 k8s.io/client-go/applyconfigurations/admissionregistration/v1 k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1 k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1 @@ -1468,6 +1479,7 @@ k8s.io/client-go/applyconfigurations/flowcontrol/v1beta2 k8s.io/client-go/applyconfigurations/internal k8s.io/client-go/applyconfigurations/meta/v1 k8s.io/client-go/applyconfigurations/networking/v1 +k8s.io/client-go/applyconfigurations/networking/v1alpha1 k8s.io/client-go/applyconfigurations/networking/v1beta1 k8s.io/client-go/applyconfigurations/node/v1 k8s.io/client-go/applyconfigurations/node/v1alpha1 @@ -1518,6 +1530,7 @@ k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1 k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1 k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta2 k8s.io/client-go/kubernetes/typed/networking/v1 +k8s.io/client-go/kubernetes/typed/networking/v1alpha1 k8s.io/client-go/kubernetes/typed/networking/v1beta1 k8s.io/client-go/kubernetes/typed/node/v1 k8s.io/client-go/kubernetes/typed/node/v1alpha1 @@ -1558,6 +1571,7 @@ k8s.io/client-go/scale/scheme/appsv1beta2 k8s.io/client-go/scale/scheme/autoscalingv1 k8s.io/client-go/scale/scheme/extensionsint k8s.io/client-go/scale/scheme/extensionsv1beta1 +k8s.io/client-go/testing k8s.io/client-go/third_party/forked/golang/template k8s.io/client-go/tools/auth k8s.io/client-go/tools/cache @@ -1585,16 +1599,18 @@ k8s.io/client-go/util/jsonpath k8s.io/client-go/util/keyutil k8s.io/client-go/util/retry k8s.io/client-go/util/workqueue -# k8s.io/component-base v0.24.2 -## explicit; go 1.16 +# k8s.io/component-base v0.25.0 +## explicit; go 1.19 k8s.io/component-base/config k8s.io/component-base/config/v1alpha1 k8s.io/component-base/featuregate k8s.io/component-base/metrics k8s.io/component-base/metrics/legacyregistry -k8s.io/component-base/traces +k8s.io/component-base/metrics/prometheusextension +k8s.io/component-base/tracing +k8s.io/component-base/tracing/api/v1 k8s.io/component-base/version -# k8s.io/klog/v2 v2.70.1 +# k8s.io/klog/v2 v2.80.1 ## explicit; go 1.13 k8s.io/klog/v2 k8s.io/klog/v2/internal/buffer @@ -1602,8 +1618,8 @@ k8s.io/klog/v2/internal/clock k8s.io/klog/v2/internal/dbg k8s.io/klog/v2/internal/serialize k8s.io/klog/v2/internal/severity -# k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661 -## explicit; go 1.16 +# k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea +## explicit; go 1.18 k8s.io/kube-openapi/pkg/builder3/util k8s.io/kube-openapi/pkg/common k8s.io/kube-openapi/pkg/handler3 @@ -1619,7 +1635,7 @@ k8s.io/kube-openapi/pkg/validation/spec k8s.io/kube-openapi/pkg/validation/strfmt k8s.io/kube-openapi/pkg/validation/strfmt/bson k8s.io/kube-openapi/pkg/validation/validate -# k8s.io/kubectl v0.24.0 +# k8s.io/kubectl v0.24.1 ## explicit; go 1.16 k8s.io/kubectl/pkg/cmd/util k8s.io/kubectl/pkg/scheme @@ -1632,7 +1648,7 @@ k8s.io/kubectl/pkg/util/slice k8s.io/kubectl/pkg/util/templates k8s.io/kubectl/pkg/util/term k8s.io/kubectl/pkg/validation -# k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 +# k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73 ## explicit; go 1.12 k8s.io/utils/buffer k8s.io/utils/clock @@ -1663,11 +1679,11 @@ oras.land/oras-go/pkg/registry/remote/internal/syncutil oras.land/oras-go/pkg/target # rsc.io/letsencrypt v0.0.3 ## explicit -# sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 +# sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.32 ## explicit; go 1.17 sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client sigs.k8s.io/apiserver-network-proxy/konnectivity-client/proto/client -# sigs.k8s.io/controller-runtime v0.12.3 +# sigs.k8s.io/controller-runtime v0.13.0 ## explicit; go 1.17 sigs.k8s.io/controller-runtime sigs.k8s.io/controller-runtime/pkg/builder @@ -1678,6 +1694,7 @@ sigs.k8s.io/controller-runtime/pkg/certwatcher/metrics sigs.k8s.io/controller-runtime/pkg/client sigs.k8s.io/controller-runtime/pkg/client/apiutil sigs.k8s.io/controller-runtime/pkg/client/config +sigs.k8s.io/controller-runtime/pkg/client/fake sigs.k8s.io/controller-runtime/pkg/cluster sigs.k8s.io/controller-runtime/pkg/config sigs.k8s.io/controller-runtime/pkg/config/v1alpha1 @@ -1742,11 +1759,11 @@ sigs.k8s.io/controller-tools/pkg/schemapatcher sigs.k8s.io/controller-tools/pkg/schemapatcher/internal/yaml sigs.k8s.io/controller-tools/pkg/version sigs.k8s.io/controller-tools/pkg/webhook -# sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 -## explicit; go 1.17 +# sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 +## explicit; go 1.18 sigs.k8s.io/json sigs.k8s.io/json/internal/golang/encoding/json -# sigs.k8s.io/kubebuilder/v3 v3.3.0 +# sigs.k8s.io/kubebuilder/v3 v3.6.0 ## explicit; go 1.17 sigs.k8s.io/kubebuilder/v3/pkg/cli sigs.k8s.io/kubebuilder/v3/pkg/cli/alpha/config-gen @@ -1760,6 +1777,7 @@ sigs.k8s.io/kubebuilder/v3/pkg/machinery sigs.k8s.io/kubebuilder/v3/pkg/model/resource sigs.k8s.io/kubebuilder/v3/pkg/model/stage sigs.k8s.io/kubebuilder/v3/pkg/plugin +sigs.k8s.io/kubebuilder/v3/pkg/plugin/external sigs.k8s.io/kubebuilder/v3/pkg/plugin/util sigs.k8s.io/kubebuilder/v3/pkg/plugins sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1 @@ -1773,9 +1791,27 @@ sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/te sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/rbac sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/samples sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/webhook +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/patches +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/prometheus +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/samples +sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook +sigs.k8s.io/kubebuilder/v3/pkg/plugins/external sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1 -sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates +sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds +sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates +sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1 +sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds +sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/api +sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/config/samples +sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/controllers sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2 sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates @@ -1797,8 +1833,11 @@ sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/api sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/hack -# sigs.k8s.io/kustomize/api v0.11.5 -## explicit; go 1.16 +sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha +sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds +sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates +# sigs.k8s.io/kustomize/api v0.12.1 +## explicit; go 1.18 sigs.k8s.io/kustomize/api/filters/annotations sigs.k8s.io/kustomize/api/filters/fieldspec sigs.k8s.io/kustomize/api/filters/filtersutil @@ -1843,8 +1882,8 @@ sigs.k8s.io/kustomize/api/provider sigs.k8s.io/kustomize/api/resmap sigs.k8s.io/kustomize/api/resource sigs.k8s.io/kustomize/api/types -# sigs.k8s.io/kustomize/cmd/config v0.10.7 -## explicit; go 1.16 +# sigs.k8s.io/kustomize/cmd/config v0.10.9 +## explicit; go 1.18 sigs.k8s.io/kustomize/cmd/config/completion sigs.k8s.io/kustomize/cmd/config/configcobra sigs.k8s.io/kustomize/cmd/config/ext @@ -1854,8 +1893,8 @@ sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/commands sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/tutorials sigs.k8s.io/kustomize/cmd/config/runner -# sigs.k8s.io/kustomize/kustomize/v4 v4.5.5 -## explicit; go 1.16 +# sigs.k8s.io/kustomize/kustomize/v4 v4.5.7 +## explicit; go 1.18 sigs.k8s.io/kustomize/kustomize/v4 sigs.k8s.io/kustomize/kustomize/v4/commands sigs.k8s.io/kustomize/kustomize/v4/commands/build @@ -1872,8 +1911,8 @@ sigs.k8s.io/kustomize/kustomize/v4/commands/openapi sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/fetch sigs.k8s.io/kustomize/kustomize/v4/commands/openapi/info sigs.k8s.io/kustomize/kustomize/v4/commands/version -# sigs.k8s.io/kustomize/kyaml v0.13.7 -## explicit; go 1.16 +# sigs.k8s.io/kustomize/kyaml v0.13.9 +## explicit; go 1.18 sigs.k8s.io/kustomize/kyaml/comments sigs.k8s.io/kustomize/kyaml/errors sigs.k8s.io/kustomize/kyaml/ext @@ -1916,7 +1955,7 @@ sigs.k8s.io/kustomize/kyaml/yaml/merge2 sigs.k8s.io/kustomize/kyaml/yaml/merge3 sigs.k8s.io/kustomize/kyaml/yaml/schema sigs.k8s.io/kustomize/kyaml/yaml/walk -# sigs.k8s.io/structured-merge-diff/v4 v4.2.1 +# sigs.k8s.io/structured-merge-diff/v4 v4.2.3 ## explicit; go 1.13 sigs.k8s.io/structured-merge-diff/v4/fieldpath sigs.k8s.io/structured-merge-diff/v4/schema diff --git a/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go b/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go index a3e17cb10..c191649a8 100644 --- a/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go +++ b/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go @@ -35,7 +35,7 @@ import ( type Tunnel interface { // Dial connects to the address on the named network, similar to // what net.Dial does. The only supported protocol is tcp. - DialContext(ctx context.Context, protocol, address string) (net.Conn, error) + DialContext(requestCtx context.Context, protocol, address string) (net.Conn, error) } type dialResult struct { @@ -73,15 +73,27 @@ var _ clientConn = &grpc.ClientConn{} // gRPC based proxy service. // Currently, a single tunnel supports a single connection, and the tunnel is closed when the connection is terminated // The Dial() method of the returned tunnel should only be called once -func CreateSingleUseGrpcTunnel(ctx context.Context, address string, opts ...grpc.DialOption) (Tunnel, error) { - c, err := grpc.DialContext(ctx, address, opts...) +// Deprecated 2022-06-07: use CreateSingleUseGrpcTunnelWithContext +func CreateSingleUseGrpcTunnel(tunnelCtx context.Context, address string, opts ...grpc.DialOption) (Tunnel, error) { + return CreateSingleUseGrpcTunnelWithContext(context.TODO(), tunnelCtx, address, opts...) +} + +// CreateSingleUseGrpcTunnelWithContext creates a Tunnel to dial to a remote server through a +// gRPC based proxy service. +// Currently, a single tunnel supports a single connection. +// The tunnel is normally closed when the connection is terminated. +// If createCtx is cancelled before tunnel creation, an error will be returned. +// If tunnelCtx is cancelled while the tunnel is still in use, the tunnel (and any in flight connections) will be closed. +// The Dial() method of the returned tunnel should only be called once +func CreateSingleUseGrpcTunnelWithContext(createCtx, tunnelCtx context.Context, address string, opts ...grpc.DialOption) (Tunnel, error) { + c, err := grpc.DialContext(createCtx, address, opts...) if err != nil { return nil, err } grpcClient := client.NewProxyServiceClient(c) - stream, err := grpcClient.Proxy(ctx) + stream, err := grpcClient.Proxy(tunnelCtx) if err != nil { c.Close() return nil, err @@ -94,13 +106,24 @@ func CreateSingleUseGrpcTunnel(ctx context.Context, address string, opts ...grpc readTimeoutSeconds: 10, } - go tunnel.serve(c) + go tunnel.serve(tunnelCtx, c) return tunnel, nil } -func (t *grpcTunnel) serve(c clientConn) { - defer c.Close() +func (t *grpcTunnel) serve(tunnelCtx context.Context, c clientConn) { + defer func() { + c.Close() + + // A connection in t.conns after serve() returns means + // we never received a CLOSE_RSP for it, so we need to + // close any channels remaining for these connections. + t.connsLock.Lock() + for _, conn := range t.conns { + close(conn.readCh) + } + t.connsLock.Unlock() + }() for { pkt, err := t.stream.Recv() @@ -141,6 +164,9 @@ func (t *grpcTunnel) serve(c clientConn) { // In either scenario, we should return here as this tunnel is no longer needed. klog.V(1).InfoS("Pending dial has been cancelled; dropped", "connectionID", resp.ConnectID, "dialID", resp.Random) return + case <-tunnelCtx.Done(): + klog.V(1).InfoS("Tunnel has been closed; dropped", "connectionID", resp.ConnectID, "dialID", resp.Random) + return } } @@ -164,6 +190,8 @@ func (t *grpcTunnel) serve(c clientConn) { case <-timer.C: klog.ErrorS(fmt.Errorf("timeout"), "readTimeout has been reached, the grpc connection to the proxy server will be closed", "connectionID", conn.connID, "readTimeoutSeconds", t.readTimeoutSeconds) return + case <-tunnelCtx.Done(): + klog.V(1).InfoS("Tunnel has been closed, the grpc connection to the proxy server will be closed", "connectionID", conn.connID) } } else { klog.V(1).InfoS("connection not recognized", "connectionID", resp.ConnectID) @@ -190,7 +218,7 @@ func (t *grpcTunnel) serve(c clientConn) { // Dial connects to the address on the named network, similar to // what net.Dial does. The only supported protocol is tcp. -func (t *grpcTunnel) DialContext(ctx context.Context, protocol, address string) (net.Conn, error) { +func (t *grpcTunnel) DialContext(requestCtx context.Context, protocol, address string) (net.Conn, error) { if protocol != "tcp" { return nil, errors.New("protocol not supported") } @@ -248,8 +276,8 @@ func (t *grpcTunnel) DialContext(ctx context.Context, protocol, address string) case <-time.After(30 * time.Second): klog.V(5).InfoS("Timed out waiting for DialResp", "dialID", random) return nil, errors.New("dial timeout, backstop") - case <-ctx.Done(): - klog.V(5).InfoS("Context canceled waiting for DialResp", "ctxErr", ctx.Err(), "dialID", random) + case <-requestCtx.Done(): + klog.V(5).InfoS("Context canceled waiting for DialResp", "ctxErr", requestCtx.Err(), "dialID", random) return nil, errors.New("dial timeout, context") } diff --git a/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/conn.go b/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/conn.go index cc6e66be2..822831b10 100644 --- a/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/conn.go +++ b/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/conn.go @@ -30,6 +30,8 @@ import ( // successful delivery of CLOSE_REQ. const CloseTimeout = 10 * time.Second +var errConnCloseTimeout = errors.New("close timeout") + // conn is an implementation of net.Conn, where the data is transported // over an established tunnel defined by a gRPC service ProxyService. type conn struct { @@ -151,5 +153,5 @@ func (c *conn) Close() error { case <-time.After(CloseTimeout): } - return errors.New("close timeout") + return errConnCloseTimeout } diff --git a/vendor/sigs.k8s.io/controller-runtime/.golangci.yml b/vendor/sigs.k8s.io/controller-runtime/.golangci.yml index 77f528ff0..7d1d3665c 100644 --- a/vendor/sigs.k8s.io/controller-runtime/.golangci.yml +++ b/vendor/sigs.k8s.io/controller-runtime/.golangci.yml @@ -12,7 +12,6 @@ linters: - goconst - gocritic - gocyclo - - godot - gofmt - goimports - goprintffuncname @@ -61,9 +60,9 @@ linters-settings: - pkg: sigs.k8s.io/controller-runtime alias: ctrl staticcheck: - go: "1.18" + go: "1.19" stylecheck: - go: "1.18" + go: "1.19" depguard: include-go-root: true packages: @@ -132,6 +131,9 @@ issues: - linters: - gosec text: "G304: Potential file inclusion via variable" + - linters: + - revive + text: "package-comments: should have a package comment" run: timeout: 10m diff --git a/vendor/sigs.k8s.io/controller-runtime/RELEASE.md b/vendor/sigs.k8s.io/controller-runtime/RELEASE.md new file mode 100644 index 000000000..134a73a31 --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/RELEASE.md @@ -0,0 +1,47 @@ +# Release Process + +The Kubernetes controller-runtime Project is released on an as-needed basis. The process is as follows: + +**Note:** Releases are done from the `release-MAJOR.MINOR` branches. For PATCH releases is not required +to create a new branch you will just need to ensure that all big fixes are cherry-picked into the respective +`release-MAJOR.MINOR` branch. To know more about versioning check https://semver.org/. + +## How to do a release + +### Create the new branch and the release tag + +1. Create a new branch `git checkout -b release-` from master +2. Push the new branch to the remote repository + +### Now, let's generate the changelog + +1. Create the changelog from the new branch `release-` (`git checkout release-`). +You will need to use the [kubebuilder-release-tools][kubebuilder-release-tools] to generate the notes. See [here][release-notes-generation] + +> **Note** +> - You will need to have checkout locally from the remote repository the previous branch +> - Also, ensure that you fetch all tags from the remote `git fetch --all --tags` + +### Draft a new release from GitHub + +1. Create a new tag with the correct version from the new `release-` branch +2. Add the changelog on it and publish. Now, the code source is released ! + +### Add a new Prow test the for the new branch release + +1. Create a new prow test under [github.com/kubernetes/test-infra/tree/master/config/jobs/kubernetes-sigs/controller-runtime](https://github.com/kubernetes/test-infra/tree/master/config/jobs/kubernetes-sigs/controller-runtime) +for the new `release-` branch. (i.e. for the `0.11.0` release see the PR: https://github.com/kubernetes/test-infra/pull/25205) +2. Ping the infra PR in the controller-runtime slack channel for reviews. + +### Announce the new release: + +1. Publish on the Slack channel the new release, i.e: + +```` +:announce: Controller-Runtime v0.12.0 has been released! +This release includes a Kubernetes dependency bump to v1.24. +For more info, see the release page: https://github.com/kubernetes-sigs/controller-runtime/releases. + :tada: Thanks to all our contributors! +```` + +2. An announcement email is sent to `kubebuilder@googlegroups.com` with the subject `[ANNOUNCE] Controller-Runtime $VERSION is released` diff --git a/vendor/sigs.k8s.io/controller-runtime/doc.go b/vendor/sigs.k8s.io/controller-runtime/doc.go index 9f260c4f7..fa6c532c4 100644 --- a/vendor/sigs.k8s.io/controller-runtime/doc.go +++ b/vendor/sigs.k8s.io/controller-runtime/doc.go @@ -23,13 +23,14 @@ limitations under the License. // and uncommon cases should be possible. In general, controller-runtime tries // to guide users towards Kubernetes controller best-practices. // -// Getting Started +// # Getting Started // // The main entrypoint for controller-runtime is this root package, which // contains all of the common types needed to get started building controllers: -// import ( -// ctrl "sigs.k8s.io/controller-runtime" -// ) +// +// import ( +// ctrl "sigs.k8s.io/controller-runtime" +// ) // // The examples in this package walk through a basic controller setup. The // kubebuilder book (https://book.kubebuilder.io) has some more in-depth @@ -38,7 +39,7 @@ limitations under the License. // controller-runtime favors structs with sane defaults over constructors, so // it's fairly common to see structs being used directly in controller-runtime. // -// Organization +// # Organization // // A brief-ish walkthrough of the layout of this library can be found below. Each // package contains more information about how to use it. @@ -47,7 +48,7 @@ limitations under the License. // controllers can be found at // https://github.com/kubernetes-sigs/controller-runtime/blob/master/FAQ.md. // -// Managers +// # Managers // // Every controller and webhook is ultimately run by a Manager (pkg/manager). A // manager is responsible for running controllers and webhooks, and setting up @@ -56,7 +57,7 @@ limitations under the License. // generally configured to gracefully shut down controllers on pod termination // by wiring up a signal handler (pkg/manager/signals). // -// Controllers +// # Controllers // // Controllers (pkg/controller) use events (pkg/event) to eventually trigger // reconcile requests. They may be constructed manually, but are often @@ -67,7 +68,7 @@ limitations under the License. // trigger reconciles. There are pre-written utilities for the common cases, and // interfaces and helpers for advanced cases. // -// Reconcilers +// # Reconcilers // // Controller logic is implemented in terms of Reconcilers (pkg/reconcile). A // Reconciler implements a function which takes a reconcile Request containing @@ -75,7 +76,7 @@ limitations under the License. // and returns a Response or an error indicating whether to requeue for a // second round of processing. // -// Clients and Caches +// # Clients and Caches // // Reconcilers use Clients (pkg/client) to access API objects. The default // client provided by the manager reads from a local shared cache (pkg/cache) @@ -91,19 +92,19 @@ limitations under the License. // may retrieve event recorders (pkg/recorder) to emit events using the // manager. // -// Schemes +// # Schemes // // Clients, Caches, and many other things in Kubernetes use Schemes // (pkg/scheme) to associate Go types to Kubernetes API Kinds // (Group-Version-Kinds, to be specific). // -// Webhooks +// # Webhooks // // Similarly, webhooks (pkg/webhook/admission) may be implemented directly, but // are often constructed using a builder (pkg/webhook/admission/builder). They // are run via a server (pkg/webhook) which is managed by a Manager. // -// Logging and Metrics +// # Logging and Metrics // // Logging (pkg/log) in controller-runtime is done via structured logs, using a // log set of interfaces called logr @@ -117,7 +118,7 @@ limitations under the License. // serve these by an HTTP endpoint, and additional metrics may be registered to // this Registry as normal. // -// Testing +// # Testing // // You can easily build integration and unit tests for your controllers and // webhooks using the test Environment (pkg/envtest). This will automatically diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/builder/controller.go b/vendor/sigs.k8s.io/controller-runtime/pkg/builder/controller.go index eedda4932..efaf06920 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/builder/controller.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/builder/controller.go @@ -315,13 +315,11 @@ func (blder *Builder) doController(r reconcile.Reconciler) error { "controllerKind", gvk.Kind, ) - lowerCamelCaseKind := strings.ToLower(gvk.Kind[:1]) + gvk.Kind[1:] - ctrlOptions.LogConstructor = func(req *reconcile.Request) logr.Logger { log := log if req != nil { log = log.WithValues( - lowerCamelCaseKind, klog.KRef(req.Namespace, req.Name), + gvk.Kind, klog.KRef(req.Namespace, req.Name), "namespace", req.Namespace, "name", req.Name, ) } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/builder/webhook.go b/vendor/sigs.k8s.io/controller-runtime/pkg/builder/webhook.go index 18feb1cd7..534e6d64c 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/builder/webhook.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/builder/webhook.go @@ -39,6 +39,7 @@ type WebhookBuilder struct { gvk schema.GroupVersionKind mgr manager.Manager config *rest.Config + recoverPanic bool } // WebhookManagedBy allows inform its manager.Manager. @@ -68,6 +69,12 @@ func (blder *WebhookBuilder) WithValidator(validator admission.CustomValidator) return blder } +// RecoverPanic indicates whether the panic caused by webhook should be recovered. +func (blder *WebhookBuilder) RecoverPanic() *WebhookBuilder { + blder.recoverPanic = true + return blder +} + // Complete builds the webhook. func (blder *WebhookBuilder) Complete() error { // Set the Config @@ -124,10 +131,10 @@ func (blder *WebhookBuilder) registerDefaultingWebhook() { func (blder *WebhookBuilder) getDefaultingWebhook() *admission.Webhook { if defaulter := blder.withDefaulter; defaulter != nil { - return admission.WithCustomDefaulter(blder.apiType, defaulter) + return admission.WithCustomDefaulter(blder.apiType, defaulter).WithRecoverPanic(blder.recoverPanic) } if defaulter, ok := blder.apiType.(admission.Defaulter); ok { - return admission.DefaultingWebhookFor(defaulter) + return admission.DefaultingWebhookFor(defaulter).WithRecoverPanic(blder.recoverPanic) } log.Info( "skip registering a mutating webhook, object does not implement admission.Defaulter or WithDefaulter wasn't called", @@ -153,10 +160,10 @@ func (blder *WebhookBuilder) registerValidatingWebhook() { func (blder *WebhookBuilder) getValidatingWebhook() *admission.Webhook { if validator := blder.withValidator; validator != nil { - return admission.WithCustomValidator(blder.apiType, validator) + return admission.WithCustomValidator(blder.apiType, validator).WithRecoverPanic(blder.recoverPanic) } if validator, ok := blder.apiType.(admission.Validator); ok { - return admission.ValidatingWebhookFor(validator) + return admission.ValidatingWebhookFor(validator).WithRecoverPanic(blder.recoverPanic) } log.Info( "skip registering a validating webhook, object does not implement admission.Validator or WithValidator wasn't called", diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/cache.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/cache.go index 2a8f53347..3ff41ffe6 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/cache.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/cache.go @@ -170,10 +170,10 @@ func New(config *rest.Config, opts Options) (Cache, error) { // BuilderWithOptions returns a Cache constructor that will build the a cache // honoring the options argument, this is useful to specify options like // SelectorsByObject -// WARNING: if SelectorsByObject is specified. filtered out resources are not -// returned. -// WARNING: if UnsafeDisableDeepCopy is enabled, you must DeepCopy any object -// returned from cache get/list before mutating it. +// WARNING: If SelectorsByObject is specified, filtered out resources are not +// returned. +// WARNING: If UnsafeDisableDeepCopy is enabled, you must DeepCopy any object +// returned from cache get/list before mutating it. func BuilderWithOptions(options Options) NewCacheFunc { return func(config *rest.Config, opts Options) (Cache, error) { if options.Scheme == nil { diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/informer_cache.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/informer_cache.go index ac07be2a6..08e4e6df5 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/informer_cache.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/informer_cache.go @@ -51,7 +51,7 @@ type informerCache struct { } // Get implements Reader. -func (ip *informerCache) Get(ctx context.Context, key client.ObjectKey, out client.Object) error { +func (ip *informerCache) Get(ctx context.Context, key client.ObjectKey, out client.Object, opts ...client.GetOption) error { gvk, err := apiutil.GVKForObject(out, ip.Scheme) if err != nil { return err 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 b95af18d7..9c2255123 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 @@ -54,7 +54,7 @@ type CacheReader struct { } // Get checks the indexer for the object and writes a copy of it if found. -func (c *CacheReader) Get(_ context.Context, key client.ObjectKey, out client.Object) error { +func (c *CacheReader) Get(_ context.Context, key client.ObjectKey, out client.Object, opts ...client.GetOption) error { if c.scopeName == apimeta.RESTScopeNameRoot { key.Namespace = "" } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/multi_namespace_cache.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/multi_namespace_cache.go index 47a5bb3b3..64514c0c5 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/multi_namespace_cache.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/multi_namespace_cache.go @@ -200,7 +200,7 @@ func (c *multiNamespaceCache) IndexField(ctx context.Context, obj client.Object, return nil } -func (c *multiNamespaceCache) Get(ctx context.Context, key client.ObjectKey, obj client.Object) error { +func (c *multiNamespaceCache) Get(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error { isNamespaced, err := objectutil.IsAPINamespaced(obj, c.Scheme, c.RESTMapper) if err != nil { return err diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/dynamicrestmapper.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/dynamicrestmapper.go index e6cc51c6e..8b7c1c4b6 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/dynamicrestmapper.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/dynamicrestmapper.go @@ -17,7 +17,6 @@ limitations under the License. package apiutil import ( - "errors" "sync" "sync/atomic" @@ -145,7 +144,7 @@ func (drm *dynamicRESTMapper) init() (err error) { // checkAndReload attempts to call the given callback, which is assumed to be dependent // on the data in the restmapper. // -// If the callback returns an error that matches the given error, it will attempt to reload +// If the callback returns an error matching meta.IsNoMatchErr, it will attempt to reload // the RESTMapper's data and re-call the callback once that's occurred. // If the callback returns any other error, the function will return immediately regardless. // @@ -154,7 +153,7 @@ func (drm *dynamicRESTMapper) init() (err error) { // the callback. // It's thread-safe, and worries about thread-safety for the callback (so the callback does // not need to attempt to lock the restmapper). -func (drm *dynamicRESTMapper) checkAndReload(needsReloadErr error, checkNeedsReload func() error) error { +func (drm *dynamicRESTMapper) checkAndReload(checkNeedsReload func() error) error { // first, check the common path -- data is fresh enough // (use an IIFE for the lock's defer) err := func() error { @@ -164,10 +163,7 @@ func (drm *dynamicRESTMapper) checkAndReload(needsReloadErr error, checkNeedsRel return checkNeedsReload() }() - // NB(directxman12): `Is` and `As` have a confusing relationship -- - // `Is` is like `== or does this implement .Is`, whereas `As` says - // `can I type-assert into` - needsReload := errors.As(err, &needsReloadErr) + needsReload := meta.IsNoMatchError(err) if !needsReload { return err } @@ -178,7 +174,7 @@ func (drm *dynamicRESTMapper) checkAndReload(needsReloadErr error, checkNeedsRel // ... and double-check that we didn't reload in the meantime err = checkNeedsReload() - needsReload = errors.As(err, &needsReloadErr) + needsReload = meta.IsNoMatchError(err) if !needsReload { return err } @@ -206,7 +202,7 @@ func (drm *dynamicRESTMapper) KindFor(resource schema.GroupVersionResource) (sch return schema.GroupVersionKind{}, err } var gvk schema.GroupVersionKind - err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + err := drm.checkAndReload(func() error { var err error gvk, err = drm.staticMapper.KindFor(resource) return err @@ -219,7 +215,7 @@ func (drm *dynamicRESTMapper) KindsFor(resource schema.GroupVersionResource) ([] return nil, err } var gvks []schema.GroupVersionKind - err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + err := drm.checkAndReload(func() error { var err error gvks, err = drm.staticMapper.KindsFor(resource) return err @@ -233,7 +229,7 @@ func (drm *dynamicRESTMapper) ResourceFor(input schema.GroupVersionResource) (sc } var gvr schema.GroupVersionResource - err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + err := drm.checkAndReload(func() error { var err error gvr, err = drm.staticMapper.ResourceFor(input) return err @@ -246,7 +242,7 @@ func (drm *dynamicRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([ return nil, err } var gvrs []schema.GroupVersionResource - err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + err := drm.checkAndReload(func() error { var err error gvrs, err = drm.staticMapper.ResourcesFor(input) return err @@ -259,7 +255,7 @@ func (drm *dynamicRESTMapper) RESTMapping(gk schema.GroupKind, versions ...strin return nil, err } var mapping *meta.RESTMapping - err := drm.checkAndReload(&meta.NoKindMatchError{}, func() error { + err := drm.checkAndReload(func() error { var err error mapping, err = drm.staticMapper.RESTMapping(gk, versions...) return err @@ -272,7 +268,7 @@ func (drm *dynamicRESTMapper) RESTMappings(gk schema.GroupKind, versions ...stri return nil, err } var mappings []*meta.RESTMapping - err := drm.checkAndReload(&meta.NoKindMatchError{}, func() error { + err := drm.checkAndReload(func() error { var err error mappings, err = drm.staticMapper.RESTMappings(gk, versions...) return err @@ -285,7 +281,7 @@ func (drm *dynamicRESTMapper) ResourceSingularizer(resource string) (string, err return "", err } var singular string - err := drm.checkAndReload(&meta.NoResourceMatchError{}, func() error { + err := drm.checkAndReload(func() error { var err error singular, err = drm.staticMapper.ResourceSingularizer(resource) return err diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/client.go index bbe36c467..730e0ba91 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/client.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/client.go @@ -45,7 +45,7 @@ type WarningHandlerOptions struct { // AllowDuplicateLogs does not deduplicate the to-be // logged surfaced warnings messages. See // log.WarningHandlerOptions for considerations - // regarding deuplication + // regarding deduplication AllowDuplicateLogs bool } @@ -88,13 +88,12 @@ func newClient(config *rest.Config, options Options) (*client, error) { // is log.KubeAPIWarningLogger with deduplication enabled. // See log.KubeAPIWarningLoggerOptions for considerations // regarding deduplication. - rest.SetDefaultWarningHandler( - log.NewKubeAPIWarningLogger( - logger, - log.KubeAPIWarningLoggerOptions{ - Deduplicate: !options.Opts.AllowDuplicateLogs, - }, - ), + config = rest.CopyConfig(config) + config.WarningHandler = log.NewKubeAPIWarningLogger( + logger, + log.KubeAPIWarningLoggerOptions{ + Deduplicate: !options.Opts.AllowDuplicateLogs, + }, ) } @@ -241,16 +240,16 @@ func (c *client) Patch(ctx context.Context, obj Object, patch Patch, opts ...Pat } // Get implements client.Client. -func (c *client) Get(ctx context.Context, key ObjectKey, obj Object) error { +func (c *client) Get(ctx context.Context, key ObjectKey, obj Object, opts ...GetOption) error { switch obj.(type) { case *unstructured.Unstructured: - return c.unstructuredClient.Get(ctx, key, obj) + return c.unstructuredClient.Get(ctx, key, obj, opts...) case *metav1.PartialObjectMetadata: // Metadata only object should always preserve the GVK coming in from the caller. defer c.resetGroupVersionKind(obj, obj.GetObjectKind().GroupVersionKind()) - return c.metadataClient.Get(ctx, key, obj) + return c.metadataClient.Get(ctx, key, obj, opts...) default: - return c.typedClient.Get(ctx, key, obj) + return c.typedClient.Get(ctx, key, obj, opts...) } } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/config/config.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/config/config.go index fd2772412..ff44a225f 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/config/config.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/config/config.go @@ -47,7 +47,7 @@ func init() { // It also applies saner defaults for QPS and burst based on the Kubernetes // controller manager defaults (20 QPS, 30 burst) // -// Config precedence +// Config precedence: // // * --kubeconfig flag pointing at a file // @@ -67,7 +67,7 @@ func GetConfig() (*rest.Config, error) { // It also applies saner defaults for QPS and burst based on the Kubernetes // controller manager defaults (20 QPS, 30 burst) // -// Config precedence +// Config precedence: // // * --kubeconfig flag pointing at a file // diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/doc.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/doc.go index 2965e5fa9..e0e288509 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/doc.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/doc.go @@ -17,7 +17,7 @@ limitations under the License. // Package client contains functionality for interacting with Kubernetes API // servers. // -// Clients +// # Clients // // Clients are split into two interfaces -- Readers and Writers. Readers // get and list, while writers create, update, and delete. @@ -25,18 +25,19 @@ limitations under the License. // The New function can be used to create a new client that talks directly // to the API server. // -// A common pattern in Kubernetes to read from a cache and write to the API +// It is a common pattern in Kubernetes to read from a cache and write to the API // server. This pattern is covered by the DelegatingClient type, which can // be used to have a client whose Reader is different from the Writer. // -// Options +// # Options // // Many client operations in Kubernetes support options. These options are // represented as variadic arguments at the end of a given method call. // For instance, to use a label selector on list, you can call -// err := someReader.List(context.Background(), &podList, client.MatchingLabels{"somelabel": "someval"}) // -// Indexing +// err := someReader.List(context.Background(), &podList, client.MatchingLabels{"somelabel": "someval"}) +// +// # Indexing // // Indexes may be added to caches using a FieldIndexer. This allows you to easily // and efficiently look up objects with certain properties. You can then make diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/dryrun.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/dryrun.go index ea25ea253..14606a579 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/dryrun.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/dryrun.go @@ -72,8 +72,8 @@ func (c *dryRunClient) Patch(ctx context.Context, obj Object, patch Patch, opts } // Get implements client.Client. -func (c *dryRunClient) Get(ctx context.Context, key ObjectKey, obj Object) error { - return c.client.Get(ctx, key, obj) +func (c *dryRunClient) Get(ctx context.Context, key ObjectKey, obj Object, opts ...GetOption) error { + return c.client.Get(ctx, key, obj, opts...) } // List implements client.Client. 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 new file mode 100644 index 000000000..b7ca2de47 --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go @@ -0,0 +1,787 @@ +/* +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 fake + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + utilrand "k8s.io/apimachinery/pkg/util/rand" + "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/testing" + + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/apiutil" + "sigs.k8s.io/controller-runtime/pkg/internal/objectutil" +) + +type versionedTracker struct { + testing.ObjectTracker + scheme *runtime.Scheme +} + +type fakeClient struct { + tracker versionedTracker + scheme *runtime.Scheme + restMapper meta.RESTMapper + schemeWriteLock sync.Mutex +} + +var _ client.WithWatch = &fakeClient{} + +const ( + maxNameLength = 63 + randomLength = 5 + maxGeneratedNameLength = maxNameLength - randomLength +) + +// NewFakeClient creates a new fake client for testing. +// You can choose to initialize it with a slice of runtime.Object. +// +// Deprecated: Please use NewClientBuilder instead. +func NewFakeClient(initObjs ...runtime.Object) client.WithWatch { + return NewClientBuilder().WithRuntimeObjects(initObjs...).Build() +} + +// NewFakeClientWithScheme creates a new fake client with the given scheme +// for testing. +// You can choose to initialize it with a slice of runtime.Object. +// +// Deprecated: Please use NewClientBuilder instead. +func NewFakeClientWithScheme(clientScheme *runtime.Scheme, initObjs ...runtime.Object) client.WithWatch { + return NewClientBuilder().WithScheme(clientScheme).WithRuntimeObjects(initObjs...).Build() +} + +// NewClientBuilder returns a new builder to create a fake client. +func NewClientBuilder() *ClientBuilder { + return &ClientBuilder{} +} + +// ClientBuilder builds a fake client. +type ClientBuilder struct { + scheme *runtime.Scheme + restMapper meta.RESTMapper + initObject []client.Object + initLists []client.ObjectList + initRuntimeObjects []runtime.Object + objectTracker testing.ObjectTracker +} + +// WithScheme sets this builder's internal scheme. +// If not set, defaults to client-go's global scheme.Scheme. +func (f *ClientBuilder) WithScheme(scheme *runtime.Scheme) *ClientBuilder { + f.scheme = scheme + return f +} + +// WithRESTMapper sets this builder's restMapper. +// The restMapper is directly set as mapper in the Client. This can be used for example +// with a meta.DefaultRESTMapper to provide a static rest mapping. +// If not set, defaults to an empty meta.DefaultRESTMapper. +func (f *ClientBuilder) WithRESTMapper(restMapper meta.RESTMapper) *ClientBuilder { + f.restMapper = restMapper + return f +} + +// WithObjects can be optionally used to initialize this fake client with client.Object(s). +func (f *ClientBuilder) WithObjects(initObjs ...client.Object) *ClientBuilder { + f.initObject = append(f.initObject, initObjs...) + return f +} + +// WithLists can be optionally used to initialize this fake client with client.ObjectList(s). +func (f *ClientBuilder) WithLists(initLists ...client.ObjectList) *ClientBuilder { + f.initLists = append(f.initLists, initLists...) + return f +} + +// WithRuntimeObjects can be optionally used to initialize this fake client with runtime.Object(s). +func (f *ClientBuilder) WithRuntimeObjects(initRuntimeObjs ...runtime.Object) *ClientBuilder { + f.initRuntimeObjects = append(f.initRuntimeObjects, initRuntimeObjs...) + return f +} + +// WithObjectTracker can be optionally used to initialize this fake client with testing.ObjectTracker. +func (f *ClientBuilder) WithObjectTracker(ot testing.ObjectTracker) *ClientBuilder { + f.objectTracker = ot + return f +} + +// Build builds and returns a new fake client. +func (f *ClientBuilder) Build() client.WithWatch { + if f.scheme == nil { + f.scheme = scheme.Scheme + } + if f.restMapper == nil { + f.restMapper = meta.NewDefaultRESTMapper([]schema.GroupVersion{}) + } + + var tracker versionedTracker + + if f.objectTracker == nil { + tracker = versionedTracker{ObjectTracker: testing.NewObjectTracker(f.scheme, scheme.Codecs.UniversalDecoder()), scheme: f.scheme} + } else { + tracker = versionedTracker{ObjectTracker: f.objectTracker, scheme: f.scheme} + } + + for _, obj := range f.initObject { + if err := tracker.Add(obj); err != nil { + panic(fmt.Errorf("failed to add object %v to fake client: %w", obj, err)) + } + } + for _, obj := range f.initLists { + if err := tracker.Add(obj); err != nil { + panic(fmt.Errorf("failed to add list %v to fake client: %w", obj, err)) + } + } + for _, obj := range f.initRuntimeObjects { + if err := tracker.Add(obj); err != nil { + panic(fmt.Errorf("failed to add runtime object %v to fake client: %w", obj, err)) + } + } + return &fakeClient{ + tracker: tracker, + scheme: f.scheme, + restMapper: f.restMapper, + } +} + +const trackerAddResourceVersion = "999" + +func (t versionedTracker) Add(obj runtime.Object) error { + var objects []runtime.Object + if meta.IsListType(obj) { + var err error + objects, err = meta.ExtractList(obj) + if err != nil { + return err + } + } else { + objects = []runtime.Object{obj} + } + for _, obj := range objects { + accessor, err := meta.Accessor(obj) + if err != nil { + return fmt.Errorf("failed to get accessor for object: %w", err) + } + if accessor.GetResourceVersion() == "" { + // We use a "magic" value of 999 here because this field + // is parsed as uint and and 0 is already used in Update. + // As we can't go lower, go very high instead so this can + // be recognized + accessor.SetResourceVersion(trackerAddResourceVersion) + } + + obj, err = convertFromUnstructuredIfNecessary(t.scheme, obj) + if err != nil { + return err + } + if err := t.ObjectTracker.Add(obj); err != nil { + return err + } + } + + return nil +} + +func (t versionedTracker) Create(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error { + accessor, err := meta.Accessor(obj) + if err != nil { + return fmt.Errorf("failed to get accessor for object: %w", err) + } + if accessor.GetName() == "" { + return apierrors.NewInvalid( + obj.GetObjectKind().GroupVersionKind().GroupKind(), + accessor.GetName(), + field.ErrorList{field.Required(field.NewPath("metadata.name"), "name is required")}) + } + if accessor.GetResourceVersion() != "" { + return apierrors.NewBadRequest("resourceVersion can not be set for Create requests") + } + accessor.SetResourceVersion("1") + obj, err = convertFromUnstructuredIfNecessary(t.scheme, obj) + if err != nil { + return err + } + if err := t.ObjectTracker.Create(gvr, obj, ns); err != nil { + accessor.SetResourceVersion("") + return err + } + + return nil +} + +// convertFromUnstructuredIfNecessary will convert *unstructured.Unstructured for a GVK that is recocnized +// by the schema into the whatever the schema produces with New() for said GVK. +// This is required because the tracker unconditionally saves on manipulations, but its List() implementation +// tries to assign whatever it finds into a ListType it gets from schema.New() - Thus we have to ensure +// we save as the very same type, otherwise subsequent List requests will fail. +func convertFromUnstructuredIfNecessary(s *runtime.Scheme, o runtime.Object) (runtime.Object, error) { + u, isUnstructured := o.(*unstructured.Unstructured) + if !isUnstructured || !s.Recognizes(u.GroupVersionKind()) { + return o, nil + } + + typed, err := s.New(u.GroupVersionKind()) + if err != nil { + return nil, fmt.Errorf("scheme recognizes %s but failed to produce an object for it: %w", u.GroupVersionKind().String(), err) + } + + unstructuredSerialized, err := json.Marshal(u) + if err != nil { + return nil, fmt.Errorf("failed to serialize %T: %w", unstructuredSerialized, err) + } + if err := json.Unmarshal(unstructuredSerialized, typed); err != nil { + return nil, fmt.Errorf("failed to unmarshal the content of %T into %T: %w", u, typed, err) + } + + return typed, nil +} + +func (t versionedTracker) Update(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error { + accessor, err := meta.Accessor(obj) + if err != nil { + return fmt.Errorf("failed to get accessor for object: %w", err) + } + + if accessor.GetName() == "" { + return apierrors.NewInvalid( + obj.GetObjectKind().GroupVersionKind().GroupKind(), + accessor.GetName(), + field.ErrorList{field.Required(field.NewPath("metadata.name"), "name is required")}) + } + + gvk := obj.GetObjectKind().GroupVersionKind() + if gvk.Empty() { + gvk, err = apiutil.GVKForObject(obj, t.scheme) + if err != nil { + return err + } + } + + oldObject, err := t.ObjectTracker.Get(gvr, ns, accessor.GetName()) + if err != nil { + // If the resource is not found and the resource allows create on update, issue a + // create instead. + if apierrors.IsNotFound(err) && allowsCreateOnUpdate(gvk) { + return t.Create(gvr, obj, ns) + } + return err + } + + oldAccessor, err := meta.Accessor(oldObject) + if err != nil { + return err + } + + // If the new object does not have the resource version set and it allows unconditional update, + // default it to the resource version of the existing resource + if accessor.GetResourceVersion() == "" && allowsUnconditionalUpdate(gvk) { + accessor.SetResourceVersion(oldAccessor.GetResourceVersion()) + } + if accessor.GetResourceVersion() != oldAccessor.GetResourceVersion() { + return apierrors.NewConflict(gvr.GroupResource(), accessor.GetName(), errors.New("object was modified")) + } + if oldAccessor.GetResourceVersion() == "" { + oldAccessor.SetResourceVersion("0") + } + intResourceVersion, err := strconv.ParseUint(oldAccessor.GetResourceVersion(), 10, 64) + if err != nil { + return fmt.Errorf("can not convert resourceVersion %q to int: %w", oldAccessor.GetResourceVersion(), err) + } + intResourceVersion++ + accessor.SetResourceVersion(strconv.FormatUint(intResourceVersion, 10)) + if !accessor.GetDeletionTimestamp().IsZero() && len(accessor.GetFinalizers()) == 0 { + return t.ObjectTracker.Delete(gvr, accessor.GetNamespace(), accessor.GetName()) + } + obj, err = convertFromUnstructuredIfNecessary(t.scheme, obj) + if err != nil { + return err + } + return t.ObjectTracker.Update(gvr, obj, ns) +} + +func (c *fakeClient) Get(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error { + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + o, err := c.tracker.Get(gvr, key.Namespace, key.Name) + if err != nil { + return err + } + + gvk, err := apiutil.GVKForObject(obj, c.scheme) + if err != nil { + return err + } + ta, err := meta.TypeAccessor(o) + if err != nil { + return err + } + ta.SetKind(gvk.Kind) + ta.SetAPIVersion(gvk.GroupVersion().String()) + + j, err := json.Marshal(o) + if err != nil { + return err + } + decoder := scheme.Codecs.UniversalDecoder() + zero(obj) + _, _, err = decoder.Decode(j, nil, obj) + return err +} + +func (c *fakeClient) Watch(ctx context.Context, list client.ObjectList, opts ...client.ListOption) (watch.Interface, error) { + gvk, err := apiutil.GVKForObject(list, c.scheme) + if err != nil { + return nil, err + } + + gvk.Kind = strings.TrimSuffix(gvk.Kind, "List") + + listOpts := client.ListOptions{} + listOpts.ApplyOptions(opts) + + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + return c.tracker.Watch(gvr, listOpts.Namespace) +} + +func (c *fakeClient) List(ctx context.Context, obj client.ObjectList, opts ...client.ListOption) error { + gvk, err := apiutil.GVKForObject(obj, c.scheme) + if err != nil { + return err + } + + originalKind := gvk.Kind + + gvk.Kind = strings.TrimSuffix(gvk.Kind, "List") + + if _, isUnstructuredList := obj.(*unstructured.UnstructuredList); isUnstructuredList && !c.scheme.Recognizes(gvk) { + // We need to register the ListKind with UnstructuredList: + // https://github.com/kubernetes/kubernetes/blob/7b2776b89fb1be28d4e9203bdeec079be903c103/staging/src/k8s.io/client-go/dynamic/fake/simple.go#L44-L51 + c.schemeWriteLock.Lock() + c.scheme.AddKnownTypeWithName(gvk.GroupVersion().WithKind(gvk.Kind+"List"), &unstructured.UnstructuredList{}) + c.schemeWriteLock.Unlock() + } + + listOpts := client.ListOptions{} + listOpts.ApplyOptions(opts) + + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + o, err := c.tracker.List(gvr, gvk, listOpts.Namespace) + if err != nil { + return err + } + + ta, err := meta.TypeAccessor(o) + if err != nil { + return err + } + ta.SetKind(originalKind) + ta.SetAPIVersion(gvk.GroupVersion().String()) + + j, err := json.Marshal(o) + if err != nil { + return err + } + decoder := scheme.Codecs.UniversalDecoder() + zero(obj) + _, _, err = decoder.Decode(j, nil, obj) + if err != nil { + return err + } + + if listOpts.LabelSelector != nil { + objs, err := meta.ExtractList(obj) + if err != nil { + return err + } + filteredObjs, err := objectutil.FilterWithLabels(objs, listOpts.LabelSelector) + if err != nil { + return err + } + err = meta.SetList(obj, filteredObjs) + if err != nil { + return err + } + } + return nil +} + +func (c *fakeClient) Scheme() *runtime.Scheme { + return c.scheme +} + +func (c *fakeClient) RESTMapper() meta.RESTMapper { + return c.restMapper +} + +func (c *fakeClient) Create(ctx context.Context, obj client.Object, opts ...client.CreateOption) error { + createOptions := &client.CreateOptions{} + createOptions.ApplyOptions(opts) + + for _, dryRunOpt := range createOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + accessor, err := meta.Accessor(obj) + if err != nil { + return err + } + + if accessor.GetName() == "" && accessor.GetGenerateName() != "" { + base := accessor.GetGenerateName() + if len(base) > maxGeneratedNameLength { + base = base[:maxGeneratedNameLength] + } + accessor.SetName(fmt.Sprintf("%s%s", base, utilrand.String(randomLength))) + } + + return c.tracker.Create(gvr, obj, accessor.GetNamespace()) +} + +func (c *fakeClient) Delete(ctx context.Context, obj client.Object, opts ...client.DeleteOption) error { + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + accessor, err := meta.Accessor(obj) + if err != nil { + return err + } + delOptions := client.DeleteOptions{} + delOptions.ApplyOptions(opts) + + for _, dryRunOpt := range delOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + // Check the ResourceVersion if that Precondition was specified. + if delOptions.Preconditions != nil && delOptions.Preconditions.ResourceVersion != nil { + name := accessor.GetName() + dbObj, err := c.tracker.Get(gvr, accessor.GetNamespace(), name) + if err != nil { + return err + } + oldAccessor, err := meta.Accessor(dbObj) + if err != nil { + return err + } + actualRV := oldAccessor.GetResourceVersion() + expectRV := *delOptions.Preconditions.ResourceVersion + if actualRV != expectRV { + msg := fmt.Sprintf( + "the ResourceVersion in the precondition (%s) does not match the ResourceVersion in record (%s). "+ + "The object might have been modified", + expectRV, actualRV) + return apierrors.NewConflict(gvr.GroupResource(), name, errors.New(msg)) + } + } + + return c.deleteObject(gvr, accessor) +} + +func (c *fakeClient) DeleteAllOf(ctx context.Context, obj client.Object, opts ...client.DeleteAllOfOption) error { + gvk, err := apiutil.GVKForObject(obj, c.scheme) + if err != nil { + return err + } + + dcOptions := client.DeleteAllOfOptions{} + dcOptions.ApplyOptions(opts) + + for _, dryRunOpt := range dcOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + o, err := c.tracker.List(gvr, gvk, dcOptions.Namespace) + if err != nil { + return err + } + + objs, err := meta.ExtractList(o) + if err != nil { + return err + } + filteredObjs, err := objectutil.FilterWithLabels(objs, dcOptions.LabelSelector) + if err != nil { + return err + } + for _, o := range filteredObjs { + accessor, err := meta.Accessor(o) + if err != nil { + return err + } + err = c.deleteObject(gvr, accessor) + if err != nil { + return err + } + } + return nil +} + +func (c *fakeClient) Update(ctx context.Context, obj client.Object, opts ...client.UpdateOption) error { + updateOptions := &client.UpdateOptions{} + updateOptions.ApplyOptions(opts) + + for _, dryRunOpt := range updateOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + accessor, err := meta.Accessor(obj) + if err != nil { + return err + } + return c.tracker.Update(gvr, obj, accessor.GetNamespace()) +} + +func (c *fakeClient) Patch(ctx context.Context, obj client.Object, patch client.Patch, opts ...client.PatchOption) error { + patchOptions := &client.PatchOptions{} + patchOptions.ApplyOptions(opts) + + for _, dryRunOpt := range patchOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + accessor, err := meta.Accessor(obj) + if err != nil { + return err + } + data, err := patch.Data(obj) + if err != nil { + return err + } + + reaction := testing.ObjectReaction(c.tracker) + handled, o, err := reaction(testing.NewPatchAction(gvr, accessor.GetNamespace(), accessor.GetName(), patch.Type(), data)) + if err != nil { + return err + } + if !handled { + panic("tracker could not handle patch method") + } + + gvk, err := apiutil.GVKForObject(obj, c.scheme) + if err != nil { + return err + } + ta, err := meta.TypeAccessor(o) + if err != nil { + return err + } + ta.SetKind(gvk.Kind) + ta.SetAPIVersion(gvk.GroupVersion().String()) + + j, err := json.Marshal(o) + if err != nil { + return err + } + decoder := scheme.Codecs.UniversalDecoder() + zero(obj) + _, _, err = decoder.Decode(j, nil, obj) + return err +} + +func (c *fakeClient) Status() client.StatusWriter { + return &fakeStatusWriter{client: c} +} + +func (c *fakeClient) deleteObject(gvr schema.GroupVersionResource, accessor metav1.Object) error { + old, err := c.tracker.Get(gvr, accessor.GetNamespace(), accessor.GetName()) + if err == nil { + oldAccessor, err := meta.Accessor(old) + if err == nil { + if len(oldAccessor.GetFinalizers()) > 0 { + now := metav1.Now() + oldAccessor.SetDeletionTimestamp(&now) + return c.tracker.Update(gvr, old, accessor.GetNamespace()) + } + } + } + + //TODO: implement propagation + return c.tracker.Delete(gvr, accessor.GetNamespace(), accessor.GetName()) +} + +func getGVRFromObject(obj runtime.Object, scheme *runtime.Scheme) (schema.GroupVersionResource, error) { + gvk, err := apiutil.GVKForObject(obj, scheme) + if err != nil { + return schema.GroupVersionResource{}, err + } + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + return gvr, nil +} + +type fakeStatusWriter struct { + client *fakeClient +} + +func (sw *fakeStatusWriter) Update(ctx context.Context, obj client.Object, opts ...client.UpdateOption) error { + // TODO(droot): This results in full update of the obj (spec + status). Need + // a way to update status field only. + return sw.client.Update(ctx, obj, opts...) +} + +func (sw *fakeStatusWriter) Patch(ctx context.Context, obj client.Object, patch client.Patch, opts ...client.PatchOption) error { + // TODO(droot): This results in full update of the obj (spec + status). Need + // a way to update status field only. + return sw.client.Patch(ctx, obj, patch, opts...) +} + +func allowsUnconditionalUpdate(gvk schema.GroupVersionKind) bool { + switch gvk.Group { + case "apps": + switch gvk.Kind { + case "ControllerRevision", "DaemonSet", "Deployment", "ReplicaSet", "StatefulSet": + return true + } + case "autoscaling": + switch gvk.Kind { + case "HorizontalPodAutoscaler": + return true + } + case "batch": + switch gvk.Kind { + case "CronJob", "Job": + return true + } + case "certificates": + switch gvk.Kind { + case "Certificates": + return true + } + case "flowcontrol": + switch gvk.Kind { + case "FlowSchema", "PriorityLevelConfiguration": + return true + } + case "networking": + switch gvk.Kind { + case "Ingress", "IngressClass", "NetworkPolicy": + return true + } + case "policy": + switch gvk.Kind { + case "PodSecurityPolicy": + return true + } + case "rbac": + switch gvk.Kind { + case "ClusterRole", "ClusterRoleBinding", "Role", "RoleBinding": + return true + } + case "scheduling": + switch gvk.Kind { + case "PriorityClass": + return true + } + case "settings": + switch gvk.Kind { + case "PodPreset": + return true + } + case "storage": + switch gvk.Kind { + case "StorageClass": + return true + } + case "": + switch gvk.Kind { + case "ConfigMap", "Endpoint", "Event", "LimitRange", "Namespace", "Node", + "PersistentVolume", "PersistentVolumeClaim", "Pod", "PodTemplate", + "ReplicationController", "ResourceQuota", "Secret", "Service", + "ServiceAccount", "EndpointSlice": + return true + } + } + + return false +} + +func allowsCreateOnUpdate(gvk schema.GroupVersionKind) bool { + switch gvk.Group { + case "coordination": + switch gvk.Kind { + case "Lease": + return true + } + case "node": + switch gvk.Kind { + case "RuntimeClass": + return true + } + case "rbac": + switch gvk.Kind { + case "ClusterRole", "ClusterRoleBinding", "Role", "RoleBinding": + return true + } + case "": + switch gvk.Kind { + case "Endpoint", "Event", "LimitRange", "Service": + return true + } + } + + return false +} + +// zero zeros the value of a pointer. +func zero(x interface{}) { + if x == nil { + return + } + res := reflect.ValueOf(x).Elem() + res.Set(reflect.Zero(res.Type())) +} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/doc.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/doc.go new file mode 100644 index 000000000..d0614666e --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/doc.go @@ -0,0 +1,38 @@ +/* +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 fake provides a fake client for testing. + +A fake client is backed by its simple object store indexed by GroupVersionResource. +You can create a fake client with optional objects. + + client := NewFakeClientWithScheme(scheme, initObjs...) // initObjs is a slice of runtime.Object + +You can invoke the methods defined in the Client interface. + +When in doubt, it's almost always better not to use this package and instead use +envtest.Environment with a real client and API server. + +WARNING: ⚠️ Current Limitations / Known Issues with the fake Client ⚠️ + - This client does not have a way to inject specific errors to test handled vs. unhandled errors. + - There is some support for sub resources which can cause issues with tests if you're trying to update + e.g. metadata and status in the same reconcile. + - No OpenAPI validation is performed when creating or updating objects. + - ObjectMeta's `Generation` and `ResourceVersion` don't behave properly, Patch or Update + operations that rely on these fields will fail, or give false positives. +*/ +package fake diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/interfaces.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/interfaces.go index 58c2ece15..7f8f8f31c 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/interfaces.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/interfaces.go @@ -50,7 +50,7 @@ type Reader interface { // Get retrieves an obj for the given object key from the Kubernetes Cluster. // obj must be a struct pointer so that obj can be updated with the response // returned by the Server. - Get(ctx context.Context, key ObjectKey, obj Object) error + Get(ctx context.Context, key ObjectKey, obj Object, opts ...GetOption) error // List retrieves list of objects for a given namespace and list options. On a // successful call, Items field in the list will be populated with the @@ -143,3 +143,13 @@ func IgnoreNotFound(err error) error { } return err } + +// IgnoreAlreadyExists returns nil on AlreadyExists errors. +// All other values that are not AlreadyExists errors or nil are returned unmodified. +func IgnoreAlreadyExists(err error) error { + if apierrors.IsAlreadyExists(err) { + return nil + } + + return err +} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/metadata_client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/metadata_client.go index db495ca46..2854556f3 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/metadata_client.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/metadata_client.go @@ -116,7 +116,7 @@ func (mc *metadataClient) Patch(ctx context.Context, obj Object, patch Patch, op } // Get implements client.Client. -func (mc *metadataClient) Get(ctx context.Context, key ObjectKey, obj Object) error { +func (mc *metadataClient) Get(ctx context.Context, key ObjectKey, obj Object, opts ...GetOption) error { metadata, ok := obj.(*metav1.PartialObjectMetadata) if !ok { return fmt.Errorf("metadata client did not understand object: %T", obj) @@ -124,12 +124,15 @@ func (mc *metadataClient) Get(ctx context.Context, key ObjectKey, obj Object) er gvk := metadata.GroupVersionKind() + getOpts := GetOptions{} + getOpts.ApplyOptions(opts) + resInt, err := mc.getResourceInterface(gvk, key.Namespace) if err != nil { return err } - res, err := resInt.Get(ctx, key.Name, metav1.GetOptions{}) + res, err := resInt.Get(ctx, key.Name, *getOpts.AsGetOptions()) if err != nil { return err } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/namespaced_client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/namespaced_client.go index 45a694543..674fe253d 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/namespaced_client.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/namespaced_client.go @@ -52,7 +52,7 @@ func (n *namespacedClient) RESTMapper() meta.RESTMapper { return n.client.RESTMapper() } -// Create implements clinet.Client. +// Create implements client.Client. func (n *namespacedClient) Create(ctx context.Context, obj Object, opts ...CreateOption) error { isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, n.Scheme(), n.RESTMapper()) if err != nil { @@ -138,18 +138,18 @@ func (n *namespacedClient) Patch(ctx context.Context, obj Object, patch Patch, o } // Get implements client.Client. -func (n *namespacedClient) Get(ctx context.Context, key ObjectKey, obj Object) error { +func (n *namespacedClient) Get(ctx context.Context, key ObjectKey, obj Object, opts ...GetOption) error { isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, n.Scheme(), n.RESTMapper()) if err != nil { return fmt.Errorf("error finding the scope of the object: %w", err) } if isNamespaceScoped { if key.Namespace != "" && key.Namespace != n.namespace { - return fmt.Errorf("namespace %s provided for the object %s does not match the namesapce %s on the client", key.Namespace, obj.GetName(), n.namespace) + return fmt.Errorf("namespace %s provided for the object %s does not match the namespace %s on the client", key.Namespace, obj.GetName(), n.namespace) } key.Namespace = n.namespace } - return n.client.Get(ctx, key, obj) + return n.client.Get(ctx, key, obj, opts...) } // List implements client.Client. diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/options.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/options.go index 7990f56ab..495b86944 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/options.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/options.go @@ -37,6 +37,12 @@ type DeleteOption interface { ApplyToDelete(*DeleteOptions) } +// GetOption is some configuration that modifies options for a get request. +type GetOption interface { + // ApplyToGet applies this configuration to the given get options. + ApplyToGet(*GetOptions) +} + // ListOption is some configuration that modifies options for a list request. type ListOption interface { // ApplyToList applies this configuration to the given list options. @@ -311,6 +317,45 @@ func (p PropagationPolicy) ApplyToDeleteAllOf(opts *DeleteAllOfOptions) { // }}} +// {{{ Get Options + +// GetOptions contains options for get operation. +// Now it only has a Raw field, with support for specific resourceVersion. +type GetOptions struct { + // Raw represents raw GetOptions, as passed to the API server. Note + // that these may not be respected by all implementations of interface. + Raw *metav1.GetOptions +} + +var _ GetOption = &GetOptions{} + +// ApplyToGet implements GetOption for GetOptions. +func (o *GetOptions) ApplyToGet(lo *GetOptions) { + if o.Raw != nil { + lo.Raw = o.Raw + } +} + +// AsGetOptions returns these options as a flattened metav1.GetOptions. +// This may mutate the Raw field. +func (o *GetOptions) AsGetOptions() *metav1.GetOptions { + if o == nil || o.Raw == nil { + return &metav1.GetOptions{} + } + return o.Raw +} + +// ApplyOptions applies the given get options on these options, +// and then returns itself (for convenient chaining). +func (o *GetOptions) ApplyOptions(opts []GetOption) *GetOptions { + for _, opt := range opts { + opt.ApplyToGet(o) + } + return o +} + +// }}} + // {{{ List Options // ListOptions contains options for limiting or filtering results. diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/patch.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/patch.go index 10984c534..11d608388 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/patch.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/patch.go @@ -19,7 +19,7 @@ package client import ( "fmt" - jsonpatch "github.com/evanphx/json-patch" + jsonpatch "github.com/evanphx/json-patch/v5" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/json" "k8s.io/apimachinery/pkg/util/strategicpatch" diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/split.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/split.go index bf4b861f3..871734534 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/split.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/split.go @@ -121,13 +121,13 @@ func (d *delegatingReader) shouldBypassCache(obj runtime.Object) (bool, error) { } // Get retrieves an obj for a given object key from the Kubernetes Cluster. -func (d *delegatingReader) Get(ctx context.Context, key ObjectKey, obj Object) error { +func (d *delegatingReader) Get(ctx context.Context, key ObjectKey, obj Object, opts ...GetOption) error { if isUncached, err := d.shouldBypassCache(obj); err != nil { return err } else if isUncached { - return d.ClientReader.Get(ctx, key, obj) + return d.ClientReader.Get(ctx, key, obj, opts...) } - return d.CacheReader.Get(ctx, key, obj) + return d.CacheReader.Get(ctx, key, obj, opts...) } // List retrieves list of objects for a given namespace and list options. 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 dde7b21f2..c4e56d9be 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 @@ -132,14 +132,17 @@ func (c *typedClient) Patch(ctx context.Context, obj Object, patch Patch, opts . } // Get implements client.Client. -func (c *typedClient) Get(ctx context.Context, key ObjectKey, obj Object) error { +func (c *typedClient) Get(ctx context.Context, key ObjectKey, obj Object, opts ...GetOption) error { r, err := c.cache.getResource(obj) if err != nil { return err } + getOpts := GetOptions{} + getOpts.ApplyOptions(opts) return r.Get(). NamespaceIfScoped(key.Namespace, r.isNamespaced()). Resource(r.resource()). + VersionedParams(getOpts.AsGetOptions(), c.paramCodec). Name(key.Name).Do(ctx).Into(obj) } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/unstructured_client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/unstructured_client.go index 819527e70..3d3dbe7b2 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/unstructured_client.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/unstructured_client.go @@ -165,7 +165,7 @@ func (uc *unstructuredClient) Patch(ctx context.Context, obj Object, patch Patch } // Get implements client.Client. -func (uc *unstructuredClient) Get(ctx context.Context, key ObjectKey, obj Object) error { +func (uc *unstructuredClient) Get(ctx context.Context, key ObjectKey, obj Object, opts ...GetOption) error { u, ok := obj.(*unstructured.Unstructured) if !ok { return fmt.Errorf("unstructured client did not understand object: %T", obj) @@ -173,6 +173,9 @@ func (uc *unstructuredClient) Get(ctx context.Context, key ObjectKey, obj Object gvk := u.GroupVersionKind() + getOpts := GetOptions{} + getOpts.ApplyOptions(opts) + r, err := uc.cache.getResource(obj) if err != nil { return err @@ -181,6 +184,7 @@ func (uc *unstructuredClient) Get(ctx context.Context, key ObjectKey, obj Object result := r.Get(). NamespaceIfScoped(key.Namespace, r.isNamespaced()). Resource(r.resource()). + VersionedParams(getOpts.AsGetOptions(), uc.paramCodec). Name(key.Name). Do(ctx). Into(obj) diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/config/config.go b/vendor/sigs.k8s.io/controller-runtime/pkg/config/config.go index 517b172e5..8e853d6a0 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/config/config.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/config/config.go @@ -50,8 +50,8 @@ type DeferredFileLoader struct { // this will also configure the defaults for the loader if nothing is // // Defaults: -// Path: "./config.yaml" -// Kind: GenericControllerManagerConfiguration +// * Path: "./config.yaml" +// * Kind: GenericControllerManagerConfiguration func File() *DeferredFileLoader { scheme := runtime.NewScheme() utilruntime.Must(v1alpha1.AddToScheme(scheme)) diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/config/doc.go b/vendor/sigs.k8s.io/controller-runtime/pkg/config/doc.go index ebd8243f3..a169ec559 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/config/doc.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/config/doc.go @@ -17,7 +17,7 @@ limitations under the License. // Package config contains functionality for interacting with ComponentConfig // files // -// DeferredFileLoader +// # DeferredFileLoader // // This uses a deferred file decoding allowing you to chain your configuration // setup. You can pass this into manager.Options#File and it will load your diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/controller/doc.go b/vendor/sigs.k8s.io/controller-runtime/pkg/controller/doc.go index 667b14fdd..228335e92 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/controller/doc.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/controller/doc.go @@ -17,7 +17,7 @@ limitations under the License. /* Package controller provides types and functions for building Controllers. Controllers implement Kubernetes APIs. -Creation +# Creation To create a new Controller, first create a manager.Manager and pass it to the controller.New function. The Controller MUST be started by calling Manager.Start. diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/envtest/server.go b/vendor/sigs.k8s.io/controller-runtime/pkg/envtest/server.go index 5347f074d..f9e0bb8ab 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/envtest/server.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/envtest/server.go @@ -37,15 +37,14 @@ var log = logf.RuntimeLog.WithName("test-env") /* It's possible to override some defaults, by setting the following environment variables: - USE_EXISTING_CLUSTER (boolean): if set to true, envtest will use an existing cluster - TEST_ASSET_KUBE_APISERVER (string): path to the api-server binary to use - TEST_ASSET_ETCD (string): path to the etcd binary to use - TEST_ASSET_KUBECTL (string): path to the kubectl binary to use - KUBEBUILDER_ASSETS (string): directory containing the binaries to use (api-server, etcd and kubectl). Defaults to /usr/local/kubebuilder/bin. - KUBEBUILDER_CONTROLPLANE_START_TIMEOUT (string supported by time.ParseDuration): timeout for test control plane to start. Defaults to 20s. - KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT (string supported by time.ParseDuration): timeout for test control plane to start. Defaults to 20s. - KUBEBUILDER_ATTACH_CONTROL_PLANE_OUTPUT (boolean): if set to true, the control plane's stdout and stderr are attached to os.Stdout and os.Stderr - +* USE_EXISTING_CLUSTER (boolean): if set to true, envtest will use an existing cluster +* TEST_ASSET_KUBE_APISERVER (string): path to the api-server binary to use +* TEST_ASSET_ETCD (string): path to the etcd binary to use +* TEST_ASSET_KUBECTL (string): path to the kubectl binary to use +* KUBEBUILDER_ASSETS (string): directory containing the binaries to use (api-server, etcd and kubectl). Defaults to /usr/local/kubebuilder/bin. +* KUBEBUILDER_CONTROLPLANE_START_TIMEOUT (string supported by time.ParseDuration): timeout for test control plane to start. Defaults to 20s. +* KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT (string supported by time.ParseDuration): timeout for test control plane to start. Defaults to 20s. +* KUBEBUILDER_ATTACH_CONTROL_PLANE_OUTPUT (boolean): if set to true, the control plane's stdout and stderr are attached to os.Stdout and os.Stderr */ const ( envUseExistingCluster = "USE_EXISTING_CLUSTER" diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/handler/doc.go b/vendor/sigs.k8s.io/controller-runtime/pkg/handler/doc.go index 3b5b79048..e5fd177af 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/handler/doc.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/handler/doc.go @@ -21,7 +21,7 @@ Controller.Watch in order to generate and enqueue reconcile.Request work items. Generally, following premade event handlers should be sufficient for most use cases: -EventHandlers +EventHandlers: EnqueueRequestForObject - Enqueues a reconcile.Request containing the Name and Namespace of the object in the Event. This will cause the object that was the source of the Event (e.g. the created / deleted / updated object) to be diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/recorder/recorder.go b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/recorder/recorder.go index 46cc1714b..9d8b2f074 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/recorder/recorder.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/recorder/recorder.go @@ -100,7 +100,7 @@ func (p *Provider) getBroadcaster() record.EventBroadcaster { broadcaster.StartRecordingToSink(&corev1client.EventSinkImpl{Interface: p.evtClient}) broadcaster.StartEventWatcher( func(e *corev1.Event) { - p.logger.V(1).Info(e.Type, "object", e.InvolvedObject, "reason", e.Reason, "message", e.Message) + p.logger.V(1).Info(e.Message, "type", e.Type, "object", e.InvolvedObject, "reason", e.Reason) }) p.broadcaster = broadcaster p.stopBroadcaster = stop diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/testing/process/arguments.go b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/testing/process/arguments.go index 6c2c91e14..391eec1fa 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/testing/process/arguments.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/testing/process/arguments.go @@ -93,12 +93,12 @@ type TemplateDefaults struct { // TemplateAndArguments joins structured arguments and non-structured arguments, preserving existing // behavior. Namely: // -// 1. if templ has len > 0, it will be rendered against data -// 2. the rendered template values that look like `--foo=bar` will be split -// and appended to args, the rest will be kept around -// 3. the given args will be rendered as string form. If a template is given, -// no defaults will be used, otherwise defaults will be used -// 4. a result of [args..., rest...] will be returned +// 1. if templ has len > 0, it will be rendered against data +// 2. the rendered template values that look like `--foo=bar` will be split +// and appended to args, the rest will be kept around +// 3. the given args will be rendered as string form. If a template is given, +// no defaults will be used, otherwise defaults will be used +// 4. a result of [args..., rest...] will be returned // // It returns the resulting rendered arguments, plus the arguments that were // not transferred to `args` during rendering. @@ -215,9 +215,9 @@ var ( // for passing to exec.Command and friends, making use of the given defaults // as indicated for each particular argument. // -// - Any flag in defaults that's not in Arguments will be present in the output -// - Any flag that's present in Arguments will be passed the corresponding -// defaults to do with as it will (ignore, append-to, suppress, etc). +// - Any flag in defaults that's not in Arguments will be present in the output +// - Any flag that's present in Arguments will be passed the corresponding +// defaults to do with as it will (ignore, append-to, suppress, etc). func (a *Arguments) AsStrings(defaults map[string][]string) []string { // sort for deterministic ordering keysInOrder := make([]string, 0, len(defaults)+len(a.values)) @@ -323,9 +323,9 @@ func (a *Arguments) SetRaw(key string, val Arg) *Arguments { // used in conjunction with SetRaw. For example, to set `--some-flag` to the // API server's CertDir, you could do: // -// server.Configure().SetRaw("--some-flag", FuncArg(func(defaults []string) []string { -// return []string{server.CertDir} -// })) +// server.Configure().SetRaw("--some-flag", FuncArg(func(defaults []string) []string { +// return []string{server.CertDir} +// })) // // FuncArg ignores Appends; if you need to support appending values too, consider implementing // Arg directly. diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/testing/process/process.go b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/testing/process/process.go index c721ba01a..af83c70a2 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/testing/process/process.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/testing/process/process.go @@ -184,16 +184,12 @@ func (ps *State) Start(stdout, stderr io.Writer) (err error) { ps.ready = true return nil case <-ps.waitDone: - if pollerStopCh != nil { - close(pollerStopCh) - } + close(pollerStopCh) return fmt.Errorf("timeout waiting for process %s to start successfully "+ "(it may have failed to start, or stopped unexpectedly before becoming ready)", path.Base(ps.Path)) case <-timedOut: - if pollerStopCh != nil { - close(pollerStopCh) - } + close(pollerStopCh) if ps.Cmd != nil { // intentionally ignore this -- we might've crashed, failed to start, etc ps.Cmd.Process.Signal(syscall.SIGTERM) //nolint:errcheck diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go b/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go index 6fca63063..c82447d91 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go @@ -73,6 +73,9 @@ func (p *loggerPromise) Fulfill(parentLogSink logr.LogSink) { p.logger.lock.Lock() p.logger.logger = sink + if withCallDepth, ok := sink.(logr.CallDepthLogSink); ok { + p.logger.logger = withCallDepth.WithCallDepth(1) + } p.logger.promise = nil p.logger.lock.Unlock() @@ -141,7 +144,11 @@ func (l *DelegatingLogSink) WithName(name string) logr.LogSink { defer l.lock.RUnlock() if l.promise == nil { - return l.logger.WithName(name) + sink := l.logger.WithName(name) + if withCallDepth, ok := sink.(logr.CallDepthLogSink); ok { + sink = withCallDepth.WithCallDepth(-1) + } + return sink } res := &DelegatingLogSink{logger: l.logger} @@ -157,7 +164,11 @@ func (l *DelegatingLogSink) WithValues(tags ...interface{}) logr.LogSink { defer l.lock.RUnlock() if l.promise == nil { - return l.logger.WithValues(tags...) + sink := l.logger.WithValues(tags...) + if withCallDepth, ok := sink.(logr.CallDepthLogSink); ok { + sink = withCallDepth.WithCallDepth(-1) + } + return sink } res := &DelegatingLogSink{logger: l.logger} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/log/log.go b/vendor/sigs.k8s.io/controller-runtime/pkg/log/log.go index 3965769c3..082dce3ad 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/log/log.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/log/log.go @@ -17,7 +17,7 @@ limitations under the License. // Package log contains utilities for fetching a new logger // when one is not already available. // -// The Log Handle +// # The Log Handle // // This package contains a root logr.Logger Log. It may be used to // get a handle to whatever the root logging implementation is. By @@ -25,7 +25,7 @@ limitations under the License. // to loggers. When the implementation is set using SetLogger, these // "promises" will be converted over to real loggers. // -// Logr +// # Logr // // All logging in controller-runtime is structured, using a set of interfaces // defined by a package called logr diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/log/zap/zap.go b/vendor/sigs.k8s.io/controller-runtime/pkg/log/zap/zap.go index 7db4cdda3..6dce5a04f 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/log/zap/zap.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/log/zap/zap.go @@ -244,21 +244,22 @@ func NewRaw(opts ...Opts) *zap.Logger { // this basically mimics NewConfig, but with a custom sink sink := zapcore.AddSync(o.DestWriter) - o.ZapOpts = append(o.ZapOpts, zap.AddCallerSkip(1), zap.ErrorOutput(sink)) + o.ZapOpts = append(o.ZapOpts, zap.ErrorOutput(sink)) log := zap.New(zapcore.NewCore(&KubeAwareEncoder{Encoder: o.Encoder, Verbose: o.Development}, sink, o.Level)) log = log.WithOptions(o.ZapOpts...) return log } -// BindFlags will parse the given flagset for zap option flags and set the log options accordingly -// zap-devel: Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn) -// Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) -// zap-encoder: Zap log encoding (one of 'json' or 'console') -// zap-log-level: Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', -// or any integer value > 0 which corresponds to custom debug levels of increasing verbosity") -// zap-stacktrace-level: Zap Level at and above which stacktraces are captured (one of 'info', 'error' or 'panic') -// zap-time-encoding: Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). -// Defaults to 'epoch'. +// BindFlags will parse the given flagset for zap option flags and set the log options accordingly: +// - zap-devel: +// Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn) +// Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) +// - zap-encoder: Zap log encoding (one of 'json' or 'console') +// - zap-log-level: Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', +// or any integer value > 0 which corresponds to custom debug levels of increasing verbosity"). +// - zap-stacktrace-level: Zap Level at and above which stacktraces are captured (one of 'info', 'error' or 'panic') +// - zap-time-encoding: Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'), +// Defaults to 'epoch'. func (o *Options) BindFlags(fs *flag.FlagSet) { // Set Development mode value fs.BoolVar(&o.Development, "zap-devel", o.Development, @@ -298,10 +299,11 @@ func (o *Options) BindFlags(fs *flag.FlagSet) { } // UseFlagOptions configures the logger to use the Options set by parsing zap option flags from the CLI. -// opts := zap.Options{} -// opts.BindFlags(flag.CommandLine) -// flag.Parse() -// log := zap.New(zap.UseFlagOptions(&opts)) +// +// opts := zap.Options{} +// opts.BindFlags(flag.CommandLine) +// flag.Parse() +// log := zap.New(zap.UseFlagOptions(&opts)) func UseFlagOptions(in *Options) Opts { return func(o *Options) { *o = *in diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/manager/manager.go b/vendor/sigs.k8s.io/controller-runtime/pkg/manager/manager.go index 5f76b5a83..53716aa9f 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/manager/manager.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/manager/manager.go @@ -142,18 +142,36 @@ type Options struct { LeaderElection bool // LeaderElectionResourceLock determines which resource lock to use for leader election, - // defaults to "configmapsleases". Change this value only if you know what you are doing. - // Otherwise, users of your controller might end up with multiple running instances that + // defaults to "leases". Change this value only if you know what you are doing. + // + // If you are using `configmaps`/`endpoints` resource lock and want to migrate to "leases", + // you might do so by migrating to the respective multilock first ("configmapsleases" or "endpointsleases"), + // which will acquire a leader lock on both resources. + // After all your users have migrated to the multilock, you can go ahead and migrate to "leases". + // Please also keep in mind, that users might skip versions of your controller. + // + // Note: before controller-runtime version v0.7, it was set to "configmaps". + // And from v0.7 to v0.11, the default was "configmapsleases", which was + // used to migrate from configmaps to leases. + // Since the default was "configmapsleases" for over a year, spanning five minor releases, + // any actively maintained operators are very likely to have a released version that uses + // "configmapsleases". Therefore defaulting to "leases" should be safe since v0.12. + // + // So, what do you have to do when you are updating your controller-runtime dependency + // from a lower version to v0.12 or newer? + // - If your operator matches at least one of these conditions: + // - the LeaderElectionResourceLock in your operator has already been explicitly set to "leases" + // - the old controller-runtime version is between v0.7.0 and v0.11.x and the + // LeaderElectionResourceLock wasn't set or was set to "leases"/"configmapsleases"/"endpointsleases" + // feel free to update controller-runtime to v0.12 or newer. + // - Otherwise, you may have to take these steps: + // 1. update controller-runtime to v0.12 or newer in your go.mod + // 2. set LeaderElectionResourceLock to "configmapsleases" (or "endpointsleases") + // 3. package your operator and upgrade it in all your clusters + // 4. only if you have finished 3, you can remove the LeaderElectionResourceLock to use the default "leases" + // Otherwise, your operator might end up with multiple running instances that // each acquired leadership through different resource locks during upgrades and thus // act on the same resources concurrently. - // If you want to migrate to the "leases" resource lock, you might do so by migrating to the - // respective multilock first ("configmapsleases" or "endpointsleases"), which will acquire a - // leader lock on both resources. After all your users have migrated to the multilock, you can - // go ahead and migrate to "leases". Please also keep in mind, that users might skip versions - // of your controller. - // - // Note: before controller-runtime version v0.7, the resource lock was set to "configmaps". - // Please keep this in mind, when planning a proper migration path for your controller. LeaderElectionResourceLock string // LeaderElectionNamespace determines the namespace in which the leader diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/metrics/client_go_adapter.go b/vendor/sigs.k8s.io/controller-runtime/pkg/metrics/client_go_adapter.go index d32ce2534..dc805a9d0 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/metrics/client_go_adapter.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/metrics/client_go_adapter.go @@ -22,7 +22,6 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" - reflectormetrics "k8s.io/client-go/tools/cache" clientmetrics "k8s.io/client-go/tools/metrics" ) @@ -37,19 +36,6 @@ const ( ResultKey = "requests_total" ) -// Metrics subsystem and all keys used by the reflectors. -const ( - ReflectorSubsystem = "reflector" - ListsTotalKey = "lists_total" - ListsDurationKey = "list_duration_seconds" - ItemsPerListKey = "items_per_list" - WatchesTotalKey = "watches_total" - ShortWatchesTotalKey = "short_watches_total" - WatchDurationKey = "watch_duration_seconds" - ItemsPerWatchKey = "items_per_watch" - LastResourceVersionKey = "last_resource_version" -) - var ( // client metrics. @@ -81,64 +67,10 @@ var ( Name: ResultKey, Help: "Number of HTTP requests, partitioned by status code, method, and host.", }, []string{"code", "method", "host"}) - - // reflector metrics. - - // TODO(directxman12): update these to be histograms once the metrics overhaul KEP - // PRs start landing. - - listsTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ - Subsystem: ReflectorSubsystem, - Name: ListsTotalKey, - Help: "Total number of API lists done by the reflectors", - }, []string{"name"}) - - listsDuration = prometheus.NewSummaryVec(prometheus.SummaryOpts{ - Subsystem: ReflectorSubsystem, - Name: ListsDurationKey, - Help: "How long an API list takes to return and decode for the reflectors", - }, []string{"name"}) - - itemsPerList = prometheus.NewSummaryVec(prometheus.SummaryOpts{ - Subsystem: ReflectorSubsystem, - Name: ItemsPerListKey, - Help: "How many items an API list returns to the reflectors", - }, []string{"name"}) - - watchesTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ - Subsystem: ReflectorSubsystem, - Name: WatchesTotalKey, - Help: "Total number of API watches done by the reflectors", - }, []string{"name"}) - - shortWatchesTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ - Subsystem: ReflectorSubsystem, - Name: ShortWatchesTotalKey, - Help: "Total number of short API watches done by the reflectors", - }, []string{"name"}) - - watchDuration = prometheus.NewSummaryVec(prometheus.SummaryOpts{ - Subsystem: ReflectorSubsystem, - Name: WatchDurationKey, - Help: "How long an API watch takes to return and decode for the reflectors", - }, []string{"name"}) - - itemsPerWatch = prometheus.NewSummaryVec(prometheus.SummaryOpts{ - Subsystem: ReflectorSubsystem, - Name: ItemsPerWatchKey, - Help: "How many items an API watch returns to the reflectors", - }, []string{"name"}) - - lastResourceVersion = prometheus.NewGaugeVec(prometheus.GaugeOpts{ - Subsystem: ReflectorSubsystem, - Name: LastResourceVersionKey, - Help: "Last resource version seen for the reflectors", - }, []string{"name"}) ) func init() { registerClientMetrics() - registerReflectorMetrics() } // registerClientMetrics sets up the client latency metrics from client-go. @@ -152,20 +84,6 @@ func registerClientMetrics() { }) } -// registerReflectorMetrics sets up reflector (reconcile) loop metrics. -func registerReflectorMetrics() { - Registry.MustRegister(listsTotal) - Registry.MustRegister(listsDuration) - Registry.MustRegister(itemsPerList) - Registry.MustRegister(watchesTotal) - Registry.MustRegister(shortWatchesTotal) - Registry.MustRegister(watchDuration) - Registry.MustRegister(itemsPerWatch) - Registry.MustRegister(lastResourceVersion) - - reflectormetrics.SetReflectorMetricsProvider(reflectorMetricsProvider{}) -} - // this section contains adapters, implementations, and other sundry organic, artisanally // hand-crafted syntax trees required to convince client-go that it actually wants to let // someone use its metrics. @@ -191,41 +109,3 @@ type resultAdapter struct { func (r *resultAdapter) Increment(_ context.Context, code, method, host string) { r.metric.WithLabelValues(code, method, host).Inc() } - -// Reflector metrics provider (method #2 for client-go metrics), -// copied (more-or-less directly) from k8s.io/kubernetes setup code -// (which isn't anywhere in an easily-importable place). - -type reflectorMetricsProvider struct{} - -func (reflectorMetricsProvider) NewListsMetric(name string) reflectormetrics.CounterMetric { - return listsTotal.WithLabelValues(name) -} - -func (reflectorMetricsProvider) NewListDurationMetric(name string) reflectormetrics.SummaryMetric { - return listsDuration.WithLabelValues(name) -} - -func (reflectorMetricsProvider) NewItemsInListMetric(name string) reflectormetrics.SummaryMetric { - return itemsPerList.WithLabelValues(name) -} - -func (reflectorMetricsProvider) NewWatchesMetric(name string) reflectormetrics.CounterMetric { - return watchesTotal.WithLabelValues(name) -} - -func (reflectorMetricsProvider) NewShortWatchesMetric(name string) reflectormetrics.CounterMetric { - return shortWatchesTotal.WithLabelValues(name) -} - -func (reflectorMetricsProvider) NewWatchDurationMetric(name string) reflectormetrics.SummaryMetric { - return watchDuration.WithLabelValues(name) -} - -func (reflectorMetricsProvider) NewItemsInWatchMetric(name string) reflectormetrics.SummaryMetric { - return itemsPerWatch.WithLabelValues(name) -} - -func (reflectorMetricsProvider) NewLastResourceVersionMetric(name string) reflectormetrics.GaugeMetric { - return lastResourceVersion.WithLabelValues(name) -} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/predicate/predicate.go b/vendor/sigs.k8s.io/controller-runtime/pkg/predicate/predicate.go index 8608e22ac..e79c03072 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/predicate/predicate.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/predicate/predicate.go @@ -176,9 +176,9 @@ func (GenerationChangedPredicate) Update(e event.UpdateEvent) bool { // This predicate will skip update events that have no change in the object's annotation. // It is intended to be used in conjunction with the GenerationChangedPredicate, as in the following example: // -// Controller.Watch( +// Controller.Watch( // &source.Kind{Type: v1.MyCustomKind}, -// &handler.EnqueueRequestForObject{}, +// &handler.EnqueueRequestForObject{}, // predicate.Or(predicate.GenerationChangedPredicate{}, predicate.AnnotationChangedPredicate{})) // // This is mostly useful for controllers that needs to trigger both when the resource's generation is incremented @@ -207,9 +207,10 @@ func (AnnotationChangedPredicate) Update(e event.UpdateEvent) bool { // It is intended to be used in conjunction with the GenerationChangedPredicate, as in the following example: // // Controller.Watch( -// &source.Kind{Type: v1.MyCustomKind}, -// &handler.EnqueueRequestForObject{}, -// predicate.Or(predicate.GenerationChangedPredicate{}, predicate.LabelChangedPredicate{})) +// +// &source.Kind{Type: v1.MyCustomKind}, +// &handler.EnqueueRequestForObject{}, +// predicate.Or(predicate.GenerationChangedPredicate{}, predicate.LabelChangedPredicate{})) // // This will be helpful when object's labels is carrying some extra specification information beyond object's spec, // and the controller will be triggered if any valid spec change (not only in spec, but also in labels) happens. diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/reconcile/reconcile.go b/vendor/sigs.k8s.io/controller-runtime/pkg/reconcile/reconcile.go index b044e6594..8285e2ca9 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/reconcile/reconcile.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/reconcile/reconcile.go @@ -61,24 +61,24 @@ Deleting Kubernetes objects) or external Events (GitHub Webhooks, polling extern Example reconcile Logic: - * Read an object and all the Pods it owns. - * Observe that the object spec specifies 5 replicas but actual cluster contains only 1 Pod replica. - * Create 4 Pods and set their OwnerReferences to the object. +* Read an object and all the Pods it owns. +* Observe that the object spec specifies 5 replicas but actual cluster contains only 1 Pod replica. +* Create 4 Pods and set their OwnerReferences to the object. reconcile may be implemented as either a type: - type reconcile struct {} + type reconciler struct {} - func (reconcile) reconcile(controller.Request) (controller.Result, error) { + func (reconciler) Reconcile(ctx context.Context, o reconcile.Request) (reconcile.Result, error) { // Implement business logic of reading and writing objects here - return controller.Result{}, nil + return reconcile.Result{}, nil } Or as a function: - controller.Func(func(o controller.Request) (controller.Result, error) { + reconcile.Func(func(ctx context.Context, o reconcile.Request) (reconcile.Result, error) { // Implement business logic of reading and writing objects here - return controller.Result{}, nil + return reconcile.Result{}, nil }) Reconciliation is level-based, meaning action isn't driven off changes in individual Events, but instead is diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/scheme/scheme.go b/vendor/sigs.k8s.io/controller-runtime/pkg/scheme/scheme.go index 9dc93a9b2..55ebe2177 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/scheme/scheme.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/scheme/scheme.go @@ -21,37 +21,36 @@ limitations under the License. // Each API group should define a utility function // called AddToScheme for adding its types to a Scheme: // -// // in package myapigroupv1... -// var ( -// SchemeGroupVersion = schema.GroupVersion{Group: "my.api.group", Version: "v1"} -// SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} -// AddToScheme = SchemeBuilder.AddToScheme -// ) +// // in package myapigroupv1... +// var ( +// SchemeGroupVersion = schema.GroupVersion{Group: "my.api.group", Version: "v1"} +// SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} +// AddToScheme = SchemeBuilder.AddToScheme +// ) // -// func init() { -// SchemeBuilder.Register(&MyType{}, &MyTypeList) -// } -// var ( -// scheme *runtime.Scheme = runtime.NewScheme() -// ) +// func init() { +// SchemeBuilder.Register(&MyType{}, &MyTypeList) +// } +// var ( +// scheme *runtime.Scheme = runtime.NewScheme() +// ) // // This also true of the built-in Kubernetes types. Then, in the entrypoint for // your manager, assemble the scheme containing exactly the types you need, // panicing if scheme registration failed. For instance, if our controller needs // types from the core/v1 API group (e.g. Pod), plus types from my.api.group/v1: // -// func init() { -// utilruntime.Must(myapigroupv1.AddToScheme(scheme)) -// utilruntime.Must(kubernetesscheme.AddToScheme(scheme)) -// } -// -// func main() { -// mgr := controllers.NewManager(context.Background(), controllers.GetConfigOrDie(), manager.Options{ -// Scheme: scheme, -// }) -// // ... -// } +// func init() { +// utilruntime.Must(myapigroupv1.AddToScheme(scheme)) +// utilruntime.Must(kubernetesscheme.AddToScheme(scheme)) +// } // +// func main() { +// mgr := controllers.NewManager(context.Background(), controllers.GetConfigOrDie(), manager.Options{ +// Scheme: scheme, +// }) +// // ... +// } package scheme import ( diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/defaulter.go b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/defaulter.go index 0d9aa7a83..e4e0778f5 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/defaulter.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/defaulter.go @@ -21,6 +21,8 @@ import ( "encoding/json" "net/http" + admissionv1 "k8s.io/api/admission/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" ) @@ -56,6 +58,17 @@ func (h *mutatingHandler) Handle(ctx context.Context, req Request) Response { panic("defaulter should never be nil") } + // always skip when a DELETE operation received in mutation handler + // describe in https://github.com/kubernetes-sigs/controller-runtime/issues/1762 + if req.Operation == admissionv1.Delete { + return Response{AdmissionResponse: admissionv1.AdmissionResponse{ + Allowed: true, + Result: &metav1.Status{ + Code: http.StatusOK, + }, + }} + } + // Get the object in the request obj := h.defaulter.DeepCopyObject().(Defaulter) if err := h.decoder.Decode(req, obj); err != nil { diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/webhook.go b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/webhook.go index cfc46637c..d10b97ddd 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/webhook.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/webhook.go @@ -19,6 +19,7 @@ package admission import ( "context" "errors" + "fmt" "net/http" "github.com/go-logr/logr" @@ -27,6 +28,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/json" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/kubernetes/scheme" logf "sigs.k8s.io/controller-runtime/pkg/internal/log" @@ -121,6 +123,9 @@ type Webhook struct { // and potentially patches to apply to the handler. Handler Handler + // RecoverPanic indicates whether the panic caused by webhook should be recovered. + RecoverPanic bool + // WithContextFunc will allow you to take the http.Request.Context() and // add any additional information such as passing the request path or // headers thus allowing you to read them from within the handler @@ -138,11 +143,29 @@ func (wh *Webhook) InjectLogger(l logr.Logger) error { return nil } +// WithRecoverPanic takes a bool flag which indicates whether the panic caused by webhook should be recovered. +func (wh *Webhook) WithRecoverPanic(recoverPanic bool) *Webhook { + wh.RecoverPanic = recoverPanic + return wh +} + // Handle processes AdmissionRequest. // If the webhook is mutating type, it delegates the AdmissionRequest to each handler and merge the patches. // If the webhook is validating type, it delegates the AdmissionRequest to each handler and // deny the request if anyone denies. -func (wh *Webhook) Handle(ctx context.Context, req Request) Response { +func (wh *Webhook) Handle(ctx context.Context, req Request) (response Response) { + if wh.RecoverPanic { + defer func() { + if r := recover(); r != nil { + for _, fn := range utilruntime.PanicHandlers { + fn(r) + } + response = Errored(http.StatusInternalServerError, fmt.Errorf("panic: %v [recovered]", r)) + return + } + }() + } + resp := wh.Handler.Handle(ctx, req) if err := resp.Complete(req); err != nil { wh.log.Error(err, "unable to encode response") diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/server.go b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/server.go index fa56be5d5..06f479208 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/server.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/server.go @@ -299,7 +299,7 @@ func (s *Server) Start(ctx context.Context) error { // server has been started. func (s *Server) StartedChecker() healthz.Checker { config := &tls.Config{ - InsecureSkipVerify: true, // nolint:gosec // config is used to connect to our own webhook port. + InsecureSkipVerify: true, //nolint:gosec // config is used to connect to our own webhook port. } return func(req *http.Request) error { s.mu.Lock() diff --git a/vendor/sigs.k8s.io/json/internal/golang/encoding/json/decode.go b/vendor/sigs.k8s.io/json/internal/golang/encoding/json/decode.go index 3a8b64547..a6c419365 100644 --- a/vendor/sigs.k8s.io/json/internal/golang/encoding/json/decode.go +++ b/vendor/sigs.k8s.io/json/internal/golang/encoding/json/decode.go @@ -93,7 +93,7 @@ import ( // Instead, they are replaced by the Unicode replacement // character U+FFFD. // -func Unmarshal(data []byte, v interface{}, opts ...UnmarshalOpt) error { +func Unmarshal(data []byte, v any, opts ...UnmarshalOpt) error { // Check for well-formedness. // Avoids filling out half a data structure // before discovering a JSON syntax error. @@ -167,16 +167,16 @@ func (e *InvalidUnmarshalError) Error() string { return "json: Unmarshal(nil)" } - if e.Type.Kind() != reflect.Ptr { + if e.Type.Kind() != reflect.Pointer { return "json: Unmarshal(non-pointer " + e.Type.String() + ")" } return "json: Unmarshal(nil " + e.Type.String() + ")" } */ -func (d *decodeState) unmarshal(v interface{}) error { +func (d *decodeState) unmarshal(v any) error { rv := reflect.ValueOf(v) - if rv.Kind() != reflect.Ptr || rv.IsNil() { + if rv.Kind() != reflect.Pointer || rv.IsNil() { return &InvalidUnmarshalError{reflect.TypeOf(v)} } @@ -233,7 +233,7 @@ type decodeState struct { disallowUnknownFields bool savedStrictErrors []error - seenStrictErrors map[string]struct{} + seenStrictErrors map[strictError]struct{} strictFieldStack []string caseSensitive bool @@ -425,7 +425,7 @@ type unquotedValue struct{} // quoted string literal or literal null into an interface value. // If it finds anything other than a quoted string literal or null, // valueQuoted returns unquotedValue{}. -func (d *decodeState) valueQuoted() interface{} { +func (d *decodeState) valueQuoted() any { switch d.opcode { default: panic(phasePanicMsg) @@ -467,7 +467,7 @@ func indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnm // If v is a named type and is addressable, // start with its address, so that if the type has pointer methods, // we find them. - if v.Kind() != reflect.Ptr && v.Type().Name() != "" && v.CanAddr() { + if v.Kind() != reflect.Pointer && v.Type().Name() != "" && v.CanAddr() { haveAddr = true v = v.Addr() } @@ -476,14 +476,14 @@ func indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnm // usefully addressable. if v.Kind() == reflect.Interface && !v.IsNil() { e := v.Elem() - if e.Kind() == reflect.Ptr && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Ptr) { + if e.Kind() == reflect.Pointer && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Pointer) { haveAddr = false v = e continue } } - if v.Kind() != reflect.Ptr { + if v.Kind() != reflect.Pointer { break } @@ -678,7 +678,7 @@ func (d *decodeState) object(v reflect.Value) error { reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: default: - if !reflect.PtrTo(t.Key()).Implements(textUnmarshalerType) { + if !reflect.PointerTo(t.Key()).Implements(textUnmarshalerType) { d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)}) d.skip() return nil @@ -695,7 +695,7 @@ func (d *decodeState) object(v reflect.Value) error { seenKeys = map[string]struct{}{} } if _, seen := seenKeys[fieldName]; seen { - d.saveStrictError(d.newFieldError("duplicate field", fieldName)) + d.saveStrictError(d.newFieldError(duplicateStrictErrType, fieldName)) } else { seenKeys[fieldName] = struct{}{} } @@ -711,7 +711,7 @@ func (d *decodeState) object(v reflect.Value) error { var seenKeys uint64 checkDuplicateField = func(fieldNameIndex int, fieldName string) { if seenKeys&(1< 0 { - return fmt.Errorf("%s %q", msg, strings.Join(d.strictFieldStack, "")+"."+field) + return &strictError{ + ErrType: errType, + Path: strings.Join(d.strictFieldStack, "") + "." + field, + } } else { - return fmt.Errorf("%s %q", msg, field) + return &strictError{ + ErrType: errType, + Path: field, + } } } // saveStrictError saves a strict decoding error, // for reporting at the end of the unmarshal if no other errors occurred. -func (d *decodeState) saveStrictError(err error) { +func (d *decodeState) saveStrictError(err *strictError) { // prevent excessive numbers of accumulated errors if len(d.savedStrictErrors) >= 100 { return } // dedupe accumulated strict errors if d.seenStrictErrors == nil { - d.seenStrictErrors = map[string]struct{}{} + d.seenStrictErrors = map[strictError]struct{}{} } - msg := err.Error() - if _, seen := d.seenStrictErrors[msg]; seen { + if _, seen := d.seenStrictErrors[*err]; seen { return } // accumulate the error - d.seenStrictErrors[msg] = struct{}{} + d.seenStrictErrors[*err] = struct{}{} d.savedStrictErrors = append(d.savedStrictErrors, err) } @@ -118,6 +122,33 @@ func (d *decodeState) appendStrictFieldStackIndex(i int) { d.strictFieldStack = append(d.strictFieldStack, "[", strconv.Itoa(i), "]") } +type strictErrType string + +const ( + unknownStrictErrType strictErrType = "unknown field" + duplicateStrictErrType strictErrType = "duplicate field" +) + +// strictError is a strict decoding error +// It has an ErrType (either unknown or duplicate) +// and a path to the erroneous field +type strictError struct { + ErrType strictErrType + Path string +} + +func (e *strictError) Error() string { + return string(e.ErrType) + " " + strconv.Quote(e.Path) +} + +func (e *strictError) FieldPath() string { + return e.Path +} + +func (e *strictError) SetFieldPath(path string) { + e.Path = path +} + // UnmarshalStrictError holds errors resulting from use of strict disallow___ decoder directives. // If this is returned from Unmarshal(), it means the decoding was successful in all other respects. type UnmarshalStrictError struct { diff --git a/vendor/sigs.k8s.io/json/internal/golang/encoding/json/scanner.go b/vendor/sigs.k8s.io/json/internal/golang/encoding/json/scanner.go index 9dc1903e2..dbaa821be 100644 --- a/vendor/sigs.k8s.io/json/internal/golang/encoding/json/scanner.go +++ b/vendor/sigs.k8s.io/json/internal/golang/encoding/json/scanner.go @@ -83,7 +83,7 @@ type scanner struct { } var scannerPool = sync.Pool{ - New: func() interface{} { + New: func() any { return &scanner{} }, } diff --git a/vendor/sigs.k8s.io/json/internal/golang/encoding/json/stream.go b/vendor/sigs.k8s.io/json/internal/golang/encoding/json/stream.go index 5f87df1c6..6775b4cf8 100644 --- a/vendor/sigs.k8s.io/json/internal/golang/encoding/json/stream.go +++ b/vendor/sigs.k8s.io/json/internal/golang/encoding/json/stream.go @@ -45,7 +45,7 @@ func (dec *Decoder) DisallowUnknownFields() { dec.d.disallowUnknownFields = true // // See the documentation for Unmarshal for details about // the conversion of JSON into a Go value. -func (dec *Decoder) Decode(v interface{}) error { +func (dec *Decoder) Decode(v any) error { if dec.err != nil { return dec.err } @@ -197,7 +197,7 @@ func NewEncoder(w io.Writer) *Encoder { // // See the documentation for Marshal for details about the // conversion of Go values to JSON. -func (enc *Encoder) Encode(v interface{}) error { +func (enc *Encoder) Encode(v any) error { if enc.err != nil { return enc.err } @@ -290,7 +290,7 @@ var _ Unmarshaler = (*RawMessage)(nil) // string, for JSON string literals // nil, for JSON null // -type Token interface{} +type Token any */ const ( @@ -457,7 +457,7 @@ func (dec *Decoder) Token() (Token, error) { if !dec.tokenValueAllowed() { return dec.tokenError(c) } - var x interface{} + var x any if err := dec.Decode(&x); err != nil { return nil, err } diff --git a/vendor/sigs.k8s.io/json/internal/golang/encoding/json/tags.go b/vendor/sigs.k8s.io/json/internal/golang/encoding/json/tags.go index c38fd5102..b490328f4 100644 --- a/vendor/sigs.k8s.io/json/internal/golang/encoding/json/tags.go +++ b/vendor/sigs.k8s.io/json/internal/golang/encoding/json/tags.go @@ -15,10 +15,8 @@ type tagOptions string // parseTag splits a struct field's json tag into its name and // comma-separated options. func parseTag(tag string) (string, tagOptions) { - if idx := strings.Index(tag, ","); idx != -1 { - return tag[:idx], tagOptions(tag[idx+1:]) - } - return tag, tagOptions("") + tag, opt, _ := strings.Cut(tag, ",") + return tag, tagOptions(opt) } // Contains reports whether a comma-separated list of options @@ -30,15 +28,11 @@ func (o tagOptions) Contains(optionName string) bool { } s := string(o) for s != "" { - var next string - i := strings.Index(s, ",") - if i >= 0 { - s, next = s[:i], s[i+1:] - } - if s == optionName { + var name string + name, s, _ = strings.Cut(s, ",") + if name == optionName { return true } - s = next } return false } diff --git a/vendor/sigs.k8s.io/json/json.go b/vendor/sigs.k8s.io/json/json.go index 764e2a84c..d3a42b426 100644 --- a/vendor/sigs.k8s.io/json/json.go +++ b/vendor/sigs.k8s.io/json/json.go @@ -84,6 +84,8 @@ const ( // and a list of the strict failures (if any) are returned. If no `strictOptions` are selected, // all supported strict checks are performed. // +// Strict errors returned will implement the FieldError interface for the specific erroneous fields. +// // Currently supported strict checks are: // - DisallowDuplicateFields: ensure the data contains no duplicate fields // - DisallowUnknownFields: ensure the data contains no unknown fields (when decoding into typed structs) @@ -137,3 +139,12 @@ func SyntaxErrorOffset(err error) (isSyntaxError bool, offset int64) { return false, 0 } } + +// FieldError is an error that provides access to the path of the erroneous field +type FieldError interface { + error + // FieldPath provides the full path of the erroneous field within the json object. + FieldPath() string + // SetFieldPath updates the path of the erroneous field output in the error message. + SetFieldPath(path string) +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/alpha/config-gen/cmd.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/alpha/config-gen/cmd.go index d1b5afd09..33ff0d110 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/alpha/config-gen/cmd.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/alpha/config-gen/cmd.go @@ -223,6 +223,7 @@ The KubebuilderConfigGen resource has the following fields: devCertificate: duration: 1h `) + //nolint:lll c.Example = strings.TrimSpace(` # # As command @@ -253,8 +254,9 @@ kubebuilder alpha config-gen kubebuilderconfiggen.yaml patch1.yaml patch2.yaml # commonAnnotations, resources, configMapGenerator and other transformer plugins. # -# install the latest kustomize -GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v4 +# install the kustomize version used in the v3 plugin +# set VERSION to install a different version +curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/kustomize/v${VERSION:-3.8.9}/hack/install_kustomize.sh" | bash -s -- "${VERSION:-3.8.9}" # install the command as a kustomize plugin kubebuilder alpha config-gen install-as-plugin diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/alpha/config-gen/templates/patches/controller-manager/01-auth-proxy.template.yaml b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/alpha/config-gen/templates/patches/controller-manager/01-auth-proxy.template.yaml index 6ab6f04c6..af2bf1478 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/alpha/config-gen/templates/patches/controller-manager/01-auth-proxy.template.yaml +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/alpha/config-gen/templates/patches/controller-manager/01-auth-proxy.template.yaml @@ -4,7 +4,7 @@ spec: spec: containers: - name: kube-rbac-proxy - image: gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0 + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0 args: - "--secure-listen-address=0.0.0.0:8443" - "--upstream=http://127.0.0.1:8080/" diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/options.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/options.go index 4775d4cca..af3e92c7b 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/options.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/cli/options.go @@ -17,14 +17,27 @@ limitations under the License. package cli import ( + "errors" "fmt" + "io/fs" + "os" + "path/filepath" + "runtime" + "strings" + "github.com/sirupsen/logrus" + "github.com/spf13/afero" "github.com/spf13/cobra" "sigs.k8s.io/kubebuilder/v3/pkg/config" + cfgv2 "sigs.k8s.io/kubebuilder/v3/pkg/config/v2" + cfgv3 "sigs.k8s.io/kubebuilder/v3/pkg/config/v3" "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/external" ) +var retrievePluginsRoot = getPluginsRoot + // Option is a function used as arguments to New in order to configure the resulting CLI. type Option func(*CLI) error @@ -139,3 +152,150 @@ func WithCompletion() Option { return nil } } + +// parseExternalPluginArgs returns the program arguments. +func parseExternalPluginArgs() (args []string) { + // Loop through os.Args and only get flags and their values that should be passed to the plugins + // this also removes the --plugins flag and its values from the list passed to the external plugin + for i := range os.Args { + if strings.Contains(os.Args[i], "--") && !strings.Contains(os.Args[i], "--plugins") { + args = append(args, os.Args[i]) + + // Don't go out of bounds and don't append the next value if it is a flag + if i+1 < len(os.Args) && !strings.Contains(os.Args[i+1], "--") { + args = append(args, os.Args[i+1]) + } + } + } + + return args +} + +// getPluginsRoot detects the host system and gets the plugins root based on the host. +func getPluginsRoot(host string) (pluginsRoot string, err error) { + switch host { + case "darwin": + logrus.Debugf("Detected host is macOS.") + pluginsRoot = filepath.Join("Library", "ApplicationSupport", "kubebuilder", "plugins") + case "linux": + logrus.Debugf("Detected host is Linux.") + pluginsRoot = filepath.Join(".config", "kubebuilder", "plugins") + default: + // freebsd, openbsd, windows... + return "", fmt.Errorf("Host not supported: %v", host) + } + userHomeDir, err := getHomeDir() + if err != nil { + return "", fmt.Errorf("error retrieving home dir: %v", err) + } + pluginsRoot = filepath.Join(userHomeDir, pluginsRoot) + + return pluginsRoot, nil +} + +// DiscoverExternalPlugins discovers the external plugins in the plugins root directory +// and adds them to external.Plugin. +func DiscoverExternalPlugins(fs afero.Fs) (ps []plugin.Plugin, err error) { + pluginsRoot, err := retrievePluginsRoot(runtime.GOOS) + if err != nil { + logrus.Errorf("could not get plugins root: %v", err) + return nil, err + } + + rootInfo, err := fs.Stat(pluginsRoot) + if err != nil { + if errors.Is(err, afero.ErrFileNotFound) { + logrus.Debugf("External plugins dir %q does not exist, skipping external plugin parsing", pluginsRoot) + return nil, nil + } + return nil, err + } + if !rootInfo.IsDir() { + logrus.Debugf("External plugins path %q is not a directory, skipping external plugin parsing", pluginsRoot) + return nil, nil + } + + pluginInfos, err := afero.ReadDir(fs, pluginsRoot) + if err != nil { + return nil, err + } + + for _, pluginInfo := range pluginInfos { + if !pluginInfo.IsDir() { + logrus.Debugf("%q is not a directory so skipping parsing", pluginInfo.Name()) + continue + } + + versions, err := afero.ReadDir(fs, filepath.Join(pluginsRoot, pluginInfo.Name())) + if err != nil { + return nil, err + } + + for _, version := range versions { + if !version.IsDir() { + logrus.Debugf("%q is not a directory so skipping parsing", version.Name()) + continue + } + + pluginFiles, err := afero.ReadDir(fs, filepath.Join(pluginsRoot, pluginInfo.Name(), version.Name())) + if err != nil { + return nil, err + } + + for _, pluginFile := range pluginFiles { + // find the executable that matches the same name as info.Name(). + // if no match is found, compare the external plugin string name before dot + // and match it with info.Name() which is the external plugin root dir. + // for example: sample.sh --> sample, externalplugin.py --> externalplugin + trimmedPluginName := strings.Split(pluginFile.Name(), ".") + if trimmedPluginName[0] == "" { + return nil, fmt.Errorf("Invalid plugin name found %q", pluginFile.Name()) + } + + if pluginFile.Name() == pluginInfo.Name() || trimmedPluginName[0] == pluginInfo.Name() { + // check whether the external plugin is an executable. + if !isPluginExectuable(pluginFile.Mode()) { + return nil, fmt.Errorf("External plugin %q found in path is not an executable", pluginFile.Name()) + } + + ep := external.Plugin{ + PName: pluginInfo.Name(), + Path: filepath.Join(pluginsRoot, pluginInfo.Name(), version.Name(), pluginFile.Name()), + PSupportedProjectVersions: []config.Version{cfgv2.Version, cfgv3.Version}, + Args: parseExternalPluginArgs(), + } + + if err := ep.PVersion.Parse(version.Name()); err != nil { + return nil, err + } + + logrus.Printf("Adding external plugin: %s", ep.Name()) + + ps = append(ps, ep) + + } + } + } + + } + + return ps, nil +} + +// isPluginExectuable checks if a plugin is an executable based on the bitmask and returns true or false. +func isPluginExectuable(mode fs.FileMode) bool { + return mode&0111 != 0 +} + +// getHomeDir returns $XDG_CONFIG_HOME if set, otherwise $HOME. +func getHomeDir() (string, error) { + var err error + xdgHome := os.Getenv("XDG_CONFIG_HOME") + if xdgHome == "" { + xdgHome, err = os.UserHomeDir() + if err != nil { + return "", err + } + } + return xdgHome, nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/config/v2/config.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/config/v2/config.go index 709105ab9..f00e5fa64 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/config/v2/config.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/config/v2/config.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +//go:deprecated This package has been deprecated package v2 import ( diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/machinery/funcmap.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/machinery/funcmap.go index ac25e272d..c4654fb11 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/machinery/funcmap.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/machinery/funcmap.go @@ -21,13 +21,16 @@ import ( "hash/fnv" "strings" "text/template" + + "golang.org/x/text/cases" ) // DefaultFuncMap returns the default template.FuncMap for rendering the template. func DefaultFuncMap() template.FuncMap { return template.FuncMap{ - "title": strings.Title, + "title": cases.Title, "lower": strings.ToLower, + "upper": strings.ToUpper, "isEmptyStr": isEmptyString, "hashFNV": hashFNV, } diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugin/external/types.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugin/external/types.go new file mode 100644 index 000000000..25cdd8b07 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugin/external/types.go @@ -0,0 +1,87 @@ +/* +Copyright 2022 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 external + +import "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + +// PluginRequest contains all information kubebuilder received from the CLI +// and plugins executed before it. +type PluginRequest struct { + // APIVersion defines the versioned schema of PluginRequest that is being sent from Kubebuilder. + // Initially, this will be marked as alpha (v1alpha1). + APIVersion string `json:"apiVersion"` + + // Args holds the plugin specific arguments that are received from the CLI + // which are to be passed down to the external plugin. + Args []string `json:"args"` + + // Command contains the command to be executed by the plugin such as init, create api, etc. + Command string `json:"command"` + + // Universe represents the modified file contents that gets updated over a series of plugin runs + // across the plugin chain. Initially, it starts out as empty. + Universe map[string]string `json:"universe"` +} + +// PluginResponse is returned to kubebuilder by the plugin and contains all files +// written by the plugin following a certain command. +type PluginResponse struct { + // APIVersion defines the versioned schema of the PluginResponse that is back sent back to Kubebuilder. + // Initially, this will be marked as alpha (v1alpha1) + APIVersion string `json:"apiVersion"` + + // Command holds the command that gets executed by the plugin such as init, create api, etc. + Command string `json:"command"` + + // Help contains the plugin specific help text that the plugin returns to Kubebuilder when it receives + // `--help` flag from Kubebuilder. + Metadata plugin.SubcommandMetadata `json:"metadata"` + + // Universe in the PluginResponse represents the updated file contents that was written by the plugin. + Universe map[string]string `json:"universe"` + + // Error is a boolean type that indicates whether there were any errors due to plugin failures. + Error bool `json:"error,omitempty"` + + // ErrorMsgs contains the specific error messages of the plugin failures. + ErrorMsgs []string `json:"errorMsgs,omitempty"` + + // Flags contains the plugin specific flags that the plugin returns to Kubebuilder when it receives + // a request for a list of supported flags from Kubebuilder + Flags []Flag `json:"flags,omitempty"` +} + +// Flag is meant to represent a CLI flag that is used by Kubebuilder to define flags that are parsed +// for use with an external plugin +type Flag struct { + // Name is the name that should be used when creating the flag. + // i.e a name of "domain" would become the CLI flag "--domain" + Name string + + // Type is the type of flag that should be created. The types that + // Kubebuilder supports are: string, bool, int, and float. + // any value other than the supported will be defaulted to be a string + Type string + + // Default is the default value that should be used for a flag. + // Kubebuilder will attempt to convert this value to the defined + // type for this flag. + Default string + + // Usage is a description of the flag and when/why/what it is used for. + Usage string +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugin/util/util.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugin/util/util.go index 1f31904da..f22badac7 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugin/util/util.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugin/util/util.go @@ -72,6 +72,9 @@ func InsertCode(filename, target, code string) error { return err } idx := strings.Index(string(contents), target) + if idx == -1 { + return fmt.Errorf("string %s not found in %s", target, string(contents)) + } out := string(contents[:idx+len(target)]) + code + string(contents[idx+len(target):]) // false positive // nolint:gosec diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/init.go index 1cae07100..620ba6383 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/init.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/init.go @@ -20,8 +20,10 @@ import ( "fmt" "os" "path/filepath" + "runtime" "strings" + log "github.com/sirupsen/logrus" "github.com/spf13/pflag" "sigs.k8s.io/kubebuilder/v3/pkg/config" @@ -33,6 +35,11 @@ import ( var _ plugin.InitSubcommand = &initSubcommand{} +// Verify if the local environment is supported by this plugin +var supportedArchs = []string{"linux/amd64", + "linux/arm64", + "darwin/amd64"} + type initSubcommand struct { config config.Config @@ -43,10 +50,17 @@ type initSubcommand struct { } func (p *initSubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) { - subcmdMeta.Description = `Initialize a common project including the following files: + subcmdMeta.Description = fmt.Sprintf(`Initialize a common project including the following files: - a "PROJECT" file that stores project configuration - several YAML files for project deployment under the "config" directory -` + + NOTE: The kustomize/v1 plugin used to do this scaffold uses the v3 release (%s). +Therefore, darwin/arm64 is not supported since Kustomize does not provide v3 +binaries for this architecture. The currently supported architectures are %q. +More info: https://github.com/kubernetes-sigs/kustomize/issues/4612. + +`, KustomizeVersion, supportedArchs) + subcmdMeta.Examples = fmt.Sprintf(` # Initialize a common project with your domain and name in copyright %[1]s init --plugins common/v3 --domain example.org @@ -94,6 +108,37 @@ func (p *initSubcommand) InjectConfig(c config.Config) error { return nil } +func (p *initSubcommand) PreScaffold(machinery.Filesystem) error { + arch := runtime.GOARCH + // It probably will never return x86_64. However, we are here checking the support for the binaries + // So that, x86_64 means getting the Linux/amd64 binary. Then, we just keep this line to ensure + // that it complies with the same code implementation that we have in the targets. In case someone + // call the command inform the GOARCH=x86_64 then, we will properly handle the scenario + // since it will work successfully and will instal the Linux/amd64 binary via the Makefile target. + arch = strings.Replace(arch, "x86_64", "amd64", -1) + localPlatform := fmt.Sprintf("%s/%s", strings.TrimSpace(runtime.GOOS), strings.TrimSpace(arch)) + + if !hasSupportFor(localPlatform) { + log.Warnf("the platform of this environment (%s) is not suppported by kustomize v3 (%s) which is "+ + "used in this scaffold. You will be unable to download a binary for the kustomize version supported "+ + "and used by this plugin. The currently supported platforms are: %q", + localPlatform, + KustomizeVersion, + supportedArchs) + } + + return nil +} + +func hasSupportFor(localPlatform string) bool { + for _, value := range supportedArchs { + if value == localPlatform { + return true + } + } + return false +} + func (p *initSubcommand) Scaffold(fs machinery.Filesystem) error { scaffolder := scaffolds.NewInitScaffolder(p.config) scaffolder.InjectFS(fs) diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/plugin.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/plugin.go index 46e756ca4..749811a66 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/plugin.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/plugin.go @@ -23,6 +23,9 @@ import ( "sigs.k8s.io/kubebuilder/v3/pkg/plugins" ) +// KustomizeVersion is the kubernetes-sigs/kustomize version to be used in the project +const KustomizeVersion = "v3.8.7" + const pluginName = "kustomize.common." + plugins.DefaultNameQualifier var ( diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/crd/patches/enablecainjection_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/crd/patches/enablecainjection_patch.go index cc688e50f..042f2228a 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/crd/patches/enablecainjection_patch.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/crd/patches/enablecainjection_patch.go @@ -27,13 +27,18 @@ var _ machinery.Template = &EnableCAInjectionPatch{} // EnableCAInjectionPatch scaffolds a file that defines the patch that injects CA into the CRD type EnableCAInjectionPatch struct { machinery.TemplateMixin + machinery.MultiGroupMixin machinery.ResourceMixin } // SetTemplateDefaults implements file.Template func (f *EnableCAInjectionPatch) SetTemplateDefaults() error { if f.Path == "" { - f.Path = filepath.Join("config", "crd", "patches", "cainjection_in_%[plural].yaml") + if f.MultiGroup { + f.Path = filepath.Join("config", "crd", "patches", "cainjection_in_%[group]_%[plural].yaml") + } else { + f.Path = filepath.Join("config", "crd", "patches", "cainjection_in_%[plural].yaml") + } } f.Path = f.Resource.Replacer().Replace(f.Path) diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/crd/patches/enablewebhook_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/crd/patches/enablewebhook_patch.go index 61f41a02c..35662c647 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/crd/patches/enablewebhook_patch.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/crd/patches/enablewebhook_patch.go @@ -27,13 +27,19 @@ var _ machinery.Template = &EnableWebhookPatch{} // EnableWebhookPatch scaffolds a file that defines the patch that enables conversion webhook for the CRD type EnableWebhookPatch struct { machinery.TemplateMixin + machinery.MultiGroupMixin machinery.ResourceMixin } // SetTemplateDefaults implements file.Template func (f *EnableWebhookPatch) SetTemplateDefaults() error { if f.Path == "" { - f.Path = filepath.Join("config", "crd", "patches", "webhook_in_%[plural].yaml") + if f.MultiGroup { + f.Path = filepath.Join("config", "crd", "patches", "webhook_in_%[group]_%[plural].yaml") + } else { + f.Path = filepath.Join("config", "crd", "patches", "webhook_in_%[plural].yaml") + } + } f.Path = f.Resource.Replacer().Replace(f.Path) diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go index add6d630c..d730f432a 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go @@ -55,7 +55,12 @@ spec: spec: containers: - name: kube-rbac-proxy - image: gcr.io/kubebuilder/kube-rbac-proxy:v0.8.0 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0 args: - "--secure-listen-address=0.0.0.0:8443" - "--upstream=http://127.0.0.1:8080/" diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/manager/config.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/manager/config.go index 1c9e6842d..69da1a565 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/manager/config.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/manager/config.go @@ -72,6 +72,13 @@ spec: spec: securityContext: runAsNonRoot: true + # TODO(user): For common cases that do not require escalating privileges + # it is recommended to ensure that all your Pods/Containers are restrictive. + # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + # Please uncomment the following code if your project does NOT have to work on old Kubernetes + # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). + # seccompProfile: + # type: RuntimeDefault containers: - command: - /manager @@ -83,6 +90,9 @@ spec: name: manager securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" livenessProbe: httpGet: path: /healthz diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/manager/controller_manager_config.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/manager/controller_manager_config.go index fa977d90e..e76c6ea66 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/manager/controller_manager_config.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/manager/controller_manager_config.go @@ -55,4 +55,14 @@ webhook: leaderElection: leaderElect: true resourceName: {{ hashFNV .Repo }}.{{ .Domain }} +# leaderElectionReleaseOnCancel defines if the leader should step down volume +# when the Manager ends. This requires the binary to immediately end when the +# Manager is stopped, otherwise, this setting is unsafe. Setting this significantly +# speeds up voluntary leader transitions as the new leader don't have to wait +# LeaseDuration time first. +# In the default scaffold provided, the program ends immediately after +# the manager stops, so would be fine to enable this option. However, +# if you are doing or is intended to do any operation such as perform cleanups +# after the manager stops then its usage might be unsafe. +# leaderElectionReleaseOnCancel: true ` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/rbac/crd_editor_role.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/rbac/crd_editor_role.go index a88328642..ebd32254b 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/rbac/crd_editor_role.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/rbac/crd_editor_role.go @@ -27,13 +27,19 @@ var _ machinery.Template = &CRDEditorRole{} // CRDEditorRole scaffolds a file that defines the role that allows to edit plurals type CRDEditorRole struct { machinery.TemplateMixin + machinery.MultiGroupMixin machinery.ResourceMixin } // SetTemplateDefaults implements file.Template func (f *CRDEditorRole) SetTemplateDefaults() error { if f.Path == "" { - f.Path = filepath.Join("config", "rbac", "%[kind]_editor_role.yaml") + if f.MultiGroup { + f.Path = filepath.Join("config", "rbac", "%[group]_%[kind]_editor_role.yaml") + } else { + f.Path = filepath.Join("config", "rbac", "%[kind]_editor_role.yaml") + } + } f.Path = f.Resource.Replacer().Replace(f.Path) diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/rbac/crd_viewer_role.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/rbac/crd_viewer_role.go index d83c3295f..ba9edfca9 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/rbac/crd_viewer_role.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds/internal/templates/config/rbac/crd_viewer_role.go @@ -27,13 +27,19 @@ var _ machinery.Template = &CRDViewerRole{} // CRDViewerRole scaffolds a file that defines the role that allows to view plurals type CRDViewerRole struct { machinery.TemplateMixin + machinery.MultiGroupMixin machinery.ResourceMixin } // SetTemplateDefaults implements file.Template func (f *CRDViewerRole) SetTemplateDefaults() error { if f.Path == "" { - f.Path = filepath.Join("config", "rbac", "%[kind]_viewer_role.yaml") + if f.MultiGroup { + f.Path = filepath.Join("config", "rbac", "%[group]_%[kind]_viewer_role.yaml") + } else { + f.Path = filepath.Join("config", "rbac", "%[kind]_viewer_role.yaml") + } + } f.Path = f.Resource.Replacer().Replace(f.Path) diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/api.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/api.go new file mode 100644 index 000000000..23a36fc85 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/api.go @@ -0,0 +1,38 @@ +/* +Copyright 2022 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 v2_alpha + +import ( + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds" +) + +var _ plugin.CreateAPISubcommand = &createAPISubcommand{} + +type createAPISubcommand struct { + createSubcommand +} + +func (p *createAPISubcommand) Scaffold(fs machinery.Filesystem) error { + if err := p.configure(); err != nil { + return err + } + scaffolder := scaffolds.NewAPIScaffolder(p.config, *p.resource, p.force) + scaffolder.InjectFS(fs) + return scaffolder.Scaffold() +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/create.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/create.go new file mode 100644 index 000000000..933f112c2 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/create.go @@ -0,0 +1,58 @@ +/* +Copyright 2022 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 v2_alpha + +import ( + "strconv" + + "github.com/spf13/pflag" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" +) + +type createSubcommand struct { + config config.Config + resource *resource.Resource + + flagSet *pflag.FlagSet + + // force indicates whether to scaffold files even if they exist. + force bool +} + +func (p *createSubcommand) BindFlags(fs *pflag.FlagSet) { p.flagSet = fs } + +func (p *createSubcommand) InjectConfig(c config.Config) error { + p.config = c + return nil +} + +func (p *createSubcommand) InjectResource(res *resource.Resource) error { + p.resource = res + return nil +} + +func (p *createSubcommand) configure() (err error) { + if forceFlag := p.flagSet.Lookup("force"); forceFlag != nil { + if p.force, err = strconv.ParseBool(forceFlag.Value.String()); err != nil { + return err + } + + } + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/init.go new file mode 100644 index 000000000..330318cae --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/init.go @@ -0,0 +1,103 @@ +/* +Copyright 2022 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 v2_alpha + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/spf13/pflag" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/internal/validation" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds" +) + +var _ plugin.InitSubcommand = &initSubcommand{} + +type initSubcommand struct { + config config.Config + + // config options + domain string + name string + componentConfig bool +} + +func (p *initSubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) { + subcmdMeta.Description = `Initialize a common project including the following files: + - a "PROJECT" file that stores project configuration + - several YAML files for project deployment under the "config" directory + +NOTE: This plugin requires kustomize version v4 and kubectl >= 1.22. +` + subcmdMeta.Examples = fmt.Sprintf(` # Initialize a common project with your domain and name in copyright + %[1]s init --plugins common/v3 --domain example.org + + # Initialize a common project defining a specific project version + %[1]s init --plugins common/v3 --project-version 3 +`, cliMeta.CommandName) +} + +func (p *initSubcommand) BindFlags(fs *pflag.FlagSet) { + fs.StringVar(&p.domain, "domain", "my.domain", "domain for groups") + fs.StringVar(&p.name, "project-name", "", "name of this project") + fs.BoolVar(&p.componentConfig, "component-config", false, + "create a versioned ComponentConfig file, may be 'true' or 'false'") +} + +func (p *initSubcommand) InjectConfig(c config.Config) error { + p.config = c + + if err := p.config.SetDomain(p.domain); err != nil { + return err + } + + // Assign a default project name + if p.name == "" { + dir, err := os.Getwd() + if err != nil { + return fmt.Errorf("error getting current directory: %v", err) + } + p.name = strings.ToLower(filepath.Base(dir)) + } + // Check if the project name is a valid k8s namespace (DNS 1123 label). + if err := validation.IsDNS1123Label(p.name); err != nil { + return fmt.Errorf("project name (%s) is invalid: %v", p.name, err) + } + if err := p.config.SetProjectName(p.name); err != nil { + return err + } + + if p.componentConfig { + if err := p.config.SetComponentConfig(); err != nil { + return err + } + } + + return nil +} + +func (p *initSubcommand) Scaffold(fs machinery.Filesystem) error { + scaffolder := scaffolds.NewInitScaffolder(p.config) + scaffolder.InjectFS(fs) + return scaffolder.Scaffold() +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/plugin.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/plugin.go new file mode 100644 index 000000000..3acaf4b3a --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/plugin.go @@ -0,0 +1,68 @@ +/* +Copyright 2022 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 v2_alpha + +import ( + "sigs.k8s.io/kubebuilder/v3/pkg/config" + cfgv3 "sigs.k8s.io/kubebuilder/v3/pkg/config/v3" + "sigs.k8s.io/kubebuilder/v3/pkg/model/stage" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins" +) + +// KustomizeVersion is the kubernetes-sigs/kustomize version to be used in the project +const KustomizeVersion = "v4.5.5" + +const pluginName = "kustomize.common." + plugins.DefaultNameQualifier + +var ( + pluginVersion = plugin.Version{Number: 2, Stage: stage.Alpha} + supportedProjectVersions = []config.Version{cfgv3.Version} +) + +var ( + _ plugin.Init = Plugin{} + _ plugin.CreateAPI = Plugin{} + _ plugin.CreateWebhook = Plugin{} +) + +// Plugin implements the plugin.Full interface +type Plugin struct { + initSubcommand + createAPISubcommand + createWebhookSubcommand +} + +// Name returns the name of the plugin +func (Plugin) Name() string { return pluginName } + +// Version returns the version of the plugin +func (Plugin) Version() plugin.Version { return pluginVersion } + +// SupportedProjectVersions returns an array with all project versions supported by the plugin +func (Plugin) SupportedProjectVersions() []config.Version { return supportedProjectVersions } + +// GetInitSubcommand will return the subcommand which is responsible for scaffolding init project +func (p Plugin) GetInitSubcommand() plugin.InitSubcommand { return &p.initSubcommand } + +// GetCreateAPISubcommand will return the subcommand which is responsible for scaffolding apis +func (p Plugin) GetCreateAPISubcommand() plugin.CreateAPISubcommand { return &p.createAPISubcommand } + +// GetCreateWebhookSubcommand will return the subcommand which is responsible for scaffolding webhooks +func (p Plugin) GetCreateWebhookSubcommand() plugin.CreateWebhookSubcommand { + return &p.createWebhookSubcommand +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/api.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/api.go new file mode 100644 index 000000000..5d14ccf99 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/api.go @@ -0,0 +1,87 @@ +/* +Copyright 2022 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 scaffolds + +import ( + "fmt" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/patches" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/samples" +) + +var _ plugins.Scaffolder = &apiScaffolder{} + +// apiScaffolder contains configuration for generating scaffolding for Go type +// representing the API and controller that implements the behavior for the API. +type apiScaffolder struct { + config config.Config + resource resource.Resource + + // fs is the filesystem that will be used by the scaffolder + fs machinery.Filesystem + + // force indicates whether to scaffold files even if they exist. + force bool +} + +// NewAPIScaffolder returns a new Scaffolder for API/controller creation operations +func NewAPIScaffolder(config config.Config, res resource.Resource, force bool) plugins.Scaffolder { + return &apiScaffolder{ + config: config, + resource: res, + force: force, + } +} + +// InjectFS implements cmdutil.Scaffolder +func (s *apiScaffolder) InjectFS(fs machinery.Filesystem) { + s.fs = fs +} + +// Scaffold implements cmdutil.Scaffolder +func (s *apiScaffolder) Scaffold() error { + fmt.Println("Writing kustomize manifests for you to edit...") + + // Initialize the machinery.Scaffold that will write the files to disk + scaffold := machinery.NewScaffold(s.fs, + machinery.WithConfig(s.config), + machinery.WithResource(&s.resource), + ) + + // Keep track of these values before the update + if s.resource.HasAPI() { + if err := scaffold.Execute( + &samples.CRDSample{Force: s.force}, + &rbac.CRDEditorRole{}, + &rbac.CRDViewerRole{}, + &patches.EnableWebhookPatch{}, + &patches.EnableCAInjectionPatch{}, + &crd.Kustomization{}, + &crd.KustomizeConfig{}, + ); err != nil { + return fmt.Errorf("error scaffolding kustomize API manifests: %v", err) + } + } + + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/init.go new file mode 100644 index 000000000..5eba7a17b --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/init.go @@ -0,0 +1,84 @@ +/* +Copyright 2022 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 scaffolds + +import ( + "fmt" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/prometheus" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac" +) + +const ( + imageName = "controller:latest" +) + +var _ plugins.Scaffolder = &initScaffolder{} + +type initScaffolder struct { + config config.Config + + // fs is the filesystem that will be used by the scaffolder + fs machinery.Filesystem +} + +// NewInitScaffolder returns a new Scaffolder for project initialization operations +func NewInitScaffolder(config config.Config) plugins.Scaffolder { + return &initScaffolder{ + config: config, + } +} + +// InjectFS implements cmdutil.Scaffolder +func (s *initScaffolder) InjectFS(fs machinery.Filesystem) { + s.fs = fs +} + +// Scaffold implements cmdutil.Scaffolder +func (s *initScaffolder) Scaffold() error { + fmt.Println("Writing kustomize manifests for you to edit...") + + // Initialize the machinery.Scaffold that will write the files to disk + scaffold := machinery.NewScaffold(s.fs, + machinery.WithConfig(s.config), + ) + + return scaffold.Execute( + &rbac.Kustomization{}, + &rbac.AuthProxyRole{}, + &rbac.AuthProxyRoleBinding{}, + &rbac.AuthProxyService{}, + &rbac.AuthProxyClientRole{}, + &rbac.RoleBinding{}, + &rbac.LeaderElectionRole{}, + &rbac.LeaderElectionRoleBinding{}, + &rbac.ServiceAccount{}, + &manager.Kustomization{}, + &manager.Config{Image: imageName}, + &manager.ControllerManagerConfig{}, + &kdefault.Kustomization{}, + &kdefault.ManagerAuthProxyPatch{}, + &kdefault.ManagerConfigPatch{}, + &prometheus.Kustomization{}, + &prometheus.Monitor{}, + ) +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager/certificate.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager/certificate.go new file mode 100644 index 000000000..70f419221 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager/certificate.go @@ -0,0 +1,71 @@ +/* +Copyright 2020 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 certmanager + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Certificate{} + +// Certificate scaffolds a file that defines the issuer CR and the certificate CR +type Certificate struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *Certificate) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "certmanager", "certificate.yaml") + } + + f.TemplateBody = certManagerTemplate + + // If file exists (ex. because a webhook was already created), skip creation. + f.IfExistsAction = machinery.SkipFile + + return nil +} + +const certManagerTemplate = `# The following manifests contain a self-signed issuer CR and a certificate CR. +# More document can be found at https://docs.cert-manager.io +# WARNING: Targets CertManager v1.0. Check https://cert-manager.io/docs/installation/upgrading/ for breaking changes. +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: selfsigned-issuer + namespace: system +spec: + selfSigned: {} +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: serving-cert # this name should match the one appeared in kustomizeconfig.yaml + namespace: system +spec: + # SERVICE_NAME and SERVICE_NAMESPACE will be substituted by kustomize + dnsNames: + - SERVICE_NAME.SERVICE_NAMESPACE.svc + - SERVICE_NAME.SERVICE_NAMESPACE.svc.cluster.local + issuerRef: + kind: Issuer + name: selfsigned-issuer + secretName: webhook-server-cert # this secret will not be prefixed, since it's not managed by kustomize +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager/kustomization.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager/kustomization.go new file mode 100644 index 000000000..2e31a62d4 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager/kustomization.go @@ -0,0 +1,51 @@ +/* +Copyright 2020 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 certmanager + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Kustomization{} + +// Kustomization scaffolds a file that defines the kustomization scheme for the certmanager folder +type Kustomization struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *Kustomization) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "certmanager", "kustomization.yaml") + } + + f.TemplateBody = kustomizationTemplate + + // If file exists (ex. because a webhook was already created), skip creation. + f.IfExistsAction = machinery.SkipFile + + return nil +} + +const kustomizationTemplate = `resources: +- certificate.yaml + +configurations: +- kustomizeconfig.yaml +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager/kustomizeconfig.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager/kustomizeconfig.go new file mode 100644 index 000000000..7e62db118 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager/kustomizeconfig.go @@ -0,0 +1,55 @@ +/* +Copyright 2020 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 certmanager + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &KustomizeConfig{} + +// KustomizeConfig scaffolds a file that configures the kustomization for the certmanager folder +type KustomizeConfig struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *KustomizeConfig) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "certmanager", "kustomizeconfig.yaml") + } + + f.TemplateBody = kustomizeConfigTemplate + + // If file exists (ex. because a webhook was already created), skip creation. + f.IfExistsAction = machinery.SkipFile + + return nil +} + +//nolint:lll +const kustomizeConfigTemplate = `# This configuration is for teaching kustomize how to update name ref substitution +nameReference: +- kind: Issuer + group: cert-manager.io + fieldSpecs: + - kind: Certificate + group: cert-manager.io + path: spec/issuerRef/name +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/kustomization.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/kustomization.go new file mode 100644 index 000000000..25fbc18af --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/kustomization.go @@ -0,0 +1,125 @@ +/* +Copyright 2020 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 crd + +import ( + "fmt" + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var ( + _ machinery.Template = &Kustomization{} + _ machinery.Inserter = &Kustomization{} +) + +// Kustomization scaffolds a file that defines the kustomization scheme for the crd folder +type Kustomization struct { + machinery.TemplateMixin + machinery.ResourceMixin +} + +// SetTemplateDefaults implements file.Template +func (f *Kustomization) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "crd", "kustomization.yaml") + } + f.Path = f.Resource.Replacer().Replace(f.Path) + + f.TemplateBody = fmt.Sprintf(kustomizationTemplate, + machinery.NewMarkerFor(f.Path, resourceMarker), + machinery.NewMarkerFor(f.Path, webhookPatchMarker), + machinery.NewMarkerFor(f.Path, caInjectionPatchMarker), + ) + + return nil +} + +const ( + resourceMarker = "crdkustomizeresource" + webhookPatchMarker = "crdkustomizewebhookpatch" + caInjectionPatchMarker = "crdkustomizecainjectionpatch" +) + +// GetMarkers implements file.Inserter +func (f *Kustomization) GetMarkers() []machinery.Marker { + return []machinery.Marker{ + machinery.NewMarkerFor(f.Path, resourceMarker), + machinery.NewMarkerFor(f.Path, webhookPatchMarker), + machinery.NewMarkerFor(f.Path, caInjectionPatchMarker), + } +} + +const ( + resourceCodeFragment = `- bases/%s_%s.yaml +` + webhookPatchCodeFragment = `#- patches/webhook_in_%s.yaml +` + caInjectionPatchCodeFragment = `#- patches/cainjection_in_%s.yaml +` +) + +// GetCodeFragments implements file.Inserter +func (f *Kustomization) GetCodeFragments() machinery.CodeFragmentsMap { + fragments := make(machinery.CodeFragmentsMap, 3) + + // Generate resource code fragments + res := make([]string, 0) + res = append(res, fmt.Sprintf(resourceCodeFragment, f.Resource.QualifiedGroup(), f.Resource.Plural)) + + // Generate resource code fragments + webhookPatch := make([]string, 0) + webhookPatch = append(webhookPatch, fmt.Sprintf(webhookPatchCodeFragment, f.Resource.Plural)) + + // Generate resource code fragments + caInjectionPatch := make([]string, 0) + caInjectionPatch = append(caInjectionPatch, fmt.Sprintf(caInjectionPatchCodeFragment, f.Resource.Plural)) + + // Only store code fragments in the map if the slices are non-empty + if len(res) != 0 { + fragments[machinery.NewMarkerFor(f.Path, resourceMarker)] = res + } + if len(webhookPatch) != 0 { + fragments[machinery.NewMarkerFor(f.Path, webhookPatchMarker)] = webhookPatch + } + if len(caInjectionPatch) != 0 { + fragments[machinery.NewMarkerFor(f.Path, caInjectionPatchMarker)] = caInjectionPatch + } + + return fragments +} + +var kustomizationTemplate = `# This kustomization.yaml is not intended to be run by itself, +# since it depends on service name and namespace that are out of this kustomize package. +# It should be run by config/default +resources: +%s + +patchesStrategicMerge: +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix. +# patches here are for enabling the conversion webhook for each CRD +%s + +# [CERTMANAGER] To enable cert-manager, uncomment all the sections with [CERTMANAGER] prefix. +# patches here are for enabling the CA injection for each CRD +%s + +# the following config is for teaching kustomize how to do kustomization for CRDs. +configurations: +- kustomizeconfig.yaml +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/kustomizeconfig.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/kustomizeconfig.go new file mode 100644 index 000000000..428bfde8b --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/kustomizeconfig.go @@ -0,0 +1,72 @@ +/* +Copyright 2020 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 crd + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &KustomizeConfig{} + +// KustomizeConfig scaffolds a file that configures the kustomization for the crd folder +type KustomizeConfig struct { + machinery.TemplateMixin + machinery.ResourceMixin +} + +// SetTemplateDefaults implements file.Template +func (f *KustomizeConfig) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "crd", "kustomizeconfig.yaml") + } + + f.TemplateBody = kustomizeConfigTemplate + + return nil +} + +//nolint:lll +const kustomizeConfigTemplate = `# This file is for teaching kustomize how to substitute name and namespace reference in CRD +nameReference: +- kind: Service + version: v1 + fieldSpecs: + - kind: CustomResourceDefinition + version: {{ .Resource.API.CRDVersion }} + group: apiextensions.k8s.io + {{- if ne .Resource.API.CRDVersion "v1" }} + path: spec/conversion/webhookClientConfig/service/name + {{- else }} + path: spec/conversion/webhook/clientConfig/service/name + {{- end }} + +namespace: +- kind: CustomResourceDefinition + version: {{ .Resource.API.CRDVersion }} + group: apiextensions.k8s.io + {{- if ne .Resource.API.CRDVersion "v1" }} + path: spec/conversion/webhookClientConfig/service/namespace + {{- else }} + path: spec/conversion/webhook/clientConfig/service/namespace + {{- end }} + create: false + +varReference: +- path: metadata/annotations +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/patches/enablecainjection_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/patches/enablecainjection_patch.go new file mode 100644 index 000000000..1847743ec --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/patches/enablecainjection_patch.go @@ -0,0 +1,61 @@ +/* +Copyright 2020 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 patches + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &EnableCAInjectionPatch{} + +// EnableCAInjectionPatch scaffolds a file that defines the patch that injects CA into the CRD +type EnableCAInjectionPatch struct { + machinery.TemplateMixin + machinery.MultiGroupMixin + machinery.ResourceMixin +} + +// SetTemplateDefaults implements file.Template +func (f *EnableCAInjectionPatch) SetTemplateDefaults() error { + if f.Path == "" { + if f.MultiGroup { + f.Path = filepath.Join("config", "crd", "patches", "cainjection_in_%[group]_%[plural].yaml") + } else { + f.Path = filepath.Join("config", "crd", "patches", "cainjection_in_%[plural].yaml") + } + } + f.Path = f.Resource.Replacer().Replace(f.Path) + + f.TemplateBody = enableCAInjectionPatchTemplate + + return nil +} + +//nolint:lll +const enableCAInjectionPatchTemplate = `# The following patch adds a directive for certmanager to inject CA into the CRD +{{- if ne .Resource.API.CRDVersion "v1" }} +# CRD conversion requires k8s 1.13 or later. +{{- end }} +apiVersion: apiextensions.k8s.io/{{ .Resource.API.CRDVersion }} +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: CERTIFICATE_NAMESPACE/CERTIFICATE_NAME + name: {{ .Resource.Plural }}.{{ .Resource.QualifiedGroup }} +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/patches/enablewebhook_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/patches/enablewebhook_patch.go new file mode 100644 index 000000000..35662c647 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/crd/patches/enablewebhook_patch.go @@ -0,0 +1,78 @@ +/* +Copyright 2020 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 patches + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &EnableWebhookPatch{} + +// EnableWebhookPatch scaffolds a file that defines the patch that enables conversion webhook for the CRD +type EnableWebhookPatch struct { + machinery.TemplateMixin + machinery.MultiGroupMixin + machinery.ResourceMixin +} + +// SetTemplateDefaults implements file.Template +func (f *EnableWebhookPatch) SetTemplateDefaults() error { + if f.Path == "" { + if f.MultiGroup { + f.Path = filepath.Join("config", "crd", "patches", "webhook_in_%[group]_%[plural].yaml") + } else { + f.Path = filepath.Join("config", "crd", "patches", "webhook_in_%[plural].yaml") + } + + } + f.Path = f.Resource.Replacer().Replace(f.Path) + + f.TemplateBody = enableWebhookPatchTemplate + + return nil +} + +const enableWebhookPatchTemplate = `# The following patch enables a conversion webhook for the CRD +{{- if ne .Resource.API.CRDVersion "v1" }} +# CRD conversion requires k8s 1.13 or later. +{{- end }} +apiVersion: apiextensions.k8s.io/{{ .Resource.API.CRDVersion }} +kind: CustomResourceDefinition +metadata: + name: {{ .Resource.Plural }}.{{ .Resource.QualifiedGroup }} +spec: + conversion: + strategy: Webhook + {{- if ne .Resource.API.CRDVersion "v1" }} + webhookClientConfig: + service: + namespace: system + name: webhook-service + path: /convert + {{- else }} + webhook: + clientConfig: + service: + namespace: system + name: webhook-service + path: /convert + conversionReviewVersions: + - {{ .Resource.API.CRDVersion }} + {{- end }} +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/enablecainection_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/enablecainection_patch.go new file mode 100644 index 000000000..39e3a6189 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/enablecainection_patch.go @@ -0,0 +1,62 @@ +/* +Copyright 2020 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 kdefault + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &WebhookCAInjectionPatch{} + +// WebhookCAInjectionPatch scaffolds a file that defines the patch that adds annotation to webhooks +type WebhookCAInjectionPatch struct { + machinery.TemplateMixin + machinery.ResourceMixin +} + +// SetTemplateDefaults implements file.Template +func (f *WebhookCAInjectionPatch) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "default", "webhookcainjection_patch.yaml") + } + + f.TemplateBody = injectCAPatchTemplate + + // If file exists (ex. because a webhook was already created), skip creation. + f.IfExistsAction = machinery.SkipFile + + return nil +} + +const injectCAPatchTemplate = `# This patch add annotation to admission webhook config and +# CERTIFICATE_NAMESPACE and CERTIFICATE_NAME will be substituted by kustomize +apiVersion: admissionregistration.k8s.io/{{ .Resource.Webhooks.WebhookVersion }} +kind: MutatingWebhookConfiguration +metadata: + name: mutating-webhook-configuration + annotations: + cert-manager.io/inject-ca-from: CERTIFICATE_NAMESPACE/CERTIFICATE_NAME +--- +apiVersion: admissionregistration.k8s.io/{{ .Resource.Webhooks.WebhookVersion }} +kind: ValidatingWebhookConfiguration +metadata: + name: validating-webhook-configuration + annotations: + cert-manager.io/inject-ca-from: CERTIFICATE_NAMESPACE/CERTIFICATE_NAME +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/kustomization.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/kustomization.go new file mode 100644 index 000000000..0f8dbe269 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/kustomization.go @@ -0,0 +1,193 @@ +/* +Copyright 2020 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 kdefault + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Kustomization{} + +// Kustomization scaffolds a file that defines the kustomization scheme for the default overlay folder +type Kustomization struct { + machinery.TemplateMixin + machinery.ProjectNameMixin + machinery.ComponentConfigMixin +} + +// SetTemplateDefaults implements file.Template +func (f *Kustomization) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "default", "kustomization.yaml") + } + + f.TemplateBody = kustomizeTemplate + + f.IfExistsAction = machinery.Error + + return nil +} + +const kustomizeTemplate = `# Adds namespace to all resources. +namespace: {{ .ProjectName }}-system + +# Value of this field is prepended to the +# names of all resources, e.g. a deployment named +# "wordpress" becomes "alices-wordpress". +# Note that it should also match with the prefix (text before '-') of the namespace +# field above. +namePrefix: {{ .ProjectName }}- + +# Labels to add to all resources and selectors. +#labels: +#- includeSelectors: true +# pairs: +# someName: someValue + +resources: +- ../crd +- ../rbac +- ../manager +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- ../webhook +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required. +#- ../certmanager +# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. +#- ../prometheus + +patchesStrategicMerge: +# Protect the /metrics endpoint by putting it behind auth. +# If you want your controller-manager to expose the /metrics +# endpoint w/o any authn/z, please comment the following line. +- manager_auth_proxy_patch.yaml + +# Mount the controller config file for loading manager configurations +# through a ComponentConfig type +{{ if not .ComponentConfig }}#{{ end }}- manager_config_patch.yaml + +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- manager_webhook_patch.yaml + +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. +# Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks. +# 'CERTMANAGER' needs to be enabled to use ca injection +#- webhookcainjection_patch.yaml + +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. +# Uncomment the following replacements to add the cert-manager CA injection annotations +#replacements: +# - source: # Add cert-manager annotation to ValidatingWebhookConfiguration, MutatingWebhookConfiguration and CRDs +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.namespace # namespace of the certificate CR +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - source: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.name +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - source: # Add cert-manager annotation to the webhook Service +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.name # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 0 +# create: true +# - source: +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.namespace # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 1 +# create: true +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go new file mode 100644 index 000000000..d730f432a --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go @@ -0,0 +1,87 @@ +/* +Copyright 2020 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 kdefault + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &ManagerAuthProxyPatch{} + +// ManagerAuthProxyPatch scaffolds a file that defines the patch that enables prometheus metrics for the manager +type ManagerAuthProxyPatch struct { + machinery.TemplateMixin + machinery.ComponentConfigMixin +} + +// SetTemplateDefaults implements file.Template +func (f *ManagerAuthProxyPatch) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "default", "manager_auth_proxy_patch.yaml") + } + + f.TemplateBody = kustomizeAuthProxyPatchTemplate + + f.IfExistsAction = machinery.Error + + return nil +} + +const kustomizeAuthProxyPatchTemplate = `# This patch inject a sidecar container which is a HTTP proxy for the +# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system +spec: + template: + spec: + containers: + - name: kube-rbac-proxy + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0 + args: + - "--secure-listen-address=0.0.0.0:8443" + - "--upstream=http://127.0.0.1:8080/" + - "--logtostderr=true" + - "--v=0" + ports: + - containerPort: 8443 + protocol: TCP + name: https + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 5m + memory: 64Mi +{{- if not .ComponentConfig }} + - name: manager + args: + - "--health-probe-bind-address=:8081" + - "--metrics-bind-address=127.0.0.1:8080" + - "--leader-elect" +{{- end }} +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/manager_config_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/manager_config_patch.go new file mode 100644 index 000000000..fb620573b --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/manager_config_patch.go @@ -0,0 +1,63 @@ +/* +Copyright 2020 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 kdefault + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &ManagerConfigPatch{} + +// ManagerConfigPatch scaffolds a ManagerConfigPatch for a Resource +type ManagerConfigPatch struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements input.Template +func (f *ManagerConfigPatch) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "default", "manager_config_patch.yaml") + } + + f.TemplateBody = managerConfigPatchTemplate + + return nil +} + +const managerConfigPatchTemplate = `apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system +spec: + template: + spec: + containers: + - name: manager + args: + - "--config=controller_manager_config.yaml" + volumeMounts: + - name: manager-config + mountPath: /controller_manager_config.yaml + subPath: controller_manager_config.yaml + volumes: + - name: manager-config + configMap: + name: manager-config +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/webhook_manager_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/webhook_manager_patch.go new file mode 100644 index 000000000..7f993dbd3 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault/webhook_manager_patch.go @@ -0,0 +1,75 @@ +/* +Copyright 2020 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 kdefault + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &ManagerWebhookPatch{} + +// ManagerWebhookPatch scaffolds a file that defines the patch that enables webhooks on the manager +type ManagerWebhookPatch struct { + machinery.TemplateMixin + + Force bool +} + +// SetTemplateDefaults implements file.Template +func (f *ManagerWebhookPatch) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "default", "manager_webhook_patch.yaml") + } + + f.TemplateBody = managerWebhookPatchTemplate + + if f.Force { + f.IfExistsAction = machinery.OverwriteFile + } else { + // If file exists (ex. because a webhook was already created), skip creation. + f.IfExistsAction = machinery.SkipFile + } + + return nil +} + +const managerWebhookPatchTemplate = `apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system +spec: + template: + spec: + containers: + - name: manager + ports: + - containerPort: 9443 + name: webhook-server + protocol: TCP + volumeMounts: + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: cert + readOnly: true + volumes: + - name: cert + secret: + defaultMode: 420 + secretName: webhook-server-cert +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager/config.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager/config.go new file mode 100644 index 000000000..69da1a565 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager/config.go @@ -0,0 +1,119 @@ +/* +Copyright 2020 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 manager + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Config{} + +// Config scaffolds a file that defines the namespace and the manager deployment +type Config struct { + machinery.TemplateMixin + machinery.ComponentConfigMixin + + // Image is controller manager image name + Image string +} + +// SetTemplateDefaults implements file.Template +func (f *Config) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "manager", "manager.yaml") + } + + f.TemplateBody = configTemplate + + return nil +} + +const configTemplate = `apiVersion: v1 +kind: Namespace +metadata: + labels: + control-plane: controller-manager + name: system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system + labels: + control-plane: controller-manager +spec: + selector: + matchLabels: + control-plane: controller-manager + replicas: 1 + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + securityContext: + runAsNonRoot: true + # TODO(user): For common cases that do not require escalating privileges + # it is recommended to ensure that all your Pods/Containers are restrictive. + # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + # Please uncomment the following code if your project does NOT have to work on old Kubernetes + # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). + # seccompProfile: + # type: RuntimeDefault + containers: + - command: + - /manager +{{- if not .ComponentConfig }} + args: + - --leader-elect +{{- end }} + image: {{ .Image }} + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + # TODO(user): Configure the resources accordingly based on the project requirements. + # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager/controller_manager_config.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager/controller_manager_config.go new file mode 100644 index 000000000..e76c6ea66 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager/controller_manager_config.go @@ -0,0 +1,68 @@ +/* +Copyright 2020 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 manager + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &ControllerManagerConfig{} + +// ControllerManagerConfig scaffolds the config file in config/manager folder. +type ControllerManagerConfig struct { + machinery.TemplateMixin + machinery.DomainMixin + machinery.RepositoryMixin +} + +// SetTemplateDefaults implements input.Template +func (f *ControllerManagerConfig) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "manager", "controller_manager_config.yaml") + } + + f.TemplateBody = controllerManagerConfigTemplate + + f.IfExistsAction = machinery.Error + + return nil +} + +const controllerManagerConfigTemplate = `apiVersion: controller-runtime.sigs.k8s.io/v1alpha1 +kind: ControllerManagerConfig +health: + healthProbeBindAddress: :8081 +metrics: + bindAddress: 127.0.0.1:8080 +webhook: + port: 9443 +leaderElection: + leaderElect: true + resourceName: {{ hashFNV .Repo }}.{{ .Domain }} +# leaderElectionReleaseOnCancel defines if the leader should step down volume +# when the Manager ends. This requires the binary to immediately end when the +# Manager is stopped, otherwise, this setting is unsafe. Setting this significantly +# speeds up voluntary leader transitions as the new leader don't have to wait +# LeaseDuration time first. +# In the default scaffold provided, the program ends immediately after +# the manager stops, so would be fine to enable this option. However, +# if you are doing or is intended to do any operation such as perform cleanups +# after the manager stops then its usage might be unsafe. +# leaderElectionReleaseOnCancel: true +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager/kustomization.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager/kustomization.go new file mode 100644 index 000000000..eec807da3 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/manager/kustomization.go @@ -0,0 +1,55 @@ +/* +Copyright 2020 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 manager + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Kustomization{} + +// Kustomization scaffolds a file that defines the kustomization scheme for the manager folder +type Kustomization struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *Kustomization) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "manager", "kustomization.yaml") + } + + f.TemplateBody = kustomizeManagerTemplate + + f.IfExistsAction = machinery.Error + + return nil +} + +const kustomizeManagerTemplate = `resources: +- manager.yaml + +generatorOptions: + disableNameSuffixHash: true + +configMapGenerator: +- name: manager-config + files: + - controller_manager_config.yaml +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/prometheus/kustomization.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/prometheus/kustomization.go new file mode 100644 index 000000000..76bf6e1c5 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/prometheus/kustomization.go @@ -0,0 +1,45 @@ +/* +Copyright 2020 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 prometheus + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Kustomization{} + +// Kustomization scaffolds a file that defines the kustomization scheme for the prometheus folder +type Kustomization struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *Kustomization) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "prometheus", "kustomization.yaml") + } + + f.TemplateBody = kustomizationTemplate + + return nil +} + +const kustomizationTemplate = `resources: +- monitor.yaml +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/prometheus/monitor.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/prometheus/monitor.go new file mode 100644 index 000000000..261282075 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/prometheus/monitor.go @@ -0,0 +1,63 @@ +/* +Copyright 2020 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 prometheus + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Monitor{} + +// Monitor scaffolds a file that defines the prometheus service monitor +type Monitor struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *Monitor) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "prometheus", "monitor.yaml") + } + + f.TemplateBody = serviceMonitorTemplate + + return nil +} + +const serviceMonitorTemplate = ` +# Prometheus Monitor Service (Metrics) +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + labels: + control-plane: controller-manager + name: controller-manager-metrics-monitor + namespace: system +spec: + endpoints: + - path: /metrics + port: https + scheme: https + bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token + tlsConfig: + insecureSkipVerify: true + selector: + matchLabels: + control-plane: controller-manager +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_client_role.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_client_role.go new file mode 100644 index 000000000..75cbeac0b --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_client_role.go @@ -0,0 +1,52 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &AuthProxyClientRole{} + +// AuthProxyClientRole scaffolds a file that defines the role for the metrics reader +type AuthProxyClientRole struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *AuthProxyClientRole) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "rbac", "auth_proxy_client_clusterrole.yaml") + } + + f.TemplateBody = clientClusterRoleTemplate + + return nil +} + +const clientClusterRoleTemplate = `apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: metrics-reader +rules: +- nonResourceURLs: + - "/metrics" + verbs: + - get +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_role.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_role.go new file mode 100644 index 000000000..1b7780920 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_role.go @@ -0,0 +1,60 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &AuthProxyRole{} + +// AuthProxyRole scaffolds a file that defines the role for the auth proxy +type AuthProxyRole struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *AuthProxyRole) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "rbac", "auth_proxy_role.yaml") + } + + f.TemplateBody = proxyRoleTemplate + + return nil +} + +const proxyRoleTemplate = `apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: proxy-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_role_binding.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_role_binding.go new file mode 100644 index 000000000..9bbc09da9 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_role_binding.go @@ -0,0 +1,55 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &AuthProxyRoleBinding{} + +// AuthProxyRoleBinding scaffolds a file that defines the role binding for the auth proxy +type AuthProxyRoleBinding struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *AuthProxyRoleBinding) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "rbac", "auth_proxy_role_binding.yaml") + } + + f.TemplateBody = proxyRoleBindinggTemplate + + return nil +} + +const proxyRoleBindinggTemplate = `apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: proxy-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_service.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_service.go new file mode 100644 index 000000000..66b99461d --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/auth_proxy_service.go @@ -0,0 +1,58 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &AuthProxyService{} + +// AuthProxyService scaffolds a file that defines the service for the auth proxy +type AuthProxyService struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *AuthProxyService) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "rbac", "auth_proxy_service.yaml") + } + + f.TemplateBody = authProxyServiceTemplate + + return nil +} + +const authProxyServiceTemplate = `apiVersion: v1 +kind: Service +metadata: + labels: + control-plane: controller-manager + name: controller-manager-metrics-service + namespace: system +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + selector: + control-plane: controller-manager +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/crd_editor_role.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/crd_editor_role.go new file mode 100644 index 000000000..ebd32254b --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/crd_editor_role.go @@ -0,0 +1,75 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &CRDEditorRole{} + +// CRDEditorRole scaffolds a file that defines the role that allows to edit plurals +type CRDEditorRole struct { + machinery.TemplateMixin + machinery.MultiGroupMixin + machinery.ResourceMixin +} + +// SetTemplateDefaults implements file.Template +func (f *CRDEditorRole) SetTemplateDefaults() error { + if f.Path == "" { + if f.MultiGroup { + f.Path = filepath.Join("config", "rbac", "%[group]_%[kind]_editor_role.yaml") + } else { + f.Path = filepath.Join("config", "rbac", "%[kind]_editor_role.yaml") + } + + } + f.Path = f.Resource.Replacer().Replace(f.Path) + + f.TemplateBody = crdRoleEditorTemplate + + return nil +} + +const crdRoleEditorTemplate = `# permissions for end users to edit {{ .Resource.Plural }}. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ lower .Resource.Kind }}-editor-role +rules: +- apiGroups: + - {{ .Resource.QualifiedGroup }} + resources: + - {{ .Resource.Plural }} + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - {{ .Resource.QualifiedGroup }} + resources: + - {{ .Resource.Plural }}/status + verbs: + - get +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/crd_viewer_role.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/crd_viewer_role.go new file mode 100644 index 000000000..ba9edfca9 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/crd_viewer_role.go @@ -0,0 +1,71 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &CRDViewerRole{} + +// CRDViewerRole scaffolds a file that defines the role that allows to view plurals +type CRDViewerRole struct { + machinery.TemplateMixin + machinery.MultiGroupMixin + machinery.ResourceMixin +} + +// SetTemplateDefaults implements file.Template +func (f *CRDViewerRole) SetTemplateDefaults() error { + if f.Path == "" { + if f.MultiGroup { + f.Path = filepath.Join("config", "rbac", "%[group]_%[kind]_viewer_role.yaml") + } else { + f.Path = filepath.Join("config", "rbac", "%[kind]_viewer_role.yaml") + } + + } + f.Path = f.Resource.Replacer().Replace(f.Path) + + f.TemplateBody = crdRoleViewerTemplate + + return nil +} + +const crdRoleViewerTemplate = `# permissions for end users to view {{ .Resource.Plural }}. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ lower .Resource.Kind }}-viewer-role +rules: +- apiGroups: + - {{ .Resource.QualifiedGroup }} + resources: + - {{ .Resource.Plural }} + verbs: + - get + - list + - watch +- apiGroups: + - {{ .Resource.QualifiedGroup }} + resources: + - {{ .Resource.Plural }}/status + verbs: + - get +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/kustomization.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/kustomization.go new file mode 100644 index 000000000..d3ea9b22f --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/kustomization.go @@ -0,0 +1,63 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Kustomization{} + +// Kustomization scaffolds a file that defines the kustomization scheme for the rbac folder +type Kustomization struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *Kustomization) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "rbac", "kustomization.yaml") + } + + f.TemplateBody = kustomizeRBACTemplate + + f.IfExistsAction = machinery.Error + + return nil +} + +const kustomizeRBACTemplate = `resources: +# All RBAC will be applied under this service account in +# the deployment namespace. You may comment out this resource +# if your manager will use a service account that exists at +# runtime. Be sure to update RoleBinding and ClusterRoleBinding +# subjects if changing service account names. +- service_account.yaml +- role.yaml +- role_binding.yaml +- leader_election_role.yaml +- leader_election_role_binding.yaml +# Comment the following 4 lines if you want to disable +# the auth proxy (https://github.com/brancz/kube-rbac-proxy) +# which protects your /metrics endpoint. +- auth_proxy_service.yaml +- auth_proxy_role.yaml +- auth_proxy_role_binding.yaml +- auth_proxy_client_clusterrole.yaml +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/leader_election_role.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/leader_election_role.go new file mode 100644 index 000000000..8a510637c --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/leader_election_role.go @@ -0,0 +1,80 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &LeaderElectionRole{} + +// LeaderElectionRole scaffolds a file that defines the role that allows leader election +type LeaderElectionRole struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *LeaderElectionRole) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "rbac", "leader_election_role.yaml") + } + + f.TemplateBody = leaderElectionRoleTemplate + + return nil +} + +const leaderElectionRoleTemplate = `# permissions to do leader election. +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: leader-election-role +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/leader_election_role_binding.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/leader_election_role_binding.go new file mode 100644 index 000000000..8148f9ab3 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/leader_election_role_binding.go @@ -0,0 +1,55 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &LeaderElectionRoleBinding{} + +// LeaderElectionRoleBinding scaffolds a file that defines the role binding that allows leader election +type LeaderElectionRoleBinding struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *LeaderElectionRoleBinding) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "rbac", "leader_election_role_binding.yaml") + } + + f.TemplateBody = leaderElectionRoleBindingTemplate + + return nil +} + +const leaderElectionRoleBindingTemplate = `apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: leader-election-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: leader-election-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/role_binding.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/role_binding.go new file mode 100644 index 000000000..9473660e0 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/role_binding.go @@ -0,0 +1,55 @@ +/* +Copyright 2020 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &RoleBinding{} + +// RoleBinding scaffolds a file that defines the role binding for the manager +type RoleBinding struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *RoleBinding) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "rbac", "role_binding.yaml") + } + + f.TemplateBody = managerBindingTemplate + + return nil +} + +const managerBindingTemplate = `apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: manager-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/service_account.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/service_account.go new file mode 100644 index 000000000..8c772b3a7 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/rbac/service_account.go @@ -0,0 +1,48 @@ +/* +Copyright 2022 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 rbac + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &ServiceAccount{} + +// ServiceAccount scaffolds a file that defines the service account the manager is deployed in. +type ServiceAccount struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *ServiceAccount) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "rbac", "service_account.yaml") + } + + f.TemplateBody = serviceAccountTemplate + + return nil +} + +const serviceAccountTemplate = `apiVersion: v1 +kind: ServiceAccount +metadata: + name: controller-manager + namespace: system +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/samples/crd_sample.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/samples/crd_sample.go new file mode 100644 index 000000000..3d83cd8fd --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/samples/crd_sample.go @@ -0,0 +1,59 @@ +/* +Copyright 2020 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 samples + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &CRDSample{} + +// CRDSample scaffolds a file that defines a sample manifest for the CRD +type CRDSample struct { + machinery.TemplateMixin + machinery.ResourceMixin + + Force bool +} + +// SetTemplateDefaults implements file.Template +func (f *CRDSample) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "samples", "%[group]_%[version]_%[kind].yaml") + } + f.Path = f.Resource.Replacer().Replace(f.Path) + + if f.Force { + f.IfExistsAction = machinery.OverwriteFile + } else { + f.IfExistsAction = machinery.Error + } + + f.TemplateBody = crdSampleTemplate + + return nil +} + +const crdSampleTemplate = `apiVersion: {{ .Resource.QualifiedGroup }}/{{ .Resource.Version }} +kind: {{ .Resource.Kind }} +metadata: + name: {{ lower .Resource.Kind }}-sample +spec: + # TODO(user): Add fields here +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook/kustomization.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook/kustomization.go new file mode 100644 index 000000000..3f55f70a1 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook/kustomization.go @@ -0,0 +1,59 @@ +/* +Copyright 2020 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 webhook + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Kustomization{} + +// Kustomization scaffolds a file that defines the kustomization scheme for the webhook folder +type Kustomization struct { + machinery.TemplateMixin + machinery.ResourceMixin + + Force bool +} + +// SetTemplateDefaults implements file.Template +func (f *Kustomization) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "webhook", "kustomization.yaml") + } + + f.TemplateBody = kustomizeWebhookTemplate + + if f.Force { + f.IfExistsAction = machinery.OverwriteFile + } else { + // If file exists (ex. because a webhook was already created), skip creation. + f.IfExistsAction = machinery.SkipFile + } + + return nil +} + +const kustomizeWebhookTemplate = `resources: +- manifests{{ if ne .Resource.Webhooks.WebhookVersion "v1" }}.{{ .Resource.Webhooks.WebhookVersion }}{{ end }}.yaml +- service.yaml + +configurations: +- kustomizeconfig.yaml +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook/kustomizeconfig.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook/kustomizeconfig.go new file mode 100644 index 000000000..167fa852e --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook/kustomizeconfig.go @@ -0,0 +1,69 @@ +/* +Copyright 2020 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 webhook + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &KustomizeConfig{} + +// KustomizeConfig scaffolds a file that configures the kustomization for the webhook folder +type KustomizeConfig struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *KustomizeConfig) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "webhook", "kustomizeconfig.yaml") + } + + f.TemplateBody = kustomizeConfigWebhookTemplate + + // If file exists (ex. because a webhook was already created), skip creation. + f.IfExistsAction = machinery.SkipFile + + return nil +} + +//nolint:lll +const kustomizeConfigWebhookTemplate = `# the following config is for teaching kustomize where to look at when substituting nameReference. +# It requires kustomize v2.1.0 or newer to work properly. +nameReference: +- kind: Service + version: v1 + fieldSpecs: + - kind: MutatingWebhookConfiguration + group: admissionregistration.k8s.io + path: webhooks/clientConfig/service/name + - kind: ValidatingWebhookConfiguration + group: admissionregistration.k8s.io + path: webhooks/clientConfig/service/name + +namespace: +- kind: MutatingWebhookConfiguration + group: admissionregistration.k8s.io + path: webhooks/clientConfig/service/namespace + create: true +- kind: ValidatingWebhookConfiguration + group: admissionregistration.k8s.io + path: webhooks/clientConfig/service/namespace + create: true +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook/service.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook/service.go new file mode 100644 index 000000000..35741bdd7 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook/service.go @@ -0,0 +1,59 @@ +/* +Copyright 2020 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 webhook + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Service{} + +// Service scaffolds a file that defines the webhook service +type Service struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *Service) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "webhook", "service.yaml") + } + + f.TemplateBody = serviceTemplate + + // If file exists (ex. because a webhook was already created), skip creation. + f.IfExistsAction = machinery.SkipFile + + return nil +} + +const serviceTemplate = ` +apiVersion: v1 +kind: Service +metadata: + name: webhook-service + namespace: system +spec: + ports: + - port: 443 + protocol: TCP + targetPort: 9443 + selector: + control-plane: controller-manager +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/webhook.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/webhook.go new file mode 100644 index 000000000..a859d03f0 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/webhook.go @@ -0,0 +1,84 @@ +/* +Copyright 2022 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 scaffolds + +import ( + "fmt" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/certmanager" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/kdefault" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds/internal/templates/config/webhook" +) + +var _ plugins.Scaffolder = &webhookScaffolder{} + +type webhookScaffolder struct { + config config.Config + resource resource.Resource + + // fs is the filesystem that will be used by the scaffolder + fs machinery.Filesystem + + // force indicates whether to scaffold files even if they exist. + force bool +} + +// NewWebhookScaffolder returns a new Scaffolder for v2 webhook creation operations +func NewWebhookScaffolder(config config.Config, resource resource.Resource, force bool) plugins.Scaffolder { + return &webhookScaffolder{ + config: config, + resource: resource, + force: force, + } +} + +// InjectFS implements cmdutil.Scaffolder +func (s *webhookScaffolder) InjectFS(fs machinery.Filesystem) { s.fs = fs } + +// Scaffold implements cmdutil.Scaffolder +func (s *webhookScaffolder) Scaffold() error { + fmt.Println("Writing kustomize manifests for you to edit...") + + // Initialize the machinery.Scaffold that will write the files to disk + scaffold := machinery.NewScaffold(s.fs, + machinery.WithConfig(s.config), + machinery.WithResource(&s.resource), + ) + + if err := s.config.UpdateResource(s.resource); err != nil { + return fmt.Errorf("error updating resource: %w", err) + } + + if err := scaffold.Execute( + &kdefault.WebhookCAInjectionPatch{}, + &kdefault.ManagerWebhookPatch{}, + &webhook.Kustomization{Force: s.force}, + &webhook.KustomizeConfig{}, + &webhook.Service{}, + &certmanager.Certificate{}, + &certmanager.Kustomization{}, + &certmanager.KustomizeConfig{}, + ); err != nil { + return fmt.Errorf("error scaffolding kustomize webhook manifests: %v", err) + } + + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/webhook.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/webhook.go new file mode 100644 index 000000000..9b5a3107f --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/webhook.go @@ -0,0 +1,38 @@ +/* +Copyright 2022 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 v2_alpha + +import ( + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha/scaffolds" +) + +var _ plugin.CreateWebhookSubcommand = &createWebhookSubcommand{} + +type createWebhookSubcommand struct { + createSubcommand +} + +func (p *createWebhookSubcommand) Scaffold(fs machinery.Filesystem) error { + if err := p.configure(); err != nil { + return err + } + scaffolder := scaffolds.NewWebhookScaffolder(p.config, *p.resource, p.force) + scaffolder.InjectFS(fs) + return scaffolder.Scaffold() +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/api.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/api.go new file mode 100644 index 000000000..6f0d5bf50 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/api.go @@ -0,0 +1,65 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package external + +import ( + "github.com/spf13/pflag" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin/external" +) + +var _ plugin.CreateAPISubcommand = &createAPISubcommand{} + +const ( + defaultAPIVersion = "v1alpha1" +) + +type createAPISubcommand struct { + Path string + Args []string +} + +func (p *createAPISubcommand) InjectResource(*resource.Resource) error { + // Do nothing since resource flags are passed to the external plugin directly. + return nil +} + +func (p *createAPISubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) { + setExternalPluginMetadata("api", p.Path, subcmdMeta) +} + +func (p *createAPISubcommand) BindFlags(fs *pflag.FlagSet) { + bindExternalPluginFlags(fs, "api", p.Path, p.Args) +} + +func (p *createAPISubcommand) Scaffold(fs machinery.Filesystem) error { + req := external.PluginRequest{ + APIVersion: defaultAPIVersion, + Command: "create api", + Args: p.Args, + } + + err := handlePluginResponse(fs, req, p.Path) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/edit.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/edit.go new file mode 100644 index 000000000..36ab5496e --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/edit.go @@ -0,0 +1,55 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package external + +import ( + "github.com/spf13/pflag" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin/external" +) + +var _ plugin.EditSubcommand = &editSubcommand{} + +type editSubcommand struct { + Path string + Args []string +} + +func (p *editSubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) { + setExternalPluginMetadata("edit", p.Path, subcmdMeta) +} + +func (p *editSubcommand) BindFlags(fs *pflag.FlagSet) { + bindExternalPluginFlags(fs, "edit", p.Path, p.Args) +} + +func (p *editSubcommand) Scaffold(fs machinery.Filesystem) error { + req := external.PluginRequest{ + APIVersion: defaultAPIVersion, + Command: "edit", + Args: p.Args, + } + + err := handlePluginResponse(fs, req, p.Path) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/helpers.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/helpers.go new file mode 100644 index 000000000..7b6baa582 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/helpers.go @@ -0,0 +1,256 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package external + +import ( + "bytes" + "encoding/json" + "fmt" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + + "github.com/spf13/pflag" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin/external" +) + +var outputGetter ExecOutputGetter = &execOutputGetter{} + +const defaultMetadataTemplate = ` +%s is an external plugin for scaffolding files to help with your Operator development. + +For more information on how to use this external plugin, it is recommended to +consult the external plugin's documentation. +` + +// ExecOutputGetter is an interface that implements the exec output method. +type ExecOutputGetter interface { + GetExecOutput(req []byte, path string) ([]byte, error) +} + +type execOutputGetter struct{} + +func (e *execOutputGetter) GetExecOutput(request []byte, path string) ([]byte, error) { + cmd := exec.Command(path) //nolint:gosec + cmd.Stdin = bytes.NewBuffer(request) + cmd.Stderr = os.Stderr + out, err := cmd.Output() + if err != nil { + return nil, err + } + + return out, nil +} + +var currentDirGetter OsWdGetter = &osWdGetter{} + +// OsWdGetter is an interface that implements the get current directory method. +type OsWdGetter interface { + GetCurrentDir() (string, error) +} + +type osWdGetter struct{} + +func (o *osWdGetter) GetCurrentDir() (string, error) { + currentDir, err := os.Getwd() + if err != nil { + return "", fmt.Errorf("error getting current directory: %v", err) + } + + return currentDir, nil +} + +func makePluginRequest(req external.PluginRequest, path string) (*external.PluginResponse, error) { + reqBytes, err := json.Marshal(req) + if err != nil { + return nil, err + } + + out, err := outputGetter.GetExecOutput(reqBytes, path) + if err != nil { + return nil, err + } + + res := external.PluginResponse{} + if err := json.Unmarshal(out, &res); err != nil { + return nil, err + } + + // Error if the plugin failed. + if res.Error { + return nil, fmt.Errorf(strings.Join(res.ErrorMsgs, "\n")) + } + + return &res, nil +} + +func handlePluginResponse(fs machinery.Filesystem, req external.PluginRequest, path string) error { + req.Universe = map[string]string{} + + res, err := makePluginRequest(req, path) + if err != nil { + return fmt.Errorf("error making request to external plugin: %w", err) + } + + currentDir, err := currentDirGetter.GetCurrentDir() + if err != nil { + return fmt.Errorf("error getting current directory: %v", err) + } + + for filename, data := range res.Universe { + f, err := fs.FS.Create(filepath.Join(currentDir, filename)) + if err != nil { + return err + } + + defer func() { + if err := f.Close(); err != nil { + return + } + }() + + if _, err := f.Write([]byte(data)); err != nil { + return err + } + } + + return nil +} + +// getExternalPluginFlags is a helper function that is used to get a list of flags from an external plugin. +// It will return []Flag if successful or an error if there is an issue attempting to get the list of flags. +func getExternalPluginFlags(req external.PluginRequest, path string) ([]external.Flag, error) { + req.Universe = map[string]string{} + + res, err := makePluginRequest(req, path) + if err != nil { + return nil, fmt.Errorf("error making request to external plugin: %w", err) + } + + return res.Flags, nil +} + +// isBooleanFlag is a helper function to determine if an argument flag is a boolean flag +func isBooleanFlag(argIndex int, args []string) bool { + return argIndex+1 < len(args) && + strings.Contains(args[argIndex+1], "--") || + argIndex+1 >= len(args) +} + +// bindAllFlags will bind all flags passed into the subcommand by a user +func bindAllFlags(fs *pflag.FlagSet, args []string) { + defaultFlagDescription := "Kubebuilder could not validate this flag with the external plugin. " + + "Consult the external plugin documentation for more information." + + // Bind all flags passed in + for i := range args { + if strings.Contains(args[i], "--") { + flag := strings.Replace(args[i], "--", "", 1) + // Check if the flag is a boolean flag + if isBooleanFlag(i, args) { + // --help is already a defined flag in the kubebuilder commands and has a description so we skip parsing it again + if flag != "help" { + _ = fs.Bool(flag, false, defaultFlagDescription) + } + } else { + _ = fs.String(flag, "", defaultFlagDescription) + } + } + } +} + +// bindSpecificFlags with bind flags that are specified by an external plugin as an allowed flag +func bindSpecificFlags(fs *pflag.FlagSet, flags []external.Flag) { + // Only bind flags returned by the external plugin + for _, flag := range flags { + switch flag.Type { + case "bool": + defaultValue, _ := strconv.ParseBool(flag.Default) + _ = fs.Bool(flag.Name, defaultValue, flag.Usage) + case "int": + defaultValue, _ := strconv.Atoi(flag.Default) + _ = fs.Int(flag.Name, defaultValue, flag.Usage) + case "float": + defaultValue, _ := strconv.ParseFloat(flag.Default, 64) + _ = fs.Float64(flag.Name, defaultValue, flag.Usage) + default: + _ = fs.String(flag.Name, flag.Default, flag.Usage) + } + } +} + +func bindExternalPluginFlags(fs *pflag.FlagSet, subcommand string, path string, args []string) { + req := external.PluginRequest{ + APIVersion: defaultAPIVersion, + Command: "flags", + Args: []string{"--" + subcommand}, + } + + // Get a list of flags for the init subcommand of the external plugin + // If it returns an error, parse all flags passed by the user and let + // the external plugin return an unknown flag error. + flags, err := getExternalPluginFlags(req, path) + if err != nil { + bindAllFlags(fs, args) + } else { + bindSpecificFlags(fs, flags) + } +} + +// setExternalPluginMetadata is a helper function that sets the subcommand +// metadata that is used when the help text is shown for a subcommand. +// It will attempt to get the Metadata from the external plugin. If the +// external plugin returns no Metadata or an error, a default will be used. +func setExternalPluginMetadata(subcommand, path string, subcmdMeta *plugin.SubcommandMetadata) { + fileName := filepath.Base(path) + subcmdMeta.Description = fmt.Sprintf(defaultMetadataTemplate, fileName[:len(fileName)-len(filepath.Ext(fileName))]) + + res, _ := getExternalPluginMetadata(subcommand, path) + + if res != nil { + if res.Description != "" { + subcmdMeta.Description = res.Description + } + + if res.Examples != "" { + subcmdMeta.Examples = res.Examples + } + } +} + +// fetchExternalPluginMetadata performs the actual request to the +// external plugin to get the metadata. It returns the metadata +// or an error if an error occurs during the fetch process. +func getExternalPluginMetadata(subcommand, path string) (*plugin.SubcommandMetadata, error) { + req := external.PluginRequest{ + APIVersion: defaultAPIVersion, + Command: "metadata", + Args: []string{"--" + subcommand}, + Universe: map[string]string{}, + } + + res, err := makePluginRequest(req, path) + if err != nil { + return nil, fmt.Errorf("error making request to external plugin: %w", err) + } + + return &res.Metadata, nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/init.go new file mode 100644 index 000000000..ed5837e94 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/init.go @@ -0,0 +1,55 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package external + +import ( + "github.com/spf13/pflag" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin/external" +) + +var _ plugin.InitSubcommand = &initSubcommand{} + +type initSubcommand struct { + Path string + Args []string +} + +func (p *initSubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) { + setExternalPluginMetadata("init", p.Path, subcmdMeta) +} + +func (p *initSubcommand) BindFlags(fs *pflag.FlagSet) { + bindExternalPluginFlags(fs, "init", p.Path, p.Args) +} + +func (p *initSubcommand) Scaffold(fs machinery.Filesystem) error { + req := external.PluginRequest{ + APIVersion: defaultAPIVersion, + Command: "init", + Args: p.Args, + } + + err := handlePluginResponse(fs, req, p.Path) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/plugin.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/plugin.go new file mode 100644 index 000000000..2ca4c9e4e --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/plugin.go @@ -0,0 +1,75 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package external + +import ( + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" +) + +var _ plugin.Full = Plugin{} + +// Plugin implements the plugin.Full interface +type Plugin struct { + PName string + PVersion plugin.Version + PSupportedProjectVersions []config.Version + + Path string + Args []string +} + +// Name returns the name of the plugin +func (p Plugin) Name() string { return p.PName } + +// Version returns the version of the plugin +func (p Plugin) Version() plugin.Version { return p.PVersion } + +// SupportedProjectVersions returns an array with all project versions supported by the plugin +func (p Plugin) SupportedProjectVersions() []config.Version { return p.PSupportedProjectVersions } + +// GetInitSubcommand will return the subcommand which is responsible for initializing and common scaffolding +func (p Plugin) GetInitSubcommand() plugin.InitSubcommand { + return &initSubcommand{ + Path: p.Path, + Args: p.Args, + } +} + +// GetCreateAPISubcommand will return the subcommand which is responsible for scaffolding apis +func (p Plugin) GetCreateAPISubcommand() plugin.CreateAPISubcommand { + return &createAPISubcommand{ + Path: p.Path, + Args: p.Args, + } +} + +// GetCreateWebhookSubcommand will return the subcommand which is responsible for scaffolding webhooks +func (p Plugin) GetCreateWebhookSubcommand() plugin.CreateWebhookSubcommand { + return &createWebhookSubcommand{ + Path: p.Path, + Args: p.Args, + } +} + +// GetEditSubcommand will return the subcommand which is responsible for editing the scaffold of the project +func (p Plugin) GetEditSubcommand() plugin.EditSubcommand { + return &editSubcommand{ + Path: p.Path, + Args: p.Args, + } +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/webhook.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/webhook.go new file mode 100644 index 000000000..a9a174020 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/external/webhook.go @@ -0,0 +1,61 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package external + +import ( + "github.com/spf13/pflag" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin/external" +) + +var _ plugin.CreateWebhookSubcommand = &createWebhookSubcommand{} + +type createWebhookSubcommand struct { + Path string + Args []string +} + +func (p *createWebhookSubcommand) InjectResource(*resource.Resource) error { + // Do nothing since resource flags are passed to the external plugin directly. + return nil +} + +func (p *createWebhookSubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) { + setExternalPluginMetadata("webhook", p.Path, subcmdMeta) +} + +func (p *createWebhookSubcommand) BindFlags(fs *pflag.FlagSet) { + bindExternalPluginFlags(fs, "webhook", p.Path, p.Args) +} + +func (p *createWebhookSubcommand) Scaffold(fs machinery.Filesystem) error { + req := external.PluginRequest{ + APIVersion: defaultAPIVersion, + Command: "create webhook", + Args: p.Args, + } + + err := handlePluginResponse(fs, req, p.Path) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/api.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/api.go index dbf07edfb..b10303f46 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/api.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/api.go @@ -19,25 +19,20 @@ package v1 import ( "errors" "fmt" - "path/filepath" - - "github.com/spf13/afero" "sigs.k8s.io/kubebuilder/v3/pkg/config" "sigs.k8s.io/kubebuilder/v3/pkg/machinery" "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" "sigs.k8s.io/kubebuilder/v3/pkg/plugin" "sigs.k8s.io/kubebuilder/v3/pkg/plugin/util" - "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds" goPluginV2 "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2" ) const ( // kbDeclarativePattern is the sigs.k8s.io/kubebuilder-declarative-pattern version kbDeclarativePatternForV2 = "v0.0.0-20200522144838-848d48e5b073" - kbDeclarativePatternForV3 = "fea7e5cc701290589ec20ef4d9c0629d08b5307d" - - exampleManifestVersion = "0.0.1" + kbDeclarativePatternForV3 = "fe5be9431eae158f86f9de23000a9a2ec06745fc" ) var _ plugin.CreateAPISubcommand = &createAPISubcommand{} @@ -97,27 +92,17 @@ func (p *createAPISubcommand) InjectResource(res *resource.Resource) error { func (p *createAPISubcommand) Scaffold(fs machinery.Filesystem) error { fmt.Println("updating scaffold with declarative pattern...") - // Load the boilerplate - bp, err := afero.ReadFile(fs.FS, filepath.Join("hack", "boilerplate.go.txt")) + scaffolder := scaffolds.NewAPIScaffolder(p.config, *p.resource) + scaffolder.InjectFS(fs) + err := scaffolder.Scaffold() if err != nil { - return fmt.Errorf("error updating scaffold: unable to load boilerplate: %w", err) + return err } - boilerplate := string(bp) - - // Initialize the machinery.Scaffold that will write the files to disk - scaffold := machinery.NewScaffold(fs, - machinery.WithConfig(p.config), - machinery.WithBoilerplate(boilerplate), - machinery.WithResource(p.resource), - ) - - if err := scaffold.Execute( - &templates.Types{}, - &templates.Controller{}, - &templates.Channel{ManifestVersion: exampleManifestVersion}, - &templates.Manifest{ManifestVersion: exampleManifestVersion}, - ); err != nil { - return fmt.Errorf("error updating scaffold: %w", err) + + // Update Dockerfile + err = updateDockerfile() + if err != nil { + return err } // Track the resources following a declarative approach diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/init.go new file mode 100644 index 000000000..5b6156561 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/init.go @@ -0,0 +1,88 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "fmt" + "io/ioutil" + "path/filepath" + "strings" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin/util" +) + +var _ plugin.InitSubcommand = &initSubcommand{} + +type initSubcommand struct { + config config.Config +} + +func (p *initSubcommand) InjectConfig(c config.Config) error { + p.config = c + + return nil +} + +func (p *initSubcommand) Scaffold(fs machinery.Filesystem) error { + err := updateDockerfile() + if err != nil { + return err + } + return nil +} + +// updateDockerfile will add channels staging required for declarative plugin +func updateDockerfile() error { + fmt.Println("updating Dockerfile to add channels/ directory in the image") + managerFile := filepath.Join("Dockerfile") + + // nolint:lll + err := insertCodeIfDoesNotExist(managerFile, + "COPY controllers/ controllers/", + "\n# https://github.com/kubernetes-sigs/kubebuilder-declarative-pattern/blob/master/docs/addon/walkthrough/README.md#adding-a-manifest\n# Stage channels and make readable\nCOPY channels/ /channels/\nRUN chmod -R a+rx /channels/") + if err != nil { + return err + } + + err = insertCodeIfDoesNotExist(managerFile, + "COPY --from=builder /workspace/manager .", + "\n# copy channels\nCOPY --from=builder /channels /channels\n") + if err != nil { + return err + } + return nil +} + +// insertCodeIfDoesNotExist insert code if it does not already exists +func insertCodeIfDoesNotExist(filename, target, code string) error { + // false positive + // nolint:gosec + contents, err := ioutil.ReadFile(filename) + if err != nil { + return err + } + + idx := strings.Index(string(contents), code) + if idx != -1 { + return nil + } + + return util.InsertCode(filename, target, code) +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/plugin.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/plugin.go index 9a433e201..9c8111b17 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/plugin.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/plugin.go @@ -37,6 +37,7 @@ var _ plugin.CreateAPI = Plugin{} // Plugin implements the plugin.Full interface type Plugin struct { + initSubcommand createAPISubcommand } @@ -49,6 +50,9 @@ func (Plugin) Version() plugin.Version { return pluginVersion } // SupportedProjectVersions returns an array with all project versions supported by the plugin func (Plugin) SupportedProjectVersions() []config.Version { return supportedProjectVersions } +// GetInitSubcommand will return the subcommand which is responsible for initializing and common scaffolding +func (p Plugin) GetInitSubcommand() plugin.InitSubcommand { return &p.initSubcommand } + // GetCreateAPISubcommand will return the subcommand which is responsible for scaffolding apis func (p Plugin) GetCreateAPISubcommand() plugin.CreateAPISubcommand { return &p.createAPISubcommand } diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/api.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/api.go new file mode 100644 index 000000000..af0ab1907 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/api.go @@ -0,0 +1,83 @@ +/* +Copyright 2022 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 scaffolds + +import ( + "fmt" + "path/filepath" + + "github.com/spf13/afero" + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates" +) + +const ( + exampleManifestVersion = "0.0.1" +) + +var _ plugins.Scaffolder = &apiScaffolder{} + +type apiScaffolder struct { + config config.Config + resource resource.Resource + + // fs is the filesystem that will be used by the scaffolder + fs machinery.Filesystem +} + +// NewAPIScaffolder returns a new Scaffolder for declarative +func NewAPIScaffolder(config config.Config, res resource.Resource) plugins.Scaffolder { + return &apiScaffolder{ + config: config, + resource: res, + } +} + +// InjectFS implements cmdutil.Scaffolder +func (s *apiScaffolder) InjectFS(fs machinery.Filesystem) { + s.fs = fs +} + +// Scaffold implements cmdutil.Scaffolder +func (s *apiScaffolder) Scaffold() error { + // Load the boilerplate + boilerplate, err := afero.ReadFile(s.fs.FS, filepath.Join("hack", "boilerplate.go.txt")) + if err != nil { + return fmt.Errorf("error updating scaffold: unable to load boilerplate: %w", err) + } + + // Initialize the machinery.Scaffold that will write the files to disk + scaffold := machinery.NewScaffold(s.fs, + machinery.WithConfig(s.config), + machinery.WithBoilerplate(string(boilerplate)), + machinery.WithResource(&s.resource), + ) + + err = scaffold.Execute( + &templates.Types{}, + &templates.Controller{}, + &templates.Channel{ManifestVersion: exampleManifestVersion}, + &templates.Manifest{ManifestVersion: exampleManifestVersion}, + ) + if err != nil { + return fmt.Errorf("error updating scaffold: %w", err) + } + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates/channel.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates/channel.go similarity index 100% rename from vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates/channel.go rename to vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates/channel.go diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates/controller.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates/controller.go similarity index 100% rename from vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates/controller.go rename to vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates/controller.go diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates/manifest.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates/manifest.go similarity index 100% rename from vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates/manifest.go rename to vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates/manifest.go diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates/types.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates/types.go similarity index 100% rename from vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/internal/templates/types.go rename to vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/declarative/v1/scaffolds/internal/templates/types.go diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/api.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/api.go new file mode 100644 index 000000000..a0e6ee27a --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/api.go @@ -0,0 +1,264 @@ +/* +Copyright 2022 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 v1alpha1 + +import ( + "errors" + "fmt" + "os" + + goPlugin "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang" + + "sigs.k8s.io/kubebuilder/v3/pkg/plugin/util" + + "github.com/spf13/pflag" + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds" +) + +const ( + // defaultCRDVersion is the default CRD API version to scaffold. + defaultCRDVersion = "v1" +) + +const deprecateMsg = "The v1beta1 API version for CRDs and Webhooks are deprecated and are no longer supported since " + + "the Kubernetes release 1.22. This flag no longer required to exist in future releases. Also, we would like to " + + "recommend you no longer use these API versions." + + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22" + +// DefaultMainPath is default file path of main.go +const DefaultMainPath = "main.go" + +var _ plugin.CreateAPISubcommand = &createAPISubcommand{} + +type createAPISubcommand struct { + config config.Config + + options *goPlugin.Options + + resource *resource.Resource + + // image indicates the image that will be used to scaffold the deployment + image string + + // runMake indicates whether to run make or not after scaffolding APIs + runMake bool + + // runManifests indicates whether to run manifests or not after scaffolding APIs + runManifests bool + + // imageCommand indicates the command that we should use to init the deployment + imageContainerCommand string + + // imageContainerPort indicates the port that we should use in the scaffold + imageContainerPort string + + // runAsUser indicates the user-id used for running the container + runAsUser string +} + +func (p *createAPISubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) { + //nolint: lll + subcmdMeta.Description = `Scaffold the code implementation to deploy and manage your Operand which is represented by the API informed and will be reconciled by its controller. This plugin will generate the code implementation to help you out. + + Note: In general, it’s recommended to have one controller responsible for managing each API created for the project to properly follow the design goals set by Controller Runtime(https://github.com/kubernetes-sigs/controller-runtime). + + This plugin will work as the common behaviour of the flag --force and will scaffold the API and controller always. Use core types or external APIs is not officially support by default with. +` + //nolint: lll + subcmdMeta.Examples = fmt.Sprintf(` # Create a frigates API with Group: ship, Version: v1beta1, Kind: Frigate to represent the + Image: example.com/frigate:v0.0.1 and its controller with a code to deploy and manage this Operand. + + Note that in the following example we are also adding the optional options to let you inform the command which should be used to create the container and initialize itvia the flag --image-container-command as the Port that should be used + + - By informing the command (--image-container-command="memcached,-m=64,-o,modern,-v") your deployment will be scaffold with, i.e.: + + Command: []string{"memcached","-m=64","-o","modern","-v"}, + + - By informing the Port (--image-container-port) will deployment will be scaffold with, i.e: + + Ports: []corev1.ContainerPort{ + ContainerPort: Memcached.Spec.ContainerPort, + Name: "Memcached", + }, + + Therefore, the default values informed will be used to scaffold specs for the API. + + %[1]s create api --group example.com --version v1alpha1 --kind Memcached --image=memcached:1.6.15-alpine --image-container-command="memcached -m=64 modern -v" --image-container-port="11211" --plugins="deploy-image/v1-alpha" --make=false --namespaced=false + + # Generate the manifests + make manifests + + # Install CRDs into the Kubernetes cluster using kubectl apply + make install + + # Regenerate code and run against the Kubernetes cluster configured by ~/.kube/config + make run +`, cliMeta.CommandName) +} + +func (p *createAPISubcommand) BindFlags(fs *pflag.FlagSet) { + fs.StringVar(&p.image, "image", "", "inform the Operand image. "+ + "The controller will be scaffolded with an example code to deploy and manage this image.") + + fs.StringVar(&p.imageContainerCommand, "image-container-command", "", "[Optional] if informed, "+ + "will be used to scaffold the container command that should be used to init a container to run the image in "+ + "the controller and its spec in the API (CRD/CR). (i.e. --image-container-command=\"memcached,-m=64,modern,-o,-v\")") + fs.StringVar(&p.imageContainerPort, "image-container-port", "", "[Optional] if informed, "+ + "will be used to scaffold the container port that should be used by container image in "+ + "the controller and its spec in the API (CRD/CR). (i.e --image-container-port=\"11211\") ") + fs.StringVar(&p.runAsUser, "run-as-user", "", "User-Id for the container formed will be set to this value") + + fs.BoolVar(&p.runMake, "make", true, "if true, run `make generate` after generating files") + fs.BoolVar(&p.runManifests, "manifests", true, "if true, run `make manifests` after generating files") + + p.options = &goPlugin.Options{} + + fs.StringVar(&p.options.CRDVersion, "crd-version", defaultCRDVersion, + "version of CustomResourceDefinition to scaffold. Options: [v1, v1beta1]") + + fs.StringVar(&p.options.Plural, "plural", "", "resource irregular plural form") + + // (not required raise an error in this case) + // nolint:errcheck,gosec + fs.MarkDeprecated("crd-version", deprecateMsg) +} + +func (p *createAPISubcommand) InjectConfig(c config.Config) error { + p.config = c + + return nil +} + +func (p *createAPISubcommand) InjectResource(res *resource.Resource) error { + p.resource = res + p.options.DoAPI = true + p.options.DoController = true + p.options.Namespaced = true + p.options.UpdateResource(p.resource, p.config) + + if err := p.resource.Validate(); err != nil { + return err + } + + // Check that the provided group can be added to the project + if !p.config.IsMultiGroup() && p.config.ResourcesLength() != 0 && !p.config.HasGroup(p.resource.Group) { + return fmt.Errorf("multiple groups are not allowed by default, " + + "to enable multi-group visit https://kubebuilder.io/migration/multi-group.html") + } + + // Check CRDVersion against all other CRDVersions in p.config for compatibility. + if util.HasDifferentCRDVersion(p.config, p.resource.API.CRDVersion) { + return fmt.Errorf("only one CRD version can be used for all resources, cannot add %q", + p.resource.API.CRDVersion) + } + + // Check CRDVersion against all other CRDVersions in p.config for compatibility. + if util.HasDifferentCRDVersion(p.config, p.resource.API.CRDVersion) { + return fmt.Errorf("only one CRD version can be used for all resources, cannot add %q", + p.resource.API.CRDVersion) + } + + return nil +} + +func (p *createAPISubcommand) PreScaffold(machinery.Filesystem) error { + if len(p.image) == 0 { + return fmt.Errorf("you MUST inform the image that will be used in the reconciliation") + } + + // check if main.go is present in the root directory + if _, err := os.Stat(DefaultMainPath); os.IsNotExist(err) { + return fmt.Errorf("%s file should present in the root directory", DefaultMainPath) + } + + return nil +} + +func (p *createAPISubcommand) Scaffold(fs machinery.Filesystem) error { + fmt.Println("updating scaffold with deploy-image/v1alpha1 plugin...") + + scaffolder := scaffolds.NewDeployImageScaffolder(p.config, + *p.resource, + p.image, + p.imageContainerCommand, + p.imageContainerPort, + p.runAsUser) + scaffolder.InjectFS(fs) + err := scaffolder.Scaffold() + if err != nil { + return err + } + + // Track the resources following a declarative approach + cfg := pluginConfig{} + if err := p.config.DecodePluginConfig(pluginKey, &cfg); errors.As(err, &config.UnsupportedFieldError{}) { + // Config doesn't support per-plugin configuration, so we can't track them + } else { + // Fail unless they key wasn't found, which just means it is the first resource tracked + if err != nil && !errors.As(err, &config.PluginKeyNotFoundError{}) { + return err + } + configDataOptions := options{ + Image: p.image, + ContainerCommand: p.imageContainerCommand, + ContainerPort: p.imageContainerPort, + RunAsUser: p.runAsUser, + } + cfg.Resources = append(cfg.Resources, resourceData{ + Group: p.resource.GVK.Group, + Domain: p.resource.GVK.Domain, + Version: p.resource.GVK.Version, + Kind: p.resource.GVK.Kind, + Options: configDataOptions, + }, + ) + if err := p.config.EncodePluginConfig(pluginKey, cfg); err != nil { + return err + } + } + + return nil +} + +func (p *createAPISubcommand) PostScaffold() error { + err := util.RunCmd("Update dependencies", "go", "mod", "tidy") + if err != nil { + return err + } + if p.runMake && p.resource.HasAPI() { + err = util.RunCmd("Running make", "make", "generate") + if err != nil { + return err + } + } + + if p.runManifests && p.resource.HasAPI() { + err = util.RunCmd("Running make", "make", "manifests") + if err != nil { + return err + } + } + + fmt.Print("Next: check the implementation of your new API and controller. " + + "If you do changes in the API run the manifests with:\n$ make manifests\n") + + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/plugin.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/plugin.go new file mode 100644 index 000000000..c212e769e --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/plugin.go @@ -0,0 +1,71 @@ +/* +Copyright 2022 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 v1alpha1 + +import ( + "sigs.k8s.io/kubebuilder/v3/pkg/config" + cfgv3 "sigs.k8s.io/kubebuilder/v3/pkg/config/v3" + "sigs.k8s.io/kubebuilder/v3/pkg/model/stage" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang" +) + +const pluginName = "deploy-image." + golang.DefaultNameQualifier + +var ( + pluginVersion = plugin.Version{Number: 1, Stage: stage.Alpha} + supportedProjectVersions = []config.Version{cfgv3.Version} + pluginKey = plugin.KeyFor(Plugin{}) +) + +var _ plugin.CreateAPI = Plugin{} + +// Plugin implements the plugin.Full interface +type Plugin struct { + createAPISubcommand +} + +// Name returns the name of the plugin +func (Plugin) Name() string { return pluginName } + +// Version returns the version of the plugin +func (Plugin) Version() plugin.Version { return pluginVersion } + +// SupportedProjectVersions returns an array with all project versions supported by the plugin +func (Plugin) SupportedProjectVersions() []config.Version { return supportedProjectVersions } + +// GetCreateAPISubcommand will return the subcommand which is responsible for scaffolding apis +func (p Plugin) GetCreateAPISubcommand() plugin.CreateAPISubcommand { return &p.createAPISubcommand } + +type pluginConfig struct { + Resources []resourceData `json:"resources,omitempty"` +} + +type resourceData struct { + Group string `json:"group,omitempty"` + Domain string `json:"domain,omitempty"` + Version string `json:"version"` + Kind string `json:"kind"` + Options options `json:"options,omitempty"` +} + +type options struct { + Image string `json:"image,omitempty"` + ContainerCommand string `json:"containerCommand,omitempty"` + ContainerPort string `json:"containerPort,omitempty"` + RunAsUser string `json:"runAsUser,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/api.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/api.go new file mode 100644 index 000000000..09fca5fb8 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/api.go @@ -0,0 +1,330 @@ +/* +Copyright 2022 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 scaffolds + +import ( + "fmt" + "path/filepath" + "strings" + + "github.com/spf13/afero" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/model/resource" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin/util" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins" + kustomizev1scaffolds "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1/scaffolds" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/api" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/config/samples" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/controllers" + golangv3scaffolds "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds" +) + +var _ plugins.Scaffolder = &apiScaffolder{} + +// apiScaffolder contains configuration for generating scaffolding for Go type +// representing the API and controller that implements the behavior for the API. +type apiScaffolder struct { + config config.Config + resource resource.Resource + image string + command string + port string + runAsUser string + + // fs is the filesystem that will be used by the scaffolder + fs machinery.Filesystem +} + +// NewAPIScaffolder returns a new Scaffolder for declarative +//nolint: lll +func NewDeployImageScaffolder(config config.Config, res resource.Resource, image, + command, port, runAsUser string) plugins.Scaffolder { + return &apiScaffolder{ + config: config, + resource: res, + image: image, + command: command, + port: port, + runAsUser: runAsUser, + } +} + +// InjectFS implements cmdutil.Scaffolder +func (s *apiScaffolder) InjectFS(fs machinery.Filesystem) { + s.fs = fs +} + +// Scaffold implements cmdutil.Scaffolder +func (s *apiScaffolder) Scaffold() error { + fmt.Println("Writing scaffold for you to edit...") + + if err := s.scaffoldCreateAPIFromPlugins(); err != nil { + return err + } + + // Load the boilerplate + boilerplate, err := afero.ReadFile(s.fs.FS, filepath.Join("hack", "boilerplate.go.txt")) + if err != nil { + return fmt.Errorf("error scaffolding API/controller: unable to load boilerplate: %w", err) + } + + // Initialize the machinery.Scaffold that will write the files to disk + scaffold := machinery.NewScaffold(s.fs, + machinery.WithConfig(s.config), + machinery.WithBoilerplate(string(boilerplate)), + machinery.WithResource(&s.resource), + ) + + if err := scaffold.Execute( + &api.Types{Port: s.port}, + ); err != nil { + return fmt.Errorf("error updating APIs: %v", err) + } + + if err := scaffold.Execute( + &samples.CRDSample{Port: s.port}, + ); err != nil { + return fmt.Errorf("error updating config/samples: %v", err) + } + + controller := &controllers.Controller{ + ControllerRuntimeVersion: golangv3scaffolds.ControllerRuntimeVersion, + } + if err := scaffold.Execute( + controller, + ); err != nil { + return fmt.Errorf("error scaffolding controller: %v", err) + } + + if err := s.updateControllerCode(*controller); err != nil { + return fmt.Errorf("error updating controller: %v", err) + } + + if err := s.updateMainByAddingEventRecorder(); err != nil { + return fmt.Errorf("error updating main.go: %v", err) + } + + if err := scaffold.Execute( + &controllers.ControllerTest{Port: s.port}, + ); err != nil { + return fmt.Errorf("error creating controllers/**_controller_test.go: %v", err) + } + + if err := s.addEnvVarIntoManager(); err != nil { + return err + } + + return nil +} + +// addEnvVarIntoManager will update the config/manager/manager.yaml by adding +// a new ENV VAR for to store the image informed which will be used in the +// controller to create the Pod for the Kind +func (s *apiScaffolder) addEnvVarIntoManager() error { + managerPath := filepath.Join("config", "manager", "manager.yaml") + err := util.ReplaceInFile(managerPath, `env:`, `env:`) + if err != nil { + if err := util.InsertCode(managerPath, `name: manager`, ` + env:`); err != nil { + return fmt.Errorf("error scaffolding env key in config/manager/manager.yaml") + } + } + + if err = util.InsertCode(managerPath, `env:`, + fmt.Sprintf(envVarTemplate, strings.ToUpper(s.resource.Kind), s.image)); err != nil { + return fmt.Errorf("error scaffolding env key in config/manager/manager.yaml") + } + + return nil +} + +// scaffoldCreateAPIFromPlugins will reuse the code from the kustomize and base golang +// plugins to do the default scaffolds which an API is created +func (s *apiScaffolder) scaffoldCreateAPIFromPlugins() error { + if err := s.scaffoldCreateAPIFromGolang(); err != nil { + return fmt.Errorf("error scaffolding golang files for the new API: %v", err) + } + + if err := s.scaffoldCreateAPIFromKustomize(); err != nil { + return fmt.Errorf("error scaffolding kustomize manifests for the new API: %v", err) + } + return nil +} + +// TODO: replace this implementation by creating its own MainUpdater +// which will have its own controller template which set the recorder so that we can use it +// in the reconciliation to create an event inside for the finalizer +func (s *apiScaffolder) updateMainByAddingEventRecorder() error { + defaultMainPath := "main.go" + + if err := util.InsertCode( + defaultMainPath, + fmt.Sprintf( + `if err = (&controllers.%sReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(),`, s.resource.Kind), + fmt.Sprintf(recorderTemplate, strings.ToLower(s.resource.Kind)), + ); err != nil { + return fmt.Errorf("error scaffolding event recorder in %s: %v", defaultMainPath, err) + } + + return nil +} + +// updateControllerCode will update the code generate on the template to add the Container information +func (s *apiScaffolder) updateControllerCode(controller controllers.Controller) error { + if err := util.ReplaceInFile( + controller.Path, + "//TODO: scaffold container", + fmt.Sprintf(containerTemplate, // value for the image + strings.ToLower(s.resource.Kind), // value for the name of the container + ), + ); err != nil { + return fmt.Errorf("error scaffolding container in the controller path (%s): %v", + controller.Path, err) + } + + // Scaffold the command if informed + if len(s.command) > 0 { + // TODO: improve it to be an spec in the sample and api instead so that + // users can change the values + var res string + for _, value := range strings.Split(s.command, ",") { + res += fmt.Sprintf(" \"%s\",", strings.TrimSpace(value)) + } + // remove the latest , + res = res[:len(res)-1] + // remove the first space to not fail in the go fmt ./... + res = strings.TrimLeft(res, " ") + + if err := util.InsertCode(controller.Path, `SecurityContext: &corev1.SecurityContext{ + RunAsNonRoot: &[]bool{true}[0], + AllowPrivilegeEscalation: &[]bool{false}[0], + Capabilities: &corev1.Capabilities{ + Drop: []corev1.Capability{ + "ALL", + }, + }, + },`, fmt.Sprintf(commandTemplate, res)); err != nil { + return fmt.Errorf("error scaffolding command in the controller path (%s): %v", + controller.Path, err) + } + } + + // Scaffold the port if informed + if len(s.port) > 0 { + if err := util.InsertCode( + controller.Path, + `SecurityContext: &corev1.SecurityContext{ + RunAsNonRoot: &[]bool{true}[0], + AllowPrivilegeEscalation: &[]bool{false}[0], + Capabilities: &corev1.Capabilities{ + Drop: []corev1.Capability{ + "ALL", + }, + }, + },`, + fmt.Sprintf( + portTemplate, + strings.ToLower(s.resource.Kind), + strings.ToLower(s.resource.Kind)), + ); err != nil { + return fmt.Errorf("error scaffolding container port in the controller path (%s): %v", + controller.Path, + err) + } + } + + if len(s.runAsUser) > 0 { + if err := util.InsertCode( + controller.Path, + `RunAsNonRoot: &[]bool{true}[0],`, + fmt.Sprintf(runAsUserTemplate, s.runAsUser), + ); err != nil { + return fmt.Errorf("error scaffolding user-id in the controller path (%s): %v", + controller.Path, err) + } + } + + return nil +} + +func (s *apiScaffolder) scaffoldCreateAPIFromKustomize() error { + // Now we need call the kustomize/v1 plugin to do its scaffolds when we create a new API + // todo: when we have the go/v4-alpha plugin we will also need to check what is the plugin used + // in the Project layout to know if we should use kustomize/v1 OR kustomize/v2-alpha + kustomizeV1Scaffolder := kustomizev1scaffolds.NewAPIScaffolder( + s.config, + s.resource, + true, + ) + kustomizeV1Scaffolder.InjectFS(s.fs) + + if err := kustomizeV1Scaffolder.Scaffold(); err != nil { + return fmt.Errorf("error scaffolding kustomize files for the APIs: %v", err) + } + return nil +} + +func (s *apiScaffolder) scaffoldCreateAPIFromGolang() error { + // Now we need call the kustomize/v1 plugin to do its scaffolds when we create a new API + // todo: when we have the go/v4-alpha plugin we will also need to check what is the plugin used + // in the Project layout to know if we should use kustomize/v1 OR kustomize/v2-alpha + + golangV3Scaffolder := golangv3scaffolds.NewAPIScaffolder(s.config, + s.resource, true) + golangV3Scaffolder.InjectFS(s.fs) + return golangV3Scaffolder.Scaffold() +} + +const containerTemplate = `Containers: []corev1.Container{{ + Image: image, + Name: "%s", + ImagePullPolicy: corev1.PullIfNotPresent, + // Ensure restrictive context for the container + // More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + SecurityContext: &corev1.SecurityContext{ + RunAsNonRoot: &[]bool{true}[0], + AllowPrivilegeEscalation: &[]bool{false}[0], + Capabilities: &corev1.Capabilities{ + Drop: []corev1.Capability{ + "ALL", + }, + }, + }, + }}` + +const runAsUserTemplate = ` + RunAsUser: &[]int64{%s}[0],` + +const commandTemplate = ` + Command: []string{%s},` + +const portTemplate = ` + Ports: []corev1.ContainerPort{{ + ContainerPort: %s.Spec.ContainerPort, + Name: "%s", + }},` + +const recorderTemplate = ` + Recorder: mgr.GetEventRecorderFor("%s-controller"),` + +const envVarTemplate = ` + - name: %s_IMAGE + value: %s` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/api/types.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/api/types.go new file mode 100644 index 000000000..58efeeadf --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/api/types.go @@ -0,0 +1,139 @@ +/* +Copyright 2022 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 api + +import ( + "fmt" + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Types{} + +// Types scaffolds the file that defines the schema for a CRD +// nolint:maligned +type Types struct { + machinery.TemplateMixin + machinery.MultiGroupMixin + machinery.BoilerplateMixin + machinery.ResourceMixin + + // Port if informed we will create the scaffold with this spec + Port string +} + +// SetTemplateDefaults implements file.Template +func (f *Types) SetTemplateDefaults() error { + if f.Path == "" { + if f.MultiGroup { + if f.Resource.Group != "" { + f.Path = filepath.Join("apis", "%[group]", "%[version]", "%[kind]_types.go") + } else { + f.Path = filepath.Join("apis", "%[version]", "%[kind]_types.go") + } + } else { + f.Path = filepath.Join("api", "%[version]", "%[kind]_types.go") + } + } + f.Path = f.Resource.Replacer().Replace(f.Path) + fmt.Println(f.Path) + + f.TemplateBody = typesTemplate + + f.IfExistsAction = machinery.OverwriteFile + + return nil +} + +//nolint:lll +const typesTemplate = `{{ .Boilerplate }} + +package {{ .Resource.Version }} + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! +// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. + +// {{ .Resource.Kind }}Spec defines the desired state of {{ .Resource.Kind }} +type {{ .Resource.Kind }}Spec struct { + // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster + // Important: Run "make" to regenerate code after modifying this file + + // Size defines the number of {{ .Resource.Kind }} instances + // The following markers will use OpenAPI v3 schema to validate the value + // More info: https://book.kubebuilder.io/reference/markers/crd-validation.html + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=3 + // +kubebuilder:validation:ExclusiveMaximum=false + Size int32 ` + "`" + `json:"size,omitempty"` + "`" + ` + + {{ if not (isEmptyStr .Port) -}} + // Port defines the port that will be used to init the container with the image + ContainerPort int32 ` + "`" + `json:"containerPort,omitempty"` + "`" + ` + {{- end }} +} + +// {{ .Resource.Kind }}Status defines the observed state of {{ .Resource.Kind }} +type {{ .Resource.Kind }}Status struct { + // Represents the observations of a {{ .Resource.Kind }}'s current state. + // {{ .Resource.Kind }}.status.conditions.type are: "Available", "Progressing", and "Degraded" + // {{ .Resource.Kind }}.status.conditions.status are one of True, False, Unknown. + // {{ .Resource.Kind }}.status.conditions.reason the value should be a CamelCase string and producers of specific + // condition types may define expected values and meanings for this field, and whether the values + // are considered a guaranteed API. + // {{ .Resource.Kind }}.status.conditions.Message is a human readable message indicating details about the transition. + // For further information see: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties + + Conditions []metav1.Condition ` + "`" + `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` + "`" + ` +} + +//+kubebuilder:object:root=true +//+kubebuilder:subresource:status +{{- if and (not .Resource.API.Namespaced) (not .Resource.IsRegularPlural) }} +//+kubebuilder:resource:path={{ .Resource.Plural }},scope=Cluster +{{- else if not .Resource.API.Namespaced }} +//+kubebuilder:resource:scope=Cluster +{{- else if not .Resource.IsRegularPlural }} +//+kubebuilder:resource:path={{ .Resource.Plural }} +{{- end }} + +// {{ .Resource.Kind }} is the Schema for the {{ .Resource.Plural }} API +type {{ .Resource.Kind }} struct { + metav1.TypeMeta ` + "`" + `json:",inline"` + "`" + ` + metav1.ObjectMeta ` + "`" + `json:"metadata,omitempty"` + "`" + ` + + Spec {{ .Resource.Kind }}Spec ` + "`" + `json:"spec,omitempty"` + "`" + ` + Status {{ .Resource.Kind }}Status ` + "`" + `json:"status,omitempty"` + "`" + ` +} + +//+kubebuilder:object:root=true + +// {{ .Resource.Kind }}List contains a list of {{ .Resource.Kind }} +type {{ .Resource.Kind }}List struct { + metav1.TypeMeta ` + "`" + `json:",inline"` + "`" + ` + metav1.ListMeta ` + "`" + `json:"metadata,omitempty"` + "`" + ` + Items []{{ .Resource.Kind }} ` + "`" + `json:"items"` + "`" + ` +} + +func init() { + SchemeBuilder.Register(&{{ .Resource.Kind }}{}, &{{ .Resource.Kind }}List{}) +} +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/config/samples/crd_sample.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/config/samples/crd_sample.go new file mode 100644 index 000000000..ea88d0e41 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/config/samples/crd_sample.go @@ -0,0 +1,60 @@ +/* +Copyright 2022 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 samples + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &CRDSample{} + +// CRDSample scaffolds a file that defines a sample manifest for the CRD +type CRDSample struct { + machinery.TemplateMixin + machinery.ResourceMixin + + // Port if informed we will create the scaffold with this spec + Port string +} + +// SetTemplateDefaults implements file.Template +func (f *CRDSample) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("config", "samples", "%[group]_%[version]_%[kind].yaml") + } + f.Path = f.Resource.Replacer().Replace(f.Path) + + f.IfExistsAction = machinery.OverwriteFile + + f.TemplateBody = crdSampleTemplate + + return nil +} + +const crdSampleTemplate = `apiVersion: {{ .Resource.QualifiedGroup }}/{{ .Resource.Version }} +kind: {{ .Resource.Kind }} +metadata: + name: {{ lower .Resource.Kind }}-sample +spec: + # TODO(user): edit the following value to ensure the number + # of Pods/Instances your Operand must have on cluster + size: 1 + + {{ if not (isEmptyStr .Port) -}} + # TODO(user): edit the following value to ensure the the container has the right port to be initialized + containerPort: {{ .Port }} + {{- end }} +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/controllers/controller-test.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/controllers/controller-test.go new file mode 100644 index 000000000..525e6c50c --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/controllers/controller-test.go @@ -0,0 +1,166 @@ +/* +Copyright 2022 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 controllers + +import ( + "fmt" + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &ControllerTest{} + +// ControllerTest scaffolds the file that defines tests for the controller for a CRD or a builtin resource +// nolint:maligned +type ControllerTest struct { + machinery.TemplateMixin + machinery.MultiGroupMixin + machinery.BoilerplateMixin + machinery.ResourceMixin + + Image string + Port string +} + +// SetTemplateDefaults implements file.Template +func (f *ControllerTest) SetTemplateDefaults() error { + if f.Path == "" { + if f.MultiGroup && f.Resource.Group != "" { + f.Path = filepath.Join("controllers", "%[group]", "%[kind]_controller_test.go") + } else { + f.Path = filepath.Join("controllers", "%[kind]_controller_test.go") + } + } + f.Path = f.Resource.Replacer().Replace(f.Path) + + fmt.Println("creating import for %", f.Resource.Path) + f.TemplateBody = controllerTestTemplate + + return nil +} + +//nolint:lll +const controllerTestTemplate = `{{ .Boilerplate }} + +package {{ if and .MultiGroup .Resource.Group }}{{ .Resource.PackageName }}{{ else }}controllers{{ end }} + +import ( + "context" + "os" + "time" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + {{ if not (isEmptyStr .Resource.Path) -}} + {{ .Resource.ImportAlias }} "{{ .Resource.Path }}" + {{- end }} +) + +var _ = Describe("{{ .Resource.Kind }} controller", func() { + Context("{{ .Resource.Kind }} controller test", func() { + + const {{ .Resource.Kind }}Name = "test-{{ lower .Resource.Kind }}" + + ctx := context.Background() + + namespace := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: {{ .Resource.Kind }}Name, + Namespace: {{ .Resource.Kind }}Name, + }, + } + + typeNamespaceName := types.NamespacedName{Name: {{ .Resource.Kind }}Name, Namespace: {{ .Resource.Kind }}Name} + + BeforeEach(func() { + By("Creating the Namespace to perform the tests") + err := k8sClient.Create(ctx, namespace); + Expect(err).To(Not(HaveOccurred())) + + By("Setting the Image ENV VAR which stores the Operand image") + err= os.Setenv("{{ upper .Resource.Kind }}_IMAGE", "example.com/image:test") + Expect(err).To(Not(HaveOccurred())) + }) + + AfterEach(func() { + By("Deleting the Namespace to perform the tests") + _ = k8sClient.Delete(ctx, namespace); + + By("Removing the Image ENV VAR which stores the Operand image") + _ = os.Unsetenv("{{ upper .Resource.Kind }}_IMAGE") + }) + + It("should successfully reconcile a custom resource for {{ .Resource.Kind }}", func() { + By("Creating the custom resource for the Kind {{ .Resource.Kind }}") + {{ lower .Resource.Kind }} := &{{ .Resource.ImportAlias }}.{{ .Resource.Kind }}{} + err := k8sClient.Get(ctx, typeNamespaceName, {{ lower .Resource.Kind }}) + if err != nil && errors.IsNotFound(err) { + // Let's mock our custom resource at the same way that we would + // apply on the cluster the manifest under config/samples + {{ lower .Resource.Kind }} := &{{ .Resource.ImportAlias }}.{{ .Resource.Kind }}{ + ObjectMeta: metav1.ObjectMeta{ + Name: {{ .Resource.Kind }}Name, + Namespace: namespace.Name, + }, + Spec: {{ .Resource.ImportAlias }}.{{ .Resource.Kind }}Spec{ + Size: 1, + {{ if not (isEmptyStr .Port) -}} + ContainerPort: {{ .Port }}, + {{- end }} + }, + } + + err = k8sClient.Create(ctx, {{ lower .Resource.Kind }}) + Expect(err).To(Not(HaveOccurred())) + } + + By("Checking if the custom resource was successfully created") + Eventually(func() error { + found := &{{ .Resource.ImportAlias }}.{{ .Resource.Kind }}{} + return k8sClient.Get(ctx, typeNamespaceName, found) + }, time.Minute, time.Second).Should(Succeed()) + + By("Reconciling the custom resource created") + {{ lower .Resource.Kind }}Reconciler := &{{ .Resource.Kind }}Reconciler{ + Client: k8sClient, + Scheme: k8sClient.Scheme(), + } + + _, err = {{ lower .Resource.Kind }}Reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: typeNamespaceName, + }) + Expect(err).To(Not(HaveOccurred())) + + By("Checking if Deployment was successfully created in the reconciliation") + Eventually(func() error { + found := &appsv1.Deployment{} + return k8sClient.Get(ctx, typeNamespaceName, found) + }, time.Minute, time.Second).Should(Succeed()) + }) + }) +}) +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/controllers/controller.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/controllers/controller.go new file mode 100644 index 000000000..316743318 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/deploy-image/v1alpha1/scaffolds/internal/templates/controllers/controller.go @@ -0,0 +1,445 @@ +/* +Copyright 2022 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 controllers + +import ( + "fmt" + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Controller{} + +// Controller scaffolds the file that defines the controller for a CRD or a builtin resource +// nolint:maligned +type Controller struct { + machinery.TemplateMixin + machinery.MultiGroupMixin + machinery.BoilerplateMixin + machinery.ResourceMixin + machinery.ProjectNameMixin + + ControllerRuntimeVersion string +} + +// SetTemplateDefaults implements file.Template +func (f *Controller) SetTemplateDefaults() error { + if f.Path == "" { + if f.MultiGroup && f.Resource.Group != "" { + f.Path = filepath.Join("controllers", "%[group]", "%[kind]_controller.go") + } else { + f.Path = filepath.Join("controllers", "%[kind]_controller.go") + } + } + f.Path = f.Resource.Replacer().Replace(f.Path) + + fmt.Println("creating import for %", f.Resource.Path) + f.TemplateBody = controllerTemplate + + // This one is to overwrite the controller if it exist + f.IfExistsAction = machinery.OverwriteFile + + return nil +} + +//nolint:lll +const controllerTemplate = `{{ .Boilerplate }} + +package {{ if and .MultiGroup .Resource.Group }}{{ .Resource.PackageName }}{{ else }}controllers{{ end }} + +import ( + "context" + "strings" + "time" + "fmt" + "os" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/client-go/tools/record" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + + {{ if not (isEmptyStr .Resource.Path) -}} + {{ .Resource.ImportAlias }} "{{ .Resource.Path }}" + {{- end }} +) + +const {{ lower .Resource.Kind }}Finalizer = "{{ .Resource.Group }}.{{ .Resource.Domain }}/finalizer" + +// Definitions to manage status conditions +const ( + // typeAvailable{{ .Resource.Kind }} represents the status of the Deployment reconciliation + typeAvailable{{ .Resource.Kind }} = "Available" + // typeDegraded{{ .Resource.Kind }} represents the status used when the custom resource is deleted and the finalizer operations are must to occur. + typeDegraded{{ .Resource.Kind }} = "Degraded" +) + +// {{ .Resource.Kind }}Reconciler reconciles a {{ .Resource.Kind }} object +type {{ .Resource.Kind }}Reconciler struct { + client.Client + Scheme *runtime.Scheme + Recorder record.EventRecorder +} + +// The following markers are used to generate the rules permissions (RBAC) on config/rbac using controller-gen +// when the command is executed. +// To know more about markers see: https://book.kubebuilder.io/reference/markers.html + +//+kubebuilder:rbac:groups={{ .Resource.QualifiedGroup }},resources={{ .Resource.Plural }},verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups={{ .Resource.QualifiedGroup }},resources={{ .Resource.Plural }}/status,verbs=get;update;patch +//+kubebuilder:rbac:groups={{ .Resource.QualifiedGroup }},resources={{ .Resource.Plural }}/finalizers,verbs=update +//+kubebuilder:rbac:groups=core,resources=events,verbs=create;patch +//+kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch + +// Reconcile is part of the main kubernetes reconciliation loop which aims to +// move the current state of the cluster closer to the desired state. + +// It is essential for the controller's reconciliation loop to be idempotent. By following the Operator +// pattern you will create Controllers which provide a reconcile function +// responsible for synchronizing resources until the desired state is reached on the cluster. +// Breaking this recommendation goes against the design principles of controller-runtime. +// and may lead to unforeseen consequences such as resources becoming stuck and requiring manual intervention. +// For further info: +// - About Operator Pattern: https://kubernetes.io/docs/concepts/extend-kubernetes/operator/ +// - About Controllers: https://kubernetes.io/docs/concepts/architecture/controller/ +// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@{{ .ControllerRuntimeVersion }}/pkg/reconcile +func (r *{{ .Resource.Kind }}Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { + log := log.FromContext(ctx) + + // Fetch the {{ .Resource.Kind }} instance + // The purpose is check if the Custom Resource for the Kind {{ .Resource.Kind }} + // is applied on the cluster if not we return nil to stop the reconciliation + {{ lower .Resource.Kind }} := &{{ .Resource.ImportAlias }}.{{ .Resource.Kind }}{} + err := r.Get(ctx, req.NamespacedName, {{ lower .Resource.Kind }}) + if err != nil { + if apierrors.IsNotFound(err) { + // If the custom resource is not found then, it usually means that it was deleted or not created + // In this way, we will stop the reconciliation + log.Info("{{ lower .Resource.Kind }} resource not found. Ignoring since object must be deleted") + return ctrl.Result{}, nil + } + // Error reading the object - requeue the request. + log.Error(err, "Failed to get {{ lower .Resource.Kind }}") + return ctrl.Result{}, err + } + + // Let's just set the status as Unknown when no status are available + if {{ lower .Resource.Kind }}.Status.Conditions == nil || len({{ lower .Resource.Kind }}.Status.Conditions) == 0 { + meta.SetStatusCondition(&{{ lower .Resource.Kind }}.Status.Conditions, metav1.Condition{Type: typeAvailable{{ .Resource.Kind }}, Status: metav1.ConditionUnknown, Reason: "Reconciling", Message: "Starting reconciliation"}) + if err = r.Status().Update(ctx, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to update {{ .Resource.Kind }} status") + return ctrl.Result{}, err + } + + // Let's re-fetch the {{ lower .Resource.Kind }} Custom Resource after update the status + // so that we have the latest state of the resource on the cluster and we will avoid + // raise the issue "the object has been modified, please apply + // your changes to the latest version and try again" which would re-trigger the reconciliation + // if we try to update it again in the following operations + if err := r.Get(ctx, req.NamespacedName, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to re-fetch {{ lower .Resource.Kind }}") + return ctrl.Result{}, err + } + } + + // Let's add a finalizer. Then, we can define some operations which should + // occurs before the custom resource to be deleted. + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/finalizers + if !controllerutil.ContainsFinalizer({{ lower .Resource.Kind }}, {{ lower .Resource.Kind }}Finalizer) { + log.Info("Adding Finalizer for {{ .Resource.Kind }}") + if ok := controllerutil.AddFinalizer({{ lower .Resource.Kind }}, {{ lower .Resource.Kind }}Finalizer); !ok { + log.Error(err, "Failed to add finalizer into the custom resource") + return ctrl.Result{Requeue: true}, nil + } + + if err = r.Update(ctx, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to update custom resource to add finalizer") + return ctrl.Result{}, err + } + } + + // Check if the {{ .Resource.Kind }} instance is marked to be deleted, which is + // indicated by the deletion timestamp being set. + is{{ .Resource.Kind }}MarkedToBeDeleted := {{ lower .Resource.Kind }}.GetDeletionTimestamp() != nil + if is{{ .Resource.Kind }}MarkedToBeDeleted { + if controllerutil.ContainsFinalizer({{ lower .Resource.Kind }}, {{ lower .Resource.Kind }}Finalizer) { + log.Info("Performing Finalizer Operations for {{ .Resource.Kind }} before delete CR") + + // Let's add here an status "Downgrade" to define that this resource begin its process to be terminated. + meta.SetStatusCondition(&{{ lower .Resource.Kind }}.Status.Conditions, metav1.Condition{Type: typeDegraded{{ .Resource.Kind }}, + Status: metav1.ConditionUnknown, Reason: "Finalizing", + Message: fmt.Sprintf("Performing finalizer operations for the custom resource: %s ", {{ lower .Resource.Kind }}.Name)}) + + if err := r.Status().Update(ctx, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to update {{ .Resource.Kind }} status") + return ctrl.Result{}, err + } + + // Perform all operations required before remove the finalizer and allow + // the Kubernetes API to remove the custom custom resource. + r.doFinalizerOperationsFor{{ .Resource.Kind }}({{ lower .Resource.Kind }}) + + // TODO(user): If you add operations to the doFinalizerOperationsFor{{ .Resource.Kind }} method + // then you need to ensure that all worked fine before deleting and updating the Downgrade status + // otherwise, you should requeue here. + + // Re-fetch the {{ lower .Resource.Kind }} Custom Resource before update the status + // so that we have the latest state of the resource on the cluster and we will avoid + // raise the issue "the object has been modified, please apply + // your changes to the latest version and try again" which would re-trigger the reconciliation + if err := r.Get(ctx, req.NamespacedName, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to re-fetch {{ lower .Resource.Kind }}") + return ctrl.Result{}, err + } + + meta.SetStatusCondition(&{{ lower .Resource.Kind }}.Status.Conditions, metav1.Condition{Type: typeDegraded{{ .Resource.Kind }}, + Status: metav1.ConditionTrue, Reason: "Finalizing", + Message: fmt.Sprintf("Finalizer operations for custom resource %s name were successfully accomplished", {{ lower .Resource.Kind }}.Name)}) + + if err := r.Status().Update(ctx, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to update {{ .Resource.Kind }} status") + return ctrl.Result{}, err + } + + log.Info("Removing Finalizer for {{ .Resource.Kind }} after successfully perform the operations") + if ok:= controllerutil.RemoveFinalizer({{ lower .Resource.Kind }}, {{ lower .Resource.Kind }}Finalizer); !ok{ + log.Error(err, "Failed to remove finalizer for {{ .Resource.Kind }}") + return ctrl.Result{Requeue: true}, nil + } + + if err := r.Update(ctx, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to remove finalizer for {{ .Resource.Kind }}") + return ctrl.Result{}, err + } + } + return ctrl.Result{}, nil + } + + // Check if the deployment already exists, if not create a new one + found := &appsv1.Deployment{} + err = r.Get(ctx, types.NamespacedName{Name: {{ lower .Resource.Kind }}.Name, Namespace: {{ lower .Resource.Kind }}.Namespace}, found) + if err != nil && apierrors.IsNotFound(err) { + // Define a new deployment + dep, err := r.deploymentFor{{ .Resource.Kind }}({{ lower .Resource.Kind }}) + if err != nil { + log.Error(err, "Failed to define new Deployment resource for {{ .Resource.Kind }}") + + // The following implementation will update the status + meta.SetStatusCondition(&{{ lower .Resource.Kind }}.Status.Conditions, metav1.Condition{Type: typeAvailable{{ .Resource.Kind }}, + Status: metav1.ConditionFalse, Reason: "Reconciling", + Message: fmt.Sprintf("Failed to create Deployment for the custom resource (%s): (%s)", {{ lower .Resource.Kind }}.Name, err)}) + + if err := r.Status().Update(ctx, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to update {{ .Resource.Kind }} status") + return ctrl.Result{}, err + } + + return ctrl.Result{}, err + } + + log.Info("Creating a new Deployment", + "Deployment.Namespace", dep.Namespace, "Deployment.Name", dep.Name) + if err = r.Create(ctx, dep); err != nil { + log.Error(err, "Failed to create new Deployment", + "Deployment.Namespace", dep.Namespace, "Deployment.Name", dep.Name) + return ctrl.Result{}, err + } + + // Deployment created successfully + // We will requeue the reconciliation so that we can ensure the state + // and move forward for the next operations + return ctrl.Result{RequeueAfter: time.Minute}, nil + } else if err != nil { + log.Error(err, "Failed to get Deployment") + // Let's return the error for the reconciliation be re-trigged again + return ctrl.Result{}, err + } + + // The CRD API is defining that the {{ .Resource.Kind }} type, have a {{ .Resource.Kind }}Spec.Size field + // to set the quantity of Deployment instances is the desired state on the cluster. + // Therefore, the following code will ensure the Deployment size is the same as defined + // via the Size spec of the Custom Resource which we are reconciling. + size := {{ lower .Resource.Kind }}.Spec.Size + if *found.Spec.Replicas != size { + found.Spec.Replicas = &size + if err = r.Update(ctx, found); err != nil { + log.Error(err, "Failed to update Deployment", + "Deployment.Namespace", found.Namespace, "Deployment.Name", found.Name) + + // Re-fetch the {{ lower .Resource.Kind }} Custom Resource before update the status + // so that we have the latest state of the resource on the cluster and we will avoid + // raise the issue "the object has been modified, please apply + // your changes to the latest version and try again" which would re-trigger the reconciliation + if err := r.Get(ctx, req.NamespacedName, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to re-fetch {{ lower .Resource.Kind }}") + return ctrl.Result{}, err + } + + // The following implementation will update the status + meta.SetStatusCondition(&{{ lower .Resource.Kind }}.Status.Conditions, metav1.Condition{Type: typeAvailable{{ .Resource.Kind }}, + Status: metav1.ConditionFalse, Reason: "Resizing", + Message: fmt.Sprintf("Failed to update the size for the custom resource (%s): (%s)", {{ lower .Resource.Kind }}.Name, err)}) + + if err := r.Status().Update(ctx, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to update {{ .Resource.Kind }} status") + return ctrl.Result{}, err + } + + return ctrl.Result{}, err + } + + // Now, that we update the size we want to requeue the reconciliation + // so that we can ensure that we have the latest state of the resource before + // update. Also, it will help ensure the desired state on the cluster + return ctrl.Result{Requeue: true}, nil + } + + // The following implementation will update the status + meta.SetStatusCondition(&{{ lower .Resource.Kind }}.Status.Conditions, metav1.Condition{Type: typeAvailable{{ .Resource.Kind }}, + Status: metav1.ConditionTrue, Reason: "Reconciling", + Message: fmt.Sprintf("Deployment for custom resource (%s) with %d replicas created successfully", {{ lower .Resource.Kind }}.Name, size)}) + + if err := r.Status().Update(ctx, {{ lower .Resource.Kind }}); err != nil { + log.Error(err, "Failed to update {{ .Resource.Kind }} status") + return ctrl.Result{}, err + } + + return ctrl.Result{}, nil +} + +// finalize{{ .Resource.Kind }} will perform the required operations before delete the CR. +func (r *{{ .Resource.Kind }}Reconciler) doFinalizerOperationsFor{{ .Resource.Kind }}(cr *{{ .Resource.ImportAlias }}.{{ .Resource.Kind }}) { + // TODO(user): Add the cleanup steps that the operator + // needs to do before the CR can be deleted. Examples + // of finalizers include performing backups and deleting + // resources that are not owned by this CR, like a PVC. + + // Note: It is not recommended to use finalizers with the purpose of delete resources which are + // created and managed in the reconciliation. These ones, such as the Deployment created on this reconcile, + // are defined as depended of the custom resource. See that we use the method ctrl.SetControllerReference. + // to set the ownerRef which means that the Deployment will be deleted by the Kubernetes API. + // More info: https://kubernetes.io/docs/tasks/administer-cluster/use-cascading-deletion/ + + // The following implementation will raise an event + r.Recorder.Event(cr, "Warning", "Deleting", + fmt.Sprintf("Custom Resource %s is being deleted from the namespace %s", + cr.Name, + cr.Namespace),) +} + +// deploymentFor{{ .Resource.Kind }} returns a {{ .Resource.Kind }} Deployment object +func (r *{{ .Resource.Kind }}Reconciler) deploymentFor{{ .Resource.Kind }}( + {{ lower .Resource.Kind }} *{{ .Resource.ImportAlias }}.{{ .Resource.Kind }}) (*appsv1.Deployment, error) { + ls := labelsFor{{ .Resource.Kind }}({{ lower .Resource.Kind }}.Name) + replicas := {{ lower .Resource.Kind }}.Spec.Size + + // Get the Operand image + image, err := imageFor{{ .Resource.Kind }}() + if err != nil { + return nil, err + } + + dep := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: {{ lower .Resource.Kind }}.Name, + Namespace: {{ lower .Resource.Kind }}.Namespace, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: &replicas, + Selector: &metav1.LabelSelector{ + MatchLabels: ls, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: ls, + }, + Spec: corev1.PodSpec{ + SecurityContext: &corev1.PodSecurityContext{ + RunAsNonRoot: &[]bool{true}[0], + // IMPORTANT: seccomProfile was introduced with Kubernetes 1.19 + // If you are looking for to produce solutions to be supported + // on lower versions you must remove this option. + SeccompProfile: &corev1.SeccompProfile{ + Type: corev1.SeccompProfileTypeRuntimeDefault, + }, + }, + //TODO: scaffold container, + }, + }, + }, + } + + // Set the ownerRef for the Deployment + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/ + if err := ctrl.SetControllerReference({{ lower .Resource.Kind }}, dep, r.Scheme); err != nil { + return nil, err + } + return dep, nil +} + +// labelsFor{{ .Resource.Kind }} returns the labels for selecting the resources +// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/ +func labelsFor{{ .Resource.Kind }}(name string) map[string]string { + var imageTag string + image, err := imageFor{{ .Resource.Kind }}() + if err == nil { + imageTag = strings.Split(image, ":")[1] + } + return map[string]string{"app.kubernetes.io/name": "{{ .Resource.Kind }}", + "app.kubernetes.io/instance": name, + "app.kubernetes.io/version": imageTag, + "app.kubernetes.io/part-of": "{{ .ProjectName }}", + "app.kubernetes.io/created-by": "controller-manager", + } +} + +// imageFor{{ .Resource.Kind }} gets the Operand image which is managed by this controller +// from the {{ upper .Resource.Kind }}_IMAGE environment variable defined in the config/manager/manager.yaml +func imageFor{{ .Resource.Kind }}() (string, error) { + var imageEnvVar = "{{ upper .Resource.Kind }}_IMAGE" + image, found := os.LookupEnv(imageEnvVar) + if !found { + return "", fmt.Errorf("Unable to find %s environment variable with the image", imageEnvVar) + } + return image, nil +} + +// SetupWithManager sets up the controller with the Manager. +// Note that the Deployment will be also watched in order to ensure its +// desirable state on the cluster +func (r *{{ .Resource.Kind }}Reconciler) SetupWithManager(mgr ctrl.Manager) error { + return ctrl.NewControllerManagedBy(mgr). + {{ if not (isEmptyStr .Resource.Path) -}} + For(&{{ .Resource.ImportAlias }}.{{ .Resource.Kind }}{}). + {{- else -}} + // Uncomment the following line adding a pointer to an instance of the controlled resource as an argument + // For(). + {{- end }} + Owns(&appsv1.Deployment{}). + Complete(r) +} +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/api.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/api.go index 35676e788..88ccd3d18 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/api.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/api.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +//go:deprecated This package has been deprecated package v2 import ( diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/edit.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/edit.go index bdab90544..d8e04f394 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/edit.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/edit.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +//go:deprecated This package has been deprecated package v2 import ( diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/init.go index 7b85d023c..bafe378c3 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/init.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/init.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +//go:deprecated This package has been deprecated package v2 import ( diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/plugin.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/plugin.go index fd1d77794..894a660dd 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/plugin.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/plugin.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +//go:deprecated This package has been deprecated package v2 import ( @@ -63,3 +64,12 @@ func (p Plugin) GetCreateWebhookSubcommand() plugin.CreateWebhookSubcommand { // GetEditSubcommand will return the subcommand which is responsible for editing the scaffold of the project func (p Plugin) GetEditSubcommand() plugin.EditSubcommand { return &p.editSubcommand } + +func (p Plugin) DeprecationWarning() string { + return "This version is deprecated and is no longer scaffolded by default since `28 Apr 2021`." + + "The `go/v2` plugin cannot scaffold projects in which CRDs and/or Webhooks have a `v1` API version." + + "Be aware that v1beta1 API for CRDs and Webhooks was deprecated on Kubernetes 1.16 and are" + + "removed as of the Kubernetes 1.22 release. Therefore, since this plugin cannot produce projects that" + + "work on Kubernetes versions >= 1.22, it is recommended to upgrade your project " + + "to the latest versions available." +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/init.go index 4651a1099..fd40cb0bc 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/init.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/init.go @@ -40,6 +40,12 @@ const ( // ControllerToolsVersion is the kubernetes-sigs/controller-tools version to be used in the project ControllerToolsVersion = "v0.3.0" // KustomizeVersion is the kubernetes-sigs/kustomize version to be used in the project + // @Deprecate: KustomizeVersion came from the Kustomize plugin since go/v3 + // Go/v2 plugin exist only to ensure the backwards compatibility with the old scaffold + // produced with kubebuilder >= 2.0.0 < 3.0.0. It does not take advantage of the plugin system + // (see that the PROJECT file does not have the layout of the plugin and uses the old/legacy + // version/schema.) This plugin will be deprecated with go/v4-alpha and can be removed + // when go/v4 stable is published. KustomizeVersion = "v3.5.4" imageName = "controller:latest" diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go index 7d49171c1..25ce44b12 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/config/kdefault/manager_auth_proxy_patch.go @@ -54,7 +54,7 @@ spec: spec: containers: - name: kube-rbac-proxy - image: gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0 + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0 args: - "--secure-listen-address=0.0.0.0:8443" - "--upstream=http://127.0.0.1:8080/" diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller_suitetest.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller_suitetest.go index 31cef7a86..d8a0b9750 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller_suitetest.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller_suitetest.go @@ -162,6 +162,7 @@ var _ = BeforeSuite(func(done Done) { } var err error + // cfg is defined in this file globally. cfg, err = testEnv.Start() Expect(err).ToNot(HaveOccurred()) Expect(cfg).ToNot(BeNil()) diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/makefile.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/makefile.go index d8491b7fe..f13be8556 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/makefile.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/scaffolds/internal/templates/makefile.go @@ -154,35 +154,29 @@ deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. $(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f - -.PHONY: controller-gen -controller-gen: ## Download controller-gen locally if necessary. -ifeq (, $(shell which controller-gen)) - @{ \ - set -e ;\ - CONTROLLER_GEN_TMP_DIR=$$(mktemp -d) ;\ - cd $$CONTROLLER_GEN_TMP_DIR ;\ - go mod init tmp ;\ - go get sigs.k8s.io/controller-tools/cmd/controller-gen@{{ .ControllerToolsVersion }} ;\ - rm -rf $$CONTROLLER_GEN_TMP_DIR ;\ - } -CONTROLLER_GEN=$(GOBIN)/controller-gen -else -CONTROLLER_GEN=$(shell which controller-gen) -endif +##@ Build Dependencies + +## Location to install dependencies to +LOCALBIN ?= $(shell pwd)/bin +$(LOCALBIN): ## Ensure that the directory exists + mkdir -p $(LOCALBIN) + +## Tool Binaries +KUSTOMIZE ?= $(LOCALBIN)/kustomize +CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen +## Tool Versions +KUSTOMIZE_VERSION ?= {{ .KustomizeVersion }} +CONTROLLER_TOOLS_VERSION ?= {{ .ControllerToolsVersion }} + +KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" .PHONY: kustomize -kustomize: ## Download kustomize locally if necessary. -ifeq (, $(shell which kustomize)) - @{ \ - set -e ;\ - KUSTOMIZE_GEN_TMP_DIR=$$(mktemp -d) ;\ - cd $$KUSTOMIZE_GEN_TMP_DIR ;\ - go mod init tmp ;\ - go get sigs.k8s.io/kustomize/kustomize/v3@{{ .KustomizeVersion }} ;\ - rm -rf $$KUSTOMIZE_GEN_TMP_DIR ;\ - } -KUSTOMIZE=$(GOBIN)/kustomize -else -KUSTOMIZE=$(shell which kustomize) -endif +kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. +$(KUSTOMIZE): $(LOCALBIN) + test -s $(LOCALBIN)/kustomize || { curl -s $(KUSTOMIZE_INSTALL_SCRIPT) | bash -s -- $(subst v,,$(KUSTOMIZE_VERSION)) $(LOCALBIN); } + +.PHONY: controller-gen +controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. +$(CONTROLLER_GEN): $(LOCALBIN) + test -s $(LOCALBIN)/controller-gen || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION) ` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/webhook.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/webhook.go index d14229885..02a7ae91e 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/webhook.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v2/webhook.go @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +//go:deprecated This package has been deprecated package v2 import ( diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/commons.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/commons.go index e3d44b8f9..8a3a226d9 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/commons.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/commons.go @@ -57,8 +57,7 @@ func applyScaffoldCustomizationsForVbeta1() error { fmt.Printf("unable to update the makefile to allow the usage of v1beta1: %s", err) } - const makegentarget = ` -manifests: controller-gen` + const makegentarget = `manifests: controller-gen` const makegenV1beta1Options = `# Produce CRDs that work back to Kubernetes 1.11 (no version conversion) CRD_OPTIONS ?= "crd:crdVersions={v1beta1},trivialVersions=true,preserveUnknownFields=false" manifests: controller-gen` @@ -70,16 +69,16 @@ manifests: controller-gen` // latest version of controller-tools where v1beta1 is supported const controllerToolsVersionForVBeta1 = "v0.6.2" if err := util.ReplaceInFile("Makefile", - fmt.Sprintf("controller-gen@%s", + fmt.Sprintf("CONTROLLER_TOOLS_VERSION ?= %s", scaffolds.ControllerToolsVersion), - fmt.Sprintf("controller-gen@%s", + fmt.Sprintf("CONTROLLER_TOOLS_VERSION ?= %s", controllerToolsVersionForVBeta1)); err != nil { log.Warnf("unable to update the Makefile with %s: %s", fmt.Sprintf("controller-gen@%s", controllerToolsVersionForVBeta1), err) } if err := util.ReplaceInFile("Makefile", - "ENVTEST_K8S_VERSION = 1.23", + "ENVTEST_K8S_VERSION = 1.24.2", "ENVTEST_K8S_VERSION = 1.21"); err != nil { log.Warnf("unable to update the Makefile with %s: %s", "ENVTEST_K8S_VERSION = 1.21", err) } @@ -95,19 +94,19 @@ manifests: controller-gen` } if err := util.ReplaceInFile("go.mod", - "k8s.io/api v0.23.0", + "k8s.io/api v0.24.2", "k8s.io/api v0.21.2"); err != nil { log.Warnf("unable to update the go.mod with k8s.io/api v0.21.2: %s", err) } if err := util.ReplaceInFile("go.mod", - "k8s.io/apimachinery v0.23.0", + "k8s.io/apimachinery v0.24.2", "k8s.io/apimachinery v0.21.2"); err != nil { log.Warnf("unable to update the go.mod with k8s.io/apimachinery v0.21.2: %s", err) } if err := util.ReplaceInFile("go.mod", - "k8s.io/client-go v0.23.0", + "k8s.io/client-go v0.24.2", "k8s.io/client-go v0.21.2"); err != nil { log.Warnf("unable to update the go.mod with k8s.io/client-go v0.21.2: %s", err) } @@ -115,19 +114,19 @@ manifests: controller-gen` // During the scaffolding phase, this gets added to go.mod file, running go mod tidy bumps back // the version from 21.2 to the latest if err := util.ReplaceInFile("go.mod", - "k8s.io/api v0.23.0", + "k8s.io/api v0.24.2", "k8s.io/api v0.21.2"); err != nil { log.Warnf("unable to update the go.mod with k8s.io/api v0.21.2: %s", err) } if err := util.ReplaceInFile("go.mod", - "k8s.io/apiextensions-apiserver v0.23.0", + "k8s.io/apiextensions-apiserver v0.24.2", "k8s.io/apiextensions-apiserver v0.21.2"); err != nil { log.Warnf("unable to update the go.mod with k8s.io/apiextensions-apiserver v0.21.2: %s", err) } if err := util.ReplaceInFile("go.mod", - "k8s.io/component-base v0.23.0", + "k8s.io/component-base v0.24.2", "k8s.io/component-base v0.21.2"); err != nil { log.Warnf("unable to update the go.mod with k8s.io/component-base v0.21.2: %s", err) } @@ -146,11 +145,17 @@ manifests: controller-gen` } if err := util.ReplaceInFile("go.mod", - "k8s.io/klog/v2 v2.30.0", + "k8s.io/klog/v2 v2.60.1", "k8s.io/klog/v2 v2.9.0"); err != nil { log.Warnf("unable to update the go.mod with k8s.io/klog/v2 v2.9.0: %s", err) } + // Due to some indirect dependency changes with a bump in k8s packages from 0.23.x --> 0.24.x we need to + // clear out all indirect dependencies before we run `go mod tidy` so that the above changes get resolved correctly + if err := util.ReplaceRegexInFile("go.mod", `(require \(\n(\t.* \/\/ indirect\n)+\))`, ""); err != nil { + log.Warnf("unable to update the go.mod indirect dependencies: %s", err) + } + err = util.RunCmd("Update dependencies", "go", "mod", "tidy") if err != nil { return err diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/init.go index 1b994e6ab..68a30b351 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/init.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/init.go @@ -35,7 +35,7 @@ import ( // Variables and function to check Go version requirements. var ( - goVerMin = golang.MustParse("go1.16") + goVerMin = golang.MustParse("go1.17.9") goVerMax = golang.MustParse("go2.0alpha1") ) diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/init.go index a109771ad..8be137610 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/init.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/init.go @@ -19,28 +19,32 @@ package scaffolds import ( "fmt" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "github.com/spf13/afero" "sigs.k8s.io/kubebuilder/v3/pkg/config" "sigs.k8s.io/kubebuilder/v3/pkg/machinery" "sigs.k8s.io/kubebuilder/v3/pkg/plugins" + kustomizecommonv1 "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v1" + kustomizecommonv2alpha "sigs.k8s.io/kubebuilder/v3/pkg/plugins/common/kustomize/v2-alpha" "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates" "sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/hack" ) const ( // ControllerRuntimeVersion is the kubernetes-sigs/controller-runtime version to be used in the project - ControllerRuntimeVersion = "v0.11.0" + ControllerRuntimeVersion = "v0.12.2" // ControllerToolsVersion is the kubernetes-sigs/controller-tools version to be used in the project - ControllerToolsVersion = "v0.8.0" - // KustomizeVersion is the kubernetes-sigs/kustomize version to be used in the project - KustomizeVersion = "v3.8.7" + ControllerToolsVersion = "v0.9.2" imageName = "controller:latest" ) var _ plugins.Scaffolder = &initScaffolder{} +var kustomizeVersion string + type initScaffolder struct { config config.Config boilerplatePath string @@ -97,6 +101,21 @@ func (s *initScaffolder) Scaffold() error { machinery.WithBoilerplate(string(boilerplate)), ) + // If the KustomizeV2 was used to do the scaffold then + // we need to ensure that we use its supported Kustomize Version + // in order to support it + kustomizeVersion = kustomizecommonv1.KustomizeVersion + kustomizev2 := kustomizecommonv2alpha.Plugin{} + gov4alpha := "go.kubebuilder.io/v4-alpha" + pluginKeyForKustomizeV2 := plugin.KeyFor(kustomizev2) + + for _, pluginKey := range s.config.GetPluginChain() { + if pluginKey == pluginKeyForKustomizeV2 || pluginKey == gov4alpha { + kustomizeVersion = kustomizecommonv2alpha.KustomizeVersion + break + } + } + return scaffold.Execute( &templates.Main{}, &templates.GoMod{ @@ -107,10 +126,11 @@ func (s *initScaffolder) Scaffold() error { Image: imageName, BoilerplatePath: s.boilerplatePath, ControllerToolsVersion: ControllerToolsVersion, - KustomizeVersion: KustomizeVersion, + KustomizeVersion: kustomizeVersion, ControllerRuntimeVersion: ControllerRuntimeVersion, }, &templates.Dockerfile{}, &templates.DockerIgnore{}, + &templates.Readme{}, ) } diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/api/webhook_suitetest.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/api/webhook_suitetest.go index cf963ba51..4c877fb3d 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/api/webhook_suitetest.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/api/webhook_suitetest.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 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 api import ( @@ -41,6 +57,7 @@ func (f *WebhookSuite) SetTemplateDefaults() error { f.TemplateBody = fmt.Sprintf(webhookTestSuiteTemplate, machinery.NewMarkerFor(f.Path, importMarker), + admissionImportAlias, machinery.NewMarkerFor(f.Path, addSchemeMarker), machinery.NewMarkerFor(f.Path, addWebhookManagerMarker), "%s", @@ -77,10 +94,7 @@ func (f *WebhookSuite) GetMarkers() []machinery.Marker { const ( apiImportCodeFragment = `%s "%s" ` - addschemeCodeFragment = `err = %s.AddToScheme(scheme ) -Expect(err).NotTo(HaveOccurred()) -` addWebhookManagerCodeFragment = `err = (&%s{}).SetupWebhookWithManager(mgr) Expect(err).NotTo(HaveOccurred()) @@ -97,7 +111,6 @@ func (f *WebhookSuite) GetCodeFragments() machinery.CodeFragmentsMap { // Generate add scheme code fragments addScheme := make([]string, 0) - addScheme = append(addScheme, fmt.Sprintf(addschemeCodeFragment, admissionImportAlias)) // Generate add webhookManager code fragments addWebhookManager := make([]string, 0) @@ -172,7 +185,9 @@ var _ = BeforeSuite(func() { }, } - cfg, err := testEnv.Start() + var err error + // cfg is defined in this file globally. + cfg, err = testEnv.Start() Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) @@ -180,6 +195,9 @@ var _ = BeforeSuite(func() { err = AddToScheme(scheme) Expect(err).NotTo(HaveOccurred()) + err = %s.AddToScheme(scheme) + Expect(err).NotTo(HaveOccurred()) + %s k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller_suitetest.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller_suitetest.go index 1dbb649a4..f2917542f 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller_suitetest.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller_suitetest.go @@ -130,8 +130,10 @@ package controllers import ( "path/filepath" "testing" + . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -166,7 +168,9 @@ var _ = BeforeSuite(func() { ErrorIfCRDPathMissing: {{ .Resource.HasAPI }}, } - cfg, err := testEnv.Start() + var err error + // cfg is defined in this file globally. + cfg, err = testEnv.Start() Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/dockerfile.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/dockerfile.go index a072725cc..9ed3f869f 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/dockerfile.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/dockerfile.go @@ -39,7 +39,7 @@ func (f *Dockerfile) SetTemplateDefaults() error { } const dockerfileTemplate = `# Build the manager binary -FROM golang:1.17 as builder +FROM golang:1.18 as builder WORKDIR /workspace # Copy the Go Modules manifests diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/gomod.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/gomod.go index f2cd7df7a..0bdfb567b 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/gomod.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/gomod.go @@ -46,7 +46,7 @@ func (f *GoMod) SetTemplateDefaults() error { const goModTemplate = ` module {{ .Repo }} -go 1.17 +go 1.18 require ( sigs.k8s.io/controller-runtime {{ .ControllerRuntimeVersion }} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/main.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/main.go index 34d80b4f0..e450584fb 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/main.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/main.go @@ -245,6 +245,17 @@ func main() { HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "{{ hashFNV .Repo }}.{{ .Domain }}", + // LeaderElectionReleaseOnCancel defines if the leader should step down voluntarily + // when the Manager ends. This requires the binary to immediately end when the + // Manager is stopped, otherwise, this setting is unsafe. Setting this significantly + // speeds up voluntary leader transitions as the new leader don't have to wait + // LeaseDuration time first. + // + // In the default scaffold provided, the program ends immediately after + // the manager stops, so would be fine to enable this option. However, + // if you are doing or is intended to do any operation such as perform cleanups + // after the manager stops then its usage might be unsafe. + // LeaderElectionReleaseOnCancel: true, }) {{- else }} var err error diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/makefile.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/makefile.go index bc54421eb..ba7c6d296 100644 --- a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/makefile.go +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/makefile.go @@ -61,7 +61,7 @@ const makefileTemplate = ` # Image URL to use all building/pushing image targets IMG ?= {{ .Image }} # ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. -ENVTEST_K8S_VERSION = 1.23 +ENVTEST_K8S_VERSION = 1.24.2 # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) @@ -71,7 +71,6 @@ GOBIN=$(shell go env GOBIN) endif # Setting SHELL to bash allows bash commands to be executed by recipes. -# This is a requirement for 'setup-envtest.sh' in the test target. # Options are set to exit when a recipe line exits non-zero or a piped command fails. SHELL = /usr/bin/env bash -o pipefail .SHELLFLAGS = -ec @@ -159,32 +158,35 @@ deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. $(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f - -CONTROLLER_GEN = $(shell pwd)/bin/controller-gen -.PHONY: controller-gen -controller-gen: ## Download controller-gen locally if necessary. - $(call go-get-tool,$(CONTROLLER_GEN),sigs.k8s.io/controller-tools/cmd/controller-gen@{{ .ControllerToolsVersion }}) +##@ Build Dependencies + +## Location to install dependencies to +LOCALBIN ?= $(shell pwd)/bin +$(LOCALBIN): + mkdir -p $(LOCALBIN) + +## Tool Binaries +KUSTOMIZE ?= $(LOCALBIN)/kustomize +CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen +ENVTEST ?= $(LOCALBIN)/setup-envtest + +## Tool Versions +KUSTOMIZE_VERSION ?= {{ .KustomizeVersion }} +CONTROLLER_TOOLS_VERSION ?= {{ .ControllerToolsVersion }} -KUSTOMIZE = $(shell pwd)/bin/kustomize +KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" .PHONY: kustomize -kustomize: ## Download kustomize locally if necessary. - $(call go-get-tool,$(KUSTOMIZE),sigs.k8s.io/kustomize/kustomize/v3@{{ .KustomizeVersion }}) +kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. +$(KUSTOMIZE): $(LOCALBIN) + test -s $(LOCALBIN)/kustomize || { curl -s $(KUSTOMIZE_INSTALL_SCRIPT) | bash -s -- $(subst v,,$(KUSTOMIZE_VERSION)) $(LOCALBIN); } + +.PHONY: controller-gen +controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. +$(CONTROLLER_GEN): $(LOCALBIN) + test -s $(LOCALBIN)/controller-gen || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION) -ENVTEST = $(shell pwd)/bin/setup-envtest .PHONY: envtest -envtest: ## Download envtest-setup locally if necessary. - $(call go-get-tool,$(ENVTEST),sigs.k8s.io/controller-runtime/tools/setup-envtest@latest) - -# go-get-tool will 'go get' any package $2 and install it to $1. -PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) -define go-get-tool -@[ -f $(1) ] || { \ -set -e ;\ -TMP_DIR=$$(mktemp -d) ;\ -cd $$TMP_DIR ;\ -go mod init tmp ;\ -echo "Downloading $(2)" ;\ -GOBIN=$(PROJECT_DIR)/bin go get $(2) ;\ -rm -rf $$TMP_DIR ;\ -} -endef +envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. +$(ENVTEST): $(LOCALBIN) + test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest ` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/readme.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/readme.go new file mode 100644 index 000000000..64d541bf1 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds/internal/templates/readme.go @@ -0,0 +1,129 @@ +/* +Copyright 2022 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 templates + +import ( + "fmt" + "strings" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &Readme{} + +// Readme scaffolds a README.md file +type Readme struct { + machinery.TemplateMixin + machinery.BoilerplateMixin + machinery.ProjectNameMixin + + License string +} + +// SetTemplateDefaults implements file.Template +func (f *Readme) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = "README.md" + } + + f.License = strings.Replace( + strings.Replace(f.Boilerplate, "/*", "", 1), + "*/", "", 1) + + f.TemplateBody = fmt.Sprintf(readmeFileTemplate, + codeFence("kubectl apply -f config/samples/"), + codeFence("make docker-build docker-push IMG=/{{ .ProjectName }}:tag"), + codeFence("make deploy IMG=/{{ .ProjectName }}:tag"), + codeFence("make uninstall"), + codeFence("make undeploy"), + codeFence("make install"), + codeFence("make run"), + codeFence("make manifests")) + + return nil +} + +//nolint:lll +const readmeFileTemplate = `# {{ .ProjectName }} +// TODO(user): Add simple overview of use/purpose + +## Description +// TODO(user): An in-depth paragraph about your project and overview of use + +## Getting Started +You’ll need a Kubernetes cluster to run against. You can use [KIND](https://sigs.k8s.io/kind) to get a local cluster for testing, or run against a remote cluster. +**Note:** Your controller will automatically use the current context in your kubeconfig file (i.e. whatever cluster ` + "`kubectl cluster-info`" + ` shows). + +### Running on the cluster +1. Install Instances of Custom Resources: + +%s + +2. Build and push your image to the location specified by ` + "`IMG`" + `: + +%s + +3. Deploy the controller to the cluster with the image specified by ` + "`IMG`" + `: + +%s + +### Uninstall CRDs +To delete the CRDs from the cluster: + +%s + +### Undeploy controller +UnDeploy the controller to the cluster: + +%s + +## Contributing +// TODO(user): Add detailed information on how you would like others to contribute to this project + +### How it works +This project aims to follow the Kubernetes [Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/) + +It uses [Controllers](https://kubernetes.io/docs/concepts/architecture/controller/) +which provides a reconcile function responsible for synchronizing resources untile the desired state is reached on the cluster + +### Test It Out +1. Install the CRDs into the cluster: + +%s + +2. Run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running): + +%s + +**NOTE:** You can also run this in one step by running: ` + "`make install run`" + ` + +### Modifying the API definitions +If you are editing the API definitions, generate the manifests such as CRs or CRDs using: + +%s + +**NOTE:** Run ` + "`make --help`" + ` for more information on all potential ` + "`make`" + ` targets + +More information can be found via the [Kubebuilder Documentation](https://book.kubebuilder.io/introduction.html) + +## License +{{ .License }} +` + +func codeFence(code string) string { + return "```sh" + "\n" + code + "\n" + "```" +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/commons.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/commons.go new file mode 100644 index 000000000..a372a94e9 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/commons.go @@ -0,0 +1,40 @@ +/* +Copyright 2022 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 v1alpha + +import ( + "errors" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" +) + +func InsertPluginMetaToConfig(target config.Config, cfg pluginConfig) error { + err := target.DecodePluginConfig(pluginKey, cfg) + if !errors.As(err, &config.UnsupportedFieldError{}) { + + if err != nil && !errors.As(err, &config.PluginKeyNotFoundError{}) { + return err + } + + if err = target.EncodePluginConfig(pluginKey, cfg); err != nil { + return err + } + + } + + return nil +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/constants.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/constants.go new file mode 100644 index 000000000..0388f3be2 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/constants.go @@ -0,0 +1,29 @@ +/* +Copyright 2022 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 v1alpha + +// nolint: lll +const MetaDataDescription = `This command will add Grafana manifests to the project: + - A JSON file includes dashboard manifest that can be directly copied to Grafana Web UI. + ('grafana/controller-runtime-metrics.json') + +NOTE: This plugin requires: +- Access to Prometheus +- Your project must be using controller-runtime to expose the metrics via the controller metrics and they need to be collected by Prometheus. +- Access to Grafana (https://grafana.com/docs/grafana/latest/setup-grafana/installation/) +Check how to enable the metrics for your project by looking at the doc: https://book.kubebuilder.io/reference/metrics.html +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/edit.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/edit.go new file mode 100644 index 000000000..2205e8df9 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/edit.go @@ -0,0 +1,55 @@ +/* +Copyright 2022 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 v1alpha + +import ( + "fmt" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds" +) + +var _ plugin.EditSubcommand = &editSubcommand{} + +type editSubcommand struct { + config config.Config +} + +func (p *editSubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) { + subcmdMeta.Description = MetaDataDescription + + subcmdMeta.Examples = fmt.Sprintf(` # Edit a common project with this plugin + %[1]s edit --plugins=grafana.kubebuilder.io/v1-alpha +`, cliMeta.CommandName) +} + +func (p *editSubcommand) InjectConfig(c config.Config) error { + p.config = c + return nil +} + +func (p *editSubcommand) Scaffold(fs machinery.Filesystem) error { + if err := InsertPluginMetaToConfig(p.config, pluginConfig{}); err != nil { + return err + } + + scaffolder := scaffolds.NewEditScaffolder() + scaffolder.InjectFS(fs) + return scaffolder.Scaffold() +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/init.go new file mode 100644 index 000000000..b824bfcb2 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/init.go @@ -0,0 +1,55 @@ +/* +Copyright 2022 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 v1alpha + +import ( + "fmt" + + "sigs.k8s.io/kubebuilder/v3/pkg/config" + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds" +) + +var _ plugin.InitSubcommand = &initSubcommand{} + +type initSubcommand struct { + config config.Config +} + +func (p *initSubcommand) UpdateMetadata(cliMeta plugin.CLIMetadata, subcmdMeta *plugin.SubcommandMetadata) { + subcmdMeta.Description = MetaDataDescription + + subcmdMeta.Examples = fmt.Sprintf(` # Initialize a common project with this plugin + %[1]s init --plugins=grafana.kubebuilder.io/v1-alpha +`, cliMeta.CommandName) +} + +func (p *initSubcommand) InjectConfig(c config.Config) error { + p.config = c + return nil +} + +func (p *initSubcommand) Scaffold(fs machinery.Filesystem) error { + if err := InsertPluginMetaToConfig(p.config, pluginConfig{}); err != nil { + return err + } + + scaffolder := scaffolds.NewInitScaffolder() + scaffolder.InjectFS(fs) + return scaffolder.Scaffold() +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/plugin.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/plugin.go new file mode 100644 index 000000000..d4f9ee4f7 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/plugin.go @@ -0,0 +1,60 @@ +/* +Copyright 2022 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 v1alpha + +import ( + "sigs.k8s.io/kubebuilder/v3/pkg/config" + cfgv3 "sigs.k8s.io/kubebuilder/v3/pkg/config/v3" + "sigs.k8s.io/kubebuilder/v3/pkg/model/stage" + "sigs.k8s.io/kubebuilder/v3/pkg/plugin" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins" +) + +const pluginName = "grafana." + plugins.DefaultNameQualifier + +var ( + pluginVersion = plugin.Version{Number: 1, Stage: stage.Alpha} + supportedProjectVersions = []config.Version{cfgv3.Version} + pluginKey = plugin.KeyFor(Plugin{}) +) + +// Plugin implements the plugin.Full interface +type Plugin struct { + initSubcommand + editSubcommand +} + +var ( + _ plugin.Init = Plugin{} +) + +// Name returns the name of the plugin +func (Plugin) Name() string { return pluginName } + +// Version returns the version of the grafana plugin +func (Plugin) Version() plugin.Version { return pluginVersion } + +// SupportedProjectVersions returns an array with all project versions supported by the plugin +func (Plugin) SupportedProjectVersions() []config.Version { return supportedProjectVersions } + +// GetInitSubcommand will return the subcommand which is responsible for initializing and scaffolding grafana manifests +func (p Plugin) GetInitSubcommand() plugin.InitSubcommand { return &p.initSubcommand } + +// GetEditSubcommand will return the subcommand which is responsible for adding grafana manifests +func (p Plugin) GetEditSubcommand() plugin.EditSubcommand { return &p.editSubcommand } + +type pluginConfig struct{} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/edit.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/edit.go new file mode 100644 index 000000000..d0fe2bee0 --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/edit.go @@ -0,0 +1,55 @@ +/* +Copyright 2022 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 scaffolds + +import ( + "fmt" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates" +) + +var _ plugins.Scaffolder = &editScaffolder{} + +type editScaffolder struct { + // fs is the filesystem that will be used by the scaffolder + fs machinery.Filesystem +} + +// NewEditScaffolder returns a new Scaffolder for project edition operations +func NewEditScaffolder() plugins.Scaffolder { + return &editScaffolder{} +} + +// InjectFS implements cmdutil.Scaffolder +func (s *editScaffolder) InjectFS(fs machinery.Filesystem) { + s.fs = fs +} + +// Scaffold implements cmdutil.Scaffolder +func (s *editScaffolder) Scaffold() error { + fmt.Println("Generating Grafana manifests to visualize controller status...") + + // Initialize the machinery.Scaffold that will write the files to disk + scaffold := machinery.NewScaffold(s.fs) + + return scaffold.Execute( + &templates.RuntimeManifest{}, + &templates.ResourcesManifest{}, + ) +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/init.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/init.go new file mode 100644 index 000000000..534806c7c --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/init.go @@ -0,0 +1,55 @@ +/* +Copyright 2022 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 scaffolds + +import ( + "fmt" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins" + "sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates" +) + +var _ plugins.Scaffolder = &initScaffolder{} + +type initScaffolder struct { + // fs is the filesystem that will be used by the scaffolder + fs machinery.Filesystem +} + +// NewInitScaffolder returns a new Scaffolder for project initialization operations +func NewInitScaffolder() plugins.Scaffolder { + return &initScaffolder{} +} + +// InjectFS implements cmdutil.Scaffolder +func (s *initScaffolder) InjectFS(fs machinery.Filesystem) { + s.fs = fs +} + +// Scaffold implements cmdutil.Scaffolder +func (s *initScaffolder) Scaffold() error { + fmt.Println("Generating Grafana manifests to visualize controller status...") + + // Initialize the machinery.Scaffold that will write the files to disk + scaffold := machinery.NewScaffold(s.fs) + + return scaffold.Execute( + &templates.RuntimeManifest{}, + &templates.ResourcesManifest{}, + ) +} diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates/resources.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates/resources.go new file mode 100644 index 000000000..c3d7f7f8d --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates/resources.go @@ -0,0 +1,352 @@ +/* +Copyright 2022 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 templates + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &ResourcesManifest{} + +// Kustomization scaffolds a file that defines the kustomization scheme for the prometheus folder +type ResourcesManifest struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *ResourcesManifest) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("grafana", "controller-resources-metrics.json") + } + + f.TemplateBody = controllerResourcesTemplate + + f.IfExistsAction = machinery.OverwriteFile + + return nil +} + +// nolint: lll +const controllerResourcesTemplate = `{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__requires": [ + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "interval": "1m", + "links": [], + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.4.3", + "targets": [ + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "rate(process_cpu_seconds_total{job=\"$job\", namespace=\"$namespace\", pod=\"$pod\"}[5m]) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Pod: {{"{{pod}}"}} | Container: {{"{{container}}"}}", + "refId": "A", + "step": 10 + } + ], + "title": "Controller CPU Usage", + "type": "timeseries" + }, + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 4, + "interval": "1m", + "links": [], + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.4.3", + "targets": [ + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "process_resident_memory_bytes{job=\"$job\", namespace=\"$namespace\", pod=\"$pod\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Pod: {{"{{pod}}"}} | Container: {{"{{container}}"}}", + "refId": "A", + "step": 10 + } + ], + "title": "Controller Memory Usage", + "type": "timeseries" + } + ], + "refresh": "", + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(controller_runtime_reconcile_total{namespace=~\"$namespace\"}, job)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "job", + "options": [], + "query": { + "query": "label_values(controller_runtime_reconcile_total{namespace=~\"$namespace\"}, job)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "observability", + "value": "observability" + }, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(controller_runtime_reconcile_total, namespace)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(controller_runtime_reconcile_total, namespace)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(controller_runtime_reconcile_total{namespace=~\"$namespace\", job=~\"$job\"}, pod)", + "hide": 2, + "includeAll": true, + "label": "pod", + "multi": true, + "name": "pod", + "options": [], + "query": { + "query": "label_values(controller_runtime_reconcile_total{namespace=~\"$namespace\", job=~\"$job\"}, pod)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Controller-Resources-Metrics", + "weekStart": "" +} +` diff --git a/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates/runtime.go b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates/runtime.go new file mode 100644 index 000000000..69afac41a --- /dev/null +++ b/vendor/sigs.k8s.io/kubebuilder/v3/pkg/plugins/optional/grafana/v1alpha/scaffolds/internal/templates/runtime.go @@ -0,0 +1,756 @@ +/* +Copyright 2022 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 templates + +import ( + "path/filepath" + + "sigs.k8s.io/kubebuilder/v3/pkg/machinery" +) + +var _ machinery.Template = &RuntimeManifest{} + +// Kustomization scaffolds a file that defines the kustomization scheme for the prometheus folder +type RuntimeManifest struct { + machinery.TemplateMixin +} + +// SetTemplateDefaults implements file.Template +func (f *RuntimeManifest) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = filepath.Join("grafana", "controller-runtime-metrics.json") + } + + f.TemplateBody = controllerRuntimeTemplate + + f.IfExistsAction = machinery.OverwriteFile + + return nil +} + +// nolint: lll +const controllerRuntimeTemplate = `{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__requires": [ + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 9, + "panels": [], + "title": "Reconciliation Metrics", + "type": "row" + }, + { + "datasource": "${DS_PROMETHEUS}", + "description": "Total number of reconciliations per controller", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "cpm" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": "${DS_PROMETHEUS}", + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(controller_runtime_reconcile_total{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, pod)", + "interval": "", + "legendFormat": "{{"{{instance}}"}} {{"{{pod}}"}}", + "range": true, + "refId": "A" + } + ], + "title": "Total Reconciliation Count Per Controller", + "type": "timeseries" + }, + { + "datasource": "${DS_PROMETHEUS}", + "description": "Total number of reconciliation errors per controller", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "cpm" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": "${DS_PROMETHEUS}", + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(controller_runtime_reconcile_errors_total{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, pod)", + "interval": "", + "legendFormat": "{{"{{instance}}"}} {{"{{pod}}"}}", + "range": true, + "refId": "A" + } + ], + "title": "Reconciliation Error Count Per Controller", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 11, + "panels": [], + "title": "Work Queue Metrics", + "type": "row" + }, + { + "datasource": "${DS_PROMETHEUS}", + "description": "How long in seconds an item stays in workqueue before being requested", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 13, + "options": { + "legend": { + "calcs": [ + "max", + "mean" + ], + "displayMode": "list", + "placement": "right" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "histogram_quantile(0.50, sum(rate(workqueue_queue_duration_seconds_bucket{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, name, le))", + "interval": "", + "legendFormat": "P50 {{"{{name}}"}} {{"{{instance}}"}} ", + "refId": "A" + }, + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "histogram_quantile(0.90, sum(rate(workqueue_queue_duration_seconds_bucket{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, name, le))", + "hide": false, + "interval": "", + "legendFormat": "P90 {{"{{name}}"}} {{"{{instance}}"}} ", + "refId": "B" + }, + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "histogram_quantile(0.99, sum(rate(workqueue_queue_duration_seconds_bucket{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, name, le))", + "hide": false, + "interval": "", + "legendFormat": "P99 {{"{{name}}"}} {{"{{instance}}"}} ", + "refId": "C" + } + ], + "title": "Seconds For Items Stay In Queue (before being requested) (P50, P90, P99)", + "type": "timeseries" + }, + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ops" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.4.3", + "targets": [ + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "sum(rate(workqueue_adds_total{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, name)", + "interval": "", + "legendFormat": "{{"{{name}}"}} {{"{{instance}}"}}", + "refId": "A" + } + ], + "title": "Work Queue Add Rate", + "type": "timeseries" + }, + { + "datasource": "${DS_PROMETHEUS}", + "description": "How long in seconds processing an item from workqueue takes.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 19, + "options": { + "legend": { + "calcs": [ + "max", + "mean" + ], + "displayMode": "table", + "placement": "right" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "histogram_quantile(0.50, sum(rate(workqueue_work_duration_seconds_bucket{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, name, le))", + "interval": "", + "legendFormat": "P50 {{"{{name}}"}} {{"{{instance}}"}} ", + "refId": "A" + }, + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "histogram_quantile(0.90, sum(rate(workqueue_work_duration_seconds_bucket{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, name, le))", + "hide": false, + "interval": "", + "legendFormat": "P90 {{"{{name}}"}} {{"{{instance}}"}} ", + "refId": "B" + }, + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "histogram_quantile(0.99, sum(rate(workqueue_work_duration_seconds_bucket{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, name, le))", + "hide": false, + "interval": "", + "legendFormat": "P99 {{"{{name}}"}} {{"{{instance}}"}} ", + "refId": "C" + } + ], + "title": "Seconds Processing Items From WorkQueue (P50, P90, P99)", + "type": "timeseries" + }, + { + "datasource": "${DS_PROMETHEUS}", + "description": "Total number of retries handled by workqueue", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ops" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": "${DS_PROMETHEUS}", + "exemplar": true, + "expr": "sum(rate(workqueue_retries_total{job=\"$job\", namespace=\"$namespace\"}[5m])) by (instance, name)", + "interval": "", + "legendFormat": "{{"{{name}}"}} {{"{{instance}}"}} ", + "refId": "A" + } + ], + "title": "Work Queue Retries Rate", + "type": "timeseries" + } + ], + "refresh": "", + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(controller_runtime_reconcile_total{namespace=~\"$namespace\"}, job)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "job", + "options": [], + "query": { + "query": "label_values(controller_runtime_reconcile_total{namespace=~\"$namespace\"}, job)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(controller_runtime_reconcile_total, namespace)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(controller_runtime_reconcile_total, namespace)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(controller_runtime_reconcile_total{namespace=~\"$namespace\", job=~\"$job\"}, pod)", + "hide": 2, + "includeAll": true, + "label": "pod", + "multi": true, + "name": "pod", + "options": [], + "query": { + "query": "label_values(controller_runtime_reconcile_total{namespace=~\"$namespace\", job=~\"$job\"}, pod)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Controller-Runtime-Metrics", + "weekStart": "" +} +` diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/filtersutil/setters.go b/vendor/sigs.k8s.io/kustomize/api/filters/filtersutil/setters.go index 1ab19e8e1..f77666785 100644 --- a/vendor/sigs.k8s.io/kustomize/api/filters/filtersutil/setters.go +++ b/vendor/sigs.k8s.io/kustomize/api/filters/filtersutil/setters.go @@ -12,13 +12,13 @@ type SetFn func(*yaml.RNode) error // SetScalar returns a SetFn to set a scalar value func SetScalar(value string) SetFn { - return func(node *yaml.RNode) error { - return node.PipeE(yaml.FieldSetter{StringValue: value}) - } + return SetEntry("", value, yaml.NodeTagEmpty) } -// SetEntry returns a SetFn to set an entry in a map -func SetEntry(key, value, tag string) SetFn { +// SetEntry returns a SetFn to set a field or a map entry to a value. +// It can be used with an empty name to set both a value and a tag on a scalar node. +// When setting only a value on a scalar node, use SetScalar instead. +func SetEntry(name, value, tag string) SetFn { n := &yaml.Node{ Kind: yaml.ScalarNode, Value: value, @@ -26,7 +26,7 @@ func SetEntry(key, value, tag string) SetFn { } return func(node *yaml.RNode) error { return node.PipeE(yaml.FieldSetter{ - Name: key, + Name: name, Value: yaml.NewRNode(n), }) } @@ -34,36 +34,72 @@ func SetEntry(key, value, tag string) SetFn { type TrackableSetter struct { // SetValueCallback will be invoked each time a field is set - setValueCallback func(key, value, tag string, node *yaml.RNode) + setValueCallback func(name, value, tag string, node *yaml.RNode) } // WithMutationTracker registers a callback which will be invoked each time a field is mutated -func (s *TrackableSetter) WithMutationTracker(callback func(key, value, tag string, node *yaml.RNode)) { +func (s *TrackableSetter) WithMutationTracker(callback func(key, value, tag string, node *yaml.RNode)) *TrackableSetter { s.setValueCallback = callback + return s } -// SetScalar returns a SetFn to set a scalar value +// SetScalar returns a SetFn to set a scalar value. // if a mutation tracker has been registered, the tracker will be invoked each // time a scalar is set func (s TrackableSetter) SetScalar(value string) SetFn { - origSetScalar := SetScalar(value) + return s.SetEntry("", value, yaml.NodeTagEmpty) +} + +// SetScalarIfEmpty returns a SetFn to set a scalar value only if it isn't already set. +// If a mutation tracker has been registered, the tracker will be invoked each +// time a scalar is actually set. +func (s TrackableSetter) SetScalarIfEmpty(value string) SetFn { + return s.SetEntryIfEmpty("", value, yaml.NodeTagEmpty) +} + +// SetEntry returns a SetFn to set a field or a map entry to a value. +// It can be used with an empty name to set both a value and a tag on a scalar node. +// When setting only a value on a scalar node, use SetScalar instead. +// If a mutation tracker has been registered, the tracker will be invoked each +// time an entry is set. +func (s TrackableSetter) SetEntry(name, value, tag string) SetFn { + origSetEntry := SetEntry(name, value, tag) return func(node *yaml.RNode) error { if s.setValueCallback != nil { - s.setValueCallback("", value, "", node) + s.setValueCallback(name, value, tag, node) } - return origSetScalar(node) + return origSetEntry(node) } } -// SetEntry returns a SetFn to set an entry in a map -// if a mutation tracker has been registered, the tracker will be invoked each -// time an entry is set -func (s TrackableSetter) SetEntry(key, value, tag string) SetFn { +// SetEntryIfEmpty returns a SetFn to set a field or a map entry to a value only if it isn't already set. +// It can be used with an empty name to set both a value and a tag on a scalar node. +// When setting only a value on a scalar node, use SetScalar instead. +// If a mutation tracker has been registered, the tracker will be invoked each +// time an entry is actually set. +func (s TrackableSetter) SetEntryIfEmpty(key, value, tag string) SetFn { origSetEntry := SetEntry(key, value, tag) return func(node *yaml.RNode) error { + if hasExistingValue(node, key) { + return nil + } if s.setValueCallback != nil { s.setValueCallback(key, value, tag, node) } return origSetEntry(node) } } + +func hasExistingValue(node *yaml.RNode, key string) bool { + if node.IsNilOrEmpty() { + return false + } + if err := yaml.ErrorIfInvalid(node, yaml.ScalarNode); err == nil { + return yaml.GetValue(node) != "" + } + entry := node.Field(key) + if entry.IsNilOrEmpty() { + return false + } + return yaml.GetValue(entry.Value) != "" +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go b/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go index 121b243ec..7549ab700 100644 --- a/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go +++ b/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go @@ -118,7 +118,9 @@ func (f Filter) setMapping(node *yaml.RNode) error { return err } oldName := nameNode.YNode().Value - referral, err := f.selectReferral(oldName, candidates) + // use allNamesAndNamespacesAreTheSame to compare referral candidates for functional identity, + // because we source both name and namespace values from the referral in this case. + referral, err := f.selectReferral(oldName, candidates, allNamesAndNamespacesAreTheSame) if err != nil || referral == nil { // Nil referral means nothing to do. return err @@ -167,8 +169,10 @@ func (f Filter) filterMapCandidatesByNamespace( } func (f Filter) setScalar(node *yaml.RNode) error { + // use allNamesAreTheSame to compare referral candidates for functional identity, + // because we only source the name from the referral in this case. referral, err := f.selectReferral( - node.YNode().Value, f.ReferralCandidates.Resources()) + node.YNode().Value, f.ReferralCandidates.Resources(), allNamesAreTheSame) if err != nil || referral == nil { // Nil referral means nothing to do. return err @@ -311,7 +315,9 @@ func (f Filter) sameCurrentNamespaceAsReferrer() sieveFunc { func (f Filter) selectReferral( // The name referral that may need to be updated. oldName string, - candidates []*resource.Resource) (*resource.Resource, error) { + candidates []*resource.Resource, + // function that returns whether two referrals are identical for the purposes of the transformation + candidatesIdentical func(resources []*resource.Resource) bool) (*resource.Resource, error) { candidates = doSieve(candidates, previousNameMatches(oldName)) candidates = doSieve(candidates, previousIdSelectedByGvk(&f.ReferralTarget)) candidates = doSieve(candidates, f.roleRefFilter()) @@ -326,24 +332,21 @@ func (f Filter) selectReferral( if len(candidates) == 0 { return nil, nil } - if allNamesAreTheSame(candidates) { + if candidatesIdentical(candidates) { // Just take the first one. return candidates[0], nil } ids := getIds(candidates) - f.failureDetails(candidates) - return nil, fmt.Errorf(" found multiple possible referrals: %s", ids) + return nil, fmt.Errorf("found multiple possible referrals: %s\n%s", ids, f.failureDetails(candidates)) } -func (f Filter) failureDetails(resources []*resource.Resource) { - fmt.Printf( - "\n**** Too many possible referral targets to referrer:\n%s\n", - f.Referrer.MustYaml()) +func (f Filter) failureDetails(resources []*resource.Resource) string { + msg := strings.Builder{} + msg.WriteString(fmt.Sprintf("\n**** Too many possible referral targets to referrer:\n%s\n", f.Referrer.MustYaml())) for i, r := range resources { - fmt.Printf( - "--- possible referral %d:\n%s", i, r.MustYaml()) - fmt.Println("------") + msg.WriteString(fmt.Sprintf("--- possible referral %d:\n%s\n", i, r.MustYaml())) } + return msg.String() } func allNamesAreTheSame(resources []*resource.Resource) bool { @@ -356,6 +359,17 @@ func allNamesAreTheSame(resources []*resource.Resource) bool { return true } +func allNamesAndNamespacesAreTheSame(resources []*resource.Resource) bool { + name := resources[0].GetName() + namespace := resources[0].GetNamespace() + for i := 1; i < len(resources); i++ { + if name != resources[i].GetName() || namespace != resources[i].GetNamespace() { + return false + } + } + return true +} + func getIds(rs []*resource.Resource) string { var result []string for _, r := range rs { diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go b/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go index 8d0f54ea2..5173a9554 100644 --- a/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go +++ b/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go @@ -7,6 +7,7 @@ import ( "sigs.k8s.io/kustomize/api/filters/filtersutil" "sigs.k8s.io/kustomize/api/filters/fsslice" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/resid" "sigs.k8s.io/kustomize/kyaml/yaml" @@ -19,9 +20,28 @@ type Filter struct { // FsSlice contains the FieldSpecs to locate the namespace field FsSlice types.FsSlice `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` + // UnsetOnly means only blank namespace fields will be set + UnsetOnly bool `json:"unsetOnly" yaml:"unsetOnly"` + + // SetRoleBindingSubjects determines which subject fields in RoleBinding and ClusterRoleBinding + // objects will have their namespace fields set. Overrides field specs provided for these types, if any. + // - defaultOnly (default): namespace will be set only on subjects named "default". + // - allServiceAccounts: namespace will be set on all subjects with "kind: ServiceAccount" + // - none: all subjects will be skipped. + SetRoleBindingSubjects RoleBindingSubjectMode `json:"setRoleBindingSubjects" yaml:"setRoleBindingSubjects"` + trackableSetter filtersutil.TrackableSetter } +type RoleBindingSubjectMode string + +const ( + DefaultSubjectsOnly RoleBindingSubjectMode = "defaultOnly" + SubjectModeUnspecified RoleBindingSubjectMode = "" + AllServiceAccountSubjects RoleBindingSubjectMode = "allServiceAccounts" + NoSubjects RoleBindingSubjectMode = "none" +) + var _ kio.Filter = Filter{} var _ kio.TrackableFilter = &Filter{} @@ -36,47 +56,34 @@ func (ns Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { // Run runs the filter on a single node rather than a slice func (ns Filter) run(node *yaml.RNode) (*yaml.RNode, error) { - // hacks for hardcoded types -- :( - if err := ns.hacks(node); err != nil { + // Special handling for metadata.namespace -- :( + // never let SetEntry handle metadata.namespace--it will incorrectly include cluster-scoped resources + ns.FsSlice = ns.removeMetaNamespaceFieldSpecs(ns.FsSlice) + gvk := resid.GvkFromNode(node) + if err := ns.metaNamespaceHack(node, gvk); err != nil { return nil, err } - // Remove the fieldspecs that are for hardcoded fields. The fieldspecs - // exist for backwards compatibility with other implementations - // of this transformation. - // This implementation of the namespace transformation - // Does not use the fieldspecs for implementing cases which - // require hardcoded logic. - ns.FsSlice = ns.removeFieldSpecsForHacks(ns.FsSlice) + // Special handling for (cluster) role binding subjects -- :( + if isRoleBinding(gvk.Kind) { + ns.FsSlice = ns.removeRoleBindingSubjectFieldSpecs(ns.FsSlice) + if err := ns.roleBindingHack(node); err != nil { + return nil, err + } + } // transformations based on data -- :) err := node.PipeE(fsslice.Filter{ FsSlice: ns.FsSlice, - SetValue: ns.trackableSetter.SetEntry("", ns.Namespace, yaml.NodeTagString), + SetValue: ns.fieldSetter(), CreateKind: yaml.ScalarNode, // Namespace is a ScalarNode CreateTag: yaml.NodeTagString, }) return node, err } -// hacks applies the namespace transforms that are hardcoded rather -// than specified through FieldSpecs. -func (ns Filter) hacks(obj *yaml.RNode) error { - gvk := resid.GvkFromNode(obj) - if err := ns.metaNamespaceHack(obj, gvk); err != nil { - return err - } - return ns.roleBindingHack(obj, gvk) -} - // metaNamespaceHack is a hack for implementing the namespace transform // for the metadata.namespace field on namespace scoped resources. -// namespace scoped resources are determined by NOT being present -// in a hard-coded list of cluster-scoped resource types (by apiVersion and kind). -// -// This hack should be updated to allow individual resources to specify -// if they are cluster scoped through either an annotation on the resources, -// or through inlined OpenAPI on the resource as a YAML comment. func (ns Filter) metaNamespaceHack(obj *yaml.RNode, gvk resid.Gvk) error { if gvk.IsClusterScoped() { return nil @@ -85,19 +92,23 @@ func (ns Filter) metaNamespaceHack(obj *yaml.RNode, gvk resid.Gvk) error { FsSlice: []types.FieldSpec{ {Path: types.MetadataNamespacePath, CreateIfNotPresent: true}, }, - SetValue: ns.trackableSetter.SetEntry("", ns.Namespace, yaml.NodeTagString), + SetValue: ns.fieldSetter(), CreateKind: yaml.ScalarNode, // Namespace is a ScalarNode } _, err := f.Filter(obj) return err } -// roleBindingHack is a hack for implementing the namespace transform +// roleBindingHack is a hack for implementing the transformer's SetRoleBindingSubjects option // for RoleBinding and ClusterRoleBinding resource types. -// RoleBinding and ClusterRoleBinding have namespace set on +// +// In NoSubjects mode, it does nothing. +// +// In AllServiceAccountSubjects mode, it sets the namespace on subjects with "kind: ServiceAccount". +// +// In DefaultSubjectsOnly mode (default mode), RoleBinding and ClusterRoleBinding have namespace set on // elements of the "subjects" field if and only if the subject elements // "name" is "default". Otherwise the namespace is not set. -// // Example: // // kind: RoleBinding @@ -106,59 +117,76 @@ func (ns Filter) metaNamespaceHack(obj *yaml.RNode, gvk resid.Gvk) error { // ... // - name: "something-else" # this will not have the namespace set // ... -func (ns Filter) roleBindingHack(obj *yaml.RNode, gvk resid.Gvk) error { - if gvk.Kind != roleBindingKind && gvk.Kind != clusterRoleBindingKind { +func (ns Filter) roleBindingHack(obj *yaml.RNode) error { + var visitor filtersutil.SetFn + switch ns.SetRoleBindingSubjects { + case NoSubjects: return nil + case DefaultSubjectsOnly, SubjectModeUnspecified: + visitor = ns.setSubjectsNamedDefault + case AllServiceAccountSubjects: + visitor = ns.setServiceAccountNamespaces + default: + return errors.Errorf("invalid value %q for setRoleBindingSubjects: "+ + "must be one of %q, %q or %q", ns.SetRoleBindingSubjects, + DefaultSubjectsOnly, NoSubjects, AllServiceAccountSubjects) } - // Lookup the namespace field on all elements. - // We should change the fieldspec so this isn't necessary. + // Lookup the subjects field on all elements. obj, err := obj.Pipe(yaml.Lookup(subjectsField)) if err != nil || yaml.IsMissingOrNull(obj) { return err } + // Use the appropriate visitor to set the namespace field on the correct subset of subjects + return errors.WrapPrefixf(obj.VisitElements(visitor), "setting namespace on (cluster)role binding subjects") +} - // add the namespace to each "subject" with name: default - err = obj.VisitElements(func(o *yaml.RNode) error { - // The only case we need to force the namespace - // if for the "service account". "default" is - // kind of hardcoded here for right now. - name, err := o.Pipe( - yaml.Lookup("name"), yaml.Match("default"), - ) - if err != nil || yaml.IsMissingOrNull(name) { - return err - } +func isRoleBinding(kind string) bool { + return kind == roleBindingKind || kind == clusterRoleBindingKind +} - // set the namespace for the default account - node, err := o.Pipe( - yaml.LookupCreate(yaml.ScalarNode, "namespace"), - ) - if err != nil { - return err - } +func (ns Filter) setServiceAccountNamespaces(o *yaml.RNode) error { + name, err := o.Pipe(yaml.Lookup("kind"), yaml.Match("ServiceAccount")) + if err != nil || yaml.IsMissingOrNull(name) { + return errors.WrapPrefixf(err, "looking up kind on (cluster)role binding subject") + } + return setNamespaceField(o, ns.fieldSetter()) +} - return ns.trackableSetter.SetEntry("", ns.Namespace, yaml.NodeTagString)(node) - }) +func (ns Filter) setSubjectsNamedDefault(o *yaml.RNode) error { + name, err := o.Pipe(yaml.Lookup("name"), yaml.Match("default")) + if err != nil || yaml.IsMissingOrNull(name) { + return errors.WrapPrefixf(err, "looking up name on (cluster)role binding subject") + } + return setNamespaceField(o, ns.fieldSetter()) +} - return err +func setNamespaceField(node *yaml.RNode, setter filtersutil.SetFn) error { + node, err := node.Pipe(yaml.LookupCreate(yaml.ScalarNode, "namespace")) + if err != nil { + return errors.WrapPrefixf(err, "setting namespace field on (cluster)role binding subject") + } + return setter(node) } -// removeFieldSpecsForHacks removes from the list fieldspecs that +// removeRoleBindingSubjectFieldSpecs removes from the list fieldspecs that // have hardcoded implementations -func (ns Filter) removeFieldSpecsForHacks(fs types.FsSlice) types.FsSlice { +func (ns Filter) removeRoleBindingSubjectFieldSpecs(fs types.FsSlice) types.FsSlice { var val types.FsSlice for i := range fs { - // implemented by metaNamespaceHack - if fs[i].Path == types.MetadataNamespacePath { + if isRoleBinding(fs[i].Kind) && + (fs[i].Path == subjectsNamespacePath || fs[i].Path == subjectsField) { continue } - // implemented by roleBindingHack - if fs[i].Kind == roleBindingKind && fs[i].Path == subjectsField { - continue - } - // implemented by roleBindingHack - if fs[i].Kind == clusterRoleBindingKind && fs[i].Path == subjectsField { + val = append(val, fs[i]) + } + return val +} + +func (ns Filter) removeMetaNamespaceFieldSpecs(fs types.FsSlice) types.FsSlice { + var val types.FsSlice + for i := range fs { + if fs[i].Path == types.MetadataNamespacePath { continue } val = append(val, fs[i]) @@ -166,8 +194,16 @@ func (ns Filter) removeFieldSpecsForHacks(fs types.FsSlice) types.FsSlice { return val } +func (ns *Filter) fieldSetter() filtersutil.SetFn { + if ns.UnsetOnly { + return ns.trackableSetter.SetEntryIfEmpty("", ns.Namespace, yaml.NodeTagString) + } + return ns.trackableSetter.SetEntry("", ns.Namespace, yaml.NodeTagString) +} + const ( subjectsField = "subjects" + subjectsNamespacePath = "subjects/namespace" roleBindingKind = "RoleBinding" clusterRoleBindingKind = "ClusterRoleBinding" ) diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/replacement/replacement.go b/vendor/sigs.k8s.io/kustomize/api/filters/replacement/replacement.go index 5f4667a9c..a9330fa14 100644 --- a/vendor/sigs.k8s.io/kustomize/api/filters/replacement/replacement.go +++ b/vendor/sigs.k8s.io/kustomize/api/filters/replacement/replacement.go @@ -38,22 +38,86 @@ func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { return nodes, nil } -func applyReplacement(nodes []*yaml.RNode, value *yaml.RNode, targets []*types.TargetSelector) ([]*yaml.RNode, error) { - for _, t := range targets { - if t.Select == nil { - return nil, fmt.Errorf("target must specify resources to select") +func getReplacement(nodes []*yaml.RNode, r *types.Replacement) (*yaml.RNode, error) { + source, err := selectSourceNode(nodes, r.Source) + if err != nil { + return nil, err + } + + if r.Source.FieldPath == "" { + r.Source.FieldPath = types.DefaultReplacementFieldPath + } + fieldPath := kyaml_utils.SmarterPathSplitter(r.Source.FieldPath, ".") + + rn, err := source.Pipe(yaml.Lookup(fieldPath...)) + if err != nil { + return nil, fmt.Errorf("error looking up replacement source: %w", err) + } + if rn.IsNilOrEmpty() { + return nil, fmt.Errorf("fieldPath `%s` is missing for replacement source %s", r.Source.FieldPath, r.Source.ResId) + } + + return getRefinedValue(r.Source.Options, rn) +} + +// selectSourceNode finds the node that matches the selector, returning +// an error if multiple or none are found +func selectSourceNode(nodes []*yaml.RNode, selector *types.SourceSelector) (*yaml.RNode, error) { + var matches []*yaml.RNode + for _, n := range nodes { + ids, err := utils.MakeResIds(n) + if err != nil { + return nil, fmt.Errorf("error getting node IDs: %w", err) } - if len(t.FieldPaths) == 0 { - t.FieldPaths = []string{types.DefaultReplacementFieldPath} + for _, id := range ids { + if id.IsSelectedBy(selector.ResId) { + if len(matches) > 0 { + return nil, fmt.Errorf( + "multiple matches for selector %s", selector) + } + matches = append(matches, n) + break + } } - for _, n := range nodes { - ids, err := utils.MakeResIds(n) + } + if len(matches) == 0 { + return nil, fmt.Errorf("nothing selected by %s", selector) + } + return matches[0], nil +} + +func getRefinedValue(options *types.FieldOptions, rn *yaml.RNode) (*yaml.RNode, error) { + if options == nil || options.Delimiter == "" { + return rn, nil + } + if rn.YNode().Kind != yaml.ScalarNode { + return nil, fmt.Errorf("delimiter option can only be used with scalar nodes") + } + value := strings.Split(yaml.GetValue(rn), options.Delimiter) + if options.Index >= len(value) || options.Index < 0 { + return nil, fmt.Errorf("options.index %d is out of bounds for value %s", options.Index, yaml.GetValue(rn)) + } + n := rn.Copy() + n.YNode().Value = value[options.Index] + return n, nil +} + +func applyReplacement(nodes []*yaml.RNode, value *yaml.RNode, targetSelectors []*types.TargetSelector) ([]*yaml.RNode, error) { + for _, selector := range targetSelectors { + if selector.Select == nil { + return nil, errors.New("target must specify resources to select") + } + if len(selector.FieldPaths) == 0 { + selector.FieldPaths = []string{types.DefaultReplacementFieldPath} + } + for _, possibleTarget := range nodes { + ids, err := utils.MakeResIds(possibleTarget) if err != nil { return nil, err } // filter targets by label and annotation selectors - selectByAnnoAndLabel, err := selectByAnnoAndLabel(n, t) + selectByAnnoAndLabel, err := selectByAnnoAndLabel(possibleTarget, selector) if err != nil { return nil, err } @@ -63,8 +127,8 @@ func applyReplacement(nodes []*yaml.RNode, value *yaml.RNode, targets []*types.T // filter targets by matching resource IDs for i, id := range ids { - if id.IsSelectedBy(t.Select.ResId) && !rejectId(t.Reject, &ids[i]) { - err := applyToNode(n, value, t) + if id.IsSelectedBy(selector.Select.ResId) && !rejectId(selector.Reject, &ids[i]) { + err := copyValueToTarget(possibleTarget, value, selector) if err != nil { return nil, err } @@ -113,61 +177,50 @@ func rejectId(rejects []*types.Selector, id *resid.ResId) bool { return false } -func applyToNode(node *yaml.RNode, value *yaml.RNode, target *types.TargetSelector) error { - for _, fp := range target.FieldPaths { +func copyValueToTarget(target *yaml.RNode, value *yaml.RNode, selector *types.TargetSelector) error { + for _, fp := range selector.FieldPaths { fieldPath := kyaml_utils.SmarterPathSplitter(fp, ".") - var t *yaml.RNode - var err error - if target.Options != nil && target.Options.Create { - // create option is not supported in a wildcard matching. - // Because, PathMatcher is not supported create option. - // So, if create option is set, we fallback to PathGetter. - for _, f := range fieldPath { - if f == "*" { - return errors.New("cannot support create option in a multi-value target") //nolint:goerr113 - } - } - t, err = node.Pipe(yaml.LookupCreate(value.YNode().Kind, fieldPath...)) - } else { - t, err = node.Pipe(&yaml.PathMatcher{Path: fieldPath}) - } + create, err := shouldCreateField(selector.Options, fieldPath) if err != nil { return err } - if t != nil { - if err = applyToOneNode(target.Options, t, value); err != nil { - return err + + var targetFields []*yaml.RNode + if create { + createdField, createErr := target.Pipe(yaml.LookupCreate(value.YNode().Kind, fieldPath...)) + if createErr != nil { + return fmt.Errorf("error creating replacement node: %w", createErr) + } + targetFields = append(targetFields, createdField) + } else { + // may return multiple fields, always wrapped in a sequence node + foundFieldSequence, lookupErr := target.Pipe(&yaml.PathMatcher{Path: fieldPath}) + if lookupErr != nil { + return fmt.Errorf("error finding field in replacement target: %w", lookupErr) + } + targetFields, err = foundFieldSequence.Elements() + if err != nil { + return fmt.Errorf("error fetching elements in replacement target: %w", err) } } - } - return nil -} -func applyToOneNode(options *types.FieldOptions, t *yaml.RNode, value *yaml.RNode) error { - if len(t.YNode().Content) == 0 { - if err := setTargetValue(options, t, value); err != nil { - return err + for _, t := range targetFields { + if err := setFieldValue(selector.Options, t, value); err != nil { + return err + } } - return nil - } - for _, scalarNode := range t.YNode().Content { - rn := yaml.NewRNode(scalarNode) - if err := setTargetValue(options, rn, value); err != nil { - return err - } } - return nil } -func setTargetValue(options *types.FieldOptions, t *yaml.RNode, value *yaml.RNode) error { +func setFieldValue(options *types.FieldOptions, targetField *yaml.RNode, value *yaml.RNode) error { value = value.Copy() if options != nil && options.Delimiter != "" { - if t.YNode().Kind != yaml.ScalarNode { + if targetField.YNode().Kind != yaml.ScalarNode { return fmt.Errorf("delimiter option can only be used with scalar nodes") } - tv := strings.Split(t.YNode().Value, options.Delimiter) + tv := strings.Split(targetField.YNode().Value, options.Delimiter) v := yaml.GetValue(value) // TODO: Add a way to remove an element switch { @@ -181,76 +234,25 @@ func setTargetValue(options *types.FieldOptions, t *yaml.RNode, value *yaml.RNod value.YNode().Value = strings.Join(tv, options.Delimiter) } - if t.YNode().Kind == yaml.ScalarNode { + if targetField.YNode().Kind == yaml.ScalarNode { // For scalar, only copy the value (leave any type intact to auto-convert int->string or string->int) - t.YNode().Value = value.YNode().Value + targetField.YNode().Value = value.YNode().Value } else { - t.SetYNode(value.YNode()) + targetField.SetYNode(value.YNode()) } return nil } -func getReplacement(nodes []*yaml.RNode, r *types.Replacement) (*yaml.RNode, error) { - source, err := selectSourceNode(nodes, r.Source) - if err != nil { - return nil, err - } - - if r.Source.FieldPath == "" { - r.Source.FieldPath = types.DefaultReplacementFieldPath - } - fieldPath := kyaml_utils.SmarterPathSplitter(r.Source.FieldPath, ".") - - rn, err := source.Pipe(yaml.Lookup(fieldPath...)) - if err != nil { - return nil, err - } - if rn.IsNilOrEmpty() { - return nil, fmt.Errorf("fieldPath `%s` is missing for replacement source %s", r.Source.FieldPath, r.Source.ResId) - } - - return getRefinedValue(r.Source.Options, rn) -} - -func getRefinedValue(options *types.FieldOptions, rn *yaml.RNode) (*yaml.RNode, error) { - if options == nil || options.Delimiter == "" { - return rn, nil +func shouldCreateField(options *types.FieldOptions, fieldPath []string) (bool, error) { + if options == nil || !options.Create { + return false, nil } - if rn.YNode().Kind != yaml.ScalarNode { - return nil, fmt.Errorf("delimiter option can only be used with scalar nodes") - } - value := strings.Split(yaml.GetValue(rn), options.Delimiter) - if options.Index >= len(value) || options.Index < 0 { - return nil, fmt.Errorf("options.index %d is out of bounds for value %s", options.Index, yaml.GetValue(rn)) - } - n := rn.Copy() - n.YNode().Value = value[options.Index] - return n, nil -} - -// selectSourceNode finds the node that matches the selector, returning -// an error if multiple or none are found -func selectSourceNode(nodes []*yaml.RNode, selector *types.SourceSelector) (*yaml.RNode, error) { - var matches []*yaml.RNode - for _, n := range nodes { - ids, err := utils.MakeResIds(n) - if err != nil { - return nil, err + // create option is not supported in a wildcard matching + for _, f := range fieldPath { + if f == "*" { + return false, fmt.Errorf("cannot support create option in a multi-value target") } - for _, id := range ids { - if id.IsSelectedBy(selector.ResId) { - if len(matches) > 0 { - return nil, fmt.Errorf( - "multiple matches for selector %s", selector) - } - matches = append(matches, n) - break - } - } - } - if len(matches) == 0 { - return nil, fmt.Errorf("nothing selected by %s", selector) } - return matches[0], nil + return true, nil } diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/builtins/NamespaceTransformer.go b/vendor/sigs.k8s.io/kustomize/api/internal/builtins/NamespaceTransformer.go index 39a514e8e..71b162a79 100644 --- a/vendor/sigs.k8s.io/kustomize/api/internal/builtins/NamespaceTransformer.go +++ b/vendor/sigs.k8s.io/kustomize/api/internal/builtins/NamespaceTransformer.go @@ -9,20 +9,37 @@ import ( "sigs.k8s.io/kustomize/api/filters/namespace" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/yaml" ) // Change or set the namespace of non-cluster level resources. type NamespaceTransformerPlugin struct { - types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` + types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` + UnsetOnly bool `json:"unsetOnly" yaml:"unsetOnly"` + SetRoleBindingSubjects namespace.RoleBindingSubjectMode `json:"setRoleBindingSubjects" yaml:"setRoleBindingSubjects"` } func (p *NamespaceTransformerPlugin) Config( _ *resmap.PluginHelpers, c []byte) (err error) { p.Namespace = "" p.FieldSpecs = nil - return yaml.Unmarshal(c, p) + if err := yaml.Unmarshal(c, p); err != nil { + return errors.WrapPrefixf(err, "unmarshalling NamespaceTransformer config") + } + switch p.SetRoleBindingSubjects { + case namespace.AllServiceAccountSubjects, namespace.DefaultSubjectsOnly, namespace.NoSubjects: + // valid + case namespace.SubjectModeUnspecified: + p.SetRoleBindingSubjects = namespace.DefaultSubjectsOnly + default: + return errors.Errorf("invalid value %q for setRoleBindingSubjects: "+ + "must be one of %q, %q or %q", p.SetRoleBindingSubjects, + namespace.DefaultSubjectsOnly, namespace.NoSubjects, namespace.AllServiceAccountSubjects) + } + + return nil } func (p *NamespaceTransformerPlugin) Transform(m resmap.ResMap) error { @@ -36,8 +53,10 @@ func (p *NamespaceTransformerPlugin) Transform(m resmap.ResMap) error { } r.StorePreviousId() if err := r.ApplyFilter(namespace.Filter{ - Namespace: p.Namespace, - FsSlice: p.FieldSpecs, + Namespace: p.Namespace, + FsSlice: p.FieldSpecs, + SetRoleBindingSubjects: p.SetRoleBindingSubjects, + UnsetOnly: p.UnsetOnly, }); err != nil { return err } diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go b/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go index c3d4ecc6f..4bbf7e98a 100644 --- a/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go +++ b/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go @@ -407,7 +407,7 @@ func (kt *KustTarget) accumulateResources( // try loading resource as file then as base (directory or git repository) if errF := kt.accumulateFile(ra, path); errF != nil { // not much we can do if the error is an HTTP error so we bail out - if errors.Is(errF, load.ErrorHTTP) { + if errors.Is(errF, load.ErrHTTP) { return nil, errF } ldr, err := kt.ldr.New(path) diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go index a35ef9c6f..35774a7db 100644 --- a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go @@ -6,15 +6,9 @@ package builtinpluginconsts const ( namespaceFieldSpecs = ` namespace: -- path: metadata/namespace - create: true - path: metadata/name kind: Namespace create: true -- path: subjects - kind: RoleBinding -- path: subjects - kind: ClusterRoleBinding - path: spec/service/namespace group: apiregistration.k8s.io kind: APIService diff --git a/vendor/sigs.k8s.io/kustomize/api/kv/kv.go b/vendor/sigs.k8s.io/kustomize/api/kv/kv.go index 719b761c9..303aede86 100644 --- a/vendor/sigs.k8s.io/kustomize/api/kv/kv.go +++ b/vendor/sigs.k8s.io/kustomize/api/kv/kv.go @@ -133,7 +133,6 @@ func (kvl *loader) keyValuesFromLines(content []byte) ([]types.Pair, error) { } // KeyValuesFromLine returns a kv with blank key if the line is empty or a comment. -// The value will be retrieved from the environment if necessary. func (kvl *loader) keyValuesFromLine(line []byte, currentLine int) (types.Pair, error) { kv := types.Pair{} @@ -164,7 +163,12 @@ func (kvl *loader) keyValuesFromLine(line []byte, currentLine int) (types.Pair, kv.Value = data[1] } else { // No value (no `=` in the line) is a signal to obtain the value - // from the environment. + // from the environment. This behaviour was accidentally imported from kubectl code, and + // will be removed in the next major release of Kustomize. + _, _ = fmt.Fprintln(os.Stderr, "WARNING: "+ + "This Kustomization is relying on a bug that loads values from the environment "+ + "when they are omitted from an env file. "+ + "This behaviour will be removed in the next major release of Kustomize.") kv.Value = os.Getenv(key) } kv.Key = key diff --git a/vendor/sigs.k8s.io/kustomize/api/loader/errors.go b/vendor/sigs.k8s.io/kustomize/api/loader/errors.go index 1942091e4..2463debdb 100644 --- a/vendor/sigs.k8s.io/kustomize/api/loader/errors.go +++ b/vendor/sigs.k8s.io/kustomize/api/loader/errors.go @@ -3,6 +3,9 @@ package loader -import "fmt" +import "sigs.k8s.io/kustomize/kyaml/errors" -var ErrorHTTP = fmt.Errorf("HTTP Error") +var ( + ErrHTTP = errors.Errorf("HTTP Error") + ErrRtNotDir = errors.Errorf("must build at directory") +) diff --git a/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go b/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go index 793b82c82..3201e8509 100644 --- a/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go +++ b/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go @@ -4,7 +4,6 @@ package loader import ( - "errors" "fmt" "io/ioutil" "log" @@ -15,6 +14,7 @@ import ( "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/internal/git" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -123,7 +123,7 @@ func (fl *fileLoader) Root() string { func newLoaderOrDie( lr LoadRestrictorFunc, fSys filesys.FileSystem, path string) *fileLoader { - root, err := demandDirectoryRoot(fSys, path) + root, err := filesys.ConfirmDir(fSys, path) if err != nil { log.Fatalf("unable to make loader at '%s'; %v", path, err) } @@ -146,30 +146,11 @@ func newLoaderAtConfirmedDir( } } -// Assure that the given path is in fact a directory. -func demandDirectoryRoot( - fSys filesys.FileSystem, path string) (filesys.ConfirmedDir, error) { - if path == "" { - return "", fmt.Errorf( - "loader root cannot be empty") - } - d, f, err := fSys.CleanedAbs(path) - if err != nil { - return "", err - } - if f != "" { - return "", fmt.Errorf( - "'%s' must be a directory so that it can used as a build root", - path) - } - return d, nil -} - // New returns a new Loader, rooted relative to current loader, // or rooted in a temp directory holding a git repo clone. func (fl *fileLoader) New(path string) (ifc.Loader, error) { if path == "" { - return nil, fmt.Errorf("new root cannot be empty") + return nil, errors.Errorf("new root cannot be empty") } repoSpec, err := git.NewRepoSpecFromURL(path) @@ -185,9 +166,9 @@ func (fl *fileLoader) New(path string) (ifc.Loader, error) { if filepath.IsAbs(path) { return nil, fmt.Errorf("new root '%s' cannot be absolute", path) } - root, err := demandDirectoryRoot(fl.fSys, fl.root.Join(path)) + root, err := filesys.ConfirmDir(fl.fSys, fl.root.Join(path)) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, ErrRtNotDir.Error()) } if err = fl.errIfGitContainmentViolation(root); err != nil { return nil, err @@ -317,9 +298,9 @@ func (fl *fileLoader) Load(path string) ([]byte, error) { if resp.StatusCode < 200 || resp.StatusCode > 299 { _, err := git.NewRepoSpecFromURL(path) if err == nil { - return nil, errors.New("URL is a git repository") + return nil, errors.Errorf("URL is a git repository") } - return nil, fmt.Errorf("%w: status code %d (%s)", ErrorHTTP, resp.StatusCode, http.StatusText(resp.StatusCode)) + return nil, fmt.Errorf("%w: status code %d (%s)", ErrHTTP, resp.StatusCode, http.StatusText(resp.StatusCode)) } body, err := ioutil.ReadAll(resp.Body) if err != nil { diff --git a/vendor/sigs.k8s.io/kustomize/api/loader/loader.go b/vendor/sigs.k8s.io/kustomize/api/loader/loader.go index 17dbad897..e10885b9b 100644 --- a/vendor/sigs.k8s.io/kustomize/api/loader/loader.go +++ b/vendor/sigs.k8s.io/kustomize/api/loader/loader.go @@ -7,6 +7,7 @@ package loader import ( "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/internal/git" + "sigs.k8s.io/kustomize/kyaml/errors" "sigs.k8s.io/kustomize/kyaml/filesys" ) @@ -25,9 +26,9 @@ func NewLoader( return newLoaderAtGitClone( repoSpec, fSys, nil, git.ClonerUsingGitExec) } - root, err := demandDirectoryRoot(fSys, target) + root, err := filesys.ConfirmDir(fSys, target) if err != nil { - return nil, err + return nil, errors.WrapPrefixf(err, ErrRtNotDir.Error()) } return newLoaderAtConfirmedDir( lr, root, fSys, nil, git.ClonerUsingGitExec), nil diff --git a/vendor/sigs.k8s.io/kustomize/api/resource/resource.go b/vendor/sigs.k8s.io/kustomize/api/resource/resource.go index 9997e408b..a88ce31d2 100644 --- a/vendor/sigs.k8s.io/kustomize/api/resource/resource.go +++ b/vendor/sigs.k8s.io/kustomize/api/resource/resource.go @@ -255,13 +255,9 @@ func (r *Resource) appendCsvAnnotation(name, value string) { if value == "" { return } - annotations := r.GetAnnotations() - if existing, ok := annotations[name]; ok { - annotations[name] = existing + "," + value - } else { - annotations[name] = value - } - if err := r.SetAnnotations(annotations); err != nil { + currentValue := r.getCsvAnnotation(name) + newValue := strings.Join(append(currentValue, value), ",") + if err := r.RNode.PipeE(kyaml.SetAnnotation(name, newValue)); err != nil { panic(err) } } diff --git a/vendor/sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api/docs.go b/vendor/sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api/docs.go index df884a9f3..70de9fb4b 100644 --- a/vendor/sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api/docs.go +++ b/vendor/sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api/docs.go @@ -96,7 +96,7 @@ The script wraps itself using ` + "`" + `config run wrap -- $0` + "`" + ` which config run wrap -- $0 exit $? fi - + cat <