From 7ed2f1d94d694c6c4fdb4629638c38b1cbda7288 Mon Sep 17 00:00:00 2001 From: Fangyuan Li Date: Sun, 15 Nov 2020 23:59:58 -0800 Subject: [PATCH 1/3] Implements Service Internal Traffic Policy 1. Add API definitions; 2. Add feature gate and drops the field when feature gate is not on; 3. Set default values for the field; 4. Add API Validation 5. add kube-proxy iptables and ipvs implementations 6. add tests --- api/openapi-spec/swagger.json | 2803 ++++++++++++++++- pkg/api/v1/service/util.go | 11 +- pkg/api/v1/service/util_test.go | 29 +- pkg/apis/core/types.go | 25 +- pkg/apis/core/v1/defaults.go | 5 + pkg/apis/core/v1/defaults_test.go | 64 + pkg/apis/core/v1/zz_generated.conversion.go | 2 + pkg/apis/core/validation/validation.go | 24 + pkg/apis/core/validation/validation_test.go | 27 +- pkg/apis/core/zz_generated.deepcopy.go | 5 + pkg/features/kube_features.go | 7 + pkg/proxy/iptables/proxier.go | 7 + pkg/proxy/iptables/proxier_test.go | 219 ++ pkg/proxy/ipvs/proxier.go | 19 +- pkg/proxy/ipvs/proxier_test.go | 183 ++ pkg/proxy/service.go | 60 +- pkg/proxy/topology.go | 42 +- pkg/proxy/topology_test.go | 97 + pkg/proxy/types.go | 4 + pkg/registry/core/service/strategy.go | 16 +- pkg/registry/core/service/strategy_test.go | 50 +- staging/src/k8s.io/api/core/v1/types.go | 25 +- .../core/v1/types_swagger_doc_generated.go | 1 + .../api/core/v1/zz_generated.deepcopy.go | 5 + .../api/testdata/HEAD/core.v1.Service.json | 13 +- .../api/testdata/HEAD/core.v1.Service.pb | Bin 516 -> 522 bytes .../api/testdata/HEAD/core.v1.Service.yaml | 11 +- .../core/v1/servicespec.go | 9 + 28 files changed, 3584 insertions(+), 179 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 7fb60793d545..ffa5ffd80ab8 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -10382,6 +10382,10 @@ "format": "int32", "type": "integer" }, + "internalTrafficPolicy": { + "description": "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. featureGate=ServiceInternalTrafficPolicy", + "type": "string" + }, "ipFamilies": { "description": "IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this service, and is gated by the \"IPv6DualStack\" feature gate. 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.", "items": { @@ -11791,6 +11795,552 @@ }, "type": "object" }, + "io.k8s.api.flowcontrol.v1alpha1.FlowDistinguisherMethod": { + "description": "FlowDistinguisherMethod specifies the method of a flow distinguisher.", + "properties": { + "type": { + "description": "`type` is the type of flow distinguisher method The supported types are \"ByUser\" and \"ByNamespace\". Required.", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.FlowSchema": { + "description": "FlowSchema defines the schema of a group of flows. Note that a flow is made up of a set of inbound API requests with similar attributes and is identified by a pair of strings: the name of the FlowSchema and a \"flow distinguisher\".", + "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": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchemaSpec", + "description": "`spec` is the specification of the desired behavior of a FlowSchema. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchemaStatus", + "description": "`status` is the current status of a FlowSchema. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + ] + }, + "io.k8s.api.flowcontrol.v1alpha1.FlowSchemaCondition": { + "description": "FlowSchemaCondition describes conditions for a FlowSchema.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "`lastTransitionTime` is the last time the condition transitioned from one status to another." + }, + "message": { + "description": "`message` is a human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "`reason` is a unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "`status` is the status of the condition. Can be True, False, Unknown. Required.", + "type": "string" + }, + "type": { + "description": "`type` is the type of the condition. Required.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.FlowSchemaList": { + "description": "FlowSchemaList is a list of FlowSchema objects.", + "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" + }, + "items": { + "description": "`items` is a list of FlowSchemas.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + }, + "type": "array" + }, + "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": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "`metadata` is the standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchemaList", + "version": "v1alpha1" + } + ] + }, + "io.k8s.api.flowcontrol.v1alpha1.FlowSchemaSpec": { + "description": "FlowSchemaSpec describes how the FlowSchema's specification looks like.", + "properties": { + "distinguisherMethod": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowDistinguisherMethod", + "description": "`distinguisherMethod` defines how to compute the flow distinguisher for requests that match this schema. `nil` specifies that the distinguisher is disabled and thus will always be the empty string." + }, + "matchingPrecedence": { + "description": "`matchingPrecedence` is used to choose among the FlowSchemas that match a given request. The chosen FlowSchema is among those with the numerically lowest (which we take to be logically highest) MatchingPrecedence. Each MatchingPrecedence value must be ranged in [1,10000]. Note that if the precedence is not specified, it will be set to 1000 as default.", + "format": "int32", + "type": "integer" + }, + "priorityLevelConfiguration": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationReference", + "description": "`priorityLevelConfiguration` should reference a PriorityLevelConfiguration in the cluster. If the reference cannot be resolved, the FlowSchema will be ignored and marked as invalid in its status. Required." + }, + "rules": { + "description": "`rules` describes which requests will match this flow schema. This FlowSchema matches a request if and only if at least one member of rules matches the request. if it is an empty slice, there will be no requests matching the FlowSchema.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PolicyRulesWithSubjects" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "priorityLevelConfiguration" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.FlowSchemaStatus": { + "description": "FlowSchemaStatus represents the current state of a FlowSchema.", + "properties": { + "conditions": { + "description": "`conditions` is a list of the current states of FlowSchema.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchemaCondition" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.GroupSubject": { + "description": "GroupSubject holds detailed information for group-kind subject.", + "properties": { + "name": { + "description": "name is the user group that matches, or \"*\" to match all user groups. See https://github.com/kubernetes/apiserver/blob/master/pkg/authentication/user/user.go for some well-known group names. Required.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.LimitResponse": { + "description": "LimitResponse defines how to handle requests that can not be executed right now.", + "properties": { + "queuing": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.QueuingConfiguration", + "description": "`queuing` holds the configuration parameters for queuing. This field may be non-empty only if `type` is `\"Queue\"`." + }, + "type": { + "description": "`type` is \"Queue\" or \"Reject\". \"Queue\" means that requests that can not be executed upon arrival are held in a queue until they can be executed or a queuing limit is reached. \"Reject\" means that requests that can not be executed upon arrival are rejected. Required.", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object", + "x-kubernetes-unions": [ + { + "discriminator": "type", + "fields-to-discriminateBy": { + "queuing": "Queuing" + } + } + ] + }, + "io.k8s.api.flowcontrol.v1alpha1.LimitedPriorityLevelConfiguration": { + "description": "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?", + "properties": { + "assuredConcurrencyShares": { + "description": "`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) --- the number of requests that may be executing at a time --- for each such priority level:\n\n ACV(l) = ceil( SCL * ACS(l) / ( sum[priority levels k] ACS(k) ) )\n\nbigger numbers of ACS mean more reserved concurrent requests (at the expense of every other PL). This field has a default value of 30.", + "format": "int32", + "type": "integer" + }, + "limitResponse": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.LimitResponse", + "description": "`limitResponse` indicates what to do with requests that can not be executed right now" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.NonResourcePolicyRule": { + "description": "NonResourcePolicyRule is a predicate that matches non-resource requests according to their verb and the target non-resource URL. A NonResourcePolicyRule matches a request if and only if both (a) at least one member of verbs matches the request and (b) at least one member of nonResourceURLs matches the request.", + "properties": { + "nonResourceURLs": { + "description": "`nonResourceURLs` is a set of url prefixes that a user should have access to and may not be empty. For example:\n - \"/healthz\" is legal\n - \"/hea*\" is illegal\n - \"/hea\" is legal but matches nothing\n - \"/hea/*\" also matches nothing\n - \"/healthz/*\" matches all per-component health checks.\n\"*\" matches all non-resource urls. if it is present, it must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + }, + "verbs": { + "description": "`verbs` is a list of matching verbs and may not be empty. \"*\" matches all verbs. If it is present, it must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + } + }, + "required": [ + "verbs", + "nonResourceURLs" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.PolicyRulesWithSubjects": { + "description": "PolicyRulesWithSubjects prescribes a test that applies to a request to an apiserver. The test considers the subject making the request, the verb being requested, and the resource to be acted upon. This PolicyRulesWithSubjects matches a request if and only if both (a) at least one member of subjects matches the request and (b) at least one member of resourceRules or nonResourceRules matches the request.", + "properties": { + "nonResourceRules": { + "description": "`nonResourceRules` is a list of NonResourcePolicyRules that identify matching requests according to their verb and the target non-resource URL.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.NonResourcePolicyRule" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "resourceRules": { + "description": "`resourceRules` is a slice of ResourcePolicyRules that identify matching requests according to their verb and the target resource. At least one of `resourceRules` and `nonResourceRules` has to be non-empty.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.ResourcePolicyRule" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "subjects": { + "description": "subjects is the list of normal user, serviceaccount, or group that this rule cares about. There must be at least one member in this slice. A slice that includes both the system:authenticated and system:unauthenticated user groups matches every request. Required.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.Subject" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "subjects" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration": { + "description": "PriorityLevelConfiguration represents the configuration of a priority level.", + "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": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationSpec", + "description": "`spec` is the specification of the desired behavior of a \"request-priority\". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationStatus", + "description": "`status` is the current status of a \"request-priority\". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" + } + ] + }, + "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationCondition": { + "description": "PriorityLevelConfigurationCondition defines the condition of priority level.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "`lastTransitionTime` is the last time the condition transitioned from one status to another." + }, + "message": { + "description": "`message` is a human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "`reason` is a unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "`status` is the status of the condition. Can be True, False, Unknown. Required.", + "type": "string" + }, + "type": { + "description": "`type` is the type of the condition. Required.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationList": { + "description": "PriorityLevelConfigurationList is a list of PriorityLevelConfiguration objects.", + "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" + }, + "items": { + "description": "`items` is a list of request-priorities.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + }, + "type": "array" + }, + "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": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfigurationList", + "version": "v1alpha1" + } + ] + }, + "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationReference": { + "description": "PriorityLevelConfigurationReference contains information that points to the \"request-priority\" being used.", + "properties": { + "name": { + "description": "`name` is the name of the priority level configuration being referenced Required.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationSpec": { + "description": "PriorityLevelConfigurationSpec specifies the configuration of a priority level.", + "properties": { + "limited": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.LimitedPriorityLevelConfiguration", + "description": "`limited` specifies how requests are handled for a Limited priority level. This field must be non-empty if and only if `type` is `\"Limited\"`." + }, + "type": { + "description": "`type` indicates whether this priority level is subject to limitation on request execution. A value of `\"Exempt\"` means that requests of this priority level are not subject to a limit (and thus are never queued) and do not detract from the capacity made available to other priority levels. A value of `\"Limited\"` means that (a) requests of this priority level _are_ subject to limits and (b) some of the server's limited capacity is made available exclusively to this priority level. Required.", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object", + "x-kubernetes-unions": [ + { + "discriminator": "type", + "fields-to-discriminateBy": { + "limited": "Limited" + } + } + ] + }, + "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationStatus": { + "description": "PriorityLevelConfigurationStatus represents the current state of a \"request-priority\".", + "properties": { + "conditions": { + "description": "`conditions` is the current state of \"request-priority\".", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationCondition" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.QueuingConfiguration": { + "description": "QueuingConfiguration holds the configuration parameters for queuing", + "properties": { + "handSize": { + "description": "`handSize` is a small positive number that configures the shuffle sharding of requests into queues. When enqueuing a request at this priority level the request's flow identifier (a string pair) is hashed and the hash value is used to shuffle the list of queues and deal a hand of the size specified here. The request is put into one of the shortest queues in that hand. `handSize` must be no larger than `queues`, and should be significantly smaller (so that a few heavy flows do not saturate most of the queues). See the user-facing documentation for more extensive guidance on setting this field. This field has a default value of 8.", + "format": "int32", + "type": "integer" + }, + "queueLengthLimit": { + "description": "`queueLengthLimit` is the maximum number of requests allowed to be waiting in a given queue of this priority level at a time; excess requests are rejected. This value must be positive. If not specified, it will be defaulted to 50.", + "format": "int32", + "type": "integer" + }, + "queues": { + "description": "`queues` is the number of queues for this priority level. The queues exist independently at each apiserver. The value must be positive. Setting it to 1 effectively precludes shufflesharding and thus makes the distinguisher method of associated flow schemas irrelevant. This field has a default value of 64.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.ResourcePolicyRule": { + "description": "ResourcePolicyRule is a predicate that matches some resource requests, testing the request's verb and the target resource. A ResourcePolicyRule matches a resource request if and only if: (a) at least one member of verbs matches the request, (b) at least one member of apiGroups matches the request, (c) at least one member of resources matches the request, and (d) least one member of namespaces matches the request.", + "properties": { + "apiGroups": { + "description": "`apiGroups` is a list of matching API groups and may not be empty. \"*\" matches all API groups and, if present, must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + }, + "clusterScope": { + "description": "`clusterScope` indicates whether to match requests that do not specify a namespace (which happens either because the resource is not namespaced or the request targets all namespaces). If this field is omitted or false then the `namespaces` field must contain a non-empty list.", + "type": "boolean" + }, + "namespaces": { + "description": "`namespaces` is a list of target namespaces that restricts matches. A request that specifies a target namespace matches only if either (a) this list contains that target namespace or (b) this list contains \"*\". Note that \"*\" matches any specified namespace but does not match a request that _does not specify_ a namespace (see the `clusterScope` field for that). This list may be empty, but only if `clusterScope` is true.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + }, + "resources": { + "description": "`resources` is a list of matching resources (i.e., lowercase and plural) with, if desired, subresource. For example, [ \"services\", \"nodes/status\" ]. This list may not be empty. \"*\" matches all resources and, if present, must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + }, + "verbs": { + "description": "`verbs` is a list of matching verbs and may not be empty. \"*\" matches all verbs and, if present, must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + } + }, + "required": [ + "verbs", + "apiGroups", + "resources" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.ServiceAccountSubject": { + "description": "ServiceAccountSubject holds detailed information for service-account-kind subject.", + "properties": { + "name": { + "description": "`name` is the name of matching ServiceAccount objects, or \"*\" to match regardless of name. Required.", + "type": "string" + }, + "namespace": { + "description": "`namespace` is the namespace of matching ServiceAccount objects. Required.", + "type": "string" + } + }, + "required": [ + "namespace", + "name" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1alpha1.Subject": { + "description": "Subject matches the originator of a request, as identified by the request authentication system. There are three ways of matching an originator; by user, group, or service account.", + "properties": { + "group": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.GroupSubject" + }, + "kind": { + "description": "Required", + "type": "string" + }, + "serviceAccount": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.ServiceAccountSubject" + }, + "user": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.UserSubject" + } + }, + "required": [ + "kind" + ], + "type": "object", + "x-kubernetes-unions": [ + { + "discriminator": "kind", + "fields-to-discriminateBy": { + "group": "Group", + "serviceAccount": "ServiceAccount", + "user": "User" + } + } + ] + }, + "io.k8s.api.flowcontrol.v1alpha1.UserSubject": { + "description": "UserSubject holds detailed information for user-kind subject.", + "properties": { + "name": { + "description": "`name` is the username that matches, or \"*\" to match all usernames. Required.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, "io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethod": { "description": "FlowDistinguisherMethod specifies the method of a flow distinguisher.", "properties": { @@ -71687,21 +72237,1978 @@ "https" ], "tags": [ - "extensions_v1beta1" + "extensions_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Ingress", + "operationId": "readExtensionsV1beta1NamespacedIngress", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Ingress", + "operationId": "patchExtensionsV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Ingress", + "operationId": "replaceExtensionsV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + } + }, + "/apis/extensions/v1beta1/namespaces/{namespace}/ingresses/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Ingress", + "operationId": "readExtensionsV1beta1NamespacedIngressStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Ingress", + "operationId": "patchExtensionsV1beta1NamespacedIngressStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Ingress", + "operationId": "replaceExtensionsV1beta1NamespacedIngressStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + } + }, + "/apis/extensions/v1beta1/watch/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchExtensionsV1beta1IngressListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchExtensionsV1beta1NamespacedIngressList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchExtensionsV1beta1NamespacedIngress", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/flowcontrol.apiserver.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getFlowcontrolApiserverAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver" + ] + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getFlowcontrolApiserverV1alpha1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ] + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/flowschemas": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of FlowSchema", + "operationId": "deleteFlowcontrolApiserverV1alpha1CollectionFlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind FlowSchema", + "operationId": "listFlowcontrolApiserverV1alpha1FlowSchema", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchemaList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a FlowSchema", + "operationId": "createFlowcontrolApiserverV1alpha1FlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/flowschemas/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a FlowSchema", + "operationId": "deleteFlowcontrolApiserverV1alpha1FlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified FlowSchema", + "operationId": "readFlowcontrolApiserverV1alpha1FlowSchema", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "name of the FlowSchema", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified FlowSchema", + "operationId": "patchFlowcontrolApiserverV1alpha1FlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified FlowSchema", + "operationId": "replaceFlowcontrolApiserverV1alpha1FlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/flowschemas/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified FlowSchema", + "operationId": "readFlowcontrolApiserverV1alpha1FlowSchemaStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "name of the FlowSchema", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified FlowSchema", + "operationId": "patchFlowcontrolApiserverV1alpha1FlowSchemaStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified FlowSchema", + "operationId": "replaceFlowcontrolApiserverV1alpha1FlowSchemaStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/prioritylevelconfigurations": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of PriorityLevelConfiguration", + "operationId": "deleteFlowcontrolApiserverV1alpha1CollectionPriorityLevelConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PriorityLevelConfiguration", + "operationId": "listFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a PriorityLevelConfiguration", + "operationId": "createFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/prioritylevelconfigurations/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a PriorityLevelConfiguration", + "operationId": "deleteFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1alpha1" ], "x-kubernetes-action": "delete", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" } }, "get": { "consumes": [ "*/*" ], - "description": "read the specified Ingress", - "operationId": "readExtensionsV1beta1NamespacedIngress", + "description": "read the specified PriorityLevelConfiguration", + "operationId": "readFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", "produces": [ "application/json", "application/yaml", @@ -71711,7 +74218,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, "401": { @@ -71722,32 +74229,24 @@ "https" ], "tags": [ - "extensions_v1beta1" + "flowcontrolApiserver_v1alpha1" ], "x-kubernetes-action": "get", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" } }, "parameters": [ { - "description": "name of the Ingress", + "description": "name of the PriorityLevelConfiguration", "in": "path", "name": "name", "required": true, "type": "string", "uniqueItems": true }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "type": "string", - "uniqueItems": true - }, { "description": "If 'true', then the output is pretty printed.", "in": "query", @@ -71763,8 +74262,8 @@ "application/strategic-merge-patch+json", "application/apply-patch+yaml" ], - "description": "partially update the specified Ingress", - "operationId": "patchExtensionsV1beta1NamespacedIngress", + "description": "partially update the specified PriorityLevelConfiguration", + "operationId": "patchFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", "parameters": [ { "in": "body", @@ -71805,7 +74304,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, "401": { @@ -71816,28 +74315,28 @@ "https" ], "tags": [ - "extensions_v1beta1" + "flowcontrolApiserver_v1alpha1" ], "x-kubernetes-action": "patch", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" } }, "put": { "consumes": [ "*/*" ], - "description": "replace the specified Ingress", - "operationId": "replaceExtensionsV1beta1NamespacedIngress", + "description": "replace the specified PriorityLevelConfiguration", + "operationId": "replaceFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", "parameters": [ { "in": "body", "name": "body", "required": true, "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, { @@ -71864,13 +74363,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, "201": { "description": "Created", "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, "401": { @@ -71881,23 +74380,23 @@ "https" ], "tags": [ - "extensions_v1beta1" + "flowcontrolApiserver_v1alpha1" ], "x-kubernetes-action": "put", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" } } }, - "/apis/extensions/v1beta1/namespaces/{namespace}/ingresses/{name}/status": { + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/prioritylevelconfigurations/{name}/status": { "get": { "consumes": [ "*/*" ], - "description": "read status of the specified Ingress", - "operationId": "readExtensionsV1beta1NamespacedIngressStatus", + "description": "read status of the specified PriorityLevelConfiguration", + "operationId": "readFlowcontrolApiserverV1alpha1PriorityLevelConfigurationStatus", "produces": [ "application/json", "application/yaml", @@ -71907,7 +74406,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, "401": { @@ -71918,32 +74417,24 @@ "https" ], "tags": [ - "extensions_v1beta1" + "flowcontrolApiserver_v1alpha1" ], "x-kubernetes-action": "get", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" } }, "parameters": [ { - "description": "name of the Ingress", + "description": "name of the PriorityLevelConfiguration", "in": "path", "name": "name", "required": true, "type": "string", "uniqueItems": true }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "type": "string", - "uniqueItems": true - }, { "description": "If 'true', then the output is pretty printed.", "in": "query", @@ -71959,8 +74450,8 @@ "application/strategic-merge-patch+json", "application/apply-patch+yaml" ], - "description": "partially update status of the specified Ingress", - "operationId": "patchExtensionsV1beta1NamespacedIngressStatus", + "description": "partially update status of the specified PriorityLevelConfiguration", + "operationId": "patchFlowcontrolApiserverV1alpha1PriorityLevelConfigurationStatus", "parameters": [ { "in": "body", @@ -72001,7 +74492,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, "401": { @@ -72012,28 +74503,28 @@ "https" ], "tags": [ - "extensions_v1beta1" + "flowcontrolApiserver_v1alpha1" ], "x-kubernetes-action": "patch", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" } }, "put": { "consumes": [ "*/*" ], - "description": "replace status of the specified Ingress", - "operationId": "replaceExtensionsV1beta1NamespacedIngressStatus", + "description": "replace status of the specified PriorityLevelConfiguration", + "operationId": "replaceFlowcontrolApiserverV1alpha1PriorityLevelConfigurationStatus", "parameters": [ { "in": "body", "name": "body", "required": true, "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, { @@ -72060,13 +74551,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, "201": { "description": "Created", "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" } }, "401": { @@ -72077,23 +74568,23 @@ "https" ], "tags": [ - "extensions_v1beta1" + "flowcontrolApiserver_v1alpha1" ], "x-kubernetes-action": "put", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" } } }, - "/apis/extensions/v1beta1/watch/ingresses": { + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/watch/flowschemas": { "get": { "consumes": [ "*/*" ], - "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchExtensionsV1beta1IngressListForAllNamespaces", + "description": "watch individual changes to a list of FlowSchema. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchFlowcontrolApiserverV1alpha1FlowSchemaList", "produces": [ "application/json", "application/yaml", @@ -72116,13 +74607,13 @@ "https" ], "tags": [ - "extensions_v1beta1" + "flowcontrolApiserver_v1alpha1" ], "x-kubernetes-action": "watchlist", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" } }, "parameters": [ @@ -72198,13 +74689,13 @@ } ] }, - "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses": { + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/watch/flowschemas/{name}": { "get": { "consumes": [ "*/*" ], - "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchExtensionsV1beta1NamespacedIngressList", + "description": "watch changes to an object of kind FlowSchema. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchFlowcontrolApiserverV1alpha1FlowSchema", "produces": [ "application/json", "application/yaml", @@ -72227,13 +74718,13 @@ "https" ], "tags": [ - "extensions_v1beta1" + "flowcontrolApiserver_v1alpha1" ], - "x-kubernetes-action": "watchlist", + "x-kubernetes-action": "watch", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1alpha1" } }, "parameters": [ @@ -72273,9 +74764,9 @@ "uniqueItems": true }, { - "description": "object name and auth scope, such as for teams and projects", + "description": "name of the FlowSchema", "in": "path", - "name": "namespace", + "name": "name", "required": true, "type": "string", "uniqueItems": true @@ -72317,13 +74808,13 @@ } ] }, - "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses/{name}": { + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/watch/prioritylevelconfigurations": { "get": { "consumes": [ "*/*" ], - "description": "watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchExtensionsV1beta1NamespacedIngress", + "description": "watch individual changes to a list of PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchFlowcontrolApiserverV1alpha1PriorityLevelConfigurationList", "produces": [ "application/json", "application/yaml", @@ -72346,13 +74837,13 @@ "https" ], "tags": [ - "extensions_v1beta1" + "flowcontrolApiserver_v1alpha1" ], - "x-kubernetes-action": "watch", + "x-kubernetes-action": "watchlist", "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" } }, "parameters": [ @@ -72391,22 +74882,6 @@ "type": "integer", "uniqueItems": true }, - { - "description": "name of the Ingress", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "type": "string", - "uniqueItems": true - }, { "description": "If 'true', then the output is pretty printed.", "in": "query", @@ -72444,25 +74919,25 @@ } ] }, - "/apis/flowcontrol.apiserver.k8s.io/": { + "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/watch/prioritylevelconfigurations/{name}": { "get": { "consumes": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" + "*/*" ], - "description": "get information of a group", - "operationId": "getFlowcontrolApiserverAPIGroup", + "description": "watch changes to an object of kind PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", "produces": [ "application/json", "application/yaml", - "application/vnd.kubernetes.protobuf" + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" } }, "401": { @@ -72473,9 +74948,95 @@ "https" ], "tags": [ - "flowcontrolApiserver" - ] - } + "flowcontrolApiserver_v1alpha1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the PriorityLevelConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] }, "/apis/flowcontrol.apiserver.k8s.io/v1beta1/": { "get": { diff --git a/pkg/api/v1/service/util.go b/pkg/api/v1/service/util.go index d1c6713888e6..68913287c139 100644 --- a/pkg/api/v1/service/util.go +++ b/pkg/api/v1/service/util.go @@ -20,7 +20,7 @@ import ( "fmt" "strings" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" utilnet "k8s.io/utils/net" ) @@ -76,6 +76,15 @@ func RequestsOnlyLocalTraffic(service *v1.Service) bool { return service.Spec.ExternalTrafficPolicy == v1.ServiceExternalTrafficPolicyTypeLocal } +// RequestsOnlyLocalTrafficForInternal checks if service prefers Node Local +// endpoints for internal traffic +func RequestsOnlyLocalTrafficForInternal(service *v1.Service) bool { + if service.Spec.InternalTrafficPolicy == nil { + return false + } + return *service.Spec.InternalTrafficPolicy == v1.ServiceInternalTrafficPolicyLocal +} + // NeedsHealthCheck checks if service needs health check. func NeedsHealthCheck(service *v1.Service) bool { if service.Spec.Type != v1.ServiceTypeLoadBalancer { diff --git a/pkg/api/v1/service/util_test.go b/pkg/api/v1/service/util_test.go index 9813017c491a..f7a3c2dadb93 100644 --- a/pkg/api/v1/service/util_test.go +++ b/pkg/api/v1/service/util_test.go @@ -20,7 +20,7 @@ import ( "strings" "testing" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" utilnet "k8s.io/utils/net" ) @@ -214,3 +214,30 @@ func TestNeedsHealthCheck(t *testing.T) { }, }) } + +func TestRequestsOnlyLocalTrafficForInternal(t *testing.T) { + checkRequestsOnlyLocalTrafficForInternal := func(expected bool, service *v1.Service) { + res := RequestsOnlyLocalTrafficForInternal(service) + if res != expected { + t.Errorf("Expected internal local traffic = %v, got %v", + expected, res) + } + } + + // default InternalTrafficPolicy is nil + checkRequestsOnlyLocalTrafficForInternal(false, &v1.Service{}) + + local := v1.ServiceInternalTrafficPolicyLocal + checkRequestsOnlyLocalTrafficForInternal(true, &v1.Service{ + Spec: v1.ServiceSpec{ + InternalTrafficPolicy: &local, + }, + }) + + cluster := v1.ServiceInternalTrafficPolicyCluster + checkRequestsOnlyLocalTrafficForInternal(false, &v1.Service{ + Spec: v1.ServiceSpec{ + InternalTrafficPolicy: &cluster, + }, + }) +} diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index f130a6c13b09..e40d798b8fbe 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -3475,6 +3475,19 @@ const ( ServiceTypeExternalName ServiceType = "ExternalName" ) +// ServiceInternalTrafficPolicyType describes the type of traffic routing for +// internal traffic +type ServiceInternalTrafficPolicyType string + +const ( + // ServiceInternalTrafficPolicyCluster routes traffic to all endpoints + ServiceInternalTrafficPolicyCluster ServiceInternalTrafficPolicyType = "Cluster" + + // ServiceInternalTrafficPolicyLocal only routes to node-local + // endpoints, otherwise drops the traffic + ServiceInternalTrafficPolicyLocal ServiceInternalTrafficPolicyType = "Local" +) + // ServiceExternalTrafficPolicyType string type ServiceExternalTrafficPolicyType string @@ -3739,9 +3752,19 @@ type ServiceSpec struct { // 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. - // featureGate=LoadBalancerClass + // +featureGate=LoadBalancerClass // +optional LoadBalancerClass *string + + // 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". + // +featureGate=ServiceInternalTrafficPolicy + // +optional + InternalTrafficPolicy *ServiceInternalTrafficPolicyType } // ServicePort represents the port on which the service is exposed diff --git a/pkg/apis/core/v1/defaults.go b/pkg/apis/core/v1/defaults.go index 96c8753ca8b9..3381f652c0ec 100644 --- a/pkg/apis/core/v1/defaults.go +++ b/pkg/apis/core/v1/defaults.go @@ -131,6 +131,11 @@ func SetDefaults_Service(obj *v1.Service) { obj.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster } + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) && obj.Spec.InternalTrafficPolicy == nil { + serviceInternalTrafficPolicyCluster := v1.ServiceInternalTrafficPolicyCluster + obj.Spec.InternalTrafficPolicy = &serviceInternalTrafficPolicyCluster + } + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceLBNodePortControl) { if obj.Spec.Type == v1.ServiceTypeLoadBalancer { if obj.Spec.AllocateLoadBalancerNodePorts == nil { diff --git a/pkg/apis/core/v1/defaults_test.go b/pkg/apis/core/v1/defaults_test.go index d0ea41f9af80..b167110c0a83 100644 --- a/pkg/apis/core/v1/defaults_test.go +++ b/pkg/apis/core/v1/defaults_test.go @@ -29,8 +29,11 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/intstr" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/kubernetes/pkg/api/legacyscheme" corev1 "k8s.io/kubernetes/pkg/apis/core/v1" + "k8s.io/kubernetes/pkg/features" utilpointer "k8s.io/utils/pointer" // ensure types are installed @@ -1798,3 +1801,64 @@ func TestSetDefaultEnableServiceLinks(t *testing.T) { t.Errorf("Expected enableServiceLinks value: %+v\ngot: %+v\n", v1.DefaultEnableServiceLinks, *output.Spec.EnableServiceLinks) } } + +func TestSetDefaultServiceInternalTrafficPolicy(t *testing.T) { + cluster := v1.ServiceInternalTrafficPolicyCluster + local := v1.ServiceInternalTrafficPolicyLocal + testCases := []struct { + name string + expectedInternalTrafficPolicy v1.ServiceInternalTrafficPolicyType + svc v1.Service + featureGateOn bool + }{ + { + name: "must set default internalTrafficPolicy", + expectedInternalTrafficPolicy: v1.ServiceInternalTrafficPolicyCluster, + svc: v1.Service{}, + featureGateOn: true, + }, + { + name: "must not set default internalTrafficPolicy when it's cluster", + expectedInternalTrafficPolicy: v1.ServiceInternalTrafficPolicyCluster, + svc: v1.Service{ + Spec: v1.ServiceSpec{ + InternalTrafficPolicy: &cluster, + }, + }, + featureGateOn: true, + }, + { + name: "must not set default internalTrafficPolicy when it's local", + expectedInternalTrafficPolicy: v1.ServiceInternalTrafficPolicyLocal, + svc: v1.Service{ + Spec: v1.ServiceSpec{ + InternalTrafficPolicy: &local, + }, + }, + featureGateOn: true, + }, + { + name: "must not set default internalTrafficPolicy when gate is disabled", + expectedInternalTrafficPolicy: "", + svc: v1.Service{}, + featureGateOn: false, + }, + } + for _, test := range testCases { + t.Run(test.name, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServiceInternalTrafficPolicy, test.featureGateOn)() + obj := roundTrip(t, runtime.Object(&test.svc)) + svc := obj.(*v1.Service) + + if test.expectedInternalTrafficPolicy == "" { + if svc.Spec.InternalTrafficPolicy != nil { + t.Fatalf("expected .spec.internalTrafficPolicy: null, got %v", *svc.Spec.InternalTrafficPolicy) + } + } else { + if *svc.Spec.InternalTrafficPolicy != test.expectedInternalTrafficPolicy { + t.Fatalf("expected .spec.internalTrafficPolicy: %v got %v", test.expectedInternalTrafficPolicy, *svc.Spec.InternalTrafficPolicy) + } + } + }) + } +} diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index 4abda6e93bcd..9cceb8cd0eff 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -7636,6 +7636,7 @@ func autoConvert_v1_ServiceSpec_To_core_ServiceSpec(in *v1.ServiceSpec, out *cor out.IPFamilyPolicy = (*core.IPFamilyPolicyType)(unsafe.Pointer(in.IPFamilyPolicy)) out.AllocateLoadBalancerNodePorts = (*bool)(unsafe.Pointer(in.AllocateLoadBalancerNodePorts)) out.LoadBalancerClass = (*string)(unsafe.Pointer(in.LoadBalancerClass)) + out.InternalTrafficPolicy = (*core.ServiceInternalTrafficPolicyType)(unsafe.Pointer(in.InternalTrafficPolicy)) return nil } @@ -7664,6 +7665,7 @@ func autoConvert_core_ServiceSpec_To_v1_ServiceSpec(in *core.ServiceSpec, out *v out.TopologyKeys = *(*[]string)(unsafe.Pointer(&in.TopologyKeys)) out.AllocateLoadBalancerNodePorts = (*bool)(unsafe.Pointer(in.AllocateLoadBalancerNodePorts)) out.LoadBalancerClass = (*string)(unsafe.Pointer(in.LoadBalancerClass)) + out.InternalTrafficPolicy = (*v1.ServiceInternalTrafficPolicyType)(unsafe.Pointer(in.InternalTrafficPolicy)) return nil } diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index f7ee68664ec1..1b668083b3b3 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -4171,6 +4171,8 @@ var supportedSessionAffinityType = sets.NewString(string(core.ServiceAffinityCli var supportedServiceType = sets.NewString(string(core.ServiceTypeClusterIP), string(core.ServiceTypeNodePort), string(core.ServiceTypeLoadBalancer), string(core.ServiceTypeExternalName)) +var supportedServiceInternalTrafficPolicy = sets.NewString(string(core.ServiceInternalTrafficPolicyCluster), string(core.ServiceExternalTrafficPolicyTypeLocal)) + var supportedServiceIPFamily = sets.NewString(string(core.IPv4Protocol), string(core.IPv6Protocol)) var supportedServiceIPFamilyPolicy = sets.NewString(string(core.IPFamilyPolicySingleStack), string(core.IPFamilyPolicyPreferDualStack), string(core.IPFamilyPolicyRequireDualStack)) @@ -4378,6 +4380,10 @@ func ValidateService(service *core.Service) field.ErrorList { // external traffic fields allErrs = append(allErrs, validateServiceExternalTrafficFieldsValue(service)...) + + // internal traffic policy field + allErrs = append(allErrs, validateServiceInternalTrafficFieldsValue(service)...) + return allErrs } @@ -4446,6 +4452,24 @@ func validateServiceExternalTrafficFieldsValue(service *core.Service) field.Erro return allErrs } +// validateServiceInternalTrafficFieldsValue validates InternalTraffic related +// spec have legal value. +func validateServiceInternalTrafficFieldsValue(service *core.Service) field.ErrorList { + allErrs := field.ErrorList{} + + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) { + if service.Spec.InternalTrafficPolicy == nil { + allErrs = append(allErrs, field.Required(field.NewPath("spec").Child("internalTrafficPolicy"), "")) + } + } + + if service.Spec.InternalTrafficPolicy != nil && !supportedServiceInternalTrafficPolicy.Has(string(*service.Spec.InternalTrafficPolicy)) { + allErrs = append(allErrs, field.NotSupported(field.NewPath("spec").Child("internalTrafficPolicy"), *service.Spec.InternalTrafficPolicy, supportedServiceInternalTrafficPolicy.List())) + } + + return allErrs +} + // ValidateServiceExternalTrafficFieldsCombination validates if ExternalTrafficPolicy, // HealthCheckNodePort and Type combination are legal. For update, it should be called // after clearing externalTraffic related fields for the ease of transitioning between diff --git a/pkg/apis/core/validation/validation_test.go b/pkg/apis/core/validation/validation_test.go index c4000c27b7fd..6ea9b35aa339 100644 --- a/pkg/apis/core/validation/validation_test.go +++ b/pkg/apis/core/validation/validation_test.go @@ -33,6 +33,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/component-base/featuregate" featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/capabilities" @@ -10135,9 +10136,10 @@ func TestValidateServiceCreate(t *testing.T) { preferDualStack := core.IPFamilyPolicyPreferDualStack testCases := []struct { - name string - tweakSvc func(svc *core.Service) // given a basic valid service, each test case can customize it - numErrs int + name string + tweakSvc func(svc *core.Service) // given a basic valid service, each test case can customize it + numErrs int + featureGates []featuregate.Feature }{ { name: "missing namespace", @@ -10750,6 +10752,22 @@ func TestValidateServiceCreate(t *testing.T) { }, numErrs: 1, }, + { + name: "nil internalTraffic field when feature gate is on", + tweakSvc: func(s *core.Service) { + s.Spec.InternalTrafficPolicy = nil + }, + featureGates: []featuregate.Feature{features.ServiceInternalTrafficPolicy}, + numErrs: 1, + }, + { + name: "invalid internalTraffic field", + tweakSvc: func(s *core.Service) { + invalid := core.ServiceInternalTrafficPolicyType("invalid") + s.Spec.InternalTrafficPolicy = &invalid + }, + numErrs: 1, + }, { name: "nagative healthCheckNodePort field", tweakSvc: func(s *core.Service) { @@ -11323,6 +11341,9 @@ func TestValidateServiceCreate(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + for i := range tc.featureGates { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, tc.featureGates[i], true)() + } svc := makeValidService() tc.tweakSvc(&svc) errs := ValidateServiceCreate(&svc) diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index c1ae7ebae421..14a77ee1248f 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -5335,6 +5335,11 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { *out = new(string) **out = **in } + if in.InternalTrafficPolicy != nil { + in, out := &in.InternalTrafficPolicy, &out.InternalTrafficPolicy + *out = new(ServiceInternalTrafficPolicyType) + **out = **in + } return } diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 15596c3806b1..a03458b982a0 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -708,6 +708,12 @@ const ( // // Enable Scope and Namespace fields on IngressClassParametersReference. IngressClassNamespacedParams featuregate.Feature = "IngressClassNamespacedParams" + + // owner: @maplain @andrewsykim + // alpha: v1.21 + // + // Enables node-local routing for Service internal traffic + ServiceInternalTrafficPolicy featuregate.Feature = "ServiceInternalTrafficPolicy" ) func init() { @@ -815,6 +821,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS ServiceLoadBalancerClass: {Default: false, PreRelease: featuregate.Alpha}, LogarithmicScaleDown: {Default: false, PreRelease: featuregate.Alpha}, IngressClassNamespacedParams: {Default: false, PreRelease: featuregate.Alpha}, + ServiceInternalTrafficPolicy: {Default: false, PreRelease: featuregate.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 7464b837da79..4dafa162167b 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -1029,6 +1029,13 @@ func (proxier *Proxier) syncProxyRules() { allEndpoints = proxy.FilterTopologyEndpoint(proxier.nodeLabels, svcInfo.TopologyKeys(), allEndpoints) } + // Service InternalTrafficPolicy is only enabled when all of the + // following are true: + // 1. InternalTrafficPolicy is Local + // 2. ServiceInternalTrafficPolicy feature gate is on + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) && svcInfo.OnlyNodeLocalEndpointsForInternal() { + allEndpoints = proxy.FilterLocalEndpoint(svcInfo.InternalTrafficPolicy(), allEndpoints) + } readyEndpoints := make([]proxy.Endpoint, 0, len(allEndpoints)) for _, endpoint := range allEndpoints { if !endpoint.IsReady() { diff --git a/pkg/proxy/iptables/proxier_test.go b/pkg/proxy/iptables/proxier_test.go index 6d1b8f1bf284..4df8c65efbb8 100644 --- a/pkg/proxy/iptables/proxier_test.go +++ b/pkg/proxy/iptables/proxier_test.go @@ -32,8 +32,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/component-base/metrics/testutil" "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/proxy" "k8s.io/kubernetes/pkg/proxy/metrics" @@ -3056,3 +3059,219 @@ func TestProxierMetricsIptablesTotalRules(t *testing.T) { } // TODO(thockin): add *more* tests for syncProxyRules() or break it down further and test the pieces. + +// This test ensures that the iptables proxier supports translating Endpoints to +// iptables output when internalTrafficPolicy is specified +func TestInternalTrafficPolicyE2E(t *testing.T) { + type endpoint struct { + ip string + hostname string + } + + cluster := v1.ServiceInternalTrafficPolicyCluster + local := v1.ServiceInternalTrafficPolicyLocal + + clusterExpectedIPTables := `*filter +:KUBE-SERVICES - [0:0] +:KUBE-EXTERNAL-SERVICES - [0:0] +:KUBE-FORWARD - [0:0] +:KUBE-NODEPORTS - [0:0] +-A KUBE-FORWARD -m conntrack --ctstate INVALID -j DROP +-A KUBE-FORWARD -m comment --comment "kubernetes forwarding rules" -m mark --mark 0x4000/0x4000 -j ACCEPT +-A KUBE-FORWARD -m comment --comment "kubernetes forwarding conntrack pod source rule" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +-A KUBE-FORWARD -m comment --comment "kubernetes forwarding conntrack pod destination rule" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +COMMIT +*nat +:KUBE-SERVICES - [0:0] +:KUBE-NODEPORTS - [0:0] +:KUBE-POSTROUTING - [0:0] +:KUBE-MARK-MASQ - [0:0] +:KUBE-SVC-AQI2S6QIMU7PVVRP - [0:0] +:KUBE-SEP-3JOIVZTXZZRGORX4 - [0:0] +:KUBE-SEP-IO5XOSKPAXIFQXAJ - [0:0] +:KUBE-SEP-XGJFVO3L2O5SRFNT - [0:0] +-A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN +-A KUBE-POSTROUTING -j MARK --xor-mark 0x4000 +-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE +-A KUBE-MARK-MASQ -j MARK --or-mark 0x4000 +-A KUBE-SERVICES -m comment --comment "ns1/svc1 cluster IP" -m tcp -p tcp -d 172.20.1.1/32 --dport 80 ! -s 10.0.0.0/24 -j KUBE-MARK-MASQ +-A KUBE-SERVICES -m comment --comment "ns1/svc1 cluster IP" -m tcp -p tcp -d 172.20.1.1/32 --dport 80 -j KUBE-SVC-AQI2S6QIMU7PVVRP +-A KUBE-SVC-AQI2S6QIMU7PVVRP -m comment --comment ns1/svc1 -m statistic --mode random --probability 0.3333333333 -j KUBE-SEP-3JOIVZTXZZRGORX4 +-A KUBE-SEP-3JOIVZTXZZRGORX4 -m comment --comment ns1/svc1 -s 10.0.1.1/32 -j KUBE-MARK-MASQ +-A KUBE-SEP-3JOIVZTXZZRGORX4 -m comment --comment ns1/svc1 -m tcp -p tcp -j DNAT --to-destination 10.0.1.1:80 +-A KUBE-SVC-AQI2S6QIMU7PVVRP -m comment --comment ns1/svc1 -m statistic --mode random --probability 0.5000000000 -j KUBE-SEP-IO5XOSKPAXIFQXAJ +-A KUBE-SEP-IO5XOSKPAXIFQXAJ -m comment --comment ns1/svc1 -s 10.0.1.2/32 -j KUBE-MARK-MASQ +-A KUBE-SEP-IO5XOSKPAXIFQXAJ -m comment --comment ns1/svc1 -m tcp -p tcp -j DNAT --to-destination 10.0.1.2:80 +-A KUBE-SVC-AQI2S6QIMU7PVVRP -m comment --comment ns1/svc1 -j KUBE-SEP-XGJFVO3L2O5SRFNT +-A KUBE-SEP-XGJFVO3L2O5SRFNT -m comment --comment ns1/svc1 -s 10.0.1.3/32 -j KUBE-MARK-MASQ +-A KUBE-SEP-XGJFVO3L2O5SRFNT -m comment --comment ns1/svc1 -m tcp -p tcp -j DNAT --to-destination 10.0.1.3:80 +-A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS +COMMIT +` + + testCases := []struct { + name string + internalTrafficPolicy *v1.ServiceInternalTrafficPolicyType + featureGateOn bool + endpoints []endpoint + expectEndpointRule bool + expectedIPTablesWithSlice string + }{ + { + name: "internalTrafficPolicy is cluster", + internalTrafficPolicy: &cluster, + featureGateOn: true, + endpoints: []endpoint{ + {"10.0.1.1", testHostname}, + {"10.0.1.2", "host1"}, + {"10.0.1.3", "host2"}, + }, + expectEndpointRule: true, + expectedIPTablesWithSlice: clusterExpectedIPTables, + }, + { + name: "internalTrafficPolicy is local and there is non-zero local endpoints", + internalTrafficPolicy: &local, + featureGateOn: true, + endpoints: []endpoint{ + {"10.0.1.1", testHostname}, + {"10.0.1.2", "host1"}, + {"10.0.1.3", "host2"}, + }, + expectEndpointRule: true, + expectedIPTablesWithSlice: `*filter +:KUBE-SERVICES - [0:0] +:KUBE-EXTERNAL-SERVICES - [0:0] +:KUBE-FORWARD - [0:0] +:KUBE-NODEPORTS - [0:0] +-A KUBE-FORWARD -m conntrack --ctstate INVALID -j DROP +-A KUBE-FORWARD -m comment --comment "kubernetes forwarding rules" -m mark --mark 0x4000/0x4000 -j ACCEPT +-A KUBE-FORWARD -m comment --comment "kubernetes forwarding conntrack pod source rule" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +-A KUBE-FORWARD -m comment --comment "kubernetes forwarding conntrack pod destination rule" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +COMMIT +*nat +:KUBE-SERVICES - [0:0] +:KUBE-NODEPORTS - [0:0] +:KUBE-POSTROUTING - [0:0] +:KUBE-MARK-MASQ - [0:0] +:KUBE-SVC-AQI2S6QIMU7PVVRP - [0:0] +:KUBE-SEP-3JOIVZTXZZRGORX4 - [0:0] +-A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN +-A KUBE-POSTROUTING -j MARK --xor-mark 0x4000 +-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE +-A KUBE-MARK-MASQ -j MARK --or-mark 0x4000 +-A KUBE-SERVICES -m comment --comment "ns1/svc1 cluster IP" -m tcp -p tcp -d 172.20.1.1/32 --dport 80 ! -s 10.0.0.0/24 -j KUBE-MARK-MASQ +-A KUBE-SERVICES -m comment --comment "ns1/svc1 cluster IP" -m tcp -p tcp -d 172.20.1.1/32 --dport 80 -j KUBE-SVC-AQI2S6QIMU7PVVRP +-A KUBE-SVC-AQI2S6QIMU7PVVRP -m comment --comment ns1/svc1 -j KUBE-SEP-3JOIVZTXZZRGORX4 +-A KUBE-SEP-3JOIVZTXZZRGORX4 -m comment --comment ns1/svc1 -s 10.0.1.1/32 -j KUBE-MARK-MASQ +-A KUBE-SEP-3JOIVZTXZZRGORX4 -m comment --comment ns1/svc1 -m tcp -p tcp -j DNAT --to-destination 10.0.1.1:80 +-A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS +COMMIT +`, + }, + { + name: "internalTrafficPolicy is local and there is zero local endpoint", + internalTrafficPolicy: &local, + featureGateOn: true, + endpoints: []endpoint{ + {"10.0.1.1", "host0"}, + {"10.0.1.2", "host1"}, + {"10.0.1.3", "host2"}, + }, + expectEndpointRule: false, + expectedIPTablesWithSlice: `*filter +:KUBE-SERVICES - [0:0] +:KUBE-EXTERNAL-SERVICES - [0:0] +:KUBE-FORWARD - [0:0] +:KUBE-NODEPORTS - [0:0] +-A KUBE-SERVICES -m comment --comment "ns1/svc1 has no endpoints" -m tcp -p tcp -d 172.20.1.1/32 --dport 80 -j REJECT +-A KUBE-FORWARD -m conntrack --ctstate INVALID -j DROP +-A KUBE-FORWARD -m comment --comment "kubernetes forwarding rules" -m mark --mark 0x4000/0x4000 -j ACCEPT +-A KUBE-FORWARD -m comment --comment "kubernetes forwarding conntrack pod source rule" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +-A KUBE-FORWARD -m comment --comment "kubernetes forwarding conntrack pod destination rule" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +COMMIT +*nat +:KUBE-SERVICES - [0:0] +:KUBE-NODEPORTS - [0:0] +:KUBE-POSTROUTING - [0:0] +:KUBE-MARK-MASQ - [0:0] +-A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN +-A KUBE-POSTROUTING -j MARK --xor-mark 0x4000 +-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE +-A KUBE-MARK-MASQ -j MARK --or-mark 0x4000 +-A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS +COMMIT +`, + }, + { + name: "internalTrafficPolicy is local and there is non-zero local endpoint with feature gate off", + internalTrafficPolicy: &local, + featureGateOn: false, + endpoints: []endpoint{ + {"10.0.1.1", testHostname}, + {"10.0.1.2", "host1"}, + {"10.0.1.3", "host2"}, + }, + expectEndpointRule: false, + expectedIPTablesWithSlice: clusterExpectedIPTables, + }, + } + + for _, tc := range testCases { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServiceInternalTrafficPolicy, tc.featureGateOn)() + ipt := iptablestest.NewFake() + fp := NewFakeProxier(ipt, true) + fp.OnServiceSynced() + fp.OnEndpointsSynced() + fp.OnEndpointSlicesSynced() + + serviceName := "svc1" + namespaceName := "ns1" + + svc := &v1.Service{ + ObjectMeta: metav1.ObjectMeta{Name: serviceName, Namespace: namespaceName}, + Spec: v1.ServiceSpec{ + ClusterIP: "172.20.1.1", + Selector: map[string]string{"foo": "bar"}, + Ports: []v1.ServicePort{{Name: "", Port: 80, Protocol: v1.ProtocolTCP}}, + }, + } + if tc.internalTrafficPolicy != nil { + svc.Spec.InternalTrafficPolicy = tc.internalTrafficPolicy + } + + fp.OnServiceAdd(svc) + + tcpProtocol := v1.ProtocolTCP + endpointSlice := &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("%s-1", serviceName), + Namespace: namespaceName, + Labels: map[string]string{discovery.LabelServiceName: serviceName}, + }, + Ports: []discovery.EndpointPort{{ + Name: utilpointer.StringPtr(""), + Port: utilpointer.Int32Ptr(80), + Protocol: &tcpProtocol, + }}, + AddressType: discovery.AddressTypeIPv4, + } + for _, ep := range tc.endpoints { + endpointSlice.Endpoints = append(endpointSlice.Endpoints, discovery.Endpoint{ + Addresses: []string{ep.ip}, + Conditions: discovery.EndpointConditions{Ready: utilpointer.BoolPtr(true)}, + Topology: map[string]string{"kubernetes.io/hostname": ep.hostname}, + }) + } + + fp.OnEndpointSliceAdd(endpointSlice) + fp.syncProxyRules() + assert.Equal(t, tc.expectedIPTablesWithSlice, fp.iptablesData.String()) + + if tc.expectEndpointRule { + fp.OnEndpointSliceDelete(endpointSlice) + fp.syncProxyRules() + assert.NotEqual(t, tc.expectedIPTablesWithSlice, fp.iptablesData.String()) + } + } +} diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index 7bb97a303cb9..e084458db2da 100644 --- a/pkg/proxy/ipvs/proxier.go +++ b/pkg/proxy/ipvs/proxier.go @@ -1236,7 +1236,7 @@ func (proxier *Proxier) syncProxyRules() { activeBindAddrs[serv.Address.String()] = true // ExternalTrafficPolicy only works for NodePort and external LB traffic, does not affect ClusterIP // So we still need clusterIP rules in onlyNodeLocalEndpoints mode. - if err := proxier.syncEndpoint(svcName, false, serv); err != nil { + if err := proxier.syncEndpoint(svcName, false, svcInfo.OnlyNodeLocalEndpointsForInternal(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -1319,7 +1319,8 @@ func (proxier *Proxier) syncProxyRules() { activeBindAddrs[serv.Address.String()] = true onlyNodeLocalEndpoints := svcInfo.OnlyNodeLocalEndpoints() - if err := proxier.syncEndpoint(svcName, onlyNodeLocalEndpoints, serv); err != nil { + onlyNodeLocalEndpointsForInternal := svcInfo.OnlyNodeLocalEndpointsForInternal() + if err := proxier.syncEndpoint(svcName, onlyNodeLocalEndpoints, onlyNodeLocalEndpointsForInternal, serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -1420,7 +1421,7 @@ func (proxier *Proxier) syncProxyRules() { if err := proxier.syncService(svcNameString, serv, true, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true activeBindAddrs[serv.Address.String()] = true - if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), serv); err != nil { + if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), svcInfo.OnlyNodeLocalEndpointsForInternal(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -1579,7 +1580,7 @@ func (proxier *Proxier) syncProxyRules() { // There is no need to bind Node IP to dummy interface, so set parameter `bindAddr` to `false`. if err := proxier.syncService(svcNameString, serv, false, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true - if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), serv); err != nil { + if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), svcInfo.OnlyNodeLocalEndpointsForInternal(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -2030,7 +2031,7 @@ func (proxier *Proxier) syncService(svcName string, vs *utilipvs.VirtualServer, return nil } -func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNodeLocalEndpoints bool, vs *utilipvs.VirtualServer) error { +func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNodeLocalEndpoints bool, onlyNodeLocalEndpointsForInternal bool, vs *utilipvs.VirtualServer) error { appliedVirtualServer, err := proxier.ipvs.GetVirtualServer(vs) if err != nil { klog.Errorf("Failed to get IPVS service, error: %v", err) @@ -2065,6 +2066,14 @@ func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNode endpoints = proxy.FilterTopologyEndpoint(proxier.nodeLabels, proxier.serviceMap[svcPortName].TopologyKeys(), endpoints) } + // Service InternalTrafficPolicy is only enabled when all of the + // following are true: + // 1. InternalTrafficPolicy is PreferLocal or Local + // 2. ServiceInternalTrafficPolicy feature gate is on + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) && onlyNodeLocalEndpointsForInternal { + endpoints = proxy.FilterLocalEndpoint(proxier.serviceMap[svcPortName].InternalTrafficPolicy(), endpoints) + } + for _, epInfo := range endpoints { if !epInfo.IsReady() { continue diff --git a/pkg/proxy/ipvs/proxier_test.go b/pkg/proxy/ipvs/proxier_test.go index 9912244ff2a1..a60cee03c2e5 100644 --- a/pkg/proxy/ipvs/proxier_test.go +++ b/pkg/proxy/ipvs/proxier_test.go @@ -33,6 +33,9 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/sets" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/proxy" "k8s.io/kubernetes/pkg/proxy/healthcheck" netlinktest "k8s.io/kubernetes/pkg/proxy/ipvs/testing" @@ -4467,3 +4470,183 @@ func TestCreateAndLinkKubeChain(t *testing.T) { assert.Equal(t, expectedNATChains, fp.natChains.String()) assert.Equal(t, expectedFilterChains, fp.filterChains.String()) } + +// This test ensures that the iptables proxier supports translating Endpoints to +// iptables output when internalTrafficPolicy is specified +func TestTestInternalTrafficPolicyE2E(t *testing.T) { + type endpoint struct { + ip string + hostname string + } + + cluster := v1.ServiceInternalTrafficPolicyCluster + local := v1.ServiceInternalTrafficPolicyLocal + + testCases := []struct { + name string + internalTrafficPolicy *v1.ServiceInternalTrafficPolicyType + endpoints []endpoint + expectVirtualServer bool + expectLocalEntries bool + expectLocalRealServerNum int + expectLocalRealServers []string + }{ + { + name: "internalTrafficPolicy is cluster with non-zero local endpoints", + internalTrafficPolicy: &cluster, + endpoints: []endpoint{ + {"10.0.1.1", testHostname}, + {"10.0.1.2", "host1"}, + {"10.0.1.3", "host2"}, + }, + expectVirtualServer: true, + expectLocalEntries: true, + expectLocalRealServerNum: 3, + expectLocalRealServers: []string{ + "10.0.1.1:80", + "10.0.1.2:80", + "10.0.1.3:80", + }, + }, + { + name: "internalTrafficPolicy is cluster with zero local endpoints", + internalTrafficPolicy: &cluster, + endpoints: []endpoint{ + {"10.0.1.1", "host0"}, + {"10.0.1.2", "host1"}, + {"10.0.1.3", "host2"}, + }, + expectVirtualServer: false, + expectLocalEntries: false, + expectLocalRealServerNum: 3, + expectLocalRealServers: []string{ + "10.0.1.1:80", + "10.0.1.2:80", + "10.0.1.3:80", + }, + }, + { + name: "internalTrafficPolicy is local with non-zero local endpoints", + internalTrafficPolicy: &local, + endpoints: []endpoint{ + {"10.0.1.1", testHostname}, + {"10.0.1.2", "host1"}, + {"10.0.1.3", "host2"}, + }, + expectVirtualServer: true, + expectLocalEntries: true, + expectLocalRealServerNum: 1, + expectLocalRealServers: []string{ + "10.0.1.1:80", + }, + }, + { + name: "internalTrafficPolicy is local with zero local endpoints", + internalTrafficPolicy: &local, + endpoints: []endpoint{ + {"10.0.1.1", "host0"}, + {"10.0.1.2", "host1"}, + {"10.0.1.3", "host2"}, + }, + expectVirtualServer: false, + expectLocalEntries: false, + expectLocalRealServerNum: 0, + expectLocalRealServers: []string{}, + }, + } + for _, tc := range testCases { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServiceInternalTrafficPolicy, true)() + + ipt := iptablestest.NewFake() + ipvs := ipvstest.NewFake() + ipset := ipsettest.NewFake(testIPSetVersion) + fp := NewFakeProxier(ipt, ipvs, ipset, nil, nil, true, v1.IPv4Protocol) + fp.servicesSynced = true + fp.endpointsSynced = true + fp.endpointSlicesSynced = true + + // Add initial service + serviceName := "svc1" + namespaceName := "ns1" + + svc := &v1.Service{ + ObjectMeta: metav1.ObjectMeta{Name: serviceName, Namespace: namespaceName}, + Spec: v1.ServiceSpec{ + ClusterIP: "172.20.1.1", + Selector: map[string]string{"foo": "bar"}, + Ports: []v1.ServicePort{{Name: "", TargetPort: intstr.FromInt(80), Protocol: v1.ProtocolTCP}}, + }, + } + if tc.internalTrafficPolicy != nil { + svc.Spec.InternalTrafficPolicy = tc.internalTrafficPolicy + } + + fp.OnServiceAdd(svc) + + // Add initial endpoint slice + tcpProtocol := v1.ProtocolTCP + endpointSlice := &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("%s-1", serviceName), + Namespace: namespaceName, + Labels: map[string]string{discovery.LabelServiceName: serviceName}, + }, + Ports: []discovery.EndpointPort{{ + Name: utilpointer.StringPtr(""), + Port: utilpointer.Int32Ptr(80), + Protocol: &tcpProtocol, + }}, + AddressType: discovery.AddressTypeIPv4, + } + + for _, ep := range tc.endpoints { + endpointSlice.Endpoints = append(endpointSlice.Endpoints, discovery.Endpoint{ + Addresses: []string{ep.ip}, + Conditions: discovery.EndpointConditions{Ready: utilpointer.BoolPtr(true)}, + Topology: map[string]string{"kubernetes.io/hostname": ep.hostname}, + }) + } + + fp.OnEndpointSliceAdd(endpointSlice) + fp.syncProxyRules() + + // Ensure that Proxier updates ipvs appropriately after EndpointSlice update + assert.NotNil(t, fp.ipsetList["KUBE-LOOP-BACK"]) + + activeEntries1 := fp.ipsetList["KUBE-LOOP-BACK"].activeEntries + + if tc.expectLocalEntries { + assert.Equal(t, 1, activeEntries1.Len(), "Expected 1 active entry in KUBE-LOOP-BACK") + } else { + assert.Equal(t, 0, activeEntries1.Len(), "Expected no active entry in KUBE-LOOP-BACK") + } + + if tc.expectVirtualServer { + virtualServers1, vsErr1 := ipvs.GetVirtualServers() + assert.Nil(t, vsErr1, "Expected no error getting virtual servers") + + assert.Len(t, virtualServers1, 1, "Expected 1 virtual server") + realServers1, rsErr1 := ipvs.GetRealServers(virtualServers1[0]) + assert.Nil(t, rsErr1, "Expected no error getting real servers") + + assert.Len(t, realServers1, tc.expectLocalRealServerNum, fmt.Sprintf("Expected %d real servers", tc.expectLocalRealServerNum)) + for i := 0; i < tc.expectLocalRealServerNum; i++ { + assert.Equal(t, realServers1[i].String(), tc.expectLocalRealServers[i]) + } + } + + fp.OnEndpointSliceDelete(endpointSlice) + fp.syncProxyRules() + + // Ensure that Proxier updates ipvs appropriately after EndpointSlice delete + assert.NotNil(t, fp.ipsetList["KUBE-LOOP-BACK"]) + activeEntries3 := fp.ipsetList["KUBE-LOOP-BACK"].activeEntries + assert.Equal(t, 0, activeEntries3.Len(), "Expected 0 active entries in KUBE-LOOP-BACK") + virtualServers2, vsErr2 := ipvs.GetVirtualServers() + assert.Nil(t, vsErr2, "Expected no error getting virtual servers") + assert.Len(t, virtualServers2, 1, "Expected 1 virtual server") + realServers2, rsErr2 := ipvs.GetRealServers(virtualServers2[0]) + assert.Nil(t, rsErr2, "Expected no error getting real servers") + assert.Len(t, realServers2, 0, "Expected 0 real servers") + } +} diff --git a/pkg/proxy/service.go b/pkg/proxy/service.go index 32b1d0a74eba..a25ecc170417 100644 --- a/pkg/proxy/service.go +++ b/pkg/proxy/service.go @@ -28,8 +28,10 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/record" apiservice "k8s.io/kubernetes/pkg/api/v1/service" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/proxy/metrics" utilproxy "k8s.io/kubernetes/pkg/proxy/util" ) @@ -39,18 +41,20 @@ import ( // or can be used for constructing a more specific ServiceInfo struct // defined by the proxier if needed. type BaseServiceInfo struct { - clusterIP net.IP - port int - protocol v1.Protocol - nodePort int - loadBalancerStatus v1.LoadBalancerStatus - sessionAffinityType v1.ServiceAffinity - stickyMaxAgeSeconds int - externalIPs []string - loadBalancerSourceRanges []string - healthCheckNodePort int - onlyNodeLocalEndpoints bool - topologyKeys []string + clusterIP net.IP + port int + protocol v1.Protocol + nodePort int + loadBalancerStatus v1.LoadBalancerStatus + sessionAffinityType v1.ServiceAffinity + stickyMaxAgeSeconds int + externalIPs []string + loadBalancerSourceRanges []string + healthCheckNodePort int + onlyNodeLocalEndpoints bool + onlyNodeLocalEndpointsForInternal bool + internalTrafficPolicy *v1.ServiceInternalTrafficPolicyType + topologyKeys []string } var _ ServicePort = &BaseServiceInfo{} @@ -119,6 +123,16 @@ func (info *BaseServiceInfo) OnlyNodeLocalEndpoints() bool { return info.onlyNodeLocalEndpoints } +// OnlyNodeLocalEndpointsForInternal is part of ServicePort interface +func (info *BaseServiceInfo) OnlyNodeLocalEndpointsForInternal() bool { + return info.onlyNodeLocalEndpointsForInternal +} + +// InternalTrafficPolicy is part of ServicePort interface +func (info *BaseServiceInfo) InternalTrafficPolicy() *v1.ServiceInternalTrafficPolicyType { + return info.internalTrafficPolicy +} + // TopologyKeys is part of ServicePort interface. func (info *BaseServiceInfo) TopologyKeys() []string { return info.topologyKeys @@ -129,6 +143,10 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic if apiservice.RequestsOnlyLocalTraffic(service) { onlyNodeLocalEndpoints = true } + onlyNodeLocalEndpointsForInternal := false + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) { + onlyNodeLocalEndpointsForInternal = apiservice.RequestsOnlyLocalTrafficForInternal(service) + } var stickyMaxAgeSeconds int if service.Spec.SessionAffinity == v1.ServiceAffinityClientIP { // Kube-apiserver side guarantees SessionAffinityConfig won't be nil when session affinity type is ClientIP @@ -137,14 +155,16 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic clusterIP := utilproxy.GetClusterIPByFamily(sct.ipFamily, service) info := &BaseServiceInfo{ - clusterIP: net.ParseIP(clusterIP), - port: int(port.Port), - protocol: port.Protocol, - nodePort: int(port.NodePort), - sessionAffinityType: service.Spec.SessionAffinity, - stickyMaxAgeSeconds: stickyMaxAgeSeconds, - onlyNodeLocalEndpoints: onlyNodeLocalEndpoints, - topologyKeys: service.Spec.TopologyKeys, + clusterIP: net.ParseIP(clusterIP), + port: int(port.Port), + protocol: port.Protocol, + nodePort: int(port.NodePort), + sessionAffinityType: service.Spec.SessionAffinity, + stickyMaxAgeSeconds: stickyMaxAgeSeconds, + onlyNodeLocalEndpoints: onlyNodeLocalEndpoints, + onlyNodeLocalEndpointsForInternal: onlyNodeLocalEndpointsForInternal, + internalTrafficPolicy: service.Spec.InternalTrafficPolicy, + topologyKeys: service.Spec.TopologyKeys, } loadBalancerSourceRanges := make([]string, len(service.Spec.LoadBalancerSourceRanges)) diff --git a/pkg/proxy/topology.go b/pkg/proxy/topology.go index 9694774e700b..b272f3652575 100644 --- a/pkg/proxy/topology.go +++ b/pkg/proxy/topology.go @@ -18,6 +18,8 @@ package proxy import ( v1 "k8s.io/api/core/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/features" ) // FilterTopologyEndpoint returns the appropriate endpoints based on the cluster @@ -44,7 +46,7 @@ func FilterTopologyEndpoint(nodeLabels map[string]string, topologyKeys []string, return endpoints } - filteredEndpoint := []Endpoint{} + filteredEndpoints := []Endpoint{} if len(nodeLabels) == 0 { if topologyKeys[len(topologyKeys)-1] == v1.TopologyKeyAny { @@ -54,7 +56,7 @@ func FilterTopologyEndpoint(nodeLabels map[string]string, topologyKeys []string, } // edge case: do not include any endpoints if topology key "Any" is // not specified when we cannot determine current node's topology. - return filteredEndpoint + return filteredEndpoints } for _, key := range topologyKeys { @@ -69,12 +71,40 @@ func FilterTopologyEndpoint(nodeLabels map[string]string, topologyKeys []string, for _, ep := range endpoints { topology := ep.GetTopology() if value, found := topology[key]; found && value == topologyValue { - filteredEndpoint = append(filteredEndpoint, ep) + filteredEndpoints = append(filteredEndpoints, ep) } } - if len(filteredEndpoint) > 0 { - return filteredEndpoint + if len(filteredEndpoints) > 0 { + return filteredEndpoints } } - return filteredEndpoint + return filteredEndpoints +} + +// FilterLocalEndpoint returns the node local endpoints based on configured +// InternalTrafficPolicy. +// +// If ServiceInternalTrafficPolicy feature gate is off, returns the original +// endpoints slice. +// Otherwise, if InternalTrafficPolicy is Local, only return the node local endpoints. +func FilterLocalEndpoint(internalTrafficPolicy *v1.ServiceInternalTrafficPolicyType, endpoints []Endpoint) []Endpoint { + if !utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) { + return endpoints + } + if internalTrafficPolicy == nil || *internalTrafficPolicy == v1.ServiceInternalTrafficPolicyCluster { + return endpoints + } + + var filteredEndpoints []Endpoint + + // Get all the local endpoints + for _, ep := range endpoints { + if ep.GetIsLocal() { + filteredEndpoints = append(filteredEndpoints, ep) + } + } + + // When internalTrafficPolicy is Local, only return the node local + // endpoints + return filteredEndpoints } diff --git a/pkg/proxy/topology_test.go b/pkg/proxy/topology_test.go index c874e0217c10..9f501152f3ae 100644 --- a/pkg/proxy/topology_test.go +++ b/pkg/proxy/topology_test.go @@ -22,6 +22,9 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" + "k8s.io/kubernetes/pkg/features" ) func TestFilterTopologyEndpoint(t *testing.T) { @@ -476,3 +479,97 @@ func TestFilterTopologyEndpoint(t *testing.T) { }) } } + +func TestFilterLocalEndpoint(t *testing.T) { + cluster := v1.ServiceInternalTrafficPolicyCluster + local := v1.ServiceInternalTrafficPolicyLocal + + testCases := []struct { + name string + internalTrafficPolicy *v1.ServiceInternalTrafficPolicyType + endpoints []Endpoint + expected []Endpoint + featureGateOn bool + }{ + { + name: "no internalTrafficPolicy with empty endpoints", + internalTrafficPolicy: nil, + endpoints: []Endpoint{}, + expected: []Endpoint{}, + featureGateOn: true, + }, + { + name: "no internalTrafficPolicy with non-empty endpoints", + internalTrafficPolicy: nil, + endpoints: []Endpoint{ + &BaseEndpointInfo{Endpoint: "10.0.0.0:80", IsLocal: true}, + &BaseEndpointInfo{Endpoint: "10.0.0.1:80", IsLocal: false}, + }, + expected: []Endpoint{ + &BaseEndpointInfo{Endpoint: "10.0.0.0:80", IsLocal: true}, + &BaseEndpointInfo{Endpoint: "10.0.0.1:80", IsLocal: false}, + }, + featureGateOn: true, + }, + { + name: "internalTrafficPolicy is cluster", + internalTrafficPolicy: &cluster, + endpoints: []Endpoint{ + &BaseEndpointInfo{Endpoint: "10.0.0.0:80", IsLocal: true}, + &BaseEndpointInfo{Endpoint: "10.0.0.1:80", IsLocal: false}, + }, + expected: []Endpoint{ + &BaseEndpointInfo{Endpoint: "10.0.0.0:80", IsLocal: true}, + &BaseEndpointInfo{Endpoint: "10.0.0.1:80", IsLocal: false}, + }, + featureGateOn: true, + }, + { + name: "internalTrafficPolicy is local with non-zero local endpoints", + internalTrafficPolicy: &local, + endpoints: []Endpoint{ + &BaseEndpointInfo{Endpoint: "10.0.0.0:80", IsLocal: true}, + &BaseEndpointInfo{Endpoint: "10.0.0.1:80", IsLocal: false}, + }, + expected: []Endpoint{ + &BaseEndpointInfo{Endpoint: "10.0.0.0:80", IsLocal: true}, + }, + featureGateOn: true, + }, + { + name: "internalTrafficPolicy is local with zero local endpoints", + internalTrafficPolicy: &local, + endpoints: []Endpoint{ + &BaseEndpointInfo{Endpoint: "10.0.0.0:80", IsLocal: false}, + &BaseEndpointInfo{Endpoint: "10.0.0.1:80", IsLocal: false}, + &BaseEndpointInfo{Endpoint: "10.0.0.2:80", IsLocal: false}, + }, + expected: nil, + featureGateOn: true, + }, + { + name: "feature gate is off, internalTrafficPolicy is local with non-empty endpoints", + internalTrafficPolicy: &local, + endpoints: []Endpoint{ + &BaseEndpointInfo{Endpoint: "10.0.0.0:80", IsLocal: true}, + &BaseEndpointInfo{Endpoint: "10.0.0.1:80", IsLocal: false}, + &BaseEndpointInfo{Endpoint: "10.0.0.2:80", IsLocal: false}, + }, + expected: []Endpoint{ + &BaseEndpointInfo{Endpoint: "10.0.0.0:80", IsLocal: true}, + &BaseEndpointInfo{Endpoint: "10.0.0.1:80", IsLocal: false}, + &BaseEndpointInfo{Endpoint: "10.0.0.2:80", IsLocal: false}, + }, + featureGateOn: false, + }, + } + for _, tc := range testCases { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServiceInternalTrafficPolicy, tc.featureGateOn)() + t.Run(tc.name, func(t *testing.T) { + filteredEndpoint := FilterLocalEndpoint(tc.internalTrafficPolicy, tc.endpoints) + if !reflect.DeepEqual(filteredEndpoint, tc.expected) { + t.Errorf("expected %v, got %v", tc.expected, filteredEndpoint) + } + }) + } +} diff --git a/pkg/proxy/types.go b/pkg/proxy/types.go index 96ccb4032952..d88f2f826fff 100644 --- a/pkg/proxy/types.go +++ b/pkg/proxy/types.go @@ -85,6 +85,10 @@ type ServicePort interface { NodePort() int // GetOnlyNodeLocalEndpoints returns if a service has only node local endpoints OnlyNodeLocalEndpoints() bool + // OnlyNodeLocalEndpointsForInternal returns if a service prefers routing to node local endpoints for internal traffic + OnlyNodeLocalEndpointsForInternal() bool + // InternalTrafficPolicy returns service InternalTrafficPolicy + InternalTrafficPolicy() *v1.ServiceInternalTrafficPolicyType // TopologyKeys returns service TopologyKeys as a string array. TopologyKeys() []string } diff --git a/pkg/registry/core/service/strategy.go b/pkg/registry/core/service/strategy.go index 6ff69cb5a320..e3c31dee967c 100644 --- a/pkg/registry/core/service/strategy.go +++ b/pkg/registry/core/service/strategy.go @@ -156,7 +156,7 @@ func dropServiceDisabledFields(newSvc *api.Service, oldSvc *api.Service) { newSvc.Spec.TopologyKeys = nil } - // Clear AllocateLoadBalancerNodePorts if ServiceLBNodePortControl if not enabled + // Clear AllocateLoadBalancerNodePorts if ServiceLBNodePortControl is not enabled if !utilfeature.DefaultFeatureGate.Enabled(features.ServiceLBNodePortControl) { if !allocateLoadBalancerNodePortsInUse(oldSvc) { newSvc.Spec.AllocateLoadBalancerNodePorts = nil @@ -180,6 +180,13 @@ func dropServiceDisabledFields(newSvc *api.Service, oldSvc *api.Service) { newSvc.Spec.LoadBalancerClass = nil } } + + // Clear InternalTrafficPolicy if not enabled + if !utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) { + if !serviceInternalTrafficPolicyInUse(oldSvc) { + newSvc.Spec.InternalTrafficPolicy = nil + } + } } // returns true if svc.Spec.AllocateLoadBalancerNodePorts field is in use @@ -240,6 +247,13 @@ func loadBalancerClassInUse(svc *api.Service) bool { return svc.Spec.LoadBalancerClass != nil } +func serviceInternalTrafficPolicyInUse(svc *api.Service) bool { + if svc == nil { + return false + } + return svc.Spec.InternalTrafficPolicy != nil +} + type serviceStatusStrategy struct { Strategy } diff --git a/pkg/registry/core/service/strategy_test.go b/pkg/registry/core/service/strategy_test.go index c39172100907..84c8ba2668b8 100644 --- a/pkg/registry/core/service/strategy_test.go +++ b/pkg/registry/core/service/strategy_test.go @@ -257,19 +257,30 @@ func makeServiceWithLoadBalancerClass(loadBalancerClass *string) *api.Service { } } +func makeServiceWithInternalTrafficPolicy(policy *api.ServiceInternalTrafficPolicyType) *api.Service { + return &api.Service{ + Spec: api.ServiceSpec{ + InternalTrafficPolicy: policy, + }, + } +} + func TestDropDisabledField(t *testing.T) { requireDualStack := api.IPFamilyPolicyRequireDualStack preferDualStack := api.IPFamilyPolicyPreferDualStack singleStack := api.IPFamilyPolicySingleStack + localInternalTrafficPolicy := api.ServiceInternalTrafficPolicyLocal + testCases := []struct { - name string - enableDualStack bool - enableMixedProtocol bool - enableLoadBalancerClass bool - svc *api.Service - oldSvc *api.Service - compareSvc *api.Service + name string + enableDualStack bool + enableMixedProtocol bool + enableLoadBalancerClass bool + enableInternalTrafficPolicy bool + svc *api.Service + oldSvc *api.Service + compareSvc *api.Service }{ { name: "not dual stack, field not used", @@ -500,6 +511,28 @@ func TestDropDisabledField(t *testing.T) { oldSvc: makeServiceWithLoadBalancerClass(utilpointer.StringPtr("test.com/test")), compareSvc: makeServiceWithLoadBalancerClass(nil), }, + /* svc.spec.internalTrafficPolicy */ + { + name: "internal traffic policy not enabled, field used in old, not used in new", + enableInternalTrafficPolicy: false, + svc: makeServiceWithInternalTrafficPolicy(nil), + oldSvc: makeServiceWithInternalTrafficPolicy(&localInternalTrafficPolicy), + compareSvc: makeServiceWithInternalTrafficPolicy(nil), + }, + { + name: "internal traffic policy not enabled, field not used in old, used in new", + enableInternalTrafficPolicy: false, + svc: makeServiceWithInternalTrafficPolicy(&localInternalTrafficPolicy), + oldSvc: makeServiceWithInternalTrafficPolicy(nil), + compareSvc: makeServiceWithInternalTrafficPolicy(nil), + }, + { + name: "internal traffic policy enabled, field not used in old, used in new", + enableInternalTrafficPolicy: true, + svc: makeServiceWithInternalTrafficPolicy(&localInternalTrafficPolicy), + oldSvc: makeServiceWithInternalTrafficPolicy(nil), + compareSvc: makeServiceWithInternalTrafficPolicy(&localInternalTrafficPolicy), + }, /* add more tests for other dropped fields as needed */ } for _, tc := range testCases { @@ -507,12 +540,13 @@ func TestDropDisabledField(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.IPv6DualStack, tc.enableDualStack)() defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.MixedProtocolLBService, tc.enableMixedProtocol)() defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServiceLoadBalancerClass, tc.enableLoadBalancerClass)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServiceInternalTrafficPolicy, tc.enableInternalTrafficPolicy)() old := tc.oldSvc.DeepCopy() // to test against user using IPFamily not set on cluster dropServiceDisabledFields(tc.svc, tc.oldSvc) - // old node should never be changed + // old node should never be changed if !reflect.DeepEqual(tc.oldSvc, old) { t.Errorf("%v: old svc changed: %v", tc.name, diff.ObjectReflectDiff(tc.oldSvc, old)) } diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 563217a42921..e759f00b8cdb 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -3940,6 +3940,19 @@ const ( ServiceTypeExternalName ServiceType = "ExternalName" ) +// ServiceInternalTrafficPolicyType describes the type of traffic routing for +// internal traffic +type ServiceInternalTrafficPolicyType string + +const ( + // ServiceInternalTrafficPolicyCluster routes traffic to all endpoints + ServiceInternalTrafficPolicyCluster ServiceInternalTrafficPolicyType = "Cluster" + + // ServiceInternalTrafficPolicyLocal only routes to node-local + // endpoints, otherwise drops the traffic + ServiceInternalTrafficPolicyLocal ServiceInternalTrafficPolicyType = "Local" +) + // Service External Traffic Policy Type string type ServiceExternalTrafficPolicyType string @@ -4272,9 +4285,19 @@ type ServiceSpec struct { // 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. - // featureGate=LoadBalancerClass + // +featureGate=LoadBalancerClass // +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". + // +featureGate=ServiceInternalTrafficPolicy + // +optional + InternalTrafficPolicy *ServiceInternalTrafficPolicyType `json:"internalTrafficPolicy,omitempty" protobuf:"bytes,22,opt,name=internalTrafficPolicy"` } // ServicePort contains information on service's port. diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index 5ccdaffd0fa0..9cef7c2100f8 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -2258,6 +2258,7 @@ var map_ServiceSpec = map[string]string{ "ipFamilyPolicy": "IPFamilyPolicy represents the dual-stack-ness requested or required by this Service, and is gated by the \"IPv6DualStack\" feature gate. 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. allocateLoadBalancerNodePorts may only be set for services with type LoadBalancer and will be cleared if the type is changed to any other type. This field is alpha-level and is only honored by servers that enable the ServiceLBNodePortControl feature.", "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. featureGate=LoadBalancerClass", + "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. featureGate=ServiceInternalTrafficPolicy", } func (ServiceSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index 79e3c7af00a9..6cb291b71be9 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -5350,6 +5350,11 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { *out = new(string) **out = **in } + if in.InternalTrafficPolicy != nil { + in, out := &in.InternalTrafficPolicy, &out.InternalTrafficPolicy + *out = new(ServiceInternalTrafficPolicyType) + **out = **in + } return } diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.json index 8d1a56da22a4..52ea73086ef8 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.json @@ -84,7 +84,8 @@ ], "ipFamilyPolicy": "9ȫŚ", "allocateLoadBalancerNodePorts": true, - "loadBalancerClass": "31" + "loadBalancerClass": "31", + "internalTrafficPolicy": "" }, "status": { "loadBalancer": { @@ -94,8 +95,8 @@ "hostname": "33", "ports": [ { - "port": -907310967, - "protocol": "喂ƈ斎AO6", + "port": 684408190, + "protocol": "ƈ斎AO6ĴC浔Ű", "error": "34" } ] @@ -105,9 +106,9 @@ "conditions": [ { "type": "35", - "status": "C", - "observedGeneration": -2492120148461555858, - "lastTransitionTime": "2392-12-09T15:37:55Z", + "status": "ž(-譵", + "observedGeneration": -8651056334266075769, + "lastTransitionTime": "2404-01-10T11:35:42Z", "reason": "36", "message": "37" } diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.pb index 9d52060f2a15dccdb989f71a325f956dbde07821..eff2532121d40eca4385ba202101ab64ebe63343 100644 GIT binary patch delta 104 zcmV-u0GI!S1d0TZ6anzD6`BECRthKzCJF*GG7$Sm_!_oMM0U`(pj{1OuGY|kO0y8!; K0y8%n03rZj%_HLg delta 98 zcmeBTXV=q$$204@zKH7+J&BOxYZVJ|M?FDj6&Q`r!^hxcs8xi z(cesp$=F0l1*pzch|yW%-M!bV?(FT|dY4g&gX8jznRg5Y7_^v-&5W3g&7~NW7yzaP BA-(_r diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.yaml index 3e51ddd5b70e..863435cefd34 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.yaml @@ -39,6 +39,7 @@ spec: externalName: "29" externalTrafficPolicy: ƏS$+½H牗洝尿 healthCheckNodePort: -1965738697 + internalTrafficPolicy: "" ipFamilies: - 斬³;Ơ歿:狞夌碕ʂɭîcP$Iņɖ ipFamilyPolicy: 9ȫŚ @@ -65,11 +66,11 @@ spec: type: 鮽ort昍řČ扷5ƗǸƢ6/ʕVŚ(Ŀ status: conditions: - - lastTransitionTime: "2392-12-09T15:37:55Z" + - lastTransitionTime: "2404-01-10T11:35:42Z" message: "37" - observedGeneration: -2492120148461555858 + observedGeneration: -8651056334266075769 reason: "36" - status: C + status: ž(-譵 type: "35" loadBalancer: ingress: @@ -77,5 +78,5 @@ status: ip: "32" ports: - error: "34" - port: -907310967 - protocol: 喂ƈ斎AO6 + port: 684408190 + protocol: ƈ斎AO6ĴC浔Ű diff --git a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go index 691622860092..99361cecf067 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go @@ -44,6 +44,7 @@ type ServiceSpecApplyConfiguration struct { IPFamilyPolicy *corev1.IPFamilyPolicyType `json:"ipFamilyPolicy,omitempty"` AllocateLoadBalancerNodePorts *bool `json:"allocateLoadBalancerNodePorts,omitempty"` LoadBalancerClass *string `json:"loadBalancerClass,omitempty"` + InternalTrafficPolicy *corev1.ServiceInternalTrafficPolicyType `json:"internalTrafficPolicy,omitempty"` } // ServiceSpecApplyConfiguration constructs an declarative configuration of the ServiceSpec type for use with @@ -224,3 +225,11 @@ func (b *ServiceSpecApplyConfiguration) WithLoadBalancerClass(value string) *Ser b.LoadBalancerClass = &value return b } + +// WithInternalTrafficPolicy sets the InternalTrafficPolicy 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 InternalTrafficPolicy field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithInternalTrafficPolicy(value corev1.ServiceInternalTrafficPolicyType) *ServiceSpecApplyConfiguration { + b.InternalTrafficPolicy = &value + return b +} From 0621e90d31b03f9628222a9abd3f0a9f1350b99a Mon Sep 17 00:00:00 2001 From: Fangyuan Li Date: Fri, 5 Mar 2021 15:01:50 -0800 Subject: [PATCH 2/3] Rename fields and methods for BaseServiceInfo Fields: 1. rename onlyNodeLocalEndpoints to nodeLocalExternal; 2. rename onlyNodeLocalEndpointsForInternal to nodeLocalInternal; Methods: 1. rename OnlyNodeLocalEndpoints to NodeLocalExternal; 2. rename OnlyNodeLocalEndpointsForInternal to NodeLocalInternal; --- pkg/proxy/iptables/proxier.go | 16 ++++----- pkg/proxy/ipvs/proxier.go | 16 ++++----- pkg/proxy/service.go | 68 +++++++++++++++++------------------ pkg/proxy/types.go | 8 ++--- 4 files changed, 54 insertions(+), 54 deletions(-) diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 4dafa162167b..292e05aa8522 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -1025,7 +1025,7 @@ func (proxier *Proxier) syncProxyRules() { // 2. ServiceTopology is not enabled. // 3. EndpointSlice is not enabled (service topology depends on endpoint slice // to get topology information). - if !svcInfo.OnlyNodeLocalEndpoints() && utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) && utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying) { + if !svcInfo.NodeLocalExternal() && utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) && utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying) { allEndpoints = proxy.FilterTopologyEndpoint(proxier.nodeLabels, svcInfo.TopologyKeys(), allEndpoints) } @@ -1033,7 +1033,7 @@ func (proxier *Proxier) syncProxyRules() { // following are true: // 1. InternalTrafficPolicy is Local // 2. ServiceInternalTrafficPolicy feature gate is on - if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) && svcInfo.OnlyNodeLocalEndpointsForInternal() { + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) && svcInfo.NodeLocalInternal() { allEndpoints = proxy.FilterLocalEndpoint(svcInfo.InternalTrafficPolicy(), allEndpoints) } readyEndpoints := make([]proxy.Endpoint, 0, len(allEndpoints)) @@ -1058,7 +1058,7 @@ func (proxier *Proxier) syncProxyRules() { } svcXlbChain := svcInfo.serviceLBChainName - if svcInfo.OnlyNodeLocalEndpoints() { + if svcInfo.NodeLocalExternal() { // Only for services request OnlyLocal traffic // create the per-service LB chain, retaining counters if possible. if lbChain, ok := existingNATChains[svcXlbChain]; ok { @@ -1151,7 +1151,7 @@ func (proxier *Proxier) syncProxyRules() { // and the traffic is NOT Local. Local traffic coming from Pods and Nodes will // be always forwarded to the corresponding Service, so no need to SNAT // If we can't differentiate the local traffic we always SNAT. - if !svcInfo.OnlyNodeLocalEndpoints() { + if !svcInfo.NodeLocalExternal() { destChain = svcChain // This masquerades off-cluster traffic to a External IP. if proxier.localDetector.IsImplemented() { @@ -1211,7 +1211,7 @@ func (proxier *Proxier) syncProxyRules() { chosenChain := svcXlbChain // If we are proxying globally, we need to masquerade in case we cross nodes. // If we are proxying only locally, we can retain the source IP. - if !svcInfo.OnlyNodeLocalEndpoints() { + if !svcInfo.NodeLocalExternal() { utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) chosenChain = svcChain } @@ -1308,7 +1308,7 @@ func (proxier *Proxier) syncProxyRules() { "-m", protocol, "-p", protocol, "--dport", strconv.Itoa(svcInfo.NodePort()), ) - if !svcInfo.OnlyNodeLocalEndpoints() { + if !svcInfo.NodeLocalExternal() { // Nodeports need SNAT, unless they're local. utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) // Jump to the service chain. @@ -1402,7 +1402,7 @@ func (proxier *Proxier) syncProxyRules() { localEndpointChains := make([]utiliptables.Chain, 0) for i, endpointChain := range endpointChains { // Write ingress loadbalancing & DNAT rules only for services that request OnlyLocal traffic. - if svcInfo.OnlyNodeLocalEndpoints() && endpoints[i].IsLocal { + if svcInfo.NodeLocalExternal() && endpoints[i].IsLocal { localEndpointChains = append(localEndpointChains, endpointChains[i]) } @@ -1443,7 +1443,7 @@ func (proxier *Proxier) syncProxyRules() { } // The logic below this applies only if this service is marked as OnlyLocal - if !svcInfo.OnlyNodeLocalEndpoints() { + if !svcInfo.NodeLocalExternal() { continue } diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index e084458db2da..2656b52caa20 100644 --- a/pkg/proxy/ipvs/proxier.go +++ b/pkg/proxy/ipvs/proxier.go @@ -1236,7 +1236,7 @@ func (proxier *Proxier) syncProxyRules() { activeBindAddrs[serv.Address.String()] = true // ExternalTrafficPolicy only works for NodePort and external LB traffic, does not affect ClusterIP // So we still need clusterIP rules in onlyNodeLocalEndpoints mode. - if err := proxier.syncEndpoint(svcName, false, svcInfo.OnlyNodeLocalEndpointsForInternal(), serv); err != nil { + if err := proxier.syncEndpoint(svcName, false, svcInfo.NodeLocalInternal(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -1288,7 +1288,7 @@ func (proxier *Proxier) syncProxyRules() { SetType: utilipset.HashIPPort, } - if svcInfo.OnlyNodeLocalEndpoints() { + if svcInfo.NodeLocalExternal() { if valid := proxier.ipsetList[kubeExternalIPLocalSet].validateEntry(entry); !valid { klog.Errorf("%s", fmt.Sprintf(EntryInvalidErr, entry, proxier.ipsetList[kubeExternalIPLocalSet].Name)) continue @@ -1318,8 +1318,8 @@ func (proxier *Proxier) syncProxyRules() { activeIPVSServices[serv.String()] = true activeBindAddrs[serv.Address.String()] = true - onlyNodeLocalEndpoints := svcInfo.OnlyNodeLocalEndpoints() - onlyNodeLocalEndpointsForInternal := svcInfo.OnlyNodeLocalEndpointsForInternal() + onlyNodeLocalEndpoints := svcInfo.NodeLocalExternal() + onlyNodeLocalEndpointsForInternal := svcInfo.NodeLocalInternal() if err := proxier.syncEndpoint(svcName, onlyNodeLocalEndpoints, onlyNodeLocalEndpointsForInternal, serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } @@ -1348,7 +1348,7 @@ func (proxier *Proxier) syncProxyRules() { } proxier.ipsetList[kubeLoadBalancerSet].activeEntries.Insert(entry.String()) // insert loadbalancer entry to lbIngressLocalSet if service externaltrafficpolicy=local - if svcInfo.OnlyNodeLocalEndpoints() { + if svcInfo.NodeLocalExternal() { if valid := proxier.ipsetList[kubeLoadBalancerLocalSet].validateEntry(entry); !valid { klog.Errorf("%s", fmt.Sprintf(EntryInvalidErr, entry, proxier.ipsetList[kubeLoadBalancerLocalSet].Name)) continue @@ -1421,7 +1421,7 @@ func (proxier *Proxier) syncProxyRules() { if err := proxier.syncService(svcNameString, serv, true, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true activeBindAddrs[serv.Address.String()] = true - if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), svcInfo.OnlyNodeLocalEndpointsForInternal(), serv); err != nil { + if err := proxier.syncEndpoint(svcName, svcInfo.NodeLocalExternal(), svcInfo.NodeLocalInternal(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -1535,7 +1535,7 @@ func (proxier *Proxier) syncProxyRules() { } // Add externaltrafficpolicy=local type nodeport entry - if svcInfo.OnlyNodeLocalEndpoints() { + if svcInfo.NodeLocalExternal() { var nodePortLocalSet *IPSet switch protocol { case utilipset.ProtocolTCP: @@ -1580,7 +1580,7 @@ func (proxier *Proxier) syncProxyRules() { // There is no need to bind Node IP to dummy interface, so set parameter `bindAddr` to `false`. if err := proxier.syncService(svcNameString, serv, false, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true - if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), svcInfo.OnlyNodeLocalEndpointsForInternal(), serv); err != nil { + if err := proxier.syncEndpoint(svcName, svcInfo.NodeLocalExternal(), svcInfo.NodeLocalInternal(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { diff --git a/pkg/proxy/service.go b/pkg/proxy/service.go index a25ecc170417..a78930944a14 100644 --- a/pkg/proxy/service.go +++ b/pkg/proxy/service.go @@ -41,20 +41,20 @@ import ( // or can be used for constructing a more specific ServiceInfo struct // defined by the proxier if needed. type BaseServiceInfo struct { - clusterIP net.IP - port int - protocol v1.Protocol - nodePort int - loadBalancerStatus v1.LoadBalancerStatus - sessionAffinityType v1.ServiceAffinity - stickyMaxAgeSeconds int - externalIPs []string - loadBalancerSourceRanges []string - healthCheckNodePort int - onlyNodeLocalEndpoints bool - onlyNodeLocalEndpointsForInternal bool - internalTrafficPolicy *v1.ServiceInternalTrafficPolicyType - topologyKeys []string + clusterIP net.IP + port int + protocol v1.Protocol + nodePort int + loadBalancerStatus v1.LoadBalancerStatus + sessionAffinityType v1.ServiceAffinity + stickyMaxAgeSeconds int + externalIPs []string + loadBalancerSourceRanges []string + healthCheckNodePort int + nodeLocalExternal bool + nodeLocalInternal bool + internalTrafficPolicy *v1.ServiceInternalTrafficPolicyType + topologyKeys []string } var _ ServicePort = &BaseServiceInfo{} @@ -118,14 +118,14 @@ func (info *BaseServiceInfo) LoadBalancerIPStrings() []string { return ips } -// OnlyNodeLocalEndpoints is part of ServicePort interface. -func (info *BaseServiceInfo) OnlyNodeLocalEndpoints() bool { - return info.onlyNodeLocalEndpoints +// NodeLocalExternal is part of ServicePort interface. +func (info *BaseServiceInfo) NodeLocalExternal() bool { + return info.nodeLocalExternal } -// OnlyNodeLocalEndpointsForInternal is part of ServicePort interface -func (info *BaseServiceInfo) OnlyNodeLocalEndpointsForInternal() bool { - return info.onlyNodeLocalEndpointsForInternal +// NodeLocalInternal is part of ServicePort interface +func (info *BaseServiceInfo) NodeLocalInternal() bool { + return info.nodeLocalInternal } // InternalTrafficPolicy is part of ServicePort interface @@ -139,13 +139,13 @@ func (info *BaseServiceInfo) TopologyKeys() []string { } func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, service *v1.Service) *BaseServiceInfo { - onlyNodeLocalEndpoints := false + nodeLocalExternal := false if apiservice.RequestsOnlyLocalTraffic(service) { - onlyNodeLocalEndpoints = true + nodeLocalExternal = true } - onlyNodeLocalEndpointsForInternal := false + nodeLocalInternal := false if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) { - onlyNodeLocalEndpointsForInternal = apiservice.RequestsOnlyLocalTrafficForInternal(service) + nodeLocalInternal = apiservice.RequestsOnlyLocalTrafficForInternal(service) } var stickyMaxAgeSeconds int if service.Spec.SessionAffinity == v1.ServiceAffinityClientIP { @@ -155,16 +155,16 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic clusterIP := utilproxy.GetClusterIPByFamily(sct.ipFamily, service) info := &BaseServiceInfo{ - clusterIP: net.ParseIP(clusterIP), - port: int(port.Port), - protocol: port.Protocol, - nodePort: int(port.NodePort), - sessionAffinityType: service.Spec.SessionAffinity, - stickyMaxAgeSeconds: stickyMaxAgeSeconds, - onlyNodeLocalEndpoints: onlyNodeLocalEndpoints, - onlyNodeLocalEndpointsForInternal: onlyNodeLocalEndpointsForInternal, - internalTrafficPolicy: service.Spec.InternalTrafficPolicy, - topologyKeys: service.Spec.TopologyKeys, + clusterIP: net.ParseIP(clusterIP), + port: int(port.Port), + protocol: port.Protocol, + nodePort: int(port.NodePort), + sessionAffinityType: service.Spec.SessionAffinity, + stickyMaxAgeSeconds: stickyMaxAgeSeconds, + nodeLocalExternal: nodeLocalExternal, + nodeLocalInternal: nodeLocalInternal, + internalTrafficPolicy: service.Spec.InternalTrafficPolicy, + topologyKeys: service.Spec.TopologyKeys, } loadBalancerSourceRanges := make([]string, len(service.Spec.LoadBalancerSourceRanges)) diff --git a/pkg/proxy/types.go b/pkg/proxy/types.go index d88f2f826fff..9085bf0c7434 100644 --- a/pkg/proxy/types.go +++ b/pkg/proxy/types.go @@ -83,10 +83,10 @@ type ServicePort interface { HealthCheckNodePort() int // GetNodePort returns a service Node port if present. If return 0, it means not present. NodePort() int - // GetOnlyNodeLocalEndpoints returns if a service has only node local endpoints - OnlyNodeLocalEndpoints() bool - // OnlyNodeLocalEndpointsForInternal returns if a service prefers routing to node local endpoints for internal traffic - OnlyNodeLocalEndpointsForInternal() bool + // NodeLocalExternal returns if a service has only node local endpoints for external traffic. + NodeLocalExternal() bool + // NodeLocalInternal returns if a service has only node local endpoints for internal traffic. + NodeLocalInternal() bool // InternalTrafficPolicy returns service InternalTrafficPolicy InternalTrafficPolicy() *v1.ServiceInternalTrafficPolicyType // TopologyKeys returns service TopologyKeys as a string array. From 62804c1ae8762938e4f708f3d6e0408aa47d7020 Mon Sep 17 00:00:00 2001 From: Fangyuan Li Date: Fri, 5 Mar 2021 16:45:18 -0800 Subject: [PATCH 3/3] Update generated files 1. `git clean -fxd` 2. `make update` --- api/openapi-spec/swagger.json | 2803 +---------------- .../src/k8s.io/api/core/v1/generated.pb.go | 1806 +++++------ .../src/k8s.io/api/core/v1/generated.proto | 12 +- .../core/v1/types_swagger_doc_generated.go | 4 +- .../api/testdata/HEAD/core.v1.Service.pb | Bin 522 -> 525 bytes 5 files changed, 1063 insertions(+), 3562 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index ffa5ffd80ab8..39807afb6632 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -10383,7 +10383,7 @@ "type": "integer" }, "internalTrafficPolicy": { - "description": "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. featureGate=ServiceInternalTrafficPolicy", + "description": "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\".", "type": "string" }, "ipFamilies": { @@ -10399,7 +10399,7 @@ "type": "string" }, "loadBalancerClass": { - "description": "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. featureGate=LoadBalancerClass", + "description": "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.", "type": "string" }, "loadBalancerIP": { @@ -11795,552 +11795,6 @@ }, "type": "object" }, - "io.k8s.api.flowcontrol.v1alpha1.FlowDistinguisherMethod": { - "description": "FlowDistinguisherMethod specifies the method of a flow distinguisher.", - "properties": { - "type": { - "description": "`type` is the type of flow distinguisher method The supported types are \"ByUser\" and \"ByNamespace\". Required.", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.FlowSchema": { - "description": "FlowSchema defines the schema of a group of flows. Note that a flow is made up of a set of inbound API requests with similar attributes and is identified by a pair of strings: the name of the FlowSchema and a \"flow distinguisher\".", - "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": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", - "description": "`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - }, - "spec": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchemaSpec", - "description": "`spec` is the specification of the desired behavior of a FlowSchema. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - }, - "status": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchemaStatus", - "description": "`status` is the current status of a FlowSchema. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - } - }, - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - ] - }, - "io.k8s.api.flowcontrol.v1alpha1.FlowSchemaCondition": { - "description": "FlowSchemaCondition describes conditions for a FlowSchema.", - "properties": { - "lastTransitionTime": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", - "description": "`lastTransitionTime` is the last time the condition transitioned from one status to another." - }, - "message": { - "description": "`message` is a human-readable message indicating details about last transition.", - "type": "string" - }, - "reason": { - "description": "`reason` is a unique, one-word, CamelCase reason for the condition's last transition.", - "type": "string" - }, - "status": { - "description": "`status` is the status of the condition. Can be True, False, Unknown. Required.", - "type": "string" - }, - "type": { - "description": "`type` is the type of the condition. Required.", - "type": "string" - } - }, - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.FlowSchemaList": { - "description": "FlowSchemaList is a list of FlowSchema objects.", - "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" - }, - "items": { - "description": "`items` is a list of FlowSchemas.", - "items": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - }, - "type": "array" - }, - "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": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", - "description": "`metadata` is the standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - } - }, - "required": [ - "items" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchemaList", - "version": "v1alpha1" - } - ] - }, - "io.k8s.api.flowcontrol.v1alpha1.FlowSchemaSpec": { - "description": "FlowSchemaSpec describes how the FlowSchema's specification looks like.", - "properties": { - "distinguisherMethod": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowDistinguisherMethod", - "description": "`distinguisherMethod` defines how to compute the flow distinguisher for requests that match this schema. `nil` specifies that the distinguisher is disabled and thus will always be the empty string." - }, - "matchingPrecedence": { - "description": "`matchingPrecedence` is used to choose among the FlowSchemas that match a given request. The chosen FlowSchema is among those with the numerically lowest (which we take to be logically highest) MatchingPrecedence. Each MatchingPrecedence value must be ranged in [1,10000]. Note that if the precedence is not specified, it will be set to 1000 as default.", - "format": "int32", - "type": "integer" - }, - "priorityLevelConfiguration": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationReference", - "description": "`priorityLevelConfiguration` should reference a PriorityLevelConfiguration in the cluster. If the reference cannot be resolved, the FlowSchema will be ignored and marked as invalid in its status. Required." - }, - "rules": { - "description": "`rules` describes which requests will match this flow schema. This FlowSchema matches a request if and only if at least one member of rules matches the request. if it is an empty slice, there will be no requests matching the FlowSchema.", - "items": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PolicyRulesWithSubjects" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - } - }, - "required": [ - "priorityLevelConfiguration" - ], - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.FlowSchemaStatus": { - "description": "FlowSchemaStatus represents the current state of a FlowSchema.", - "properties": { - "conditions": { - "description": "`conditions` is a list of the current states of FlowSchema.", - "items": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchemaCondition" - }, - "type": "array", - "x-kubernetes-list-map-keys": [ - "type" - ], - "x-kubernetes-list-type": "map" - } - }, - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.GroupSubject": { - "description": "GroupSubject holds detailed information for group-kind subject.", - "properties": { - "name": { - "description": "name is the user group that matches, or \"*\" to match all user groups. See https://github.com/kubernetes/apiserver/blob/master/pkg/authentication/user/user.go for some well-known group names. Required.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.LimitResponse": { - "description": "LimitResponse defines how to handle requests that can not be executed right now.", - "properties": { - "queuing": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.QueuingConfiguration", - "description": "`queuing` holds the configuration parameters for queuing. This field may be non-empty only if `type` is `\"Queue\"`." - }, - "type": { - "description": "`type` is \"Queue\" or \"Reject\". \"Queue\" means that requests that can not be executed upon arrival are held in a queue until they can be executed or a queuing limit is reached. \"Reject\" means that requests that can not be executed upon arrival are rejected. Required.", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object", - "x-kubernetes-unions": [ - { - "discriminator": "type", - "fields-to-discriminateBy": { - "queuing": "Queuing" - } - } - ] - }, - "io.k8s.api.flowcontrol.v1alpha1.LimitedPriorityLevelConfiguration": { - "description": "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?", - "properties": { - "assuredConcurrencyShares": { - "description": "`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) --- the number of requests that may be executing at a time --- for each such priority level:\n\n ACV(l) = ceil( SCL * ACS(l) / ( sum[priority levels k] ACS(k) ) )\n\nbigger numbers of ACS mean more reserved concurrent requests (at the expense of every other PL). This field has a default value of 30.", - "format": "int32", - "type": "integer" - }, - "limitResponse": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.LimitResponse", - "description": "`limitResponse` indicates what to do with requests that can not be executed right now" - } - }, - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.NonResourcePolicyRule": { - "description": "NonResourcePolicyRule is a predicate that matches non-resource requests according to their verb and the target non-resource URL. A NonResourcePolicyRule matches a request if and only if both (a) at least one member of verbs matches the request and (b) at least one member of nonResourceURLs matches the request.", - "properties": { - "nonResourceURLs": { - "description": "`nonResourceURLs` is a set of url prefixes that a user should have access to and may not be empty. For example:\n - \"/healthz\" is legal\n - \"/hea*\" is illegal\n - \"/hea\" is legal but matches nothing\n - \"/hea/*\" also matches nothing\n - \"/healthz/*\" matches all per-component health checks.\n\"*\" matches all non-resource urls. if it is present, it must be the only entry. Required.", - "items": { - "type": "string" - }, - "type": "array", - "x-kubernetes-list-type": "set" - }, - "verbs": { - "description": "`verbs` is a list of matching verbs and may not be empty. \"*\" matches all verbs. If it is present, it must be the only entry. Required.", - "items": { - "type": "string" - }, - "type": "array", - "x-kubernetes-list-type": "set" - } - }, - "required": [ - "verbs", - "nonResourceURLs" - ], - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.PolicyRulesWithSubjects": { - "description": "PolicyRulesWithSubjects prescribes a test that applies to a request to an apiserver. The test considers the subject making the request, the verb being requested, and the resource to be acted upon. This PolicyRulesWithSubjects matches a request if and only if both (a) at least one member of subjects matches the request and (b) at least one member of resourceRules or nonResourceRules matches the request.", - "properties": { - "nonResourceRules": { - "description": "`nonResourceRules` is a list of NonResourcePolicyRules that identify matching requests according to their verb and the target non-resource URL.", - "items": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.NonResourcePolicyRule" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - }, - "resourceRules": { - "description": "`resourceRules` is a slice of ResourcePolicyRules that identify matching requests according to their verb and the target resource. At least one of `resourceRules` and `nonResourceRules` has to be non-empty.", - "items": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.ResourcePolicyRule" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - }, - "subjects": { - "description": "subjects is the list of normal user, serviceaccount, or group that this rule cares about. There must be at least one member in this slice. A slice that includes both the system:authenticated and system:unauthenticated user groups matches every request. Required.", - "items": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.Subject" - }, - "type": "array", - "x-kubernetes-list-type": "atomic" - } - }, - "required": [ - "subjects" - ], - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration": { - "description": "PriorityLevelConfiguration represents the configuration of a priority level.", - "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": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", - "description": "`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - }, - "spec": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationSpec", - "description": "`spec` is the specification of the desired behavior of a \"request-priority\". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - }, - "status": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationStatus", - "description": "`status` is the current status of a \"request-priority\". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - } - }, - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" - } - ] - }, - "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationCondition": { - "description": "PriorityLevelConfigurationCondition defines the condition of priority level.", - "properties": { - "lastTransitionTime": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", - "description": "`lastTransitionTime` is the last time the condition transitioned from one status to another." - }, - "message": { - "description": "`message` is a human-readable message indicating details about last transition.", - "type": "string" - }, - "reason": { - "description": "`reason` is a unique, one-word, CamelCase reason for the condition's last transition.", - "type": "string" - }, - "status": { - "description": "`status` is the status of the condition. Can be True, False, Unknown. Required.", - "type": "string" - }, - "type": { - "description": "`type` is the type of the condition. Required.", - "type": "string" - } - }, - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationList": { - "description": "PriorityLevelConfigurationList is a list of PriorityLevelConfiguration objects.", - "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" - }, - "items": { - "description": "`items` is a list of request-priorities.", - "items": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" - }, - "type": "array" - }, - "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": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", - "description": "`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - } - }, - "required": [ - "items" - ], - "type": "object", - "x-kubernetes-group-version-kind": [ - { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfigurationList", - "version": "v1alpha1" - } - ] - }, - "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationReference": { - "description": "PriorityLevelConfigurationReference contains information that points to the \"request-priority\" being used.", - "properties": { - "name": { - "description": "`name` is the name of the priority level configuration being referenced Required.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationSpec": { - "description": "PriorityLevelConfigurationSpec specifies the configuration of a priority level.", - "properties": { - "limited": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.LimitedPriorityLevelConfiguration", - "description": "`limited` specifies how requests are handled for a Limited priority level. This field must be non-empty if and only if `type` is `\"Limited\"`." - }, - "type": { - "description": "`type` indicates whether this priority level is subject to limitation on request execution. A value of `\"Exempt\"` means that requests of this priority level are not subject to a limit (and thus are never queued) and do not detract from the capacity made available to other priority levels. A value of `\"Limited\"` means that (a) requests of this priority level _are_ subject to limits and (b) some of the server's limited capacity is made available exclusively to this priority level. Required.", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object", - "x-kubernetes-unions": [ - { - "discriminator": "type", - "fields-to-discriminateBy": { - "limited": "Limited" - } - } - ] - }, - "io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationStatus": { - "description": "PriorityLevelConfigurationStatus represents the current state of a \"request-priority\".", - "properties": { - "conditions": { - "description": "`conditions` is the current state of \"request-priority\".", - "items": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationCondition" - }, - "type": "array", - "x-kubernetes-list-map-keys": [ - "type" - ], - "x-kubernetes-list-type": "map" - } - }, - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.QueuingConfiguration": { - "description": "QueuingConfiguration holds the configuration parameters for queuing", - "properties": { - "handSize": { - "description": "`handSize` is a small positive number that configures the shuffle sharding of requests into queues. When enqueuing a request at this priority level the request's flow identifier (a string pair) is hashed and the hash value is used to shuffle the list of queues and deal a hand of the size specified here. The request is put into one of the shortest queues in that hand. `handSize` must be no larger than `queues`, and should be significantly smaller (so that a few heavy flows do not saturate most of the queues). See the user-facing documentation for more extensive guidance on setting this field. This field has a default value of 8.", - "format": "int32", - "type": "integer" - }, - "queueLengthLimit": { - "description": "`queueLengthLimit` is the maximum number of requests allowed to be waiting in a given queue of this priority level at a time; excess requests are rejected. This value must be positive. If not specified, it will be defaulted to 50.", - "format": "int32", - "type": "integer" - }, - "queues": { - "description": "`queues` is the number of queues for this priority level. The queues exist independently at each apiserver. The value must be positive. Setting it to 1 effectively precludes shufflesharding and thus makes the distinguisher method of associated flow schemas irrelevant. This field has a default value of 64.", - "format": "int32", - "type": "integer" - } - }, - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.ResourcePolicyRule": { - "description": "ResourcePolicyRule is a predicate that matches some resource requests, testing the request's verb and the target resource. A ResourcePolicyRule matches a resource request if and only if: (a) at least one member of verbs matches the request, (b) at least one member of apiGroups matches the request, (c) at least one member of resources matches the request, and (d) least one member of namespaces matches the request.", - "properties": { - "apiGroups": { - "description": "`apiGroups` is a list of matching API groups and may not be empty. \"*\" matches all API groups and, if present, must be the only entry. Required.", - "items": { - "type": "string" - }, - "type": "array", - "x-kubernetes-list-type": "set" - }, - "clusterScope": { - "description": "`clusterScope` indicates whether to match requests that do not specify a namespace (which happens either because the resource is not namespaced or the request targets all namespaces). If this field is omitted or false then the `namespaces` field must contain a non-empty list.", - "type": "boolean" - }, - "namespaces": { - "description": "`namespaces` is a list of target namespaces that restricts matches. A request that specifies a target namespace matches only if either (a) this list contains that target namespace or (b) this list contains \"*\". Note that \"*\" matches any specified namespace but does not match a request that _does not specify_ a namespace (see the `clusterScope` field for that). This list may be empty, but only if `clusterScope` is true.", - "items": { - "type": "string" - }, - "type": "array", - "x-kubernetes-list-type": "set" - }, - "resources": { - "description": "`resources` is a list of matching resources (i.e., lowercase and plural) with, if desired, subresource. For example, [ \"services\", \"nodes/status\" ]. This list may not be empty. \"*\" matches all resources and, if present, must be the only entry. Required.", - "items": { - "type": "string" - }, - "type": "array", - "x-kubernetes-list-type": "set" - }, - "verbs": { - "description": "`verbs` is a list of matching verbs and may not be empty. \"*\" matches all verbs and, if present, must be the only entry. Required.", - "items": { - "type": "string" - }, - "type": "array", - "x-kubernetes-list-type": "set" - } - }, - "required": [ - "verbs", - "apiGroups", - "resources" - ], - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.ServiceAccountSubject": { - "description": "ServiceAccountSubject holds detailed information for service-account-kind subject.", - "properties": { - "name": { - "description": "`name` is the name of matching ServiceAccount objects, or \"*\" to match regardless of name. Required.", - "type": "string" - }, - "namespace": { - "description": "`namespace` is the namespace of matching ServiceAccount objects. Required.", - "type": "string" - } - }, - "required": [ - "namespace", - "name" - ], - "type": "object" - }, - "io.k8s.api.flowcontrol.v1alpha1.Subject": { - "description": "Subject matches the originator of a request, as identified by the request authentication system. There are three ways of matching an originator; by user, group, or service account.", - "properties": { - "group": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.GroupSubject" - }, - "kind": { - "description": "Required", - "type": "string" - }, - "serviceAccount": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.ServiceAccountSubject" - }, - "user": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.UserSubject" - } - }, - "required": [ - "kind" - ], - "type": "object", - "x-kubernetes-unions": [ - { - "discriminator": "kind", - "fields-to-discriminateBy": { - "group": "Group", - "serviceAccount": "ServiceAccount", - "user": "User" - } - } - ] - }, - "io.k8s.api.flowcontrol.v1alpha1.UserSubject": { - "description": "UserSubject holds detailed information for user-kind subject.", - "properties": { - "name": { - "description": "`name` is the username that matches, or \"*\" to match all usernames. Required.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, "io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethod": { "description": "FlowDistinguisherMethod specifies the method of a flow distinguisher.", "properties": { @@ -72237,1978 +71691,21 @@ "https" ], "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "delete", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "read the specified Ingress", - "operationId": "readExtensionsV1beta1NamespacedIngress", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - }, - "parameters": [ - { - "description": "name of the Ingress", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - } - ], - "patch": { - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json", - "application/apply-patch+yaml" - ], - "description": "partially update the specified Ingress", - "operationId": "patchExtensionsV1beta1NamespacedIngress", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - }, - { - "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", - "in": "query", - "name": "force", - "type": "boolean", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - }, - "put": { - "consumes": [ - "*/*" - ], - "description": "replace the specified Ingress", - "operationId": "replaceExtensionsV1beta1NamespacedIngress", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - } - }, - "/apis/extensions/v1beta1/namespaces/{namespace}/ingresses/{name}/status": { - "get": { - "consumes": [ - "*/*" - ], - "description": "read status of the specified Ingress", - "operationId": "readExtensionsV1beta1NamespacedIngressStatus", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - }, - "parameters": [ - { - "description": "name of the Ingress", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - } - ], - "patch": { - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json", - "application/apply-patch+yaml" - ], - "description": "partially update status of the specified Ingress", - "operationId": "patchExtensionsV1beta1NamespacedIngressStatus", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - }, - { - "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", - "in": "query", - "name": "force", - "type": "boolean", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - }, - "put": { - "consumes": [ - "*/*" - ], - "description": "replace status of the specified Ingress", - "operationId": "replaceExtensionsV1beta1NamespacedIngressStatus", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - } - }, - "/apis/extensions/v1beta1/watch/ingresses": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchExtensionsV1beta1IngressListForAllNamespaces", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "type": "integer", - "uniqueItems": true - }, - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "type": "string", - "uniqueItems": true - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "type": "boolean", - "uniqueItems": true - } - ] - }, - "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchExtensionsV1beta1NamespacedIngressList", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "watchlist", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "type": "integer", - "uniqueItems": true - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "type": "string", - "uniqueItems": true - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "type": "boolean", - "uniqueItems": true - } - ] - }, - "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses/{name}": { - "get": { - "consumes": [ - "*/*" - ], - "description": "watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchExtensionsV1beta1NamespacedIngress", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "extensions_v1beta1" - ], - "x-kubernetes-action": "watch", - "x-kubernetes-group-version-kind": { - "group": "extensions", - "kind": "Ingress", - "version": "v1beta1" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "type": "integer", - "uniqueItems": true - }, - { - "description": "name of the Ingress", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "object name and auth scope, such as for teams and projects", - "in": "path", - "name": "namespace", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "type": "string", - "uniqueItems": true - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "type": "boolean", - "uniqueItems": true - } - ] - }, - "/apis/flowcontrol.apiserver.k8s.io/": { - "get": { - "consumes": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "description": "get information of a group", - "operationId": "getFlowcontrolApiserverAPIGroup", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver" - ] - } - }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/": { - "get": { - "consumes": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "description": "get available resources", - "operationId": "getFlowcontrolApiserverV1alpha1APIResources", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ] - } - }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/flowschemas": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete collection of FlowSchema", - "operationId": "deleteFlowcontrolApiserverV1alpha1CollectionFlowSchema", - "parameters": [ - { - "in": "body", - "name": "body", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "type": "string", - "uniqueItems": true - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "type": "string", - "uniqueItems": true - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "type": "integer", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "deletecollection", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "list or watch objects of kind FlowSchema", - "operationId": "listFlowcontrolApiserverV1alpha1FlowSchema", - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "type": "integer", - "uniqueItems": true - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "type": "string", - "uniqueItems": true - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "type": "boolean", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchemaList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - }, - "parameters": [ - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - } - ], - "post": { - "consumes": [ - "*/*" - ], - "description": "create a FlowSchema", - "operationId": "createFlowcontrolApiserverV1alpha1FlowSchema", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - } - }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/flowschemas/{name}": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete a FlowSchema", - "operationId": "deleteFlowcontrolApiserverV1alpha1FlowSchema", - "parameters": [ - { - "in": "body", - "name": "body", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "delete", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "read the specified FlowSchema", - "operationId": "readFlowcontrolApiserverV1alpha1FlowSchema", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - }, - "parameters": [ - { - "description": "name of the FlowSchema", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - } - ], - "patch": { - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json", - "application/apply-patch+yaml" - ], - "description": "partially update the specified FlowSchema", - "operationId": "patchFlowcontrolApiserverV1alpha1FlowSchema", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - }, - { - "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", - "in": "query", - "name": "force", - "type": "boolean", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - }, - "put": { - "consumes": [ - "*/*" - ], - "description": "replace the specified FlowSchema", - "operationId": "replaceFlowcontrolApiserverV1alpha1FlowSchema", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - } - }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/flowschemas/{name}/status": { - "get": { - "consumes": [ - "*/*" - ], - "description": "read status of the specified FlowSchema", - "operationId": "readFlowcontrolApiserverV1alpha1FlowSchemaStatus", - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "get", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - }, - "parameters": [ - { - "description": "name of the FlowSchema", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - } - ], - "patch": { - "consumes": [ - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json", - "application/apply-patch+yaml" - ], - "description": "partially update status of the specified FlowSchema", - "operationId": "patchFlowcontrolApiserverV1alpha1FlowSchemaStatus", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - }, - { - "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", - "in": "query", - "name": "force", - "type": "boolean", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "patch", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - }, - "put": { - "consumes": [ - "*/*" - ], - "description": "replace status of the specified FlowSchema", - "operationId": "replaceFlowcontrolApiserverV1alpha1FlowSchemaStatus", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.FlowSchema" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "put", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" - } - } - }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/prioritylevelconfigurations": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete collection of PriorityLevelConfiguration", - "operationId": "deleteFlowcontrolApiserverV1alpha1CollectionPriorityLevelConfiguration", - "parameters": [ - { - "in": "body", - "name": "body", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "type": "string", - "uniqueItems": true - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "type": "string", - "uniqueItems": true - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "type": "integer", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "deletecollection", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" - } - }, - "get": { - "consumes": [ - "*/*" - ], - "description": "list or watch objects of kind PriorityLevelConfiguration", - "operationId": "listFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "type": "integer", - "uniqueItems": true - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "type": "string", - "uniqueItems": true - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "type": "boolean", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationList" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "list", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" - } - }, - "parameters": [ - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - } - ], - "post": { - "consumes": [ - "*/*" - ], - "description": "create a PriorityLevelConfiguration", - "operationId": "createFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", - "parameters": [ - { - "in": "body", - "name": "body", - "required": true, - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", - "in": "query", - "name": "fieldManager", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" - } - }, - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "post", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" - } - } - }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/prioritylevelconfigurations/{name}": { - "delete": { - "consumes": [ - "*/*" - ], - "description": "delete a PriorityLevelConfiguration", - "operationId": "deleteFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", - "parameters": [ - { - "in": "body", - "name": "body", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" - } - }, - { - "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", - "in": "query", - "name": "dryRun", - "type": "string", - "uniqueItems": true - }, - { - "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "in": "query", - "name": "gracePeriodSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "in": "query", - "name": "orphanDependents", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", - "in": "query", - "name": "propagationPolicy", - "type": "string", - "uniqueItems": true - } - ], - "produces": [ - "application/json", - "application/yaml", - "application/vnd.kubernetes.protobuf" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "202": { - "description": "Accepted", - "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" - } - }, - "401": { - "description": "Unauthorized" - } - }, - "schemes": [ - "https" - ], - "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], "x-kubernetes-action": "delete", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } }, "get": { "consumes": [ "*/*" ], - "description": "read the specified PriorityLevelConfiguration", - "operationId": "readFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", + "description": "read the specified Ingress", + "operationId": "readExtensionsV1beta1NamespacedIngress", "produces": [ "application/json", "application/yaml", @@ -74218,7 +71715,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, "401": { @@ -74229,24 +71726,32 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], "x-kubernetes-action": "get", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } }, "parameters": [ { - "description": "name of the PriorityLevelConfiguration", + "description": "name of the Ingress", "in": "path", "name": "name", "required": true, "type": "string", "uniqueItems": true }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, { "description": "If 'true', then the output is pretty printed.", "in": "query", @@ -74262,8 +71767,8 @@ "application/strategic-merge-patch+json", "application/apply-patch+yaml" ], - "description": "partially update the specified PriorityLevelConfiguration", - "operationId": "patchFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", + "description": "partially update the specified Ingress", + "operationId": "patchExtensionsV1beta1NamespacedIngress", "parameters": [ { "in": "body", @@ -74304,7 +71809,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, "401": { @@ -74315,28 +71820,28 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], "x-kubernetes-action": "patch", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } }, "put": { "consumes": [ "*/*" ], - "description": "replace the specified PriorityLevelConfiguration", - "operationId": "replaceFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", + "description": "replace the specified Ingress", + "operationId": "replaceExtensionsV1beta1NamespacedIngress", "parameters": [ { "in": "body", "name": "body", "required": true, "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, { @@ -74363,13 +71868,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, "201": { "description": "Created", "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, "401": { @@ -74380,23 +71885,23 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], "x-kubernetes-action": "put", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } } }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/prioritylevelconfigurations/{name}/status": { + "/apis/extensions/v1beta1/namespaces/{namespace}/ingresses/{name}/status": { "get": { "consumes": [ "*/*" ], - "description": "read status of the specified PriorityLevelConfiguration", - "operationId": "readFlowcontrolApiserverV1alpha1PriorityLevelConfigurationStatus", + "description": "read status of the specified Ingress", + "operationId": "readExtensionsV1beta1NamespacedIngressStatus", "produces": [ "application/json", "application/yaml", @@ -74406,7 +71911,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, "401": { @@ -74417,24 +71922,32 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], "x-kubernetes-action": "get", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } }, "parameters": [ { - "description": "name of the PriorityLevelConfiguration", + "description": "name of the Ingress", "in": "path", "name": "name", "required": true, "type": "string", "uniqueItems": true }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, { "description": "If 'true', then the output is pretty printed.", "in": "query", @@ -74450,8 +71963,8 @@ "application/strategic-merge-patch+json", "application/apply-patch+yaml" ], - "description": "partially update status of the specified PriorityLevelConfiguration", - "operationId": "patchFlowcontrolApiserverV1alpha1PriorityLevelConfigurationStatus", + "description": "partially update status of the specified Ingress", + "operationId": "patchExtensionsV1beta1NamespacedIngressStatus", "parameters": [ { "in": "body", @@ -74492,7 +72005,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, "401": { @@ -74503,28 +72016,28 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], "x-kubernetes-action": "patch", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } }, "put": { "consumes": [ "*/*" ], - "description": "replace status of the specified PriorityLevelConfiguration", - "operationId": "replaceFlowcontrolApiserverV1alpha1PriorityLevelConfigurationStatus", + "description": "replace status of the specified Ingress", + "operationId": "replaceExtensionsV1beta1NamespacedIngressStatus", "parameters": [ { "in": "body", "name": "body", "required": true, "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, { @@ -74551,13 +72064,13 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, "201": { "description": "Created", "schema": { - "$ref": "#/definitions/io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration" + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" } }, "401": { @@ -74568,23 +72081,23 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], "x-kubernetes-action": "put", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } } }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/watch/flowschemas": { + "/apis/extensions/v1beta1/watch/ingresses": { "get": { "consumes": [ "*/*" ], - "description": "watch individual changes to a list of FlowSchema. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchFlowcontrolApiserverV1alpha1FlowSchemaList", + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchExtensionsV1beta1IngressListForAllNamespaces", "produces": [ "application/json", "application/yaml", @@ -74607,13 +72120,13 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], "x-kubernetes-action": "watchlist", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } }, "parameters": [ @@ -74689,13 +72202,13 @@ } ] }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/watch/flowschemas/{name}": { + "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses": { "get": { "consumes": [ "*/*" ], - "description": "watch changes to an object of kind FlowSchema. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchFlowcontrolApiserverV1alpha1FlowSchema", + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchExtensionsV1beta1NamespacedIngressList", "produces": [ "application/json", "application/yaml", @@ -74718,13 +72231,13 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], - "x-kubernetes-action": "watch", + "x-kubernetes-action": "watchlist", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "FlowSchema", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } }, "parameters": [ @@ -74764,9 +72277,9 @@ "uniqueItems": true }, { - "description": "name of the FlowSchema", + "description": "object name and auth scope, such as for teams and projects", "in": "path", - "name": "name", + "name": "namespace", "required": true, "type": "string", "uniqueItems": true @@ -74808,13 +72321,13 @@ } ] }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/watch/prioritylevelconfigurations": { + "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses/{name}": { "get": { "consumes": [ "*/*" ], - "description": "watch individual changes to a list of PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead.", - "operationId": "watchFlowcontrolApiserverV1alpha1PriorityLevelConfigurationList", + "description": "watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchExtensionsV1beta1NamespacedIngress", "produces": [ "application/json", "application/yaml", @@ -74837,13 +72350,13 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" + "extensions_v1beta1" ], - "x-kubernetes-action": "watchlist", + "x-kubernetes-action": "watch", "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" } }, "parameters": [ @@ -74882,6 +72395,22 @@ "type": "integer", "uniqueItems": true }, + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, { "description": "If 'true', then the output is pretty printed.", "in": "query", @@ -74919,25 +72448,25 @@ } ] }, - "/apis/flowcontrol.apiserver.k8s.io/v1alpha1/watch/prioritylevelconfigurations/{name}": { + "/apis/flowcontrol.apiserver.k8s.io/": { "get": { "consumes": [ - "*/*" + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" ], - "description": "watch changes to an object of kind PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", - "operationId": "watchFlowcontrolApiserverV1alpha1PriorityLevelConfiguration", + "description": "get information of a group", + "operationId": "getFlowcontrolApiserverAPIGroup", "produces": [ "application/json", "application/yaml", - "application/vnd.kubernetes.protobuf", - "application/json;stream=watch", - "application/vnd.kubernetes.protobuf;stream=watch" + "application/vnd.kubernetes.protobuf" ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" } }, "401": { @@ -74948,95 +72477,9 @@ "https" ], "tags": [ - "flowcontrolApiserver_v1alpha1" - ], - "x-kubernetes-action": "watch", - "x-kubernetes-group-version-kind": { - "group": "flowcontrol.apiserver.k8s.io", - "kind": "PriorityLevelConfiguration", - "version": "v1alpha1" - } - }, - "parameters": [ - { - "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", - "in": "query", - "name": "allowWatchBookmarks", - "type": "boolean", - "uniqueItems": true - }, - { - "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", - "in": "query", - "name": "continue", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "in": "query", - "name": "fieldSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "in": "query", - "name": "labelSelector", - "type": "string", - "uniqueItems": true - }, - { - "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "in": "query", - "name": "limit", - "type": "integer", - "uniqueItems": true - }, - { - "description": "name of the PriorityLevelConfiguration", - "in": "path", - "name": "name", - "required": true, - "type": "string", - "uniqueItems": true - }, - { - "description": "If 'true', then the output is pretty printed.", - "in": "query", - "name": "pretty", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersion", - "type": "string", - "uniqueItems": true - }, - { - "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", - "in": "query", - "name": "resourceVersionMatch", - "type": "string", - "uniqueItems": true - }, - { - "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", - "in": "query", - "name": "timeoutSeconds", - "type": "integer", - "uniqueItems": true - }, - { - "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "in": "query", - "name": "watch", - "type": "boolean", - "uniqueItems": true - } - ] + "flowcontrolApiserver" + ] + } }, "/apis/flowcontrol.apiserver.k8s.io/v1beta1/": { "get": { diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 68179542e193..13815c0b9999 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -6116,885 +6116,886 @@ func init() { } var fileDescriptor_83c10c24ec417dc9 = []byte{ - // 14037 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x70, 0x1c, 0xc9, - 0x79, 0x18, 0xae, 0xd9, 0xc5, 0x6b, 0x3f, 0xbc, 0x1b, 0x24, 0x0f, 0xc4, 0x1d, 0x09, 0xde, 0x50, - 0xe2, 0xf1, 0x74, 0x77, 0xa0, 0x78, 0x0f, 0xe9, 0x7c, 0x27, 0x9d, 0x05, 0x60, 0x01, 0x72, 0x8f, - 0x04, 0xb8, 0xd7, 0x0b, 0x92, 0x92, 0x7c, 0x52, 0x69, 0xb0, 0xdb, 0x00, 0x46, 0xd8, 0x9d, 0xd9, - 0x9b, 0x99, 0x05, 0x89, 0xfb, 0xc9, 0xf5, 0x73, 0xe4, 0xa7, 0xfc, 0x48, 0xa9, 0x52, 0xae, 0x3c, - 0x6c, 0x97, 0x2b, 0xe5, 0x38, 0x65, 0x2b, 0x4e, 0x52, 0x71, 0xec, 0xd8, 0x8e, 0xe5, 0xc4, 0x4e, - 0x9c, 0x87, 0x93, 0x3f, 0x1c, 0xc7, 0x95, 0x58, 0xae, 0x72, 0x05, 0xb1, 0xe9, 0x54, 0xb9, 0xf4, - 0x47, 0x6c, 0x27, 0x76, 0xfe, 0x08, 0xe2, 0x8a, 0x53, 0xfd, 0x9c, 0xee, 0x79, 0xec, 0x2e, 0x78, - 0x20, 0x74, 0x52, 0xdd, 0x7f, 0xbb, 0xfd, 0x7d, 0xfd, 0x75, 0x4f, 0x3f, 0xbf, 0xfe, 0x9e, 0xf0, - 0xea, 0xee, 0xcb, 0xe1, 0x82, 0xeb, 0x5f, 0xd9, 0xed, 0x6c, 0x92, 0xc0, 0x23, 0x11, 0x09, 0xaf, - 0xec, 0x11, 0xaf, 0xe1, 0x07, 0x57, 0x04, 0xc0, 0x69, 0xbb, 0x57, 0xea, 0x7e, 0x40, 0xae, 0xec, - 0x5d, 0xbd, 0xb2, 0x4d, 0x3c, 0x12, 0x38, 0x11, 0x69, 0x2c, 0xb4, 0x03, 0x3f, 0xf2, 0x11, 0xe2, - 0x38, 0x0b, 0x4e, 0xdb, 0x5d, 0xa0, 0x38, 0x0b, 0x7b, 0x57, 0xe7, 0x9e, 0xdb, 0x76, 0xa3, 0x9d, - 0xce, 0xe6, 0x42, 0xdd, 0x6f, 0x5d, 0xd9, 0xf6, 0xb7, 0xfd, 0x2b, 0x0c, 0x75, 0xb3, 0xb3, 0xc5, - 0xfe, 0xb1, 0x3f, 0xec, 0x17, 0x27, 0x31, 0xf7, 0x62, 0xdc, 0x4c, 0xcb, 0xa9, 0xef, 0xb8, 0x1e, - 0x09, 0xf6, 0xaf, 0xb4, 0x77, 0xb7, 0x59, 0xbb, 0x01, 0x09, 0xfd, 0x4e, 0x50, 0x27, 0xc9, 0x86, - 0xbb, 0xd6, 0x0a, 0xaf, 0xb4, 0x48, 0xe4, 0x64, 0x74, 0x77, 0xee, 0x4a, 0x5e, 0xad, 0xa0, 0xe3, - 0x45, 0x6e, 0x2b, 0xdd, 0xcc, 0x87, 0x7b, 0x55, 0x08, 0xeb, 0x3b, 0xa4, 0xe5, 0xa4, 0xea, 0xbd, - 0x90, 0x57, 0xaf, 0x13, 0xb9, 0xcd, 0x2b, 0xae, 0x17, 0x85, 0x51, 0x90, 0xac, 0x64, 0x7f, 0xd5, - 0x82, 0x0b, 0x8b, 0x77, 0x6b, 0x2b, 0x4d, 0x27, 0x8c, 0xdc, 0xfa, 0x52, 0xd3, 0xaf, 0xef, 0xd6, - 0x22, 0x3f, 0x20, 0x77, 0xfc, 0x66, 0xa7, 0x45, 0x6a, 0x6c, 0x20, 0xd0, 0xb3, 0x30, 0xb2, 0xc7, - 0xfe, 0x57, 0xca, 0xb3, 0xd6, 0x05, 0xeb, 0x72, 0x69, 0x69, 0xea, 0x37, 0x0e, 0xe6, 0xdf, 0xf7, - 0xe0, 0x60, 0x7e, 0xe4, 0x8e, 0x28, 0xc7, 0x0a, 0x03, 0x5d, 0x82, 0xa1, 0xad, 0x70, 0x63, 0xbf, - 0x4d, 0x66, 0x0b, 0x0c, 0x77, 0x42, 0xe0, 0x0e, 0xad, 0xd6, 0x68, 0x29, 0x16, 0x50, 0x74, 0x05, - 0x4a, 0x6d, 0x27, 0x88, 0xdc, 0xc8, 0xf5, 0xbd, 0xd9, 0xe2, 0x05, 0xeb, 0xf2, 0xe0, 0xd2, 0xb4, - 0x40, 0x2d, 0x55, 0x25, 0x00, 0xc7, 0x38, 0xb4, 0x1b, 0x01, 0x71, 0x1a, 0xb7, 0xbc, 0xe6, 0xfe, - 0xec, 0xc0, 0x05, 0xeb, 0xf2, 0x48, 0xdc, 0x0d, 0x2c, 0xca, 0xb1, 0xc2, 0xb0, 0x7f, 0xa4, 0x00, - 0x23, 0x8b, 0x5b, 0x5b, 0xae, 0xe7, 0x46, 0xfb, 0xe8, 0x0e, 0x8c, 0x79, 0x7e, 0x83, 0xc8, 0xff, - 0xec, 0x2b, 0x46, 0x9f, 0xbf, 0xb0, 0x90, 0x5e, 0x4a, 0x0b, 0xeb, 0x1a, 0xde, 0xd2, 0xd4, 0x83, - 0x83, 0xf9, 0x31, 0xbd, 0x04, 0x1b, 0x74, 0x10, 0x86, 0xd1, 0xb6, 0xdf, 0x50, 0x64, 0x0b, 0x8c, - 0xec, 0x7c, 0x16, 0xd9, 0x6a, 0x8c, 0xb6, 0x34, 0xf9, 0xe0, 0x60, 0x7e, 0x54, 0x2b, 0xc0, 0x3a, - 0x11, 0xb4, 0x09, 0x93, 0xf4, 0xaf, 0x17, 0xb9, 0x8a, 0x6e, 0x91, 0xd1, 0xbd, 0x98, 0x47, 0x57, - 0x43, 0x5d, 0x9a, 0x79, 0x70, 0x30, 0x3f, 0x99, 0x28, 0xc4, 0x49, 0x82, 0xf6, 0xdb, 0x30, 0xb1, - 0x18, 0x45, 0x4e, 0x7d, 0x87, 0x34, 0xf8, 0x0c, 0xa2, 0x17, 0x61, 0xc0, 0x73, 0x5a, 0x44, 0xcc, - 0xef, 0x05, 0x31, 0xb0, 0x03, 0xeb, 0x4e, 0x8b, 0x1c, 0x1e, 0xcc, 0x4f, 0xdd, 0xf6, 0xdc, 0xb7, - 0x3a, 0x62, 0x55, 0xd0, 0x32, 0xcc, 0xb0, 0xd1, 0xf3, 0x00, 0x0d, 0xb2, 0xe7, 0xd6, 0x49, 0xd5, - 0x89, 0x76, 0xc4, 0x7c, 0x23, 0x51, 0x17, 0xca, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x3e, 0x94, 0x16, - 0xf7, 0x7c, 0xb7, 0x51, 0xf5, 0x1b, 0x21, 0xda, 0x85, 0xc9, 0x76, 0x40, 0xb6, 0x48, 0xa0, 0x8a, - 0x66, 0xad, 0x0b, 0xc5, 0xcb, 0xa3, 0xcf, 0x5f, 0xce, 0xfc, 0x58, 0x13, 0x75, 0xc5, 0x8b, 0x82, - 0xfd, 0xa5, 0xc7, 0x44, 0x7b, 0x93, 0x09, 0x28, 0x4e, 0x52, 0xb6, 0xff, 0x55, 0x01, 0x4e, 0x2f, - 0xbe, 0xdd, 0x09, 0x48, 0xd9, 0x0d, 0x77, 0x93, 0x2b, 0xbc, 0xe1, 0x86, 0xbb, 0xeb, 0xf1, 0x08, - 0xa8, 0xa5, 0x55, 0x16, 0xe5, 0x58, 0x61, 0xa0, 0xe7, 0x60, 0x98, 0xfe, 0xbe, 0x8d, 0x2b, 0xe2, - 0x93, 0x67, 0x04, 0xf2, 0x68, 0xd9, 0x89, 0x9c, 0x32, 0x07, 0x61, 0x89, 0x83, 0xd6, 0x60, 0xb4, - 0xce, 0x36, 0xe4, 0xf6, 0x9a, 0xdf, 0x20, 0x6c, 0x32, 0x4b, 0x4b, 0xcf, 0x50, 0xf4, 0xe5, 0xb8, - 0xf8, 0xf0, 0x60, 0x7e, 0x96, 0xf7, 0x4d, 0x90, 0xd0, 0x60, 0x58, 0xaf, 0x8f, 0x6c, 0xb5, 0xbf, - 0x06, 0x18, 0x25, 0xc8, 0xd8, 0x5b, 0x97, 0xb5, 0xad, 0x32, 0xc8, 0xb6, 0xca, 0x58, 0xf6, 0x36, - 0x41, 0x57, 0x61, 0x60, 0xd7, 0xf5, 0x1a, 0xb3, 0x43, 0x8c, 0xd6, 0x39, 0x3a, 0xe7, 0x37, 0x5c, - 0xaf, 0x71, 0x78, 0x30, 0x3f, 0x6d, 0x74, 0x87, 0x16, 0x62, 0x86, 0x6a, 0xff, 0x99, 0x05, 0xf3, - 0x0c, 0xb6, 0xea, 0x36, 0x49, 0x95, 0x04, 0xa1, 0x1b, 0x46, 0xc4, 0x8b, 0x8c, 0x01, 0x7d, 0x1e, - 0x20, 0x24, 0xf5, 0x80, 0x44, 0xda, 0x90, 0xaa, 0x85, 0x51, 0x53, 0x10, 0xac, 0x61, 0xd1, 0x03, - 0x21, 0xdc, 0x71, 0x02, 0xb6, 0xbe, 0xc4, 0xc0, 0xaa, 0x03, 0xa1, 0x26, 0x01, 0x38, 0xc6, 0x31, - 0x0e, 0x84, 0x62, 0xaf, 0x03, 0x01, 0x7d, 0x0c, 0x26, 0xe3, 0xc6, 0xc2, 0xb6, 0x53, 0x97, 0x03, - 0xc8, 0xb6, 0x4c, 0xcd, 0x04, 0xe1, 0x24, 0xae, 0xfd, 0xf7, 0x2c, 0xb1, 0x78, 0xe8, 0x57, 0xbf, - 0xcb, 0xbf, 0xd5, 0xfe, 0x25, 0x0b, 0x86, 0x97, 0x5c, 0xaf, 0xe1, 0x7a, 0xdb, 0xe8, 0xb3, 0x30, - 0x42, 0xef, 0xa6, 0x86, 0x13, 0x39, 0xe2, 0xdc, 0xfb, 0x90, 0xb6, 0xb7, 0xd4, 0x55, 0xb1, 0xd0, - 0xde, 0xdd, 0xa6, 0x05, 0xe1, 0x02, 0xc5, 0xa6, 0xbb, 0xed, 0xd6, 0xe6, 0xe7, 0x48, 0x3d, 0x5a, - 0x23, 0x91, 0x13, 0x7f, 0x4e, 0x5c, 0x86, 0x15, 0x55, 0x74, 0x03, 0x86, 0x22, 0x27, 0xd8, 0x26, - 0x91, 0x38, 0x00, 0x33, 0x0f, 0x2a, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xbc, 0x3a, 0x89, 0xaf, 0x85, - 0x0d, 0x56, 0x15, 0x0b, 0x12, 0xf6, 0x0f, 0x0d, 0xc3, 0xd9, 0xe5, 0x5a, 0x25, 0x67, 0x5d, 0x5d, - 0x82, 0xa1, 0x46, 0xe0, 0xee, 0x91, 0x40, 0x8c, 0xb3, 0xa2, 0x52, 0x66, 0xa5, 0x58, 0x40, 0xd1, - 0xcb, 0x30, 0xc6, 0x2f, 0xa4, 0xeb, 0x8e, 0xd7, 0x68, 0xca, 0x21, 0x3e, 0x25, 0xb0, 0xc7, 0xee, - 0x68, 0x30, 0x6c, 0x60, 0x1e, 0x71, 0x51, 0x5d, 0x4a, 0x6c, 0xc6, 0xbc, 0xcb, 0xee, 0x8b, 0x16, - 0x4c, 0xf1, 0x66, 0x16, 0xa3, 0x28, 0x70, 0x37, 0x3b, 0x11, 0x09, 0x67, 0x07, 0xd9, 0x49, 0xb7, - 0x9c, 0x35, 0x5a, 0xb9, 0x23, 0xb0, 0x70, 0x27, 0x41, 0x85, 0x1f, 0x82, 0xb3, 0xa2, 0xdd, 0xa9, - 0x24, 0x18, 0xa7, 0x9a, 0x45, 0xdf, 0x69, 0xc1, 0x5c, 0xdd, 0xf7, 0xa2, 0xc0, 0x6f, 0x36, 0x49, - 0x50, 0xed, 0x6c, 0x36, 0xdd, 0x70, 0x87, 0xaf, 0x53, 0x4c, 0xb6, 0xd8, 0x49, 0x90, 0x33, 0x87, - 0x0a, 0x49, 0xcc, 0xe1, 0xf9, 0x07, 0x07, 0xf3, 0x73, 0xcb, 0xb9, 0xa4, 0x70, 0x97, 0x66, 0xd0, - 0x2e, 0x20, 0x7a, 0x95, 0xd6, 0x22, 0x67, 0x9b, 0xc4, 0x8d, 0x0f, 0xf7, 0xdf, 0xf8, 0x99, 0x07, - 0x07, 0xf3, 0x68, 0x3d, 0x45, 0x02, 0x67, 0x90, 0x45, 0x6f, 0xc1, 0x29, 0x5a, 0x9a, 0xfa, 0xd6, - 0x91, 0xfe, 0x9b, 0x9b, 0x7d, 0x70, 0x30, 0x7f, 0x6a, 0x3d, 0x83, 0x08, 0xce, 0x24, 0x8d, 0xbe, - 0xc3, 0x82, 0xb3, 0xf1, 0xe7, 0xaf, 0xdc, 0x6f, 0x3b, 0x5e, 0x23, 0x6e, 0xb8, 0xd4, 0x7f, 0xc3, - 0xf4, 0x4c, 0x3e, 0xbb, 0x9c, 0x47, 0x09, 0xe7, 0x37, 0x32, 0xb7, 0x0c, 0xa7, 0x33, 0x57, 0x0b, - 0x9a, 0x82, 0xe2, 0x2e, 0xe1, 0x5c, 0x50, 0x09, 0xd3, 0x9f, 0xe8, 0x14, 0x0c, 0xee, 0x39, 0xcd, - 0x8e, 0xd8, 0x28, 0x98, 0xff, 0x79, 0xa5, 0xf0, 0xb2, 0x65, 0xff, 0xeb, 0x22, 0x4c, 0x2e, 0xd7, - 0x2a, 0x0f, 0xb5, 0x0b, 0xf5, 0x6b, 0xa8, 0xd0, 0xf5, 0x1a, 0x8a, 0x2f, 0xb5, 0x62, 0xee, 0xa5, - 0xf6, 0xff, 0x67, 0x6c, 0xa1, 0x01, 0xb6, 0x85, 0xbe, 0x25, 0x67, 0x0b, 0x1d, 0xf3, 0xc6, 0xd9, - 0xcb, 0x59, 0x45, 0x83, 0x6c, 0x32, 0x33, 0x39, 0x96, 0x9b, 0x7e, 0xdd, 0x69, 0x26, 0x8f, 0xbe, - 0x23, 0x2e, 0xa5, 0xe3, 0x99, 0xc7, 0x3a, 0x8c, 0x2d, 0x3b, 0x6d, 0x67, 0xd3, 0x6d, 0xba, 0x91, - 0x4b, 0x42, 0xf4, 0x14, 0x14, 0x9d, 0x46, 0x83, 0x71, 0x5b, 0xa5, 0xa5, 0xd3, 0x0f, 0x0e, 0xe6, - 0x8b, 0x8b, 0x0d, 0x7a, 0xed, 0x83, 0xc2, 0xda, 0xc7, 0x14, 0x03, 0x7d, 0x10, 0x06, 0x1a, 0x81, - 0xdf, 0x9e, 0x2d, 0x30, 0x4c, 0xba, 0xeb, 0x06, 0xca, 0x81, 0xdf, 0x4e, 0xa0, 0x32, 0x1c, 0xfb, - 0xd7, 0x0a, 0xf0, 0xc4, 0x32, 0x69, 0xef, 0xac, 0xd6, 0x72, 0xce, 0xef, 0xcb, 0x30, 0xd2, 0xf2, - 0x3d, 0x37, 0xf2, 0x83, 0x50, 0x34, 0xcd, 0x56, 0xc4, 0x9a, 0x28, 0xc3, 0x0a, 0x8a, 0x2e, 0xc0, - 0x40, 0x3b, 0x66, 0x2a, 0xc7, 0x24, 0x43, 0xca, 0xd8, 0x49, 0x06, 0xa1, 0x18, 0x9d, 0x90, 0x04, - 0x62, 0xc5, 0x28, 0x8c, 0xdb, 0x21, 0x09, 0x30, 0x83, 0xc4, 0x37, 0x33, 0xbd, 0xb3, 0xc5, 0x09, - 0x9d, 0xb8, 0x99, 0x29, 0x04, 0x6b, 0x58, 0xa8, 0x0a, 0xa5, 0x30, 0x31, 0xb3, 0x7d, 0x6d, 0xd3, - 0x71, 0x76, 0x75, 0xab, 0x99, 0x8c, 0x89, 0x18, 0x37, 0xca, 0x50, 0xcf, 0xab, 0xfb, 0x2b, 0x05, - 0x40, 0x7c, 0x08, 0xbf, 0xc1, 0x06, 0xee, 0x76, 0x7a, 0xe0, 0xfa, 0xdf, 0x12, 0xc7, 0x35, 0x7a, - 0x7f, 0x6e, 0xc1, 0x13, 0xcb, 0xae, 0xd7, 0x20, 0x41, 0xce, 0x02, 0x7c, 0x34, 0x6f, 0xd9, 0xa3, - 0x31, 0x0d, 0xc6, 0x12, 0x1b, 0x38, 0x86, 0x25, 0x66, 0xff, 0x89, 0x05, 0x88, 0x7f, 0xf6, 0xbb, - 0xee, 0x63, 0x6f, 0xa7, 0x3f, 0xf6, 0x18, 0x96, 0x85, 0x7d, 0x13, 0x26, 0x96, 0x9b, 0x2e, 0xf1, - 0xa2, 0x4a, 0x75, 0xd9, 0xf7, 0xb6, 0xdc, 0x6d, 0xf4, 0x0a, 0x4c, 0x44, 0x6e, 0x8b, 0xf8, 0x9d, - 0xa8, 0x46, 0xea, 0xbe, 0xc7, 0x5e, 0x92, 0xd6, 0xe5, 0xc1, 0x25, 0xf4, 0xe0, 0x60, 0x7e, 0x62, - 0xc3, 0x80, 0xe0, 0x04, 0xa6, 0xfd, 0x7b, 0x74, 0xfc, 0xfc, 0x56, 0xdb, 0xf7, 0x88, 0x17, 0x2d, - 0xfb, 0x5e, 0x83, 0x4b, 0x1c, 0x5e, 0x81, 0x81, 0x88, 0x8e, 0x07, 0x1f, 0xbb, 0x4b, 0x72, 0xa3, - 0xd0, 0x51, 0x38, 0x3c, 0x98, 0x3f, 0x93, 0xae, 0xc1, 0xc6, 0x89, 0xd5, 0x41, 0xdf, 0x02, 0x43, - 0x61, 0xe4, 0x44, 0x9d, 0x50, 0x8c, 0xe6, 0x93, 0x72, 0x34, 0x6b, 0xac, 0xf4, 0xf0, 0x60, 0x7e, - 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, 0x17, 0x61, 0x90, 0x04, 0x81, 0x1f, - 0x88, 0x3d, 0x3a, 0x2e, 0x10, 0x07, 0x57, 0x68, 0x21, 0xe6, 0x30, 0xfb, 0x3f, 0x58, 0x30, 0xa9, - 0xfa, 0xca, 0xdb, 0x3a, 0x81, 0x57, 0xc1, 0xa7, 0x00, 0xea, 0xf2, 0x03, 0x43, 0x76, 0x7b, 0x8c, - 0x3e, 0x7f, 0x29, 0xf3, 0xa2, 0x4e, 0x0d, 0x63, 0x4c, 0x59, 0x15, 0x85, 0x58, 0xa3, 0x66, 0xff, - 0x33, 0x0b, 0x66, 0x12, 0x5f, 0x74, 0xd3, 0x0d, 0x23, 0xf4, 0x66, 0xea, 0xab, 0x16, 0xfa, 0xfb, - 0x2a, 0x5a, 0x9b, 0x7d, 0x93, 0x5a, 0xca, 0xb2, 0x44, 0xfb, 0xa2, 0xeb, 0x30, 0xe8, 0x46, 0xa4, - 0x25, 0x3f, 0xe6, 0x62, 0xd7, 0x8f, 0xe1, 0xbd, 0x8a, 0x67, 0xa4, 0x42, 0x6b, 0x62, 0x4e, 0xc0, - 0xfe, 0xb5, 0x22, 0x94, 0xf8, 0xb2, 0x5d, 0x73, 0xda, 0x27, 0x30, 0x17, 0xcf, 0x40, 0xc9, 0x6d, - 0xb5, 0x3a, 0x91, 0xb3, 0x29, 0x8e, 0xf3, 0x11, 0xbe, 0xb5, 0x2a, 0xb2, 0x10, 0xc7, 0x70, 0x54, - 0x81, 0x01, 0xd6, 0x15, 0xfe, 0x95, 0x4f, 0x65, 0x7f, 0xa5, 0xe8, 0xfb, 0x42, 0xd9, 0x89, 0x1c, - 0xce, 0x49, 0xa9, 0x7b, 0x84, 0x16, 0x61, 0x46, 0x02, 0x39, 0x00, 0x9b, 0xae, 0xe7, 0x04, 0xfb, - 0xb4, 0x6c, 0xb6, 0xc8, 0x08, 0x3e, 0xd7, 0x9d, 0xe0, 0x92, 0xc2, 0xe7, 0x64, 0xd5, 0x87, 0xc5, - 0x00, 0xac, 0x11, 0x9d, 0xfb, 0x08, 0x94, 0x14, 0xf2, 0x51, 0x18, 0xa2, 0xb9, 0x8f, 0xc1, 0x64, - 0xa2, 0xad, 0x5e, 0xd5, 0xc7, 0x74, 0x7e, 0xea, 0x97, 0xd9, 0x91, 0x21, 0x7a, 0xbd, 0xe2, 0xed, - 0x89, 0x23, 0xf7, 0x6d, 0x38, 0xd5, 0xcc, 0x38, 0xc9, 0xc4, 0xbc, 0xf6, 0x7f, 0xf2, 0x3d, 0x21, - 0x3e, 0xfb, 0x54, 0x16, 0x14, 0x67, 0xb6, 0x41, 0x79, 0x04, 0xbf, 0x4d, 0x37, 0x88, 0xd3, 0xd4, - 0xd9, 0xed, 0x5b, 0xa2, 0x0c, 0x2b, 0x28, 0x3d, 0xef, 0x4e, 0xa9, 0xce, 0xdf, 0x20, 0xfb, 0x35, - 0xd2, 0x24, 0xf5, 0xc8, 0x0f, 0xbe, 0xae, 0xdd, 0x3f, 0xc7, 0x47, 0x9f, 0x1f, 0x97, 0xa3, 0x82, - 0x40, 0xf1, 0x06, 0xd9, 0xe7, 0x53, 0xa1, 0x7f, 0x5d, 0xb1, 0xeb, 0xd7, 0xfd, 0xac, 0x05, 0xe3, - 0xea, 0xeb, 0x4e, 0xe0, 0x5c, 0x58, 0x32, 0xcf, 0x85, 0x73, 0x5d, 0x17, 0x78, 0xce, 0x89, 0xf0, - 0x95, 0x02, 0x9c, 0x55, 0x38, 0xf4, 0x6d, 0xc0, 0xff, 0x88, 0x55, 0x75, 0x05, 0x4a, 0x9e, 0x92, - 0x5a, 0x59, 0xa6, 0xb8, 0x28, 0x96, 0x59, 0xc5, 0x38, 0x94, 0xc5, 0xf3, 0x62, 0xd1, 0xd2, 0x98, - 0x2e, 0xce, 0x15, 0xa2, 0xdb, 0x25, 0x28, 0x76, 0xdc, 0x86, 0xb8, 0x60, 0x3e, 0x24, 0x47, 0xfb, - 0x76, 0xa5, 0x7c, 0x78, 0x30, 0xff, 0x64, 0x9e, 0x2a, 0x81, 0xde, 0x6c, 0xe1, 0xc2, 0xed, 0x4a, - 0x19, 0xd3, 0xca, 0x68, 0x11, 0x26, 0xa5, 0xb6, 0xe4, 0x0e, 0x65, 0xb7, 0x7c, 0x4f, 0xdc, 0x43, - 0x4a, 0x26, 0x8b, 0x4d, 0x30, 0x4e, 0xe2, 0xa3, 0x32, 0x4c, 0xed, 0x76, 0x36, 0x49, 0x93, 0x44, - 0xfc, 0x83, 0x6f, 0x10, 0x2e, 0xb1, 0x2c, 0xc5, 0x2f, 0xb3, 0x1b, 0x09, 0x38, 0x4e, 0xd5, 0xb0, - 0xff, 0x92, 0xdd, 0x07, 0x62, 0xf4, 0xaa, 0x81, 0x4f, 0x17, 0x16, 0xa5, 0xfe, 0xf5, 0x5c, 0xce, - 0xfd, 0xac, 0x8a, 0x1b, 0x64, 0x7f, 0xc3, 0xa7, 0x9c, 0x79, 0xf6, 0xaa, 0x30, 0xd6, 0xfc, 0x40, - 0xd7, 0x35, 0xff, 0xf3, 0x05, 0x38, 0xad, 0x46, 0xc0, 0x60, 0x02, 0xbf, 0xd1, 0xc7, 0xe0, 0x2a, - 0x8c, 0x36, 0xc8, 0x96, 0xd3, 0x69, 0x46, 0x4a, 0x7c, 0x3e, 0xc8, 0x55, 0x28, 0xe5, 0xb8, 0x18, - 0xeb, 0x38, 0x47, 0x18, 0xb6, 0xff, 0x35, 0xca, 0x2e, 0xe2, 0xc8, 0xa1, 0x6b, 0x5c, 0xed, 0x1a, - 0x2b, 0x77, 0xd7, 0x5c, 0x84, 0x41, 0xb7, 0x45, 0x19, 0xb3, 0x82, 0xc9, 0x6f, 0x55, 0x68, 0x21, - 0xe6, 0x30, 0xf4, 0x01, 0x18, 0xae, 0xfb, 0xad, 0x96, 0xe3, 0x35, 0xd8, 0x95, 0x57, 0x5a, 0x1a, - 0xa5, 0xbc, 0xdb, 0x32, 0x2f, 0xc2, 0x12, 0x86, 0x9e, 0x80, 0x01, 0x27, 0xd8, 0xe6, 0x32, 0x8c, - 0xd2, 0xd2, 0x08, 0x6d, 0x69, 0x31, 0xd8, 0x0e, 0x31, 0x2b, 0xa5, 0x4f, 0xb0, 0x7b, 0x7e, 0xb0, - 0xeb, 0x7a, 0xdb, 0x65, 0x37, 0x10, 0x5b, 0x42, 0xdd, 0x85, 0x77, 0x15, 0x04, 0x6b, 0x58, 0x68, - 0x15, 0x06, 0xdb, 0x7e, 0x10, 0x85, 0xb3, 0x43, 0x6c, 0xb8, 0x9f, 0xcc, 0x39, 0x88, 0xf8, 0xd7, - 0x56, 0xfd, 0x20, 0x8a, 0x3f, 0x80, 0xfe, 0x0b, 0x31, 0xaf, 0x8e, 0x6e, 0xc2, 0x30, 0xf1, 0xf6, - 0x56, 0x03, 0xbf, 0x35, 0x3b, 0x93, 0x4f, 0x69, 0x85, 0xa3, 0xf0, 0x65, 0x16, 0xf3, 0xa8, 0xa2, - 0x18, 0x4b, 0x12, 0xe8, 0x5b, 0xa0, 0x48, 0xbc, 0xbd, 0xd9, 0x61, 0x46, 0x69, 0x2e, 0x87, 0xd2, - 0x1d, 0x27, 0x88, 0xcf, 0xfc, 0x15, 0x6f, 0x0f, 0xd3, 0x3a, 0xe8, 0x93, 0x50, 0x92, 0x07, 0x46, - 0x28, 0x84, 0x75, 0x99, 0x0b, 0x56, 0x1e, 0x33, 0x98, 0xbc, 0xd5, 0x71, 0x03, 0xd2, 0x22, 0x5e, - 0x14, 0xc6, 0x27, 0xa4, 0x84, 0x86, 0x38, 0xa6, 0x86, 0x3e, 0x29, 0x25, 0xc4, 0x6b, 0x7e, 0xc7, - 0x8b, 0xc2, 0xd9, 0x12, 0xeb, 0x5e, 0xa6, 0xee, 0xee, 0x4e, 0x8c, 0x97, 0x14, 0x21, 0xf3, 0xca, - 0xd8, 0x20, 0x85, 0x3e, 0x0d, 0xe3, 0xfc, 0x3f, 0xd7, 0x80, 0x85, 0xb3, 0xa7, 0x19, 0xed, 0x0b, - 0xf9, 0xb4, 0x39, 0xe2, 0xd2, 0x69, 0x41, 0x7c, 0x5c, 0x2f, 0x0d, 0xb1, 0x49, 0x0d, 0x61, 0x18, - 0x6f, 0xba, 0x7b, 0xc4, 0x23, 0x61, 0x58, 0x0d, 0xfc, 0x4d, 0x32, 0x0b, 0x6c, 0x60, 0xce, 0x66, - 0x6b, 0xcc, 0xfc, 0x4d, 0xb2, 0x34, 0x4d, 0x69, 0xde, 0xd4, 0xeb, 0x60, 0x93, 0x04, 0xba, 0x0d, - 0x13, 0xf4, 0xc5, 0xe6, 0xc6, 0x44, 0x47, 0x7b, 0x11, 0x65, 0xef, 0x2a, 0x6c, 0x54, 0xc2, 0x09, - 0x22, 0xe8, 0x16, 0x8c, 0x85, 0x91, 0x13, 0x44, 0x9d, 0x36, 0x27, 0x7a, 0xa6, 0x17, 0x51, 0xa6, - 0x70, 0xad, 0x69, 0x55, 0xb0, 0x41, 0x00, 0xbd, 0x0e, 0xa5, 0xa6, 0xbb, 0x45, 0xea, 0xfb, 0xf5, - 0x26, 0x99, 0x1d, 0x63, 0xd4, 0x32, 0x0f, 0x95, 0x9b, 0x12, 0x89, 0xf3, 0xb9, 0xea, 0x2f, 0x8e, - 0xab, 0xa3, 0x3b, 0x70, 0x26, 0x22, 0x41, 0xcb, 0xf5, 0x1c, 0x7a, 0x18, 0x88, 0xa7, 0x15, 0x53, - 0x64, 0x8e, 0xb3, 0xdd, 0x76, 0x5e, 0xcc, 0xc6, 0x99, 0x8d, 0x4c, 0x2c, 0x9c, 0x53, 0x1b, 0xdd, - 0x87, 0xd9, 0x0c, 0x88, 0xdf, 0x74, 0xeb, 0xfb, 0xb3, 0xa7, 0x18, 0xe5, 0x8f, 0x0a, 0xca, 0xb3, - 0x1b, 0x39, 0x78, 0x87, 0x5d, 0x60, 0x38, 0x97, 0x3a, 0xba, 0x05, 0x93, 0xec, 0x04, 0xaa, 0x76, - 0x9a, 0x4d, 0xd1, 0xe0, 0x04, 0x6b, 0xf0, 0x03, 0xf2, 0x3e, 0xae, 0x98, 0xe0, 0xc3, 0x83, 0x79, - 0x88, 0xff, 0xe1, 0x64, 0x6d, 0xb4, 0xc9, 0x74, 0x66, 0x9d, 0xc0, 0x8d, 0xf6, 0xe9, 0xb9, 0x41, - 0xee, 0x47, 0xb3, 0x93, 0x5d, 0xe5, 0x15, 0x3a, 0xaa, 0x52, 0xac, 0xe9, 0x85, 0x38, 0x49, 0x90, - 0x1e, 0xa9, 0x61, 0xd4, 0x70, 0xbd, 0xd9, 0x29, 0xfe, 0x2e, 0x91, 0x27, 0x52, 0x8d, 0x16, 0x62, - 0x0e, 0x63, 0xfa, 0x32, 0xfa, 0xe3, 0x16, 0xbd, 0xb9, 0xa6, 0x19, 0x62, 0xac, 0x2f, 0x93, 0x00, - 0x1c, 0xe3, 0x50, 0x66, 0x32, 0x8a, 0xf6, 0x67, 0x11, 0x43, 0x55, 0x07, 0xcb, 0xc6, 0xc6, 0x27, - 0x31, 0x2d, 0xb7, 0x37, 0x61, 0x42, 0x1d, 0x84, 0x6c, 0x4c, 0xd0, 0x3c, 0x0c, 0x32, 0xf6, 0x49, - 0x48, 0xd7, 0x4a, 0xb4, 0x0b, 0x8c, 0xb5, 0xc2, 0xbc, 0x9c, 0x75, 0xc1, 0x7d, 0x9b, 0x2c, 0xed, - 0x47, 0x84, 0xbf, 0xe9, 0x8b, 0x5a, 0x17, 0x24, 0x00, 0xc7, 0x38, 0xf6, 0xff, 0xe5, 0x6c, 0x68, - 0x7c, 0xda, 0xf6, 0x71, 0xbf, 0x3c, 0x0b, 0x23, 0x3b, 0x7e, 0x18, 0x51, 0x6c, 0xd6, 0xc6, 0x60, - 0xcc, 0x78, 0x5e, 0x17, 0xe5, 0x58, 0x61, 0xa0, 0x57, 0x61, 0xbc, 0xae, 0x37, 0x20, 0x2e, 0x47, - 0x75, 0x8c, 0x18, 0xad, 0x63, 0x13, 0x17, 0xbd, 0x0c, 0x23, 0xcc, 0x06, 0xa4, 0xee, 0x37, 0x05, - 0xd7, 0x26, 0x6f, 0xf8, 0x91, 0xaa, 0x28, 0x3f, 0xd4, 0x7e, 0x63, 0x85, 0x8d, 0x2e, 0xc1, 0x10, - 0xed, 0x42, 0xa5, 0x2a, 0xae, 0x25, 0x25, 0x28, 0xba, 0xce, 0x4a, 0xb1, 0x80, 0xda, 0x7f, 0xad, - 0xa0, 0x8d, 0x32, 0x7d, 0x0f, 0x13, 0x54, 0x85, 0xe1, 0x7b, 0x8e, 0x1b, 0xb9, 0xde, 0xb6, 0xe0, - 0x3f, 0x9e, 0xee, 0x7a, 0x47, 0xb1, 0x4a, 0x77, 0x79, 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, 0xed, 0xc5, 0xb3, 0xbd, 0x89, 0x6e, - 0xa8, 0x3a, 0x4b, 0x13, 0xf4, 0x8e, 0x8e, 0xff, 0x63, 0x8d, 0x9e, 0x1d, 0x31, 0x3e, 0x2d, 0xdd, - 0x19, 0xf4, 0x6d, 0x74, 0x89, 0x3b, 0x41, 0x44, 0x1a, 0x8b, 0x91, 0x18, 0x9c, 0x0f, 0xf6, 0xf7, - 0x48, 0xd9, 0x70, 0x5b, 0x44, 0xdf, 0x0e, 0x82, 0x08, 0x8e, 0xe9, 0xd9, 0xbf, 0x58, 0x84, 0xd9, - 0xbc, 0xee, 0xd2, 0x45, 0x47, 0xee, 0xbb, 0xd1, 0x32, 0x65, 0xaf, 0x2c, 0x73, 0xd1, 0xad, 0x88, - 0x72, 0xac, 0x30, 0xe8, 0xec, 0x87, 0xee, 0xb6, 0x7c, 0x63, 0x0e, 0xc6, 0xb3, 0x5f, 0x63, 0xa5, - 0x58, 0x40, 0x29, 0x5e, 0x40, 0x9c, 0x50, 0x18, 0xf7, 0x68, 0xab, 0x04, 0xb3, 0x52, 0x2c, 0xa0, - 0xba, 0xb4, 0x6b, 0xa0, 0x87, 0xb4, 0xcb, 0x18, 0xa2, 0xc1, 0xe3, 0x1d, 0x22, 0xf4, 0x19, 0x80, - 0x2d, 0xd7, 0x73, 0xc3, 0x1d, 0x46, 0x7d, 0xe8, 0xc8, 0xd4, 0x15, 0x73, 0xb6, 0xaa, 0xa8, 0x60, - 0x8d, 0x22, 0x7a, 0x09, 0x46, 0xd5, 0x06, 0xac, 0x94, 0x99, 0xa6, 0x53, 0xb3, 0x1c, 0x89, 0x4f, - 0xa3, 0x32, 0xd6, 0xf1, 0xec, 0xcf, 0x25, 0xd7, 0x8b, 0xd8, 0x01, 0xda, 0xf8, 0x5a, 0xfd, 0x8e, - 0x6f, 0xa1, 0xfb, 0xf8, 0xda, 0x5f, 0x2b, 0xc2, 0xa4, 0xd1, 0x58, 0x27, 0xec, 0xe3, 0xcc, 0xba, - 0x46, 0x0f, 0x70, 0x27, 0x22, 0x62, 0xff, 0xd9, 0xbd, 0xb7, 0x8a, 0x7e, 0xc8, 0xd3, 0x1d, 0xc0, - 0xeb, 0xa3, 0xcf, 0x40, 0xa9, 0xe9, 0x84, 0x4c, 0x72, 0x46, 0xc4, 0xbe, 0xeb, 0x87, 0x58, 0xfc, - 0x30, 0x71, 0xc2, 0x48, 0xbb, 0x35, 0x39, 0xed, 0x98, 0x24, 0xbd, 0x69, 0x28, 0x7f, 0x22, 0xad, - 0xc7, 0x54, 0x27, 0x28, 0x13, 0xb3, 0x8f, 0x39, 0x0c, 0xbd, 0x0c, 0x63, 0x01, 0x61, 0xab, 0x62, - 0x99, 0x72, 0x73, 0x6c, 0x99, 0x0d, 0xc6, 0x6c, 0x1f, 0xd6, 0x60, 0xd8, 0xc0, 0x8c, 0xdf, 0x06, - 0x43, 0x5d, 0xde, 0x06, 0x4f, 0xc3, 0x30, 0xfb, 0xa1, 0x56, 0x80, 0x9a, 0x8d, 0x0a, 0x2f, 0xc6, - 0x12, 0x9e, 0x5c, 0x30, 0x23, 0xfd, 0x2d, 0x18, 0xfa, 0xfa, 0x10, 0x8b, 0x9a, 0x69, 0x99, 0x47, - 0xf8, 0x29, 0x27, 0x96, 0x3c, 0x96, 0x30, 0xfb, 0x83, 0x30, 0x51, 0x76, 0x48, 0xcb, 0xf7, 0x56, - 0xbc, 0x46, 0xdb, 0x77, 0xbd, 0x08, 0xcd, 0xc2, 0x00, 0xbb, 0x44, 0xf8, 0x11, 0x30, 0x40, 0x1b, - 0xc2, 0xac, 0xc4, 0xde, 0x86, 0xd3, 0x65, 0xff, 0x9e, 0x77, 0xcf, 0x09, 0x1a, 0x8b, 0xd5, 0x8a, - 0xf6, 0xbe, 0x5e, 0x97, 0xef, 0x3b, 0x6e, 0xb4, 0x95, 0x79, 0xf4, 0x6a, 0x35, 0x39, 0x5b, 0xbb, - 0xea, 0x36, 0x49, 0x8e, 0x14, 0xe4, 0x6f, 0x14, 0x8c, 0x96, 0x62, 0x7c, 0xa5, 0xd5, 0xb2, 0x72, - 0xb5, 0x5a, 0x6f, 0xc0, 0xc8, 0x96, 0x4b, 0x9a, 0x0d, 0x4c, 0xb6, 0xc4, 0x4a, 0x7c, 0x2a, 0xdf, - 0x0e, 0x65, 0x95, 0x62, 0x4a, 0xa9, 0x17, 0x7f, 0x1d, 0xae, 0x8a, 0xca, 0x58, 0x91, 0x41, 0xbb, - 0x30, 0x25, 0x1f, 0x0c, 0x12, 0x2a, 0xd6, 0xe5, 0xd3, 0xdd, 0x5e, 0x21, 0x26, 0xf1, 0x53, 0x0f, - 0x0e, 0xe6, 0xa7, 0x70, 0x82, 0x0c, 0x4e, 0x11, 0xa6, 0xcf, 0xc1, 0x16, 0x3d, 0x81, 0x07, 0xd8, - 0xf0, 0xb3, 0xe7, 0x20, 0x7b, 0xd9, 0xb2, 0x52, 0xfb, 0xc7, 0x2c, 0x78, 0x2c, 0x35, 0x32, 0xe2, - 0x85, 0x7f, 0xcc, 0xb3, 0x90, 0x7c, 0x71, 0x17, 0x7a, 0xbf, 0xb8, 0xed, 0xbf, 0x6f, 0xc1, 0xa9, - 0x95, 0x56, 0x3b, 0xda, 0x2f, 0xbb, 0xa6, 0x0a, 0xea, 0x23, 0x30, 0xd4, 0x22, 0x0d, 0xb7, 0xd3, - 0x12, 0x33, 0x37, 0x2f, 0x4f, 0xa9, 0x35, 0x56, 0x7a, 0x78, 0x30, 0x3f, 0x5e, 0x8b, 0xfc, 0xc0, - 0xd9, 0x26, 0xbc, 0x00, 0x0b, 0x74, 0x76, 0xd6, 0xbb, 0x6f, 0x93, 0x9b, 0x6e, 0xcb, 0x95, 0x76, - 0x45, 0x5d, 0x65, 0x76, 0x0b, 0x72, 0x40, 0x17, 0xde, 0xe8, 0x38, 0x5e, 0xe4, 0x46, 0xfb, 0x42, - 0x7b, 0x24, 0x89, 0xe0, 0x98, 0x9e, 0xfd, 0x55, 0x0b, 0x26, 0xe5, 0xba, 0x5f, 0x6c, 0x34, 0x02, - 0x12, 0x86, 0x68, 0x0e, 0x0a, 0x6e, 0x5b, 0xf4, 0x12, 0x44, 0x2f, 0x0b, 0x95, 0x2a, 0x2e, 0xb8, - 0x6d, 0xc9, 0x96, 0xb1, 0x83, 0xb0, 0x68, 0x2a, 0xd2, 0xae, 0x8b, 0x72, 0xac, 0x30, 0xd0, 0x65, - 0x18, 0xf1, 0xfc, 0x06, 0xb7, 0xed, 0xe2, 0x57, 0x1a, 0x5b, 0x60, 0xeb, 0xa2, 0x0c, 0x2b, 0x28, - 0xaa, 0x42, 0x89, 0x9b, 0x3d, 0xc5, 0x8b, 0xb6, 0x2f, 0xe3, 0x29, 0xf6, 0x65, 0x1b, 0xb2, 0x26, - 0x8e, 0x89, 0xd8, 0xbf, 0x6a, 0xc1, 0x98, 0xfc, 0xb2, 0x3e, 0x79, 0x4e, 0xba, 0xb5, 0x62, 0x7e, - 0x33, 0xde, 0x5a, 0x94, 0x67, 0x64, 0x10, 0x83, 0x55, 0x2c, 0x1e, 0x89, 0x55, 0xbc, 0x0a, 0xa3, - 0x4e, 0xbb, 0x5d, 0x35, 0xf9, 0x4c, 0xb6, 0x94, 0x16, 0xe3, 0x62, 0xac, 0xe3, 0xd8, 0x3f, 0x5a, - 0x80, 0x09, 0xf9, 0x05, 0xb5, 0xce, 0x66, 0x48, 0x22, 0xb4, 0x01, 0x25, 0x87, 0xcf, 0x12, 0x91, - 0x8b, 0xfc, 0x62, 0xb6, 0x1c, 0xc1, 0x98, 0xd2, 0xf8, 0xc2, 0x5f, 0x94, 0xb5, 0x71, 0x4c, 0x08, - 0x35, 0x61, 0xda, 0xf3, 0x23, 0x76, 0xf8, 0x2b, 0x78, 0x37, 0xd5, 0x4e, 0x92, 0xfa, 0x59, 0x41, - 0x7d, 0x7a, 0x3d, 0x49, 0x05, 0xa7, 0x09, 0xa3, 0x15, 0x29, 0x9b, 0x29, 0xe6, 0x0b, 0x03, 0xf4, - 0x89, 0xcb, 0x16, 0xcd, 0xd8, 0xbf, 0x62, 0x41, 0x49, 0xa2, 0x9d, 0x84, 0x16, 0x6f, 0x0d, 0x86, - 0x43, 0x36, 0x09, 0x72, 0x68, 0xec, 0x6e, 0x1d, 0xe7, 0xf3, 0x15, 0xdf, 0x69, 0xfc, 0x7f, 0x88, - 0x25, 0x0d, 0x26, 0x9a, 0x57, 0xdd, 0x7f, 0x97, 0x88, 0xe6, 0x55, 0x7f, 0x72, 0x2e, 0xa5, 0x3f, - 0x62, 0x7d, 0xd6, 0x64, 0x5d, 0x94, 0xf5, 0x6a, 0x07, 0x64, 0xcb, 0xbd, 0x9f, 0x64, 0xbd, 0xaa, - 0xac, 0x14, 0x0b, 0x28, 0x7a, 0x13, 0xc6, 0xea, 0x52, 0x26, 0x1b, 0xef, 0xf0, 0x4b, 0x5d, 0xf5, - 0x03, 0x4a, 0x95, 0xc4, 0x65, 0x21, 0xcb, 0x5a, 0x7d, 0x6c, 0x50, 0x33, 0xcd, 0x08, 0x8a, 0xbd, - 0xcc, 0x08, 0x62, 0xba, 0xf9, 0x4a, 0xf5, 0x1f, 0xb7, 0x60, 0x88, 0xcb, 0xe2, 0xfa, 0x13, 0x85, - 0x6a, 0x9a, 0xb5, 0x78, 0xec, 0xee, 0xd0, 0x42, 0xa1, 0x29, 0x43, 0x6b, 0x50, 0x62, 0x3f, 0x98, - 0x2c, 0xb1, 0x98, 0x6f, 0x75, 0xcf, 0x5b, 0xd5, 0x3b, 0x78, 0x47, 0x56, 0xc3, 0x31, 0x05, 0xfb, - 0x87, 0x8b, 0xf4, 0x74, 0x8b, 0x51, 0x8d, 0x4b, 0xdf, 0x7a, 0x74, 0x97, 0x7e, 0xe1, 0x51, 0x5d, - 0xfa, 0xdb, 0x30, 0x59, 0xd7, 0xf4, 0x70, 0xf1, 0x4c, 0x5e, 0xee, 0xba, 0x48, 0x34, 0x95, 0x1d, - 0x97, 0xb2, 0x2c, 0x9b, 0x44, 0x70, 0x92, 0x2a, 0xfa, 0x36, 0x18, 0xe3, 0xf3, 0x2c, 0x5a, 0xe1, - 0x96, 0x18, 0x1f, 0xc8, 0x5f, 0x2f, 0x7a, 0x13, 0x5c, 0x2a, 0xa7, 0x55, 0xc7, 0x06, 0x31, 0xfb, - 0x4f, 0x2d, 0x40, 0x2b, 0xed, 0x1d, 0xd2, 0x22, 0x81, 0xd3, 0x8c, 0xc5, 0xe9, 0xdf, 0x6f, 0xc1, - 0x2c, 0x49, 0x15, 0x2f, 0xfb, 0xad, 0x96, 0x78, 0xb4, 0xe4, 0xbc, 0xab, 0x57, 0x72, 0xea, 0x28, - 0xb7, 0x84, 0xd9, 0x3c, 0x0c, 0x9c, 0xdb, 0x1e, 0x5a, 0x83, 0x19, 0x7e, 0x4b, 0x2a, 0x80, 0x66, - 0x7b, 0xfd, 0xb8, 0x20, 0x3c, 0xb3, 0x91, 0x46, 0xc1, 0x59, 0xf5, 0xec, 0xef, 0x1a, 0x83, 0xdc, - 0x5e, 0xbc, 0xa7, 0x47, 0x78, 0x4f, 0x8f, 0xf0, 0x9e, 0x1e, 0xe1, 0x3d, 0x3d, 0xc2, 0x7b, 0x7a, - 0x84, 0x6f, 0x7a, 0x3d, 0xc2, 0x1f, 0x5b, 0x30, 0x93, 0xbe, 0x06, 0x4e, 0x82, 0x31, 0xef, 0xc0, - 0x4c, 0xfa, 0xae, 0xeb, 0x6a, 0x67, 0x97, 0xee, 0x67, 0x7c, 0xef, 0x65, 0x7c, 0x03, 0xce, 0xa2, - 0x6f, 0xff, 0xba, 0x05, 0xa7, 0x15, 0xb2, 0xf1, 0xd2, 0xff, 0x3c, 0xcc, 0xf0, 0xf3, 0x65, 0xb9, - 0xe9, 0xb8, 0xad, 0x0d, 0xd2, 0x6a, 0x37, 0x9d, 0x48, 0x9a, 0x19, 0x5c, 0xcd, 0xdc, 0xaa, 0x09, - 0x13, 0x5d, 0xa3, 0xe2, 0xd2, 0x63, 0xb4, 0x5f, 0x19, 0x00, 0x9c, 0xd5, 0x8c, 0x61, 0x94, 0x5a, - 0xe8, 0x69, 0x26, 0xfc, 0x8b, 0x23, 0x30, 0xb8, 0xb2, 0x47, 0xbc, 0xe8, 0x04, 0x26, 0xaa, 0x0e, - 0x13, 0xae, 0xb7, 0xe7, 0x37, 0xf7, 0x48, 0x83, 0xc3, 0x8f, 0xf2, 0xd0, 0x3f, 0x23, 0x48, 0x4f, - 0x54, 0x0c, 0x12, 0x38, 0x41, 0xf2, 0x51, 0x08, 0xdb, 0xaf, 0xc1, 0x10, 0xbf, 0xe3, 0x84, 0xa4, - 0x3d, 0xf3, 0x4a, 0x63, 0x83, 0x28, 0x6e, 0xee, 0x58, 0x11, 0xc0, 0xef, 0x50, 0x51, 0x1d, 0x7d, - 0x0e, 0x26, 0xb6, 0xdc, 0x20, 0x8c, 0x36, 0xdc, 0x16, 0x09, 0x23, 0xa7, 0xd5, 0x7e, 0x08, 0xe1, - 0xba, 0x1a, 0x87, 0x55, 0x83, 0x12, 0x4e, 0x50, 0x46, 0xdb, 0x30, 0xde, 0x74, 0xf4, 0xa6, 0x86, - 0x8f, 0xdc, 0x94, 0xba, 0x3c, 0x6f, 0xea, 0x84, 0xb0, 0x49, 0x97, 0x9e, 0x36, 0x75, 0x26, 0x1f, - 0x1e, 0x61, 0x52, 0x13, 0x75, 0xda, 0x70, 0xc1, 0x30, 0x87, 0x51, 0x3e, 0x90, 0xd9, 0x0f, 0x97, - 0x4c, 0x3e, 0x50, 0xb3, 0x12, 0xfe, 0x2c, 0x94, 0x08, 0x1d, 0x42, 0x4a, 0x58, 0xdc, 0xbf, 0x57, - 0xfa, 0xeb, 0xeb, 0x9a, 0x5b, 0x0f, 0x7c, 0x53, 0xad, 0xb1, 0x22, 0x29, 0xe1, 0x98, 0x28, 0x5a, - 0x86, 0xa1, 0x90, 0x04, 0x2e, 0x09, 0xc5, 0x4d, 0xdc, 0x65, 0x1a, 0x19, 0x1a, 0x77, 0xbd, 0xe1, - 0xbf, 0xb1, 0xa8, 0x4a, 0x97, 0x97, 0xc3, 0x24, 0xbe, 0xec, 0xae, 0xd4, 0x96, 0xd7, 0x22, 0x2b, - 0xc5, 0x02, 0x8a, 0x5e, 0x87, 0xe1, 0x80, 0x34, 0x99, 0xde, 0x6c, 0xbc, 0xff, 0x45, 0xce, 0xd5, - 0x70, 0xbc, 0x1e, 0x96, 0x04, 0xd0, 0x0d, 0x40, 0x01, 0xa1, 0x7c, 0xa4, 0xeb, 0x6d, 0x2b, 0xab, - 0x5a, 0x71, 0x0f, 0xa9, 0x73, 0x0b, 0xc7, 0x18, 0xd2, 0x0b, 0x0a, 0x67, 0x54, 0x43, 0xd7, 0x60, - 0x5a, 0x95, 0x56, 0xbc, 0x30, 0x72, 0xe8, 0xf9, 0x3f, 0xc9, 0x68, 0x29, 0x31, 0x0e, 0x4e, 0x22, - 0xe0, 0x74, 0x1d, 0xfb, 0xcb, 0x16, 0xf0, 0x71, 0x3e, 0x01, 0xe1, 0xc5, 0x6b, 0xa6, 0xf0, 0xe2, - 0x6c, 0xee, 0xcc, 0xe5, 0x08, 0x2e, 0xbe, 0x6c, 0xc1, 0xa8, 0x36, 0xb3, 0xf1, 0x9a, 0xb5, 0xba, - 0xac, 0xd9, 0x0e, 0x4c, 0xd1, 0x95, 0x7e, 0x6b, 0x33, 0x24, 0xc1, 0x1e, 0x69, 0xb0, 0x85, 0x59, - 0x78, 0xb8, 0x85, 0xa9, 0x2c, 0xf8, 0x6e, 0x26, 0x08, 0xe2, 0x54, 0x13, 0xf6, 0x67, 0x65, 0x57, - 0x95, 0xc1, 0x63, 0x5d, 0xcd, 0x79, 0xc2, 0xe0, 0x51, 0xcd, 0x2a, 0x8e, 0x71, 0xe8, 0x56, 0xdb, - 0xf1, 0xc3, 0x28, 0x69, 0xf0, 0x78, 0xdd, 0x0f, 0x23, 0xcc, 0x20, 0xf6, 0x0b, 0x00, 0x2b, 0xf7, - 0x49, 0x9d, 0xaf, 0x58, 0xfd, 0x6d, 0x65, 0xe5, 0xbf, 0xad, 0xec, 0xdf, 0xb6, 0x60, 0x62, 0x75, - 0xd9, 0xb8, 0xe7, 0x16, 0x00, 0xf8, 0x83, 0xf0, 0xee, 0xdd, 0x75, 0x69, 0x2d, 0xc0, 0x15, 0xbe, - 0xaa, 0x14, 0x6b, 0x18, 0xe8, 0x2c, 0x14, 0x9b, 0x1d, 0x4f, 0x48, 0x57, 0x87, 0x29, 0xf7, 0x70, - 0xb3, 0xe3, 0x61, 0x5a, 0xa6, 0x79, 0x5c, 0x14, 0xfb, 0xf6, 0xb8, 0xe8, 0x19, 0xf9, 0x00, 0xcd, - 0xc3, 0xe0, 0xbd, 0x7b, 0x6e, 0x83, 0xfb, 0x97, 0x0a, 0x4b, 0x86, 0xbb, 0x77, 0x2b, 0xe5, 0x10, - 0xf3, 0x72, 0xfb, 0x4b, 0x45, 0x98, 0x5b, 0x6d, 0x92, 0xfb, 0xef, 0xd0, 0xc7, 0xb6, 0x5f, 0x7f, - 0x91, 0xa3, 0xc9, 0xa9, 0x8e, 0xea, 0x13, 0xd4, 0x7b, 0x3c, 0xb6, 0x60, 0x98, 0xdb, 0xfb, 0x49, - 0x8f, 0xdb, 0x57, 0xb3, 0x5a, 0xcf, 0x1f, 0x90, 0x05, 0x6e, 0x37, 0x28, 0x1c, 0x06, 0xd5, 0x85, - 0x29, 0x4a, 0xb1, 0x24, 0x3e, 0xf7, 0x0a, 0x8c, 0xe9, 0x98, 0x47, 0xf2, 0xce, 0xfb, 0x2b, 0x45, - 0x98, 0xa2, 0x3d, 0x78, 0xa4, 0x13, 0x71, 0x3b, 0x3d, 0x11, 0xc7, 0xed, 0xa1, 0xd5, 0x7b, 0x36, - 0xde, 0x4c, 0xce, 0xc6, 0xd5, 0xbc, 0xd9, 0x38, 0xe9, 0x39, 0xf8, 0x4e, 0x0b, 0x66, 0x56, 0x9b, - 0x7e, 0x7d, 0x37, 0xe1, 0x45, 0xf5, 0x12, 0x8c, 0xd2, 0xe3, 0x38, 0x34, 0x1c, 0xfc, 0x8d, 0x90, - 0x0f, 0x02, 0x84, 0x75, 0x3c, 0xad, 0xda, 0xed, 0xdb, 0x95, 0x72, 0x56, 0xa4, 0x08, 0x01, 0xc2, - 0x3a, 0x9e, 0xfd, 0x9b, 0x16, 0x9c, 0xbb, 0xb6, 0xbc, 0x12, 0x2f, 0xc5, 0x54, 0xb0, 0x8a, 0x4b, - 0x30, 0xd4, 0x6e, 0x68, 0x5d, 0x89, 0xa5, 0xcf, 0x65, 0xd6, 0x0b, 0x01, 0x7d, 0xb7, 0x04, 0x62, - 0xf9, 0x69, 0x0b, 0x66, 0xae, 0xb9, 0x11, 0xbd, 0x5d, 0x93, 0x61, 0x13, 0xe8, 0xf5, 0x1a, 0xba, - 0x91, 0x1f, 0xec, 0x27, 0xc3, 0x26, 0x60, 0x05, 0xc1, 0x1a, 0x16, 0x6f, 0x79, 0xcf, 0x65, 0x96, - 0xe6, 0x05, 0x53, 0x0f, 0x87, 0x45, 0x39, 0x56, 0x18, 0xf4, 0xc3, 0x1a, 0x6e, 0xc0, 0x44, 0x98, - 0xfb, 0xe2, 0x84, 0x55, 0x1f, 0x56, 0x96, 0x00, 0x1c, 0xe3, 0xd0, 0xd7, 0xdc, 0xfc, 0xb5, 0x66, - 0x27, 0x8c, 0x48, 0xb0, 0x15, 0xe6, 0x9c, 0x8e, 0x2f, 0x40, 0x89, 0x48, 0x85, 0x81, 0xe8, 0xb5, - 0xe2, 0x18, 0x95, 0x26, 0x81, 0x47, 0x6f, 0x50, 0x78, 0x7d, 0xf8, 0x64, 0x1e, 0xcd, 0xa9, 0x6e, - 0x15, 0x10, 0xd1, 0xdb, 0xd2, 0xc3, 0x59, 0x30, 0xbf, 0xf8, 0x95, 0x14, 0x14, 0x67, 0xd4, 0xb0, - 0x7f, 0xcc, 0x82, 0xd3, 0xea, 0x83, 0xdf, 0x75, 0x9f, 0x69, 0xff, 0x5c, 0x01, 0xc6, 0xaf, 0x6f, - 0x6c, 0x54, 0xaf, 0x91, 0x48, 0x5c, 0xdb, 0xbd, 0xcd, 0x00, 0xb0, 0xa6, 0xcd, 0xec, 0xf6, 0x98, - 0xeb, 0x44, 0x6e, 0x73, 0x81, 0x47, 0x45, 0x5a, 0xa8, 0x78, 0xd1, 0xad, 0xa0, 0x16, 0x05, 0xae, - 0xb7, 0x9d, 0xa9, 0xff, 0x94, 0xcc, 0x45, 0x31, 0x8f, 0xb9, 0x40, 0x2f, 0xc0, 0x10, 0x0b, 0xcb, - 0x24, 0x27, 0xe1, 0x71, 0xf5, 0x16, 0x62, 0xa5, 0x87, 0x07, 0xf3, 0xa5, 0xdb, 0xb8, 0xc2, 0xff, - 0x60, 0x81, 0x8a, 0x6e, 0xc3, 0xe8, 0x4e, 0x14, 0xb5, 0xaf, 0x13, 0xa7, 0x41, 0x9f, 0xee, 0xfc, - 0x38, 0x3c, 0x9f, 0x75, 0x1c, 0xd2, 0x41, 0xe0, 0x68, 0xf1, 0x09, 0x12, 0x97, 0x85, 0x58, 0xa7, - 0x63, 0xd7, 0x00, 0x62, 0xd8, 0x31, 0x29, 0x72, 0xec, 0x3f, 0xb4, 0x60, 0x98, 0x47, 0xc8, 0x08, - 0xd0, 0x47, 0x61, 0x80, 0xdc, 0x27, 0x75, 0xc1, 0xf1, 0x66, 0x76, 0x38, 0xe6, 0xb4, 0xb8, 0x40, - 0x9a, 0xfe, 0xc7, 0xac, 0x16, 0xba, 0x0e, 0xc3, 0xb4, 0xb7, 0xd7, 0x54, 0xb8, 0x90, 0x27, 0xf3, - 0xbe, 0x58, 0x4d, 0x3b, 0x67, 0xce, 0x44, 0x11, 0x96, 0xd5, 0x99, 0xf6, 0xbc, 0xde, 0xae, 0xd1, - 0x13, 0x3b, 0xea, 0xc6, 0x58, 0x6c, 0x2c, 0x57, 0x39, 0x92, 0xa0, 0xc6, 0xb5, 0xe7, 0xb2, 0x10, - 0xc7, 0x44, 0xec, 0x0d, 0x28, 0xd1, 0x49, 0x5d, 0x6c, 0xba, 0x4e, 0x77, 0x83, 0x80, 0x67, 0xa0, - 0x24, 0xd5, 0xfd, 0xa1, 0xf0, 0x8c, 0x67, 0x54, 0xa5, 0x35, 0x40, 0x88, 0x63, 0xb8, 0xbd, 0x05, - 0xa7, 0x98, 0xf1, 0xa6, 0x13, 0xed, 0x18, 0x7b, 0xac, 0xf7, 0x62, 0x7e, 0x56, 0x3c, 0x20, 0xf9, - 0xcc, 0xcc, 0x6a, 0xce, 0xa7, 0x63, 0x92, 0x62, 0xfc, 0x98, 0xb4, 0xbf, 0x36, 0x00, 0x8f, 0x57, - 0x6a, 0xf9, 0xc1, 0x53, 0x5e, 0x86, 0x31, 0xce, 0x97, 0xd2, 0xa5, 0xed, 0x34, 0x45, 0xbb, 0x4a, - 0x12, 0xbd, 0xa1, 0xc1, 0xb0, 0x81, 0x89, 0xce, 0x41, 0xd1, 0x7d, 0xcb, 0x4b, 0xba, 0x66, 0x55, - 0xde, 0x58, 0xc7, 0xb4, 0x9c, 0x82, 0x29, 0x8b, 0xcb, 0xef, 0x0e, 0x05, 0x56, 0x6c, 0xee, 0x6b, - 0x30, 0xe1, 0x86, 0xf5, 0xd0, 0xad, 0x78, 0xf4, 0x9c, 0xd1, 0x4e, 0x2a, 0x25, 0xdc, 0xa0, 0x9d, - 0x56, 0x50, 0x9c, 0xc0, 0xd6, 0x2e, 0xb2, 0xc1, 0xbe, 0xd9, 0xe4, 0x9e, 0xae, 0xe2, 0xf4, 0x05, - 0xd0, 0x66, 0x5f, 0x17, 0x32, 0x95, 0x82, 0x78, 0x01, 0xf0, 0x0f, 0x0e, 0xb1, 0x84, 0xd1, 0x97, - 0x63, 0x7d, 0xc7, 0x69, 0x2f, 0x76, 0xa2, 0x9d, 0xb2, 0x1b, 0xd6, 0xfd, 0x3d, 0x12, 0xec, 0xb3, - 0x47, 0xff, 0x48, 0xfc, 0x72, 0x54, 0x80, 0xe5, 0xeb, 0x8b, 0x55, 0x8a, 0x89, 0xd3, 0x75, 0xd0, - 0x22, 0x4c, 0xca, 0xc2, 0x1a, 0x09, 0xd9, 0x15, 0x36, 0xca, 0xc8, 0x28, 0x67, 0x29, 0x51, 0xac, - 0x88, 0x24, 0xf1, 0x4d, 0x4e, 0x1a, 0x8e, 0x83, 0x93, 0xfe, 0x08, 0x8c, 0xbb, 0x9e, 0x1b, 0xb9, - 0x4e, 0xe4, 0x73, 0x7d, 0x18, 0x7f, 0xdf, 0x33, 0x41, 0x7f, 0x45, 0x07, 0x60, 0x13, 0xcf, 0xfe, - 0x6f, 0x03, 0x30, 0xcd, 0xa6, 0xed, 0xbd, 0x15, 0xf6, 0xcd, 0xb4, 0xc2, 0x6e, 0xa7, 0x57, 0xd8, - 0x71, 0x3c, 0x11, 0x1e, 0x7a, 0x99, 0x7d, 0x0e, 0x4a, 0xca, 0x3f, 0x4c, 0x3a, 0x88, 0x5a, 0x39, - 0x0e, 0xa2, 0xbd, 0xb9, 0x0f, 0x69, 0x62, 0x57, 0xcc, 0x34, 0xb1, 0xfb, 0x5b, 0x16, 0xc4, 0x0a, - 0x1e, 0x74, 0x1d, 0x4a, 0x6d, 0x9f, 0x59, 0x8e, 0x06, 0xd2, 0x1c, 0xfb, 0xf1, 0xcc, 0x8b, 0x8a, - 0x5f, 0x8a, 0xfc, 0xe3, 0xab, 0xb2, 0x06, 0x8e, 0x2b, 0xa3, 0x25, 0x18, 0x6e, 0x07, 0xa4, 0x16, - 0xb1, 0x18, 0x2a, 0x3d, 0xe9, 0xf0, 0x35, 0xc2, 0xf1, 0xb1, 0xac, 0x68, 0xff, 0xbc, 0x05, 0xc0, - 0xad, 0xd8, 0x1c, 0x6f, 0x9b, 0x9c, 0x80, 0xd4, 0xba, 0x0c, 0x03, 0x61, 0x9b, 0xd4, 0xbb, 0xd9, - 0xf4, 0xc6, 0xfd, 0xa9, 0xb5, 0x49, 0x3d, 0x1e, 0x70, 0xfa, 0x0f, 0xb3, 0xda, 0xf6, 0x77, 0x03, - 0x4c, 0xc4, 0x68, 0x95, 0x88, 0xb4, 0xd0, 0x73, 0x46, 0x4c, 0x85, 0xb3, 0x89, 0x98, 0x0a, 0x25, - 0x86, 0xad, 0x09, 0x48, 0x3f, 0x07, 0xc5, 0x96, 0x73, 0x5f, 0x48, 0xc0, 0x9e, 0xe9, 0xde, 0x0d, - 0x4a, 0x7f, 0x61, 0xcd, 0xb9, 0xcf, 0x1f, 0x89, 0xcf, 0xc8, 0x05, 0xb2, 0xe6, 0xdc, 0x3f, 0xe4, - 0x96, 0xbb, 0xec, 0x90, 0xba, 0xe9, 0x86, 0xd1, 0x17, 0xfe, 0x6b, 0xfc, 0x9f, 0x2d, 0x3b, 0xda, - 0x08, 0x6b, 0xcb, 0xf5, 0x84, 0x81, 0x56, 0x5f, 0x6d, 0xb9, 0x5e, 0xb2, 0x2d, 0xd7, 0xeb, 0xa3, - 0x2d, 0xd7, 0x43, 0x6f, 0xc3, 0xb0, 0xb0, 0x9f, 0x14, 0x31, 0x8c, 0xae, 0xf4, 0xd1, 0x9e, 0x30, - 0xbf, 0xe4, 0x6d, 0x5e, 0x91, 0x8f, 0x60, 0x51, 0xda, 0xb3, 0x5d, 0xd9, 0x20, 0xfa, 0xeb, 0x16, - 0x4c, 0x88, 0xdf, 0x98, 0xbc, 0xd5, 0x21, 0x61, 0x24, 0x78, 0xcf, 0x0f, 0xf7, 0xdf, 0x07, 0x51, - 0x91, 0x77, 0xe5, 0xc3, 0xf2, 0x98, 0x35, 0x81, 0x3d, 0x7b, 0x94, 0xe8, 0x05, 0xfa, 0x87, 0x16, - 0x9c, 0x6a, 0x39, 0xf7, 0x79, 0x8b, 0xbc, 0x0c, 0x3b, 0x91, 0xeb, 0x0b, 0x3b, 0x84, 0x8f, 0xf6, - 0x37, 0xfd, 0xa9, 0xea, 0xbc, 0x93, 0x52, 0x59, 0x7a, 0x2a, 0x0b, 0xa5, 0x67, 0x57, 0x33, 0xfb, - 0x35, 0xb7, 0x05, 0x23, 0x72, 0xbd, 0x65, 0x88, 0x1a, 0xca, 0x3a, 0x63, 0x7d, 0x64, 0xf3, 0x55, - 0x3d, 0x56, 0x01, 0x6d, 0x47, 0xac, 0xb5, 0x47, 0xda, 0xce, 0xe7, 0x60, 0x4c, 0x5f, 0x63, 0x8f, - 0xb4, 0xad, 0xb7, 0x60, 0x26, 0x63, 0x2d, 0x3d, 0xd2, 0x26, 0xef, 0xc1, 0xd9, 0xdc, 0xf5, 0xf1, - 0x28, 0x1b, 0xb6, 0x7f, 0xce, 0xd2, 0xcf, 0xc1, 0x13, 0x50, 0x1d, 0x2c, 0x9b, 0xaa, 0x83, 0xf3, - 0xdd, 0x77, 0x4e, 0x8e, 0xfe, 0xe0, 0x4d, 0xbd, 0xd3, 0xf4, 0x54, 0x47, 0xaf, 0xc3, 0x50, 0x93, - 0x96, 0x48, 0x2b, 0x5c, 0xbb, 0xf7, 0x8e, 0x8c, 0x79, 0x29, 0x56, 0x1e, 0x62, 0x41, 0xc1, 0xfe, - 0x25, 0x0b, 0x06, 0x4e, 0x60, 0x24, 0xb0, 0x39, 0x12, 0xcf, 0xe5, 0x92, 0x16, 0xe1, 0x95, 0x17, - 0xb0, 0x73, 0x6f, 0xe5, 0x7e, 0x44, 0xbc, 0x90, 0x3d, 0x15, 0x33, 0x07, 0xe6, 0x27, 0x2d, 0x98, - 0xb9, 0xe9, 0x3b, 0x8d, 0x25, 0xa7, 0xe9, 0x78, 0x75, 0x12, 0x54, 0xbc, 0xed, 0x23, 0x99, 0x90, - 0x17, 0x7a, 0x9a, 0x90, 0x2f, 0x4b, 0x0b, 0xac, 0x81, 0xfc, 0xf9, 0xa3, 0x8c, 0x64, 0x32, 0xca, - 0x8c, 0x61, 0x2b, 0xbc, 0x03, 0x48, 0xef, 0xa5, 0x70, 0xe8, 0xc1, 0x30, 0xec, 0xf2, 0xfe, 0x8a, - 0x49, 0x7c, 0x2a, 0x9b, 0xc1, 0x4b, 0x7d, 0x9e, 0xe6, 0xaa, 0xc2, 0x0b, 0xb0, 0x24, 0x64, 0xbf, - 0x0c, 0x99, 0x51, 0x01, 0x7a, 0x0b, 0x1f, 0xec, 0x4f, 0xc2, 0x34, 0xab, 0x79, 0xc4, 0x87, 0xb1, - 0x9d, 0x90, 0x6d, 0x66, 0xc4, 0x0b, 0xb4, 0xbf, 0x68, 0xc1, 0xe4, 0x7a, 0x22, 0x8c, 0xda, 0x25, - 0xa6, 0x0d, 0xcd, 0x10, 0xa9, 0xd7, 0x58, 0x29, 0x16, 0xd0, 0x63, 0x97, 0x64, 0xfd, 0xa5, 0x05, - 0x71, 0xa0, 0x8e, 0x13, 0x60, 0xdf, 0x96, 0x0d, 0xf6, 0x2d, 0x53, 0xc2, 0xa2, 0xba, 0x93, 0xc7, - 0xbd, 0xa1, 0x1b, 0x2a, 0x84, 0x55, 0x17, 0xe1, 0x4a, 0x4c, 0x86, 0x2f, 0xc5, 0x09, 0x33, 0xce, - 0x95, 0x0c, 0x6a, 0x65, 0xff, 0x4e, 0x01, 0x90, 0xc2, 0xed, 0x3b, 0xc4, 0x56, 0xba, 0xc6, 0xf1, - 0x84, 0xd8, 0xda, 0x03, 0xc4, 0xf4, 0xf9, 0x81, 0xe3, 0x85, 0x9c, 0xac, 0x2b, 0x64, 0x77, 0x47, - 0x33, 0x16, 0x98, 0x13, 0x4d, 0xa2, 0x9b, 0x29, 0x6a, 0x38, 0xa3, 0x05, 0xcd, 0x4e, 0x63, 0xb0, - 0x5f, 0x3b, 0x8d, 0xa1, 0x1e, 0x4e, 0x7b, 0x3f, 0x6b, 0xc1, 0xb8, 0x1a, 0xa6, 0x77, 0x89, 0x49, - 0xbd, 0xea, 0x4f, 0xce, 0x01, 0x5a, 0xd5, 0xba, 0xcc, 0x2e, 0x96, 0x6f, 0x65, 0xce, 0x97, 0x4e, - 0xd3, 0x7d, 0x9b, 0xa8, 0x00, 0x87, 0xf3, 0xc2, 0x99, 0x52, 0x94, 0x1e, 0x1e, 0xcc, 0x8f, 0xab, - 0x7f, 0x3c, 0xa0, 0x72, 0x5c, 0x85, 0x1e, 0xc9, 0x93, 0x89, 0xa5, 0x88, 0x5e, 0x82, 0xc1, 0xf6, - 0x8e, 0x13, 0x92, 0x84, 0xeb, 0xd1, 0x60, 0x95, 0x16, 0x1e, 0x1e, 0xcc, 0x4f, 0xa8, 0x0a, 0xac, - 0x04, 0x73, 0xec, 0xfe, 0x03, 0x97, 0xa5, 0x17, 0x67, 0xcf, 0xc0, 0x65, 0x7f, 0x6a, 0xc1, 0xc0, - 0xba, 0xdf, 0x38, 0x89, 0x23, 0xe0, 0x35, 0xe3, 0x08, 0x78, 0x22, 0x2f, 0xd6, 0x7d, 0xee, 0xee, - 0x5f, 0x4d, 0xec, 0xfe, 0xf3, 0xb9, 0x14, 0xba, 0x6f, 0xfc, 0x16, 0x8c, 0xb2, 0x08, 0xfa, 0xc2, - 0xcd, 0xea, 0x05, 0x63, 0xc3, 0xcf, 0x27, 0x36, 0xfc, 0xa4, 0x86, 0xaa, 0xed, 0xf4, 0xa7, 0x61, - 0x58, 0xf8, 0xed, 0x24, 0x7d, 0x58, 0x05, 0x2e, 0x96, 0x70, 0xfb, 0xc7, 0x8b, 0x60, 0x44, 0xec, - 0x47, 0xbf, 0x62, 0xc1, 0x42, 0xc0, 0xed, 0x79, 0x1b, 0xe5, 0x4e, 0xe0, 0x7a, 0xdb, 0xb5, 0xfa, - 0x0e, 0x69, 0x74, 0x9a, 0xae, 0xb7, 0x5d, 0xd9, 0xf6, 0x7c, 0x55, 0xbc, 0x72, 0x9f, 0xd4, 0x3b, - 0x4c, 0x09, 0xd6, 0x23, 0x3d, 0x80, 0xb2, 0x8b, 0x7f, 0xfe, 0xc1, 0xc1, 0xfc, 0x02, 0x3e, 0x12, - 0x6d, 0x7c, 0xc4, 0xbe, 0xa0, 0xdf, 0xb4, 0xe0, 0x0a, 0x0f, 0x64, 0xdf, 0x7f, 0xff, 0xbb, 0xbc, - 0x96, 0xab, 0x92, 0x54, 0x4c, 0x64, 0x83, 0x04, 0xad, 0xa5, 0x8f, 0x88, 0x01, 0xbd, 0x52, 0x3d, - 0x5a, 0x5b, 0xf8, 0xa8, 0x9d, 0xb3, 0xff, 0x45, 0x11, 0xc6, 0x45, 0x80, 0x2b, 0x71, 0x07, 0xbc, - 0x64, 0x2c, 0x89, 0x27, 0x13, 0x4b, 0x62, 0xda, 0x40, 0x3e, 0x9e, 0xe3, 0x3f, 0x84, 0x69, 0x7a, - 0x38, 0x5f, 0x27, 0x4e, 0x10, 0x6d, 0x12, 0x87, 0x9b, 0x5f, 0x15, 0x8f, 0x7c, 0xfa, 0x2b, 0xf1, - 0xdc, 0xcd, 0x24, 0x31, 0x9c, 0xa6, 0xff, 0xcd, 0x74, 0xe7, 0x78, 0x30, 0x95, 0x8a, 0x51, 0xf6, - 0x29, 0x28, 0x29, 0xa7, 0x13, 0x71, 0xe8, 0x74, 0x0f, 0xf5, 0x97, 0xa4, 0xc0, 0x45, 0x68, 0xb1, - 0xc3, 0x53, 0x4c, 0xce, 0xfe, 0x47, 0x05, 0xa3, 0x41, 0x3e, 0x89, 0xeb, 0x30, 0xe2, 0x84, 0xa1, - 0xbb, 0xed, 0x91, 0x86, 0xd8, 0xb1, 0xef, 0xcf, 0xdb, 0xb1, 0x46, 0x33, 0xcc, 0xf1, 0x67, 0x51, - 0xd4, 0xc4, 0x8a, 0x06, 0xba, 0xce, 0x8d, 0xdc, 0xf6, 0xe4, 0x7b, 0xaf, 0x3f, 0x6a, 0x20, 0xcd, - 0xe0, 0xf6, 0x08, 0x16, 0xf5, 0xd1, 0xa7, 0xb9, 0x15, 0xe2, 0x0d, 0xcf, 0xbf, 0xe7, 0x5d, 0xf3, - 0x7d, 0x19, 0x44, 0xa2, 0x3f, 0x82, 0xd3, 0xd2, 0xf6, 0x50, 0x55, 0xc7, 0x26, 0xb5, 0xfe, 0x82, - 0x7e, 0x7e, 0x1e, 0x66, 0x28, 0x69, 0xd3, 0xc7, 0x3b, 0x44, 0x04, 0x26, 0x45, 0xf4, 0x34, 0x59, - 0x26, 0xc6, 0x2e, 0xf3, 0x29, 0x67, 0xd6, 0x8e, 0xe5, 0xc8, 0x37, 0x4c, 0x12, 0x38, 0x49, 0xd3, - 0xfe, 0x29, 0x0b, 0x98, 0xbf, 0xeb, 0x09, 0xf0, 0x23, 0x1f, 0x33, 0xf9, 0x91, 0xd9, 0xbc, 0x41, - 0xce, 0x61, 0x45, 0x5e, 0xe4, 0x2b, 0xab, 0x1a, 0xf8, 0xf7, 0xf7, 0x85, 0xe9, 0x48, 0xef, 0xf7, - 0x87, 0xfd, 0x7f, 0x2c, 0x7e, 0x88, 0x29, 0x97, 0x10, 0xf4, 0xed, 0x30, 0x52, 0x77, 0xda, 0x4e, - 0x9d, 0xa7, 0x97, 0xc9, 0x95, 0xe8, 0x19, 0x95, 0x16, 0x96, 0x45, 0x0d, 0x2e, 0xa1, 0x92, 0x51, - 0xf8, 0x46, 0x64, 0x71, 0x4f, 0xa9, 0x94, 0x6a, 0x72, 0x6e, 0x17, 0xc6, 0x0d, 0x62, 0x8f, 0x54, - 0x9c, 0xf1, 0xed, 0xfc, 0x8a, 0x55, 0x51, 0x23, 0x5b, 0x30, 0xed, 0x69, 0xff, 0xe9, 0x85, 0x22, - 0x1f, 0x97, 0xef, 0xef, 0x75, 0x89, 0xb2, 0xdb, 0x47, 0x73, 0xa5, 0x4d, 0x90, 0xc1, 0x69, 0xca, - 0xf6, 0x4f, 0x58, 0xf0, 0x98, 0x8e, 0xa8, 0x79, 0xeb, 0xf4, 0xd2, 0x11, 0x94, 0x61, 0xc4, 0x6f, - 0x93, 0xc0, 0x89, 0xfc, 0x40, 0xdc, 0x1a, 0x97, 0xe5, 0xa0, 0xdf, 0x12, 0xe5, 0x87, 0x22, 0x38, - 0xbb, 0xa4, 0x2e, 0xcb, 0xb1, 0xaa, 0x49, 0x5f, 0x9f, 0x6c, 0x30, 0x42, 0xe1, 0x97, 0xc5, 0xce, - 0x00, 0xa6, 0x2e, 0x0f, 0xb1, 0x80, 0xd8, 0x5f, 0xb3, 0xf8, 0xc2, 0xd2, 0xbb, 0x8e, 0xde, 0x82, - 0xa9, 0x96, 0x13, 0xd5, 0x77, 0x56, 0xee, 0xb7, 0x03, 0xae, 0x71, 0x91, 0xe3, 0xf4, 0x4c, 0xaf, - 0x71, 0xd2, 0x3e, 0x32, 0x36, 0xac, 0x5c, 0x4b, 0x10, 0xc3, 0x29, 0xf2, 0x68, 0x13, 0x46, 0x59, - 0x19, 0x73, 0x39, 0x0c, 0xbb, 0xb1, 0x06, 0x79, 0xad, 0x29, 0x8b, 0x83, 0xb5, 0x98, 0x0e, 0xd6, - 0x89, 0xda, 0x3f, 0x53, 0xe4, 0xbb, 0x9d, 0xb1, 0xf2, 0x4f, 0xc3, 0x70, 0xdb, 0x6f, 0x2c, 0x57, - 0xca, 0x58, 0xcc, 0x82, 0xba, 0x46, 0xaa, 0xbc, 0x18, 0x4b, 0x38, 0xba, 0x0c, 0x23, 0xe2, 0xa7, - 0xd4, 0x90, 0xb1, 0xb3, 0x59, 0xe0, 0x85, 0x58, 0x41, 0xd1, 0xf3, 0x00, 0xed, 0xc0, 0xdf, 0x73, - 0x1b, 0x2c, 0x14, 0x46, 0xd1, 0x34, 0x16, 0xaa, 0x2a, 0x08, 0xd6, 0xb0, 0xd0, 0xab, 0x30, 0xde, - 0xf1, 0x42, 0xce, 0x8e, 0x68, 0x81, 0x6f, 0x95, 0x19, 0xcb, 0x6d, 0x1d, 0x88, 0x4d, 0x5c, 0xb4, - 0x08, 0x43, 0x91, 0xc3, 0x8c, 0x5f, 0x06, 0xf3, 0x8d, 0x6f, 0x37, 0x28, 0x86, 0x9e, 0xc9, 0x84, - 0x56, 0xc0, 0xa2, 0x22, 0xfa, 0x94, 0xf4, 0xfe, 0xe5, 0x07, 0xbb, 0xb0, 0x7a, 0xef, 0xef, 0x12, - 0xd0, 0x7c, 0x7f, 0x85, 0x35, 0xbd, 0x41, 0x0b, 0xbd, 0x02, 0x40, 0xee, 0x47, 0x24, 0xf0, 0x9c, - 0xa6, 0xb2, 0x2d, 0x53, 0x7c, 0x41, 0xd9, 0x5f, 0xf7, 0xa3, 0xdb, 0x21, 0x59, 0x51, 0x18, 0x58, - 0xc3, 0xb6, 0x7f, 0xb3, 0x04, 0x10, 0xf3, 0xed, 0xe8, 0xed, 0xd4, 0xc1, 0xf5, 0x6c, 0x77, 0x4e, - 0xff, 0xf8, 0x4e, 0x2d, 0xf4, 0x3d, 0x16, 0x8c, 0x3a, 0xcd, 0xa6, 0x5f, 0x77, 0x78, 0x68, 0xe2, - 0x42, 0xf7, 0x83, 0x53, 0xb4, 0xbf, 0x18, 0xd7, 0xe0, 0x5d, 0x78, 0x41, 0xae, 0x50, 0x0d, 0xd2, - 0xb3, 0x17, 0x7a, 0xc3, 0xe8, 0x43, 0xf2, 0xa9, 0x58, 0x34, 0x86, 0x52, 0x3d, 0x15, 0x4b, 0xec, - 0x8e, 0xd0, 0x5f, 0x89, 0xb7, 0x8d, 0x57, 0xe2, 0x40, 0xbe, 0x7b, 0xa3, 0xc1, 0xbe, 0xf6, 0x7a, - 0x20, 0xa2, 0xaa, 0x1e, 0xea, 0x60, 0x30, 0xdf, 0x97, 0x50, 0x7b, 0x27, 0xf5, 0x08, 0x73, 0xf0, - 0x39, 0x98, 0x6c, 0x98, 0x4c, 0x80, 0x58, 0x89, 0x4f, 0xe5, 0xd1, 0x4d, 0xf0, 0x0c, 0xf1, 0xb5, - 0x9f, 0x00, 0xe0, 0x24, 0x61, 0x54, 0xe5, 0x91, 0x2f, 0x2a, 0xde, 0x96, 0x2f, 0x3c, 0x2f, 0xec, - 0xdc, 0xb9, 0xdc, 0x0f, 0x23, 0xd2, 0xa2, 0x98, 0xf1, 0xed, 0xbe, 0x2e, 0xea, 0x62, 0x45, 0x05, - 0xbd, 0x0e, 0x43, 0xcc, 0x99, 0x2c, 0x9c, 0x1d, 0xc9, 0x97, 0x38, 0x9b, 0xa1, 0xdc, 0xe2, 0x0d, - 0xc9, 0xfe, 0x86, 0x58, 0x50, 0x40, 0xd7, 0xa5, 0xab, 0x66, 0x58, 0xf1, 0x6e, 0x87, 0x84, 0xb9, - 0x6a, 0x96, 0x96, 0xde, 0x1f, 0x7b, 0x61, 0xf2, 0xf2, 0xcc, 0x7c, 0x67, 0x46, 0x4d, 0xca, 0x45, - 0x89, 0xff, 0x32, 0x8d, 0xda, 0x2c, 0xe4, 0x77, 0xcf, 0x4c, 0xb5, 0x16, 0x0f, 0xe7, 0x1d, 0x93, - 0x04, 0x4e, 0xd2, 0xa4, 0x1c, 0x29, 0xdf, 0xf5, 0xc2, 0x77, 0xa3, 0xd7, 0xd9, 0xc1, 0x1f, 0xe2, - 0xec, 0x36, 0xe2, 0x25, 0x58, 0xd4, 0x3f, 0x51, 0xf6, 0x60, 0xce, 0x83, 0xa9, 0xe4, 0x16, 0x7d, - 0xa4, 0xec, 0xc8, 0x1f, 0x0e, 0xc0, 0x84, 0xb9, 0xa4, 0xd0, 0x15, 0x28, 0x09, 0x22, 0x2a, 0xf5, - 0x81, 0xda, 0x25, 0x6b, 0x12, 0x80, 0x63, 0x1c, 0x96, 0xf1, 0x82, 0x55, 0xd7, 0x8c, 0x75, 0xe3, - 0x8c, 0x17, 0x0a, 0x82, 0x35, 0x2c, 0xfa, 0xb0, 0xda, 0xf4, 0xfd, 0x48, 0x5d, 0x48, 0x6a, 0xdd, - 0x2d, 0xb1, 0x52, 0x2c, 0xa0, 0xf4, 0x22, 0xda, 0x25, 0x81, 0x47, 0x9a, 0x66, 0x90, 0x64, 0x75, - 0x11, 0xdd, 0xd0, 0x81, 0xd8, 0xc4, 0xa5, 0xd7, 0xa9, 0x1f, 0xb2, 0x85, 0x2c, 0x9e, 0x6f, 0xb1, - 0xf1, 0x73, 0x8d, 0x7b, 0x8b, 0x4b, 0x38, 0xfa, 0x24, 0x3c, 0xa6, 0x02, 0x41, 0x61, 0xae, 0xcd, - 0x90, 0x2d, 0x0e, 0x19, 0xd2, 0x96, 0xc7, 0x96, 0xb3, 0xd1, 0x70, 0x5e, 0x7d, 0xf4, 0x1a, 0x4c, - 0x08, 0x16, 0x5f, 0x52, 0x1c, 0x36, 0x0d, 0x6c, 0x6e, 0x18, 0x50, 0x9c, 0xc0, 0x96, 0x61, 0x9e, - 0x19, 0x97, 0x2d, 0x29, 0x8c, 0xa4, 0xc3, 0x3c, 0xeb, 0x70, 0x9c, 0xaa, 0x81, 0x16, 0x61, 0x92, - 0xf3, 0x60, 0xae, 0xb7, 0xcd, 0xe7, 0x44, 0xb8, 0x56, 0xa9, 0x2d, 0x75, 0xcb, 0x04, 0xe3, 0x24, - 0x3e, 0x7a, 0x19, 0xc6, 0x9c, 0xa0, 0xbe, 0xe3, 0x46, 0xa4, 0x1e, 0x75, 0x02, 0xee, 0x73, 0xa5, - 0x59, 0x28, 0x2d, 0x6a, 0x30, 0x6c, 0x60, 0xda, 0x6f, 0xc3, 0x4c, 0x46, 0x18, 0x09, 0xba, 0x70, - 0x9c, 0xb6, 0x2b, 0xbf, 0x29, 0x61, 0xc6, 0xbc, 0x58, 0xad, 0xc8, 0xaf, 0xd1, 0xb0, 0xe8, 0xea, - 0x64, 0xe1, 0x26, 0xb4, 0xac, 0x89, 0x6a, 0x75, 0xae, 0x4a, 0x00, 0x8e, 0x71, 0xec, 0xff, 0x59, - 0x80, 0xc9, 0x0c, 0xdd, 0x0a, 0xcb, 0xdc, 0x97, 0x78, 0xa4, 0xc4, 0x89, 0xfa, 0xcc, 0xa8, 0xe1, - 0x85, 0x23, 0x44, 0x0d, 0x2f, 0xf6, 0x8a, 0x1a, 0x3e, 0xf0, 0x4e, 0xa2, 0x86, 0x9b, 0x23, 0x36, - 0xd8, 0xd7, 0x88, 0x65, 0x44, 0x1a, 0x1f, 0x3a, 0x62, 0xa4, 0x71, 0x63, 0xd0, 0x87, 0xfb, 0x18, - 0xf4, 0x1f, 0x2e, 0xc0, 0x54, 0xd2, 0x92, 0xf2, 0x04, 0xe4, 0xb6, 0xaf, 0x1b, 0x72, 0xdb, 0xcb, - 0xfd, 0x38, 0xce, 0xe6, 0xca, 0x70, 0x71, 0x42, 0x86, 0xfb, 0xc1, 0xbe, 0xa8, 0x75, 0x97, 0xe7, - 0xfe, 0x9d, 0x02, 0x9c, 0xce, 0xf4, 0xdc, 0x3d, 0x81, 0xb1, 0xb9, 0x65, 0x8c, 0xcd, 0x73, 0x7d, - 0x3b, 0x15, 0xe7, 0x0e, 0xd0, 0xdd, 0xc4, 0x00, 0x5d, 0xe9, 0x9f, 0x64, 0xf7, 0x51, 0xfa, 0x6a, - 0x11, 0xce, 0x67, 0xd6, 0x8b, 0xc5, 0x9e, 0xab, 0x86, 0xd8, 0xf3, 0xf9, 0x84, 0xd8, 0xd3, 0xee, - 0x5e, 0xfb, 0x78, 0xe4, 0xa0, 0xc2, 0x5d, 0x96, 0xc5, 0x44, 0x78, 0x48, 0x19, 0xa8, 0xe1, 0x2e, - 0xab, 0x08, 0x61, 0x93, 0xee, 0x37, 0x93, 0xec, 0xf3, 0xdf, 0x59, 0x70, 0x36, 0x73, 0x6e, 0x4e, - 0x40, 0xd6, 0xb5, 0x6e, 0xca, 0xba, 0x9e, 0xee, 0x7b, 0xb5, 0xe6, 0x08, 0xbf, 0x7e, 0x7d, 0x20, - 0xe7, 0x5b, 0xd8, 0x4b, 0xfe, 0x16, 0x8c, 0x3a, 0xf5, 0x3a, 0x09, 0xc3, 0x35, 0xbf, 0xa1, 0x02, - 0x23, 0x3f, 0xc7, 0xde, 0x59, 0x71, 0xf1, 0xe1, 0xc1, 0xfc, 0x5c, 0x92, 0x44, 0x0c, 0xc6, 0x3a, - 0x05, 0xf4, 0x69, 0x18, 0x09, 0xc5, 0xbd, 0x29, 0xe6, 0xfe, 0x85, 0x3e, 0x07, 0xc7, 0xd9, 0x24, - 0x4d, 0x33, 0x72, 0x93, 0x92, 0x54, 0x28, 0x92, 0x66, 0x94, 0x97, 0xc2, 0xb1, 0x46, 0x79, 0x79, - 0x1e, 0x60, 0x4f, 0x3d, 0x06, 0x92, 0xf2, 0x07, 0xed, 0x99, 0xa0, 0x61, 0xa1, 0x8f, 0xc3, 0x54, - 0xc8, 0x43, 0x1b, 0x2e, 0x37, 0x9d, 0x90, 0x39, 0xcb, 0x88, 0x55, 0xc8, 0xa2, 0x43, 0xd5, 0x12, - 0x30, 0x9c, 0xc2, 0x46, 0xab, 0xb2, 0x55, 0x16, 0x87, 0x91, 0x2f, 0xcc, 0x4b, 0x71, 0x8b, 0x22, - 0x6f, 0xf0, 0xa9, 0xe4, 0xf0, 0xb3, 0x81, 0xd7, 0x6a, 0xa2, 0x4f, 0x03, 0xd0, 0xe5, 0x23, 0xe4, - 0x10, 0xc3, 0xf9, 0x87, 0x27, 0x3d, 0x55, 0x1a, 0x99, 0xb6, 0xbd, 0xcc, 0xc3, 0xb5, 0xac, 0x88, - 0x60, 0x8d, 0xa0, 0xfd, 0xc3, 0x03, 0xf0, 0x78, 0x97, 0x33, 0x12, 0x2d, 0x9a, 0x7a, 0xd8, 0x67, - 0x92, 0x8f, 0xeb, 0xb9, 0xcc, 0xca, 0xc6, 0x6b, 0x3b, 0xb1, 0x14, 0x0b, 0xef, 0x78, 0x29, 0xfe, - 0x80, 0xa5, 0x89, 0x3d, 0xb8, 0xc5, 0xe7, 0xc7, 0x8e, 0x78, 0xf6, 0x1f, 0xa3, 0x1c, 0x64, 0x2b, - 0x43, 0x98, 0xf0, 0x7c, 0xdf, 0xdd, 0xe9, 0x5b, 0xba, 0x70, 0xb2, 0x52, 0xe2, 0xdf, 0xb6, 0xe0, - 0x5c, 0xd7, 0x10, 0x1f, 0xdf, 0x80, 0x0c, 0x83, 0xfd, 0x05, 0x0b, 0x9e, 0xcc, 0xac, 0x61, 0x98, - 0x19, 0x5d, 0x81, 0x52, 0x9d, 0x16, 0x6a, 0x5e, 0x9a, 0xb1, 0xfb, 0xba, 0x04, 0xe0, 0x18, 0xe7, - 0x88, 0xe1, 0x4b, 0x7e, 0xd5, 0x82, 0xd4, 0xa6, 0x3f, 0x81, 0xdb, 0xa7, 0x62, 0xde, 0x3e, 0xef, - 0xef, 0x67, 0x34, 0x73, 0x2e, 0x9e, 0x3f, 0x99, 0x84, 0x33, 0x39, 0x5e, 0x4a, 0x7b, 0x30, 0xbd, - 0x5d, 0x27, 0xa6, 0xff, 0x6b, 0xb7, 0x28, 0x32, 0x5d, 0x9d, 0x65, 0x59, 0x66, 0xd3, 0xe9, 0x14, - 0x0a, 0x4e, 0x37, 0x81, 0xbe, 0x60, 0xc1, 0x29, 0xe7, 0x5e, 0xb8, 0x42, 0xb9, 0x08, 0xb7, 0xbe, - 0xd4, 0xf4, 0xeb, 0xbb, 0xf4, 0x88, 0x96, 0x1b, 0xe1, 0xc5, 0x4c, 0xc9, 0xce, 0xdd, 0x5a, 0x0a, - 0xdf, 0x68, 0x9e, 0xa5, 0x7a, 0xcd, 0xc2, 0xc2, 0x99, 0x6d, 0x21, 0x2c, 0xe2, 0xff, 0xd3, 0x37, - 0x4a, 0x17, 0x0f, 0xed, 0x2c, 0x77, 0x32, 0x7e, 0x2d, 0x4a, 0x08, 0x56, 0x74, 0xd0, 0x67, 0xa1, - 0xb4, 0x2d, 0x7d, 0x3c, 0x33, 0xae, 0xdd, 0x78, 0x20, 0xbb, 0x7b, 0xbe, 0x72, 0xf5, 0xac, 0x42, - 0xc2, 0x31, 0x51, 0xf4, 0x1a, 0x14, 0xbd, 0xad, 0xb0, 0x5b, 0xb6, 0xd4, 0x84, 0x1d, 0x1e, 0x8f, - 0x83, 0xb0, 0xbe, 0x5a, 0xc3, 0xb4, 0x22, 0xba, 0x0e, 0xc5, 0x60, 0xb3, 0x21, 0xc4, 0x92, 0x99, - 0x9b, 0x14, 0x2f, 0x95, 0x73, 0x7a, 0xc5, 0x28, 0xe1, 0xa5, 0x32, 0xa6, 0x24, 0x50, 0x15, 0x06, - 0x99, 0x6b, 0x8f, 0xb8, 0xe4, 0x32, 0xd9, 0xf9, 0x2e, 0x2e, 0x72, 0x3c, 0x58, 0x02, 0x43, 0xc0, - 0x9c, 0x10, 0xda, 0x80, 0xa1, 0x3a, 0xcb, 0xac, 0x29, 0xe2, 0xc6, 0x7d, 0x28, 0x53, 0x00, 0xd9, - 0x25, 0xe5, 0xa8, 0x90, 0xc7, 0x31, 0x0c, 0x2c, 0x68, 0x31, 0xaa, 0xa4, 0xbd, 0xb3, 0x15, 0x8a, - 0x4c, 0xd0, 0xd9, 0x54, 0xbb, 0x64, 0xd2, 0x15, 0x54, 0x19, 0x06, 0x16, 0xb4, 0xd0, 0x2b, 0x50, - 0xd8, 0xaa, 0x0b, 0xb7, 0x9d, 0x4c, 0x49, 0xa4, 0x19, 0xca, 0x62, 0x69, 0xe8, 0xc1, 0xc1, 0x7c, - 0x61, 0x75, 0x19, 0x17, 0xb6, 0xea, 0x68, 0x1d, 0x86, 0xb7, 0xb8, 0xf3, 0xbb, 0x10, 0x36, 0x3e, - 0x95, 0xed, 0x97, 0x9f, 0xf2, 0x8f, 0xe7, 0x1e, 0x2b, 0x02, 0x80, 0x25, 0x11, 0x16, 0x4e, 0x5f, - 0x39, 0xf1, 0x8b, 0x10, 0x6b, 0x0b, 0x47, 0x0b, 0xbc, 0xc0, 0x99, 0x8e, 0x38, 0x14, 0x00, 0xd6, - 0x28, 0xd2, 0x55, 0xed, 0xc8, 0x74, 0xfc, 0x22, 0xd8, 0x4c, 0xe6, 0xaa, 0x56, 0x39, 0xfb, 0xbb, - 0xad, 0x6a, 0x85, 0x84, 0x63, 0xa2, 0x68, 0x17, 0xc6, 0xf7, 0xc2, 0xf6, 0x0e, 0x91, 0x5b, 0x9a, - 0xc5, 0x9e, 0xc9, 0xb9, 0x97, 0xef, 0x08, 0x44, 0x37, 0x88, 0x3a, 0x4e, 0x33, 0x75, 0x0a, 0x31, - 0x9d, 0xfe, 0x1d, 0x9d, 0x18, 0x36, 0x69, 0xd3, 0xe1, 0x7f, 0xab, 0xe3, 0x6f, 0xee, 0x47, 0x44, - 0x44, 0x46, 0xcb, 0x1c, 0xfe, 0x37, 0x38, 0x4a, 0x7a, 0xf8, 0x05, 0x00, 0x4b, 0x22, 0xe8, 0x8e, - 0x18, 0x1e, 0x76, 0x7a, 0x4e, 0xe5, 0x87, 0x2f, 0x5d, 0x94, 0x48, 0x39, 0x83, 0xc2, 0x4e, 0xcb, - 0x98, 0x14, 0x3b, 0x25, 0xdb, 0x3b, 0x7e, 0xe4, 0x7b, 0x89, 0x13, 0x7a, 0x3a, 0xff, 0x94, 0xac, - 0x66, 0xe0, 0xa7, 0x4f, 0xc9, 0x2c, 0x2c, 0x9c, 0xd9, 0x16, 0x6a, 0xc0, 0x44, 0xdb, 0x0f, 0xa2, - 0x7b, 0x7e, 0x20, 0xd7, 0x17, 0xea, 0x22, 0x2c, 0x31, 0x30, 0x45, 0x8b, 0x2c, 0xe8, 0xa0, 0x09, - 0xc1, 0x09, 0x9a, 0xe8, 0x13, 0x30, 0x1c, 0xd6, 0x9d, 0x26, 0xa9, 0xdc, 0x9a, 0x9d, 0xc9, 0xbf, - 0x7e, 0x6a, 0x1c, 0x25, 0x67, 0x75, 0xf1, 0xd8, 0xfb, 0x1c, 0x05, 0x4b, 0x72, 0x68, 0x15, 0x06, - 0x59, 0xba, 0x34, 0x16, 0xc6, 0x2f, 0x27, 0x0a, 0x6b, 0xca, 0x2a, 0x9a, 0x9f, 0x4d, 0xac, 0x18, - 0xf3, 0xea, 0x74, 0x0f, 0x88, 0x37, 0x83, 0x1f, 0xce, 0x9e, 0xce, 0xdf, 0x03, 0xe2, 0xa9, 0x71, - 0xab, 0xd6, 0x6d, 0x0f, 0x28, 0x24, 0x1c, 0x13, 0xa5, 0x27, 0x33, 0x3d, 0x4d, 0xcf, 0x74, 0x31, - 0xe7, 0xc9, 0x3d, 0x4b, 0xd9, 0xc9, 0x4c, 0x4f, 0x52, 0x4a, 0xc2, 0xfe, 0xfd, 0xe1, 0x34, 0xcf, - 0xc2, 0x5e, 0x99, 0xdf, 0x65, 0xa5, 0x14, 0x90, 0x1f, 0xee, 0x57, 0xe8, 0x75, 0x8c, 0x2c, 0xf8, - 0x17, 0x2c, 0x38, 0xd3, 0xce, 0xfc, 0x10, 0xc1, 0x00, 0xf4, 0x27, 0x3b, 0xe3, 0x9f, 0xae, 0x42, - 0x3e, 0x66, 0xc3, 0x71, 0x4e, 0x4b, 0xc9, 0x67, 0x4e, 0xf1, 0x1d, 0x3f, 0x73, 0xd6, 0x60, 0x84, - 0x31, 0x99, 0x3d, 0x32, 0x4d, 0x27, 0x5f, 0x7b, 0x8c, 0x95, 0x58, 0x16, 0x15, 0xb1, 0x22, 0x81, - 0x7e, 0xd0, 0x82, 0x73, 0xc9, 0xae, 0x63, 0xc2, 0xc0, 0x22, 0x4e, 0x24, 0x7f, 0xe0, 0xae, 0x8a, - 0xef, 0x4f, 0xf1, 0xff, 0x06, 0xf2, 0x61, 0x2f, 0x04, 0xdc, 0xbd, 0x31, 0x54, 0xce, 0x78, 0x61, - 0x0f, 0x99, 0x5a, 0x85, 0x3e, 0x5e, 0xd9, 0x2f, 0xc2, 0x58, 0xcb, 0xef, 0x78, 0x91, 0xb0, 0xfe, - 0x11, 0x96, 0x08, 0x4c, 0x03, 0xbf, 0xa6, 0x95, 0x63, 0x03, 0x2b, 0xf1, 0x36, 0x1f, 0x79, 0xe8, - 0xb7, 0xf9, 0x9b, 0x30, 0xe6, 0x69, 0xe6, 0xaa, 0x82, 0x1f, 0xb8, 0x94, 0x1f, 0xe3, 0x55, 0x37, - 0x6e, 0xe5, 0xbd, 0xd4, 0x4b, 0xb0, 0x41, 0xed, 0x64, 0x1f, 0x7c, 0x5f, 0xb6, 0x32, 0x98, 0x7a, - 0x2e, 0x02, 0xf8, 0xa8, 0x29, 0x02, 0xb8, 0x94, 0x14, 0x01, 0xa4, 0x24, 0xca, 0xc6, 0xeb, 0xbf, - 0xff, 0x14, 0x36, 0xfd, 0x06, 0x42, 0xb4, 0x9b, 0x70, 0xa1, 0xd7, 0xb5, 0xc4, 0xcc, 0xc0, 0x1a, - 0x4a, 0x7f, 0x18, 0x9b, 0x81, 0x35, 0x2a, 0x65, 0xcc, 0x20, 0xfd, 0x86, 0xd8, 0xb1, 0xff, 0xbb, - 0x05, 0xc5, 0xaa, 0xdf, 0x38, 0x81, 0x07, 0xef, 0xc7, 0x8c, 0x07, 0xef, 0xe3, 0xd9, 0x17, 0x62, - 0x23, 0x57, 0x1e, 0xbe, 0x92, 0x90, 0x87, 0x9f, 0xcb, 0x23, 0xd0, 0x5d, 0xfa, 0xfd, 0x93, 0x45, - 0x18, 0xad, 0xfa, 0x0d, 0x65, 0x83, 0xfd, 0xeb, 0x0f, 0x63, 0x83, 0x9d, 0x9b, 0x88, 0x41, 0xa3, - 0xcc, 0xac, 0xc7, 0xa4, 0xfb, 0xe9, 0x37, 0x98, 0x29, 0xf6, 0x5d, 0xe2, 0x6e, 0xef, 0x44, 0xa4, - 0x91, 0xfc, 0x9c, 0x93, 0x33, 0xc5, 0xfe, 0xfd, 0x02, 0x4c, 0x26, 0x5a, 0x47, 0x4d, 0x18, 0x6f, - 0xea, 0xd2, 0x56, 0xb1, 0x4e, 0x1f, 0x4a, 0x50, 0x2b, 0x4c, 0x59, 0xb5, 0x22, 0x6c, 0x12, 0x47, - 0x0b, 0x00, 0x4a, 0xfd, 0x28, 0xc5, 0x7a, 0x8c, 0xeb, 0x57, 0xfa, 0xc9, 0x10, 0x6b, 0x18, 0xe8, - 0x25, 0x18, 0x8d, 0xfc, 0xb6, 0xdf, 0xf4, 0xb7, 0xf7, 0x6f, 0x10, 0x19, 0xd4, 0x49, 0x19, 0xa8, - 0x6d, 0xc4, 0x20, 0xac, 0xe3, 0xa1, 0xfb, 0x30, 0xad, 0x88, 0xd4, 0x8e, 0x41, 0x02, 0xcd, 0xa4, - 0x0a, 0xeb, 0x49, 0x8a, 0x38, 0xdd, 0x88, 0xfd, 0xd3, 0x45, 0x3e, 0xc4, 0x5e, 0xe4, 0xbe, 0xb7, - 0x1b, 0xde, 0xdd, 0xbb, 0xe1, 0xab, 0x16, 0x4c, 0xd1, 0xd6, 0x99, 0xf5, 0x8d, 0xbc, 0xe6, 0x55, - 0x54, 0x69, 0xab, 0x4b, 0x54, 0xe9, 0x4b, 0xf4, 0xd4, 0x6c, 0xf8, 0x9d, 0x48, 0xc8, 0xee, 0xb4, - 0x63, 0x91, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x08, 0x84, 0xc7, 0xa0, 0x8e, 0x47, 0x82, 0x00, - 0x0b, 0xa8, 0x0c, 0x3a, 0x3d, 0x90, 0x1d, 0x74, 0x9a, 0x07, 0xc7, 0x14, 0x76, 0x1a, 0x82, 0xe1, - 0xd2, 0x82, 0x63, 0x4a, 0x03, 0x8e, 0x18, 0xc7, 0xfe, 0xb9, 0x22, 0x8c, 0x55, 0xfd, 0x46, 0xac, - 0x7a, 0x7c, 0xd1, 0x50, 0x3d, 0x5e, 0x48, 0xa8, 0x1e, 0xa7, 0x74, 0xdc, 0xf7, 0x14, 0x8d, 0x5f, - 0x2f, 0x45, 0xe3, 0x3f, 0xb7, 0xd8, 0xac, 0x95, 0xd7, 0x6b, 0xdc, 0x98, 0x0b, 0x5d, 0x85, 0x51, - 0x76, 0xc0, 0x30, 0x17, 0x55, 0xa9, 0x8f, 0x63, 0xc9, 0x94, 0xd6, 0xe3, 0x62, 0xac, 0xe3, 0xa0, - 0xcb, 0x30, 0x12, 0x12, 0x27, 0xa8, 0xef, 0xa8, 0xd3, 0x55, 0x28, 0xcf, 0x78, 0x19, 0x56, 0x50, - 0xf4, 0x46, 0x1c, 0x97, 0xb1, 0x98, 0xef, 0xf2, 0xa6, 0xf7, 0x87, 0x6f, 0x91, 0xfc, 0x60, 0x8c, - 0xf6, 0x5d, 0x40, 0x69, 0xfc, 0x3e, 0x02, 0x92, 0xcd, 0x9b, 0x01, 0xc9, 0x4a, 0xa9, 0x60, 0x64, - 0x7f, 0x61, 0xc1, 0x44, 0xd5, 0x6f, 0xd0, 0xad, 0xfb, 0xcd, 0xb4, 0x4f, 0xf5, 0xa0, 0xb4, 0x43, - 0x5d, 0x82, 0xd2, 0x5e, 0x84, 0xc1, 0xaa, 0xdf, 0xa8, 0x54, 0xbb, 0xf9, 0x9b, 0xdb, 0x7f, 0xd7, - 0x82, 0xe1, 0xaa, 0xdf, 0x38, 0x01, 0xb5, 0xc0, 0x47, 0x4d, 0xb5, 0xc0, 0x63, 0x39, 0xeb, 0x26, - 0x47, 0x13, 0xf0, 0xb7, 0x07, 0x60, 0x9c, 0xf6, 0xd3, 0xdf, 0x96, 0x53, 0x69, 0x0c, 0x9b, 0xd5, - 0xc7, 0xb0, 0x51, 0x2e, 0xdc, 0x6f, 0x36, 0xfd, 0x7b, 0xc9, 0x69, 0x5d, 0x65, 0xa5, 0x58, 0x40, - 0xd1, 0xb3, 0x30, 0xd2, 0x0e, 0xc8, 0x9e, 0xeb, 0x0b, 0xf6, 0x56, 0x53, 0xb2, 0x54, 0x45, 0x39, - 0x56, 0x18, 0xf4, 0x59, 0x18, 0xba, 0x1e, 0xbd, 0xca, 0xeb, 0xbe, 0xd7, 0xe0, 0x92, 0xf3, 0xa2, - 0x48, 0x2c, 0xa1, 0x95, 0x63, 0x03, 0x0b, 0xdd, 0x85, 0x12, 0xfb, 0xcf, 0x8e, 0x9d, 0xa3, 0xa7, - 0x28, 0x15, 0x29, 0xeb, 0x04, 0x01, 0x1c, 0xd3, 0x42, 0xcf, 0x03, 0x44, 0x32, 0xfa, 0x78, 0x28, - 0x82, 0x4f, 0xa9, 0xa7, 0x80, 0x8a, 0x4b, 0x1e, 0x62, 0x0d, 0x0b, 0x3d, 0x03, 0xa5, 0xc8, 0x71, - 0x9b, 0x37, 0x5d, 0x8f, 0x84, 0x4c, 0x22, 0x5e, 0x94, 0x99, 0xe3, 0x44, 0x21, 0x8e, 0xe1, 0x94, - 0x15, 0x63, 0x91, 0x19, 0x78, 0x82, 0xe3, 0x11, 0x86, 0xcd, 0x58, 0xb1, 0x9b, 0xaa, 0x14, 0x6b, - 0x18, 0x68, 0x07, 0x9e, 0x70, 0x3d, 0x96, 0x84, 0x81, 0xd4, 0x76, 0xdd, 0xf6, 0xc6, 0xcd, 0xda, - 0x1d, 0x12, 0xb8, 0x5b, 0xfb, 0x4b, 0x4e, 0x7d, 0x97, 0x78, 0x32, 0xf9, 0xe4, 0xfb, 0x45, 0x17, - 0x9f, 0xa8, 0x74, 0xc1, 0xc5, 0x5d, 0x29, 0xd9, 0x2f, 0xc3, 0xe9, 0xaa, 0xdf, 0xa8, 0xfa, 0x41, - 0xb4, 0xea, 0x07, 0xf7, 0x9c, 0xa0, 0x21, 0x57, 0xca, 0xbc, 0x8c, 0x92, 0x40, 0x8f, 0xc2, 0x41, - 0x7e, 0x50, 0x18, 0x11, 0x10, 0x5e, 0x60, 0xcc, 0xd7, 0x11, 0x7d, 0x7b, 0xea, 0x8c, 0x0d, 0x50, - 0x19, 0x49, 0xae, 0x39, 0x11, 0x41, 0xb7, 0x58, 0xa6, 0xe5, 0xf8, 0x46, 0x14, 0xd5, 0x9f, 0xd6, - 0x32, 0x2d, 0xc7, 0xc0, 0xcc, 0x2b, 0xd4, 0xac, 0x6f, 0xff, 0x8f, 0x41, 0x76, 0x38, 0x26, 0xb2, - 0x5a, 0xa0, 0xcf, 0xc0, 0x44, 0x48, 0x6e, 0xba, 0x5e, 0xe7, 0xbe, 0x94, 0x46, 0x74, 0xf1, 0xce, - 0xaa, 0xad, 0xe8, 0x98, 0x5c, 0xa6, 0x69, 0x96, 0xe1, 0x04, 0x35, 0xd4, 0x82, 0x89, 0x7b, 0xae, - 0xd7, 0xf0, 0xef, 0x85, 0x92, 0xfe, 0x48, 0xbe, 0x68, 0xf3, 0x2e, 0xc7, 0x4c, 0xf4, 0xd1, 0x68, - 0xee, 0xae, 0x41, 0x0c, 0x27, 0x88, 0xd3, 0x05, 0x18, 0x74, 0xbc, 0xc5, 0xf0, 0x76, 0x48, 0x02, - 0x91, 0x33, 0x9b, 0x2d, 0x40, 0x2c, 0x0b, 0x71, 0x0c, 0xa7, 0x0b, 0x90, 0xfd, 0xb9, 0x16, 0xf8, - 0x1d, 0x9e, 0x23, 0x40, 0x2c, 0x40, 0xac, 0x4a, 0xb1, 0x86, 0x41, 0x37, 0x28, 0xfb, 0xb7, 0xee, - 0x7b, 0xd8, 0xf7, 0x23, 0xb9, 0xa5, 0x59, 0x96, 0x56, 0xad, 0x1c, 0x1b, 0x58, 0x68, 0x15, 0x50, - 0xd8, 0x69, 0xb7, 0x9b, 0xcc, 0xec, 0xc3, 0x69, 0x32, 0x52, 0x5c, 0xe5, 0x5e, 0xe4, 0xa1, 0x53, - 0x6b, 0x29, 0x28, 0xce, 0xa8, 0x41, 0xcf, 0xea, 0x2d, 0xd1, 0xd5, 0x41, 0xd6, 0x55, 0xae, 0x06, - 0xa9, 0xf1, 0x7e, 0x4a, 0x18, 0x5a, 0x81, 0xe1, 0x70, 0x3f, 0xac, 0x47, 0x22, 0x06, 0x5c, 0x4e, - 0xe2, 0xa2, 0x1a, 0x43, 0xd1, 0xf2, 0xe6, 0xf1, 0x2a, 0x58, 0xd6, 0x45, 0x75, 0x98, 0x11, 0x14, - 0x97, 0x77, 0x1c, 0x4f, 0xa5, 0x81, 0xe1, 0xd6, 0xaf, 0x57, 0x1f, 0x1c, 0xcc, 0xcf, 0x88, 0x96, - 0x75, 0xf0, 0xe1, 0xc1, 0xfc, 0x99, 0xaa, 0xdf, 0xc8, 0x80, 0xe0, 0x2c, 0x6a, 0x7c, 0xf1, 0xd5, - 0xeb, 0x7e, 0xab, 0x5d, 0x0d, 0xfc, 0x2d, 0xb7, 0x49, 0xba, 0xa9, 0x92, 0x6a, 0x06, 0xa6, 0x58, - 0x7c, 0x46, 0x19, 0x4e, 0x50, 0xb3, 0xbf, 0x9d, 0xf1, 0x33, 0x2c, 0x4d, 0x74, 0xd4, 0x09, 0x08, - 0x6a, 0xc1, 0x78, 0x9b, 0x6d, 0x13, 0x11, 0xb9, 0x5f, 0xac, 0xf5, 0x17, 0xfb, 0x14, 0x89, 0xdc, - 0xa3, 0xd7, 0x80, 0x12, 0x59, 0xb2, 0xb7, 0x66, 0x55, 0x27, 0x87, 0x4d, 0xea, 0xf6, 0x8f, 0x3d, - 0xc6, 0x6e, 0xc4, 0x1a, 0x97, 0x73, 0x0c, 0x0b, 0x63, 0x7b, 0xf1, 0xb4, 0x9a, 0xcb, 0x17, 0xb8, - 0xc5, 0xd3, 0x22, 0x0c, 0xf6, 0xb1, 0xac, 0x8b, 0x3e, 0x0d, 0x13, 0xf4, 0xa5, 0xa2, 0xe5, 0x5f, - 0x39, 0x95, 0x1f, 0x14, 0x21, 0x4e, 0xbb, 0xa2, 0x65, 0xf5, 0xd0, 0x2b, 0xe3, 0x04, 0x31, 0xf4, - 0x06, 0x33, 0x0b, 0x31, 0x53, 0xbb, 0xf4, 0x20, 0xad, 0x5b, 0x80, 0x48, 0xb2, 0x1a, 0x91, 0xbc, - 0xb4, 0x31, 0xf6, 0xa3, 0x4d, 0x1b, 0x83, 0x6e, 0xc2, 0xb8, 0xc8, 0x95, 0x2c, 0x56, 0x6e, 0xd1, - 0x90, 0x03, 0x8e, 0x63, 0x1d, 0x78, 0x98, 0x2c, 0xc0, 0x66, 0x65, 0xb4, 0x0d, 0xe7, 0xb4, 0xdc, - 0x45, 0xd7, 0x02, 0x87, 0x29, 0xf3, 0x5d, 0x76, 0x9c, 0x6a, 0x77, 0xf5, 0x93, 0x0f, 0x0e, 0xe6, - 0xcf, 0x6d, 0x74, 0x43, 0xc4, 0xdd, 0xe9, 0xa0, 0x5b, 0x70, 0x9a, 0xbb, 0xf4, 0x96, 0x89, 0xd3, - 0x68, 0xba, 0x9e, 0x62, 0x06, 0xf8, 0x96, 0x3f, 0xfb, 0xe0, 0x60, 0xfe, 0xf4, 0x62, 0x16, 0x02, - 0xce, 0xae, 0x87, 0x3e, 0x0a, 0xa5, 0x86, 0x17, 0x8a, 0x31, 0x18, 0x32, 0xd2, 0x43, 0x95, 0xca, - 0xeb, 0x35, 0xf5, 0xfd, 0xf1, 0x1f, 0x1c, 0x57, 0x40, 0xdb, 0x5c, 0x56, 0xac, 0x24, 0x18, 0xc3, - 0xa9, 0x90, 0x46, 0x49, 0x21, 0x9f, 0xe1, 0xd4, 0xc7, 0x95, 0x24, 0xca, 0xd6, 0xdd, 0xf0, 0xf7, - 0x33, 0x08, 0xa3, 0xd7, 0x01, 0xd1, 0x17, 0x84, 0x5b, 0x27, 0x8b, 0x75, 0x96, 0x16, 0x82, 0x89, - 0xd6, 0x47, 0x4c, 0x37, 0xb3, 0x5a, 0x0a, 0x03, 0x67, 0xd4, 0x42, 0xd7, 0xe9, 0xa9, 0xa2, 0x97, - 0x8a, 0x53, 0x4b, 0x25, 0xf3, 0x2b, 0x93, 0x76, 0x40, 0xea, 0x4e, 0x44, 0x1a, 0x26, 0x45, 0x9c, - 0xa8, 0x87, 0x1a, 0xf0, 0x84, 0xd3, 0x89, 0x7c, 0x26, 0x86, 0x37, 0x51, 0x37, 0xfc, 0x5d, 0xe2, - 0x31, 0x0d, 0xd8, 0xc8, 0xd2, 0x05, 0xca, 0x6d, 0x2c, 0x76, 0xc1, 0xc3, 0x5d, 0xa9, 0x50, 0x2e, - 0x51, 0x65, 0xef, 0x05, 0x33, 0x50, 0x53, 0x46, 0x06, 0xdf, 0x97, 0x60, 0x74, 0xc7, 0x0f, 0xa3, - 0x75, 0x12, 0xdd, 0xf3, 0x83, 0x5d, 0x11, 0x6f, 0x33, 0x8e, 0xd1, 0x1c, 0x83, 0xb0, 0x8e, 0x47, - 0x9f, 0x81, 0xcc, 0x3e, 0xa3, 0x52, 0x66, 0xaa, 0xf1, 0x91, 0xf8, 0x8c, 0xb9, 0xce, 0x8b, 0xb1, - 0x84, 0x4b, 0xd4, 0x4a, 0x75, 0x99, 0xa9, 0xb9, 0x13, 0xa8, 0x95, 0xea, 0x32, 0x96, 0x70, 0xba, - 0x5c, 0xc3, 0x1d, 0x27, 0x20, 0xd5, 0xc0, 0xaf, 0x93, 0x50, 0x8b, 0x0c, 0xfe, 0x38, 0x8f, 0x26, - 0x4a, 0x97, 0x6b, 0x2d, 0x0b, 0x01, 0x67, 0xd7, 0x43, 0x24, 0x9d, 0xb7, 0x6b, 0x22, 0x5f, 0x3f, - 0x91, 0xe6, 0x67, 0xfa, 0x4c, 0xdd, 0xe5, 0xc1, 0x94, 0xca, 0x18, 0xc6, 0xe3, 0x87, 0x86, 0xb3, - 0x93, 0x6c, 0x6d, 0xf7, 0x1f, 0x7c, 0x54, 0x69, 0x7c, 0x2a, 0x09, 0x4a, 0x38, 0x45, 0xdb, 0x88, - 0xc5, 0x35, 0xd5, 0x33, 0x16, 0xd7, 0x15, 0x28, 0x85, 0x9d, 0xcd, 0x86, 0xdf, 0x72, 0x5c, 0x8f, - 0xa9, 0xb9, 0xb5, 0xf7, 0x48, 0x4d, 0x02, 0x70, 0x8c, 0x83, 0x56, 0x61, 0xc4, 0x91, 0xea, 0x1c, - 0x94, 0x1f, 0x7d, 0x45, 0x29, 0x71, 0x78, 0x40, 0x02, 0xa9, 0xc0, 0x51, 0x75, 0xd1, 0xab, 0x30, - 0x2e, 0x5c, 0x52, 0x45, 0xb2, 0xca, 0x19, 0xd3, 0x6f, 0xa8, 0xa6, 0x03, 0xb1, 0x89, 0x8b, 0x6e, - 0xc3, 0x68, 0xe4, 0x37, 0x99, 0xf3, 0x0b, 0x65, 0xf3, 0xce, 0xe4, 0xc7, 0x11, 0xdb, 0x50, 0x68, - 0xba, 0x24, 0x55, 0x55, 0xc5, 0x3a, 0x1d, 0xb4, 0xc1, 0xd7, 0x3b, 0x8b, 0x90, 0x4d, 0xc2, 0xd9, - 0xc7, 0xf2, 0xef, 0x24, 0x15, 0x48, 0xdb, 0xdc, 0x0e, 0xa2, 0x26, 0xd6, 0xc9, 0xa0, 0x6b, 0x30, - 0xdd, 0x0e, 0x5c, 0x9f, 0xad, 0x09, 0xa5, 0xc9, 0x9b, 0x35, 0xd3, 0xf3, 0x54, 0x93, 0x08, 0x38, - 0x5d, 0x87, 0x79, 0x14, 0x8b, 0xc2, 0xd9, 0xb3, 0x3c, 0x9f, 0x35, 0x7f, 0xde, 0xf1, 0x32, 0xac, - 0xa0, 0x68, 0x8d, 0x9d, 0xc4, 0x5c, 0x32, 0x31, 0x3b, 0x97, 0x1f, 0xf0, 0x45, 0x97, 0x60, 0x70, - 0xe6, 0x55, 0xfd, 0xc5, 0x31, 0x05, 0xd4, 0xd0, 0x12, 0x1f, 0xd2, 0x17, 0x43, 0x38, 0xfb, 0x44, - 0x17, 0x23, 0xb9, 0xc4, 0xf3, 0x22, 0x66, 0x08, 0x8c, 0xe2, 0x10, 0x27, 0x68, 0xa2, 0x8f, 0xc3, - 0x94, 0x08, 0x53, 0x17, 0x0f, 0xd3, 0xb9, 0xd8, 0xa4, 0x18, 0x27, 0x60, 0x38, 0x85, 0xcd, 0x33, - 0x07, 0x38, 0x9b, 0x4d, 0x22, 0x8e, 0xbe, 0x9b, 0xae, 0xb7, 0x1b, 0xce, 0x9e, 0x67, 0xe7, 0x83, - 0xc8, 0x1c, 0x90, 0x84, 0xe2, 0x8c, 0x1a, 0x68, 0x03, 0xa6, 0xda, 0x01, 0x21, 0x2d, 0xc6, 0xe8, - 0x8b, 0xfb, 0x6c, 0x9e, 0x3b, 0xd4, 0xd3, 0x9e, 0x54, 0x13, 0xb0, 0xc3, 0x8c, 0x32, 0x9c, 0xa2, - 0x80, 0xee, 0xc1, 0x88, 0xbf, 0x47, 0x82, 0x1d, 0xe2, 0x34, 0x66, 0x2f, 0x74, 0x31, 0x71, 0x17, - 0x97, 0xdb, 0x2d, 0x81, 0x9b, 0xd0, 0xfe, 0xcb, 0xe2, 0xde, 0xda, 0x7f, 0xd9, 0x18, 0xfa, 0x21, - 0x0b, 0xce, 0x4a, 0x85, 0x41, 0xad, 0x4d, 0x47, 0x7d, 0xd9, 0xf7, 0xc2, 0x28, 0xe0, 0x2e, 0xe0, - 0x4f, 0xe6, 0xbb, 0x45, 0x6f, 0xe4, 0x54, 0x52, 0xc2, 0xd1, 0xb3, 0x79, 0x18, 0x21, 0xce, 0x6f, - 0x11, 0x2d, 0xc3, 0x74, 0x48, 0x22, 0x79, 0x18, 0x2d, 0x86, 0xab, 0x6f, 0x94, 0xd7, 0x67, 0x2f, - 0x72, 0xff, 0x75, 0xba, 0x19, 0x6a, 0x49, 0x20, 0x4e, 0xe3, 0xcf, 0x7d, 0x2b, 0x4c, 0xa7, 0xae, - 0xff, 0xa3, 0x64, 0x44, 0x99, 0xdb, 0x85, 0x71, 0x63, 0x88, 0x1f, 0xa9, 0xf6, 0xf8, 0xdf, 0x0c, - 0x43, 0x49, 0x69, 0x16, 0xd1, 0x15, 0x53, 0x61, 0x7c, 0x36, 0xa9, 0x30, 0x1e, 0xa1, 0xef, 0x7a, - 0x5d, 0x47, 0xbc, 0x91, 0x11, 0xb5, 0x2b, 0x6f, 0x43, 0xf7, 0xef, 0x8e, 0xad, 0x89, 0x6b, 0x8b, - 0x7d, 0x6b, 0x9e, 0x07, 0xba, 0x4a, 0x80, 0xaf, 0xc1, 0xb4, 0xe7, 0x33, 0x9e, 0x93, 0x34, 0x24, - 0x43, 0xc1, 0xf8, 0x86, 0x92, 0x1e, 0x06, 0x23, 0x81, 0x80, 0xd3, 0x75, 0x68, 0x83, 0xfc, 0xe2, - 0x4f, 0x8a, 0x9c, 0x39, 0x5f, 0x80, 0x05, 0x14, 0x5d, 0x84, 0xc1, 0xb6, 0xdf, 0xa8, 0x54, 0x05, - 0xbf, 0xa9, 0xc5, 0x8a, 0x6c, 0x54, 0xaa, 0x98, 0xc3, 0xd0, 0x22, 0x0c, 0xb1, 0x1f, 0xe1, 0xec, - 0x58, 0x7e, 0xbc, 0x03, 0x56, 0x43, 0xcb, 0x37, 0xc3, 0x2a, 0x60, 0x51, 0x91, 0x89, 0xbe, 0x28, - 0x93, 0xce, 0x44, 0x5f, 0xc3, 0x0f, 0x29, 0xfa, 0x92, 0x04, 0x70, 0x4c, 0x0b, 0xdd, 0x87, 0xd3, - 0xc6, 0xc3, 0x88, 0x2f, 0x11, 0x12, 0x0a, 0x9f, 0xeb, 0x8b, 0x5d, 0x5f, 0x44, 0x42, 0x53, 0x7d, - 0x4e, 0x74, 0xfa, 0x74, 0x25, 0x8b, 0x12, 0xce, 0x6e, 0x00, 0x35, 0x61, 0xba, 0x9e, 0x6a, 0x75, - 0xa4, 0xff, 0x56, 0xd5, 0x84, 0xa6, 0x5b, 0x4c, 0x13, 0x46, 0xaf, 0xc2, 0xc8, 0x5b, 0x7e, 0xc8, - 0xce, 0x6a, 0xc1, 0x23, 0x4b, 0x87, 0xdd, 0x91, 0x37, 0x6e, 0xd5, 0x58, 0xf9, 0xe1, 0xc1, 0xfc, - 0x68, 0xd5, 0x6f, 0xc8, 0xbf, 0x58, 0x55, 0x40, 0xdf, 0x6b, 0xc1, 0x5c, 0xfa, 0xe5, 0xa5, 0x3a, - 0x3d, 0xde, 0x7f, 0xa7, 0x6d, 0xd1, 0xe8, 0xdc, 0x4a, 0x2e, 0x39, 0xdc, 0xa5, 0x29, 0xfb, 0x97, - 0x2d, 0x26, 0x75, 0x13, 0x1a, 0x20, 0x12, 0x76, 0x9a, 0x27, 0x91, 0x66, 0x73, 0xc5, 0x50, 0x4e, - 0x3d, 0xb4, 0xe5, 0xc2, 0xbf, 0xb4, 0x98, 0xe5, 0xc2, 0x09, 0xba, 0x28, 0xbc, 0x01, 0x23, 0x91, - 0x4c, 0x96, 0xda, 0x25, 0x33, 0xa8, 0xd6, 0x29, 0x66, 0xbd, 0xa1, 0x38, 0x56, 0x95, 0x17, 0x55, - 0x91, 0xb1, 0xff, 0x09, 0x9f, 0x01, 0x09, 0x39, 0x01, 0x1d, 0x40, 0xd9, 0xd4, 0x01, 0xcc, 0xf7, - 0xf8, 0x82, 0x1c, 0x5d, 0xc0, 0x3f, 0x36, 0xfb, 0xcd, 0x24, 0x35, 0xef, 0x76, 0x93, 0x19, 0xfb, - 0x8b, 0x16, 0x40, 0x1c, 0x8a, 0x97, 0xc9, 0x97, 0xfd, 0x40, 0xe6, 0x58, 0xcc, 0xca, 0x26, 0xf4, - 0x32, 0xe5, 0x51, 0xfd, 0xc8, 0xaf, 0xfb, 0x4d, 0xa1, 0xe1, 0x7a, 0x22, 0x56, 0x43, 0xf0, 0xf2, - 0x43, 0xed, 0x37, 0x56, 0xd8, 0x68, 0x5e, 0x06, 0xfe, 0x2a, 0xc6, 0x8a, 0x31, 0x23, 0xe8, 0xd7, - 0x8f, 0x58, 0x70, 0x2a, 0xcb, 0xde, 0x95, 0xbe, 0x78, 0xb8, 0xcc, 0x4a, 0x99, 0x33, 0xa9, 0xd9, - 0xbc, 0x23, 0xca, 0xb1, 0xc2, 0xe8, 0x3b, 0x73, 0xd8, 0xd1, 0x62, 0xe0, 0xde, 0x82, 0xf1, 0x6a, - 0x40, 0xb4, 0xcb, 0xf5, 0x35, 0xee, 0x4c, 0xce, 0xfb, 0xf3, 0xec, 0x91, 0x1d, 0xc9, 0xed, 0x9f, - 0x29, 0xc0, 0x29, 0x6e, 0x15, 0xb0, 0xb8, 0xe7, 0xbb, 0x8d, 0xaa, 0xdf, 0x10, 0x59, 0xdf, 0x3e, - 0x05, 0x63, 0x6d, 0x4d, 0xd0, 0xd8, 0x2d, 0x9e, 0xa3, 0x2e, 0x90, 0x8c, 0x45, 0x23, 0x7a, 0x29, - 0x36, 0x68, 0xa1, 0x06, 0x8c, 0x91, 0x3d, 0xb7, 0xae, 0x54, 0xcb, 0x85, 0x23, 0x5f, 0x74, 0xaa, - 0x95, 0x15, 0x8d, 0x0e, 0x36, 0xa8, 0x3e, 0x82, 0x7c, 0xbe, 0xf6, 0x8f, 0x5a, 0xf0, 0x58, 0x4e, - 0xf4, 0x47, 0xda, 0xdc, 0x3d, 0x66, 0x7f, 0x21, 0x96, 0xad, 0x6a, 0x8e, 0x5b, 0x65, 0x60, 0x01, - 0x45, 0x9f, 0x00, 0xe0, 0x56, 0x15, 0xf4, 0xc9, 0xdd, 0x2b, 0x4c, 0x9e, 0x11, 0xe1, 0x4b, 0x0b, - 0xd6, 0x24, 0xeb, 0x63, 0x8d, 0x96, 0xfd, 0x53, 0x45, 0x18, 0xe4, 0xa9, 0xd9, 0x57, 0x61, 0x78, - 0x87, 0xe7, 0xc2, 0xe8, 0x27, 0xed, 0x46, 0x2c, 0x0c, 0xe1, 0x05, 0x58, 0x56, 0x46, 0x6b, 0x30, - 0xc3, 0x73, 0x89, 0x34, 0xcb, 0xa4, 0xe9, 0xec, 0x4b, 0xc9, 0x1d, 0xcf, 0xc3, 0xa9, 0x24, 0x98, - 0x95, 0x34, 0x0a, 0xce, 0xaa, 0x87, 0x5e, 0x83, 0x09, 0xfa, 0x92, 0xf2, 0x3b, 0x91, 0xa4, 0xc4, - 0xb3, 0x88, 0xa8, 0xa7, 0xdb, 0x86, 0x01, 0xc5, 0x09, 0x6c, 0xfa, 0x98, 0x6f, 0xa7, 0x64, 0x94, - 0x83, 0xf1, 0x63, 0xde, 0x94, 0x4b, 0x9a, 0xb8, 0xcc, 0xd0, 0xb5, 0xc3, 0xcc, 0x7a, 0x37, 0x76, - 0x02, 0x12, 0xee, 0xf8, 0xcd, 0x06, 0x63, 0xfa, 0x06, 0x35, 0x43, 0xd7, 0x04, 0x1c, 0xa7, 0x6a, - 0x50, 0x2a, 0x5b, 0x8e, 0xdb, 0xec, 0x04, 0x24, 0xa6, 0x32, 0x64, 0x52, 0x59, 0x4d, 0xc0, 0x71, - 0xaa, 0x06, 0x5d, 0x47, 0xa7, 0xab, 0x81, 0x4f, 0x0f, 0x52, 0x19, 0xd2, 0x46, 0x59, 0x2f, 0x0f, - 0x4b, 0xef, 0xdb, 0x2e, 0xc1, 0xdf, 0x84, 0x7d, 0x27, 0xa7, 0x60, 0x18, 0x10, 0xd4, 0x84, 0xdf, - 0xad, 0xa4, 0x82, 0xae, 0xc2, 0xa8, 0xc8, 0x10, 0xc1, 0x8c, 0x6c, 0xf9, 0xd4, 0x31, 0x83, 0x87, - 0x72, 0x5c, 0x8c, 0x75, 0x1c, 0xfb, 0xfb, 0x0a, 0x30, 0x93, 0xe1, 0x25, 0xc1, 0x8f, 0xaa, 0x6d, - 0x37, 0x8c, 0x54, 0xae, 0x41, 0xed, 0xa8, 0xe2, 0xe5, 0x58, 0x61, 0xd0, 0xfd, 0xc0, 0x0f, 0xc3, - 0xe4, 0x01, 0x28, 0xac, 0x90, 0x05, 0xf4, 0x88, 0x59, 0xfb, 0x2e, 0xc0, 0x40, 0x27, 0x24, 0x32, - 0x6c, 0xa3, 0xba, 0x1a, 0x98, 0x1e, 0x8c, 0x41, 0x28, 0xab, 0xbe, 0xad, 0x54, 0x4a, 0x1a, 0xab, - 0xce, 0x95, 0x4a, 0x1c, 0x46, 0x3b, 0x17, 0x11, 0xcf, 0xf1, 0x22, 0xc1, 0xd0, 0xc7, 0xf1, 0xc7, - 0x58, 0x29, 0x16, 0x50, 0xfb, 0x4b, 0x45, 0x38, 0x9b, 0xeb, 0x37, 0x45, 0xbb, 0xde, 0xf2, 0x3d, - 0x37, 0xf2, 0x95, 0x25, 0x09, 0x8f, 0x39, 0x46, 0xda, 0x3b, 0x6b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, - 0x09, 0x06, 0x99, 0x14, 0x2d, 0x95, 0x75, 0x71, 0xa9, 0xcc, 0x83, 0xd0, 0x70, 0x70, 0xdf, 0x19, - 0x6d, 0x2f, 0xd2, 0x5b, 0xd2, 0x6f, 0x26, 0x0f, 0x2d, 0xda, 0x5d, 0xdf, 0x6f, 0x62, 0x06, 0x44, - 0x1f, 0x10, 0xe3, 0x95, 0x30, 0x9d, 0xc0, 0x4e, 0xc3, 0x0f, 0xb5, 0x41, 0x7b, 0x1a, 0x86, 0x77, - 0xc9, 0x7e, 0xe0, 0x7a, 0xdb, 0x49, 0x93, 0x9a, 0x1b, 0xbc, 0x18, 0x4b, 0xb8, 0x99, 0x40, 0x6b, - 0xf8, 0xb8, 0x53, 0xd1, 0x8e, 0xf4, 0xbc, 0x02, 0x7f, 0xa0, 0x08, 0x93, 0x78, 0xa9, 0xfc, 0xde, - 0x44, 0xdc, 0x4e, 0x4f, 0xc4, 0x71, 0xa7, 0xa2, 0xed, 0x3d, 0x1b, 0xbf, 0x60, 0xc1, 0x24, 0xcb, - 0x53, 0x21, 0xa2, 0x55, 0xb9, 0xbe, 0x77, 0x02, 0xec, 0xe6, 0x45, 0x18, 0x0c, 0x68, 0xa3, 0xc9, - 0x74, 0x8b, 0xac, 0x27, 0x98, 0xc3, 0xd0, 0x13, 0x30, 0xc0, 0xba, 0x40, 0x27, 0x6f, 0x8c, 0x67, - 0xaa, 0x2a, 0x3b, 0x91, 0x83, 0x59, 0x29, 0x0b, 0xc1, 0x82, 0x49, 0xbb, 0xe9, 0xf2, 0x4e, 0xc7, - 0x3a, 0xce, 0x77, 0x87, 0x47, 0x75, 0x66, 0xd7, 0xde, 0x59, 0x08, 0x96, 0x6c, 0x92, 0xdd, 0x9f, - 0x72, 0x7f, 0x5c, 0x80, 0xf3, 0x99, 0xf5, 0xfa, 0x0e, 0xc1, 0xd2, 0xbd, 0xf6, 0xa3, 0xcc, 0x44, - 0x50, 0x3c, 0x41, 0x83, 0xc5, 0x81, 0x7e, 0x39, 0xcc, 0xc1, 0x3e, 0x22, 0xa3, 0x64, 0x0e, 0xd9, - 0xbb, 0x24, 0x32, 0x4a, 0x66, 0xdf, 0x72, 0x9e, 0xa2, 0x7f, 0x59, 0xc8, 0xf9, 0x16, 0xf6, 0x28, - 0xbd, 0x4c, 0xcf, 0x19, 0x06, 0x0c, 0xe5, 0x43, 0x8f, 0x9f, 0x31, 0xbc, 0x0c, 0x2b, 0x28, 0x5a, - 0x84, 0xc9, 0x96, 0xeb, 0xd1, 0xc3, 0x67, 0xdf, 0x64, 0xfc, 0x54, 0xe0, 0xaa, 0x35, 0x13, 0x8c, - 0x93, 0xf8, 0xc8, 0xd5, 0xa2, 0xa6, 0x14, 0xf2, 0x13, 0x98, 0xe7, 0xf6, 0x76, 0xc1, 0xd4, 0xff, - 0xaa, 0x51, 0xcc, 0x88, 0xa0, 0xb2, 0xa6, 0xc9, 0x22, 0x8a, 0xfd, 0xcb, 0x22, 0xc6, 0xb2, 0xe5, - 0x10, 0x73, 0xaf, 0xc2, 0xf8, 0x43, 0x0b, 0x9f, 0xed, 0xaf, 0x16, 0xe1, 0xf1, 0x2e, 0xdb, 0x9e, - 0x9f, 0xf5, 0xc6, 0x1c, 0x68, 0x67, 0x7d, 0x6a, 0x1e, 0xaa, 0x70, 0x6a, 0xab, 0xd3, 0x6c, 0xee, - 0x33, 0x3b, 0x7e, 0xd2, 0x90, 0x18, 0x82, 0xa7, 0x94, 0x0f, 0xf0, 0x53, 0xab, 0x19, 0x38, 0x38, - 0xb3, 0x26, 0x65, 0xe8, 0xe9, 0x4d, 0xb2, 0xaf, 0x48, 0x25, 0x18, 0x7a, 0xac, 0x03, 0xb1, 0x89, - 0x8b, 0xae, 0xc1, 0xb4, 0xb3, 0xe7, 0xb8, 0x3c, 0xf4, 0xac, 0x24, 0xc0, 0x39, 0x7a, 0x25, 0x33, - 0x5c, 0x4c, 0x22, 0xe0, 0x74, 0x1d, 0xf4, 0x3a, 0x20, 0x7f, 0x93, 0x59, 0xfb, 0x36, 0xae, 0x11, - 0x4f, 0xa8, 0xe9, 0xd8, 0xdc, 0x15, 0xe3, 0x23, 0xe1, 0x56, 0x0a, 0x03, 0x67, 0xd4, 0x4a, 0x44, - 0x21, 0x19, 0xca, 0x8f, 0x42, 0xd2, 0xfd, 0x5c, 0xec, 0x99, 0x04, 0xe3, 0xbf, 0x58, 0xf4, 0xfa, - 0xe2, 0x4c, 0xbe, 0x19, 0x4c, 0xef, 0x55, 0x66, 0x66, 0xc7, 0xe5, 0x89, 0x5a, 0xec, 0x8c, 0xd3, - 0x9a, 0x99, 0x5d, 0x0c, 0xc4, 0x26, 0x2e, 0x5f, 0x10, 0x61, 0xec, 0xb2, 0x69, 0xb0, 0xf8, 0x22, - 0xe2, 0x8f, 0xc2, 0x40, 0x9f, 0x84, 0xe1, 0x86, 0xbb, 0xe7, 0x86, 0x42, 0x9a, 0x72, 0x64, 0xd5, - 0x45, 0x7c, 0x0e, 0x96, 0x39, 0x19, 0x2c, 0xe9, 0xd9, 0x3f, 0x50, 0x80, 0x71, 0xd9, 0xe2, 0x1b, - 0x1d, 0x3f, 0x72, 0x4e, 0xe0, 0x5a, 0xbe, 0x66, 0x5c, 0xcb, 0x1f, 0xe8, 0x16, 0xf6, 0x88, 0x75, - 0x29, 0xf7, 0x3a, 0xbe, 0x95, 0xb8, 0x8e, 0x9f, 0xea, 0x4d, 0xaa, 0xfb, 0x35, 0xfc, 0x4f, 0x2d, - 0x98, 0x36, 0xf0, 0x4f, 0xe0, 0x36, 0x58, 0x35, 0x6f, 0x83, 0x27, 0x7b, 0x7e, 0x43, 0xce, 0x2d, - 0xf0, 0xdd, 0xc5, 0x44, 0xdf, 0xd9, 0xe9, 0xff, 0x16, 0x0c, 0xec, 0x38, 0x41, 0xa3, 0x5b, 0x98, - 0xf7, 0x54, 0xa5, 0x85, 0xeb, 0x4e, 0x20, 0xf4, 0x94, 0xcf, 0xaa, 0xfc, 0xe1, 0x4e, 0xd0, 0x5b, - 0x47, 0xc9, 0x9a, 0x42, 0x2f, 0xc3, 0x50, 0x58, 0xf7, 0xdb, 0xca, 0x8a, 0xff, 0x02, 0xcf, 0x2d, - 0x4e, 0x4b, 0x0e, 0x0f, 0xe6, 0x91, 0xd9, 0x1c, 0x2d, 0xc6, 0x02, 0x1f, 0x7d, 0x0a, 0xc6, 0xd9, - 0x2f, 0x65, 0x34, 0x54, 0xcc, 0x4f, 0x09, 0x55, 0xd3, 0x11, 0xb9, 0x45, 0x9d, 0x51, 0x84, 0x4d, - 0x52, 0x73, 0xdb, 0x50, 0x52, 0x9f, 0xf5, 0x48, 0x75, 0x83, 0xff, 0xb1, 0x08, 0x33, 0x19, 0x6b, - 0x0e, 0x85, 0xc6, 0x4c, 0x5c, 0xed, 0x73, 0xa9, 0xbe, 0xc3, 0xb9, 0x08, 0xd9, 0x6b, 0xa8, 0x21, - 0xd6, 0x56, 0xdf, 0x8d, 0xde, 0x0e, 0x49, 0xb2, 0x51, 0x5a, 0xd4, 0xbb, 0x51, 0xda, 0xd8, 0x89, - 0x0d, 0x35, 0x6d, 0x48, 0xf5, 0xf4, 0x91, 0xce, 0xe9, 0x9f, 0x15, 0xe1, 0x54, 0x56, 0x24, 0x36, - 0xf4, 0xf9, 0x44, 0x92, 0xc1, 0x17, 0xfb, 0x8d, 0xe1, 0xc6, 0x33, 0x0f, 0x72, 0x19, 0xf0, 0xd2, - 0x82, 0x99, 0x76, 0xb0, 0xe7, 0x30, 0x8b, 0x36, 0x59, 0x38, 0x82, 0x80, 0x27, 0x87, 0x94, 0xc7, - 0xc7, 0x87, 0xfb, 0xee, 0x80, 0xc8, 0x2a, 0x19, 0x26, 0x0c, 0x12, 0x64, 0x71, 0x6f, 0x83, 0x04, - 0xd9, 0xf2, 0x9c, 0x0b, 0xa3, 0xda, 0xd7, 0x3c, 0xd2, 0x19, 0xdf, 0xa5, 0xb7, 0x95, 0xd6, 0xef, - 0x47, 0x3a, 0xeb, 0x3f, 0x6a, 0x41, 0xc2, 0x46, 0x5d, 0x89, 0xc5, 0xac, 0x5c, 0xb1, 0xd8, 0x05, - 0x18, 0x08, 0xfc, 0x26, 0x49, 0x66, 0xe3, 0xc3, 0x7e, 0x93, 0x60, 0x06, 0xa1, 0x18, 0x51, 0x2c, - 0xec, 0x18, 0xd3, 0x1f, 0x72, 0xe2, 0x89, 0x76, 0x11, 0x06, 0x9b, 0x64, 0x8f, 0x34, 0x93, 0x49, - 0x53, 0x6e, 0xd2, 0x42, 0xcc, 0x61, 0xf6, 0x2f, 0x0c, 0xc0, 0xb9, 0xae, 0x01, 0x3d, 0xe8, 0x73, - 0x68, 0xdb, 0x89, 0xc8, 0x3d, 0x67, 0x3f, 0x99, 0xdd, 0xe0, 0x1a, 0x2f, 0xc6, 0x12, 0xce, 0xbc, - 0x88, 0x78, 0x90, 0xe2, 0x84, 0x10, 0x51, 0xc4, 0x26, 0x16, 0x50, 0x53, 0x28, 0x55, 0x3c, 0x0e, - 0xa1, 0xd4, 0xf3, 0x00, 0x61, 0xd8, 0xe4, 0x96, 0x3c, 0x0d, 0xe1, 0x9e, 0x14, 0x07, 0xb3, 0xae, - 0xdd, 0x14, 0x10, 0xac, 0x61, 0xa1, 0x32, 0x4c, 0xb5, 0x03, 0x3f, 0xe2, 0x32, 0xd9, 0x32, 0x37, - 0x76, 0x1b, 0x34, 0x63, 0x29, 0x54, 0x13, 0x70, 0x9c, 0xaa, 0x81, 0x5e, 0x82, 0x51, 0x11, 0x5f, - 0xa1, 0xea, 0xfb, 0x4d, 0x21, 0x06, 0x52, 0xf6, 0x5f, 0xb5, 0x18, 0x84, 0x75, 0x3c, 0xad, 0x1a, - 0x13, 0xf4, 0x0e, 0x67, 0x56, 0xe3, 0xc2, 0x5e, 0x0d, 0x2f, 0x11, 0x95, 0x71, 0xa4, 0xaf, 0xa8, - 0x8c, 0xb1, 0x60, 0xac, 0xd4, 0xb7, 0x6e, 0x0b, 0x7a, 0x8a, 0x92, 0x7e, 0x76, 0x00, 0x66, 0xc4, - 0xc2, 0x79, 0xd4, 0xcb, 0xe5, 0x76, 0x7a, 0xb9, 0x1c, 0x87, 0xe8, 0xec, 0xbd, 0x35, 0x73, 0xd2, - 0x6b, 0xe6, 0x07, 0x2d, 0x30, 0xd9, 0x2b, 0xf4, 0xff, 0xe5, 0xa6, 0x87, 0x79, 0x29, 0x97, 0x5d, - 0x6b, 0xc8, 0x0b, 0xe4, 0x1d, 0x26, 0x8a, 0xb1, 0xff, 0xb3, 0x05, 0x4f, 0xf6, 0xa4, 0x88, 0x56, - 0xa0, 0xc4, 0x78, 0x40, 0xed, 0x75, 0xf6, 0x94, 0x32, 0x86, 0x95, 0x80, 0x1c, 0x96, 0x34, 0xae, - 0x89, 0x56, 0x52, 0x79, 0x78, 0x9e, 0xce, 0xc8, 0xc3, 0x73, 0xda, 0x18, 0x9e, 0x87, 0x4c, 0xc4, - 0xf3, 0xfd, 0xf4, 0xc6, 0x31, 0x1c, 0x51, 0xd0, 0x87, 0x0d, 0xb1, 0x9f, 0x9d, 0x10, 0xfb, 0x21, - 0x13, 0x5b, 0xbb, 0x43, 0x3e, 0x0e, 0x53, 0x2c, 0xf0, 0x12, 0x33, 0xcd, 0x16, 0x2e, 0x32, 0x85, - 0xd8, 0xfc, 0xf2, 0x66, 0x02, 0x86, 0x53, 0xd8, 0xf6, 0x1f, 0x15, 0x61, 0x88, 0x6f, 0xbf, 0x13, - 0x78, 0x13, 0x3e, 0x03, 0x25, 0xb7, 0xd5, 0xea, 0xf0, 0xd4, 0x2a, 0x83, 0xdc, 0x2f, 0x96, 0xce, - 0x53, 0x45, 0x16, 0xe2, 0x18, 0x8e, 0x56, 0x85, 0xc4, 0xb9, 0x4b, 0x6c, 0x47, 0xde, 0xf1, 0x85, - 0xb2, 0x13, 0x39, 0x9c, 0xc1, 0x51, 0xf7, 0x6c, 0x2c, 0x9b, 0x46, 0x9f, 0x01, 0x08, 0xa3, 0xc0, - 0xf5, 0xb6, 0x69, 0x99, 0x08, 0x65, 0xfa, 0xc1, 0x2e, 0xd4, 0x6a, 0x0a, 0x99, 0xd3, 0x8c, 0xcf, - 0x1c, 0x05, 0xc0, 0x1a, 0x45, 0xb4, 0x60, 0xdc, 0xf4, 0x73, 0x89, 0xb9, 0x03, 0x4e, 0x35, 0x9e, - 0xb3, 0xb9, 0x8f, 0x40, 0x49, 0x11, 0xef, 0x25, 0x7f, 0x1a, 0xd3, 0xd9, 0xa2, 0x8f, 0xc1, 0x64, - 0xa2, 0x6f, 0x47, 0x12, 0x5f, 0xfd, 0xa2, 0x05, 0x93, 0xbc, 0x33, 0x2b, 0xde, 0x9e, 0xb8, 0x0d, - 0xde, 0x86, 0x53, 0xcd, 0x8c, 0x53, 0x59, 0x4c, 0x7f, 0xff, 0xa7, 0xb8, 0x12, 0x57, 0x65, 0x41, - 0x71, 0x66, 0x1b, 0xe8, 0x32, 0xdd, 0x71, 0xf4, 0xd4, 0x75, 0x9a, 0xc2, 0x4d, 0x76, 0x8c, 0xef, - 0x36, 0x5e, 0x86, 0x15, 0xd4, 0xfe, 0x5d, 0x0b, 0xa6, 0x79, 0xcf, 0x6f, 0x90, 0x7d, 0x75, 0x36, - 0x7d, 0x3d, 0xfb, 0x2e, 0x92, 0x7a, 0x15, 0x72, 0x92, 0x7a, 0xe9, 0x9f, 0x56, 0xec, 0xfa, 0x69, - 0x3f, 0x63, 0x81, 0x58, 0x21, 0x27, 0x20, 0x84, 0xf8, 0x56, 0x53, 0x08, 0x31, 0x97, 0xbf, 0x09, - 0x72, 0xa4, 0x0f, 0x7f, 0x61, 0xc1, 0x14, 0x47, 0x88, 0xb5, 0xe5, 0x5f, 0xd7, 0x79, 0xe8, 0x27, - 0xf5, 0xef, 0x0d, 0xb2, 0xbf, 0xe1, 0x57, 0x9d, 0x68, 0x27, 0xfb, 0xa3, 0x8c, 0xc9, 0x1a, 0xe8, - 0x3a, 0x59, 0x0d, 0xb9, 0x81, 0x8e, 0x90, 0x4f, 0xfc, 0xc8, 0x39, 0x2f, 0xec, 0xaf, 0x59, 0x80, - 0x78, 0x33, 0x06, 0xe3, 0x46, 0xd9, 0x21, 0x56, 0xaa, 0x5d, 0x74, 0xf1, 0xd1, 0xa4, 0x20, 0x58, - 0xc3, 0x3a, 0x96, 0xe1, 0x49, 0x98, 0x3c, 0x14, 0x7b, 0x9b, 0x3c, 0x1c, 0x61, 0x44, 0xff, 0xed, - 0x10, 0x24, 0x9d, 0x71, 0xd0, 0x1d, 0x18, 0xab, 0x3b, 0x6d, 0x67, 0xd3, 0x6d, 0xba, 0x91, 0x4b, - 0xc2, 0x6e, 0xb6, 0x52, 0xcb, 0x1a, 0x9e, 0x50, 0x52, 0x6b, 0x25, 0xd8, 0xa0, 0x83, 0x16, 0x00, - 0xda, 0x81, 0xbb, 0xe7, 0x36, 0xc9, 0x36, 0x93, 0x95, 0x30, 0xc7, 0x7c, 0x6e, 0x00, 0x24, 0x4b, - 0xb1, 0x86, 0x91, 0xe1, 0xf9, 0x5c, 0x7c, 0xc4, 0x9e, 0xcf, 0x70, 0x62, 0x9e, 0xcf, 0x03, 0x47, - 0xf2, 0x7c, 0x1e, 0x39, 0xb2, 0xe7, 0xf3, 0x60, 0x5f, 0x9e, 0xcf, 0x18, 0xce, 0x48, 0xde, 0x93, - 0xfe, 0x5f, 0x75, 0x9b, 0x44, 0x3c, 0x38, 0x78, 0x34, 0x81, 0xb9, 0x07, 0x07, 0xf3, 0x67, 0x70, - 0x26, 0x06, 0xce, 0xa9, 0x89, 0x3e, 0x01, 0xb3, 0x4e, 0xb3, 0xe9, 0xdf, 0x53, 0x93, 0xba, 0x12, - 0xd6, 0x9d, 0x26, 0x57, 0x42, 0x0c, 0x33, 0xaa, 0x4f, 0x3c, 0x38, 0x98, 0x9f, 0x5d, 0xcc, 0xc1, - 0xc1, 0xb9, 0xb5, 0xd1, 0x47, 0xa1, 0xd4, 0x0e, 0xfc, 0xfa, 0x9a, 0xe6, 0x31, 0x78, 0x9e, 0x0e, - 0x60, 0x55, 0x16, 0x1e, 0x1e, 0xcc, 0x8f, 0xab, 0x3f, 0xec, 0xc2, 0x8f, 0x2b, 0x64, 0xb8, 0x32, - 0x8f, 0x1e, 0xab, 0x2b, 0xf3, 0x2e, 0xcc, 0xd4, 0x48, 0xe0, 0xb2, 0xec, 0xe3, 0x8d, 0xf8, 0x7c, - 0xda, 0x80, 0x52, 0x90, 0x38, 0x91, 0xfb, 0x8a, 0xb7, 0xa8, 0x25, 0x1f, 0x90, 0x27, 0x70, 0x4c, - 0xc8, 0xfe, 0xdf, 0x16, 0x0c, 0x0b, 0xe7, 0x9b, 0x13, 0xe0, 0x1a, 0x17, 0x0d, 0x4d, 0xc2, 0x7c, - 0xf6, 0x80, 0xb1, 0xce, 0xe4, 0xea, 0x10, 0x2a, 0x09, 0x1d, 0xc2, 0x93, 0xdd, 0x88, 0x74, 0xd7, - 0x1e, 0xfc, 0xcd, 0x22, 0xe5, 0xde, 0x0d, 0x37, 0xd0, 0x47, 0x3f, 0x04, 0xeb, 0x30, 0x1c, 0x0a, - 0x37, 0xc4, 0x42, 0xbe, 0xdd, 0x7c, 0x72, 0x12, 0x63, 0x3b, 0x36, 0xe1, 0x78, 0x28, 0x89, 0x64, - 0xfa, 0x37, 0x16, 0x1f, 0xa1, 0x7f, 0x63, 0x2f, 0x47, 0xd9, 0x81, 0xe3, 0x70, 0x94, 0xb5, 0xbf, - 0xc2, 0x6e, 0x4e, 0xbd, 0xfc, 0x04, 0x98, 0xaa, 0x6b, 0xe6, 0x1d, 0x6b, 0x77, 0x59, 0x59, 0xa2, - 0x53, 0x39, 0xcc, 0xd5, 0xcf, 0x5b, 0x70, 0x2e, 0xe3, 0xab, 0x34, 0x4e, 0xeb, 0x59, 0x18, 0x71, - 0x3a, 0x0d, 0x57, 0xed, 0x65, 0x4d, 0x9f, 0xb8, 0x28, 0xca, 0xb1, 0xc2, 0x40, 0xcb, 0x30, 0x4d, - 0xee, 0xb7, 0x5d, 0xae, 0x4a, 0xd5, 0x8d, 0x4d, 0x8b, 0xdc, 0x63, 0x6b, 0x25, 0x09, 0xc4, 0x69, - 0x7c, 0x15, 0x9c, 0xa4, 0x98, 0x1b, 0x9c, 0xe4, 0x1f, 0x58, 0x30, 0xaa, 0x1c, 0xf1, 0x1e, 0xf9, - 0x68, 0x7f, 0xdc, 0x1c, 0xed, 0xc7, 0xbb, 0x8c, 0x76, 0xce, 0x30, 0xff, 0x76, 0x41, 0xf5, 0xb7, - 0xea, 0x07, 0x51, 0x1f, 0x1c, 0xdc, 0xc3, 0x9b, 0xc7, 0x5f, 0x85, 0x51, 0xa7, 0xdd, 0x96, 0x00, - 0x69, 0x83, 0xc6, 0xa2, 0xe7, 0xc6, 0xc5, 0x58, 0xc7, 0x51, 0xd6, 0xfa, 0xc5, 0x5c, 0x6b, 0xfd, - 0x06, 0x40, 0xe4, 0x04, 0xdb, 0x24, 0xa2, 0x65, 0x22, 0x90, 0x58, 0xfe, 0x79, 0xd3, 0x89, 0xdc, - 0xe6, 0x82, 0xeb, 0x45, 0x61, 0x14, 0x2c, 0x54, 0xbc, 0xe8, 0x56, 0xc0, 0x9f, 0x90, 0x5a, 0xa4, - 0x1e, 0x45, 0x0b, 0x6b, 0x74, 0xa5, 0xd3, 0x39, 0x6b, 0x63, 0xd0, 0x34, 0x66, 0x58, 0x17, 0xe5, - 0x58, 0x61, 0xd8, 0x1f, 0x61, 0xb7, 0x0f, 0x1b, 0xd3, 0xa3, 0x85, 0xb6, 0xf9, 0xd3, 0x51, 0x35, - 0x1b, 0x4c, 0x93, 0x59, 0xd6, 0x03, 0xe8, 0x74, 0x3f, 0xec, 0x69, 0xc3, 0xba, 0xef, 0x58, 0x1c, - 0x65, 0x07, 0x7d, 0x5b, 0xca, 0x40, 0xe5, 0xb9, 0x1e, 0xb7, 0xc6, 0x11, 0x4c, 0x52, 0x58, 0x2a, - 0x0d, 0x96, 0x68, 0xa0, 0x52, 0x15, 0xfb, 0x42, 0x4b, 0xa5, 0x21, 0x00, 0x38, 0xc6, 0xa1, 0xcc, - 0x94, 0xfa, 0x13, 0xce, 0xa2, 0x38, 0xa4, 0xa4, 0xc2, 0x0e, 0xb1, 0x86, 0x81, 0xae, 0x08, 0x81, - 0x02, 0xd7, 0x0b, 0x3c, 0x9e, 0x10, 0x28, 0xc8, 0xe1, 0xd2, 0xa4, 0x40, 0x57, 0x61, 0x54, 0x65, - 0xd3, 0xad, 0xf2, 0x24, 0xad, 0x62, 0x99, 0xad, 0xc4, 0xc5, 0x58, 0xc7, 0x41, 0x1b, 0x30, 0x19, - 0x72, 0x39, 0x9b, 0x8a, 0xf3, 0xcb, 0xe5, 0x95, 0x1f, 0x94, 0x56, 0x40, 0x35, 0x13, 0x7c, 0xc8, - 0x8a, 0xf8, 0xe9, 0x24, 0x1d, 0xc3, 0x93, 0x24, 0xd0, 0x6b, 0x30, 0xd1, 0xf4, 0x9d, 0xc6, 0x92, - 0xd3, 0x74, 0xbc, 0x3a, 0x1b, 0x9f, 0x11, 0x33, 0x29, 0xe3, 0x4d, 0x03, 0x8a, 0x13, 0xd8, 0x94, - 0x79, 0xd3, 0x4b, 0x44, 0x6c, 0x6a, 0xc7, 0xdb, 0x26, 0xa1, 0xc8, 0x8d, 0xca, 0x98, 0xb7, 0x9b, - 0x39, 0x38, 0x38, 0xb7, 0x36, 0x7a, 0x19, 0xc6, 0xe4, 0xe7, 0x6b, 0x71, 0x14, 0x62, 0xc7, 0x07, - 0x0d, 0x86, 0x0d, 0x4c, 0x74, 0x0f, 0x4e, 0xcb, 0xff, 0x1b, 0x81, 0xb3, 0xb5, 0xe5, 0xd6, 0x85, - 0x73, 0x31, 0xf7, 0x90, 0x5c, 0x94, 0x6e, 0x7c, 0x2b, 0x59, 0x48, 0x87, 0x07, 0xf3, 0x17, 0xc4, - 0xa8, 0x65, 0xc2, 0xd9, 0x24, 0x66, 0xd3, 0x47, 0x6b, 0x30, 0xb3, 0x43, 0x9c, 0x66, 0xb4, 0xb3, - 0xbc, 0x43, 0xea, 0xbb, 0x72, 0xd3, 0xb1, 0xe8, 0x0c, 0x9a, 0xbb, 0xc0, 0xf5, 0x34, 0x0a, 0xce, - 0xaa, 0x87, 0xde, 0x84, 0xd9, 0x76, 0x67, 0xb3, 0xe9, 0x86, 0x3b, 0xeb, 0x7e, 0xc4, 0x4c, 0x81, - 0x54, 0x72, 0x5e, 0x11, 0xc6, 0x41, 0xc5, 0xbf, 0xa8, 0xe6, 0xe0, 0xe1, 0x5c, 0x0a, 0xe8, 0x6d, - 0x38, 0x9d, 0x58, 0x0c, 0xc2, 0x91, 0x7d, 0x22, 0x3f, 0xd2, 0x7f, 0x2d, 0xab, 0x82, 0x88, 0x09, - 0x91, 0x05, 0xc2, 0xd9, 0x4d, 0xd0, 0xc7, 0x87, 0x16, 0x5a, 0x35, 0x9c, 0x9d, 0x8a, 0x6d, 0x96, - 0xb5, 0xf8, 0xab, 0x21, 0x36, 0xb0, 0xd0, 0x2b, 0x00, 0x6e, 0x7b, 0xd5, 0x69, 0xb9, 0x4d, 0xfa, - 0xc8, 0x9c, 0x61, 0x75, 0xe8, 0x83, 0x03, 0x2a, 0x55, 0x59, 0x4a, 0x4f, 0x75, 0xf1, 0x6f, 0x1f, - 0x6b, 0xd8, 0xa8, 0x0a, 0x13, 0xe2, 0xdf, 0xbe, 0x58, 0x0c, 0xd3, 0xca, 0xd3, 0x7c, 0x42, 0xd6, - 0x50, 0x2b, 0x00, 0x99, 0x25, 0x6c, 0xce, 0x13, 0xf5, 0xd1, 0x36, 0x9c, 0x13, 0xd9, 0x9f, 0x89, - 0xbe, 0xba, 0xe5, 0xec, 0x85, 0x2c, 0x30, 0xff, 0x08, 0x0f, 0x20, 0xb3, 0xd8, 0x0d, 0x11, 0x77, - 0xa7, 0x43, 0xb9, 0x02, 0x7d, 0x93, 0x70, 0xdf, 0xce, 0xd3, 0xdc, 0xa8, 0x89, 0x72, 0x05, 0x37, - 0x93, 0x40, 0x9c, 0xc6, 0x7f, 0x67, 0x66, 0x74, 0xbf, 0x63, 0xd1, 0xda, 0x1a, 0xab, 0x8d, 0x3e, - 0x0b, 0x63, 0x7a, 0x1b, 0x82, 0x6d, 0xb8, 0x94, 0xcd, 0x89, 0x6a, 0x1b, 0x9c, 0x33, 0xea, 0x6a, - 0x13, 0xeb, 0x30, 0x6c, 0x50, 0x44, 0xf5, 0x0c, 0x5f, 0xec, 0x2b, 0xfd, 0xb1, 0x25, 0xfd, 0x5b, - 0x91, 0x11, 0xc8, 0x5e, 0xb7, 0xe8, 0x26, 0x8c, 0xd4, 0x9b, 0x2e, 0xf1, 0xa2, 0x4a, 0xb5, 0x5b, - 0xf4, 0xb4, 0x65, 0x81, 0x23, 0x36, 0x82, 0x08, 0x79, 0xcf, 0xcb, 0xb0, 0xa2, 0x60, 0xff, 0x5a, - 0x01, 0xe6, 0x7b, 0xe4, 0x4f, 0x48, 0xe8, 0x94, 0xac, 0xbe, 0x74, 0x4a, 0x8b, 0x32, 0x85, 0xf4, - 0x7a, 0x42, 0x5c, 0x95, 0x48, 0x0f, 0x1d, 0x0b, 0xad, 0x92, 0xf8, 0x7d, 0xdb, 0xf8, 0xeb, 0x6a, - 0xa9, 0x81, 0x9e, 0x5e, 0x2a, 0x86, 0x3a, 0x7a, 0xb0, 0xff, 0x37, 0x6c, 0xae, 0x6a, 0xd1, 0xfe, - 0x4a, 0x01, 0x4e, 0xab, 0x21, 0xfc, 0xe6, 0x1d, 0xb8, 0xdb, 0xe9, 0x81, 0x3b, 0x06, 0xc5, 0xac, - 0x7d, 0x0b, 0x86, 0x78, 0x38, 0xb8, 0x3e, 0x78, 0xe7, 0x8b, 0x66, 0xe4, 0x54, 0xc5, 0xae, 0x19, - 0xd1, 0x53, 0xbf, 0xd7, 0x82, 0xc9, 0x8d, 0xe5, 0x6a, 0xcd, 0xaf, 0xef, 0x92, 0x68, 0x91, 0xbf, - 0x75, 0xb0, 0xe6, 0xb5, 0xfa, 0x30, 0xfc, 0x6d, 0x16, 0xe7, 0x7c, 0x01, 0x06, 0x76, 0xfc, 0x30, - 0x4a, 0x5a, 0x6d, 0x5c, 0xf7, 0xc3, 0x08, 0x33, 0x88, 0xfd, 0x7b, 0x16, 0x0c, 0x6e, 0x38, 0xae, - 0x17, 0x49, 0x09, 0xbf, 0x95, 0x23, 0xe1, 0xef, 0xe7, 0xbb, 0xd0, 0x4b, 0x30, 0x44, 0xb6, 0xb6, - 0x48, 0x3d, 0x12, 0xb3, 0x2a, 0x5d, 0xfe, 0x87, 0x56, 0x58, 0x29, 0x65, 0xe6, 0x58, 0x63, 0xfc, - 0x2f, 0x16, 0xc8, 0xe8, 0x2e, 0x94, 0x22, 0xb7, 0x45, 0x16, 0x1b, 0x0d, 0xa1, 0xf7, 0x7e, 0x88, - 0xb0, 0x05, 0x1b, 0x92, 0x00, 0x8e, 0x69, 0xd9, 0x5f, 0x2a, 0x00, 0xc4, 0x71, 0x74, 0x7a, 0x7d, - 0xe2, 0x52, 0x4a, 0x23, 0x7a, 0x29, 0x43, 0x23, 0x8a, 0x62, 0x82, 0x19, 0xea, 0x50, 0x35, 0x4c, - 0xc5, 0xbe, 0x86, 0x69, 0xe0, 0x28, 0xc3, 0xb4, 0x0c, 0xd3, 0x71, 0x1c, 0x20, 0x33, 0x0c, 0x1a, - 0xbb, 0xc9, 0x36, 0x92, 0x40, 0x9c, 0xc6, 0xb7, 0x09, 0x5c, 0x50, 0xe1, 0x50, 0xc4, 0x8d, 0xc6, - 0xcc, 0xaa, 0x75, 0x0d, 0x73, 0x8f, 0x71, 0x8a, 0x55, 0xbe, 0x85, 0x5c, 0x95, 0xef, 0x4f, 0x58, - 0x70, 0x2a, 0xd9, 0x0e, 0xf3, 0x73, 0xfd, 0xa2, 0x05, 0xa7, 0x99, 0xe2, 0x9b, 0xb5, 0x9a, 0x56, - 0xb3, 0xbf, 0xd8, 0x35, 0xc4, 0x4b, 0x4e, 0x8f, 0xe3, 0xd8, 0x12, 0x6b, 0x59, 0xa4, 0x71, 0x76, - 0x8b, 0xf6, 0x7f, 0x2a, 0xc0, 0x6c, 0x5e, 0x6c, 0x18, 0xe6, 0x75, 0xe1, 0xdc, 0xaf, 0xed, 0x92, - 0x7b, 0xc2, 0xb6, 0x3d, 0xf6, 0xba, 0xe0, 0xc5, 0x58, 0xc2, 0x93, 0x21, 0xf1, 0x0b, 0x7d, 0x86, - 0xc4, 0xdf, 0x81, 0xe9, 0x7b, 0x3b, 0xc4, 0xbb, 0xed, 0x85, 0x4e, 0xe4, 0x86, 0x5b, 0x2e, 0x53, - 0x12, 0xf3, 0x75, 0xf3, 0x8a, 0xb4, 0x40, 0xbf, 0x9b, 0x44, 0x38, 0x3c, 0x98, 0x3f, 0x67, 0x14, - 0xc4, 0x5d, 0xe6, 0x07, 0x09, 0x4e, 0x13, 0x4d, 0x67, 0x14, 0x18, 0x78, 0x84, 0x19, 0x05, 0xec, - 0x2f, 0x5a, 0x70, 0x36, 0x37, 0x8d, 0x29, 0xba, 0x0c, 0x23, 0x4e, 0xdb, 0xe5, 0x72, 0x76, 0x71, - 0x8c, 0x32, 0x79, 0x4e, 0xb5, 0xc2, 0xa5, 0xec, 0x0a, 0xaa, 0xd2, 0xab, 0x17, 0x72, 0xd3, 0xab, - 0xf7, 0xcc, 0x96, 0x6e, 0x7f, 0x8f, 0x05, 0xc2, 0x63, 0xb4, 0x8f, 0xb3, 0xfb, 0x53, 0x30, 0xb6, - 0x97, 0xce, 0x3a, 0x74, 0x21, 0xdf, 0x85, 0x56, 0xe4, 0x1a, 0x52, 0x0c, 0x99, 0x91, 0x61, 0xc8, - 0xa0, 0x65, 0x37, 0x40, 0x40, 0xcb, 0x84, 0x49, 0x91, 0x7b, 0xf7, 0xe6, 0x79, 0x80, 0x06, 0xc3, - 0xd5, 0x72, 0xd4, 0xab, 0x9b, 0xb9, 0xac, 0x20, 0x58, 0xc3, 0xb2, 0xff, 0x7d, 0x01, 0x46, 0x65, - 0x96, 0x9b, 0x8e, 0xd7, 0x8f, 0xac, 0xe7, 0x48, 0x69, 0x2f, 0xd1, 0x15, 0x28, 0x31, 0x61, 0x64, - 0x35, 0x16, 0x91, 0x29, 0x51, 0xc0, 0x9a, 0x04, 0xe0, 0x18, 0x87, 0xee, 0xa2, 0xb0, 0xb3, 0xc9, - 0xd0, 0x13, 0xfe, 0x8d, 0x35, 0x5e, 0x8c, 0x25, 0x1c, 0x7d, 0x02, 0xa6, 0x78, 0xbd, 0xc0, 0x6f, - 0x3b, 0xdb, 0x5c, 0x81, 0x31, 0xa8, 0x02, 0x13, 0x4c, 0xad, 0x25, 0x60, 0x87, 0x07, 0xf3, 0xa7, - 0x92, 0x65, 0x4c, 0x33, 0x97, 0xa2, 0xc2, 0xec, 0x94, 0x78, 0x23, 0x74, 0xf7, 0xa7, 0xcc, 0x9b, - 0x62, 0x10, 0xd6, 0xf1, 0xec, 0xcf, 0x02, 0x4a, 0xe7, 0xfb, 0x41, 0xaf, 0x73, 0xe3, 0x54, 0x37, - 0x20, 0x8d, 0x6e, 0x9a, 0x3a, 0xdd, 0xfd, 0x5e, 0xba, 0x26, 0xf1, 0x5a, 0x58, 0xd5, 0xb7, 0xff, - 0x6a, 0x11, 0xa6, 0x92, 0xce, 0xd8, 0xe8, 0x3a, 0x0c, 0x71, 0xd6, 0x43, 0x90, 0xef, 0x62, 0x08, - 0xa2, 0xb9, 0x70, 0xb3, 0x43, 0x58, 0x70, 0x2f, 0xa2, 0x3e, 0x7a, 0x13, 0x46, 0x1b, 0xfe, 0x3d, - 0xef, 0x9e, 0x13, 0x34, 0x16, 0xab, 0x15, 0xb1, 0x9c, 0x33, 0x5f, 0xa6, 0xe5, 0x18, 0x4d, 0x77, - 0x0b, 0x67, 0x4a, 0xcf, 0x18, 0x84, 0x75, 0x72, 0x68, 0x83, 0x05, 0x09, 0xdf, 0x72, 0xb7, 0xd7, - 0x9c, 0x76, 0x37, 0x4f, 0x85, 0x65, 0x89, 0xa4, 0x51, 0x1e, 0x17, 0x91, 0xc4, 0x39, 0x00, 0xc7, - 0x84, 0xd0, 0xe7, 0x61, 0x26, 0xcc, 0x91, 0x97, 0xe7, 0xa5, 0x7f, 0xeb, 0x26, 0x42, 0x5e, 0x7a, - 0xec, 0xc1, 0xc1, 0xfc, 0x4c, 0x96, 0x64, 0x3d, 0xab, 0x19, 0xfb, 0x47, 0x4e, 0x81, 0xb1, 0x89, - 0x8d, 0x6c, 0xa0, 0xd6, 0x31, 0x65, 0x03, 0xc5, 0x30, 0x42, 0x5a, 0xed, 0x68, 0xbf, 0xec, 0x06, - 0xdd, 0x72, 0x64, 0xaf, 0x08, 0x9c, 0x34, 0x4d, 0x09, 0xc1, 0x8a, 0x4e, 0x76, 0xca, 0xd6, 0xe2, - 0xd7, 0x31, 0x65, 0xeb, 0xc0, 0x09, 0xa6, 0x6c, 0x5d, 0x87, 0xe1, 0x6d, 0x37, 0xc2, 0xa4, 0xed, - 0x0b, 0xa6, 0x3f, 0x73, 0x1d, 0x5e, 0xe3, 0x28, 0xe9, 0xe4, 0x80, 0x02, 0x80, 0x25, 0x11, 0xf4, - 0xba, 0xda, 0x81, 0x43, 0xf9, 0x0f, 0xf3, 0xb4, 0xc5, 0x42, 0xe6, 0x1e, 0x14, 0x89, 0x59, 0x87, - 0x1f, 0x36, 0x31, 0xeb, 0xaa, 0x4c, 0xa7, 0x3a, 0x92, 0xef, 0x56, 0xc4, 0xb2, 0xa5, 0xf6, 0x48, - 0xa2, 0x7a, 0x47, 0x4f, 0x41, 0x5b, 0xca, 0x3f, 0x09, 0x54, 0x76, 0xd9, 0x3e, 0x13, 0xcf, 0x7e, - 0x8f, 0x05, 0xa7, 0xdb, 0x59, 0xd9, 0x98, 0x85, 0x72, 0xff, 0xa5, 0xbe, 0x13, 0x3e, 0x1b, 0x0d, - 0x32, 0xa1, 0x58, 0x26, 0x1a, 0xce, 0x6e, 0x8e, 0x0e, 0x74, 0xb0, 0xd9, 0x10, 0x4a, 0xe6, 0x8b, - 0x39, 0x19, 0x6c, 0xbb, 0xe4, 0xad, 0xdd, 0xc8, 0xc8, 0x96, 0xfa, 0xfe, 0xbc, 0x6c, 0xa9, 0x7d, - 0xe7, 0x48, 0x7d, 0x5d, 0xe5, 0xae, 0x1d, 0xcf, 0x5f, 0x4a, 0x3c, 0x33, 0x6d, 0xcf, 0x8c, 0xb5, - 0xaf, 0xab, 0x8c, 0xb5, 0x5d, 0x22, 0xc0, 0xf2, 0x7c, 0xb4, 0x3d, 0xf3, 0xd4, 0x6a, 0xb9, 0x66, - 0x27, 0x8f, 0x27, 0xd7, 0xac, 0x71, 0xd5, 0xf0, 0x74, 0xa7, 0xcf, 0xf4, 0xb8, 0x6a, 0x0c, 0xba, - 0xdd, 0x2f, 0x1b, 0x9e, 0x57, 0x77, 0xfa, 0xa1, 0xf2, 0xea, 0xde, 0xd1, 0xf3, 0xd4, 0xa2, 0x1e, - 0x89, 0x58, 0x29, 0x52, 0x9f, 0xd9, 0x69, 0xef, 0xe8, 0x17, 0xe0, 0x4c, 0x3e, 0x5d, 0x75, 0xcf, - 0xa5, 0xe9, 0x66, 0x5e, 0x81, 0xa9, 0xac, 0xb7, 0xa7, 0x4e, 0x26, 0xeb, 0xed, 0xe9, 0x63, 0xcf, - 0x7a, 0x7b, 0xe6, 0x04, 0xb2, 0xde, 0x3e, 0x76, 0x82, 0x59, 0x6f, 0xef, 0x30, 0x8b, 0x18, 0x1e, - 0x77, 0x47, 0x44, 0xac, 0xcd, 0x8e, 0x8e, 0x9a, 0x15, 0x9c, 0x87, 0x7f, 0x9c, 0x02, 0xe1, 0x98, - 0x54, 0x46, 0x36, 0xdd, 0xd9, 0x47, 0x90, 0x4d, 0x77, 0x3d, 0xce, 0xa6, 0x7b, 0x36, 0x7f, 0xaa, - 0x33, 0x7c, 0x28, 0x72, 0x72, 0xe8, 0xde, 0xd1, 0x73, 0xdf, 0x3e, 0xde, 0x45, 0xed, 0x91, 0x25, - 0x78, 0xec, 0x92, 0xf1, 0xf6, 0x35, 0x9e, 0xf1, 0xf6, 0x89, 0xfc, 0x93, 0x3c, 0x79, 0xdd, 0x19, - 0x79, 0x6e, 0x69, 0xbf, 0x54, 0x6c, 0x44, 0x16, 0x9b, 0x37, 0xa7, 0x5f, 0x2a, 0xb8, 0x62, 0xba, - 0x5f, 0x0a, 0x84, 0x63, 0x52, 0xf6, 0xf7, 0x15, 0xe0, 0x7c, 0xf7, 0xfd, 0x16, 0x4b, 0x53, 0xab, - 0xb1, 0x16, 0x38, 0x21, 0x4d, 0xe5, 0x6f, 0xb6, 0x18, 0xab, 0xef, 0x50, 0x6f, 0xd7, 0x60, 0x5a, - 0x39, 0x5f, 0x34, 0xdd, 0xfa, 0xfe, 0x7a, 0xfc, 0xf2, 0x55, 0x0e, 0xeb, 0xb5, 0x24, 0x02, 0x4e, - 0xd7, 0x41, 0x8b, 0x30, 0x69, 0x14, 0x56, 0xca, 0xe2, 0x6d, 0xa6, 0xc4, 0xb7, 0x35, 0x13, 0x8c, - 0x93, 0xf8, 0xf6, 0x97, 0x2d, 0x78, 0x2c, 0x27, 0x5d, 0x5c, 0xdf, 0x91, 0xcc, 0xb6, 0x60, 0xb2, - 0x6d, 0x56, 0xed, 0x11, 0x7c, 0xd1, 0x48, 0x4a, 0xa7, 0xfa, 0x9a, 0x00, 0xe0, 0x24, 0x51, 0xfb, - 0xcf, 0x2d, 0x38, 0xd7, 0xd5, 0x9a, 0x10, 0x61, 0x38, 0xb3, 0xdd, 0x0a, 0x9d, 0xe5, 0x80, 0x34, - 0x88, 0x17, 0xb9, 0x4e, 0xb3, 0xd6, 0x26, 0x75, 0x4d, 0x1e, 0xce, 0xcc, 0xf2, 0xae, 0xad, 0xd5, - 0x16, 0xd3, 0x18, 0x38, 0xa7, 0x26, 0x5a, 0x05, 0x94, 0x86, 0x88, 0x19, 0x66, 0x51, 0x9e, 0xd3, - 0xf4, 0x70, 0x46, 0x0d, 0xf4, 0x11, 0x18, 0x57, 0x56, 0x8a, 0xda, 0x8c, 0xb3, 0x83, 0x1d, 0xeb, - 0x00, 0x6c, 0xe2, 0x2d, 0x5d, 0xfe, 0x8d, 0x3f, 0x38, 0xff, 0xbe, 0xdf, 0xfa, 0x83, 0xf3, 0xef, - 0xfb, 0xdd, 0x3f, 0x38, 0xff, 0xbe, 0xef, 0x78, 0x70, 0xde, 0xfa, 0x8d, 0x07, 0xe7, 0xad, 0xdf, - 0x7a, 0x70, 0xde, 0xfa, 0xdd, 0x07, 0xe7, 0xad, 0xdf, 0x7f, 0x70, 0xde, 0xfa, 0xd2, 0x1f, 0x9e, - 0x7f, 0xdf, 0xa7, 0x0a, 0x7b, 0x57, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x91, 0xbc, 0x24, - 0x52, 0x0c, 0x04, 0x01, 0x00, + // 14061 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x1c, 0xd9, + 0x75, 0x18, 0xac, 0x9e, 0xc1, 0x6b, 0x0e, 0xde, 0x17, 0x24, 0x17, 0xc4, 0x2e, 0x09, 0x6e, 0x53, + 0xe2, 0x72, 0xb5, 0xbb, 0xa0, 0xb8, 0x0f, 0x69, 0xbd, 0x2b, 0xad, 0x05, 0x60, 0x00, 0x72, 0x96, + 0x04, 0x38, 0x7b, 0x07, 0x24, 0x25, 0x79, 0xa5, 0x52, 0x63, 0xe6, 0x02, 0x68, 0x61, 0xa6, 0x7b, + 0xb6, 0xbb, 0x07, 0x24, 0xf6, 0x93, 0xeb, 0xf3, 0x27, 0x3f, 0xe5, 0xc7, 0x57, 0xaa, 0x94, 0x2b, + 0x0f, 0xdb, 0xe5, 0x4a, 0x39, 0x4e, 0xd9, 0x8a, 0x93, 0x54, 0x1c, 0x3b, 0xb6, 0x63, 0x39, 0xb1, + 0x13, 0xe7, 0xe1, 0xe4, 0x87, 0xe3, 0xb8, 0x12, 0xcb, 0x55, 0xae, 0x20, 0x36, 0x9d, 0x94, 0x4b, + 0x3f, 0x62, 0x3b, 0xb1, 0xf3, 0x23, 0x88, 0x2b, 0x4e, 0xdd, 0x67, 0xdf, 0xdb, 0x8f, 0x99, 0x01, + 0x17, 0x84, 0x56, 0xaa, 0xfd, 0x37, 0x73, 0xcf, 0xb9, 0xe7, 0xde, 0xbe, 0xcf, 0x73, 0xcf, 0x13, + 0x5e, 0xdd, 0x7d, 0x39, 0x5c, 0x70, 0xfd, 0x2b, 0xbb, 0x9d, 0x4d, 0x12, 0x78, 0x24, 0x22, 0xe1, + 0x95, 0x3d, 0xe2, 0x35, 0xfc, 0xe0, 0x8a, 0x00, 0x38, 0x6d, 0xf7, 0x4a, 0xdd, 0x0f, 0xc8, 0x95, + 0xbd, 0xab, 0x57, 0xb6, 0x89, 0x47, 0x02, 0x27, 0x22, 0x8d, 0x85, 0x76, 0xe0, 0x47, 0x3e, 0x42, + 0x1c, 0x67, 0xc1, 0x69, 0xbb, 0x0b, 0x14, 0x67, 0x61, 0xef, 0xea, 0xdc, 0x73, 0xdb, 0x6e, 0xb4, + 0xd3, 0xd9, 0x5c, 0xa8, 0xfb, 0xad, 0x2b, 0xdb, 0xfe, 0xb6, 0x7f, 0x85, 0xa1, 0x6e, 0x76, 0xb6, + 0xd8, 0x3f, 0xf6, 0x87, 0xfd, 0xe2, 0x24, 0xe6, 0x5e, 0x8c, 0x9b, 0x69, 0x39, 0xf5, 0x1d, 0xd7, + 0x23, 0xc1, 0xfe, 0x95, 0xf6, 0xee, 0x36, 0x6b, 0x37, 0x20, 0xa1, 0xdf, 0x09, 0xea, 0x24, 0xd9, + 0x70, 0xd7, 0x5a, 0xe1, 0x95, 0x16, 0x89, 0x9c, 0x8c, 0xee, 0xce, 0x5d, 0xc9, 0xab, 0x15, 0x74, + 0xbc, 0xc8, 0x6d, 0xa5, 0x9b, 0xf9, 0x70, 0xaf, 0x0a, 0x61, 0x7d, 0x87, 0xb4, 0x9c, 0x54, 0xbd, + 0x17, 0xf2, 0xea, 0x75, 0x22, 0xb7, 0x79, 0xc5, 0xf5, 0xa2, 0x30, 0x0a, 0x92, 0x95, 0xec, 0xaf, + 0x5a, 0x70, 0x61, 0xf1, 0x6e, 0x6d, 0xa5, 0xe9, 0x84, 0x91, 0x5b, 0x5f, 0x6a, 0xfa, 0xf5, 0xdd, + 0x5a, 0xe4, 0x07, 0xe4, 0x8e, 0xdf, 0xec, 0xb4, 0x48, 0x8d, 0x0d, 0x04, 0x7a, 0x16, 0x46, 0xf6, + 0xd8, 0xff, 0x4a, 0x79, 0xd6, 0xba, 0x60, 0x5d, 0x2e, 0x2d, 0x4d, 0xfd, 0xc6, 0xc1, 0xfc, 0xfb, + 0x1e, 0x1c, 0xcc, 0x8f, 0xdc, 0x11, 0xe5, 0x58, 0x61, 0xa0, 0x4b, 0x30, 0xb4, 0x15, 0x6e, 0xec, + 0xb7, 0xc9, 0x6c, 0x81, 0xe1, 0x4e, 0x08, 0xdc, 0xa1, 0xd5, 0x1a, 0x2d, 0xc5, 0x02, 0x8a, 0xae, + 0x40, 0xa9, 0xed, 0x04, 0x91, 0x1b, 0xb9, 0xbe, 0x37, 0x5b, 0xbc, 0x60, 0x5d, 0x1e, 0x5c, 0x9a, + 0x16, 0xa8, 0xa5, 0xaa, 0x04, 0xe0, 0x18, 0x87, 0x76, 0x23, 0x20, 0x4e, 0xe3, 0x96, 0xd7, 0xdc, + 0x9f, 0x1d, 0xb8, 0x60, 0x5d, 0x1e, 0x89, 0xbb, 0x81, 0x45, 0x39, 0x56, 0x18, 0xf6, 0x8f, 0x14, + 0x60, 0x64, 0x71, 0x6b, 0xcb, 0xf5, 0xdc, 0x68, 0x1f, 0xdd, 0x81, 0x31, 0xcf, 0x6f, 0x10, 0xf9, + 0x9f, 0x7d, 0xc5, 0xe8, 0xf3, 0x17, 0x16, 0xd2, 0x4b, 0x69, 0x61, 0x5d, 0xc3, 0x5b, 0x9a, 0x7a, + 0x70, 0x30, 0x3f, 0xa6, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xda, 0xf6, 0x1b, 0x8a, 0x6c, 0x81, + 0x91, 0x9d, 0xcf, 0x22, 0x5b, 0x8d, 0xd1, 0x96, 0x26, 0x1f, 0x1c, 0xcc, 0x8f, 0x6a, 0x05, 0x58, + 0x27, 0x82, 0x36, 0x61, 0x92, 0xfe, 0xf5, 0x22, 0x57, 0xd1, 0x2d, 0x32, 0xba, 0x17, 0xf3, 0xe8, + 0x6a, 0xa8, 0x4b, 0x33, 0x0f, 0x0e, 0xe6, 0x27, 0x13, 0x85, 0x38, 0x49, 0xd0, 0x7e, 0x1b, 0x26, + 0x16, 0xa3, 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, 0xf9, 0xa9, 0xdb, 0x9e, 0xfb, + 0x56, 0x47, 0xac, 0x0a, 0x5a, 0x86, 0x19, 0x36, 0x7a, 0x1e, 0xa0, 0x41, 0xf6, 0xdc, 0x3a, 0xa9, + 0x3a, 0xd1, 0x8e, 0x98, 0x6f, 0x24, 0xea, 0x42, 0x59, 0x41, 0xb0, 0x86, 0x65, 0xdf, 0x87, 0xd2, + 0xe2, 0x9e, 0xef, 0x36, 0xaa, 0x7e, 0x23, 0x44, 0xbb, 0x30, 0xd9, 0x0e, 0xc8, 0x16, 0x09, 0x54, + 0xd1, 0xac, 0x75, 0xa1, 0x78, 0x79, 0xf4, 0xf9, 0xcb, 0x99, 0x1f, 0x6b, 0xa2, 0xae, 0x78, 0x51, + 0xb0, 0xbf, 0xf4, 0x98, 0x68, 0x6f, 0x32, 0x01, 0xc5, 0x49, 0xca, 0xf6, 0xbf, 0x28, 0xc0, 0xe9, + 0xc5, 0xb7, 0x3b, 0x01, 0x29, 0xbb, 0xe1, 0x6e, 0x72, 0x85, 0x37, 0xdc, 0x70, 0x77, 0x3d, 0x1e, + 0x01, 0xb5, 0xb4, 0xca, 0xa2, 0x1c, 0x2b, 0x0c, 0xf4, 0x1c, 0x0c, 0xd3, 0xdf, 0xb7, 0x71, 0x45, + 0x7c, 0xf2, 0x8c, 0x40, 0x1e, 0x2d, 0x3b, 0x91, 0x53, 0xe6, 0x20, 0x2c, 0x71, 0xd0, 0x1a, 0x8c, + 0xd6, 0xd9, 0x86, 0xdc, 0x5e, 0xf3, 0x1b, 0x84, 0x4d, 0x66, 0x69, 0xe9, 0x19, 0x8a, 0xbe, 0x1c, + 0x17, 0x1f, 0x1e, 0xcc, 0xcf, 0xf2, 0xbe, 0x09, 0x12, 0x1a, 0x0c, 0xeb, 0xf5, 0x91, 0xad, 0xf6, + 0xd7, 0x00, 0xa3, 0x04, 0x19, 0x7b, 0xeb, 0xb2, 0xb6, 0x55, 0x06, 0xd9, 0x56, 0x19, 0xcb, 0xde, + 0x26, 0xe8, 0x2a, 0x0c, 0xec, 0xba, 0x5e, 0x63, 0x76, 0x88, 0xd1, 0x3a, 0x47, 0xe7, 0xfc, 0x86, + 0xeb, 0x35, 0x0e, 0x0f, 0xe6, 0xa7, 0x8d, 0xee, 0xd0, 0x42, 0xcc, 0x50, 0xed, 0x3f, 0xb3, 0x60, + 0x9e, 0xc1, 0x56, 0xdd, 0x26, 0xa9, 0x92, 0x20, 0x74, 0xc3, 0x88, 0x78, 0x91, 0x31, 0xa0, 0xcf, + 0x03, 0x84, 0xa4, 0x1e, 0x90, 0x48, 0x1b, 0x52, 0xb5, 0x30, 0x6a, 0x0a, 0x82, 0x35, 0x2c, 0x7a, + 0x20, 0x84, 0x3b, 0x4e, 0xc0, 0xd6, 0x97, 0x18, 0x58, 0x75, 0x20, 0xd4, 0x24, 0x00, 0xc7, 0x38, + 0xc6, 0x81, 0x50, 0xec, 0x75, 0x20, 0xa0, 0x8f, 0xc1, 0x64, 0xdc, 0x58, 0xd8, 0x76, 0xea, 0x72, + 0x00, 0xd9, 0x96, 0xa9, 0x99, 0x20, 0x9c, 0xc4, 0xb5, 0xff, 0x8e, 0x25, 0x16, 0x0f, 0xfd, 0xea, + 0x77, 0xf9, 0xb7, 0xda, 0xbf, 0x64, 0xc1, 0xf0, 0x92, 0xeb, 0x35, 0x5c, 0x6f, 0x1b, 0x7d, 0x16, + 0x46, 0xe8, 0xdd, 0xd4, 0x70, 0x22, 0x47, 0x9c, 0x7b, 0x1f, 0xd2, 0xf6, 0x96, 0xba, 0x2a, 0x16, + 0xda, 0xbb, 0xdb, 0xb4, 0x20, 0x5c, 0xa0, 0xd8, 0x74, 0xb7, 0xdd, 0xda, 0xfc, 0x1c, 0xa9, 0x47, + 0x6b, 0x24, 0x72, 0xe2, 0xcf, 0x89, 0xcb, 0xb0, 0xa2, 0x8a, 0x6e, 0xc0, 0x50, 0xe4, 0x04, 0xdb, + 0x24, 0x12, 0x07, 0x60, 0xe6, 0x41, 0xc5, 0x6b, 0x62, 0xba, 0x23, 0x89, 0x57, 0x27, 0xf1, 0xb5, + 0xb0, 0xc1, 0xaa, 0x62, 0x41, 0xc2, 0xfe, 0xa1, 0x61, 0x38, 0xbb, 0x5c, 0xab, 0xe4, 0xac, 0xab, + 0x4b, 0x30, 0xd4, 0x08, 0xdc, 0x3d, 0x12, 0x88, 0x71, 0x56, 0x54, 0xca, 0xac, 0x14, 0x0b, 0x28, + 0x7a, 0x19, 0xc6, 0xf8, 0x85, 0x74, 0xdd, 0xf1, 0x1a, 0x4d, 0x39, 0xc4, 0xa7, 0x04, 0xf6, 0xd8, + 0x1d, 0x0d, 0x86, 0x0d, 0xcc, 0x23, 0x2e, 0xaa, 0x4b, 0x89, 0xcd, 0x98, 0x77, 0xd9, 0x7d, 0xd1, + 0x82, 0x29, 0xde, 0xcc, 0x62, 0x14, 0x05, 0xee, 0x66, 0x27, 0x22, 0xe1, 0xec, 0x20, 0x3b, 0xe9, + 0x96, 0xb3, 0x46, 0x2b, 0x77, 0x04, 0x16, 0xee, 0x24, 0xa8, 0xf0, 0x43, 0x70, 0x56, 0xb4, 0x3b, + 0x95, 0x04, 0xe3, 0x54, 0xb3, 0xe8, 0x3b, 0x2d, 0x98, 0xab, 0xfb, 0x5e, 0x14, 0xf8, 0xcd, 0x26, + 0x09, 0xaa, 0x9d, 0xcd, 0xa6, 0x1b, 0xee, 0xf0, 0x75, 0x8a, 0xc9, 0x16, 0x3b, 0x09, 0x72, 0xe6, + 0x50, 0x21, 0x89, 0x39, 0x3c, 0xff, 0xe0, 0x60, 0x7e, 0x6e, 0x39, 0x97, 0x14, 0xee, 0xd2, 0x0c, + 0xda, 0x05, 0x44, 0xaf, 0xd2, 0x5a, 0xe4, 0x6c, 0x93, 0xb8, 0xf1, 0xe1, 0xfe, 0x1b, 0x3f, 0xf3, + 0xe0, 0x60, 0x1e, 0xad, 0xa7, 0x48, 0xe0, 0x0c, 0xb2, 0xe8, 0x2d, 0x38, 0x45, 0x4b, 0x53, 0xdf, + 0x3a, 0xd2, 0x7f, 0x73, 0xb3, 0x0f, 0x0e, 0xe6, 0x4f, 0xad, 0x67, 0x10, 0xc1, 0x99, 0xa4, 0xd1, + 0x77, 0x58, 0x70, 0x36, 0xfe, 0xfc, 0x95, 0xfb, 0x6d, 0xc7, 0x6b, 0xc4, 0x0d, 0x97, 0xfa, 0x6f, + 0x98, 0x9e, 0xc9, 0x67, 0x97, 0xf3, 0x28, 0xe1, 0xfc, 0x46, 0xe6, 0x96, 0xe1, 0x74, 0xe6, 0x6a, + 0x41, 0x53, 0x50, 0xdc, 0x25, 0x9c, 0x0b, 0x2a, 0x61, 0xfa, 0x13, 0x9d, 0x82, 0xc1, 0x3d, 0xa7, + 0xd9, 0x11, 0x1b, 0x05, 0xf3, 0x3f, 0xaf, 0x14, 0x5e, 0xb6, 0xec, 0x7f, 0x59, 0x84, 0xc9, 0xe5, + 0x5a, 0xe5, 0xa1, 0x76, 0xa1, 0x7e, 0x0d, 0x15, 0xba, 0x5e, 0x43, 0xf1, 0xa5, 0x56, 0xcc, 0xbd, + 0xd4, 0xfe, 0xdf, 0x8c, 0x2d, 0x34, 0xc0, 0xb6, 0xd0, 0xb7, 0xe4, 0x6c, 0xa1, 0x63, 0xde, 0x38, + 0x7b, 0x39, 0xab, 0x68, 0x90, 0x4d, 0x66, 0x26, 0xc7, 0x72, 0xd3, 0xaf, 0x3b, 0xcd, 0xe4, 0xd1, + 0x77, 0xc4, 0xa5, 0x74, 0x3c, 0xf3, 0x58, 0x87, 0xb1, 0x65, 0xa7, 0xed, 0x6c, 0xba, 0x4d, 0x37, + 0x72, 0x49, 0x88, 0x9e, 0x82, 0xa2, 0xd3, 0x68, 0x30, 0x6e, 0xab, 0xb4, 0x74, 0xfa, 0xc1, 0xc1, + 0x7c, 0x71, 0xb1, 0x41, 0xaf, 0x7d, 0x50, 0x58, 0xfb, 0x98, 0x62, 0xa0, 0x0f, 0xc2, 0x40, 0x23, + 0xf0, 0xdb, 0xb3, 0x05, 0x86, 0x49, 0x77, 0xdd, 0x40, 0x39, 0xf0, 0xdb, 0x09, 0x54, 0x86, 0x63, + 0xff, 0x5a, 0x01, 0x9e, 0x58, 0x26, 0xed, 0x9d, 0xd5, 0x5a, 0xce, 0xf9, 0x7d, 0x19, 0x46, 0x5a, + 0xbe, 0xe7, 0x46, 0x7e, 0x10, 0x8a, 0xa6, 0xd9, 0x8a, 0x58, 0x13, 0x65, 0x58, 0x41, 0xd1, 0x05, + 0x18, 0x68, 0xc7, 0x4c, 0xe5, 0x98, 0x64, 0x48, 0x19, 0x3b, 0xc9, 0x20, 0x14, 0xa3, 0x13, 0x92, + 0x40, 0xac, 0x18, 0x85, 0x71, 0x3b, 0x24, 0x01, 0x66, 0x90, 0xf8, 0x66, 0xa6, 0x77, 0xb6, 0x38, + 0xa1, 0x13, 0x37, 0x33, 0x85, 0x60, 0x0d, 0x0b, 0x55, 0xa1, 0x14, 0x26, 0x66, 0xb6, 0xaf, 0x6d, + 0x3a, 0xce, 0xae, 0x6e, 0x35, 0x93, 0x31, 0x11, 0xe3, 0x46, 0x19, 0xea, 0x79, 0x75, 0x7f, 0xa5, + 0x00, 0x88, 0x0f, 0xe1, 0x37, 0xd8, 0xc0, 0xdd, 0x4e, 0x0f, 0x5c, 0xff, 0x5b, 0xe2, 0xb8, 0x46, + 0xef, 0xcf, 0x2d, 0x78, 0x62, 0xd9, 0xf5, 0x1a, 0x24, 0xc8, 0x59, 0x80, 0x8f, 0xe6, 0x2d, 0x7b, + 0x34, 0xa6, 0xc1, 0x58, 0x62, 0x03, 0xc7, 0xb0, 0xc4, 0xec, 0x3f, 0xb1, 0x00, 0xf1, 0xcf, 0x7e, + 0xd7, 0x7d, 0xec, 0xed, 0xf4, 0xc7, 0x1e, 0xc3, 0xb2, 0xb0, 0x6f, 0xc2, 0xc4, 0x72, 0xd3, 0x25, + 0x5e, 0x54, 0xa9, 0x2e, 0xfb, 0xde, 0x96, 0xbb, 0x8d, 0x5e, 0x81, 0x89, 0xc8, 0x6d, 0x11, 0xbf, + 0x13, 0xd5, 0x48, 0xdd, 0xf7, 0xd8, 0x4b, 0xd2, 0xba, 0x3c, 0xb8, 0x84, 0x1e, 0x1c, 0xcc, 0x4f, + 0x6c, 0x18, 0x10, 0x9c, 0xc0, 0xb4, 0x7f, 0x8f, 0x8e, 0x9f, 0xdf, 0x6a, 0xfb, 0x1e, 0xf1, 0xa2, + 0x65, 0xdf, 0x6b, 0x70, 0x89, 0xc3, 0x2b, 0x30, 0x10, 0xd1, 0xf1, 0xe0, 0x63, 0x77, 0x49, 0x6e, + 0x14, 0x3a, 0x0a, 0x87, 0x07, 0xf3, 0x67, 0xd2, 0x35, 0xd8, 0x38, 0xb1, 0x3a, 0xe8, 0x5b, 0x60, + 0x28, 0x8c, 0x9c, 0xa8, 0x13, 0x8a, 0xd1, 0x7c, 0x52, 0x8e, 0x66, 0x8d, 0x95, 0x1e, 0x1e, 0xcc, + 0x4f, 0xaa, 0x6a, 0xbc, 0x08, 0x8b, 0x0a, 0xe8, 0x69, 0x18, 0x6e, 0x91, 0x30, 0x74, 0xb6, 0xe5, + 0x6d, 0x38, 0x29, 0xea, 0x0e, 0xaf, 0xf1, 0x62, 0x2c, 0xe1, 0xe8, 0x22, 0x0c, 0x92, 0x20, 0xf0, + 0x03, 0xb1, 0x47, 0xc7, 0x05, 0xe2, 0xe0, 0x0a, 0x2d, 0xc4, 0x1c, 0x66, 0xff, 0x3b, 0x0b, 0x26, + 0x55, 0x5f, 0x79, 0x5b, 0x27, 0xf0, 0x2a, 0xf8, 0x14, 0x40, 0x5d, 0x7e, 0x60, 0xc8, 0x6e, 0x8f, + 0xd1, 0xe7, 0x2f, 0x65, 0x5e, 0xd4, 0xa9, 0x61, 0x8c, 0x29, 0xab, 0xa2, 0x10, 0x6b, 0xd4, 0xec, + 0x7f, 0x62, 0xc1, 0x4c, 0xe2, 0x8b, 0x6e, 0xba, 0x61, 0x84, 0xde, 0x4c, 0x7d, 0xd5, 0x42, 0x7f, + 0x5f, 0x45, 0x6b, 0xb3, 0x6f, 0x52, 0x4b, 0x59, 0x96, 0x68, 0x5f, 0x74, 0x1d, 0x06, 0xdd, 0x88, + 0xb4, 0xe4, 0xc7, 0x5c, 0xec, 0xfa, 0x31, 0xbc, 0x57, 0xf1, 0x8c, 0x54, 0x68, 0x4d, 0xcc, 0x09, + 0xd8, 0xbf, 0x56, 0x84, 0x12, 0x5f, 0xb6, 0x6b, 0x4e, 0xfb, 0x04, 0xe6, 0xe2, 0x19, 0x28, 0xb9, + 0xad, 0x56, 0x27, 0x72, 0x36, 0xc5, 0x71, 0x3e, 0xc2, 0xb7, 0x56, 0x45, 0x16, 0xe2, 0x18, 0x8e, + 0x2a, 0x30, 0xc0, 0xba, 0xc2, 0xbf, 0xf2, 0xa9, 0xec, 0xaf, 0x14, 0x7d, 0x5f, 0x28, 0x3b, 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, 0x52, 0xf8, 0x9c, 0xac, 0xfa, 0xb0, + 0x18, 0x80, 0x35, 0xa2, 0x73, 0x1f, 0x81, 0x92, 0x42, 0x3e, 0x0a, 0x43, 0x34, 0xf7, 0x31, 0x98, + 0x4c, 0xb4, 0xd5, 0xab, 0xfa, 0x98, 0xce, 0x4f, 0xfd, 0x32, 0x3b, 0x32, 0x44, 0xaf, 0x57, 0xbc, + 0x3d, 0x71, 0xe4, 0xbe, 0x0d, 0xa7, 0x9a, 0x19, 0x27, 0x99, 0x98, 0xd7, 0xfe, 0x4f, 0xbe, 0x27, + 0xc4, 0x67, 0x9f, 0xca, 0x82, 0xe2, 0xcc, 0x36, 0x28, 0x8f, 0xe0, 0xb7, 0xe9, 0x06, 0x71, 0x9a, + 0x3a, 0xbb, 0x7d, 0x4b, 0x94, 0x61, 0x05, 0xa5, 0xe7, 0xdd, 0x29, 0xd5, 0xf9, 0x1b, 0x64, 0xbf, + 0x46, 0x9a, 0xa4, 0x1e, 0xf9, 0xc1, 0xd7, 0xb5, 0xfb, 0xe7, 0xf8, 0xe8, 0xf3, 0xe3, 0x72, 0x54, + 0x10, 0x28, 0xde, 0x20, 0xfb, 0x7c, 0x2a, 0xf4, 0xaf, 0x2b, 0x76, 0xfd, 0xba, 0x9f, 0xb5, 0x60, + 0x5c, 0x7d, 0xdd, 0x09, 0x9c, 0x0b, 0x4b, 0xe6, 0xb9, 0x70, 0xae, 0xeb, 0x02, 0xcf, 0x39, 0x11, + 0xbe, 0x52, 0x80, 0xb3, 0x0a, 0x87, 0xbe, 0x0d, 0xf8, 0x1f, 0xb1, 0xaa, 0xae, 0x40, 0xc9, 0x53, + 0x52, 0x2b, 0xcb, 0x14, 0x17, 0xc5, 0x32, 0xab, 0x18, 0x87, 0xb2, 0x78, 0x5e, 0x2c, 0x5a, 0x1a, + 0xd3, 0xc5, 0xb9, 0x42, 0x74, 0xbb, 0x04, 0xc5, 0x8e, 0xdb, 0x10, 0x17, 0xcc, 0x87, 0xe4, 0x68, + 0xdf, 0xae, 0x94, 0x0f, 0x0f, 0xe6, 0x9f, 0xcc, 0x53, 0x25, 0xd0, 0x9b, 0x2d, 0x5c, 0xb8, 0x5d, + 0x29, 0x63, 0x5a, 0x19, 0x2d, 0xc2, 0xa4, 0xd4, 0x96, 0xdc, 0xa1, 0xec, 0x96, 0xef, 0x89, 0x7b, + 0x48, 0xc9, 0x64, 0xb1, 0x09, 0xc6, 0x49, 0x7c, 0x54, 0x86, 0xa9, 0xdd, 0xce, 0x26, 0x69, 0x92, + 0x88, 0x7f, 0xf0, 0x0d, 0xc2, 0x25, 0x96, 0xa5, 0xf8, 0x65, 0x76, 0x23, 0x01, 0xc7, 0xa9, 0x1a, + 0xf6, 0x5f, 0xb2, 0xfb, 0x40, 0x8c, 0x5e, 0x35, 0xf0, 0xe9, 0xc2, 0xa2, 0xd4, 0xbf, 0x9e, 0xcb, + 0xb9, 0x9f, 0x55, 0x71, 0x83, 0xec, 0x6f, 0xf8, 0x94, 0x33, 0xcf, 0x5e, 0x15, 0xc6, 0x9a, 0x1f, + 0xe8, 0xba, 0xe6, 0x7f, 0xbe, 0x00, 0xa7, 0xd5, 0x08, 0x18, 0x4c, 0xe0, 0x37, 0xfa, 0x18, 0x5c, + 0x85, 0xd1, 0x06, 0xd9, 0x72, 0x3a, 0xcd, 0x48, 0x89, 0xcf, 0x07, 0xb9, 0x0a, 0xa5, 0x1c, 0x17, + 0x63, 0x1d, 0xe7, 0x08, 0xc3, 0xf6, 0x3f, 0x47, 0xd9, 0x45, 0x1c, 0x39, 0x74, 0x8d, 0xab, 0x5d, + 0x63, 0xe5, 0xee, 0x9a, 0x8b, 0x30, 0xe8, 0xb6, 0x28, 0x63, 0x56, 0x30, 0xf9, 0xad, 0x0a, 0x2d, + 0xc4, 0x1c, 0x86, 0x3e, 0x00, 0xc3, 0x75, 0xbf, 0xd5, 0x72, 0xbc, 0x06, 0xbb, 0xf2, 0x4a, 0x4b, + 0xa3, 0x94, 0x77, 0x5b, 0xe6, 0x45, 0x58, 0xc2, 0xd0, 0x13, 0x30, 0xe0, 0x04, 0xdb, 0x5c, 0x86, + 0x51, 0x5a, 0x1a, 0xa1, 0x2d, 0x2d, 0x06, 0xdb, 0x21, 0x66, 0xa5, 0xf4, 0x09, 0x76, 0xcf, 0x0f, + 0x76, 0x5d, 0x6f, 0xbb, 0xec, 0x06, 0x62, 0x4b, 0xa8, 0xbb, 0xf0, 0xae, 0x82, 0x60, 0x0d, 0x0b, + 0xad, 0xc2, 0x60, 0xdb, 0x0f, 0xa2, 0x70, 0x76, 0x88, 0x0d, 0xf7, 0x93, 0x39, 0x07, 0x11, 0xff, + 0xda, 0xaa, 0x1f, 0x44, 0xf1, 0x07, 0xd0, 0x7f, 0x21, 0xe6, 0xd5, 0xd1, 0x4d, 0x18, 0x26, 0xde, + 0xde, 0x6a, 0xe0, 0xb7, 0x66, 0x67, 0xf2, 0x29, 0xad, 0x70, 0x14, 0xbe, 0xcc, 0x62, 0x1e, 0x55, + 0x14, 0x63, 0x49, 0x02, 0x7d, 0x0b, 0x14, 0x89, 0xb7, 0x37, 0x3b, 0xcc, 0x28, 0xcd, 0xe5, 0x50, + 0xba, 0xe3, 0x04, 0xf1, 0x99, 0xbf, 0xe2, 0xed, 0x61, 0x5a, 0x07, 0x7d, 0x12, 0x4a, 0xf2, 0xc0, + 0x08, 0x85, 0xb0, 0x2e, 0x73, 0xc1, 0xca, 0x63, 0x06, 0x93, 0xb7, 0x3a, 0x6e, 0x40, 0x5a, 0xc4, + 0x8b, 0xc2, 0xf8, 0x84, 0x94, 0xd0, 0x10, 0xc7, 0xd4, 0xd0, 0x27, 0xa5, 0x84, 0x78, 0xcd, 0xef, + 0x78, 0x51, 0x38, 0x5b, 0x62, 0xdd, 0xcb, 0xd4, 0xdd, 0xdd, 0x89, 0xf1, 0x92, 0x22, 0x64, 0x5e, + 0x19, 0x1b, 0xa4, 0xd0, 0xa7, 0x61, 0x9c, 0xff, 0xe7, 0x1a, 0xb0, 0x70, 0xf6, 0x34, 0xa3, 0x7d, + 0x21, 0x9f, 0x36, 0x47, 0x5c, 0x3a, 0x2d, 0x88, 0x8f, 0xeb, 0xa5, 0x21, 0x36, 0xa9, 0x21, 0x0c, + 0xe3, 0x4d, 0x77, 0x8f, 0x78, 0x24, 0x0c, 0xab, 0x81, 0xbf, 0x49, 0x66, 0x81, 0x0d, 0xcc, 0xd9, + 0x6c, 0x8d, 0x99, 0xbf, 0x49, 0x96, 0xa6, 0x29, 0xcd, 0x9b, 0x7a, 0x1d, 0x6c, 0x92, 0x40, 0xb7, + 0x61, 0x82, 0xbe, 0xd8, 0xdc, 0x98, 0xe8, 0x68, 0x2f, 0xa2, 0xec, 0x5d, 0x85, 0x8d, 0x4a, 0x38, + 0x41, 0x04, 0xdd, 0x82, 0xb1, 0x30, 0x72, 0x82, 0xa8, 0xd3, 0xe6, 0x44, 0xcf, 0xf4, 0x22, 0xca, + 0x14, 0xae, 0x35, 0xad, 0x0a, 0x36, 0x08, 0xa0, 0xd7, 0xa1, 0xd4, 0x74, 0xb7, 0x48, 0x7d, 0xbf, + 0xde, 0x24, 0xb3, 0x63, 0x8c, 0x5a, 0xe6, 0xa1, 0x72, 0x53, 0x22, 0x71, 0x3e, 0x57, 0xfd, 0xc5, + 0x71, 0x75, 0x74, 0x07, 0xce, 0x44, 0x24, 0x68, 0xb9, 0x9e, 0x43, 0x0f, 0x03, 0xf1, 0xb4, 0x62, + 0x8a, 0xcc, 0x71, 0xb6, 0xdb, 0xce, 0x8b, 0xd9, 0x38, 0xb3, 0x91, 0x89, 0x85, 0x73, 0x6a, 0xa3, + 0xfb, 0x30, 0x9b, 0x01, 0xf1, 0x9b, 0x6e, 0x7d, 0x7f, 0xf6, 0x14, 0xa3, 0xfc, 0x51, 0x41, 0x79, + 0x76, 0x23, 0x07, 0xef, 0xb0, 0x0b, 0x0c, 0xe7, 0x52, 0x47, 0xb7, 0x60, 0x92, 0x9d, 0x40, 0xd5, + 0x4e, 0xb3, 0x29, 0x1a, 0x9c, 0x60, 0x0d, 0x7e, 0x40, 0xde, 0xc7, 0x15, 0x13, 0x7c, 0x78, 0x30, + 0x0f, 0xf1, 0x3f, 0x9c, 0xac, 0x8d, 0x36, 0x99, 0xce, 0xac, 0x13, 0xb8, 0xd1, 0x3e, 0x3d, 0x37, + 0xc8, 0xfd, 0x68, 0x76, 0xb2, 0xab, 0xbc, 0x42, 0x47, 0x55, 0x8a, 0x35, 0xbd, 0x10, 0x27, 0x09, + 0xd2, 0x23, 0x35, 0x8c, 0x1a, 0xae, 0x37, 0x3b, 0xc5, 0xdf, 0x25, 0xf2, 0x44, 0xaa, 0xd1, 0x42, + 0xcc, 0x61, 0x4c, 0x5f, 0x46, 0x7f, 0xdc, 0xa2, 0x37, 0xd7, 0x34, 0x43, 0x8c, 0xf5, 0x65, 0x12, + 0x80, 0x63, 0x1c, 0xca, 0x4c, 0x46, 0xd1, 0xfe, 0x2c, 0x62, 0xa8, 0xea, 0x60, 0xd9, 0xd8, 0xf8, + 0x24, 0xa6, 0xe5, 0xf6, 0x26, 0x4c, 0xa8, 0x83, 0x90, 0x8d, 0x09, 0x9a, 0x87, 0x41, 0xc6, 0x3e, + 0x09, 0xe9, 0x5a, 0x89, 0x76, 0x81, 0xb1, 0x56, 0x98, 0x97, 0xb3, 0x2e, 0xb8, 0x6f, 0x93, 0xa5, + 0xfd, 0x88, 0xf0, 0x37, 0x7d, 0x51, 0xeb, 0x82, 0x04, 0xe0, 0x18, 0xc7, 0xfe, 0x3f, 0x9c, 0x0d, + 0x8d, 0x4f, 0xdb, 0x3e, 0xee, 0x97, 0x67, 0x61, 0x64, 0xc7, 0x0f, 0x23, 0x8a, 0xcd, 0xda, 0x18, + 0x8c, 0x19, 0xcf, 0xeb, 0xa2, 0x1c, 0x2b, 0x0c, 0xf4, 0x2a, 0x8c, 0xd7, 0xf5, 0x06, 0xc4, 0xe5, + 0xa8, 0x8e, 0x11, 0xa3, 0x75, 0x6c, 0xe2, 0xa2, 0x97, 0x61, 0x84, 0xd9, 0x80, 0xd4, 0xfd, 0xa6, + 0xe0, 0xda, 0xe4, 0x0d, 0x3f, 0x52, 0x15, 0xe5, 0x87, 0xda, 0x6f, 0xac, 0xb0, 0xd1, 0x25, 0x18, + 0xa2, 0x5d, 0xa8, 0x54, 0xc5, 0xb5, 0xa4, 0x04, 0x45, 0xd7, 0x59, 0x29, 0x16, 0x50, 0xfb, 0xaf, + 0x14, 0xb4, 0x51, 0xa6, 0xef, 0x61, 0x82, 0xaa, 0x30, 0x7c, 0xcf, 0x71, 0x23, 0xd7, 0xdb, 0x16, + 0xfc, 0xc7, 0xd3, 0x5d, 0xef, 0x28, 0x56, 0xe9, 0x2e, 0xaf, 0xc0, 0x6f, 0x51, 0xf1, 0x07, 0x4b, + 0x32, 0x94, 0x62, 0xd0, 0xf1, 0x3c, 0x4a, 0xb1, 0xd0, 0x2f, 0x45, 0xcc, 0x2b, 0x70, 0x8a, 0xe2, + 0x0f, 0x96, 0x64, 0xd0, 0x9b, 0x00, 0x72, 0x87, 0x91, 0x86, 0xb0, 0xbd, 0x78, 0xb6, 0x37, 0xd1, + 0x0d, 0x55, 0x67, 0x69, 0x82, 0xde, 0xd1, 0xf1, 0x7f, 0xac, 0xd1, 0xb3, 0x23, 0xc6, 0xa7, 0xa5, + 0x3b, 0x83, 0xbe, 0x8d, 0x2e, 0x71, 0x27, 0x88, 0x48, 0x63, 0x31, 0x12, 0x83, 0xf3, 0xc1, 0xfe, + 0x1e, 0x29, 0x1b, 0x6e, 0x8b, 0xe8, 0xdb, 0x41, 0x10, 0xc1, 0x31, 0x3d, 0xfb, 0x17, 0x8b, 0x30, + 0x9b, 0xd7, 0x5d, 0xba, 0xe8, 0xc8, 0x7d, 0x37, 0x5a, 0xa6, 0xec, 0x95, 0x65, 0x2e, 0xba, 0x15, + 0x51, 0x8e, 0x15, 0x06, 0x9d, 0xfd, 0xd0, 0xdd, 0x96, 0x6f, 0xcc, 0xc1, 0x78, 0xf6, 0x6b, 0xac, + 0x14, 0x0b, 0x28, 0xc5, 0x0b, 0x88, 0x13, 0x0a, 0xe3, 0x1e, 0x6d, 0x95, 0x60, 0x56, 0x8a, 0x05, + 0x54, 0x97, 0x76, 0x0d, 0xf4, 0x90, 0x76, 0x19, 0x43, 0x34, 0x78, 0xbc, 0x43, 0x84, 0x3e, 0x03, + 0xb0, 0xe5, 0x7a, 0x6e, 0xb8, 0xc3, 0xa8, 0x0f, 0x1d, 0x99, 0xba, 0x62, 0xce, 0x56, 0x15, 0x15, + 0xac, 0x51, 0x44, 0x2f, 0xc1, 0xa8, 0xda, 0x80, 0x95, 0x32, 0xd3, 0x74, 0x6a, 0x96, 0x23, 0xf1, + 0x69, 0x54, 0xc6, 0x3a, 0x9e, 0xfd, 0xb9, 0xe4, 0x7a, 0x11, 0x3b, 0x40, 0x1b, 0x5f, 0xab, 0xdf, + 0xf1, 0x2d, 0x74, 0x1f, 0x5f, 0xfb, 0x6b, 0x45, 0x98, 0x34, 0x1a, 0xeb, 0x84, 0x7d, 0x9c, 0x59, + 0xd7, 0xe8, 0x01, 0xee, 0x44, 0x44, 0xec, 0x3f, 0xbb, 0xf7, 0x56, 0xd1, 0x0f, 0x79, 0xba, 0x03, + 0x78, 0x7d, 0xf4, 0x19, 0x28, 0x35, 0x9d, 0x90, 0x49, 0xce, 0x88, 0xd8, 0x77, 0xfd, 0x10, 0x8b, + 0x1f, 0x26, 0x4e, 0x18, 0x69, 0xb7, 0x26, 0xa7, 0x1d, 0x93, 0xa4, 0x37, 0x0d, 0xe5, 0x4f, 0xa4, + 0xf5, 0x98, 0xea, 0x04, 0x65, 0x62, 0xf6, 0x31, 0x87, 0xa1, 0x97, 0x61, 0x2c, 0x20, 0x6c, 0x55, + 0x2c, 0x53, 0x6e, 0x8e, 0x2d, 0xb3, 0xc1, 0x98, 0xed, 0xc3, 0x1a, 0x0c, 0x1b, 0x98, 0xf1, 0xdb, + 0x60, 0xa8, 0xcb, 0xdb, 0xe0, 0x69, 0x18, 0x66, 0x3f, 0xd4, 0x0a, 0x50, 0xb3, 0x51, 0xe1, 0xc5, + 0x58, 0xc2, 0x93, 0x0b, 0x66, 0xa4, 0xbf, 0x05, 0x43, 0x5f, 0x1f, 0x62, 0x51, 0x33, 0x2d, 0xf3, + 0x08, 0x3f, 0xe5, 0xc4, 0x92, 0xc7, 0x12, 0x66, 0x7f, 0x10, 0x26, 0xca, 0x0e, 0x69, 0xf9, 0xde, + 0x8a, 0xd7, 0x68, 0xfb, 0xae, 0x17, 0xa1, 0x59, 0x18, 0x60, 0x97, 0x08, 0x3f, 0x02, 0x06, 0x68, + 0x43, 0x98, 0x95, 0xd8, 0xdb, 0x70, 0xba, 0xec, 0xdf, 0xf3, 0xee, 0x39, 0x41, 0x63, 0xb1, 0x5a, + 0xd1, 0xde, 0xd7, 0xeb, 0xf2, 0x7d, 0xc7, 0x8d, 0xb6, 0x32, 0x8f, 0x5e, 0xad, 0x26, 0x67, 0x6b, + 0x57, 0xdd, 0x26, 0xc9, 0x91, 0x82, 0xfc, 0xb5, 0x82, 0xd1, 0x52, 0x8c, 0xaf, 0xb4, 0x5a, 0x56, + 0xae, 0x56, 0xeb, 0x0d, 0x18, 0xd9, 0x72, 0x49, 0xb3, 0x81, 0xc9, 0x96, 0x58, 0x89, 0x4f, 0xe5, + 0xdb, 0xa1, 0xac, 0x52, 0x4c, 0x29, 0xf5, 0xe2, 0xaf, 0xc3, 0x55, 0x51, 0x19, 0x2b, 0x32, 0x68, + 0x17, 0xa6, 0xe4, 0x83, 0x41, 0x42, 0xc5, 0xba, 0x7c, 0xba, 0xdb, 0x2b, 0xc4, 0x24, 0x7e, 0xea, + 0xc1, 0xc1, 0xfc, 0x14, 0x4e, 0x90, 0xc1, 0x29, 0xc2, 0xf4, 0x39, 0xd8, 0xa2, 0x27, 0xf0, 0x00, + 0x1b, 0x7e, 0xf6, 0x1c, 0x64, 0x2f, 0x5b, 0x56, 0x6a, 0xff, 0x98, 0x05, 0x8f, 0xa5, 0x46, 0x46, + 0xbc, 0xf0, 0x8f, 0x79, 0x16, 0x92, 0x2f, 0xee, 0x42, 0xef, 0x17, 0xb7, 0xfd, 0x77, 0x2d, 0x38, + 0xb5, 0xd2, 0x6a, 0x47, 0xfb, 0x65, 0xd7, 0x54, 0x41, 0x7d, 0x04, 0x86, 0x5a, 0xa4, 0xe1, 0x76, + 0x5a, 0x62, 0xe6, 0xe6, 0xe5, 0x29, 0xb5, 0xc6, 0x4a, 0x0f, 0x0f, 0xe6, 0xc7, 0x6b, 0x91, 0x1f, + 0x38, 0xdb, 0x84, 0x17, 0x60, 0x81, 0xce, 0xce, 0x7a, 0xf7, 0x6d, 0x72, 0xd3, 0x6d, 0xb9, 0xd2, + 0xae, 0xa8, 0xab, 0xcc, 0x6e, 0x41, 0x0e, 0xe8, 0xc2, 0x1b, 0x1d, 0xc7, 0x8b, 0xdc, 0x68, 0x5f, + 0x68, 0x8f, 0x24, 0x11, 0x1c, 0xd3, 0xb3, 0xbf, 0x6a, 0xc1, 0xa4, 0x5c, 0xf7, 0x8b, 0x8d, 0x46, + 0x40, 0xc2, 0x10, 0xcd, 0x41, 0xc1, 0x6d, 0x8b, 0x5e, 0x82, 0xe8, 0x65, 0xa1, 0x52, 0xc5, 0x05, + 0xb7, 0x2d, 0xd9, 0x32, 0x76, 0x10, 0x16, 0x4d, 0x45, 0xda, 0x75, 0x51, 0x8e, 0x15, 0x06, 0xba, + 0x0c, 0x23, 0x9e, 0xdf, 0xe0, 0xb6, 0x5d, 0xfc, 0x4a, 0x63, 0x0b, 0x6c, 0x5d, 0x94, 0x61, 0x05, + 0x45, 0x55, 0x28, 0x71, 0xb3, 0xa7, 0x78, 0xd1, 0xf6, 0x65, 0x3c, 0xc5, 0xbe, 0x6c, 0x43, 0xd6, + 0xc4, 0x31, 0x11, 0xfb, 0x57, 0x2d, 0x18, 0x93, 0x5f, 0xd6, 0x27, 0xcf, 0x49, 0xb7, 0x56, 0xcc, + 0x6f, 0xc6, 0x5b, 0x8b, 0xf2, 0x8c, 0x0c, 0x62, 0xb0, 0x8a, 0xc5, 0x23, 0xb1, 0x8a, 0x57, 0x61, + 0xd4, 0x69, 0xb7, 0xab, 0x26, 0x9f, 0xc9, 0x96, 0xd2, 0x62, 0x5c, 0x8c, 0x75, 0x1c, 0xfb, 0x47, + 0x0b, 0x30, 0x21, 0xbf, 0xa0, 0xd6, 0xd9, 0x0c, 0x49, 0x84, 0x36, 0xa0, 0xe4, 0xf0, 0x59, 0x22, + 0x72, 0x91, 0x5f, 0xcc, 0x96, 0x23, 0x18, 0x53, 0x1a, 0x5f, 0xf8, 0x8b, 0xb2, 0x36, 0x8e, 0x09, + 0xa1, 0x26, 0x4c, 0x7b, 0x7e, 0xc4, 0x0e, 0x7f, 0x05, 0xef, 0xa6, 0xda, 0x49, 0x52, 0x3f, 0x2b, + 0xa8, 0x4f, 0xaf, 0x27, 0xa9, 0xe0, 0x34, 0x61, 0xb4, 0x22, 0x65, 0x33, 0xc5, 0x7c, 0x61, 0x80, + 0x3e, 0x71, 0xd9, 0xa2, 0x19, 0xfb, 0x57, 0x2c, 0x28, 0x49, 0xb4, 0x93, 0xd0, 0xe2, 0xad, 0xc1, + 0x70, 0xc8, 0x26, 0x41, 0x0e, 0x8d, 0xdd, 0xad, 0xe3, 0x7c, 0xbe, 0xe2, 0x3b, 0x8d, 0xff, 0x0f, + 0xb1, 0xa4, 0xc1, 0x44, 0xf3, 0xaa, 0xfb, 0xef, 0x12, 0xd1, 0xbc, 0xea, 0x4f, 0xce, 0xa5, 0xf4, + 0x47, 0xac, 0xcf, 0x9a, 0xac, 0x8b, 0xb2, 0x5e, 0xed, 0x80, 0x6c, 0xb9, 0xf7, 0x93, 0xac, 0x57, + 0x95, 0x95, 0x62, 0x01, 0x45, 0x6f, 0xc2, 0x58, 0x5d, 0xca, 0x64, 0xe3, 0x1d, 0x7e, 0xa9, 0xab, + 0x7e, 0x40, 0xa9, 0x92, 0xb8, 0x2c, 0x64, 0x59, 0xab, 0x8f, 0x0d, 0x6a, 0xa6, 0x19, 0x41, 0xb1, + 0x97, 0x19, 0x41, 0x4c, 0x37, 0x5f, 0xa9, 0xfe, 0xe3, 0x16, 0x0c, 0x71, 0x59, 0x5c, 0x7f, 0xa2, + 0x50, 0x4d, 0xb3, 0x16, 0x8f, 0xdd, 0x1d, 0x5a, 0x28, 0x34, 0x65, 0x68, 0x0d, 0x4a, 0xec, 0x07, + 0x93, 0x25, 0x16, 0xf3, 0xad, 0xee, 0x79, 0xab, 0x7a, 0x07, 0xef, 0xc8, 0x6a, 0x38, 0xa6, 0x60, + 0xff, 0x70, 0x91, 0x9e, 0x6e, 0x31, 0xaa, 0x71, 0xe9, 0x5b, 0x8f, 0xee, 0xd2, 0x2f, 0x3c, 0xaa, + 0x4b, 0x7f, 0x1b, 0x26, 0xeb, 0x9a, 0x1e, 0x2e, 0x9e, 0xc9, 0xcb, 0x5d, 0x17, 0x89, 0xa6, 0xb2, + 0xe3, 0x52, 0x96, 0x65, 0x93, 0x08, 0x4e, 0x52, 0x45, 0xdf, 0x06, 0x63, 0x7c, 0x9e, 0x45, 0x2b, + 0xdc, 0x12, 0xe3, 0x03, 0xf9, 0xeb, 0x45, 0x6f, 0x82, 0x4b, 0xe5, 0xb4, 0xea, 0xd8, 0x20, 0x66, + 0xff, 0xa9, 0x05, 0x68, 0xa5, 0xbd, 0x43, 0x5a, 0x24, 0x70, 0x9a, 0xb1, 0x38, 0xfd, 0xfb, 0x2d, + 0x98, 0x25, 0xa9, 0xe2, 0x65, 0xbf, 0xd5, 0x12, 0x8f, 0x96, 0x9c, 0x77, 0xf5, 0x4a, 0x4e, 0x1d, + 0xe5, 0x96, 0x30, 0x9b, 0x87, 0x81, 0x73, 0xdb, 0x43, 0x6b, 0x30, 0xc3, 0x6f, 0x49, 0x05, 0xd0, + 0x6c, 0xaf, 0x1f, 0x17, 0x84, 0x67, 0x36, 0xd2, 0x28, 0x38, 0xab, 0x9e, 0xfd, 0x5d, 0x63, 0x90, + 0xdb, 0x8b, 0xf7, 0xf4, 0x08, 0xef, 0xe9, 0x11, 0xde, 0xd3, 0x23, 0xbc, 0xa7, 0x47, 0x78, 0x4f, + 0x8f, 0xf0, 0x4d, 0xaf, 0x47, 0xf8, 0x63, 0x0b, 0x66, 0xd2, 0xd7, 0xc0, 0x49, 0x30, 0xe6, 0x1d, + 0x98, 0x49, 0xdf, 0x75, 0x5d, 0xed, 0xec, 0xd2, 0xfd, 0x8c, 0xef, 0xbd, 0x8c, 0x6f, 0xc0, 0x59, + 0xf4, 0xed, 0x5f, 0xb7, 0xe0, 0xb4, 0x42, 0x36, 0x5e, 0xfa, 0x9f, 0x87, 0x19, 0x7e, 0xbe, 0x2c, + 0x37, 0x1d, 0xb7, 0xb5, 0x41, 0x5a, 0xed, 0xa6, 0x13, 0x49, 0x33, 0x83, 0xab, 0x99, 0x5b, 0x35, + 0x61, 0xa2, 0x6b, 0x54, 0x5c, 0x7a, 0x8c, 0xf6, 0x2b, 0x03, 0x80, 0xb3, 0x9a, 0x31, 0x8c, 0x52, + 0x0b, 0x3d, 0xcd, 0x84, 0x7f, 0x71, 0x04, 0x06, 0x57, 0xf6, 0x88, 0x17, 0x9d, 0xc0, 0x44, 0xd5, + 0x61, 0xc2, 0xf5, 0xf6, 0xfc, 0xe6, 0x1e, 0x69, 0x70, 0xf8, 0x51, 0x1e, 0xfa, 0x67, 0x04, 0xe9, + 0x89, 0x8a, 0x41, 0x02, 0x27, 0x48, 0x3e, 0x0a, 0x61, 0xfb, 0x35, 0x18, 0xe2, 0x77, 0x9c, 0x90, + 0xb4, 0x67, 0x5e, 0x69, 0x6c, 0x10, 0xc5, 0xcd, 0x1d, 0x2b, 0x02, 0xf8, 0x1d, 0x2a, 0xaa, 0xa3, + 0xcf, 0xc1, 0xc4, 0x96, 0x1b, 0x84, 0xd1, 0x86, 0xdb, 0x22, 0x61, 0xe4, 0xb4, 0xda, 0x0f, 0x21, + 0x5c, 0x57, 0xe3, 0xb0, 0x6a, 0x50, 0xc2, 0x09, 0xca, 0x68, 0x1b, 0xc6, 0x9b, 0x8e, 0xde, 0xd4, + 0xf0, 0x91, 0x9b, 0x52, 0x97, 0xe7, 0x4d, 0x9d, 0x10, 0x36, 0xe9, 0xd2, 0xd3, 0xa6, 0xce, 0xe4, + 0xc3, 0x23, 0x4c, 0x6a, 0xa2, 0x4e, 0x1b, 0x2e, 0x18, 0xe6, 0x30, 0xca, 0x07, 0x32, 0xfb, 0xe1, + 0x92, 0xc9, 0x07, 0x6a, 0x56, 0xc2, 0x9f, 0x85, 0x12, 0xa1, 0x43, 0x48, 0x09, 0x8b, 0xfb, 0xf7, + 0x4a, 0x7f, 0x7d, 0x5d, 0x73, 0xeb, 0x81, 0x6f, 0xaa, 0x35, 0x56, 0x24, 0x25, 0x1c, 0x13, 0x45, + 0xcb, 0x30, 0x14, 0x92, 0xc0, 0x25, 0xa1, 0xb8, 0x89, 0xbb, 0x4c, 0x23, 0x43, 0xe3, 0xae, 0x37, + 0xfc, 0x37, 0x16, 0x55, 0xe9, 0xf2, 0x72, 0x98, 0xc4, 0x97, 0xdd, 0x95, 0xda, 0xf2, 0x5a, 0x64, + 0xa5, 0x58, 0x40, 0xd1, 0xeb, 0x30, 0x1c, 0x90, 0x26, 0xd3, 0x9b, 0x8d, 0xf7, 0xbf, 0xc8, 0xb9, + 0x1a, 0x8e, 0xd7, 0xc3, 0x92, 0x00, 0xba, 0x01, 0x28, 0x20, 0x94, 0x8f, 0x74, 0xbd, 0x6d, 0x65, + 0x55, 0x2b, 0xee, 0x21, 0x75, 0x6e, 0xe1, 0x18, 0x43, 0x7a, 0x41, 0xe1, 0x8c, 0x6a, 0xe8, 0x1a, + 0x4c, 0xab, 0xd2, 0x8a, 0x17, 0x46, 0x0e, 0x3d, 0xff, 0x27, 0x19, 0x2d, 0x25, 0xc6, 0xc1, 0x49, + 0x04, 0x9c, 0xae, 0x63, 0x7f, 0xd9, 0x02, 0x3e, 0xce, 0x27, 0x20, 0xbc, 0x78, 0xcd, 0x14, 0x5e, + 0x9c, 0xcd, 0x9d, 0xb9, 0x1c, 0xc1, 0xc5, 0x97, 0x2d, 0x18, 0xd5, 0x66, 0x36, 0x5e, 0xb3, 0x56, + 0x97, 0x35, 0xdb, 0x81, 0x29, 0xba, 0xd2, 0x6f, 0x6d, 0x86, 0x24, 0xd8, 0x23, 0x0d, 0xb6, 0x30, + 0x0b, 0x0f, 0xb7, 0x30, 0x95, 0x05, 0xdf, 0xcd, 0x04, 0x41, 0x9c, 0x6a, 0xc2, 0xfe, 0xac, 0xec, + 0xaa, 0x32, 0x78, 0xac, 0xab, 0x39, 0x4f, 0x18, 0x3c, 0xaa, 0x59, 0xc5, 0x31, 0x0e, 0xdd, 0x6a, + 0x3b, 0x7e, 0x18, 0x25, 0x0d, 0x1e, 0xaf, 0xfb, 0x61, 0x84, 0x19, 0xc4, 0x7e, 0x01, 0x60, 0xe5, + 0x3e, 0xa9, 0xf3, 0x15, 0xab, 0xbf, 0xad, 0xac, 0xfc, 0xb7, 0x95, 0xfd, 0xdb, 0x16, 0x4c, 0xac, + 0x2e, 0x1b, 0xf7, 0xdc, 0x02, 0x00, 0x7f, 0x10, 0xde, 0xbd, 0xbb, 0x2e, 0xad, 0x05, 0xb8, 0xc2, + 0x57, 0x95, 0x62, 0x0d, 0x03, 0x9d, 0x85, 0x62, 0xb3, 0xe3, 0x09, 0xe9, 0xea, 0x30, 0xe5, 0x1e, + 0x6e, 0x76, 0x3c, 0x4c, 0xcb, 0x34, 0x8f, 0x8b, 0x62, 0xdf, 0x1e, 0x17, 0x3d, 0x23, 0x1f, 0xa0, + 0x79, 0x18, 0xbc, 0x77, 0xcf, 0x6d, 0x70, 0xff, 0x52, 0x61, 0xc9, 0x70, 0xf7, 0x6e, 0xa5, 0x1c, + 0x62, 0x5e, 0x6e, 0x7f, 0xa9, 0x08, 0x73, 0xab, 0x4d, 0x72, 0xff, 0x1d, 0xfa, 0xd8, 0xf6, 0xeb, + 0x2f, 0x72, 0x34, 0x39, 0xd5, 0x51, 0x7d, 0x82, 0x7a, 0x8f, 0xc7, 0x16, 0x0c, 0x73, 0x7b, 0x3f, + 0xe9, 0x71, 0xfb, 0x6a, 0x56, 0xeb, 0xf9, 0x03, 0xb2, 0xc0, 0xed, 0x06, 0x85, 0xc3, 0xa0, 0xba, + 0x30, 0x45, 0x29, 0x96, 0xc4, 0xe7, 0x5e, 0x81, 0x31, 0x1d, 0xf3, 0x48, 0xde, 0x79, 0xff, 0x5f, + 0x11, 0xa6, 0x68, 0x0f, 0x1e, 0xe9, 0x44, 0xdc, 0x4e, 0x4f, 0xc4, 0x71, 0x7b, 0x68, 0xf5, 0x9e, + 0x8d, 0x37, 0x93, 0xb3, 0x71, 0x35, 0x6f, 0x36, 0x4e, 0x7a, 0x0e, 0xbe, 0xd3, 0x82, 0x99, 0xd5, + 0xa6, 0x5f, 0xdf, 0x4d, 0x78, 0x51, 0xbd, 0x04, 0xa3, 0xf4, 0x38, 0x0e, 0x0d, 0x07, 0x7f, 0x23, + 0xe4, 0x83, 0x00, 0x61, 0x1d, 0x4f, 0xab, 0x76, 0xfb, 0x76, 0xa5, 0x9c, 0x15, 0x29, 0x42, 0x80, + 0xb0, 0x8e, 0x67, 0xff, 0xa6, 0x05, 0xe7, 0xae, 0x2d, 0xaf, 0xc4, 0x4b, 0x31, 0x15, 0xac, 0xe2, + 0x12, 0x0c, 0xb5, 0x1b, 0x5a, 0x57, 0x62, 0xe9, 0x73, 0x99, 0xf5, 0x42, 0x40, 0xdf, 0x2d, 0x81, + 0x58, 0x7e, 0xda, 0x82, 0x99, 0x6b, 0x6e, 0x44, 0x6f, 0xd7, 0x64, 0xd8, 0x04, 0x7a, 0xbd, 0x86, + 0x6e, 0xe4, 0x07, 0xfb, 0xc9, 0xb0, 0x09, 0x58, 0x41, 0xb0, 0x86, 0xc5, 0x5b, 0xde, 0x73, 0x99, + 0xa5, 0x79, 0xc1, 0xd4, 0xc3, 0x61, 0x51, 0x8e, 0x15, 0x06, 0xfd, 0xb0, 0x86, 0x1b, 0x30, 0x11, + 0xe6, 0xbe, 0x38, 0x61, 0xd5, 0x87, 0x95, 0x25, 0x00, 0xc7, 0x38, 0xf4, 0x35, 0x37, 0x7f, 0xad, + 0xd9, 0x09, 0x23, 0x12, 0x6c, 0x85, 0x39, 0xa7, 0xe3, 0x0b, 0x50, 0x22, 0x52, 0x61, 0x20, 0x7a, + 0xad, 0x38, 0x46, 0xa5, 0x49, 0xe0, 0xd1, 0x1b, 0x14, 0x5e, 0x1f, 0x3e, 0x99, 0x47, 0x73, 0xaa, + 0x5b, 0x05, 0x44, 0xf4, 0xb6, 0xf4, 0x70, 0x16, 0xcc, 0x2f, 0x7e, 0x25, 0x05, 0xc5, 0x19, 0x35, + 0xec, 0x1f, 0xb3, 0xe0, 0xb4, 0xfa, 0xe0, 0x77, 0xdd, 0x67, 0xda, 0x3f, 0x57, 0x80, 0xf1, 0xeb, + 0x1b, 0x1b, 0xd5, 0x6b, 0x24, 0x12, 0xd7, 0x76, 0x6f, 0x33, 0x00, 0xac, 0x69, 0x33, 0xbb, 0x3d, + 0xe6, 0x3a, 0x91, 0xdb, 0x5c, 0xe0, 0x51, 0x91, 0x16, 0x2a, 0x5e, 0x74, 0x2b, 0xa8, 0x45, 0x81, + 0xeb, 0x6d, 0x67, 0xea, 0x3f, 0x25, 0x73, 0x51, 0xcc, 0x63, 0x2e, 0xd0, 0x0b, 0x30, 0xc4, 0xc2, + 0x32, 0xc9, 0x49, 0x78, 0x5c, 0xbd, 0x85, 0x58, 0xe9, 0xe1, 0xc1, 0x7c, 0xe9, 0x36, 0xae, 0xf0, + 0x3f, 0x58, 0xa0, 0xa2, 0xdb, 0x30, 0xba, 0x13, 0x45, 0xed, 0xeb, 0xc4, 0x69, 0xd0, 0xa7, 0x3b, + 0x3f, 0x0e, 0xcf, 0x67, 0x1d, 0x87, 0x74, 0x10, 0x38, 0x5a, 0x7c, 0x82, 0xc4, 0x65, 0x21, 0xd6, + 0xe9, 0xd8, 0x35, 0x80, 0x18, 0x76, 0x4c, 0x8a, 0x1c, 0xfb, 0x0f, 0x2d, 0x18, 0xe6, 0x11, 0x32, + 0x02, 0xf4, 0x51, 0x18, 0x20, 0xf7, 0x49, 0x5d, 0x70, 0xbc, 0x99, 0x1d, 0x8e, 0x39, 0x2d, 0x2e, + 0x90, 0xa6, 0xff, 0x31, 0xab, 0x85, 0xae, 0xc3, 0x30, 0xed, 0xed, 0x35, 0x15, 0x2e, 0xe4, 0xc9, + 0xbc, 0x2f, 0x56, 0xd3, 0xce, 0x99, 0x33, 0x51, 0x84, 0x65, 0x75, 0xa6, 0x3d, 0xaf, 0xb7, 0x6b, + 0xf4, 0xc4, 0x8e, 0xba, 0x31, 0x16, 0x1b, 0xcb, 0x55, 0x8e, 0x24, 0xa8, 0x71, 0xed, 0xb9, 0x2c, + 0xc4, 0x31, 0x11, 0x7b, 0x03, 0x4a, 0x74, 0x52, 0x17, 0x9b, 0xae, 0xd3, 0xdd, 0x20, 0xe0, 0x19, + 0x28, 0x49, 0x75, 0x7f, 0x28, 0x3c, 0xe3, 0x19, 0x55, 0x69, 0x0d, 0x10, 0xe2, 0x18, 0x6e, 0x6f, + 0xc1, 0x29, 0x66, 0xbc, 0xe9, 0x44, 0x3b, 0xc6, 0x1e, 0xeb, 0xbd, 0x98, 0x9f, 0x15, 0x0f, 0x48, + 0x3e, 0x33, 0xb3, 0x9a, 0xf3, 0xe9, 0x98, 0xa4, 0x18, 0x3f, 0x26, 0xed, 0xaf, 0x0d, 0xc0, 0xe3, + 0x95, 0x5a, 0x7e, 0xf0, 0x94, 0x97, 0x61, 0x8c, 0xf3, 0xa5, 0x74, 0x69, 0x3b, 0x4d, 0xd1, 0xae, + 0x92, 0x44, 0x6f, 0x68, 0x30, 0x6c, 0x60, 0xa2, 0x73, 0x50, 0x74, 0xdf, 0xf2, 0x92, 0xae, 0x59, + 0x95, 0x37, 0xd6, 0x31, 0x2d, 0xa7, 0x60, 0xca, 0xe2, 0xf2, 0xbb, 0x43, 0x81, 0x15, 0x9b, 0xfb, + 0x1a, 0x4c, 0xb8, 0x61, 0x3d, 0x74, 0x2b, 0x1e, 0x3d, 0x67, 0xb4, 0x93, 0x4a, 0x09, 0x37, 0x68, + 0xa7, 0x15, 0x14, 0x27, 0xb0, 0xb5, 0x8b, 0x6c, 0xb0, 0x6f, 0x36, 0xb9, 0xa7, 0xab, 0x38, 0x7d, + 0x01, 0xb4, 0xd9, 0xd7, 0x85, 0x4c, 0xa5, 0x20, 0x5e, 0x00, 0xfc, 0x83, 0x43, 0x2c, 0x61, 0xf4, + 0xe5, 0x58, 0xdf, 0x71, 0xda, 0x8b, 0x9d, 0x68, 0xa7, 0xec, 0x86, 0x75, 0x7f, 0x8f, 0x04, 0xfb, + 0xec, 0xd1, 0x3f, 0x12, 0xbf, 0x1c, 0x15, 0x60, 0xf9, 0xfa, 0x62, 0x95, 0x62, 0xe2, 0x74, 0x1d, + 0xb4, 0x08, 0x93, 0xb2, 0xb0, 0x46, 0x42, 0x76, 0x85, 0x8d, 0x32, 0x32, 0xca, 0x59, 0x4a, 0x14, + 0x2b, 0x22, 0x49, 0x7c, 0x93, 0x93, 0x86, 0xe3, 0xe0, 0xa4, 0x3f, 0x02, 0xe3, 0xae, 0xe7, 0x46, + 0xae, 0x13, 0xf9, 0x5c, 0x1f, 0xc6, 0xdf, 0xf7, 0x4c, 0xd0, 0x5f, 0xd1, 0x01, 0xd8, 0xc4, 0xb3, + 0xff, 0xcb, 0x00, 0x4c, 0xb3, 0x69, 0x7b, 0x6f, 0x85, 0x7d, 0x33, 0xad, 0xb0, 0xdb, 0xe9, 0x15, + 0x76, 0x1c, 0x4f, 0x84, 0x87, 0x5e, 0x66, 0x9f, 0x83, 0x92, 0xf2, 0x0f, 0x93, 0x0e, 0xa2, 0x56, + 0x8e, 0x83, 0x68, 0x6f, 0xee, 0x43, 0x9a, 0xd8, 0x15, 0x33, 0x4d, 0xec, 0xfe, 0x86, 0x05, 0xb1, + 0x82, 0x07, 0x5d, 0x87, 0x52, 0xdb, 0x67, 0x96, 0xa3, 0x81, 0x34, 0xc7, 0x7e, 0x3c, 0xf3, 0xa2, + 0xe2, 0x97, 0x22, 0xff, 0xf8, 0xaa, 0xac, 0x81, 0xe3, 0xca, 0x68, 0x09, 0x86, 0xdb, 0x01, 0xa9, + 0x45, 0x2c, 0x86, 0x4a, 0x4f, 0x3a, 0x7c, 0x8d, 0x70, 0x7c, 0x2c, 0x2b, 0xda, 0x3f, 0x6f, 0x01, + 0x70, 0x2b, 0x36, 0xc7, 0xdb, 0x26, 0x27, 0x20, 0xb5, 0x2e, 0xc3, 0x40, 0xd8, 0x26, 0xf5, 0x6e, + 0x36, 0xbd, 0x71, 0x7f, 0x6a, 0x6d, 0x52, 0x8f, 0x07, 0x9c, 0xfe, 0xc3, 0xac, 0xb6, 0xfd, 0xdd, + 0x00, 0x13, 0x31, 0x5a, 0x25, 0x22, 0x2d, 0xf4, 0x9c, 0x11, 0x53, 0xe1, 0x6c, 0x22, 0xa6, 0x42, + 0x89, 0x61, 0x6b, 0x02, 0xd2, 0xcf, 0x41, 0xb1, 0xe5, 0xdc, 0x17, 0x12, 0xb0, 0x67, 0xba, 0x77, + 0x83, 0xd2, 0x5f, 0x58, 0x73, 0xee, 0xf3, 0x47, 0xe2, 0x33, 0x72, 0x81, 0xac, 0x39, 0xf7, 0x0f, + 0xb9, 0xe5, 0x2e, 0x3b, 0xa4, 0x6e, 0xba, 0x61, 0xf4, 0x85, 0xff, 0x1c, 0xff, 0x67, 0xcb, 0x8e, + 0x36, 0xc2, 0xda, 0x72, 0x3d, 0x61, 0xa0, 0xd5, 0x57, 0x5b, 0xae, 0x97, 0x6c, 0xcb, 0xf5, 0xfa, + 0x68, 0xcb, 0xf5, 0xd0, 0xdb, 0x30, 0x2c, 0xec, 0x27, 0x45, 0x0c, 0xa3, 0x2b, 0x7d, 0xb4, 0x27, + 0xcc, 0x2f, 0x79, 0x9b, 0x57, 0xe4, 0x23, 0x58, 0x94, 0xf6, 0x6c, 0x57, 0x36, 0x88, 0xfe, 0xaa, + 0x05, 0x13, 0xe2, 0x37, 0x26, 0x6f, 0x75, 0x48, 0x18, 0x09, 0xde, 0xf3, 0xc3, 0xfd, 0xf7, 0x41, + 0x54, 0xe4, 0x5d, 0xf9, 0xb0, 0x3c, 0x66, 0x4d, 0x60, 0xcf, 0x1e, 0x25, 0x7a, 0x81, 0xfe, 0xbe, + 0x05, 0xa7, 0x5a, 0xce, 0x7d, 0xde, 0x22, 0x2f, 0xc3, 0x4e, 0xe4, 0xfa, 0xc2, 0x0e, 0xe1, 0xa3, + 0xfd, 0x4d, 0x7f, 0xaa, 0x3a, 0xef, 0xa4, 0x54, 0x96, 0x9e, 0xca, 0x42, 0xe9, 0xd9, 0xd5, 0xcc, + 0x7e, 0xcd, 0x6d, 0xc1, 0x88, 0x5c, 0x6f, 0x19, 0xa2, 0x86, 0xb2, 0xce, 0x58, 0x1f, 0xd9, 0x7c, + 0x55, 0x8f, 0x55, 0x40, 0xdb, 0x11, 0x6b, 0xed, 0x91, 0xb6, 0xf3, 0x39, 0x18, 0xd3, 0xd7, 0xd8, + 0x23, 0x6d, 0xeb, 0x2d, 0x98, 0xc9, 0x58, 0x4b, 0x8f, 0xb4, 0xc9, 0x7b, 0x70, 0x36, 0x77, 0x7d, + 0x3c, 0xca, 0x86, 0xed, 0x9f, 0xb3, 0xf4, 0x73, 0xf0, 0x04, 0x54, 0x07, 0xcb, 0xa6, 0xea, 0xe0, + 0x7c, 0xf7, 0x9d, 0x93, 0xa3, 0x3f, 0x78, 0x53, 0xef, 0x34, 0x3d, 0xd5, 0xd1, 0xeb, 0x30, 0xd4, + 0xa4, 0x25, 0xd2, 0x0a, 0xd7, 0xee, 0xbd, 0x23, 0x63, 0x5e, 0x8a, 0x95, 0x87, 0x58, 0x50, 0xb0, + 0x7f, 0xc9, 0x82, 0x81, 0x13, 0x18, 0x09, 0x6c, 0x8e, 0xc4, 0x73, 0xb9, 0xa4, 0x45, 0x78, 0xe5, + 0x05, 0xec, 0xdc, 0x5b, 0xb9, 0x1f, 0x11, 0x2f, 0x64, 0x4f, 0xc5, 0xcc, 0x81, 0xf9, 0x49, 0x0b, + 0x66, 0x6e, 0xfa, 0x4e, 0x63, 0xc9, 0x69, 0x3a, 0x5e, 0x9d, 0x04, 0x15, 0x6f, 0xfb, 0x48, 0x26, + 0xe4, 0x85, 0x9e, 0x26, 0xe4, 0xcb, 0xd2, 0x02, 0x6b, 0x20, 0x7f, 0xfe, 0x28, 0x23, 0x99, 0x8c, + 0x32, 0x63, 0xd8, 0x0a, 0xef, 0x00, 0xd2, 0x7b, 0x29, 0x1c, 0x7a, 0x30, 0x0c, 0xbb, 0xbc, 0xbf, + 0x62, 0x12, 0x9f, 0xca, 0x66, 0xf0, 0x52, 0x9f, 0xa7, 0xb9, 0xaa, 0xf0, 0x02, 0x2c, 0x09, 0xd9, + 0x2f, 0x43, 0x66, 0x54, 0x80, 0xde, 0xc2, 0x07, 0xfb, 0x93, 0x30, 0xcd, 0x6a, 0x1e, 0xf1, 0x61, + 0x6c, 0x27, 0x64, 0x9b, 0x19, 0xf1, 0x02, 0xed, 0x2f, 0x5a, 0x30, 0xb9, 0x9e, 0x08, 0xa3, 0x76, + 0x89, 0x69, 0x43, 0x33, 0x44, 0xea, 0x35, 0x56, 0x8a, 0x05, 0xf4, 0xd8, 0x25, 0x59, 0x7f, 0x69, + 0x41, 0x1c, 0xa8, 0xe3, 0x04, 0xd8, 0xb7, 0x65, 0x83, 0x7d, 0xcb, 0x94, 0xb0, 0xa8, 0xee, 0xe4, + 0x71, 0x6f, 0xe8, 0x86, 0x0a, 0x61, 0xd5, 0x45, 0xb8, 0x12, 0x93, 0xe1, 0x4b, 0x71, 0xc2, 0x8c, + 0x73, 0x25, 0x83, 0x5a, 0xd9, 0xbf, 0x53, 0x00, 0xa4, 0x70, 0xfb, 0x0e, 0xb1, 0x95, 0xae, 0x71, + 0x3c, 0x21, 0xb6, 0xf6, 0x00, 0x31, 0x7d, 0x7e, 0xe0, 0x78, 0x21, 0x27, 0xeb, 0x0a, 0xd9, 0xdd, + 0xd1, 0x8c, 0x05, 0xe6, 0x44, 0x93, 0xe8, 0x66, 0x8a, 0x1a, 0xce, 0x68, 0x41, 0xb3, 0xd3, 0x18, + 0xec, 0xd7, 0x4e, 0x63, 0xa8, 0x87, 0xd3, 0xde, 0xcf, 0x5a, 0x30, 0xae, 0x86, 0xe9, 0x5d, 0x62, + 0x52, 0xaf, 0xfa, 0x93, 0x73, 0x80, 0x56, 0xb5, 0x2e, 0xb3, 0x8b, 0xe5, 0x5b, 0x99, 0xf3, 0xa5, + 0xd3, 0x74, 0xdf, 0x26, 0x2a, 0xc0, 0xe1, 0xbc, 0x70, 0xa6, 0x14, 0xa5, 0x87, 0x07, 0xf3, 0xe3, + 0xea, 0x1f, 0x0f, 0xa8, 0x1c, 0x57, 0xa1, 0x47, 0xf2, 0x64, 0x62, 0x29, 0xa2, 0x97, 0x60, 0xb0, + 0xbd, 0xe3, 0x84, 0x24, 0xe1, 0x7a, 0x34, 0x58, 0xa5, 0x85, 0x87, 0x07, 0xf3, 0x13, 0xaa, 0x02, + 0x2b, 0xc1, 0x1c, 0xbb, 0xff, 0xc0, 0x65, 0xe9, 0xc5, 0xd9, 0x33, 0x70, 0xd9, 0x9f, 0x5a, 0x30, + 0xb0, 0xee, 0x37, 0x4e, 0xe2, 0x08, 0x78, 0xcd, 0x38, 0x02, 0x9e, 0xc8, 0x8b, 0x75, 0x9f, 0xbb, + 0xfb, 0x57, 0x13, 0xbb, 0xff, 0x7c, 0x2e, 0x85, 0xee, 0x1b, 0xbf, 0x05, 0xa3, 0x2c, 0x82, 0xbe, + 0x70, 0xb3, 0x7a, 0xc1, 0xd8, 0xf0, 0xf3, 0x89, 0x0d, 0x3f, 0xa9, 0xa1, 0x6a, 0x3b, 0xfd, 0x69, + 0x18, 0x16, 0x7e, 0x3b, 0x49, 0x1f, 0x56, 0x81, 0x8b, 0x25, 0xdc, 0xfe, 0xf1, 0x22, 0x18, 0x11, + 0xfb, 0xd1, 0xaf, 0x58, 0xb0, 0x10, 0x70, 0x7b, 0xde, 0x46, 0xb9, 0x13, 0xb8, 0xde, 0x76, 0xad, + 0xbe, 0x43, 0x1a, 0x9d, 0xa6, 0xeb, 0x6d, 0x57, 0xb6, 0x3d, 0x5f, 0x15, 0xaf, 0xdc, 0x27, 0xf5, + 0x0e, 0x53, 0x82, 0xf5, 0x48, 0x0f, 0xa0, 0xec, 0xe2, 0x9f, 0x7f, 0x70, 0x30, 0xbf, 0x80, 0x8f, + 0x44, 0x1b, 0x1f, 0xb1, 0x2f, 0xe8, 0x37, 0x2d, 0xb8, 0xc2, 0x03, 0xd9, 0xf7, 0xdf, 0xff, 0x2e, + 0xaf, 0xe5, 0xaa, 0x24, 0x15, 0x13, 0xd9, 0x20, 0x41, 0x6b, 0xe9, 0x23, 0x62, 0x40, 0xaf, 0x54, + 0x8f, 0xd6, 0x16, 0x3e, 0x6a, 0xe7, 0xec, 0x7f, 0x56, 0x84, 0x71, 0x11, 0xe0, 0x4a, 0xdc, 0x01, + 0x2f, 0x19, 0x4b, 0xe2, 0xc9, 0xc4, 0x92, 0x98, 0x36, 0x90, 0x8f, 0xe7, 0xf8, 0x0f, 0x61, 0x9a, + 0x1e, 0xce, 0xd7, 0x89, 0x13, 0x44, 0x9b, 0xc4, 0xe1, 0xe6, 0x57, 0xc5, 0x23, 0x9f, 0xfe, 0x4a, + 0x3c, 0x77, 0x33, 0x49, 0x0c, 0xa7, 0xe9, 0x7f, 0x33, 0xdd, 0x39, 0x1e, 0x4c, 0xa5, 0x62, 0x94, + 0x7d, 0x0a, 0x4a, 0xca, 0xe9, 0x44, 0x1c, 0x3a, 0xdd, 0x43, 0xfd, 0x25, 0x29, 0x70, 0x11, 0x5a, + 0xec, 0xf0, 0x14, 0x93, 0xb3, 0xff, 0x41, 0xc1, 0x68, 0x90, 0x4f, 0xe2, 0x3a, 0x8c, 0x38, 0x61, + 0xe8, 0x6e, 0x7b, 0xa4, 0x21, 0x76, 0xec, 0xfb, 0xf3, 0x76, 0xac, 0xd1, 0x0c, 0x73, 0xfc, 0x59, + 0x14, 0x35, 0xb1, 0xa2, 0x81, 0xae, 0x73, 0x23, 0xb7, 0x3d, 0xf9, 0xde, 0xeb, 0x8f, 0x1a, 0x48, + 0x33, 0xb8, 0x3d, 0x82, 0x45, 0x7d, 0xf4, 0x69, 0x6e, 0x85, 0x78, 0xc3, 0xf3, 0xef, 0x79, 0xd7, + 0x7c, 0x5f, 0x06, 0x91, 0xe8, 0x8f, 0xe0, 0xb4, 0xb4, 0x3d, 0x54, 0xd5, 0xb1, 0x49, 0xad, 0xbf, + 0xa0, 0x9f, 0x9f, 0x87, 0x19, 0x4a, 0xda, 0xf4, 0xf1, 0x0e, 0x11, 0x81, 0x49, 0x11, 0x3d, 0x4d, + 0x96, 0x89, 0xb1, 0xcb, 0x7c, 0xca, 0x99, 0xb5, 0x63, 0x39, 0xf2, 0x0d, 0x93, 0x04, 0x4e, 0xd2, + 0xb4, 0x7f, 0xca, 0x02, 0xe6, 0xef, 0x7a, 0x02, 0xfc, 0xc8, 0xc7, 0x4c, 0x7e, 0x64, 0x36, 0x6f, + 0x90, 0x73, 0x58, 0x91, 0x17, 0xf9, 0xca, 0xaa, 0x06, 0xfe, 0xfd, 0x7d, 0x61, 0x3a, 0xd2, 0xfb, + 0xfd, 0x61, 0xff, 0x6f, 0x8b, 0x1f, 0x62, 0xca, 0x25, 0x04, 0x7d, 0x3b, 0x8c, 0xd4, 0x9d, 0xb6, + 0x53, 0xe7, 0xe9, 0x65, 0x72, 0x25, 0x7a, 0x46, 0xa5, 0x85, 0x65, 0x51, 0x83, 0x4b, 0xa8, 0x64, + 0x14, 0xbe, 0x11, 0x59, 0xdc, 0x53, 0x2a, 0xa5, 0x9a, 0x9c, 0xdb, 0x85, 0x71, 0x83, 0xd8, 0x23, + 0x15, 0x67, 0x7c, 0x3b, 0xbf, 0x62, 0x55, 0xd4, 0xc8, 0x16, 0x4c, 0x7b, 0xda, 0x7f, 0x7a, 0xa1, + 0xc8, 0xc7, 0xe5, 0xfb, 0x7b, 0x5d, 0xa2, 0xec, 0xf6, 0xd1, 0x5c, 0x69, 0x13, 0x64, 0x70, 0x9a, + 0xb2, 0xfd, 0x13, 0x16, 0x3c, 0xa6, 0x23, 0x6a, 0xde, 0x3a, 0xbd, 0x74, 0x04, 0x65, 0x18, 0xf1, + 0xdb, 0x24, 0x70, 0x22, 0x3f, 0x10, 0xb7, 0xc6, 0x65, 0x39, 0xe8, 0xb7, 0x44, 0xf9, 0xa1, 0x08, + 0xce, 0x2e, 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0xd2, 0xd7, 0x27, 0x1b, 0x8c, 0x50, 0xf8, 0x65, 0xb1, + 0x33, 0x80, 0xa9, 0xcb, 0x43, 0x2c, 0x20, 0xf6, 0xd7, 0x2c, 0xbe, 0xb0, 0xf4, 0xae, 0xa3, 0xb7, + 0x60, 0xaa, 0xe5, 0x44, 0xf5, 0x9d, 0x95, 0xfb, 0xed, 0x80, 0x6b, 0x5c, 0xe4, 0x38, 0x3d, 0xd3, + 0x6b, 0x9c, 0xb4, 0x8f, 0x8c, 0x0d, 0x2b, 0xd7, 0x12, 0xc4, 0x70, 0x8a, 0x3c, 0xda, 0x84, 0x51, + 0x56, 0xc6, 0x5c, 0x0e, 0xc3, 0x6e, 0xac, 0x41, 0x5e, 0x6b, 0xca, 0xe2, 0x60, 0x2d, 0xa6, 0x83, + 0x75, 0xa2, 0xf6, 0xcf, 0x14, 0xf9, 0x6e, 0x67, 0xac, 0xfc, 0xd3, 0x30, 0xdc, 0xf6, 0x1b, 0xcb, + 0x95, 0x32, 0x16, 0xb3, 0xa0, 0xae, 0x91, 0x2a, 0x2f, 0xc6, 0x12, 0x8e, 0x2e, 0xc3, 0x88, 0xf8, + 0x29, 0x35, 0x64, 0xec, 0x6c, 0x16, 0x78, 0x21, 0x56, 0x50, 0xf4, 0x3c, 0x40, 0x3b, 0xf0, 0xf7, + 0xdc, 0x06, 0x0b, 0x85, 0x51, 0x34, 0x8d, 0x85, 0xaa, 0x0a, 0x82, 0x35, 0x2c, 0xf4, 0x2a, 0x8c, + 0x77, 0xbc, 0x90, 0xb3, 0x23, 0x5a, 0xe0, 0x5b, 0x65, 0xc6, 0x72, 0x5b, 0x07, 0x62, 0x13, 0x17, + 0x2d, 0xc2, 0x50, 0xe4, 0x30, 0xe3, 0x97, 0xc1, 0x7c, 0xe3, 0xdb, 0x0d, 0x8a, 0xa1, 0x67, 0x32, + 0xa1, 0x15, 0xb0, 0xa8, 0x88, 0x3e, 0x25, 0xbd, 0x7f, 0xf9, 0xc1, 0x2e, 0xac, 0xde, 0xfb, 0xbb, + 0x04, 0x34, 0xdf, 0x5f, 0x61, 0x4d, 0x6f, 0xd0, 0x42, 0xaf, 0x00, 0x90, 0xfb, 0x11, 0x09, 0x3c, + 0xa7, 0xa9, 0x6c, 0xcb, 0x14, 0x5f, 0x50, 0xf6, 0xd7, 0xfd, 0xe8, 0x76, 0x48, 0x56, 0x14, 0x06, + 0xd6, 0xb0, 0xed, 0xdf, 0x2c, 0x01, 0xc4, 0x7c, 0x3b, 0x7a, 0x3b, 0x75, 0x70, 0x3d, 0xdb, 0x9d, + 0xd3, 0x3f, 0xbe, 0x53, 0x0b, 0x7d, 0x8f, 0x05, 0xa3, 0x4e, 0xb3, 0xe9, 0xd7, 0x1d, 0x1e, 0x9a, + 0xb8, 0xd0, 0xfd, 0xe0, 0x14, 0xed, 0x2f, 0xc6, 0x35, 0x78, 0x17, 0x5e, 0x90, 0x2b, 0x54, 0x83, + 0xf4, 0xec, 0x85, 0xde, 0x30, 0xfa, 0x90, 0x7c, 0x2a, 0x16, 0x8d, 0xa1, 0x54, 0x4f, 0xc5, 0x12, + 0xbb, 0x23, 0xf4, 0x57, 0xe2, 0x6d, 0xe3, 0x95, 0x38, 0x90, 0xef, 0xde, 0x68, 0xb0, 0xaf, 0xbd, + 0x1e, 0x88, 0xa8, 0xaa, 0x87, 0x3a, 0x18, 0xcc, 0xf7, 0x25, 0xd4, 0xde, 0x49, 0x3d, 0xc2, 0x1c, + 0x7c, 0x0e, 0x26, 0x1b, 0x26, 0x13, 0x20, 0x56, 0xe2, 0x53, 0x79, 0x74, 0x13, 0x3c, 0x43, 0x7c, + 0xed, 0x27, 0x00, 0x38, 0x49, 0x18, 0x55, 0x79, 0xe4, 0x8b, 0x8a, 0xb7, 0xe5, 0x0b, 0xcf, 0x0b, + 0x3b, 0x77, 0x2e, 0xf7, 0xc3, 0x88, 0xb4, 0x28, 0x66, 0x7c, 0xbb, 0xaf, 0x8b, 0xba, 0x58, 0x51, + 0x41, 0xaf, 0xc3, 0x10, 0x73, 0x26, 0x0b, 0x67, 0x47, 0xf2, 0x25, 0xce, 0x66, 0x28, 0xb7, 0x78, + 0x43, 0xb2, 0xbf, 0x21, 0x16, 0x14, 0xd0, 0x75, 0xe9, 0xaa, 0x19, 0x56, 0xbc, 0xdb, 0x21, 0x61, + 0xae, 0x9a, 0xa5, 0xa5, 0xf7, 0xc7, 0x5e, 0x98, 0xbc, 0x3c, 0x33, 0xdf, 0x99, 0x51, 0x93, 0x72, + 0x51, 0xe2, 0xbf, 0x4c, 0xa3, 0x36, 0x0b, 0xf9, 0xdd, 0x33, 0x53, 0xad, 0xc5, 0xc3, 0x79, 0xc7, + 0x24, 0x81, 0x93, 0x34, 0x29, 0x47, 0xca, 0x77, 0xbd, 0xf0, 0xdd, 0xe8, 0x75, 0x76, 0xf0, 0x87, + 0x38, 0xbb, 0x8d, 0x78, 0x09, 0x16, 0xf5, 0x4f, 0x94, 0x3d, 0x98, 0xf3, 0x60, 0x2a, 0xb9, 0x45, + 0x1f, 0x29, 0x3b, 0xf2, 0x87, 0x03, 0x30, 0x61, 0x2e, 0x29, 0x74, 0x05, 0x4a, 0x82, 0x88, 0x4a, + 0x7d, 0xa0, 0x76, 0xc9, 0x9a, 0x04, 0xe0, 0x18, 0x87, 0x65, 0xbc, 0x60, 0xd5, 0x35, 0x63, 0xdd, + 0x38, 0xe3, 0x85, 0x82, 0x60, 0x0d, 0x8b, 0x3e, 0xac, 0x36, 0x7d, 0x3f, 0x52, 0x17, 0x92, 0x5a, + 0x77, 0x4b, 0xac, 0x14, 0x0b, 0x28, 0xbd, 0x88, 0x76, 0x49, 0xe0, 0x91, 0xa6, 0x19, 0x24, 0x59, + 0x5d, 0x44, 0x37, 0x74, 0x20, 0x36, 0x71, 0xe9, 0x75, 0xea, 0x87, 0x6c, 0x21, 0x8b, 0xe7, 0x5b, + 0x6c, 0xfc, 0x5c, 0xe3, 0xde, 0xe2, 0x12, 0x8e, 0x3e, 0x09, 0x8f, 0xa9, 0x40, 0x50, 0x98, 0x6b, + 0x33, 0x64, 0x8b, 0x43, 0x86, 0xb4, 0xe5, 0xb1, 0xe5, 0x6c, 0x34, 0x9c, 0x57, 0x1f, 0xbd, 0x06, + 0x13, 0x82, 0xc5, 0x97, 0x14, 0x87, 0x4d, 0x03, 0x9b, 0x1b, 0x06, 0x14, 0x27, 0xb0, 0x65, 0x98, + 0x67, 0xc6, 0x65, 0x4b, 0x0a, 0x23, 0xe9, 0x30, 0xcf, 0x3a, 0x1c, 0xa7, 0x6a, 0xa0, 0x45, 0x98, + 0xe4, 0x3c, 0x98, 0xeb, 0x6d, 0xf3, 0x39, 0x11, 0xae, 0x55, 0x6a, 0x4b, 0xdd, 0x32, 0xc1, 0x38, + 0x89, 0x8f, 0x5e, 0x86, 0x31, 0x27, 0xa8, 0xef, 0xb8, 0x11, 0xa9, 0x47, 0x9d, 0x80, 0xfb, 0x5c, + 0x69, 0x16, 0x4a, 0x8b, 0x1a, 0x0c, 0x1b, 0x98, 0xf6, 0xdb, 0x30, 0x93, 0x11, 0x46, 0x82, 0x2e, + 0x1c, 0xa7, 0xed, 0xca, 0x6f, 0x4a, 0x98, 0x31, 0x2f, 0x56, 0x2b, 0xf2, 0x6b, 0x34, 0x2c, 0xba, + 0x3a, 0x59, 0xb8, 0x09, 0x2d, 0x6b, 0xa2, 0x5a, 0x9d, 0xab, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x7f, + 0x14, 0x60, 0x32, 0x43, 0xb7, 0xc2, 0x32, 0xf7, 0x25, 0x1e, 0x29, 0x71, 0xa2, 0x3e, 0x33, 0x6a, + 0x78, 0xe1, 0x08, 0x51, 0xc3, 0x8b, 0xbd, 0xa2, 0x86, 0x0f, 0xbc, 0x93, 0xa8, 0xe1, 0xe6, 0x88, + 0x0d, 0xf6, 0x35, 0x62, 0x19, 0x91, 0xc6, 0x87, 0x8e, 0x18, 0x69, 0xdc, 0x18, 0xf4, 0xe1, 0x3e, + 0x06, 0xfd, 0x87, 0x0b, 0x30, 0x95, 0xb4, 0xa4, 0x3c, 0x01, 0xb9, 0xed, 0xeb, 0x86, 0xdc, 0xf6, + 0x72, 0x3f, 0x8e, 0xb3, 0xb9, 0x32, 0x5c, 0x9c, 0x90, 0xe1, 0x7e, 0xb0, 0x2f, 0x6a, 0xdd, 0xe5, + 0xb9, 0x7f, 0xab, 0x00, 0xa7, 0x33, 0x3d, 0x77, 0x4f, 0x60, 0x6c, 0x6e, 0x19, 0x63, 0xf3, 0x5c, + 0xdf, 0x4e, 0xc5, 0xb9, 0x03, 0x74, 0x37, 0x31, 0x40, 0x57, 0xfa, 0x27, 0xd9, 0x7d, 0x94, 0xbe, + 0x5a, 0x84, 0xf3, 0x99, 0xf5, 0x62, 0xb1, 0xe7, 0xaa, 0x21, 0xf6, 0x7c, 0x3e, 0x21, 0xf6, 0xb4, + 0xbb, 0xd7, 0x3e, 0x1e, 0x39, 0xa8, 0x70, 0x97, 0x65, 0x31, 0x11, 0x1e, 0x52, 0x06, 0x6a, 0xb8, + 0xcb, 0x2a, 0x42, 0xd8, 0xa4, 0xfb, 0xcd, 0x24, 0xfb, 0xfc, 0x37, 0x16, 0x9c, 0xcd, 0x9c, 0x9b, + 0x13, 0x90, 0x75, 0xad, 0x9b, 0xb2, 0xae, 0xa7, 0xfb, 0x5e, 0xad, 0x39, 0xc2, 0xaf, 0x5f, 0x1f, + 0xc8, 0xf9, 0x16, 0xf6, 0x92, 0xbf, 0x05, 0xa3, 0x4e, 0xbd, 0x4e, 0xc2, 0x70, 0xcd, 0x6f, 0xa8, + 0xc0, 0xc8, 0xcf, 0xb1, 0x77, 0x56, 0x5c, 0x7c, 0x78, 0x30, 0x3f, 0x97, 0x24, 0x11, 0x83, 0xb1, + 0x4e, 0x01, 0x7d, 0x1a, 0x46, 0x42, 0x71, 0x6f, 0x8a, 0xb9, 0x7f, 0xa1, 0xcf, 0xc1, 0x71, 0x36, + 0x49, 0xd3, 0x8c, 0xdc, 0xa4, 0x24, 0x15, 0x8a, 0xa4, 0x19, 0xe5, 0xa5, 0x70, 0xac, 0x51, 0x5e, + 0x9e, 0x07, 0xd8, 0x53, 0x8f, 0x81, 0xa4, 0xfc, 0x41, 0x7b, 0x26, 0x68, 0x58, 0xe8, 0xe3, 0x30, + 0x15, 0xf2, 0xd0, 0x86, 0xcb, 0x4d, 0x27, 0x64, 0xce, 0x32, 0x62, 0x15, 0xb2, 0xe8, 0x50, 0xb5, + 0x04, 0x0c, 0xa7, 0xb0, 0xd1, 0xaa, 0x6c, 0x95, 0xc5, 0x61, 0xe4, 0x0b, 0xf3, 0x52, 0xdc, 0xa2, + 0xc8, 0x1b, 0x7c, 0x2a, 0x39, 0xfc, 0x6c, 0xe0, 0xb5, 0x9a, 0xe8, 0xd3, 0x00, 0x74, 0xf9, 0x08, + 0x39, 0xc4, 0x70, 0xfe, 0xe1, 0x49, 0x4f, 0x95, 0x46, 0xa6, 0x6d, 0x2f, 0xf3, 0x70, 0x2d, 0x2b, + 0x22, 0x58, 0x23, 0x68, 0xff, 0xf0, 0x00, 0x3c, 0xde, 0xe5, 0x8c, 0x44, 0x8b, 0xa6, 0x1e, 0xf6, + 0x99, 0xe4, 0xe3, 0x7a, 0x2e, 0xb3, 0xb2, 0xf1, 0xda, 0x4e, 0x2c, 0xc5, 0xc2, 0x3b, 0x5e, 0x8a, + 0x3f, 0x60, 0x69, 0x62, 0x0f, 0x6e, 0xf1, 0xf9, 0xb1, 0x23, 0x9e, 0xfd, 0xc7, 0x28, 0x07, 0xd9, + 0xca, 0x10, 0x26, 0x3c, 0xdf, 0x77, 0x77, 0xfa, 0x96, 0x2e, 0x9c, 0xac, 0x94, 0xf8, 0xb7, 0x2d, + 0x38, 0xd7, 0x35, 0xc4, 0xc7, 0x37, 0x20, 0xc3, 0x60, 0x7f, 0xc1, 0x82, 0x27, 0x33, 0x6b, 0x18, + 0x66, 0x46, 0x57, 0xa0, 0x54, 0xa7, 0x85, 0x9a, 0x97, 0x66, 0xec, 0xbe, 0x2e, 0x01, 0x38, 0xc6, + 0x39, 0x62, 0xf8, 0x92, 0x5f, 0xb5, 0x20, 0xb5, 0xe9, 0x4f, 0xe0, 0xf6, 0xa9, 0x98, 0xb7, 0xcf, + 0xfb, 0xfb, 0x19, 0xcd, 0x9c, 0x8b, 0xe7, 0x4f, 0x26, 0xe1, 0x4c, 0x8e, 0x97, 0xd2, 0x1e, 0x4c, + 0x6f, 0xd7, 0x89, 0xe9, 0xff, 0xda, 0x2d, 0x8a, 0x4c, 0x57, 0x67, 0x59, 0x96, 0xd9, 0x74, 0x3a, + 0x85, 0x82, 0xd3, 0x4d, 0xa0, 0x2f, 0x58, 0x70, 0xca, 0xb9, 0x17, 0xae, 0x50, 0x2e, 0xc2, 0xad, + 0x2f, 0x35, 0xfd, 0xfa, 0x2e, 0x3d, 0xa2, 0xe5, 0x46, 0x78, 0x31, 0x53, 0xb2, 0x73, 0xb7, 0x96, + 0xc2, 0x37, 0x9a, 0x67, 0xa9, 0x5e, 0xb3, 0xb0, 0x70, 0x66, 0x5b, 0x08, 0x8b, 0xf8, 0xff, 0xf4, + 0x8d, 0xd2, 0xc5, 0x43, 0x3b, 0xcb, 0x9d, 0x8c, 0x5f, 0x8b, 0x12, 0x82, 0x15, 0x1d, 0xf4, 0x59, + 0x28, 0x6d, 0x4b, 0x1f, 0xcf, 0x8c, 0x6b, 0x37, 0x1e, 0xc8, 0xee, 0x9e, 0xaf, 0x5c, 0x3d, 0xab, + 0x90, 0x70, 0x4c, 0x14, 0xbd, 0x06, 0x45, 0x6f, 0x2b, 0xec, 0x96, 0x2d, 0x35, 0x61, 0x87, 0xc7, + 0xe3, 0x20, 0xac, 0xaf, 0xd6, 0x30, 0xad, 0x88, 0xae, 0x43, 0x31, 0xd8, 0x6c, 0x08, 0xb1, 0x64, + 0xe6, 0x26, 0xc5, 0x4b, 0xe5, 0x9c, 0x5e, 0x31, 0x4a, 0x78, 0xa9, 0x8c, 0x29, 0x09, 0x54, 0x85, + 0x41, 0xe6, 0xda, 0x23, 0x2e, 0xb9, 0x4c, 0x76, 0xbe, 0x8b, 0x8b, 0x1c, 0x0f, 0x96, 0xc0, 0x10, + 0x30, 0x27, 0x84, 0x36, 0x60, 0xa8, 0xce, 0x32, 0x6b, 0x8a, 0xb8, 0x71, 0x1f, 0xca, 0x14, 0x40, + 0x76, 0x49, 0x39, 0x2a, 0xe4, 0x71, 0x0c, 0x03, 0x0b, 0x5a, 0x8c, 0x2a, 0x69, 0xef, 0x6c, 0x85, + 0x22, 0x13, 0x74, 0x36, 0xd5, 0x2e, 0x99, 0x74, 0x05, 0x55, 0x86, 0x81, 0x05, 0x2d, 0xf4, 0x0a, + 0x14, 0xb6, 0xea, 0xc2, 0x6d, 0x27, 0x53, 0x12, 0x69, 0x86, 0xb2, 0x58, 0x1a, 0x7a, 0x70, 0x30, + 0x5f, 0x58, 0x5d, 0xc6, 0x85, 0xad, 0x3a, 0x5a, 0x87, 0xe1, 0x2d, 0xee, 0xfc, 0x2e, 0x84, 0x8d, + 0x4f, 0x65, 0xfb, 0xe5, 0xa7, 0xfc, 0xe3, 0xb9, 0xc7, 0x8a, 0x00, 0x60, 0x49, 0x84, 0x85, 0xd3, + 0x57, 0x4e, 0xfc, 0x22, 0xc4, 0xda, 0xc2, 0xd1, 0x02, 0x2f, 0x70, 0xa6, 0x23, 0x0e, 0x05, 0x80, + 0x35, 0x8a, 0x74, 0x55, 0x3b, 0x32, 0x1d, 0xbf, 0x08, 0x36, 0x93, 0xb9, 0xaa, 0x55, 0xce, 0xfe, + 0x6e, 0xab, 0x5a, 0x21, 0xe1, 0x98, 0x28, 0xda, 0x85, 0xf1, 0xbd, 0xb0, 0xbd, 0x43, 0xe4, 0x96, + 0x66, 0xb1, 0x67, 0x72, 0xee, 0xe5, 0x3b, 0x02, 0xd1, 0x0d, 0xa2, 0x8e, 0xd3, 0x4c, 0x9d, 0x42, + 0x4c, 0xa7, 0x7f, 0x47, 0x27, 0x86, 0x4d, 0xda, 0x74, 0xf8, 0xdf, 0xea, 0xf8, 0x9b, 0xfb, 0x11, + 0x11, 0x91, 0xd1, 0x32, 0x87, 0xff, 0x0d, 0x8e, 0x92, 0x1e, 0x7e, 0x01, 0xc0, 0x92, 0x08, 0xba, + 0x23, 0x86, 0x87, 0x9d, 0x9e, 0x53, 0xf9, 0xe1, 0x4b, 0x17, 0x25, 0x52, 0xce, 0xa0, 0xb0, 0xd3, + 0x32, 0x26, 0xc5, 0x4e, 0xc9, 0xf6, 0x8e, 0x1f, 0xf9, 0x5e, 0xe2, 0x84, 0x9e, 0xce, 0x3f, 0x25, + 0xab, 0x19, 0xf8, 0xe9, 0x53, 0x32, 0x0b, 0x0b, 0x67, 0xb6, 0x85, 0x1a, 0x30, 0xd1, 0xf6, 0x83, + 0xe8, 0x9e, 0x1f, 0xc8, 0xf5, 0x85, 0xba, 0x08, 0x4b, 0x0c, 0x4c, 0xd1, 0x22, 0x0b, 0x3a, 0x68, + 0x42, 0x70, 0x82, 0x26, 0xfa, 0x04, 0x0c, 0x87, 0x75, 0xa7, 0x49, 0x2a, 0xb7, 0x66, 0x67, 0xf2, + 0xaf, 0x9f, 0x1a, 0x47, 0xc9, 0x59, 0x5d, 0x3c, 0xf6, 0x3e, 0x47, 0xc1, 0x92, 0x1c, 0x5a, 0x85, + 0x41, 0x96, 0x2e, 0x8d, 0x85, 0xf1, 0xcb, 0x89, 0xc2, 0x9a, 0xb2, 0x8a, 0xe6, 0x67, 0x13, 0x2b, + 0xc6, 0xbc, 0x3a, 0xdd, 0x03, 0xe2, 0xcd, 0xe0, 0x87, 0xb3, 0xa7, 0xf3, 0xf7, 0x80, 0x78, 0x6a, + 0xdc, 0xaa, 0x75, 0xdb, 0x03, 0x0a, 0x09, 0xc7, 0x44, 0xe9, 0xc9, 0x4c, 0x4f, 0xd3, 0x33, 0x5d, + 0xcc, 0x79, 0x72, 0xcf, 0x52, 0x76, 0x32, 0xd3, 0x93, 0x94, 0x92, 0xb0, 0x7f, 0x7f, 0x38, 0xcd, + 0xb3, 0xb0, 0x57, 0xe6, 0x77, 0x59, 0x29, 0x05, 0xe4, 0x87, 0xfb, 0x15, 0x7a, 0x1d, 0x23, 0x0b, + 0xfe, 0x05, 0x0b, 0xce, 0xb4, 0x33, 0x3f, 0x44, 0x30, 0x00, 0xfd, 0xc9, 0xce, 0xf8, 0xa7, 0xab, + 0x90, 0x8f, 0xd9, 0x70, 0x9c, 0xd3, 0x52, 0xf2, 0x99, 0x53, 0x7c, 0xc7, 0xcf, 0x9c, 0x35, 0x18, + 0x61, 0x4c, 0x66, 0x8f, 0x4c, 0xd3, 0xc9, 0xd7, 0x1e, 0x63, 0x25, 0x96, 0x45, 0x45, 0xac, 0x48, + 0xa0, 0x1f, 0xb4, 0xe0, 0x5c, 0xb2, 0xeb, 0x98, 0x30, 0xb0, 0x88, 0x13, 0xc9, 0x1f, 0xb8, 0xab, + 0xe2, 0xfb, 0x53, 0xfc, 0xbf, 0x81, 0x7c, 0xd8, 0x0b, 0x01, 0x77, 0x6f, 0x0c, 0x95, 0x33, 0x5e, + 0xd8, 0x43, 0xa6, 0x56, 0xa1, 0x8f, 0x57, 0xf6, 0x8b, 0x30, 0xd6, 0xf2, 0x3b, 0x5e, 0x24, 0xac, + 0x7f, 0x84, 0x25, 0x02, 0xd3, 0xc0, 0xaf, 0x69, 0xe5, 0xd8, 0xc0, 0x4a, 0xbc, 0xcd, 0x47, 0x1e, + 0xfa, 0x6d, 0xfe, 0x26, 0x8c, 0x79, 0x9a, 0xb9, 0xaa, 0xe0, 0x07, 0x2e, 0xe5, 0xc7, 0x78, 0xd5, + 0x8d, 0x5b, 0x79, 0x2f, 0xf5, 0x12, 0x6c, 0x50, 0x3b, 0xd9, 0x07, 0xdf, 0x97, 0xad, 0x0c, 0xa6, + 0x9e, 0x8b, 0x00, 0x3e, 0x6a, 0x8a, 0x00, 0x2e, 0x25, 0x45, 0x00, 0x29, 0x89, 0xb2, 0xf1, 0xfa, + 0xef, 0x3f, 0x85, 0x4d, 0xbf, 0x81, 0x10, 0xed, 0x26, 0x5c, 0xe8, 0x75, 0x2d, 0x31, 0x33, 0xb0, + 0x86, 0xd2, 0x1f, 0xc6, 0x66, 0x60, 0x8d, 0x4a, 0x19, 0x33, 0x48, 0xbf, 0x21, 0x76, 0xec, 0xff, + 0x66, 0x41, 0xb1, 0xea, 0x37, 0x4e, 0xe0, 0xc1, 0xfb, 0x31, 0xe3, 0xc1, 0xfb, 0x78, 0xf6, 0x85, + 0xd8, 0xc8, 0x95, 0x87, 0xaf, 0x24, 0xe4, 0xe1, 0xe7, 0xf2, 0x08, 0x74, 0x97, 0x7e, 0xff, 0x64, + 0x11, 0x46, 0xab, 0x7e, 0x43, 0xd9, 0x60, 0xff, 0xfa, 0xc3, 0xd8, 0x60, 0xe7, 0x26, 0x62, 0xd0, + 0x28, 0x33, 0xeb, 0x31, 0xe9, 0x7e, 0xfa, 0x0d, 0x66, 0x8a, 0x7d, 0x97, 0xb8, 0xdb, 0x3b, 0x11, + 0x69, 0x24, 0x3f, 0xe7, 0xe4, 0x4c, 0xb1, 0x7f, 0xbf, 0x00, 0x93, 0x89, 0xd6, 0x51, 0x13, 0xc6, + 0x9b, 0xba, 0xb4, 0x55, 0xac, 0xd3, 0x87, 0x12, 0xd4, 0x0a, 0x53, 0x56, 0xad, 0x08, 0x9b, 0xc4, + 0xd1, 0x02, 0x80, 0x52, 0x3f, 0x4a, 0xb1, 0x1e, 0xe3, 0xfa, 0x95, 0x7e, 0x32, 0xc4, 0x1a, 0x06, + 0x7a, 0x09, 0x46, 0x23, 0xbf, 0xed, 0x37, 0xfd, 0xed, 0xfd, 0x1b, 0x44, 0x06, 0x75, 0x52, 0x06, + 0x6a, 0x1b, 0x31, 0x08, 0xeb, 0x78, 0xe8, 0x3e, 0x4c, 0x2b, 0x22, 0xb5, 0x63, 0x90, 0x40, 0x33, + 0xa9, 0xc2, 0x7a, 0x92, 0x22, 0x4e, 0x37, 0x62, 0xff, 0x74, 0x91, 0x0f, 0xb1, 0x17, 0xb9, 0xef, + 0xed, 0x86, 0x77, 0xf7, 0x6e, 0xf8, 0xaa, 0x05, 0x53, 0xb4, 0x75, 0x66, 0x7d, 0x23, 0xaf, 0x79, + 0x15, 0x55, 0xda, 0xea, 0x12, 0x55, 0xfa, 0x12, 0x3d, 0x35, 0x1b, 0x7e, 0x27, 0x12, 0xb2, 0x3b, + 0xed, 0x58, 0xa4, 0xa5, 0x58, 0x40, 0x05, 0x1e, 0x09, 0x02, 0xe1, 0x31, 0xa8, 0xe3, 0x91, 0x20, + 0xc0, 0x02, 0x2a, 0x83, 0x4e, 0x0f, 0x64, 0x07, 0x9d, 0xe6, 0xc1, 0x31, 0x85, 0x9d, 0x86, 0x60, + 0xb8, 0xb4, 0xe0, 0x98, 0xd2, 0x80, 0x23, 0xc6, 0xb1, 0x7f, 0xae, 0x08, 0x63, 0x55, 0xbf, 0x11, + 0xab, 0x1e, 0x5f, 0x34, 0x54, 0x8f, 0x17, 0x12, 0xaa, 0xc7, 0x29, 0x1d, 0xf7, 0x3d, 0x45, 0xe3, + 0xd7, 0x4b, 0xd1, 0xf8, 0x4f, 0x2d, 0x36, 0x6b, 0xe5, 0xf5, 0x1a, 0x37, 0xe6, 0x42, 0x57, 0x61, + 0x94, 0x1d, 0x30, 0xcc, 0x45, 0x55, 0xea, 0xe3, 0x58, 0x32, 0xa5, 0xf5, 0xb8, 0x18, 0xeb, 0x38, + 0xe8, 0x32, 0x8c, 0x84, 0xc4, 0x09, 0xea, 0x3b, 0xea, 0x74, 0x15, 0xca, 0x33, 0x5e, 0x86, 0x15, + 0x14, 0xbd, 0x11, 0xc7, 0x65, 0x2c, 0xe6, 0xbb, 0xbc, 0xe9, 0xfd, 0xe1, 0x5b, 0x24, 0x3f, 0x18, + 0xa3, 0x7d, 0x17, 0x50, 0x1a, 0xbf, 0x8f, 0x80, 0x64, 0xf3, 0x66, 0x40, 0xb2, 0x52, 0x2a, 0x18, + 0xd9, 0x5f, 0x58, 0x30, 0x51, 0xf5, 0x1b, 0x74, 0xeb, 0x7e, 0x33, 0xed, 0x53, 0x3d, 0x28, 0xed, + 0x50, 0x97, 0xa0, 0xb4, 0x17, 0x61, 0xb0, 0xea, 0x37, 0x2a, 0xd5, 0x6e, 0xfe, 0xe6, 0xf6, 0xdf, + 0xb6, 0x60, 0xb8, 0xea, 0x37, 0x4e, 0x40, 0x2d, 0xf0, 0x51, 0x53, 0x2d, 0xf0, 0x58, 0xce, 0xba, + 0xc9, 0xd1, 0x04, 0xfc, 0xcd, 0x01, 0x18, 0xa7, 0xfd, 0xf4, 0xb7, 0xe5, 0x54, 0x1a, 0xc3, 0x66, + 0xf5, 0x31, 0x6c, 0x94, 0x0b, 0xf7, 0x9b, 0x4d, 0xff, 0x5e, 0x72, 0x5a, 0x57, 0x59, 0x29, 0x16, + 0x50, 0xf4, 0x2c, 0x8c, 0xb4, 0x03, 0xb2, 0xe7, 0xfa, 0x82, 0xbd, 0xd5, 0x94, 0x2c, 0x55, 0x51, + 0x8e, 0x15, 0x06, 0x7d, 0x16, 0x86, 0xae, 0x47, 0xaf, 0xf2, 0xba, 0xef, 0x35, 0xb8, 0xe4, 0xbc, + 0x28, 0x12, 0x4b, 0x68, 0xe5, 0xd8, 0xc0, 0x42, 0x77, 0xa1, 0xc4, 0xfe, 0xb3, 0x63, 0xe7, 0xe8, + 0x29, 0x4a, 0x45, 0xca, 0x3a, 0x41, 0x00, 0xc7, 0xb4, 0xd0, 0xf3, 0x00, 0x91, 0x8c, 0x3e, 0x1e, + 0x8a, 0xe0, 0x53, 0xea, 0x29, 0xa0, 0xe2, 0x92, 0x87, 0x58, 0xc3, 0x42, 0xcf, 0x40, 0x29, 0x72, + 0xdc, 0xe6, 0x4d, 0xd7, 0x23, 0x21, 0x93, 0x88, 0x17, 0x65, 0xe6, 0x38, 0x51, 0x88, 0x63, 0x38, + 0x65, 0xc5, 0x58, 0x64, 0x06, 0x9e, 0xe0, 0x78, 0x84, 0x61, 0x33, 0x56, 0xec, 0xa6, 0x2a, 0xc5, + 0x1a, 0x06, 0xda, 0x81, 0x27, 0x5c, 0x8f, 0x25, 0x61, 0x20, 0xb5, 0x5d, 0xb7, 0xbd, 0x71, 0xb3, + 0x76, 0x87, 0x04, 0xee, 0xd6, 0xfe, 0x92, 0x53, 0xdf, 0x25, 0x9e, 0x4c, 0x3e, 0xf9, 0x7e, 0xd1, + 0xc5, 0x27, 0x2a, 0x5d, 0x70, 0x71, 0x57, 0x4a, 0xf6, 0xcb, 0x70, 0xba, 0xea, 0x37, 0xaa, 0x7e, + 0x10, 0xad, 0xfa, 0xc1, 0x3d, 0x27, 0x68, 0xc8, 0x95, 0x32, 0x2f, 0xa3, 0x24, 0xd0, 0xa3, 0x70, + 0x90, 0x1f, 0x14, 0x46, 0x04, 0x84, 0x17, 0x18, 0xf3, 0x75, 0x44, 0xdf, 0x9e, 0x3a, 0x63, 0x03, + 0x54, 0x46, 0x92, 0x6b, 0x4e, 0x44, 0xd0, 0x2d, 0x96, 0x69, 0x39, 0xbe, 0x11, 0x45, 0xf5, 0xa7, + 0xb5, 0x4c, 0xcb, 0x31, 0x30, 0xf3, 0x0a, 0x35, 0xeb, 0xdb, 0xff, 0x7d, 0x90, 0x1d, 0x8e, 0x89, + 0xac, 0x16, 0xe8, 0x33, 0x30, 0x11, 0x92, 0x9b, 0xae, 0xd7, 0xb9, 0x2f, 0xa5, 0x11, 0x5d, 0xbc, + 0xb3, 0x6a, 0x2b, 0x3a, 0x26, 0x97, 0x69, 0x9a, 0x65, 0x38, 0x41, 0x0d, 0xb5, 0x60, 0xe2, 0x9e, + 0xeb, 0x35, 0xfc, 0x7b, 0xa1, 0xa4, 0x3f, 0x92, 0x2f, 0xda, 0xbc, 0xcb, 0x31, 0x13, 0x7d, 0x34, + 0x9a, 0xbb, 0x6b, 0x10, 0xc3, 0x09, 0xe2, 0x74, 0x01, 0x06, 0x1d, 0x6f, 0x31, 0xbc, 0x1d, 0x92, + 0x40, 0xe4, 0xcc, 0x66, 0x0b, 0x10, 0xcb, 0x42, 0x1c, 0xc3, 0xe9, 0x02, 0x64, 0x7f, 0xae, 0x05, + 0x7e, 0x87, 0xe7, 0x08, 0x10, 0x0b, 0x10, 0xab, 0x52, 0xac, 0x61, 0xd0, 0x0d, 0xca, 0xfe, 0xad, + 0xfb, 0x1e, 0xf6, 0xfd, 0x48, 0x6e, 0x69, 0x96, 0xa5, 0x55, 0x2b, 0xc7, 0x06, 0x16, 0x5a, 0x05, + 0x14, 0x76, 0xda, 0xed, 0x26, 0x33, 0xfb, 0x70, 0x9a, 0x8c, 0x14, 0x57, 0xb9, 0x17, 0x79, 0xe8, + 0xd4, 0x5a, 0x0a, 0x8a, 0x33, 0x6a, 0xd0, 0xb3, 0x7a, 0x4b, 0x74, 0x75, 0x90, 0x75, 0x95, 0xab, + 0x41, 0x6a, 0xbc, 0x9f, 0x12, 0x86, 0x56, 0x60, 0x38, 0xdc, 0x0f, 0xeb, 0x91, 0x88, 0x01, 0x97, + 0x93, 0xb8, 0xa8, 0xc6, 0x50, 0xb4, 0xbc, 0x79, 0xbc, 0x0a, 0x96, 0x75, 0x51, 0x1d, 0x66, 0x04, + 0xc5, 0xe5, 0x1d, 0xc7, 0x53, 0x69, 0x60, 0xb8, 0xf5, 0xeb, 0xd5, 0x07, 0x07, 0xf3, 0x33, 0xa2, + 0x65, 0x1d, 0x7c, 0x78, 0x30, 0x7f, 0xa6, 0xea, 0x37, 0x32, 0x20, 0x38, 0x8b, 0x1a, 0x5f, 0x7c, + 0xf5, 0xba, 0xdf, 0x6a, 0x57, 0x03, 0x7f, 0xcb, 0x6d, 0x92, 0x6e, 0xaa, 0xa4, 0x9a, 0x81, 0x29, + 0x16, 0x9f, 0x51, 0x86, 0x13, 0xd4, 0xec, 0x6f, 0x67, 0xfc, 0x0c, 0x4b, 0x13, 0x1d, 0x75, 0x02, + 0x82, 0x5a, 0x30, 0xde, 0x66, 0xdb, 0x44, 0x44, 0xee, 0x17, 0x6b, 0xfd, 0xc5, 0x3e, 0x45, 0x22, + 0xf7, 0xe8, 0x35, 0xa0, 0x44, 0x96, 0xec, 0xad, 0x59, 0xd5, 0xc9, 0x61, 0x93, 0xba, 0xfd, 0x63, + 0x8f, 0xb1, 0x1b, 0xb1, 0xc6, 0xe5, 0x1c, 0xc3, 0xc2, 0xd8, 0x5e, 0x3c, 0xad, 0xe6, 0xf2, 0x05, + 0x6e, 0xf1, 0xb4, 0x08, 0x83, 0x7d, 0x2c, 0xeb, 0xa2, 0x4f, 0xc3, 0x04, 0x7d, 0xa9, 0x68, 0xf9, + 0x57, 0x4e, 0xe5, 0x07, 0x45, 0x88, 0xd3, 0xae, 0x68, 0x59, 0x3d, 0xf4, 0xca, 0x38, 0x41, 0x0c, + 0xbd, 0xc1, 0xcc, 0x42, 0xcc, 0xd4, 0x2e, 0x3d, 0x48, 0xeb, 0x16, 0x20, 0x92, 0xac, 0x46, 0x24, + 0x2f, 0x6d, 0x8c, 0xfd, 0x68, 0xd3, 0xc6, 0xa0, 0x9b, 0x30, 0x2e, 0x72, 0x25, 0x8b, 0x95, 0x5b, + 0x34, 0xe4, 0x80, 0xe3, 0x58, 0x07, 0x1e, 0x26, 0x0b, 0xb0, 0x59, 0x19, 0x6d, 0xc3, 0x39, 0x2d, + 0x77, 0xd1, 0xb5, 0xc0, 0x61, 0xca, 0x7c, 0x97, 0x1d, 0xa7, 0xda, 0x5d, 0xfd, 0xe4, 0x83, 0x83, + 0xf9, 0x73, 0x1b, 0xdd, 0x10, 0x71, 0x77, 0x3a, 0xe8, 0x16, 0x9c, 0xe6, 0x2e, 0xbd, 0x65, 0xe2, + 0x34, 0x9a, 0xae, 0xa7, 0x98, 0x01, 0xbe, 0xe5, 0xcf, 0x3e, 0x38, 0x98, 0x3f, 0xbd, 0x98, 0x85, + 0x80, 0xb3, 0xeb, 0xa1, 0x8f, 0x42, 0xa9, 0xe1, 0x85, 0x62, 0x0c, 0x86, 0x8c, 0xf4, 0x50, 0xa5, + 0xf2, 0x7a, 0x4d, 0x7d, 0x7f, 0xfc, 0x07, 0xc7, 0x15, 0xd0, 0x36, 0x97, 0x15, 0x2b, 0x09, 0xc6, + 0x70, 0x2a, 0xa4, 0x51, 0x52, 0xc8, 0x67, 0x38, 0xf5, 0x71, 0x25, 0x89, 0xb2, 0x75, 0x37, 0xfc, + 0xfd, 0x0c, 0xc2, 0xe8, 0x75, 0x40, 0xf4, 0x05, 0xe1, 0xd6, 0xc9, 0x62, 0x9d, 0xa5, 0x85, 0x60, + 0xa2, 0xf5, 0x11, 0xd3, 0xcd, 0xac, 0x96, 0xc2, 0xc0, 0x19, 0xb5, 0xd0, 0x75, 0x7a, 0xaa, 0xe8, + 0xa5, 0xe2, 0xd4, 0x52, 0xc9, 0xfc, 0xca, 0xa4, 0x1d, 0x90, 0xba, 0x13, 0x91, 0x86, 0x49, 0x11, + 0x27, 0xea, 0xa1, 0x06, 0x3c, 0xe1, 0x74, 0x22, 0x9f, 0x89, 0xe1, 0x4d, 0xd4, 0x0d, 0x7f, 0x97, + 0x78, 0x4c, 0x03, 0x36, 0xb2, 0x74, 0x81, 0x72, 0x1b, 0x8b, 0x5d, 0xf0, 0x70, 0x57, 0x2a, 0x94, + 0x4b, 0x54, 0xd9, 0x7b, 0xc1, 0x0c, 0xd4, 0x94, 0x91, 0xc1, 0xf7, 0x25, 0x18, 0xdd, 0xf1, 0xc3, + 0x68, 0x9d, 0x44, 0xf7, 0xfc, 0x60, 0x57, 0xc4, 0xdb, 0x8c, 0x63, 0x34, 0xc7, 0x20, 0xac, 0xe3, + 0xd1, 0x67, 0x20, 0xb3, 0xcf, 0xa8, 0x94, 0x99, 0x6a, 0x7c, 0x24, 0x3e, 0x63, 0xae, 0xf3, 0x62, + 0x2c, 0xe1, 0x12, 0xb5, 0x52, 0x5d, 0x66, 0x6a, 0xee, 0x04, 0x6a, 0xa5, 0xba, 0x8c, 0x25, 0x9c, + 0x2e, 0xd7, 0x70, 0xc7, 0x09, 0x48, 0x35, 0xf0, 0xeb, 0x24, 0xd4, 0x22, 0x83, 0x3f, 0xce, 0xa3, + 0x89, 0xd2, 0xe5, 0x5a, 0xcb, 0x42, 0xc0, 0xd9, 0xf5, 0x10, 0x49, 0xe7, 0xed, 0x9a, 0xc8, 0xd7, + 0x4f, 0xa4, 0xf9, 0x99, 0x3e, 0x53, 0x77, 0x79, 0x30, 0xa5, 0x32, 0x86, 0xf1, 0xf8, 0xa1, 0xe1, + 0xec, 0x24, 0x5b, 0xdb, 0xfd, 0x07, 0x1f, 0x55, 0x1a, 0x9f, 0x4a, 0x82, 0x12, 0x4e, 0xd1, 0x36, + 0x62, 0x71, 0x4d, 0xf5, 0x8c, 0xc5, 0x75, 0x05, 0x4a, 0x61, 0x67, 0xb3, 0xe1, 0xb7, 0x1c, 0xd7, + 0x63, 0x6a, 0x6e, 0xed, 0x3d, 0x52, 0x93, 0x00, 0x1c, 0xe3, 0xa0, 0x55, 0x18, 0x71, 0xa4, 0x3a, + 0x07, 0xe5, 0x47, 0x5f, 0x51, 0x4a, 0x1c, 0x1e, 0x90, 0x40, 0x2a, 0x70, 0x54, 0x5d, 0xf4, 0x2a, + 0x8c, 0x0b, 0x97, 0x54, 0x91, 0xac, 0x72, 0xc6, 0xf4, 0x1b, 0xaa, 0xe9, 0x40, 0x6c, 0xe2, 0xa2, + 0xdb, 0x30, 0x1a, 0xf9, 0x4d, 0xe6, 0xfc, 0x42, 0xd9, 0xbc, 0x33, 0xf9, 0x71, 0xc4, 0x36, 0x14, + 0x9a, 0x2e, 0x49, 0x55, 0x55, 0xb1, 0x4e, 0x07, 0x6d, 0xf0, 0xf5, 0xce, 0x22, 0x64, 0x93, 0x70, + 0xf6, 0xb1, 0xfc, 0x3b, 0x49, 0x05, 0xd2, 0x36, 0xb7, 0x83, 0xa8, 0x89, 0x75, 0x32, 0xe8, 0x1a, + 0x4c, 0xb7, 0x03, 0xd7, 0x67, 0x6b, 0x42, 0x69, 0xf2, 0x66, 0xcd, 0xf4, 0x3c, 0xd5, 0x24, 0x02, + 0x4e, 0xd7, 0x61, 0x1e, 0xc5, 0xa2, 0x70, 0xf6, 0x2c, 0xcf, 0x67, 0xcd, 0x9f, 0x77, 0xbc, 0x0c, + 0x2b, 0x28, 0x5a, 0x63, 0x27, 0x31, 0x97, 0x4c, 0xcc, 0xce, 0xe5, 0x07, 0x7c, 0xd1, 0x25, 0x18, + 0x9c, 0x79, 0x55, 0x7f, 0x71, 0x4c, 0x01, 0x35, 0xb4, 0xc4, 0x87, 0xf4, 0xc5, 0x10, 0xce, 0x3e, + 0xd1, 0xc5, 0x48, 0x2e, 0xf1, 0xbc, 0x88, 0x19, 0x02, 0xa3, 0x38, 0xc4, 0x09, 0x9a, 0xe8, 0xe3, + 0x30, 0x25, 0xc2, 0xd4, 0xc5, 0xc3, 0x74, 0x2e, 0x36, 0x29, 0xc6, 0x09, 0x18, 0x4e, 0x61, 0xf3, + 0xcc, 0x01, 0xce, 0x66, 0x93, 0x88, 0xa3, 0xef, 0xa6, 0xeb, 0xed, 0x86, 0xb3, 0xe7, 0xd9, 0xf9, + 0x20, 0x32, 0x07, 0x24, 0xa1, 0x38, 0xa3, 0x06, 0xda, 0x80, 0xa9, 0x76, 0x40, 0x48, 0x8b, 0x31, + 0xfa, 0xe2, 0x3e, 0x9b, 0xe7, 0x0e, 0xf5, 0xb4, 0x27, 0xd5, 0x04, 0xec, 0x30, 0xa3, 0x0c, 0xa7, + 0x28, 0xa0, 0x7b, 0x30, 0xe2, 0xef, 0x91, 0x60, 0x87, 0x38, 0x8d, 0xd9, 0x0b, 0x5d, 0x4c, 0xdc, + 0xc5, 0xe5, 0x76, 0x4b, 0xe0, 0x26, 0xb4, 0xff, 0xb2, 0xb8, 0xb7, 0xf6, 0x5f, 0x36, 0x86, 0x7e, + 0xc8, 0x82, 0xb3, 0x52, 0x61, 0x50, 0x6b, 0xd3, 0x51, 0x5f, 0xf6, 0xbd, 0x30, 0x0a, 0xb8, 0x0b, + 0xf8, 0x93, 0xf9, 0x6e, 0xd1, 0x1b, 0x39, 0x95, 0x94, 0x70, 0xf4, 0x6c, 0x1e, 0x46, 0x88, 0xf3, + 0x5b, 0x44, 0xcb, 0x30, 0x1d, 0x92, 0x48, 0x1e, 0x46, 0x8b, 0xe1, 0xea, 0x1b, 0xe5, 0xf5, 0xd9, + 0x8b, 0xdc, 0x7f, 0x9d, 0x6e, 0x86, 0x5a, 0x12, 0x88, 0xd3, 0xf8, 0x73, 0xdf, 0x0a, 0xd3, 0xa9, + 0xeb, 0xff, 0x28, 0x19, 0x51, 0xe6, 0x76, 0x61, 0xdc, 0x18, 0xe2, 0x47, 0xaa, 0x3d, 0xfe, 0x57, + 0xc3, 0x50, 0x52, 0x9a, 0x45, 0x74, 0xc5, 0x54, 0x18, 0x9f, 0x4d, 0x2a, 0x8c, 0x47, 0xe8, 0xbb, + 0x5e, 0xd7, 0x11, 0x6f, 0x64, 0x44, 0xed, 0xca, 0xdb, 0xd0, 0xfd, 0xbb, 0x63, 0x6b, 0xe2, 0xda, + 0x62, 0xdf, 0x9a, 0xe7, 0x81, 0xae, 0x12, 0xe0, 0x6b, 0x30, 0xed, 0xf9, 0x8c, 0xe7, 0x24, 0x0d, + 0xc9, 0x50, 0x30, 0xbe, 0xa1, 0xa4, 0x87, 0xc1, 0x48, 0x20, 0xe0, 0x74, 0x1d, 0xda, 0x20, 0xbf, + 0xf8, 0x93, 0x22, 0x67, 0xce, 0x17, 0x60, 0x01, 0x45, 0x17, 0x61, 0xb0, 0xed, 0x37, 0x2a, 0x55, + 0xc1, 0x6f, 0x6a, 0xb1, 0x22, 0x1b, 0x95, 0x2a, 0xe6, 0x30, 0xb4, 0x08, 0x43, 0xec, 0x47, 0x38, + 0x3b, 0x96, 0x1f, 0xef, 0x80, 0xd5, 0xd0, 0xf2, 0xcd, 0xb0, 0x0a, 0x58, 0x54, 0x64, 0xa2, 0x2f, + 0xca, 0xa4, 0x33, 0xd1, 0xd7, 0xf0, 0x43, 0x8a, 0xbe, 0x24, 0x01, 0x1c, 0xd3, 0x42, 0xf7, 0xe1, + 0xb4, 0xf1, 0x30, 0xe2, 0x4b, 0x84, 0x84, 0xc2, 0xe7, 0xfa, 0x62, 0xd7, 0x17, 0x91, 0xd0, 0x54, + 0x9f, 0x13, 0x9d, 0x3e, 0x5d, 0xc9, 0xa2, 0x84, 0xb3, 0x1b, 0x40, 0x4d, 0x98, 0xae, 0xa7, 0x5a, + 0x1d, 0xe9, 0xbf, 0x55, 0x35, 0xa1, 0xe9, 0x16, 0xd3, 0x84, 0xd1, 0xab, 0x30, 0xf2, 0x96, 0x1f, + 0xb2, 0xb3, 0x5a, 0xf0, 0xc8, 0xd2, 0x61, 0x77, 0xe4, 0x8d, 0x5b, 0x35, 0x56, 0x7e, 0x78, 0x30, + 0x3f, 0x5a, 0xf5, 0x1b, 0xf2, 0x2f, 0x56, 0x15, 0xd0, 0xf7, 0x5a, 0x30, 0x97, 0x7e, 0x79, 0xa9, + 0x4e, 0x8f, 0xf7, 0xdf, 0x69, 0x5b, 0x34, 0x3a, 0xb7, 0x92, 0x4b, 0x0e, 0x77, 0x69, 0xca, 0xfe, + 0x65, 0x8b, 0x49, 0xdd, 0x84, 0x06, 0x88, 0x84, 0x9d, 0xe6, 0x49, 0xa4, 0xd9, 0x5c, 0x31, 0x94, + 0x53, 0x0f, 0x6d, 0xb9, 0xf0, 0xcf, 0x2d, 0x66, 0xb9, 0x70, 0x82, 0x2e, 0x0a, 0x6f, 0xc0, 0x48, + 0x24, 0x93, 0xa5, 0x76, 0xc9, 0x0c, 0xaa, 0x75, 0x8a, 0x59, 0x6f, 0x28, 0x8e, 0x55, 0xe5, 0x45, + 0x55, 0x64, 0xec, 0x7f, 0xc4, 0x67, 0x40, 0x42, 0x4e, 0x40, 0x07, 0x50, 0x36, 0x75, 0x00, 0xf3, + 0x3d, 0xbe, 0x20, 0x47, 0x17, 0xf0, 0x0f, 0xcd, 0x7e, 0x33, 0x49, 0xcd, 0xbb, 0xdd, 0x64, 0xc6, + 0xfe, 0xa2, 0x05, 0x10, 0x87, 0xe2, 0x65, 0xf2, 0x65, 0x3f, 0x90, 0x39, 0x16, 0xb3, 0xb2, 0x09, + 0xbd, 0x4c, 0x79, 0x54, 0x3f, 0xf2, 0xeb, 0x7e, 0x53, 0x68, 0xb8, 0x9e, 0x88, 0xd5, 0x10, 0xbc, + 0xfc, 0x50, 0xfb, 0x8d, 0x15, 0x36, 0x9a, 0x97, 0x81, 0xbf, 0x8a, 0xb1, 0x62, 0xcc, 0x08, 0xfa, + 0xf5, 0x23, 0x16, 0x9c, 0xca, 0xb2, 0x77, 0xa5, 0x2f, 0x1e, 0x2e, 0xb3, 0x52, 0xe6, 0x4c, 0x6a, + 0x36, 0xef, 0x88, 0x72, 0xac, 0x30, 0xfa, 0xce, 0x1c, 0x76, 0xb4, 0x18, 0xb8, 0xb7, 0x60, 0xbc, + 0x1a, 0x10, 0xed, 0x72, 0x7d, 0x8d, 0x3b, 0x93, 0xf3, 0xfe, 0x3c, 0x7b, 0x64, 0x47, 0x72, 0xfb, + 0x67, 0x0a, 0x70, 0x8a, 0x5b, 0x05, 0x2c, 0xee, 0xf9, 0x6e, 0xa3, 0xea, 0x37, 0x44, 0xd6, 0xb7, + 0x4f, 0xc1, 0x58, 0x5b, 0x13, 0x34, 0x76, 0x8b, 0xe7, 0xa8, 0x0b, 0x24, 0x63, 0xd1, 0x88, 0x5e, + 0x8a, 0x0d, 0x5a, 0xa8, 0x01, 0x63, 0x64, 0xcf, 0xad, 0x2b, 0xd5, 0x72, 0xe1, 0xc8, 0x17, 0x9d, + 0x6a, 0x65, 0x45, 0xa3, 0x83, 0x0d, 0xaa, 0x8f, 0x20, 0x9f, 0xaf, 0xfd, 0xa3, 0x16, 0x3c, 0x96, + 0x13, 0xfd, 0x91, 0x36, 0x77, 0x8f, 0xd9, 0x5f, 0x88, 0x65, 0xab, 0x9a, 0xe3, 0x56, 0x19, 0x58, + 0x40, 0xd1, 0x27, 0x00, 0xb8, 0x55, 0x05, 0x7d, 0x72, 0xf7, 0x0a, 0x93, 0x67, 0x44, 0xf8, 0xd2, + 0x82, 0x35, 0xc9, 0xfa, 0x58, 0xa3, 0x65, 0xff, 0x54, 0x11, 0x06, 0x79, 0x6a, 0xf6, 0x55, 0x18, + 0xde, 0xe1, 0xb9, 0x30, 0xfa, 0x49, 0xbb, 0x11, 0x0b, 0x43, 0x78, 0x01, 0x96, 0x95, 0xd1, 0x1a, + 0xcc, 0xf0, 0x5c, 0x22, 0xcd, 0x32, 0x69, 0x3a, 0xfb, 0x52, 0x72, 0xc7, 0xf3, 0x70, 0x2a, 0x09, + 0x66, 0x25, 0x8d, 0x82, 0xb3, 0xea, 0xa1, 0xd7, 0x60, 0x82, 0xbe, 0xa4, 0xfc, 0x4e, 0x24, 0x29, + 0xf1, 0x2c, 0x22, 0xea, 0xe9, 0xb6, 0x61, 0x40, 0x71, 0x02, 0x9b, 0x3e, 0xe6, 0xdb, 0x29, 0x19, + 0xe5, 0x60, 0xfc, 0x98, 0x37, 0xe5, 0x92, 0x26, 0x2e, 0x33, 0x74, 0xed, 0x30, 0xb3, 0xde, 0x8d, + 0x9d, 0x80, 0x84, 0x3b, 0x7e, 0xb3, 0xc1, 0x98, 0xbe, 0x41, 0xcd, 0xd0, 0x35, 0x01, 0xc7, 0xa9, + 0x1a, 0x94, 0xca, 0x96, 0xe3, 0x36, 0x3b, 0x01, 0x89, 0xa9, 0x0c, 0x99, 0x54, 0x56, 0x13, 0x70, + 0x9c, 0xaa, 0x41, 0xd7, 0xd1, 0xe9, 0x6a, 0xe0, 0xd3, 0x83, 0x54, 0x86, 0xb4, 0x51, 0xd6, 0xcb, + 0xc3, 0xd2, 0xfb, 0xb6, 0x4b, 0xf0, 0x37, 0x61, 0xdf, 0xc9, 0x29, 0x18, 0x06, 0x04, 0x35, 0xe1, + 0x77, 0x2b, 0xa9, 0xa0, 0xab, 0x30, 0x2a, 0x32, 0x44, 0x30, 0x23, 0x5b, 0x3e, 0x75, 0xcc, 0xe0, + 0xa1, 0x1c, 0x17, 0x63, 0x1d, 0xc7, 0xfe, 0xbe, 0x02, 0xcc, 0x64, 0x78, 0x49, 0xf0, 0xa3, 0x6a, + 0xdb, 0x0d, 0x23, 0x95, 0x6b, 0x50, 0x3b, 0xaa, 0x78, 0x39, 0x56, 0x18, 0x74, 0x3f, 0xf0, 0xc3, + 0x30, 0x79, 0x00, 0x0a, 0x2b, 0x64, 0x01, 0x3d, 0x62, 0xd6, 0xbe, 0x0b, 0x30, 0xd0, 0x09, 0x89, + 0x0c, 0xdb, 0xa8, 0xae, 0x06, 0xa6, 0x07, 0x63, 0x10, 0xca, 0xaa, 0x6f, 0x2b, 0x95, 0x92, 0xc6, + 0xaa, 0x73, 0xa5, 0x12, 0x87, 0xd1, 0xce, 0x45, 0xc4, 0x73, 0xbc, 0x48, 0x30, 0xf4, 0x71, 0xfc, + 0x31, 0x56, 0x8a, 0x05, 0xd4, 0xfe, 0x52, 0x11, 0xce, 0xe6, 0xfa, 0x4d, 0xd1, 0xae, 0xb7, 0x7c, + 0xcf, 0x8d, 0x7c, 0x65, 0x49, 0xc2, 0x63, 0x8e, 0x91, 0xf6, 0xce, 0x9a, 0x28, 0xc7, 0x0a, 0x03, + 0x5d, 0x82, 0x41, 0x26, 0x45, 0x4b, 0x65, 0x5d, 0x5c, 0x2a, 0xf3, 0x20, 0x34, 0x1c, 0xdc, 0x77, + 0x46, 0xdb, 0x8b, 0xf4, 0x96, 0xf4, 0x9b, 0xc9, 0x43, 0x8b, 0x76, 0xd7, 0xf7, 0x9b, 0x98, 0x01, + 0xd1, 0x07, 0xc4, 0x78, 0x25, 0x4c, 0x27, 0xb0, 0xd3, 0xf0, 0x43, 0x6d, 0xd0, 0x9e, 0x86, 0xe1, + 0x5d, 0xb2, 0x1f, 0xb8, 0xde, 0x76, 0xd2, 0xa4, 0xe6, 0x06, 0x2f, 0xc6, 0x12, 0x6e, 0x26, 0xd0, + 0x1a, 0x3e, 0xee, 0x54, 0xb4, 0x23, 0x3d, 0xaf, 0xc0, 0x1f, 0x28, 0xc2, 0x24, 0x5e, 0x2a, 0xbf, + 0x37, 0x11, 0xb7, 0xd3, 0x13, 0x71, 0xdc, 0xa9, 0x68, 0x7b, 0xcf, 0xc6, 0x2f, 0x58, 0x30, 0xc9, + 0xf2, 0x54, 0x88, 0x68, 0x55, 0xae, 0xef, 0x9d, 0x00, 0xbb, 0x79, 0x11, 0x06, 0x03, 0xda, 0x68, + 0x32, 0xdd, 0x22, 0xeb, 0x09, 0xe6, 0x30, 0xf4, 0x04, 0x0c, 0xb0, 0x2e, 0xd0, 0xc9, 0x1b, 0xe3, + 0x99, 0xaa, 0xca, 0x4e, 0xe4, 0x60, 0x56, 0xca, 0x42, 0xb0, 0x60, 0xd2, 0x6e, 0xba, 0xbc, 0xd3, + 0xb1, 0x8e, 0xf3, 0xdd, 0xe1, 0x51, 0x9d, 0xd9, 0xb5, 0x77, 0x16, 0x82, 0x25, 0x9b, 0x64, 0xf7, + 0xa7, 0xdc, 0x1f, 0x17, 0xe0, 0x7c, 0x66, 0xbd, 0xbe, 0x43, 0xb0, 0x74, 0xaf, 0xfd, 0x28, 0x33, + 0x11, 0x14, 0x4f, 0xd0, 0x60, 0x71, 0xa0, 0x5f, 0x0e, 0x73, 0xb0, 0x8f, 0xc8, 0x28, 0x99, 0x43, + 0xf6, 0x2e, 0x89, 0x8c, 0x92, 0xd9, 0xb7, 0x9c, 0xa7, 0xe8, 0x5f, 0x16, 0x72, 0xbe, 0x85, 0x3d, + 0x4a, 0x2f, 0xd3, 0x73, 0x86, 0x01, 0x43, 0xf9, 0xd0, 0xe3, 0x67, 0x0c, 0x2f, 0xc3, 0x0a, 0x8a, + 0x16, 0x61, 0xb2, 0xe5, 0x7a, 0xf4, 0xf0, 0xd9, 0x37, 0x19, 0x3f, 0x15, 0xb8, 0x6a, 0xcd, 0x04, + 0xe3, 0x24, 0x3e, 0x72, 0xb5, 0xa8, 0x29, 0x85, 0xfc, 0x04, 0xe6, 0xb9, 0xbd, 0x5d, 0x30, 0xf5, + 0xbf, 0x6a, 0x14, 0x33, 0x22, 0xa8, 0xac, 0x69, 0xb2, 0x88, 0x62, 0xff, 0xb2, 0x88, 0xb1, 0x6c, + 0x39, 0xc4, 0xdc, 0xab, 0x30, 0xfe, 0xd0, 0xc2, 0x67, 0xfb, 0xab, 0x45, 0x78, 0xbc, 0xcb, 0xb6, + 0xe7, 0x67, 0xbd, 0x31, 0x07, 0xda, 0x59, 0x9f, 0x9a, 0x87, 0x2a, 0x9c, 0xda, 0xea, 0x34, 0x9b, + 0xfb, 0xcc, 0x8e, 0x9f, 0x34, 0x24, 0x86, 0xe0, 0x29, 0xe5, 0x03, 0xfc, 0xd4, 0x6a, 0x06, 0x0e, + 0xce, 0xac, 0x49, 0x19, 0x7a, 0x7a, 0x93, 0xec, 0x2b, 0x52, 0x09, 0x86, 0x1e, 0xeb, 0x40, 0x6c, + 0xe2, 0xa2, 0x6b, 0x30, 0xed, 0xec, 0x39, 0x2e, 0x0f, 0x3d, 0x2b, 0x09, 0x70, 0x8e, 0x5e, 0xc9, + 0x0c, 0x17, 0x93, 0x08, 0x38, 0x5d, 0x07, 0xbd, 0x0e, 0xc8, 0xdf, 0x64, 0xd6, 0xbe, 0x8d, 0x6b, + 0xc4, 0x13, 0x6a, 0x3a, 0x36, 0x77, 0xc5, 0xf8, 0x48, 0xb8, 0x95, 0xc2, 0xc0, 0x19, 0xb5, 0x12, + 0x51, 0x48, 0x86, 0xf2, 0xa3, 0x90, 0x74, 0x3f, 0x17, 0x7b, 0x26, 0xc1, 0xf8, 0x4f, 0x16, 0xbd, + 0xbe, 0x38, 0x93, 0x6f, 0x06, 0xd3, 0x7b, 0x95, 0x99, 0xd9, 0x71, 0x79, 0xa2, 0x16, 0x3b, 0xe3, + 0xb4, 0x66, 0x66, 0x17, 0x03, 0xb1, 0x89, 0xcb, 0x17, 0x44, 0x18, 0xbb, 0x6c, 0x1a, 0x2c, 0xbe, + 0x88, 0xf8, 0xa3, 0x30, 0xd0, 0x27, 0x61, 0xb8, 0xe1, 0xee, 0xb9, 0xa1, 0x90, 0xa6, 0x1c, 0x59, + 0x75, 0x11, 0x9f, 0x83, 0x65, 0x4e, 0x06, 0x4b, 0x7a, 0xf6, 0x0f, 0x14, 0x60, 0x5c, 0xb6, 0xf8, + 0x46, 0xc7, 0x8f, 0x9c, 0x13, 0xb8, 0x96, 0xaf, 0x19, 0xd7, 0xf2, 0x07, 0xba, 0x85, 0x3d, 0x62, + 0x5d, 0xca, 0xbd, 0x8e, 0x6f, 0x25, 0xae, 0xe3, 0xa7, 0x7a, 0x93, 0xea, 0x7e, 0x0d, 0xff, 0x63, + 0x0b, 0xa6, 0x0d, 0xfc, 0x13, 0xb8, 0x0d, 0x56, 0xcd, 0xdb, 0xe0, 0xc9, 0x9e, 0xdf, 0x90, 0x73, + 0x0b, 0x7c, 0x77, 0x31, 0xd1, 0x77, 0x76, 0xfa, 0xbf, 0x05, 0x03, 0x3b, 0x4e, 0xd0, 0xe8, 0x16, + 0xe6, 0x3d, 0x55, 0x69, 0xe1, 0xba, 0x13, 0x08, 0x3d, 0xe5, 0xb3, 0x2a, 0x7f, 0xb8, 0x13, 0xf4, + 0xd6, 0x51, 0xb2, 0xa6, 0xd0, 0xcb, 0x30, 0x14, 0xd6, 0xfd, 0xb6, 0xb2, 0xe2, 0xbf, 0xc0, 0x73, + 0x8b, 0xd3, 0x92, 0xc3, 0x83, 0x79, 0x64, 0x36, 0x47, 0x8b, 0xb1, 0xc0, 0x47, 0x9f, 0x82, 0x71, + 0xf6, 0x4b, 0x19, 0x0d, 0x15, 0xf3, 0x53, 0x42, 0xd5, 0x74, 0x44, 0x6e, 0x51, 0x67, 0x14, 0x61, + 0x93, 0xd4, 0xdc, 0x36, 0x94, 0xd4, 0x67, 0x3d, 0x52, 0xdd, 0xe0, 0xbf, 0x2f, 0xc2, 0x4c, 0xc6, + 0x9a, 0x43, 0xa1, 0x31, 0x13, 0x57, 0xfb, 0x5c, 0xaa, 0xef, 0x70, 0x2e, 0x42, 0xf6, 0x1a, 0x6a, + 0x88, 0xb5, 0xd5, 0x77, 0xa3, 0xb7, 0x43, 0x92, 0x6c, 0x94, 0x16, 0xf5, 0x6e, 0x94, 0x36, 0x76, + 0x62, 0x43, 0x4d, 0x1b, 0x52, 0x3d, 0x7d, 0xa4, 0x73, 0xfa, 0x67, 0x45, 0x38, 0x95, 0x15, 0x89, + 0x0d, 0x7d, 0x3e, 0x91, 0x64, 0xf0, 0xc5, 0x7e, 0x63, 0xb8, 0xf1, 0xcc, 0x83, 0x5c, 0x06, 0xbc, + 0xb4, 0x60, 0xa6, 0x1d, 0xec, 0x39, 0xcc, 0xa2, 0x4d, 0x16, 0x8e, 0x20, 0xe0, 0xc9, 0x21, 0xe5, + 0xf1, 0xf1, 0xe1, 0xbe, 0x3b, 0x20, 0xb2, 0x4a, 0x86, 0x09, 0x83, 0x04, 0x59, 0xdc, 0xdb, 0x20, + 0x41, 0xb6, 0x3c, 0xe7, 0xc2, 0xa8, 0xf6, 0x35, 0x8f, 0x74, 0xc6, 0x77, 0xe9, 0x6d, 0xa5, 0xf5, + 0xfb, 0x91, 0xce, 0xfa, 0x8f, 0x5a, 0x90, 0xb0, 0x51, 0x57, 0x62, 0x31, 0x2b, 0x57, 0x2c, 0x76, + 0x01, 0x06, 0x02, 0xbf, 0x49, 0x92, 0xd9, 0xf8, 0xb0, 0xdf, 0x24, 0x98, 0x41, 0x28, 0x46, 0x14, + 0x0b, 0x3b, 0xc6, 0xf4, 0x87, 0x9c, 0x78, 0xa2, 0x5d, 0x84, 0xc1, 0x26, 0xd9, 0x23, 0xcd, 0x64, + 0xd2, 0x94, 0x9b, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0x0b, 0x03, 0x70, 0xae, 0x6b, 0x40, 0x0f, 0xfa, + 0x1c, 0xda, 0x76, 0x22, 0x72, 0xcf, 0xd9, 0x4f, 0x66, 0x37, 0xb8, 0xc6, 0x8b, 0xb1, 0x84, 0x33, + 0x2f, 0x22, 0x1e, 0xa4, 0x38, 0x21, 0x44, 0x14, 0xb1, 0x89, 0x05, 0xd4, 0x14, 0x4a, 0x15, 0x8f, + 0x43, 0x28, 0xf5, 0x3c, 0x40, 0x18, 0x36, 0xb9, 0x25, 0x4f, 0x43, 0xb8, 0x27, 0xc5, 0xc1, 0xac, + 0x6b, 0x37, 0x05, 0x04, 0x6b, 0x58, 0xa8, 0x0c, 0x53, 0xed, 0xc0, 0x8f, 0xb8, 0x4c, 0xb6, 0xcc, + 0x8d, 0xdd, 0x06, 0xcd, 0x58, 0x0a, 0xd5, 0x04, 0x1c, 0xa7, 0x6a, 0xa0, 0x97, 0x60, 0x54, 0xc4, + 0x57, 0xa8, 0xfa, 0x7e, 0x53, 0x88, 0x81, 0x94, 0xfd, 0x57, 0x2d, 0x06, 0x61, 0x1d, 0x4f, 0xab, + 0xc6, 0x04, 0xbd, 0xc3, 0x99, 0xd5, 0xb8, 0xb0, 0x57, 0xc3, 0x4b, 0x44, 0x65, 0x1c, 0xe9, 0x2b, + 0x2a, 0x63, 0x2c, 0x18, 0x2b, 0xf5, 0xad, 0xdb, 0x82, 0x9e, 0xa2, 0xa4, 0x9f, 0x1d, 0x80, 0x19, + 0xb1, 0x70, 0x1e, 0xf5, 0x72, 0xb9, 0x9d, 0x5e, 0x2e, 0xc7, 0x21, 0x3a, 0x7b, 0x6f, 0xcd, 0x9c, + 0xf4, 0x9a, 0xf9, 0x41, 0x0b, 0x4c, 0xf6, 0x0a, 0xfd, 0x3f, 0xb9, 0xe9, 0x61, 0x5e, 0xca, 0x65, + 0xd7, 0x1a, 0xf2, 0x02, 0x79, 0x87, 0x89, 0x62, 0xec, 0xff, 0x68, 0xc1, 0x93, 0x3d, 0x29, 0xa2, + 0x15, 0x28, 0x31, 0x1e, 0x50, 0x7b, 0x9d, 0x3d, 0xa5, 0x8c, 0x61, 0x25, 0x20, 0x87, 0x25, 0x8d, + 0x6b, 0xa2, 0x95, 0x54, 0x1e, 0x9e, 0xa7, 0x33, 0xf2, 0xf0, 0x9c, 0x36, 0x86, 0xe7, 0x21, 0x13, + 0xf1, 0x7c, 0x3f, 0xbd, 0x71, 0x0c, 0x47, 0x14, 0xf4, 0x61, 0x43, 0xec, 0x67, 0x27, 0xc4, 0x7e, + 0xc8, 0xc4, 0xd6, 0xee, 0x90, 0x8f, 0xc3, 0x14, 0x0b, 0xbc, 0xc4, 0x4c, 0xb3, 0x85, 0x8b, 0x4c, + 0x21, 0x36, 0xbf, 0xbc, 0x99, 0x80, 0xe1, 0x14, 0xb6, 0xfd, 0x47, 0x45, 0x18, 0xe2, 0xdb, 0xef, + 0x04, 0xde, 0x84, 0xcf, 0x40, 0xc9, 0x6d, 0xb5, 0x3a, 0x3c, 0xb5, 0xca, 0x20, 0xf7, 0x8b, 0xa5, + 0xf3, 0x54, 0x91, 0x85, 0x38, 0x86, 0xa3, 0x55, 0x21, 0x71, 0xee, 0x12, 0xdb, 0x91, 0x77, 0x7c, + 0xa1, 0xec, 0x44, 0x0e, 0x67, 0x70, 0xd4, 0x3d, 0x1b, 0xcb, 0xa6, 0xd1, 0x67, 0x00, 0xc2, 0x28, + 0x70, 0xbd, 0x6d, 0x5a, 0x26, 0x42, 0x99, 0x7e, 0xb0, 0x0b, 0xb5, 0x9a, 0x42, 0xe6, 0x34, 0xe3, + 0x33, 0x47, 0x01, 0xb0, 0x46, 0x11, 0x2d, 0x18, 0x37, 0xfd, 0x5c, 0x62, 0xee, 0x80, 0x53, 0x8d, + 0xe7, 0x6c, 0xee, 0x23, 0x50, 0x52, 0xc4, 0x7b, 0xc9, 0x9f, 0xc6, 0x74, 0xb6, 0xe8, 0x63, 0x30, + 0x99, 0xe8, 0xdb, 0x91, 0xc4, 0x57, 0xbf, 0x68, 0xc1, 0x24, 0xef, 0xcc, 0x8a, 0xb7, 0x27, 0x6e, + 0x83, 0xb7, 0xe1, 0x54, 0x33, 0xe3, 0x54, 0x16, 0xd3, 0xdf, 0xff, 0x29, 0xae, 0xc4, 0x55, 0x59, + 0x50, 0x9c, 0xd9, 0x06, 0xba, 0x4c, 0x77, 0x1c, 0x3d, 0x75, 0x9d, 0xa6, 0x70, 0x93, 0x1d, 0xe3, + 0xbb, 0x8d, 0x97, 0x61, 0x05, 0xb5, 0x7f, 0xd7, 0x82, 0x69, 0xde, 0xf3, 0x1b, 0x64, 0x5f, 0x9d, + 0x4d, 0x5f, 0xcf, 0xbe, 0x8b, 0xa4, 0x5e, 0x85, 0x9c, 0xa4, 0x5e, 0xfa, 0xa7, 0x15, 0xbb, 0x7e, + 0xda, 0xcf, 0x58, 0x20, 0x56, 0xc8, 0x09, 0x08, 0x21, 0xbe, 0xd5, 0x14, 0x42, 0xcc, 0xe5, 0x6f, + 0x82, 0x1c, 0xe9, 0xc3, 0x5f, 0x58, 0x30, 0xc5, 0x11, 0x62, 0x6d, 0xf9, 0xd7, 0x75, 0x1e, 0xfa, + 0x49, 0xfd, 0x7b, 0x83, 0xec, 0x6f, 0xf8, 0x55, 0x27, 0xda, 0xc9, 0xfe, 0x28, 0x63, 0xb2, 0x06, + 0xba, 0x4e, 0x56, 0x43, 0x6e, 0xa0, 0x23, 0xe4, 0x13, 0x3f, 0x72, 0xce, 0x0b, 0xfb, 0x6b, 0x16, + 0x20, 0xde, 0x8c, 0xc1, 0xb8, 0x51, 0x76, 0x88, 0x95, 0x6a, 0x17, 0x5d, 0x7c, 0x34, 0x29, 0x08, + 0xd6, 0xb0, 0x8e, 0x65, 0x78, 0x12, 0x26, 0x0f, 0xc5, 0xde, 0x26, 0x0f, 0x47, 0x18, 0xd1, 0x7f, + 0x3d, 0x04, 0x49, 0x67, 0x1c, 0x74, 0x07, 0xc6, 0xea, 0x4e, 0xdb, 0xd9, 0x74, 0x9b, 0x6e, 0xe4, + 0x92, 0xb0, 0x9b, 0xad, 0xd4, 0xb2, 0x86, 0x27, 0x94, 0xd4, 0x5a, 0x09, 0x36, 0xe8, 0xa0, 0x05, + 0x80, 0x76, 0xe0, 0xee, 0xb9, 0x4d, 0xb2, 0xcd, 0x64, 0x25, 0xcc, 0x31, 0x9f, 0x1b, 0x00, 0xc9, + 0x52, 0xac, 0x61, 0x64, 0x78, 0x3e, 0x17, 0x1f, 0xb1, 0xe7, 0x33, 0x9c, 0x98, 0xe7, 0xf3, 0xc0, + 0x91, 0x3c, 0x9f, 0x47, 0x8e, 0xec, 0xf9, 0x3c, 0xd8, 0x97, 0xe7, 0x33, 0x86, 0x33, 0x92, 0xf7, + 0xa4, 0xff, 0x57, 0xdd, 0x26, 0x11, 0x0f, 0x0e, 0x1e, 0x4d, 0x60, 0xee, 0xc1, 0xc1, 0xfc, 0x19, + 0x9c, 0x89, 0x81, 0x73, 0x6a, 0xa2, 0x4f, 0xc0, 0xac, 0xd3, 0x6c, 0xfa, 0xf7, 0xd4, 0xa4, 0xae, + 0x84, 0x75, 0xa7, 0xc9, 0x95, 0x10, 0xc3, 0x8c, 0xea, 0x13, 0x0f, 0x0e, 0xe6, 0x67, 0x17, 0x73, + 0x70, 0x70, 0x6e, 0x6d, 0xf4, 0x51, 0x28, 0xb5, 0x03, 0xbf, 0xbe, 0xa6, 0x79, 0x0c, 0x9e, 0xa7, + 0x03, 0x58, 0x95, 0x85, 0x87, 0x07, 0xf3, 0xe3, 0xea, 0x0f, 0xbb, 0xf0, 0xe3, 0x0a, 0x19, 0xae, + 0xcc, 0xa3, 0xc7, 0xea, 0xca, 0xbc, 0x0b, 0x33, 0x35, 0x12, 0xb8, 0x2c, 0xfb, 0x78, 0x23, 0x3e, + 0x9f, 0x36, 0xa0, 0x14, 0x24, 0x4e, 0xe4, 0xbe, 0xe2, 0x2d, 0x6a, 0xc9, 0x07, 0xe4, 0x09, 0x1c, + 0x13, 0xb2, 0xff, 0x97, 0x05, 0xc3, 0xc2, 0xf9, 0xe6, 0x04, 0xb8, 0xc6, 0x45, 0x43, 0x93, 0x30, + 0x9f, 0x3d, 0x60, 0xac, 0x33, 0xb9, 0x3a, 0x84, 0x4a, 0x42, 0x87, 0xf0, 0x64, 0x37, 0x22, 0xdd, + 0xb5, 0x07, 0x7f, 0xbd, 0x48, 0xb9, 0x77, 0xc3, 0x0d, 0xf4, 0xd1, 0x0f, 0xc1, 0x3a, 0x0c, 0x87, + 0xc2, 0x0d, 0xb1, 0x90, 0x6f, 0x37, 0x9f, 0x9c, 0xc4, 0xd8, 0x8e, 0x4d, 0x38, 0x1e, 0x4a, 0x22, + 0x99, 0xfe, 0x8d, 0xc5, 0x47, 0xe8, 0xdf, 0xd8, 0xcb, 0x51, 0x76, 0xe0, 0x38, 0x1c, 0x65, 0xed, + 0xaf, 0xb0, 0x9b, 0x53, 0x2f, 0x3f, 0x01, 0xa6, 0xea, 0x9a, 0x79, 0xc7, 0xda, 0x5d, 0x56, 0x96, + 0xe8, 0x54, 0x0e, 0x73, 0xf5, 0xf3, 0x16, 0x9c, 0xcb, 0xf8, 0x2a, 0x8d, 0xd3, 0x7a, 0x16, 0x46, + 0x9c, 0x4e, 0xc3, 0x55, 0x7b, 0x59, 0xd3, 0x27, 0x2e, 0x8a, 0x72, 0xac, 0x30, 0xd0, 0x32, 0x4c, + 0x93, 0xfb, 0x6d, 0x97, 0xab, 0x52, 0x75, 0x63, 0xd3, 0x22, 0xf7, 0xd8, 0x5a, 0x49, 0x02, 0x71, + 0x1a, 0x5f, 0x05, 0x27, 0x29, 0xe6, 0x06, 0x27, 0xf9, 0x7b, 0x16, 0x8c, 0x2a, 0x47, 0xbc, 0x47, + 0x3e, 0xda, 0x1f, 0x37, 0x47, 0xfb, 0xf1, 0x2e, 0xa3, 0x9d, 0x33, 0xcc, 0xbf, 0x5d, 0x50, 0xfd, + 0xad, 0xfa, 0x41, 0xd4, 0x07, 0x07, 0xf7, 0xf0, 0xe6, 0xf1, 0x57, 0x61, 0xd4, 0x69, 0xb7, 0x25, + 0x40, 0xda, 0xa0, 0xb1, 0xe8, 0xb9, 0x71, 0x31, 0xd6, 0x71, 0x94, 0xb5, 0x7e, 0x31, 0xd7, 0x5a, + 0xbf, 0x01, 0x10, 0x39, 0xc1, 0x36, 0x89, 0x68, 0x99, 0x08, 0x24, 0x96, 0x7f, 0xde, 0x74, 0x22, + 0xb7, 0xb9, 0xe0, 0x7a, 0x51, 0x18, 0x05, 0x0b, 0x15, 0x2f, 0xba, 0x15, 0xf0, 0x27, 0xa4, 0x16, + 0xa9, 0x47, 0xd1, 0xc2, 0x1a, 0x5d, 0xe9, 0x74, 0xce, 0xda, 0x18, 0x34, 0x8d, 0x19, 0xd6, 0x45, + 0x39, 0x56, 0x18, 0xf6, 0x47, 0xd8, 0xed, 0xc3, 0xc6, 0xf4, 0x68, 0xa1, 0x6d, 0xfe, 0xeb, 0x98, + 0x9a, 0x0d, 0xa6, 0xc9, 0x2c, 0xeb, 0x01, 0x74, 0xba, 0x1f, 0xf6, 0xb4, 0x61, 0xdd, 0x77, 0x2c, + 0x8e, 0xb2, 0x83, 0xbe, 0x2d, 0x65, 0xa0, 0xf2, 0x5c, 0x8f, 0x5b, 0xe3, 0x08, 0x26, 0x29, 0x2c, + 0x95, 0x06, 0x4b, 0x34, 0x50, 0xa9, 0x8a, 0x7d, 0xa1, 0xa5, 0xd2, 0x10, 0x00, 0x1c, 0xe3, 0x50, + 0x66, 0x4a, 0xfd, 0x09, 0x67, 0x51, 0x1c, 0x52, 0x52, 0x61, 0x87, 0x58, 0xc3, 0x40, 0x57, 0x84, + 0x40, 0x81, 0xeb, 0x05, 0x1e, 0x4f, 0x08, 0x14, 0xe4, 0x70, 0x69, 0x52, 0xa0, 0xab, 0x30, 0xaa, + 0xb2, 0xe9, 0x56, 0x79, 0x92, 0x56, 0xb1, 0xcc, 0x56, 0xe2, 0x62, 0xac, 0xe3, 0xa0, 0x0d, 0x98, + 0x0c, 0xb9, 0x9c, 0x4d, 0xc5, 0xf9, 0xe5, 0xf2, 0xca, 0x0f, 0x4a, 0x2b, 0xa0, 0x9a, 0x09, 0x3e, + 0x64, 0x45, 0xfc, 0x74, 0x92, 0x8e, 0xe1, 0x49, 0x12, 0xe8, 0x35, 0x98, 0x68, 0xfa, 0x4e, 0x63, + 0xc9, 0x69, 0x3a, 0x5e, 0x9d, 0x8d, 0xcf, 0x88, 0x99, 0x94, 0xf1, 0xa6, 0x01, 0xc5, 0x09, 0x6c, + 0xca, 0xbc, 0xe9, 0x25, 0x22, 0x36, 0xb5, 0xe3, 0x6d, 0x93, 0x50, 0xe4, 0x46, 0x65, 0xcc, 0xdb, + 0xcd, 0x1c, 0x1c, 0x9c, 0x5b, 0x1b, 0xbd, 0x0c, 0x63, 0xf2, 0xf3, 0xb5, 0x38, 0x0a, 0xb1, 0xe3, + 0x83, 0x06, 0xc3, 0x06, 0x26, 0xba, 0x07, 0xa7, 0xe5, 0xff, 0x8d, 0xc0, 0xd9, 0xda, 0x72, 0xeb, + 0xc2, 0xb9, 0x98, 0x7b, 0x48, 0x2e, 0x4a, 0x37, 0xbe, 0x95, 0x2c, 0xa4, 0xc3, 0x83, 0xf9, 0x0b, + 0x62, 0xd4, 0x32, 0xe1, 0x6c, 0x12, 0xb3, 0xe9, 0xa3, 0x35, 0x98, 0xd9, 0x21, 0x4e, 0x33, 0xda, + 0x59, 0xde, 0x21, 0xf5, 0x5d, 0xb9, 0xe9, 0x58, 0x74, 0x06, 0xcd, 0x5d, 0xe0, 0x7a, 0x1a, 0x05, + 0x67, 0xd5, 0x43, 0x6f, 0xc2, 0x6c, 0xbb, 0xb3, 0xd9, 0x74, 0xc3, 0x9d, 0x75, 0x3f, 0x62, 0xa6, + 0x40, 0x2a, 0x39, 0xaf, 0x08, 0xe3, 0xa0, 0xe2, 0x5f, 0x54, 0x73, 0xf0, 0x70, 0x2e, 0x05, 0xf4, + 0x36, 0x9c, 0x4e, 0x2c, 0x06, 0xe1, 0xc8, 0x3e, 0x91, 0x1f, 0xe9, 0xbf, 0x96, 0x55, 0x41, 0xc4, + 0x84, 0xc8, 0x02, 0xe1, 0xec, 0x26, 0xe8, 0xe3, 0x43, 0x0b, 0xad, 0x1a, 0xce, 0x4e, 0xc5, 0x36, + 0xcb, 0x5a, 0xfc, 0xd5, 0x10, 0x1b, 0x58, 0xe8, 0x15, 0x00, 0xb7, 0xbd, 0xea, 0xb4, 0xdc, 0x26, + 0x7d, 0x64, 0xce, 0xb0, 0x3a, 0xf4, 0xc1, 0x01, 0x95, 0xaa, 0x2c, 0xa5, 0xa7, 0xba, 0xf8, 0xb7, + 0x8f, 0x35, 0x6c, 0x54, 0x85, 0x09, 0xf1, 0x6f, 0x5f, 0x2c, 0x86, 0x69, 0xe5, 0x69, 0x3e, 0x21, + 0x6b, 0xa8, 0x15, 0x80, 0xcc, 0x12, 0x36, 0xe7, 0x89, 0xfa, 0x68, 0x1b, 0xce, 0x89, 0xec, 0xcf, + 0x44, 0x5f, 0xdd, 0x72, 0xf6, 0x42, 0x16, 0x98, 0x7f, 0x84, 0x07, 0x90, 0x59, 0xec, 0x86, 0x88, + 0xbb, 0xd3, 0xa1, 0x5c, 0x81, 0xbe, 0x49, 0xb8, 0x6f, 0xe7, 0x69, 0x6e, 0xd4, 0x44, 0xb9, 0x82, + 0x9b, 0x49, 0x20, 0x4e, 0xe3, 0xa3, 0x10, 0x4e, 0xbb, 0x5e, 0xd6, 0x9e, 0x38, 0xc3, 0x08, 0x7d, + 0x8c, 0xbb, 0xb5, 0x76, 0xdf, 0x0f, 0x99, 0x70, 0xbe, 0x1f, 0x32, 0x69, 0xbf, 0x33, 0xdb, 0xbd, + 0xdf, 0xb1, 0x68, 0x6d, 0x8d, 0xbf, 0x47, 0x9f, 0x85, 0x31, 0xfd, 0xc3, 0x04, 0xaf, 0x72, 0x29, + 0x9b, 0xfd, 0xd5, 0x4e, 0x15, 0xfe, 0x3a, 0x50, 0x27, 0x87, 0x0e, 0xc3, 0x06, 0x45, 0x54, 0xcf, + 0x70, 0x00, 0xbf, 0xd2, 0x1f, 0x2f, 0xd4, 0xbf, 0xe9, 0x1a, 0x81, 0xec, 0xcd, 0x82, 0x6e, 0xc2, + 0x48, 0xbd, 0xe9, 0x12, 0x2f, 0xaa, 0x54, 0xbb, 0x85, 0x6c, 0x5b, 0x16, 0x38, 0x62, 0xf7, 0x89, + 0x38, 0xfb, 0xbc, 0x0c, 0x2b, 0x0a, 0xf6, 0xaf, 0x15, 0x60, 0xbe, 0x47, 0xd2, 0x86, 0x84, 0x22, + 0xcb, 0xea, 0x4b, 0x91, 0xb5, 0x28, 0xf3, 0x56, 0xaf, 0x27, 0x64, 0x64, 0x89, 0x9c, 0xd4, 0xb1, + 0xa4, 0x2c, 0x89, 0xdf, 0xb7, 0x63, 0x81, 0xae, 0x0b, 0x1b, 0xe8, 0xe9, 0x1a, 0x63, 0xe8, 0xc0, + 0x07, 0xfb, 0x7f, 0x38, 0xe7, 0xea, 0x33, 0xed, 0xaf, 0x14, 0xe0, 0xb4, 0x1a, 0xc2, 0x6f, 0xde, + 0x81, 0xbb, 0x9d, 0x1e, 0xb8, 0x63, 0xd0, 0x06, 0xdb, 0xb7, 0x60, 0x88, 0xc7, 0xa0, 0xeb, 0x83, + 0x61, 0xbf, 0x68, 0x86, 0x6b, 0x55, 0x3c, 0xa2, 0x11, 0xb2, 0xf5, 0x7b, 0x2d, 0x98, 0xdc, 0x58, + 0xae, 0xd6, 0xfc, 0xfa, 0x2e, 0x89, 0x16, 0xf9, 0x03, 0x0b, 0x6b, 0xae, 0xb2, 0x0f, 0xc3, 0x54, + 0x67, 0xb1, 0xeb, 0x17, 0x60, 0x60, 0xc7, 0x0f, 0xa3, 0xa4, 0xa9, 0xc8, 0x75, 0x3f, 0x8c, 0x30, + 0x83, 0xd8, 0xbf, 0x67, 0xc1, 0xe0, 0x86, 0xe3, 0x7a, 0x91, 0x54, 0x2b, 0x58, 0x39, 0x6a, 0x85, + 0x7e, 0xbe, 0x0b, 0xbd, 0x04, 0x43, 0x64, 0x6b, 0x8b, 0xd4, 0x23, 0x31, 0xab, 0x32, 0xce, 0xc0, + 0xd0, 0x0a, 0x2b, 0xa5, 0x1c, 0x24, 0x6b, 0x8c, 0xff, 0xc5, 0x02, 0x19, 0xdd, 0x85, 0x52, 0xe4, + 0xb6, 0xc8, 0x62, 0xa3, 0x21, 0x94, 0xed, 0x0f, 0x11, 0x2b, 0x61, 0x43, 0x12, 0xc0, 0x31, 0x2d, + 0xfb, 0x4b, 0x05, 0x80, 0x38, 0x78, 0x4f, 0xaf, 0x4f, 0x5c, 0x4a, 0xa9, 0x61, 0x2f, 0x65, 0xa8, + 0x61, 0x51, 0x4c, 0x30, 0x43, 0x07, 0xab, 0x86, 0xa9, 0xd8, 0xd7, 0x30, 0x0d, 0x1c, 0x65, 0x98, + 0x96, 0x61, 0x3a, 0x0e, 0x3e, 0x64, 0xc6, 0x5e, 0x63, 0xd7, 0xe7, 0x46, 0x12, 0x88, 0xd3, 0xf8, + 0x36, 0x81, 0x0b, 0x2a, 0x06, 0x8b, 0xb8, 0xd1, 0x98, 0x2d, 0xb7, 0xae, 0xd6, 0xee, 0x31, 0x4e, + 0xb1, 0x9e, 0xb9, 0x90, 0xab, 0x67, 0xfe, 0x09, 0x0b, 0x4e, 0x25, 0xdb, 0x61, 0xce, 0xb5, 0x5f, + 0xb4, 0xe0, 0x34, 0xd3, 0xb6, 0xb3, 0x56, 0xd3, 0xba, 0xfd, 0x17, 0xbb, 0xc6, 0x95, 0xc9, 0xe9, + 0x71, 0x1c, 0xd0, 0x62, 0x2d, 0x8b, 0x34, 0xce, 0x6e, 0xd1, 0xfe, 0x0f, 0x05, 0x98, 0xcd, 0x0b, + 0x48, 0xc3, 0x5c, 0x3d, 0x9c, 0xfb, 0xb5, 0x5d, 0x72, 0x4f, 0x18, 0xd4, 0xc7, 0xae, 0x1e, 0xbc, + 0x18, 0x4b, 0x78, 0x32, 0x0e, 0x7f, 0xa1, 0xcf, 0x38, 0xfc, 0x3b, 0x30, 0x7d, 0x6f, 0x87, 0x78, + 0xb7, 0xbd, 0xd0, 0x89, 0xdc, 0x70, 0xcb, 0x65, 0x9a, 0x69, 0xbe, 0x6e, 0x5e, 0x91, 0x66, 0xef, + 0x77, 0x93, 0x08, 0x87, 0x07, 0xf3, 0xe7, 0x8c, 0x82, 0xb8, 0xcb, 0xfc, 0x20, 0xc1, 0x69, 0xa2, + 0xe9, 0x34, 0x06, 0x03, 0x8f, 0x30, 0x8d, 0x81, 0xfd, 0x45, 0x0b, 0xce, 0xe6, 0xe6, 0x4e, 0x45, + 0x97, 0x61, 0xc4, 0x69, 0xbb, 0x5c, 0xb8, 0x2f, 0x8e, 0x51, 0x26, 0x44, 0xaa, 0x56, 0xb8, 0x68, + 0x5f, 0x41, 0x55, 0x4e, 0xf7, 0x42, 0x6e, 0x4e, 0xf7, 0x9e, 0x29, 0xda, 0xed, 0xef, 0xb1, 0x40, + 0xb8, 0xa9, 0xf6, 0x71, 0x76, 0x7f, 0x0a, 0xc6, 0xf6, 0xd2, 0xa9, 0x8e, 0x2e, 0xe4, 0xfb, 0xed, + 0x8a, 0x04, 0x47, 0x8a, 0x21, 0x33, 0xd2, 0x1a, 0x19, 0xb4, 0xec, 0x06, 0x08, 0x68, 0x99, 0x30, + 0xd1, 0x75, 0xef, 0xde, 0x3c, 0x0f, 0xd0, 0x60, 0xb8, 0x5a, 0x62, 0x7c, 0x75, 0x33, 0x97, 0x15, + 0x04, 0x6b, 0x58, 0xf6, 0xbf, 0x2d, 0xc0, 0xa8, 0x4c, 0xad, 0xd3, 0xf1, 0xfa, 0x11, 0x30, 0x1d, + 0x29, 0xd7, 0x26, 0xba, 0x02, 0x25, 0x26, 0x01, 0xad, 0xc6, 0x72, 0x39, 0x25, 0x7f, 0x58, 0x93, + 0x00, 0x1c, 0xe3, 0xd0, 0x5d, 0x14, 0x76, 0x36, 0x19, 0x7a, 0xc2, 0xa9, 0xb2, 0xc6, 0x8b, 0xb1, + 0x84, 0xa3, 0x4f, 0xc0, 0x14, 0xaf, 0x17, 0xf8, 0x6d, 0x67, 0x9b, 0x6b, 0x4d, 0x06, 0x55, 0x34, + 0x84, 0xa9, 0xb5, 0x04, 0xec, 0xf0, 0x60, 0xfe, 0x54, 0xb2, 0x8c, 0xa9, 0x03, 0x53, 0x54, 0x98, + 0x71, 0x14, 0x6f, 0x84, 0xee, 0xfe, 0x94, 0x4d, 0x55, 0x0c, 0xc2, 0x3a, 0x9e, 0xfd, 0x59, 0x40, + 0xe9, 0x24, 0x43, 0xe8, 0x75, 0x6e, 0x11, 0xeb, 0x06, 0xa4, 0xd1, 0x4d, 0x3d, 0xa8, 0xfb, 0xfc, + 0x4b, 0x7f, 0x28, 0x5e, 0x0b, 0xab, 0xfa, 0xf6, 0xff, 0x5f, 0x84, 0xa9, 0xa4, 0x07, 0x38, 0xba, + 0x0e, 0x43, 0x9c, 0xf5, 0x10, 0xe4, 0xbb, 0x58, 0x9f, 0x68, 0x7e, 0xe3, 0xec, 0x10, 0x16, 0xdc, + 0x8b, 0xa8, 0x8f, 0xde, 0x84, 0xd1, 0x86, 0x7f, 0xcf, 0xbb, 0xe7, 0x04, 0x8d, 0xc5, 0x6a, 0x45, + 0x2c, 0xe7, 0xcc, 0xe7, 0x70, 0x39, 0x46, 0xd3, 0x7d, 0xd1, 0x99, 0xa6, 0x35, 0x06, 0x61, 0x9d, + 0x1c, 0xda, 0x60, 0x91, 0xc9, 0xb7, 0xdc, 0xed, 0x35, 0xa7, 0xdd, 0xcd, 0x3d, 0x62, 0x59, 0x22, + 0x69, 0x94, 0xc7, 0x45, 0xf8, 0x72, 0x0e, 0xc0, 0x31, 0x21, 0xf4, 0x79, 0x98, 0x09, 0x73, 0x84, + 0xf4, 0x79, 0x39, 0xe7, 0xba, 0xc9, 0xad, 0x97, 0x1e, 0x7b, 0x70, 0x30, 0x3f, 0x93, 0x25, 0xce, + 0xcf, 0x6a, 0xc6, 0xfe, 0x91, 0x53, 0x60, 0x6c, 0x62, 0x23, 0x05, 0xa9, 0x75, 0x4c, 0x29, 0x48, + 0x31, 0x8c, 0x90, 0x56, 0x3b, 0xda, 0x2f, 0xbb, 0x41, 0xb7, 0xc4, 0xdc, 0x2b, 0x02, 0x27, 0x4d, + 0x53, 0x42, 0xb0, 0xa2, 0x93, 0x9d, 0x27, 0xb6, 0xf8, 0x75, 0xcc, 0x13, 0x3b, 0x70, 0x82, 0x79, + 0x62, 0xd7, 0x61, 0x78, 0xdb, 0x8d, 0x30, 0x69, 0xfb, 0x82, 0xe9, 0xcf, 0x5c, 0x87, 0xd7, 0x38, + 0x4a, 0x3a, 0x23, 0xa1, 0x00, 0x60, 0x49, 0x04, 0xbd, 0xae, 0x76, 0xe0, 0x50, 0xfe, 0xc3, 0x3c, + 0x6d, 0x26, 0x91, 0xb9, 0x07, 0x45, 0x36, 0xd8, 0xe1, 0x87, 0xcd, 0x06, 0xbb, 0x2a, 0x73, 0xb8, + 0x8e, 0xe4, 0xfb, 0x32, 0xb1, 0x14, 0xad, 0x3d, 0x32, 0xb7, 0xde, 0xd1, 0xf3, 0xde, 0x96, 0xf2, + 0x4f, 0x02, 0x95, 0xd2, 0xb6, 0xcf, 0x6c, 0xb7, 0xdf, 0x63, 0xc1, 0xe9, 0x76, 0x56, 0x0a, 0x68, + 0x61, 0x51, 0xf0, 0x52, 0xdf, 0x59, 0xa6, 0x8d, 0x06, 0x99, 0x24, 0x2e, 0x13, 0x0d, 0x67, 0x37, + 0x47, 0x07, 0x3a, 0xd8, 0x6c, 0x08, 0xcd, 0xf6, 0xc5, 0x9c, 0xb4, 0xb9, 0x5d, 0x92, 0xe5, 0x6e, + 0x64, 0xa4, 0x68, 0x7d, 0x7f, 0x5e, 0x8a, 0xd6, 0xbe, 0x13, 0xb3, 0xbe, 0xae, 0x12, 0xe6, 0x8e, + 0xe7, 0x2f, 0x25, 0x9e, 0x0e, 0xb7, 0x67, 0x9a, 0xdc, 0xd7, 0x55, 0x9a, 0xdc, 0x2e, 0x61, 0x67, + 0x79, 0x12, 0xdc, 0x9e, 0xc9, 0x71, 0xb5, 0x04, 0xb7, 0x93, 0xc7, 0x93, 0xe0, 0xd6, 0xb8, 0x6a, + 0x78, 0x8e, 0xd5, 0x67, 0x7a, 0x5c, 0x35, 0x06, 0xdd, 0xee, 0x97, 0x0d, 0x4f, 0xe6, 0x3b, 0xfd, + 0x50, 0xc9, 0x7c, 0xef, 0xe8, 0xc9, 0x71, 0x51, 0x8f, 0xec, 0xaf, 0x14, 0xa9, 0xcf, 0x94, 0xb8, + 0x77, 0xf4, 0x0b, 0x70, 0x26, 0x9f, 0xae, 0xba, 0xe7, 0xd2, 0x74, 0x33, 0xaf, 0xc0, 0x54, 0xaa, + 0xdd, 0x53, 0x27, 0x93, 0x6a, 0xf7, 0xf4, 0xb1, 0xa7, 0xda, 0x3d, 0x73, 0x02, 0xa9, 0x76, 0x1f, + 0x3b, 0xc1, 0x54, 0xbb, 0x77, 0x98, 0x19, 0x0e, 0x0f, 0xf6, 0x23, 0xc2, 0xe4, 0x66, 0x87, 0x64, + 0xcd, 0x8a, 0x08, 0xc4, 0x3f, 0x4e, 0x81, 0x70, 0x4c, 0x2a, 0x23, 0x85, 0xef, 0xec, 0x23, 0x48, + 0xe1, 0xbb, 0x1e, 0xa7, 0xf0, 0x3d, 0x9b, 0x3f, 0xd5, 0x19, 0x8e, 0x1b, 0x39, 0x89, 0x7b, 0xef, + 0xe8, 0x09, 0x77, 0x1f, 0xef, 0xa2, 0x6b, 0xc9, 0x12, 0x3c, 0x76, 0x49, 0xb3, 0xfb, 0x1a, 0x4f, + 0xb3, 0xfb, 0x44, 0xfe, 0x49, 0x9e, 0xbc, 0xee, 0x8c, 0xe4, 0xba, 0xb4, 0x5f, 0x2a, 0x20, 0x23, + 0x0b, 0x08, 0x9c, 0xd3, 0x2f, 0x15, 0xd1, 0x31, 0xdd, 0x2f, 0x05, 0xc2, 0x31, 0x29, 0xfb, 0xfb, + 0x0a, 0x70, 0xbe, 0xfb, 0x7e, 0x8b, 0xa5, 0xa9, 0xd5, 0x58, 0xf5, 0x9c, 0x90, 0xa6, 0xf2, 0x37, + 0x5b, 0x8c, 0xd5, 0x77, 0x7c, 0xb9, 0x6b, 0x30, 0xad, 0x3c, 0x3e, 0x9a, 0x6e, 0x7d, 0x7f, 0x3d, + 0x7e, 0xf9, 0x2a, 0x2f, 0xf9, 0x5a, 0x12, 0x01, 0xa7, 0xeb, 0xa0, 0x45, 0x98, 0x34, 0x0a, 0x2b, + 0x65, 0xf1, 0x36, 0x53, 0xe2, 0xdb, 0x9a, 0x09, 0xc6, 0x49, 0x7c, 0xfb, 0xcb, 0x16, 0x3c, 0x96, + 0x93, 0xa3, 0xae, 0xef, 0xf0, 0x69, 0x5b, 0x30, 0xd9, 0x36, 0xab, 0xf6, 0x88, 0xf8, 0x68, 0x64, + 0xc2, 0x53, 0x7d, 0x4d, 0x00, 0x70, 0x92, 0xa8, 0xfd, 0xe7, 0x16, 0x9c, 0xeb, 0x6a, 0xc2, 0x88, + 0x30, 0x9c, 0xd9, 0x6e, 0x85, 0xce, 0x72, 0x40, 0x1a, 0xc4, 0x8b, 0x5c, 0xa7, 0x59, 0x6b, 0x93, + 0xba, 0x26, 0x0f, 0x67, 0xb6, 0x80, 0xd7, 0xd6, 0x6a, 0x8b, 0x69, 0x0c, 0x9c, 0x53, 0x13, 0xad, + 0x02, 0x4a, 0x43, 0xc4, 0x0c, 0xb3, 0xd0, 0xd2, 0x69, 0x7a, 0x38, 0xa3, 0x06, 0xfa, 0x08, 0x8c, + 0x2b, 0xd3, 0x48, 0x6d, 0xc6, 0xd9, 0xc1, 0x8e, 0x75, 0x00, 0x36, 0xf1, 0x96, 0x2e, 0xff, 0xc6, + 0x1f, 0x9c, 0x7f, 0xdf, 0x6f, 0xfd, 0xc1, 0xf9, 0xf7, 0xfd, 0xee, 0x1f, 0x9c, 0x7f, 0xdf, 0x77, + 0x3c, 0x38, 0x6f, 0xfd, 0xc6, 0x83, 0xf3, 0xd6, 0x6f, 0x3d, 0x38, 0x6f, 0xfd, 0xee, 0x83, 0xf3, + 0xd6, 0xef, 0x3f, 0x38, 0x6f, 0x7d, 0xe9, 0x0f, 0xcf, 0xbf, 0xef, 0x53, 0x85, 0xbd, 0xab, 0xff, + 0x37, 0x00, 0x00, 0xff, 0xff, 0x61, 0xb3, 0xf6, 0x22, 0x81, 0x04, 0x01, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -18051,6 +18052,15 @@ func (m *ServiceSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.InternalTrafficPolicy != nil { + i -= len(*m.InternalTrafficPolicy) + copy(dAtA[i:], *m.InternalTrafficPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.InternalTrafficPolicy))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xb2 + } if m.LoadBalancerClass != nil { i -= len(*m.LoadBalancerClass) copy(dAtA[i:], *m.LoadBalancerClass) @@ -23621,6 +23631,10 @@ func (m *ServiceSpec) Size() (n int) { l = len(*m.LoadBalancerClass) n += 2 + l + sovGenerated(uint64(l)) } + if m.InternalTrafficPolicy != nil { + l = len(*m.InternalTrafficPolicy) + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -27216,6 +27230,7 @@ func (this *ServiceSpec) String() string { `IPFamilies:` + fmt.Sprintf("%v", this.IPFamilies) + `,`, `AllocateLoadBalancerNodePorts:` + valueToStringGenerated(this.AllocateLoadBalancerNodePorts) + `,`, `LoadBalancerClass:` + valueToStringGenerated(this.LoadBalancerClass) + `,`, + `InternalTrafficPolicy:` + valueToStringGenerated(this.InternalTrafficPolicy) + `,`, `}`, }, "") return s @@ -63279,6 +63294,39 @@ func (m *ServiceSpec) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.LoadBalancerClass = &s iNdEx = postIndex + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InternalTrafficPolicy", 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 := ServiceInternalTrafficPolicyType(dAtA[iNdEx:postIndex]) + m.InternalTrafficPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 48c59c63464b..83cba97d6fc8 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -5045,9 +5045,19 @@ message ServiceSpec { // 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. - // featureGate=LoadBalancerClass + // +featureGate=LoadBalancerClass // +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". + // +featureGate=ServiceInternalTrafficPolicy + // +optional + optional string internalTrafficPolicy = 22; } // ServiceStatus represents the current status of a service. diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index 9cef7c2100f8..ced047763891 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -2257,8 +2257,8 @@ var map_ServiceSpec = map[string]string{ "ipFamilies": "IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this service, and is gated by the \"IPv6DualStack\" feature gate. 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, and is gated by the \"IPv6DualStack\" feature gate. 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. allocateLoadBalancerNodePorts may only be set for services with type LoadBalancer and will be cleared if the type is changed to any other type. This field is alpha-level and is only honored by servers that enable the ServiceLBNodePortControl feature.", - "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. featureGate=LoadBalancerClass", - "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. featureGate=ServiceInternalTrafficPolicy", + "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\".", } func (ServiceSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Service.pb index eff2532121d40eca4385ba202101ab64ebe63343..b84e0c2d567b4c7315810cdc44d1bdeb23203e43 100644 GIT binary patch delta 24 gcmeBT>1CN9!uWZj=sLzX6OX)N-o(f-c^zX60Cj)~i~s-t delta 20 ccmeBW>0+56!uVmL=sL!i6OX)_ypb^m08?}b(*OVf